// Version 1.0.0
var aMsgsForms = new Array();
aMsgsForms[0] = 'Ha de rellenar todos los campos marcados como obligatorios';

// Variables globales
getById = function ( sId ) { return document.getElementById(sId); }	// Recupera un elemento por atributo id
getByName = function ( sName ) {return document.getElementsByName( sName ); }	// Recupera colección de elementos por atributo name
getObj = function ( objId ) {return (typeof objId == 'string' ) ? getById(objId) : objId; }
getAttr = function( sId, sAttr ) {return getObj( sId ).getAttributes( sAttr ); }

// Función chequeaClaves
function chequeaClaves( sClave, sClave2, sMsg )
{
	if( getObj(sClave).value == getObj(sClave2).value )
		return true;
	else
	{
		showMsg( sMsg );
		getObj( sClave ).value = '';
		getObj( sClave2 ).value = '';
		getObj(sClave).focus();
		getObj(sClave).select();
	}
	return false;
}

// Función chequeaValores:
// param sRequired: Nombre del campo que contiene la lista de campos a comprobar, separados por comas
// param sMsg: Mensaje que aparecerá
// Comprueba que los campos indicados en el parametro sRequired esten rellenos, separados estos por comas.
// Si viene informado el campo sFormats, será para la comprobación de formato, de la siguiente manera campo:formato,campo:formato,...
// Si no estubieran rellenos, mostrará un mensaje en un alert.
// Si sMsg viene informado, mostrará este mensaje. Si no buscará el atributo titlte de cada objeto a chequear, usando este.
function chequeaValores( sRequired, sFormats, sMsg )
{
	if( sFormats && sFormats != '' )
		if ( ! chequeaFormatos( sFormats, sMsg ) )
			return false;

	var aReq = getObj( sRequired ).value.split(',' );
	if( aReq )
	{
		for( var iCnt = 0; iCnt < aReq.length; iCnt++ )
		{
			var objFrm = getById( trim(aReq[iCnt]) );
			if( objFrm && objFrm.type )
			{
				switch( objFrm.type )
				{
					case 'text':
					case 'html':
					case 'textarea':
					case 'password':
					case 'file':
						if( trim( objFrm.value ) == '' )
						{
							showMsg( sMsg, objFrm.title );
							objFrm.value = '';
							if( 'html' == objFrm.type )
								tinyMCE.execCommand( 'mceFocus', true, trim(aReq[iCnt]) );
							else
								objFrm.focus();
							objFrm.select();
							return false;
						}
						break;
					case 'radio':
						var objRD = getByName( objFrm.id );
						var rbChecked = false;
						for( var j = 0; j < objRD.length; j++ )
						{
							if ( objRD[j].checked )
							{
								rbChecked = true;
								break;
							}
						}
						if( ! rbChecked )
							showMsg( sMsg, objFrm.title );
						return rbChecked;
						break;
					case 'checkbox':
						if( ! objFrm.checked )
						{
							showMsg( sMsg, objFrm.title );
							objFrm.focus();
							return false;
						}
						break;
					case 'select-one':
						if( objFrm.selectedIndex == -1 || objFrm.options[objFrm.selectedIndex].value == '' )
						{
							showMsg( sMsg, objFrm.title );
							objFrm.focus();
							return false;
						}
						break;

					case 'select-multiple':
						if( objFrm.selectedIndex == -1 )
						{
							showMsg( sMsg, objFrm.title );
							objFrm.focus();
							return false;
						}
						break;
					case 'hidden':
						// Si es del tipo hidden, no hacemos nada
						break;
					default:
						// Ver si esto se puede dar.
						alert( 'No está contemplado el tipo [' + objFrm.type + '] para el objeto ' + objFrm.id + '. Avise al webmaster para que lo contemple si lo cree necesario' );
				}
			}
		}
	}
	return true;
}

// Muestra un mensaje en sIdTab si viene informado. Si no llama a alert
// Si sMsg biene relleno, muestra este, si no mostrará sTit. Si este ultimo no vienera rellenmo, mmostrará uno generico
function showMsg( sMsg, sTit )
{
	var sAux = '';
	if( sMsg && trim(sMsg) != '' )
		sAux = sMsg;
	else
	{
		if( sTit && trim(sTit) != '' )
			sAux = sTit + ' esta vacio. Rellene el campo';
		else
			sAux = aMsgsForms[0];
	}
	alert( sAux );
}

// Invierte la selección de las checkbox indicadas.
// param sName: Nombre del array de checkbox.
function changeAll( sName )
{
	var colElems = getByName( sName );
	for (var i = 0; i < colElems.length; i++)
		if( colElems[i].type == 'checkbox')
			colElems[i].checked = !(colElems[i].checked);
}

// Elimina espaciones en blanco por la izquierda de la cadena str
function trimLeft( str )
{
   return(str)?str.replace(/^[ \t]*/g,""):str;
}

