// ********************************************************************************************************
//		Objeto FUENTE DE DATOS 
// --------------------------------------------------------------------------------------------------------
//		Angel Mayol
//		BDF 2001
// ********************************************************************************************************

// --------------------------------------------------------------------------------------------------------
// Constructor del Objeto Fuente de datos
// --------------------------------------------------------------------------------------------------------
// Parámetros:
//		- surl: URL donde se obtienen los datos
//		- sname: nombre de la fuente de datos
function FuenteDatos(surl, sname)
{
	this.url = surl;
	this.http = null;	
	this.xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
	this.xmlDoc.async = false;
	this.tabla = null;
	this.name = sname;

	this.Solicitar			= _datSolicitar;
	this.SolicitarDatos		= _datSolicitarDatos;
	this.SolicitarDatosSinc	= _datSolicitarDatosSinc;
	this.EnviarDatos	= _datEnviarDatos;
	this.EnviarDatosSinc	= _datEnviarDatosSinc;
	this.MuestraErrores		= _datMuestraErrores;
	this.DameRegistro		= _datDameRegistro;
	this.DameRS				= _datDameRS;
	this.DameNumRegs		= _datDameNumRegs;
	this.DameDesplegable	= _datDameDesplegable;
	this.DameDesplegableExt	= _datDameDesplegableExt;
	this.DameLista			= _datDameLista;
	this.DatosAnadir		= _datDatosAnadir;
	this.DatosInsertar		= _datDatosInsertar;
	this.DatosEliminar		= _datDatosEliminar;
}

// --------------------------------------------------------------------------------------------------------
// Evento que se produce al obtener datos. Rutina Interna.
// --------------------------------------------------------------------------------------------------------
// Parámetros:
//		- obj: Objeto de fuente de datos
function _datAlRecibirDatos(obj)
{	
	if (obj.cargando == 1) return;
	var state = obj.http.readyState;
	if (state == 4)
	{
		obj.cargando = 1;
		//var s = obj.http.responseText;
		//obj.xmlDoc.loadXML(s);
		obj.xmlDoc = obj.http.responseXML;
		var myErr = obj.xmlDoc.parseError;
		if (myErr.errorCode != 0) 
		{
		  alert("Se ha producido un error: " + myErr.reason + "Linea: " + myErr.line + " XML:" + obj.http.responseText);
		}
		else 
		{
			obj.MuestraErrores();
			if (obj.tabla) obj.tabla.RefrescarDatos();
		}
		obj.cargado = 1;
	}
}

// --------------------------------------------------------------------------------------------------------
// Evento que se produce al obtener datos. Rutina Interna. Llama a la rutina personal definida.
// --------------------------------------------------------------------------------------------------------
// Parámetros:
//		- obj: Objeto de fuente de datos
function _datAlRecibirDatosPer(obj, f)
{		
	if (obj.cargando == 1) return;
	var state = obj.http.readyState;
	if (state == 4)
	{
		obj.cargando = 1;
		//var s = obj.http.responseText;
		//obj.xmlDoc.loadXML(s);
		obj.xmlDoc = obj.http.responseXML;
		var myErr = obj.xmlDoc.parseError;
		if (myErr.errorCode != 0) 
		  alert("Se ha producido un error: " + myErr.reason + "Linea: " + myErr.line + " XML:" + obj.http.responseText);
		else 
		{
			var errCode;
			errCode = obj.MuestraErrores();
			// Tratar errores
			if (errCode <0)
			{
				var s = obj.http.responseText;
				if (s.search(/No conectado/i) > 0) errCode = -999;
			}
			if (f) f(errCode);
		}
		obj.cargado = 1;
	}
}

// --------------------------------------------------------------------------------------------------------
// Método para inicializar y solicitar datos desde una URL
// --------------------------------------------------------------------------------------------------------
// Parámetros:
//		- surl: Objeto de fuente de datos
function _datSolicitar(surl)
{
	this.cargado = 0;
	this.cargando = 0;
	this.http = null;
	this.http = new ActiveXObject("Microsoft.XMLHTTP");
	this.http.onreadystatechange = new Function("_datAlRecibirDatos(" + this.name + ")");
	this.http.Open ("GET", this.url, true, null, null );
	this.http.send();
}

