PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   АвтоЗвук (http://pccar.ru/forumdisplay.php?f=16)
-   -   сборка/тема foobar 2000 для CarPС (http://pccar.ru/showthread.php?t=19671)

duzzy 28.06.2016 17:24

Цитата:

Сообщение от seriousstas (Сообщение 363619)
Область попадания прибавляется расстоянием до текста .
"их" я увеличил в пару раз - можно и 10 раз увеличить

Ну можно и больше сделать, надо в машине смотреть как оно будет с пальцем:smile2:
Сделай проще вынеси настройки зон и "точки" в Properties, будет проще настраивать.
например:
(переменные можешь обозвать как тебе нужно, ниже просто пример)

var click_expand_zone = window.GetProperties("Зона кнопки Развернуть", 30);
var btn_expand_size = window.GetProperties("Кнопка Развернуть размер ", 30);

и прописываешь эти переменные click_expand_zone, btn_expand_size в то место где ты цифры меняешь... бонус в том чтоб в редактор не лазить без конца при подгоне:wink2:

Забыл сказать, у тебя прокрутка страницы целиком включена, т.е. постраничная прокрутка. Ее можно отключить в настройках.

--------------------------------

обманул тебя))) шрифт не Segoe UI Symbol а Wingdings для этих папочек...открытой http://jpegshare.net/images/f0/06/f0...a40f64bb0c.png и закрытой http://jpegshare.net/images/ab/75/ab...e4e52240eb.png папки.

seriousstas 28.06.2016 17:39

Вложений: 1
Цитата:

Сделай проще
Думал, но ..
Все не так просто - там по линиям ещё несколько параметров,
отдельно настраивается "+" и отдельно "-" и тд..
Выйдет около 10-ка настроек - проще сноски сделать и быстро подогнать в скрипте ..
Цитата:

Забыл сказать, у тебя прокрутка страницы целиком включена
Я думал прокрутка взбесилась :)

Цитата:

не выбивается из общей массы))), при взгляде на панель не сосредотачиваешь внимание на них
Ну хорошо , а как Тебе такой вариант с полупрозрачними "точками" )
:
Код:

// ==PREPROCESSOR==
// @name "Library Tree"
// @author "Wilb"
// @version "0.8"
// ==/PREPROCESSOR==

//if (!("GetQueryItems" in fb))
        //fb.ShowPopupMessage("Library Tree requires:\n\nJScript Panel 1.1.0+\n\n(https://github.com/19379/foo-jscript-panel/releases)");

String.prototype.trim = function () {
        return this.replace(/^\s+|[\n\s]+$/g, "");
}

//============================
var g_color_normal_bg = 0;

ppt = {

        showwallpaper : window.GetProperty("_DISPLAY: Show Wallpaper", true),
        wallpaperblurred : window.GetProperty("_DISPLAY: Wallpaper Blurred", true),
        wallpaperblurvalue : window.GetProperty("_DISPLAY: Wallpaper Blur value", 2.00) / 1.6,
        wallpapermode : window.GetProperty("_DISPLAY: Wallpaper Mode", false),
        wallpaperpath : window.GetProperty("_DISPLAY: Default Wallpaper Path", ".\\wsh_br3tt\\jsplaylist\\images\\default.jpg"),
        wallpaperalfa : window.GetProperty("_DISPLAY: Wallpaper Alfa", 150),
        wallpaperoverlayalfa : window.GetProperty("_DISPLAY: Wallpaper Overlay Alfa", 50),
};

var brw = null;
var wpp_img_info = {
        orient : 0,
        cut : 0,
        cut_offset : 0,
        ratio : 0,
        x : 0,
        y : 0,
        w : 0,
        h : 0
};
var g_wallpaperImg = null;
//===================================
function userinterface() {
        var blend = "",
        custom_col = window.GetProperty("_CUSTOM COLOURS: USE", false),
        linecol = window.GetProperty(" Node: Lines: Hide-0 Grey-1 Blend-2 Text-3", 3),
        mix = 0,
        orig_font_sz = 16,
        s_col = window.GetProperty(" Search Style: Fade-0 Blend-1 Norm-2 Highlight-3", 1),
        s_linecol = window.GetProperty(" Search: Line Colour: Grey-0 Blend-1 Text-2", 2),
        sp = 6,
        sp1 = 6,
        sp2 = 6,
        sum = 0,
        sy = window.GetProperty(" Node: Custom Symbols: Collapse|Expand", "[-]|[+]").split("|"),
        zoom_font_sz = 16,
        zoom = 100;
        this.b1 = 0x04ffffff;
        this.b2 = 0x04000000;
        this.backcol = "";
        this.backcol_h = "";
        this.backcolsel = "";
        this.backcoltrans = "";
        this.bg = false;
        this.collapse = sy[0].trim();
        this.dui = window.InstanceType;
        this.expand = sy[1].trim();
        this.fill = 0;
        this.font;
        this.framecol = "";
        this.h = 0;
        this.j_font;
        this.linecol = "";
        this.pen = 1;
        this.pen_c = 0x55888888;
        this.row_h = 20;
        this.s_font;
        this.s_linecol = "";
        this.searchcol = "";
        this.sel = 3;
        this.symbol_w = 17;
        this.textcol = "";
        this.textcol_h = "";
        this.textselcol = "";
        this.textsymbcol = "";
        this.txt_box = "";
        this.w = 0;
        this.alternate = window.GetProperty(" Row Stripes", false);
        this.local = typeof conf === 'undefined' ? false : true;
        this.margin = window.GetProperty(" Margin", 8);
        this.node_style = !window.GetProperty(" Node: Custom Symbols (No Lines)", false);
        this.pad = window.GetProperty(" Tree Indent", 19);
        this.scrollbar_show = window.GetProperty(" Scrollbar Show", true);
        this.scr_w = this.scrollbar_show ? window.GetProperty(" Scrollbar Width", 12) : 0;
        window.SetProperty("_CUSTOM COLOURS: EMPTY = DEFAULT", "R-G-B (any) or R-G-B-A (not Text...), e.g. 255-0-0");
        var R = function (c) {
                return c >> 16 & 0xff;
        };
        var G = function (c) {
                return c >> 8 & 0xff;
        };
        var B = function (c) {
                return c & 0xff;
        }
        var get_blend = function (c1, c2, f) {
                var nf = 1 - f,
                r = (R(c1) * f + R(c2) * nf),
                g = (G(c1) * f + G(c2) * nf),
                b = (B(c1) * f + B(c2) * nf);
                return RGB(r, g, b);
        }
        var set_custom_col = function (c, t) {
                if (!custom_col)
                        return "";
                try {
                        var cc = "",
                        col = [];
                        col = c.split("-");
                        if (col.length != 3 && col.length != 4)
                                return "";
                        switch (t) {
                        case 0:
                                cc = RGB(col[0], col[1], col[2]);
                                break;
                        case 1:
                                switch (col.length) {
                                case 3:
                                        cc = RGB(col[0], col[1], col[2]);
                                        break;
                                case 4:
                                        cc = RGBA(col[0], col[1], col[2], col[3]);
                                        break;
                                }
                                break;
                        }
                        return cc;
                } catch (e) {
                        return ""
                };
        }
        this.get_textselcol = function (c) {
                var cc = [R(c), G(c), B(c)];
                var ccc = [];
                for (var i = 0; i < cc.length; i++) {
                        ccc[i] = cc[i] / 255;
                        ccc[i] = ccc[i] <= 0.03928 ? ccc[i] / 12.92 : Math.pow(((ccc[i] + 0.055) / 1.055), 2.4);
                }
                var L = 0.2126 * ccc[0] + 0.7152 * ccc[1] + 0.0722 * ccc[2];
                if (L > 0.31)
                        return RGB(0, 0, 0);
                else
                        return RGB(255, 255, 255);
        }
        this.outline = function (c, but) {
                if (but) {
                        if (window.IsTransparent || R(c) + G(c) + B(c) > 30)
                                return RGBA(0, 0, 0, 36);
                        else
                                return RGBA(255, 255, 255, 36);
                } else if (R(c) + G(c) + B(c) > 255 * 1.5)
                        return RGB(30, 30, 10);
                else
                        return RGB(225, 225, 245);
        }
        this.reset_colors = function () {
                this.backcol = "";
                this.backcol_h = "";
                this.backcolsel = "";
                this.backcoltrans = "";
                this.framecol = "";
                this.linecol = "";
                this.s_linecol = "";
                this.searchcol = "";
                this.textcol = "";
                this.textcol_h = "";
                this.textselcol = "";
                this.textsymbcol = "";
                this.txt_box = "";
        }

        this.get_colors = function () {
                this.backcol = set_custom_col(window.GetProperty("_Custom.Colour Background", ""), 1);
                this.backcol_h = set_custom_col(window.GetProperty("_Custom.Colour Background Highlight", ""), 1);
                this.backcolsel = set_custom_col(window.GetProperty("_Custom.Colour Background Selected", ""), 1);
                this.linecol = set_custom_col(window.GetProperty("_Custom.Colour Node Lines", ""), 1);
                this.txt_box = set_custom_col(window.GetProperty("_Custom.Colour Search Name", ""), 0);
                this.s_linecol = set_custom_col(window.GetProperty("_Custom.Colour Search Line", ""), 1);
                this.searchcol = set_custom_col(window.GetProperty("_Custom.Colour Search Text", ""), 0);
                this.framecol = set_custom_col(window.GetProperty("_Custom.Colour Frame Highlight", ""), 1);
                this.textcol = set_custom_col(window.GetProperty("_Custom.Colour Text", ""), 0);
                this.textcol_h = set_custom_col(window.GetProperty("_Custom.Colour Text Highlight", ""), 0);
                this.textselcol = set_custom_col(window.GetProperty("_Custom.Colour Text Selected", ""), 0);
                this.textsymbcol = set_custom_col(window.GetProperty("_Custom.Colour Node Symbol", ""), 0);
                this.backcoltrans = set_custom_col(window.GetProperty("_Custom.Colour Transparent Fill", ""), 1);

                if (this.dui) { // custom colour mapping: DUI colours can be remapped by changing the numbers (0-3)
                        if (this.textcol === "")
                                this.textcol = window.GetColorDUI(0);
                        if (this.backcol === "")
                                this.backcol = window.GetColorDUI(1);
                        if (this.textcol_h === "")
                                this.textcol_h = window.GetColorDUI(2);
                        if (this.backcolsel === "")
                                this.backcolsel = window.GetColorDUI(3);
                } else { // custom colour mapping: CUI colours can be remapped by changing the numbers (0-6)
                        if (this.textcol === "")
                                this.textcol = window.GetColorCUI(0);
                        if (this.backcol === "")
                                this.backcol = window.GetColorCUI(3);
                        if (this.textcol_h === "")
                                this.textcol_h = window.GetColorCUI(2);
                        if (this.backcolsel === "")
                                this.backcolsel = window.GetColorCUI(4);
                        if (this.textselcol === "")
                                this.textselcol = window.GetColorCUI(1);
                }
                if (this.backcol_h === "")
                        this.backcol_h = 0x1E30AFED;
                if (s_linecol == 1 && window.IsTransparent && !this.dui)
                        s_linecol = 0;
                if (this.framecol === "")
                        this.framecol = 0xA330AFED;
                var blend = get_blend(this.backcol == 0 ? 0xff000000 : this.backcol, this.textcol, 0.75);
                var ln_col = [0, RGBA(136, 136, 136, 85), blend, this.textcol];
                if (this.linecol === "")
                        this.linecol = ln_col[linecol];
                if (this.searchcol === "")
                        this.searchcol = s_col < 3 ? this.textcol : this.textcol_h;
                if (this.textselcol === "")
                        this.textselcol = this.get_textselcol(this.backcolsel);
                blend = get_blend(this.backcol == 0 ? 0xff000000 : this.backcol, !s_col || s_col == 2 ? this.textcol : this.textcol_h, 0.75);
                if (this.txt_box === "")
                        this.txt_box = s_col < 2 ? get_blend(!s_col ? this.textcol : this.textcol_h, this.backcol == 0 ? 0xff000000 : this.backcol, !s_col ? 0.65 : 0.7) : s_col == 2 ? this.textcol : this.textcol_h;
                if (!this.node_style && this.textsymbcol === "")
                        this.textsymbcol = this.textcol;
                if (this.s_linecol === "")
                        this.s_linecol = s_linecol == 0 ? RGBA(136, 136, 136, 85) : s_linecol == 1 ? blend : this.txt_box;
                if (window.IsTransparent && this.backcoltrans) {
                        this.bg = true;
                        this.backcol = this.backcoltrans
                }
                if (!window.IsTransparent || this.dui) {
                        this.bg = true;
                        if ((R(this.backcol) + G(this.backcol) + B(this.backcol)) > 759)
                                this.b2 = 0x06000000;
                }
                if (this.local) {
                        this.textcol = c_textcol;
                        this.textcol_h = c_textcol_h;
                        this.textselcol = c_textselcol;
                        this.backcolsel = c_backcolsel;
                        this.alternate = c_alternate;
                        this.fill = c_fill;
                        this.pen = c_pen;
                        this.pen_c = c_pen_c;
                        this.searchcol = this.txt_box = c_txt_box;
                        this.b1 = c_b1;
                        this.b2 = c_b2;
                }
                this.ibeamcol1 = window.IsTransparent ? 0xffe1e1f5 : this.outline(this.backcol);
                this.ibeamcol2 = window.IsTransparent || !this.backcolsel ? 0xff0099ff : this.backcolsel != this.searchcol ? this.backcolsel : 0xff0099ff;

        }
        this.get_colors();

        this.get_font = function () {
                if (this.dui)
                        this.font = window.GetFontDUI(2);
                else
                        this.font = window.GetFontCUI(0);
                try {
                        this.font.Name;
                        this.font.Size;
                        this.font.Style;
                } catch (e) {
                        this.font = gdi.Font("Segoe UI", 16, 0);
                        p.trace("JScript Panel is unable to use your default font. Using Segoe UI at default size & style instead");
                }
                orig_font_sz = window.GetProperty("SYSTEM.Font Size", 18);
                if (this.font.Size != orig_font_sz)
                        window.SetProperty(" Zoom Font Size (%)", 225);
                orig_font_sz = this.font.Size;
                window.SetProperty("SYSTEM.Font Size", this.font.Size)
                zoom = window.GetProperty(" Zoom Font Size (%)", 100);
                zoom_font_sz = Math.max(Math.round(orig_font_sz * zoom / 100), 1);
                this.font = gdi.Font(this.font.Name, zoom_font_sz, this.font.Style);
                window.SetProperty(" Zoom Font Size (%)", Math.round(zoom_font_sz / orig_font_sz * 100));
                this.s_font = gdi.Font(this.font.Name, this.font.Size, 2);
                this.j_font = gdi.Font(this.font.Name, this.font.Size * 1.5, 1);
                if (this.local) {
                        this.font = c_font;
                        this.s_font = c_s_font;
                        this.j_font = gdi.Font(this.font.Name, this.font.Size * 1.5, 1);
                        this.margin = c_margin;
                        this.pad = c_pad;
                        this.row_h = c_row_h;
                        this.scr_w = c_scr_w;
                }
                this.calc_text();
        }

        this.calc_text = function () {
                var i = gdi.CreateImage(1, 1),
                g = i.GetGraphics();
                this.row_h = Math.round(g.CalcTextHeight("String", this.font)) + window.GetProperty(" Row Vertical Item Padding", 3);
                sp = Math.round(g.CalcTextWidth(" ", this.font));
                sp1 = Math.max(Math.round(sp * 1.5), 6);
                sp2 = Math.round(g.CalcTextWidth(this.expand, this.font));
                this.symbol_w = this.node_style ? 22 + sp1 : sp + sp2;
                this.sel = (this.node_style ? sp1 : sp) / 2;
                this.tt = this.node_style ? -Math.ceil(sp1 / 2 - 3) + sp1 : sp;
                i.ReleaseGraphics(g);
                i.Dispose();
        }

        this.wheel = function (step) {
                if (p.m_y > p.s_h) {
                        zoom_font_sz += step;
                        zoom_font_sz = Math.max(zoom_font_sz, 1);
                        this.font = gdi.Font(this.font.Name, zoom_font_sz, this.font.Style);
                        this.s_font = gdi.Font(this.font.Name, this.font.Size, 2);
                        this.j_font = gdi.Font(this.font.Name, this.font.Size * 1.5, 1);
                        this.calc_text();
                        p.on_size();
                        jS.on_size();
                        pop.create_tooltip();
                        if (p.s_show || this.scrollbar_show)
                                but.refresh(true);
                        sbar.reset();
                        window.Repaint();
                        window.SetProperty(" Zoom Font Size (%)", Math.round(zoom_font_sz / orig_font_sz * 100));
                } else {
                        if (p.scale < 0.7)
                                return;
                        p.scale += step * 0.1;
                        p.scale = Math.max(p.scale, 0.7);
                        p.f_font = gdi.Font("segoe ui", p.scale > 1.05 ? Math.floor(11 * p.scale) : 11 * p.scale, 1);
                        p.f_but_ft = gdi.Font("segoe ui", p.scale > 1.05 ? Math.floor(9 * p.scale) : 9 * p.scale, 1);
                        p.calc_text();
                        but.refresh(true);
                        window.SetProperty(" Zoom Filter Size (%)", Math.round(p.scale * 100));
                        p.search_paint();
                }
        }
}
var ui = new userinterface();

function on_colors_changed() {
        ui.reset_colors();
        ui.get_colors();
        if (p.s_show) {
                but.create_images();
                but.refresh();
        }
        window.Repaint();
}
function on_font_changed() {
        ui.get_font();
        sbar.reset();
        p.on_size();
        pop.create_tooltip();
        if (p.s_show || ui.scrollbar_show)
                but.refresh(true);
        window.Repaint();
}

