; // Cambiar entre 0 y 9 - Version del archivo (utilizar números enteros)

var gVersion = 'v1.0.1';
var gbMostrarVersion = false;

if(gbMostrarVersion) alert(gVersion);

/*===================================================================
 function: repetir
 	Repite sTexto hasta llegar a iRepetir.
 Devuelve:
	El string resultado.
 Parametros:
 	sTexto		->	El texto a repetir.
 	iRepetir	->	La cantidad de veces.
=====================================================================*/

function escapeHTML (str)
{
	if (!str) return '';
	var div = document.createElement('div');
	var text = document.createTextNode(str);
	div.appendChild(text);
	return div.innerHTML;
}

/*===================================================================
 function: repetir
 	Repite sTexto hasta llegar a iRepetir.
 Devuelve:
	El string resultado.
 Parametros:
 	sTexto		->	El texto a repetir.
 	iRepetir	->	La cantidad de veces.
=====================================================================*/

function repeat(sText, iRepeat)
{
	try
	{
		var sComplete = '';

		if (sText.length != 1 ) return false;

		for(iPos = 0; iPos < iRepeat; iPos++)
			sComplete += sText;

		return sComplete;
	}
	catch(oError)
	{
		return null;
	}
}
/*===================================================================
 function: textComplete
 	Completa el value de oInput, con sText hasta llegar al máximo.
 Devuelve:
	True si todo OK, false en caso que los datos no concuerden,
	null en caso de error.
 Parametros:
 	oInput			->	Objeto Input de tipo.
 	sText			->	El texto a repetir.
 	bCompleteEmpty	->	Completar aún si está vacio.
=====================================================================*/

function textComplete(oInput, sText, bCompleteEmpty)
{
	try
	{
		if (!oInput || !sText		) return false;
		if (sText.length != 1		) return false;
		if (oInput.type   != 'text'	) return false;
		if (!bCompleteEmpty && oInput.value == '') return true;

		var iMax = parseInt(oInput.getAttribute('maxLength'));
		var iRepeat = 0;
		var sComplete = '';

		if (!isNaN(iMax) && iMax != oInput.value.length)
			iRepeat = (iMax - oInput.value.length);

		sComplete = repeat(sText, iRepeat) + oInput.value;

		oInput.value = sComplete;
		return true;
	}
	catch(oError)
	{
		return null;
	}
}

/*===================================================================
 function: selectOption
 	Selecciona un valor de un SELECT, o el primero si no encontró
 	el valor y bPrimero es TRUE.
 Devuelve:
	No retorna ningún valor.
 Parametros:
 	oSelect	->	El objeto SELECT en el cual debe buscarse sDato.
 	oData	->	Cadena o Array de cadenas a buscar en value del
 				SELECT.
=====================================================================*/

function selectOption(oSelect, oData, bFirst)
{
	try
	{
		var sData = null;

		if (typeof(oData) !== 'object')
			oData = new Array(oData);

		oSelect.selectedIndex = -1;
		for(j = 0; j < oData.length; j++)
		{
			sData = oData[j];
			for(i = 0; i < oSelect.options.length; i++)
			{
				if (oSelect.options[i].value == sData)
				{
					if (oSelect.multiple)
						oSelect.options[i].selected = true;
					else
					{
						oSelect.selectedIndex = i;
						break;
					}
				}
			}
		}

		if (bFirst && oSelect.selectedIndex == -1 && oSelect.options.length)
			oSelect.selectedIndex = 0;

		return oSelect.selectedIndex;
	}
	catch(oError)
	{
		return false;
	}
}

/*===================================================================
 function: allOptionsSelected
 	Pone como en true el atributo selected de todos los option de
 	un elemento SELECT.
 Devuelve:
	Retorna true.
 Parametros:
 	sCombo	->	El ID del objeto.
=====================================================================*/

function allOptionsSelected(vSelect)
{
	if (typeof(vSelect) == 'string' )
		var oSelect = $('#' + vSelect + ' > option');
	else if (typeof(vSelect) == 'object' && vSelect.nodeName.toUpperCase() == 'SELECT' )
		var oSelect = $(vSelect).find('option');
	else
		return false;

	oSelect.attr('selected','selected');
	return true;
}

