/************************ CONSTANTES ***********************************/
/******************************************************************/
/******************************************************************/
/******************************************************************/


var DATE_SEPARATOR = '/'; 

/************************ /CONSTANTES ***********************************/


/********************** FUNCIONES COMUNES **************************/
/******************************************************************/
/******************************************************************/
/******************************************************************/

/*************************************************************
* Nombre:       InicializaTitulo
* Description:  Establece el título de la ventana actual.
* Parámetros: 
*	- titulo: titulo a establecer
* Devuelve: 
*************************************************************/
function InicializaTitulo(titulo)
{	
	parent.document.title = titulo;
}

/*************************************************************
* Nombre:       CheckMaxLength
* Finalidad:	No permite introducir más palabras al usuario 
*				si se ha llegado al máximo.
*				Debe asociarse al evento keyUp del objeto.
* Entrada:      object -> objeto sobre el que debemos aplicar la longitud máxima.
*				maxlength -> longitud máxima longitud de carácteres.
* Salida:       
* Retorno:      
*************************************************************/				
function ComprobarLongitudMaxima(object, maxlength)
{
	if (object.value.length > maxlength)
	{
		object.value = object.value.substring(0, maxlength);
	}
}

/*************************************************************
* Nombre:       IsUndefined 
* Descripción:    Comprueba si un objeto es undefined.
* Parámetros:      
*	- obj: Objeto a validar.
* Devuelve:      True o False dependiendo de si el objeto es 
*				undefined o no.
*************************************************************/
function IsUndefined(obj)
{
	return typeof(obj) == "undefined";
}

/************************************************************* 
* Nombre: SetValidatorStatus 
* Finalidad: Activar o desactivar el validador en cuestión 
* Entrada: El control a cambiar su estado y el estado en que se encuentra 
* Salida: 
* Retorno: 
*************************************************************/ 
function SetValidatorStatus( control, status ) 
{
         if( status )
         { 
                control.enabled = true;
                control.isvalid = true;
          } 
          else 
          { 
                control.enabled = false;
                control.style.visibility = "hidden";
                control.isvalid = true;
           }
 }
 
/********************** /FUNCIONES COMUNES **************************/

/********************** FUNCIONES FECHA **************************/
/******************************************************************/
/******************************************************************/
/******************************************************************/


/*************************************************************
* Nombre:       InicializarCalendario
* Descripción:  Inicializa los campos de fecha con calendario.
* Parámetros: 
*	- custValDate: validador del campo de fecha
*	- idioma     : idoma para el calendario
* Devuelve:		La ventana popup del calendario
*************************************************************/
function InicializarCalendario(custValDate, idioma)
{
	var date = new CalendarPopup();
	date.setWeekStartDay(1);
	var validator = document.getElementById(custValDate);
	if (validator != null)
	{
		date.setCustomValidator(validator);										
	}
	
	if (idioma == "es-ES")
	{
		date.setTodayText("Hoy");
		date.monthNames				= new Array("Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre");
		date.monthAbbreviations = new Array("Ene","Feb","Mar","Apr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic");
		date.dayHeaders			= new Array("D","L","M","X","J","V","S");
	}
	else
	{
		date.setTodayText("Today");
		date.monthNames			= new Array("January","February","March","April","May","June","July","August","September","October","November","December");
		date.monthAbbreviations = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
		date.dayHeaders			= new Array("SU","M","T","W","TH","F","SA");
	}
	
	return date;
}

/*************************************************************
* Nombre:       CambiarFecha
* Finalidad:    Lanzar el evento onchange cuando el campo fecha 
*				no se ha infromado correctamente.
* Entrada:		field -> objeto sobre el que se lanza el evento
* Salida:		
* Retorno:      
*************************************************************/
function CambiarFecha(field)
{
	if( field.value.lenght != 10 && field.value.lenght > 0 )
	{
		field.fireEvent("onchange");
	}
}

