// objeto A2 ABM Ajax personalizado
//constructor
var A2ABMAjax = function (nombre, app, codApp, appTitulo, coduser, tabla, opcion, codPlant, canalusr, divcontenedor, divdatos, divalta, divampliar, divestado, cargaArchivos) {
	//estado del objeto
	this.estado = 'creando';
	
	this.nombre = nombre;
	this.app = app;
	this.codApp = codApp;
	this.appTitulo = appTitulo;
	this.coduser = coduser;
	this.tabla = tabla;
	this.opcion = opcion;
	this.codPlant = codPlant;
	this.canalusr = canalusr;
	this.divcontenedor = divcontenedor;
	this.divdatos = divdatos;
	this.divalta = divalta;
	this.divampliar = divampliar;
	this.divestado = divestado;
	this.cargaArchivos = cargaArchivos;
	//variable que guarda el indice seleccionado de los datos
	this.seleccionado = null;
	//Objetos que contienen los objetos relacionados y el campo por el cual se relacionan.
	this.relacion;
	
	//variable que contiene los datos
	this.datos = [];
	//Parametros estandar de inicializacion
	this.pagActual = 0;
 	this.cantPorPag = 10;
	this.maxPag = 0;
	
	//variables de grafica
	//base
	this.graficaBase = '';
	//mostrar contenidos
	this.graficaMostrarEncabezado = '';
	this.graficaMostrarContenido = '';
	this.graficaMostrarPie = '';
	//menu de paginas
	this.graficaPagAnt = '';
	this.graficaPaginas = '';
	this.graficaPagSig = '';
	//formulario de alta
	this.graficaAlta = '';
	//grafica con la que amplia los datos
	this.graficaAmpliar = '';
	//formulario de modificacion
	this.graficaModificar = '';

	//mensajes
	this.mensajeSinDatos = 'Sin Datos';
	
	//botones
	this.botonAlta = '';
	this.botonAmpliar = '';
	this.botonModificar = '';
	this.botonBorrar = '';

	//scripts
	this.scriptMostrar = '';
	this.scriptAlta = '';
	this.scriptAmpliar = '';
	this.scriptModificar = '';
	this.scriptBorrar = '';
	
	//color de fondo del modal
	this.colorModal = '#e0a040';	
	this.formA2 = '<input type="hidden" name="fuseaction" value="#form.accion#">\
	<input type="hidden" name="codaplicacion"      value="' + this.codApp + '">\
	<input type="hidden" name="aplicacion"         value="' + this.app+ '">\
	<input type="hidden" name="app_titulo"         value="' + this.appTitulo + '">\
	<input type="hidden" name="codcontenido"       value="#form.codcontenido#">\
	<input type="hidden" name="codcanal"           value="' + this.tabla + '">\
	<input type="hidden" name="opccanal"           value="' + this.opcion + '">\
	<input type="hidden" name="codplant"           value="' + this.codPlant + '">\
	<input type="hidden" name="publica_desde"      value="#form.fecha#">\
	<input type="hidden" name="publica_desde_hora" value="00:00:00">\
	<input type="hidden" name="publica_hasta"      value="10/04/2037">\
	<input type="hidden" name="publica_hasta_hora" value="23:59:59">\
	<input type="hidden" name="canalusr"           value="' + this.canalusr + '">\
	<input type="hidden" name="coduser"            value="#form.coduser#">\
	<input type="hidden" name="compra"             value="NO">\
	<input type="hidden" name="altarel"            value="NO">';
	
	//debuguear
	this.debug = false;

	//estado del objeto
	this.estado = '';
}

//inicializacion del objeto
A2ABMAjax.prototype.Inicializar = function () {
	//Linea de debug
	if(this.debug) alert('inicializar=' + this.nombre);
	
	this.InicializarGrafica();
	this.InicializarScripts();
	this.InicializarDatos();
}

