The theme is set via the use of a Value called _theme_.
If you had a form, and on that form was a field called _theme_ then when that form is completed the _theme_ is automatically updated. Thus the easiest way to let the user select the theme is to
a) make a form, with a drop-down, that you populate with all the valid theme names.
b) the name of the drop down dield should be set to _theme_
c) when the user clicks on the "save" button on the form, the theme will change (that'll only be visible though on the next page refresh.)
In code you can change the theme as well, by setting a value and calling SetTheme.
p_web.SetValue('_theme_',whatever)
p_web.SetTheme()
So, for example, an ideal place to do this is when the user logs in, as part of the login validation process.
Of course the theme is bound to the _session_ so multiple users can access the site, using different themes at the same time.
there are a couple ways you could differentiate your _login_ screen so that a different theme is show _before_ we even know who the user is. The one way is to set a cookie, called _theme_, that contains the theme name. (See docs on cookies.)
Another option (although more complex to set up) would be to base it on the URL used. for example john.capesoft.com might get a different theme to bruce.capesoft.com. But this approach is based on the whole idea of putting different customers on different URL's - which is a fair bit more management on your side for each new customer. (but has the potential to scale more easily as well.)
cheers
Bruce