/*************************************************************
* Nombre:       EsBisiesto
* Descripción:    Comprueba si un año es bisiesto.
* Parámetros:      
* 	- year: año a validar.
* Devuelve:      True o False dependiendo de si el año es bisiesto o no.
*************************************************************/
function EsBisiesto(year)
{
	// Si el año tiene dos cifras, se convierte a 4 cifras (Ej.- 12 --> 2012)
	if (year < 100)
		var end = eval(parseInt(year, 10) + 2000);
	else
		var end = year ;

	// Si el año no es múltiplo de 4 no es bisiesto
	if (end % 4 != 0)
		return false;
	else
	{
		if (end % 100 == 0)
		{
			if (end % 400 == 0)
			{
				// Si el año es múltiplo de 4, 100 y 400, es bisiesto
				return true;
			}
			else
			{
				// Si el año es múltiplo de 4 y de 100, pero no de 400, 
				// no es bisiesto
				return false;
			}
		}
		else
		{
			// Si el año es múltiplo de 4 y no de 100, es bisiesto
			return true;
		}
	}
}

/*************************************************************
* Nombre:       ValidarFecha 
* Descripción:    Comprueba si una fecha es correcta.
* Parámetros:
*	- validatorField: Validador del campo
*   - dateField: campo de fecha
* Devuelve:      True o False dependiendo de si la fecha es correcta.
*************************************************************/
function ValidarFecha(validatorField, dateField)
{

	if (dateField.length == 0)
		return;
		
	var february = 28; // Días de Febrero
	var valid = true;
	sep = DATE_SEPARATOR;
			
	// Se recuperan el día, mes y año de la fecha recibida
	var date = dateField.Value.split(sep);
	var day = date[0];
	var month = date[1];
	var year = date[2];
		
	if (isNaN(day) || isNaN(month))
	{
		// La fecha no es válida
		dateField.IsValid = false;
		return false;
	}
	else
	{
		if (IsUndefined(year))
		{
			var now = new Date();
			year = now.getYear().toString();
		}
		
		if (isNaN(year))
		{
			// La fecha no es válida
			dateField.IsValid = false;
			return false;
		}
			
		if (year.length == 0)
		{
			var now = new Date();
			year = now.getYear();
		}		
		else
		{ 
			if (year.length == 2)
			{			
				year = eval(2000 + parseInt(year, 10));
			}
			else if ((year.length != 4))
			{
				// La fecha no es válida
				dateField.IsValid = false;
				return false;
			}
		}
	}
	
	// Se comprueba si el año es bisiesto
	if (EsBisiesto(year))
	{
		february = 29;
	}
	
	// Si el mes tiene más de 2 dígitos es incorrecto
	if( month.length > 2)
	{
		dateField.IsValid = false;
		return false;
	}	
	
	// Si el día tiene más de 2 dígitos es incorrecto
	if( day.length > 2)
	{
		dateField.IsValid = false;
		return false;
	}	
	
	// Si el mes no está entre 1 y 12, la fecha no es válida
	if ((month < 1) || (month > 12))
	{
		// La fecha no es válida
		dateField.IsValid = false;
		return false;
	}
	
	// Si el mes es febrero se valida el día
	if ((month == 2) && ((day < 1) || (day > february)))
	{
		// La fecha no es válida
		dateField.IsValid = false;
		return false;
	}
	
	// Si el mes tiene 31 días y el día no está entre 1 y 31
	if (((month == 1) || (month == 3) || (month == 5) || 
		 (month == 7) || (month == 8) || (month == 10) || (month == 12)) && 
		 ((day < 1) || (day > 31)))
	{
		// La fecha no es válida
		dateField.IsValid = false;
		return false;
	}
	
	// Si el mes tiene 30 días y el día no está entre 1 y 30
	if (((month == 4) || (month == 6) || (month == 9) || 
		 (month == 11)) && ((day < 1) || (day > 30)))
	{
		// La fecha no es válida
		dateField.IsValid = false;
		return false;
	}
	
	// Si el día tiene una cifra, se le agrega un 0 a la izquierda
	if (day.length == 1)
		day = "0" + day;
		
	// Si el mes tiene una cifra, se le agrega un 0 a la izquierda
	if (month.length == 1)
		month = "0" + month;
		
	// Se construye la fecha
	dateField.Value =  day + sep + month + sep + year;

	// La fecha es válida
	dateField.IsValid = true;
	
	// Informamos el campo con el valor completo de la fecha
	if( document.getElementById(validatorField.controltovalidate) )
	{
		document.getElementById(validatorField.controltovalidate).value = dateField.Value;
	}
	
	return true;
}