/*********************************************************************
Funcion: showHideUntil
Motivo:
	Muestra u oculta los campos, se utiliza usualmente para manejo
	de filtros DESDE - HASTA y Operacion.
Parametros:
	oSelect		->	Es SELECT que actua como filtro.
	sObjID		->	Es ID del objeto a ocultar/mostrar.
	bNoClean	->	Si TRUE no inicializa el valor del INPUT encerrado
					en sObjID.
Devuelve:
	True si todo OK, false si no existe el select.
**********************************************************************/
function showHideUntil(oSelect, sObjID, bNoClean)
{
	if (!oSelect) return false;

	if (oSelect.value != 'between')
		$('#' + sObjID).hide();
	else
		$('#' + sObjID).show();

	if (!bNoClean)
	{
		$('#' + sObjID).find('*:input').each(
			function(iPos, oInput)
			{
				oInput.value = '';
			});
	}

	return true;
}

/*********************************************************************
Funcion: trim
Motivo:
	Elimina los espacios al principio y al final.
Parametros:
	cadena	->	La cadena a la que se le quiere aplicar la funcion.
Devuelve:
	La cadena resultado.
**********************************************************************/

function trim(sString)
{
  sString = sString.replace(/^\s*|\s*$/g,"");
  return sString;
}

/*********************************************************************
Funcion: moveOption
Motivo:
	Mueve un elemento Option desde un SELECT hacia otro.
Parametros:
	cadena	->	La cadena a la que se le quiere aplicar la funcion.
Devuelve:
	La cadena resultado.
**********************************************************************/

function moveOption(sSourceID, sDestinationID)
{
	var oSource	= $('#' + sSourceID);
	var oDest	= $('#' + sDestinationID);

	if (oSource.length == 0) return;
	if (oDest.length == 0) return;

	oSource = oSource[0];
	oDest = oDest[0];

	if (oSource.nodeName.toLowerCase() != 'select' ||
		oDest.nodeName.toLowerCase() != 'select') return false;

	for(iPos = 0; iPos < oSource.options.length; iPos++)
	{
		if (oSource.options[iPos].selected)
		{
			var oOption = $.extend(true, {}, oSource.options[iPos]);
			oDest.add(oOption, null);
		}
	}

	// Hay que eliminar de atrás para adelante para que
	// no cambie el index
	for(iPos = oSource.options.length - 1; iPos >= 0; iPos--)
	{
		if (oSource.options[iPos].selected)
		{
			oSource.remove(oOption.index);
		}
	}

}

/*===================================================================
 function: mostrarMensaje
 	Muestra un mensaje en un elemento DIV o SPAN.
 Devuelve:
	No retorna ningún valor.
 Parametros:
 	oObj	 -> EL DIV en donde se muestra el mensaje
 	sMensaje -> El mensaje.
 	bError	 -> Si el mensaje es un error se muestra en rojo, sino
 				en negro.
 	bText	 -> Si el mensaje debe ser mostrado como texto, ignorando
 				el HTML.
 	bNL2BR	 -> Cambia retornos de carro por elementos <br/>.
=====================================================================*/
function showMessage(oObj, sMessage, bError, bText, bNL2BR)
{
	if (!sMessage || sMessage == null) sMessage = '';

	if (bText)
	{
		oObj.text(sMessage);
		if (bNL2BR)
		{
			sMessage = oObj.html();
			sMessage = sMessage.replace(/(\n)/g, '\n<br/>');
			oObj.html(sMessage);
		}

	}
	else
	{
		if (bNL2BR)
			sMessage = sMessage.replace(/(\n)/g, '\n<br/>');
		oObj.html(sMessage);
	}

	if (bError)
	{
		oObj.css('text-weight', 'bold');
		oObj.css('color', 'red');
	}
	else
	{
		oObj.css('text-weight', 'normal');
		oObj.css('color', 'black');
	}
	oObj.show();
}

/*===================================================================
 function: highlightTextBoxes
 	Destaca un cuadro de texto cuando tiene el foco
 Devuelve:
	No retorna ningún valor.
 Parametros:
=====================================================================*/
function highlightTextBoxes()
{
	var oText = $('input[type=text], textarea, input[type=password], select');

	oText.focus(function(){
						if ($(this).css('color') != '000000' ||
							$(this).css('color') != 'black' )
						{
							$(this)[0].setAttribute('oldcolor', $(this).css('color'));
						}

						$(this).css('color', 'black');
						if (!this.readOnly)
							$(this).css('background-color', '#FDFBAA');
						else
							$(this).css('background-color', '#FFD8B0');
					});

	oText.blur(function(){
						$(this).css('background-color', '');

						if ($(this)[0].getAttribute('oldcolor') &&
							$(this)[0].getAttribute('oldcolor') != '')
						{
							$(this).css('color', $(this)[0].getAttribute('oldcolor'));
						}
					});

}

