package eu.dnetlib.client.leftColumn;

import java.util.ArrayList;

import com.github.gwtbootstrap.client.ui.AccordionGroup;
import com.github.gwtbootstrap.client.ui.Alert;
import com.github.gwtbootstrap.client.ui.Button;
import com.github.gwtbootstrap.client.ui.Form;
import com.github.gwtbootstrap.client.ui.Image;
import com.github.gwtbootstrap.client.ui.ListBox;
import com.github.gwtbootstrap.client.ui.Paragraph;
import com.github.gwtbootstrap.client.ui.RadioButton;
import com.github.gwtbootstrap.client.ui.Tab;
import com.github.gwtbootstrap.client.ui.TabPanel;
import com.github.gwtbootstrap.client.ui.TextBox;
import com.github.gwtbootstrap.client.ui.base.IconAnchor;
import com.github.gwtbootstrap.client.ui.constants.AlertType;
import com.github.gwtbootstrap.client.ui.constants.ButtonType;
import com.github.gwtbootstrap.client.ui.constants.IconSize;
import com.github.gwtbootstrap.client.ui.constants.IconType;
import com.github.gwtbootstrap.client.ui.event.HideEvent;
import com.github.gwtbootstrap.client.ui.event.HideHandler;
import com.github.gwtbootstrap.client.ui.event.ShowEvent;
import com.github.gwtbootstrap.client.ui.event.ShowHandler;
import com.github.highcharts4gwt.model.highcharts.option.api.XAxis;
import com.google.gwt.dev.shell.BrowserChannel.Value;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.dom.client.Style.Overflow;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
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.DoubleClickEvent;
import com.google.gwt.event.dom.client.DoubleClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.event.dom.client.LoadEvent;
import com.google.gwt.event.dom.client.LoadHandler;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.event.shared.GwtEvent;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Tree;
import com.google.gwt.user.client.ui.TreeItem;
import com.google.gwt.user.client.ui.Widget;

import eu.dnetlib.client.Generate;
import eu.dnetlib.client.leftColumn.AppearancePanel.ChangingNameListener;
import eu.dnetlib.client.widgets.DropdownListWidget;
import eu.dnetlib.client.widgets.DropdownListWidget.TreeListener;
import eu.dnetlib.client.widgets.FormFieldSet;
import eu.dnetlib.shared.SchemaAnswer;
import eu.dnetlib.shared.ValuesOfFields;
import eu.dnetlib.shared.ValuesOfFields.Data;

public class DataserieWidget extends Widget {

	private final FlowPanel masterPanel = new FlowPanel();
	private int totalColumns;
	private int specialColumnCounter;
	private TabPanel mainTabPanel;
	private ArrayList<Image> deleteImageList = new ArrayList<Image>();
	private SchemaAnswer schemaFromServer;
	private ArrayList<DropdownListWidget> listBoxes = new ArrayList<DropdownListWidget>();
	private boolean isFromLoad;
	private Tab dataSeriesTab;
	private FiltersPanel filtersPanel;
	private final AccordionGroup generalOptionsGroupPanel = new AccordionGroup();
	private Tab singleColumn = new Tab();
	private boolean loadPresets;
	private ListBox tableListBox = new ListBox();
	private int numberOfCurrentColumn;
	private DropdownListWidget typeOfChart = new DropdownListWidget(true);
	private Timer timer;
	private final ListBox aggregateListBox = new ListBox();
	private AppearancePanel appearancePanel;
	private int comingFromSetState = 0;
	private boolean prevOpenState = true;
	private final IconAnchor edit = new IconAnchor();
	private final DropdownListWidget splitBy = new DropdownListWidget();
	private ArrayList<FiltersPanel> filtersPanels = new ArrayList<FiltersPanel>();
	private final Button applyChanges = new Button();
	private final TextBox renameTextBox = new TextBox();
	private Paragraph infoParagraph = new Paragraph();
	private Label x_axisLabel = new Label("How do you want to break down?*");
	private Label splitByLabel = new Label("How do you want to break down?*");

	private final Image enabled = new Image(
			"https://cdn2.iconfinder.com/data/icons/windows-8-metro-style/512/checked_checkbox.png");
	private Image deleteImage = new Image(
			"https://live.amcharts.com/static/img/icons/circle_x.png");
	private final AccordionGroup filtersGroupPanel = new AccordionGroup();

	public int getNumberOfCurrentColumn() {
		return numberOfCurrentColumn;
	}

	public void setNumberOfCurrentColumn(int numberOfCurrentColumn) {
		this.numberOfCurrentColumn = numberOfCurrentColumn;
	}

	public Tab getSingleColumn() {
		return singleColumn;
	}

	public TextBox getRenameTextBox() {
		return renameTextBox;
	}

	public interface ChangedType {
		public void onEvent(int chartType);
	}

	public interface DuplicateListener{
		public void onEvent(int duplicatedDataseries);
	}
	
	private DuplicateListener duplicateListener;
	
	public void setDuplicateListener(DuplicateListener duplicateListener){
		this.duplicateListener = duplicateListener;
	}
	
	private ChangedType changedTypeListener;

	public void setChangedTypeListener(ChangedType changedTypeListener) {
		this.changedTypeListener = changedTypeListener;
	}

	public interface DeleteListener {
		public void onEvent(int numberOfColumn);
	}

	private DeleteListener deleteListener;

	public void setDeleteListener(DeleteListener deleteListener) {
		this.deleteListener = deleteListener;
	}
	
	
	public DataserieWidget(TabPanel mainTabPanel, SchemaAnswer schemaFroAnswer,
			final int totalColumns, final int specialColumnCounter,
			ArrayList<Image> deleteImageList,
			ArrayList<DropdownListWidget> listboxes, boolean isFromLoad,
			Tab dataSeriesTab, boolean loadPresets,
			AppearancePanel apperancePanel, int optionsSelected,
			ArrayList<FiltersPanel> filtersPanels) {

		this.filtersPanels = filtersPanels;
		this.mainTabPanel = mainTabPanel;
		this.schemaFromServer = schemaFroAnswer;
		this.totalColumns = totalColumns;
		this.infoParagraph
				.setText("Selecting different types of data may result in a complicated chart");
		this.infoParagraph.addStyleName("info-paragraph");

		if (!isFromLoad)
			this.specialColumnCounter = ValuesOfFields.getInstance()
					.getColumnsDataList().size();
		else
			this.specialColumnCounter = specialColumnCounter;

		this.deleteImageList = deleteImageList;
		this.listBoxes = listboxes;
		this.isFromLoad = isFromLoad;
		this.dataSeriesTab = dataSeriesTab;
		this.loadPresets = loadPresets;
		this.numberOfCurrentColumn = specialColumnCounter;

		ChangingNameListener changingNameListener = new ChangingNameListener() {

			@Override public void onEvent(String name) {
				if (name.equals("")) {
					generalOptionsGroupPanel.setHeading("DATASERIES untitled");
					singleColumn.setHeading("Dataseries untitled");
				} else {
					generalOptionsGroupPanel.setHeading("DATASERIES \"" + name+ "\"");
					singleColumn.setHeading(name);
				}
			}
		};
		apperancePanel.setChaningNameListenr(changingNameListener);
		this.appearancePanel = apperancePanel;

		addDataserie();
		this.isFromLoad = false;
		if (loadPresets && (specialColumnCounter == 0 || specialColumnCounter == 1)) {
			loadPresetChartTypes(optionsSelected);

		}

	}

	public void addDataserie() {

		final Image duplicateDataseries = new Image("https://cdn2.iconfinder.com/data/icons/office-general-2/64/copy-512.png");
		duplicateDataseries.addStyleName("delete-icon");
		duplicateDataseries.setTitle("Duplicate");
		
		if (!isFromLoad) {
			ValuesOfFields.getInstance().getColumnsDataList().add(new Data());
		}
		singleColumn.setHeading("untitled");

		masterPanel.addStyleName("dataseries-content");

		renameTextBox.getElement().getStyle().setWidth(85.00, Unit.PCT);
		singleColumn.addDecorate(renameTextBox);
		renameTextBox.setVisible(false);
		renameTextBox.setHeight("15px");

		renameTextBox.addKeyDownHandler(new KeyDownHandler() {

			@Override public void onKeyDown(KeyDownEvent event) {
				if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER)
					renameTextBox.setFocus(false);
			}
		});

