//window.onerror = errorHandler;

function errorHandler (msg,url,lno)
{
	var alertmsg =	"There has been an internal error. We apologize for inconvenience." + 
					"\n\nPlease refresh this page and this error should go away.\n\n" +
					"If problem persists please contact helpdesk@orlitech.com.au";
	alert ( alertmsg );
	return ( true );
}

function fixcode(unclean) 
{ 
	var clean = unclean.replace(/%27%/g,"'"); 
	return clean; 
} 

function placeFocus() 
{
	var j, i, field;
	if (document.forms.length > 0)
		for ( j = 0; j < document.forms.length; j++ )
			for (i = 0, field = document.forms[j]; i < field.length; i++) 
				if ( !field.elements[i].disabled )
					switch ( field.elements[i].type )
					{
						//case 'select-one':	;
						case 'text':		;
						case 'textarea':	;
						case 'password':	field.elements[i].focus();
											return;
					}
}

function createWindow(URL, name, options)
{
	var j = window.open(URL, name, options); 
	j.focus();
}

// close current window, refresh opener if param true
function closeWindow(refreshOpener)
{
	if (refreshOpener)
		window.opener.location.reload();
	
	window.close();
}

function getNullText( obj )
{
/*
	alert( obj.name + ', ' + obj.type );
	var s = obj.nulltext;
	alert( s );
	
	var s1;
	var oAtt;
	for ( var i = 0; i < obj.attributes.length; i++ )
	{
		oAtt = obj.attributes( i );
		s1 += '\n' + oAtt.nodeName + '=' + oAtt.nodeValue + ' (' + oAtt.specified + ')';
	}
	alert( s1 );
*/
	
	try 
	{
		return obj.NullText;
	}
	catch ( ex )
	{
		return '';
	}
}


// Returns true if the given radio/checkbox collection has an option selected.
function isMultiObjSelect( obj )
{
	if (obj.length > 1)
	{
		for (var i = 0; i < obj.length; i++)
			if (obj[i].checked)
				return true;
	}
	else if (obj.checked)
		return true;
	return false;
}

// Returns true if the given multi-select combo has an option selected.
function isSelectMultiSelected( obj )
{
	for (var i = 0; i < obj.options.length; i++)
		if ( obj.options(i).selected )
			return true;

	return false;
}

// Returns true if the given string contains no printable characters.
function isStringEmpty(str)
{
	if (str == null) return true;
	return !str.match(/[A-Za-z0-9_]/,'i');
}

// Focus's the browser on the given object.
function objFocus(obj)
{
	if (obj.type != "hidden" && !obj.disabled)
	{
		if ( obj.length > 1 && obj.type != 'select-one' )
			objFocus( obj[0] );
		else
		{
			obj.focus();
			if (obj.type == "text" || obj.type == "textarea" || obj.type == "password")
				obj.select();
		}
	}
}

// Returns true if the given object contains only alpha-numeric chars.
function validateNumeric(obj, sMsg)
{
	return validateRegExp(obj, /^-*(\d+,)*\d+$/, sMsg);
}