/*===================================================================
 function: ShowHide
 	Mostrar/Ocultar objetos por el ID en el CLICK, pueden ser
	varios separados por comas (sin espacios).

	Se espera que el objeto oObjectShowHide tenga el atributo "obj"
	que indica el ID (o IDs) del objeto a Mostrar/Ocultar.
	Tipos de funcionamiento:
	<input type="checkbox" />
		Si el atributo "checked" es true se muestra y se oculta en
		caso contrario. Si existe el atributo "invertir" y es distinto
		de vacio entonces funciona al revés.
	Otros objetos:
		Cambia a Oculto si está visible y viseversa.

	El cambio se aplica utilizando un atributo "style".
 Devuelve:
	No retorna ningún valor.
 Parametros:
 	oObjectShowHide -> El objeto llamante
=====================================================================*/
function showHide(oObjectShowHide)
{
	if (oObjectShowHide.getAttribute('obj') == '') return;

	var aObjects = oObjectShowHide.getAttribute('obj').split(',');
	var bInvertir = oObjectShowHide.getAttribute('invertir') != '';

	for(iPos = 0; iPos < aObjects.length; iPos++)
	{
		if ($('#' + aObjects[iPos]).length == 1)
		{
			if (oObjectShowHide.tagName.toLowerCase() != 'input')
			{
				$('#' + aObjects[iPos]).toggle();
			}
			else if (!bInvertir)
			{
				if (oObjectShowHide.checked)
					$('#' + aObjects[iPos]).show();
				else
					$('#' + aObjects[iPos]).hide();
			}
			else
			{
				if (oObjectShowHide.checked)
					$('#' + aObjects[iPos]).hide();
				else
					$('#' + aObjects[iPos]).show();
			}
		}
	}

	if (oObjectShowHide.getAttribute('focus') && $('#' + oObjectShowHide.getAttribute('focus')).length )
	{
		if ($('#' + oObjectShowHide.getAttribute('focus')).css('display') != 'none' )
			$('#' + oObjectShowHide.getAttribute('focus')).focus();
	}

}

/*===================================================================
 function: insertDateSeparator
 	Modifica un objeto INPUT poniendo barras para la fecha
 	formato: __/__/____. Se debe usar en KeyDown.
 Devuelve:
	No retorna ningún valor.
 Parametros:
 	oDate 		-> El objeto INPUT a modificar
 	sSeparator	-> (opcional) El separador de la fecha
=====================================================================*/

function insertDateSeparator(oDate, sSeparator)
{
	try {
		if(
			event.keyCode ==  8 ||	// Backspace
			event.keyCode ==  9 ||	// Tab
			event.keyCode == 16 ||	// Shift
			event.keyCode == 17 ||	// Control
			event.keyCode == 18 ||	// Alt
			event.keyCode == 20 ||	// Block mayus
			event.keyCode == 26 ||	// Tab
			event.keyCode == 27 ||	// Escape
			event.keyCode == 35 ||	// End
			event.keyCode == 36 ||	// Home
			event.keyCode == 37 ||	// Left Arrow
			event.keyCode == 39 ||	// Right Arrow
			event.keyCode == 45 ||	// Insert
			event.keyCode == 46 	// Delete
		  )
		  	return;
		}
	catch(e){}

		if (!sSeparator) sSeparator = '/';

		if( oDate.value.length == 2 &&
			oDate.value.indexOf(sSeparator, 0) == -1
		  )
		{
			oDate.value = oDate.value.substring(0,2) + sSeparator;
		}
		else if( oDate.value.length == 4 &&
			oDate.value.indexOf(sSeparator, 3) != -1)
		{
			oDate.value = oDate.value.substring(0,3);
		}
		else if(oDate.value.length == 5 &&
				oDate.value.indexOf(sSeparator, 3) == -1)
		{
			oDate.value = oDate.value.substring(0,5) + sSeparator;
		}
		else if( oDate.value.length == 7 &&
			oDate.value.indexOf(sSeparator, 6) != -1)
		{
			oDate.value = oDate.value.substring(0,6);
		}
}