function scrollbar() {
        var smoothness = 0.3439;
        this.count = -1;
        this.draw_timer = false;
        this.hover = false;
        this.s1 = 0;
        this.s2 = 0;
        this.scroll_step = window.GetProperty(" Scroll - Mouse Wheel: Page Scroll", false);
        this.scroll_step_mouse = window.GetProperty(" Scroll - Mouse Wheel: Step", 1);
        this.smooth = window.GetProperty(" Scroll: Smooth Scroll", true);
        this.smooth_scroll_interval = window.GetProperty(" Scroll: Smooth Scroll Interval", 30);
    this.timer_but = false;
        this.x;
        this.y;
        this.w;
        this.h;
        this.bar_ht = 0;
        this.but_h;
        this.bar_y = 0;
        this.row_count = 0;
        this.scroll = 0;
        this.delta = 0;
        this.ratio = 1;
        this.rows_drawn = 0;
        this.row_h;
        this.scrollbar_height = 0;
        this.scrollable_lines = 0;
        this.scrollbar_travel = 0;
        this.b_is_dragging = false;
        this.drag_distance_per_row;
        this.initial_drag_y = 0; // dragging
        this.draw = function (gr) {
                if (this.scrollable_lines > 0) {
                        try {
                                gr.FillSolidRect(this.x, this.y + this.bar_y, this.w, this.bar_ht, RGBA(200, 200, 200, !this.hover && !this.b_is_dragging ? 75 : 192));
                        } catch (e) {}

                }
        }
        this.leave = function () {
                if (this.b_is_dragging)
                        return;
                this.hover = false;
                this.hover_o = false;
                window.RepaintRect(this.x, this.y, this.w, this.h);
        }
        this.nearest = function (y) {
                y = (y - this.but_h) / this.scrollbar_height * this.scrollable_lines * this.row_h;
                y = y / this.row_h;
                y = Math.round(y) * this.row_h;
                return y;
        }
        this.reset = function () {
                this.delta = this.scroll = this.s1 = this.s2 = 0;
                this.metrics(this.x, this.y, this.w, this.h, this.rows_drawn, this.row_h);
        }
        this.scroll_timer = function () {
                var that = this;
                this.draw_timer = window.SetInterval(function () {
                                if (p.w < 1 || !window.IsVisible)
                                        return;
                                that.smooth_scroll();
                        }, this.smooth_scroll_interval);//smooth_scroll_interval def 16
        }
        this.set_rows = function (row_count) {
                this.row_count = row_count;
                this.metrics(this.x, this.y, this.w, this.h, this.rows_drawn, this.row_h);
        }
        this.wheel = function (step) {
                this.check_scroll(this.scroll + step *  - (this.scroll_step ? this.rows_drawn : this.scroll_step_mouse) * this.row_h);
        }

        this.metrics = function (x, y, w, h, rows_drawn, row_h) {
                this.x = x;
                this.y = Math.round(y);
                this.w = w;
                this.h = h;
                this.rows_drawn = rows_drawn;
                if (!p.autofit)
                        this.rows_drawn = Math.floor(this.rows_drawn);
                this.row_h = row_h;
                this.but_h = ui.scr_w;
                // draw info
                this.scrollbar_height = this.h - this.but_h * 2;
                this.bar_ht = Math.max(Math.round(this.scrollbar_height * this.rows_drawn / this.row_count), 12);
                this.scrollbar_travel = this.scrollbar_height - this.bar_ht;
                // scrolling info
                this.scrollable_lines = this.row_count - this.rows_drawn;
                this.ratio = this.row_count / this.scrollable_lines;
                this.bar_y = this.but_h + this.scrollbar_travel * (this.delta * this.ratio) / (this.row_count * this.row_h);
                this.drag_distance_per_row = this.scrollbar_travel / this.scrollable_lines;
        }

        this.lbtn_up = function (p_x, p_y) {
                var x = p_x - this.x;
                var y = p_y - this.y;
                if (this.b_is_dragging)
                        this.b_is_dragging = false;
                this.initial_drag_y = 0;
                if (this.timer_but) {
                        window.ClearInterval(this.timer_but);
                        this.timer_but = false;
                };
                this.count = -1;
        }

        this.lbtn_dn = function (p_x, p_y) {
                var x = p_x - this.x;
                var y = p_y - this.y;
                if (x < 0 || x > this.w || y < 0 || y > this.h || this.row_count <= this.rows_drawn)
                        return;
                if (y < this.but_h || y > this.h - this.but_h)
                        return;
                if (y < this.bar_y)
                        var dir = 1; // above bar
                else if (y > this.bar_y + this.bar_ht)
                        var dir = -1; // below bar
                if (y < this.bar_y || y > this.bar_y + this.bar_ht)
                        this.check_scroll(this.nearest(y));
                else { // on bar
                        this.b_is_dragging = true;
                        this.initial_drag_y = y - this.bar_y;
                }
        }

        this.move = function (p_x, p_y) {
                var x = p_x - this.x;
                var y = p_y - this.y;
                if (x < 0 || x > this.w || y > this.bar_y + this.bar_ht || y < this.bar_y)
                        this.hover = false;
                else
                        this.hover = true;
                if (this.hover != this.hover_o)
                        window.RepaintRect(this.x, this.y, this.w, this.h);
                this.hover_o = this.hover;
                if (!this.b_is_dragging || this.row_count <= this.rows_drawn)
                        return;
                this.check_scroll(Math.round((y - this.initial_drag_y - this.but_h) / this.drag_distance_per_row) * this.row_h);
        }

        this.check_scroll = function (new_scroll) {
                var s = Math.max(0, Math.min(new_scroll, this.scrollable_lines * this.row_h));
                if (s == this.scroll)
                        return;
                this.scroll = s;
                if (this.smooth) {
                        if (!this.draw_timer)
                                this.scroll_timer();
                } else {
                        this.delta = this.scroll;
                        this.bar_y = this.but_h + this.scrollbar_travel * (this.delta * this.ratio) / (this.row_count * this.row_h);
                        p.tree_paint();
                }
        }

        this.smooth_scroll = function () {
                if (Math.abs(this.scroll - this.delta) > 0.5) {
                        this.s1 += (this.scroll - this.s1) * smoothness;
                        this.s2 += (this.s1 - this.s2) * smoothness;
                        this.delta += (this.s2 - this.delta) * smoothness;
                        this.bar_y = this.but_h + this.scrollbar_travel * (this.delta * this.ratio) / (this.row_count * this.row_h);
                        p.tree_paint();
                } else if (this.draw_timer) {
                        window.ClearTimeout(this.draw_timer);
                        this.draw_timer = false;
                }
        }

        this.but = function (dir) {
                this.check_scroll(this.scroll + (dir * -this.row_h));
                if (!this.timer_but) {
                        var that = this;
                        this.timer_but = window.SetInterval(function () {
                                        if (that.count > 6) {
                                                that.check_scroll(that.scroll + (dir * -that.row_h));
                                        } else
                                                that.count++;
                                }, 40);
                }
        }
}
var sbar = new scrollbar();

function panel_operations() {
        var def_ppt = window.GetProperty(" View by Folder Structure: Name // Pattern", "View by Folder Structure // Pattern Not Configurable");
        var DT_LEFT = 0x00000000,
        DT_CENTER = 0x00000001,
        DT_RIGHT = 0x00000002,
        DT_VCENTER = 0x00000004,
        DT_SINGLELINE = 0x00000020,
        DT_CALCRECT = 0x00000400,
        DT_NOPREFIX = 0x00000800,
        DT_END_ELLIPSIS = 0x00008000,
        grps = [],
        i = 0,
        sort = "";
        var view_ppt = [
                window.GetProperty(" View 01: Name // Pattern", "View by Artist // %artist%|%album%|[[%discnumber%.]%tracknumber%. ][%track artist% - ]%title%"),
                window.GetProperty(" View 02: Name // Pattern", "View by Album Artist // %album artist%|%album%|[[%discnumber%.]%tracknumber%. ][%track artist% - ]%title%"),
                window.GetProperty(" View 03: Name // Pattern", "View by Album Artist - Album // [%album artist% - ]['['%date%']' ]%album%|[[%discnumber%.]%tracknumber%. ][%track artist% - ]%title%"),
                window.GetProperty(" View 04: Name // Pattern", "View by Album // %album%[ '['%album artist%']']|[[%discnumber%.]%tracknumber%. ][%track artist% - ]%title%"),
                window.GetProperty(" View 05: Name // Pattern", "View by Genre // %%|[%album artist% - ]%album%|[[%discnumber%.]%tracknumber%. ][%track artist% - ]%title%"),
                window.GetProperty(" View 06: Name // Pattern", "View by Year // %date%|[%album artist% - ]%album%|[[%discnumber%.]%tracknumber%. ][%track artist% - ]%title%")
        ];
        var nm = "",
        ppt_l = view_ppt.length + 1;
        for (i = ppt_l; i < ppt_l + 93; i++) {
                nm = window.GetProperty(" View " + (i < 10 ? "0" + i : i) + ": Name // Pattern");
                if (nm && nm != " // ")
                        view_ppt.push(window.GetProperty(" View " + (i < 10 ? "0" + i : i) + ": Name // Pattern"));
        }

        var filter_ppt = [
                window.GetProperty(" View Filter 01: Name // Query", "Filter // Query Not Configurable"),
                window.GetProperty(" View Filter 02: Name // Query", "Lossless // \"$info(encoding)\" IS lossless"),
                window.GetProperty(" View Filter 03: Name // Query", "Lossy // \"$info(encoding)\" IS lossy"),
                window.GetProperty(" View Filter 04: Name // Query", "Missing Replaygain // %replaygain_track_gain% MISSING"),
                window.GetProperty(" View Filter 05: Name // Query", "Never Played // %play_count% MISSING"),
                window.GetProperty(" View Filter 06: Name // Query", "Played Often // %play_count% GREATER 9"),
                window.GetProperty(" View Filter 07: Name // Query", "Recently Added // %added% DURING LAST 2 WEEKS"),
                window.GetProperty(" View Filter 08: Name // Query", "Recently Played // %last_played% DURING LAST 2 WEEKS"),
                window.GetProperty(" View Filter 09: Name // Query", "Top Rated // rating IS 5")
        ];
        var filt_l = filter_ppt.length + 1;
        for (i = filt_l; i < filt_l + 90; i++) {
                nm = window.GetProperty(" View Filter " + (i < 10 ? "0" + i : i) + ": Name // Query");
                if (nm && nm != " // ")
                        filter_ppt.push(window.GetProperty(" View Filter " + (i < 10 ? "0" + i : i) + ": Name // Query"));
        }

        this.cc = DT_CENTER | DT_VCENTER | DT_CALCRECT | DT_NOPREFIX;
        this.l = DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_CALCRECT | DT_NOPREFIX;
        this.lc = DT_VCENTER | DT_CALCRECT | DT_NOPREFIX | DT_END_ELLIPSIS;
        this.rc = DT_RIGHT | DT_VCENTER | DT_CALCRECT | DT_NOPREFIX;
        this.f_w = [];
        this.f_h = 0;
        this.f_x1 = 0;
        this.filt = [];
        this.folder_view = 10;
        this.grp = [];
        this.grp_sort = "";
        this.grp_split = [];
        this.grp_split_clone = [];
        this.grp_split_orig = [];
        this.f_menu = [];
        this.menu = [];
        this.multi_value = [];
        this.m_x = 0;
        this.m_y = 0;
        this.pos = -1;
        this.s_cursor = false;
        this.s_search = false;
        this.s_txt = "";
        this.s_x = 0;
        this.s_h = 0;
        this.s_w1 = 0;
        this.s_w2 = 0;
        this.single_br = false;
        this.statistics = false;
        this.tf = "";
        this.view = "";
        this.autofit = window.GetProperty(" Auto Fit", true);
        this.syncType = window.GetProperty(" Library Sync: Auto-0, Initialisation Only-1", 0);
        this.base = window.GetProperty(" Node: Show All Music", true);
        this.s_show = window.GetProperty(" Search: Hide-0, SearchOnly-1, Search+Filter-2", 0);
        if (!this.s_show)
                this.autofit = true;
        this.scale = Math.max(window.GetProperty(" Zoom Filter Size (%)", 100) / 100, 0.7);
        window.SetProperty(" Zoom Filter Size (%)", this.scale * 100);
        this.f_font = gdi.Font("segoe ui", this.scale > 1.05 ? Math.floor(11 * this.scale) : 11 * this.scale, 1);
        this.f_but_ft = gdi.Font("segoe ui", this.scale > 1.05 ? Math.floor(9 * this.scale) : 9 * this.scale, 1);
        this.filter_by = window.GetProperty("SYSTEM.Filter By", 0);
        this.items = function () {
                return plman.GetPlaylistItems(-1);
        };
        this.list = this.items();
        this.reset = window.GetProperty("SYSTEM.Reset Tree", false);
        this.search_paint = function () {
                window.RepaintRect(ui.margin, 0, ui.w - ui.margin, this.s_h);
        }
        this.set_statistics_mode = function () {
                this.statistics = false;
                var chk = this.grp[this.view_by].name + this.grp[this.view_by].type + this.filt[this.filter_by].name + this.filt[this.filter_by].type;
                chk = chk.toUpperCase();
                if (chk.indexOf("ADD") != -1 || chk.indexOf("PLAY") != -1 || chk.indexOf("RATING") != -1)
                        this.statistics = true;
        }
        this.show_tracks = window.GetProperty(" Node: Show Tracks", true);
        this.sort = function (li) {
                switch (this.view_by) {
                case this.folder_view:
                        li.OrderByPath();
                        lib.it = li.Clone();
                        li.OrderByRelativePath();
                        break;
                default:
                        var tfs = fb.TitleFormat(this.grp_sort);
                        li.OrderByFormat(fb.TitleFormat(this.grp_sort), 1);
                        break;
                }
        }
        this.tooltip = window.GetProperty(" Tooltips", false);
        this.trace = function (message) {
                var trace = true;
                if (trace)
                        fb.trace("Library Tree: " + message);
        } // true enables fb.trace
        this.tree_paint = function () {
                window.RepaintRect(0, Math.floor(this.s_h), ui.w, Math.round(ui.h - this.s_h) + 1);
        }
        this.view_by = window.GetProperty("SYSTEM.View By", 6);
        this.calc_text = function () {
                this.f_w = [];
                var im = gdi.CreateImage(1, 1),
                g = im.GetGraphics();
                for (i = 0; i < this.filt.length; i++) {
                        this.f_w[i] = g.CalcTextWidth(this.filt[i].name, this.f_font);
                        if (!i)
                                this.f_h = g.CalcTextHeight("String", this.f_font);
                }
                this.f_sw = g.CalcTextWidth("  Ў", this.f_but_ft);
                this.f_x1 = ui.w - ui.margin - this.f_w[this.filter_by] - this.f_sw;
                this.s_w2 = this.s_show > 1 ? this.f_x1 - this.s_x - 11 : this.s_w1 - Math.round(ui.row_h * 0.75) - this.s_x + 1;
                im.ReleaseGraphics(g);
                im.Dispose();
        }

        this.fields = function (view, filter) {
                this.filt = [];
                this.folder_view = 10;
                this.grp = [];
                this.grp_sort = "";
                this.multi_process = false;
                this.filter_by = filter;
                this.view_by = view;
                for (i = 0; i < view_ppt.length; i++) {
                        if (view_ppt[i].indexOf("//") != -1) {
                                grps = view_ppt[i].split("//");
                                this.grp[i] = {
                                        name : grps[0].trim(),
                                        type : grps[1].replace(/\|\]/g, " - ]").replace(/\[\|/g, "[ - ").trim()
                                }
                        }
                }
                grps = [];
                for (i = 0; i < filter_ppt.length; i++) {
                        if (filter_ppt[i].indexOf("//") != -1) {
                                grps = filter_ppt[i].split("//");
                                this.filt[i] = {
                                        name : grps[0].trim(),
                                        type : grps[1].trim()
                                }
                        }
                }
                i = this.grp.length;
                while (i--)
                        if (!this.grp[i] || this.grp[i].name == "" || this.grp[i].type == "")
                                this.grp.splice(i, 1);
                i = this.filt.length;
                while (i--)
                        if (!this.filt[i] || this.filt[i].name == "" || this.filt[i].type == "")
                                this.filt.splice(i, 1);
                this.grp[this.grp.length] = {
                        name : def_ppt.split("//")[0].trim(),
                        type : ""
                }
                this.folder_view = this.grp.length - 1;
                this.filter_by = Math.min(this.filter_by, this.filt.length - 1);
                this.view_by = Math.min(this.view_by, this.grp.length - 1);
                if (this.view_by != this.folder_view) {
                        this.grp_split = this.grp[this.view_by].type.split("|");
                        this.single_br = !this.base && (this.grp_split.length == 1 || this.grp_split.length == 2 && !this.show_tracks);
                        this.tf = this.grp_split.length > 1 ? this.grp_split.pop() : this.grp_split[0];
                        for (i = 0; i < this.grp_split.length; i++) {
                                this.grp_split[i] = this.grp_split[i].trim();
                                this.multi_value[i] = this.grp_split[i].indexOf("%<") != -1 ? true : false;
                                if (this.grp_split[i].indexOf("%<") != -1)
                                        this.multi_process = true;
                                if (this.multi_value[i]) {
                                        this.grp_split_orig[i] = this.grp_split[i].slice();
                                        this.grp_split[i] = this.grp_split[i].replace(/%%/i, "$if3(%%,%%,%%,%%)").replace(/%%/i, "$if2(%%,%%)").replace(/%%/i, "$if3(%%,%%,%%,%%)");
                                        this.grp_split_clone[i] = this.grp_split[i].slice();
                                        this.grp_split[i] = this.grp_split_orig[i].replace(/[<>]/g, "");
                                }
                                this.grp_sort += (this.grp_split[i] + "|");
                                if (this.multi_value[i])
                                        this.grp_split[i] = this.grp_split_clone[i].replace(/%%/g, "," + "|)#!#");
                        }
                        this.grp_sort = this.grp_sort + this.tf;
                        this.view = this.grp_split[0];
                }
                this.set_statistics_mode();
                window.SetProperty("SYSTEM.Filter By", filter);
                window.SetProperty("SYSTEM.View By", view);
                this.f_menu = [];
                this.menu = [];
                for (i = 0; i < this.grp.length; i++)
                        this.menu.push(this.grp[i].name);
                for (i = 0; i < this.filt.length; i++) {
                        this.f_menu.push(this.filt[i].name);
                }
                this.menu.splice(this.menu.length, 0, "Panel Properties");
                if (this.syncType)
                        this.menu.splice(this.menu.length, 0, "Refresh");
                this.menu.splice(this.menu.length, 0, "Configure...");
                this.calc_text();
        }
        this.fields(this.view_by, this.filter_by);

        var k = 1;
        for (i = 0; i < 100; i++) {
                nm = window.GetProperty(" View " + (i < 10 ? "0" + i : i) + ": Name // Pattern");
                if (nm && nm != " // ") {
                        window.SetProperty(" View " + (k < 10 ? "0" + k : k) + ": Name // Pattern", nm);
                        k += 1
                } else
                        window.SetProperty(" View " + (i < 10 ? "0" + i : i) + ": Name // Pattern", null);
        }
        for (i = k; i < k + 5; i++)
                window.SetProperty(" View " + (i < 10 ? "0" + i : i) + ": Name // Pattern", " // ");
        k = 1;
        for (i = 0; i < 100; i++) {
                nm = window.GetProperty(" View Filter " + (i < 10 ? "0" + i : i) + ": Name // Query");
                if (nm && nm != " // ") {
                        window.SetProperty(" View Filter " + (k < 10 ? "0" + k : k) + ": Name // Query", nm);
                        k += 1
                } else
                        window.SetProperty(" View Filter " + (i < 10 ? "0" + i : i) + ": Name // Query", null);
        }
        for (i = k; i < k + 5; i++)
                window.SetProperty(" View Filter " + (i < 10 ? "0" + i : i) + ": Name // Query", " // ");

        this.on_size = function () {
                this.f_x1 = ui.w - ui.margin - this.f_w[this.filter_by] - this.f_sw;
                this.s_x = Math.round(ui.margin + ui.row_h);
                this.s_w1 = ui.w - ui.margin;
                this.s_w2 = this.s_show > 1 ? this.f_x1 - this.s_x - 11 : this.s_w1 - Math.round(ui.row_h * 0.75) - this.s_x + 1;
                this.ln_sp = this.s_show && !ui.local ? ui.row_h * 0.1 : 0;
                this.s_h = this.s_show ? ui.row_h + (!ui.local ? this.ln_sp * 2 : 0) : ui.margin;
                this.s_sp = this.s_h - this.ln_sp;
                this.sp = ui.h - this.s_h - (this.s_show ? 0 : ui.margin);
                this.rows = this.sp / ui.row_h;
                if (this.autofit) {
                        this.rows = Math.floor(this.rows);
                        this.sp = ui.row_h * this.rows;
                }
                this.node_y = Math.round((ui.row_h - 11) / 2);
                var scr_w = ui.scr_w;
                if (this.scrollbar_show)
                        scr_w += 5;
                this.r_mg = Math.max(ui.margin, scr_w);
                sbar.metrics(ui.w - ui.scr_w, this.s_h, Math.max(ui.scr_w - 1, 0), this.sp - (this.autofit ? 0 : 4), this.rows, ui.row_h);
        }
}
var p = new panel_operations();
window.DlgCode = 0x004;

