LocationChanger is a simple shell script and launchd description. The script gets launched after every network change.
When running it gathers some information, figures out the location and sets Location accordingly. I also have it start or stop synergy and a proxy over ssh to forward the synergy socket if at work.
You need this launchd item in
~/Library/LaunchAgents/LocationChanger.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>tech.inhelsinki.nl.locationchanger</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/USERNAME/bin/locationchanger</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/Library/Preferences/SystemConfiguration</string>
    </array>
</dict>
</plist>
edit USERNAME to be your own username
and the locationchanger script, which I put in ~/bin/locationchanger and make it executable (chmod 755 ~/bin/locationchanger):
#!/bin/bash

# automatically change configuration of Mac OS X based on location
# author: Onne Gorter <o.gorter@gmail.com>
# url: http://tech.inhelsinki.nl/locationchanger/
# version: 0.4

# redirect all IO to /dev/null (comment this out if you want to debug)
exec 1>/dev/null 2>/dev/null

# get a little breather before we get data for things to settle down
sleep 2

# get various system information
SSID=`/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -I\
 | grep ' SSID:' | cut -d ':' -f 2 | tr -d ' '`
EN0IP=`ifconfig en0 | grep 'inet ' | cut -d' ' -f 2`
EN1IP=`ifconfig en1 | grep 'inet ' | cut -d' ' -f 2`

LOCATION=

# locations (use to be used Location name here)
ATHOME=Home
ATWORK=Work

# detect HOME
ATHOME_SSID=homessid
ATHOME_EN0IP=192.168.255.
ATHOME_EN1IP=192.168.255.

# detect Work
ATWORK_SSID=workssid
ATWORK_EN0IP=255.
ATWORK_EN1IP=255.


if [ -z $LOCATION ]; then
    case $SSID in
        $ATHOME_SSID    ) LOCATION="$ATHOME";;
        $ATWORK_SSID    ) LOCATION="$ATWORK";;
    esac
        REASON=SSID
fi

if [ -z $LOCATION ]; then
    case $EN0IP in
        $ATHOME_EN0IP*  ) LOCATION="$ATHOME";;
        $ATWORK_EN0IP*  ) LOCATION="$ATWORK";;
    esac
        REASON=EN0IP
fi

if [ -z $LOCATION ]; then
    case $EN1IP in
        $ATHOME_EN1IP*  ) LOCATION="$ATHOME";;
        $ATWORK_EN1IP*  ) LOCATIOn="$ATWORK";;
    esac
        REASON=EN1IP
fi

if [ -z $LOCATION ]; then
    # still didn't get a location, so do automatic
    LOCATION="automatic"
        REASON=Fallback
fi

case $LOCATION in
    $ATWORK )
        scselect $ATWORK
        #lpoptions -d "Work Printer"

        # get some time to figure ip addresses out ...
        sleep 3
        if ping -c 1 linux; then
            # if necesairy, start a proxy for synergy on host 'linux'
            ps -x | grep -E '[0-9] ssh.*-R24800:'  || \
                ssh -fN linux -R24800:127.0.0.1:24800 
            # if not running, start synergys with display name macosx
            ps -x | grep -E '[0-9] synergys'  || \
                synergys -n macosx
        fi
    ;;

    $ATHOME )
        # do some stuff here if you want to
        scselect $ATHOME
        #lpoptions -d "Home Printer"
    ;;

    automatic )
        # do some stuff here if you want to
        scselect Automatic
        #lpoptions -d "Default Printer"
    ;;

esac

# do some stuff here that needs to happen after every network change

echo `date` "Location: $LOCATION - $REASON" >> $HOME/.locationchanger.log

exit 0
After putting the scripts in place (and don't forget to make locationchanger executable), you can test locationchanger by launching it.
It logs every event to ~/.locationchanger.log, so you can look at that file to see if everything went ok.
Then either reboot or use launchctl load >~/Library/LaunchAgents/LocationChanger.plist.
Ideas:
Use /usr/bin/lpoptions -d This Printer to change the default printer based on your location. Look at ~/.lpoptions file for the current default printer.
Use arp -a to detect remote hardware address. Might just work incase you are on a network that does not give you an IP address automatically and Mac OS X assigned an auto-IP.
Use applescript to change default SMTP; something like this: osascript -e 'tell application "Mail" to set smtp server of account "ACCOUNT" to smtp server "smtp.provider.com"'
Or even more extreme, using a combination of applescript + normal script: stop iChat, copy other preference file that has other accounts enabled to ~/Library/Preferences/com.apple.iChat.plist. And start iChat again ... stopping iChat: osascript -e 'tell application "iChat" to quit'