function HnlTestDate(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 (HnlValidate.DateFormat.toUpperCase())
		{
		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 HnlTranslateValidateCodes(errors, language)
{
	switch (language)
	{
		case "Cat":		
			errors = errors.replace(/DAT-01/g, "La data no soporta horaris ");
			errors = errors.replace(/DAT-02/g, "El número de separadors de data i hora és incorrecte");
			errors = errors.replace(/DAT-03/g, "El camp és obligatori.");
			errors = errors.replace(/DAT-04/g, "Els dia, mes i any han de separar-se amb '/'.");
			errors = errors.replace(/DAT-05/g, "El dia ha de ser un número.");
			errors = errors.replace(/DAT-06/g, "El mes ha de ser un número.");
			errors = errors.replace(/DAT-07/g, "L'any ha de ser un número.");
			errors = errors.replace(/DAT-08/g, "El dia no pot ser inferior a 1.");
			errors = errors.replace(/DAT-09/g, "El mes ha d'estar entre 1 y 12.");
			errors = errors.replace(/DAT-10/g, "L'any ha de tenir format AA o AAAA.");
			errors = errors.replace(/DAT-11/g, "El mes no té més de 29 dies.");
			errors = errors.replace(/DAT-12/g, "El mes no té més de 28 dies.");
			errors = errors.replace(/DAT-13/g, "El mes no té més de 31 dies.");
			errors = errors.replace(/DAT-14/g, "El mes no té més de 30 dies.");
			 
			errors = errors.replace(/MAL-01/g, "El camp és obligatori.");
			errors = errors.replace(/MAL-02/g, "L'e-mail no és vàlid.");
			 
			errors = errors.replace(/NUM-01/g, "El camp és obligatori.");
			errors = errors.replace(/NUM-02/g, "El número no pot ser únicament un separador decimal.");
			errors = errors.replace(/NUM-03/g, "El número no pot ser únicament un separador de  milers .");
			errors = errors.replace(/NUM-04/g, "El número té els decimals incomplerts.");
			errors = errors.replace(/NUM-05/g, "El número té caràcters no numèrics.");
			errors = errors.replace(/NUM-06/g, "El número de decimals és excessiu.");
			errors = errors.replace(/NUM-07/g, "El número ha de ser sencer.");
			errors = errors.replace(/NUM-08/g, "El número no té part sencera.");
			errors = errors.replace(/NUM-09/g, "La separació de milers no és correcta.");
			errors = errors.replace(/NUM-10/g, "El número té més d'un separador decimal.");
			  
			errors = errors.replace(/RNG-01/g, "El valor és superior al màxim permès.");
			errors = errors.replace(/RNG-02/g, "El valor és inferior al mínim permès.");
			 
			errors = errors.replace(/STR-01/g, "El camp és obligatori.");
			errors = errors.replace(/STR-02/g, "El text ha de ser alfabètic.");
			errors = errors.replace(/STR-03/g, "El text ha de ser numèric.");
			errors = errors.replace(/STR-04/g, "El text conté caràcters no vàlids.");
			 
			errors = errors.replace(/TME-01/g, "El camp és obligatori.");
			errors = errors.replace(/TME-02/g, "El temps no soporta dies.");
			errors = errors.replace(/TME-03/g, "El número de separadors de dies i hores 'd' no és correcte.");
			errors = errors.replace(/TME-04/g, "Els dies han de ser un número.");
			errors = errors.replace(/TME-05/g, "Les hores i minuts no estan separats per ':'.");
			errors = errors.replace(/TME-06/g, "Hi ha massa separadors':'.");
			errors = errors.replace(/TME-07/g, "No s 'accepten segons.");
			errors = errors.replace(/TME-08/g, "Les hores han de ser un número.");
			errors = errors.replace(/TME-09/g, "Els minuts han de ser un número.");
			errors = errors.replace(/TME-10/g, "Els segons han de ser un número.");
			errors = errors.replace(/TME-11/g, "Les hores han d'estar entre 0-23.");
			errors = errors.replace(/TME-12/g, "Els minuts han d'estar entre 0-59.");
			errors = errors.replace(/TME-12/g, "Els segons han d'estar entre 0-59.");
			break;
		
		case "En":
			errors = errors.replace(/DAT-01/g, "The date field does not support timetables.");
			errors = errors.replace(/DAT-02/g, "The number of date and time separators is wrong.");
			errors = errors.replace(/DAT-03/g, "This field is compulsory.");
			errors = errors.replace(/DAT-04/g, "The day, month, and year must be separated by '/'.");
			errors = errors.replace(/DAT-05/g, "The day must be a number.");
			errors = errors.replace(/DAT-06/g, "The month must be a number.");
			errors = errors.replace(/DAT-07/g, "The year must be a number.");
			errors = errors.replace(/DAT-08/g, "The day can’t be a number below 1.");
			errors = errors.replace(/DAT-09/g, "The month must be a number between 1 and 12.");
			errors = errors.replace(/DAT-10/g, "The year must be in  YY or YYYY format.");
			errors = errors.replace(/DAT-11/g, "This month does not have more than 29 days.");
			errors = errors.replace(/DAT-12/g, "This month does not have more than 28 days.");
			errors = errors.replace(/DAT-13/g, "This month does not have more than 31 days.");
			errors = errors.replace(/DAT-14/g, "This month does not have more than 30 days.");

			errors = errors.replace(/MAL-01/g, "This field is compulsory.");
			errors = errors.replace(/MAL-02/g, "Invalid e-mail.");
			
			errors = errors.replace(/NUM-01/g, "This field is compulsory.");
			errors = errors.replace(/NUM-02/g, "The number can’t be just a decimal separator.");
			errors = errors.replace(/NUM-03/g, "The number can’t be just a thousands separator.");
			errors = errors.replace(/NUM-04/g, "This number includes wrong decimals.");
			errors = errors.replace(/NUM-05/g, "This number includes non-numeric characters.");
			errors = errors.replace(/NUM-06/g, "This number contains too many decimals.");
			errors = errors.replace(/NUM-07/g, "Whole numbers only.");
			errors = errors.replace(/NUM-08/g, "The whole part of this number is missing.");
			errors = errors.replace(/NUM-09/g, "Wrong thousands separator.");
			errors = errors.replace(/NUM-10/g, "This number has more than one decimal separator.");
				
			errors = errors.replace(/RNG-01/g, "This value is above the maximum allowed.");
			errors = errors.replace(/RNG-02/g, "This value is below the minimum allowed.");
			
			errors = errors.replace(/STR-01/g, "This field is compulsory.");
			errors = errors.replace(/STR-02/g, "This text must be alphabetical.");
			errors = errors.replace(/STR-03/g, "This text must be numerical.");
			errors = errors.replace(/STR-04/g, "This text contains invalid characters.");

			errors = errors.replace(/TME-01/g, "This field is compulsory.");
			errors = errors.replace(/TME-02/g, "Time does not support days.");
			errors = errors.replace(/TME-03/g, "The ‘d’ number of days and hours separators is wrong.");
			errors = errors.replace(/TME-04/g, "Days must be expressed numerically.");
			errors = errors.replace(/TME-05/g, "Hours and minutes are not separated by ':'.");
			errors = errors.replace(/TME-06/g, "There are too many separators ':'.");
			errors = errors.replace(/TME-07/g, "Seconds are not accepted.");
			errors = errors.replace(/TME-08/g, "Hours must be expressed numerically.");
			errors = errors.replace(/TME-09/g, "Minutes must be expressed numerically.");
			errors = errors.replace(/TME-10/g, "Seconds must be expressed numerically.");
			errors = errors.replace(/TME-11/g, "Hours must be a number between 0 and 23.");
			errors = errors.replace(/TME-12/g, "Minutes must be a number between 0 and 59.");
			errors = errors.replace(/TME-12/g, "Seconds must be a number between 0 and 59.");
			break;
		
		case "Es":
			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.");
			break;
		}
	
	return(errors);
	}

function HnlValidateDate(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 = HnlTestDate(items[0], required);
	if (typeof(value) != "object")
		return(value);

	if (items.length == 2)
		{
		var error = HnlValidateTime(items[1], required, null, null, false, seconds_active);
		if (error)
			return(error);
		}

	return(HnlValidateRange(value, min, max));
	}

function HnlValidateEmail(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(HnlValidateRange(value.length, min, max));
	}

function HnlValidateNumber(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 == HnlValidate.DecimalSeparator)
		return("NUM-02")
	if (value == HnlValidate.ThousandsSeparator)
		return("NUM-03")

	parts = value.split(HnlValidate.DecimalSeparator);

	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 == HnlValidate.ThousandsSeparator)
						{
						if ((parts[0].length - char_cnt) % 4 == 0)
							continue;
						else
					 		return("NUM-09")
					 	}
					 else
						return("NUM-05")
					}
				}
			break;
							
		default:
			return("NUM-10");
		}


	separator = HnlValidate.ThousandsSeparator;
	if (separator == ".")
		separator = "\\.";

	re = new RegExp(separator, "g");
	parts[0] = parts[0].replace(re, "");

	value = parseFloat((negative ? "-" : "") + parts[0] + "." + parts[1]);

	return(HnlValidateRange(value, min, max));
	}

function HnlValidateRange(value, min, max)
	{
	if (max != null)
		if (value > max)
			return("RNG-01");

	if (min != null)		
		if (value < min)
			return("RNG-02");

	return("");	
	}

function HnlValidateString(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(HnlValidateRange(value.length, min, max));
	}

function HnlValidateTime(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(HnlValidate.DaySeparator);
	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(HnlValidate.TimeSeparator) == -1)
		return("TME-05");

	time_parts = time.split(HnlValidate.TimeSeparator);
	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(HnlValidateRange(seconds, min, max));
	}

var HnlValidate = new Object();

HnlValidate.DecimalSeparator = ",";
HnlValidate.ThousandsSeparator = ".";
HnlValidate.DateFormat = "DMA";
HnlValidate.DaySeparator = "d";
HnlValidate.TimeSeparator = ":";

