function errors_replace_codes(errors)
{
	errors = errors.replace(/DAT-01/g, "La fecha no soporta horarios");
	errors = errors.replace(/DAT-02/g, "El número de separadores de fecha y hora es incorrecto");
	errors = errors.replace(/DAT-03/g, "El campo es obligatorio.");
	errors = errors.replace(/DAT-04/g, "El día, mes y año deben separarse con '/'.");
	errors = errors.replace(/DAT-05/g, "El día debe ser un número.");
	errors = errors.replace(/DAT-06/g, "El mes debe ser un número.");
	errors = errors.replace(/DAT-07/g, "El año debe ser un número.");
	errors = errors.replace(/DAT-08/g, "El día no puede ser inferior a 1.");
	errors = errors.replace(/DAT-09/g, "El mes debe estar comprendido entre 1 y 12.");
	errors = errors.replace(/DAT-10/g, "El año debe estar en formato AA o AAAA.");
	errors = errors.replace(/DAT-11/g, "El mes no tiene más de 29 días.");
	errors = errors.replace(/DAT-12/g, "El mes no tiene más de 28 días.");
	errors = errors.replace(/DAT-13/g, "El mes no tiene más de 31 días.");
	errors = errors.replace(/DAT-14/g, "El mes no tiene más de 30 días.");

	errors = errors.replace(/MAL-01/g, "El campo es obligatorio.");
	errors = errors.replace(/MAL-02/g, "El e-mail no es válido.");
	
	errors = errors.replace(/NUM-01/g, "El campo es obligatorio.");
	errors = errors.replace(/NUM-02/g, "El número no puede ser únicamente un separador decimal.");
	errors = errors.replace(/NUM-03/g, "El número no puede ser únicamente un separador de miles.");
	errors = errors.replace(/NUM-04/g, "El número tiene los decimales incompletos.");
	errors = errors.replace(/NUM-05/g, "El número tiene caracteres no numéricos.");
	errors = errors.replace(/NUM-06/g, "El número de decimales es excesivo.");
	errors = errors.replace(/NUM-07/g, "El número debe ser entero.");
	errors = errors.replace(/NUM-08/g, "El número no tiene parte entera.");
	errors = errors.replace(/NUM-09/g, "La separación de miles no es correcta.");
	errors = errors.replace(/NUM-10/g, "El número tiene más de un separador decimal.");
		
	errors = errors.replace(/RNG-01/g, "El valor es superior al máximo permitido.");
	errors = errors.replace(/RNG-02/g, "El valor es inferior al mínimo permitido.");
	
	errors = errors.replace(/STR-01/g, "El campo es obligatorio.");
	errors = errors.replace(/STR-02/g, "El texto debe ser alfabético.");
	errors = errors.replace(/STR-03/g, "El texto debe ser numérico.");
	errors = errors.replace(/STR-04/g, "El texto contiene caracteres no válidos.");

	errors = errors.replace(/TME-01/g, "El campo es obligatorio.");
	errors = errors.replace(/TME-02/g, "El tiempo no soporta días.");
	errors = errors.replace(/TME-03/g, "El número de separadores de días y horas 'd' no es correcto.");
	errors = errors.replace(/TME-04/g, "Los días deben ser un número.");
	errors = errors.replace(/TME-05/g, "Las horas y minutos no están separadas por ':'.");
	errors = errors.replace(/TME-06/g, "Hay demasiados separadores ':'.");
	errors = errors.replace(/TME-07/g, "No se aceptan segundos.");
	errors = errors.replace(/TME-08/g, "Las horas deben ser un número.");
	errors = errors.replace(/TME-09/g, "Los minutos deben ser un número.");
	errors = errors.replace(/TME-10/g, "Los segundos deben ser un número.");
	errors = errors.replace(/TME-11/g, "Las horas deben estar comprendidas entre 0-23.");
	errors = errors.replace(/TME-12/g, "Los minutos deben estar comprendidos entre 0-59.");
	errors = errors.replace(/TME-12/g, "Los segundos deben estar comprendidos entre 0-59.");
		
	return(errors);
}

