function getXmlHttpPrefix() 
{
	if (getXmlHttpPrefix.prefix) return getXmlHttpPrefix.prefix;
	
	var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	var o;
	for (var i = 0; i < prefixes.length; i++) 
	{
		try 
		{
			o = new ActiveXObject(prefixes[i] + ".XmlHttp");
			return getXmlHttpPrefix.prefix = prefixes[i];
		}
		catch (ex) {};
	}
	
	return false;
}

function XmlHttp() {}

XmlHttp.create = function () 
{
	if (window.ActiveXObject) 
	{
		if (navigator)
		{
			if (navigator.appVersion.indexOf('MSIE 5.') != -1)
			{
				return false;
			}
		}
		
		var xmlHttpPrefix;
		if (xmlHttpPrefix = getXmlHttpPrefix())
		{
			return new ActiveXObject(xmlHttpPrefix + ".XmlHttp");
		}
	}
	
	if (window.XMLHttpRequest) 
	{
		var req = new XMLHttpRequest();
		
		if (req.readyState == null) 
		{
			req.readyState = 1;
			req.addEventListener("load", function () 
			{
				req.readyState = 4;
				if (typeof req.onreadystatechange == "function")
					req.onreadystatechange();
			}, false);
		}
		
		return req;
	}
	
	return false;
};

String.prototype.dividirPalabras = function(caracteresValidos)
{
	var pattern = '<[^>]*>|[^' + caracteresValidos + ']+?|[' + caracteresValidos + ']+';
	
	var retorno = new Object()
	var regExp = new RegExp(pattern, 'gi');
	regExp.compile(pattern, 'gi');
	
	retorno.partes = this.match(regExp)
	retorno.partesLower = this.toLowerCase().match(regExp);
	
	return retorno;
}

String.prototype.procesarDiccionario = function()
{
	var items = this.split('\r\n');
	var item;
	var retorno = new Array();
	var posicion;
	var i, j;
	
	for (i = 0; i < items.length; i++)
	{
		item = items[i].split(' ');

		for (posicion = retorno, j = 0; j < item.length; j++)
		{
			if (!posicion[item[j]])
			{
				posicion[item[j]] = new Array();
			}

			posicion = posicion[item[j]];
		}

		posicion.push(true);
	}

	return retorno;
}

Object.prototype.aplicarDiccionario = function(diccionario)
{ 
	with (this)
	{
		var cantidadPartes = partesLower.length;
		var seccionDiccionario;
		var seccionAnterior;
		var i = 0
		var elarr;
		
		while (i < cantidadPartes)
		{
			if (seccionDiccionario = diccionario[partesLower[i]])
			{
				j = i;
				do
				{
					seccionAnterior = seccionDiccionario;
					j = j + 2;
					if (j < partesLower.length)
					{
						seccionDiccionario = seccionDiccionario[partesLower[j]];
					}
				}
				while (seccionDiccionario && partesLower[j - 1] == ' ' && j < partesLower.length);

				if (seccionAnterior[0])
				{
					partes[i] = '<a class="linkGlosario" href="javascript: glossaryPopUp(\'' + partes.slice(i, j - 1).join('') + '\');">' + partes[i];
					partes[j - 2] += '</a>';
					seccionAnterior[0] = false;
				}

				i = j - 1;
			}
			else
			{
				i++;
			}
		}

		return partes.join('');
	}
} 

function pedirGlosario(idioma, validCharacters, div)
{
	if (div != null)
	{
		var xmlhttp = XmlHttp.create();
		var location = 'WordsList.aspx?l=' + idioma;
		if (typeof(xmlhttp) == 'object')
		{
			xmlhttp.open('GET', location, true);
			xmlhttp.onreadystatechange = function() 
			{
				if (xmlhttp.readyState == 4)
				{
					var status = xmlhttp.status ? xmlhttp.status : 200;
					if (xmlhttp.responseText.length && status == 200)
					{
						procesarGlosario(xmlhttp, div, validCharacters);
					}
				}
			}
			xmlhttp.send(null);
		}
		else
		{
			window.frames[frameName].location = location;
		}
	}
}

function procesarGlosario(xmlhttp, div, caracteresValidos)
{
	var diccionario;
	var informacionTexto;
	
	informacionTexto = div.innerHTML.replace(/\r\n/g, ' ').dividirPalabras(caracteresValidos);
	diccionario = xmlhttp.responseText.procesarDiccionario();
	div.innerHTML = informacionTexto.aplicarDiccionario(diccionario);
}