A2ABMAjax.prototype.InicializarGrafica = function () {
	//Linea de debug
	if(this.debug) alert('inicializarGrafica=' + this.nombre);
	
	//variables de grafica
	//Mostrar
	this.graficaMostrarEncabezado = this.ReemplazarObjeto(this.graficaMostrarEncabezado);
	this.graficaMostrarContenido = this.ReemplazarObjeto(this.graficaMostrarContenido);
	this.graficaMostrarPie = this.ReemplazarObjeto(this.graficaMostrarPie);
	//menu de paginas
	this.graficaPagAnt = this.ReemplazarObjeto(this.graficaPagAnt);
	this.graficaPaginas = this.ReemplazarObjeto(this.graficaPaginas);
	this.graficaPagSig = this.ReemplazarObjeto(this.graficaPagSig);
	//alta
	this.graficaAlta = this.ReemplazarObjeto(this.graficaAlta);
	//ampliar
	this.graficaAmpliar = this.ReemplazarObjeto(this.graficaAmpliar);
	//modificacion
	this.graficaModificar = this.ReemplazarObjeto(this.graficaModificar);
	//botones
	this.botonAlta = this.ReemplazarObjeto(this.botonAlta);
	this.botonAmpliar = this.ReemplazarObjeto(this.botonAmpliar);
	this.botonModificar = this.ReemplazarObjeto(this.botonModificar);
	this.botonBorrar = this.ReemplazarObjeto(this.botonBorrar);
}

A2ABMAjax.prototype.InicializarScripts = function () {
	//Linea de debug
	if(this.debug) alert('inicializarScripts=' + this.nombre);
	
	this.scriptMostrar = this.ReemplazarScripts(this.scriptMostrar);
	this.scriptAlta = this.ReemplazarScripts(this.scriptAlta);
	this.scriptAmpliar = this.ReemplazarScripts(this.scriptAlta);
	this.scriptModificar = this.ReemplazarScripts(this.scriptModificar);
	this.scriptBorrar = this.ReemplazarScripts(this.scriptBorrar);
}

A2ABMAjax.prototype.InicializarDatos = function () {
	//Linea de debug
	if(this.debug) alert('inicializarDatos=' + this.nombre);
	
	if(this.relacion.padre == null)	this.CargarDatos('Cargando ' + this.nombre);
}

//monstrar estado
A2ABMAjax.prototype.MostrarEstado = function (mensaje) {
	if ($.trim(this.divestado) != '') $('#' + this.divestado).html(mensaje);
}

//funcion que reemplaza relacionado con el objeto
A2ABMAjax.prototype.ReemplazarObjeto = function (valor) {
	return valor.replaceAll('#objeto.nombre#',this.nombre);
}

A2ABMAjax.prototype.ReemplazarScripts = function (valor) {
	return this.ReemplazarObjeto(valor);
}

//mostrado de datos
A2ABMAjax.prototype.Dibujar = function () {
	var salida = this.graficaBase;
	
	//pongo botones
	//si la tabla es relacionada y el padre tiene algun seleccionado que no sea todos, entones habilito el boton alta
	if ((this.relacion.padre == null) || (this.relacion.padre.seleccionado != -1)) {
		salida = salida.replaceAll('#objeto.alta#', this.botonAlta);
	} else {
		salida = salida.replaceAll('#objeto.alta#', '');
	}
	//meto botones por si se usa el modo select salvo que el indice sea -1 y pongo nada
	salida = salida.replaceAll('#objeto.modificar#', this.botonModificar).replaceAll('#objeto.borrar#', this.botonBorrar);

	if(this.datos.length > 0) { 
		//calculo la cantidad de paginas
		this.maxPag = Math.ceil(this.datos.length / this.cantPorPag);
		//calculo que al borrar no quede en una pagina sin datos
		if (this.pagActual >= this.maxPag) {this.pagActual = this.maxPag -1;}
		//calculo el inicio de pagina
		var inicio = this.pagActual * this.cantPorPag;
		//calculo el fin de pagina
		var fin = 0;
		if (this.datos.length > inicio + this.cantPorPag) {
			fin = inicio + this.cantPorPag;
		} else {
			fin = this.datos.length;
		}
		//creo la tabla
		var tabla = this.graficaMostrarEncabezado;
		//comienzo a dibujar las celdas
		for (var i = inicio; i < fin; i++)	{
			var temp = this.graficaMostrarContenido;
			
			//recorro los nombres de las columnas y las escribo en la grafica, si es que las incluyeron
			$.each(this.datos[i], function (nombre, valor) {
				temp = temp.replaceAll('#cont.' + nombre + '#', valor);
			});
	
			//agrego boton ampliar, modificar y borrar
			temp = temp.replaceAll('#objeto.ampliar#', this.botonAmpliar.replaceAll('#datos.indice#', i));
			temp = temp.replaceAll('#objeto.modificar#', this.botonModificar.replaceAll('#datos.indice#', i));
			temp = temp.replaceAll('#objeto.borrar#', this.botonBorrar.replaceAll('#datos.indice#', i));
			temp = temp.replaceAll('#datos.indice#', i);
			tabla += temp;
		}
	
		tabla += this.graficaMostrarPie;
		
		//creo el menu
		//boton anterior
		var menuPag = this.graficaPagAnt;
		//paginas
		var pagina = 0;
	
		var pagInicial = this.pagActual - 10;
		if (pagInicial < 0) pagInicial = 0;
		var pagFinal = this.pagActual + 10;
		if (pagFinal > this.maxPag) pagFinal = this.maxPag;
		
		for (var i = pagInicial; i < pagFinal; i++) {
			pagina = i + 1;
			menuPag += this.graficaPaginas.replaceAll('#objeto.paginaReemplazar#', pagina);
		}
		//boton siguiente
		menuPag += this.graficaPagSig;
		
		salida = salida.replaceAll('#objeto.contenidos#', tabla);
		salida = salida.replaceAll('#objeto.paginas#', menuPag);
	}
	else {
		salida = salida.replaceAll('#objeto.contenidos#', '<div class="mensajeSinDatos">' + this.mensajeSinDatos + '</div>');
		salida = salida.replaceAll('#objeto.paginas#', '');
	}
	//dibujo la tabla
	$('#' + this.divcontenedor).html(salida);

	//ejecuto un script personalizado
	eval(this.scriptMostrar);
}