function v_keys() {
        this.selAll = 1;
        this.copy = 3;
        this.back = 8;
        this.enter = 13;
        this.shift = 16;
        this.paste = 22;
        this.cut = 24;
        this.redo = 25;
        this.undo = 26;
        this.pgUp = 33;
        this.pgDn = 34;
        this.end = 35;
        this.home = 36;
        this.left = 37;
        this.up = 38;
        this.right = 39;
        this.dn = 40;
        this.del = 46;
        this.k = function (n) {
                switch (n) {
                case 0:
                        return utils.IsKeyPressed(0x10);
                        break;
                case 1:
                        return utils.IsKeyPressed(0x11);
                        break;
                }
        }
}
var v = new v_keys();

function library_manager() {
        var exp = [],
        expanded_items = [],
        lib_paths = [],
        lib_update = false,
        name_idx = [],
        name_ix = [],
        node = [],
        node_s = [],
        process = false,
        scr = [],
        sel = [];
        this.allmusic = [];
        this.get_paths = true;
        this.it = p.items();
        this.list;
        this.none = "";
        this.pth_sort = "";
        this.node = [];
        this.root = [];
        this.time = fb.CreateProfiler();
        this.upd = false,
        this.upd_search = false;
        var tr_sort = function (data) {
                data.sort(function (a, b) {
                        return parseFloat(a.tr) - parseFloat(b.tr)
                });
                return data;
        }
        this.update = function () {
                if (ui.w < 1 || !window.IsVisible)
                        this.upd = true;
                else {
                        this.refresh();
                        this.upd = false;
                }
        }

        this.refresh = function (b) {
                if (this.upd) {
                        p.search_paint();
                        p.tree_paint();
                }
                var ix = -1,
                tr = 0;
                process = false;
                if (pop.tree.length && (!b || b && !p.reset)) {
                        tr = 0;
                        expanded_items = [];
                        process = true;
                        scr = [];
                        sel = [];
                        for (var i = 0; i < pop.tree.length; i++) {
                                tr = !p.base ? pop.tree[i].tr : pop.tree[i].tr - 1;
                                if (pop.tree[i].child.length)
                                        expanded_items.push({
                                                tr : tr,
                                                a : tr < 1 ? pop.tree[i].name : pop.tree[pop.tree[i].par].name,
                                                b : tr < 1 ? "" : pop.tree[i].name
                                        });
                                tr = pop.tree[i].tr;
                                if (pop.tree[i].sel == true)
                                        sel.push({
                                                tr : tr,
                                                a : pop.tree[i].name,
                                                b : tr != 0 ? pop.tree[pop.tree[i].par].name : "",
                                                c : tr > 1 ? pop.tree[pop.tree[pop.tree[i].par].par].name : ""
                                        });
                        }
                        var l = Math.min(Math.floor(p.rows), pop.tree.length);
                        ix = pop.get_ix(0, p.s_h + ui.row_h / 2, true, false);
                        tr = 0;
                        for (var i = ix; i < ix + l; i++) {
                                tr = pop.tree[i].tr;
                                scr.push({
                                        tr : tr,
                                        a : pop.tree[i].name,
                                        b : tr != 0 ? pop.tree[pop.tree[i].par].name : "",
                                        c : tr > 1 ? pop.tree[pop.tree[pop.tree[i].par].par].name : ""
                                })
                        }
                        exp = JSON.parse(JSON.stringify(tr_sort(expanded_items)));
                }
                lib_update = true;
                this.get_library();
                this.rootNodes();
        }

        this.get_library = function () {
                if (this.list)
                        this.list.Dispose();
                if (p.list)
                        p.list.Dispose();
                this.time.Reset();
                this.none = "";
                this.list = fb.GetLibraryItems();
                if (!this.list.Count) {
                        pop.tree = [];
                        pop.line_l = 0;
                        sbar.set_rows(0);
                        this.none = "Nothing to show\n\nConfigure Media Library first\n\nFile>Preferences>Media library";
                        p.tree_paint();
                        return;
                }
                if (p.filter_by > 0 && p.s_show > 1)
                        try {
                                this.list = fb.GetQueryItems(this.list, p.filt[p.filter_by].type)
                        } catch (e) {};
                if (!this.list.Count) {
                        pop.tree = [];
                        pop.line_l = 0;
                        sbar.set_rows(0);
                        this.none = "Nothing found";
                        p.tree_paint();
                        return;
                }
                this.rootNames("", 0);
        }

        this.rootNames = function (li, search) {
                var i = 0,
                name = "",
                search_name = "",
                tf = fb.TitleFormat(p.view),
                total;
                switch (search) {
                case 0:
                        p.sort(this.list);
                        li = p.list = this.list;
                        name_idx = [];
                        break;
                case 1:
                        name_ix = [];
                        break;
                }
                total = li.Count;
                var tree_type = !search ? p.view_by != p.folder_view ? !p.base ? 0 : 1 : !p.base ? 2 : 3 : p.view_by != p.folder_view ? !p.base ? 4 : 7 : !p.base ? 5 : 6;
                switch (tree_type) {
                case 0:
                        for (i = 0; i < total; i++) {
                                name = tf.EvalWithMetadb(li.Item(i));
                                name_idx[i] = !name.length || name == "#!##!#" ? "?" : name;
                        };
                        break;
                case 1:
                        for (i = 0; i < total; i++) {
                                this.allmusic[i] = tf.EvalWithMetadb(li.Item(i));
                        };
                        break;
                case 2:
                        for (i = 0; i < total; i++) {
                                node[i] = fb.GetLibraryRelativePath(li.Item(i)).split("\\");
                                name_idx[i] = node[i][0];
                        };
                        break;
                case 3:
                        for (i = 0; i < total; i++) {
                                node[i] = fb.GetLibraryRelativePath(li.Item(i)).split("\\");
                        };
                        break;
                case 4:
                        for (i = 0; i < total; i++) {
                                name = tf.EvalWithMetadb(li.Item(i));
                                name_ix[i] = !name.length || name == "#!##!#" ? "?" : name;
                        };
                        break
                case 5:
                        for (i = 0; i < total; i++) {
                                node_s[i] = fb.GetLibraryRelativePath(li.Item(i)).split("\\");
                                name_ix[i] = node_s[i][0];
                        };
                        break;
                case 6:
                        for (i = 0; i < total; i++) {
                                node_s[i] = fb.GetLibraryRelativePath(li.Item(i)).split("\\");
                        };
                        break;
                }
        }

        this.rootNodes = function () {
                this.root = [];
                var i = 0,
                j = 1,
                h = 0,
                l = 0,
                n = "";
                if (p.s_txt && (this.upd_search || lib_update)) {
                        if (!this.list.Count)
                                return;
                        this.none = "";
                        try {
                                p.list = fb.GetQueryItems(this.list, p.s_txt)
                        } catch (e) {};
                        if (!p.list.Count) {
                                pop.tree = [];
                                pop.line_l = 0;
                                sbar.set_rows(0);
                                this.none = "Nothing found";
                                p.tree_paint();
                                return;
                        }
                        this.rootNames(p.list, 1);
                        this.node = node_s.slice();
                        this.upd_search = false;
                } else if (!p.s_txt) {
                        p.list = this.list;
                        this.node = node.slice()
                };
                var arr = !p.s_txt ? name_idx : name_ix,
                n_o = "#get_node#",
                nU = "",
                total = p.list.Count;
                if (!p.base)
                        for (l = 0; l < total; l++) {
                                n = arr[l];
                                nU = n.toUpperCase();
                                if (nU != n_o) {
                                        n_o = nU;
                                        this.root[i] = {
                                                name : n,
                                                sel : false,
                                                child : [],
                                                item : []
                                        };
                                        this.root[i].item.push(l);
                                        i++;
                                } else
                                        this.root[i - 1].item.push(l);
                        }
                else {
                        this.root[0] = {
                                name : "All Music",
                                sel : false,
                                child : [],
                                item : []
                        };
                        for (l = 0; l < total; l++)
                                this.root[0].item.push(l);
                }
                if (!lib_update)
                        sbar.reset();
                /* Draw tree -> */
                if (!p.base || p.s_txt)
                        pop.buildTree(this.root, 0);
                if (p.base)
                        pop.branch(this.root[0], true);
                p.trace("populated in: " + this.time.Time / 1000 + " seconds");
                var gp = p.grp_split.length,
                tot = this.list.Count;
                if (gp > 1 && !p.s_txt && p.view_by != p.folder_view) {
                        this.node = [];
                        for (h = 0; h < gp; h++)
                                this.node[h] = [];
                        var tf_gr = [];
                        for (j = 1; j < gp; j++)
                                tf_gr[j] = fb.TitleFormat(p.grp_split[j])
                                        for (i = 0; i < tot; i++)
                                                for (j = 1; j < gp; j++)
                                                        this.node[j][i] = tf_gr[j].EvalWithMetadb(this.list.Item(i));
                }

                if (lib_update && process) {
                        try {
                                var exp_l = exp.length,
                                scr_l = scr.length,
                                sel_l = sel.length,
                                tree_l = pop.tree.length;
                                for (h = 0; h < exp_l; h++) {
                                        if (exp[h].tr == 0) {
                                                for (j = 0; j < tree_l; j++)
                                                        if (pop.tree[j].name.toUpperCase() == exp[h].a.toUpperCase()) {
                                                                pop.branch(pop.tree[j]);
                                                                break;
                                                        }
                                        } else if (exp[h].tr > 0) {
                                                for (j = 0; j < tree_l; j++)
                                                        if (pop.tree[j].name.toUpperCase() == exp[h].b.toUpperCase() && pop.tree[pop.tree[j].par].name.toUpperCase() == exp[h].a.toUpperCase()) {
                                                                pop.branch(pop.tree[j]);
                                                                break;
                                                        }
                                        }
                                }
                                for (h = 0; h < sel_l; h++) {
                                        if (sel[h].tr == 0) {
                                                for (j = 0; j < tree_l; j++)
                                                        if (pop.tree[j].name.toUpperCase() == sel[h].a.toUpperCase()) {
                                                                pop.tree[j].sel = true;
                                                                break;
                                                        }
                                        } else if (sel[h].tr == 1) {
                                                for (j = 0; j < tree_l; j++)
                                                        if (pop.tree[j].name.toUpperCase() == sel[h].a.toUpperCase() && pop.tree[pop.tree[j].par].name.toUpperCase() == sel[h].b.toUpperCase()) {
                                                                pop.tree[j].sel = true;
                                                                break;
                                                        }
                                        } else if (sel[h].tr > 1) {
                                                for (j = 0; j < tree_l; j++)
                                                        if (pop.tree[j].name.toUpperCase() == sel[h].a.toUpperCase() && pop.tree[pop.tree[j].par].name.toUpperCase() == sel[h].b.toUpperCase() && pop.tree[pop.tree[pop.tree[j].par].par].name.toUpperCase() == sel[h].c.toUpperCase()) {
                                                                pop.tree[j].sel = true;
                                                                break;
                                                        }
                                        }
                                }
                                var scr_pos = false;
                                h = 0;
                                while (h < scr_l && !scr_pos) {
                                        if (scr[h].tr == 0) {
                                                for (j = 0; j < tree_l; j++)
                                                        if (pop.tree[j].name.toUpperCase() == scr[h].a.toUpperCase()) {
                                                                sbar.check_scroll(!h ? j * ui.row_h : (j - 3) * ui.row_h);
                                                                scr_pos = true;
                                                                break;
                                                        }
                                        } else if (scr[h].tr == 1 && !scr_pos) {
                                                for (j = 0; j < tree_l; j++)
                                                        if (pop.tree[j].name.toUpperCase() == scr[h].a.toUpperCase() && pop.tree[pop.tree[j].par].name.toUpperCase() == scr[h].b.toUpperCase()) {
                                                                sbar.check_scroll(!h ? j * ui.row_h : (j - 3) * ui.row_h);
                                                                scr_pos = true;
                                                                break;
                                                        }
                                        } else if (scr[h].tr > 1 && !scr_pos) {
                                                for (j = 0; j < tree_l; j++)
                                                        if (pop.tree[j].name.toUpperCase() == scr[h].a.toUpperCase() && pop.tree[pop.tree[j].par].name.toUpperCase() == scr[h].b.toUpperCase() && pop.tree[pop.tree[pop.tree[j].par].par].name.toUpperCase() == scr[h].c.toUpperCase()) {
                                                                sbar.check_scroll(!h ? j * ui.row_h : (j - 3) * ui.row_h);
                                                                scr_pos = true;
                                                                break;
                                                        }
                                        }
                                        h++;
                                }
                                if (!scr_pos) {
                                        sbar.reset();
                                        p.tree_paint();
                                }
                        } catch (e) {};
                }
                if (lib_update && !process) {
                        sbar.reset();
                        p.tree_paint();
                }

                if (p.view_by == p.folder_view && (this.get_paths || lib_update)) {
                        var f = "",
                        f_o = "",
                        it_l = this.it.Count;
                        this.pth_sort = "";
                        for (var b = 0; b < it_l; b++) {
                                f = this.it.Item(b).Path.replace(fb.GetLibraryRelativePath(this.it.Item(b)), "");
                                if (f != f_o) {
                                        f_o = f;
                                        lib_paths.push(f_o);
                                }
                        }
                        var pth_l = lib_paths.length;
                        for (b = 0; b < pth_l; b++) {
                                if (!b)
                                        this.pth_sort = lib_paths[0] + ",";
                                else
                                        this.pth_sort += ("," + lib_paths[b] + ",");
                        }
                        this.pth_sort = "$replace(%path%," + this.pth_sort + ")";
                }
                this.get_paths = false;
                lib_update = false;
        }
}
var lib = new library_manager();