/********************** /FUNCIONES FECHA **************************/


/*************** FUNCIONES DE CAMPOS NUMÉRICOS *********************/
/******************************************************************/
/******************************************************************/
/******************************************************************/


// Separadores de miles y decimales de los campos numéricos
var decimalSeparator = ",";
var groupSeparator = ".";

/*************************************************************
* Nombre:       RemoveDots
* Finalidad:    Elimina los caracteres de miles que hay en el valor del campo.
*				Además selecciona todo el contenido del campo.
* Entrada:      field. Objeto del que se quiere eliminar los separadores de miles.
* Salida:       
* Retorno:      
*************************************************************/
function RemoveDots(field)
{		
	RemoveDotsCommon(field);		

	// Se selecciona el valor del campo
	field.select();
}

/*************************************************************
* Nombre:       RemoveDotsCommon
* Finalidad:    Elimina los caracteres de miles que hay en el valor del campo.
* Entrada:      field. Objeto del que se quiere eliminar los separadores de miles.
* Salida:       
* Retorno:      
*************************************************************/
function RemoveDotsCommon(field)
{		
	// Mientras tenga separador de miles se eliminan			
	while( field.value.indexOf(groupSeparator) > -1)
	{
		field.value = field.value.replace(groupSeparator,"");		
				
	}
					
}

/*************************************************************
* Nombre:       RemoveDotsUnFocussed
* Finalidad:    Elimina los caracteres de miles que hay en el valor del campo.
*				No selecciona el contenido del campo.
* Entrada:      field. Objeto del que se quiere eliminar los separadores de miles.
* Salida:       
* Retorno:      
*************************************************************/
function RemoveDotsUnFocussed(field)
{		
	RemoveDotsCommon(field);		
}

/*************************************************************
* Nombre:       InsertDots 
* Finalidad:    Añade los separadores de miles al campo, además rellena con ceros los decimales
*				no informados. Si la parte entera es mayor que lo permitido trunca a la longitud máxima.
*				Y para la parte decimal redondea.
* Entrada:      campo. Objeto del que se quiere añadir los separadores de miles.
* Salida:       
* Retorno:      
*************************************************************/
function InsertDots(field, numIntegers, numDecimals)
{		
	var factor = Math.pow(10,numDecimals);
	var result = "";
	var divisor = factor;
	var number;
	
	// Se cambia la coma por el punto para que pueda ser interpredato por el script
	number = field.value.toString();//.replace(decimalSeparator,groupSeparator);

	// Si no es un numérico se pone el resultado a blanco
	if(isNaN(number) || number.length == 0)
	{					
		field.value = "";
		return;
	}

	// Se recupera los signos, los decimales.
	sign = (number == (number = Math.abs(number))); 
	number = Math.floor(number * factor + 0.50000000001); 
	//number = Math.floor(number * factor); 
	
	cents = number % factor; 
	number = Math.floor(number/factor).toString();

	// Si el número tiene mayor longitud que la permitida se trunca
	if( number.length > numIntegers)
	{
		number = number.substring(0,numIntegers);
	}

	// Se rellena el número de decimales que faltan
	for (i=0; i<numDecimals-1; i++) 
	{ 
		divisor = divisor / 10;
		if( cents < divisor )
		{
			cents = "0" + cents; 
		}
	} 

	// Se añaden los separadores de miles
	for (var i = 0; i < Math.floor((number.length-(1+i))/3); i++)
	{
		//number = number.substring(0,number.length-(4*i+3))+ groupSeparator +
		//number.substring(number.length-(4*i+3));
		number = number.substring(0,number.length-(4*i+3)) +
		number.substring(number.length-(4*i+3));
	}
	
	// Si el número es cero
	if ( (number == 0) && (cents == 0) )
	{
		result = number;
	}
	// Se pone el signo al número
	else
	{
		result = ((sign)?'':'-') + number;
	}
	
	// Si tiene decimales se añaden al número
	if (numDecimals > 0) 
	{
		result = result + decimalSeparator + cents;
	}

	// Se vuelca la información al campo
	field.value = result;
}

