ChadSmiley Blog Things about family, life, coding, and more

26Jul/052

2 Small Improvements

1 - Ability to use the control or shift key to stop the execution of the bookmarks in the Startup folder. This option is currently available in Windows and which I think Lotus was trying to model after, then all the features should be implemented. via: Tagged as: 2 Comments

23Jul/050

CryptoCard 2.2.0

I have found a replacement to SecureIT that I used with my Palm. There are some things that I missed about my Handspring and this was one of them. Since I have switched to a ViewSonic V37 I have been looking for a replacement. CryptoCard has been my closes match, and 2.2.0 has just been released. I was looking for something free and had the ability to create new templates. CryptoCard has the added benefit of having a windows version also. Now I can read my secure information from anywhere at any time.

I like the interface and it is very consistant between the two platforms. The only improvement I would like to see the ability to tap on a file and it to open on the PDA.

 

I have created a couple of new/enhanced templates for CryptoCard that are very easy to create:

Vehicle - Main

Vehicle - Vehicle

For more information: Google Groups - Pmmax-CryptoCard

Tagged as: , No Comments
19Jul/0512

Edit Document Fields 5.1.0

Updated version of Edit Document Fields is now available.

Added some more *smarts* to the Edit Document Fields 5.0.1. When selecting categories with documents the categories are not included at all. Download Edit Document 5.1.0 or if you would like to step threw the code break down then continue.

The 5 Simple Steps

  1. Select the document(s) to update
  2. Click your toolbar button
  3. Select the field to update
  4. Select the data type or action to be performed
  5. Enter the new information (if prompted)

Limitations

  • Only 500 documents can be updated at a time
  • Field value is limited to 255 because of the @Prompt limitations
  • When updating multiple documents only the documents that are selected and visible (expanded) in the view will be updated. Notes needs to be able to navigate to the document

Code Break Down

Constants