function _data_date(data)
	{
	var year;
	var month;
	var day;
	var hour;
	var minute;
	var second;

	var times = data.split(" ");
	var date_part = times[0].split("/");
		
	var year = parseFloat(date_part[2]);
	if (year < 100)
		year += (year > 70 ? 1900 : 2000);

	var month = String(parseFloat(date_part[1]));
	var day = String(parseFloat(date_part[0]));
		
	var hour = "00";
	var minute = "00";
	var second = "00";
		
	if (times.length > 1)
		{
		var time_part = times[1].split(":");
		hour = String(parseFloat(time_part[0]));
		minute = String(parseFloat(time_part[1]));
		if (times.length >= 3)
			second = String(parseFloat(time_part[2]));
		}

	return(new Date(year, month - 1, day, hour, minute, second));
	}

function _data_html(data, data_type, param1, param2)
	{
	if (data == null || typeof(data) == "undefined")
		return("");
		
	switch (data_type)
		{
		case "date":
			data = new Date(data);
			var day = _data_zero_fit(data.getDate(), 2);
			var month = _data_zero_fit(data.getMonth() + 1, 2);
			var data_date = day + "/" + month + "/" + data.getFullYear();
			var data_time = "";
			if (param1)
				{
				data_time = " " + _data_zero_fit(data.getHours(), 2) + ":" + _data_zero_fit(data.getMinutes(), 2);
				if (param2)
					data_time += ":" + _data_zero_fit(data.getSeconds(), 2);
				}
			data = data_date + data_time;
			break;

		case "html":
			data = String(data);
			data = _data_trim(data);
			break;

		case "time":
			data = parseInt(data);
			if (isNaN(data))
				return("");

			var days = parseInt(data / 86400);
			data -= days * 86400;
			var hours = parseInt(data / 3600);
			data -= hours * 3600;
			var minutes = parseInt(data / 60);
			data -= minutes * 60;
			var seconds = data;
			
			data = "";
			if (days)
				data += days + "d ";
			if (!days || hours || minutes || seconds)
				{
				data += _data_zero_fit(hours, 2) + ":" + _data_zero_fit(minutes, 2);
				if (param1)
					data += ":" + _data_zero_fit(seconds, 2);
				}
			break;
			
		case "string": // param1:max caracteres, param2:convertir saltos en <br>
			data = String(data);
			if (param1)
				if (data.length > param1)
					data = data.substr(0, param1 - 1) + "…";
		
			data = data.replace(/&/g, "&amp;");
			data = data.replace(/"/g, "&#034;");
			data = data.replace(/'/g, "&#039;");
			data = data.replace(/</g, "&lt;");
			data = data.replace(/>/g, "&gt;");
			data = data.replace(/\r\n/g, "\n");
			data = _data_trim(data);
			if (param2)
				data = data.replace(/\n/g, "<br>");
			
			break;
			
		case "number": // param1:digitos decimales, param2:forzar decimales
			data = parseFloat(data);
			if (isNaN(data))
				data = "";
			else
				{
				if (param1)
					{
					var base = 1;
					for(var cnt = 1; cnt <= param1; cnt++)
						base *= 10;
					data = Math.round(data * base) / base;
					}
				data = String(data);
				data = data.replace(/,/, ".");
				if (param1 && param2)
					{
					var faltan;
					if (data.indexOf(".") > -1)
						{
						var decimales = data.substr(data.indexOf(".") + 1);
						faltan = param1 - decimales.length;
						}
					else
						{
						faltan = param1;
						data = data + ".";
						}
						
					for(var cnt = 1; cnt <= faltan; cnt++)
						data = data + "0";
					}
				}
			break;
			
		default:
			data = "Tipo no soportado";
			break;
		}

	return(data);
	}

function _data_trim(data)
	{
	data = data.replace(/(^\s*)|(\s*$)/g, "");
	return(data);
	}

function _data_zero_fit(data, width, right)
	{
	data = String(data);
	
	if (data.length >= width)
		return(data);

	var zeros = "";
	for(var cnt = 0; cnt < width - data.length; cnt++)
		zeros += "0";

	if (right)
		data += zeros;
	else
		data = zeros + data;
		
	return(data);
	}

function date_test(value, required)
	{
	var day = 0;
	var month = 0;
	var year = 0;

	if (value == "")
		{
		if (required)
			return("DAT-03");
		else
			return("");
		}
	
	var items = value.split("/");
	if (items.length != 3)
		return("DAT-04");

	switch (hdc.date_format.toLowerCase())
		{
		case "AMD":
			day  = parseFloat(items[2]);
			month = parseFloat(items[1]);
			year = parseFloat(items[0]);
			break;
			
		case "MDA":
			day  = parseFloat(items[1]);
			month = parseFloat(items[0]);
			year = parseFloat(items[2]);
			break;
			
		case "DMA":
		default:
			day  = parseFloat(items[0]);
			month = parseFloat(items[1]);
			year = parseFloat(items[2]);
			break;
		}

	if (isNaN(day))
		return("DAT-05");
	if (isNaN(month))
		return("DAT-06");
	if (isNaN(year))
		return("DAT-07");

	if (day < 1)
		return("DAT-08");
	if (month < 1 || month > 12)
		return("DAT-09");
	if (year > 99 && year < 1000)
		return("DAT-10");
	if (year < 100)
		year += (year > 70 ? 1900 : 2000);

	switch (month)
		{
		case 2:
			if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
				{
				if (day > 29)
					return("DAT-11");
				}
			else
				{
				if (day > 28)
					return("DAT-12");
				}
			break;
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			if (day > 31)
				return("DAT-13");
			break;

		default:
			if (day > 30)
				return("DAT-14");	
		break;
		}

	value = new Date(year, month - 1, day);
	
	return(value);
	}

function date_validate(value, required, min, max, time_active, seconds_active)
	{
	var items = value.split(" ");
	if (items.length > 1 && !time_active)
		return("DAT-01");	
	if (items.length < 1 || items.length > 2)
		return("DAT-02");

	value = date_test(items[0], required);
	if (typeof(value) != "object")
		return(value);

	if (items.length == 2)
		{
		var error = time_validate(items[1], required, null, null, false, seconds_active);
		if (error)
			return(error);
		}

	return(range_validate(value, min, max));
	}

function email_validate(value, required, min, max)
	{
	if (value == "")
		{
		if (required)
			return("MAL-01");
		else
			return("");
		}
	
	var parts = value.split("@");
	if (parts.length != 2)
		return("MAL-02");

	if (parts[0].length < 1 || parts[0].charAt(parts[0].length - 1) == ".")
		return("MAL-02");
	if (parts[0].search(/[^\-\.\w]|\.{2}|^[_\.\-]|\.$/) != -1)
		return("MAL-02");

	if (parts[1].search(/[^A-Za-z0-9\-\.]|\.{2}|^[\.\-]|[\.\-]$|[\.\-][\.\-]/) != -1)
		return("MAL-02");

	var length = parts[1].length;
	var pos = parts[1].lastIndexOf(".");
	if (pos < 2 || length - pos < 3 || length - pos > 7)
		return("MAL-02");

	return(range_validate(value.length, min, max));
	}

function number_validate(value, required, min, max, dec)
	{
	var negative = false;
	var parts;
	var re;
	var	thousands = false;

	if (typeof(dec) == "undefined")
		dec = false;

	if (value == "")
		{
		if (required)
			return("NUM-01");
		else
			return("");
		}
					
	if (value.charAt(0) == "-")
		{
		negative = true;
		value = value.substr(1);
		}

	if (value == hdc.decimal_separator)
		return("NUM-02")
	if (value == hdc.thousands_separator)
		return("NUM-03")

	parts = value.split(hdc.decimal_separator);

	switch (parts.length)
		{
		case 2:
			if (parts[1].length == 0)
				return("NUM-04");
			for(char_cnt = 0; char_cnt < parts[1].length; char_cnt++)
				{
				chr = parts[1].charAt(char_cnt);
				if (chr < '0' || chr > '9')
					return("NUM-05")
				}
			if (typeof(dec) == "number")
				{
				if (parts[1].length > dec)
					return("NUM-06");
				}
			else
				if (!dec)
					return("NUM-07");

		case 1:
			if (parts[0].length == 0)
				return("NUM-08");
			for(char_cnt = parts[0].length - 1; char_cnt >= 0; char_cnt--)
				{
				chr = parts[0].charAt(char_cnt);
				if (chr < '0' || chr > '9')
					{
					if (chr == hdc.thousands_separator)
						{
						if ((parts[0].length - char_cnt) % 4 == 0)
							continue;
						else
					 		return("NUM-09")
					 	}
					 else
						return("NUM-05")
					}
				}
			break;
							
		default:
			return("NUM-10");
		}


	separator = hdc.thousands_separator;
	if (separator == ".")
		separator = "\\.";

	re = new RegExp(separator, "g");
	parts[0] = parts[0].replace(re, "");

	value = parseFloat((negative ? "-" : "") + parts[0] + "." + parts[1]);

	return(range_validate(value, min, max));
	}

function range_validate(value, min, max)
	{
	if (max != null)
		if (value > max)
			return("RNG-01");

	if (min != null)		
		if (value < min)
			return("RNG-02");

	return("");	
	}

function string_validate(value, required, min, max, type, template)
	{
	var chr;
	var cnt;

	if (value == "")
		{
		if (required)
			return("STR-01");
		else
			return("");
		}

	if (type)
		{
		switch (type.toLowerCase())
			{
			case "alphabetic":
				for(cnt = 0; cnt < value.length; cnt++)
					{
					chr = value.charAt(cnt);
					if ((chr < 'A' || chr > 'Z') && (chr < 'a' || chr > 'z'))
						return("STR-02");
					}
				break;
			
			case "numeric":
				for(cnt = 0; cnt < value.length; cnt++)
					{
					chr = value.charAt(cnt);
					if (chr < '0' || chr > '9')
						return("STR-03");
					}
				break;
				
			case "template":
				for(cnt = 0; cnt < value.length; cnt++)
					{
					chr = value.charAt(cnt);
					if (template.indexOf(chr) == -1)
						return("STR-04");
					}
				break;			
			}
		}

	return(range_validate(value.length, min, max));
	}

function time_validate(value, required, min, max, day_active, seconds_active)
	{
	if (value == "")
		{
		if (required)
			return("TME-01");
		else
			return("");
		}

	value = value.toLowerCase();
	value = value.replace(/ /g, "");

	var parts = value.split(hdc.day_separator);
	if (parts.length > 1 && !day_active)
		return("TME-02");
	if (parts.length != 1 && parts.length != 2)
		return("TME-03");

	var time;

	if (parts.length == 2)
		{
		time = parts[1];
		for(var cnt = 0; cnt < parts[0].length; cnt++)
			{
			var chr = parts[0].charAt(cnt);
			if (chr < '0' || chr > '9')
				return("TME-04");
			}
		}
	else
		time = parts[0];

	if (!time.length)
		return("");
			
	if (time.indexOf(hdc.time_separator) == -1)
		return("TME-05");

	time_parts = time.split(hdc.time_separator);
	if (time_parts.length != 2 && time_parts.length != 3)
		return("TME-06");
	if (time_parts.length == 3 && !seconds_active)
		return("TME-07");		

	for(var cnt = 0; cnt < time_parts[0].length; cnt++)
		{
		var chr = time_parts[0].charAt(cnt);
		if (chr < '0' || chr > '9')
			return("TME-08");
		}

	for(var cnt = 0; cnt < time_parts[1].length; cnt++)
		{
		var chr = time_parts[1].charAt(cnt);
		if (chr < '0' || chr > '9')
			return("TME-09");
		}

	if (seconds_active)
		{
		for(var cnt = 0; cnt < time_parts[2].length; cnt++)
			{
			var chr = time_parts[1].charAt(cnt);
			if (chr < '0' || chr > '9')
				return("TME-10");
			}
		}

	var hour = parseFloat(time_parts[0]);
	var minut = parseFloat(time_parts[1]);
	var second = 0;
	if (seconds_active)
		second = parseFloat(time_parts[2]);

	if (hour < 0 || hour > 23)
		return("TME-11");
			
	if (minut < 0 || minut > 59)
		return("TME-12");

	if (second < 0 || second > 59)
		return("TME-13");

	var seconds = hour * 1440 + minut * 60 + second;
		
	return(range_validate(seconds, min, max));
	}

var hdc = new Object();
hdc.decimal_separator = ".";
hdc.thousands_separator = ",";
hdc.date_format = "DMA";
hdc.datetime_format = "DMA";
hdc.date_separator = "/";
hdc.day_separator = "d";
hdc.time_separator = ":";