A2ABMAjax.prototype.CambiarPagina = function (valor) {
	//Linea de debug
	if(this.debug) alert('cambiarPagina= ' + this.nombre);

	//ajusto por si se paso de pagina a una que no existe.
	if (valor < 0 ) valor = 0;
	if (valor > this.maxPag - 1) valor = this.maxPag - 1;
	
	//si es la misma pagina, no hago nada.
	if(this.pagActual == valor) return false;
	
	//asigno la nueva pagina
	this.pagActual = valor;
	//traigo los datos
	this.Dibujar();
}


//cargar datos de la base
A2ABMAjax.prototype.CargarDatos = function (mensaje) {
	//estado del objeto
	this.estado = 'cargando datos';

	var objeto = this;
	objeto.datos = [];
	objeto.MostrarEstado(mensaje);
	
	var url = "/a2/index.cfm?aplicacion=" + objeto.app + "&cnl=" + objeto.tabla + "&opc=" + objeto.opcion;
	
	//si tiene un padre, busco los datos relacionados a el
	if ((objeto.relacion.padre != null ) && (objeto.relacion.padre.seleccionado != null) && (objeto.relacion.padre.seleccionado != -1))  {
		var campo = objeto.relacion.codigoA2;
		var valor = eval('objeto.relacion.padre.datos[objeto.relacion.padre.seleccionado].' + objeto.relacion.padre.relacion.id);
		url += '&fuseaction=FILTRAR&fltrd' + campo + '=' + valor + '&fltrh' + campo + '=' + valor;
	}
	
	$.get(url, function(datos) { 
		  	$('#' + objeto.divdatos).html(datos); 
			objeto.MostrarEstado('');
			if(objeto.seleccionado != -1) {
				if(objeto.datos.length == 0) objeto.seleccionado = null; 
				else if(objeto.datos.length > 0) objeto.seleccionado = 0;
			}
			if(objeto.seleccionado != null) objeto.Seleccionar(objeto.seleccionado);

			objeto.Dibujar();
			//estado del objeto
			objeto.estado = '';
		  });
}

//permite relacionar datos y mostrarlos segun otra tabla
A2ABMAjax.prototype.Relacionar = function () {
	this.CargarDatos('Cargando ' + this.nombre);
}

//selecciona el registro para relacionar con otro
A2ABMAjax.prototype.Seleccionar = function (indice) {
	this.seleccionado = indice;
	if (this.relacion.hijos != null) {
		for (var i = 0;i < this.relacion.hijos.length; i++) {
			this.relacion.hijos[i].Relacionar();			
		}
	}
}