REM {Edit Document Fields 5.1.0 by Chad Schelfhout.};
REM {Visit http://www.chadsmiley.com/EditDocumentFields for the latest updates};
 
REM {Constants};
EditLastField:="edfLastField";
EditLastFieldDataType:="edfLastFieldDataType";
EditLastSeparator:="%~%";
ProfileName:="ChadSmiley Tools";
PromptTitle:=@DbTitle+" - "+@ViewTitle;
MaxSearchForSelectedDocs:=5520;
MaxUpdatedDocuments:=1000;
ArraySeperator:=";";
NoteEntryLength:=11;
PormptNewLine:=@Char(13)+@Char(13);
CategoryNoteID:="NT00000000";

Data Types and Data Type Code

This defines all the possible datatypes and the formula that will be used to set the field.

REM {Data types|@Function execution};
DataTypesCombo:=@Explode(
"Integer|@TextToNumber(RawValue)$"+
"Integer Multi Value|@TextToNumber(@Explode(RawValue;Separator;@True))$"+
"Date|@ToTime(RawValue)$"+
"Date Multi Value|@ToTime(@Explode(RawValue;Separator;@True))$"+
"Text|@Text(RawValue)$"+
"Text Multi Value|@Text(@Explode(RawValue;Separator;@True))$"+
"Name|RawValue$"+
"Name Multi Value|RawValue$"+
"Common Name|@Name([CN];RawValue)$"+
"CommonName Multi Value|@Name([CN];@Explode(RawValue;\":\";@True))$"+
"Upper Case Text|@UpperCase(@Implode(@Text(@GetField(EditField[ef]))))$"+
"Lower Case Text|@LowerCase(@Implode(@Text(@GetField(EditField[ef]))))$"+
"Proper Case Text|@ProperCase(@Implode(@Text(@GetField(EditField[ef]))))$"+
"Upper Case Text Multi Value|@UpperCase(@Explode(@Text(@GetField(EditField[ef]));Separator;@True))$"+
"Lower Case Text Multi Value|@LowerCase(@Explode(@Text(@GetField(EditField[ef]));Separator;@True))$"+
"Proper Case Text Multi Value|@ProperCase(@Explode(@Text(@GetField(EditField[ef]));Separator;@True))$"+
"Replace Substring|@ReplaceSubstring(@GetField(EditField[ef]);FromRawValue;RawValue)$"+
"Replace|@Explode(@Replace(@GetField(EditField[ef]);FromRawValue;RawValue);Separator;@True)$"+
"Implode|@Implode(@Text(@GetField(EditField[ef]));Separator)$"+
"Explode|@Explode(@Text(@GetField(EditField[ef]));Separator;@True)$"+
"Formula|@Eval(RawValue)$"+
"Abbreviate Name|@Name([Abbreviate];RawValue)$"+
"Abbreviate Name Multi Value|@Name([Abbreviate];@Explode(RawValue;Separator;@True))$"+
"Password Set|@Password(RawValue)$"+
"Password Convert|@Password(@GetField(EditField[ef]))$"+
"Remove Field|@DeleteField$"+
"Unique|@Unique(@GetField(EditField[ef]))$"+
"+ Append Values|@If(" +
"  @GetField(EditField[ef])=\"\";RawValue;" +
"  @Contains(DefaultDataType;\"Date\");" +
"  @If(@IsError(@ToTime(RawValue));" +
"   \"\";" +
"   @SetField(EditField[ef];@GetField(EditField[ef]) : @TextToTime(@Explode(RawValue;Separator))));" +
"  @Contains(DefaultDataType;\"Integer\");" +
"  @If(@IsError(@TextToNumber(@Explode(RawValue;Separator)));" +
"   \"\";" +
"   @SetField(EditField[ef];@GetField(EditField[ef]) : @TextToNumber(@Explode(RawValue;Separator))));" +
"  @SetField(EditField[ef];@GetField(EditField[ef]) : @Explode(RawValue;Separator)))$"+
"Sort Ascending|@Sort(@GetField(EditField[ef]);[Ascending])$"+
"Sort Descending|@Sort(@GetField(EditField[ef]);[Descending])";"$");
 
DataTypes:=@Word(DataTypesCombo;"|";1);
DataTypesAction:=@Word(DataTypesCombo;"|";2);

Setup

First we need to determine the fields that are available, based on the currently selected document. Then get the last updated field based on the form of the currently selected document.

REM {Get a listing of all the fields on the current document};
List:=@Sort(@DocFields);
 
REM {Look for last field modified in Profile Doc};
FieldList:=@Explode(@GetProfileField(ProfileName;EditLastField;@UserName);ArraySeperator;@True);
 
REM {Get the list of forms and field that was updated using Edit Document Fields};
FieldListForms:=@Word(FieldList;EditLastSeparator;1);
FieldListField:=@Word(FieldList;EditLastSeparator;2);
FieldListLastIndex:=@Member(Form;FieldListForms);
REM {If the FieldListLastIndex is greater than zero then set the last field to the what was in the profile document};
@If(FieldListLastIndex >0;
  @Do(LastField:=FieldListField[ FieldListLastIndex ];
  FieldList:=@ReplaceSubstring(FieldList;FieldList[ FieldListLastIndex ];""));
  LastField :="");

Field Selection/Add

Display a list of all available fields with the ability to enter new ones. Then set the prompt title that will be used throughout the rest of the code.
Select/Add Field

REM {Prompt for which field needs to be updated. Loop until a field is selected or 'Cancel' is selected};
@DoWhile(
  EditField:=@Prompt([OkCancelEditCombo];PromptTitle;"Select the field you wish to alter or enter a new field to add:";LastField;@Trim(@Unique(List : LastField)));
  EditField="");
EditFieldPromptTitle:=EditField+" - "+PromptTitle;

Determine Field Type

Using the form of the currently selected document and the field that was just selected to determine the last data type used and the last formula code used. If there was no previous data type try to determine the data type base on the data of the field. If there are any problems the default field type will be text.

REM {This will allow the retrieval of the data type of the field that was last selected. Data is stored like Form+Field%~%DataType.};
FormFieldList:=@Explode(@GetProfileField(ProfileName;EditLastFieldDataType;@UserName);ArraySeperator;@True);
FormFieldListFormField:=@Word(FormFieldList;EditLastSeparator;1);
FormFieldListDataType:=@Word(FormFieldList;EditLastSeparator;2);
FormFieldListFormulaCode:=@Word(FormFieldList;EditLastSeparator;3);
FormFieldListIndex:=@Member(Form+EditField;FormFieldListFormField);
@If(FormFieldListIndex >0;
  @Do(DefaultDataType:=FormFieldListDataType[ FormFieldListIndex ];
  FormFieldListFormulaCode:=FormFieldListFormulaCode[ FormFieldListIndex ];
  FormFieldList:=@ReplaceSubstring(FormFieldList;FormFieldList[ FormFieldListIndex ];""));
  DefaultDataType :="");
 
REM {If there was no data type used for the field on the form the try to determine the data type};
DefaultDataType :=
  @If(DefaultDataType!="";
  DefaultDataType;
  @If(
  @IsNumber(@GetField(EditField));
  @If(@Count(@GetField(EditField)) >1;
  "Integer Multi Value";
  "Integer");
  @IsTime(@GetField(EditField));
  @If(@Count(@GetField(EditField)) >1;
  "Date Mult iValue";
  "Date");
  @If(@Count(@GetField(EditField)) >1;
  "Text Multi Value";
  "Text")
  )
  );
 
REM {If the data type is a type of error then select the data type of text};
DefaultDataType:=@IfError(DefaultDataType;"Text");

Select Data Type/Set Action

Once the data type is selected determine the posistion in the array of the data type and set the data type action with the action in the same position of the array.
Select Data Type

REM {Prompt for which data type you would like the data to be. This needs to be done before value prompt to determine if the Picklist or any prompting needs to be used.};
DataType:=@Prompt([OkCancelList];EditFieldPromptTitle;"Please select the correct data type or action for field: "+EditField+".";DefaultDataType;DataTypes);
 
REM {The DataTypeAction will contain the formula that will be executed to retrieve the new value};
DataTypeAction:=DataTypesAction[ @Member(DataType;DataTypes) ];

Get Original Value

When using the formula data type there is no reason to see the selected fields value, because you would reference the field name when writing formula. Since there is no real need of the field value why not show the last formula for that field.

REM {If formula was used on this field then use that instead of the fields value. Format the original value as text because the @Prompt command requires text.};
OriginalValue:=@If(DataType=formula & DefaultDataType=formula & FormFieldListFormulaCode!="";
  FormFieldListFormulaCode;
  @If(@Contains(DefaultDataType;MultiValue);
  @Implode(@Text(@GetField(EditField));ArraySeperator);
  @Text(@GetField(EditField)))
  );

Replace & Replace Substring

The idea behind the search and replace is to update all occurances of a string, so why not search over multiple fields. This allows multiple fields to be selected.
Additional Fields
Then determine what to search for.
Replace

REM {Prompt for additional fields and determine the string that they are searching for.};
@If(DataType=@Explode("Replace Substring;Replace";ArraySeperator);
  @Do(EditField:=@Unique(EditField : @Prompt([OkCancelListMult];PromptTitle;"Select any addtional fields you wish to alter:";EditField;List));
  FromRawValue:=@Prompt([OkCancelEdit];EditFieldPromptTitle;"Please enter the text (Case sensitive) to search for in: "+@Implode(EditField;", ")+".";""));
  @Do(EditField:=EditField;
  FromRawValue:="")
  );

Implode/Explode

When exploding multiple characters can be used to separate text. If no seperator is entered a semicolon will be used. When imploding the string entered will be used to seperate the values.
Seperator

Separator:=@If(DataType=@Explode("Implode;Explode";ArraySeperator);
  @Prompt([OkCancelEdit];PromptTitle;"Enter the "+@If(DataType="Implode";"separator";"separators")+ArraySeperator;"");
  ArraySeperator);

Get New Value

Most data types don't have any promptings like Unique or Sort, the rest the prompt depends on the data type.
Enter New Value

REM {Based on what type of data is being entered different prompts will happen if any at all.};
RawValue:=@If(
  @Contains(DataType;"Name Multi Value");@PickList([Name]);
  @Contains(DataType;"Name");@PickList([Name] : [Single]);
  DataType=@Explode("Remove Field;Unique;Sort Ascending;Sort Descending;Implode;Explode;Proper Case Text;Proper Case Text Multi Value;Lower Case Text;Lower Case Text Multi Value;Upper Case Text;Upper Case Text Multi Value;Password Convert";ArraySeperator);"";
  @Contains(DataType;"Multi Value");@Prompt([OkCancelEdit];EditFieldPromptTitle;"Please enter the new desired value for: "+@Implode(EditField;", ")+"."+PormptNewLine+"Seperated with;for each value.";OriginalValue);
  @Contains(DataType;"+ Append Values");@Prompt([OkCancelEdit];EditFieldPromptTitle;"Please enter values to append: "+@Implode(EditField;", ")+"."+PormptNewLine+"Seperated with;for each value.";"");
  DataType=@Explode("Replace Substring;Replace";ArraySeperator);@Prompt([OkCancelEdit];EditFieldPromptTitle;"Please enter the text to repalce with in: "+EditField+".";"");
  DataType=formula;@Do(@DoWhile(
  OriginalValue:=@Prompt([OkCancelEdit];EditFieldPromptTitle;"Please enter the new desired formula for: "+EditField+".";OriginalValue);
  tempReturnCheck:=@CheckFormulaSyntax(OriginalValue);
  @If(tempReturnCheck!="1";@Prompt([Ok];"Invalid Formula";@Text(tempReturnCheck));"");
  tempReturnCheck != "1");
  OriginalValue);
  @Prompt([OkCancelEdit];EditFieldPromptTitle;"Please enter the new desired value for: "+EditField+".";OriginalValue)
  );

Update Profile

Now that the data type has been selected and the new value or forumula has been entered lets set the profile document so it will be available the next time.

REM {Store Field in Profile doc};
@SetProfileField(ProfileName;EditLastField;@Unique(@Explode(FieldList : (Form+EditLastSeparator+EditField[1]);ArraySeperator;@False));@UserName);
 
REM {Store Data Type of Field in Profile doc};
@SetProfileField(ProfileName;EditLastFieldDataType;@Unique(@Explode(FormFieldList : (Form+EditField[1]+EditLastSeparator+DataType+EditLastSeparator+@If(DataType=formula;RawValue;FormFieldListFormulaCode));ArraySeperator;@False));@UserName);

Find all the documents to be updated

First need to make sure that the current document is one that is selected. Since there is no way to know if it is selected we need to move to the next selected document. The next block of code eleminates the blank value in the list of Note IDs lets set the NoteIDList with the newly selected document. Finally we can navigate through all the selected documents to gather all the documents that will be updated. The last step is to write to the status bar how many documents were found.

{Store all Note IDs before manipulation in case field modifications cause categorized views or sorted columns to reorganize};
NoteIDList:=@Text(@NoteID);
@Command([NavNextSelected]);
@UpdateFormulaContext;
 
REM {Start Looping Selected documents};
@While((@Left(NoteIDList;NoteEntryLength)!=(@Text(@NoteID+ArraySeperator))) & (@Length(NoteIDList) <MaxSearchForSelectedDocs);
  NoteIDList:=NoteIDList+ArraySeperator+@Text(@NoteID);
  NoteIDList:=@ReplaceSubString(NoteIDList;CategoryNoteID+ArraySeperator;"");
  @Command([NavNextSelected]);
  @UpdateFormulaContext
);
 
NoteIDList:=@ReplaceSubString(NoteIDList;CategoryNoteID;"");
NoteIDList:=@Unique(@Explode(NoteIDList;ArraySeperator;@False));
@StatusBar("Found "+@Text(@Elements(NoteIDList))+" documents.");
NotNoteIDList:="";

Update the field

For each document determine if it needs to be updated. Not all selected documents need to be updated becuase it could have moved in the view after it was updated. If there are any errors while updated the field then stop. If the max number of documents that can be navigated to is met then assume that some of the documents can not be found. This eliminates the possibility of an infinite loop.

REM {Loop through selected docs taking each NoteIDList out of the list as it is processed};
DocUpdateCount:=0;
DocNavigationCount:=0;
@While(DocUpdateCount <@Elements(NoteIDList);
 
  @If(@TextToNumber(@Text(@DocumentUniqueID))!=0;
  @Do(
  NoteIDList:=@Replace(NoteIDList;@NoteID;"");
  NotNoteIDList:=NotNoteIDList : @NoteID;
  @For(ef:=1;ef <= @Elements(EditField);ef:=ef+1;
  formulaResult:=@Eval(DataTypeAction);
REMark:=" **REM** The values entered above will be applied to all selected doc. If data conversion doesn't work then don't set field.";
  @If(@IsError(formulaResult);
  @Return(@Prompt([Ok];"Error";@Text(FormulaResult)));
  @SetField(EditField[ef];formulaResult)
  )
  );
  @If(DocNavigationCount >MaxUpdatedDocuments;
  NoteIDList:="";
  @Do(
  DocUpdateCount:=DocUpdateCount+1;
  @Command([NavNextSelected]);
  @UpdateFormulaContext;
REMark:=" **REM** If we haven't processed all docs yet but the current doc is not in the NoteIDList list, keep looping ... if cnt exceeds MaxUpdatedDocuments assume infinite loop and stop ";
  @If(DocUpdateCount <@Elements(NoteIDList) & (!@Member(@NoteID;NoteIDList)) & (!@Member(@NoteID;NotNoteIDList));
   @While((! @Member(@NoteID;NoteIDList) & DocNavigationCount <MaxUpdatedDocuments);
  @Command([NavNextSelected]);
  @UpdateFormulaContext;
  DocNavigationCount:=DocNavigationCount+1);
  "")
  )
  )
  );
  @Do(@Command([NavNextSelected]);
  @UpdateFormulaContext)
  )
);

Display results

If there are any documents that have not been updated the write the Note ID(s) to the status bar. Also update the status bar with the number of documents that were navigated through and the number of documents updated. That's it.

@If(@Implode(@Unique(@Explode(NoteIDList;ArraySeperator;@False)))!="";@StatusBar("Unable to update the following documents: "+@Implode(@Unique(@Explode(NoteIDList;ArraySeperator;@False));", ")+".");"");
@StatusBar("Navigated through "+@Text(DocUpdateCount+DocNavigationCount)+" documents.");
@StatusBar("Performed '"+DataType+"' for '"+@Implode(EditField;", ")+"' field"+@If(@Elements(EditField) >1;"s ";" ")+"on "+@Text(DocUpdateCount)+" document"+@If(DocUpdateCount >1;"s";"")+".")

Download all the code

18Jul/050

Reference Lookup

Here is another called Reference Lookup 1.0.0 (5) that I use when developing Domino applications. The goal of this library is to remove all hard coding of servers and file paths with aliases. Originally this was developed for Formula language but has sense been expanded to LotusScript and Java. I have also expanded the concepts of servers and paths to URLs and local file paths.

I used Quick Elementer so you can easly impement the Formula, LotusScript or Java Version. I also created Quick Elementer Code starters that can be used to get a jump start on the code needed to use Reference Lookup. The LotusScript and Java will return the reference object or Notes Database. Using the following logic:

Formula code starters can return the database based on the current server or the users mail server.

REM "Get the Reference database based off the current server."; 
 
ReferenceAlias := "<enter reference alias here>"; 
 
NewLookupDb := @Explode( @Explode( @DbLookup("" : "NoCache" ; @DbName ; "(Reference Lookup)"; @Subset( @Name( [CN] ; @DbName ) ; 1 ) + ReferenceAlias ; 3 ) ; "," ); ":" ; @True ) ; 
 
NewDatabase := @If( @IsError( NewLookupDB ) ; 
   @Return( @Prompt( [OK] ; "Unable to continue. " ; "Unable to find: " + ReferenceAlias )  ); 
   NewLookupDB);

There are also starters for @DBLookup, @DBColumn and @PickList.

REM "First Check based off the current server.  If that returns error then check based off their Home mail server."; 
 
ReferenceAlias := "<enter reference alias here>"; 
CurrentServer := @True/@False; 
View := "<view Name>"; 
ViewKey := <value to lookup on the first sorted column>; 
ViewReturn := <view column number or field name to return>; 
ErrorCheck := @True/@False; 
CacheLookup := @True/@False; 
 
LookupDb := @Explode( @DbLookup("" : "NoCache" ; @DbName ; "(Reference Lookup)"; @if( CurrentServer ; "*" ;  @Subset( @Name( [CN] ; @DbName ) ; 1 ) ) + ReferenceAlias ; 3 ) ; "," ); 
 
NewLookupDB := @Explode( @If( LookupDB = ""  | @IsError( LookupDB ) ; 
   @Explode( @DbLookup("" : "NoCache"; @DbName ; "(Reference Lookup)" ; @Name( [CN] ; @Environment( "MailServer" ) ) + ReferenceAlias ; 3 ) ; "," ); 
   LookupDB ) ; ":" ; @True ) ; 
 
TempReturn := @If( @IsError( NewLookupDB ) ; 
   @Prompt( [OK] ; "Unable to continue. " ; "Unable to find: " + ReferenceAlias )  ; 
   @DbLookup( @If( CacheLookup ; "" ; "":"NoCache" ) ; @if( @SubSet( NewLookupDB ; 1 ) = "*" ; @Subset( @Name( [CN] ; @DbName ) ; 1 ) : @SubSet( NewLookupDB ; -1 ) ; NewLookupDB ) ; View ; ViewKey ; ViewReturn ) ); 
 
@If( ErrorCheck ; 
   @If( @IsError( TempReturn ) | TempReturn = ""; 
      @Return("") ; 
      TempReturn ) ; 
   TempReturn );

Here is the starter code for populating a keyword options with alias.

REM "First Check based off the current server.  If that returns error then check based off their Home mail server."; 
 
ReferenceAlias := "<enter reference alias here>"; 
View := "<view Name>"; 
ViewReturn := <view column number or field name to return>; 
Wordseparator := "<word number to display>"; 
DisplayWord := <word number to display>; 
AliasWord := <word number as the alias>; 
ErrorCheck := @True/@False; 
CacheLookup := @True/@False; 
 
LookupDb := @Explode( @DbLookup("" : "NoCache" ; @DbName ; "(Reference Lookup)"; @Subset( @Name( [CN] ; @DbName ) ; 1 ) + ReferenceAlias ; 3 ) ; "," ); 
 
NewLookupDB := @Explode( @If( LookupDB = ""  | @IsError( LookupDB ) ; 
   @Explode( @DbLookup("" : "NoCache"; @DbName ; "(Reference Lookup)" ; @Name( [CN] ; @Environment( "MailServer" ) ) + ReferenceAlias ; 3 ) ; "," ); 
   LookupDB ) ; ":" ; @True ) ; 
 
TempReturn := @If( @IsError( NewLookupDB ) ; 
   @Prompt( [OK] ; "Unable to continue. " ; "Unable to find: " + ReferenceAlias)  ; 
   @DbColumn( @If( CacheLookup ; "" ; "":"NoCache" ) ;  @if( @SubSet( NewLookupDB ; 1 ) = "*" ; @Subset( @Name( [CN] ; @DbName ) ; 1 ) : @SubSet( NewLookupDB ; -1 ) ; NewLookupDB ) ; View ; ViewReturn ) ); 
 
ReturnValue := @If( ErrorCheck ; 
   @If( @IsError( TempReturn ) | TempReturn = ""; 
      @Return("") ; 
      TempReturn ) ; 
   TempReturn ); 
 
@Word( ReturnValue ; Wordseparator ; DisplayWord ) + "|" + @Word( ReturnValue ; Wordseparator ; AliasWord )
Reference Lookup 1.0.0 (5)
14Jul/050

Quick Elementer 2.2.0a at openNTF.org

A fix has been released for Quick Elementer to correct a problem when implementing sub elementers.

11Jul/050

Quick Elementer 2.2.0 at openNTF.org

Version 2.2.0 has been released. Here is the list of new features:

  • Paste code from documents into desired location using toolbar icon or Tools menu (Quick Elementer Code)
  • Use toolbar icon or Tools menu (in Designer) to implement a Quick Elementer from destination database
  • Additional attributes: Release, Platform, Category
  • Added additional views by the new attributes


10Jul/050

Some what of a Mason

This weekend I helped my father-in-law put up his basement walls. He is building a 24' x 30' cottage in Mountain. The basement is not poured concrete but block walls . I do like the look of a block wall, then again I might be partial because of growing up with a mason as a father.

While going to college I worked with my dad and was a tender, then we built our house 6 years ago and we put in block walls also. There has been a few other jobs that I have helped as a tender. My brother's and dad's houses the last two years. This weekend was my first actual attempt at laying block, and all the hours of watching and striking joints paid off. One of the other masons said it looked like I had done it before.

It does pay to watch and learn from others.

Filed under: Family No Comments
7Jul/050

Interest Only Loans

Got a letter in the mail a couple of days ago that was talking about lowering your mortgage payment. Like most people I am all for that! The letter showed that I could save a couple hundred dollars every month. This caught my attention, but was also thinking what is the catch. The letter was talking about an interest only loan. The low monthly payments could last from 3 to 7 years then the interest rate raises and they force you to start paying on the principle. This means your monthly payment could jump 200-400 dollars a month. WOW, no that is not cool. This is not looking that good to me any more, since I plan on staying in my current house for more than 7 years. This might be an option for someone that is planning on moving in a couple of years.

I then decided to start checking out the current interest rates and found that what I thought was really low is no longer low. So I will be checking out bankrate.com and maybe LendingTree.com but they require more information and is a one time deal.

I found this Refinancing Mortgage Calculator that I will be using to see how much I will be saving.

Does any one know of any other good sites?

Filed under: General No Comments
6Jul/050

100 Downloads

Quick Elementer has reached 100 downloads in a couple of weeks. I am happy with the response, but will have to wait to see what happens with the next release which I am still working on. I have been struggling to find the time to finish the improvements. So if you have any additional requests please submit them soon.

5Jul/050

Proverbs 5:1-6

1-My son, pay attention to my wisdom;
Lend your ear to my understanding,
2-That you may preserve discretion,
And your lips may keep knowledge.
3-For the lips of an immoral woman drip honey,
And her mouth is smoother than oil;
4-But in the end she is bitter as wormwood,
Sharp as a two-edged sword.
5-Her feet go down to death,
Her steps lay hold of hell.
6-Lest you ponder her path of life--
Her ways are unstable;
You do not know them.
Tagged as: No Comments
   

Domino Tools

Smiley Tools

My Posts

July 2005
M T W T F S S
« Jun   Aug »
 123
45678910
11121314151617
18192021222324
25262728293031

Tags

Categories

Archives