		renameTextBox.addBlurHandler(new BlurHandler() {

			@Override public void onBlur(BlurEvent event) {
				if (renameTextBox.getText().trim().length() > 0) {
					String finalTitle = new String();
					if (renameTextBox.getText().length() > 13) {
						finalTitle = renameTextBox.getText().substring(0, 13)
								+ "...";
					} else {
						finalTitle = renameTextBox.getText();
					}

					singleColumn.setHeading(finalTitle);
					singleColumn.asWidget().setTitle(renameTextBox.getText());
					generalOptionsGroupPanel.setHeading("DATASERIES \""
							+ singleColumn.asWidget().getTitle() + "\"");
					appearancePanel.getAppearancePanels().get(numberOfCurrentColumn).setHeading("APPEARANCE FOR \""+ singleColumn.asWidget().getTitle() + "\"");

					// applyChanges.addStyleName("flashing-button-apply");

				} else {// if only contains whitespaces
					singleColumn.setHeading("untitled");
					singleColumn.asWidget().setTitle("untitled");
					generalOptionsGroupPanel.setHeading("DATASERIES untitled");
					appearancePanel.getAppearancePanels()
							.get(numberOfCurrentColumn)
							.setHeading("APPEARANCE FOR \"untitled\"");
				}

				ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setDataserieNaming(singleColumn.asWidget().getTitle());
				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(),1);
				
				
				renameTextBox.setVisible(false);
				edit.setVisible(true);
				enabled.setVisible(true);
				deleteImage.setVisible(true);
				duplicateDataseries.setVisible(true);
			}

		});

		singleColumn.addClickHandler(new ClickHandler() {

			@Override public void onClick(ClickEvent event) {
				// TODO Auto-generated method stub
				if (singleColumn.isActive()
						&& Element.as(event.getNativeEvent().getEventTarget()) != enabled
								.getElement()) {
					renameTextBox.setText(singleColumn.asWidget().getTitle());
					singleColumn.setHeading("");
					renameTextBox.setSelectionRange(0, renameTextBox.getText()
							.length());
					renameTextBox.setVisible(true);
					renameTextBox.setFocus(true);
					edit.setVisible(false);
					enabled.setVisible(false);
					deleteImage.setVisible(false);
					duplicateDataseries.setVisible(false);
				}
			}
		});

		singleColumn.asWidget().addStyleName("dataserie-tab");
		singleColumn.asWidget().addDomHandler(new DoubleClickHandler() {

			@Override public void onDoubleClick(DoubleClickEvent event) {

				renameTextBox.setText(singleColumn.asWidget().getTitle());
				singleColumn.setHeading("");
				renameTextBox.setSelectionRange(0, renameTextBox.getText()
						.length());
				renameTextBox.setVisible(true);
				renameTextBox.setFocus(true);
				edit.setVisible(false);
				enabled.setVisible(false);
				deleteImage.setVisible(false);
				duplicateDataseries.setVisible(false);
			}
		}, DoubleClickEvent.getType());

		enabled.addStyleName("dataserie-checkbox");

		enabled.addClickHandler(new ClickHandler() {

			@Override public void onClick(ClickEvent event) {
				if (enabled.getUrl().equals("https://cdn2.iconfinder.com/data/icons/windows-8-metro-style/512/unchecked_checkbox.png")) {
					enabled.setUrl("https://cdn2.iconfinder.com/data/icons/windows-8-metro-style/512/checked_checkbox.png");
					ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setEnabled(true);
				} else {
					enabled.setUrl("https://cdn2.iconfinder.com/data/icons/windows-8-metro-style/512/unchecked_checkbox.png");
					ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setEnabled(false);
				}
				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
			}
		});

		edit.setIcon(IconType.EDIT);
		edit.setIconSize(IconSize.DEFAULT);
		edit.addStyleName("editname");
		edit.addClickHandler(new ClickHandler() {
			@Override public void onClick(ClickEvent clickEvent) {

				renameTextBox.setText(singleColumn.asWidget().getTitle());
				singleColumn.setHeading("");
				renameTextBox.setSelectionRange(0, renameTextBox.getText().length());
				renameTextBox.setVisible(true);
				renameTextBox.setFocus(true);
				edit.setVisible(false);
				enabled.setVisible(false);
				deleteImage.setVisible(false);
				duplicateDataseries.setVisible(false);

			}
		});

		deleteImage.addStyleName("delete-icon");

		deleteImage.addClickHandler(new ClickHandler() {

			@Override public void onClick(ClickEvent arg0) {
				// TODO Auto-generated method stub

				int index = deleteImageList.indexOf(arg0.getSource());
				deleteImageList.remove(index);
				listBoxes.remove(index);
				
				ValuesOfFields.getInstance().getColumnsDataList().remove(index);
			
				if (deleteListener != null) {
					deleteListener.onEvent(numberOfCurrentColumn);
				}
				
				numberOfCurrentColumn--;
				if (specialColumnCounter == 1) {
					bringAllOfCertainTable(listBoxes.get(0), false);
				} else if (specialColumnCounter > 1) {
					bringAllOfCertainTable(listBoxes.get(specialColumnCounter), false);
				}

				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
			
			}
		});

		
		duplicateDataseries.addClickHandler(new ClickHandler() {
			
			@Override public void onClick(ClickEvent event) {
				// TODO Auto-generated method stub
				if(duplicateListener!=null){
					duplicateListener.onEvent(numberOfCurrentColumn);
				}
			}
		});
		
		designOptionsForDataserie(singleColumn, totalColumns,specialColumnCounter);
		
		deleteImageList.add(deleteImage);
		
		singleColumn.addDecorate(deleteImage);
		singleColumn.addDecorate(duplicateDataseries);
		singleColumn.asTabLink().add(enabled);
		// singleColumn.asTabLink().add(edit);

		if (!isFromLoad) {
			renameTextBox.setText("");
			renameTextBox.setPlaceholder("Name your dataseries..");
			singleColumn.setHeading("");
			renameTextBox.setSelectionRange(0, renameTextBox.getText().length());
			renameTextBox.setVisible(true);

			edit.setVisible(false);
			enabled.setVisible(false);
			deleteImage.setVisible(false);
			duplicateDataseries.setVisible(false);
			renameTextBox.setFocus(true);
		}
	}

	public void designOptionsForDataserie(Tab whereToAttach, int certainColumn,final int numberOfCurrentColumn) {

		final Alert notFilledAlert = new Alert();
		notFilledAlert.setType(AlertType.ERROR);
		notFilledAlert.setClose(false);
		notFilledAlert.setText("Please fill all the required fields.");
		notFilledAlert.setVisible(false);
		generalOptionsGroupPanel.add(notFilledAlert);

		FlowPanel overallPanel = new FlowPanel();
		FlowPanel aggPanel = new FlowPanel();
		final DropdownListWidget x_axisListBox = new DropdownListWidget();
		final RadioButton totalNumberRadio = new RadioButton("Total number");
		totalNumberRadio.setText("Total number");
		final RadioButton aggRadio = new RadioButton("");
		final DropdownListWidget y_axisListBox = new DropdownListWidget();
		aggRadio.addStyleName("radio-button-accordion");
		totalNumberRadio.addStyleName("radio-button-accordion");
		if (isFromLoad) {
			if (!ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getY_values().equals("*")) {
				totalNumberRadio.setValue(false);
				y_axisListBox.getListBox().setEnabled(true);
				aggregateListBox.setEnabled(true);
				aggRadio.setValue(true);
			} else {
				totalNumberRadio.setValue(true);
				y_axisListBox.getListBox().setEnabled(false);
				aggregateListBox.setEnabled(false);
			}
		} else {
			totalNumberRadio.setValue(true);
			y_axisListBox.getListBox().setEnabled(false);
			aggregateListBox.setEnabled(false);
		}

		final TextBox numberOfResults = new TextBox();
		numberOfResults.getElement().setAttribute("type", "number");
		if (isFromLoad) {
			numberOfResults.setText(ValuesOfFields.getInstance()
					.getNumberOfResults() + "");
		} else {
			numberOfResults.setText("30");
		}

		numberOfResults.addChangeHandler(new ChangeHandler() {

			@Override public void onChange(ChangeEvent event) {
				if (Integer.parseInt(numberOfResults.getText()) > 0)
					ValuesOfFields.getInstance().setNumberOfResults(
							Integer.parseInt(numberOfResults.getText()));
				else
					ValuesOfFields.getInstance().setNumberOfResults(30);

				// Generate.getInstance().generateURLs(ValuesOfFields.getInstance(),
				// 1);
				applyChanges.addStyleName("flashing-button-apply");
			}
		});

		typeOfChart.getListBox().getElement().getStyle()
				.setWidth(100.0, Unit.PCT);
		tableListBox.getElement().getStyle().setWidth(100.0, Unit.PCT);
		splitBy.getListBox().getElement().getStyle().setWidth(100.0, Unit.PCT);
		x_axisListBox.getListBox().getElement().getStyle()
				.setWidth(100.0, Unit.PCT);

		totalNumberRadio.addClickHandler(new ClickHandler() {

			@Override public void onClick(ClickEvent event) {
				aggRadio.setValue(false);
				y_axisListBox.getListBox().setEnabled(false);
				aggregateListBox.setEnabled(false);
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setY_values("*");
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setTypeOf("count");
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setIndexOfTypeOf(0);
				ValuesOfFields.getInstance().setYaxis(
						totalNumberRadio.getText());
				applyChanges.addStyleName("flashing-button-apply");

			}
		});

		aggRadio.addClickHandler(new ClickHandler() {

			@Override public void onClick(ClickEvent event) {
				totalNumberRadio.setValue(false);
				y_axisListBox.getListBox().setEnabled(true);
				aggregateListBox.setEnabled(true);
			}
		});

		Form generalOptionsForm = new Form();
		// generalOptionsForm.setType(FormType.HORIZONTAL);

		designOptionsForTypeOfChart(typeOfChart);

		listBoxes.add(x_axisListBox);

		TreeListener treeListener = new TreeListener() {

			@Override public void onEvent() {
				filtersPanel.getInfoAlert().setVisible(false);
				filtersPanel.getAddNewFilter().setVisible(true);
			}
		};

		x_axisListBox.setTreeListener(treeListener);

		y_axisListBox.getListBox().setSize(2);

		aggPanel.add(aggRadio);
		aggPanel.add(aggregateListBox);
		aggPanel.add(y_axisListBox);
		// tempPanel.getElement().getStyle().setMarginLeft(-82.0, Unit.PX);
		aggregateListBox.getElement().getStyle()
				.setDisplay(Display.INLINE_BLOCK);
		y_axisListBox.asWidget().getElement().getStyle()
				.setDisplay(Display.INLINE_BLOCK);

		overallPanel.add(totalNumberRadio);
		overallPanel.add(aggPanel);

		FormFieldSet finalFieldSet = new FormFieldSet("", overallPanel);

		generalOptionsForm.add(new FormFieldSet("Type of chart (*)", typeOfChart
				.asWidget()));
		generalOptionsForm.add(new FormFieldSet("What do you want to see? (*)",
				tableListBox));

		generalOptionsForm.add(finalFieldSet);

		if (numberOfCurrentColumn >= 1) {

			generalOptionsForm.add(new FormFieldSet("", x_axisLabel,x_axisListBox.asWidget(), this.infoParagraph));
		} else {
			generalOptionsForm.add(new FormFieldSet("", x_axisLabel,x_axisListBox.asWidget()));
		}

		aggregateListBox.setSize(2);
		aggregateListBox.addItem("avg of");
		aggregateListBox.addItem("count of");
		aggregateListBox.addItem("sum of");
		aggregateListBox.addItem("max of");
		aggregateListBox.addItem("min of");
		aggregateListBox.setSelectedIndex(1);
		// generalOptionsForm.add(new FormFieldSet("Aggregate",
		// aggregateListBox));
		aggregateListBox.addChangeHandler(new ChangeHandler() {

			@Override public void onChange(ChangeEvent arg0) {
				// TODO Auto-generated method stub
				addOptionsForY_axis(y_axisListBox, numberOfCurrentColumn);
				for (int i = 0; i < y_axisListBox.getMasterTree()
						.getItemCount(); i++) {
					if (aggregateListBox.getSelectedItemText().equals(
							"count of")) {
						// ola mporoun na exoun count of opote an exoume
						// epileksei count of emfanise ta ola
					} else if (aggregateListBox.getSelectedItemText().equals(
							"avg of")) {
						String[] split = y_axisListBox.getMasterTree()
								.getItem(i).getElement().getAttribute("value")
								.split(" ");
						if (split[1].equals("nominal")) {
							y_axisListBox.getMasterTree().removeItem(
									y_axisListBox.getMasterTree().getItem(i));
						} else if (split[1].equals("ordinal")) {
							y_axisListBox.getMasterTree().removeItem(
									y_axisListBox.getMasterTree().getItem(i));
						} else {
							// dwsto
						}
					} else if (aggregateListBox.getSelectedItemText().equals(
							"sum of")) {
						String[] split = y_axisListBox.getMasterTree()
								.getItem(i).getElement().getAttribute("value")
								.split(" ");
						if (split[1].equals("nominal")) {
							// mporei na exei count of opote min to peirakseis
							y_axisListBox.getMasterTree().removeItem(
									y_axisListBox.getMasterTree().getItem(i));
						} else if (split[1].equals("ordinal")) {
							y_axisListBox.getMasterTree().removeItem(
									y_axisListBox.getMasterTree().getItem(i));
						} else {
							// dwsto
						}
					} else if (aggregateListBox.getSelectedItemText().equals(
							"max of")) {
						String[] split = y_axisListBox.getMasterTree()
								.getItem(i).getElement().getAttribute("value")
								.split(" ");
						if (split[1].equals("nominal")) {
							y_axisListBox.getMasterTree().removeItem(
									y_axisListBox.getMasterTree().getItem(i));
						} else if (split[1].equals("ordinal")) {
							// dwsto
						} else {
							// dwsto
						}
					} else if (aggregateListBox.getSelectedItemText().equals(
							"min of")) {
						String[] split = y_axisListBox.getMasterTree()
								.getItem(i).getElement().getAttribute("value")
								.split(" ");
						if (split[1].equals("nominal")) {
							// mporei na exei count of opote min to peirakseis
							y_axisListBox.getMasterTree().removeItem(
									y_axisListBox.getMasterTree().getItem(i));
						} else if (split[1].equals("ordinal")) {
							// dwsto
						} else {
							// dwsto
						}
					}
				}

				ValuesOfFields
						.getInstance()
						.getColumnsDataList()
						.get(numberOfCurrentColumn)
						.setTypeOf(
								aggregateListBox.getItemText(aggregateListBox
										.getSelectedIndex()));
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn)
						.setIndexOfTypeOf(aggregateListBox.getSelectedIndex());
				ValuesOfFields.getInstance().setYaxis(
						aggregateListBox.getSelectedItemText()
								+ " "
								+ y_axisListBox.getListBox()
										.getSelectedItemText());
				// Generate.getInstance().generateURLs(
				// ValuesOfFields.getInstance(), 1);
				applyChanges.addStyleName("flashing-button-apply");
			}
		});

		ValuesOfFields.getInstance().getColumnsDataList()
				.get(numberOfCurrentColumn)
				.setTypeOf(aggregateListBox.getItemText(1));
		ValuesOfFields.getInstance().getColumnsDataList()
				.get(numberOfCurrentColumn).setIndexOfTypeOf(1);

		bringAllForSplitted(splitBy);

		if (isFromLoad) {
			splitBy.getListBox().addItem(ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getSplitByTitle());
			splitBy.getListBox().setSelectedIndex(0);
		}

		HorizontalPanel horizontalPanel = new HorizontalPanel();
		
		numberOfResults.setSize(1);
		Label firstLabel = new Label("Show me the first ");
		firstLabel.getElement().getStyle().setMarginTop(5.0, Unit.PX);
		
		Label secondLabel = new Label(" results");
		secondLabel.getElement().getStyle().setMarginTop(5.0, Unit.PX);
		
		numberOfResults.getElement().getStyle().setMarginLeft(5.0, Unit.PX);
		numberOfResults.getElement().getStyle().setMarginRight(5.0, Unit.PX);
		
		horizontalPanel.add(firstLabel);
		horizontalPanel.add(numberOfResults);
		horizontalPanel.add(secondLabel);
		
		generalOptionsForm.add(new FormFieldSet("", splitByLabel, splitBy.asWidget()));
		
		generalOptionsForm.add(new FormFieldSet("",horizontalPanel.asWidget()));
		splitBy.getMasterTree().addSelectionHandler(new SelectionHandler<TreeItem>() {

					@Override public void onSelection(SelectionEvent<TreeItem> event) {
						String[] splitted = event.getSelectedItem()
								.getElement().getAttribute("value")
								.split(" type ");

						if (!event.getSelectedItem().getText().equals("none")) {
							ValuesOfFields.getInstance().getColumnsDataList()
									.get(numberOfCurrentColumn)
									.setSplitBy(splitted[0]);
						} else {
							ValuesOfFields.getInstance().getColumnsDataList()
									.get(numberOfCurrentColumn).setSplitBy("");
						}
						ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setSplitByTitle(splitBy.getListBox().getSelectedItemText());
						// Generate.getInstance().generateURLs(
						// ValuesOfFields.getInstance(), 1);
						applyChanges.addStyleName("flashing-button-apply");
					}
				});

		ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setDesignAs("column");
		if(!isFromLoad)
			ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setSplitBy("");

		generalOptionsGroupPanel.addStyleName("accordionPanel");
		generalOptionsGroupPanel.setId("accordionGeneral");
		generalOptionsGroupPanel.getElement().getStyle()
				.setOverflow(Overflow.VISIBLE);
		generalOptionsGroupPanel.setHeading("DATASERIES untitled");
		generalOptionsGroupPanel.getHeading().addStyleName("accordionHeading");
		generalOptionsGroupPanel.add(generalOptionsForm);
		generalOptionsGroupPanel.setIcon(IconType.ANGLE_UP);
		generalOptionsGroupPanel.setDefaultOpen(true);
		generalOptionsGroupPanel.addShowHandler(new ShowHandler() {
			@Override public void onShow(ShowEvent showEvent) {
				generalOptionsGroupPanel.setIcon(IconType.ANGLE_UP);

				Timer timer = new Timer() {

					@Override public void run() {
						generalOptionsGroupPanel.getElement().getStyle()
								.setOverflow(Overflow.VISIBLE);
					}
				};
				timer.schedule(300);
			}
		});
		generalOptionsGroupPanel.addHideHandler(new HideHandler() {
			@Override public void onHide(HideEvent hideEvent) {
				generalOptionsGroupPanel.setIcon(IconType.ANGLE_DOWN);
				generalOptionsGroupPanel.getElement().getStyle()
						.setOverflow(Overflow.HIDDEN);
			}
		});

		masterPanel.add(generalOptionsGroupPanel);

		filtersGroupPanel.addStyleName("accordionPanel");
		Element element = (Element) filtersGroupPanel.getElement().getChild(1);
		element.getStyle().setOverflow(Overflow.AUTO);
		filtersGroupPanel.setHeading("FILTERS");
		filtersGroupPanel.getHeading().addStyleName("accordionHeading");