// --------------------------------------------------------------------------------------------------------
// Método para inicializar y solicitar datos desde una URL y llamar a una rutina personalizada
// --------------------------------------------------------------------------------------------------------
// Parámetros:
//		- surl: Objeto de fuente de datos
function _datSolicitarDatos(surl, f)
{
	this.url = surl;
	this.cargado = 0;
	this.cargando = 0;
	this.http = null;
	this.http = new ActiveXObject("Microsoft.XMLHTTP");
	this.http.onreadystatechange = new Function("_datAlRecibirDatosPer(" + this.name + ", " + f + ")");
	this.http.Open ("GET", surl, true, null, null );
	this.http.send();
}

// --------------------------------------------------------------------------------------------------------
// Método para inicializar y solicitar datos desde una URL de forma síncrona
// --------------------------------------------------------------------------------------------------------
// Parámetros:
//		- surl: Objeto de fuente de datos
function _datSolicitarDatosSinc(surl)
{
	this.url = surl;
	this.http = null;
	this.http = new ActiveXObject("Microsoft.XMLHTTP");
	this.http.Open ("GET", surl, false, null, null );
	this.http.send();
	//var s = this.http.responseText;
	//this.xmlDoc.loadXML(s);

	this.xmlDoc = this.http.responseXML;
	var myErr = this.xmlDoc.parseError;
	if (myErr.errorCode != 0) 
	{
		alert("Se ha producido un error: " + myErr.reason + "Linea: " + myErr.line + " XML:" + this.http.responseText);
		return -1;
	}
	else 
	{
		return this.MuestraErrores();
	}
	return 0;
}

// --------------------------------------------------------------------------------------------------------
// Método para enviar datos hacia URL de forma síncrona ( POST )
// --------------------------------------------------------------------------------------------------------
// Parámetros:
//		- surl: Url del cgi que procesará los datos
//		- sdatos: Datos a enviar
function _datEnviarDatosSinc(surl,sdatos)
{
	this.url = surl;
	this.http = null;
	this.http = new ActiveXObject("Microsoft.XMLHTTP");
	this.http.Open ("POST", surl, false, null, null );
	this.http.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded");
	this.http.send(sdatos);

	this.xmlDoc = this.http.responseXML;
	var myErr = this.xmlDoc.parseError;
	if (myErr.errorCode != 0) 
	{
		alert("Se ha producido un error: " + myErr.reason + "Linea: " + myErr.line + " XML:" + this.http.responseText);
		return -1;
	}
	else 
	{
		return this.MuestraErrores();
	}
	return 0;
}

function _datEnviarDatos(surl,sdatos, f)
{
	this.url = surl;
	this.cargado = 0;
	this.cargando = 0;
	this.http = null;
	this.http = new ActiveXObject("Microsoft.XMLHTTP");
	this.http.Open ("POST", surl, true, null, null );
	this.http.onreadystatechange = new Function("_datAlRecibirDatosPer(" + this.name + ", " + f + ")");
	this.http.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded");
	this.http.send(sdatos);

	//this.xmlDoc = this.http.responseXML;
	//var myErr = this.xmlDoc.parseError;
	//if (myErr.errorCode != 0) 
	//{
	//	alert("Se ha producido un error: " + myErr.reason + "Linea: " + myErr.line + " XML:" + this.http.responseText);
	//	return -1;
	//}
	//else 
	//{
	//	return this.MuestraErrores();
	//}
	//return 0;
}

// --------------------------------------------------------------------------------------------------------
// Comprueba y muestra los posibles errores en el XML
// --------------------------------------------------------------------------------------------------------
function _datMuestraErrores()
{
	var rs = this.xmlDoc.getElementsByTagName("err");
	if (rs.length > 0)
	{
		for(var i=0;i<rs.length;i++) alert(rs.item(i).childNodes(0).attributes(0).value);
		return -1;
	}
	return 0;
}

// --------------------------------------------------------------------------------------------------------
// Recupera un registro de un "recordset"
// Parámetros:
//		- sRs: Nombre del "rs"
//		- n :numero del registro
//		- sTag: Etiqueta
// --------------------------------------------------------------------------------------------------------
function _datDameRegistro(sRs, n, sTag)
{
	var s = 'undefined';
	var rs = this.xmlDoc.getElementsByTagName(sRs);
	if (rs.length > 0) 
	{
		var reg = rs.item(0).childNodes(n);
		if (reg) s = reg.getAttribute(sTag);
	}
	return(s);
}

// --------------------------------------------------------------------------------------------------------
// Recupera un "recordset"
// Parámetros:
//		- sRs: Nombre del "rs"
// --------------------------------------------------------------------------------------------------------
function _datDameRS(sRs)
{
	var rs = this.xmlDoc.getElementsByTagName(sRs);
	if (rs.length > 0) return(rs.item(0))
	else return(null);
}