/*************************************************************
* Nombre:       InsertDots 
* Finalidad:    Añade los separadores de miles al campo, además rellena con ceros los decimales
*				no informados. Si la parte entera es mayor que lo permitido trunca a la longitud máxima.
*				Y para la parte decimal redondea.
* Entrada:      campo. Objeto del que se quiere añadir los separadores de miles.
* Salida:       
* Retorno:      
*************************************************************/
function InsertPositiveDots(field, numIntegers, numDecimals)
{		
	var factor = Math.pow(10,numDecimals);
	var result = "";
	var divisor = factor;
	var number;
	
	// Se cambia la coma por el punto para que pueda ser interpredato por el script
	number = field.value.toString();//.replace(decimalSeparator,groupSeparator);


	//Se le cambia el separador para que sea el de decimales.
	while( number.indexOf(decimalSeparator) > -1)
		{
			number = number.replace(decimalSeparator,groupSeparator);		
					
		}


	// Si no es un numérico se pone el resultado a blanco
	if(isNaN(number) || number.length == 0)
	{					
		field.value = "";
		return;
	}

	// Se recupera los signos, los decimales.
	sign = (number == (number = Math.abs(number))); 
	number = Math.floor(number * factor + 0.50000000001); 
	//number = Math.floor(number * factor); 
	cents = number % factor; 
	number = Math.floor(number/factor).toString();

	// Si el número tiene mayor longitud que la permitida se trunca
	if( number.length > numIntegers)
	{
		number = number.substring(0,numIntegers);
	}

	// Se rellena el número de decimales que faltan
	for (i=0; i<numDecimals-1; i++) 
	{ 
		divisor = divisor / 10;
		if( cents < divisor )
		{
			cents = "0" + cents; 
		}
	} 

	// Se añaden los separadores de miles
	for (var i = 0; i < Math.floor((number.length-(1+i))/3); i++)
	{
		//number = number.substring(0,number.length-(4*i+3))+ groupSeparator +
		//number.substring(number.length-(4*i+3));
		number = number.substring(0,number.length-(4*i+3))+ 
		number.substring(number.length-(4*i+3));
	}
	
	result = number;
	
	// Si tiene decimales se añaden al número
	if (numDecimals > 0) 
	{
		result = result + decimalSeparator + cents;
	}

	// Se vuelca la información al campo
	field.value = result;
}

/************** /FUNCIONES DE CAMPOS NUMÉRICOS *********************/


/************** FUNCIONES DE VENTANAS MODALES *********************/
/******************************************************************/
/******************************************************************/
/******************************************************************/

/*************************************************************
* Nombre:       CerrarVentana 
* Finalidad:    Cierra la ventana que esta abierta en modo modal.
* Entrada:      
* Salida:       
* Retorno:      
*************************************************************/
function CerrarVentana()
{
	window.close();
	return false;
}

/*************************************************************
* Nombre:       DevolverDatos 
* Finalidad:    Cierra la ventana que esta abierta en modo modal y devuelve 
*				el valor a la ventana padre.
* Entrada:      
* Salida:       
* Retorno:      
*************************************************************/
function DevolverDatos(idFavorito)
{
	window.returnValue = idFavorito;
	window.close();
	return false;
}
			
/************** /FUNCIONES DE VENTANAS MODALES *********************/			


