/*
	---------------------------------------------------------------------------
	Empresa			: Proconsi S.L.
	Fecha creaci�n	: 25-03-2010 - Korre
	Fecha ult.modif.: 31-03-2010 - Virginia
	M�dulo			: Funciones Ajax (peticiones y callbacks) para el m�dulo tagsBuscador. (Funciones de David Gonz�lez)
	----------------------------------------------------------------------------
    Historial de modificaciones:
	[1] - 31-03-2010 - Virginia
	Eliminamos bot�n de grabado, se aplica su funcionalidad al actualizarTag
	[2] - 27-04-2010 - Virginia
	El idFicha de un tag (en la creaci�n de la 'ficha') puede ser la cadena vac�a adem�s de -1
	[3] - 06-07-2010 - Virginia
	Cambiamos la primera columna de TD de cada fila de presentación de los tags por TH
	----------------------------------------------------------------------------
*/
///
/// CallBack de presentaci�n de la p�gina de edici�n de tags
///
function CallBackEditarTags( xmlhttp )
{
	if( xmlhttp.readyState == 4 && xmlhttp.status == 200 )
	{
		document.getElementById( m_idDiv ).innerHTML = xmlhttp.responseText;
	}
}
///
/// CallBack de Ajax de presentaci�n de lista de sugerencias
///
function CallBackShowSugerencias( xmlhttp )
{
	if( xmlhttp.readyState == 4 && xmlhttp.status == 200 )
	{
		document.getElementById( 'cuerpocentral' ).innerHTML = xmlhttp.responseText;
	}
}
///
/// Comportamiento al pulsar caracteres especiales
/// Esta funci�n se ejecutar� en el evento onKeyDown, antes de VerListaSugerencias
///
function DetectarCaracteresEspeciales( oEvento )
{
	var iAscii;
	iAscii = getKeyCode( oEvento );	
	
	if (iAscii == 9 || iAscii == 13 || iAscii == 27 || iAscii == 37 || iAscii == 38 || iAscii == 39 || iAscii == 40 || iAscii == 46)
	{
		if (iAscii == 9 || iAscii == 27)  // TAB, ESC
		{
			document.getElementById( 'listaSugerencias' ).style.visibility = "hidden";
			return true;
		}
		
		if (iAscii == 13) // ENTER
		{
			SeleccionarSugerencia(GetSugerenciaSeleccionada(),true)
			return true;
		}
		
		if (iAscii == 38) // KEY_UP
		{
			var sugerenciaSeleccionada = GetSugerenciaSeleccionada();
			var listaSugerencias = document.getElementById("listaSugerencias");
			var nSugerencias =  listaSugerencias.getElementsByTagName("li").length;
			
			// Si estamos en la primera sugerencia, seleccionamos la �ltima (da la vuelta)
			if (sugerenciaSeleccionada <= 1)
				sugerenciaSeleccionada = nSugerencias;
			else sugerenciaSeleccionada -= 1;
			
			if (nSugerencias > 0)
				ResaltarSugerencia(sugerenciaSeleccionada,true);
			return true;
		}
		
		if (iAscii == 40) // KEY_DOWN
		{
			var sugerenciaSeleccionada = GetSugerenciaSeleccionada();
			var listaSugerencias = document.getElementById("listaSugerencias");
			var nSugerencias =  listaSugerencias.getElementsByTagName("li").length;
			
			// Si estamos en la �ltima sugerencia, seleccionamos la primera (da la vuelta)
			if (sugerenciaSeleccionada == nSugerencias)
				sugerenciaSeleccionada = 1;
			else sugerenciaSeleccionada += 1;
			
			if (nSugerencias > 0)
				ResaltarSugerencia(sugerenciaSeleccionada,true);
			return true;
		}
	}	
	return true;
}
///
/// Presenta la lista de sugerencias
/// Esta funci�n se ejecutar� en el evento onKeyUp y el valor del campo textoSugerencias ya est� actualizado
///
function VerListaSugerencias( oEvento )
{
	//
	// En web no tiene porqu� existir idOrigen, pero en Panel de Control SIEMPRE
	var cIdOrigen = '';
	try
	{
		cIdOrigen = document.getElementById( 'idOrigen' ).value;
	}
	catch( err )
	{
		cIdOrigen = '';
	}
	//
	var iAscii;
	iAscii = getKeyCode( oEvento );
	
	// Caracteres especiales que se han tratado previamente en el onMouseDown (Funci�n DetectarCaracteresEspeciales)
	if ( iAscii == 9 || iAscii == 13 || iAscii == 27 || iAscii == 37 || iAscii == 38 || iAscii == 39 || iAscii == 40 )
		return true;
	
	// Obtener el tag que se est� escribiendo
	var cTexto = document.getElementById("textoSugerencias").value;
	var nPosCursor = getPosicionCursor( "textoSugerencias" );
	
	var nPosInicioTag = (cTexto.substr(0,nPosCursor)).lastIndexOf(",");
	if (nPosInicioTag > -1)
		nPosInicioTag += 1;
	else 
		nPosInicioTag = 0;
	
	var nPosFinTag = cTexto.indexOf(",",nPosCursor);
	if (nPosFinTag == -1)
		nPosFinTag = cTexto.length;
	
	var cTag = cTexto.substring(nPosInicioTag,nPosFinTag);
	var cParameters = 'tag=' + cTag;
	cParameters += '&modulo=' + cIdOrigen ;
	//
	// �ltimo par�metro = false para que no nos deshabilite los TinyMCE cargados en la p�gina en que nos encontremos
	AjaxRequest( '../Modulos/tagsBuscador/listaSugerencias.php' , cParameters , CallBackVerListaSugerencias , false );
	return true;
}
///
/// CallBack de Ajax de presentaci�n de sugerencias
///
function CallBackVerListaSugerencias( xmlhttp )
{
	if( xmlhttp.readyState == 4 && xmlhttp.status == 200 )
	{
		if ( xmlhttp.responseText != "" )
		{
			document.getElementById( 'listaSugerencias' ).style.visibility = "visible";
			document.getElementById( 'listaSugerencias' ).innerHTML = xmlhttp.responseText;
		}
		else
		{
			document.getElementById( 'listaSugerencias' ).style.visibility = "hidden";
			document.getElementById( 'listaSugerencias' ).innerHTML = '';
		}
	}
}
///
/// Devuelve de la lista de sugerencias la que est� resaltada
///
function GetSugerenciaSeleccionada()
{
	var listaSugerencias = document.getElementById("listaSugerencias");
	var nSugerencias =  listaSugerencias.getElementsByTagName("li").length;
	
	for (nI=1; nI<=nSugerencias; nI++)
	{
		var sugerencia = document.getElementById( "sugerencia" + nI );
		if (sugerencia)
		{
			if (sugerencia.className == "sugerenciaSeleccionada")
				return nI;
		}
	}
	return 0;
}
///
/// Obtiene un c�digo de tecla pulsado en funci�n de la llamada
///
function getKeyCode( e )
{
	if (window.event)
		return window.event.keyCode;
	else if (e)
	{
		if (e.which == 0)	// Caracter especial, devolver el c�digo keyCode
			return e.keyCode;
		else return e.which;
	}
	else return null;
}
///
/// A�ade los tags y despu�s borra los que hayan podido quedar repetidos
///
function ActualizarTags()
{
	AniadirTags();
	BorrarTagsRepetidos();
}
///
/// A�ade los tags y despu�s borra los que hayan podido quedar repetidos. 
/// GRABA en la BBDD los cambios realizados (ActualizarTags() no graba en la BBDD)
///
function ActualizarTagsGRABAR()
{
	AniadirTags();
	BorrarTagsRepetidos();
	//
	// Nueva funcionalidad para eliminar el bot�n de 'Grabar' [1]
	GrabarTags();
}
///
/// A�ade los tags
///
function AniadirTags()
{
	var oTags = document.getElementById( "textoSugerencias" ).value.split(",");
	var oTablaTags = document.getElementById("tablaTags").tBodies[0];
	
	if (oTags.length > 0)
	{
		for (nI in oTags)
		{
			if (oTags[nI] != "")
			{
				var oFila = document.createElement("TR");
				oTablaTags.appendChild(	oFila );
				var oColumna = document.createElement("TH"); // [3]
				oColumna.innerHTML = oTags[nI];
				oFila.appendChild( oColumna );
				oColumna = document.createElement("TD");
				oColumna.innerHTML = "<a style='cursor:pointer' onclick='BorrarTag(\"" + oTags[nI] + "\");'>Eliminar</a>";
				oFila.appendChild( oColumna );
			}
		}
		
		// Habilitamos el bot�n de grabar tags
		document.getElementById( "grabarTags" ).disabled = false;
	}
	document.getElementById( "textoSugerencias" ).value = "";
}
///
/// Borra un tag
///
function BorrarTag( cTag )
{
	var oTablaTags = document.getElementById("tablaTags").tBodies[0];;
	var oTags =  oTablaTags.getElementsByTagName("tr");
	
	// Recorremos una por una todas las filas de la tabla de tags
	if (oTags.length > 0)
	{
		for (nI in oTags)
		{
			// Ignoramos la primera fila, que es el encabezado 
			if (nI > 0)
			{
				var oColumnas = oTags[nI].getElementsByTagName("th"); // [3]
				
				if (oColumnas[0].innerHTML == cTag)
				{
					oTablaTags.removeChild(oTags[nI]);
					document.getElementById( "grabarTags" ).disabled = false;
					return;
				}
			}
		}
	}
}
///
/// Borra un tag
/// GRABA en la BBDD los cambios realizados (BorrarTag() no graba en la BBDD)
///
function BorrarTagGRABAR( cTag )
{
	var oTablaTags = document.getElementById("tablaTags").tBodies[0];;
	var oTags =  oTablaTags.getElementsByTagName("tr");
	
	// Recorremos una por una todas las filas de la tabla de tags
	if (oTags.length > 0)
	{
		for (nI in oTags)
		{
			// Ignoramos la primera fila, que es el encabezado 
			if (nI > 0)
			{
				var oColumnas = oTags[nI].getElementsByTagName("th"); // [3]
				
				if (oColumnas[0].innerHTML == cTag)
				{
					oTablaTags.removeChild(oTags[nI]);
					document.getElementById( "grabarTags" ).disabled = false;
					//
					// Nueva funcionalidad para eliminar el bot�n de 'Grabar' [1]
					GrabarTags();
					//
					return;
				}
			}
		}
	}
}
///
/// Recorre la lista de tags y borra las repeticiones
///
function BorrarTagsRepetidos()
{
	var oTablaTags = document.getElementById("tablaTags").tBodies[0];
	var oFilasTags = oTablaTags.getElementsByTagName("tr");
	
	// Array donde estar�n todos los tags (s�lo los textos)
	var oTags = new Array(); 
	
	// Recorremos una por una todas las filas de la tabla de tags y vamos a�adiendo los elementos al array de tags
	if (oFilasTags.length > 0)
	{
		for (nI in oFilasTags)
		{
			// Ignoramos la primera fila, que es el encabezado 
			if (nI > 0)
			{
				var oColumnas = oFilasTags[nI].getElementsByTagName("th"); // [3]
				oTags.push(oColumnas[0].innerHTML);
			}
		}
	}
	// Ordenamos el array de tags
	oTags.sort();
	
	// Eliminamos elementos repetidos
	var cTagAnterior = String.fromCharCode(255);
	for (nJ in oTags)
	{
		if (oTags[nJ] == cTagAnterior)
			BorrarTag( oTags[nJ] );
		
		cTagAnterior = oTags[nJ];
	}
}
///
/// Graba todos los tags del DIV indicado
///
function GrabarTags( idDiv , idFicha )
{
	m_idDiv = idDiv;
	//
	var nIdFicha = '';
	if( document.getElementById( 'idFicha' ).value == '-1' || document.getElementById( 'idFicha' ).value == '' ) // [2]
		nIdFicha = idFicha;
	else
		nIdFicha = document.getElementById( 'idFicha' ).value;
	var nIdOrigen = document.getElementById( 'idOrigen' ).value;
	//
	GrabarTagsId( nIdOrigen , nIdFicha );
}
///
/// Graba los TAGs existentes en el DIV pasado para la ficha indicada
///
function GrabarTagsId( nIdOrigen , nIdFicha )
{
	//
	// Generar una cadena con todos los tags separados por , para pasarlos como par�metro
	var cTags = "";
	var oTablaTags = document.getElementById("tablaTags").tBodies[0];
	var oFilasTags = oTablaTags.getElementsByTagName("tr");
	//
	// Recorremos una por una todas las filas de la tabla de tags y vamos a�adiendo a la cadena de tags
	if( oFilasTags.length > 1 )
	{
		for( nI in oFilasTags )
		{
			// Ignoramos la primera fila, que es el encabezado 
			if( nI > 0 )
			{
				if( oFilasTags[nI] )
				{
					var oColumnas = oFilasTags[nI].getElementsByTagName("th"); // [3]
					cTags += oColumnas[0].innerHTML + ","; 
				}
			}
		}
	}
	//
	// Quitamos la coma final
	if( oFilasTags.length > 1 )
		cTags = cTags.substr( 0 , cTags.length - 1 );
	
	var cParameters = 'idOrigen=' + nIdOrigen;
	cParameters += '&idFicha=' + nIdFicha;
	cParameters += '&tags=' + cTags;
	//
	// �ltimo par�metro del AjaxRequest = false para que nos deshabilite los TinyMCE cargados
	AjaxRequest( '../Modulos/tagsBuscador/actualizarTags.php' , cParameters , CallBackGrabarTags , false );	
}
//
// CallBack de Ajax de grabaci�n de tags
//
function CallBackGrabarTags( xmlhttp )
{
	if( xmlhttp.readyState == 4 && xmlhttp.status == 200 )
	{
		if( xmlhttp.responseText.substr( 0 , 2 ) == 'OK' )
		{
			var nIdOrigen = document.getElementById( 'idOrigen' ).value;
			var nIdFicha = document.getElementById( 'idFicha' ).value;
		}
		else
			alert( 'Error actualizando tags: ' + xmlhttp.responseText );
	}
}
///
/// Marca la sugerencia sobre la que se encuentra el rat�n, o la que corresponde por teclado
///
function ResaltarSugerencia(idSugerencia,lSeleccionar)
{
	document.getElementById( 'listaSugerencias' ).style.visibility = "visible";
	
	for (nI=1; nI<=10; nI++)
	{
		var sugerencia = document.getElementById( 'sugerencia' + nI );
		if (sugerencia)
		{
			if (nI == idSugerencia)
			{
				sugerencia.className = "sugerenciaSeleccionada"; // IE
			}
			else
			{
				sugerencia.className = ""; // IE
			}
		}
	}
	// Esta variable la calculamos aqu�, puesto que en este punto el foco siempre estar� en el texto de sugerencias
	nPosCursorTextoSugerencias = getPosicionCursor( "textoSugerencias" );
	
	if(lSeleccionar)
		SeleccionarSugerencia(idSugerencia,false);
}
///
/// Selecciona una de las sugerencias mostradas
///
function SeleccionarSugerencia(idSugerencia,lConfirmar)
{
	var cTagsAnteriores, cTagsSiguientes, cTag;
	var cTexto = document.getElementById("textoSugerencias").value;
	
	// Obtener el tag que se est� escribiendo
	var cTexto = document.getElementById("textoSugerencias").value;
	var nPosCursor = nPosCursorTextoSugerencias;  // Utilizamos la posici�n calculada en ResaltarSugerencia
	
	var nPosInicioTag = (cTexto.substr(0,nPosCursor)).lastIndexOf(",");
	if (nPosInicioTag > -1)
	{
		nPosInicioTag += 1;
		cTagsAnteriores = cTexto.substr(0,nPosInicioTag);
	}
	else 
	{
		nPosInicioTag = 0;
		cTagsAnteriores = "";
	}
	
	var nPosFinTag = cTexto.indexOf(",",nPosCursor);
	if (nPosFinTag == -1)
	{
		nPosFinTag = cTexto.length;
		cTagsSiguientes = "";
	}
	else cTagsSiguientes = cTexto.substr(nPosFinTag);
	
	var cTextoSugerencia = document.getElementById("sugerencia" + idSugerencia).innerHTML;
	var nPosSpan = (cTextoSugerencia.toLowerCase()).indexOf("<span");
	if (nPosSpan != -1)
	{
		var nPosInicioResaltado = cTextoSugerencia.indexOf(">",nPosSpan);
		var nPosFinResaltado = (cTextoSugerencia.toLowerCase()).indexOf("</span>");
		cTag = cTextoSugerencia.substr(0,nPosSpan) + 
				cTextoSugerencia.substring(nPosInicioResaltado + 1,nPosFinResaltado) +
				cTextoSugerencia.substr(nPosFinResaltado + 7);
	}
	else
	{
		cTag = cTextoSugerencia;
	}
	
	document.getElementById("textoSugerencias").value = cTagsAnteriores + cTag + cTagsSiguientes;
	
	// Colocar el cursor al final del tag actual
	setPosicionCursor( "textoSugerencias" , (cTagsAnteriores + cTag).length )	
		
	if(lConfirmar)
	{
		if (document.getElementById("textoSugerencias").value.substr(document.getElementById("textoSugerencias").value.length - 1) != ",")
			document.getElementById("textoSugerencias").value += ",";
		
		//document.getElementById("textoSugerencias").focus();
		// Colocar el cursor al final del campo
		setPosicionCursor( "textoSugerencias" , document.getElementById("textoSugerencias").value.length )	
		//
		document.getElementById( 'listaSugerencias' ).style.visibility = "hidden";
		document.getElementById( 'listaSugerencias' ).innerHTML = '';
	}
}
//
// Devuelve la posici�n en la que se encuentra el cursor dentro de un campo de texto
//
function getPosicionCursor( idElemento )
{
	 var oControl = document.getElementById( idElemento );
	 var nPosSel = 0;
	 //    
     // IE
     if(typeof document.selection != 'undefined' && document.selection)
     {
		 oControl.focus();
		 var oSel = document.selection.createRange();
		 oSel.moveStart ('character', -oControl.value.length);
		 nPosSel = oSel.text.length;
     }
	 //
     // Otros
     else if(typeof oControl.selectionStart != 'undefined')
     {
         nPosSel = oControl.selectionStart;	
     }
	 return (nPosSel);
}
//
// Coloca el cursor dentro de un campo de texto en una posci�n
//
function setPosicionCursor( idElemento, nPosicion )
{
	 var oControl = document.getElementById( idElemento );
	 
	 if (oControl.createTextRange)
	 {
		var range = oControl.createTextRange();
		range.collapse(true);
		range.moveEnd('character', nPosicion);
		range.moveStart('character', nPosicion);
		range.select();
	}
	else if (oControl.setSelectionRange)
	{
		oControl.focus();
		oControl.setSelectionRange(nPosicion, nPosicion);
	}
}
///
///  Reescribimos el onclick del documento para detectar si se ha pinchado fuera de la lista de sugerencias y ocultarla
///
document.onclick = function (e)
{
	 e = e || event
	 var target = e.target || e.srcElement
	 var elemento = document.getElementById('listaSugerencias');
	 if (elemento)
	 {
	 	do
		{
	  		if (elemento == target)
			{
	   			// El click se ha producido dentro del elemento, no se hace nada.
	   			return;
	  		}
	  		target = target.parentNode;
	 	}
		
		while (target)
	 	{
			// Se ha clicado fuera del elemento, se realiza una acci�n.
	 		elemento.style.visibility = 'hidden';
		}
	 }
}
