//
// General form field validation routines - Includes null, date/time and number checking
//


//
// IsNull : Returns true or false depending on whether the field passed to it has a value in it.
//          Valid for text, password, multi-line, list, combo, radio and checkbox types.
//
function IsNull(obj)
{
	obj_type = obj.type;
	if (obj_type == "text" || obj_type == "textarea" || obj_type == "password")
		return (obj.value.length == 0);
	else if (obj_type == "select-one" || obj_type == "select-multiple")
	{
        	for (i=0; i < obj.length; i++)
	    	{
			if (obj.options[i].selected)
				return false;
		}
	       	return true;	
	}
	else if (obj_type == "radio" || obj_type == "checkbox")
		return (!obj.checked)

       	return true;	
}

function MandatoryFieldsError()
{
	alert('You have not entered enough information.\n\nFields with a shaded background must contain a value.');
}

//
// CheckDateTime: Returns true or false depending on whether the value passed is a valid date or date/time
//                Date/time formats must be DD-MM-YY HH:MM or DD-MM-YYYY HH:MM
//
function CheckDateTime(obj_value)
{
	if (obj_value.length == 0)
		return true;

	sep = obj_value.indexOf(' ');
	if (sep == -1)
		return CheckDate(obj_value);

	d = obj_value.substring(0, sep);
	if (!CheckDate(d))
		return false;

	t = obj_value.substring(d.length + 1, obj_value.length);
	if (t.length > 0 && !CheckTime(t))
		return false;

	return true;
}


//
// CheckDate: Returns true of false depending on whether the value passed is a valid date
//            Date formats must be DD-MM-YY or DD-MM-YYYY
//
function CheckDate(obj_value)
{
	if (obj_value.length == 0)
        	return true;

	sep = obj_value.indexOf('/');

	if (sep == -1 || sep == obj_value.length)
		return false;

	sDay = obj_value.substring(0, sep);
	sep = obj_value.indexOf('/', sep + 1);

	if (sep == -1 ||  (sep + 1 )  == obj_value.length)
		return false;

	sMonth = obj_value.substring((sDay.length + 1), sep);

	sYear = obj_value.substring(sep + 1);

	if (!CheckInteger(sMonth) || !CheckRange(sMonth, 1, 12))
		return false;
	else
	if (!CheckYear(sYear) || !CheckRange(sYear, 0, null))
		return false;
	else
	if (!CheckInteger(sDay) || !CheckDay(sYear, sMonth, sDay))
		return false;
	else
		return true;
}


//
// CheckDay: Returns true or false depending on whether the day passed is valid for that month and year
//           This is used by other date processing functions
//
function CheckDay(YY, MM, DD)
{
	maxDay = 31;

	if (MM == 4 || MM == 6 || MM == 9 || MM == 11)
		maxDay = 30;
	else if (MM == 2)
	{
		if (YY % 4 > 0)
			maxDay =28;
		else if (YY % 100 == 0 && YY % 400 > 0)
			maxDay = 28;
		else
			maxDay = 29;
	}

	return CheckRange(DD, 1, maxDay);
}

//
// CheckInteger: Returns true or false depending on whether the value passed is a valid integer
//
function CheckInteger(obj_value)
{
	if (obj_value.length == 0)
        	return true;

	var sep = ".";
	var c;

	c = obj_value.indexOf(sep)

	if (c < 1)
		return CheckNumber(obj_value);
	else
		return false;
}
function CheckYear(obj_value)
{
    
	if (parseInt(obj_value) > 2000)
	 {
	   return true;
	 }		
}

//
// NumberRange: Returns true or false depending on whether the value passed is within the min and max values
//
function NumberRange(obj_value, min_value, max_value)
{
	if ((min_value != null) && (obj_value < min_value))
		return false;

	if ((max_value != null) && (obj_value > max_value))
		return false;
	
	return true;
}

//
// CheckNumber: Returns true or false depending on whether the value passed is numeric
//
function CheckNumber(obj_value)
{

	if (obj_value.length == 0)
        return true;

	var start_format = " .+-0123456789";
	var number_format = " .0123456789";
	var c;
	var decimal = false;
	var trailing_blank = false;
	var digits = false;

	c = start_format.indexOf(obj_value.charAt(0))

	if (c == 1)
		decimal = true;
	else if (c < 1)
		return false;
        
	for (var i = 1; i < obj_value.length; i++)
	{
		c = number_format.indexOf(obj_value.charAt(i))
		if (c < 0)
			return false;
		else if (c == 1)
		{
			if (decimal)
				return false;
			else
				decimal = true;
		}
		else if (c == 0)
		{
			if (decimal || digits)	
				trailing_blank = true;

		}
	        else if (trailing_blank)
			return false;
		else
			digits = true;
	}	
	return true
}

