package com.akond.flm.client.windows.elementselection;
import java.util.ArrayList;

import com.akond.flm.client.demo.DemoPanel;
import com.akond.flm.client.i18n.StringConstants;
import com.akond.flm.client.misc.Constants;
import com.akond.flm.client.services.ElementProperties.XmlService;
import com.akond.flm.client.services.ElementProperties.XmlServiceAsync;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.dom.client.Style.BorderStyle;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.ContextMenuEvent;
import com.google.gwt.event.dom.client.ContextMenuHandler;
import com.google.gwt.event.dom.client.DoubleClickEvent;
import com.google.gwt.event.dom.client.DoubleClickHandler;
import com.google.gwt.event.dom.client.DragLeaveEvent;
import com.google.gwt.event.dom.client.DragLeaveHandler;
import com.google.gwt.event.dom.client.DragOverEvent;
import com.google.gwt.event.dom.client.DragOverHandler;
import com.google.gwt.event.dom.client.DragStartEvent;
import com.google.gwt.event.dom.client.DragStartHandler;
import com.google.gwt.event.dom.client.DropEvent;
import com.google.gwt.event.dom.client.DropHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.event.dom.client.MouseUpEvent;
import com.google.gwt.event.dom.client.MouseUpHandler;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.event.logical.shared.OpenEvent;
import com.google.gwt.event.logical.shared.OpenHandler;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.KeyboardListener;
import com.google.gwt.user.client.ui.KeyboardListenerAdapter;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.MenuBar;
import com.google.gwt.user.client.ui.MenuItem;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TabLayoutPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Tree;
import com.google.gwt.user.client.ui.TreeItem;
import com.google.gwt.user.client.ui.Widget;


/**
 * Window for element selection dialog
 */
public class ElementSelectionWindow extends DialogBox {

	private ElementSelectionTemplate elementTemplate;
	ElementSelectionController xmlParser;	
	private int selectedTab = 0;
	private Folder folderChoosen;
	Folder currentFolder;
	Folder demoFolder; //for demo only
	Folder mainFolder = new Folder();
	Folder mainFolderCat = new Folder();
	Folder tmpFolder;
	int selectedElement = 0;
	//ElementsLibrary lib;
	Folder prodLib,catLib;
	DemoPanel parentPanel;
	FolderElement selectedFolderElement = new FolderElement();
	private final XmlServiceAsync xmlService = GWT.create(XmlService.class);
	ArrayList<TxtImage> elemImages = new ArrayList<TxtImage>();
	ArrayList<TxtImage> elemImages2 = new ArrayList<TxtImage>();
	String responseXml = new String();
	String elementResponseXml = new String();
	//static final String serverAddr = "http://127.0.0.1:8080/flm";
	boolean serverResponseReceived = false;
	String requestContent = new String();
	String rcOpen =  "<folder_request id=\"" ;
	final String rcClose = "\"/>";
	final String rcCloseFilter = "\">";
	final String rcCloseFilterFolder = "</folder_request>";
	RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, Constants.serverAddr);
	ElementSelectionWindow th = this;
	boolean startup = true;
	private boolean firstUser = true;
	private boolean firstChoosen = true;
	private boolean firstAll = true;
	private boolean onDrop = false;
	
	public Folder selectedProducerFolder = null;
	public Folder selectedCategoryFolder = null;
	
	public String selectedProdGUID = "";
	public String selectedProdName = "";
	public String selectedFolderGUID="";
	public String selectedFolderName="";
	
	//URL Strings
	static String priceListUrl = "";
	static String docUrl = "";
	static String appUrl = "";
	static String certUrl = "";
	static String manualUrl = "";
	static String marketingUrl ="";
	
	
//FOR TOP BUTTONS NAVIGATION
	ArrayList<TreeItemFolder> idHistoryChoosen = new ArrayList<TreeItemFolder>();
	int nrHistoryChoosen = -1;
	ArrayList<TreeItemFolder> idHistoryAll = new ArrayList<TreeItemFolder>();
	int nrHistoryAll = -1;
	ArrayList<TreeItemFolder> idHistoryUser = new ArrayList<TreeItemFolder>();
	int nrHistoryUser = -1;
	boolean fromNav = false;
	TreeItemFolder currentlyUsedTreeItem = new TreeItemFolder();
	

// FOR DEMO WHEN WHOLE PRODUCER STRUCTURE IS AVAIL	
	
	FlowPanel gryfPanel = new FlowPanel();
	boolean hasPanel = false;
	int selectedFolder = 999;
	String selectedProducer = "emtpy_producer";//"D0D806BF-876D-4C34-ABBA-5C45518BC683";
	String selectedCat = "empty_cat";
// FOR USER DEFINED FOLDERS
	UserFolder userRoot = new UserFolder();
	UserFolder folderToMove = new UserFolder();
	FolderElement elementToMove = new FolderElement();
	String overFolderId;
	String selectedUserFolderId="";
	UserFolder selectedUserFolder = new UserFolder();
    PopupPanel contextMenu = new PopupPanel(true);
    PopupPanel textBoxPopUp = new PopupPanel(true);
    PopupPanel panelContextMenu = new PopupPanel(true);
    
    TextBox rename = new TextBox();
    MenuBar menu = new MenuBar(true);
    MenuBar panelMenu = new MenuBar(true);
    String newName;
    boolean editing = false;
    UserFolder toRename;
    String oldBackground = new String();
    int selectedTxtImage = 0;
    
    //FILTERING 
    static String producerFilter = "";
    static String categoryFilter = "";
    boolean producerFilterOn = false;
    boolean categoryFilterOn = false;
    ArrayList<String> catFilterDisplay = new ArrayList<String>();
    ArrayList<String> catFilter = new ArrayList<String>();
    ArrayList<String> prodFilterDisplay = new ArrayList<String>();
    ArrayList<String> prodFilter = new ArrayList<String>();
    
    StringConstants cons = (StringConstants) GWT.create(StringConstants.class);
	
	TreeItem root = new TreeItem();
	/**
	 * Constructs ElementSelectionWindow
	 * @wbp.parser.constructor
	 */
	public ElementSelectionWindow() {
		super();		
		setText("Element Selection");
		init();
	}
	/**
	 * Constructs ElementSelectionWindow and assigning its parent window
	 */
	public ElementSelectionWindow(DemoPanel demoPanel) {
		super();
		setText("Element Selection");
		parentPanel = demoPanel;
		init();	
		
	}
	
	/*public ElementSelectionWindow(String xmlResponse) {
		super();
		init();
		setText("Element Selection");
	}*/
	/**
	 * Initializes ElementSelectionWindow
	 * Main init actions:
	 *  - creating and adding ElementSelectionTemplate
	 *  - creating ElementSelectionController for xml parsing
	 *  - disabling default browser's context menu
	 *  - adding selection handler for Tab Panel
	 *  - setting enabled/disabled states of buttons
	 */
	
	public void setAction(){
		elementTemplate.setAction();
	}
	
	//public final native int setFrameSize(int width, int height)/*-{ return parent.setFrameSize(); }-*/;
	private void setStandAlone(){
		this.setText("");
		this.setStyleName("WithoutFrame");
		this.setModal(true);
	}
	
	public void propagateSize(){
		int wid = getOffsetWidth();// getOffsetWidth();
		int heig = getOffsetHeight();
		//if(wid!=0 && heig!=0)
		//	elementTemplate.setFrameSize(wid+50, heig+50);
		elementTemplate.setFrameSize(wid, heig);
		
	}
	private String createProperFilter(String input){
		if(input == null)
			return null;
		String ret = input.replace("less", "<");
		ret = ret.replace("greater", ">");
		return ret;
	}
	private String getCookie(String cookieName){
		String ret = Cookies.getCookie(cookieName);
		
		if( ret == null || ret.equals("undefined") )
			ret = "";
		return ret;
	}
	private void init() {
		
		DemoPanel.context = getCookie("context");
		DemoPanel.elementsFilter = createProperFilter(getCookie("elementFilter"));
		DemoPanel.foldersFilter = createProperFilter(getCookie("folderFilter"));		
		rcOpen =  "<folder_request"+ Constants.getLocale() + "id=\"";
		elementTemplate = new ElementSelectionTemplate(this);
		xmlParser = new ElementSelectionController();
		this.add(elementTemplate);
		elementTemplate.setHeight("100%");	
		this.setModal(false);		
		clearInfo();
		RootPanel.get().addDomHandler(new ContextMenuHandler() {
			@Override public void onContextMenu(ContextMenuEvent event) {
				event.preventDefault();
				event.stopPropagation();
			}
		}, ContextMenuEvent.getType());
		rb.setHeader("Content-Type", "application/xml");
		initViews();
		initAddMaterialsMenu();
		disableInfoButtons();			
		elementTemplate.flm_es_tabPanel.addSelectionHandler(new SelectionHandler<Integer>() {
		            @Override
					public void onSelection(SelectionEvent<Integer> event) 
		            {
		            	fromNav = true;
		                int tabId = event.getSelectedItem();               
		            		if(tabId==0 ){
		            			elementTemplate.setNavButtonsState(nrHistoryChoosen,idHistoryChoosen.size());
		            			if(firstChoosen){
		            				fromNav=false;
		            				elementTemplate.flm_es_tree1.setSelectedItem(elementTemplate.flm_es_tree1.getItem(0));
		            			}
		            			else{		            				
		            				elementTemplate.flm_es_tree1.setSelectedItem(elementTemplate.flm_es_tree1.getSelectedItem());
		            			}
		            		}
		            		else if(tabId==1){
		            			elementTemplate.setNavButtonsState(nrHistoryAll,idHistoryAll.size());
		            			if(firstAll){
		            				fromNav=false;
		            				elementTemplate.flm_es_tree2.setSelectedItem(elementTemplate.flm_es_tree2.getItem(0));
		            			}
		            			else{
		            				
		            				elementTemplate.flm_es_tree2.setSelectedItem(elementTemplate.flm_es_tree2.getSelectedItem());
		            			}
		            		}
		            		else if(tabId==2 ){
		            			elementTemplate.setNavButtonsState(nrHistoryUser,idHistoryUser.size());
		            			if(firstUser){
		            				fromNav=false;
		            				elementTemplate.flm_es_tree3.setSelectedItem(elementTemplate.flm_es_tree3.getItem(0));
		            			}
		            			else{
		            				
		            				elementTemplate.flm_es_tree3.setSelectedItem(elementTemplate.flm_es_tree3.getSelectedItem());
		            			}
		            		}		               
		            }
		        });
		startup = false;
		clearHistory();
		this.addHandlers();
		//elementTemplate.setFrameSize(this.getOffsetWidth(), this.getOffsetHeight());
		setStandAlone();
		propagateSize();		
		elementTemplate.setWindowTitle("FLM4 - "+cons.elemSelect() );
	}
