// JavaScript Document

var FldHandler = {};

FldHandler.FldList = [];
FldHandler.FldTypeStr = 0;
FldHandler.FldTypeNum = 1;
FldHandler.FldTypeDate = 2;
	
FldHandler.AddField = function( objName, validateCb, onFocusCb, onBlurCb )
{
	var obj = document.getElementById( objName );
	if( obj == null )
		return;
	
	var allowedChars = "";
	for( var i=32; i<=126; i++ )
		allowedChars += String.fromCharCode( i );
	var type = FldHandler.FldTypeStr;
	if( objName.substring( 0, 3 ) == "int" )
	{
		type = FldHandler.FldTypeNum;
		allowedChars = "0123456789-,$.";
	}
	else if( objName.substring( 0, 4 ) == "date" )
	{
		type = FldHandler.FldTypeDate;
		allowedChars = "0123456789/";
	}
	
	obj.style.border = "1px solid gray";
	obj.style.padding = "2px";
	YAHOO.util.Event.addListener( obj, "focus", FldHandler.onFocusField );
	YAHOO.util.Event.addListener( obj, "blur",  FldHandler.onBlurField );
	YAHOO.util.Event.addListener( obj, "keypress", FldHandler.onKeyPress );
	FldHandler.FldList[objName] = {
		obj:        obj,
		validateCb: validateCb,
		onFocusCb:  onFocusCb,
		onBlurCb:   onBlurCb,
		valid:      false,
		Commas:     false,
		Prec:       0,
		Type:       type,
		ShowDollar: false,
		allowedChars: allowedChars
	};
}

FldHandler.FormatDate = function( date )
{
	var str = "";
	if( date.getMonth() < 9 )
		str += '0';
	str += (date.getMonth()+1).toString() + '/';
	if( date.getDate() < 10 )
		str += '0';
	str += date.getDate().toString() + '/';
	var year = date.getFullYear() % 100;
	if( year < 10 )
		str += '0';
	str += year.toString();
	
	return str;
}

FldHandler.FormatNumber = function( value, commas, prec, showdollar )
{
	value /= Math.pow( 10, prec );
	if( !commas )
		return value.toString();
		
	var str = value.toString();
	var x = str.split( '.' );
	var x1 = x[0];
	var x2 = x.length > 1 ? '.' + x[1] : '';
	if( x2.length == 0 && prec > 0 )
		x2 = '.';
	if( x2.length )
		while( x2.length-1 < prec )
			x2 += '0';
	var rgx = /(\d+)(\d{3})/;
	while( rgx.test( x1 ) )
		x1 = x1.replace( rgx, '$1'+','+'$2' );
	return (showdollar?'$':'') + x1 + x2;
}

FldHandler.GetDate = function( fld )
{
	if( FldHandler.FldList[fld] == null )
		return new Date();
	
	return new Date( Date.parse( FldHandler.FldList[fld].obj.value ) );
}

FldHandler.GetNum = function( fld )
{
	if( FldHandler.FldList[fld] == null )
		return 0;
	
	var value = FldHandler.FldList[fld].obj.value;
	if( FldHandler.FldList[fld].Commas )
		value = value.replace( /[,$]/g, "" );
	var num = parseFloat( value );
	if( isNaN( num ) )
		return 0;
	num *= Math.pow( 10, FldHandler.FldList[fld].Prec );
	num += 0.5001;
	return Math.floor( num );
}

FldHandler.GetText = function( fld )
{
	if( FldHandler.FldList[fld] == null )
		return 0;
	
	var value = FldHandler.FldList[fld].obj.value;
	value.replace( /(^\s+)|(\s+$)/g,"" );
	return value;
}

FldHandler.IsLeapYear = function( year )
{
	var isleap = false;
	
	if( ( year % 4 ) == 0 )
		isleap = true;
	if( ( year % 100 ) == 0 )
	{
		isleap = false;
		if( ( year % 400 ) == 0 )
			isleap = true;
	}
	
	return isleap;
}

FldHandler.IsValidDate = function( str )	
{
	var parts = str.split( '/' );
	
	if( parts.length != 3 )
		return false;
		
	var mlen = new Array( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );
	
	if( parts[0].length == 0
	 || parts[1].length == 0
	 || parts[2].length == 0 )
		return false;
	
	var mon = parseInt( parts[0], 10 );
	var day = parseInt( parts[1], 10 );
	var year = parseInt( parts[2], 10 );
	
	if( isNaN( mon ) || isNaN( day ) || isNaN( year ) )
		return false;
	
	if( mon < 1 || mon > 12 )
		return false;
		
	if( year >= 0 && year <= 99 )
		year += ( year < 50 ) ? 2000 : 1900;
	if( year < 1900 || year > 2100 )
		return false;
	
	var days = mlen[mon-1];
	if( mon == 2 && FldHandler.IsLeapYear( year ) )
		days++;
	if( day < 1 || day > days )
		return false;

	return true;
}