function populate() {
        var get_pos = -1,
        ix_o = 0,
        last_sel = -1,
        m_i = -1,
        tt = "",
        tooltip = false,
        tt_c = 0,
        tt_h = 20,
        tt_id = -1;
        var dbl_action = window.GetProperty(" Double-Click Action: ExplorerStyle-0 Play-1", 1);
        var auto = window.GetProperty(" Node: Auto Collapse", false);
        var autoplay = window.GetProperty(" Playlist: Autoplay On Send", false);
        var lib_playlist = window.GetProperty(" Playlist", "Library view");
        var show_counts = window.GetProperty(" Node: Show Item Counts", true);
        var symb = window.CreateThemeManager("TREEVIEW");
        var im = gdi.CreateImage(11, 11),
        g = im.GetGraphics(),
        symb_style = 0;
        if (ui.node_style)
                try {
                        symb.SetPartAndStateId(2, 1);
                        symb.SetPartAndStateId(2, 2);
                        symb.DrawThemeBackground(g, 0, 0, 11, 11);
                } catch (e) {
                        symb_style = 1;
                }
        im.ReleaseGraphics(g);
        im.Dispose();
        var sy_font = gdi.Font("Segoe UI", 24, 1),//                                font symb
        symb_style = 0;
        this.line_l = 0;
        this.sel_items = [];
        this.tree = [];
        if (!window.GetProperty("SYSTEM.Playlist Checked", false))
                fb.ShowPopupMessage("Library Tree uses the following playlist by default:\n\nLibrary view\n\nIf you wish to use a different playlist, change the one used by Library Tree in properties.", "Library Tree");
        window.SetProperty("SYSTEM.Playlist Checked", true);
        var arr_contains = function (arr, item) {
                var n = false;
                for (var i = 0; i < arr.length; i++)
                        if (arr[i] == item) {
                                n = true;
                                break;
                        }
                return n;
        }
        var arr_index = function (arr, item) {
                var n = -1;
                for (var i = 0; i < arr.length; i++)
                        if (arr[i] == item) {
                                n = i;
                                break;
                        }
                return n;
        }
        var check_node = function (gr) {
                if (sbar.draw_timer || !ui.node_style)
                        return;
                symb_style = 0;
                try {
                        symb.SetPartAndStateId(2, 1);
                        symb.SetPartAndStateId(2, 2);
                        symb.DrawThemeBackground(gr, -11, -11, 11, 11);
                } catch (e) {
                        symb_style = 1;
                }
        }
        var draw_node = function (gr, parent, x, y) {
                switch (symb_style) {
                case 1:
                        symb.SetPartAndStateId(2, parent ? 1 : 2);
                        symb.DrawThemeBackground(gr, x, y, 11, 11);
                        break;
                case 0:
                        gr.FillSolidRect(x+0.5, y-2, 17, 17, RGBA(226, 226, 226 ,100));
                        gr.DrawRect(x+0.5, y-2, 16, 17, 2, RGB(163, 163, 163));
            if (parent) {
                        gr.GdiDrawText("+" , sy_font, RGB(0, 0, 0), x, y-12 , 26, 26)
              }
            else
            gr.GdiDrawText("-" , sy_font, RGB(0, 0, 0), x+4, y-12 , 26, 26)
                        break;
                }
        }
        var num_sort = function (a, b) {
                return a - b;
        }
        var plID = function (Playlist_Name) {
                for (var i = 0; i < plman.PlaylistCount; i++)
                        if (plman.GetPlaylistName(i) == Playlist_Name)
                                return i;
                plman.CreatePlaylist(plman.PlaylistCount, Playlist_Name);
                return i;
        }
        var searchBranches = function (item, tr) {
                var nn = "",
                tf_l = fb.TitleFormat("[" + p.grp_split[tr] + "]");
                if (tr < p.grp_split.length) {
                        nn = tf_l.EvalWithMetadb(p.list.Item(item));
                        if (!nn || nn == "#!##!#")
                                nn = "?";
                        return nn;
                } else
                        return "#get_track#";
        }
        var sort = function (c, d) {
                a = c.name.toUpperCase().replace(/^\?/, "");
                b = d.name.toUpperCase().replace(/^\?/, "");
                if (a < b)
                        return -1;
                if (a > b)
                        return 1;
                return 0;
        }
        var uniq = function (a) {
                var j = 0,
                len = a.length,
                out = [],
                seen = {};
                for (var i = 0; i < len; i++) {
                        var item = a[i];
                        if (seen[item] !== 1) {
                                seen[item] = 1;
                                out[j++] = item;
                        }
                }
                return out.sort(num_sort);
        }
        this.branch_chg = function (br) {
                var new_br = 0;
                if (br.tr == 0) {
                        for (var i = 0; i < lib.root.length; i++) {
                                new_br += lib.root[i].child.length;
                                lib.root[i].child = [];
                        }
                } else {
                        var par = this.tree[br.par];
                        for (var i = 0; i < par.child.length; i++) {
                                new_br += par.child[i].child.length;
                                par.child[i].child = [];
                        }
                }
                return new_br;
        }
        this.clear = function () {
                for (var i = 0; i < this.tree.length; i++)
                        this.tree[i].sel = false;
        }
        this.clear_child = function (br) {
                br.child = [];
                this.buildTree(lib.root, 0, true, true);
        }
        this.deactivate_tooltip = function () {
                tt_c = 0;
                tt.Text = "";
                tt.TrackActivate = false;
                tt.Deactivate();
        }
        this.mbtn_dn = function (x, y) {
                if (y < p.s_h)
                        return;
                var ix = this.get_ix(x, y, true, false);
                p.pos = ix;
                if (ix < this.tree.length && ix >= 0)
                        if (this.check_ix(this.tree[ix], x, y, true)) {
                                this.load(this.tree[ix].item, true, true, false, false);
                                this.tree[ix].sel = true;
                        }
        }

        this.create_tooltip = function () {
                if (!p.tooltip)
                        return;
                if (tt)
                        tt.Dispose();
                tt = window.CreateTooltip(ui.font.Name, ui.font.Size, ui.font.Style);
                tt_h = ui.row_h - window.GetProperty(" Row Vertical Item Padding", 3);
                tt.SetDelayTime(0, 500);
                tt.Text = "";
        }

        this.activate_tooltip = function (ix, row) {
                if (tt_c == 2) {
                        tt_id = ix;
                        return;
                }
                tt_c += 1;
                tt.Activate();
                tt.TrackActivate = true;
                tt.Text = this.tree[ix].name + ((this.tree[ix].track && p.show_tracks) ? ("") : (" (" + this.tree[ix].item.length + ")"));
                tt.TrackPosition(Math.round(ui.pad * this.tree[ix].tr + ui.margin) + (!ui.node_style && this.tree[ix].track ? 0 : ui.symbol_w) - ui.tt, row * ui.row_h + p.s_h - Math.floor((ui.row_h - tt_h) / 2));
                timer.tooltip();
        }

        this.branch = function (br, base, node) {
                if (!br)
                        return;
                var br_l = br.item.length,
                branch = false,
                folderView = p.view_by == p.folder_view ? true : false,
                i = 0,
                k = 0,
                isTrack = false,
                l = base ? 0 : p.base ? br.tr : br.tr + 1,
                n = "",
                n_o = "#get_branch#",
                nU = "",
                tf = fb.TitleFormat(p.tf),
                treatAsTrack = !folderView && l < p.grp_split.length - 1 ? true : false;
                if (folderView)
                        base = false;
                if (base)
                        node = false;
                if (!folderView && l < p.grp_split.length)
                        branch = true;
                if (!folderView && !branch && !p.show_tracks)
                        return;
                for (k = 0; k < br_l; k++) {
                        var get_track = true,
                        pos = br.item[k];
                        if (folderView && l == lib.node[pos].length - 1 && !p.show_tracks)
                                get_track = false;
                        if (get_track) {
                                if (base) {
                                        n = lib.allmusic[pos];
                                        if (!n || n == "#!##!#")
                                                n = "?";
                                }
                                if (!p.s_txt && !base) {
                                        if (branch || folderView && l < lib.node[pos].length - 1) {
                                                n = (!folderView ? lib.node[l][pos] : lib.node[pos][l]);
                                                if (!n || n == "#!##!#")
                                                        n = "?";
                                        } else
                                                n = "#get_track#";
                                } else if (p.s_txt) {
                                        if (folderView && l < lib.node[pos].length - 1) {
                                                n = lib.node[pos][l];
                                                if (!n || n == "#!##!#")
                                                        n = "?";
                                        } else
                                                n = searchBranches(pos, l);
                                }
                                if (br.track)
                                        continue;
                                isTrack = p.show_tracks ? false : treatAsTrack || folderView && l < lib.node[pos].length - 2 ? false : true;
                                if (n == "#get_track#") {
                                        n = !folderView ? tf.EvalWithMetadb(p.list.Item(pos)) : lib.node[pos][l];
                                        isTrack = true;
                                }
                                nU = n.toUpperCase();
                                if (n_o != nU) {
                                        n_o = nU;
                                        br.child[i] = {
                                                name : n,
                                                sel : false,
                                                child : [],
                                                track : isTrack,
                                                item : []
                                        };
                                        br.child[i].item.push(pos);
                                        i++;
                                } else
                                        br.child[i - 1].item.push(pos);
                        }
                }
                this.buildTree(lib.root, 0, node, true);
        }

        var getAllCombinations = function (n) {
                var combinations = [],
                divisors = [],
                nn = [],
                arraysToCombine = [];
                nn = n.split("#!#");
                for (var i = 0; i < nn.length; i++) {
                        nn[i] = nn[i].split("|");
                        if (nn[i] != "")
                                arraysToCombine.push(nn[i]);
                }
                for (var i = arraysToCombine.length - 1; i >= 0; i--)
                        divisors[i] = divisors[i + 1] ? divisors[i + 1] * arraysToCombine[i + 1].length : 1;
                function getPermutation(n, arraysToCombine) {
                        var result = [],
                        curArray;
                        for (var i = 0; i < arraysToCombine.length; i++) {
                                curArray = arraysToCombine[i];
                                result.push(curArray[Math.floor(n / divisors[i]) % curArray.length]);
                        }
                        return result;
                }
                var numPerms = arraysToCombine[0].length;
                for (var i = 1; i < arraysToCombine.length; i++)
                        numPerms *= arraysToCombine[i].length;
                for (var i = 0; i < numPerms; i++)
                        combinations.push(getPermutation(i, arraysToCombine));
                return combinations;
        }

        this.buildTree = function (br, tr, node, full) {
                var br_l = br.length,
                i = 0,
                j = 0,
                l = !p.base ? tr : tr - 1;
                if (p.multi_process) {
                        var simple = l == p.grp_split.length ? true : false;
                        var h = -1,
                        multi = [],
                        multi_cond = [],
                        multi_obj = [],
                        multi_rem = [],
                        n = "",
                        n_o = "#condense#",
                        nm_arr = [],
                        nU = "";
                        if (!simple) {
                                for (i = 0; i < br_l; i++) {
                                        if (br[i].name.indexOf("|") != -1) {
                                                multi = getAllCombinations(br[i].name);
                                                multi_rem.push(i);
                                                for (var m = 0; m < multi.length; m++)
                                                        multi_obj.push({
                                                                name : multi[m].join(""),
                                                                item : br[i].item.slice()
                                                        });
                                        }
                                }
                                i = multi_rem.length;
                                while (i--)
                                        br.splice(multi_rem[i], 1);
                                br_l = br.length;
                                multi_obj.sort(sort);
                                i = 0;
                                while (i < multi_obj.length) {
                                        n = multi_obj[i].name;
                                        nU = n.toUpperCase();
                                        if (n_o != nU) {
                                                n_o = nU;
                                                multi_cond[j] = {
                                                        name : n,
                                                        item : multi_obj[i].item.slice()
                                                };
                                                j++
                                        } else
                                                multi_cond[j - 1].item.push.apply(multi_cond[j - 1].item, multi_obj[i].item.slice());
                                        i++
                                }
                                for (i = 0; i < br_l; i++) {
                                        br[i].name = br[i].name.replace(/#!#/g, "");
                                        nm_arr.push(br[i].name);
                                }
                                for (i = 0; i < multi_cond.length; i++) {
                                        h = arr_index(nm_arr, multi_cond[i].name);
                                        if (h != -1) {
                                                br[h].item.push.apply(br[h].item, multi_cond[i].item.slice());
                                                multi_cond.splice(i, 1);
                                        }
                                }
                                for (i = 0; i < multi_cond.length; i++)
                                        br.splice(i + 1, 0, {
                                                name : multi_cond[i].name,
                                                sel : false,
                                                track : false,
                                                child : [],
                                                item : multi_cond[i].item.slice()
                                        });
                        }
                        if (!node || node && !full)
                                br.sort(sort);
                        i = br.length;
                        while (i--) {
                                if (i != 0 && br[i].name.toUpperCase() == br[i - 1].name.toUpperCase()) {
                                        br[i - 1].item.push.apply(br[i - 1].item, br[i].item.slice());
                                        br.splice(i, 1);
                                }
                        }
                }
                var par = this.tree.length - 1;
                if (tr == 0)
                        this.tree = [];
                br_l = br.length;
                for (i = 0; i < br_l; i++) {
                        j = this.tree.length;
                        this.tree[j] = br[i];
                        this.tree[j].top = !i ? true : false;
                        this.tree[j].bot = i == br_l - 1 ? true : false;
                        if (tr == (p.base ? 1 : 0) && i == br_l - 1)
                                this.line_l = j;
                        this.tree[j].tr = tr;
                        this.tree[j].par = par;
                        this.tree[j].ix = j;
                        if (p.single_br)
                                this.tree[j].track = true;
                        if (!p.base && p.view_by == p.folder_view && !p.show_tracks) {
                                var n_id = this.tree[j].item[0];
                                if (lib.node[n_id].length == 1 || lib.node[n_id].length == 2 && !p.show_tracks)
                                        this.tree[j].track = true;
                        }
                        if (br[i].child.length > 0)
                                this.buildTree(br[i].child, tr + 1, node, p.base && tr == 0 ? true : false);
                }
                if (p.base && this.tree.length == 1)
                        this.line_l = 0;
                sbar.set_rows(this.tree.length);
                p.tree_paint();
        }

        this.load = function (list, type, add, send, sort) {
                var i = 0,
                np_item = -1,
                pid = -1,
                pln = plID(lib_playlist);
                plman.ActivePlaylist = pln;
                if (type) {
                        var items = p.items();
                        for (var i = 0; i < list.length; i++)
                                items.Add(p.list.Item(list[i]));
                } else
                        var items = list.Clone();
                if (fb.IsPlaying && !add && fb.GetNowPlaying()) {
                        for (i = 0; i < items.Count; i++)
                                if (fb.GetNowPlaying().Compare(items.Item(i))) {
                                        np_item = i;
                                        break;
                                }
                        if (np_item != -1) {
                                var np = plman.GetPlayingItemLocation();
                                if (np.IsValid && np.PlaylistIndex == pln)
                                        pid = np.PlaylistItemIndex;
                        }
                        if (np_item != -1 && pid == -1 && items.Count < 5000) {
                                if (ui.dui)
                                        plman.SetActivePlaylistContext();
                                for (i = 0; i < 20; i++) {
                                        fb.RunMainMenuCommand("Edit/Undo");
                                        var np = plman.GetPlayingItemLocation();
                                        if (np.IsValid && lib_playlist == plman.GetPlaylistName(np.PlaylistIndex)) {
                                                pid = np.PlaylistItemIndex;
                                                if (pid != -1)
                                                        break;
                                        }
                                }
                        }
                        if (np_item != -1 && pid != -1) {
                                plman.SetPlaylistSelectionSingle(pln, pid, true);
                                plman.RemovePlaylistSelection(pln, true);
                                var it = items.Clone();
                                items.RemoveRange(np_item, items.Count);
                                it.RemoveRange(0, np_item + 1);
                                plman.UndoBackup(pln);
                                plman.InsertPlaylistItems(pln, 0, items);
                                plman.InsertPlaylistItems(pln, plman.PlaylistItemCount(pln), it);
                        } else {
                                plman.UndoBackup(pln);
                                plman.ClearPlaylist(pln);
                                plman.InsertPlaylistItems(pln, 0, items);
                        }
                } else if (!add) {
                        plman.UndoBackup(pln);
                        plman.ClearPlaylist(pln);
                        plman.InsertPlaylistItems(pln, 0, items);
                } else {
                        if (items.Count < 5000 && plman.PlaylistItemCount(pln) < 5000 && sort) {
                                plman.UndoBackup(pln);
                                plman.InsertPlaylistItems(pln, plman.PlaylistItemCount(pln), items);
                                if (ui.dui)
                                        plman.SetActivePlaylistContext();
                                fb.RunMainMenuCommand("Edit/Remove Duplicates");
                                plman.SortByFormat(pln, p.view_by != p.folder_view ? p.grp_sort : lib.pth_sort);
                        } else {
                                plman.UndoBackup(pln);
                                plman.InsertPlaylistItems(pln, plman.PlaylistItemCount(pln), items);
                        }
                }
                if (autoplay && send) {
                        var c = (plman.PlaybackOrder == 3 || plman.PlaybackOrder == 4) ? Math.ceil(plman.PlaylistItemCount(pln) * Math.random() - 1) : 0;
                        plman.ExecutePlaylistDefaultAction(pln, c);
                }
        }

        this.draw = function (gr) {
                if (!pop.tree.length)
                        return gr.GdiDrawText(lib.none, ui.font, ui.textcol, ui.margin, p.s_h, ui.w - p.r_mg, ui.row_h * (lib.none.length > 14 ? 5 : 1), 0x00000004 | 0x00000400);
                var item_x = 0,
                item_y = 0,
                item_w = 0,
                ln_x = ui.margin + 5 + (p.base ? ui.pad : 0),
                nm = "",
                s = Math.round(sbar.delta / ui.row_h + 0.4),
                e = s + p.rows;
                e = this.tree.length < e ? this.tree.length : e,
                sel_x = 0,
                sel_w = 0,
                y1 = p.s_h - sbar.delta + p.node_y;
                check_node(gr);
                for (var i = s; i < e; i++) {
                        item_y = ui.row_h * i + p.s_h - sbar.delta;
                        if (ui.alternate) {
                                if (i % 2 == 0)
                                        gr.FillSolidRect(0, item_y + 1, ui.w, ui.row_h - 2, ui.b1);
                                else
                                        gr.FillSolidRect(0, item_y, ui.w, ui.row_h, ui.b2);
                        }
                        if (ui.node_style && ui.linecol) {
                                var end_br = [],
                                j = this.tree[i].tr,
                                l_x = 0,
                                l_y = item_y + ui.row_h / 2;
                                if (p.base)
                                        j -= 1;
                                var h1 = this.tree[i].top ? ui.row_h / 4 : ui.row_h;
                                if (this.tree[i].tr != 0) {
                                        var par = this.tree[i].par,
                                        pr_pr = [];
                                        for (var m = 1; m < j + 1; m++) {
                                                if (m == 1)
                                                        pr_pr[m] = par;
                                                else
                                                        pr_pr[m] = this.tree[pr_pr[m - 1]].par
                                                                if (this.tree[pr_pr[m]].bot)
                                                                        end_br[m] = true;
                                                                else
                                                                        end_br[m] = false;
                                        }
                                }
                                for (var k = 0; k < j + 1; k++) {
                                        if (this.tree[i].top && !k && !this.tree[i].track)
                                                h1 = ui.row_h / 2;
                                        else
                                                h1 = ui.row_h;
                                        if (!k && !j && this.tree[i].top && !this.tree[i].track)
                                                h1 = -ui.row_h / 4;
                                        if (this.tree[i].track && !k && this.tree[i].top)
                                                h1 = ui.row_h / 2
                                                        if (!end_br[k] && k == 1)
                                                                h1 = ui.row_h;
                                                        if (end_br[k])
                                                                h1 = 0;
                                                        var h3 = l_y - h1;
                                        if (h3 < p.s_h)
                                                h1 = p.s_h - h3;
                                        l_x = (Math.round(ui.pad * this.tree[i].tr + ui.margin) + 5) - ui.pad * k;
                                        var h2 = ((!this.tree[i].bot && !k && this.tree[i].track && i == Math.ceil(e - 1)) ||
                                                (!this.tree[i].bot && !end_br[k] && !this.tree[i].track && i == Math.ceil(e - 1)) ||
                                                (k && !end_br[k] && i == e - 1)) ? ui.row_h / 2 : 0;
                                        if (k != j)
                                                gr.FillSolidRect(l_x+2.5, l_y+3 - h1, 1, h1 + h2, ui.linecol);//                                        ___Y_LINE___
                                }
                        }
                }
                if (ui.node_style && ui.linecol) {
                        var top = p.base ? p.s_h + ui.row_h * 3 / 4 : p.s_h;
                        var ln_y = sbar.scroll == 0 ? top + p.node_y : p.s_h;
                        var ln_h = Math.min(this.line_l * ui.row_h - sbar.delta + (sbar.scroll == 0 ? (p.base ? -ui.row_h * 3 / 4 : 0) : p.node_y), ui.row_h * Math.ceil(p.rows) - (sbar.scroll == 0 ? (p.node_y + (p.base ? ui.row_h * 3 / 4 : 0)) : 0));
                        if (e == this.tree.length)
                                ln_h += ui.row_h / 4;
                        if (this.line_l)
            {}
                                gr.FillSolidRect(ln_x+3, ln_y, 1, ln_h, ui.linecol);//                                        ___X_LINE___
                }
                for (i = s; i < e; i++) {
                        if (this.tree[i].sel && ui.backcolsel != 0) {
                                item_y = ui.row_h * i + p.s_h - sbar.delta;
                                nm = this.tree[i].name + (show_counts && (!this.tree[i].track || !p.show_tracks) ? " (" + this.tree[i].item.length + ")" : "");
                                item_w = gr.CalcTextWidth(nm, ui.font) + ui.row_h * 0.2;
                                item_x = Math.round(ui.pad * this.tree[i].tr + ui.margin);
                                if (ui.node_style || !this.tree[i].track)
                                        item_x = item_x + ui.symbol_w;
                                sel_x = item_x - ui.sel;
                                sel_w = Math.min(item_w, ui.w - sel_x - 1 - p.r_mg)
                {}
                                        gr.FillSolidRect(sel_x, item_y, sel_w, ui.row_h, ui.backcolsel);
                        }
                }
                for (i = s; i < e; i++) {
                        item_y = ui.row_h * i + p.s_h - sbar.delta;
                        nm = this.tree[i].name + (show_counts && (!this.tree[i].track || !p.show_tracks) ? " (" + this.tree[i].item.length + ")" : "");
                        item_w = gr.CalcTextWidth(nm, ui.font) + ui.row_h * 0.2;
                        this.tree[i].w = item_w;
                        item_x = Math.round(ui.pad * this.tree[i].tr + ui.margin);
                        if (ui.node_style) {
                                var y2 = ui.row_h * i + y1 + 5;
                                if (!this.tree[i].track) {
                                        if (ui.linecol)
                                                gr.FillSolidRect(item_x + 25, y2+1, 4, 1, ui.linecol); //                                      X_LINE
                                        draw_node(gr, this.tree[i].child.length < 1, item_x, item_y + p.node_y);
                                } else if (ui.linecol)
                                        gr.FillSolidRect(item_x + 9, y2, 7, 1, ui.linecol);//                                      X_LINE
                        } else if (!this.tree[i].track)
                                gr.GdiDrawText(this.tree[i].child.length < 1 ? ui.expand : ui.collapse, ui.font, ui.textsymbcol, item_x, item_y, ui.w - item_x - p.r_mg, ui.row_h, p.lc);
                        if (ui.node_style || !this.tree[i].track)
                                item_x = item_x + ui.symbol_w;
                        if (m_i == i) {
                                sel_x = item_x - ui.sel;
                                sel_w = Math.min(item_w, ui.w - sel_x - 1 - p.r_mg);
                                gr.FillSolidRect(sel_x, item_y, sel_w, ui.row_h, ui.backcol_h);
                                gr.DrawRect(sel_x, item_y, sel_w, ui.row_h, 1, ui.framecol);
                        }
                        var txt_c = this.tree[i].sel ? ui.textselcol : m_i == i ? ui.textcol_h : ui.textcol;
                        gr.GdiDrawText(nm, ui.font, txt_c, item_x, item_y, ui.w - item_x - p.r_mg, ui.row_h, p.lc);
                }
        }

        this.lbtn_dn = function (x, y) {
                if (y < p.s_h)
                        return;
                var ix = this.get_ix(x, y, true, false);
                p.pos = ix;
                if (ix < this.tree.length && ix >= 0) {
                        var item = this.tree[ix],
                        mode = x > Math.round(ui.pad * item.tr + ui.margin) && x < Math.round(ui.pad * item.tr) + ui.symbol_w + ui.margin ? 0 : this.check_ix(item, x, y, false) ? 1 : 2,
                        xp = item.child.length > 0 ? 0 : 1;
                        switch (mode) {
                        case 0:
                                switch (xp) {
                                case 0:
                                        this.clear_child(item);
                                        break;
                                case 1:
                                        if (auto)
                                                this.branch_chg(item, false, true);
                                        var row = Math.round((y - p.s_h - ui.row_h * 0.5) / ui.row_h);
                                        this.branch(item, !p.base || ix ? false : true, true);
                                        if (auto)
                                                ix = item.ix
                                                        if (row + 1 + item.child.length > sbar.rows_drawn) {
                                                                if (item.child.length > (sbar.rows_drawn - 2))
                                                                        sbar.check_scroll(ix * ui.row_h);
                                                                else
                                                                        sbar.check_scroll(Math.min(ix * ui.row_h, (ix + 1 - sbar.rows_drawn + item.child.length) * ui.row_h));
                                                        }
                                                        break;
                                }
                                if (sbar.scroll > ix * ui.row_h)
                                        sbar.check_scroll(ix * ui.row_h);
                                break;
                        case 1:
                                if (!v.k(1))
                                        this.clear();
                                if (!item.sel)
                                        this.get_selection(ix, item.sel);
                                else if (v.k(1))
                                        this.get_selection(ix, item.sel);
                                p.tree_paint();
                                break;
                        }
                        if (this.check_ix(item, x, y, false)) { // on mouse lbn down sel
                                /*if (v.k(1))
                                        this.load(item.item, true, true, false, true);
                                else if (v.k(0))
                                        this.load(this.sel_items, true, false, false, true);
                                else
                                        this.load(item.item, true, false, false, true);*/ // send to pl on left mouse btn
                        }
                } else
                        this.get_selection(-1);
        }

        this.lbtn_dblclk = function (x, y) {
                if (y < p.s_h)
                        return;
                var ix = this.get_ix(x, y, true, false);
                if (ix >= this.tree.length || ix < 0)
                        return;
                var item = this.tree[ix];
                if (!this.check_ix(item, x, y, false))
                        return;
                var mp = 1;
                if (!dbl_action) {
                        if (item.child.length)
                                mp = 0;
                        switch (mp) {
                        case 0:
                                this.clear_child(item);
                                break;
                        case 1:
                                if (auto)
                                        this.branch_chg(item, false, true);
                                var row = Math.round((y - p.s_h - ui.row_h * 0.5) / ui.row_h);
                                this.branch(item, !p.base || ix ? false : true, true);
                                if (auto)
                                        ix = item.ix
                                                if (row + 1 + item.child.length > sbar.rows_drawn) {
                                                        if (item.child.length > (sbar.rows_drawn - 2))
                                                                sbar.check_scroll(ix * ui.row_h);
                                                        else
                                                                sbar.check_scroll(Math.min(ix * ui.row_h, (ix + 1 - sbar.rows_drawn + item.child.length) * ui.row_h));
                                                }
                                                break;
                        }
                        if (sbar.scroll > ix * ui.row_h)
                                sbar.check_scroll(ix * ui.row_h);
                }
                if (dbl_action || !dbl_action && mp == 1 && !item.child.length) {
                        this.load(item.item, true, false, false, true);/// add??? //send to pl on mouse double clk
                        var pln = plID(lib_playlist);
                        plman.ActivePlaylist = pln;
                        var c = (plman.PlaybackOrder == 3 || plman.PlaybackOrder == 4) ? Math.ceil(plman.PlaylistItemCount(pln) * Math.random() - 1) : 0;
                        plman.ExecutePlaylistDefaultAction(pln, c);
                }
        }

        this.get_selection = function (idx, state, add, bypass) {
                var sel_type = idx == -1 && !add ? 0 : v.k(0) && last_sel > -1 && !bypass ? 1 : v.k(1) && !bypass ? 2 : !state ? 3 : 0;
                switch (sel_type) {
                case 0:
                        this.clear();
                        this.sel_items = [];
                        break;
                case 1:
                        this.sel_items = [];
                        var direction = (idx > last_sel) ? 1 : -1;
                        if (!v.k(1))
                                this.clear();
                        for (var i = last_sel; ; i += direction) {
                                this.tree[i].sel = true;
                                this.sel_items.push.apply(this.sel_items, this.tree[i].item);
                                if (i == idx)
                                        break;
                        }
                        this.sel_items = uniq(this.sel_items);
                        p.tree_paint();
                        break;
                case 2:
                        this.tree[idx].sel = !this.tree[idx].sel;
                        this.tree[idx].sel && this.sel_items.push.apply(this.sel_items, this.tree[idx].item);
                        this.sel_items = uniq(this.sel_items);
                        last_sel = idx;
                        break;
                case 3:
                        this.sel_items = [];
                        if (!add)
                                this.clear();
                        if (!add)
                                this.tree[idx].sel = true;
                        this.sel_items.push.apply(this.sel_items, this.tree[idx].item);
                        this.sel_items = uniq(this.sel_items);
                        last_sel = idx;
                        break;
                }
        }

        this.move = function (x, y) {
                var ix = -1;
                m_i = -1;
                get_pos = -1;
                ix = this.get_ix(x, y, false, false);
                if (ix != -1) {
                        m_i = ix;
                        get_pos = ix;
                        if (p.tooltip && tt_id != ix && Math.round(ui.pad * this.tree[ix].tr + ui.margin) + (!ui.node_style && this.tree[ix].track ? 0 : ui.symbol_w) + this.tree[ix].w - ui.row_h * 0.2 > ui.w - p.r_mg) {
                                var row = Math.round((y - p.s_h - ui.row_h * 0.5) / ui.row_h);
                                this.activate_tooltip(ix, row);
                        }
                } else
                        get_pos = this.get_ix(x, y, true, false);
                if (ix == ix_o)
                        return;
                tt_id = -1;
                if (p.tooltip && tt.Text)
                        this.deactivate_tooltip();
                if (!sbar.draw_timer)
                        p.tree_paint();
                ix_o = ix;
        }

        this.get_ix = function (x, y, simple, type) {
                var ix;
                if (y > p.s_h)
                        ix = Math.round((y + (simple ? sbar.scroll : sbar.delta) - p.s_h - ui.row_h * 0.5) / ui.row_h);
                else
                        ix = -1;
                if (simple)
                        return ix;
                if (this.tree.length > ix && ix >= 0 && x < ui.w - 10 && y > p.s_h && this.check_ix(this.tree[ix], x, y, type))
                        return ix;
                else
                        return -1;
        }

        this.check_ix = function (br, x, y, type) {
                if (!br)
                        return false;
                return type ? (x > Math.round(ui.pad * br.tr + ui.margin) && x < Math.round(ui.pad * br.tr + ui.margin) + br.w + ui.symbol_w)
                : (x > Math.round(ui.pad * br.tr + ui.margin) + (!ui.node_style && br.track ? 0 : ui.symbol_w)) && x < Math.min(Math.round(ui.pad * br.tr + ui.margin) + (!ui.node_style && br.track ? 0 : ui.symbol_w) + br.w, ui.w - Math.max(ui.scr_w, ui.margin));
        }

        this.on_key_down = function (vkey) {
                if (p.s_search)
                        return;
                switch (vkey) {
                case v.left:
                        if (!(p.pos >= 0) && get_pos != -1)
                                p.pos = get_pos
                        else
                                                p.pos = p.pos + this.tree.length % this.tree.length;
                                        p.pos = Math.max(Math.min(p.pos, this.tree.length - 1), 0);
                        get_pos = -1;
                        m_i = -1;
                        if (this.tree[p.pos].child.length > 0) {
                                var item = this.tree[p.pos];
                                this.clear_child(item);
                                this.get_selection(item.ix);
                                m_i = p.pos = item.ix;
                        } else {
                                try {
                                        var item = this.tree[this.tree[p.pos].par];
                                        this.clear_child(item);
                                        this.get_selection(item.ix);
                                        m_i = p.pos = item.ix;
                                } catch (e) {
                                        return;
                                };
                        }
                        p.tree_paint();
                        this.load(this.sel_items, true, false, false, true);
                        sbar.set_rows(this.tree.length);
                        if (sbar.scroll > p.pos * ui.row_h)
                                sbar.check_scroll(p.pos * ui.row_h);
                        break;
                case v.right:
                        if (!(p.pos >= 0) && get_pos != -1)
                                p.pos = get_pos
                        else
                                                p.pos = p.pos + this.tree.length % this.tree.length;
                                        p.pos = Math.max(Math.min(p.pos, this.tree.length - 1), 0);
                        get_pos = -1;
                        m_i = -1;
                        var item = this.tree[p.pos];
                        if (auto)
                                this.branch_chg(item, false, true);
                        this.branch(item, p.base && p.pos == 0 ? true : false, true);
                        this.get_selection(item.ix);
                        p.tree_paint();
                        m_i = p.pos = item.ix;
                        this.load(this.sel_items, true, false, false, true);
                        sbar.set_rows(this.tree.length);
                        var row = (p.pos * ui.row_h - sbar.scroll) / ui.row_h;
                        if (row + item.child.length > sbar.rows_drawn) {
                                if (item.child.length > (sbar.rows_drawn - 2))
                                        sbar.check_scroll(p.pos * ui.row_h);
                                else
                                        sbar.check_scroll(Math.min(p.pos * ui.row_h, (p.pos + 1 - sbar.rows_drawn + item.child.length) * ui.row_h));
                        }
                        break;
                case v.pgUp:
                        if (this.tree.length == 0)
                                break;
                        p.pos = Math.round(sbar.scroll / ui.row_h + 0.4) - Math.floor(p.rows);
                        p.pos = Math.max(!p.base ? 0 : 1, p.pos);
                        sbar.wheel(1);
                        this.get_selection(this.tree[p.pos].ix);
                        p.tree_paint();
                        this.load(this.sel_items, true, false, false, true);
                        break;
                case v.pgDn:
                        if (this.tree.length == 0)
                                break;
                        p.pos = Math.round(sbar.scroll / ui.row_h + 0.4);
                        p.pos = p.pos + Math.floor(p.rows) * 2 - 1;
                        p.pos = this.tree.length < p.pos ? this.tree.length - 1 : p.pos;
                        sbar.wheel(-1);
                        this.get_selection(this.tree[p.pos].ix);
                        p.tree_paint();
                        this.load(this.sel_items, true, false, false, true);
                        break;
                case v.home:
                        if (this.tree.length == 0)
                                break;
                        p.pos = !p.base ? 0 : 1;
                        sbar.check_scroll(0);
                        this.get_selection(this.tree[p.pos].ix);
                        p.tree_paint();
                        this.load(this.sel_items, true, false, false, true);
                        break;
                case v.end:
                        if (this.tree.length == 0)
                                break;
                        p.pos = this.tree.length - 1;
                        sbar.check_scroll((this.tree.length) * ui.row_h);
                        this.get_selection(this.tree[p.pos].ix);
                        p.tree_paint();
                        this.load(this.sel_items, true, false, false, true);
                        break;
                case v.enter:
                        if (!this.sel_items.length)
                                return;
                        //this.load = function (list, type, add, send, sort)
                       
                        /*this.load(this.sel_items, true, false, false, true); /// --->send to pl on enter down
                        var pln = plID(lib_playlist);
                        plman.ActivePlaylist = pln;
                        var c = (plman.PlaybackOrder == 3 || plman.PlaybackOrder == 4) ? Math.ceil(plman.PlaylistItemCount(pln) * Math.random() - 1) : 0;
                        plman.ExecutePlaylistDefaultAction(pln, c);*/
                       
                                          //list, type, add, send, sort
                        this.load(this.sel_items, true, true, false, false); /// --->add to pl on enter down
                        var pln = plID(lib_playlist);
                        plman.ActivePlaylist = pln;
                        //var c = (plman.PlaybackOrder == 3 || plman.PlaybackOrder == 4) ? Math.ceil(plman.PlaylistItemCount(pln) * Math.random() - 1) : 0;
                        //plman.ExecutePlaylistDefaultAction(pln, c);
                        //p.update;
                        fb.RunMainMenuCommand("Edit/Remove Duplicates");
                        break;
                case v.dn:
                case v.up:
                        if (this.tree.length == 0)
                                break;
                        if ((p.pos == 0 && get_pos == -1 && vkey == v.up) || (p.pos == this.tree.length - 1 && vkey == v.dn)) {
                                this.get_selection(-1);
                                break;
                        }
                        if (get_pos != -1)
                                p.pos = get_pos;
                        else
                                p.pos = p.pos + this.tree.length % this.tree.length;
                        get_pos = -1;
                        m_i = -1;
                        if (vkey == v.dn)
                                p.pos++;
                        if (vkey == v.up)
                                p.pos--;
                        p.pos = Math.max(Math.min(p.pos, this.tree.length - 1), 0);
                        var row = (p.pos * ui.row_h - sbar.scroll) / ui.row_h;
                        if (sbar.rows_drawn - row < 3)
                                sbar.check_scroll((p.pos + 3) * ui.row_h - sbar.rows_drawn * ui.row_h);
                        else if (row < 2 && vkey == v.up)
                                sbar.check_scroll((p.pos - 1) * ui.row_h);
                        m_i = p.pos;
                        this.get_selection(p.pos);
                        p.tree_paint();
                        this.load(this.sel_items, true, false, false, true);
                        break;
                }
        }
}
var pop = new populate();

function on_size() {
        ui.w = window.Width;
        ui.h = window.Height;
        ww = window.Width;
        wh = window.Height;
        if (!ui.w || !ui.h)
                return;

        // set wallpaper
        if (fb.IsPlaying) {
                g_wallpaperImg = setWallpaperImg(ppt.wallpaperpath, fb.GetNowPlaying());
        };
        else {
                //g_wallpaperImg = null;
                g_wallpaperImg = setWallpaperImg(ppt.wallpaperpath, fb.GetNowPlaying());
        };

        ui.get_font();
        p.on_size();
        pop.create_tooltip();
        if (p.s_show || ui.scrollbar_show)
                but.refresh(true);
        jS.on_size();
}

function searchLibrary() {
        var cx = 0,
        doc = new ActiveXObject('htmlfile'),
        e = 0,
        i = 0,
        lbtn_dn = false,
        lg = [],
        log = [],
        offset = 0,
        s = 0,
        shift = false,
        shift_x = 0,
        txt_w = 0;
        var calc_text = function () {
                var im = gdi.CreateImage(1, 1),
                g = im.GetGraphics();
                txt_w = g.CalcTextWidth(p.s_txt.substr(offset), ui.font);
                im.ReleaseGraphics(g);
                im.Dispose();
        }
        var drawcursor = function (gr) {
                if (p.s_search && p.s_cursor && s == e && cx >= offset) {
                        var x1 = p.s_x + get_cursor_x(cx),
                        x2 = x1;
                        gr.DrawLine(x1, p.s_sp * 0.1, x2, p.s_sp * 0.85, 1, ui.textcol);
                }
        }
        var drawsel = function (gr) {
                if (s == e)
                        return;
                var clamp = p.s_x + p.s_w2;
                gr.DrawLine(Math.min(p.s_x + get_cursor_x(s), clamp), p.s_sp / 2, Math.min(p.s_x + get_cursor_x(e), clamp), p.s_sp / 2, ui.row_h - 3, ui.ibeamcol2);
        }
        var get_cursor_pos = function (x) {
                var im = gdi.CreateImage(1, 1),
                g = im.GetGraphics(),
                nx = x - p.s_x,
                pos = 0;
                for (i = offset; i < p.s_txt.length; i++) {
                        pos += g.CalcTextWidth(p.s_txt.substr(i, 1), ui.font);
                        if (pos >= nx + 3)
                                break;
                }
                im.ReleaseGraphics(g);
                im.Dispose();
                return i;
        }
        var get_cursor_x = function (pos) {
                var im = gdi.CreateImage(1, 1),
                g = im.GetGraphics(),
                x = 0;
                if (pos >= offset)
                        x = g.CalcTextWidth(p.s_txt.substr(offset, pos - offset), ui.font);
                im.ReleaseGraphics(g);
                im.Dispose();
                return x;
        }
        var get_offset = function (gr) {
                var t = gr.CalcTextWidth(p.s_txt.substr(offset, cx - offset), ui.font);
                while (t >= p.s_w2) {
                        offset++;
                        t = gr.CalcTextWidth(p.s_txt.substr(offset, cx - offset), ui.font);
                }
        }
        var record = function () {
                lg.push(p.s_txt);
                log = [];
                if (lg.length > 30)
                        lg.shift();
        }
        this.clear = function () {
                lib.time.Reset();
                offset = s = e = cx = 0;
                p.s_cursor = false;
                p.s_search = false;
                p.s_txt = "";
                p.search_paint();
                timer.reset(timer.search_cursor, 4);
                lib.rootNodes();
        }
        this.on_key_up = function (vkey) {
                if (!p.s_search)
                        return;
                if (vkey == v.shift) {
                        shift = false;
                        shift_x = cx;
                }
        }
        this.lbtn_up = function (x, y) {
                if (s != e)
                        timer.reset(timer.search_cursor, 4);
                lbtn_dn = false;
        }
        this.move = function (x, y) {
                if (y > p.s_h || !lbtn_dn)
                        return;
                var t = get_cursor_pos(x),
                t_x = get_cursor_x(t);
                calc_text();
                if (t < s) {
                        if (t < e) {
                                if (t_x < p.s_x)
                                        if (offset > 0)
                                                offset--;
                        } else if (t > e) {
                                if (t_x + p.s_x > p.s_x + p.s_w2) {
                                        var l = (txt_w > p.s_w2) ? txt_w - p.s_w2 : 0;
                                        if (l > 0)
                                                offset++;
                                }
                        }
                        e = t;
                } else if (t > s) {
                        if (t_x + p.s_x > p.s_x + p.s_w2) {
                                var l = (txt_w > p.s_w2) ? txt_w - p.s_w2 : 0;
                                if (l > 0)
                                        offset++;
                        }
                        e = t;
                }
                cx = t;
                p.search_paint();
        }
        this.rbtn_up = function (x, y) {
                men.search_menu(x, y, s, e, doc.parentWindow.clipboardData.getData('text') ? true : false)
        }

        this.lbtn_dn = function (x, y) {
                p.search_paint();
                lbtn_dn = p.s_search = (y < p.s_h && x > ui.margin + ui.row_h * 0.6 && x < p.s_x + p.s_w2);
                if (!lbtn_dn) {
                        offset = s = e = cx = 0;
                        timer.reset(timer.search_cursor, 4);
                        return;
                } else {
                        if (shift) {
                                s = cx;
                                e = cx = get_cursor_pos(x);
                        } else {
                                cx = get_cursor_pos(x);
                                s = e = cx;
                        }
                        timer.reset(timer.search_cursor, 4);
                        p.s_cursor = true;
                        timer.search_cursor = window.SetInterval(function () {
                                        p.s_cursor = !p.s_cursor;
                                        p.search_paint();
                                }, 530);
                }
                p.search_paint();
        }

        this.on_char = function (code, force) {
                var text = String.fromCharCode(code);
                if (force)
                        p.s_search = true;
                if (!p.s_search)
                        return;
                p.s_cursor = false;
                p.pos = -1;
                switch (code) {
                case v.enter:
                        if (p.s_txt.length < 3)
                                break;
                        var items = fb.GetQueryItems(lib.list, p.s_txt);
                        pop.load(items, false, false, false, true);
                        items.Dispose();
                        break;
                case v.redo:
                        lg.push(p.s_txt);
                        if (lg.length > 30)
                                lg.shift();
                        if (log.length > 0) {
                                p.s_txt = log.pop() + "";
                                cx++
                        }
                        break;
                case v.undo:
                        log.push(p.s_txt);
                        if (log.length > 30)
                                lg.shift();
                        if (lg.length > 0)
                                p.s_txt = lg.pop() + "";
                        break;
                case v.selAll:
                        s = 0;
                        e = p.s_txt.length;
                        break;
                case v.copy:
                        if (s != e)
                                doc.parentWindow.clipboardData.setData('text', p.s_txt.substring(s, e));
                        break;
                case v.cut:
                        if (s != e)
                                doc.parentWindow.clipboardData.setData('text', p.s_txt.substring(s, e));
                case v.back:
                        record();
                        if (s == e) {
                                if (cx > 0) {
                                        p.s_txt = p.s_txt.substr(0, cx - 1) + p.s_txt.substr(cx, p.s_txt.length - cx);
                                        if (offset > 0)
                                                offset--;
                                        cx--;
                                }
                        } else {
                                if (e - s == p.s_txt.length) {
                                        p.s_txt = "";
                                        cx = 0;
                                } else {
                                        if (s > 0) {
                                                var st = s,
                                                en = e;
                                                s = Math.min(st, en);
                                                e = Math.max(st, en);
                                                p.s_txt = p.s_txt.substring(0, s) + p.s_txt.substring(e, p.s_txt.length);
                                                cx = s;
                                        } else {
                                                p.s_txt = p.s_txt.substring(e, p.s_txt.length);
                                                cx = s;
                                        }
                                }
                        }
                        calc_text();
                        offset = offset >= e - s ? offset - e + s : 0;
                        s = cx;
                        e = s;
                        break;
                case v.del:
                        record();
                        if (s == e) {
                                if (cx < p.s_txt.length) {
                                        p.s_txt = p.s_txt.substr(0, cx) + p.s_txt.substr(cx + 1, p.s_txt.length - cx - 1);
                                }
                        } else {
                                if (e - s == p.s_txt.length) {
                                        p.s_txt = "";
                                        cx = 0;
                                } else {
                                        if (s > 0) {
                                                var st = s,
                                                en = e;
                                                s = Math.min(st, en);
                                                e = Math.max(st, en);
                                                p.s_txt = p.s_txt.substring(0, s) + p.s_txt.substring(e, p.s_txt.length);
                                                cx = s;
                                        } else {
                                                p.s_txt = p.s_txt.substring(e, p.s_txt.length);
                                                cx = s;
                                        }
                                }
                        }
                        calc_text();
                        offset = offset >= e - s ? offset - e + s : 0;
                        s = cx;
                        e = s;
                        break;
                case v.paste:
                        text = doc.parentWindow.clipboardData.getData('text');
                default:
                        record();
                        if (s == e) {
                                p.s_txt = p.s_txt.substring(0, cx) + text + p.s_txt.substring(cx);
                                cx += text.length;
                                e = s = cx;
                        } else {
                                p.s_txt = p.s_txt.substring(0, s) + text + p.s_txt.substring(e);
                                cx = s + text.length;
                                e = s;
                        }
                        break;
                }
                if (!timer.search_cursor)
                        timer.search_cursor = window.SetInterval(function () {
                                        p.s_cursor = !p.s_cursor;
                                        p.search_paint();
                                }, 530);
                p.search_paint();
                lib.upd_search = true;
                timer.reset(timer.search, 3);
                timer.search = window.SetTimeout(function () {
                                lib.time.Reset();
                                lib.rootNodes();
                                timer.reset(timer.search, 3);
                        }, 160);
        }

        this.on_key_down = function (vkey) {
                if (!p.s_search)
                        return;
                switch (vkey) {
                case v.left:
                case v.right:
                        if (vkey == v.left) {
                                if (offset > 0) {
                                        if (cx <= offset) {
                                                offset--;
                                                cx--;
                                        } else
                                                cx--;
                                } else if (cx > 0)
                                        cx--;
                                s = e = cx
                        }
                        if (vkey == v.right && cx < p.s_txt.length)
                                cx++;
                        s = e = cx;
                        if (shift) {
                                s = Math.min(cx, shift_x);
                                e = Math.max(cx, shift_x);
                        }
                        p.s_cursor = true;
                        timer.reset(timer.search_cursor, 4);
                        timer.search_cursor = window.SetInterval(function () {
                                        p.s_cursor = !p.s_cursor;
                                        p.search_paint();
                                }, 530);
                        break;
                case v.home:
                case v.end:
                        if (vkey == v.home)
                                offset = s = e = cx = 0;
                        else
                                s = e = cx = p.s_txt.length;
                        p.s_cursor = true;
                        timer.reset(timer.search_cursor, 4);
                        timer.search_cursor = window.SetInterval(function () {
                                        p.s_cursor = !p.s_cursor;
                                        p.search_paint();
                                }, 530);
                        break;
                case v.shift:
                        shift = true;
                        shift_x = cx;
                        break;
                case v.del:
                        this.on_char(v.del);
                        break;
                }
                p.search_paint();
        }

        this.draw = function (gr) {
                s = Math.min(Math.max(s, 0), p.s_txt.length);
                e = Math.min(Math.max(e, 0), p.s_txt.length);
                cx = Math.min(Math.max(cx, 0), p.s_txt.length);
                if (ui.fill)
                        gr.FillSolidRect(0, 1, ui.w, ui.row_h - 4, 0x60000000);
                if (ui.pen == 1)
                        gr.DrawLine(ui.margin, p.s_sp, p.s_w1, p.s_sp, 1, ui.s_linecol);
                if (ui.pen == 2)
                        gr.DrawRoundRect(0, 2, ui.w - 1, ui.row_h - 4, 4, 4, 1, ui.pen_c);
                if (p.s_txt) {
                        e = (e < p.s_txt.length) ? e : p.s_txt.length;
                        drawsel(gr);
                        get_offset(gr);
                        gr.GdiDrawText(p.s_txt.substr(offset), ui.font, ui.searchcol, p.s_x, 0, p.s_w2, p.s_sp, p.l);
                } else
                        gr.GdiDrawText("Search", ui.s_font, ui.txt_box, p.s_x, 0, p.s_w2, p.s_sp, p.l);
                drawcursor(gr);
                if (p.s_show > 1) {
                        var l_x = p.f_x1 - 9,
                        l_h = Math.round(p.s_sp / 2);
                        gr.gdiDrawText(p.filt[p.filter_by].name, p.f_font, ui.txt_box, p.f_x1, 0, p.f_w[p.filter_by], p.s_sp, p.cc);
                        gr.FillGradRect(l_x, 0, 1, l_h, 90, RGBA(0, 0, 0, 0), ui.s_linecol);
                        gr.FillGradRect(l_x, l_h, 1, l_h, 90, ui.s_linecol, RGBA(0, 0, 0, 0));
                }
        }
}
if (p.s_show)
        var sL = new searchLibrary();

var j_Search = function () {
        var j_x = 5,
        j_h = 30,
        j_y = 5,
        jSearch = "",
        jump_search = true,
        rs1 = 5,
        rs2 = 4;
        this.on_size = function () {
                j_x = Math.round(ui.w / 2),
                j_h = Math.round(ui.row_h * 1.5),
                j_y = Math.round((ui.h - j_h) / 2);
                rs1 = Math.min(5, j_h / 2);
                rs2 = Math.min(4, (j_h - 2) / 2);
        }

        this.on_char = function (code) {
                var text = String.fromCharCode(code);
                if (!p.s_search) {
                        var found = false,
                        i = 0,
                        pos = -1;
                        switch (code) {
                        case v.back:
                                jSearch = jSearch.substr(0, jSearch.length - 1);
                                break;
                        case v.enter:
                                jSearch = "";
                                return;
                        default:
                                jSearch += text;
                                break;
                        }
                        var l = pop.tree.length;
                        for (i = 0; i < l; i++)
                                pop.tree[i].sel = false;
                        if (!jSearch)
                                return;
                        pop.sel_items = [];
                        jump_search = true;
                        window.RepaintRect(0, j_y, ui.w, j_h + 1);
                        timer.reset(timer.jsearch, 2);
                        timer.jsearch = window.SetTimeout(function () {
                                        for (i = 0; i < l; i++) {
                                                if (pop.tree[i].name.substring(0, jSearch.length).toLowerCase() == jSearch.toLowerCase()) {
                                                        found = true;
                                                        pos = i;
                                                        pop.tree[i].sel = true;
                                                        pop.sel_items.push.apply(pop.sel_items, pop.tree[i].item);
                                                        break;
                                                }
                                        }
                                        if (!found)
                                                jump_search = false;
                                        p.tree_paint();
                                        sbar.check_scroll((pos - 5) * ui.row_h);
                                        timer.reset(timer.jsearch, 2);
                                }, 500);

                        timer.reset(timer.clear_jsearch, 0);
                        timer.clear_jsearch = window.SetTimeout(function () {
                                        if (found)
                                                pop.load(pop.sel_items, true, false, false, true);
                                        jSearch = "";
                                        window.RepaintRect(0, j_y, ui.w, j_h + 1);
                                        timer.reset(timer.clear_jsearch, 0);
                                }, 5000);//1200 jump search timer
                }
        }

        this.draw = function (gr) {
                if (jSearch) {
                        gr.SetSmoothingMode(4);
                        var j_w = gr.CalcTextWidth(jSearch, ui.j_font) + 25;
                        gr.FillRoundRect(j_x - j_w / 2, j_y, j_w, j_h, rs1, rs1, 0x96000000);
                        gr.DrawRoundRect(j_x - j_w / 2, j_y, j_w, j_h, rs1, rs1, 1, 0x64000000);
                        gr.DrawRoundRect(j_x - j_w / 2 + 1, j_y + 1, j_w - 2, j_h - 2, rs2, rs2, 1, 0x28ffffff);
                        gr.GdiDrawText(jSearch, ui.j_font, RGB(0, 0, 0), j_x - j_w / 2 + 1, j_y + 1, j_w, j_h, p.cc);
                        gr.GdiDrawText(jSearch, ui.j_font, jump_search ? 0xfffafafa : 0xffff4646, j_x - j_w / 2, j_y, j_w, j_h, p.cc);
                }
        }
}
var jS = new j_Search();

function on_paint(gr) {
        if (ui.bg)
                gr.FillSolidRect(0, 0, ui.w, ui.h, ui.backcol);

        if (fb.IsPlaying && g_wallpaperImg && ppt.showwallpaper) {
                gr.GdiDrawBitmap(g_wallpaperImg, 0, 0, ww, wh, 0, 0, g_wallpaperImg.Width, g_wallpaperImg.Height);
                gr.FillSolidRect(0, 0, ww, wh, g_color_normal_bg & RGBA(255, 255, 255, ppt.wallpaperalpha));
        };
        else {
                gr.FillSolidRect(0, 0, ww, wh, g_color_normal_bg);
                if (g_wallpaperImg && ppt.showwallpaper) {
                        gr.GdiDrawBitmap(g_wallpaperImg, 0, 0, ww, wh, 0, 0, g_wallpaperImg.Width, g_wallpaperImg.Height);
                        gr.FillSolidRect(0, 0, ww, wh, g_color_normal_bg & RGBA(255, 255, 255, ppt.wallpaperalpha));
                };
                else {
                        gr.FillSolidRect(0, 0, ww, wh, g_color_normal_bg);
                };

        };

        if (lib.upd) {
                lib.refresh();
                lib.upd = false;
                return;
        }
        if (p.s_show)
                sL.draw(gr);
        pop.draw(gr);
        if (p.s_show || ui.scrollbar_show)
                but.draw(gr);
        if (ui.scrollbar_show)
                sbar.draw(gr);
        jS.draw(gr);
}

function button_manager() {
        var b_x,
        b_h,
        but_tt = window.CreateTooltip("Segoe UI", 15, 0),
        bx,
        by,
        bh,
        byDn,
        byUp,
        fw,
        i,
        qx,
        qy,
        qh,
        s_img = [],
        scr = [];
        this.btns = [];
        this.b = null;
        var browser = function (c) {
                if (!run(c))
                        fb.ShowPopupMessage("Unable to launch your default browser.", "Library Tree");
        }
        var run = function (c) {
                try {
                        var WshShell = new ActiveXObject("WScript.Shell");
                        WshShell.Run(c);
                        return true;
                } catch (e) {
                        return false;
                }
        }
        var tooltip = function (n) {
                if (but_tt.text == n)
                        return;
                but_tt.text = n;
                but_tt.activate();
        }
        this.lbtn_dn = function (x, y) {
                if (!this.b)
                        return false;
                this.btns[this.b].lbtn_dn(x, y);
                return true;
        }
        this.lbtn_up = function (x, y) {
                if (!this.b)
                        return false;
                this.btns[this.b].lbtn_up(x, y);
                return true;
        }
        this.leave = function () {
                if (this.b)
                        this.btns[this.b].changestate("normal");
                this.b = null;
                tooltip("");
        }

        this.create_images = function () {
                var c,
                g;
                for (var j = 0; j < 2; j++) {
                        c = j ? 0xe4ffffff : 0x99ffffff;
                        s_img[j] = gdi.CreateImage(100, 100);
                        g = s_img[j].GetGraphics();
                        g.SetSmoothingMode(2);
                        if (!ui.local) {
                                g.DrawLine(69, 71, 88, 90, 12, ui.txt_box & c);
                                g.DrawEllipse(8, 11, 67, 67, 10, ui.txt_box & c);
                        } else {
                                g.DrawLine(69, 71, 88, 90, 12, ui.txt_box);
                                g.DrawEllipse(8, 11, 67, 67, 10, ui.txt_box);
                        }
                        g.FillEllipse(15, 17, 55, 55, 0x0AFAFAFA);
                        g.SetSmoothingMode(0);
                        s_img[j].ReleaseGraphics(g);
                }
                for (var j = 0; j < 2; j++) {
                        scr[j] = gdi.CreateImage(100, 100);
                        g = scr[j].GetGraphics();
                        g.SetSmoothingMode(2);
                        g.FillPolygon(RGBA(200, 200, 200, j ? 192 : 75), 1, [50, 0, 93, 76, 6, 76]);
                        g.SetSmoothingMode(0);
                        scr[j].ReleaseGraphics(g);
                }
        };
        this.create_images();

        this.draw = function (gr) {
                for (i in this.btns) {
                        if ((p.s_show == 1 || p.s_show > 1 && !p.s_txt) && i == "s_img")
                                this.btns[i].draw(gr);
                        if (p.s_show == 1 && i == "cross1")
                                this.btns[i].draw(gr);
                        if (p.s_show > 1 && p.s_txt && i == "cross2")
                                this.btns[i].draw(gr);
                        if (p.s_show > 1 && i == "filter")
                                this.btns[i].draw(gr);
                        if (i == "scrollUp" || i == "scrollDn")
                                this.btns[i].draw(gr);
                }
        }

        this.move = function (x, y) {
                var b = null,
                hand = false;
                for (i in this.btns) {
                        if ((p.s_show == 1 || p.s_show > 1 && !p.s_txt) && i == "s_img" && this.btns[i].trace(x, y)) {
                                b = i;
                                hand = true;
                        }
                        if (p.s_show == 1 && i == "cross1" && this.btns[i].trace(x, y)) {
                                b = i;
                                hand = true;
                        }
                        if (p.s_show > 1 && p.s_txt && i == "cross2" && this.btns[i].trace(x, y)) {
                                b = i;
                                hand = true;
                        }
                        if (p.s_show > 1 && i == "filter" && this.btns[i].trace(x, y)) {
                                b = i;
                                hand = true;
                        }
                        if ((i == "scrollUp" || i == "scrollDn") && this.btns[i].trace(x, y))
                                b = i;
                }
                window.SetCursor(hand ? 32649 : y < p.s_h && p.s_show && x > qx + qh ? 32513 : 32512);
                if (this.b == b)
                        return this.b;
                if (b)
                        this.btns[b].changestate("hover");
                if (this.b)
                        this.btns[this.b].changestate("normal");
                this.b = b;
                if (!this.b)
                        tooltip("");
                return this.b;
        }

        var btn = function (x, y, w, h, type, ft, txt, stat, img_src, l_dn, l_up, tooltext) {
                this.draw = function (gr) {
                        switch (type) {
                        case 3:
                                gr.SetInterpolationMode(2);
                                if (this.img)
                                        gr.DrawImage(this.img, this.x, this.y, this.w, this.h, 0, 0, this.img.Width, this.img.Height);
                                gr.SetInterpolationMode(0);
                                break;
                        case 4:
                                gr.DrawLine(Math.round(this.x + bh * 0.67), Math.round(this.y + bh * 0.67), Math.round(this.x + bh * 0.27), Math.round(this.y + bh * 0.27), Math.round(bh / 10), RGBA(136, 136, 136, this.img));
                                gr.DrawLine(Math.round(this.x + bh * 0.67), Math.round(this.y + bh * 0.27), Math.round(this.x + bh * 0.27), Math.round(this.y + bh * 0.67), Math.round(bh / 10), RGBA(136, 136, 136, this.img));
                                break;
                        case 5:
                                gr.SetTextRenderingHint(3);
                                gr.DrawString(txt, ft, this.img, this.x, this.y - 1, this.w, this.h, StringFormat(2, 1));
                                break;
                        default:
                                if (this.img && sbar.scrollable_lines > 0)
                                        gr.DrawImage(this.img, this.x, this.y, this.w, this.h, 0, 0, this.img.Width, this.img.Height, type == 1 ? 0 : 180);
                                break;
                        }
                }
                this.trace = function (x, y) {
                        return x > this.x && x < this.x + this.w && y > this.y && y < this.y + this.h;
                }
                this.lbtn_dn = function () {
                        this.l_dn && this.l_dn(x, y);
                }
                this.lbtn_up = function () {
                        this.l_up && this.l_up(x, y);
                }

                this.changestate = function (state) {
                        if (state == "hover") {
                                this.img = this.img_hover;
                                tooltip(this.tooltext);
                        } else {
                                this.img = this.img_normal;
                        }
                        try{
                        window.RepaintRect(this.x, this.y, this.w, this.h);
                        }catch(e){}
                }
                this.x = x;
                this.y = y;
                this.w = w;
                this.h = h;
                this.l_dn = l_dn;
                this.l_up = l_up;
                this.tooltext = tooltext;
                this.img_normal = img_src.normal;
                this.img_hover = img_src.hover || this.img_normal;
                this.img = this.img_normal;
        }

        this.refresh = function (upd) {
                if (upd) {
                        bx = p.s_w1 - Math.round(ui.row_h * 0.75);
                        bh = ui.row_h;
                        by = Math.round((p.s_sp - bh * 0.4) / 2 - bh * 0.27);
                        b_x = ui.w - ui.scr_w - 1;
                        byUp = p.s_h;
                        byDn = sbar.y + sbar.h - ui.scr_w;
                        fw = p.f_w[p.filter_by] + p.f_sw + 12;
                        qx = ui.margin;
                        qy = (p.s_sp - ui.row_h * 0.6) / 2;
                        qh = ui.row_h * 0.6;
                }
                if (ui.scrollbar_show) {
                        this.btns.scrollUp = new btn(b_x, byUp, ui.scr_w, ui.scr_w, 1, "", "", "", {
                                        normal : scr[0],
                                        hover : scr[1]
                                }, function () {
                                        sbar.but(1);
                                }, "", "");
                        this.btns.scrollDn = new btn(b_x, byDn, ui.scr_w, ui.scr_w, 2, "", "", "", {
                                        normal : scr[0],
                                        hover : scr[1]
                                }, function () {
                                        sbar.but(-1);
                                }, "", "");
                }
                if (p.s_show) {
                        this.btns.s_img = new btn(qx, qy, qh, qh, 3, "", "", "", {
                                        normal : s_img[0],
                                        hover : s_img[1]
                                }, function () {
                                        browser("\"" + fb.FoobarPath + "Query Syntax Help.html");
                                }, "", "Open Query Syntax Help");
                        this.btns.cross1 = new btn(bx, by, bh, bh, 4, "", "", "", {
                                        normal : "85",
                                        hover : "192"
                                }, "", function () {
                                        sL.clear();
                                }, "Clear Search Text");
                        this.btns.cross2 = new btn(qx - bh * 0.2, by, bh, bh, 4, "", "", "", {
                                        normal : "85",
                                        hover : "192"
                                }, "", function () {
                                        sL.clear();
                                }, "Clear Search Text");
                        this.btns.filter = new btn(p.f_x1 - 12, 0, fw, p.s_sp, 5, p.f_but_ft, "Ў", "", {
                                        normal : !ui.local ? ui.txt_box & 0x99ffffff : ui.txt_box,
                                        hover : ui.txt_box & 0xe4ffffff
                                }, "", function () {
                                        men.button(p.f_x1, p.s_h);
                                        but.refresh(true)
                                }, "Filter");
                }

        }
}
var but = new button_manager();

function menu_object() {
        var i = 0,
        MenuMap = [],
        MF_GRAYED = 0x00000001,
        MF_POPUP = 0x00000010,
        MF_SEPARATOR = 0x00000800,
        MF_STRING = 0x00000000;
        this.NewMenuItem = function (index, type, value) {
                MenuMap[index] = [{
                                type : ""
                        }, {
                                value : 0
                        }
                ];
                MenuMap[index].type = type;
                MenuMap[index].value = value;
        }
        this.PlaylistTypeMenu = function (Menu, StartIndex) {
                var Index = StartIndex,
                n = ["Send to Current Playlist", "Add to Current Playlist"];
                for (i = 0; i < 2; i++) {
                        this.NewMenuItem(Index, "Playlist", i + 1);
                        Menu.AppendMenuItem(MF_STRING, Index, n[i]);
                        Index++;
                }
                return Index;
        }
        this.OptionsTypeMenu = function (Menu, StartIndex) {
                var Index = StartIndex,
                mt = p.syncType ? 1 : 0;
                for (i = 0; i < p.menu.length; i++) {
                        this.NewMenuItem(Index, "Options", i + 1);
                        if (i < p.menu.length - 1 || i == p.menu.length - 1 && v.k(0))
                                Menu.AppendMenuItem(MF_STRING, Index, p.menu[i]);
                        if (i < p.menu.length - 2 - mt)
                                Menu.CheckMenuItem(Index++, p.view_by == i);
                        else
                                Index++;
                        if (i == p.menu.length - 3 - mt || i == p.menu.length - 4 - mt)
                                Menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
                }
                return Index;
        }

        this.FilterMenu = function (Menu, StartIndex) {
                var Index = StartIndex;
                for (i = 0; i < p.f_menu.length + 1; i++) {
                        this.NewMenuItem(Index, "Filter", i + 1);
                        Menu.AppendMenuItem(MF_STRING, Index, i != p.f_menu.length ? (!i ? "No " : "") + p.f_menu[i] : "Always Reset Scroll");
                        Menu.CheckMenuItem(Index++, i < p.f_menu.length ? i == p.filter_by : p.reset);
                        if (i == p.f_menu.length - 1)
                                Menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
                }
                return Index;
        }

        this.button = function (x, y) {
                var menu = window.CreatePopupMenu(),
                idx,
                Index = 1;
                Index = this.FilterMenu(menu, Index);
                idx = menu.TrackPopupMenu(x, y);
                if (idx >= 1 && idx <= Index) {
                        i = MenuMap[idx].value;
                        switch (i) {
                        case p.f_menu.length + 1:
                                p.reset = !p.reset;
                                if (p.reset) {
                                        p.search_paint();
                                        lib.refresh(true);
                                }
                                window.SetProperty("SYSTEM.Reset Tree", p.bypass);
                                break;
                        default:
                                p.filter_by = i - 1;
                                p.set_statistics_mode();
                                p.calc_text();
                                p.search_paint();
                                lib.refresh(true);
                                window.SetProperty("SYSTEM.Filter By", p.filter_by);
                                break;
                        }
                }
                menu.Dispose();
        }

        this.search = function (Menu, StartIndex, s, e, paste) {
                var Index = StartIndex,
                n = ["Copy", "Cut", "Paste"];
                for (i = 0; i < 3; i++) {
                        this.NewMenuItem(Index, "Search", i + 1);
                        Menu.AppendMenuItem(s == e && i < 2 || i == 2 && !paste ? MF_GRAYED : MF_STRING, Index, n[i]);
                        Index++;
                        if (i == 1)
                                Menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
                }
                return Index;
        }

        this.search_menu = function (x, y, s, e, paste) {
                var menu = window.CreatePopupMenu(),
                idx,
                Index = 1;
                Index = this.search(menu, Index, s, e, paste);
                idx = menu.TrackPopupMenu(x, y);
                if (idx >= 1 && idx <= Index) {
                        i = MenuMap[idx].value;
                        switch (i) {
                        case 1:
                                sL.on_char(v.copy);
                                break;
                        case 2:
                                sL.on_char(v.cut);
                                break;
                        case 3:
                                sL.on_char(v.paste, true);
                                break;
                        }
                }
                menu.Dispose();
        }

        this.rbtn_up = function (x, y) {
                var Context = fb.CreateContextMenuManager(),
                FilterMenu = window.CreatePopupMenu(),
                idx,
                Index = 1,
                menu = window.CreatePopupMenu(),
                new_sel = false,
                OptionsMenu = window.CreatePopupMenu(),
                PlaylistMenu = window.CreatePopupMenu(),
                show_context = false;
                var ix = Math.round((y + sbar.delta - p.s_h - ui.row_h * 0.5) / ui.row_h);
                if (y > p.s_h && pop.tree.length > ix && ix >= 0 && x < p.s_w1 && pop.check_ix(pop.tree[ix], x, y, true)) {
                        if (!pop.tree[ix].sel) {
                                new_sel = true;
                                pop.get_selection(ix, "", true, true);
                        }
                        Index = this.PlaylistTypeMenu(menu, Index);
                        menu.AppendMenuSeparator();
                        show_context = true;
                }
                if (show_context) {
                        Index = this.OptionsTypeMenu(OptionsMenu, Index);
                        OptionsMenu.AppendTo(menu, MF_STRING | MF_POPUP, "Options");
                        menu.AppendMenuSeparator();
                        var items = p.items();
                        for (var l in pop.sel_items)
                                items.Add(p.list.Item(pop.sel_items[l]));
                        Context.InitContext(items);
                        Context.BuildMenu(menu, 5000, -1);
                } else
                        Index = this.OptionsTypeMenu(menu, Index);
                idx = menu.TrackPopupMenu(x, y);
                if (idx >= 1 && idx <= Index) {
                        i = MenuMap[idx].value;
                        switch (MenuMap[idx].type) {
                        case "Playlist":
                                switch (i) {
                                case 1:
                                        if (new_sel)
                                                for (var k = 0; k < pop.tree.length; k++)
                                                        pop.tree[k].sel = false;
                                        pop.tree[ix].sel = true;
                                        pop.load(pop.sel_items, true, false, true, true);
                                        p.tree_paint();
                                        break;
                                case 2:
                                        pop.tree[ix].sel = true;
                                        pop.load(pop.sel_items, true, true, false, true);
                                        break;
                                }
                                break;
                        case "Options":
                                var mtt = i == p.menu.length - 2 && p.syncType ? 1 : i == p.menu.length - 1 ? 2 : i == p.menu.length ? 3 : 4;
                                switch (mtt) {
                                case 1:
                                        window.ShowProperties();
                                        break;
                                case 2:
                                        p.syncType ? lib.update() : window.ShowProperties();
                                        break;
                                case 3:
                                        window.ShowConfigure();
                                        break;
                                case 4:
                                        lib.time.Reset();
                                        if (p.s_txt)
                                                lib.upd_search = true;
                                        p.fields(i < p.grp.length + 1 ? i - 1 : p.view_by, i - 1 < p.grp.length ? p.filter_by : i - 1 - p.grp.length);
                                        if (i == p.folder_view + 1)
                                                lib.get_paths = true;
                                        lib.get_library();
                                        lib.rootNodes();
                                        break;
                                }
                                break;
                        }
                }
                if (idx >= 5000 && idx <= 5800) {
                        show_context && Context.ExecuteByID(idx - 5000);
                }
                Context.Dispose();
                FilterMenu.Dispose();
                menu.Dispose();
                OptionsMenu.Dispose();
                PlaylistMenu.Dispose();
        }
}
var men = new menu_object();

function timers() {
        var timer_arr = ["clear_jsearch", "init", "jsearch", "search", "search_cursor", "tt", "update"];
        for (var i = 0; i < timer_arr.length; i++)
                this[timer_arr[i]] = false;
        this.reset = function (timer, n) {
                if (timer)
                        window.ClearTimeout(timer);
                this[timer_arr[n]] = false;
        }
        this.lib = function () {
                this.init = window.SetTimeout(function () {
                                lib.get_library();
                                lib.rootNodes();
                                timer.reset(timer.init, 1);
                        }, 5);
        }
        this.tooltip = function () {
                this.reset(this.tt, 6);
                this.tt = window.SetTimeout(function () {
                                pop.deactivate_tooltip();
                                timer.reset(timer.tt, 5);
                        }, 5000);
        }
        this.lib_update = function () {
                this.reset(this.update, 6);
                this.update = window.SetTimeout(function () {
                                lib.update();
                                timer.reset(timer.update, 6);
                        }, 500);
        }
}
var timer = new timers();
timer.lib();

this.touch_sens = window.GetProperty(" Scroll - Touch Mouse Sensitive: Step", 24);
var lbtn_touch_dn = 0;
var y_start = 0;
var y_end = 0;
var y_delta = 0;

function on_char(code) {
        if (!p.s_show)
                return;
        sL.on_char(code);
        jS.on_char(code)
}
function on_key_down(vkey) {
        pop.on_key_down(vkey);
        if (!p.s_show)
                return;
        sL.on_key_down(vkey);
}
function on_key_up(vkey) {
        if (!p.s_show)
                return;
        sL.on_key_up(vkey)
}
function on_library_items_added() {
        if (p.syncType)
                return;
        timer.lib_update();
}
function on_library_items_removed() {
        if (p.syncType)
                return;
        timer.lib_update();
}
function on_library_items_changed() {
        if (p.syncType || !p.statistics && fb.PlaybackTime > 59 && fb.PlaybackTime < 65)
                return;
        timer.lib_update();
}
function on_mouse_lbtn_dblclk(x, y) {
        but.lbtn_dn(x, y);
        pop.lbtn_dblclk(x, y);
}
function on_mouse_lbtn_down(x, y) {
        lbtn_touch_dn = 1;
        y_start = y;
        if (p.s_show || ui.scrollbar_show)
                but.lbtn_dn(x, y);
        if (p.s_show)
                sL.lbtn_dn(x, y);
        pop.lbtn_dn(x, y);
        sbar.lbtn_dn(x, y);
}
function on_mouse_lbtn_up(x, y) {
        lbtn_touch_dn = 0;
        y_start = y;
        if (p.s_show) {
                sL.lbtn_up();
                but.lbtn_up(x, y);
        }
        sbar.lbtn_up(x, y);
}
function on_mouse_leave() {
        if (p.s_show || ui.scrollbar_show)
                but.leave();
        sbar.leave();
}
function on_mouse_mbtn_down(x, y) {
        pop.mbtn_dn(x, y);
}
function on_mouse_move(x, y) {
        if (p.m_x == x && p.m_y == y)
                return;
        if (p.s_show || ui.scrollbar_show)
                but.move(x, y);
        if (p.s_show)
                sL.move(x, y);
        pop.move(x, y);
        sbar.move(x, y);
        p.m_x = x;
        p.m_y = y;
        if (lbtn_touch_dn) {
                //mouse_drag = false;
                y_end = y;
                y_delta = (y_end - y_start);
                if (x < ww) {

                        if (y_delta > ui.h / this.touch_sens) {
                                on_mouse_wheel(1);
                                y_start = y_end;
                        };
                        if (y_delta < -ui.h / this.touch_sens) {
                                on_mouse_wheel(-1);
                                y_start = y_end;
                        };

                };
        };
}
function on_mouse_rbtn_up(x, y) {
        if (y < p.s_h && x > p.s_x && x < p.s_x + p.s_w2) {
                sL.rbtn_up(x, y);
                return true;
        } else {
                men.rbtn_up(x, y);
                return true;
        }
}
function on_mouse_wheel(step) {
        if (!v.k(1))
                sbar.wheel(step);
        else
                ui.wheel(step);
}
function RGB(r, g, b) {
        return 0xff000000 | r << 16 | g << 8 | b;
}
function RGBA(r, g, b, a) {
        return a << 24 | r << 16 | g << 8 | b;
}
function StringFormat() {
        var a = arguments,
        h_align = 0,
        v_align = 0,
        trimming = 0,
        flags = 0;
        switch (a.length) {
        case 3:
                trimming = a[2];
        case 2:
                v_align = a[1];
        case 1:
                h_align = a[0];
                break;
        default:
                return 0;
        }
        return (h_align << 28 | v_align << 24 | trimming << 20 | flags);
}
window.SetProperty("_Custom.Colour Filter Line", null);
window.SetProperty("_Custom.Colour Filter Name", null);
window.SetProperty("_Custom.Colour Filter Search Text", null);
window.SetProperty(" DblClick Action: Expand/Collapse-0 Send&Play-1", null);
window.SetProperty(" DblClick: Expand-0 Play-1 Expand&Play-2", null);
window.SetProperty(" Filter Show", null);
window.SetProperty(" Filter Style: Fade-0 Blend-1 Normal-2 Highlight-3", null);
window.SetProperty(" Filter: Line Colour: Grey-0 Blend-1 Text-2", null);

function setWallpaperImg(path, metadb) {
        var fmt_path = fb.TitleFormat(path).Eval(true);
        var fmt_path_arr = utils.Glob(fmt_path).toArray();
        if (fmt_path_arr.length > 0) {
                var final_path = fmt_path_arr[0];
        };
        else {
                var final_path = null;
        };

        if (metadb && ppt.wallpapermode == 0) {
                var tmp_img = utils.GetAlbumArtV2(metadb, ppt.wallpapermode);
        };
        else {
                if (final_path) {
                        tmp_img = gdi.Image(final_path);
                };
                else {
                        tmp_img = null;
                };
        };
        if (!tmp_img) {
                if (final_path) {
                        tmp_img = gdi.Image(final_path);
                };
                else {
                        tmp_img = null;
                };
        };

        g_wallpaperImg = null;
        var img = FormatWallpaper(tmp_img, ww, wh, 2, 0, 0, "", true);
        return img;
};

function draw_blurred_image(image, ix, iy, iw, ih, bx, by, bw, bh, blur_value, overlay_color) {
        var blurValue = blur_value;
        var imgA = image.Resize(iw * blurValue / 100, ih * blurValue / 100, 2);
        var imgB = imgA.resize(iw, ih, 2);
        var overlay_color = RGBA(0, 0, 0, ppt.wallpaperoverlayalfa); //50);

        var bbox = gdi.CreateImage(bw, bh);
        // Get graphics interface like "gr" in on_paint
        var gb = bbox.GetGraphics();
        var offset = 90 - blurValue;
        gb.DrawImage(imgB, 0 - offset, 0 - (ih - bh) - offset, iw + offset * 2, ih + offset * 2, 0, 0, imgB.Width, imgB.Height, 0, 255);
        bbox.ReleaseGraphics(gb);

        var newImg = gdi.CreateImage(iw, ih);
        var gb = newImg.GetGraphics();

        if (ix != bx || iy != by || iw != bw || ih != bh) {
                gb.DrawImage(image, ix, iy, iw, ih, 0, 0, image.Width, image.Height, 0, 255);
                gb.FillSolidRect(bx, by, bw, bh, 0xffffffff);
        };
        gb.DrawImage(bbox, bx, by, bw, bh, 0, 0, bbox.Width, bbox.Height, 0, 255);

        // overlay
        if (overlay_color != null) {
                gb.FillSolidRect(bx, by, bw, bh, overlay_color);
        };

        // top border of blur area
        if (ix != bx || iy != by || iw != bw || ih != bh) {
                gb.FillSolidRect(bx, by, bw, 1, 0x22ffffff);
                gb.FillSolidRect(bx, by - 1, bw, 1, 0x22000000);
        };
        newImg.ReleaseGraphics(gb);

        return newImg;
};

function FormatWallpaper(image, iw, ih, interpolation_mode, display_mode, angle, txt, rawBitmap) {
        if (!image || !iw || !ih)
                return image;
        var i,
        j;

        var panel_ratio = iw / ih;
        wpp_img_info.ratio = image.Width / image.Height;
        wpp_img_info.orient = 0;

        if (wpp_img_info.ratio > panel_ratio) {
                wpp_img_info.orient = 1;
                // 1/3 : default image is in landscape mode
                switch (display_mode) {
                case 0: // Filling
                        //wpp_img_info.w = iw * wpp_img_info.ratio / panel_ratio;
                        wpp_img_info.w = ih * wpp_img_info.ratio;
                        wpp_img_info.h = ih;
                        wpp_img_info.cut = wpp_img_info.w - iw;
                        wpp_img_info.x = 0 - (wpp_img_info.cut / 2);
                        wpp_img_info.y = 0;
                        break;
                case 1: // Adjust
                        wpp_img_info.w = iw;
                        wpp_img_info.h = ih / wpp_img_info.ratio * panel_ratio;
                        wpp_img_info.cut = ih - wpp_img_info.h;
                        wpp_img_info.x = 0;
                        wpp_img_info.y = wpp_img_info.cut / 2;
                        break;
                case 2: // Stretch
                        wpp_img_info.w = iw;
                        wpp_img_info.h = ih;
                        wpp_img_info.cut = 0;
                        wpp_img_info.x = 0;
                        wpp_img_info.y = 0;
                        break;
                };
        };
        else if (wpp_img_info.ratio < panel_ratio) {
                wpp_img_info.orient = 2;
                // 2/3 : default image is in portrait mode
                switch (display_mode) {
                case 0: // Filling
                        wpp_img_info.w = iw;
                        //wpp_img_info.h = ih / wpp_img_info.ratio * panel_ratio;
                        wpp_img_info.h = iw / wpp_img_info.ratio;
                        wpp_img_info.cut = wpp_img_info.h - ih;
                        wpp_img_info.x = 0;
                        wpp_img_info.y = 0 - (wpp_img_info.cut / 4);
                        break;
                case 1: // Adjust
                        wpp_img_info.h = ih;
                        wpp_img_info.w = iw * wpp_img_info.ratio / panel_ratio;
                        wpp_img_info.cut = iw - wpp_img_info.w;
                        wpp_img_info.y = 0;
                        wpp_img_info.x = wpp_img_info.cut / 2;
                        break;
                case 2: // Stretch
                        wpp_img_info.w = iw;
                        wpp_img_info.h = ih;
                        wpp_img_info.cut = 0;
                        wpp_img_info.x = 0;
                        wpp_img_info.y = 0;
                        break;
                };
        };
        else {
                // 3/3 : default image is a square picture, ratio = 1
                wpp_img_info.w = iw;
                wpp_img_info.h = ih;
                wpp_img_info.cut = 0;
                wpp_img_info.x = 0;
                wpp_img_info.y = 0;
        };

        var tmp_img = gdi.CreateImage(iw, ih);
        var gp = tmp_img.GetGraphics();
        gp.SetInterpolationMode(interpolation_mode);
        gp.DrawImage(image, wpp_img_info.x, wpp_img_info.y, wpp_img_info.w, wpp_img_info.h, 0, 0, image.Width, image.Height, angle, ppt.wallpaperalfa); //255);
        tmp_img.ReleaseGraphics(gp);

        // blur it!
        if (ppt.wallpaperblurred) {
                var blur_factor = ppt.wallpaperblurvalue; // [1-90]
                tmp_img = draw_blurred_image(tmp_img, 0, 0, tmp_img.Width, tmp_img.Height, 0, 0, tmp_img.Width, tmp_img.Height, blur_factor, 0x00ffffff);
        };

        CollectGarbage();
        if (rawBitmap) {
                return tmp_img.CreateRawBitmap();
        };
        else {
                return tmp_img;
        };
};

function on_playback_new_track(metadb) {
        g_metadb = metadb;
        if (ppt.showwallpaper) {
                g_wallpaperImg = setWallpaperImg(ppt.wallpaperpath, metadb);
        };
        on_size();
        window.Repaint();
};
function on_notify_data(name, info) {
    if (name == "library" && info == "send_to_pl") {
                on_key_down(v.enter);
                //window.Repaint();
        window.NotifyOthers("lib_btns", "send_to_pl_ok");
    };
};

?

seriousstas 29.06.2016 06:53

duzzy
проверь такой вариант по :
Цитата:

// @author "Wilb"
// @version "0.8"
Если добавить одну или несколько папок треками (без подпапок) -
в режиме View by Folder Structure папок не будет - только треки вперемешку .

duzzy 29.06.2016 15:42

seriousstas
Цитата:

Думал, но ..
Все не так просто - там по линиям ещё несколько параметров,
Ааа... много параметров менять, если разные значения то вариант с Пропертис не подойдет.
Цитата:

Ну хорошо , а как Тебе такой вариант с полупрозрачними "точками" )
Такой вариант уже лучше :)
Я просто не большой фанат UI элементов, с ними бывают проблемы в скриптах... в скрипты можно подтягивать виндовые кнопки, скролбары, прогрессбары и т.д.
Цитата:

