function valid_string(string, min_length, max_length, title)
{
	min_length = (typeof min_length == "undefined") ? 0 : min_length;
	max_length = (typeof max_length == "undefined") ? 100 : max_length;

	var length = string.length;
	if(typeof title =="undefined"){
		if (length > max_length)
		{
			alert("Please enter a value less than "+max_length+" characters.");
			return false;
		}
		else if (length < min_length)
		{
			alert("Please enter a value greater than "+min_length+" characters.");
			return false;
		}
		else
		{
			return true;
		}
	}else{
		if (length > max_length || length < min_length)
		{
			alert("Please enter a valid entry into "+title+".");
			return false;
		}else{
			return true;	
		}
	}
}

function valid_integer(s, required)
{
	required = (typeof required == "undefined") ? false : required;
	
	if(required === true)
	{
		if(s.length == 0)
		{
			return false;
		}
	}
	else if(s.length == 0)
	{
		return true;
	}
	
    for (var i = 0; i < s.length; i++)
	{   
        // check that current character is number.
        var c = s.charAt(i);

        if (((c < "0") || (c > "9")))
		{
			return false;
		}
    }

    // all characters are numbers.
    return true;
}

function days_in_february(year)
{
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}

function days_in_month(month, year)
{
	switch (month)
	{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
					return 31;
		case 4:
		case 6:
		case 9:
		case 11:
					return 30;
		case 2:
					return days_in_february(year);
	}
}

function valid_date(date, show_alert, required)
{
	show_alert = (typeof show_alert == "undefined") ? false : show_alert;
	required = (typeof required == "undefined") ? false : required;

	if(required === true)
	{
		if(date.length == 0)
		{
			if(show_alert === true)
			{
				alert("A date is required");
			}

			return false;
		}
	}
	else if(date.length == 0)
	{
		return true;
	}

	// check for the correct length
	if(date.length != 10)
	{
		if(show_alert === true)
		{
			alert("The date format should be dd/mm/yyyy");
		}

		return false;
	}

	// get all the components of the date
	var day = date.substr(0, 2);
	var divider1 = date.substr(2, 1);
	var month = date.substr(3, 2);
	var divider2 = date.substr(5, 1);
	var year = date.substr(6, 4);

	// check the year
	if((year.length != 4) || (valid_integer(year) === false) || (year < 1900) || (year > 2100))
	{
		if(show_alert === true)
		{
			alert("Please enter a valid year (dd/mm/YYYY)");
		}

		return false;
	}

	// check the month
	if((month.length != 2) || (valid_integer(month) === false) || (month < 1) || (month > 12))
	{
		if(show_alert === true)
		{
			alert("Please enter a valid month (dd/MM/yyyy)");
		}

		return false;
	}

	// check the day
	if((day.length != 2) || (valid_integer(day) === false) || (day < 1) || (day > days_in_month(month, year)))
	{
		if(show_alert === true)
		{
			alert("Please enter a valid day (DD/mm/yyyy)");
		}

		return false;
	}

	// check the dividers
	if((divider1 != "/") || (divider2 != "/"))
	{
		if(show_alert === true)
		{
			alert("The date format should be dd/mm/yyyy");
		}

		return false;
	}

	return true;
}

function valid_time(time, show_alert, required)
{
	show_alert = (typeof show_alert == "undefined") ? false : show_alert;
	required = (typeof required == "undefined") ? false : required;

	if(required === true)
	{
		if(time.length == 0)
		{
			if(show_alert === true)
			{
				alert("A time is required");
			}

			return false;
		}
	}
	else if(time.length == 0)
	{
		return true;
	}

	// check for the correct length
	if(time.length != 5)
	{
		if(show_alert === true)
		{
			alert("Please enter a valid time (hh:mm)");
		}

		return false;
	}

	// get the hours, minutes, and the divider symbol
	var hours = time.substr(0, 2);
	var divider = time.substr(2, 1);
	var minutes = time.substr(3, 2);

	if((hours.length != 2) || (valid_integer(hours) === false) || (hours > 23))
	{
		if(show_alert === true)
		{
			alert("Please enter a valid hour (0-23)");
		}

		return false;
	}

	if(divider != ":")
	{
		if(show_alert === true)
		{
			alert("The hours and minutes divider should be ':'");
		}

		return false;
	}

	if((minutes.length != 2) || (valid_integer(minutes) === false) || (minutes > 59))
	{
		if(show_alert === true)
		{
			alert("Please enter a valid minute (0-59)");
		}

		return false;
	}

	return true;
}

function valid_money(amount, show_alert, required)
{
	show_alert = (typeof show_alert == "undefined") ? false : show_alert;
	required = (typeof required == "undefined") ? false : required;

	if(required === true)
	{
		if(amount.length == 0)
		{
			if(show_alert === true)
			{
				alert("An amount is required");
			}

			return false;
		}
	}
	else if(amount.length == 0)
	{
		return true;
	}

	// get the length of the amount
	var amount_length = amount.length;
	
	if((amount_length > 0) && (amount != "0") && (amount != ""))
	{	
		// get the pounds, pence and divider symbol
		var pounds = amount.substr(0, amount_length - 3);
		var divider = amount.substr(amount_length - 3, 1);
		var pence = amount.substr(amount_length - 2);
		
		if(pence.length != 2)
		{
			if(show_alert === true)
			{
				alert("Not enough pence digits");
			}

			return false;
		}
		
		if(valid_integer(pence, true) === false)
		{
			if(show_alert === true)
			{
				alert("Please enter a valid pence amount");
			}

			return false;
		}
		
		if(divider != ".")
		{
			if(show_alert === true)
			{
				alert("The pounds and pence divider should be '.'");
			}

			return false;
		}
		
		if(valid_integer(pounds, true) === false)
		{
			if(show_alert === true)
			{
				alert("Please enter a valid pounds amount");
			}

			return false;
		}
	}

	return true;
}

function valid_email(email, show_alert, required)
{
	show_alert = (typeof show_alert == "undefined") ? false : show_alert;
	required = (typeof required == "undefined") ? false : required;

	if(required === true)
	{
		if(email.length == 0)
		{
			if(show_alert === true)
			{
				alert("An email address is required");
			}

			return false;
		}
	}
	else if(email.length == 0)
	{
		return true;
	}

	if(email.match(/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/))
	{
		return true;
	}
	else
	{
		if(show_alert === true)
		{
			alert("Please enter a valid email address");
		}

		return false;
	}
}

function valid_postcode(postcode, show_alert, required)
{
	show_alert = (typeof show_alert == "undefined") ? false : show_alert;
	required = (typeof required == "undefined") ? false : required;

	if(required === true)
	{
		if(postcode.length == 0)
		{
			if(show_alert === true)
			{
				alert("A postcode is required");
			}

			return false;
		}
	}
	else if(postcode.length == 0)
	{
		return true;
	}

	postcode = postcode.toUpperCase();
	postcode = postcode.replace(/ /, "");

	if(postcode.match(/^[A-Z]{1,2}[0-9]{2,3}[A-Z]{2}$/) || postcode.match(/^[A-Z]{1,2}[0-9]{1}[A-Z]{1}[0-9]{1}[A-Z]{2}$/) || postcode.match(/^GIR0[A-Z]{2}$/))
	{
		return true;
	}
	else
	{
		if(show_alert === true)
		{
			alert("Please enter a valid postcode");
		}

		return false;
	}
}