//		filtersGroupPanel.getHeading().add(new Icon(IconType.PLUS));

		filtersPanel = new FiltersPanel(schemaFromServer,
				numberOfCurrentColumn, isFromLoad, filtersPanels);

		filtersPanels.add(filtersPanel);

		filtersGroupPanel.add(filtersPanel.asWidget());
		filtersGroupPanel.setIcon(IconType.ANGLE_UP);
		filtersGroupPanel.setDefaultOpen(true);
		filtersGroupPanel.getHeading().add(filtersPanel.getAddNewFilter());
		filtersGroupPanel.addShowHandler(new ShowHandler() {
			@Override public void onShow(ShowEvent showEvent) {
				filtersGroupPanel.setIcon(IconType.ANGLE_UP);
				Timer timer = new Timer() {

					@Override public void run() {
						// filtersGroupPanel.getElement().getStyle().setOverflow(Overflow.VISIBLE);
						Element element = (Element) filtersGroupPanel
								.getElement().getChild(1);
						element.getStyle().setOverflow(Overflow.VISIBLE);
					}
				};
				timer.schedule(300);
			}
		});
		
		Element elementGeneral = (Element) filtersGroupPanel.getElement().getChild(1);
		elementGeneral.getStyle().setOverflow(Overflow.VISIBLE);
		
		filtersGroupPanel.addHideHandler(new HideHandler() {
			@Override public void onHide(HideEvent hideEvent) {
				filtersGroupPanel.setIcon(IconType.ANGLE_DOWN);
				Element element = (Element) filtersGroupPanel.getElement()
						.getChild(1);
				element.getStyle().setOverflow(Overflow.AUTO);
			}
		});
		masterPanel.add(filtersGroupPanel);


		
		addOptionsForTable(tableListBox, x_axisListBox, y_axisListBox,
				numberOfCurrentColumn);

		
		applyChanges.setText("Apply");
		applyChanges.addStyleName("applychanges");
		applyChanges.setType(ButtonType.PRIMARY);
		applyChanges.addClickHandler(new ClickHandler() {

			@Override public void onClick(ClickEvent event) {
				// TODO Auto-generated method stub
				if (hasFilledAll(x_axisListBox, tableListBox, typeOfChart)) {
					notFilledAlert.setVisible(false);
					applyChanges.setEnabled(false);
					applyChanges.removeStyleName("flashing-button-apply");
					Generate.getInstance().getTheme1()
							.addLoadHandler(new LoadHandler() {

								@Override public void onLoad(LoadEvent event) {
									applyChanges.setEnabled(true);
								}
							});
					Generate.getInstance().generateURLs(
							ValuesOfFields.getInstance(), 1);
				} else {
					notFilledAlert.setVisible(true);
				}
			}
		});

		generalOptionsGroupPanel.add(applyChanges);

		whereToAttach.add(masterPanel);

	}

	public boolean hasFilledAll(DropdownListWidget x_axis, ListBox tableList,
			DropdownListWidget typeOfChart) {

		if (x_axis.getListBox().getSelectedItemText().equals("")
				|| x_axis.getListBox().getSelectedItemText() == null) {
			return false;
		}

		if (tableList.getSelectedItemText().equals("")
				|| tableList.getSelectedItemText() == null) {
			return false;
		}

		if (typeOfChart.getListBox().getSelectedItemText().equals("")
				|| typeOfChart.getListBox().getSelectedItemText() == null) {
			return false;
		}

		return true;

	}

	public void addOptionsForTable(final ListBox tableListBox,final DropdownListWidget x_axisListBox, final DropdownListWidget y_axisListBox, final int numberOfCurrentColumn) {

		for (int i = 0; i < schemaFromServer.getSchema().length(); i++) {
			tableListBox.addItem(schemaFromServer.getSchema().get(i).getLabel());
			tableListBox.setValue(i, schemaFromServer.getSchema().get(i).getName());
			tableListBox.setSelectedIndex(i);
		}

		
		if (isFromLoad) {
			tableListBox.setSelectedIndex(ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getIndexOfDataSource());
		}
		
		if (loadPresets) {
			loadPresets();
		}

		tableListBox.addChangeHandler(new ChangeHandler() {

			@Override public void onChange(ChangeEvent arg0) {
				// TODO Auto-generated method stub
				ValuesOfFields
						.getInstance()
						.getColumnsDataList()
						.get(numberOfCurrentColumn)
						.setDataSource(
								tableListBox.getValue(tableListBox
										.getSelectedIndex()));
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn)
						.setIndexOfDataSource(tableListBox.getSelectedIndex());

				addOptionsForX_axis(numberOfCurrentColumn, x_axisListBox);
				addOptionsForY_axis(y_axisListBox, numberOfCurrentColumn);

				x_axisLabel.setText("\""
						+ tableListBox.getItemText(tableListBox
								.getSelectedIndex()) + "\" broken down by (*)");
				splitByLabel.setText("\""
						+ tableListBox.getItemText(tableListBox
								.getSelectedIndex()) + "\" split by ");

				// clear any split by that is saved
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setSplitBy("");

				// clear all filters if the table has changed
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).getFilters().clear();
				filtersPanel.asWidget().removeFromParent();
				filtersPanel.getFiltersPanel().clear();
				filtersPanel = new FiltersPanel(schemaFromServer,
						numberOfCurrentColumn, false, filtersPanels);
				filtersGroupPanel.add(filtersPanel.asWidget());
				applyChanges.addStyleName("flashing-button-apply");
			}
		});
		
		ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setDataSource(tableListBox.getValue(tableListBox.getSelectedIndex()));
		ValuesOfFields.getInstance().getColumnsDataList()
				.get(numberOfCurrentColumn)
				.setIndexOfDataSource(tableListBox.getSelectedIndex());

		addOptionsForX_axis(numberOfCurrentColumn, x_axisListBox);
		addOptionsForY_axis(y_axisListBox, numberOfCurrentColumn);
	}

	public void addOptionsForX_axis(final int numberOfCurrentColumn,DropdownListWidget x_axisListBox) {

		x_axisListBox.clear();

		if (ValuesOfFields.getInstance().getColumnsDataList().size() == 1) {
			// ferta ola

			if (!isFromLoad) {
				bringAllOfCertainTable(x_axisListBox, false);
			} else {
				bringAllOfCertainTable(x_axisListBox, false);
				x_axisListBox.getListBox().addItem(ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getXaxisTitle());
				x_axisListBox.getListBox().setSelectedIndex(0);
			}
		} else if (ValuesOfFields.getInstance().getColumnsDataList().size() > 1) {
			// fere ta koina
			if (!isFromLoad) {
//				bringSameOriginOptions();
				 bringAllOfCertainTable(x_axisListBox, false);
			} else {
//				bringSameOriginOptions();
				 bringAllOfCertainTable(x_axisListBox, false);
				listBoxes.get(numberOfCurrentColumn).getListBox().addItem(ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getXaxisTitle());
				listBoxes.get(numberOfCurrentColumn).getListBox().setSelectedIndex(0);
			}
		} else {
			// min fereis tpt
		}
		
		if(!isFromLoad){
			String[] splitted = x_axisListBox.getMasterTree().getItem(0).getElement().getAttribute("value").split(" type ");
			ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setExtra_type(splitted[1]);
			if (numberOfCurrentColumn == 0) {
				ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setMain_extra_type(splitted[1]);
			}
			ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setX_values(splitted[0]);

			ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setXaxisTitle(x_axisListBox.getMasterTree().getItem(0).getText());
			
//			ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setX_values(x_axisListBox.getListBox().getSelectedItemText());
//			ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setXaxisTitle(x_axisListBox.getListBox().getSelectedItemText());
		}else{
			x_axisListBox.getListBox().addItem(ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getXaxisTitle());
		}
		x_axisListBox.getMasterTree().addSelectionHandler(
				new SelectionHandler<TreeItem>() {

					@Override public void onSelection(
							SelectionEvent<TreeItem> event) {
						if (event.getSelectedItem().getChildCount() == 0) {// ara
																			// den
																			// eimai
																			// se
																			// riza
																			// alla
																			// se
																			// fullo
							String[] splitted = event.getSelectedItem()
									.getElement().getAttribute("value")
									.split(" type ");
							ValuesOfFields.getInstance().getColumnsDataList()
									.get(numberOfCurrentColumn)
									.setExtra_type(splitted[1]);
							if (numberOfCurrentColumn == 0) {
								ValuesOfFields.getInstance()
										.getColumnsDataList()
										.get(numberOfCurrentColumn)
										.setMain_extra_type(splitted[1]);
							}

							ValuesOfFields.getInstance().getColumnsDataList()
									.get(numberOfCurrentColumn)
									.setX_values(splitted[0]);
							ValuesOfFields
									.getInstance()
									.getColumnsDataList()
									.get(numberOfCurrentColumn)
									.setXaxisTitle(event.getSelectedItem().getText());
							// Generate.getInstance().generateURLs(
							// ValuesOfFields.getInstance(), 1);
							applyChanges.addStyleName("flashing-button-apply");
						}

					}
				});

		bringAllForSplitted(splitBy);

		if (isFromLoad) {
			splitBy.getListBox().addItem(ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getSplitByTitle());
			splitBy.getListBox().setSelectedIndex(0);
		}

		splitBy.getMasterTree().addSelectionHandler(
				new SelectionHandler<TreeItem>() {

					@Override public void onSelection(
							SelectionEvent<TreeItem> event) {
						String[] splitted = event.getSelectedItem()
								.getElement().getAttribute("value")
								.split(" type ");

						if (!event.getSelectedItem().getText().equals("none")) {
							ValuesOfFields.getInstance().getColumnsDataList()
									.get(numberOfCurrentColumn)
									.setSplitBy(splitted[0]);
						} else {
							ValuesOfFields.getInstance().getColumnsDataList()
									.get(numberOfCurrentColumn).setSplitBy("");
						}
						ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setSplitByTitle(splitBy.getListBox().getSelectedItemText());
						
						applyChanges.addStyleName("flashing-button-apply");
					}
				});

		if (loadPresets) {
			loadPresets();
			loadPresets = false;
		}

	}

	public void addOptionsForY_axis(final DropdownListWidget y_axisListBox,
			final int numberOfCurrentColumn) {

		// y_axisListBox.getListBox().setEnabled(true);
		// aggregateListBox.setEnabled(true);
		y_axisListBox.clear();
		if (isFromLoad) {
			y_axisListBox.getListBox().addItem(
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).getY_values());
			aggregateListBox.addItem(ValuesOfFields.getInstance()
					.getColumnsDataList().get(numberOfCurrentColumn)
					.getTypeOf()
					+ " of");
		} else {
			ValuesOfFields.getInstance().getColumnsDataList()
					.get(numberOfCurrentColumn).setY_values("*");
			ValuesOfFields.getInstance().getColumnsDataList()
					.get(numberOfCurrentColumn).setTypeOf("count");
			ValuesOfFields.getInstance().getColumnsDataList()
					.get(numberOfCurrentColumn).setIndexOfTypeOf(0);
			ValuesOfFields.getInstance().setYaxis("Total number");
		}
		Tree root = new Tree();
		for (int i = 0; i < schemaFromServer
				.getSchema()
				.get(ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).getIndexOfDataSource())
				.getCol().length(); i++) {
			String temp = null;
			temp = schemaFromServer
					.getSchema()
					.get(ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).getIndexOfDataSource())
					.getCol().get(i).getData().toString();
			if (temp != null
					&& !schemaFromServer
							.getSchema()
							.get(ValuesOfFields.getInstance()
									.getColumnsDataList()
									.get(numberOfCurrentColumn)
									.getIndexOfDataSource()).getCol().get(i)
							.getExtra_type().equals("none")
					&& !schemaFromServer
							.getSchema()
							.get(ValuesOfFields.getInstance()
									.getColumnsDataList()
									.get(numberOfCurrentColumn)
									.getIndexOfDataSource()).getCol().get(i)
							.getExtra_type().equals("boolean")) {
				TreeItem tempItem = new TreeItem();
				tempItem.setText(schemaFromServer
						.getSchema()
						.get(ValuesOfFields.getInstance().getColumnsDataList()
								.get(numberOfCurrentColumn)
								.getIndexOfDataSource()).getCol().get(i)
						.getLabel());
				tempItem.getElement().setAttribute(
						"value",
						schemaFromServer
								.getSchema()
								.get(ValuesOfFields.getInstance()
										.getColumnsDataList()
										.get(numberOfCurrentColumn)
										.getIndexOfDataSource()).getCol()
								.get(i).getName()
								+ " " + temp);

				root.addItem(tempItem);
			}
		}
		y_axisListBox.setTreeOptions(root);
		if (root.getItemCount() == 0) {
			y_axisListBox.getListBox().setEnabled(false);
			aggregateListBox.setEnabled(false);
			y_axisListBox.getListBox().addItem("No aggregation available");
		}

		y_axisListBox.getMasterTree().addSelectionHandler(
				new SelectionHandler<TreeItem>() {

					@Override public void onSelection(
							SelectionEvent<TreeItem> event) {
						String[] split = event.getSelectedItem().getElement()
								.getAttribute("value").split(" ");
						ValuesOfFields.getInstance().getColumnsDataList()
								.get(numberOfCurrentColumn)
								.setY_values(split[0]);
						// aggregateListBox.clear();
						// if (split[1].equals("nominal")) {
						// aggregateListBox.addItem("count of");
						// } else if (split[1].equals("ordinal")) {
						// aggregateListBox.addItem("min of");
						// aggregateListBox.addItem("max of");
						// aggregateListBox.addItem("count of");
						// } else {
						// aggregateListBox.addItem("count of");
						// aggregateListBox.addItem("min of");
						// aggregateListBox.addItem("max of");
						// aggregateListBox.addItem("avg of");
						// aggregateListBox.addItem("sum of");
						//
						// }
						ValuesOfFields.getInstance().setYaxis(
								aggregateListBox.getSelectedItemText()
										+ " "
										+ y_axisListBox.getListBox()
												.getSelectedItemText());
						masterPanel.getElement().getStyle().clearOverflow();
						masterPanel.getElement().getStyle()
								.setOverflow(Overflow.AUTO);

						applyChanges.addStyleName("flashing-button-apply");
					}
				});
		// String[] split =
		// y_axisListBox.getMasterTree().getItem(0).getElement()
		// .getAttribute("value").split(" ");
		// ValuesOfFields.getInstance().getColumnsDataList()
		// .get(numberOfCurrentColumn).setY_values(split[0]);

	}

	public void designOptionsForTypeOfChart(DropdownListWidget typeOfChart) {

		Tree mainRoot = new Tree();
		TreeItem rootColumn = new TreeItem();
		TreeItem rootBar = new TreeItem();
		TreeItem rootLine = new TreeItem();
		TreeItem rootArea = new TreeItem();
		TreeItem rootPie = new TreeItem();
		TreeItem rootOther = new TreeItem();

		rootColumn.setText("Column");
		rootBar.setText("Bar");
		rootLine.setText("Line");
		rootArea.setText("Area");
		rootPie.setText("Pie");
		rootOther.setText("Other");

		TreeItem temp = new TreeItem();
		temp.setText("Column - Clustered");
		temp.setTitle("column-none");
		rootColumn.addItem(temp);

		TreeItem temp1 = new TreeItem();
		temp1.setText("Column - Stacked");
		temp1.setTitle("column-normal");
		rootColumn.addItem(temp1);

		TreeItem temp2 = new TreeItem();
		temp2.setText("Column - Full stacked");
		temp2.setTitle("column-percent");
		rootColumn.addItem(temp2);

		TreeItem temp3 = new TreeItem();
		temp3.setText("Bar - Clustered");
		temp3.setTitle("bar-none");
		rootBar.addItem(temp3);

		TreeItem temp4 = new TreeItem();
		temp4.setText("Bar - Stacked");
		temp4.setTitle("bar-normal");
		rootBar.addItem(temp4);

		TreeItem temp5 = new TreeItem();
		temp5.setText("Bar - Full stacked");
		temp5.setTitle("bar-percent");
		rootBar.addItem(temp5);

		TreeItem temp6 = new TreeItem();
		temp6.setText("Simple line");
		temp6.setTitle("line-none");
		rootLine.addItem(temp6);

		TreeItem temp7 = new TreeItem();
		temp7.setText("Spline");
		temp7.setTitle("spline-none");
		rootLine.addItem(temp7);

		TreeItem temp8 = new TreeItem();
		temp8.setText("Line with steps");
		temp8.setTitle("line-steps");
		rootLine.addItem(temp8);

		TreeItem temp9 = new TreeItem();
		temp9.setText("Simple area");
		temp9.setTitle("area-none");
		rootArea.addItem(temp9);

		TreeItem temp10 = new TreeItem();
		temp10.setText("Area-Full stacked");
		temp10.setTitle("area-percent");
		rootArea.addItem(temp10);

		TreeItem temp11 = new TreeItem();
		temp11.setText("Area - Stacked");
		temp11.setTitle("area-normal");
		rootArea.addItem(temp11);

		TreeItem temp12 = new TreeItem();
		temp12.setText("Simple Pie");
		temp12.setTitle("pie-none");
		rootPie.addItem(temp12);

		TreeItem temp13 = new TreeItem();
		temp13.setText("3D Pie");
		temp13.setTitle("pie-3D");
		rootPie.addItem(temp13);

		TreeItem temp14 = new TreeItem();
		temp14.setText("Donut");
		temp14.setTitle("pie-donut");
		rootPie.addItem(temp14);

		TreeItem temp15 = new TreeItem();
		temp15.setText("Map");
		temp15.setTitle("map-none");
		rootOther.addItem(temp15);

		mainRoot.addItem(rootColumn);
		mainRoot.addItem(rootBar);
		mainRoot.addItem(rootLine);
		mainRoot.addItem(rootArea);
		mainRoot.addItem(rootPie);
		mainRoot.addItem(rootOther);
		mainRoot.setAnimationEnabled(true);

		typeOfChart.setTreeOptions(mainRoot);

		typeOfChart.getMasterTree().addSelectionHandler(
				new SelectionHandler<TreeItem>() {

					@Override public void onSelection(
							SelectionEvent<TreeItem> event) {

						if (event.getSelectedItem().getChildCount() == 0) {
							String[] splitted = event.getSelectedItem()
									.getTitle().split("-");
							
							ValuesOfFields.getInstance().getColumnsDataList()
									.get(numberOfCurrentColumn)
									.setTypeOfChart(splitted[0]);

							ValuesOfFields.getInstance().getColumnsDataList()
									.get(numberOfCurrentColumn)
									.setStacking(splitted[1]);

							if (changedTypeListener != null) {
							    int chartType=0;
								if(splitted[0].equals("map")) {
									chartType=1;
								}else if(splitted[0].equals("bar")){
									chartType=2;
								}else if(splitted[0].equals("column")){
									chartType=3;
								}else{
									chartType=4;
								}

								changedTypeListener.onEvent(chartType);
							}

							// Generate.getInstance().generateURLs(
							// ValuesOfFields.getInstance(), 1);
							applyChanges.addStyleName("flashing-button-apply");
						} else {
							if (comingFromSetState == 1 && prevOpenState) {
								comingFromSetState++;
							}
							if (comingFromSetState != 2) {
								comingFromSetState++;
								event.getSelectedItem().setState(
										!event.getSelectedItem().getState());
								prevOpenState = !event.getSelectedItem()
										.getState();

							} else {
								comingFromSetState = 0;
								prevOpenState = true;
							}
						}
					}
				});

		if (isFromLoad) {
			if (ValuesOfFields.getInstance().getColumnsDataList()
					.get(numberOfCurrentColumn).getTypeOfChart().equals("")) {
				typeOfChart.getListBox().addItem("Line");
			} else {
				typeOfChart.getListBox().addItem(
						ValuesOfFields.getInstance().getColumnsDataList()
								.get(numberOfCurrentColumn).getTypeOfChart());
			}

			typeOfChart.getListBox().setSelectedIndex(0);
		}
	}

	public void bringAllOfCertainTable(DropdownListWidget x_optionsListBox,
			boolean isForSplitBy) {

		x_optionsListBox.clear();
		Tree mainRoot = new Tree();
		TreeItem root = new TreeItem();

		root.setText("more");

		int i = ValuesOfFields.getInstance().getColumnsDataList()
				.get(numberOfCurrentColumn).getIndexOfDataSource();

		for (int j = 0; j < schemaFromServer.getSchema().get(i).getCol()
				.length(); j++) {
			String temp = null;
			temp = schemaFromServer.getSchema().get(i).getCol().get(j)
					.getData();
			if (temp == null) {
				ArrayList<String> tempList = new ArrayList<String>();
				ArrayList<String> predecessors = new ArrayList<String>();
				tempList.add(schemaFromServer.getSchema().get(i).getName());

				if (!schemaFromServer.getSchema().get(i).getCol().get(j)
						.getName().equals("")) {
					predecessors.add(schemaFromServer.getSchema().get(i)
							.getName()
							+ "("
							+ schemaFromServer.getSchema().get(i).getCol()
									.get(j).getToColumn() + ")");
					predecessors.add("("
							+ schemaFromServer.getSchema().get(i).getCol()
									.get(j).getFromColumn()
							+ ")"
							+ schemaFromServer.getSchema().get(i).getCol()
									.get(j).getName()
							+ "("
							+ schemaFromServer.getSchema().get(i).getCol()
									.get(j).getFromColumnAfter() + ")");
				} else {
					predecessors.add(schemaFromServer.getSchema().get(i)
							.getName()
							+ "("
							+ schemaFromServer.getSchema().get(i).getCol()
									.get(j).getFromColumnAfter() + ")");
				}
				if (!schemaFromServer
						.getSchema()
						.get(i)
						.getName()
						.equals(schemaFromServer.getSchema().get(i).getCol()
								.get(j).getToTable())) {
					recursiveExport(schemaFromServer, schemaFromServer
							.getSchema().get(i).getCol().get(j).getToTable(),
							schemaFromServer.getSchema().get(i).getName(),
							tempList, root, predecessors, schemaFromServer
									.getSchema().get(i).getCol().get(j)
									.getToColumnAfter());
				}
			} else {
				TreeItem tempItem = new TreeItem();
				if (!schemaFromServer.getSchema().get(i).getCol().get(j)
						.getExtra_type().equals("none")
						&& !schemaFromServer.getSchema().get(i).getCol().get(j)
								.getExtra_type().equals("none")
						&& schemaFromServer.getSchema().get(i).getCol().get(j)
								.getDisplayed().equals("true")) {
					tempItem.setText(schemaFromServer.getSchema().get(i)
							.getCol().get(j).getLabel());
					tempItem.setTitle(schemaFromServer.getSchema().get(i)
							.getCol().get(j).getHint());
					tempItem.getElement().setAttribute(
							"value",
							schemaFromServer.getSchema().get(i).getCol().get(j)
									.getName()
									+ " type "
									+ schemaFromServer.getSchema().get(i)
											.getCol().get(j).getExtra_type());

					mainRoot.addItem(tempItem);
				}
			}
		}
		if (root.getChildCount() != 0) {
			for (int l = root.getChildCount() - 1; l >= 0; l--)
				mainRoot.addItem(root.getChild(l));

		}

		mainRoot.setAnimationEnabled(true);

		x_optionsListBox.setTreeOptions(mainRoot);

		x_optionsListBox.getMasterTree().addSelectionHandler(
				new SelectionHandler<TreeItem>() {

					@Override public void onSelection(
							final SelectionEvent<TreeItem> event) {

						if (event.getSelectedItem().getChildCount() == 0) {// ara
																			// den
																			// eimai
																			// se
																			// riza
																			// alla
																			// se
																			// fullo
							String[] splitted = event.getSelectedItem().getElement().getAttribute("value").split(" type ");
							ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setExtra_type(splitted[1]);
							if (numberOfCurrentColumn == 0) {
								ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setMain_extra_type(splitted[1]);
							}
							ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setX_values(splitted[0]);

							ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setXaxisTitle(event.getSelectedItem().getText());
							// Generate.getInstance().generateURLs(
							// ValuesOfFields.getInstance(), 1);
							applyChanges.addStyleName("flashing-button-apply");
						} else {
							if (comingFromSetState == 1 && prevOpenState) {
								comingFromSetState++;
							}
							if (comingFromSetState != 2) {
								comingFromSetState++;
								event.getSelectedItem().setState(
										!event.getSelectedItem().getState());
								prevOpenState = !event.getSelectedItem()
										.getState();

							} else {
								comingFromSetState = 0;
								prevOpenState = true;
							}
						}
					}
				});

		if (!isFromLoad) {
			x_optionsListBox.getListBox().addItem(x_optionsListBox.getMasterTree().getItem(0).getText());
		}
	}

	public void recursiveExport(SchemaAnswer schemaFromServer, String to,
			String from, ArrayList<String> circleAlert, TreeItem root,
			ArrayList<String> predecessors, String toColumn) {

		for (int i = 0; i < schemaFromServer.getSchema().length(); i++) {
			if (schemaFromServer.getSchema().get(i).getName().equals(to)) {// vres
																			// poio
																			// table
																			// prepei
																			// na
																			// kanoume
																			// expand,
																			// sumfwna
																			// me
																			// tin
																			// metavliti
																			// "to"

				predecessors.add("(" + toColumn + ")"
						+ schemaFromServer.getSchema().get(i).getName());
				TreeItem newRoot = new TreeItem();
				root.addItem(newRoot);

				newRoot.setText(schemaFromServer.getSchema().get(i).getLabel());
				for (int k = 0; k < schemaFromServer.getSchema().get(i)
						.getCol().length(); k++) {
					if (schemaFromServer.getSchema().get(i).getCol().get(k)
							.getToTable() == null) {
						TreeItem tempItem = new TreeItem();
						String contentString = predecessorsToString(predecessors);
						if (!schemaFromServer.getSchema().get(i).getCol()
								.get(k).getExtra_type().equals("boolean")
								&& !schemaFromServer.getSchema().get(i)
										.getCol().get(k).getExtra_type()
										.equals("none")
								&& schemaFromServer.getSchema().get(i).getCol()
										.get(k).getDisplayed().equals("true")) {
							tempItem.setText(schemaFromServer.getSchema()
									.get(i).getCol().get(k).getLabel());
							tempItem.setTitle(schemaFromServer.getSchema()
									.get(i).getCol().get(k).getHint());

							tempItem.getElement().setAttribute(
									"value",
									contentString
											+ "-"
											+ schemaFromServer.getSchema()
													.get(i).getCol().get(k)
													.getName()
											+ " type "
											+ schemaFromServer.getSchema()
													.get(i).getCol().get(k)
													.getExtra_type());

							newRoot.addItem(tempItem);
						}
					}
				}

				for (int k = 0; k < schemaFromServer.getSchema().get(i)
						.getCol().length(); k++) {
					// afou to vreis pare ena ena ta columns kai des poio
					// xreiazetai expand
					boolean found = false;

					if (schemaFromServer.getSchema().get(i).getCol().get(k)
							.getToTable() != null) {
						if (circleAlert.contains(schemaFromServer.getSchema()
								.get(i).getCol().get(k).getToTable())) {// an
																		// auto
																		// pou
																		// xreiazetai
																		// expand
																		// exei
																		// ginei
																		// expand
																		// paliotera
																		// tote
																		// min
																		// mpeis
							found = true;
						}

						if (!found) {// den to exoume kanei expand opote ksekina
										// tin anadromi

							circleAlert.add(schemaFromServer.getSchema().get(i)
									.getName());
							if (!schemaFromServer.getSchema().get(i).getCol()
									.get(k).getName().equals("")) {
								predecessors.add(predecessors.get(
										predecessors.size() - 1).concat(
										"(" + toColumn + ")"));
								predecessors.remove(predecessors.size() - 2);
								predecessors.add("("
										+ schemaFromServer.getSchema().get(i)
												.getCol().get(k)
												.getFromColumn()
										+ ")"
										+ schemaFromServer.getSchema().get(i)
												.getCol().get(k).getName()
										+ "("
										+ schemaFromServer.getSchema().get(i)
												.getCol().get(k)
												.getFromColumnAfter() + ")");

							} else {
								predecessors.add(predecessors.get(
										predecessors.size() - 1).concat(
										"("
												+ schemaFromServer.getSchema()
														.get(i).getCol().get(k)
														.getFromColumnAfter()
												+ ")"));
								predecessors.remove(predecessors.size() - 2);
							}

							if (!schemaFromServer
									.getSchema()
									.get(i)
									.getName()
									.equals(schemaFromServer.getSchema().get(i)
											.getCol().get(k).getToTable()))
								recursiveExport(schemaFromServer,
										schemaFromServer.getSchema().get(i)
												.getCol().get(k).getToTable(),
										schemaFromServer.getSchema().get(i)
												.getName(), circleAlert,
										newRoot, predecessors, schemaFromServer
												.getSchema().get(i).getCol()
												.get(k).getToColumn());
							if (newRoot.getChildCount() == 0)
								root.removeItem(newRoot);

						} else {// to exoume ksanakanei expand opote proxwra sto
								// epomeno
								// do-nothing
						}
					}
				}
				break;
			}
		}

	}

	public void recursiveExport_ForSplitted(SchemaAnswer schemaFromServer,
			String to, String from, ArrayList<String> circleAlert,
			TreeItem root, ArrayList<String> predecessors, String toColumn) {

		for (int i = 0; i < schemaFromServer.getSchema().length(); i++) {
			if (schemaFromServer.getSchema().get(i).getName().equals(to)) {// vres
																			// poio
																			// table
																			// prepei
																			// na
																			// kanoume
																			// expand,
																			// sumfwna
																			// me
																			// tin
																			// metavliti
																			// "to"

				predecessors.add("(" + toColumn + ")"
						+ schemaFromServer.getSchema().get(i).getName());
				TreeItem newRoot = new TreeItem();
				root.addItem(newRoot);

				newRoot.setText(schemaFromServer.getSchema().get(i).getLabel());
				for (int k = 0; k < schemaFromServer.getSchema().get(i)
						.getCol().length(); k++) {
					if (schemaFromServer.getSchema().get(i).getCol().get(k)
							.getToTable() == null) {
						TreeItem tempItem = new TreeItem();
						String contentString = predecessorsToString(predecessors);
						if (!schemaFromServer.getSchema().get(i).getCol()
								.get(k).getExtra_type().equals("boolean")
								&& !schemaFromServer.getSchema().get(i)
										.getCol().get(k).getExtra_type()
										.equals("none")
								&& schemaFromServer.getSchema().get(i).getCol()
										.get(k).getDisplayed().equals("true")) {
							tempItem.setText(schemaFromServer.getSchema()
									.get(i).getCol().get(k).getLabel());
							tempItem.setTitle(schemaFromServer.getSchema()
									.get(i).getCol().get(k).getHint());

							tempItem.getElement().setAttribute(
									"value",
									contentString
											+ "-"
											+ schemaFromServer.getSchema()
													.get(i).getCol().get(k)
													.getName()
											+ " type "
											+ schemaFromServer.getSchema()
													.get(i).getCol().get(k)
													.getExtra_type());

							newRoot.addItem(tempItem);
						}
					}
				}

				for (int k = 0; k < schemaFromServer.getSchema().get(i)
						.getCol().length(); k++) {
					// afou to vreis pare ena ena ta columns kai des poio
					// xreiazetai expand
					boolean found = false;

					if (schemaFromServer.getSchema().get(i).getCol().get(k)
							.getToTable() != null) {
						if (circleAlert.contains(schemaFromServer.getSchema()
								.get(i).getCol().get(k).getToTable())) {// an
																		// auto
																		// pou
																		// xreiazetai
																		// expand
																		// exei
																		// ginei
																		// expand
																		// paliotera
																		// tote
																		// min
																		// mpeis
							found = true;
						}

						if (!found) {// den to exoume kanei expand opote ksekina
										// tin anadromi

							circleAlert.add(schemaFromServer.getSchema().get(i)
									.getName());
							if (!schemaFromServer.getSchema().get(i).getCol()
									.get(k).getName().equals("")) {
								predecessors.add(predecessors.get(
										predecessors.size() - 1).concat(
										"(" + toColumn + ")"));
								predecessors.remove(predecessors.size() - 2);
								predecessors.add("("
										+ schemaFromServer.getSchema().get(i)
												.getCol().get(k)
												.getFromColumn()
										+ ")"
										+ schemaFromServer.getSchema().get(i)
												.getCol().get(k).getName()
										+ "("
										+ schemaFromServer.getSchema().get(i)
												.getCol().get(k)
												.getFromColumnAfter() + ")");

							} else {
								predecessors.add(predecessors.get(
										predecessors.size() - 1).concat(
										"("
												+ schemaFromServer.getSchema()
														.get(i).getCol().get(k)
														.getFromColumnAfter()
												+ ")"));
								predecessors.remove(predecessors.size() - 2);
							}

							if (!schemaFromServer
									.getSchema()
									.get(i)
									.getName()
									.equals(schemaFromServer.getSchema().get(i)
											.getCol().get(k).getToTable()))
								recursiveExport_ForSplitted(schemaFromServer,
										schemaFromServer.getSchema().get(i)
												.getCol().get(k).getToTable(),
										schemaFromServer.getSchema().get(i)
												.getName(), circleAlert,
										newRoot, predecessors, schemaFromServer
												.getSchema().get(i).getCol()
												.get(k).getToColumn());
							if (newRoot.getChildCount() == 0)
								root.removeItem(newRoot);

						} else {// to exoume ksanakanei expand opote proxwra sto
								// epomeno
								// do-nothing
						}
					}
				}
				break;
			}
		}

	}

	public void recursiveExport_ForCommon(SchemaAnswer schemaFromServer,
			String to, String from, ArrayList<String> circleAlert,
			TreeItem root, ArrayList<String> predecessors, String extra_type,
			String toColumn) {

		for (int i = 0; i < schemaFromServer.getSchema().length(); i++) {
			if (schemaFromServer.getSchema().get(i).getName().equals(to)) {// vres
																			// poio
																			// table
																			// prepei
																			// na
																			// kanoume
																			// expand,
																			// sumfwna
																			// me
																			// tin
																			// metavliti
																			// "to"
				predecessors.add("(" + toColumn + ")"
						+ schemaFromServer.getSchema().get(i).getName());
				TreeItem newRoot = new TreeItem();
				root.addItem(newRoot);
				newRoot.setText(schemaFromServer.getSchema().get(i).getLabel());
				for (int k = 0; k < schemaFromServer.getSchema().get(i)
						.getCol().length(); k++) {

					if (schemaFromServer.getSchema().get(i).getCol().get(k)
							.getToTable() == null
							&& schemaFromServer.getSchema().get(i).getCol()
									.get(k).getExtra_type().equals(extra_type)) {
						if (schemaFromServer.getSchema().get(i).getCol().get(k)
								.getExtra_type().equals("free")) {
							if (schemaFromServer
									.getSchema()
									.get(i)
									.getCol()
									.get(k)
									.getName()
									.equals(ValuesOfFields.getInstance()
											.getColumnsDataList().get(0)
											.getX_values())) {
								TreeItem tempItem = new TreeItem();
								String contentString = predecessorsToString(predecessors);
								if (schemaFromServer.getSchema().get(i)
										.getCol().get(k).getDisplayed()
										.equals("true")) {
									tempItem.setText(schemaFromServer
											.getSchema().get(i).getCol().get(k)
											.getLabel());
									tempItem.setTitle(schemaFromServer
											.getSchema().get(i).getCol().get(k)
											.getHint());
									tempItem.getElement().setAttribute(
											"value",
											contentString
													+ "-"
													+ schemaFromServer
															.getSchema().get(i)
															.getCol().get(k)
															.getName()
													+ " type "
													+ schemaFromServer
															.getSchema().get(i)
															.getCol().get(k)
															.getExtra_type());

									newRoot.addItem(tempItem);
								}
							}
						} else {
							TreeItem tempItem = new TreeItem();
							String contentString = predecessorsToString(predecessors);
							if (schemaFromServer.getSchema().get(i).getCol()
									.get(k).getDisplayed().equals("true")) {
								tempItem.setText(schemaFromServer.getSchema()
										.get(i).getCol().get(k).getLabel());
								tempItem.setTitle(schemaFromServer.getSchema()
										.get(i).getCol().get(k).getHint());
								tempItem.getElement().setAttribute(
										"value",
										contentString
												+ "-"
												+ schemaFromServer.getSchema()
														.get(i).getCol().get(k)
														.getName()
												+ " type "
												+ schemaFromServer.getSchema()
														.get(i).getCol().get(k)
														.getExtra_type());

								newRoot.addItem(tempItem);
							}
						}

					}
				}

				for (int k = 0; k < schemaFromServer.getSchema().get(i)
						.getCol().length(); k++) {
					// afou to vreis pare ena ena ta columns kai des poio
					// xreiazetai expand
					boolean found = false;
					if (schemaFromServer.getSchema().get(i).getCol().get(k)
							.getToTable() != null) {
						if (circleAlert.contains(schemaFromServer.getSchema()
								.get(i).getCol().get(k).getToTable())) {// an
																		// auto
																		// pou
																		// xreiazetai
																		// expand
																		// exei
																		// ginei
																		// expand
																		// paliotera
																		// tote
																		// min
																		// mpeis
							found = true;
						}

						if (!found) {// den to exoume kanei expand opote ksekina
										// tin anadromi
							// circleAlert.add(schemaFromServer.getSchema().get(i).getCol().get(k).getToTable());
							circleAlert.add(schemaFromServer.getSchema().get(i)
									.getName());
							if (!schemaFromServer.getSchema().get(i).getCol()
									.get(k).getName().equals("")) {
								predecessors.add(predecessors.get(
										predecessors.size() - 1).concat(
										"(" + toColumn + ")"));
								predecessors.remove(predecessors.size() - 2);
								predecessors.add("("
										+ schemaFromServer.getSchema().get(i)
												.getName()
										+ ")"
										+ schemaFromServer.getSchema().get(i)
												.getCol().get(k).getName()
										+ "("
										+ schemaFromServer.getSchema().get(i)
												.getCol().get(k).getToTable()
										+ ")");
							}
							if (!schemaFromServer
									.getSchema()
									.get(i)
									.getName()
									.equals(schemaFromServer.getSchema().get(i)
											.getCol().get(k).getToTable()))
								recursiveExport_ForCommon(schemaFromServer,
										schemaFromServer.getSchema().get(i)
												.getCol().get(k).getToTable(),
										schemaFromServer.getSchema().get(i)
												.getName(), circleAlert,
										newRoot, predecessors, extra_type,
										schemaFromServer.getSchema().get(i)
												.getCol().get(k).getToColumn());
							if (newRoot.getChildCount() == 0)
								root.removeItem(newRoot);
						} else {// to exoume ksanakanei expand opote proxwra sto
								// epomeno
								// do-nothing
						}
					}
				}
				if (newRoot.getChildCount() == 0) {
					root.removeItem(newRoot);
				}
				break;
			}
		}

	}

	public String predecessorsToString(ArrayList<String> predecessors) {

		String contentString = new String("");
		for (int i = 0; i < predecessors.size(); i++) {
			contentString = contentString.concat(predecessors.get(i));
			if (i != predecessors.size() - 1) {
				contentString = contentString.concat("-");
			}
		}

		return contentString;
	}

	public void bringSameOriginOptions() {

		// String extra_type = ValuesOfFields.getInstance().getColumnsDataList()
		// .get(0).getMain_extra_type();

		for (int it = 0; it < ValuesOfFields.getInstance().getColumnsDataList()
				.size(); it++) {

			Tree mainRoot = new Tree();
			TreeItem root = new TreeItem();
			int i = ValuesOfFields.getInstance().getColumnsDataList().get(it)
					.getIndexOfDataSource();

			root.setText("more");
			for (int j = 0; j < schemaFromServer.getSchema().get(i).getCol()
					.length(); j++) {
				String temp = null;
				temp = schemaFromServer.getSchema().get(i).getCol().get(j)
						.getData();
				if (temp == null) {
					ArrayList<String> tempList = new ArrayList<String>();
					ArrayList<String> predecessors = new ArrayList<String>();
					tempList.add(schemaFromServer.getSchema().get(i).getName());
					if (!schemaFromServer.getSchema().get(i).getCol().get(j)
							.getName().equals(""))
						predecessors.add("("
								+ schemaFromServer.getSchema().get(i).getName()
								+ ")"
								+ schemaFromServer.getSchema().get(i).getCol()
										.get(j).getName()
								+ "("
								+ schemaFromServer.getSchema().get(i).getCol()
										.get(j).getToTable() + ")");
					if (!schemaFromServer
							.getSchema()
							.get(i)
							.getName()
							.equals(schemaFromServer.getSchema().get(i)
									.getCol().get(j).getToTable()))
						recursiveExport(schemaFromServer, schemaFromServer
								.getSchema().get(i).getCol().get(j)
								.getToTable(), schemaFromServer.getSchema()
								.get(i).getName(), tempList, root,
								predecessors,
								schemaFromServer.getSchema().get(i).getCol()
										.get(j).getToColumn());
				} else {
					TreeItem tempItem = new TreeItem();
					// if
					// (schemaFromServer.getSchema().get(i).getCol().get(j).getExtra_type().equals(extra_type))
					// {
					// if
					// (schemaFromServer.getSchema().get(i).getCol().get(j).getExtra_type().equals("free"))
					// {
					// if
					// (schemaFromServer.getSchema().get(i).getCol().get(j).getName().equals(ValuesOfFields.getInstance().getColumnsDataList().get(0).getX_values()))
					// {
					// tempItem.setText(schemaFromServer.getSchema().get(i).getCol().get(j).getLabel());
					// tempItem.getElement().setAttribute(
					// "value",
					// schemaFromServer.getSchema().get(i)
					// .getCol().get(j).getName()
					// + " type "
					// + schemaFromServer.getSchema()
					// .get(i).getCol().get(j)
					// .getExtra_type());
					// tempItem.setTitle(schemaFromServer.getSchema()
					// .get(i).getCol().get(j).getHint());
					//
					// mainRoot.addItem(tempItem);
					// }
					// } else {
					// tempItem.setText(schemaFromServer.getSchema()
					// .get(i).getCol().get(j).getLabel());
					// tempItem.getElement().setAttribute(
					// "value",
					// schemaFromServer.getSchema().get(i)
					// .getCol().get(j).getName()
					// + " type "
					// + schemaFromServer.getSchema()
					// .get(i).getCol().get(j)
					// .getExtra_type());
					// tempItem.setTitle(schemaFromServer.getSchema()
					// .get(i).getCol().get(j).getHint());
					//
					// mainRoot.addItem(tempItem);
					// }
					// }

					if (!schemaFromServer.getSchema().get(i).getCol().get(j)
							.getExtra_type().equals("none")
							&& !schemaFromServer.getSchema().get(i).getCol()
									.get(j).getExtra_type().equals("none")
							&& schemaFromServer.getSchema().get(i).getCol()
									.get(j).getDisplayed().equals("true")) {
						tempItem.setText(schemaFromServer.getSchema().get(i)
								.getCol().get(j).getLabel());
						tempItem.setTitle(schemaFromServer.getSchema().get(i)
								.getCol().get(j).getHint());
						tempItem.getElement().setAttribute(
								"value",
								schemaFromServer.getSchema().get(i).getCol()
										.get(j).getName()
										+ " type "
										+ schemaFromServer.getSchema().get(i)
												.getCol().get(j)
												.getExtra_type());

						mainRoot.addItem(tempItem);
					}
				}
			}

			if (root.getChildCount() == 0 && root.getTitle().equals("")) {
				mainRoot.removeItem(root);
			} else {
				mainRoot.addItem(root);
			}
			mainRoot.setAnimationEnabled(true);

			listBoxes.get(it).setTreeOptions(mainRoot);
			listBoxes.get(it).getMasterTree()
					.addSelectionHandler(new SelectionHandler<TreeItem>() {

						@Override public void onSelection(
								SelectionEvent<TreeItem> event) {

							if (event.getSelectedItem().getChildCount() == 0) {// ara
																				// den
																				// eimai
																				// se
																				// riza
																				// alla
																				// se
																				// fullo
								String[] splitted = event.getSelectedItem()
										.getElement().getAttribute("value")
										.split(" type ");
								ValuesOfFields.getInstance()
										.getColumnsDataList()
										.get(numberOfCurrentColumn)
										.setExtra_type(splitted[1]);

								if (numberOfCurrentColumn == 0) {
									ValuesOfFields.getInstance()
											.getColumnsDataList()
											.get(numberOfCurrentColumn)
											.setMain_extra_type(splitted[1]);
								}
								ValuesOfFields.getInstance()
										.getColumnsDataList()
										.get(numberOfCurrentColumn)
										.setX_values(splitted[0]);
								ValuesOfFields
										.getInstance()
										.getColumnsDataList()
										.get(numberOfCurrentColumn)
										.setXaxisTitle(
												event.getSelectedItem()
														.getText());
								// Generate.getInstance().generateURLs(
								// ValuesOfFields.getInstance(), 1);
							}
						}
					});

		}

	}

	public void bringAllForSplitted(DropdownListWidget x_optionsListBox) {

		x_optionsListBox.clear();
		Tree mainRoot = new Tree();
		TreeItem root = new TreeItem();
		root.setText("more");
		TreeItem noneItem = new TreeItem();
		noneItem.setText("--none--");

		mainRoot.addItem(noneItem);

		int i = ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getIndexOfDataSource();

		for (int j = 0; j < schemaFromServer.getSchema().get(i).getCol().length(); j++) {
			String temp = null;
			temp = schemaFromServer.getSchema().get(i).getCol().get(j)
					.getData();
			if (temp == null) {
				ArrayList<String> tempList = new ArrayList<String>();
				ArrayList<String> predecessors = new ArrayList<String>();
				tempList.add(schemaFromServer.getSchema().get(i).getName());

				if (!schemaFromServer.getSchema().get(i).getCol().get(j)
						.getName().equals("")) {
					predecessors.add(schemaFromServer.getSchema().get(i)
							.getName()
							+ "("
							+ schemaFromServer.getSchema().get(i).getCol()
									.get(j).getToColumn() + ")");
					predecessors.add("("
							+ schemaFromServer.getSchema().get(i).getCol()
									.get(j).getFromColumn()
							+ ")"
							+ schemaFromServer.getSchema().get(i).getCol()
									.get(j).getName()
							+ "("
							+ schemaFromServer.getSchema().get(i).getCol()
									.get(j).getFromColumnAfter() + ")");
				} else {
					predecessors.add(schemaFromServer.getSchema().get(i)
							.getName()
							+ "("
							+ schemaFromServer.getSchema().get(i).getCol()
									.get(j).getFromColumnAfter() + ")");
				}
				if (!schemaFromServer
						.getSchema()
						.get(i)
						.getName()
						.equals(schemaFromServer.getSchema().get(i).getCol()
								.get(j).getToTable()))
					recursiveExport(schemaFromServer, schemaFromServer
							.getSchema().get(i).getCol().get(j).getToTable(),
							schemaFromServer.getSchema().get(i).getName(),
							tempList, root, predecessors, schemaFromServer
									.getSchema().get(i).getCol().get(j)
									.getToColumnAfter());
			} else {
				TreeItem tempItem = new TreeItem();
				if (!schemaFromServer.getSchema().get(i).getCol().get(j)
						.getExtra_type().equals("none")
						&& !schemaFromServer.getSchema().get(i).getCol().get(j)
								.getExtra_type().equals("none")
						&& schemaFromServer.getSchema().get(i).getCol().get(j)
								.getDisplayed().equals("true")) {
					tempItem.setText(schemaFromServer.getSchema().get(i)
							.getCol().get(j).getLabel());
					tempItem.setTitle(schemaFromServer.getSchema().get(i)
							.getCol().get(j).getHint());
					tempItem.getElement().setAttribute(
							"value",
							schemaFromServer.getSchema().get(i).getCol().get(j)
									.getName()
									+ " type "
									+ schemaFromServer.getSchema().get(i)
											.getCol().get(j).getExtra_type());

					mainRoot.addItem(tempItem);
				}
			}
		}

		if (root.getChildCount() != 0) {
			for (int l = root.getChildCount() - 1; l >= 0; l--)
				mainRoot.addItem(root.getChild(l));
		}
		mainRoot.setAnimationEnabled(true);

		x_optionsListBox.setTreeOptions(mainRoot);
		

	}

	public Tree deduplicateTree(Tree root) {

		Tree newRoot = new Tree();
		boolean found = false;
		for (int itr = root.getItemCount() - 1; itr >= 0; itr--) {
			TreeItem search = root.getItem(itr);
			found = false;
			for (int itr2 = 0; itr2 < newRoot.getItemCount(); itr2++) {
				if (search.getText().equals(newRoot.getItem(itr2).getText())) {
					found = true;
					break;
				}
			}
			if (!found) {
				newRoot.addItem(search);
			}
		}

		return newRoot;

	}

	public ArrayList<String> removeDuplicates(ArrayList<String> results) {
		ArrayList<String> temp = new ArrayList<String>();
		for (int i = 0; i < results.size(); i++) {
			if (!temp.contains(results.get(i))) {
				temp.add(results.get(i));
			}
		}

		return temp;
	}

	public void SwitchTabs(Tab previous, Tab next) {

		previous.setActive(false);
		previous.setEnabled(true);

	}

	public void loadPresets() {

		tableListBox.setSelectedIndex(0);

		ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setDataSource(tableListBox.getValue(tableListBox.getSelectedIndex()));
		ValuesOfFields.getInstance().getColumnsDataList()
				.get(numberOfCurrentColumn).setIndexOfDataSource(0);
		x_axisLabel.setText("\""
				+ tableListBox.getItemText(tableListBox.getSelectedIndex())
				+ "\" broken down by (*)");
		splitByLabel.setText("\""	+ tableListBox.getItemText(tableListBox.getSelectedIndex())+ "\" split by ");
		listBoxes.get(numberOfCurrentColumn).getListBox().addItem("publication year");

		if (listBoxes.get(numberOfCurrentColumn).getMasterTree().getItemCount() == 0) {// i
																						// prwti
																						// klisi
																						// tis
																						// loadPresets

			ValuesOfFields.getInstance().getColumnsDataList()
					.get(numberOfCurrentColumn).setExtra_type("free");
			if (numberOfCurrentColumn == 0) {
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setMain_extra_type("free");
			}
		} else {// i deuteri kai teleutaia
			listBoxes
					.get(numberOfCurrentColumn)
					.getListBox()
					.addItem(
							listBoxes.get(numberOfCurrentColumn)
									.getMasterTree().getItem(0).getText());
			String[] splittedType = listBoxes.get(numberOfCurrentColumn)
					.getMasterTree().getItem(0).getElement()
					.getAttribute("value").split(" type ");
			ValuesOfFields.getInstance().getColumnsDataList()
					.get(numberOfCurrentColumn).setExtra_type(splittedType[1]);
			if (numberOfCurrentColumn == 0) {
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn)
						.setMain_extra_type(splittedType[1]);
			}
		}

		ValuesOfFields
				.getInstance()
				.getColumnsDataList()
				.get(numberOfCurrentColumn)
				.setDataSource(
						tableListBox.getValue(tableListBox.getSelectedIndex()));
		ValuesOfFields.getInstance().getColumnsDataList()
				.get(numberOfCurrentColumn).setIndexOfDataSource(0);
		ValuesOfFields.getInstance().getColumnsDataList()
				.get(numberOfCurrentColumn).setX_values("year");
		ValuesOfFields
				.getInstance()
				.getColumnsDataList()
				.get(numberOfCurrentColumn)
				.setXaxisTitle(
						listBoxes.get(numberOfCurrentColumn).getListBox()
								.getSelectedItemText());

	}

	public void loadPresetChartTypes(int optionsSelected) {
		
		if (optionsSelected / 10 == 1) {
			if (optionsSelected % 10 < 3) {
				String[] splitted = typeOfChart.getMasterTree()
						.getItem((optionsSelected / 10) - 1)
						.getChild(optionsSelected % 10).getTitle().split("-");
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setTypeOfChart(splitted[0]);
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setStacking(splitted[1]);
				typeOfChart.getListBox().addItem(
						typeOfChart.getMasterTree()
								.getItem((optionsSelected / 10) - 1)
								.getChild(optionsSelected % 10).getText());
			} else if (optionsSelected % 10 == 3) {
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setTypeOfChart("column");
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setStacking("none");
				typeOfChart.getListBox().addItem("Column - Clustered");
			} else if (optionsSelected % 10 == 4) {
				if (numberOfCurrentColumn == 0) {
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn)
							.setTypeOfChart("column");
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setStacking("none");
					typeOfChart.getListBox().addItem("Column - Clustered");
				} else {
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setTypeOfChart("line");
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setStacking("none");
					typeOfChart.getListBox().addItem("Simple line");
				}
			}
		} else if (optionsSelected / 10 == 2) {
			if (optionsSelected % 10 < 3) {
				String[] splitted = typeOfChart.getMasterTree()
						.getItem((optionsSelected / 10) - 1)
						.getChild(optionsSelected % 10).getTitle().split("-");
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setTypeOfChart(splitted[0]);
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setStacking(splitted[1]);
				typeOfChart.getListBox().addItem(
						typeOfChart.getMasterTree()
								.getItem((optionsSelected / 10) - 1)
								.getChild(optionsSelected % 10).getText());
			} else if (optionsSelected % 10 == 3) {
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setTypeOfChart("bar");
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setStacking("none");
				typeOfChart.getListBox().addItem("Bar - Clustered");
			} else if (optionsSelected % 10 == 4) {
				if (numberOfCurrentColumn == 0) {
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setTypeOfChart("bar");
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setStacking("none");
					typeOfChart.getListBox().addItem("Bar - Clustered");
				} else {
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setTypeOfChart("line");
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setStacking("none");
					typeOfChart.getListBox().addItem("Simple line");
				}
			}
		} else if (optionsSelected / 10 == 3) {
			if (optionsSelected % 10 == 0) {
				if (numberOfCurrentColumn == 0) {
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setTypeOfChart("line");
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setStacking("none");
					typeOfChart.getListBox().addItem("Simple line");
				} else {
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setTypeOfChart("line");
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setStacking("none");
					typeOfChart.getListBox().addItem("Simple line");
				}
			} else if (optionsSelected % 10 == 1) {
				if (numberOfCurrentColumn == 0) {
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn)
							.setTypeOfChart("column");
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setStacking("none");
					typeOfChart.getListBox().addItem("Column - Clustered");
				} else {
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setTypeOfChart("line");
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setStacking("none");
					typeOfChart.getListBox().addItem("Simple line");
				}
			} else if (optionsSelected % 10 == 2) {
				if (numberOfCurrentColumn == 0) {
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setTypeOfChart("line");
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setStacking("steps");
					typeOfChart.getListBox().addItem("Line with steps");
				} else {
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setTypeOfChart("line");
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setStacking("steps");
					typeOfChart.getListBox().addItem("Line with steps");
				}
			} else if (optionsSelected % 10 == 3) {
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setTypeOfChart("line");
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setStacking("none");
				typeOfChart.getListBox().addItem("Simple line");
			}
		} else if (optionsSelected / 10 == 4) {
			if (optionsSelected % 10 == 0) {
				if (numberOfCurrentColumn == 0) {
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setTypeOfChart("area");
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setStacking("none");
					typeOfChart.getListBox().addItem("Simple area");
				} else {
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setTypeOfChart("area");
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setStacking("none");
					typeOfChart.getListBox().addItem("Simple area");
				}
			} else if (optionsSelected % 10 == 1) {
				if (numberOfCurrentColumn == 0) {
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setTypeOfChart("area");
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setStacking("normal");
					typeOfChart.getListBox().addItem("Area - Stacked");
				} else {
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setTypeOfChart("area");
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setStacking("normal");
					typeOfChart.getListBox().addItem("Area - Stacked");
				}
			} else if (optionsSelected % 10 == 2) {
				if (numberOfCurrentColumn == 0) {
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setTypeOfChart("area");
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setStacking("percent");
					typeOfChart.getListBox().addItem("Area - Full stacked");
				} else {
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setTypeOfChart("area");
					ValuesOfFields.getInstance().getColumnsDataList()
							.get(numberOfCurrentColumn).setStacking("percent");
					typeOfChart.getListBox().addItem("Area - Full stacked");
				}
			} else if (optionsSelected % 10 == 3) {
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setTypeOfChart("area");
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setStacking("none");
				typeOfChart.getListBox().addItem("Simple area");
			}
		} else if (optionsSelected / 10 == 5) {
			if (optionsSelected % 10 == 0) {
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setTypeOfChart("pie");
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setStacking("none");
				typeOfChart.getListBox().addItem("Pie");
			} else if (optionsSelected % 10 == 1) {
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setTypeOfChart("pie");
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setStacking("3D");
				typeOfChart.getListBox().addItem("3D Pie");
			} else if (optionsSelected % 10 == 2) {
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setTypeOfChart("pie");
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setStacking("donut");
				typeOfChart.getListBox().addItem("Donut");
			}
		} else if (optionsSelected / 10 == 6) {
			if (optionsSelected % 10 == 0) {
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setTypeOfChart("map");
				ValuesOfFields.getInstance().getColumnsDataList()
						.get(numberOfCurrentColumn).setStacking("none");
				typeOfChart.getListBox().addItem("Map");
			}
		}

		// Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
		// applyChanges.addStyleName("flashing-button-apply");
	}

}