/************** FUNCIONES DE VALIDACIONES NIF/CIF *********************/
function ValidarCIF(texto)
{
	var pares = 0;
	var impares = 0;
	var suma;
	var ultima;
	var unumero;
	var uletra = new Array("J", "A", "B", "C", "D", "E", "F", "G", "H", "I");
	var aux;

	texto = texto.toUpperCase();

	var regular = new RegExp(/^[ABCDEFGHKLMNPQS]\d\d\d\d\d\d\d[0-9,A-J]$/g);
	if (!regular.exec(texto)) return false;

	ultima = texto.substr(8,1);

	for (var cont = 1 ; cont < 7 ; cont ++){
	aux = (2 * parseInt(texto.substr(cont++,1))).toString() + "0";
	impares += parseInt(aux.substr(0,1)) + parseInt(aux.substr(1,1));
	pares += parseInt(texto.substr(cont,1));
	}
	aux = (2 * parseInt(texto.substr(cont,1))).toString() + "0";
	impares += parseInt(aux.substr(0,1)) + parseInt(aux.substr(1,1));

	suma = (pares + impares).toString();
	unumero = parseInt(suma.substr(suma.length - 1, 1));
	unumero = (10 - unumero).toString();
	if(unumero == 10) unumero = 0;

	if ((ultima == unumero) ||  (ultima == uletra[unumero]))
	return true;
	else
	return false;

}

function ValidarNIF(dni) 
{

	var dniN;
	var dniL;
	
	if( dni.length != 9 )
		return false;
	
	dniN = dni.substr(0,8);
	dniL = dni.substr(8,1);
	
	var regular = new RegExp(/^\d{8}$/);
	if (!regular.exec(dniN)) return false;
		
	
	var letras = 'TRWAGMYFPDXBNJZSQVHLCKE';
	var numero = dniN%23;
	if( dniL.toUpperCase() == letras.substring(numero,numero+1))	
		return true;
	else
		return false;
}

function ValidarNIE(nie) 
{
	// FORMATO NIE : 'X' + 8 DIGITOS + LETRA
	
	// La longitud del NIE es de 10 caracteres
	if( nie.length != 10 )
		return false;
	
	// Se comprueba que el primer caracter sea 'X'
    if ( nie.charAt(0).toUpperCase() != 'X' )
		return false;
		
	// Se comprueba que los caracteres 1-9 sean digitos
    var digitos = nie.substring(1,9)
    var regular = new RegExp(/^\d{8}$/);
	if (!regular.exec(digitos)) 
		return false;
		
	// Se comprueba que el último caracter sea una letra
	var letra = new RegExp(/^[A-Z]$/i);
	if (letra.exec(nie.charAt(9))) 
		return true;
	else
		return false;
}

function ValidarNIE2(nie) 
{
	// FORMATO NIE : 'X' + 7 DIGITOS + LETRA
	
	// La longitud del NIE es de 10 caracteres
	if( nie.length != 9 )
		return false;
	
	// Se comprueba que el primer caracter sea 'X'
    if ( nie.charAt(0).toUpperCase() != 'X' )
		return false;
		
	// Se comprueba que los caracteres 1-9 sean digitos
    var digitos = nie.substring(1,8)
    var regular = new RegExp(/^\d{7}$/);
	if (!regular.exec(digitos)) 
		return false;
		
	// Se comprueba que el último caracter sea una letra
	var letra = new RegExp(/^[A-Z]$/i);
	if (letra.exec(nie.charAt(8))) 
		return true;
	else
		return false;
}

function ValidarNIFCIF(valor)
{
	if( ValidarCIF(valor) || ValidarNIF(valor) || ValidarNIE(valor) || ValidarNIE2(valor))
		return true;
	else
		return false;
	
}

/************** /FUNCIONES DE VALIDACIONES NIF/CIF *********************/


/******************** VALIDACIÓN DE LA PÁGINA **************************/
/***********************************************************************/
/***********************************************************************/
/***********************************************************************/


/*************************************************************
* Nombre:       ValidarVentana 
* Finalidad:    Comprueba si todos los validator de la ventana son validos.
* Entrada:      Objeto.
* Salida:       
* Retorno:      True o False dependiendo de si la ventana es 
*				valida o no.
*************************************************************/
function ValidarVentana()
{

	if ( typeof(Page_ClientValidate) != 'undefined' )
	{
		var paginaValida;
		paginaValida = Page_ClientValidate();
		Page_BlockSubmit = false;
		return paginaValida;
	}
	else
	{
		return true;
	}
}

/******************** /VALIDACIÓN DE LA PÁGINA **************************/
