package eu.dnetlib.client.leftColumn;

import java.util.ArrayList;

import com.github.gwtbootstrap.client.ui.AccordionGroup;
import com.github.gwtbootstrap.client.ui.Button;
import com.github.gwtbootstrap.client.ui.CheckBox;
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.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.AlternateSize;
import com.github.gwtbootstrap.client.ui.constants.ButtonType;
import com.github.gwtbootstrap.client.ui.constants.FormType;
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.google.gwt.core.client.JsArray;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.Style.Overflow;
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.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FlowPanel;
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.Attribute;
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 FlexTable filtersTable = new FlexTable();
	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();
	private Timer timer;
	private AppearancePanel appearancePanel;
	


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

	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){
		
		this.mainTabPanel = mainTabPanel;
		this.schemaFromServer = schemaFroAnswer;
		this.totalColumns = totalColumns;
		
		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("GENERAL OPTIONS FOR DATASERIES "+ (totalColumns+1));
					singleColumn.setHeading("Dataseries " + (totalColumns+1));
				}else{
					generalOptionsGroupPanel.setHeading("GENERAL OPTIONS FOR DATASERIES \""+name+"\"");
					singleColumn.setHeading(name);
				}
			}
		};
		apperancePanel.setChaningNameListenr(changingNameListener);
		this.appearancePanel = apperancePanel;
		
		addDataserie();
		this.isFromLoad = false;
	}
	
	
	public void addDataserie(){
		
		if(!isFromLoad){
			ValuesOfFields.getInstance().getColumnsDataList().add(new Data());
		}
		singleColumn.setHeading("Dataseries "+(totalColumns+1));
		
		masterPanel.addStyleName("dataseries-content");
		
		mainTabPanel.add(singleColumn);
		final TextBox renameTextBox = new TextBox();
		renameTextBox.setAlternateSize(AlternateSize.MEDIUM);
		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){
					singleColumn.setHeading(renameTextBox.getText());
					generalOptionsGroupPanel.setHeading("GENERAL OPTIONS FOR \""+singleColumn.getHeading()+"\"");
					ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setXaxisTitle(singleColumn.getHeading());
					Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
					
				}else{//if only contains whitespaces
					singleColumn.setHeading("Dataseries " + (totalColumns+1));
					generalOptionsGroupPanel.setHeading("GENERAL OPTIONS FOR DATASERIES"+ (totalColumns+1));
				}
				appearancePanel.getAppearancePanels().get(numberOfCurrentColumn).setHeading("APPEARANCE FOR" + singleColumn.getHeading());

				renameTextBox.setVisible(false);
			}
			
		});
		
		
		singleColumn.asWidget().addStyleName("dataserie-tab");
		singleColumn.asWidget().addDomHandler(new DoubleClickHandler() {
			
			@Override
			public void onDoubleClick(DoubleClickEvent event) {
				
				
				renameTextBox.setText(singleColumn.getHeading());
				singleColumn.setHeading("");
				renameTextBox.setSelectionRange(0, renameTextBox.getText().length());
				renameTextBox.setVisible(true);
				renameTextBox.setFocus(true);
			}
		}, DoubleClickEvent.getType());
		
	    final Image enabled = new Image("https://cdn2.iconfinder.com/data/icons/windows-8-metro-style/512/checked_checkbox.png");
		
		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);
			}
		});
		
		Image deleteImage = new Image("https://live.amcharts.com/static/img/icons/circle_x.png");
		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);
				mainTabPanel.remove(index+3);
				ValuesOfFields.getInstance().getColumnsDataList().remove(index);
				if(deleteListener!=null){
					deleteListener.onEvent(numberOfCurrentColumn);
				}
				
			
				if(specialColumnCounter==1){
					bringAllOfCertainTable(listBoxes.get(0));
				}else if(specialColumnCounter>1){
					bringSameOriginOptions();
				}
				
				if(specialColumnCounter!=0){
					mainTabPanel.selectTab((index-1)+3);
				}

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

			}
		});
		if(!isFromLoad)
			mainTabPanel.selectTab(specialColumnCounter+3);
		
		
		designOptionsForDataserie(singleColumn,totalColumns,specialColumnCounter);
		deleteImageList.add(deleteImage);
		singleColumn.addDecorate(deleteImage);
		singleColumn.asTabLink().add(enabled);
	}
	
	public void designOptionsForDataserie(Tab whereToAttach,int certainColumn,final int numberOfCurrentColumn){

		

        Form generalOptionsForm = new Form();
        generalOptionsForm.setType(FormType.HORIZONTAL);
        
        designOptionsForTypeOfChart(typeOfChart);
        final DropdownListWidget x_axisListBox = new DropdownListWidget();
        generalOptionsForm.add(new FormFieldSet("Type of chart",typeOfChart.asWidget()));
        generalOptionsForm.add(new FormFieldSet("Table", tableListBox));
        generalOptionsForm.add(new FormFieldSet("X axis", x_axisListBox.asWidget()));
        listBoxes.add(x_axisListBox);
        
        TreeListener treeListener = new TreeListener() {
			
			@Override
			public void onEvent() {
				filtersPanel.getInfoAlert().setVisible(false);
				filtersPanel.getAddNewFilter().setVisible(true);
			}
		};
		
		x_axisListBox.setTreeListener(treeListener);
        ListBox y_axisListBox = new ListBox();
        generalOptionsForm.add(new FormFieldSet("Y axis", y_axisListBox));
        
        
        final ListBox aggregateListBox = new ListBox();
        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
            	ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setTypeOf(aggregateListBox.getItemText(aggregateListBox.getSelectedIndex()));
            	ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setIndexOfTypeOf(aggregateListBox.getSelectedIndex());
                Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
            }
        });

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

        
        final DropdownListWidget splitBy = new DropdownListWidget();
        bringAllForSplitted(splitBy);
        
        if(isFromLoad){
        	splitBy.getListBox().addItem(ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getSplitBy());
        	splitBy.getListBox().setSelectedIndex(0);
        }
        
        generalOptionsForm.add(new FormFieldSet("Split by", splitBy.asWidget()));
        splitBy.getMasterTree().addSelectionHandler(new SelectionHandler<TreeItem>() {

			@Override
			public void onSelection(SelectionEvent<TreeItem> event) {
				
				if(!event.getSelectedItem().getText().equals("none")){
					ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setSplitBy(event.getSelectedItem().getText());
				}else{
					ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setSplitBy("");
				}
				
				
				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
			}
		});
        
        ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setDesignAs("column");
        ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setSplitBy("");

       
        generalOptionsGroupPanel.addStyleName("accordionPanel");
        generalOptionsGroupPanel.setId("accordionGeneral");
        generalOptionsGroupPanel.getElement().getStyle().setOverflow(Overflow.VISIBLE);
        generalOptionsGroupPanel.setHeading("GENERAL OPTIONS FOR DATASERIES " + (certainColumn+1));
        generalOptionsGroupPanel.getHeading().addStyleName("accordionHeading");
        generalOptionsGroupPanel.add(generalOptionsForm);
        generalOptionsGroupPanel.setIcon(IconType.MINUS);
        generalOptionsGroupPanel.setDefaultOpen(true);
        generalOptionsGroupPanel.addShowHandler(new ShowHandler() {
            @Override
            public void onShow(ShowEvent showEvent) {
                generalOptionsGroupPanel.setIcon(IconType.MINUS);
                
                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.PLUS);
                generalOptionsGroupPanel.getElement().getStyle().setOverflow(Overflow.HIDDEN);
            }
        });
       
        masterPanel.add(generalOptionsGroupPanel);

       
        final IconAnchor addNewFilter = new IconAnchor();
        addNewFilter.setText("Add new Filter");
        addNewFilter.setIcon(IconType.PLUS);
        addNewFilter.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                filtersTable.clear();
                filtersTable.removeAllRows();
                filtersTable.getRowFormatter().addStyleName(0, "tables-header");
                filtersTable.setText(0, 0, "Field");
                filtersTable.setText(0, 1, "Value");
                filtersTable.setText(0, 2, "Remove");
                filtersTable.setText(0, 3, "Edit");
              
            }
        });
        
        
        final AccordionGroup filtersGroupPanel = new AccordionGroup();
        filtersGroupPanel.addStyleName("accordionPanel");
        Element element = (Element)filtersGroupPanel.getElement().getChild(1);
		element.getStyle().setOverflow(Overflow.AUTO);
        filtersGroupPanel.setHeading("FILTERS");
        filtersGroupPanel.getHeading().addStyleName("accordionHeading");
        
        filtersPanel = new FiltersPanel(schemaFromServer,numberOfCurrentColumn,isFromLoad);

        filtersGroupPanel.add(filtersPanel.asWidget());
        filtersGroupPanel.setIcon(IconType.PLUS);
        filtersGroupPanel.addShowHandler(new ShowHandler() {
            @Override
            public void onShow(ShowEvent showEvent) {
                filtersGroupPanel.setIcon(IconType.MINUS);
                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);
            }
        });
        filtersGroupPanel.addHideHandler(new HideHandler() {
            @Override
            public void onHide(HideEvent hideEvent) {
                filtersGroupPanel.setIcon(IconType.PLUS);
                Element element = (Element)filtersGroupPanel.getElement().getChild(1);
				element.getStyle().setOverflow(Overflow.AUTO);
            }
        });
        masterPanel.add(filtersGroupPanel);
        
        
        addOptionsForTable(tableListBox, x_axisListBox, y_axisListBox, numberOfCurrentColumn);
		final Button filtersButton = new Button();
		filtersButton.setText("Add filter(s)");
		filtersButton.setType(ButtonType.SUCCESS);
		filtersButton.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent arg0) {
				// TODO Auto-generated method stub
				filtersTable.clear();
				filtersTable.removeAllRows();
				filtersTable.getRowFormatter().addStyleName(0, "tables-header");
				filtersTable.setText(0, 0, "Field");
				filtersTable.setText(0, 1, "Value");
				filtersTable.setText(0, 2, "Remove");
				filtersTable.setText(0, 3, "Edit");
				filtersButton.setEnabled(false);
			}
		});
		whereToAttach.add(masterPanel);
		
	}
	
	public void addOptionsForTable(final ListBox tableListBox,final DropdownListWidget x_axisListBox, final ListBox y_axisListBox,final int numberOfCurrentColumn){

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

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

		tableListBox.addChangeHandler(new ChangeHandler() {
			
			@Override
			public void onChange(ChangeEvent arg0) {
				// TODO Auto-generated method stub
				ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setDataSource(tableListBox.getItemText(tableListBox.getSelectedIndex()));
				ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setIndexOfDataSource(tableListBox.getSelectedIndex());
				addOptionsForX_axis(numberOfCurrentColumn,x_axisListBox);
				addOptionsForY_axis(y_axisListBox,numberOfCurrentColumn);
				
			}
		});

		ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setDataSource(tableListBox.getItemText(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(loadPresets){
			loadPresets();
		}
		if(ValuesOfFields.getInstance().getColumnsDataList().size()==1){
			//ferta ola
			
			if(!isFromLoad){
				bringAllOfCertainTable(x_axisListBox);
			}else{
				x_axisListBox.getListBox().addItem(ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getX_values());
				x_axisListBox.getListBox().setSelectedIndex(0);
			}
		}else if(ValuesOfFields.getInstance().getColumnsDataList().size()>1){
			//fere ta koina
				
			if(!isFromLoad){
				bringSameOriginOptions();
			}else{
				listBoxes.get(numberOfCurrentColumn).getListBox().addItem(ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getXaxisTitle());
				listBoxes.get(numberOfCurrentColumn).getListBox().setSelectedIndex(0);
			}
		}else{
			//min fereis tpt
		}
		
		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().getTitle().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 addOptionsForY_axis(final ListBox y_axisListBox, final int numberOfCurrentColumn){
		
		y_axisListBox.clear();
		for(int i=0;i<schemaFromServer.getSchema().get(ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getIndexOfDataSource()).getMeas().length();i++){
			y_axisListBox.addItem(schemaFromServer.getSchema().get(ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).getIndexOfDataSource()).getMeas().get(i).getName());
		}
		
		y_axisListBox.addChangeHandler(new ChangeHandler() {
			
			@Override
			public void onChange(ChangeEvent event) {
				// TODO Auto-generated method stub
				ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setY_values(y_axisListBox.getItemText(y_axisListBox.getSelectedIndex()));
				Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
			}
		});
		ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setY_values(y_axisListBox.getItemText(y_axisListBox.getSelectedIndex()));
	}
	
	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();
		
		rootColumn.setText("Column");
		rootBar.setText("Bar");
		rootLine.setText("Line");
		rootArea.setText("Area");
		rootPie.setText("Pie");
		
		
		TreeItem temp = new TreeItem();
		temp.setText("Column - Clustered");
		temp.setTitle("column-none");
		rootColumn.addItem(temp);
		
		TreeItem temp1 = new TreeItem();
		temp1.setText("Column - Full stacked");
		temp1.setTitle("column-percent");
		rootColumn.addItem(temp1);
		
		TreeItem temp2 = new TreeItem();
		temp2.setText("Column - Stacked");
		temp2.setTitle("column-normal");
		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 - Full stacked");
		temp4.setTitle("bar-percent");
		rootBar.addItem(temp4);
		
		TreeItem temp5 = new TreeItem();
		temp5.setText("Bar - Stacked");
		temp5.setTitle("bar-normal");
		rootBar.addItem(temp5);
		
		TreeItem temp6 = new TreeItem();
		temp6.setText("Simple line");
		temp6.setTitle("bine-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();
		temp12.setText("Donut");
		temp12.setTitle("pie-donut");
		rootPie.addItem(temp14);
		
		mainRoot.addItem(rootColumn);
		mainRoot.addItem(rootBar);
		mainRoot.addItem(rootLine);
		mainRoot.addItem(rootArea);
		mainRoot.addItem(rootPie);
		
		
		
		
		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]);
					
					Generate.getInstance().generateURLs(ValuesOfFields.getInstance(), 1);
				}
			}
		});
		
		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){
		
		
		ArrayList<String> results = new ArrayList<String>();
		
		x_optionsListBox.clear();
		Tree mainRoot = new Tree();
		TreeItem root = new TreeItem();
		root.setText("more");
			int i = ValuesOfFields.getInstance().getColumnsDataList().get(0).getIndexOfDataSource();
			for(int j=0;j<schemaFromServer.getSchema().get(i).getDim().length();j++){
				if(schemaFromServer.getSchema().get(i).getDim().get(j).getDimtable()){
					if(schemaFromServer.getSchema().get(i).getDim().get(j).getAttrib()!=null){
						ArrayList<String> predecessors = new ArrayList<String>();
						predecessors.add(schemaFromServer.getSchema().get(i).getDim().get(j).getName());
						extractDataFromAttr_ForCommon(results, schemaFromServer.getSchema().get(i).getDim().get(j).getAttrib(), "", predecessors,root);
					}else{
						TreeItem tempItem = new TreeItem();
						tempItem.setText(schemaFromServer.getSchema().get(i).getDim().get(j).getName());
						tempItem.setTitle(schemaFromServer.getSchema().get(i).getDim().get(j).getName() + " type " + schemaFromServer.getSchema().get(i).getDim().get(j).getExtra_Type());
						mainRoot.addItem(tempItem);
						results.add(schemaFromServer.getSchema().get(i).getDim().get(j).getName());
					}
				}else{
					TreeItem tempItem = new TreeItem();
					tempItem.setText(schemaFromServer.getSchema().get(i).getDim().get(j).getName());
					tempItem.setTitle(schemaFromServer.getSchema().get(i).getDim().get(j).getName() + " type " + schemaFromServer.getSchema().get(i).getDim().get(j).getExtra_Type());
					mainRoot.addItem(tempItem);
					results.add(schemaFromServer.getSchema().get(i).getDim().get(j).getName());
				}
			}
	
		mainRoot.addItem(root);
		mainRoot.setAnimationEnabled(true);
		
		x_optionsListBox.setTreeOptions(mainRoot);
		x_optionsListBox.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().getTitle().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 bringSameOriginOptions(){
		
		
		ArrayList<String> results = new ArrayList<String>();

		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(schemaFromServer.getSchema().get(i).getName());
			for(int j=0;j<schemaFromServer.getSchema().get(i).getDim().length();j++){
				if(schemaFromServer.getSchema().get(i).getDim().get(j).getDimtable()){
					if(schemaFromServer.getSchema().get(i).getDim().get(j).getAttrib()!=null){
						ArrayList<String> predecessors = new ArrayList<String>();
						predecessors.add(schemaFromServer.getSchema().get(i).getDim().get(j).getName());
						extractDataFromAttr_ForCommon(results, schemaFromServer.getSchema().get(i).getDim().get(j).getAttrib(), ValuesOfFields.getInstance().getColumnsDataList().get(0).getMain_extra_type(), predecessors,root);
						
					}else{
						if(schemaFromServer.getSchema().get(i).getDim().get(j).getExtra_Type().equals(ValuesOfFields.getInstance().getColumnsDataList().get(0).getMain_extra_type())){
							TreeItem tempItem = new TreeItem();
							tempItem.setText(schemaFromServer.getSchema().get(i).getDim().get(j).getName());
							tempItem.setTitle(schemaFromServer.getSchema().get(i).getDim().get(j).getName() + " type " + schemaFromServer.getSchema().get(i).getDim().get(j).getExtra_Type());
							mainRoot.addItem(tempItem);
							results.add(schemaFromServer.getSchema().get(i).getDim().get(j).getName());
						}
					}
				}else{
					if(schemaFromServer.getSchema().get(i).getDim().get(j).getExtra_Type().equals(ValuesOfFields.getInstance().getColumnsDataList().get(0).getMain_extra_type())){
						TreeItem tempItem = new TreeItem();
						tempItem.setText(schemaFromServer.getSchema().get(i).getDim().get(j).getName());
						tempItem.setTitle(schemaFromServer.getSchema().get(i).getDim().get(j).getName() + " type " + schemaFromServer.getSchema().get(i).getDim().get(j).getExtra_Type());
						mainRoot.addItem(tempItem);
						results.add(schemaFromServer.getSchema().get(i).getDim().get(j).getName());
					}
				}
			}
			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().getTitle().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 String extractDataFromAttr_ForCommon(ArrayList<String> results, JsArray<Attribute> attr ,String extra_type,ArrayList<String> predecessors,TreeItem root){
		String contentString = new String("");
		
		for(int i=attr.length()-1;i>=0;i--){
				int index = 0;
				String temp = new String("");
				if(attr.get(i).getAttrib().length()==0){
					if(attr.get(i).getAnalysed()==null){
						if(attr.get(i).getBridge()!=null && attr.get(i).getBridge().equals("false")){
							index = 1;	
							for(int j=0;j<predecessors.size()-1;j++){
								temp = temp.concat(predecessors.get(j)+"-");
							}
							temp = temp.concat(predecessors.get(predecessors.size()-1));
							String temp2  = contentString.concat(temp+"-"+attr.get(i).getName());
							
							if(extra_type.equals("")){
								TreeItem itemToAdd = new TreeItem();
								itemToAdd.setTitle(temp2 +  " type "  + attr.get(i).getExtra_Type());
								itemToAdd.setText(attr.get(i).getName());
								
								root.addItem(itemToAdd);
								results.add(temp2);
							}else{
								if(extra_type.equals(attr.get(i).getExtra_Type())){
									TreeItem itemToAdd = new TreeItem();
									itemToAdd.setTitle(temp2 +  " type "  + attr.get(i).getExtra_Type());
									itemToAdd.setText(attr.get(i).getName());
									
									root.addItem(itemToAdd);
									results.add(temp2);
								}
							}
						}
						
					}
				}else{
					index = 1;
					predecessors.add(attr.get(i).getName());
					TreeItem newRoot = new TreeItem();
					root.addItem(newRoot);
					newRoot.setText(attr.get(i).getName());
					temp = extractDataFromAttr_ForCommon(results, attr.get(i).getAttrib(), extra_type, predecessors,newRoot);
					
					if(!temp.equals("")){
						
						for(int j=0;j<predecessors.size()-1;j++){
							temp = temp.concat(predecessors.get(j)+"-");
						}
						
						temp = temp.concat(predecessors.get(predecessors.size()-1));
						contentString = contentString.concat(temp+"-"+attr.get(i).getName());
					}
					
					if(newRoot.getChildCount()==0 && newRoot.getTitle().equals("")){//an kataliksame na einai fullo kati to opoio den prepei (onoma table diladi anti gia field) tote remove!
						root.removeItem(newRoot);
					}
					
					if(newRoot.getChildCount()==1 && newRoot.getChild(0).getChildCount()>1){
						root.addItem(newRoot.getChild(0));
						root.removeItem(newRoot);
					}
				}

		}
		
		return contentString;
	}
	
	public void bringAllForSplitted(DropdownListWidget x_optionsListBox){
		
		ArrayList<String> results = new ArrayList<String>();
		
		x_optionsListBox.clear();
		Tree mainRoot = new Tree();
		TreeItem noneItem = new TreeItem();
		noneItem.setText("none");
		noneItem.setTitle("none");
			int i = ValuesOfFields.getInstance().getColumnsDataList().get(0).getIndexOfDataSource();
			for(int j=0;j<schemaFromServer.getSchema().get(i).getDim().length();j++){
				if(schemaFromServer.getSchema().get(i).getDim().get(j).getDimtable()){
					if(schemaFromServer.getSchema().get(i).getDim().get(j).getAttrib()!=null){
						ArrayList<String> predecessors = new ArrayList<String>();
						predecessors.add(schemaFromServer.getSchema().get(i).getDim().get(j).getName());
						extractDataFromAttr_ForSplitted(results, schemaFromServer.getSchema().get(i).getDim().get(j).getAttrib(), "", predecessors,mainRoot);
					}else{
						TreeItem tempItem = new TreeItem();
						tempItem.setText(schemaFromServer.getSchema().get(i).getDim().get(j).getName());
						tempItem.setTitle(schemaFromServer.getSchema().get(i).getDim().get(j).getName() + " type " + schemaFromServer.getSchema().get(i).getDim().get(j).getExtra_Type());
						mainRoot.addItem(tempItem);
						results.add(schemaFromServer.getSchema().get(i).getDim().get(j).getName());
					}
				}else{
					TreeItem tempItem = new TreeItem();
					tempItem.setText(schemaFromServer.getSchema().get(i).getDim().get(j).getName());
					tempItem.setTitle(schemaFromServer.getSchema().get(i).getDim().get(j).getName() + " type " + schemaFromServer.getSchema().get(i).getDim().get(j).getExtra_Type());
					mainRoot.addItem(tempItem);
					results.add(schemaFromServer.getSchema().get(i).getDim().get(j).getName());
				}
			}
		mainRoot.setAnimationEnabled(true);

		mainRoot.addItem(noneItem);
		mainRoot = deduplicateTree(mainRoot);
		
		x_optionsListBox.setTreeOptions(mainRoot);
		
	}
	
	public String extractDataFromAttr_ForSplitted(ArrayList<String> results, JsArray<Attribute> attr ,String extra_type,ArrayList<String> predecessors,Tree root){
		String contentString = new String("");
		
		for(int i=attr.length()-1;i>=0;i--){
				int index = 0;
				String temp = new String("");
				if(attr.get(i).getAttrib().length()==0){
					if(attr.get(i).getAnalysed()==null){
						index = 1;
						for(int j=0;j<predecessors.size()-1;j++){
							temp = temp.concat(predecessors.get(j)+"-");
						}
						temp = temp.concat(predecessors.get(predecessors.size()-1));
						String temp2  = contentString.concat(temp+"-"+attr.get(i).getName());
						
						if(extra_type.equals("")){
							TreeItem itemToAdd = new TreeItem();
							itemToAdd.setTitle(temp2 +  " type "  + attr.get(i).getExtra_Type());
							itemToAdd.setText(predecessors.get(predecessors.size()-1)+"-"+attr.get(i).getName());
							
							
							root.addItem(itemToAdd);
							results.add(temp2);
						}
						
					}
				}else{
					index = 1;
					predecessors.add(attr.get(i).getName());

					temp = extractDataFromAttr_ForSplitted(results, attr.get(i).getAttrib(), extra_type, predecessors,root);
					
					if(!temp.equals("")){
						
						for(int j=0;j<predecessors.size()-1;j++){
							temp = temp.concat(predecessors.get(j)+"-");
						}
						
						temp = temp.concat(predecessors.get(predecessors.size()-1));
						contentString = contentString.concat(temp+"-"+attr.get(i).getName());
					}
					
				}

		}
		
		return contentString;
	}
	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);
		listBoxes.get(numberOfCurrentColumn).getListBox().addItem("year");
		ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setDataSource(tableListBox.getSelectedItemText());
		ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setIndexOfDataSource(0);
		ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setX_values(listBoxes.get(numberOfCurrentColumn).getListBox().getSelectedItemText());
		ValuesOfFields.getInstance().getColumnsDataList().get(numberOfCurrentColumn).setXaxisTitle(listBoxes.get(numberOfCurrentColumn).getListBox().getSelectedItemText());
		loadPresets=false;
	}
}