// Returns true if the given object contains a guid.
function validateGUID(obj, sMsg)
{
	return validateRegExp(obj, /^\{*[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\}*$/, sMsg);
}

// Returns true if the given object contains a valid floating point number.
function validateFloat(obj, sMsg)
{
	return validateRegExp(obj, /^-*(\d+,)*\d+(\.\d+)?$/, sMsg);
}

// Returns true if the given object contains valid text.
function validateText( obj, sMsg )
{
	return validateRegExp( obj, /[\w]/, sMsg );
}

// Returns true if the given object contains a valid floating point number.
function validateEmail(obj, sMsg)
{
	return validateRegExp(obj, /^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/, sMsg);
}

function validateURL( obj, sMsg )
{
	return validateRegExp( obj, /^https?:\/\/([a-zA-Z0-9\-]*\.)*[a-zA-Z0-9\-]+(:[0-9]+)?(\/|(\/([a-zA-Z0-9\-_\.]+\/)*[a-zA-Z0-9\-_\.]*((\?[a-zA-Z0-9\-%]+(=[a-zA-Z0-9\-%]*)?){1}(&[a-zA-Z0-9\-%]+(=[a-zA-Z0-9\-%]*)?)*)?)?)?$/, sMsg )
}

function validateRegExp(obj, regExp, sMsg)
{
	if ( obj ) 
	{
		// Check that it isn't the null value;
		var sValue = new String( obj.value == getNullText( obj ) ? '' : obj.value );
		
		if ( !(sValue.match( regExp, 'i' ) ) )
		{
			if ( sMsg && sMsg.length > 0 ) 
			{
				objFocus( obj );
				alert( sMsg );
			}
			return false;
		}
	}
	return true;
}

function IsValidDate( obj, bOptional, sMsg )
{
	var datestr = obj.value;
		
	if (bOptional && isStringEmpty(datestr))
		return true;
			
	var strarray = datestr.split("/");
			
	// We check for Australian Syntax here  (DD/MM/YYYY)
	if (strarray.length == 3 
		&& isFinite(strarray[0]) && parseInt(strarray[0]) >= 1 && parseInt(strarray[0]) <= 31     // This is the day
		&& isFinite(strarray[1]) && parseInt(strarray[1]) >= 1 && parseInt(strarray[1]) <= 12     // This is the month
		&& isFinite(strarray[2]) && parseInt(strarray[2]) >= 1724 && parseInt(strarray[2]) <= 9999)  // This is the year
	{
		return true;
	}
		
	objFocus(obj);
	alert( sMsg )
	return false;
}

function ValidateRadio(obj, bIsRequired, sObjNarrative)
{
	var bErr = false,
		sValue = null,
		i, strarray, isChecked;
		
	isChecked = false;
	if (obj.length > 1)	{
		for (i = 0; i < obj.AddressID.length; i++)
			if (obj[i].checked)
			{
				isChecked = true;
				sValue = obj[i].value;
				break;
			}
	}
	else if (obj.checked) {
		isChecked = true;
		sValue = obj.value;
	}
	
	// Handle the error situation.
	// Assume that value is of the correct date type entered by the
	// developer manual or automatical.
	bErr = isStringEmpty( sValue );
	if ( bErr )
	{
		alert( 'Please select a ' + sObjNarrative );
		return false;
	}
	return true;
}

function ValidateControl( obj, bIsRequired, sDatType, sObjNarrative )
{
	var bErr = false,
		sValue = null,
		i, strarray, sPickNar;

	// Get the value from the object.
	switch ( obj.type )
	{

		case 'select-one':			sValue = obj.value;
									sPickNar = 'Please select a ';
									break;
									
		case 'text':				;
		case 'password':			;
		case 'hidden':				;
		case 'textarea':			sValue = obj.value;
									sPickNar = 'Please enter a valid ';
									break;

		case 'radio':				if (obj.length > 1)
									{
										for (i = 0; i < obj.length; i++)
											if (obj[i].checked)
											{
												sValue = obj[i].value;
												break;
											}
									}
									else if (obj.checked)
										sValue = obj.value;
									
									sPickNar = 'Please select a ';
									break;
									
		case 'checkbox':			if (obj.length > 1)
									{
										for (i = 0; i < obj.length; i++)
											if (obj[i].checked)
												sValue = sValue + (sValue.length > 0 ? ', ' : '' ) + obj[i].value;
									}
									else if (obj.checked)
										sValue = obj.value;
									
									sPickNar = 'Please select a ';
									break;

		case 'select-multiple':		for (i = 0; i < obj.options.length; i++)
										if ( obj.options(i).selected )
											sValue = sValue + (sValue.length > 0 ? ', ' : '' ) + obj.options(i).value;
									
									sPickNar = 'Please select a ';
									break;
								
		default:					alert( "Unknown Control Type: '" + obj.type + "' (document." + obj.form.name + "." + obj.name + ")" );
									return false;
	}
	
	// Check that the value is not the null value;
	sValue = ( sValue == getNullText( obj ) ? '' : sValue );

	// Abort as successful if object is empty but optional anyway.
	if ( !bIsRequired && isStringEmpty( sValue ) )
		return true;

	// Evaluate the data against 
	switch ( sDatType )
	{
		case 'text':		bErr = isStringEmpty( sValue );
							break;
							
		case 'date':		bErr = !OTgetDate( sValue );
							// If valid, correctly format the string.
							//if ( !bErr )
							//	obj.value = OTsetDate( OTgetDate( sValue ) );
							break;

		case 'time':		bErr = !OTgetTime( sValue, new Date )
							// If valid, correctly format the string.
							//if ( !bErr )
							//	obj.value = OTsetTime( OTgetTime( sValue, new Date ) );
							break;
															
		case 'currency':	bErr = !sValue.match( /^-?(\d+,)*\d+\.\d{2,2}$/, 'i' );
							break;
		
		// Accept currency and number values
		case 'money':		bErr = !sValue.match( /^-?((\d+\.\d{1,2})|(\d+))$/, 'i' );
							break;

		case 'decimal':		bErr = !sValue.match( /^-?(\d+,)*\d+(\.\d+)?$/, 'i' );
							break;
							
		case 'number':		bErr = !sValue.match( /^-?(\d+,)*\d+$/, 'i');
							break;
							
		case 'percentage':	bErr = !sValue.match( /^-?((\d{1,2}\.\d{1,2})|(\d{1,2}))$/, 'i' );
							break;
							
		case 'email':		bErr = !sValue.match( /^([^\x00-\x1f\x80-\xff\x7f<>\(\)\\,;:""@]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/, 'i' );
							break;

		case 'url':			bErr = !sValue.match( /^https?:\/\/([a-zA-Z0-9\-]*\.)*[a-zA-Z0-9\-]+(:[0-9]+)?(\/|(\/([a-zA-Z0-9\-_\.]+\/)*[a-zA-Z0-9\-_\.]*((\?[a-zA-Z0-9\-%]+(=[a-zA-Z0-9\-%]*)?){1}(&[a-zA-Z0-9\-%]+(=[a-zA-Z0-9\-%]*)?)*)?)?)?$/, 'i' );
							break;
							
		case 'phone':		bErr = !sValue.match( /^(\+\d{1,3}\s*)?(\(\d{2,}\))?((-| )*\d*)*$/, 'i' );
							break;
							
		default:			alert( "Unknown Data Type: '" + sDatType + "' (document." + obj.form.name + "." + obj.name + ")");
							return false;
	}
	
	// Handle the error situation.
	if ( bErr )
	{
		objFocus( obj );
		alert( sPickNar + sObjNarrative );
		return false;
	}
	return true;
}

