* 4. Configuration: ~~~~~~~~~~~~~~~~~~~ AMPlay has no built-in configuration editor - it launches a separate application; AMPlayCfg. AMPlayCfg has a number of sections dealing with different aspects of the player, its database etc. On the AMPlayCfg main window is a Help request button which will open a text file relevant to the selected options category (these are just excerpts from the document you are currently reading). Additionally, the main window buttons have the following effects Cancel; - Click Select to close AMPlayCfg, making no changes as it does so. - Click Adjust to cause AMPlayCfg to ask AMPlay for the its current settings. This might apply in cases where you've started AMPlayCfg, and then made some changes in AMPlay. Those changes only exist in memory, in AMPlay. This brings AMPlayCfg up to date with the current AMPlay state. If AMPlay isn't running, this does nothing. Defaults; - Click Select to update the AMPlayCfg panes with the default settings. These are not saved unless you click Save. - Click Adjust to revert to the settings that were displayed before you select-clicked Defaults. If you haven't done a select click on Defaults in this AMPlayCfg session, it does nothing. Save; - Click Select to update the options file, saved state, AMPlay itself (if it is running), and then close AMPlayCfg. - Click Adjust to the above, but keep AMPlayCfg open. If AMPlayCfg is launched manually, or run from within AMPlay, it will remember its window position, and will remember which pane was selected. It can also be run as a Configure plugin (on RISC OS 4 and later), and if run in this way it behaves according to the Style Guide and opens under the mouse pointer. If run as a plugin, the window positions are not saved. ________________________________________________________________________ * 4.1 Player: ~~~~~~~~~~~~~ * 4.1.1 Playback Order: ~~~~~~~~~~~~~~~~~~~~~~~ This has three menus that allow you to explicitly set the playback order for artists, albums and tracks. This is equivalent to the buttons on the main window itself. Total chaos mode (randomly change the playback order each time something is picked) can also be enabled here. 'Pick items relative to the last history item': This is a subtle one. If you are in a mode where the selection level is linear - e.g. Artists:Ignore, Albums:Linear, Tracks:Random/Shuffled, but the current history position is not at the end of the history, what should happen if you adjust-click next to force it to pick the next item now? If this option is off, it will pick the 'next' item as being the album that linearly follows the currently playing album. If this option is on, it will pick the 'next' item as being the album that linearly follows the last album in the history. Loop playback: This used to be a main window icon, but is now just an option (the repeat icon replaced it on the main window). If set, and the selection level is linear, then when the last item in the database is reached it will continue from the beginning. Otherwise it will stop. If the selection level is random, then this option has no effect as it never reaches an end as such. 4.1.2 Behaviour: ~~~~~~~~~~~~~~~~ This allows you to set the auto-next and auto-repeat options. These are the same as they are on the main window. If playing, play will: This determines what the Play button on the main window does in the case where a track is already playing. You can choose from Pause, Next, Stop, Ignore, or Restart. Volume change rate: This determines how much the volume changes when you click Select or Adjust on the volume control on the main window. The default value is 4, the range is 1-16. Set Volume, Volume: This determines whether AMPlay overrides the default AMPlayer volume on startup, and if so, what to. Range is 1-127. 4.1.3 Player Window: ~~~~~~~~~~~~~~~~~~~~ Main window always on top, Mini window always on top: These set the default always on top flags for the two window types. Use mini window by default: Fairly self-explanatory. ________________________________________________________________________ * 4.2 Display: ~~~~~~~~~~~~~~ * 4.2.1 Main Window: ~~~~~~~~~~~~~~~~~~~~ The Track format, Album format and Artist format tell AMPlay how to display information about the currently playing track. This uses a system of macros to encode the information. A macro consists of a %sign, followed by a few letters to give the macro name. Macros are covered in detail in section 2.12. There is a button here to open a quick reference for the macros. Interactive help can be used to see what the macro would expand to. This can be used both here and on other panes where a macro can be entered. AMPlay must be running for useful macro expansion to be done. For the track, album and artist information displayed on the main window, there is a further option for each as to whether it should scroll. Scrolling will only happen if the length of the string in the current desktop font is such that it would not fit in the icon in question. Scrolling speed is dependant on the slow refresh setting described below (scrolling pauses while any event that requires fast refresh completes). Timeformat: This controls the default format of the time display. Slow update and Fast update: These allow you to set the refresh rates for the main window, in centi-seconds. Fast update is used while fast forwarding and rewinding. Slow update is used in normal playback, and while paused. (The window doesn't update at all while stopped) If you're not interested in keeping the display up to date while fast forwarding (rewinding is generally instant) then you might increase the Fast update value. If you regularly play short files (below 1 minute), then you might want to decrease the Slow update value to update the progress bar more frequently. Slow update also defines the speed at which scrolling occurs in the track, album and artist information icons. * 4.2.2 Database Editor: ~~~~~~~~~~~~~~~~~~~~~~~~ This allows you to define format strings for tracks, albums and artists as displayed in the database editor. This format string is used for the item selectors in the parent pane, not for things on particular panes within the editor. Again, the quick reference for the macros may be useful here. * 4.2.3 Text Processing: ~~~~~~~~~~~~~~~~~~~~~~~~ Show '_' as ' ': This causes underscores to be shown as spaces in AMPlay windows and menus. Show '\' and '/' as '.' This causes all forward or back slashes to be shown as dots. LanMan98 Conversions: This allows files accessed through the LanMan98 filesystem to show characters that are not allowed in RISC OS filenames. e.g. if a track name on the server side is; Artist1 & Artist2 - a duet live@somewhere.mp3 LanMan98 would show this as; Artist1 ;+ Artist2 - a duet live;=somewhere/mp3 With this option enabled, the trackname would be converted back to the original for display purposes. Systems other than LanMan98 may use the same mappings, so it's worth a try for other things as well. LanMan98 is all it has been tested with though. Sunfish conversions: This is a similar mechanism to the LanMan98 mechanism above, but using the system that Sunfish appears to use for passing characters that are not legal in normal RISC OS filenames. Where an illegal character occurs in a filename on the server, Sunfish appears to present it to RISC OS as ?xx, where xx is two digits of hex indicating the ASCII value of the character in question. So; Artist1 & Artist2 - a duet live@somewhere.mp3 Would be seen via sunfish as; Artist1 ?26 Artist2 - a duet live?40somewhere.mp3 The Sunfish conversions options reverses this process and allows AMPlay to display the original name. As with the LanMan98 conversion, it may be applicable to other clients. Space before Caps: This is useful in two circumstances; - Files have been stored without spaces in them, and you are using pathname based naming. (e.g. 01ATrackName/mp3) - Due to the length limitations in the tag, the tag information has been entered with spaces omitted. In either case, the assumption is that the capital letters in the string can be used to work out where the spaces should be put back. The upshot of this is a routine that will convert, for instance; "01ATrackName(LIVE)" to "01 A Track Name (LIVE)" i.e. keeping sequences of capitals together, but adding a space where there appear to be word boundaries. ________________________________________________________________________ * 4.3 Custom: ~~~~~~~~~~~~~~ * 4.3.1 Custom Buttons: ~~~~~~~~~~~~~~~~~~~~~~~ For each of the three main window custom buttons, you can pick their button type, and what to do in the event of select or adjust clicks. Type - This selects the type of button. The available types are; equ, vis, remote, dir, cmd, file, other. You can also select a type 'off', which disables the button. The button type generally just selects what icon AMPlay uses for the button on the main window - equ is a representation of a graphic equaliser, vis is an eye to indicate a visualisation app, remote is meant to be a remote control etc. Select and Adjust are writeable, and you can enter the full path to the file/application/directory you want to run/open. You can also drag and drop things here from the filer. Note that you can enter variables like , but these will obviously only work if the variable is expandable at the time you click the custom button. * 4.3.2 Iconbar Icon actions: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This has two icons, Event and Action. Event - Select and Adjust clicks, with all possible combinations of Shift and Ctrl keys. Action - The action to be taken when the selected event occurs. Possible actions currently; Do nothing Open Player Open Options Open Editor (database editor, edittable attributes pane) Open Current (databased editor, currently playing information) Open Selected (databased editor, selected item information) Open Naming (databased editor, naming pane) Open Statistics (databased editor, statistics pane) Open Search window Open Filter window Open Export window Pause Play Stop Next Force Next Restart Track Restart and unpause Track Volume Up Volume Down Rewind Forward More actions may be added in future versions. Pause, Play etc correspond to select clicks on the corresponding main window icon. Force Next corresponds to an Adjust click on Next. Play on Play action, and volume increments apply. ________________________________________________________________________ * 4.4 Skin: ~~~~~~~~~~~ The player skin selector will let you choose between skins in the currently configured skins directory. You can also edit the skins directory (or drag a directory onto that icon to set it). Changing either option requires a restart of AMPlay to take effect. If the selected skin provides them, a preview bitmap and description are displayed. (This is a new feature in 2.03 - skins for 2.02 and earlier will not provide a description or preview unless updated to do so). Note that AMPlayCfg (and AMPlay) will reject directories that do not appear to contain a valid skin. The skins section is greyed out entirely if AMPlayCfg is run when AMPlay has not been seen by the filer. This is because the default skins directory is .Skins, and AMPlayCfg may need to refer to this even if the configured skins directory is elsewhere. See section 8.5 for details on what is required of a skin and how to make your own or customise the provided ones. ________________________________________________________________________ * 4.5 Menus: ~~~~~~~~~~~~ * 4.5.1 Menu Formats: ~~~~~~~~~~~~~~~~~~~~~ This screen allows you to define format strings for all the menus in AMPlay that contain artist, album or track names. As before refer to section 2.12 for details on macros, or use the quick reference button. Interactive help works as on the Display window, and will expand the macro on the fly. Again, AMPlay needs to be running for this to work. * 4.5.2 Other menu options: ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Menu block size: This is a workaround for the problem that although menus are a very convenient mechanism for choosing an item from a list of items, they can become unwieldy if the list of items is very long. It's one thing to offer a menu of 10 tracks, but 10,000 tracks is an entirely different kettle of fish. Even if displaying 10,000 items on a single menu were possible, it wouldn't be very usable. This option allows you to specify how many entries should be displayed at once. If the menu contains more than x entries, only the first x will be shown, with an extra entry at the end to move to the next block of entries. As you move forward in the menu, an extra item at the top appears to allow you to move back. This has some advantages - expanding a macro is not particularly time consuming, but it gets slow if there are a large number to expand. The All Tracks goto menu for instance may involve many thousands of tracks. By constraining it to just x entries, much less macro expansion has to be done, and the menu can be produced much more quickly. For menus where there is a currently selected item, the menu will open with the currently selected item in the middle of the initial block. AMPlay will try to avoid blocks with just one item in them. For example, the menu of tracks by the current artist might contain 32 items. If the block size is 30, and we're currently playing track 16, the menu could display tracks 2-31, with links to the previous and next blocks. However, each of those blocks would contain only one track, so rather than take up menu space with the links to the previous and next blocks, it includes the items in question. i.e. it makes the menu block longer, if needed, to accommodate single extra items at the start and/or end. Block menus apply to all menus that are automatically generated based on information in the database, where the number of items in the menu is not fixed. This includes all the goto menus, the history menus, the search results menu, and the album and artist menus in the database editor. Reverse history menu: This causes the History menus to be generated the other way up. With this enabled, the most recently played items will be at the top of the menu. "Clear History" remains the topmost item in either case. Filtered items appear greyed on goto menus: This causes the Goto menus to show any items that do not pass the current effective filter as greyed-out entries. If disabled, such items are not shown at all. Dividers between artists out of sort order: Tricky one to describe, this. It is only likely to be useful if you are using the raw sort option described later. Suppose you had files in the database such as: ADFS::Disc.$.MP3.Comedy.MontyPython.LifeOfBrian.BrightSide/mp3 ADFS::Disc.$.MP3.Music.DevinTownsend.Terria.DeepPeace/mp3 When sorted using the raw sort option, they would end up as above, due to Comedy coming before Music. When an artist menu is generated, it would contain; MontyPython DevinTownsend Here, because of a difference in the path to the artist in the raw database entry, we have one artist appearing after another but alphabetically (by artist name alone) it should be before it. This option inserts a menu divider into the menu whenever it spots a case like this. If you are using the sort by name option instead of raw sort, then the sort is done using the artist, album and track names only, and anything earlier in the path is ignored. In this case the artist menu will always be in alphabetical order. ________________________________________________________________________ * 4.6 Database: ~~~~~~~~~~~~~~~ * 4.6.1 Naming: ~~~~~~~~~~~~~~~ Album-Track separator and Artist-Album separator: This configures how AMPlay works out the Track, Album and Artist names from the full filename for tracks that use pathname based naming. By default both of these are dots, which would imply that the tracks are in a subdirectory named after the album, and the albums are in subdirectories named after the artist. If you have a system where all the files are in one single directory, but named something like Artist_-_Album_-_Track/mp3, then you should change these to be _-_, or whatever naming system you use. Name new tracks from: This determines whether newly added tracks get their naming details from the pathname, or whether the tag on the file should be read. Default comment: For tracks that use pathname based naming, the comment field is empty (there is no way to pick the comment field out of the pathname). This specifies the default comment that should be used for such tracks. Note that it may contain macros. * 4.6.2 Adding Tracks: ~~~~~~~~~~~~~~~~~~~~~~ Included Filetypes and Included Extensions: This specifies what types to add to the database when scanning a directory or adding a file. The file must match something in both boxes in order to be included. The boxes should contain a comma separated list, with no spaces. Filetypes should be specified in hex. Start the file extension list with a comma to include files with no extension. If your MP3 collection is such that there are no consistent settings for this then you can disable either of these options. However, if you do disable them, be aware that non-MP3 files could end up in the database, especially when scanning directories. AMPlay does not examine the contents of files to determine whether they really are MP3s. These checks are carried out when dragging MP3 files or directories onto AMPlay, and do not apply to loading playlists. Handling double clicked files will only ever respond to filetype &1ad, but is subject to the extension check. Scan subdirectories to a depth of: Fairly self explanatory - if on, when you drag a directory onto AMPlay, it will walk the whole directory structure looking for matching files. Otherwise only the files in that directory itself will be looked at. The subdirectory depth option allows you to configure how deep down the directory structure to go. A value of 0 is a special case, and tells it to scan all the way down. 1 is just the directory that was dragged (i.e. same as with scan subdirectories turned off), 2 is that plus subdirectories etc. * 4.6.3 Database options: ~~~~~~~~~~~~~~~~~~~~~~~~~ Default Directory: This allows you to tell AMPlay where all or most of your MP3s are. This has no effect on where you can or can't store your MP3s, but does allow AMPlay to store the path to each file more efficiently. You can drag a directory onto this icon to set it. Note that changing this option may cause quite a lot of recalculation work within AMPlay as it reconstructs the paths for tracks using the old default directory, and works out which tracks are in the new one. Uniqueness: This tells AMPlay how far back in the track history to look when checking whether something has already been played recently. i.e. it defines what 'recently' means in that context. It is a percentage of the tracks available to AMPlay at the time. e.g. if there are 1000 tracks in the database, 100 of which pass the current filter settings, then if uniqueness is 75%, it will look back through the most recent 75 history entries. Although it is a percentage, values above 90% are not allowed. This is because very high uniqueness values, together with large numbers of available tracks and a large history can lead AMPlay into what I call the needle in the haystack problem - This is where most of the things it can pick have to get discarded as having been played too recently. Dynamic Area limit: This defines how much address space AMPlay reserves for the database on startup. It does not claim this much memory, but tells RISC OS that its dynamic area will not grow beyond this limit. The default is 32MB which should be plenty for most purposes. (A database of 100,000 tracks produces a 14MB database, and peaks at 25MB used while adding the tracks). If you have very large numbers of tracks, each with a long pathname and using tags (or editted pathnames), then you might need to raise this. AMPlay needs to be restarted for this change to take effect. Sync maximum history with total tracks / Maximum history: The database tables for tracks, albums, artists etc have clearly defined limits. They are as big as they need to be to hold the information about the number of tracks you have. History is different in that it can just grow indefinitely. Even if you only have a very small number of tracks, there is no logical limit to how many history entries you could generate. So, there needs to be some sort of cap on the history to stop it eating the entire database eventually. The default setting is to keep a number of history entries roughly equal to the total number of tracks in the database. As more tracks are added, the allowed length of the history grows accordingly. When the maximum history is reached, new items added to it will cause the oldest items to be removed. Alternatively, you can set your own fixed upper limit. ________________________________________________________________________ * 4.7 Actions: ~~~~~~~~~~~~~~ * 4.7.1 Events: ~~~~~~~~~~~~~~~ Treat unmarked text files as: This determines what happens to text files that have no marker. (see the section on file formats for more details on this). Always play on startup: This determines whether AMPlay should effectively click play once startup is complete. Note that if AMPlay was playing when it was shut down, it always starts playing on startup. This option determines whether it should start playing on startup even if it was stopped on shutdown. Force current track on startup: When AMPlay starts, if it should start playing a track (either because it was playing one on shutdown, or because the above option is set), but AMPlayer is already playing a track, this option determines whether to override what AMPlayer is already doing. Play newly added tracks: This determines whether newly added tracks should start playing straight away. Queue newly added tracks: If set, newly added tracks are queued, but not played straight away. Sort after tracks are added: This sets whether a sort automatically takes place following track addition. Stop playing when the player quits. If unset, AMPlay will let AMPlayer continue playing the MP3 when AMPlay quits. Kill the AMPlayer module when the player quits. This unloads AMPlayer when AMPlay closes. This is only available if stop playing when the player quits is set. 4.7.2 Sorting/Boundary checking: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ These options also apply to both the sort process and the boundary check process that determines where one album ends and the next starts. - Sort by Name or Sort Raw This determines whether the sort is by the name information that AMPlay is using for each item (which may be based on the pathname, for some of the tracks at least), or by the raw path to file itself. If all the files in the database come from the same filesystem heirarchy, then these options may be equivalent in terms of the resulting sorted order. There is one possible useful side effect from Raw sort though - if you have a filesystem heirarchy with genre directories above the Artist directories, then a raw sort will give you a list with the Artists grouped by Genre but alphabetical within that. There is an option in the menus page that allows a divider to be inserted into the menus at such genre boundaries. - Case sensitive, or not. A case sensitive sort is faster, but means that all the artists starting with upper case letters will end up sorted above those starting with lower case ones. If your naming system is consistent with regard to case, you can probably use case sensitive searching to achieve the same resulting order, faster. - Space sensitive, or not. Space sensitive is also faster. If turned off, then before comparing two items, all spaces are stripped from them. This means that any trailing spaces or hard spaces within the string won't cause any sorting oddities or spurious album boundaries, but does have the slight risk of two genuinely different albums/artists being considered the same. (e.g. 'An Artist' would be considered identical to 'A Nartist') - Ignore leading 'The ' or not. This causes any leading 'the ' to be stripped from the artist name for the purposes of sorting, and for boundary checking. i.e. "The Offspring" will be treated as being identical to "Offspring", and both will be sorted under "O". Currently, ignore 'the ' only applies to the artist name. It also only applies when sorting by name. When performing a raw sort, it isn't straightforward to remove a leading 'the ' from the artist name (indeed, it may not be present, if the naming information is based on the tag, or has been editted). In the case of "The Offspring" and "Offspring", albums by both of these will appear under a single artist entry. However, whether that artist entry is shown with the leading "the" in the menus and on the main window will vary. What is shown is the artist attribute of the first track in the artist. So, which one you see will depend on which album is alphabetically first within the artist, and what artist name its tracks have. ________________________________________________________________________ * 4.8 State: ~~~~~~~~~~~~ Remember Window positions, Position in track, Pause: These options control what information, over and above the defaults, is stored in the state files. Window Positions: This stores the window position of the main window, the mini window, the search window, the Filter Editor window, and the Database Editor window. Note that it doesn't store the stack order (i.e. what was on top of what) Position in track: This remembers how far through the currently playing track it is, and on restart will go to that position in the track and continue from there. Pause status: Remember whether the player was paused when quit. Stop track before saving state: This doesn't affect whether the track is stopped when the player is quit, just the order in which operations are done. If selected, track playback is stopped before the state save gets to a point that might take a second or two. With it off, track playback continues until the save state has completed. Keep a backup of state files: The state is stored in choices:audio.mp3.amplay2.db_xyz, where xyz is the state format version. If this option is enabled, a backup directory is created below that. When AMPlay comes to save its state, it knows what files it is about to overwrite, and copies then into the backup directory before doing so. If the state files are corrupted (e.g. by running out of disk space during a save), this allows recovery to the last successfully saved state. Restart if running at shutdown. If set, then if AMPlay is running when you shutdown RISC OS, it writes an obey file into the choices system such that it is restarted when RISC OS starts up. It then deletes the file. It does not write the file if it is exitted manually before shutting down RISC OS. Don't use this if you are running AMPlay on startup anyway. Use RAMDisc for temp files during load/save: This option can be used to considerably improve startup and shutdown times when using a saved state. What it does is to copy the state files into a RAMDisc before parsing them. If a RAMDisc already exists, it will use that, and make no changes to it (or leave files behind in it). If there is no RAMDisc, it will create one, use it, and delete it when finished. The RAMDisc is only used during startup and shutdown of the player. The only circumstances in which this might cause problems are; - RAMDisc already exists, but either too small or too full to contain the state files. - Insufficient memory to contain the state files (in which case you'd probably have trouble even with the option turned off). The state files are copied as needed into the ram disk, and deleted once read, so the ram disk only needs to have enough space to contain the largest single file. When creating a ram disk, AMPlay looks at the maximum possible file size (the statelist) based on the maxfiles setting, and rounds that up to the nearest Mb. This option is of most benefit on machines with disk subsystems that are quite slow compared to the processor speed (e.g. built in IDE in a StrongARM RiscPC). On systems with fast disks (e.g. Iyonix and probably VirtualRPC), the benefit is much less, but still detectable with large databases (below around 5000 tracks, it doesn't make much difference). ________________________________________________________________________ * 4.9 Other: ~~~~~~~~~~~~ * 4.9.1 Errors: ~~~~~~~~~~~~~~~ Report Errors from AMPlayer: If, during playback, the AMPlayer module detects any errors in the mp3 file it is playing, this error will be reported in the artist field on the main window. (Note that current versions of the AMPlayer module can occasionally report spurious errors when jumping to a point in a file). Report ID v2 Tag messages: AMPlayer reports an error if it encounters an ID v2 tag in a file, and there is no ID v2 tag handler present. AMPlay does not handle these tags at present. This option allows such errors to be ignored. Report file not found errors: This pops up a warning when it tries to play a file from the database, and can't find it. You might want to turn this off if your MP3 are not all available at once (e.g. they're on CDs) Try to continue playing after errors: This tells it whether to try playing another track after a file not found error. This is to try to avoid the situation where, say, a network drive is unavailable, and it would otherwise go through several thousand files, giving a file not found error on each one... * 4.9.2 Advanced: ~~~~~~~~~~~~~~~~~ Set AMPlayer buffer to: This will set the AMPlayer$buffer variable to the specified value on startup. AMPlayer can be configured with different buffer sizes for different filing systems, so if you have already configured this elsewhere, you can tell AMPlay to leave the settings alone. AMPlay defaults to leaving the buffer alone if there is already one set, but setting it if there isn't one. You can do much more useful things with the AMPlayer$Buffer variables - refer to the AMPlayer module documentation for more information on this. Use X modifier to create ext. name block: This determines how AMPlay creates an extended name block when editting a pathname based name for the first time. If set, it uses the X modifier to attempt to strip the leading track number and other characters from the start of the track name. This arises because the pathname based name just has track, album and artist name information, whereas the name block has track name and track number as separate fields. See also the FAQ on track numbering (section 6.21). Prefer single filters active concurrently: If set, this causes the filters system to behave more like AMPlay 1.5x did in that select clicks to activate one filter will inactivate the others. (Adjust clicks will still allow multiple filters to be active concurrently). X Modifier special characters: See section 2.12.5 on Advanced Modifiers for more information about the X modifier. This allows you to define extra characters that will cause the X modifier to stop when it is trimming characters from the front of a string. All alphanumerics are included by default, you only need to add any punctuation etc characters here. The default is '([{./\', which allows any of the left brackets, and the full stop. The '/' is included to allow for cases where the track name is derived from the path to the file, and therefore has '/' or '\' characters that get changed to '.'s later on (if the relevant option is set). For example, if the full stop was not included, the X modifier might trim; 02 - ...and justice for all to; and justice for all Whereas with it included you would get; ...and justice for all Display error messages for: Display information messages for: These set how long the particular message types should be displayed for on the main window. It is set in is multiples of slow update (see section 4.2.1) ________________________________________________________________________ Copyright © 2008 Mike Sandells, mike@mikejs.com Last Modified: 30.05.2008