public void getBalances( SimpleDate asOfWhen, boolean force ) {
		// if we're up to date, there is nothing to do
		if (upToDate && !force)
			return;
		
		// reset all summary amounts to zero
		initBal = 0;
		totCredits = 0;
		totBudget = 0;
		totDebits = 0;
		finalBal = 0;
		
		// if we have no ledger entries, nothing to do
		if (firstElement == null)
			return;
		
		// if no date has been specified, use 1/1 
		if (asOfWhen == null) {
			asOfWhen = new SimpleDate( firstElement.entry.date.year, 1, 1 );
		}
		
		// walk the entire ledger
		//		accumulating each amount against proper balance
		for ( LedgerL thisElement = firstElement; thisElement != null; thisElement=thisElement.nextElement ) {
			if (thisElement.ignore)
				continue;
			if ( thisElement.entry.date.before(asOfWhen) ) {
				initBal += thisElement.entry.amount;
			} else if (thisElement.entry.amount < 0) {
				totDebits += thisElement.entry.amount;
			} else {
				if (thisElement.entry.description.equals( BUDGET_DESCRIPTION ))
					totBudget += thisElement.entry.amount;
				else
					totCredits += thisElement.entry.amount;
			}
			finalBal += thisElement.entry.amount;
		}
		
		upToDate = true;
	}