package com.curiam.client;

import java.util.ArrayList;

import com.curiam.client.componentes.BasicChartExample;
import com.curiam.client.componentes.GridExample;
import com.curiam.client.componentes.Utiles;
import com.curiam.client.datos.CaseBeanTPB;
import com.curiam.client.datos.ImagenId;
import com.curiam.client.datos.Referencia;
import com.curiam.client.datos.ResultBeanTPB;
import com.curiam.client.datos.nombreId;
import com.curiam.client.interfaz.Interfaz_portada;
import com.curiam.client.llamada.GreetingService;
import com.curiam.client.llamada.GreetingServiceAsync;
import com.extjs.gxt.ui.client.data.BaseModelData;
import com.extjs.gxt.ui.client.data.ModelType;
import com.extjs.gxt.ui.client.data.XmlReader;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.http.client.URL;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.PushButton;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.StackPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;




public class Acceso {

	// proxy de comunicación con el servidor
	private final GreetingServiceAsync greetingService = GWT
			.create(GreetingService.class);
		
	
	private String passwordAdmin = null;
	private String tb_log = null;
	private String tb_pass = null;
	
	
	public Acceso(){
	}
	
	public String getTb_log() {
		return tb_log;
	}

	public void setTb_log(String tbLog) {
		tb_log = tbLog;
	}

	public String getTb_pass() {
		return tb_pass;
	}