/*	
public void initSelection(){
	fromNav=true;
	elementTemplate.flm_es_tree1.setSelectedItem(elementTemplate.flm_es_tree1.getItem(0));
	elementTemplate.flm_es_tree2.setSelectedItem(elementTemplate.flm_es_tree2.getItem(0));
	elementTemplate.flm_es_tree3.setSelectedItem(elementTemplate.flm_es_tree3.getItem(0));
	clearHistory();
}
*/
/**
 * Clears history for All and Chossen views and disablind navigation buttons	
 */
	public void clearHistory(){
		idHistoryChoosen.clear() ;
		nrHistoryChoosen = -1;
		idHistoryAll.clear();
		nrHistoryAll = -1;		
		fromNav = false;
		firstAll = true;
		firstChoosen=true;
		if(elementTemplate.flm_es_tabPanel.getSelectedIndex()!=2){
			elementTemplate.disableButtonBack();
			elementTemplate.disableButtonForw();
			}
	}
	
	/**
	 * Initializes views
	 *  - Choosen view
	 *  - All view
	 *  - User view
	 */
	public void initViews()
	{	
		initUserFolder();
		requestContentChoosenView();//have to be called before AllView
		requestContentAllView();		
		enableDnDusage();	
	}
	/**
	 * Enables drag and drop
	 */
	public void enableDnDusage(){
		enableDragNDrop(elementTemplate.flm_es_tabPanel);
		enableDragNDrop();
	}
	/**
	 * Creates category filter string from category name given in argument
	 */
	public String getCatFilter(String category){
		String ret = category;
		ret = ret.replace("Cat{", "");
		ret = ret.replace("}", "");
		ret = " <category_filter cat=\"" + ret + "\"/>";
		return ret;
	}
	/**
	 * Creates producer filter string from producer id given in argument
	 */
	public String getProdFilter(String prod){
		String ret = prod;
		ret = ret.replace("Prd{", "");
		ret = ret.replace("}", "");
		ret = "<producer_filter GUID=\"" + ret + "\"/>";
		return ret;
	}
	/**
	 * Makes server request for All view (CatRoot) and fills tree in this view with folders from server response
	 */
	public void requestContentAllView(){	
		if(!producerFilterOn && !categoryFilterOn )
			requestContent = rcOpen +"CatRoot"+rcClose;
		else{
			requestContent = rcOpen +"CatRoot" + rcCloseFilter;
			if(producerFilterOn)
				requestContent +=producerFilter;
			if(categoryFilterOn)
				requestContent +=categoryFilter;
			/*requestContent += DemoPanel.elementsFilter;
			requestContent += DemoPanel.foldersFilter;*/
			
			requestContent+=rcCloseFilterFolder;
		}
		
		RequestCallback rc = new RequestCallback() {

			@Override
			public void onResponseReceived(Request request,
					Response response) {						
					responseXml = response.getText();	
					String a = responseXml;
					serverResponseReceived = true;
					xmlParser.parseXml(responseXml);
	        		catLib = xmlParser.getFolder();
	        		initAllView();		
	        		loadFilters();	       		
			}

			@Override
			public void onError(Request request, Throwable exception) {
				
			} };
		try {
			rb.setHeader("Accept", "*/*");
			rb.sendRequest(requestContent,rc);			
		} catch (RequestException e) {
			e.printStackTrace();			
		}
	}
	/**
	 * Makes server request for Choosen view (PrdRoot) and fills tree in this view with folders from server response
	 */
	public void requestContentChoosenView(){
		if(!producerFilterOn && !categoryFilterOn )
			requestContent = rcOpen +"PrdRoot"+rcClose;
		else{
			requestContent = rcOpen +"PrdRoot" + rcCloseFilter;
			if(producerFilterOn)
				requestContent +=producerFilter;
			if(categoryFilterOn)
				requestContent +=categoryFilter;
			/*requestContent += DemoPanel.elementsFilter;
			requestContent += DemoPanel.foldersFilter;*/
			requestContent+=rcCloseFilterFolder;
		}
		
		
		RequestCallback rc = new RequestCallback() {

			@Override
			public void onResponseReceived(Request request,
					Response response) {						
					responseXml = response.getText();
					serverResponseReceived = true;
					xmlParser.parseXml(responseXml);
	        		prodLib = xmlParser.getFolder();
	        		initChoosenView();	
	        		
			}

			@Override
			public void onError(Request request, Throwable exception) {
				
			} };
		try {
			rb.sendRequest(requestContent,rc);				
		} catch (RequestException e) {
			e.printStackTrace();			
		}
	}

	public void requestElementData(FolderElement el){	
		/*String context = "";
		Window.alert(DemoPanel.context);
		if(!FLMNet.context.equals("") && !FLMNet.context.equals("undefined") )
			context = "context=\"" + FLMNet.context + "\"";
			requestContent= "<create" +Constants.getLocale() + context +  " guid=\"" + el.getId() + "\"/>";
		RequestCallback rc = new RequestCallback() {

			@Override
			public void onResponseReceived(Request request,
					Response response) {						
					elementResponseXml = response.getText();
					parentPanel.element1 = new ElementPropertiesWindow();
					parentPanel.element1.setParent(parentPanel);
					parentPanel.getElement1().setXmlElement(elementResponseXml);
					parentPanel.getElement1().show();	  
					parentPanel.getElement1().propagateSize();
			}

			@Override
			public void onError(Request request, Throwable exception) {
				
			} };
		try {
			rb.sendRequest(requestContent,rc);				
		} catch (RequestException e) {
			e.printStackTrace();			
		}*/
	}
	
	public void requestElementDataForPS24(FolderElement el){	
		String context = "";
		/*if(!DemoPanel.context.equals("") && !DemoPanel.context.equals("undefined") )
			context = "context=\"" + DemoPanel.context + "\"";
			requestContent= "<create" +Constants.getLocale() + context +  " guid=\"" + el.getId() + "\"/>";*/
			
			
//			elementTemplate.sendElementDataToPS24(el.getId()+ "|" +selectedProdGUID + "@" + selectedProdName +"@" + selectedFolderGUID + "@"+selectedFolderName);
			String fullProductData = selectedProdGUID + "@" + selectedProdName +"@" + selectedFolderGUID + "@"+selectedFolderName;
			elementTemplate.sendElementDataToPS24(el.getId(),selectedProdGUID,selectedProdName,selectedFolderGUID,selectedFolderName, fullProductData);
		/*RequestCallback rc = new RequestCallback() {

			@Override
			public void onResponseReceived(Request request,
					Response response) {						
					elementResponseXml = response.getText();
					//parentPanel.element1 = new ElementPropertiesWindow();
					//parentPanel.element1.setParent(parentPanel);
					//parentPanel.getElement1().setXmlElement(elementResponseXml);
					//parentPanel.getElement1().show();	  
					//parentPanel.getElement1().propagateSize();
					elementTemplate.sendElementDataToPS24(elementResponseXml);
			}

			@Override
			public void onError(Request request, Throwable exception) {
				
			} };
		try {
			rb.sendRequest(requestContent,rc);				
		} catch (RequestException e) {
			e.printStackTrace();			
		}*/
	}
	
	//-------------------------- USER DEFINED FOLDER AREA ----------------------------------------//
	
	private void initUserFolder()
	{
		IdLabel tmpLbl;
		userRoot.SetValues("00", "Moje elementy", "ROOT FOLDER - USER DEFINED", null);
		userRoot.setUserId("00");
			elementTemplate.flm_es_flowUser.clear();
			elementTemplate.flm_es_flowUser.setWidth("100%");
			elementTemplate.flm_es_tree3.clear();
			elementTemplate.flm_es_tree3.removeFromParent();
			TreeImages tx= new TreeImages();
			elementTemplate.flm_es_tree3 = new Tree(tx,true);
			tmpLbl = new IdLabel("Moje elementy", "00");
			tmpLbl.addMouseOverHandler(mouseOverItem);
			tmpLbl.addMouseOutHandler(mouseOutItem);
			tmpLbl.addMouseDownHandler(mouseClickItem);
			tmpLbl.addDragOverHandler(dragOverHandlerLabel);
			TreeItemFolder prdItem = new TreeItemFolder(tmpLbl);
			enableDragNDrop(prdItem);			
			elementTemplate.flm_es_tree3.addItem(prdItem);									
			elementTemplate.flm_es_f3.add(elementTemplate.flm_es_tree3);
			elementTemplate.flm_es_tree3.addSelectionHandler(tree3Handler);
			//context menu 
			 Command cmdRemovePanel = new Command() {
			      @Override
				public void execute() {
			    	  panelContextMenu.hide();
			    	  if(selectedTxtImage<selectedUserFolder.getSubFolderCount()){
			    		  String foldId = ((UserFolder)selectedUserFolder.GetSubFolders().get(selectedTxtImage)).getUserId();
			    		  UserFolder action = (UserFolder) getFolderById(foldId); 			    		  
			    		  UserFolder parent = new UserFolder();
					    	 TreeItemFolder toRemove;
					    	 TreeItemFolder parentItem;
					    	 String tmpTab[] = foldId.split("-");
					    	 String parentId = new String();
					    	 for(int i =0; i<tmpTab.length-1 ; i++)
					    	 {
					    		 parentId+=tmpTab[i];
					    		 if(i<tmpTab.length-2)
					    			 parentId+="-";
					    	 }
					    	 parent = (UserFolder) getFolderById(parentId);
					    	 int removeNr = Integer.parseInt(tmpTab[tmpTab.length-1]);		
					    	 toRemove = getTreeItemById(foldId);
					    	 parentItem = getTreeItemById(parentId);
					    	 parentItem.removeItem(toRemove);
					    	 parent.GetSubFolders().remove(removeNr);
					    	 TreeItemFolder r;
					    	 UserFolder r1;
					    	 for(int i = removeNr; i< parent.getSubFolderCount();i++)
					    	 {
					    		  r = ((TreeItemFolder)parentItem.getChild(i));
					    		  r1= ((UserFolder)parent.GetSubFolders().get(i));
					    		 ((TreeItemFolder)parentItem.getChild(i)).decId();
					    		 ((UserFolder)parent.GetSubFolders().get(i)).setUserId(((TreeItemFolder)parentItem.getChild(i)).getId());
					    	 }
			    		  
			    	  }
			    	  else{
			    		  selectedUserFolder.GetElements().remove(selectedTxtImage - selectedUserFolder.getSubFolderCount());
			    	  }
			    	  setContentFlowUser(selectedUserFolder);
			      }
			    	  
			};	
			
			
			Command cmdNewFolder = new Command() {
				  @Override
				public void execute() {
					  contextMenu.hide();
					  String dgb = overFolderId;
					  UserFolder action = (UserFolder) getFolderById(overFolderId);
			          UserFolder toAdd = new UserFolder("Nowy Folder");
			          toAdd.userId = createUserId(action);
		              action.AddSubFolder(toAdd);
		              addFolderToTree(action, toAdd);
		              setContentFlowUser(selectedUserFolder);
		              
				  }
			};
		    Command cmdRename = new Command() {
			      @Override
				public void execute() {
			    	  contextMenu.hide();
			    	  editing = true;
			    	  String dgb = overFolderId;
			    	  UserFolder action = (UserFolder) getFolderById(overFolderId);
			    	  TreeItemFolder tmp = getTreeItemById(overFolderId);
			    	  textBoxPopUp.setPopupPosition(tmp.getAbsoluteLeft()+15, tmp.getAbsoluteTop());
			    	  textBoxPopUp.getElement().getStyle().setBorderStyle(BorderStyle.NONE);			    	  
			    	  rename.setText(action.GetFolderName());
			    	  rename.addKeyboardListener(new SubmitListener());
			    	  Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand () {
			    	        @Override
							public void execute () {
			    	            rename.setFocus(true);
			    	            rename.selectAll();
			    	        }
			    	    });
			    	  rename.selectAll();
			    	  textBoxPopUp.show();	
			    	  toRename = action;
			    	  setContentFlowUser(selectedUserFolder);
					}
			};	
		    Command cmdRemove = new Command() {
			      @Override
				public void execute() {
			    	 contextMenu.hide();
			    	 String dgb = overFolderId;
			    	 UserFolder action = (UserFolder) getFolderById(overFolderId);
			    	 int foldersUnder = 0;
			    	 if(!overFolderId.equals("00"))
			    	 {
				    	 UserFolder parent = new UserFolder();
				    	 TreeItemFolder toRemove;
				    	 TreeItemFolder parentItem;
				    	 String tmpTab[] = overFolderId.split("-");
				    	 String parentId = new String();
				    	 for(int i =0; i<tmpTab.length-1 ; i++)
				    	 {
				    		 parentId+=tmpTab[i];
				    		 if(i<tmpTab.length-2)
				    			 parentId+="-";
				    	 }
				    	 parent = (UserFolder) getFolderById(parentId);
				    	 int removeNr = Integer.parseInt(tmpTab[tmpTab.length-1]);
				    	 foldersUnder = parent.getSubFolderCount()- removeNr-1;
				    	
				    	 toRemove = getTreeItemById(overFolderId);
				    	 parentItem = getTreeItemById(parentId);
				    	 parentItem.removeItem(toRemove);
				    	 parent.GetSubFolders().remove(removeNr);
				    	 for(int i = removeNr; i< parent.getSubFolderCount();i++)
				    	 {	
				    		 ((TreeItemFolder)parentItem.getChild(i)).decId();
				    		 ((UserFolder)parent.GetSubFolders().get(i)).setUserId(((TreeItemFolder)parentItem.getChild(i)).getId());
				    	 }
				    	 int y = 0;
				    	 setContentFlowUser(selectedUserFolder);
				    }
						
			      }
			};	
			MenuItem mi1 = new MenuItem("Nowy folder",cmdNewFolder);
			MenuItem mi2 =new MenuItem("Zmien nazwe",cmdRename);
			MenuItem mi3 = new MenuItem("Usun",cmdRemove);		   
			menu.addItem(mi1);
			menu.addItem(mi2);
			menu.addItem(mi3);
			contextMenu.add(menu);	
			contextMenu.getElement().getStyle().setBorderWidth(1, Unit.PT);
			textBoxPopUp.add(rename);
			textBoxPopUp.getElement().getStyle().setBorderWidth(1, Unit.PT);
			panelMenu.addItem(new MenuItem("Usun",cmdRemovePanel));
			panelContextMenu.add(panelMenu);
			panelContextMenu.getElement().getStyle().setBorderWidth(1, Unit.PT);
			selectedUserFolder = userRoot;			
		}
	
	private void initAddMaterialsMenu(){
		 Command appCmd = new Command() {
		      @Override
			public void execute() {
		    	  Window.open(appUrl, "_blank", "");
				}
		};	
		 Command manualCmd = new Command() {
		      @Override
			public void execute() {
		    	  Window.open(manualUrl, "_blank", "");
				}
		};	
		 Command certCmd = new Command() {
		      @Override
			public void execute() {
		    	  Window.open(certUrl, "_blank", "");
				}
		};	
		 Command marketingCmd = new Command() {
		      @Override
			public void execute() {
		    	  Window.open(marketingUrl, "_blank", "");
				}
		};	
		elementTemplate.flm_es_app.setCommand(appCmd);
		elementTemplate.flm_es_manual.setCommand(manualCmd);
		elementTemplate.flm_es_cert.setCommand(certCmd);
		elementTemplate.flm_es_marketing.setCommand(marketingCmd);
	}
	/**
	 * Fills combo boxes for filtering based on previously received server responses for PrdRoot and CatRoot
	 */
	public void loadFilters(){
		catFilter.clear();
		catFilterDisplay.clear();
		prodFilter.clear();		
		prodFilterDisplay.clear();
		ArrayList<Widget> tmp = new ArrayList<Widget>();
		for(int i = 1; i<elementTemplate.flm_es_prodFilter.getItemCount();i++ )
			tmp.add(elementTemplate.flm_es_prodFilter.getItem(i));		
		for(int i = 0; i<tmp.size();i++ )
			elementTemplate.flm_es_prodFilter.remove(tmp.get(i));
		tmp.clear();
		for(int i = 1; i<elementTemplate.flm_es_catFilter.getItemCount();i++ )
			tmp.add(elementTemplate.flm_es_catFilter.getItem(i));		
		for(int i = 0; i<tmp.size();i++ )
			elementTemplate.flm_es_catFilter.remove(tmp.get(i));
		for(int i = 0; i< prodLib.getSubFolderCount(); i++)
		{
			prodFilter.add(prodLib.GetSubFolders().get(i).GetFolderID());
			prodFilterDisplay.add(prodLib.GetSubFolders().get(i).GetFolderName());
			elementTemplate.flm_es_prodFilter.add(Integer.toString(i+1),new Label(prodFilterDisplay.get(i)));
		}
		for(int i = 0; i< catLib.getSubFolderCount(); i++)
		{
			catFilter.add(catLib.GetSubFolders().get(i).GetFolderID());
			catFilterDisplay.add(catLib.GetSubFolders().get(i).GetFolderName());
			elementTemplate.flm_es_catFilter.add(Integer.toString(i+1),new Label(catFilterDisplay.get(i)));
		}
		
	}
	/**
	 * Returns Folder from user defined folders based on id given in argument
	 * @param id id of user defined folder (in format xx-xx-...)
	 */
	public Folder getFolderById(String id){
		String idTab[] = id.split("-");
		Folder ret = null;
		ArrayList<Folder> subFolder = null;
		boolean found = false;
		ret= userRoot;
		subFolder = userRoot.GetSubFolders();
		for (int i =1; i< idTab.length;i++)
		{			
			subFolder = ret.GetSubFolders();
			ret = subFolder.get(Integer.parseInt(idTab[i]));
		}
		return ret;
	}
	/**
	 * Returns TreeItemFolder from tree in User view on id given in argument
	 * @param id id of user defined folder (in format xx-xx-...)
	 */
	public TreeItemFolder getTreeItemById(String id){
		String idTab[] = id.split("-");
		TreeItemFolder ret = (TreeItemFolder) elementTemplate.flm_es_tree3.getItem(0);
		TreeItemFolder subItem;		
		for (int i =1; i< idTab.length;i++)
		{			
			ret = (TreeItemFolder) ret.getChild(Integer.parseInt(idTab[i]));
		}
		return ret;
	}
	/**
	 * Renames tree item representing folder given in argument "in" with name given as text
	 */
	public void renameTreeItemFolder(UserFolder in, String text){
		TreeItemFolder tmp = getTreeItemById(in.getUserId());
		tmp.setName(text);
	}
	/**
	 * Adds new tree item representing folder given in argument "in" to tree item 
	 * representing folder given in argument "selected"
	 */
	public void addFolderToTree(UserFolder in, UserFolder selected){
		IdLabel tmpLbl;
		TreeItemFolder tmp = getTreeItemById(in.getUserId());		
		TreeItemFolder toAdd;
		tmpLbl = new IdLabel(selected.GetFolderName(),selected.userId);
		tmpLbl.addMouseOverHandler(mouseOverItem);
		tmpLbl.addMouseOutHandler(mouseOutItem);
		tmpLbl.addMouseDownHandler(mouseClickItem);
		tmpLbl.addDragOverHandler(dragOverHandlerLabel);
		toAdd = new TreeItemFolder(tmpLbl);
		tmp.addItem(toAdd);
		for(int i = 0; i< selected.getSubFolderCount();i++)
		{
			addFolderToTree(selected,new UserFolder((UserFolder)(selected.GetSubFolders().get(i))));
		}
		tmp.setSelected(true);
		String selectedUserId = tmp.getId();
		UserFolder selectedFld = null;
		UserFolder toSearch = userRoot;
		selectedFld = toSearch;
		String tmpTab[] = selectedUserId.split("-");
		for(int i = 1; i<tmpTab.length;i++)
		{
			selectedFld = (UserFolder) toSearch.GetSubFolders().get(Integer.parseInt(tmpTab[i]));
			toSearch =  selectedFld;
		}		
		tmp.setState(true,true);
		if(elementTemplate.flm_es_tabPanel.getSelectedIndex() == 0)
			elementTemplate.flm_es_tree1.setSelectedItem(tmp);
		if(elementTemplate.flm_es_tabPanel.getSelectedIndex() == 1)
			elementTemplate.flm_es_tree2.setSelectedItem(tmp);
		if(elementTemplate.flm_es_tabPanel.getSelectedIndex() == 2)
			elementTemplate.flm_es_tree3.setSelectedItem(tmp);	
				
	}
	/**
	 * Refreshes display of contents of currently selected folder in tree
	 */
	public void refreshContentAfterAddingElement(UserFolder in){
		TreeItemFolder tmp = getTreeItemById(in.getUserId());
		tmp.setSelected(true);
		String selectedUserId = tmp.getId();
		UserFolder selectedFld = null;
		UserFolder toSearch = userRoot;
		selectedFld = toSearch;
		String tmpTab[] = selectedUserId.split("-");
		for(int i = 1; i<tmpTab.length;i++)
		{
			selectedFld = (UserFolder) toSearch.GetSubFolders().get(Integer.parseInt(tmpTab[i]));
			toSearch =  selectedFld;
		}	
		tmp.setState(true,true);
		fromNav=true;
		onDrop = true;
		if(elementTemplate.flm_es_tabPanel.getSelectedIndex() == 0)
			elementTemplate.flm_es_tree1.setSelectedItem(tmp);
		if(elementTemplate.flm_es_tabPanel.getSelectedIndex() == 1)
			elementTemplate.flm_es_tree2.setSelectedItem(tmp);
		if(elementTemplate.flm_es_tabPanel.getSelectedIndex() == 2)
			elementTemplate.flm_es_tree3.setSelectedItem(tmp);
	}
	/**
	 * Creates id of user defined folder based on id of its parent folder
	 * userId is in format xx-xx-xx-...
	 * where xx means number in current level and - means child node
	 */
	public String createUserId(UserFolder top){
		return top.getUserId() + "-"+ String.valueOf((top.getSubFolderCount()));
	}
	/**
	 *Sets disabled/enabled state of info buttons based on availability of information
	 *for element given in argument
	 */
	public void serveInfoButtons(FolderElement e){
		if(e.getPrice().equals(""))
			elementTemplate.flm_es_buttonPrice.setEnabled(false);
		else{
			elementTemplate.flm_es_buttonPrice.setEnabled(true);
			priceListUrl = e.getPrice();
		}
		if(e.getDoc().equals(""))
			elementTemplate.flm_es_buttonDoc.setEnabled(false);
		else{
			elementTemplate.flm_es_buttonDoc.setEnabled(true);
			docUrl = e.getDoc();
		}
		if(e.getApp().equals(""))
			elementTemplate.flm_es_app.setEnabled(false);
		else{
			elementTemplate.flm_es_app.setEnabled(true);
			appUrl = e.getApp();
		}
		if(e.getCert().equals(""))
			elementTemplate.flm_es_cert.setEnabled(false);
		else{
			elementTemplate.flm_es_cert.setEnabled(true);
			 certUrl = e.getCert();
		}
		if(e.getManual().equals(""))
			elementTemplate.flm_es_manual.setEnabled(false);
		else{
			elementTemplate.flm_es_manual.setEnabled(true);
			 manualUrl = e.getManual();
		}
		if(e.getMarketing().equals(""))
			elementTemplate.flm_es_marketing.setEnabled(false);
		else{
			elementTemplate.flm_es_marketing.setEnabled(true);
			 marketingUrl= e.getMarketing();
		}
	}
	/**
	 * Disables all info buttons
	 */
	public void disableInfoButtons(){
		elementTemplate.flm_es_buttonPrice.setEnabled(false);
		elementTemplate.flm_es_buttonDoc.setEnabled(false);
		elementTemplate.flm_es_app.setEnabled(false);
		elementTemplate.flm_es_cert.setEnabled(false);
		elementTemplate.flm_es_manual.setEnabled(false);
		elementTemplate.flm_es_marketing.setEnabled(false);		
	}
	/**
	 * Displays contents of folder given in argument in user defined view
	 */
	  public void setContentFlowUser(Folder fld){
			elemImages.clear();
			elementTemplate.flm_es_flowUser.clear();
			clearInfo();
			TxtImage img;
			for(int i = 0; i <fld.getSubFolderCount();i++)
			{							
						img = new TxtImage("images/folders/ps24-icon-folders.png",fld.GetSubFolders().get(i).GetFolderName(),((UserFolder)(fld.GetSubFolders().get(i))).getUserId());
						img.setFolder();
						enableDragNDrop(img);
						elemImages.add(img);	
			}
			for(int i = 0; i < fld.GetElements().size();i++)
			{				
				img = new TxtImage(fld.GetElements().get(i));
				if(i==0){
					mockClick(img);
				}
				enableDragNDrop(img);
				elemImages.add(img);
			}
			
			for(int i = 0; i< elemImages.size();i++)
			{			
				elemImages.get(i).sinkEvents(Event.ONMOUSEDOWN);
				elemImages.get(i).addHandler(mouseClickItemPanel,MouseDownEvent.getType());
				
				elemImages.get(i).sinkEvents(Event.ONCLICK);
				elemImages.get(i).addHandler(new ClickHandler(){

			        @Override
			        public void onClick(ClickEvent event) {	 			        	
			        	Object sender = event.getSource();	
			        	FlowPanel p =  (FlowPanel)((TxtImage)sender).getParent();
			        	int count = p.getWidgetCount();
			        	for(int i = 0; i< count; i++)
			        	{
			        		TxtImage im = (TxtImage) p.getWidget(i);
			        		if(im.isSelected())
			        		{
			        			im.removeHighlight();  
			        		}			        		
			        	}
			        	((TxtImage)sender).setHighlight();	
			        	clearInfo();
			        	disableInfoButtons();
			        	if(((TxtImage)sender).isFolder == false)
			        	{
			        		//String producerName = ((TxtImage)sender).GetElement().GetProducerName();
				        	//Window.alert(producerName);
				        	
				        	elementTemplate.flm_es_prdLbl1Val.setText(((TxtImage)sender).GetElement().GetProducerName());
				        	elementTemplate.flm_es_nameLblVal.setText(((TxtImage)sender).GetElement().getSymbol());
				        	elementTemplate.flm_es_typeLblVal.setText(((TxtImage)sender).GetElement().getSymbol());
				        	elementTemplate.flm_es_descLblVal.setText(((TxtImage)sender).GetElement().GetDescription());
				        	elementTemplate.flm_es_dateLblVal.setText(((TxtImage)sender).GetElement().GetDate());
				        	
				        	Constants.resolveProducerFullInfo(((TxtImage)sender).GetElement().GetProducerName());
				        	elementTemplate.flm_es_prdLbl2Val.setText(((TxtImage)sender).GetElement().GetProducerName());
				        	elementTemplate.flm_es_prdLbl3Val.setText(((TxtImage)sender).GetElement().GetProducerCompany());
				        	elementTemplate.flm_es_addrLblVal.setHTML(((TxtImage)sender).GetElement().GetProducerAddressLine1() + "<br/>" + 
				        			((TxtImage)sender).GetElement().GetProducerAddressLine2());
				        	elementTemplate.flm_es_addrLbl2Val.setHTML(cons.email() + ((TxtImage)sender).GetElement().GetProducerEmail() + " " +
				        			cons.website() + ((TxtImage)sender).GetElement().GetProducerWebsite() + "<br/>" +
									cons.telno() + ((TxtImage)sender).GetElement().GetProducerTelno() + " " +
									cons.faxno() + ((TxtImage)sender).GetElement().GetProducerFaxno());
				        	
				            elementTemplate.flm_es_imageElement.setUrl(Constants.URL_PREFIX+((TxtImage)sender).GetElement().GetImage());
				            elementTemplate.flm_es_imageProducer.setUrl(Constants.URL_PREFIX+((TxtImage)sender).GetElement().GetProducerLogo());
				            serveInfoButtons(((TxtImage)sender).GetElement());
				            selectedFolderElement = ((TxtImage)sender).GetElement();
			        	}
			        }

			    }, ClickEvent.getType());
				if(elemImages.get(i).isFolder())
				{
					
					elemImages.get(i).sinkEvents(Event.ONDBLCLICK);
					elemImages.get(i).addHandler(new DoubleClickHandler(){
		
				        @Override
				        public void onDoubleClick(DoubleClickEvent event) {	        	
				        	Object sender = event.getSource();	
				        	FlowPanel p =  (FlowPanel)((TxtImage)sender).getParent();
				        	String name = ((TxtImage)sender).getId();
				        	TreeItem it = elementTemplate.flm_es_tree3.getSelectedItem();
				            it.setState(true);
				        	int toSelect = findSelectedItem(name,2);
				        	elementTemplate.flm_es_tree3.setSelectedItem(it.getChild(toSelect), true);
				        	        	
				        }
		
				    }, DoubleClickEvent.getType());
				
				}
				else
				{
					elemImages.get(i).sinkEvents(Event.ONDBLCLICK);
					elemImages.get(i).addHandler(new DoubleClickHandler(){

				        @Override
				        public void onDoubleClick(DoubleClickEvent event) {	        	
				        	//parentPanel.runElementPropertiesWindow();		
				        	requestElementData(((TxtImage)(event.getSource())).GetElement());
				        	elementTemplate.handleElementSelection();
				        }

				    }, DoubleClickEvent.getType());
				}
				
				elementTemplate.flm_es_flowUser.add(elemImages.get(i));
				enableDragNDrop(elementTemplate.flm_es_tabPanel);
			}
			
		}	    
	    
	
	
	
	//-------------------------END OF USER DEFINED AREA ------------------------------------------//
	
	/*
	private void INIT_DEMO_SUBFOLDERS()
	{
		FolderElement el = new FolderElement();
		Producer p = new Producer("D0D806BF-876D-4C34-ABBA-5C45518BC683","","","");
		el.SetValues("grtAccessories", "gfx/testImages/csd.jpg", "gfx/testImages/csdSlide.jpg", "Demo element for testing purposes"," 00-00-00", "01","Demo element", p);
		demoFolder.GetSubFolders().get(0).AddElement(el);
		el = new FolderElement();
		 p = new Producer("D0D806BF-876D-4C34-ABBA-5C45518BC683","","","");
		el.SetValues("grtAccessories", "gfx/testImages/csd.jpg", "gfx/testImages/csdSlide.jpg", "Demo element for testing purposes 2"," 00-00-00", "01","Demo element 2", p);
		demoFolder.GetSubFolders().get(1).AddElement(el);
	}
	*/
	 /*----------------------------- EVENTS HANDLERS -------------------------------------------------------------*/
	
	private class SubmitListener extends KeyboardListenerAdapter {
	    @Override
		public void onKeyPress(Widget sender, char key, int mods) {
	      if (KeyboardListener.KEY_ENTER == key)
	      {
	    	  newName = rename.getText();
	    	  editing = false;
	    	  textBoxPopUp.hide();
	    	  if(newName!=null && !newName.equals("") )
	    	  {
		    	  toRename.setName(newName);
		    	  renameTreeItemFolder(toRename,newName);
	    	  }
	      }
	    }
	  }
	
	
	private MouseOverHandler mouseOverItem = new MouseOverHandler() {

		  @Override
		public void onMouseOver(MouseOverEvent event) {
		    overFolderId = ((IdLabel)event.getSource()).id;		
		    ((IdLabel)event.getSource()).setLabelBackgroundMoseOver();		
		  }
		};
		
	private MouseOutHandler mouseOutItem = new MouseOutHandler() {

			  @Override
			public void onMouseOut(MouseOutEvent event) {
					((IdLabel)event.getSource()).clearLabelBackground();
					if((((IdLabel)event.getSource()).id).equals(selectedUserFolder.getUserId()))
						((IdLabel)event.getSource()).getElement().getStyle().setBackgroundColor("#BEBEBE");	
			  }
		};
		
	private MouseDownHandler mouseClickItem = new MouseDownHandler(){

		@Override
		public void onMouseDown(MouseDownEvent event) {
			event.preventDefault();
			overFolderId = ((IdLabel)event.getSource()).id;
			if (event.getNativeButton() == NativeEvent.BUTTON_RIGHT) {				
				contextMenu.setPopupPosition(event.getClientX(), event.getClientY());
			    contextMenu.show();				
			  }
			
		}
		
	};
	
	private MouseDownHandler mouseClickItemPanel = new MouseDownHandler(){

		@Override
		public void onMouseDown(MouseDownEvent event) {
			event.preventDefault();				
			if (event.getNativeButton() == NativeEvent.BUTTON_RIGHT) {		
				selectedTxtImage = ((FlowPanel)((TxtImage)event.getSource()).getParent()).getWidgetIndex((TxtImage)event.getSource());
				panelContextMenu.setPopupPosition(event.getClientX(), event.getClientY());
			    panelContextMenu.show();				
			  }			
		}
		
	};
	
		private OpenHandler emptyOpenHandler = new OpenHandler(){
			@Override
			public void onOpen(OpenEvent event) {				
			}			
		};
		
	private	CloseHandler emptyCloseHandler = new CloseHandler(){
			@Override
			public void onClose(CloseEvent event) {		
			}			
		};
	
	private	class RequestCallbackP implements RequestCallback{
			Folder fld;
			TreeItemFolder treeIt;
			String slcId;
			RequestCallbackP(Folder in, TreeItemFolder it,String selectedFolderId){
				fld = in;
				treeIt = it;
				slcId = selectedFolderId;
			}
			@Override
			public void onResponseReceived(Request request,
					Response response) {				
				String a = response.getText();	
				a = response.getStatusText();				
				responseXml = response.getText();				
				serverResponseReceived = true;					
				xmlParser.parseXml(responseXml);				
				fld.copyFolder(xmlParser.getFolder());	
			
				addTreeItemsFromFolder(treeIt,fld);			
				if(fld.GetFolderID().equals(slcId)){
					loadPanel(fld,slcId);					
				}
				for(int i=0;i<fld.getSubFolderCount();i++)
				{
					requestFolder(fld.GetSubFolders().get(i).GetFolderID(),fld.GetSubFolders().get(i),(TreeItemFolder)treeIt.getChild(i),slcId);					
				}
			}
			@Override
			public void onError(Request request, Throwable exception) {
			}
			
		}
	/**
	 * Makes server request(with currently set filters) for folder with id given in argument "id"
	 * Response is stored in folder given in argument "dest"
	 * New tree item is created based on response and added to item given in argument "it"  
	 * Display of contents is refreshed for folder with id given in "selectedFolderId"
	 * Method is recursive it makes requests for all subfolders received in server response
	 */
		public void requestFolder(String id,  Folder dest, TreeItemFolder it, String selectedFolderId) 
		{					
			String requestString = new String();			
			RequestCallbackP rc = new RequestCallbackP(dest,it,selectedFolderId);	
			if(!producerFilterOn && !categoryFilterOn && DemoPanel.elementsFilter.equals("") && DemoPanel.foldersFilter.equals(""))
				requestString = rcOpen +id+rcClose;
			else{
				requestString = rcOpen +id + rcCloseFilter;
				if(producerFilterOn)
					requestString +=producerFilter;
				if(categoryFilterOn)
					requestString +=categoryFilter;
				requestString += DemoPanel.elementsFilter;
				requestString += DemoPanel.foldersFilter;
				requestString+=rcCloseFilterFolder;
				
			}			
			try {
				rb.sendRequest(requestString,rc);				
			} catch (RequestException e) {
				e.printStackTrace();			
			}			
		}		
		/**
		 * Adds new tree item representing folder given in argument "source" to tree item 
		 * given in argument "dest"
		 */
		public void addTreeItemsFromFolder(TreeItem dest, Folder source)
		{
			int count = source.getSubFolderCount();
			String name;
			String id;
			TreeItemFolder it;
			dest.removeItems();
			for(int i = 0; i< count ;i++)
			{				
				name = source.GetSubFolders().get(i).GetFolderName(); 
				id = source.GetSubFolders().get(i).GetFolderID();
				it = new TreeItemFolder(name,id);
				//if(elementTemplate.tabPanel.getSelectedIndex()==0)
					it.setProducer(source.GetFolderID());
				enableDragNDrop(it);
				dest.addItem(it);				
			}	
		}
		/**
		 * Searches for folder with id given in "selectedFolderId" in folder "source"
		 */
		public Folder getSubFolderById(String selectedFolderId, Folder source){
			Folder selectedFld = null;
			for(int i = 0; i< source.getSubFolderCount();i++)
			{
				if(source.GetFolderID().equals(selectedFolderId))
				{
					selectedFld = source;
					break;
				}
				if(source.GetSubFolders().get(i).GetFolderID().equals(selectedFolderId))
				{
					selectedFld = source.GetSubFolders().get(i);
					break;
				}
				selectedFld = getSubFolderById(selectedFolderId,source.GetSubFolders().get(i));
			}
			return selectedFld;
		}	
	    /**
	     * Loads contents of display panel from folder defined with id given in "selectedFolderId"
	     * placed in folder given in "main" 
	     */
		public void loadPanel(Folder main, String selectedFolderId){
			Folder selectedFld = null;
			FlowPanel panelToLoad = new FlowPanel();
			if(elementTemplate.flm_es_tabPanel.getSelectedIndex() == 0)
				panelToLoad = elementTemplate.flm_es_flowChoosen;
			else if(elementTemplate.flm_es_tabPanel.getSelectedIndex() == 1)
				panelToLoad = elementTemplate.flm_es_flowAll;
			selectedFld = getSubFolderById(selectedFolderId,main);	
			setContentFlow(selectedFld);
			TxtImage tmpWid = ((TxtImage)(panelToLoad.getWidget(0)));				
			tmpWid.setHighlight();
			disableInfoButtons();
			if(tmpWid.isFolder==false)
			{
        		//String producerName = tmpWid.GetElement().GetProducerName();
        		//Window.alert(producerName);
        		
				elementTemplate.flm_es_prdLbl1Val.setText(tmpWid.GetElement().GetProducerName());
	        	elementTemplate.flm_es_nameLblVal.setText(tmpWid.GetElement().getSymbol());
	        	elementTemplate.flm_es_typeLblVal.setText(tmpWid.GetElement().getSymbol());
	        	elementTemplate.flm_es_descLblVal.setText(tmpWid.GetElement().GetDescription());
	        	elementTemplate.flm_es_dateLblVal.setText(tmpWid.GetElement().GetDate());
	        	Constants.resolveProducerFullInfo(tmpWid.GetElement().GetProducerName());
	        	
	        	elementTemplate.flm_es_prdLbl2Val.setText(tmpWid.GetElement().GetProducerName());
	        	elementTemplate.flm_es_prdLbl3Val.setText(tmpWid.GetElement().GetProducerCompany());
	        	elementTemplate.flm_es_addrLblVal.setHTML(tmpWid.GetElement().GetProducerAddressLine1() + "<br/>" + 
	        			tmpWid.GetElement().GetProducerAddressLine2());
	        	elementTemplate.flm_es_addrLbl2Val.setHTML(cons.email() + tmpWid.GetElement().GetProducerEmail() + " " +
	        			cons.website() + tmpWid.GetElement().GetProducerWebsite() + "<br/>" +
						cons.telno() + tmpWid.GetElement().GetProducerTelno() + " " +
						cons.faxno() + tmpWid.GetElement().GetProducerFaxno());

	            elementTemplate.flm_es_imageElement.setUrl(Constants.URL_PREFIX+tmpWid.GetElement().GetImage());
	            elementTemplate.flm_es_imageProducer.setUrl(Constants.URL_PREFIX+tmpWid.GetElement().GetProducerLogo());	
	            serveInfoButtons(tmpWid.GetElement());
	            selectedFolderElement = tmpWid.GetElement();
			}				
			currentFolder = selectedFld;
			
			if(selectedFld.type==FolderConstants.Prd){
				selectedProducerFolder = selectedFld;
				Window.alert("prd"+selectedFld.GetFolderID());
			}
			else if(selectedFld.type==FolderConstants.Fld){
				selectedCategoryFolder = selectedFld;
				Window.alert("fld"+selectedFld.GetFolderID());
			}
			
		}

	/**
	 * Closes tree item given in argument
	 */
	public void closeItem(TreeItem it)
	{
		int count = it.getChildCount();
		it.setState(false);
		for(int i = 0; i< count; i++)
			closeItem(it.getChild(i));
	}
	/**
	 * Closes all tree items besides currently selected item in tree given in argument
	 */
	public void closeTreeItems(Tree tr)
	{
		int count = tr.getItemCount();
		TreeItem tmpIt;
		TreeItem activeIt = tr.getSelectedItem();
		while(activeIt.getParentItem()!=null)
			activeIt = activeIt.getParentItem();		
		for(int i = 0; i< count; i++)		{
			tmpIt = tr.getItem(i);
			if(tmpIt!=activeIt)
				closeItem(tmpIt);			
		}
	}
	/**
	 * Opens all parent items of tree item given in argument
	 */
	public void openParentItems(TreeItemFolder it)
	{
		TreeItemFolder activeIt = (TreeItemFolder) it.getParentItem();		
		while(activeIt!=null){
			if(!activeIt.getState())
				activeIt.setState(true);			
			activeIt = (TreeItemFolder) activeIt.getParentItem();			
		}
	}
	
	private	SelectionHandler tree1Handler = new SelectionHandler(){
			@Override
			public void onSelection(SelectionEvent event) {		
				//Window.alert("1");
				TreeItemFolder tmp = ((TreeItemFolder)((Tree)event.getSource()).getSelectedItem());	
				selectedProdGUID= tmp.getProducer();
				selectedProdName="GRYFIT";
				selectedFolderGUID = tmp.getId();
				selectedFolderName = tmp.getName();
				
				
				firstChoosen=false;
				if(!tmp.equals(currentlyUsedTreeItem))
				{
					if(nrHistoryChoosen>=0)
						elementTemplate.enableButtonBack();
					//closeTreeItems(elementTemplate.flm_es_tree1);
					boolean gotProd = false;
					Folder selectedFld = null;					
					String producerId;
					try{
						producerId = ((TreeItemFolder)((Tree)event.getSource()).getSelectedItem()).getProducer();
					}
					catch(Exception rootFolder)
					{
						producerId =  ((TreeItemFolder)((Tree)event.getSource()).getSelectedItem()).getId();
					}
					String selectedFolderName  =  ((TreeItemFolder)((Tree)event.getSource()).getSelectedItem()).getName();
					String selectedFolderId = ((TreeItemFolder)((Tree)event.getSource()).getSelectedItem()).getId();
					if(producerId.equals(selectedProducer))
					{
						gotProd = true;
						loadPanel(mainFolder,selectedFolderId);
					}
					else
					{
						requestFolder(producerId,mainFolder,((TreeItemFolder)((Tree)event.getSource()).getSelectedItem()),selectedFolderId); 
						selectedProducer = producerId;	
						idHistoryChoosen.clear();
						nrHistoryChoosen = -1;
						elementTemplate.disableButtonBack();
						elementTemplate.disableButtonForw();
					}						
					if(!fromNav){
						for(int i = idHistoryChoosen.size(); i>nrHistoryChoosen+1;i--)		
							idHistoryChoosen.remove(i-1);
						elementTemplate.disableButtonForw();
					    nrHistoryChoosen++;
						idHistoryChoosen.add(tmp);							
					}
					else
						openParentItems(tmp);
					
			}
				currentlyUsedTreeItem = tmp;
				fromNav=false;
				propagateSize();
				
				}			
		};
		
		public void selectLast(){
			elementTemplate.flm_es_tabPanel.selectTab(1);
			elementTemplate.flm_es_tabPanel.selectTab(0);
			Timer timer = new Timer() {
			      @Override
				public void run() {
						
			    	//elementTemplate.flm_es_tree1.getItem(0).setSelected(true);
				    elementTemplate.flm_es_tree1.getItem(0).setState(true,true);	
				    Timer timer1 = new Timer() {
					      @Override
						public void run() {
					    	  int last = elementTemplate.flm_es_tree1.getItem(0).getChildCount() - 1;
							  //Window.alert(String.valueOf(last));
					    	  elementTemplate.flm_es_tree1.setSelectedItem(elementTemplate.flm_es_tree1.getItem(0).getChild(last), true);	
						    
						    
						    
					      }
					    };

					    // Execute the timer to expire 2 seconds in the future
					 timer1.schedule(600);
				    
				    
			      }
			    };

			 timer.schedule(500);

			
			
		}
	
	public void mockSelection(TreeItemFolder tmp) {						
				//TreeItemFolder tmp = ((TreeItemFolder)((Tree)event.getSource()).getSelectedItem());
				
				Window.alert("c" + tmp.getName());
				//firstChoosen=false;
				//if(!tmp.equals(currentlyUsedTreeItem))
				//{
//					if(nrHistoryChoosen>=0)
//						elementTemplate.enableButtonBack();
					//closeTreeItems(elementTemplate.flm_es_tree1);
					boolean gotProd = false;
					Folder selectedFld = null;					
					String producerId;
					try{
						producerId = tmp.getProducer();
						Window.alert(producerId);
					}
					catch(Exception rootFolder)
					{
						producerId =  tmp.getId();
					}
					Window.alert("1");
					String selectedFolderName  =  tmp.getName();
					String selectedFolderId = tmp.getId();
					/*if(producerId.equals(selectedProducer))
					{
						gotProd = true;
						loadPanel(mainFolder,selectedFolderId);
					}*/
					//else
					//{
						requestFolder(producerId,mainFolder,tmp,selectedFolderId); 
						Window.alert("2");
						selectedProducer = producerId;	
						//idHistoryChoosen.clear();
						//nrHistoryChoosen = -1;
						//elementTemplate.disableButtonBack();
						//elementTemplate.disableButtonForw();
					//}						
					/*if(!fromNav){
						for(int i = idHistoryChoosen.size(); i>nrHistoryChoosen+1;i--)		
							idHistoryChoosen.remove(i-1);
						elementTemplate.disableButtonForw();
					    nrHistoryChoosen++;
						idHistoryChoosen.add(tmp);							
					}
					else
						openParentItems(tmp);*/
					
			//}
				currentlyUsedTreeItem = tmp;
				fromNav=false;
				propagateSize();
				
		}			
	
		
		
		private SelectionHandler tree2Handler = new SelectionHandler(){
			@Override
			public void onSelection(SelectionEvent event) {	
				
				TreeItemFolder tmp = ((TreeItemFolder)((Tree)event.getSource()).getSelectedItem());
				firstAll=false;
				if(!tmp.equals(currentlyUsedTreeItem)){
					if(nrHistoryAll>=0)
						elementTemplate.enableButtonBack();
					closeTreeItems(elementTemplate.flm_es_tree2);
					boolean requestNeeded = false;
					Folder selectedFld = null;
				String selectedFolderName  =  ((TreeItemFolder)((Tree)event.getSource()).getSelectedItem()).getName();
				String selectedFolderId = ((TreeItemFolder)((Tree)event.getSource()).getSelectedItem()).getId();
				TreeItemFolder tmpIt = (TreeItemFolder) ((TreeItemFolder)((Tree)event.getSource()).getSelectedItem()).getParentItem();				
				if(tmpIt == null)
					tmpIt = ((TreeItemFolder)((Tree)event.getSource()).getSelectedItem());
				else{
					while(tmpIt.getParentItem()!=null)
						tmpIt = (TreeItemFolder) tmpIt.getParentItem();
				}
				if(!tmpIt.getId().equals(selectedCat))
				{
					requestNeeded = true;
					selectedCat = tmpIt.getId();
					idHistoryAll.clear();
					nrHistoryAll = -1;
					elementTemplate.disableButtonBack();
					elementTemplate.disableButtonForw();
				}
				if(!requestNeeded)				{
					
					loadPanel(mainFolderCat,selectedFolderId);
				}
				else
				{
					for(int i = 0; i<elementTemplate.flm_es_tree2.getItemCount();i++)
						elementTemplate.flm_es_tree2.getItem(i).removeItems();
					requestFolder(selectedCat,mainFolderCat,((TreeItemFolder)((Tree)event.getSource()).getSelectedItem()),selectedFolderId); 
					
				}	
				if(!fromNav){
					for(int i = idHistoryAll.size(); i>nrHistoryAll+1;i--)		
						idHistoryAll.remove(i-1);
					elementTemplate.disableButtonForw();
				    nrHistoryAll++;
					idHistoryAll.add(tmp);	
					
				}
				else{					
						TreeItemFolder activeIt = (TreeItemFolder) tmp.getParentItem();						
						while(activeIt!=null){
							if(!activeIt.getState())
								activeIt.setState(true);							
							activeIt = (TreeItemFolder) activeIt.getParentItem();							
						}
					}
				
				}
				fromNav=false;
				currentlyUsedTreeItem = tmp;
				propagateSize();				
				}			
		};	
		
		private SelectionHandler tree3Handler = new SelectionHandler(){
			@Override
			public void onSelection(SelectionEvent event) {			
				TreeItemFolder tmp = ((TreeItemFolder)((Tree)event.getSource()).getSelectedItem());
				firstUser = false;
				if(!tmp.equals(currentlyUsedTreeItem) )
				{
					TreeItemFolder toClear = getTreeItemById(selectedUserFolder.getUserId());
					toClear.getLabel().getElement().getStyle().setBackgroundColor("transparent");
					if(nrHistoryUser>=0)
						elementTemplate.enableButtonBack();					
					UserFolder selectedFld = null;					
					if(!fromNav){
						for(int i = idHistoryUser.size(); i>nrHistoryUser+1;i--)		
							idHistoryUser.remove(i-1);
						elementTemplate.disableButtonForw();
					    nrHistoryUser++;
						idHistoryUser.add(tmp);	
						
					}
					else
						openParentItems(tmp);	
					tmp.getLabel().getElement().getStyle().setBackgroundColor("#BEBEBE");					
					String selectedFolderName  =  ((TreeItemFolder)((Tree)event.getSource()).getSelectedItem()).getName();
					String selectedUserId =  ((TreeItemFolder)((Tree)event.getSource()).getSelectedItem()).getId();					
					UserFolder toSearch = userRoot;
					selectedFld = toSearch;
					String tmpTab[] = selectedUserId.split("-");
					for(int i = 1; i<tmpTab.length;i++)
					{
						selectedFld = (UserFolder) toSearch.GetSubFolders().get(Integer.parseInt(tmpTab[i]));
						toSearch =  selectedFld;
					}	
					setContentFlowUser(selectedFld);					
					if(((elementTemplate.flm_es_flowUser.getWidgetCount()))>0)
					{
						TxtImage tmpWid = ((TxtImage)(elementTemplate.flm_es_flowUser.getWidget(0)));				
						tmpWid.setHighlight();
						disableInfoButtons();
						if(tmpWid.isFolder==false)
						{
			        		//String producerName = tmpWid.GetElement().GetProducerName();
			        		//Window.alert(producerName);
			        		
							elementTemplate.flm_es_prdLbl1Val.setText(tmpWid.GetElement().GetProducerName());
				        	elementTemplate.flm_es_nameLblVal.setText(tmpWid.GetElement().getSymbol());
				        	elementTemplate.flm_es_typeLblVal.setText(tmpWid.GetElement().getSymbol());
				        	elementTemplate.flm_es_descLblVal.setText(tmpWid.GetElement().GetDescription());
				        	elementTemplate.flm_es_dateLblVal.setText(tmpWid.GetElement().GetDate());
				        	
				        	Constants.resolveProducerFullInfo(tmpWid.GetElement().GetProducerName());
				        	elementTemplate.flm_es_prdLbl2Val.setText(tmpWid.GetElement().GetProducerName());
				        	elementTemplate.flm_es_prdLbl3Val.setText(tmpWid.GetElement().GetProducerCompany());
				        	elementTemplate.flm_es_addrLblVal.setHTML(tmpWid.GetElement().GetProducerAddressLine1() + "<br/>" + 
				        			tmpWid.GetElement().GetProducerAddressLine2());
				        	elementTemplate.flm_es_addrLbl2Val.setHTML(cons.email() + tmpWid.GetElement().GetProducerEmail() + " " +
				        			cons.website() + tmpWid.GetElement().GetProducerWebsite() + "<br/>" +
									cons.telno() + tmpWid.GetElement().GetProducerTelno() + " " +
									cons.faxno() + tmpWid.GetElement().GetProducerFaxno());
				        	
				            elementTemplate.flm_es_imageElement.setUrl(Constants.URL_PREFIX+tmpWid.GetElement().GetImage());
				            elementTemplate.flm_es_imageProducer.setUrl(Constants.URL_PREFIX+tmpWid.GetElement().GetProducerLogo());
				            serveInfoButtons(tmpWid.GetElement());
				            selectedFolderElement = tmpWid.GetElement();
						
						}
					}
					selectedUserFolder = selectedFld;	
				}
				else if(onDrop){
					setContentFlowUser(selectedUserFolder);
					if(((elementTemplate.flm_es_flowUser.getWidgetCount()))>0)
					{
						TxtImage tmpWid = ((TxtImage)(elementTemplate.flm_es_flowUser.getWidget(0)));				
						tmpWid.setHighlight();
						disableInfoButtons();
						if(tmpWid.isFolder==false)
						{
			        		//String producerName = tmpWid.GetElement().GetProducerName();
			        		//Window.alert(producerName);
			        		
							elementTemplate.flm_es_prdLbl1Val.setText(tmpWid.GetElement().GetProducerName());
				        	elementTemplate.flm_es_nameLblVal.setText(tmpWid.GetElement().getSymbol());
				        	elementTemplate.flm_es_typeLblVal.setText(tmpWid.GetElement().getSymbol());
				        	elementTemplate.flm_es_descLblVal.setText(tmpWid.GetElement().GetDescription());
				        	elementTemplate.flm_es_dateLblVal.setText(tmpWid.GetElement().GetDate());
				        	
				        	Constants.resolveProducerFullInfo(tmpWid.GetElement().GetProducerName());
				        	elementTemplate.flm_es_prdLbl2Val.setText(tmpWid.GetElement().GetProducerName());
				        	elementTemplate.flm_es_prdLbl3Val.setText(tmpWid.GetElement().GetProducerCompany());
				        	elementTemplate.flm_es_addrLblVal.setHTML(tmpWid.GetElement().GetProducerAddressLine1() + "<br/>" +
				        			tmpWid.GetElement().GetProducerAddressLine2());
				        	elementTemplate.flm_es_addrLbl2Val.setHTML(cons.email() + tmpWid.GetElement().GetProducerEmail() + " " +
				        			cons.website() + tmpWid.GetElement().GetProducerWebsite() + "<br/>" +
									cons.telno() + tmpWid.GetElement().GetProducerTelno() + " " +
									cons.faxno() + tmpWid.GetElement().GetProducerFaxno());	
				        	
				            elementTemplate.flm_es_imageElement.setUrl(Constants.URL_PREFIX+tmpWid.GetElement().GetImage());
				            elementTemplate.flm_es_imageProducer.setUrl(Constants.URL_PREFIX+tmpWid.GetElement().GetProducerLogo());
				            serveInfoButtons(tmpWid.GetElement());
				            selectedFolderElement = tmpWid.GetElement();
						
						}
					}
				}
				currentlyUsedTreeItem = tmp;
				fromNav=false;
				propagateSize();				
				}	
				
//			
		};
		private void fillUserIdInSubFolders(UserFolder top)
		{
			for(int i = 0; i< top.getSubFolderCount();i++)
			{
				//top.getUserId() + "-"+ String.valueOf(i);
				//Folder x =new Folder();
				//top.GetSubFolders().get(i) = x;// new UserFolder((top.GetSubFolders().get(i)));
				((UserFolder)top.GetSubFolders().get(i)).userId = top.getUserId() + "-"+ String.valueOf(i);
				fillUserIdInSubFolders(((UserFolder)top.GetSubFolders().get(i)));
			}
		}
		private DropHandler dropHandlerFlow = new DropHandler() {
	        @Override
	        public void onDrop(DropEvent event) {
	            event.preventDefault();
	            String tmp = event.getData("text");	           
	            UserFolder toAdd;
	            if(tmp.equals("folder"))	            {
	            	
	            	toAdd  = new UserFolder(folderToMove);
	            	toAdd.userId = createUserId(selectedUserFolder);
	            	//Window.alert("id created");
	            	fillUserIdInSubFolders(toAdd);
	            	//Window.alert("idssss created");
	            	selectedUserFolder.AddSubFolder(toAdd);
	            	//Window.alert("add folder");
	            	addFolderToTree(selectedUserFolder, toAdd);
	            	//Window.alert("add tree");
	            	refreshContentAfterAddingElement(selectedUserFolder);
	            }
	            else if(tmp.equals("element"))
	            {
	            	selectedUserFolder.AddElement(elementToMove);
	            	refreshContentAfterAddingElement(selectedUserFolder);
	            }	           
	        }
	    };
	    
		private DropHandler dropHandlerTree = new DropHandler() {

	        @Override
	        public void onDrop(DropEvent event) {
	            event.preventDefault();
	            String tmp = event.getData("text");
	            UserFolder action = (UserFolder) getFolderById(overFolderId);
	            UserFolder toAdd;
	            if(tmp.equals("folder"))
	            {
	            	//folderToMove.set
	            	toAdd  = new UserFolder(folderToMove);
	            	toAdd.userId = createUserId(action);
	            	fillUserIdInSubFolders(toAdd);
	            	action.AddSubFolder(toAdd);
	            	addFolderToTree(action, toAdd);
	            	refreshContentAfterAddingElement(action);
	            }
	            else if(tmp.equals("element"))
	            {
	            	action.AddElement(elementToMove);
	            	refreshContentAfterAddingElement(action);
	            }	           
	        }
	    };
	    
	   private  DragLeaveHandler dragLeaveHandler=new DragLeaveHandler() {
	        @Override
	        public void onDragLeave(DragLeaveEvent event) {	      
	        }
	    };
	    
	 private   DragOverHandler dragOverHandler =  new DragOverHandler() {
	        @Override
	        public void onDragOver(DragOverEvent event) { 
	        	event.preventDefault();
	        	elementTemplate.flm_es_tabPanel.selectTab(2);
	        }
	    };
	  private  DragOverHandler dragOverHandlerLabel =  new DragOverHandler() {
	        @Override
	        public void onDragOver(DragOverEvent event) { 
	        	overFolderId = ((IdLabel)event.getSource()).id;
	        }
	    };
	    
	 private   DragOverHandler dragOverHandlerTree =  new DragOverHandler() {
	        @Override
	        public void onDragOver(DragOverEvent event) { 
	        	
	        }
	    };
	    
	  private  DragStartHandler dragStartHandler  =  new DragStartHandler() {
	        @Override
	        public void onDragStart(DragStartEvent event) {
	        	//event.preventDefault();
	        	TxtImage im;
	        	String tmp;
	        	im = (TxtImage)event.getSource();
	        	int index = ((FlowPanel)im.getParent()).getWidgetIndex(im);
	        	if(im.isFolder())
	        	{	        		
	        		folderToMove.copyFolder( currentFolder.GetSubFolders().get(index));
	        		event.setData("text", "folder");
	        	}     
	        	else
	        	{
	        		Folder s = currentFolder;
	        		int a = currentFolder.getSubFolderCount();
	        		index = index - currentFolder.getSubFolderCount();
	        		elementToMove = currentFolder.GetElements().get(index);
	        		event.setData("text", "element");
	        	}
	        }
	    };

	    /**
		 * 
		 *Prepares and shows display content for views Choosen or All (depending on selected Tab Panel tab)
		 *Contents of folder given in argument are shown
		 */
	    public void setContentFlow(Folder fld){
	    	//Window.alert("setting..");
	    	FlowPanel panelForContent = new FlowPanel();
	    	Tree treeUsed = new Tree();
	    	if(elementTemplate.flm_es_tabPanel.getSelectedIndex() == 0)
	    	{
				panelForContent = elementTemplate.flm_es_flowChoosen;
				treeUsed = elementTemplate.flm_es_tree1;
				showProducerBackgroundChoosen(fld.getBackground());
	    	}
			else if(elementTemplate.flm_es_tabPanel.getSelectedIndex() == 1)
			{
				panelForContent = elementTemplate.flm_es_flowAll;
				treeUsed = elementTemplate.flm_es_tree2;
				showProducerBackgroundAll(fld.getBackground());
			}
	    	
			elemImages.clear();
			panelForContent.clear();
			clearInfo();
			TxtImage img;
			for(int i = 0; i <fld.getSubFolderCount();i++)
			{							
						img = new TxtImage("images/folders/ps24-icon-folders.png",fld.GetSubFolders().get(i).GetFolderName(),fld.GetSubFolders().get(i).GetFolderID());
						img.setFolder();
						enableDragNDrop(img);
						elemImages.add(img);	
			}
			for(int i = 0; i < fld.GetElements().size();i++)
			{
				//img = new TxtImage(currentFolder.GetElements().get(i).GetSlide(),currentFolder.GetElements().get(i).GetName());
				img = new TxtImage(fld.GetElements().get(i));
				if(i==0){
					//mockClick(img);
				}
				enableDragNDrop(img);
				elemImages.add(img);
			}
			
			for(int i = 0; i< elemImages.size();i++)
			{			
				elemImages.get(i).sinkEvents(Event.ONCLICK);
				elemImages.get(i).addHandler(new ClickHandler(){

			        @Override
			        public void onClick(ClickEvent event) {	        	
			        	Object sender = event.getSource();	
			        	FlowPanel p =  (FlowPanel)((TxtImage)sender).getParent();
			        	int count = p.getWidgetCount();
			        	for(int i = 0; i< count; i++)
			        	{
			        		TxtImage im = (TxtImage) p.getWidget(i);
			        		if(im.isSelected())
			        		{
			        			im.removeHighlight();  
			        		}			        		
			        	}
			        	((TxtImage)sender).setHighlight();	
			        	clearInfo();
			        	disableInfoButtons();
			        	if(((TxtImage)sender).isFolder == false)
			        	{
			        		//String producerName = ((TxtImage)sender).GetElement().GetProducerName();
			        		//Window.alert(producerName);
			        		
			        		elementTemplate.flm_es_prdLbl1Val.setText(((TxtImage)sender).GetElement().GetProducerName());
				        	elementTemplate.flm_es_nameLblVal.setText(((TxtImage)sender).GetElement().getSymbol());
				        	elementTemplate.flm_es_typeLblVal.setText(((TxtImage)sender).GetElement().getSymbol());
				        	elementTemplate.flm_es_descLblVal.setText(((TxtImage)sender).GetElement().GetDescription());
				        	elementTemplate.flm_es_dateLblVal.setText(((TxtImage)sender).GetElement().GetDate());
				        	
				        	Constants.resolveProducerFullInfo(((TxtImage)sender).GetElement().GetProducerName());
				        	elementTemplate.flm_es_prdLbl2Val.setText(((TxtImage)sender).GetElement().GetProducerName());
				        	elementTemplate.flm_es_prdLbl3Val.setText(((TxtImage)sender).GetElement().GetProducerCompany());
				        	elementTemplate.flm_es_addrLblVal.setHTML(((TxtImage)sender).GetElement().GetProducerAddressLine1() + "<br/>" + 
				        			((TxtImage)sender).GetElement().GetProducerAddressLine2());
				        	elementTemplate.flm_es_addrLbl2Val.setHTML(cons.email() + ((TxtImage)sender).GetElement().GetProducerEmail() + " " +
				        			cons.website() + ((TxtImage)sender).GetElement().GetProducerWebsite() + "<br/>" +
									cons.telno() + ((TxtImage)sender).GetElement().GetProducerTelno() + " " +
									cons.faxno() + ((TxtImage)sender).GetElement().GetProducerFaxno());				        	
				        	
				            elementTemplate.flm_es_imageElement.setUrl(Constants.URL_PREFIX+((TxtImage)sender).GetElement().GetImage());
				            elementTemplate.flm_es_imageProducer.setUrl(Constants.URL_PREFIX+((TxtImage)sender).GetElement().GetProducerLogo());
				            serveInfoButtons(((TxtImage)sender).GetElement());
				            selectedFolderElement = ((TxtImage)sender).GetElement();
			        	}
			        }

			    }, ClickEvent.getType());
				if(elemImages.get(i).isFolder())
				{
					elemImages.get(i).sinkEvents(Event.ONDBLCLICK);//
					elemImages.get(i).addHandler(new DoubleClickHandler(){
		
				        @Override
				        public void onDoubleClick(DoubleClickEvent event) {	        	
				        	Object sender = event.getSource();	
				        	TreeItem it = new TreeItem();
				        	FlowPanel p =  (FlowPanel)((TxtImage)sender).getParent();
				        	String name = ((TxtImage)sender).getId();
				        	
				        	if(elementTemplate.flm_es_tabPanel.getSelectedIndex() == 0)	
				        		 it = elementTemplate.flm_es_tree1.getSelectedItem();
							else if(elementTemplate.flm_es_tabPanel.getSelectedIndex() == 1)
								 it = elementTemplate.flm_es_tree2.getSelectedItem();
				            it.setState(true);
				        	int toSelect = findSelectedItem(name,elementTemplate.flm_es_tabPanel.getSelectedIndex());
				        	if(elementTemplate.flm_es_tabPanel.getSelectedIndex() == 0)
				        		elementTemplate.flm_es_tree1.setSelectedItem(it.getChild(toSelect), true);
				        	else if(elementTemplate.flm_es_tabPanel.getSelectedIndex() == 1)
				        		elementTemplate.flm_es_tree2.setSelectedItem(it.getChild(toSelect), true);   	
				        }
		
				    }, DoubleClickEvent.getType());
				
				}
				else
				{
					elemImages.get(i).sinkEvents(Event.ONDBLCLICK);
					elemImages.get(i).addHandler(new DoubleClickHandler(){

				        @Override
				        public void onDoubleClick(DoubleClickEvent event) {	        	
				        	//parentPanel.runElementPropertiesWindow();		
				        	requestElementData(((TxtImage)(event.getSource())).GetElement());
				        	elementTemplate.handleElementSelection();
				        }

				    }, DoubleClickEvent.getType());
				}
				if(elementTemplate.flm_es_tabPanel.getSelectedIndex() == 0)
					elementTemplate.flm_es_flowChoosen.add(elemImages.get(i));
				else if(elementTemplate.flm_es_tabPanel.getSelectedIndex() == 1)
					elementTemplate.flm_es_flowAll.add(elemImages.get(i));
				enableDragNDrop(elementTemplate.flm_es_tabPanel);
			}
			
		/*	//Object sender = event.getSource();	
        	TreeItem it = new TreeItem();
        	FlowPanel p =  (FlowPanel)(elemImages.get(elemImages.size()-1)).getParent();
        	//String name = (elemImages.get(elemImages.size()-1)).getId();
        	
        	//if(elementTemplate.flm_es_tabPanel.getSelectedIndex() == 0)	
        		 it = elementTemplate.flm_es_tree1.getSelectedItem();
			//else if(elementTemplate.flm_es_tabPanel.getSelectedIndex() == 1)
				// it = elementTemplate.flm_es_tree2.getSelectedItem();
            it.setState(true);
        	int toSelect = it.getChildCount()-1;//findSelectedItem(name,elementTemplate.flm_es_tabPanel.getSelectedIndex());
        	if(elementTemplate.flm_es_tabPanel.getSelectedIndex() == 0)
        		elementTemplate.flm_es_tree1.setSelectedItem(it.getChild(toSelect), true);
        	else if(elementTemplate.flm_es_tabPanel.getSelectedIndex() == 1)
        		elementTemplate.flm_es_tree2.setSelectedItem(it.getChild(toSelect), true);
			//this.selectLast();
			 * 
			 */
			
		}	    
	    
	    
	    public void mockClick(TxtImage sender){
	    	sender.setHighlight();
    		
	    	elementTemplate.flm_es_prdLbl1Val.setText(sender.GetElement().GetProducerName());
        	elementTemplate.flm_es_nameLblVal.setText(sender.GetElement().getSymbol());
        	elementTemplate.flm_es_typeLblVal.setText(sender.GetElement().getSymbol());
        	elementTemplate.flm_es_descLblVal.setText(sender.GetElement().GetDescription());
        	elementTemplate.flm_es_dateLblVal.setText(sender.GetElement().GetDate());
        	
        	Constants.resolveProducerFullInfo(sender.GetElement().GetProducerName());
        	elementTemplate.flm_es_prdLbl2Val.setText(sender.GetElement().GetProducerName());
        	elementTemplate.flm_es_prdLbl3Val.setText(sender.GetElement().GetProducerCompany());
        	elementTemplate.flm_es_addrLblVal.setHTML(sender.GetElement().GetProducerAddressLine1() + "<br/>" +
        			sender.GetElement().GetProducerAddressLine2());
        	elementTemplate.flm_es_addrLbl2Val.setHTML(cons.email() + sender.GetElement().GetProducerEmail() + " " +
        			cons.website() + sender.GetElement().GetProducerWebsite() + "<br/>" +
					cons.telno() + sender.GetElement().GetProducerTelno() + " " +
					cons.faxno() + sender.GetElement().GetProducerFaxno());	
        	
            elementTemplate.flm_es_imageElement.setUrl(Constants.URL_PREFIX+sender.GetElement().GetImage());
            elementTemplate.flm_es_imageProducer.setUrl(Constants.URL_PREFIX+sender.GetElement().GetProducerLogo());
            serveInfoButtons(sender.GetElement());
            selectedFolderElement = sender.GetElement();
	    }
	    
	    /**
	     * Finds and returns index of tree item with id given in "id" in tree igven in argument "tree"
	     */
	public int findSelectedItem(String id, int tree){
	
		TreeItem it;
		if(tree == 0)
			it = elementTemplate.flm_es_tree1.getSelectedItem();
		else if(tree ==1 )
			it = elementTemplate.flm_es_tree2.getSelectedItem();
		else if (tree == 2)
			it = elementTemplate.flm_es_tree3.getSelectedItem();
		else 
			return 999;
		for(int i = 0; i< it.getChildCount();i++)
		{
			if(((TreeItemFolder)it.getChild(i)).getId().equals(id))
				return i;
		}
		return 999;
	}
	/**
	 * Enables drag & drop for given TxtImage
	 */
	public void enableDragNDrop(TxtImage img){
	    	img.getElement().setDraggable(Element.DRAGGABLE_TRUE);
	    	img.addBitlessDomHandler(dragStartHandler,DragStartEvent.getType());
	    }
	/**
	 * Enables drag & drop for given TreeItem
	 */
	 public void enableDragNDrop(TreeItem it){
	    	it.getElement().setDraggable(Element.DRAGGABLE_TRUE);
	    }
		/**
		 * Enables drag & drop for given TabLayoutPanel
		 */    
	 public void enableDragNDrop(TabLayoutPanel tab){ 	
	    	Widget tabUser = tab.getTabWidget(2);
	    	tabUser.addBitlessDomHandler(dragOverHandler,DragOverEvent.getType());
	    	elementTemplate.flm_es_flowUser.addBitlessDomHandler(dragOverHandler,DragOverEvent.getType());	    	
	    }
		/**
		 * Enables drag & drop for user view
		 */
	 public void enableDragNDrop(){
	    	elementTemplate.flm_es_flowUser.addBitlessDomHandler(dropHandlerFlow, DropEvent.getType());
	    	elementTemplate.flm_es_tree3.addBitlessDomHandler(dragOverHandlerTree,DragOverEvent.getType());
	    	elementTemplate.flm_es_tree3.addBitlessDomHandler(dropHandlerTree, DropEvent.getType());
	    }

	 /**
	  * Clears info of element - should be used when currently no element is selected
	  */
	public void clearInfo(){
		elementTemplate.flm_es_prdLbl1Val.setText("");
		elementTemplate.flm_es_nameLblVal.setText("");
		elementTemplate.flm_es_typeLblVal.setText("");
    	elementTemplate.flm_es_descLblVal.setText("");
    	elementTemplate.flm_es_dateLblVal.setText("");
        elementTemplate.flm_es_prdLbl2Val.setText("");
        elementTemplate.flm_es_addrLblVal.setHTML("");
        elementTemplate.flm_es_imageElement.setUrl("gfx/testImages/blank.png");
        elementTemplate.flm_es_imageProducer.setUrl("gfx/testImages/blank.png");
	}
	/**
	 * Clears background for displaying elements
	 */
	public void clearBackground(){
		elementTemplate.flm_es_flowChoosen.getElement().getStyle().setBackgroundImage("url(gfx/testImages/blank.png)");
		elementTemplate.flm_es_flowAll.getElement().getStyle().setBackgroundImage("url(gfx/testImages/blank.png)");
	}
	/**
	 * Shows background from url given in argument in Choosen view 
	 */
	public void showProducerBackgroundChoosen(String fileName){	
		elementTemplate.flm_es_flowChoosen.getElement().getStyle().setBackgroundImage("url(" +Constants.URL_PREFIX+ fileName+ ")");
	}
	/**
	 * Shows background from url given in argument in All view 
	 */
	public void showProducerBackgroundAll(String fileName){
		elementTemplate.flm_es_flowAll.getElement().getStyle().setBackgroundImage("url("+Constants.URL_PREFIX + fileName+ ")");
	}
	
	/**
	 * Initializes All view
	 * Cleares all old stuff, cretes tree for CatRoot
	 */
	public void initAllView(){
		elementTemplate.flm_es_flowAll.clear();
		elementTemplate.flm_es_flowAll.setWidth("100%");
		elementTemplate.flm_es_tree2.clear();
		elementTemplate.flm_es_tree2.removeFromParent();
		TreeImages tx= new TreeImages();
		elementTemplate.flm_es_tree2 = new Tree(tx,true);
		clearBackground();
		TreeItemFolder prdItem;		
		ArrayList<Folder> subFl = catLib.GetSubFolders();
		for(int i = 0; i< subFl.size();i++)	{
			prdItem = new TreeItemFolder(subFl.get(i).GetFolderName(),subFl.get(i).GetFolderID());
			prdItem.setProducer(subFl.get(i).GetFolderID());
			enableDragNDrop(prdItem);
			elementTemplate.flm_es_tree2.addItem(prdItem);	
		}					
		elementTemplate.flm_es_tree2.addSelectionHandler(tree2Handler);
		elementTemplate.flm_es_tree2.addOpenHandler(emptyOpenHandler);
		elementTemplate.flm_es_tree2.addCloseHandler(emptyCloseHandler);
		elementTemplate.flm_es_f2.add(elementTemplate.flm_es_tree2);
	}
	
	/**
	 * Initializes Choosen view
	 * Cleares all old stuff, cretes tree for PrdRoot
	 */
	public void initChoosenView(){
		elementTemplate.flm_es_flowChoosen.clear();
		elementTemplate.flm_es_flowChoosen.setWidth("100%");
		elementTemplate.flm_es_tree1.clear();
		elementTemplate.flm_es_tree1.removeFromParent();
		TreeImages tx= new TreeImages();
		elementTemplate.flm_es_tree1 = new Tree(tx,true);
		clearBackground();
		TreeItemFolder prdItem;		
		ArrayList<Folder> subFl = prodLib.GetSubFolders();
		for(int i = 0; i< subFl.size();i++)	{
			prdItem = new TreeItemFolder(subFl.get(i).GetFolderName(),subFl.get(i).GetFolderID());
			prdItem.setProducer(subFl.get(i).GetFolderID());
			enableDragNDrop(prdItem);
			elementTemplate.flm_es_tree1.addItem(prdItem);	
			/*if(i==subFl.size()-1){
				//prdItem.setState(true, true);
				prdItem.setSelected(true);
			}*/
		}					
		elementTemplate.flm_es_tree1.addSelectionHandler(tree1Handler);
		elementTemplate.flm_es_tree1.addOpenHandler(emptyOpenHandler);
		elementTemplate.flm_es_tree1.addCloseHandler(emptyCloseHandler);
		elementTemplate.flm_es_f1.add(elementTemplate.flm_es_tree1);
		this.selectLast();
	}
	/*public void setXmlFolders(String xml, String xmlName) {
		xmlParser.parseXml(xml);
		prodLib = xmlParser.getFolder();
		initChoosenView();
	}
	public void setXmlFoldersDemo(String xml, String xmlName) {
		xmlParser.parseXml(xml);	
		demoFolder = xmlParser.getFolder();		
	}	*/
	
	public void focusAction(){
		this.hide();
		this.show();
	}
	public void hideAction(){
		this.hide();
	}
	
	public void addHandlers()
	{
		this.sinkEvents(Event.ONMOUSEUP);
		this.addHandler(new MouseUpHandler(){

			@Override
			public void onMouseUp(MouseUpEvent event) {
				// TODO Auto-generated method stub
				focusAction();
			}
		},MouseUpEvent.getType());
		
		this.sinkEvents(Event.ONKEYPRESS);
		this.addHandler(new KeyPressHandler(){

			@Override
			public void onKeyPress(KeyPressEvent event) {
				int r = event.getNativeEvent().getKeyCode();
			    if(	event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ESCAPE)
			    	hideAction();
			}

			
		},KeyPressEvent.getType());
		
	}

} 