Если добавить одну или несколько папок треками (без подпапок) -
в режиме View by Folder Structure папок не будет - только треки вперемешку .
У меня нормально папки с треками добавляет... как при Add так и при Send
Может я что не так добавляю ?
Я давно с ним езжу пока проблем не было :)

seriousstas 29.06.2016 15:46

Цитата:

Сообщение от duzzy (Сообщение 363685)
seriousstas

Ааа... много параметров менять, если разные значения то вариант с Пропертис не подойдет.

Такой вариант уже лучше :)
Я просто не большой фанат UI элементов, с ними бывают проблемы в скриптах... в скрипты можно подтягивать виндовые кнопки, скролбары, прогрессбары и т.д.

У меня нормально папки с треками добавляет... как при Add так и при Send
Может я что не так добавляю ?
Я давно с ним езжу пока проблем не было :)

Смотри (я про отображение в самой библиотеке) :
https://hydrogenaud.io/index.php/top...html#msg924563
Пробовал и сборку для crc - она чистая почти со скриптом дефолным.
+ ошибка эта вылазит если попытаться развернуть этот одиночный трек,что на втором скрине (Library Tree 0.9)

Цитата:

Такой вариант уже лучше
Я ещё увеличил - на нём и остановлюсь ..

duzzy 29.06.2016 16:27