//alta de datos
A2ABMAjax.prototype.Alta = function () {
	//si va a cargar archivos llamo a la funcion AltaConArchivo
	if (this.cargaArchivos) {
		this.AltaConArchivo();
		return false;
	}
	var date = new Date();
	var fecha = date.getDate() + '/' + (parseInt(date.getMonth()) + parseInt(1)) + '/' + date.getFullYear();
	var formAlta = '<form id="formGuardar' + this.nombre + '" action="javascript:' + this.nombre + '.Guardar();">' +
				   this.graficaAlta + this.formA2.replaceAll('#form.accion#','Insert').replaceAll('#form.codcontenido#','0').replaceAll('#form.coduser#',this.coduser).replaceAll('#form.fecha#', fecha);
	if (this.relacion.padre != null) {
		formAlta += '<input type="hidden" name="' + this.relacion.codigoA2 + '" value="' + eval('this.relacion.padre.datos[this.relacion.padre.seleccionado].' + this.relacion.padre.relacion.id) + '">';
	}
	formAlta += '</form>';
	
	if (this.divalta == 'modal') $.nyroModalManual({content: formAlta, modal: true, Width: 500, Height: 500, bgColor: this.colorModal});
	else $('#' + this.divalta).html(formAlta);

	//ejecuto un script personalizado
	eval(this.scriptAlta);
}

//alta de datos
A2ABMAjax.prototype.AltaConArchivo = function () {
	var objeto = this;
	var date = new Date();
	var fecha = date.getDate() + '/' + (parseInt(date.getMonth()) + parseInt(1)) + '/' + date.getFullYear();
	var formAlta = '<form id="formGuardar' + this.nombre + '" action="/a2/objetos/actualizacion/index.cfm?" method="post" enctype="multipart/form-data">' +
				   this.graficaAlta + this.formA2.replaceAll('#form.accion#','Insert').replaceAll('#form.codcontenido#','0').replaceAll('#form.coduser#',this.coduser).replaceAll('#form.fecha#', fecha);
	if (this.relacion.padre != null) {
		formAlta += '<input type="hidden" name="' + this.relacion.codigoA2 + '" value="' + eval('this.relacion.padre.datos[this.relacion.padre.seleccionado].' + this.relacion.padre.relacion.id) + '">';
	}
	formAlta += '</form>';
	if (this.divalta == 'modal') $.nyroModalManual({content: formAlta, modal: true, Width: 500, Height: 500, bgColor: this.colorModal});
	else $('#' + this.divalta).html(formAlta);

	var jForm = $("#formGuardar" + this.nombre);

	jForm.submit(function (objEvent){
			var jThis = $(this);
			var strName = ("uploader" + (new Date()).getTime());
			var jFrame = $( "<iframe name=\"" + strName + "\" src=\"about:blank\" />" );
			jFrame.css( "display", "none" );
			jFrame.load(function (objEvent){
					var objUploadBody = window.frames[strName].document.getElementsByTagName("body")[0];
					var jBody = $(objUploadBody);

					var datos = jBody.html();
					if(datos.indexOf('DISCULPE LAS MOLESTIAS') > 0) {
						alert('Error al guardar dato.');
					} else objeto.CargarDatos('Actualizando Datos en ' + objeto.nombre);			
	
					//cierro el modal
					if (this.divalta == 'modal') $.nyroModalRemove();
					else $('#' + this.divalta).html('');

					setTimeout(function(){jFrame.remove();},100);
				}
				);
			$("body:first").append(jFrame);
			jThis.attr("target", strName);
	}
	);

	//ejecuto un script personalizado
	eval(this.scriptAlta);
}

//ampliar datos
A2ABMAjax.prototype.Ampliar = function (indice) {
	if (indice == -1) return false;

	var formAmpliar = this.graficaAmpliar;

	//recorro los nombres de las columnas y las escribo en la grafica, si es que las incluyeron
	$.each(this.datos[indice], function (nombre, valor) {
		formAmpliar = formAmpliar.replaceAll('#cont.' + nombre + '#', valor);
	});

	
	if (this.divampliar == 'modal') $.nyroModalManual({content: formAmpliar, modal: true, minWidth: 100, minHeight: 100, autoSizable: true, bgColor: this.colorModal});
	else $('#' + this.divampliar).html(formAmpliar);

	//ejecuto un script personalizado
	eval(this.scriptAmpliar);
}

