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

	if(only_letters === true)
	{
		/*
		if(string.match(/[^A-Za-z'�-��-��-�.-]/))
		{
			return false;
		}*/

		if(string.match(/[^A-Za-z'.-]/))
		{
			return false;
		}
	}
	else if(regex != "")
	{
		
		myregexp = new RegExp(regex)
		if(string.match(myregexp))
		{
			return false;
		}
	}

	var length = string.length;

	if (length > max_length)
	{
		return false;
	}
	else if (length < min_length)
	{
		return false;
	}
	else
	{
		return true;
	}
}
function valid_float(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")) && c != ".")
		{
			return false;
		}
        if(c == ".")
        {
        	if(dec == true)
        	{
        		return false;
        	}
        	var dec = true;
        }
    }

    // all characters are numbers.
    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;
	}
	
	if (isNaN(parseFloat(s))) {
		return false;
	}
	
	return true;
	
	
	
	//will not work with .00
    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 strip_leading_zeroes(the_value)
{
	if((the_value.length > 1) && (the_value.substr(0,1) == "0"))
	{
		return the_value.substr(1);
	}
	else
	{
		return the_value;
	}
}

function unix_time_to_date(unix_time)
{
	var date = new Date(unix_time * 1000);
	var date_string = date.toGMTString();

	return date_string;
}

function date_to_unix_time(date)
{
	if(valid_date(date, false, true) === true)
	{
		// 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);

		var date = new Date(Date.UTC(
					year,
					(strip_leading_zeroes(month) -1),
					strip_leading_zeroes(day),
					strip_leading_zeroes(0),
					strip_leading_zeroes(0),
					strip_leading_zeroes(0)));

		var unix_time = (date.getTime() / 1000.0);

		return unix_time;
	}
	else
	{
		return false;
	}
}

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 authorised_date(date, min_start, max_end)
{
	min_start = (typeof min_start == "undefined") ? false : min_start;
	max_end = (typeof max_end == "undefined") ? false : max_end;

	if((min_start !== false) && (valid_date(min_start, false, true) === true))
	{
		var date_time = date_to_unix_time(date);
		var min_start_time = date_to_unix_time(min_start);

		if(date_time < min_start_time)
		{
			return false;
		}
	}

	if((max_end !== false) && (valid_date(max_end, false, true) === true))
	{
		var date_time = date_to_unix_time(date);
		var max_end_time = date_to_unix_time(max_end);

		if(date_time < max_end_time)
		{
			return false;
		}
	}

	return true;
}

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-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,6})$/))
	{
		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;
	}
}

