/************************************/

function dig2(n) {
	n = "" + n;
	return ( n.length < 2 ) ? "0" + n: n;
}

function UKDate(dtDate) {
  	var s = "" + dig2(dtDate.getDate() ) + "/";
	s += dig2(dtDate.getMonth() + 1) + "/";
	s += Year2ToYear4(dtDate.getFullYear());
	return (s);
}


function ThisYear() {
	var dtDate = new Date();
	var s = dtDate.getFullYear();
	return (0 + s);
}

function DateHorizon( maxfuture ) {
	var y = "" + ThisYear();
	var centpart = y.slice( 0,2) + "00";;
	return eval(y) - eval(centpart) + maxfuture;
}

function getSafeNum( x ) {
	var n = 0;
	var xx = "" + x;
	var j;
	var bFail;
	
	bFail = false;
	
	for ( j = 0 ; j < xx.length && !bFail; j++ ) {
		if ( "0123456789".indexOf(xx.charAt(j)) < 0 ) {
			bFail =true;
		}
	}
	if (!bFail ) 
		n = eval(xx);
	
	return 0 + n;
}

function Year2ToYear4( yy ) {
	var max2kYear;
	var y;
	var j;
	var bFail;
	
	bFail = false;
	y = 0;
	
	if ( yy.length == 0 ) {
		yy = "" + ThisYear();
	} else {
		for ( j = 0 ; j < yy.length && !bFail; j++ ) {
			if ( "0123456789".indexOf(yy.charAt(j)) < 0 ) {
				bFail =true;
			}
		}
	}
	if (!bFail ) {
		y = 0 + eval(yy);
		if ( y < 100 ) {
			max2kYear = DateHorizon(10);
			if ( eval(y) < eval(max2kYear) ) {
				y = 2000 + y;
			} else {
				y = 1900 + y;
			}
		}
	} else {
		y = 2000;
	}
	return 0 + y;
}

function UKDateToNativeDate(strDate) {
	var s;
	var dtDate;
	var y;
	var d;
	var m;
	var bSlash;
	
	bDateErr = false;

	s = strDate.split( "/" );

	if ( s.length != 3 ) {
		d = 1;
		m = 1;
		y = ThisYear();
	}
	else {
		y = Year2ToYear4(s[2]);
		d = getSafeNum( s[0] );
		m = getSafeNum( s[1] );
		if ( ( d > 31 ) || ( m > 12 ) || ( d < 1) || ( m < 1 ) ) {
			bDateErr = true;
			d = 1;
			m = 1;
		}
	}
	dtDate = new Date();
	dtDate.setFullYear( y,m-1,d );
	if ( bDateErr ) 
	{
		dtDate = new Date();
	}
	return dtDate;	
}

function NativeDateToISODate( dtDate ) {
	return "" + dtDate.getFullYear() + "-" + dig2(dtDate.getMonth() + 1 ) + "-" + dig2(dtDate.getDate());
}

function vldDate2( strDate, v, iComp )
{
	var bFailField  = false;
	var bFail;			
	var sFieldValue;	// value of the field

	var bSlash;
	var j;
	var strTmp;
	var strResult = "";
	
	bSlash = false;
	sFieldValue = strDate.replace(/\.+/g,"/");
	sFieldValue = strDate.replace(/-+/g,"/");

	v.ErrorText = "";

	if (sFieldValue.length > 0) {
				
		// only check if there is a date there
					
		// first check that the date has the right set of characters
		if ( sFieldValue.indexOf("/") >= 0 ) {
			// the date contains slashes
			bSlash = true;
		} else {
			// if the date doesn't contain slashes it MUST be in the format
			// ppqqyy or ppqqyyyy - we will insert the slashes
			strResult = "";
						
			if (!( (sFieldValue.length == 6) || (sFieldValue.length == 8) )) {
				v.ErrorText = "Date " + sFieldValue + " is not the right length to be a date";
				bFailField = true;
			}
			else {
				for ( j = 0; j < sFieldValue.length; j++) {
					if ( j == 2 || j == 4 ) {
						strResult = strResult + "/";
					}
					strResult = strResult + sFieldValue.charAt(j);
				}
				sFieldValue = strResult;
			}
		}
		for ( j=0; j < sFieldValue.length && bFailField; j++) {
			if ( "0123456789/".indexOf(sFieldValue.charAt(j)) < 0 ) {
				bFailField = true;
				v.ErrorText = "Date " + sFieldValue + " does not look like a date";
			}
		}
		if ( !bFailField ) 
		{
			strResult = "";
			strTmp = "";
			// date is in the format p/q/y - convert to pp/qq/yy if required
						
			for ( j = 0; (j < sFieldValue.length) && !bFailField ; j++) {
				c = sFieldValue.charAt(j);
				if ( c == "/" ) {
					if ( strTmp.length < 1 ) {
						bFailField = true;
					}
					else {
						strResult = strResult + dig2(strTmp) + "/";
						strTmp = "";
					}
				}
				else {
					strTmp = strTmp + c;
				}
			}
			if ( strTmp != "" ) {
				strResult = strResult + dig2(strTmp);
			}
			strResult = UKDate(UKDateToNativeDate(strResult));
			if ( bDateErr ) {
				bFailField = true;
			}
			else {
				sFieldValue = strResult;
			}
		}			

		// if that was OK then try to pull out the numbers
		if ( bFailField == false ) {
			// the date now has slashes in 
			if (!( (sFieldValue.length == 8) || (sFieldValue.length == 10) )) {
				bFailField = true;
				v.ErrorText = "Date " + sFieldValue + " is not the correct length to be a date";
				
			}
			else {
				// we now want to evaluate the date
				var x = new Date( UKDateToNativeDate( sFieldValue ));
				var today = new Date();
				var strX = NativeDateToISODate( x );
				var strToday = NativeDateToISODate( today );
				// alert( strX + " " + strToday );
				switch( iComp ) {
				default:
				case 0:
					break;
				case -1:
					if ( strX > strToday ) {
						blnFailField = true;
						v.ErrorText = "Date " + strResult + " must be in the past";
					}
					break;
				case 1:
					if ( strX < strToday ) {
						blnFailField = true;
						v.ErrorText = "Date " + strResult + " must be in the future";
					}
					break;
				}
			}
		}
	}
	return strResult;
}

vldDate.prototype = new Validator();
vldDate.prototype.constructor = vldDate;

function vldDate( name ) {
	this.Inherits( Validator, name );
}

vldDate.prototype.Test = function( t, sType ) {
/*
	var blnValid = false;
	if ( sType == this.name ) {
		blnValid = true;
	}
	return blnValid;	
*/
	var strResult;
	var blnFound = true;	
	//
	// WARNING - Regular expressions are very fragile
	// A mistake here will break the page
	//
	switch ( sType ) {
	case "DATE":
		strResult = vldDate2( t.value, this, 0 );
		break;
	case "HDATE":
		strResult = vldDate2( t.value, this, -1 );
		break;
	case "FDATE":
		strResult = vldDate2( t.value, this, 1 );
		break;
	default:
		blnFound = false;
		break;
	}
	if ( blnFound ) {
		t.value = strResult;
	}
	return blnFound;
}

vldChain.Add( new vldDate( "Date" ));
