    // Global objects:
    //   window - IFbWindow
    //   gdi - IGdiUtils
    //   fb - IFbUtils
    //   utils - IWSHUtils
    //   plman - IFbPlaylistManager

    interface IGdiFont {
    Properties:
        (readonly) int Height;
        // [1.5.0 Preview 2] New:
        (readonly) String Name(langid = 0);
        // [1.5.0 Preview 2] New:
        (readonly) float Size;
        // [1.5.0 Preview 2] New:
        (readonly) int Style;
    Methods:
        void Dispose();
    }

    interface IGdiBitmap {
    Properties:
        (readonly) int Width;
        (readonly) int Height;

    Methods:
        IGdiBitmap Clone(x, y, w, h);
        void RotateFlip(mode);
        IGdiBitmap ApplyAlpha(alpha);
        // Changes will be saved in the current bitmap
        boolean ApplyMask(IGdiBitmap);
        // Create a DDB bitmap from IGdiBitmap, which is used in GdiDrawBitmap()
        IGdiRawBitmap CreateRawBitmap();
        // NOTE: Don't forget to use ReleaseGraphics() after operations on IGdiGraphics interface is done.
        IGdiGraphics GetGraphics();
        void ReleaseGraphics(IGdiGraphics);
        void BoxBlur(radius, iteration = 1);
        // [1.5.0 Beta 5]: Changed: Add parameter "interpolationMode".
        // See Flags.txt meanings of modes.
        IGdiBitmap Resize(w, h, interpolationMode = 0);
        // [1.5.5]:
        VBArray GetColorScheme(max_count);
        void Dispose();
    }

    interface IGdiRawBitmap {
    Properties:
        (readonly) int Width;
        (readonly) int Height;
    Methods:
        void Dispose();
    }

    interface IGdiGraphics {
    Methods:
        void FillSolidRect(x, y, w, h, color);
        // [1.3.4] Updated:
        // focus: Specify where the center color will be at its highest intensity, from 0.0 to 1.0
        void FillGradRect(x, y, w, h, angle, color1, color2, focus = 1.0);
        void FillRoundRect(x, y, w, h, arc_width, arc_height, color);
        void FillEllipse(x, y, w, h, color);
        // [1.3,2] New:
        // fillmode: 0 - Alternate, 1 - Winding
        // points is either a VBArray or JScript array.
        void FillPolygon(color, fillmode, points);
        void DrawLine(x1, y1, x2, y2, line_width, color);
        void DrawRect(x, y, w, h, line_width, color);
        void DrawRoundRect(x, y, w, h, arc_width, arc_height, line_width, color);
        void DrawEllipse(x, y, w, h, line_width, color);
        // [1.3.2] New:
        // points is either a VBArray or JScript array.
        void DrawPolygon(color, line_width, points);
        void DrawString(str, IGdiFont, color, x, y, w, h, flags = 0);
        // [1.3.0] Updated:
        // Returns a VBArray (also see utils.Glob()):
        //  index | meaning
        //   [0] left   (DT_CALCRECT)
        //   [1] top    (DT_CALCRECT)
        //   [2] right  (DT_CALCRECT)
        //   [3] bottom (DT_CALCRECT)
        //   [4] characters drawn
        // Always faster than DrawString and returns chars drawed
        VBArray GdiDrawText(str, IGdiFont, color, x, y, w, h, format = 0);
        void DrawImage(IGdiBitmap, dstX, dstY, dstW, dstH, srcX, srcY, srcW, srcH, angle = 0, alpha = 255);
        // Always faster than DrawImage, do not support alpha channel
        void GdiDrawBitmap(IGdiRawBitmap, dstX, dstY, dstW, dstH, srcX, srcY, srcW, srcH);
        // Used with GDI+ functions, such as DrawString().
        IMeasureStringInfo MeasureString(str, IGdiFont, x, y, w, h, flags = 0);
        // Used with GDI functions, such as GdiDrawText().
        uint CalcTextWidth(str, IGdiFont);
        // [1.3.5] New:
        // Note that it will only calulate one line text height.
        uint CalcTextHeight(str, IGdiFont);
        // [1.3.5] New:
        // Returns a VBArray
        //  index | meaning
        //   [0] text line 1
        //   [1] width of text line 1 (in pixel)
        //   [2] text line 2
        //   [3] width of text line 2 (in pixel)
        //   .
        //   .
        //   .
        //   [2n + 2] text line n
        //   [2n + 3] width of text line n (in pixel)
        VBArray EstimateLineWrap(str, IGdiFont, max_width);
        // See Flags.txt meanings of modes.
        void SetTextRenderingHint(mode);
        // See Flags.txt meanings of modes.
        void SetSmoothingMode(mode);
        // See Flags.txt meanings of modes.
        void SetInterpolationMode(mode);
        void GdiAlphaBlend(IGdiRawBitmap, dstX, dstY, dstW, dstH, srcX, srcY, srcW, srcH, alpha = 255);
    }

    interface IMeasureStringInfo {
    Properties:
        (readonly) float x;
        (readonly) float y;
        (readonly) float Width;
        (readonly) float Height;
        (readonly) int lines;
        (readonly) int chars;
    }

    interface IGdiUtils {
    Methods:
        IGdiFont Font(name, ptSize, style = 0);
        IGdiBitmap Image(path);
        // Create an image. By default, this image is transparent
        IGdiBitmap CreateImage(w, h);
        // [1.3.0] Add: pngmode
        IStyleTextRender CreateStyleTextRender(pngmode = false);
        // [1.3.2] New:
        // Returns a unique ID of this task.
        uint LoadImageAsync(window_id, path);
    }

    interface IStyleTextRender {
    Methods:
        // ---- Outline Mode ----
        void OutLineText(text_color, outline_color, outline_width);
        void DoubleOutLineText(text_color, outline_color1, outline_color2, outline_width1, outline_width2);
        void GlowText(text_color, glow_color, glow_width);
        // ---- Shadow ----
        void EnableShadow(enable);
        // if you have a *global* IStyleTextRender instance once called EnableShadow(),
        //   it's recommended to call ResetShadow() then.
        void ResetShadow();
        // Mode: Default shadow, used in solid shadow color
        void Shadow(color, thickness, offset_x, offset_y);
        // Mode: Soft shadow
        void DiffusedShadow(color, thickness, offset_x, offset_y);
        // While using DiffusedShadow(), these two methods below are useful
        void SetShadowBackgroundColor(color, width, height);
        void SetShadowBackgroundImage(img);
        // ---- Render ----
        // Not recommended, if the flags contains something as "center", this won't
        //  work properly, because it's lack of width and height information.
        boolean RenderStringPoint(g, str, font, x, y[, flags]);
        boolean RenderStringRect(g, str, font, x, y, w, h[, flags]);
        // [1.3.0] New
        // Only in pngmode, the image should be a transparent image created by gdi.CreateImage().
        void SetPngImage(IGdiBitmap);
    }

    interface IFbFileInfo {
    Properties:
        (readonly) int MetaCount;
        (readonly) int InfoCount;

    Methods:
        int MetaValueCount(idx);
        // returns idx
        int MetaFind(name);
        // returns idx
        int InfoFind(name);
        String MetaName(idx);
        String MetaValue(idx, vidx);
        void MetaRemoveField(name);
        int MetaAdd(name, value);
        void MetaInsertValue(idx, vidx, value);
        String InfoName(idx);
        String InfoValue(idx);
        void MetaSet(name, value);
        void Dispose();
    }

    interface IFbMetadbHandle {
    Properties:
        (readonly) String Path;
        (readonly) String RawPath;
        (readonly) int SubSong;
        (readonly) int64 FileSize;
        (readonly) double Length;

    Methods:
        IFbFileInfo GetFileInfo();
        // [Obsolete] do not use, use UpdateFileInfoSimple instead.
        void UpdateFileInfo(IFbFileInfo);
        // It's recommended to use this method if you want to update tags
        // if value is a empty string, field will be removed
        // [Optional] multivalue_fields is a semicolon-separated list contains fields name which need to be treated as multivalue.
        // Usage: meta.UpdateFileInfoSimple("ARTIST", "Enigma", "GENRE", "Downtempo;Ambient", "GENRE");
        //     GENRE will be treated as a multivalue field. So GENRE[0] = "Downtempo", GENRE[1] = "Ambient
        void UpdateFileInfoSimple(field1, value1 [, filed2, value2 [,...] ] [, multivalue_fields]);
        // [1.3.2] New
        // Compare two IFbMetadbHandle instances, pointer only.
        //   If you want to compare them physically, use the "RawPath" property, and compare these two values.
        boolean Compare(IFbMetadbHandle);
        void Dispose();
    }

    // [1.4.0] New:
    // [1.4.0 Beta 2] Updated:
    interface IFbMetadbHandleList
    {
    Properties:
        (readonly) uint Count;
        // [1.5.0 Preview 6]: Changed, now writable.
        (read, write) IFbMetadbHandle Item(idx);

    Methods:
        IFbMetadbHandleList Clone();
        // [1.5.0 Preview 6]: New:
        uint Insert(index, handle);
        // [1.5.0 Preview 6]: New:
        uint InsertRange(index, handles);
        uint Add(handle);
        // [1.5.0 Preview 6]: New:
        void AddRange(handles);
        void RemoveById(UINT idx);
        void Remove(handle);
        // [1.5.0 Preview 6]: New:
        void RemoveRange(from, num);
        void RemoveAll();
        // Sort and remove duplicates
        void Sort();
        // If sorted, use BSearch instead
        uint Find(handle);
        // Only works when sorted, faster than Find()
        uint BSearch(handle);
        // Must be sorted
        void MakeIntersection(handles);
        // Must be sorted
        void MakeUnion(handles);
        // Must be sorted
        void MakeDifference(handles);
        void Dispose();
        // [1.5.0 Preview 4]: New:
        // titleformatObject: an instance of IFbTitleFormat.
        // direction: integer, ascending while >0.
        void OrderByFormat(titleformatObject, direction);
        // [1.5.0 Preview 4]: New:
        void OrderByPath();
        // [1.5.0 Preview 4]: New:
        void OrderByRelativePath();
    }

    interface IFbTitleFormat {
    Methods:
        // By default, returns a valid value if there is track playing.
        // force: while true, Eval() will always return a valid value even there is no playing track, useful for
        //   title formatting without track-related fields like "%title%", "%artist%", etc.
        String Eval(force = false);
        String EvalWithMetadb(IFbMetadbHandle);
        void Dispose();
    }

    interface IMenuObj {
    Properties:
        // [1.5.0 Beta 2]: NOTE: In order to create popup menus, please use AppendTo() method.
        (readonly) uint ID;

    Methods:
        // flags: see Flags.txt.
        void AppendMenuItem(flags, item_id, text);
        // Same as AppendMenuItem(MF_SEPARATOR,...,...)
        void AppendMenuSeparator();
        // [1.3.2] Changed:
        // Add bypos parameter.
        void EnableMenuItem(id_or_pos, enable, bypos = false);
        // [1.3.0] Changed:
        // check is now a boolean value.
        // [1.3.2] Changed:
        // Add bypos parameter.
        void CheckMenuItem(id_or_pos, check, bypos = false);
        // [1.3.2] Changed:
        // Add bypos parameter.
        void CheckMenuRadioItem(first, last, check, bypos = false);
        // [1.4.0 Beta 3] Updated:
        // flags: Control popup positions and animations. (See Flags.txt)
        int TrackPopupMenu(x, y, flags = 0);
        // [1.5.0 Beta 2] New:
        void AppendTo(parentMenu, flags, text);
        void Dispose();
    }

    interface IContextMenuManager {
    Methods:
        // [1.4.0] Changed: accept handle list.
        void InitContext(handle_or_handles);
        void InitNowPlaying();
        void BuildMenu(IMenuObj, base_id, max_id);
        boolean ExecuteByID(id);
        void Dispose();
    }

    interface IMainMenuManager {
    Methods:
        // NOTE: Only root menu name
        void Init(root_name);
        // NOTE: the last param is count, not max_id, this is different from what IContextMenuManager does.
        void BuildMenu(IMenuObj, base_id, count);
        boolean ExecuteByID(id);
        void Dispose();
    }

    interface IFbProfiler {
    Properties:
        // in ms
        int Time;

    Methods:
        void Reset();
        void Print();
    }

    // [1.5.0 Preview 7] New:
    interface IFbUiSelectionHolder{
    Methods:
        // REMEMBER: Call Dispose() after use in time.
        void Dispose();

        // Sets the selected items.
        // It should not to clear the selection
        void SetSelection(handles);
        // Sets selected items to playlist selection and enables tracking.
        // When the playlist selection changes, the stored selection is automatically updated.
        // Tracking ends when a set method is called on any ui_selection_holder or when
        // the last reference to this ui_selection_holder is released.
        void SetPlaylistSelectionTracking();
        // Sets selected items to the contents of the active playlist and enables tracking.
        // When the active playlist or its contents changes, the stored selection is automatically updated.
        // Tracking ends when a set method is called on any ui_selection_holder or when
        // the last reference to this ui_selection_holder is released.
        void SetPlaylistTracking();
    }

    interface IFbUtils {
    Properties:
        (readonly) String ComponentPath;
        (readonly) String FoobarPath;
        (readonly) String ProfilePath;
        (readonly) boolean IsPlaying;
        (readonly) double PlaybackLength;
        (readonly) boolean IsPaused;
        (read, write) double PlaybackTime;
        // Known playback orders:
        //      Default: 0,
        //      RepeatPlaylist: 1,
        //      RepeatTrack: 2,
        //      Random: 3,
        //      ShuffleTracks: 4,
        //      ShuffleAlbums: 5,
        //      ShuffleFolders: 6
        (read, write) uint PlaybackOrder;
        // [1.0.2] New:
        (read, write) boolean StopAfterCurrent;
        (read, write) boolean CursorFollowPlayback;
        (read, write) boolean PlaybackFollowCursor;
        (read, write) float Volume;
        // [1.3.2] New:
        (readonly) uint PlaylistCount;
        // [1.3.2] New:
        (read, write) uint ActivePlaylist;
        // [1.3.2] New:
        (read, write) uint PlayingPlaylist;
        // [1.4.0 Beta 4] New:
        (readonly) uint PlaylistItemCount(idx);

    Methods:
        void trace(...);
        // [1.0.4] New:
        // iconid: See Flags.txt for more information
        void ShowPopupMessage(msg, title = "WSH Panel Mod", iconid = 0);
        IFbProfiler CreateProfiler(name = "");
        IFbTitleFormat TitleFormat(expression);
        IFbMetadbHandle GetNowPlaying();
        // [1.3.0] Updated:
        // force: if this parameter is set to false, GetFocusItem() will only look for the focus item, otherwise,
        //   if the focus item not found, find the first item of the active playlist.
        IFbMetadbHandle GetFocusItem(force = true);
        // [1.3.2] New:
        // Get Now playing item or selection, as you prefer, in "Display->Selection viewers" of foobar2000 preferences
        // NOTE: Selection contains but not limited to the playlist.
        // NOTE: The return value may be null.
        IFbMetadbHandle GetSelection();
        // [1.4.0] New:
        // Works actually like GetSelection(), but returns a list of metadb handles.
        // Always returns a valid IFbMetadbHandleList instance instead of null.
        // flags: 1 - no now playing
        IFbMetadbHandleList GetSelections(flags = 0);
        // [1.3.2] New:
        // Retrieve what the selection is
        // Returns:
        //   0: undefined (no item)
        //   1: active_playlist_selection
        //   2: caller_active_playlist
        //   3: playlist_manager
        //   4: now_playing
        //   5: keyboard_shortcut_list
        //   6: media_library_viewer
        uint GetSelectionType();
        // [1.5.0 Preview 7] New:
        IFbUiSelectionHolder AcquireUiSelectionHolder();

        void Exit();
        void Play();
        void Stop();
        void Pause();
        void PlayOrPause();
        void Next();
        void Prev();
        void Random();
        void VolumeDown();
        void VolumeUp();
        void VolumeMute();
        void AddDirectory();
        void AddFiles();
        void ShowConsole();
        void ShowPreferences();
        void ClearPlaylist();
        void LoadPlaylist();
        void SavePlaylist();
        // NOTE: Now playing content only.
        boolean RunMainMenuCommand(command);
        // NOTE: Now playing content only.
        // [1.5.0 Preview 2] Changed: Add new "flags" parameter
        // flags:   0 - default (depends on whether SHIFT key is pressed, flag_view_reduced or flag_view_full is selected)
        //          4 - flag_view_reduced
        //          8 - flag_view_full
        boolean RunContextCommand(command, flags = 0);
        // [1.4.0] Changed: Accept IFbMetadbHandleList interface for metadb handle list.
        // [1.5.0 Preview 2] Changed: Add new "flags" parameter
        // flags:   0 - default (depends on whether SHIFT key is pressed, flag_view_reduced or flag_view_full is selected)
        //          4 - flag_view_reduced
        //          8 - flag_view_full
        boolean RunContextCommandWithMetadb(command, handle_or_handles, flags = 0);
        IContextMenuManager CreateContextMenuManager();
        boolean IsMetadbInMediaLibrary(metadb);
        // [1.3.2] New:
        String GetPlaylistName(idx);
        // [1.3.2] New:
        // if name is "", then Create a playlist autonamed with "New Playlist <number>".
        // return the index of the created playlist.
        uint CreatePlaylist(idx, name);
        // [1.3.2] New:
        boolean RemovePlaylist(idx);
        // [1.3.2] New:
        boolean MovePlaylist(from, to);
        // [1.3.2] New:
        boolean RenamePlaylist(idx, name);
        // [1.4.1 Beta 6] New:
        // Duplicate all contents from one playlist to a new playlist.
        // NOTE: This method only duplicate contents of the playlist, not its properties (eg. autoplaylist).
        // from: Which index of playlist to copy from.
        // name: New playlist name, when empty, using the same name as 'from'.
        // Returns the index of newly created playlist.
        uint DuplicatePlaylist(from, name = "");
        // [1.4.0] New:
        boolean IsAutoPlaylist(idx);
        // [1.4.0] New:
        // sort: sort string expression.
        // flags: 1 - always sort.
        boolean CreateAutoPlaylist(idx, name, query, sort = "", flags = 0);
        // [1.4.0] New:
        boolean ShowAutoPlaylistUI(idx);
    }

    // [Obsolete] Please use window.SetInterval() and/or window.SetTimeout()
    interface ITimerObj {
    Properties:
        (readonly) uint ID;

    Methods:
        void Dispose();
    }

    interface IFbTooltip {
    Properties:
        (read, write) Text; // Set tooltip text
        // [1.5.0 Preview 8]: New:
        // Set if enable tooltip tracking.
        (writeonly) boolean TrackActivate;
        // [1.5.0 Preview 8]: New:
        // Used with custom paint only
        (read, write) int Width;
        // [1.5.0 Preview 8]: New:
        // Used with custom paint only
        (read, write) int Width;

    Methods:
        // NOTE: Don't try to update tooltip text when tooltip is activated, because it will flick in Windows Vista/7.
        void Activate();
        void Deactivate();
        void SetMaxWidth(width);
        void Dispose();
        // [1.3.4] New:
        // in milliseconds
        // type: See flags.txt
        int GetDelayTime(type);
        // [1.3.4] New:
        // type: See flags.txt
        void SetDelayTime(type, time);
        // [1.5.0 Preview 8]: New:
        // NOTE: You should make sure x, y is changed before call, or you will recive a blinking tooltip.
        void TrackPosition(x, y);
    }

    // [1.3.1] New interface
    interface IThemeManager {
    Methods:
        // For parts and stats: http://msdn.microsoft.com/en-us/library/bb773210%28VS.85%29.aspx
        // You get vsstyle.h and vssym32.h (won't included in Flags because they are too large) here:
        //    http://dl.dropbox.com/u/2451120/vsstyles_h.7z
        void SetPartAndStateID(partid, stateid);
        // NOTE: stateid should be 0, it's unused now.
        boolean IsThemePartDefined(partid, stateid = 0);
        // [1.3.2] Updated:
        // clip_*: set clipping area.
        void DrawThemeBackground(IGdiGraphics, x, y, w, h, clip_x = 0, clip_y = 0, clip_w = 0, clip_h = 0);
    }

    // [1.4.1 Beta 1] New interface
    interface IDropTargetAction {
    Properties:
        // [1.4.1 Beta 4] Updated:
        // Set this value to true/false to enable/disable drag and drop.
        (read, write) bool Parsable;
        // Default: -1 (active playlist)
        (read, write) int Playlist;
        // Default: true
        (read, write) boolean ToSelect;

    Methods:
        // Parse dropped items as playlist
        void ToPlaylist();
    }

    interface IFbWindow {
    Properties:
        (readonly) int ID;
        (readonly) int Width;
        (readonly) int Height;
        // [1.3.0] New:
        // Returns: 0 - CUI, 1 - DUI
        (readonly) int InstanceType;
        (read, write) int MaxWidth;
        (read, write) int MaxHeight;
        (read, write) int MinWidth;
        (read, write) int MinHeight;
        // [1.3.2] New:
        // See Flags.txt for more details
        (read, write) int DlgCode;
        // [1.3.3] New:
        (readonly) boolean IsTransparent;
        // [1.3.7] New:
        (readonly) boolean IsVisible;

    Methods:
        void Repaint(force = false);
        void RepaintRect(x, y, w, h, force = false);
        IMenuObj CreatePopupMenu();
        // [Obsolete] Please use window.SetTimeout() instead.
        // Create an one shot timer, this timer will occur only once.
        ITimerObj CreateTimerTimeout(timeout);
        // [Obsolete] Please use window.SetInterval() instead.
        // Create an periodic timer, this timer will occur periodicly.
        ITimerObj CreateTimerInterval(delay);
        // [Obsolete]
        // Instead of KillTimer, you should use ITimerObj.Dispose()
        void KillTimer(ITimerObj);
        // [1.5.0 Beta 4] New:
        // returns the id or newly created timer
        uint SetInterval(func, delay);
        // [1.5.0 Beta 4] New:
        // returns the id or newly created timer
        uint SetTimeout(func, delay);
        // [1.5.0 Beta 4] New;
        void ClearTimeout(timerID);
        // [1.5.0 Beta 4] New:
        void ClearInterval(timerID);
        // Notify other wsh panels with specified info thru callback function on_notify_data(name, info).
        // [1.3.0] Update:
        //  info can be any type now, but be aware of passing arrays and objects (because they may be unrecognized between
        //     JScript and VBScript). However, VBArrays, strings, booleans, integers and floats, are safe to use.
        void NotifyOthers(name, info);
        // These two methods below are in cooperation with callback on_metadb_changed().
        // [1.4.0] Changed:
        // NOTE: Make sure you have read Preprocessors.txt if you are using "feature" directive.
        // [Obsolete] see on_metadb_changed() in Callbacks.txt
        void WatchMetadb(IFbMetadbHandle);
        // [1.4.0] Changed:
        // NOTE: Make sure you have read Preprocessors.txt if you are using "feature" directive.
        // [Obsolete] see on_metadb_changed() in Callbacks.txt
        void UnWatchMetadb();
        // Create a tooltip object
        IFbTooltip CreateTooltip();
        // Show configuration window of current panel
        void ShowConfigure();
        // Show properties window of current panel
        void ShowProperties();
        // Get value of name from properties
        // If no value is present, store the defaultval for the name and returns
        variant GetProperty(name[, defaultval]);
        // Set property value, if val is invalid, the remove it from properties
        // property values will be saved as per-instance config in CUI, and can be exported to FCLs.
        void SetProperty(name, val);
        // Retrieve pseudo transparent bakground image.
        IGdiBitmap GetBackgroundImage();
        // Set mouse cursor
        // For standard cursors, see Flags.txt for more details.
        void SetCursor(id);
        // [1.3.0] New:
        // Only valid in CUI
        // for type and client_guid, see Flags.txt
        uint GetColorCUI(type, client_guid = "");
        // [1.3.0] New:
        // Only valid in CUI
        // for type and client_guid, see Flags.txt
        // NOTE: If 'client_guid' is not an empty string, the 'type' will be ignored.
        //   Say that you can only specify 'type' or 'client_guid' at one time.
        IGdiFont GetFontCUI(type, client_guid = "");
        // [1.3.0] New:
        // Only valid in DUI
        // for type, see Flags.txt
        uint GetColorDUI(type);
        // [1.3.0] New:
        // Only valid in DUI
        // for type, see Flags.txt
        IGdiFont GetFontDUI(type);
        // [1.3.1] New:
        // class list: http://msdn.microsoft.com/en-us/library/bb773210%28VS.85%29.aspx
        // e.g: var theme = window.CreateThemeManager("Button");
        IThemeManager CreateThemeManager(classlist);
    }

    interface IWSHUtils {
    Methods:
        // While is_dll is true, check component file name, for example: utils.CheckComponent("foo_uie_wsh_panel_mod", true);
        //   otherwise, check the name of the component only.
        boolean CheckComponent(name, is_dll = false);
        // name: can be either in english or the localized name in your os.
        boolean CheckFont(name);
        // For art_id, see Flags.txt: AlbumArtId
        // need_stub: Determine whether querying for stub image to display when there's no album art to show
        // this is set in "Advanced" page of fb2k preferences
        // return null if failed
        // NOTE: filename in rawpath, use IFbMetadbHandle.RawPath to retrieve that value
        IGdiBitmap GetAlbumArt(rawpath, art_id = 0, need_stub = true);
        // [1.3.0] New;
        // Use this instead of GetAlbumArt() to retrieve album art data (support fb2k 1.0 search patterns).
        IGdiBitmap GetAlbumArtV2(metadb, art_id = 0, need_stub = true);
        // Only read embedded album art
        IGdiBitmap GetAlbumArtEmbedded(rawpath, art_id = 0);
        // [1.3.0] CHG: Support fb2k 1.0 album art search patterns.
        // [1.3.3] CHG: New no_load parameter, if true, the image will not load into memory. so parameter "image" will be
        //     set to null in on_get_album_art_done() callback.
        // HINT: window_id can be retrieved by window.ID
        // NOTE: This function returns immediately, album art will be sent to on_get_album_art_done() callback as soon as album art is found
        uint GetAlbumArtAsync(window_id, IFbMetadbHandle, art_id = 0, need_stub = true, only_embed = false, no_load = false);
        // An INI file should like this:
        // [section]
        // key=val
        // NOTE: ReadINI() return up to 255 characters, more characters will be truncated, so use INI files to read/write simple values
        String ReadINI(filename, section, key[, defaultval]);
        boolean WriteINI(filename, section, key, val);
        // For virtual key codes: http://msdn.microsoft.com/en-us/library/ms927178.aspx
        boolean IsKeyPressed(vkey);
        // Using Microsoft MS-DOS wildcards match type. ex ("*.txt", "abc?.tx?")
        boolean PathWildcardMatch(pattern, str);
        // [1.4.0] Updated:
        // Returns null if file cannot be read or doesn't exist.
        // If codepabe == 0, text file can be either: UTF-16 with BOM, UTF-8 with BOM and ANSI.
        // You can consider using helper routines for codepage in Codepages.txt.
        String ReadTextFile(filename, codepage = 0);
        // index: http://msdn.microsoft.com/en-us/library/ms724371%28VS.85%29.aspx
        // Returns 0 if failed.
        uint GetSysColor(index);
        // index: http://msdn.microsoft.com/en-us/library/ms724385%28VS.85%29.aspx
        // Returns 0 if failed.
        int GetSystemMetrics(index);
        // [1.3.0] New
        // for masks, see Flags.txt, you can ignore these two parameters in almost all circumstances.
        // VBArray is supported natived in VBScript and JScript: http://msdn.microsoft.com/en-us/library/3s0fw3t2%28VS.80%29.aspx
        // If you want to convert it to a JScript array, use .toArray() method.
        // Sample usage: var arr = utils.Glob("C:\\*.*").toArray();
        VBArray Glob(pattern, exc_mask = FILE_ATTRIBUTE_DIRECTORY, inc_mask = 0xffffffff);
        // [1.3.0] New
        // [1.3.2] Updated
        // [1.4.1 Beta 7] Updated: new mode "chardet"
        // Test a file (or path)
        // modes (NOTE: Case sensitive):
        //   "e": If path exists, return true
        //   "s": Retrieve file size, in bytes
        //   "d": If path is a directory, return true
        //   "split": return a VBArray, array[0] is the directory, arr[1] is the file basename, arr[2] is the file extension.
        //          e.g: var arr = FileTest("D:\\Somdir\\Somefile.txt", "split").toArray();
        //           arr[0] <= "D:\\Somedir\\" (always include backslash at the end)
        //           arr[1] <= "Somefile"
        //           arr[2] <= ".txt"
        //   "chardet": Guess the charset of a file, and return the codepage of it (it may not be accurate), returns 0 if error occured.
        VARIANT FileTest(path, mode);
    }

    // [1.5.0] New: new interface for playback queue
    interface IFbPlaybackQueueItem {
    Methods:
        // item: an instance of IFbPlaybackQueueItem.
        boolean Equals(item);
        void Dispose();

    Properties:
        (read, write) IFbMetadbHandle Handle;
        (read, write) uint PlaylistIndex;
        (read, write) uint PlaylistItemIndex;
    }

    // [1.5.0 Preview 3] New:
    interface IFbPlayingItemLocation {
    Properties:
        (readonly) boolean IsValid;
        (readonly) uint PlaylistIndex;
        (readonly) uint PlaylistItemIndex;
    }

    // [1.5.0] New: This interface is added in 1.5.0
    interface IFbPlaylistManager {
    Methods:
        // [1.5.0 Preview 5]: New:
        // Inserts new items into specified playlist, at specified position.
        uint InsertPlaylistItems(playlistIndex, base, handles, select = false);
        // [1.5.0 Preview 5]: New:
        uint InsertPlaylistItemsFilter(playlistIndex, base, handles, select = false);
        // [1.5.0 Preview 5]: New:
        void MovePlaylistSelection(playlistIndex, delta);
        // [1.5.0 Preview 5]: New:
        void RemovePlaylistSelection(playlistIndex, crop = false);
        // [1.5.0 Preview 4]: New:
        // Note that it's different from fb.GetSelection()
        IFbMetadbHandleList GetPlaylistSelectedItems(playlistIndex);
        // Get all items into an instance of IFbMetadbHandleList from specified playlist
        IFbMetadbHandleList GetPlaylistItems(playlistIndex);
        // state = true: select, deselect otherwise
        void SetPlaylistSelectionSingle(playlistIndex, itemIndex, state);
        // state = true: select, deselect otherwise
        // affectedItems: array of item indexes,
        // ex:
        //      affectedItems = [1, 3, 23];
        //      plman.SetPlaylistSelection(0, affectedItems, false); /* clear selection on item 1, 3 and 23.
        void SetPlaylistSelection(playlistIndex, affectedItems, state);
        // Clear selection of specified playlist
        void ClearPlaylistSelection(playlistIndex);
        // [1.5.0 Preview 4]: New:
        // Retrieves index of focus item on specified playlist; returns -1 when no item has focus.
        int GetPlaylistFocusItemIndex(playlistIndex);
        IFbMetadbHandle GetPlaylistFocusItemHandle(force);
        void SetPlaylistFocusItem(playlistIndex, itemIndex);
        void SetPlaylistFocusItemByHandle(playlistIndex, itemHandle);
        String GetPlaylistName(idx);
        // if name is "", then Create a playlist autonamed with "New Playlist <number>".
        // return the index of the created playlist.
        uint CreatePlaylist(idx, name);
        boolean RemovePlaylist(idx);
        boolean MovePlaylist(from, to);
        boolean RenamePlaylist(idx, name);
        // Duplicate all contents from one playlist to a new playlist.
        // NOTE: This method only duplicate contents of the playlist, not its properties (eg. autoplaylist).
        // from: Which index of playlist to copy from.
        // name: New playlist name, when empty, using the same name as 'from'.
        // Returns the index of newly created playlist.
        uint DuplicatePlaylist(from, name = "");
        // [1.5.0 Preview 3] New:
        void EnsurePlaylistItemVisible(playlistIndex, itemIndex);
        // [1.5.0 Preview 3] New:
        // Retrieves playlist position of currently playing item.
        // On failure (not playing or currently played item has been removed from the playlist it was on when starting),
        //   the property "IsValid" of IFbPlayingItemLocation interface will be set to false.
        IFbPlayingItemLocation GetPlayingItemLocation();
        // [1.5.0 Preview 3] New:
        // Executes default doubleclick/enter action for specified item on specified playlist (starts playing
        //   the item unless overridden by a lock to do something else).
        boolean ExecutePlaylistDefaultAction(playlistIndex, playlistItemIndex);
        // [1.5.0 Preview 4] New:
        boolean IsPlaylistItemSelected(playlistIndex, itemIndex);
        // [1.5.0 Preview 5] New:
        // WORKAROUND: In DUI, you cannot run playlist commands of edit menu because they are invalid.
        void SetActivePlaylistContext();

        // [1.5.0 Preview 2] New:
        IFbPlaybackQueueItem CreatePlaybackQueueItem();
        // Remove single item from playback queue
        void RemoveItemFromPlaybackQueue(index);
        // affectedItems: array of item indexes
        void RemoveItemsFromPlaybackQueue(affectedItems);
        void AddPlaylistItemToPlaybackQueue(playlistIndex, playlistItemIndex);
        void AddItemToPlaybackQueue(IFbMetadbHandle);
        uint GetPlaybackQueueCount();
        // returns an array of IFbPlaybackQueueItem instances.
        VBArray GetPlaybackQueueContents();
        // returns -1 on failure.
        int FindPlaybackQueueItemIndex(IFbMetadbHandle, playlistIndex, playlistItemIndex);
        void FlushPlaybackQueue();
        // This is actually the same as GetPlaybackQueueCount() > 0
        boolean IsPlaybackQueueActive();

        // [1.5.3] New:
        // Sorts specified playlist - entire playlist or selection only - by specified title formatting pattern, or randomizes the order.
        // playlistIndex: Index of playlist to alter.
        // pattern: Title formatting pattern to sort by. Set to "" to randomize the order of items.
        // selOnly: Set to false to sort/randomize whole playlist, or to true to sort/randomize only selection on the playlist.
        // returns true on success, false on failure (playlist locked etc).
        boolean SortByFormat(playlistIndex, pattern, selOnly = false);

        // [1.5.4] New:
        // direction: 1= Sort ascendingly, -1= Sort descendingly
        boolean SortByFormatV2(playlistIndex, pattern, direction = 1);

    Properties:
        // Known playback orders:
        //      Default: 0,
        //      RepeatPlaylist: 1,
        //      RepeatTrack: 2,
        //      Random: 3,
        //      ShuffleTracks: 4,
        //      ShuffleAlbums: 5,
        //      ShuffleFolders: 6
        (read, write) uint PlaybackOrder;
        (read, write) uint ActivePlaylist;
        (read, write) uint PlaylingPlaylist;
        (readonly) uint PlaylistCount;
        (readonly) uint PlaylistItemCount;
        // [1.5.0 Preview 9] New:
        (readonly) IFbPlaylistRecyclerManager PlaylistRecyclerManager;
    }

    // [1.5.0 Preveiw 9] New:
    interface PlaylistRecyclerManager {
    Properties:
        // Purge multiple content at once.
        // affectedItems is an array contains the indexes.
        void Purge(affectedItems);
        void Restore(index);
        void RestoreById(id);
        // returns the index
        uint FindById(id);

    Methods:
        (readonly) uint Count;
        (readonly) String Name(index);
        (readonly) IFbMetadbHandleList Content(index);
        (readonly) uint Id(index);
    }