// --------------------------------------------------------------------------------------------------------
// Recupera el numero de registros de un "recordset"
// Parámetros:
//		- sRs: Nombre del "rs"
// --------------------------------------------------------------------------------------------------------
function _datDameNumRegs(sRs)
{
	var rs = this.xmlDoc.getElementsByTagName(sRs);
	if (rs.length > 0) return(rs.item(0).childNodes.length)
	else return(0);
}

// --------------------------------------------------------------------------------------------------------
// Crea un conjunto de opciones del tipo <OPTION></OPTION>
// Parámetros:
//		- sRs: Nombre del "rs"
//		- m: Opcional: Longitud máxima
// --------------------------------------------------------------------------------------------------------
function _datDameDesplegable(sRs, m)
{
	if (!m) m = "";
	var s = '';
	var rs = this.xmlDoc.getElementsByTagName('rs'+sRs);
	if (rs.length > 0)
	{
		var rs2 = rs.item(0);
		s = "";
		for (var i=0;i<rs2.childNodes.length;i++)
		{
			var reg = rs2.childNodes(i);
			if (m == "")
				s = s + '<OPTION VALUE="' + reg.getAttribute("f0") + '">' + reg.getAttribute("f1") + '</OPTION>'
			else
				s = s + '<OPTION VALUE="' + reg.getAttribute("f0") + '">' + reg.getAttribute("f1").substr(0,m) + '</OPTION>'
		}
	}
	return(s);
}

// --------------------------------------------------------------------------------------------------------
// Crea un conjunto de opciones del tipo <OPTION></OPTION>
// Parámetros:
//		- sRs: Nombre del "rs"
//		- cVal: Campo que irá en option value
//		- cTxt: Campo que irá en option Text
//		- arguments: Campos que irá como información extra. 
// --------------------------------------------------------------------------------------------------------
function _datDameDesplegableExt(sRs, cVal, cTxt)
{
	var s = '';
	var rs = this.xmlDoc.getElementsByTagName('rs'+sRs);
	if (rs.length > 0)
	{
		var rs2 = rs.item(0);
		s = "";
		for (var i=0;i<rs2.childNodes.length;i++)
		{
			var reg = rs2.childNodes(i);
			datExt = "";
			for (var j=3;j<arguments.length ; j++ )
			{
				datExt = datExt + " extd" + (j-3) + "='" + reg.getAttribute(arguments[j]) + "'"
			}
			s = s + '<OPTION VALUE="' + reg.getAttribute(cVal) + '" ' + datExt + '>' + reg.getAttribute(cTxt)
		}
	}
	return(s);
}

function _datDameLista(sRs, cVal, cCar)
{
	if (cCar == "") cCar = "#";
	var s = '';
	var rs = this.xmlDoc.getElementsByTagName(sRs);
	if (rs.length > 0)
	{
		var rs2 = rs.item(0);
		s = "";
		for (var i=0;i<rs2.childNodes.length;i++)
		{
			var reg = rs2.childNodes(i);
			s = s + reg.getAttribute(cVal) + cCar;
		}
	}
	s = s.substr(0,s.length-1);
	return(s);
}

function _datDatosAnadir(rs)
{
	var currNode = this.xmlDoc.getElementsByTagName(rs).item(0).childNodes(0);
	if (currNode)
	{
		var MyNewNode = currNode.cloneNode(false);
		for (var i=0;i<currNode.attributes.length;i++)
		{
			MyNewNode.attributes(i).value = arguments[i+1];
		}
		this.xmlDoc.getElementsByTagName(rs).item(0).appendChild(MyNewNode);
	}
}

function _datDatosInsertar(rs, nR)
{
	var currRS = this.xmlDoc.getElementsByTagName(rs).item(0);
	var currNode = currRS.childNodes(0);
	if (currNode)
	{
		var MyNewNode = currNode.cloneNode(false);
		for (var i=0;i<currNode.attributes.length;i++)
		{
			MyNewNode.attributes(i).value = arguments[i+2];
		}
		currNode = currRS.childNodes(nR);
		currRS.insertBefore(MyNewNode, currNode);
	}
}

function _datDatosEliminar(rs, nR1, nR2)
{
	var currRS = this.xmlDoc.getElementsByTagName(rs).item(0);
	if (currRS)
	{
		if (nR1 <= nR2)
		{
			for (var i=nR2;i>=nR1;i--)
				if (i<=currRS.childNodes.length-1) currRS.removeChild(currRS.childNodes(i));
		}	
	}
}

