Chris,
Unfortunately, SQL is pretty bad at handling arbitrary-depth menus (esp. without WITH RECURSIVE or CONNECT BY). Fortunately, the amount of data is likely to be pretty small, so it is not too bad using stored procedures.
See connect_by() in tablefunc. Please don't reinvent the wheel. --Josh