function CheckRange(obj_value, min_value, max_value)
{

	if (obj_value.length == 0)
        	return true;

	if (!CheckNumber(obj_value))
		return false;
	else
		return (NumberRange((eval(obj_value)), min_value, max_value));
	return true;
}

function CheckTime(obj_value)
{
	if (obj_value.length == 0)
        	return true;

	sep = obj_value.indexOf(':');
	if (sep == -1 || sep == obj_value.length)
		return false;

	sHour = obj_value.substring(0, sep);
	iminute = obj_value.indexOf(':', sep + 1);

	if (iminute == -1 || iminute == obj_value.length)
		sMin = obj_value.substring((sHour.length + 1));
	else
		sMin = obj_value.substring((sHour.length + 1), iminute);

	if (!CheckInteger(sHour))
		return false;
	else if (!CheckRange(sHour, 0, 23))
		return false;

	if (!CheckInteger(sMin))
		return false;
	else if (!CheckRange(sMin, 0, 59))
		return false;

	if (iminute != -1)
	{
		sSec = obj_value.substring(iminute + 1);

		if (!CheckInteger(sSec))
			return false;
		else if (!CheckRange(sSec, 0, 59))
			return false;	
	}
	return true;
}

function ToDate(obj_value)
{
	if (!CheckDate(obj_value) || IsNull(obj_value))
        	return '';

	sep = obj_value.indexOf('-');
	sDay = obj_value.substring(0, sep);
	sep = obj_value.indexOf('-', sep + 1);
	sMonth = obj_value.substring((sDay.length + 1), sep);
	sYear = obj_value.substring(sep + 1);

	return new Date(sYear, sMonth - 1, sDay);
}

function ToDateTime(obj_value)
{
	if (!CheckDateTime(obj_value))
		return new Date(0, 0, 0);

	sep = obj_value.indexOf('/');
	sDay = obj_value.substring(0, sep);
	sep = obj_value.indexOf('/', sep + 1);
	sMonth = obj_value.substring((sDay.length + 1), sep);
	sep1 = sep;
	sep = obj_value.indexOf(' ', sep1 + 1);
	if (sep < 0)
		sep = obj_value.length;

	sYear = obj_value.substring(sep1 + 1, sep);
	sTime = obj_value.substring(sep + 1);

	if (sep == obj_value.length || !CheckTime(sTime))
		return new Date(sYear, sMonth - 1, sDay, 0, 0, 0);

	sep = sTime.indexOf(':');
	sHour = sTime.substring(0, sep);
	sMin = sTime.substring(sep + 1);
	return new Date(sYear, sMonth - 1, sDay, sHour, sMin, 0);
}

function ToODBCDateTime(obj_value)
{
	if(obj_value.length == 0)
		return "null";
    
	if(obj_value == "NOW")
		d = new Date();
	else
		d = ToDateTime(obj_value);
   
	yy = d.getYear();
	if (yy < 50)
		yy = yy + 2000;
	else if (yy < 100)
		yy = yy + 1900;

	mm = d.getMonth() + 1;
	if (mm < 10)
		mm = '0' + mm;

	dd = d.getDate();
	if (dd < 10)
		dd = '0' + dd;

	hh = d.getHours();
	if (hh < 10)
		hh = '0' + hh;

	mi = d.getMinutes();
	if (mi < 10)
		mi = '0' + mi;

	return "{ts '" + yy + '-' + mm + '-' + dd + ' ' + hh + ':' + mi + ":00'" + '}';
}

function TodayDateTime(obj_value)
{

	d = new Date();

	yy = d.getYear();
	if (yy < 50)
		yy = yy + 2000;
	else if (yy < 100)
		yy = yy + 1900;

	mm = d.getMonth() + 1;
	if (mm < 10)
		mm = '0' + mm;

	dd = d.getDate();
	if (dd < 10)
		dd = '0' + dd;

	return dd + '-' + mm + '-'  + yy;
}
