//asistente = function(titulo, subtitulo, numPasos, direccion, form, config) {
asistente = function(config) {	
	
	this.form = config.form;
	this.config = config;
	//Asigna un id con el formato perfil
	this.config.id = config.titulo.replace(/ /g,'').toLowerCase().quitarAcentos();

	this.config.descripcion = config.titulo;
	config.collapsible = false;
	// cantidad de pasos del asistente
	this.numPasos = --config.numPasos;
	//punteros actual y proximo de la lista de paso
	this.iProxDir = 0;
	this.iActualDir = 0;
	
	this.direcciones = [];
	this.contenidos = [];
	this.validar = null;

	var dh = Ext.DomHelper;
	// crea el elemento para el asistente
	var el = dh.append(document.body, {tag: 'div', style: 'visibility:hidden;position:absolute;top:0px;'}, true);
	YAHOO.util.Dom.generateId(el);
	this.el = el;
	var tmpt = new Ext.Template( '<div class="x-dlg-hd">' + config.titulo + '</div>' +
									   '<div class="x-dlg-bd">' +
											'<div id="asTab" class="x-dlg-tab" title="' + config.subTitulo + '">' +
												'<div class="inner-tab"></div>' +
											'</div>' +
									    '</div>');
	
	tmpt.append(el.dom);
	var innerTab = YAHOO.util.Dom.getElementsByClassName('inner-tab', 'div', el.dom);
	YAHOO.util.Dom.generateId(innerTab[0]);
	this.innerTab = innerTab[0];
	
	// actualiza el asistente con la primera pagina
	var um = Ext.get(innerTab[0].id).getUpdateManager();
	um.disableCaching = true;
	um.showLoadIndicator = false;
	um.form = this.form;
	um.setRenderer({
				 	 render : function(el, o, um, callback ){
							var contenido = o.responseText.htmlDecode();
					  		contenido = contenido.replace(/%el%/g,el.id);
					  		contenido = contenido.replace(/%form%/g,um.form.name);
							el.update(contenido,true);
				     }
				    });
	

// registra la url y el contenido
	um.update(this.form.action);
	
	// llama al constructor de la clase padre
	asistente.superclass.constructor.call(this, el.id, config);	
	
	//escucha la tecla escape
	this.addKeyListener(27, this.hide, this);
	
	 // agrega el boton de ayuda si esta definida en el espacio global
	 if (YAHOO.gestorAST.editaAyuda){
		
		var botonEditarAyuda = {
								id:YAHOO.util.Dom.generateId().replace(/yui-gen/g,'botonAyuda'), 
								text: '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Editar ayuda',
								cls:'x-btn-text-icon editarAyuda',																			
								tooltip: {text:'Editor de ayuda contextual para ' +  config.titulo.toLowerCase(), title:'Editar ayuda.', autoHide:true},
								objeto: this
								};
		this.btnAyuda =	this.addButton(botonEditarAyuda, gestorAST.editarAyuda, this);
		
	}
	 // agrega el boton de ayuda si esta definida en el espacio global
	 if (YAHOO.gestorAST.verAyuda){
		
		var botonVerAyuda = {
								id:YAHOO.util.Dom.generateId().replace(/yui-gen/g,'botonAyuda'), 
								text: 'Ayuda',
								cls:'x-btn-text-icon ayuda',																			
								tooltip: {text:'Ayuda para ' + config.titulo.toLowerCase() , title:'Ayuda.', autoHide:true},
								objeto: this
								};
		this.botonVerAyuda =	this.addButton(botonVerAyuda, gestorAST.verAyuda, this);
		
	}
	


	// despliega los botones
	this.btnSiguiente =	this.addButton('Siguiente', this.siguiente, this);
	this.btnAnterior =	this.addButton('Anterior', this.atras, this);
	
	this.desplegarBotones();
	this.on('hide', this.destruir, this, true);

};

Ext.extend(asistente, Ext.BasicDialog, { 

	//despliga los botones adelante y atras validando el contexto
	desplegarBotones : function(){
		this.btnAnterior.hide();
		if (this.iActualDir > 0 ){
			this.btnAnterior.show();
		}
		if (this.iActualDir == this.numPasos  ){
			this.btnAnterior.hide();
			this.btnSiguiente.hide();
		}
	},
	// cuando siguiente o atras tuvo problemas	
	problemas : function(O){ 
		// despliega el error del servidor
		new mensaje('Error.',
					O.responseText,
					{ modal:true,
					  width:450,
					  height:300,
					  shadow:true,
					  closable:true }).show(this.getEl().dom.id);		
	},
	// cuando siguente es exitoso	
	siguienteExito : function(O){ 
		// actualiza el contenido del servidor
		this.validar = null;
		var contenido = O.responseText.htmlDecode().split('||');
		
		// actualiza el contenido actual
		if (contenido[1].indexOf('ERROR:') < 0){
			this.contenidos[this.iProxDir] = contenido[1];
			// actualiza el contenido anterior
			this.contenidos[this.iActualDir] = contenido[0];
			// aumenta lis contadores		
			this.iActualDir++;
			this.iProxDir++;		
			
			Ext.get(this.innerTab.id).update(contenido[1], true);
			//var url = document.getElementById(this.form).action;
			this.desplegarBotones();
		}else{
			contenido[1] = contenido[1].replace(/ERROR:/i, '');
			new mensaje('Error.',
					contenido[1],
					{ modal:true,
					  width:450,
					  height:300,
					  shadow:true,
					  closable:true }).show(this.getEl().dom.id);
		}
	},
	//somete el siguiente form
	siguiente : function(){
		var url = document.getElementById(this.form.id).action; 
		this.valido = true;
		// registra las urls actual y anterior
		if(this.iActualDir + 1 == this.iProxDir ){
			this.direcciones[this.iActualDir] = this.form.action;
			this.direcciones[this.iProxDir] = url;			
		}
		
		var callback = { success: this.siguienteExito.createDelegate(this) , 
				 failure: this.problemas.createDelegate(this),
				 timeout: 5000 
	 		       };
		//if (this.subirArchivo == true){
		//	YAHOO.util.Connect.setForm(this.form, this.subirArchivo, this.subirArchivo);
		//}else{
		
		if(this.validar){
			this.valido = this.validar.funcion();
		}
		
		if (this.valido){
			YAHOO.util.Connect.setForm(this.form.name, false);
			YAHOO.util.Connect.asyncRequest('POST', url, callback );
		}else{
			new mensaje(  this.validar.msgTitulo
					 ,this.validar.msgError 
					 ,{ modal   : true
					   ,width   : this.validar.msgWidth
					   ,height  : this.validar.msgHeight
					   ,shadow  : true
					   ,closable: true 
					 }
				   ).show();
		}
	
	},

	// somete el form anterior
	atras : function(){
		this.iActualDir--;
		this.iProxDir--;	
		
		getEl(this.innerTab.id).update(this.contenidos[this.iActualDir] , true);
		this.desplegarBotones();
		
	},
	destruir : function(){
		this.destroy(true);
		if (this.config.delegado){
			this.config.delegado();
		}
	}
	
  });

