Source: Callbacks.js | Spider Monkey Panel

    /** @module callbacks **/

    /*
     * !!! Do NOT include this whole file !!!
     *
     * Only copy those callbacks that you actually need.
     */

    /**
     * Called when "Always On Top" state changes: from using the menu, Alt + A, {@link fb.AlwaysOnTop} and etc.
     *
     * @param {boolean} state
     */
    function on_always_on_top_changed(state) { }

    /**
     * Note: in order to use this callback, use {@link window.DlgCode}(DLGC_WANTCHARS).<br>
     * See Flags.js > DLGC_WANTCHARS.
     *
     * @param {number} code UTF16 encoded char
     */
    function on_char(code) { }

    /**
     * Called when colours are changed via default UI/columns UI preferences.<br>
     * Note: use {@link window.GetColourCUI}/{@link window.GetColourDUI} to get new colours.
     *
     */
    function on_colours_changed() { }

    /**
     * Called when "cursor follow playback" state is changed.
     *
     * @param {boolean} state current "cursor follow playback" value
     */
    function on_cursor_follow_playback_changed(state) { }

    /**
     * See {@link fb.DoDragDrop} documentation and samples/basic/DragnDrop.txt
     *
     * @param {DropTargetAction} action
     * @param {number} x
     * @param {number} y
     * @param {number} mask see Flags.js > Mask
     */
    function on_drag_drop(action, x, y, mask) { }

    /**
     * See {@link fb.DoDragDrop} documentation and samples/basic/DragnDrop.txt
     *
     * @param {DropTargetAction} action
     * @param {number} x
     * @param {number} y
     * @param {number} mask see Flags.js > Mask
     */
    function on_drag_enter(action, x, y, mask) { }

    /**
     * See {@link fb.DoDragDrop} documentation and samples/basic/DragnDrop.txt
     *
     * @function
     */
    function on_drag_leave() { }

    /**
     * See {@link fb.DoDragDrop} documentation and samples/basic/DragnDrop.txt
     *
     * @param {DropTargetAction} action
     * @param {number} x
     * @param {number} y
     * @param {number} mask see Flags.js > Mask
     */
    function on_drag_over(action, x, y, mask) { }

    /**
     * Called when DSP preset changes.<br>
     * Note: this callback is only available in foobar2000 v1.4 and later.<br>
     * Note2: does not get called when presets are added or removed.
     *
     */
    function on_dsp_preset_changed() { }

    /**
     *  Called when the panel gets or loses focus.
     *
     * @param {boolean} is_focused New focus state
     */
    function on_focus(is_focused) { }

    /**
     * Called when fonts are changed via DUI or CUI preferences.
     * Note: you can retrieve fonts using {@link window.GetFontDUI}/{@link window.GetFontCUI}.
     *
     */
    function on_font_changed() { }

    /**
     * Called when thread created by {@link utils.GetAlbumArtAsync} is done.
     *
     * @param {FbMetadbHandle} handle
     * @param {number} art_id See Flags.js > AlbumArtId
     * @param {?GdiBitmap} image null on failure
     * @param {string} image_path path to image file (or music file if image is embedded)
     */
    function on_get_album_art_done(handle, art_id, image, image_path) { }

    /**
     * Called when focused item in playlist has been changed.
     *
     * @param {number} playlistIndex
     * @param {number} from index of the previous focused item or -1 if there was no focused item.
     * @param {number} to index of the new focued item
     */
    function on_item_focus_change(playlistIndex, from, to) { }

    /**
     * Called when at least one minute of the track has been played or the track has reached
     * its end after at least 1/3 of it has been played through.
     *
     * @param {FbMetadbHandle} handle
     */
    function on_item_played(handle) { }

    /**
     * Requires "Grab focus" enabled in the Configuration window.<br>
     * In order to use arrow keys, use {@link window.DlgCode}(DLGC_WANTARROWS) (see Flags.js > DLGC_WANTARROWS).<br>
     * <br>
     * Note: keyboard shortcuts defined in the main preferences are always executed first
     * and are not passed to the callback.
     *
     * @param {number} vkey Virtual Key Code, refer to {@link http://msdn.microsoft.com/en-us/library/ms927178.aspx}
     */
    function on_key_down(vkey) { }

    /**
     * Requires "Grab focus" enabled in the Configuration window.<br>
     * In order to use arrow keys, use {@link window.DlgCode}(DLGC_WANTARROWS) (see Flags.js > DLGC_WANTARROWS).
     *
     * @param {number} vkey Virtual Key Code, refer to {@link http://msdn.microsoft.com/en-us/library/ms927178.aspx}
     */
    function on_key_up(vkey) { }

    /**
     * @param {FbMetadbHandleList} handle_list
     */
    function on_library_items_added(handle_list) { }

    /**
     * @param {FbMetadbHandleList} handle_list
     */
    function on_library_items_changed(handle_list) { }

    /**
     * @param {FbMetadbHandleList} handle_list
     */
    function on_library_items_removed(handle_list) { }

    /**
     * Called when thread created by {@link gdi.LoadImageAsync} is done.
     *
     * @param {number} cookie the return value from the {@link gdi.LoadImageAsync} call
     * @param {?GdiBitmap} image null on failure (invalid path/not an image)
     * @param {string} image_path the path that was originally supplied to {@link gdi.LoadImageAsync}
     */
    function on_load_image_done(cookie, image, image_path) { }

    /**
     * On the main menu>File>Spider Monkey Panel, there are 10 menu items and whichever number
     * is selected is sent as the "index" to this callback. <br>
     * Being main menu items now means you can bind them to global keyboard shortcuts, standard toolbar buttons, panel stack splitter
     * buttons, etc.<br>
     * Remember to think carefully about where you use this code as you probably only
     * want it to run once and so don't include it in common files and scripts where you might have
     * multiple instances.<br>
     * Important: you should avoid sharing scripts containing this code so as not to conflict with what other users may already be using.
     *
     * @param {number} index
     *
     * @example
     * function on_main_menu(index) {
     *     switch (index) {
     *     case 1: // triggered when File>Spider Monkey Panel>1 is run
     *         do_something();
     *         break;
     *     case 2: // triggered when File>Spider Monkey Panel>2 is run
     *         do_something_else();
     *         break;
     *     }
     * }
     */
    function on_main_menu(index) { }

    /**
     * Called when metadb contents change.
     *
     * @param {FbMetadbHandleList} handle_list affected items
     * @param {boolean} fromhook true if notification is not from tag update, but a component that provides
     *                           tag-like data from a database. E.g. foo_playcount and {@link FbMetadbHandle#RefreshStats}
     */
    function on_metadb_changed(handle_list, fromhook) { }

    /**
     * @param {number} x
     * @param {number} y
     * @param {number} mask see Flags.js > Mask
     */
    function on_mouse_lbtn_dblclk(x, y, mask) { }

    /**
     * @param {number} x
     * @param {number} y
     * @param {number} mask see Flags.js > Mask
     */
    function on_mouse_lbtn_down(x, y, mask) { }

    /**
     * @param {number} x
     * @param {number} y
     * @param {number} mask see Flags.js > Mask
     */
    function on_mouse_lbtn_up(x, y, mask) { }

    /**
     * @function
     */
    function on_mouse_leave() { }

    /**
     * @param {number} x
     * @param {number} y
     * @param {number} mask see Flags.js > Mask
     */
    function on_mouse_mbtn_dblclk(x, y, mask) { }

    /**
     * @param {number} x
     * @param {number} y
     * @param {number} mask see Flags.js > Mask
     */
    function on_mouse_mbtn_down(x, y, mask) { }

    /**
     * @param {number} x
     * @param {number} y
     * @param {number} mask see Flags.js > Mask
     */
    function on_mouse_mbtn_up(x, y, mask) { }

    /**
     * @param {number} x
     * @param {number} y
     * @param {number} mask see Flags.js > Mask
     */
    function on_mouse_move(x, y, mask) { }

    /**
     * @param {number} x
     * @param {number} y
     * @param {number} mask see Flags.js > Mask
     */
    function on_mouse_rbtn_dblclk(x, y, mask) { }

    /**
     * @param {number} x
     * @param {number} y
     * @param {number} mask see Flags.js > Mask
     */
    function on_mouse_rbtn_down(x, y, mask) { }

    /**
     * You must return true, if you want to suppress the default context menu.<br>
     * Note: left shift + left windows key will bypass this callback and will open default context menu.
     *
     * @param {number} x
     * @param {number} y
     * @param {number} mask see Flags.js > Mask
     *
     * @retuen {boolean}}
     */
    function on_mouse_rbtn_up(x, y, mask) { }

    /**
     * Scroll up/down
     *
     * @param {number} step scroll direction: -1 or 1
     */
    function on_mouse_wheel(step) { }
    //

    /**
     * Scroll left/right
     *
     * @param {number} step scroll direction: -1 or 1
     */
    function on_mouse_wheel_h(step) { }

    /**
     * Called in other panels after {@link window.NotifyOthers} is executed.<br>
     * <br>
     * <b>!!! Beware !!!</b><br>
     * 1. Data from `info` argument is only accessible inside `on_notify_data` callback:
     *    if stored and accessed outside of the callback it will throw JS error.<br>
     *    This also applies to the data produced from that `info`: e.g. storing `info.Path` directly (if `info` is FbMetadbHandle).<br>
     * 2. If you want to store the data from `info` you have to perform a deep copy:<br>
     *    - `String(info)` for strings.<br>
     *    - `JSON.parse(JSON.stringify(info))` for serializable objects.<br>
     *    - `new ObjectType(info)` for objects that have an approppriate constructor available, e.g. `new GdiBitmap(info)` or `new FbMetadbHandleList(info)`.<br>
     * 3. `info` argument is shared between panels, so it should NOT be modified in any way.
     *
     * @param {string} name
     * @param {*} info
     */
    function on_notify_data(name, info) { }

    /**
     * Called when output device changes. Use {@link fb.GetOutputDevices} to retrieve settings.<br>
     * Note: available only in foobar2000 v1.4 and later.
     *
     * @function
     */
    function on_output_device_changed() { }

    /**
     * Called when window is ready to draw.
     *
     * @param {GdiGraphics} gr
     */
    function on_paint(gr) { }

    /**
     * Called when "playback follow cursor" state is changed.
     *
     * @param {boolean} state current "playback follow cursor" value
     */
    function on_playback_follow_cursor_changed(state) { }

    /**
     * Called when dynamic info (VBR bitrate etc) changes.
     *
     * @function
     */
    function on_playback_dynamic_info() { }

    /**
     * Called when Per-track dynamic info (stream track titles etc) changes.
     * Happens less often than {@link module:callbacks~on_playback_dynamic_info on_playback_dynamic_info}.
     *
     * @function
     */
    function on_playback_dynamic_info_track() { }

    /**
     * Called when currently playing file gets edited.<br>
     * It's also called by components that provide tag-like data such as foo_playcount.
     *
     * @param {FbMetadbHandle} handle
     */
    function on_playback_edited(handle) { }

    /**
     * Playback advanced to the new track.
     *
     * @param {FbMetadbHandle} handle
     */
    function on_playback_new_track(handle) { }

    /**
     * Called when playback order is changed.
     *
     * @param {any} new_order_index
     *     - 0 Default<br>
     *     - 1 Repeat (Playlist)<br>
     *     - 2 Repeat (Track)<br>
     *     - 3 Random<br>
     *     - 4 Shuffle (tracks)<br>
     *     - 5 Shuffle (albums)<br>
     *     - 6 Shuffle (folders)
     */
    function on_playback_order_changed(new_order_index) { }

    /**
     * @param {boolean} state true when paused, false when unpaused.
     */
    function on_playback_pause(state) { }

    /**
     * @param {number} origin
     *     - 0 User added<br>
     *     - 1 User removed<br>
     *     - 2 Playback advance
     */
    function on_playback_queue_changed(origin) { }

    /**
     * @param {float} time new position in seconds
     */
    function on_playback_seek(time) { }

    /**
     * Playback process is being initialized.<br>
     * {@link module:callbacks~on_playback_new_track on_playback_new_track} should be called soon after this when first file is successfully opened for decoding.
     *
     * @param {number} cmd
     *     - 0 Default<br>
     *     - 1 Play<br>
     *     - 2 Plays the next track from the current playlist according to the current playback order<br>
     *     - 3 Plays the previous track from the current playlist according to the current playback order<br>
     *     - 4 settrack (internal fb2k value)<br>
     *     - 5 Plays a random track from the current playlist<br>
     *     - 6 resume (internal fb2k value)
     * @param {boolean} is_paused Current paused state
     *
     */
    function on_playback_starting(cmd, is_paused) { }

    /**
     * @param {number} reason
     *     - 0 Invoked by user<br>
     *     - 1 End of file<br>
     *     - 2 Starting another track<br>
     *     - 3 Fb2k is shytting down<br>
     */
    function on_playback_stop(reason) { }

    /**
     * Called every second, for time display.
     *
     * @param {float} time current playback time in seconds
     */
    function on_playback_time(time) { }

    /**
     * @param {number} playlistIndex
     * @param {number} playlistItemIndex
     */
    function on_playlist_item_ensure_visible(playlistIndex, playlistItemIndex) { }

    /**
     * @param {number} playlistIndex
     */
    function on_playlist_items_added(playlistIndex) { }

    /**
     * @param {number} playlistIndex
     * @param {number} new_count
     */
    function on_playlist_items_removed(playlistIndex, new_count) { }

    /**
     * Changes selection too. Doesn't actually change the set of items that are selected or item having focus, just changes their order.
     *
     * @param {number} playlistIndex
     */
    function on_playlist_items_reordered(playlistIndex) { }

    /**
     * Workaround for some 3rd party playlist viewers not working with {@link module:callbacks~on_selection_changed on_selection_changed}.
     *
     * @function
     */
    function on_playlist_items_selection_change() { }

    /**
     * Called when "stop after current" is enabled/disabled.
     *
     * @param {boolean} state "stop after current" value
     */
    function on_playlist_stop_after_current_changed(state) { }

    /**
     * @function
     */
    function on_playlist_switch() { }

    /**
     * Called when:<br>
     * - Playlists are added/removed/reordered/renamed.<br>
     * - A playlist's lock status changes through the use of components such as foo_utils or foo_playlist_attributes.
     *
     * @function
     */
    function on_playlists_changed() { }

    /**
     * Note: available only in foobar2000 v1.4 and later.
     *
     * @param {number} new_mode
     *     - 0 None<br>
     *     - 1 Track<br>
     *     - 2 Album<br>
     *     - 3 Track/Album by Playback Order
     */
    function on_replaygain_mode_changed(new_mode) { }

    /**
     * Called when:<br>
     * - Panel script is reloaded via context menu > Reload.<br>
     * - Panel script is changed via panel menu > Configure.<br>
     * - fb2k is exiting normally.<br>
     * Not called when:<br>
     * - Script fails with error.<br>
     * - fb2k closed externally (e.g. killed with process manager).<br>
     * - fb2k fails with exception.
     *
     * @function
     */
    function on_script_unload() { }

    /**
     * Called when selection changes based on "File>Preferences>Display>Selection viewers".
     *
     * @function
     */
    function on_selection_changed() { }

    /**
     * Called when panel is resized.<br>
     * Note: width and height arguments have the same values as {@link window.Width} and {@link window.Height}.<br>
     * <b>IMPORTANT</b>: do NOT call {@link window.Repaint} from this callback!
     *
     * @param {number} width
     * @param {number} height
     */
    function on_size(width, height) { }

    /**
     * @param {float} val volume level in dB. Minimum is -100. Maximum is 0.
     */
    function on_volume_change(val) { }