Entering buttongroup
curpos $VAR1 = [ 'root', 'web', 'walkaacfi' ];
indent 0

b $VAR1 = {
'url' => 'http://dbpromo.dd-b.net/',
'button' => 'bhome-t',
'id' => 'home'
};

home

b $VAR1 = {
'subtree' => 'web',
'url' => 'http://dbpromo.dd-b.net/web/',
'button' => 'bdevelopment-t',
'id' => 'web'
};

web

Found button in curpos web

Entering buttongroup
curpos $VAR1 = [ 'web', 'walkaacfi' ];
indent 1

b $VAR1 = {
'url' => 'http://dbpromo.dd-b.net/web/philosophy.html',
'button' => 'bphilosophy-t',
'id' => 'philosophy'
};

philosophy

b $VAR1 = {
'url' => 'http://dbpromo.dd-b.net/web/process.html',
'button' => 'bprocess-t',
'id' => 'process'
};

process

b $VAR1 = {
'url' => 'http://dbpromo.dd-b.net/web/searchranking.html',
'button' => 'bsearchengines-t',
'id' => 'searchengines'
};

searchengines

b $VAR1 = {
'subtree' => 'walkhugo',
'url' => 'http://dbpromo.dd-b.net/web/walk-hugo/',
'button' => 'bunclehugos-t',
'id' => 'walkhugo'
};

walkhugo

b $VAR1 = {
'subtree' => 'walkaacfi',
'url' => 'http://dbpromo.dd-b.net/web/walk-aacfi/',
'button' => 'baacfi-t',
'id' => 'walkaacfi'
};

walkaacfi

Found button in curpos walkaacfi

Entering buttongroup
curpos $VAR1 = [ 'walkaacfi' ];
indent 2

b $VAR1 = {
'url' => 'http://dbpromo.dd-b.net/web/walk-aacfi/homepage.html',
'button' => 'bhomepage-t',
'id' => 'homepage'
};

homepage

b $VAR1 = {
'url' => 'http://dbpromo.dd-b.net/web/walk-aacfi/state.html',
'button' => 'bstate-t',
'id' => 'state'
};

state

b $VAR1 = {
'url' => 'http://dbpromo.dd-b.net/web/walk-aacfi/info.html',
'button' => 'binfo-t',
'id' => 'info'
};

info

b $VAR1 = {
'url' => 'http://dbpromo.dd-b.net/web/walk-aacfi/coursesearch.html',
'button' => 'bcoursesearch-t',
'id' => 'coursesearch'
};

coursesearch

b $VAR1 = {
'url' => 'http://dbpromo.dd-b.net/web/walk-aacfi/selectcourse.html',
'button' => 'bselectcourse-t',
'id' => 'selectcourse'
};

selectcourse

b $VAR1 = {
'url' => 'http://dbpromo.dd-b.net/web/walk-aacfi/courseregister.html',
'button' => 'bregister-t',
'id' => 'courseregister'
};

courseregister

b $VAR1 = {
'url' => 'http://dbpromo.dd-b.net/web/walk-aacfi/merchandise.html',
'button' => 'bmerchandise-t',
'id' => 'merchandise'
};

merchandise

b $VAR1 = {
'url' => 'http://dbpromo.dd-b.net/web/walk-aacfi/trainersonly.html',
'button' => 'btrainersonly-t',
'id' => 'trainersonly'
};

trainersonly

b $VAR1 = {
'url' => 'http://dbpromo.dd-b.net/web/walk-aacfi/admin.html',
'button' => 'badmin-t',
'id' => 'admin'
};

admin

b $VAR1 = {
'url' => 'http://dbpromo.dd-b.net/web/walk-aacfi/secureit.html',
'button' => 'bsecureit-t',
'id' => 'secureit'
};

secureit

b $VAR1 = {
'url' => 'http://aacfi.com/',
'button' => 'blive-t',
'id' => 'live'
};

live

leaving buttongroup

leaving buttongroup

b $VAR1 = {
'subtree' => 'photography',
'url' => 'http://dbpromo.dd-b.net/photography/',
'button' => 'bphotography-t',
'id' => 'photography'
};

photography

b $VAR1 = {
'url' => 'http://dbpromo.dd-b.net/contact.html',
'button' => 'bcontact-t',
'id' => 'contact'
};

contact

b $VAR1 = {
'url' => 'http://dbpromo.dd-b.net/misc/resume-web-20040818.html',
'button' => 'bresume-t',
'id' => 'resume'
};

resume

b $VAR1 = {
'url' => 'http://www.dd-b.net/redirdbpromo.html',
'button' => 'blive-t',
'id' => 'live'
};

live

leaving buttongroup

Course Search

Course Search Page

The primary use of the site is to attract and assist students finding and registering for courses. Searching for a course when there are hundreds of them scheduled for the next few months, to be held all over the state, is a hard user interface problem.

Course Type

Most courses are basic carry permit courses. In the future there will also have to be renewal courses (students must renew every five years), and there may be advanced courses and beginner courses as well. There are also instructor training courses—a lot more of those shortly after a state passes its right-to-carry law, or when AACFI first starts operating in a state.

Times

Many people are only free at certain times, or care a lot when they take a course. So we needed to provide a way for them to express this preference. The divisions "weekday" and "weekend", and "morning", "afternoon", and "evening", are very well known, so they seemed a good way to go.

We have had instructors schedule late-night classes, but rarely enough that having people looking for "evening" finding them too isn't a big problem (timeslots are categorized by course start time). For a while we also had a situation where there were times of the day that couldn't be searched for with this form. While nobody did ever schedule a course for any of those hours, instructors who mis-entered the time for one of their courses got very confused when they couldn't bring it up in the search! So we expanded the ranges so that all 24hrs were covered.

Location

The location search can help a lot. People with busy schedules, or who live in lightly populated parts of the state, care very much where they have to travel to to take the course -- probably more than exactly when they take it.

No courses are eliminated by the location selected; it only changes the order they are listed in.

Location is hard to work with, though. The current implementation uses a somewhat useful and very easy trick -- it simply sorts the difference of zip codes between where the course is held and the value the student enters. Mostly this works fairly well, except when you run into boundaries of zip code assignment. It works especially poorly when a course is being held in an adjacent state.

Calculating the actual distance between two points defined by latitude and longitude is easy (that is, the complicated formula can be looked up, I don't have to derive it from scratch!). Finding a table giving the latitude and longitude for each zip code also turns out to be fairly easy. By entering this information, we can make all the funny cases go away. And by entering exact latitude and longitude for the sites where courses are held, rather than their zip codes, we can make it a bit more precise. This is planned, but has not yet been done.


© Copyright 2005 David Dyer-Bennet