// Elimina espaciones en blanco por la derecha de la cadena str
function trimRight( str	)
{
   return(str)?str.replace(/[ \t]*$/g,""):str;
}

// Elimina espaciones en blanco por la izquierda y la derecha de la cadena str
function trim( str )
{
   return trimRight(trimLeft(str));
}

// Sección para la comprobación de formatos de datos en los formularios
var F_ALPHA = 'A';
var F_NUMBER = 'N';
var F_ANUMBER = 'AN';
var F_DATE = 'F';
var F_MAIL = 'M';

var aExpReg = new Array();
aExpReg[F_NUMBER]		= /\b\D+[^0-9+]\b/; // Cadena numérica
aExpReg[F_ALPHA]	= /\b\d+[^A-Z+]\b/i; // Cadena alfabética
aExpReg[F_ANUMBER]	= /\b\w+\b/i; // Cadena alfanumérica
aExpReg[F_DATE] 		= /\b\d{2}\/\d{2}\/\d{4}\b|\b\d{2}-\d{2}-\d{4}\b|\b\d{4}\/\d{2}\/\d{2}\b|\b\d{4}-\d{2}-\d{2}\b/; // Fecha

aExpReg[F_MAIL]		= /\b\D[^0-9+][a-z0-9._-]+@\D[^0-9+][a-z0-9._-]+\b/i; // e-mail

var diasMes = new Array();
diasMes["01"] = 31;
diasMes["02"] = 29;
diasMes["03"] = 31;
diasMes["04"] = 30;
diasMes["05"] = 31;
diasMes["06"] = 30;
diasMes["07"] = 31;
diasMes["08"] = 31;
diasMes["09"] = 30;
diasMes["10"] = 31;
diasMes["11"] = 30;
diasMes["12"] = 31;

function chequeaFormatos( sFormats, sMsg )
{
	var iAux = 0;
	var aReq = getObj( sFormats ).value.split(',');
	if( aReq )
	{
		for( iAux = 0; iAux < aReq.length; iAux++ )
		{
			var aVar = trim(aReq[iAux]).split( ':' );
			var objFrm = getById( trim(aVar[0]) );
			if( objFrm && objFrm.value != '' )
			{
				switch( objFrm.type )
				{
					case 'text':
					case 'textarea':
					case 'password':
						if( ! cumpleFormato( aVar[1], objFrm.value ) )
						{
							showMsg( objFrm.title + ' tiene un formato incorrecto. Vuelvalo a introducir', null );
							objFrm.focus();
							objFrm.select();
							return false;
						}
					break;
				}
			}
		}
	}
	return true;
}

function cumpleFormato( sFormato, sValor )
{
	if( sFormato.charAt(0) == F_DATE )
		return ((sValor.match(aExpReg[F_DATE]))&&(comprobarFecha(sFormato.substr(1),sValor)));
	else if( sFormato == F_NUMBER )
		return !isNaN( parseFloat( sValor ) );
	else if( sFormato == F_ALPHA )
		return isNaN( sValor );
	else if( sFormato != '' )
	{
		return (sValor.match(aExpReg[sFormato]));
	}
	else
		return true;
}

function comprobarFecha( sFormato, sValor )
{
	var camposFecha = new Array();
	if( -1 != sFormato.indexOf( '/' ) )
		camposFecha = sFormato.split('/');
	else
	{
		if( -1 != sFormato.indexOf( '-' ) )
			camposFecha = sFormato.split('-');
		else
			return false;
	}
	return fechaValida(obtenerCampo(sFormato, sValor, 'DD'), obtenerCampo(sFormato, sValor, 'MM'), obtenerCampo(sFormato, sValor, 'YYYY') );
}

function obtenerCampo( sFormatoCampos, sValores, sIdCampo )
{
	var iAux;
	iAux = sFormatoCampos.indexOf(sIdCampo);
	if( iAux != -1 )
		return sValores.substr(iAux,sIdCampo.length);
	else
		return '';
}

function fechaValida( sDia, sMes, sAno )
{
	if( sDia == '' || sMes == '' ||sAno == '' )
		return false;
	if( dentroRango(sDia, 1, diasMes[sMes]) && dentroRango(sMes,1,12) )
	{
		if( ! anyoBisiesto(sAno) )
		{
			if( sDia == 29 && sMes == 02 )
				return false;
			else
				return true;
		}
		else
			return true;
	}
	return false;
}

function dentroRango(campo, lo, hi)
{
	if( campo && campo != '' )
	{
		try
		{
			var num = parseInt(campo, 10);
			return !(isNaN(campo)||num < lo || num > hi);
		}
		catch(error)
		{
			return false;
		}
	}
	return false;
}

function anyoBisiesto(year)
{
	return (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0));
}

function checkAll( sParent )
{
	colElems = document.getElementById( sParent ).getElementsByTagName( 'input' );
	for (var i = 0; i < colElems.length; i++ )
		if( colElems[i].type == 'checkbox' )
			colElems[i].checked = !(colElems[i].checked);
}