FldHandler.onBlurField = function( e )
{
	if( !e )
		e = window.event;  // event object for IE
	var target = e.target;
	if( !target )
		target = e.srcElement;  // target object for IE
		
	if( FldHandler.FldList[target.id] == null )
		return;
	
	if( FldHandler.FldList[target.id].valid )
		target.style.background = "white";
	else
		target.style.background = "red";
		
	if( FldHandler.FldList[target.id].Type == FldHandler.FldTypeNum )
		FldHandler.FldList[target.id].obj.value = FldHandler.FormatNumber(
			FldHandler.GetNum( target.id ),
			FldHandler.FldList[target.id].Commas,
			FldHandler.FldList[target.id].Prec,
			FldHandler.FldList[target.id].ShowDollar );
	else if( FldHandler.FldList[target.id].Type == FldHandler.FldTypeDate )
	{
		if( FldHandler.IsValidDate( FldHandler.FldList[target.id].obj.value ) )
			FldHandler.FldList[target.id].obj.value =
				FldHandler.FormatDate( FldHandler.GetDate( target.id ) );
	}
	
	if( FldHandler.FldList[target.id].onBlurCb != null )
		FldHandler.FldList[target.id].onBlurCb( target.id );
	if( FldHandler.FldList[target.id].validateCb != null )
		FldHandler.FldList[target.id].validateCb( target.id, false );
}

FldHandler.onFocusField = function( e )
{
	if( !e )
		e = window.event;  // event object for IE
	var target = e.target;
	if( !target )
		target = e.srcElement;  // target object for IE
		
	if( FldHandler.FldList[target.id] == null )
		return;
		
	target.style.background = "yellow";
	
	if( FldHandler.FldList[target.id].onFocusCb != null )
		FldHandler.FldList[target.id].onFocusCb( target.id );
}

FldHandler.onKeyPress = function( e )
{
	if( !e )
		e = window.event;  // event object for IE
	var target = e.target;
	if( !target )
		target = e.srcElement;  // target object for IE
		
	if( FldHandler.FldList[target.id] == null )
		return true;
	
	if( e.keyCode == 13
	 && FldHandler.FldList[target.id].validateCb != null )
	{
		FldHandler.FldList[target.id].validateCb( target.id, false );
		if( FldHandler.FldList[target.id].valid )
			FldHandler.FldList[target.id].validateCb( target.id, true );
		return false;
	}
	
	var keyCode = e.keyCode;
	if( e.charCode != null )  // Firefox
	{
		if( e.charCode == 0 )  // non-printable
			return false;
		keyCode = e.charCode;
	}
	
	if( FldHandler.FldList[target.id].allowedChars.indexOf( String.fromCharCode( keyCode ) ) == -1 )
	{
		if( e.preventDefault )
			e.preventDefault();
		if( e.returnValue )
			e.returnValue = false;
		return false;
	}
	
	if( keyCode >=32 && keyCode <= 126 )
		FldHandler.FldList[target.id].valid = false;

	return true;
}

FldHandler.SetCommas = function( fld, commas )
{
	if( FldHandler.FldList[fld] == null )
		return;
	
	FldHandler.FldList[fld].Commas = commas;
}

FldHandler.SetDate = function( fld, date, valid )
{
	if( FldHandler.FldList[fld] == null )
		return;

	FldHandler.FldList[fld].obj.value = FldHandler.FormatDate( date );
	if( valid == null )
		valid = true;
	FldHandler.FldList[fld].valid = valid;
}

FldHandler.SetFocus = function( fld )
{
	if( FldHandler.FldList[fld] == null )
		return;
	
	FldHandler.FldList[fld].obj.focus();
	if( FldHandler.FldList[fld].obj.type == "text" )
		FldHandler.FldList[fld].obj.select();
}

FldHandler.SetShowDollar = function( fld, showdollar )
{
	if( FldHandler.FldList[fld] == null )
		return;
	
	FldHandler.FldList[fld].ShowDollar = showdollar;
}

FldHandler.SetNum = function( fld, num, valid )
{
	if( FldHandler.FldList[fld] == null )
		return;
	
	FldHandler.FldList[fld].obj.value = FldHandler.FormatNumber(
		num, FldHandler.FldList[fld].Commas, FldHandler.FldList[fld].Prec,
		FldHandler.FldList[fld].ShowDollar );
	if( valid == null )
		valid = true;
	FldHandler.FldList[fld].valid = valid;
}

FldHandler.SetPrec = function( fld, prec )
{
	if( FldHandler.FldList[fld] == null )
		return;
	
	FldHandler.FldList[fld].Prec = prec;
}

FldHandler.SetText = function( fld, text, valid )
{
	if( FldHandler.FldList[fld] == null )
		return;
	
	FldHandler.FldList[fld].obj.value = text;
	if( valid == null )
		valid = true;
	FldHandler.FldList[fld].valid = valid;
}

FldHandler.SetValid = function( fld, valid )
{
	if( FldHandler.FldList[fld] == null )
		return;
	
	FldHandler.FldList[fld].valid = valid;
	if( FldHandler.FldList[fld].obj.style.background != "yellow" )
		FldHandler.FldList[fld].obj.style.background = valid ? "white" : "red";
}

FldHandler.Trim = function( str )
{
	if( str == null )
		return str;
		
	return str.replace( /(^\s+)|(\s+$)/g,"" );
}