	public void setTb_pass(String tbPass) {
		tb_pass = tbPass;
	}

	
//Llama al servidor para leer el fichero xml y devolver un string
public void leerXML(String ruta){
	
		GreetingServiceAsync acc = GWT.create(GreetingService.class);
		acc.leerFichero(ruta, new AsyncCallback<String>() {
			
			public void onSuccess(String result) {
				if (result == null)
					Utiles.msj("Error", "No se ha cargado el archivo xml");
				else {
					
					ArrayList<nombreId> array_XML = new ArrayList<nombreId>();
					array_XML = parsear_usuarios(result);
					
					//comprobar datos de acceso
					boolean error = true;
					if(tb_log!=null && tb_pass!=null){
						if(tb_log.equals("") && tb_pass.equals("")){
							Utiles.msj("Error", "Introduzca el nombre de usuario y la contrase&ntilde;a");
							error = false;
						}	
						
						for(int i=0; i<array_XML.size(); i++){
							if(tb_log.equals(array_XML.get(i).getNombre()) && tb_pass.equals(array_XML.get(i).getPassword())){
								Analisis An = new Analisis(tb_log);
								error = false;
							}
						}
					
						if(error)
							Utiles.msj("Error", "Aseg&uacute;rese de que el nombre de usuario y la contrase&ntilde;a son correctos");
						}
				}
			}
		
			public void onFailure(Throwable caught) {
				Utiles.msj("Error", "El servidor no responde.");
			}
		});
	}


//lee un string con datos xml y lo pasa a un array
public ArrayList<nombreId> parsear_usuarios(String datosXML){
	
	ArrayList<nombreId> array_XML = new ArrayList<nombreId>();
	
	ModelType type = new ModelType();
	type.setRoot("escritorios");
	type.setRecordName("escritorio");
	type.addField("passwordAdmin");
	type.addField("passwordUser");
	type.addField("id");
	type.addField("nombre");
	
	XmlReader reader = new XmlReader(type);
	ArrayList arr = (ArrayList)reader.read(null, datosXML);
	

	BaseModelData data;
	
	for(int i=0; i<arr.size(); i++){
		data = (BaseModelData)arr.get(i);
		int id = Integer.parseInt((String)data.get("id"));
		String nombre = (String)data.get("nombre");
		String password = (String)data.get("passwordUser");
		array_XML.add(new nombreId(id,nombre,password));
	}
	return array_XML;
}


//escribe los datos en el archivo xml
public void escribirXML(String ruta, String datos){
		
		GreetingServiceAsync acc2 = GWT.create(GreetingService.class);
		acc2.guardarEnFichero(ruta,datos, new AsyncCallback<Boolean>() {
			
			public void onSuccess(Boolean result) {
				if (result == false)
					Utiles.msj("Error", "No se ha podido escribir en el archivo xml");
				
			}
			
			public void onFailure(Throwable caught) {
				Utiles.msj("Error", "El servidor no responde.");
			}
			
		});
		
		
	}


//borrar un fichero del servidor
public void eliminar_fichero(String ruta, final DialogBox db){
	GreetingServiceAsync acc = GWT.create(GreetingService.class);
	acc.eliminarFichero(ruta, new AsyncCallback<Boolean>() {

		@Override
		public void onFailure(Throwable caught) {
			// TODO Auto-generated method stub
			Utiles.msj("Error", "El servidor no responde, intentelo más tarde");
			return;
		}

		@Override
		public void onSuccess(Boolean result) {
			// TODO Auto-generated method stub
			if(result==false)
				Utiles.msj("Error", "No se han podido borrar sus datos");
			else
				db.hide();
				portada();
				
		}
	
	});
}

//volver al inicio
public void portada(){
	final Interfaz_portada index = new Interfaz_portada();
}

//inserta la informacion de un usuario
public void comprovar_pass(final String user, final String pass, final DialogBox db){
	GreetingServiceAsync acc = GWT.create(GreetingService.class);
	acc.leerFichero("config/usuarios.xml", new AsyncCallback<String>() {

		@Override
		public void onFailure(Throwable caught) {
			// TODO Auto-generated method stub
			Utiles.msj("Error", "El servidor no responde, intentelo m&aacute;s tarde");
		}

		@Override
		public void onSuccess(String result) {
			// TODO Auto-generated method stub
			if(result==null){
				Utiles.msj("Error", "No se ha cargado el archivo xml");
			}else{
				ArrayList<nombreId> usuarios = parsear_usuarios(result);
				for(int i=0;i<usuarios.size();i++){
					if(usuarios.get(i).getNombre().equals(user))
						 if(usuarios.get(i).getPassword().equals(pass)){
							 
							 usuarios.remove(i);
							 
							 String datos = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
							 datos += "<!-- Configuracion de escritorios -->\n";
							 datos += "<escritorios>\n";
	    			    	
							 for(int j=0;j<usuarios.size();j++){
								 datos += "\t<escritorio>\n";
								 datos += "\t\t<passwordUser>" + usuarios.get(j).getPassword() + "</passwordUser>\n";
								 datos += "\t\t<nombre>" + usuarios.get(j).getNombre() + "</nombre>\n";
								 datos += "\t\t<id>" + usuarios.get(j).getId() + "</id>\n";
								 datos += "\t</escritorio>\n";
							 }
							 
							 datos += "</escritorios>";	 
							 
							 escribirXML("config/usuarios.xml",datos);
							 eliminar_fichero("config/"+user,db);
							 
						 }else
							 Utiles.msj("Error", "La contrase&ntilde;a es incorrecta");
				}
			}
		}
	});
}


//lee los casos para que sean seleccionados en el dialogbox
public void leer_analisis_xml(final String ruta, final VerticalPanel vp){
	
	GreetingServiceAsync acc = GWT.create(GreetingService.class);
	acc.leerFichero(ruta, new AsyncCallback<String>() {

		@Override
		public void onFailure(Throwable caught) {
			Utiles.msj("Error", "El servidor no responde.");
		}

		@Override
		public void onSuccess(String result) {
			if (result == null)
				Utiles.msj("Error", "No se ha cargado el archivo xml");
			else {
				
				
				ModelType type = new ModelType();
				type.setRoot("resultados");
				type.setRecordName("resultado");
				type.addField("clasif");
				type.addField("prob1");
				type.addField("prob2");
				type.addField("prob3");
				type.addField("campos");
				type.addField("id"); 
				
		
				XmlReader reader = new XmlReader(type);
				ArrayList arr = (ArrayList)reader.read(null, result);
				
				if(arr.size()==0)
					return;
				
				
				BaseModelData data; //(BaseModelData)arr.get(0);
				
				
				for(int i=0; i<arr.size(); i++){
					data = (BaseModelData)arr.get(i);
					CheckBox cb = new CheckBox("Caso " + String.valueOf(Integer.parseInt((String)data.get("id"))+1));
					vp.add(cb);
				}
				
			}
		}
	});	
}


//pasamos a un vector los valores de un string	
public ArrayList<ImagenId> parsear_imagenes(String cadena){

	ArrayList<ImagenId> imgs = new ArrayList<ImagenId>();
	
	
	ModelType type = new ModelType();
	type.setRoot("files");
	type.setRecordName("file");
	type.addField("ruta");
	type.addField("id");
	
	XmlReader reader = new XmlReader(type);
	ArrayList arr = (ArrayList)reader.read(null, cadena);
	
	if(arr.size()==0)
		return null;
	
	BaseModelData data = (BaseModelData)arr.get(0);
		
		
	for(int i=0; i<arr.size(); i++){
		data = (BaseModelData)arr.get(i);
		int id = Integer.parseInt((String)data.get("id"));
		String img = (String)data.get("ruta");
		imgs.add(new ImagenId(id,img));
	}
	
	return imgs;
}

//borramos una imagen del servidor
public void borrar_imagen(final String user, final String imagen){
	GreetingServiceAsync acc = GWT.create(GreetingService.class);
	acc.eliminarFichero("config/"+user+"/"+imagen, new AsyncCallback<Boolean>() {

		@Override
		public void onFailure(Throwable caught) {
			// TODO Auto-generated method stub
			Utiles.msj("Error", "El servidor no responde, intentelo más tarde");
			return;
		}

		@Override
		public void onSuccess(Boolean result) {
			// TODO Auto-generated method stub
			if(result==false)
			Utiles.msj("Error", "No se ha podido borrar la imagen.");
		}
		
	});
	
	acc.leerFichero("config/"+user+"/ref.xml", new AsyncCallback<String>() {

		@Override
		public void onFailure(Throwable caught) {
			// TODO Auto-generated method stub
			Utiles.msj("Error", "El servidor no responde, intentelo más tarde");
			return;
		}

		@Override
		public void onSuccess(String result) {
			// TODO Auto-generated method stub
			if(result==null){
				Utiles.msj("Error", "No se ha cargado el archivo xml");
			}else{
				ArrayList<Referencia> ref = parsear_referencias(result);
				if(ref==null)
					return;
				boolean referencias = false;
				for(int i=0;i<ref.size();i++)
					if(ref.get(i).getImagen().equals(imagen)){
						ref.remove(i);
						referencias = true;
					}
				
				if(referencias){
					
					String datos = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
					datos += "<!-- Configuracion de referencias -->\n";
					datos += "<refs>\n";
					for(int i=0;i<ref.size();i++){
						
						String formatref = new String("");
						for(int j=0;j<ref.get(i).getReferencias().size()-1;j++)
							formatref += String.valueOf(ref.get(i).getReferencias().get(j))+"-";
						formatref += String.valueOf(ref.get(i).getReferencias().get(ref.get(i).getReferencias().size()-1));
						
						datos += "\t<ref>\n";
						datos += "\t\t<img>" + ref.get(i).getImagen() + "</img>\n";
						datos += "\t\t<caso>" + formatref + "</caso>\n";
						datos += "\t\t<id>" + ref.get(i).getId() + "</id>\n";
						datos += "\t</ref>\n";
					}
					datos += "</refs>";
					
					escribirXML("config/"+user+"/ref.xml", datos);
				}
			}
		}
	});
	
	acc.leerFichero("config/"+user+"/img.xml", new AsyncCallback<String>() {

		@Override
		public void onFailure(Throwable caught) {
			// TODO Auto-generated method stub
			Utiles.msj("Error", "El servidor no responde, intentelo más tarde");
			return;
		}

		@Override
		public void onSuccess(String result) {
			// TODO Auto-generated method stub
			if(result==null){
				Utiles.msj("Error", "No se ha cargado el archivo xml");
			}else{
				
				ArrayList<ImagenId> imgs = parsear_imagenes(result);
				
				if(imgs==null)
					return;
				
				boolean imagenes = false;
				for(int i=0;i<imgs.size();i++)
					if(imgs.get(i).getRuta().equals(imagen)){
						imgs.remove(i);
						imagenes = true;
					}
				
				if(imagenes){
					
					String datos = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
					datos += "<!-- Configuracion de referencias -->\n";
					datos += "<files>\n";
					for(int i=0;i<imgs.size();i++){
						datos += "\t<file>\n";
						datos += "\t\t<ruta>" + imgs.get(i).getRuta() + "</ruta>\n";
						datos += "\t\t<id>" + imgs.get(i).getId() + "</id>\n";
						datos += "\t</file>\n";
					}
					datos += "</files>";
					
					escribirXML("config/"+user+"/img.xml", datos);
				}
			}
		}
	});

}

//lee las imágenes para que sean seleccionadas en el dialogbox
public void leer_imagenes_xml(final String user, final HorizontalPanel vp, final StackPanel panel){

	GreetingServiceAsync acc = GWT.create(GreetingService.class);
	acc.leerFichero("config/" + user + "/img.xml", new AsyncCallback<String>() {

		@Override
		public void onFailure(Throwable caught) {
			Utiles.msj("Error", "El servidor no responde.");
		}
		int cont=0;
		@Override
		public void onSuccess(String result) {
			if (result == null)
				Utiles.msj("Error", "No se ha cargado el archivo xml");
			else {
				final ArrayList<String> imagenes = new ArrayList<String>();
				ArrayList<Integer> id = new ArrayList<Integer>();
				
				
				ModelType type = new ModelType();
				type.setRoot("files");
				type.setRecordName("file");
				type.addField("ruta");
				type.addField("id");
				
				
				if(!result.equals("")){
					XmlReader reader = new XmlReader(type);
					ArrayList arr = (ArrayList)reader.read(null, result);
				
					cont = arr.size();
					BaseModelData data;// = (BaseModelData)arr.get(0);
					
					
					for(int i=0; i<cont; i++){
						data = (BaseModelData)arr.get(i);
						imagenes.add((String)data.get("ruta"));
					}
					
				}
				
				
				//creamos la estructura del minipanel de cada imagen
				for(int i=0;i<imagenes.size();i++){
				final Grid t_ext = new Grid(2,1);
		    	final Grid t_int = new Grid(1,2);
		    	final CellFormatter der = t_ext.getCellFormatter();
		    	
				der.setHorizontalAlignment(0, 0, HasHorizontalAlignment.ALIGN_RIGHT);
				
		    	Image img_x = new Image();
		    	img_x.setUrl("curiam/images/cancel-upld.gif");
		    
		    	final int posicion = i;
		    	final PushButton b_cerrar = new PushButton(img_x,
						
						new ClickHandler() {
							public void onClick(ClickEvent event) {
								
								Grid t1 = (Grid) vp.getWidget(posicion);
								Image img_ = (Image) t1.getWidget(1, 0);
								
								String nombre[] = URL.decode(img_.getUrl()).split("/");
								borrar_imagen(user,nombre[nombre.length-1]);
								
								vp.setVisible(t1.getElement(), false);
								
								
								for(int j=0;j<panel.getWidgetCount();j++){
									Grid tp1 = (Grid) panel.getWidget(j);
									Grid tp2 = (Grid) tp1.getWidget(0, 1);
									Image imp = (Image) tp2.getWidget(0, 1);
									
									if(imp!=null && imp.getUrl().equals(img_.getUrl()))
										tp2.remove(imp);
								}
						}
			    });
		    	b_cerrar.setStyleName("vinculo_analisis");
		    	
		    
				RadioButton rb = new RadioButton("color", "");
			
				Image image = new Image();
				image.setUrl("config/"+user+"/"+imagenes.get(i));
		    
		    	t_ext.setWidget(0, 0, t_int);
		    	t_ext.setWidget(1, 0, image);
		    	
		    	t_int.setWidget(0, 0, rb);
		    	t_int.setWidget(0, 1, b_cerrar);
		    	
		      //RadioButton rb = new RadioButton();
		      image.setHeight("100px");
		      image.setWidth("100px");
		      
		      vp.add(t_ext);
		      
			}
		}
			
	}
		
	});

	
}



//actualiza el conjunto de casos asignado a cada imagen
public void actualizar_referencias(final String ruta, final String r, final ArrayList<Integer> q){
	
	final String[] userxml = ruta.split("/");
	GreetingServiceAsync acc = GWT.create(GreetingService.class);
	acc.leerFichero(ruta, new AsyncCallback<String>() {

		@Override
		public void onFailure(Throwable caught) {
			Utiles.msj("Error", "El servidor no responde, vuelva a intentarlo más tarde");
		}

		@Override
		public void onSuccess(String result) {
			if (result == null)
				Utiles.msj("Error", "No se ha cargado el archivo xml");
			else {
				
				ArrayList<Referencia> ref = new ArrayList<Referencia>();
				ref = parsear_referencias(result);
				if(ref==null)
					return;
			
				
				ArrayList<Integer> nuevas = new ArrayList<Integer>();
				boolean existe = false;
				boolean nueva = true;
				
				
				//borramos donde estaban ubicadas anteriormente las nuevas referencias
				for(int n=0;n<q.size();n++)
					for(int i=0;i<ref.size();i++)
						for(int j=0;j<ref.get(i).getReferencias().size();j++)
							if(q.get(n)==ref.get(i).getReferencias().get(j))
								ref.get(i).getReferencias().remove(j);
				
				
				//eliminamos las tuplas que hayan quedado sin referencias
				for(int i=0;i<ref.size();i++)
					if(ref.get(i).getReferencias().size()==0)
						ref.remove(i);
				
				
				//si existe la imagen ir a esa tupla y poner las referencias que no estén ya
				for(int i=0;i<ref.size();i++){
					if(ref.get(i).getImagen().equals(r)){
						for(int j=0;j<q.size();j++){
							existe=false;
							for(int k=0;k<ref.get(i).getReferencias().size();k++)
								if(q.get(j)==ref.get(i).getReferencias().get(k))
									existe=true;
							if(!existe){
								nuevas.add(q.get(j));
								nueva=false;
							}
						}
						
						for(int j=0;j<nuevas.size();j++)
							ref.get(i).setReferencia(nuevas.get(j));
					}
				}
				
				//sino existe la imagen la añadimos en la última tupla junto con sus referencias
				if(nueva){
					Referencia rr = new Referencia();
					if(ref.size()==0)
						rr.setId(0);
					else
						rr.setId(ref.get(ref.size()-1).getId()+1);
					rr.setImagen(r);
					rr.setReferencias(q);
					ref.add(rr);
				}
				
				
				//dar formato xml y guardar datos
				String datos = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
				datos += "<!-- Configuracion de referencias -->\n";
				datos += "<refs>\n";
				
				for(int i=0;i<ref.size();i++){
					String refes = new String("");
					for(int j=0;j<ref.get(i).getReferencias().size();j++){
						refes += ref.get(i).getReferencias().get(j);
						if(j<ref.get(i).getReferencias().size()-1)
							refes += "-";
					}
						
					datos += "\t<ref>\n";
	    			datos += "\t\t<img>" + ref.get(i).getImagen() + "</img>\n";
	    			datos += "\t\t<caso>" + refes + "</caso>\n";
	    			datos += "\t\t<id>" + ref.get(i).getId() + "</id>\n";
	    			datos += "\t</ref>\n";
	    		}
				datos += "</refs>";
				escribirXML("config/"+userxml[1]+"/ref.xml",datos);
				
				/*
				//imprimir resultados
				for(int p=0;p<ref.size();p++){
					String uu = new String("");
					uu = ref.get(p).id+" "+ref.get(p).getImagen()+" ";
					for(int p1=0;p1<ref.get(p).getReferencias().size();p1++)
						uu += ref.get(p).referencias.get(p1)+" ";
					Utiles.msj("qq", uu);
				}*/
				
			}
		}
	});
}


//pasamos a un vector los valores de un string	
public ArrayList<Referencia> parsear_referencias(String cadena){

	ArrayList<Referencia> refs = new ArrayList<Referencia>();
	
	
	ModelType type = new ModelType();
	type.setRoot("refs");
	type.setRecordName("ref");
	type.addField("img");
	type.addField("caso");
	type.addField("id");
	
	if(cadena.length()<89)
		return refs;
	XmlReader reader = new XmlReader(type);
	ArrayList arr = (ArrayList)reader.read(null, cadena);
	
	if(arr.size()==0)
		return null;
	
	BaseModelData data = (BaseModelData)arr.get(0);
		
		
	for(int i=0; i<arr.size(); i++){
		data = (BaseModelData)arr.get(i);
		int id = Integer.parseInt((String)data.get("id"));
		String img = (String)data.get("img");
		String caso = (String)data.get("caso");
		String[] casos = caso.split("-");
		
		ArrayList<Integer> cass = new ArrayList<Integer>();
		for(int j=0;j<casos.length;j++)
			cass.add(Integer.parseInt(casos[j]));

		refs.add(new Referencia(id,img,cass));
	}
	
	return refs;
}

/********************************************/
/***  FUNCION QUE DIBUJA UN CASO MÉDICO   ***/
/********************************************/

public void solapa(final StackPanel panel, int pos, final String ruta, final ArrayList<ResultBeanTPB> array_XML_result, final ArrayList<String> refcaso, String result, boolean inici){
	
	
	/*****************************/
	/*** Parámetros de entrada ***/
	/*****************************/
	
	
	final HTML lb1 = new HTML();
	final HTML lb2 = new HTML();
	final HTML lb3 = new HTML();
	final HTML lb4 = new HTML();
	final HTML lb5 = new HTML();
	final HTML lb6 = new HTML();
	final HTML lb7 = new HTML();
	final HTML lb8 = new HTML();
	final HTML lb9 = new HTML();
	final HTML lb10 = new HTML();
	final HTML lb11 = new HTML();
	final HTML lb12 = new HTML();
	final HTML lb13 = new HTML();
	final HTML lb14 = new HTML();
	final HTML lb15 = new HTML();
	final HTML lb16 = new HTML();
	final HTML lb17 = new HTML();
	final HTML lb18 = new HTML();
	final HTML lb19 = new HTML();
	final HTML lb20 = new HTML();
	final HTML lb21 = new HTML();
	final HTML lb22 = new HTML();
	final HTML lb23 = new HTML();
	final HTML lb24 = new HTML();

	
	final ListBox campo1 = new ListBox();
	final TextBox campo2 = new TextBox();
	final ListBox campo3 = new ListBox();
	final ListBox campo4 = new ListBox();
	final TextBox campo5 = new TextBox();
	final ListBox campo6 = new ListBox();
	final ListBox campo7 = new ListBox();
	final ListBox campo8 = new ListBox();
	final ListBox campo9 = new ListBox();
	final ListBox campo10 = new ListBox();
	final ListBox campo11 = new ListBox();
	final ListBox campo12 = new ListBox();
	final ListBox campo13 = new ListBox();
	final ListBox campo14 = new ListBox();
	final ListBox campo15 = new ListBox();
	final ListBox campo16 = new ListBox();
	final ListBox campo17 = new ListBox();
	final ListBox campo18 = new ListBox();
	final ListBox campo19 = new ListBox();
	final ListBox campo20 = new ListBox();
	final ListBox campo21 = new ListBox();
	final ListBox campo22 = new ListBox();
	final ListBox campo23 = new ListBox();
	final ListBox campo24 = new ListBox();

	
	final FlexTable tab_par = new FlexTable();
	final FlexCellFormatter der = tab_par.getFlexCellFormatter();
	
	final Grid t_ext1 = new Grid(1,2);
	final Grid t_ext2 = new Grid(1,2);
	final Grid t_ext3 = new Grid(2,1);
	
		
	/*******************************/
	/** Entrada de datos clínicos **/
	/*******************************/
	
	Utiles u = new Utiles();
	lb1.setHTML(u.f("Tipo de an&aacute;lisis:"));
	lb2.setHTML(u.f("Edad:"));
	lb3.setHTML(u.f("Presentaci&oacute;n cl&iacute;nica:"));
	lb4.setHTML(u.f("Ubicaci&oacute;n:"));
	lb5.setHTML(u.f("Tama&ntilde;o:"));
	lb6.setHTML(u.f("Forma:"));
	lb7.setHTML(u.f("Extensiones hiperintensas T1:"));
	lb8.setHTML(u.f("Intensidad de la se&ntilde;al T1:"));
	lb9.setHTML(u.f("Intensidad de la se&ntilde;al T2:"));
	lb10.setHTML(u.f("M&aacute;rgenes:"));
	lb11.setHTML(u.f("Homogeneidad:"));
	lb12.setHTML(u.f("Edema:"));
	lb13.setHTML(u.f("Multiplicidad:"));
	lb14.setHTML(u.f("Objetivo de la apariencia:"));
	lb15.setHTML(u.f("Dependencia:"));
	lb16.setHTML(u.f("Atrofia muscular:"));
	lb17.setHTML(u.f("Calcificaci&oacute;n:"));
	lb18.setHTML(u.f("Vasos:"));
	lb19.setHTML(u.f("Hemorragia intratumoral:"));
	lb20.setHTML(u.f("Grasa:"));
	lb21.setHTML(u.f("Fibrosis:"));
	lb22.setHTML(u.f("Relaci&oacute;n facial:"));
	lb23.setHTML(u.f("Alteraci&oacute;n &oacute;sea:"));
	lb24.setHTML(u.f("Car&aacute;cter de lesi&oacute;n:"));
	
	
	campo1.setPixelSize(140, 20);
	campo2.setPixelSize(140, 20);
	campo3.setPixelSize(140, 20);
	campo4.setPixelSize(140, 20);
	campo5.setPixelSize(140, 20);
	campo6.setPixelSize(140, 20);
	campo7.setPixelSize(140, 20);
	campo8.setPixelSize(140, 20);
	campo9.setPixelSize(140, 20);
	campo10.setPixelSize(140, 20);
	campo11.setPixelSize(140, 20);
	campo12.setPixelSize(140, 20);
	campo13.setPixelSize(140, 20);
	campo14.setPixelSize(140, 20);
	campo15.setPixelSize(140, 20);
	campo16.setPixelSize(140, 20);
	campo17.setPixelSize(140, 20);
	campo18.setPixelSize(140, 20);
	campo19.setPixelSize(140, 20);
	campo20.setPixelSize(140, 20);
	campo21.setPixelSize(140, 20);
	campo22.setPixelSize(140, 20);
	campo23.setPixelSize(140, 20);
	campo24.setPixelSize(140, 20);

	
	//llenamos los combobox
	
	campo1.addItem("N/A");
	campo1.addItem("3_TPB_BM_knn_001");
	campo1.addItem("22_TPB_VCF_knn_001");
	
	campo3.addItem("N/A");
	campo3.addItem("Masa");
	campo3.addItem("Dolor");
	campo3.addItem("Tumor");
	campo3.addItem("Sintomas neurologicos");
	campo3.addItem("Alteraciones cutaneas");
	campo3.addItem("Asintomatica");
	
	campo4.addItem("N/A");
	campo4.addItem("Subcutanea");
	campo4.addItem("Intramuscular");
	campo4.addItem("Intermuscular");
	campo4.addItem("Intraarticular");
	
	campo6.addItem("N/A");
	campo6.addItem("Redondeada");
	campo6.addItem("Ovalada");
	campo6.addItem("Lobulada");
	campo6.addItem("Serpinginosa");
	campo6.addItem("Fusiforme");
	campo6.addItem("Cordon");
	campo6.addItem("Irregular");
	
	campo7.addItem("N/A");
	campo7.addItem("No");
	campo7.addItem("Si");
	
	campo8.addItem("N/A");
	campo8.addItem("Hipointensa");
	campo8.addItem("Isointensa");
	campo8.addItem("Hiperintensa");
	campo8.addItem("Muy hiperintensa");
	
	campo9.addItem("N/A");
	campo9.addItem("Hipointensa");
	campo9.addItem("Isointensa");
	campo9.addItem("Hiperintensa");
	
	campo10.addItem("N/A");
	campo10.addItem("Infiltrativos");
	campo10.addItem("Bien definidos");
	campo10.addItem("No infiltrativos");
	
	campo11.addItem("N/A");
	campo11.addItem("Muy heterogeneo");
	campo11.addItem("Heterogeneo");
	campo11.addItem("Homogeneo");
	campo11.addItem("Muy homogeneo");
	
	campo12.addItem("N/A");
	campo12.addItem("No");
	campo12.addItem("Si");
	   
	campo13.addItem("N/A");
	campo13.addItem("Uno");
	campo13.addItem("Multiple");
	
	campo14.addItem("N/A"); 
	campo14.addItem("No"); 
	campo14.addItem("Si"); 
	
	campo15.addItem("N/A");
	campo15.addItem("No");
	campo15.addItem("Nervio");
	campo15.addItem("Tendon");
	campo15.addItem("Vaso");
	
	campo16.addItem("N/A");
	campo16.addItem("No");
	campo16.addItem("Si");
	
	
	campo17.addItem("N/A");
	campo17.addItem("No");
	campo17.addItem("Si");
	campo17.addItem("Flebolitos");
	
	campo18.addItem("N/A");
	campo18.addItem("No");
	campo18.addItem("Si");
	
	campo19.addItem("N/A");
	campo19.addItem("No");
	campo19.addItem("Si");
	
	
	campo20.addItem("N/A");
	campo20.addItem("No");
	campo20.addItem("Si, sin zonas hiperintensas T2-STIR");
	campo20.addItem("Si, con zonas hiperintensas T2-STIR");
	
	campo21.addItem("N/A");
	campo21.addItem("No");
	campo21.addItem("Si, irregular");
	campo21.addItem("Si, hemosiderina");
	
	campo22.addItem("N/A");
	campo22.addItem("Sin contacto");
	campo22.addItem("Contacto Leve");
	campo22.addItem("Angluos agudos");
	campo22.addItem("Angluos obtusos");
	campo22.addItem("Penetracion facial");
	campo22.addItem("Origen facial");
	
	campo23.addItem("N/A");
	campo23.addItem("No");
	campo23.addItem("Si, erosion-invasion");
	campo23.addItem("Si, remodelado-reaccion");
	
	campo24.addItem("N/A");
	campo24.addItem("Benigno");
	campo24.addItem("Maligno");

	//anlizar caso
	final Button b_analisis = new Button("<font size=3>An&aacute;lisis</font>",
			
			new ClickHandler() {
	
			public void onClick(ClickEvent event) {
				
				//si algun parametro no es correcto no llama al servidor
				if(campo1.getSelectedIndex()==0 || campo2.getText()==null || campo3.getSelectedIndex()==0
					|| campo4.getSelectedIndex()==0 || campo5.getText()==null || campo6.getSelectedIndex()==0
					|| campo7.getSelectedIndex()==0 || campo8.getSelectedIndex()==0 || campo9.getSelectedIndex()==0 
					|| campo10.getSelectedIndex()==0 || campo11.getSelectedIndex()==0 || campo12.getSelectedIndex()==0 
					|| campo13.getSelectedIndex()==0 || campo14.getSelectedIndex()==0 || campo15.getSelectedIndex()==0 
					|| campo16.getSelectedIndex()==0 || campo17.getSelectedIndex()==0 || campo18.getSelectedIndex()==0 
					|| campo19.getSelectedIndex()==0 || campo20.getSelectedIndex()==0 || campo21.getSelectedIndex()==0 
					|| campo22.getSelectedIndex()==0 || campo23.getSelectedIndex()==0 || campo24.getSelectedIndex()==0 
				){
					Utiles.msj("Error", "Compruebe que haya elegido todos los campos.");
					return;
				}
				// clase con los parametros de entrada
				final CaseBeanTPB caseBeanTPB = new CaseBeanTPB(campo1.getItemText(campo1.getSelectedIndex()), campo2.getText(), campo3.getSelectedIndex(),campo4.getSelectedIndex(),campo5.getText(),campo6.getSelectedIndex(),
						campo7.getSelectedIndex(), campo8.getSelectedIndex(), campo9.getSelectedIndex(), campo10.getSelectedIndex(), campo11.getSelectedIndex(), campo12.getSelectedIndex(), campo13.getSelectedIndex(),
						campo14.getSelectedIndex(), campo15.getSelectedIndex(), campo16.getSelectedIndex(), campo17.getSelectedIndex(), campo18.getSelectedIndex(), campo19.getSelectedIndex(), campo20.getSelectedIndex(),
						campo21.getSelectedIndex(), campo22.getSelectedIndex(), campo23.getSelectedIndex(), campo24.getSelectedIndex());
					
				final String seleccion = campo1.getSelectedIndex() + "-" + campo2.getText() + "-" + campo3.getSelectedIndex() + "-" + campo4.getSelectedIndex() + "-" + campo5.getText() + "-" + campo6.getSelectedIndex() + "-" + 
				campo7.getSelectedIndex() + "-" + campo8.getSelectedIndex() + "-" + campo9.getSelectedIndex() + "-" + campo10.getSelectedIndex() + "-" + campo11.getSelectedIndex() + "-" + campo12.getSelectedIndex() + "-" + campo13.getSelectedIndex() + "-" + 
				campo14.getSelectedIndex() + "-" + campo15.getSelectedIndex() + "-" + campo16.getSelectedIndex() + "-" + campo17.getSelectedIndex() + "-" + campo18.getSelectedIndex() + "-" + campo19.getSelectedIndex() + "-" + campo20.getSelectedIndex() + "-" + 
				campo21.getSelectedIndex() + "-" + campo22.getSelectedIndex() + "-" + campo23.getSelectedIndex() + "-" + campo24.getSelectedIndex();		
							
				//llamada al servidor donde interactua con el motor de clasificación
				greetingService.greetServer(caseBeanTPB,
					new AsyncCallback<ResultBeanTPB>() {
						public void onFailure(Throwable caught) {
								Utiles.msj("Error", "Compruebe que haya elegido todos los campos.");
						}

						public void onSuccess(final ResultBeanTPB result) {
							
							
							Grid aux1 = (Grid) panel.getWidget(panel.getSelectedIndex());
							Grid aux2 = (Grid) aux1.getWidget(0, 1);
							Grid aux3 = (Grid) aux2.getWidget(0, 0);
							
							
							
							
							int aux=0;
							if(array_XML_result!=null)
								aux=array_XML_result.size();
							
							//si es un nuevo analisis lo agregamos a la lista
							if(aux3.getWidget(0, 0)==null){
								String datos = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
								datos += "<!-- Configuracion de usuario -->\n";
								datos += "<resultados>\n";
								for(int d=0;d<aux;d++){
									datos += "\t<resultado>\n";
				    			    datos += "\t\t<clasif>" + array_XML_result.get(d).getClasificador() + "</clasif>\n";
				    			    datos += "\t\t<prob1>" + array_XML_result.get(d).getProbabilities().get(0) + "</prob1>\n";
				    			    datos += "\t\t<prob2>" + array_XML_result.get(d).getProbabilities().get(1) + "</prob2>\n";
				    			    datos += "\t\t<prob3>" + array_XML_result.get(d).getProbabilities().get(2) + "</prob3>\n";
				    			    datos += "\t\t<campos>" + array_XML_result.get(d).getCampos() + "</campos>\n";
				    			    datos += "\t\t<id>" + d + "</id>\n";
				    			    datos += "\t</resultado>\n";
				    			 }
											
								datos += "\t<resultado>\n";
			    			    datos += "\t\t<clasif>" + caseBeanTPB.getCaseID() + "</clasif>\n";
			    			    datos += "\t\t<prob1>" + result.getProbabilities().get(0) + "</prob1>\n";
			    			    datos += "\t\t<prob2>" + result.getProbabilities().get(1) + "</prob2>\n";
			    			    if(result.getProbabilities().size()==2)
			    			    	datos += "\t\t<prob3>0</prob3>\n";
			    			    else
			    			    	datos += "\t\t<prob3>" + result.getProbabilities().get(2) + "</prob3>\n";
			    		
			    			    datos += "\t\t<campos>" + seleccion + "</campos>\n";
			    			    datos += "\t\t<id>" + aux + "</id>\n";
			    			    datos += "\t</resultado>\n";
			    			  
			    			    datos += "</resultados>";
							
				    			
				    			//se guarda el fichero con los datos
				    			escribirXML(ruta,datos);
			    			//si se renueva un analisis lo substituimos   
							}else{
								
								//se debe de leer el fichero user.xml por si se le han agregado nuevos casos.
								GreetingServiceAsync acc = GWT.create(GreetingService.class);
								acc.leerFichero(ruta, new AsyncCallback<String>() {

									@Override
									public void onFailure(Throwable caught) {
										// TODO Auto-generated method stub
										
									}

									@Override
									public void onSuccess(String rr) {
										// TODO Auto-generated method stub
										ArrayList<ResultBeanTPB> res = parsear_resultados(rr);
										
										String datos = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
										datos += "<!-- Configuracion de usuario -->\n";
										datos += "<resultados>\n";
										
										for(int d=0;d<panel.getSelectedIndex();d++){
											datos += "\t<resultado>\n";
						    			    datos += "\t\t<clasif>" + res.get(d).getClasificador() + "</clasif>\n";
						    			    datos += "\t\t<prob1>" + res.get(d).getProbabilities().get(0) + "</prob1>\n";
						    			    datos += "\t\t<prob2>" + res.get(d).getProbabilities().get(1) + "</prob2>\n";
						    			    datos += "\t\t<prob3>" + res.get(d).getProbabilities().get(2) + "</prob3>\n";
						    			    datos += "\t\t<campos>" + res.get(d).getCampos() + "</campos>\n";
						    			    datos += "\t\t<id>" + d + "</id>\n";
						    			    datos += "\t</resultado>\n";
						    			 }
										
										datos += "\t<resultado>\n";
					    			    datos += "\t\t<clasif>" + caseBeanTPB.getCaseID() + "</clasif>\n";
					    			    datos += "\t\t<prob1>" + result.getProbabilities().get(0) + "</prob1>\n";
					    			    datos += "\t\t<prob2>" + result.getProbabilities().get(1) + "</prob2>\n";
					    			    if(result.getProbabilities().size()==2)
					    			    	datos += "\t\t<prob3>0</prob3>\n";
					    			    else
					    			    	datos += "\t\t<prob3>" + result.getProbabilities().get(2) + "</prob3>\n";
					    			    datos += "\t\t<campos>" + seleccion + "</campos>\n";
					    			    datos += "\t\t<id>" + panel.getSelectedIndex() + "</id>\n";
					    			    datos += "\t</resultado>\n";
					    			    
										for(int d=panel.getSelectedIndex()+1;d<res.size();d++){
											
											datos += "\t<resultado>\n";
						    			    datos += "\t\t<clasif>" + res.get(d).getClasificador() + "</clasif>\n";
						    			    datos += "\t\t<prob1>" + res.get(d).getProbabilities().get(0) + "</prob1>\n";
						    			    datos += "\t\t<prob2>" + res.get(d).getProbabilities().get(1) + "</prob2>\n";
						    			    datos += "\t\t<prob3>" + res.get(d).getProbabilities().get(2) + "</prob3>\n";
						    			    datos += "\t\t<campos>" + res.get(d).getCampos() + "</campos>\n";
						    			    datos += "\t\t<id>" + d + "</id>\n";
						    			    datos += "\t</resultado>\n";
						    			 }
										
										 datos += "</resultados>";
											
							    			
							    		//se guarda el fichero con los datos
							    		escribirXML(ruta,datos);
									}
								
								});
								
								
								
								
								
								
								
								
							}
				    			
				    			result.setClasificador(caseBeanTPB.getCaseID());
				    			
				    			final BasicChartExample disc1 = new BasicChartExample(result);
				    			final GridExample ge = new GridExample(result);
				    			    		
								t_ext3.setWidget(0, 0, disc1);
								t_ext3.setWidget(1, 0, ge);
								
								
								String[] color = {"#006600", "#0033cc","#ff0000","#ffcc00"};
								String dades = new String("");
								String probs = new String("");
								
								for(int p=0;p<result.getProbabilities().size();p++){
									//if(result.getLegends().get(p).equals("nulo")) break;
									 dades += "<font color=" + color[p] + ">" + result.getLegends().get(p) + 
									 " " + NumberFormat.getFormat("00.0").format(result.getProbabilities().get(p)*100) + "%</font>&nbsp;&nbsp;";
									
									 probs += result.getProbabilities().get(p);
									 if( p<result.getProbabilities().size()-1)//&& !result.getLegends().get(p+1).equals("nulo"))
										probs += ",";
								}
								
								
								panel.setStackText(panel.getSelectedIndex(), "<h6>" +
										"<font size=2>Caso " + String.valueOf(panel.getSelectedIndex()+1)+" &nbsp;&nbsp;&nbsp;</font>" +
										"<img src='http://chart.apis.google.com/chart?cht=p&chd=t:" + probs + "&chs=100x100&chco=80b37b|8099e1|ff807b' width='35' height='35' />" +
										"&nbsp;&nbsp;&nbsp;<font size=2>" + caseBeanTPB.getCaseID() + "&nbsp;&nbsp;&nbsp;" + dades + "</font>" +
										"</h6>", true);
								
							}
						});
					}
			});


	/** tabla de parámetros **/

	tab_par.addStyleName("borde_base");
	tab_par.setPixelSize(290, 1000);

	for(int j=1;j<=47;j+=2)
		der.setHorizontalAlignment(j, 1, HasHorizontalAlignment.ALIGN_LEFT);

	tab_par.setWidget(1, 0, new HTML("&nbsp;&nbsp;&nbsp;&nbsp;"));

	tab_par.setWidget(1, 1, lb1);
	tab_par.setWidget(3, 1, lb2);
	tab_par.setWidget(5, 1, lb3);
	tab_par.setWidget(7, 1, lb4);
	tab_par.setWidget(9, 1, lb5);
	tab_par.setWidget(11, 1, lb6);
	tab_par.setWidget(13, 1, lb7);
	tab_par.setWidget(15, 1, lb8);
	tab_par.setWidget(17, 1, lb9);
	tab_par.setWidget(19, 1, lb10);
	tab_par.setWidget(21, 1, lb11);
	tab_par.setWidget(23, 1, lb12);
	tab_par.setWidget(25, 1, lb13);
	tab_par.setWidget(27, 1, lb14);
	tab_par.setWidget(29, 1, lb15);
	tab_par.setWidget(31, 1, lb16);
	tab_par.setWidget(33, 1, lb17);
	tab_par.setWidget(35, 1, lb18);
	tab_par.setWidget(37, 1, lb19);
	tab_par.setWidget(39, 1, lb20);
	tab_par.setWidget(41, 1, lb21);
	tab_par.setWidget(43, 1, lb22);
	tab_par.setWidget(45, 1, lb23);
	tab_par.setWidget(47, 1, lb24);
	
	if(!inici){
		String[] sel = array_XML_result.get(pos).getCampos().split("-");
	
		campo1.setSelectedIndex(Integer.parseInt(sel[0]));
		campo2.setText(sel[1]);
		campo3.setSelectedIndex(Integer.parseInt(sel[2]));
		campo4.setSelectedIndex(Integer.parseInt(sel[3]));
		campo5.setText(sel[4]);
		campo6.setSelectedIndex(Integer.parseInt(sel[5]));
		campo7.setSelectedIndex(Integer.parseInt(sel[6]));
		campo8.setSelectedIndex(Integer.parseInt(sel[7]));
		campo9.setSelectedIndex(Integer.parseInt(sel[8]));
		campo10.setSelectedIndex(Integer.parseInt(sel[9]));
		campo11.setSelectedIndex(Integer.parseInt(sel[10]));
		campo12.setSelectedIndex(Integer.parseInt(sel[11]));
		campo13.setSelectedIndex(Integer.parseInt(sel[12]));
		campo14.setSelectedIndex(Integer.parseInt(sel[13]));
		campo15.setSelectedIndex(Integer.parseInt(sel[14]));
		campo16.setSelectedIndex(Integer.parseInt(sel[15]));
		campo17.setSelectedIndex(Integer.parseInt(sel[16]));
		campo18.setSelectedIndex(Integer.parseInt(sel[17]));
		campo19.setSelectedIndex(Integer.parseInt(sel[18]));
		campo20.setSelectedIndex(Integer.parseInt(sel[19]));
		campo21.setSelectedIndex(Integer.parseInt(sel[20]));
		campo22.setSelectedIndex(Integer.parseInt(sel[21]));
		campo23.setSelectedIndex(Integer.parseInt(sel[22]));
		campo24.setSelectedIndex(Integer.parseInt(sel[23]));
	}
	
	tab_par.setWidget(1, 2, campo1);
	tab_par.setWidget(3, 2, campo2);
	tab_par.setWidget(5, 2, campo3);
	tab_par.setWidget(7, 2, campo4);
	tab_par.setWidget(9, 2, campo5);
	tab_par.setWidget(11, 2, campo6);
	tab_par.setWidget(13, 2, campo7);
	tab_par.setWidget(15, 2, campo8);
	tab_par.setWidget(17, 2, campo9);
	tab_par.setWidget(19, 2, campo10);
	tab_par.setWidget(21, 2, campo11);
	tab_par.setWidget(23, 2, campo12);
	tab_par.setWidget(25, 2, campo13);
	tab_par.setWidget(27, 2, campo14);
	tab_par.setWidget(29, 2, campo15);
	tab_par.setWidget(31, 2, campo16);
	tab_par.setWidget(33, 2, campo17);
	tab_par.setWidget(35, 2, campo18);
	tab_par.setWidget(37, 2, campo19);
	tab_par.setWidget(39, 2, campo20);
	tab_par.setWidget(41, 2, campo21);
	tab_par.setWidget(43, 2, campo22);
	tab_par.setWidget(45, 2, campo23);
	tab_par.setWidget(47, 2, campo24);
	tab_par.setWidget(49, 2, b_analisis);
	

	ScrollPanel scroll = new ScrollPanel();
	scroll.setWidget(tab_par);
	scroll.setSize("310px", "460px");
	
	t_ext1.setPixelSize(880, 430);
	t_ext1.getCellFormatter().setWidth(0, 0, "256px");

	t_ext1.setWidget(0, 0, scroll);
	t_ext1.setWidget(0, 1, t_ext2);
	t_ext2.setWidget(0, 0, t_ext3);
	
	if(inici || array_XML_result==null || array_XML_result.size()==0){
		panel.add(t_ext1, "<font size=2>Nuevo Caso </font>", true);
		panel.showStack(panel.getWidgetCount()-1);

	}else{
		
	final GridExample ge = new GridExample(array_XML_result.get(pos));
	final BasicChartExample disc1 = new BasicChartExample(array_XML_result.get(pos));
	final Image img = new Image();
	
	img.setHeight("250px");
	img.setWidth("250px");

	if(result!=null && !refcaso.get(pos).equals("\0")){
		String[] subruta = ruta.split("/");
		img.setUrl("config/"+subruta[1]+"/"+refcaso.get(pos));
		t_ext2.setWidget(0, 1, img);
	}
	
	t_ext3.setWidget(0, 0, disc1);
	t_ext3.setWidget(1, 0, ge);
	
	
	
	String[] color = {"#006600", "#0033cc","#ff0000","#ffcc00"};
	String dades = new String("");
	String probs = new String("");
	
	for(int p=0;p<3;p++){
		if(array_XML_result.get(pos).getLegends().get(p).equals("nulo")) break;
		 dades += "<font color=" + color[p] + ">" + array_XML_result.get(pos).getLegends().get(p) + 
		 " " + NumberFormat.getFormat("00.0").format(array_XML_result.get(pos).getProbabilities().get(p)*100) + "%</font>&nbsp;&nbsp;";
		
		 probs += array_XML_result.get(pos).getProbabilities().get(p);
		 
		 if( p<2 && !array_XML_result.get(pos).getLegends().get(p+1).equals("nulo"))
			 probs += ",";
	}
	
	
		panel.add(t_ext1, "<h6>" +
				"<font size=2>Caso " + String.valueOf(pos+1)+" &nbsp;&nbsp;&nbsp;</font>" +
				"<img src='http://chart.apis.google.com/chart?cht=p&chd=t:" + probs + "&chs=100x100&chco=80b37b|8099e1|ff807b' width='35' height='35' />" +
				"&nbsp;&nbsp;&nbsp;<font size=2>" + array_XML_result.get(pos).getClasificador() + "&nbsp;&nbsp;&nbsp;" + dades + "</font>" +
				"</h6>", true);
	
	panel.showStack(pos);
	}
	
}