seriousstas
Мои папки в экплорере и в скрипте
http://jpegshare.net/thumbs/af/bc/af...16819be0d5.jpg

-------------------------------

Я понял про что ты говоришь, до меня только что дошло...
просто какой смысл отдельные папки добавлять... логично что покажет треки внутри папки отдельно... точно так же работает и Album List
вот смотри скрины...
http://jpegshare.net/thumbs/b3/f5/b3...daf5c1c9d6.jpg http://jpegshare.net/thumbs/71/0f/71...9769bc8ccf.jpg

seriousstas 29.06.2016 16:43

посмотри скрины добавь просто 2 3 папки с треками

duzzy 29.06.2016 16:45

Цитата:

Сообщение от seriousstas (Сообщение 363697)
посмотри скрины добавь просто 2 3 папки с треками

Я понял про что ты говоришь, до меня только что дошло...
просто какой смысл отдельные папки добавлять... логично что покажет треки внутри папки отдельно... точно так же работает и Album List
вот смотри скрины...
http://jpegshare.net/thumbs/b3/f5/b3...daf5c1c9d6.jpg http://jpegshare.net/thumbs/71/0f/71...9769bc8ccf.jpg

--------------------------

Смысл в том что используешь одну папку как Медиатеку --- допустим Music и поехали дальше...