//modificacion de datos
A2ABMAjax.prototype.Modificar = function (indice) {
	if (indice == -1) return false;

	var formModificar = '<form id="formGuardar' + this.nombre + '" action="javascript:' + this.nombre + '.Guardar();">' +
				   this.graficaModificar + this.formA2.replaceAll('#form.accion#','Update').replaceAll('#form.codcontenido#', eval('this.datos[indice].' + this.relacion.id));

	if (this.canalusr == 'YES')	formModificar = formModificar.replaceAll('#form.coduser#', this.datos[indice].coduser);
	else formModificar = formModificar.replaceAll('#form.coduser#', '0');
	//creo una variable temporal para modificar los datos en el script
	var tempScriptModificar = this.scriptModificar;

	//recorro los nombres de las columnas y las escribo en la grafica, si es que las incluyeron
	$.each(this.datos[indice], function (nombre, valor) {
		formModificar = formModificar.replaceAll('#cont.' + nombre + '#', valor);
		tempScriptModificar = tempScriptModificar.replaceAll('#cont.' + nombre + '#', valor);
	});

	//esto parece no ser necesario en la modificacion
	/*if (this.relacion.padre != null) {
		formModificar += '<input type="hidden" name="' + this.relacion.codigoA2 + '" value="' + eval('this.relacion.padre.datos[this.relacion.padre.seleccionado].' + this.relacion.id) + '">';
	}*/
	formModificar += '</form>';
	if (this.divalta == 'modal') $.nyroModalManual({content: formModificar, modal: true, Width: 500, Height: 500, bgColor: this.colorModal});
	else $('#' + this.divalta).html(formModificar);
	

	//ejecuto un script personalizado
	eval(tempScriptModificar);
}

//guardardo de datos
A2ABMAjax.prototype.Guardar = function () {
	var objeto = this;

	//estado del objeto
	this.estado = 'guardando datos';
	
	objeto.MostrarEstado('Guardando Datos en ' + objeto.nombre);
	//envio los datos del formulario ara guardar
	$.post('/a2/objetos/actualizacion/index.cfm?', $('#formGuardar' + this.nombre).serialize(), 
		function(datos) {
			if(datos.indexOf('DISCULPE LAS MOLESTIAS') > 0) {
				alert('Error al guardar dato.');
			} else objeto.CargarDatos('Actualizando Datos en ' + objeto.nombre);			
			//estado del objeto
			objeto.estado = '';
	});
	
	//cierro el modal
	if (this.divalta == 'modal') $.nyroModalRemove();
	else $('#' + this.divalta).html('');
	
}

A2ABMAjax.prototype.Borrar = function (indice) {
	if (indice == -1) return false;
	var objeto = this;

	//estado del objeto
	this.estado = 'borrando datos';
	
	//me fijo si tiene hijos 
	if (this.relacion.hijos != null) {
		//si tiene hijos me fijo que no tenga datos
		var tienenDatos = false;
		for (var i = 0; i < this.relacion.hijos.length; i++) {
			//chequeo que los hijos esten disponibles para chequear los datos, si alguno no esta disponible, entonces cancelo y vuelvo a consultar en medio segundo
			if (this.relacion.hijos[i].estado != "") {
				setTimeout(this.nombre + '.Borrar(' + indice + ');', 100);
				return false;
			}
			tienenDatos += this.relacion.hijos[i].datos.length > 0;
		}
		if (tienenDatos) {
			alert('no se puede borrar por que tiene datos relacionados');
			return false;
		}
	}
	
	var formBorrar = '<form id="formBorrar' + this.nombre + '">' +
				     this.formA2.replaceAll('#form.accion#','BAJA').replaceAll('#form.codcontenido#', eval('this.datos[indice].' + this.relacion.id)) +
					 '</form>';
  	$('#' + this.divdatos).html(formBorrar); 

	objeto.MostrarEstado('Borrando Dato en ' + objeto.nombre);

	//envio los datos del formulario ara guardar
	$.post('/a2/objetos/actualizacion/index.cfm?', $('#formBorrar' + this.nombre).serialize(), 
		function(datos) { 
			if(datos.indexOf('DISCULPE LAS MOLESTIAS') > 0) {
				alert('Error al guardar dato.');
			} else objeto.CargarDatos('Actualizando Datos en ' + objeto.nombre);			
			//estado del objeto
			objeto.estado = '';
	});

	//cierro el modal
	if (this.divampliar == 'modal') $.nyroModalRemove();
	else $('#' + this.divampliar).html('');
	
	//ejecuto un script personalizado
	eval(this.scriptBorrar);
}

A2ABMAjax.prototype.Cancelar = function () {
	//cierro el modal
	if (this.divalta == 'modal') $.nyroModalRemove();
	else $('#' + this.divalta).html('');
	if (this.divampliar == 'modal') $.nyroModalRemove();
	else $('#' + this.divampliar).html('');
}