 //lista el stackpanel y sus elementos a partir de información guardada en xml
public StackPanel analizar_xml(final String ruta){
	final ArrayList<String> refcaso = new ArrayList<String>();
	final StackPanel panel = new StackPanel();
	
	//lee el xml de resultados
	GreetingServiceAsync acc = GWT.create(GreetingService.class);
	acc.leerFichero(ruta, new AsyncCallback<String>() {
		
		public void onSuccess(String result) {
			if (result == null)
				Utiles.msj("Error", "No se ha cargado el archivo xml");
			else {
				
				final ArrayList<ResultBeanTPB> array_XML_result = parsear_resultados(result);
				
				final int tam = array_XML_result.size();
				
				String[] subruta = ruta.split("/");
				
				//leer las referencias para asociar las imagenes
				GreetingServiceAsync acc = GWT.create(GreetingService.class);
				acc.leerFichero("config/"+subruta[1]+"/ref.xml", new AsyncCallback<String>() {
				
					@Override
					public void onFailure(Throwable caught) {
						Utiles.msj("Error", "No se ha cargado el archivo xml");
					}

					@Override
					public void onSuccess(String result) {
						
						ArrayList<Referencia> ref_analisis = new ArrayList<Referencia>();
						ref_analisis = parsear_referencias(result);
				
						
						for(int c=1;c<=tam;c++){
							boolean sinfoto = true;
							for(int i=0;i<ref_analisis.size();i++){
								for(int j=0;j<ref_analisis.get(i).getReferencias().size();j++){
									if(c==ref_analisis.get(i).getReferencias().get(j)){
										refcaso.add(ref_analisis.get(i).getImagen());
										sinfoto = false;
									}
											
								}
							}
							if(sinfoto)
								refcaso.add("\0");
						}
							
					
				//bucle con las solapas del stackpanel
						
				for(int i=0;i<tam;i++){
					solapa(panel,i, ruta,array_XML_result, refcaso, result,false);	
				}
				
				if(tam==0)
					solapa(panel,0, ruta,array_XML_result, null, null,true);
				
			}
			});
				
			
			}
		}
	
		public void onFailure(Throwable caught) {
			Utiles.msj("Error", "El servidor no responde.");
		}
		
	});
	
	
	return panel;
				
}


//pasa los valores del Sring en formato XML a un ArrayList
public ArrayList<ResultBeanTPB> parsear_resultados(String datosXML){
	
	ArrayList<ResultBeanTPB> array_XML_result = new ArrayList<ResultBeanTPB>();
	
	
	ModelType type = new ModelType();
	type.setRoot("resultados");
	type.setRecordName("resultado");
	type.addField("clasif");
	type.addField("prob1");
	type.addField("prob2");
	type.addField("prob3");
	type.addField("campos");
	type.addField("id"); 
	
	
	XmlReader reader = new XmlReader(type);
	ArrayList arr = (ArrayList)reader.read(null, datosXML);
	
	if(arr.size()==0)
		return array_XML_result;
	
	// Obtenemos la password del administrador
	BaseModelData data = (BaseModelData)arr.get(0);
	//passwordAdmin = (String)data.get("passwordAdmin");
	
	for(int i=0; i<arr.size(); i++){
		data = (BaseModelData)arr.get(i);
		
		int id = Integer.parseInt((String)data.get("id"));
		String clasificador = (String)data.get("clasif");
		ArrayList<Double> prs = new ArrayList<Double>();
		prs.add(Double.parseDouble((String)data.get("prob1")));
		prs.add(Double.parseDouble((String)data.get("prob2")));
		prs.add(Double.parseDouble((String)data.get("prob3")));
		String selec = (String)data.get("campos");
		if(clasificador.equals("22_TPB_VCF_knn_001")){
			ArrayList<String> lbs = new ArrayList<String>();
			ArrayList<String> lgs = new ArrayList<String>();
			lbs.add("1");
			lbs.add("2");
			lbs.add("3");
			lgs.add("Quiste");
			lgs.add("Grasa");
			lgs.add("Vascular");
			array_XML_result.add(new ResultBeanTPB(clasificador,prs,lbs,lgs,selec));
		}else if(clasificador.equals("3_TPB_BM_knn_001")){
			ArrayList<String> lbs = new ArrayList<String>();
			ArrayList<String> lgs = new ArrayList<String>();
			lbs.add("0");
			lbs.add("1");
			lbs.add("2");
			lgs.add("Benigno");
			lgs.add("Maligno");
			lgs.add("nulo");
			array_XML_result.add(new ResultBeanTPB(clasificador,prs,lbs,lgs,selec));
		}
		
	}
	return array_XML_result;
}

}