Например:

Music
|
|--------- CD
|
|---------- FLAC
|
|---------- MP3
...

Либо использовать как общее хранилище для всех форматов и качества...

Music
|--------- AC/DC
|--------- Korn
|--------- ZZ Top

-----------------------------------------------------------------------

По вопросу вылетающей ошибки, можно просто попробовать поставить обход ошибки в этом случае при развороте трека в треке,
таким вот образом...

try{......тут ловишь ошибку, прописываешь ту строку что выбивает..............}catch(error){.......тут на что то меняешь или оставляешь просто пустоту........};

в 0.9 версии строка 472 (0.9 не развернута после сжатия, поэтому ошибку будет проблематично искать)

в 0.8 версии строка 1469

После применения процедуры обхода получится вот такой вариант при развороте трека в треке...
http://jpegshare.net/thumbs/2d/61/2d...025602179c.jpg

можно еще так сделать и получим пустоту вместо undefined....
Код:

try{
  nU = n.toUpperCase();
    }catch(e){n = "";};

http://jpegshare.net/thumbs/ed/2f/ed...2d7274f39a.jpg

seriousstas 29.06.2016 17:40

Ну это типа - мелочь , но неприятно :)

vladj 29.06.2016 17:52

[QUOTE=duzzy;363698
Смысл в том что используешь одну папку как Медиатеку --- допустим Music
[/QUOTE]
Пишешь одно , а на скрине в путях три папки, у меня всегда только две прописаны...
Music на харде внутреннем и Music на любой флешке присоединённой в машине.
Дома всегда (как ты и пишешь) только один путь Music.

duzzy 29.06.2016 18:53

vladj

Разговор совершенно про другое... прочти другие сообщения а не только последнее...
Цитата:

Я понял про что ты говоришь, до меня только что дошло...
просто какой смысл отдельные папки добавлять... логично что покажет треки внутри папки отдельно... точно так же работает и Album List
вот смотри скрины...
http://jpegshare.net/thumbs/b3/f5/b3...daf5c1c9d6.jpg http://jpegshare.net/thumbs/71/0f/71...9769bc8ccf.jpg

duzzy 29.06.2016 18:59

Цитата:

Сообщение от seriousstas (Сообщение 363700)
Ну это типа - мелочь , но неприятно :)

Багулины всегда неприятны :smile2:

Я просто и не пробовал в библиотеку отдельные папки добавлять, у меня всегда свалка, все в одной папке.

vladj 29.06.2016 19:48

Цитата:

Сообщение от duzzy (Сообщение 363703)
vladj
Разговор совершенно про другое.

Сорри, не до понял что речь о скрипте Wilb
В JSPlaylist (сборка seriousstas) всё как и положено открывается из LIBRARY_TREE .
Папки потрековые это ведь сборники и если они правильно прописаны,
всё работает чудесно. В плейлисте играющий сборник открыт, остальные
под шапкой. Добавляемый не открыт потреково, свёрнут под шапкой.

makcc 29.06.2016 20:24

Помогите пожалуйста разобраться в проблеме.
Скачал сборку от seriousstas 4Icar_13_6_1_MPS_UNI, от 18.06.16г. при добавлении в новый плей лист треков через библиотеку выкидывает вот такое окно WSH Panel Mod
http://s016.radikal.ru/i335/1606/2d/81e32251943c.jpg

WSH Panel Mod (LIBRARY_TREE_TOUCH_PANEL_with_AlbumArtView v3.0 by Vo Thanh Dat mod by___Terro): Ошибка выполнения Microsoft JScript:
'playlist_' - определение отсутствует
File:

Line: 1176, Col: 9


Все остальное в фубаре работает хорошо.
ОС Windows 7 32бит.

vladj 29.06.2016 20:42

Цитата:

Сообщение от makcc (Сообщение 363709)
при добавлении в новый плей лист треков через библиотеку

Как можно что-то добавить а плейлист которого ещё нет ? Ты двойным тычком по папке - альбому
запусти что-то на проигрывание, автоматом создастся плейлист и начнёт играть и потом уже если
есть надобность можно в библиотеке отмечая другой контент можно добавить в играющему плейлисту.
Ну или не добавляй в несуществующий, а отправляй (Send)...имхо.

makcc 29.06.2016 20:49

Цитата:

Сообщение от vladj (Сообщение 363710)
Как можно что-то добавить а плейлист которого ещё нет ? Ты двойным тычком по папке - альбому
запусти что-то на проигрывание, автоматом создастся плейлист и начнёт играть и потом уже если
есть надобность можно в библиотеке отмечая другой контент можно добавить в играющему плейлисту.
Ну или не добавляй в несуществующий, а отправляй (Send)...имхо.

Я создавал новый плей лист(пустой), потом 2м щелчком по нем и шел в библиотеку за треками. Получается так нельзя, понял спасибо!!!

vladj 29.06.2016 21:40

Если хочешь создать свой плейлист, то иди в панель разделённую надвое,
там в правой панели менеджер плейлистов, создавай новый, обзывай и затем
можешь в него добавлять треки из играющего. Плейлист сохранится и будет
лежать рядом с плейлистами инет станций.

duzzy 29.06.2016 21:50

makcc

У тебя все нормально и ты все правильно делал.
В скрипте ошибка, мой косяк... нужно скрипт библиотеки заменить и все будет гуд.

Скачай вот тут исправленную версию, и замени ее в панели.

Заменить скрипт в панели можно так...

К тебе тоже вопрос, вот это лого...http://jpegshare.net/images/53/e1/53...0e998cc359.png откуда у тебя на скрине ?

vladj 29.06.2016 22:43

У меня сборка от 18 числа нормально работает. Кстати неподготовленный пользователь может
попасть в тупик после такого, имхо, ...
"Инсталл в корень диска...
Начинать с добавления верхней папки с альбомами в разделе настроек Фубара "Media Library" ."

На чистом фубаре нет ни верхних, ни нижних папок, там пока пусто.
Начинать нужно находясь в опции настройки Media Library, щёлкаем справа Add...
в вышедшем оконце проводника указываем путь к папке с музыкой. Если музыка есть и на других
хардах так-же добавляем. Затем внизу справа щёлкаем Apply (т.е. Применить).
Не стоит сравнивать свои познания в терминах на английском и совсем начинающего юзверя.
Многие скачав сборку англоязычную не знают что такое Add, Apply и проч. термины.

seriousstas 30.06.2016 01:34

Цитата:

На чистом фубаре нет ни верхних, ни нижних папок, там пока пусто.
Я там про папки на ПК (+ со ссылкой на видео, где все наглядно). Если к примеру просто набросать (под)папок , то в библиотеке от Wilb будет каша ..

seriousstas 30.06.2016 01:39

makcc
Да с ней не только эти проблемы, предлагаю обновление :

4Icar_13_6_2_MPS_UNI
- Новый вид у Peakmeter Spectrum
- Библиотека заменена на Library Tree от WilB (лучшая на сегодня ) с моими правками для "Node" режима (увеличены и сделаны полупрозрачными элементы + - "дерева") .
В прошлой от Vo Thanh Dat есть некоторые проблемы с сортировкой .
- Убрал autobackup .
- Правки по смене иконок, обнуление таймера DSP при переходе на другие панели .
http://rgho.st/6FKQ77sSR/thumb.png

seriousstas 30.06.2016 03:38

duzzy
Ещё по библиотеке :
Если на только созданный (Library view) двойным кликом добавить все треки,
затем очистить и добавить выборочно через "Enter" - будут вместо выбранных - вновь добавлятся все треки .. Следующий выбор - уже норм, но если удалить и создать - тот-же глюк .

makcc 30.06.2016 13:52

Цитата:

Сообщение от duzzy (Сообщение 363717)
makcc

У тебя все нормально и ты все правильно делал.
В скрипте ошибка, мой косяк... нужно скрипт библиотеки заменить и все будет гуд.

Скачай вот тут исправленную версию, и замени ее в панели.

Заменить скрипт в панели можно так...

К тебе тоже вопрос, вот это лого...http://jpegshare.net/images/53/e1/53...0e998cc359.png откуда у тебя на скрине ?

Я с начала не мог отписаться на этом форуме (забыл пороль) и написал на магнитоле, потом когда вспомнил пароль написал здесь, оригинал скрина я удалил, и что бы здесь выложить скрин ошибки скачал с магнитолы его, думаю от туда логотип как то прилип.

makcc 30.06.2016 13:59

Цитата:

Сообщение от duzzy (Сообщение 363717)
makcc

У тебя все нормально и ты все правильно делал.
В скрипте ошибка, мой косяк... нужно скрипт библиотеки заменить и все будет гуд.

Скачай вот тут исправленную версию, и замени ее в панели.

Заменить скрипт в панели можно так...

К тебе тоже вопрос, вот это лого...http://jpegshare.net/images/53/e1/53...0e998cc359.png откуда у тебя на скрине ?

вот здесь я написал (пост 209 и 210) и потом скачал свой же скрин, видимо отсюда прилип логотип.
http://magnitola.org/audio-carpc/182...-carpc-21.html
когда сюда картинку закинул не обратил внимание.

seriousstas 30.06.2016 15:22

makcc
Ошибка на твоём скрине исправимая, но это пока полностью не побороть (нужно включать сортировку ..) :
http://pccar.ru/showpost.php?p=363266&postcount=1874 ,
поэтому пробуй другую библиотеку, в обновленной сборке .

seriousstas 30.06.2016 15:39

duzzy
Цитата:

просто какой смысл отдельные папки добавлять... логично что покажет треки внутри папки отдельно..
Смысл в том что используешь одну папку как Медиатеку --- допустим Music и поехали дальше...
В авто не всегда есть время перемещать файлы в отдельную папку ,
Я впихаю SD карту или флешку, а там зачастую просто все папки в корне .
На мониторе получаем набор файлов ..
Vo Thanh Dat - тут все правильно делает - показывает полный путь каждой папки .
+ с добавлением у него нет проблем .
Ты с ним болтал как-то , попроси вернуть (поправить) сортировку , как в первой версии .

duzzy 30.06.2016 16:34

makcc
Я тебя понял... Просто в следующий раз когда будут вопросы давай просто ссыль на проблему, или сразу тут пиши. ;)

duzzy 30.06.2016 17:02

seriousstas

Цитата:

В авто не всегда есть время перемещать файлы в отдельную папку ,
:) можно на флехе сделать папку "Музыка" добавить ее в фубар и будет почти полноценная синхронизация...

Либо как вариант использовать скрипт Эксплорера и оттуда подгружать папки в плейлист.
Есть такой вариант...(но с ним есть проблема, при портабл режиме скрипт падает, почему хз)
http://jpegshare.net/thumbs/43/b2/43...ef23ff969d.jpg

И еще есть вариант эксплорера от Бретта...(нашел)
http://jpegshare.net/thumbs/01/c5/01...c3c7912a67.jpg

Цитата:

Vo Thanh Dat - тут все правильно делает - показывает полный путь каждой папки .
Его скрипт работает через прокладку в виде плейлиста и поэтому нет проблем с добавлением треков... работает так формируется авто-плейлист со всеми треками указанными по пути, затем идет разбивка на папки и отображение на экране списка в виде дерева. Это можно делать и без скрипта вьетнамца, у Бретта в плейлисте 1.3.2также создается авто-плейлист со всем контентом и можно его использовать в виде библиотеки, просто не в таком удобном виде.
Цитата:

Ты с ним болтал как-то , попроси вернуть (поправить) сортировку , как в первой версии .
Болтал то болтал только толку от этого ноль, я с ним и по Album Library болтал(там тоже есть косяки) результат тот же... И видео снимал с пояснениями и скрины и описание проблем и то как хотелось бы это видеть... результат тишина... Зато на всякие нелепые вопросы он отвечает... типо как сделать чтоб скрипт показывал символ "&" вместо "_"...

Что касается скрипта Вилба, то работает он почти идентично Album List там будет тоже самое что и в скрипте... набор треков в таком виде...
http://jpegshare.net/thumbs/7f/39/7f...7bab773e44.jpg

duzzy 30.06.2016 18:05

120705

Сохрани в файл скрипт МПС панели и сюда скинь, я тебе поправлю.

ПКМ по нижним кнопкам, выбрать Configure..., откроется редактор скрипта, выделяешь и копируешь скрипт затем вставляешь в блокнот сохраняешь его и заливаешь на файлообменник.

120705 30.06.2016 19:44

Цитата:

Сообщение от duzzy (Сообщение 363780)
120705
Сохрани в файл скрипт МПС панели и сюда скинь, я тебе поправлю.

duzzy. Здесь лежит скрипт https://yadi.sk/i/VEimOCchsumYo

seriousstas 30.06.2016 20:17

120705
увеличить время авто-закрытия не подходит ?
Секунд 30-60

120705 30.06.2016 21:06

Цитата:

Сообщение от seriousstas (Сообщение 363794)
120705
увеличить время авто-закрытия не подходит ?
Секунд 30-60

Не желательно...

duzzy 30.06.2016 22:04

Цитата:

Сообщение от 120705 (Сообщение 363789)
duzzy. Здесь лежит скрипт https://yadi.sk/i/VEimOCchsumYo

Дело не в скрипте МПС. Скорее всего в скрипте плейлиста.

Упакуй сборку в архив и залей на файлообменник, ссылку кинь мне.

120705 30.06.2016 22:23

Цитата:

Сообщение от duzzy (Сообщение 363797)
Дело не в скрипте МПС. Скорее всего в скрипте плейлиста.
Упакуй сборку в архив и залей на файлообменник, ссылку кинь мне.

Залил https://yadi.sk/d/W5ya3b5csuxXv

duzzy 30.06.2016 22:52

Цитата:

Сообщение от 120705 (Сообщение 363799)

Забрал, сейчас гляну и перезалью.

duzzy 30.06.2016 23:35

120705

Убрал, и да дело было в плейлисте.

Вообще конечно лучше бы ты на что то посвежее перешел, это уж очень древний вариант... она в состоянии покоя ест проц примерно 8-11%.

качай...

120705 30.06.2016 23:48

Цитата:

Сообщение от duzzy (Сообщение 363802)
120705
Вообще конечно лучше бы ты на что то посвежее перешел, это уж очень древний вариант... она в состоянии покоя ест проц примерно 8-11%.

Твоя последняя сборка мне нравится, ноо.. я консерватор и в этой сборке хотелось оставить расположение и количество кнопок, как в моей. Просить переделать.. как то не удобно просить.

120705 30.06.2016 23:56

Цитата:

Сообщение от duzzy (Сообщение 363802)

НЕ качается. Какой то глюк на скачку. Доходит до 10% и стоит...

duzzy 01.07.2016 00:17

120705

А почему сам не хочешь попробовать, там не так уж все сложно... я про убрать, подвинуть, переместить кнопки... видос есть по редактированию скрипта МПС, хоть и старый уже но основные моменты там есть.

Цитата:

Твоя последняя сборка мне нравится,
:)... та что здесь лежит уже далеко не последняя))) я в ней уже много чего изменил и переделал... +еще одну делаю с плоским интерфейсом и возможно с новыми скриптами от Бретта. Дизайн честно спер у Lexins :), но тема собрана с нуля...

наброски пока выглядят так... но это только начало)))
http://jpegshare.net/thumbs/63/02/63...c6b3487421.jpg http://jpegshare.net/thumbs/05/42/05...9e6c887a16.jpg http://jpegshare.net/thumbs/4b/c8/4b...2c6240c385.jpg


--------------------------------------------------------

Цитата:

НЕ качается. Какой то глюк на скачку. Доходит до 10% и стоит...
качай тогда тут...

120705 01.07.2016 00:37

Цитата:

Сообщение от duzzy (Сообщение 363809)
120705
А почему сам не хочешь попробовать, там не так уж все сложно... я про убрать, подвинуть, переместить кнопки... видос есть по редактированию скрипта МПС, хоть и старый уже но основные моменты там есть.

Большущее СПАСИБО за помощь
Пробовал потрошить сборку, что то получается. , но не глобально , как у Вас. Вот хочу сборку 4Icar_13_6_2_MPS_UNI подогнать к моим хотелкам, т.е функционалу приблизить к "моей". Но это у меня быстро не получается, пока разбираюсь что к чему проходит много времени....


Часовой пояс GMT +4, время: 17:03.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot