Скрипты для foo_uie_wsh_panel_mod

Список разделов foobar2000 Секреты foobar2000

Описание: Кнопочки, конфиги, секреты, советы.

Сообщение #2061 seriousstas » 25.12.2017, 14:34

kgena_ua:seriousstas, привет.
Вертикальный вольюм бар тут есть, может даже в этой теме. Точно было, только давно.
ПРИВЕТ Геннадий ! :hi:
Поиск ничего не дал, графика уже есть - осталось ерунда)
Ваш вариант :
Код: Выделить всё
    pos=x;
    pos = (pos<0) ? 0 : (pos<ww) ?Math.round(pos) : ww;
    var vol =40*Math.log(0.99*pos/ww+0.01)/Math.log(20);
Подскажите ,как развернуть движение по Y (так получим обратное действие):
Код: Выделить всё
   pos=y;
    pos = (pos<0) ? 0 : (pos<wh) ? Math.round(pos) : wh;
    var vol =40*Math.log(0.99*pos/wh+0.01)/Math.log(20);
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 9 месяцев

Сообщение #2062 kgena_ua » 25.12.2017, 15:26

seriousstas,
Код: Выделить всё
// ==PREPROCESSOR==
// @name "Vertical volumebar"
// ==/PREPROCESSOR==

function RGB(r,g,b) { return (0xff000000|(r<<16)|(g<<8)|(b)); }

var font = gdi.Font("Arial",12,0);
var ww, wh;

DT_CENTER = 0x00000001;
DT_VCENTER = 0x00000004;
DT_SINGLELINE = 0x00000020;
DT_WORD_ELLIPSIS = 0x00040000;

IDC_HAND = 32649;
IDC_ARROW = 32512;

bgcolor = RGB(0, 0, 0);
color = RGB(150, 150, 150);
color_t = RGB(250, 250, 150);

var g_drag = false;

function pos2vol(pos) { return (50 * Math.log(0.99 * pos + 0.01) / Math.LN10); }

function on_paint(gr) {
   !window.IsTransparent && gr.FillSolidRect(0, 0, ww, wh, bgcolor);
   
   var volume = fb.Volume;
    var www = Math.pow(10,((fb.Volume + 100) / 50));
 
    var pos = www * wh / 100;

    if (volume == -100) pos = 0;

    gr.FillSolidRect( 0, wh - pos, ww, wh, color );   
   
    text = Math.round(volume);
   
    gr.GdiDrawText(text, font, color_t, 0, 0, ww, wh, DT_CENTER | DT_VCENTER | DT_SINGLELINE |DT_WORD_ELLIPSIS);
}

function on_mouse_lbtn_down(x, y) {
   g_drag = true;
    on_mouse_move(x, y);
}

function on_mouse_lbtn_up(x, y) {
   g_drag = false;
}

function on_mouse_move(x, y) {
    window.SetCursor(IDC_HAND);
   
    if (g_drag) {
        v = ((window.Height - y) / window.Height) * 100;
        v = (v < 0) ? 0 : (v < 100) ? v : 100;
        v = -100 + pos2vol(v);
        if (fb.Volume != v) fb.Volume = v;
    }
   
    window.Repaint();
}

function on_mouse_wheel(delta) {
   if (delta > 0){
        fb.VolumeUp();
   } else {
        fb.VolumeDown();
    }
}

function on_mouse_leave() {
    window.SetCursor(IDC_ARROW);
    window.Repaint();
}

function on_volume_change(val) {
   window.Repaint();
}

function on_size(){   
    ww = window.Width;   
    wh = window.Height;   
}   

kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет 7 месяцев

Сообщение #2063 seriousstas » 25.12.2017, 15:52

kgena_ua Спасибо Большое!
Еще вопрос , мне идеально-бы подошел такой вариант с широким движком под палец ,
такое можно сделать ? (пространство в крайних точках ограничено)
Я конечно сам попробую ..)
Движок широкий пририсовать не проблема , а вот , чтоб в положении 90% показывал 100 (и наоборот)
Ну это теория - иду пробовать ..
.........
Последний раз редактировалось seriousstas 25.12.2017, 16:10, всего редактировалось 2 раз(а).
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 9 месяцев

Сообщение #2064 kgena_ua » 25.12.2017, 16:09

А если так.
Код: Выделить всё
// ==PREPROCESSOR==
// @name "Vertical volumebar"
// ==/PREPROCESSOR==

function RGB(r,g,b) { return (0xff000000|(r<<16)|(g<<8)|(b)); }

var font = gdi.Font("Arial",12,0);
var ww, wh;

DT_CENTER = 0x00000001;
DT_VCENTER = 0x00000004;
DT_SINGLELINE = 0x00000020;
DT_WORD_ELLIPSIS = 0x00040000;

IDC_HAND = 32649;
IDC_ARROW = 32512;

bgcolor = RGB(0, 0, 0);
color = RGB(150, 150, 150);
color_t = RGB(250, 250, 150);

var g_drag = false;
var pos, drag_y;

function pos2vol(pos) { return (50 * Math.log(0.99 * pos + 0.01) / Math.LN10); }

function on_paint(gr) {
   !window.IsTransparent && gr.FillSolidRect(0, 0, ww, wh, bgcolor);
   
   var volume = fb.Volume;
    var www = Math.pow(10,((fb.Volume + 100) / 50));
 
    pos = wh - (www * wh / 100);
    if (volume == -100) pos = wh;

    gr.FillSolidRect( 0, pos, ww, wh, color );   
   
    text = volume == -100 ? "muted" : Math.round(volume) + " db" ;
    h_text = gr.CalcTextHeight(text, font);
    y_text = pos + 2 + h_text >= wh ? pos - h_text : pos + 2
   
    gr.GdiDrawText(text, font, color_t, 0, y_text, ww, wh, DT_CENTER | DT_WORD_ELLIPSIS);
}

function on_mouse_lbtn_down(x, y) {
   g_drag = true;
    drag_y = y - pos;
    on_mouse_move(x, y);
}

function on_mouse_lbtn_up(x, y) {
   g_drag = false;
}

function on_mouse_move(x, y) {
    window.SetCursor(IDC_HAND);
   
    if (g_drag) {
        v = ((window.Height - y + drag_y) / window.Height) * 100;
        v = (v < 0) ? 0 : (v < 100) ? v : 100;
        v = -100 + pos2vol(v);
        if (fb.Volume != v) fb.Volume = v;
    }
   
    window.Repaint();
}

function on_mouse_wheel(delta) {
   if (delta > 0){
        fb.VolumeUp();
   } else {
        fb.VolumeDown();
    }
}

function on_mouse_leave() {
    window.SetCursor(IDC_ARROW);
    window.Repaint();
}

function on_volume_change(val) {
   window.Repaint();
}

function on_size(){   
    ww = window.Width;   
    wh = window.Height;   
}   

kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет 7 месяцев

Сообщение #2065 seriousstas » 25.12.2017, 16:11

Еще подумал , а может вариант , когда толкаем из любой точки (беж прилипания к мышке) ?
А прилипать только в нижнем положении , когда звук off

А если так.
сеекунду - не успеваю за Вами ..))
...................
Прочитали таки мои мысли ..))
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 9 месяцев

Сообщение #2066 MC Web » 25.12.2017, 16:20

kgena_ua, спасибо за обновление Биографии.
Глянув на размер скрипта, подумал, что произошли большие изменения (размер в два раза больше), оказалось было сохранено в Юникоде. :smile:
Я обычно в UTF-8.
MC Web
Репутация: 248
С нами: 11 лет 3 месяца

Сообщение #2067 seriousstas » 25.12.2017, 16:23

kgena_ua
Еще спрошу тк Вы рядом :beer: .
Ваш скрипт поиска сейчас умеет искать треки .
Тоесть даже если активный плейлист с радиостанциями - поиск будет в том,
где треки .
Можно-ли Ваш скрипт "поиск" научить искать так-же и среди web-радио списков ?
В больших списках было-бы не заменимо ..
и это
теперь добавлю туда ввод через клавиатуру
было-бы полезным.
Последний раз редактировалось seriousstas 25.12.2017, 16:36, всего редактировалось 1 раз.
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 9 месяцев

Сообщение #2068 MC Web » 25.12.2017, 16:35

seriousstas, привет.
А компонент foo_quicksearch не подходит, нужен скрипт?
MC Web
Репутация: 248
С нами: 11 лет 3 месяца

Сообщение #2069 seriousstas » 25.12.2017, 16:38

Привет!
foo_quicksearch
Неа)
Этот скрипт поиска ранее делал Геннадий по просьбе Макарыча для КарПиСи-шников .
Те - под тач .
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 9 месяцев

Сообщение #2070 kgena_ua » 25.12.2017, 16:55

seriousstas:искать так-же и среди web-радио списков
тут нужно подумать

Добавлено спустя 14 минут 14 секунд:
MC Web:подумал, что произошли большие изменения
Привет, MC Web.
Изменения коснулись в основном связанные с изменениями на сайте.
Поменял некоторые функции, вернее" передачу" данных (остались слэши ////////////, где что-то переделывал).
Как писал выше - прозрачность фона под текстом по колесу мыши.
Из нового - при отсутствии данных на сайте беру с сайта сообщения - "Вики-статьи пока нет..." (для каждого языка соответственно)
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет 7 месяцев

Сообщение #2071 MC Web » 25.12.2017, 18:35

kgena_ua:- выбор языка - left mouse (или left mouse + Shift) double click на тексте (меню, настройки в меню свойства);
- размер шрифтов - Shif + mouse wheel на тексе или заголовке текста (выбор шрифта и стиля в меню свойства);
- передвижение текста - при нажатой left mouse button;
- спрятать текст - mouse mbtn dblclk на заголовке;
- смена изображения - mouse wheel на изображении;
- установка интервала переключения изображения - Shift + mouse wheel на изображении;
- выбор: артист, ильбомы артиста или похожие исполнители - left mouse double click на изображении (меню);
- ДОБАВЛЕНО - прозрачность фона под текстом - Ctrl + mouse wheel на тексте.
kgena_ua, может эту информацию по сочетанию клавиш вывести в отдельное окно, которое будет открываться через пункт контекстного меню скрипта, например: Справка.
Не нужно вспоминать, всегда под рукой, возможны различия от версии к версии.
MC Web
Репутация: 248
С нами: 11 лет 3 месяца

Сообщение #2072 sega72 » 25.12.2017, 19:28

kgena_ua, сегодня обновил версию Biography & Albums & Similar artist info. www.last.fm с 01032017 до 15122017.
Скрипт вывалился с ошибкой: Permission denied File: <main> Ln: 139, Col: 37
Оказалось, что скрипт пытался создавать папку tmp_Biography в папке программы, а не в пользовательском профиле (у меня стандартная установка, не портабельная).
В строке 1200: var tmp_b_path = fb.FoobarPath + "\\tmp_Biography\\";
заменил fb.FoobarPath на fb.ProfilePath. Всё работает.
Так правильно?
sega72
Репутация: 6
С нами: 10 лет

Сообщение #2073 seriousstas » 25.12.2017, 19:38

kgena_ua
тут нужно подумать
надеюсь получится ..
Как встал вертикальный VB , сырой по оформлению пока (ну и попытка найти станцию):
Спойлер
phpBB [media]
Вызов кликом по окну "Properties & properties file (ml)"
Я его в отдельный MPS засунул (для удобства), что оказалось не простой задачей ..
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 9 месяцев

Сообщение #2074 MC Web » 26.12.2017, 07:00

kgena_ua, добавил в скрипт Biography & Albums & Similar artist info. www.last.fm пункт контекстного меню Справка по сочетанию клавиш:
Код: Выделить всё
    //_menu.AppendMenuItem(MF_SEPARATOR, 0, 0);   
    //_menu.AppendMenuItem(MF_ENABLED, 500, "Перезагрузить");   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);   
    _menu.AppendMenuItem(MF_ENABLED, 150, "Справка по сочетанию клавиш"); 
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);   
    _menu.AppendMenuItem(MF_ENABLED, 510, "Свойства WSH");   
    _menu.AppendMenuItem(MF_ENABLED, 520, "Настройки WSH...");
добавить case 150:
Код: Выделить всё
    case 120:
        delete_empty_folders();
        break;
    case 150:
        help();
        break;
и в конце скрипта:
Код: Выделить всё
////////////////////////////////////////////////////////////////////////////////

var objShellApp = new ActiveXObject("Shell.Application");

function help(){
    var button_type = 0x0;
    var icon_type;
    var txt;
   
        icon_type = 0x20;
        txt = "Выбор языка - двойной щелчок ЛКМ (или ЛКМ + Shift) на тексте (меню, настройки в Свойства WSH)" +
"\n\nРазмер шрифтов - Shif и КОЛЕСО на тексе или заголовке текста (выбор шрифта и стиля в Свойства WSH)" +
"\n\nПередвижение текста - при нажатой ЛКМ" +
"\n\nСпрятать текст - двойной щелчок СКМ на заголовке" +
"\n\nСмена изображения - КОЛЕСО на изображении" +
"\n\nУстановка интервала переключения изображения - Shift и КОЛЕСО на изображении" +
"\n\nВыбор: Исполнитель, Альбомы исполнителя или Похожие исполнители - двойной щелчок ЛКМ на изображении (меню)" +
"\n\nДОБАВЛЕНО - прозрачность фона под текстом - Ctrl и КОЛЕСО на тексте";
   
    var btn = WshShell.Popup(txt, 0, "Справка по сочетанию клавиш", button_type + icon_type);

}

Результат открываемого окна Справки:

Изображение

kgena_ua, делал методом тыка, возможно нужна коррекция. :wink:
MC Web
Репутация: 248
С нами: 11 лет 3 месяца

Сообщение #2075 seriousstas » 26.12.2017, 15:58

MC Web я уже второй год собираюсь сделать для всех окон (даже для себя - забываются) ..
а через Popup у Тебя по фирме вышло ..
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 9 месяцев

Сообщение #2076 kgena_ua » 26.12.2017, 22:02

sega72:В строке 1200: var tmp_b_path = fb.FoobarPath + "\\tmp_Biography\\"; заменил fb.FoobarPath на fb.ProfilePath. Всё работает.Так правильно?
Если работает, то правильно. Наверное нужно оставит два варианта: fb.FoobarPath и fb.ProfilePath, в зависимости от установки.

Добавлено спустя 12 минут 19 секунд:
seriousstas:вариант , когда толкаем из любой точки
Смотрю, и это мне кажется более удобным. Ранее в "волумебарах" так не делали.
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет 7 месяцев

Сообщение #2077 seriousstas » 27.12.2017, 17:57

kgena_ua
Смотрю, и это мне кажется более удобным.
Да гуд, но есть пару "но"
1. За одно движение не прогрутить всю полосу
если увеличить шаг, то при касании заметный скачек из за drag_y = y - pos;
2 . Переход в точку касания все-же нужен .
В идеале вижу так .
Переходим в точку (первый вариант) а в крайних позициях (начиная с 80 и от 20ти к нулю ) включается ускорение

Добавлено спустя 5 часов:
как-то так думаю :
Спойлер
phpBB [media]
Немного "осдобил! внешний вид)
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 9 месяцев

Сообщение #2078 kgena_ua » 28.12.2017, 21:12

Properties & properties file (ml)
22122017


p.png

Изменения касаются выделения строк, которые скопированы в буфер обмена - Ctrl + left.m.b.
Код: Выделить всё
// ==PREPROCESSOR==
// @name "Properties & properties file (ml)"
// @author "kgena_ua"
// @version "22122017"
// @feature "v1.4"
// @feature "watch-metadb"
// @tooltip "custom-paint"
// ==/PREPROCESSOR==

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 getRed(color) {return ((color >> 16) & 0xff);};
function getGreen(color) {return ((color >> 8) & 0xff);};
function getBlue(color) {return (color & 0xff);};

DT_LEFT = 0x00000000;
DT_RIGHT = 0x00000002;
DT_CENTER = 0x00000001;
DT_VCENTER = 0x00000004;
DT_SINGLELINE = 0x00000020;
DT_WORD_ELLIPSIS = 0x00040000;
DT_WORDBREAK = 0x00000010;
DT_CALCRECT = 0x00000400;
DT_NOPREFIX = 0x00000800;

var ww, wh;

IDC_HAND = 32649;
IDC_ARROW = 32512;
IDC_SIZEWE = 32644;

MF_ENABLED = 0x00000000;
MF_GRAYED = 0x00000001;
MF_SEPARATOR = 0x00000800;

VK_SHIFT = 0x10;
VK_CONTROL = 0x11;
VK_ESCAPE = 0x1B;

String.prototype.repeat = function(n) {
    return new Array(n + 1).join(this);
}

window.SetProperty(" - user", "");
if (window.GetProperty(" - user") != "" ) window.SetProperty(" - user", "");
window.SetProperty("-".repeat(50), "");
if (window.GetProperty("-".repeat(50)) != "" ) window.SetProperty("-".repeat(50), "");

var font_name_item_name = window.GetProperty(" font name: item name", "Arial");
var font_name_item_value = window.GetProperty(" font name: item value", "Arial");
var font_name_group = window.GetProperty(" font name: group", "Arial");

var font_size_item_name = window.GetProperty(" font size: item name", 11);
var font_size_item_value = window.GetProperty(" font size: item value", 12);
var font_size_group = window.GetProperty(" font size: group", 11);

var font_style_item_name = window.GetProperty(" font style: item name", 0);
var font_style_item_value = window.GetProperty(" font style: item value", 0);
var font_style_group = window.GetProperty(" font style: group", 0);

var font_size_tooltip = window.GetProperty(" font size: tooltip", 12);

var font_item, font_group, font_tooltip;
get_font();

function get_font(){
    font_item_name = gdi.Font(font_name_item_name, font_size_item_name, font_style_item_name);
    font_item_value = gdi.Font(font_name_item_value, font_size_item_value, font_style_item_value);
    font_group = gdi.Font(font_name_group, font_size_group, font_style_group);
    font_tooltip = gdi.Font(font_name_item_value, font_size_tooltip, font_style_item_value);
}

ColorTypeCUI = {
    text: 0,
    selection_text: 1,
    inactive_selection_text: 2,
    background: 3,
    selection_background: 4,
    inactive_selection_background: 5,
    active_item_frame: 6
};

ColorTypeDUI = {
   text: 0,
   background: 1,
   highlight: 2,
   selection: 3
};

var bgcolor, color_item_name, color_item_value, color_group_text;

function get_color(){   
    if (window.InstanceType == 0){
        s_bgcolor = window.GetColorCUI(ColorTypeCUI.background);
        s_color_item_name = window.GetColorCUI(ColorTypeCUI.text);
        s_color_item_value = window.GetColorCUI(ColorTypeCUI.inactive_selection_text);
        s_color_group_text = window.GetColorCUI(ColorTypeCUI.inactive_selection_background);
    } else if (window.InstanceType == 1) {
        s_bgcolor = window.GetColorDUI(ColorTypeDUI.background);
        s_color_item_name = window.GetColorDUI(ColorTypeDUI.text);
        s_color_item_value = window.GetColorDUI(ColorTypeDUI.highlight);
        s_color_group_text = window.GetColorDUI(ColorTypeDUI.selection);
    }
    window.Repaint();
}

var c_bgcolor = customColor(window.GetProperty(" color: background", "0-0-0"));
var c_color_item_name = customColor(window.GetProperty(" color: item name", "180-180-180"));
var c_color_item_value = customColor(window.GetProperty(" color: item value", "255-255-220"));
var c_color_group_text = customColor(window.GetProperty(" color: group text", "100-100-100"));

function customColor(colour){
   tempc = colour.split("-");
   return (0xff000000 | (tempc[0]<<16) | (tempc[1]<<8) | (tempc[2]));
}

var custom_colors = window.GetProperty(" colors: custom", false);

get_color();
ini_color();

function on_colors_changed(){
    get_color();
    ini_color();
}

function ini_color(){
    bgcolor = custom_colors ? c_bgcolor : s_bgcolor;
    color_item_name = custom_colors ? c_color_item_name : s_color_item_name;
    color_item_value = custom_colors ? c_color_item_value : s_color_item_value;
    color_group_text = custom_colors ? c_color_group_text : s_color_group_text;
}

var selection_mode = window.GetProperty("selection_mode", 0);

var idx, old_idx;
var item_name_array_0 = [];
var item_name_array_1 = [];
var item_value_array = [];
var tmp_item_name_array_0 = [];
var tmp_item_name_array_1 = [];
var tmp_item_value_array = [];
var name, value;
var artist, old_artist;
var album, old_album;
var similar;
var similar_artist = [];
var artist_info = [];
var album_info = [];

var auto_sizing = window.GetProperty("auto sizing", true);
var group_text = window.GetProperty("group text", true);
var vertical_item_padding = window.GetProperty(" vertical item padding", 1);
var clipboard_item_name = window.GetProperty("clipboard item name", false);

var f_h;
var margin_h = window.GetProperty(" text: margin", 10);
var t_x1 = margin_h;
var t_x2;
var text_h;
var panel_h;
window.GetProperty("text: x2 custom", 0);

var lbtn_down = false;
var shift_down = false;
var control_down = false;
var pos_x;
var drag_x = 0, drag_y = 0;
var move_x = false,  move_y = false;
var s = 0;
var old_x, old_y;

var Tooltip = window.GetProperty("tooltip", false);
var tooltip_time = fb.CreateProfiler("Time tooltip");
var tooltip_state = false;
var tooltip_text;
var tooltip_t = [];
var tooltip_max_w = window.GetProperty(" tooltip text max width", 250);
var tooltip_delay_time = window.GetProperty(" tooltip delay time (ms)", 300);

var p_wsh = window.GetProperty(" panel (tooltip ini): WSH", true);
var p_jscript = window.GetProperty(" panel (tooltip ini): jscript", false);

try {
    if (p_wsh) {var tooltip = window.CreateTooltip();}
    if (p_jscript) {
        var tooltip = window.CreateTooltip(font_name_item_value, font_size_tooltip, font_style_item_value);
        tooltip.SetMaxWidth(tooltip_max_w);
    }
} catch(e) {};

var lang_text = ["en", "ru"];
var lang = window.GetProperty("lang", 0);

htmlfile = new ActiveXObject('htmlfile');
var clipboardData = "";
var selected_idx = [];

var doc = new ActiveXObject("htmlfile");

function on_paint(gr) {
   !window.IsTransparent && gr.FillSolidRect(0, 0, ww, wh, bgcolor);
   
    draw_array(gr);

    gr.GdiDrawText( "", font_item_value, color_item_value, 0, 0, ww, wh, DT_RIGHT | DT_WORD_ELLIPSIS);
    gr.GdiDrawText( "", font_item_value, color_item_value, 0, 20, ww, wh, DT_RIGHT | DT_WORD_ELLIPSIS);
}

var groups = ["metadata", "general", "replaygain", "location", "playback statistics", "last.FM statistics", "last.FM"];

window.GetProperty( groups[0], true);
window.GetProperty( groups[1], true);
window.GetProperty( groups[2], true);
window.GetProperty( groups[3], true);
window.GetProperty( groups[4], true);
window.GetProperty( groups[5], true);
window.GetProperty( groups[6], true);

var tfname = [
["group_" + groups[0], ".........."],
["$meta(artist)", "Исполнитель"],
["%title%", "Название"],
["%album%", "Альбом"],
["%date%", "Год"],
["%genre%", "Жанр"],
["%composer%", "Композитор"],
["%performer%", "Первый исполнительь"],   
["$meta(album artist)", "Исполнитель альбома"],
["%track number%", "Номер трека"],
["%totaltracks%", "Всего треков"],
["%discnumber%", "Номер диска"],
["%totaldiscs%", "Всего дисков"],
["%rating%", "Рейтинг"],
["$meta(rating)", "Рейтинг"],
["%comment%", "Комментарий"],
["%publisher%", "Издатель"],
["%catalog%", "Каталог"],
["%discid%", "ID диска"],
["%label%", "Лейбл"],           
["%releaser%", "Продавец"],     
["%subtitle%", "Субтитры"],

["group_" + groups[1], "общие"],           
["$info(samplerate)", "Частота дискретизации"],
["$info(channels)", "Каналов"],
["$info(bitspersample)", "Бит на семпл"],
["$info(bitrate)", "Битрейт"],
["%codec%", "Кодек"],
["$info(codec_profile)", "Профиль кодека"],
["$info(mp3_stereo_mode)", "Режим стерео MP3"],
["$info(encoding)", "Кодирование"],
["%length%", "Длина"],
["$info(tool)", "Кодировщик"],
["$info(cue_embedded)", "Встроенный CUE"],
["$info(tagtype)", "Тип тега"],

["group_" + groups[2], "усиление громкости"],
["%replaygain_album_gain%", "Усиление громкости альбома"],
["%replaygain_album_peak%", "Пиковый уровень альбома"],
["%replaygain_track_gain%", "усиление громкости трека"],
["%replaygain_track_peak%", "Пиковый уровень трека"],

["group_" + groups[3], "расположение"],   
["%filename_ext%", "Имя файла"],
["$info(referenced_file)", "......"],
["$directory_path(%path%)", "Путь к файлу"],
["%url%", "Ссылка"],
["%subsong%", "Позиция трека"],       
["%filesize_natural%", "Размер файла"],
["%last_modified%", "Изменен"],
["%folder_name%", "Имя папки"],

["group_" + groups[4], "статистика воспроизведения"],
["%play_count%", "Количество воспроизведений"],
["%first_played%", "Первое воспроизведение"],
["%last_played%", "Последнее воспроизведение"],
["%added%", "Добавлен"],

["group_" + groups[5], "сайт Last.FM"],
["%lastfm_bio%", "Биография"],
["%lastfm_album_listeners%", "Слушателей альбома"],
["%lastfm_album_playcount%", "Прослушиваний альбома"],
["%lastfm_artist_listeners%", "Слушателей исполнителя"],
["%lastfm_artist_playcount%", "Прослушиваний исполнителя"],
["%lastfm_album_content%", "Содержимое альбома"],

["group_" + groups[6], "сайт Last.FM"],
["%lastfm_similar_artist%", "Похожие исполнители"]
];

var measure_arr = [
    ["$info(bitrate)", "kbps", "кбит/с"],
    ["$info(samplerate)", "Hz", "Гц"],
    ["$info(bitspersample)", "bps", ""],
    ["$info(channels)", "ch", ""],
    ["%play_count%", "times", ""]
]

function get_measure(n) {
    tmp = "";
    var j = 0;
    do {
        if (measure_arr[j][0] == n) {
            tmp = lang == 0 ? measure_arr[j][1] : measure_arr[j][2];
        }     
        j++;
    } while (j < measure_arr.length);
    return tmp;
}

var months_0 = ["Jan.", "Feb.", "Mar.", "Apr.", "May", "Jun.", "Jul.", "Aug.", "Sept.", "Oct.", "Nov.", "Dec."];
var months_1 = ["Янв.", "Фев.", "Мрт", "Апр.", "Май", "Июн.", "Июл.", "Авг.", "Сен.", "Окт.", "Нбр", "Дек."];

function data_format(n) {
    if (!n) return;
    d = parseInt(n.substr(8, 2), 10);
    m = parseInt(n.substr(5, 2), 10);
    y = n.substr(0, 4);
    t = n.substr(11, 8);
    m_text = lang == 0 ? months_0[m - 1] : months_1[m - 1];
    return d + " " + m_text + " " + y + ", " + t;
}

function set_cursor() {
    if (move_y || lbtn_down) window.SetCursor(IDC_HAND);
    if (move_x) window.SetCursor(IDC_SIZEWE);
}

function on_mouse_lbtn_down(x, y) {
    deactive_tooltip();
    lbtn_down = true;
   
    if (move_y) drag_y = y - s;
    if (move_x) drag_x = x - t_x2;
   
    if (control_down){
        old_idx = idx;
        selected_idx[idx] = selected_idx[idx] == 0 ? 1 : 0;
        copy_to_clipboard();
    }
}

function on_mouse_lbtn_up(x, y) {
    lbtn_down = false;
    if (move_x) {
        window.SetProperty("text: x2 custom",  t_x2);
    }
}

function on_mouse_lbtn_dblclk(x, y){
    group = item_name_array_0[idx] && item_name_array_0[idx].search('group') >= 0 ? true : false;
       
    if (group){
        group_name = item_name_array_0[idx].replace("group_", "");
        group_collapsed = window.GetProperty(group_name);
        window.SetProperty(group_name, !group_collapsed);
        create_array();
        window.Repaint();
    }
   
    if (!control_down){
        ini_selected_idx(0);
        copy_to_clipboard();
        window.Repaint();
    }
}

function on_mouse_move(x, y) {
    if (shift_down && !move_x) drag_x = x - t_x2;
    if (shift_down) drag_y = (y - s);
   
    idx = Math.floor((y + Math.abs(s)) / f_h);

    pos_x = x;
    mouse_on_pos();
   
    if (Tooltip && !lbtn_down && !shift_down && !control_down && (old_y != y || old_x != x)){
        try {
            if (p_wsh) tooltip_activate_wsh(x, y);
            if (p_jscript) tooltip_activate_jscript(x, y);
        } catch(e) {}
        old_y = y;
        old_x = x;
    }

    if (lbtn_down && move_y && !control_down) {
        if (text_h > panel_h){
            s = y - drag_y;
            s = s >= 0 ? 0 : s;
            s = s <= (panel_h - text_h) && s < 0 ? (panel_h - text_h) : s;
        }
        window.Repaint();
    }

    if (lbtn_down && move_x) {
        auto_sizing = false;
        window.SetProperty("auto sizing", auto_sizing);
        tmp_t_x2 = x - drag_x;
        t_x2 = tmp_t_x2 <= t_x1 ? t_x1 : tmp_t_x2 >= ww - t_x1 - 50 ? ww - t_x1 - 50 : tmp_t_x2;
        window.Repaint();
    }

    if (control_down && lbtn_down && old_idx != idx){
        selected_idx[idx] = selected_idx[idx] == 0 ? 1 : 0;
        copy_to_clipboard();
        old_idx = idx;
    }
}

function on_mouse_wheel(delta) {
    if (move_y) {
        if (text_h > panel_h){
            if (delta < 0) {s = Math.max(panel_h - text_h, s + delta * f_h)};
            if (delta > 0) {s = Math.min(0, s + delta * f_h)};
        }
        window.Repaint();
    }
}

function on_mouse_leave() {
    window.SetCursor(IDC_ARROW);
    window.Repaint();
}

function mouse_on_pos(){
    if (shift_down && pos_x >= t_x2) {
        move_x = true;
        move_y = false;
    } else {
        move_y = true;
        move_x = false;
    }
    set_cursor();
}

function on_key_down(vkey) {
    deactive_tooltip();
   
    if (vkey == VK_SHIFT){
        shift_down = true;
        if (lbtn_down) drag_x = pos_x - t_x2;
    }
    mouse_on_pos();
   
    if (vkey == VK_CONTROL){
        control_down = true;
    }
   
    if (vkey == VK_ESCAPE){
        ini_selected_idx(0);
        copy_to_clipboard();
    }
}

function on_key_up(vkey) {
    if (vkey == VK_SHIFT){
        shift_down = false;
    }

    mouse_on_pos();
   
    if (vkey == VK_CONTROL){
        control_down = false;
    }
}

function on_size() {
    ww = window.Width;
    wh = window.Height;
}

function clear_item_name(n) {
    return n.replace(/.*\(|lastfm_|replaygain_|[^a-z0-9\s\_]/g,"").replace(/_/g," ");
    //return n.replace(/.*\((?!\))|lastfm_|replaygain_|[^a-z0-9\s\_]/g,"").replace(/_/g," ");
}

function clear_group_text(n) {
    return n.replace(/group_/g,"").replace(/(?=.)/g," ").replace(/^\s/g,"")
}

function create_array() {
    tmp_item_name_array_0 = [];
    tmp_item_name_array_1 = [];
    tmp_item_value_array = [];
   
    t_x2 = 0;
    similar_artist = [];
   
    for (j = 0; j < tfname.length; j++) {
        group = tfname[j][0].search('group') >= 0 ? true : false;

        var value = "";
       
        if (!group) {
            switch (tfname[j][0]) {
            case "%lastfm_album_listeners%":
                value = Eval(tfname[j][0]) ? Eval(tfname[j][0]) : album_info[1];
                break;
            case "%lastfm_album_playcount%":
                value = Eval(tfname[j][0]) ? Eval(tfname[j][0]) : album_info[0];
                break;
            case "%lastfm_artist_listeners%":
                value = Eval(tfname[j][0]) ? Eval(tfname[j][0]) : artist_info[1];
                break;
            case "%lastfm_artist_playcount%":
                value = Eval(tfname[j][0]) ? Eval(tfname[j][0]) : artist_info[0];
                break;
            case "%lastfm_similar_artist%":
                value = Eval(tfname[j][0]) ? Eval(tfname[j][0]) : similar;
                similar_artist = value ? value.split(';') : "" ;
                break;
            default:
                value = tfname[j][0].search(/_modified|_played|_played|added/g) > 0 ? data_format(Eval(tfname[j][0])) : Eval(tfname[j][0]);
            }
        }

        if (value && value != 0 || group) {
            tmp_item_name_array_0.push(tfname[j][0]);
            tmp_item_name_array_1.push(tfname[j][1]);
           
            m_text = get_measure(tfname[j][0]);
            value = value + (m_text ? "  " + m_text : "");
           
            if (tfname[j][0] != "%lastfm_similar_artist%"){
                tmp_item_value_array.push(value);
            }
        }
       
        if (value && value != 0 && !group){
            tmp = lang == 0 ? clear_item_name(tfname[j][0]) : tfname[j][1];
            tmp_t_x2 = calc_text_data("w", tmp, font_item_name);
            t_x2 = tmp_t_x2 > t_x2 ? tmp_t_x2 : t_x2;
        }
    }
   
    t_x2 = auto_sizing ? t_x2 + t_x1 + 10 : window.GetProperty("text: x2 custom");

    for (var i = 0; i < similar_artist.length; i++) {
        if (i >= 1) {
            tmp_item_name_array_0.push("");
            tmp_item_name_array_1.push("");
        }
        value = similar_artist[i].replace(/^\s+|\s+$/g, "");
        tmp_item_value_array.push(value);
    }

    clear_collapse_expand_groups();
   
    ini_selected_idx(0);
}

function clear_collapse_expand_groups() {
    item_name_array_0 = [];
    item_name_array_1 = [];
    item_value_array = [];
   
    group_name = groups[0];
   
    for (j = 0; j < tmp_item_name_array_0.length; j++) {
        group = tmp_item_name_array_0[j].search('group') >= 0 ? true : false;
       
        if (group){
            group_name = tmp_item_name_array_0[j].replace("group_", "");
        }

        selected_items = window.GetProperty(group_name);

        item_name_0 = tmp_item_name_array_0[j];
        item_name_1 = tmp_item_name_array_1[j];
        item_value = tmp_item_value_array[j];
       
        if (!group){
            if (selected_items){
                item_name_array_0.push(item_name_0);
                item_name_array_1.push(item_name_1);
                item_value_array.push(item_value);
            }           
        }
       
        if (group){
            if (tmp_item_value_array[j + 1]){
                item_name_array_0.push(item_name_0);
                item_name_array_1.push(item_name_1);
                item_value_array.push(item_value);
            }
        }
    }
    window.Repaint();
}

function draw_array(gr) {
    f_h_name = gr.CalcTextHeight("Text", font_item_name);
    f_h_value = gr.CalcTextHeight("Text", font_item_value);
    f_h = Math.max(f_h_name, f_h_value) + window.GetProperty(" vertical item padding");
   
    text_h = item_name_array_0.length * f_h;
    panel_h = Math.floor(window.Height / f_h) * f_h;
   
    if (text_h <= panel_h && s < 0) s = 0;
   
    star_size = f_h_value - 3;
    star_offset = star_size + 2;
   
    for (var i = 0; i < item_name_array_0.length; i++) {
        group = item_name_array_0[i].search('group') >= 0 ? true : false;
       
        t_y = i * f_h + s;
        l_y = t_y + f_h / 2;
       
        if (!group){
            rating_text = item_name_array_0[i] == "$meta(rating)" ? lang == 0 ? "  (tag)" : "  (тег)" : "";
           
            name = (lang == 0 ? clear_item_name(item_name_array_0[i]) : item_name_array_1[i]) + rating_text;
            t_w = Math.min(ww - (ww - t_x2)- t_x1, ww - t_x1 * 2) - 10;
            gr.GdiDrawText(name, font_item_name, color_item_name, t_x1, t_y, t_w, f_h, DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_WORD_ELLIPSIS | DT_NOPREFIX);         
        }
       
        if (group){
            name = lang == 0 ? clear_group_text(item_name_array_0[i]) : item_name_array_1[i];
            t_w = ww - t_x1 * 2;
           
            group_text && gr.GdiDrawText(name, font_group, color_group_text, t_x1, t_y, t_w, f_h, DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_WORD_ELLIPSIS | DT_NOPREFIX);         

            l_x = group_text && name ? Math.min(gr.CalcTextWidth(name, font_group) + 5, ww - t_x1 * 2) : 0;
            gr.DrawLine(t_x1 + l_x, l_y, ww - t_x1, l_y, 1, color_group_text);
        }

        //var color = selected_idx[i] == 0 ? color_item_value : color_item_name;
        var color = color_item_value;

        if (selected_idx[i] != 0 && !group){
            var color_fill = RGBA(getRed(color_item_value), getGreen(color_item_value), getBlue(color_item_value), 30);
            if (clipboard_item_name){
                gr.FillSolidRect(t_x1 - 5, t_y + 1, ww - t_x1 * 2 + 10, f_h - 2, color_fill);
            } else {
                gr.FillSolidRect(t_x2 - 5, t_y + 1, t_w2 + 10, f_h - 2, color_fill);
            }
        }

        if (item_name_array_0[i].search(/rating/g) > 0){     
            for (var r = 0; r < Math.min(item_value_array[i] * star_offset, ww - t_x2 - t_x1 - star_size / 2); r = r + star_offset) {
                draw_star(gr, t_x2 + star_size / 3 + r, t_y + f_h / 2, star_size, true, 0, color, false, bgcolor, 255);
            }
        } else {
            value = item_value_array[i];
            t_w2 = ww - t_x2 - t_x1;
            gr.GdiDrawText( value, font_item_value, color, t_x2, t_y, t_w2, f_h, DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_WORD_ELLIPSIS | DT_NOPREFIX);
        }
    }
}
       
var metadb;
on_item_focus_change();

function on_playlist_switch() {
    on_item_focus_change();
}

function on_playback_new_track() {
    on_item_focus_change();
}

function on_playback_dynamic_info_track() {
    on_item_focus_change();
}

function on_playback_stop() {
    on_item_focus_change();
}

function on_selection_changed(metadb) {
   on_item_focus_change();
}

function on_item_focus_change() {
    switch (selection_mode) {   
    case 0:   
        metadb = fb.IsPlaying ? fb.GetNowPlaying() : fb.GetFocusItem();
        break;
    case 1:
       metadb = fb.GetFocusItem();
        break;
    }
    if (metadb) on_metadb_changed();
}

function on_metadb_changed() {
    artist = Eval("%artist%");
    album = Eval("%album%");

    if (album != old_album) {
        album_info = [];
        get_lastFM_album_info(artist, album)
        old_album = album;
    }

    if (artist != old_artist) {
        similar = "";
        get_lastFM_similar(artist);
        artist_info = [];
        get_lastFM_artist_info(artist);
        old_artist = artist;
    }

    create_array();
}

function Eval(field) {
    if (metadb) {
        type = metadb.RawPath;

        if (type.indexOf("file") >= 0){
            return fb.TitleFormat("[" + field + "]").EvalWithMetadb(metadb);
        } else{
            if (selection_mode == 0){
                if (field == "$meta(artist)" || field == "%title%" || field == "%artist%"){
                    return fb.TitleFormat("[" + field + "]").Eval(true);
                }
                if (field == "%genre%"){
                    return fb.TitleFormat("[" + field + "]").EvalWithMetadb(metadb);
                }
            }
            return fb.TitleFormat("[" + field + "]").EvalWithMetadb(metadb);
        }
    }
}

function on_mouse_rbtn_up (x, y){   
    tooltip_state && tooltip.Deactivate();

    var _menu = window.CreatePopupMenu();
   
    _menu.AppendMenuItem(MF_ENABLED, 10, "Prefer now playing");
    _menu.AppendMenuItem(MF_ENABLED, 11, "Follow selected track");
    _menu.CheckMenuRadioItem(10, 11, selection_mode + 10);     
    _menu.EnableMenuItem(selection_mode + 10, 1);   

    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 20, "Group text");
    _menu.CheckMenuItem(20, group_text);
    _menu.AppendMenuItem(MF_ENABLED, 30, "Tooltip");
    _menu.CheckMenuItem(30, Tooltip);
   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 50, "Create txt/xls file");
   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    //MF_STRING =  auto_sizing ? MF_GRAYED : MF_ENABLED;
    //_menu.AppendMenuItem(MF_STRING, 60, "Auto-sizing columns");
    _menu.AppendMenuItem(MF_ENABLED, 60, "Auto-sizing columns");
    _menu.CheckMenuItem(60, auto_sizing);
   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 70, "Item text: " + lang_text[0]);
    _menu.AppendMenuItem(MF_ENABLED, 71, "Item text: " + lang_text[1]);
    _menu.CheckMenuRadioItem(70, 71, lang + 70);         
    _menu.EnableMenuItem(lang + 70, 1);   

    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 80, "Copy to clipboard (all)");
    _menu.AppendMenuItem(MF_ENABLED, 81, "Copy item name");
    _menu.CheckMenuItem(81, clipboard_item_name);

    //_menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    //_menu.AppendMenuItem(MF_ENABLED, 100, "Reload");
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 200, "Properties");
    _menu.AppendMenuItem(MF_ENABLED, 300, "Configure ...");

    ret = _menu.TrackPopupMenu(x + 20, y - 20);

    switch (ret) {
    case 10:   
    case 11:
        selection_mode = ret - 10;
        window.SetProperty("selection_mode", selection_mode);
        on_item_focus_change();
        break;
    case 20:
        window.SetProperty("group text", !group_text);
        group_text = window.GetProperty("group text");
        break;
    case 30:
        window.SetProperty("tooltip", !Tooltip);
        Tooltip = window.GetProperty("tooltip");
        deactive_tooltip();   
        break;
    case 50:
        menu_create_file(x,y);
        break;
    case 60:
        if (!auto_sizing){
            auto_sizing = true;
            window.SetProperty("auto sizing", auto_sizing);
            create_array();
        }
        break;
    case 70:
    case 71:
        lang = ret - 70;
        window.SetProperty("lang", lang);
        create_array();
        break;
    case 80:
        ini_selected_idx(1);
        copy_to_clipboard();
        break;
    case 81:
        window.SetProperty("clipboard item name", !clipboard_item_name);
        clipboard_item_name = window.GetProperty("clipboard item name");
        ini_selected_idx(0);
        copy_to_clipboard();
        //on_mouse_rbtn_up (x, y);
        break;
    case 100:
        try {
            window.Reload();   
        } catch(e) {};
        break;
    case 200:
        window.ShowProperties();
        break;   
    case 300:
        window.ShowConfigure();     
        break;
   }
    _menu.Dispose();
    return true;
}

/////////////////////////////  Create file

var fso = new ActiveXObject("Scripting.FileSystemObject");
var output_path = fb.FoobarPath + "\\tmp_Properties\\";

function check_folder(n) {
    if (!n) return;
    try {
        if(!fso.FolderExists(n)) {fso.CreateFolder(n)};
    } catch(e) {}
}

window.GetProperty("ext", 1);
var separator = Array(" ; ","\t");
var tmp_output_item_name_array = [];
var output_array = [];
var pllist_name;
var selected;
var shift = 0;

create_tmp_output_item_name_array();

function  create_tmp_output_item_name_array() {
    tmp_output_item_name_array = [];
    for (var j = 0; j < tfname.length; j++) {   
        if (tfname[j][0].search(/group|lastfm/g) < 0){
            tmp_output_item_name_array.push(tfname[j][0]);
        }
    }
}

for (var j = 0; j < tmp_output_item_name_array.length; j++) {   
    window.GetProperty(j + 1, false);
}

function  create_output_array() {
    output_array = [];
    for (var j = 0; j < tmp_output_item_name_array.length; j++) {   
        selected = window.GetProperty(j + 1);
        if ( selected ) {output_array.push(tmp_output_item_name_array[j])};
    }
    createTextFile();
}

function createTextFile(){
    check_folder(output_path);
    count = plman.GetPlaylistSelectedItems(plman.ActivePlaylist).Count;
    if (count == 0 || output_array.length == 0) return;

    if (window.GetProperty("ext") == 0) {
        output_file = output_path + "plist " + pllist_name + ".txt";
    } else {
        output_file = output_path + "plist " + pllist_name + ".xls";
    }
   
    try { file = fso.CreateTextFile( output_file )
    } catch(e) { return };
   
    var text_item_name = [];
    var string_item_name = "";
   
    for (var j = 0; j < output_array.length; j++) {
        text_item_name.push(output_array[j]);       
    }
   
    string_item_name = text_item_name.join(separator[window.GetProperty("ext")]);
    file.WriteLine(string_item_name);
    file.WriteLine("");

    for (var i = 0; i < count; i++) {
        item = plman.GetPlaylistSelectedItems(plman.ActivePlaylist).Item(i);
       
        var text_item_value = [];
        var string_item_value = "";
       
        for (var j = 0; j < output_array.length; j++) {   
            value = fb.TitleFormat("[" + output_array[j] + "]").EvalWithMetadb(item);
               
            text = get_measure(output_array[j]);
            text = value && text ?  "  " + text : "";
           
            text_item_value.push(value + text);
           
            string_item_value = text_item_value.join(separator[window.GetProperty("ext")]);
        }
       
        try { file.WriteLine(string_item_value);
        } catch(e) {};
    }
    file.Close();
}

function menu_create_file(x, y){
    var _menu = window.CreatePopupMenu();
    var i = 1;
 
    count = plman.GetPlaylistSelectedItems(plman.ActivePlaylist).Count;
    MF_STRING = count == 0 ? MF_GRAYED : MF_ENABLED;
   
    pllist_name = plman.GetPlaylistName(plman.ActivePlaylist);
    pllist_name = count == 0 ? "*" : pllist_name.replace(/[\/\:\*\?\"\<\>\|]/g,'');
   
    _menu.AppendMenuItem(MF_STRING, i++, "Create  " + pllist_name + (window.GetProperty("ext") == 0 ? ".txt" : ".xls"));
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
   
    var lines = 20;   
    bl = tmp_output_item_name_array.length > lines ? lines + shift : tmp_output_item_name_array.length;

    for (var j = shift; j < bl; j++) {
        menuItem = clear_item_name(tmp_output_item_name_array[j]);
        _menu.AppendMenuItem(MF_ENABLED, i++, menuItem);   
        _menu.CheckMenuItem(i - 1, window.GetProperty(i - 2 + shift));
    }
   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 100, "txt");
    _menu.AppendMenuItem(MF_ENABLED, 101, "xls");
    _menu.CheckMenuRadioItem(100, 101, 100 + window.GetProperty("ext"));     
    _menu.EnableMenuItem(100 + window.GetProperty("ext"), 1);
   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 110, "Select all");
    _menu.AppendMenuItem(MF_ENABLED, 120, "Clear all");

    if (tmp_output_item_name_array.length > lines) {
        _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
        _menu.AppendMenuItem(shift == 0 ? MF_GRAYED : MF_ENABLED, 130, "Up");
        _menu.AppendMenuItem(shift + lines >= tmp_output_item_name_array.length ? MF_GRAYED : MF_ENABLED, 140, "Down");
    }

    ret = _menu.TrackPopupMenu(x + 20, y - 250);

    switch (true) {
    case (ret == 1):
        create_output_array();
        break;
    case (ret >= 2 && ret <= tmp_output_item_name_array.length + 1):
        selected = window.GetProperty(ret - 1 + shift);
        window.SetProperty(ret - 1 + shift, selected == false ? true : false);
        menu_create_file(x,y);
        break;
    case (ret == 100):
        window.SetProperty("ext", 0);
        menu_create_file(x,y);
        break;
    case (ret == 101):
        window.SetProperty("ext", 1);
        menu_create_file(x,y);
        break;
    case (ret == 110):
        for (var j = 1; j < tmp_output_item_name_array.length + 1; j++) {   
            window.SetProperty(j, true);
        }
        menu_create_file(x,y);
        break;
    case (ret == 120):
        for (var j = 1; j < tmp_output_item_name_array.length + 1; j++) {   
            window.SetProperty(j, false);
        }
        menu_create_file(x,y);
        break;
    case (ret == 130):
        shift = shift - 1;
        menu_create_file(x,y);
        break;
    case (ret == 140):
        shift = shift + 1;
        menu_create_file(x,y);
        break;
   }
   _menu.Dispose();
}

/////////////////////////////  Copy to clipboard

function ini_selected_idx(n){
    for (j = 0; j < item_name_array_0.length; j++) {
        selected_idx[j] = n;
    }
}

function copy_to_clipboard(){
    var clipboard_text = "";

    for (var i = 0; i < item_name_array_0.length; i++) {
       
        if (selected_idx[i] > 0){
            group = item_name_array_0[i].search('group') >= 0 ? true : false;
       
            if (!group){
                name = lang == 0 ? clear_item_name(item_name_array_0[i]) : item_name_array_1[i];
                value = item_value_array[i];
               
                name = clipboard_item_name ? name + "\t" : "";

                clipboard_text = clipboard_text + name + value + (i < item_name_array_0.length - 1 ? "\r\n" : "");
            }
        }
    }

    htmlfile.parentWindow.clipboardData.setData("text", clipboard_text);
    window.Repaint();
}

/////////////////////////////  Draw star

function draw_star(gr, x, y, img_size, fill, line_thickness, color, sh, sh_color, alpha){
    var radius = img_size / 2;
    var radius_2 = radius / 2.61803;
    line_thickness = line_thickness >= radius_2 ? radius_2 : line_thickness;
    var delta = line_thickness / 2 * Math.tan(72 / 180 * Math.PI);

    var points = [], sh_points = [];
    var x_points_1 = [], y_points_1 = [], x_points_2 = [], y_points_2 = [];

    for (var i = 0; i < 10; i++) {
        if (i % 2 == 0) {
            x_points_1.push((radius - delta) * Math.cos(Math.PI * i / 10 * 2 - Math.PI / 2));
            y_points_1.push((radius - delta) * Math.sin(Math.PI * i / 10 * 2 - Math.PI / 2));
        } else {
            x_points_2.push((radius - delta) / 2.61803 * Math.cos(Math.PI * i / 10 * 2 - Math.PI / 2));
            y_points_2.push((radius - delta) / 2.61803 * Math.sin(Math.PI * i / 10 * 2 - Math.PI / 2));
        }
    }
       
    for (var i = 0; i < 5; i++) {
        points.push(x_points_1[i] + radius, y_points_1[i] + radius, x_points_2[i] + radius, y_points_2[i] + radius);
        sh_points.push(x_points_1[i] + radius + 1, y_points_1[i] + radius + 1, x_points_2[i] + radius + 1, y_points_2[i] + radius + 1);
    }

    var img = gdi.CreateImage(img_size, img_size);
    var temp_gr = img.GetGraphics();
    temp_gr.SetSmoothingMode(2);
   
    if (line_thickness > 0) {
        sh && temp_gr.DrawPolygon(sh_color, line_thickness, sh_points);
        temp_gr.DrawPolygon(color, line_thickness, points);
    }

    if (fill && line_thickness == 0) {
        sh && temp_gr.FillPolygon(sh_color, 1, sh_points);
        temp_gr.FillPolygon(color, 1, points)
    }

    gr.DrawImage(img, x - radius, y - radius, img_size, img_size, 0, 0, img_size, img_size, 0, alpha);
   
    img.ReleaseGraphics(temp_gr);
    img.Dispose();
    temp_gr = null;
    img = null;
}

/////////////////////////////  wsh tooltip (custom paint)

function active_tooltip(){     
    if (!tooltip_state){     
        tooltip_state = true;   
        tooltip.Activate();     
        tooltip.TrackActivate = true;   
    }     
}     
     
function deactive_tooltip(){
    tooltip_time.Reset();   
    if (tooltip_state){   
        tooltip.Deactivate();
        tooltip.TrackActivate = false;   
        tooltip_state = false;   
    }     
}     

function on_tooltip_custom_paint(gr){
    for (var i = 0; i < tooltip_t.length; i += 1) {
        gr.GdiDrawText( tooltip_t[i], font_tooltip, RGB(0,0,0), 5, tooltip_t_h * i + 1, tooltip.Width, tooltip.Height, DT_LEFT | DT_WORDBREAK | DT_NOPREFIX );
    }
}   

function tooltip_activate_wsh(x, y) {
    tooltip_x = t_x2 - 5;
    tooltip_y = idx * f_h - Math.abs(s);

    var value_width = calc_text_data( "w", item_value_array[idx], font_item_value );
   
    if (value_width > ww - t_x2 - t_x1 && x > t_x2 && x < ww - t_x1 && y > tooltip_y + 1 && y < tooltip_y + f_h - 1){
        if (tooltip_time.Time > tooltip_delay_time && !tooltip_state) {
            tooltip_text = item_value_array[idx];
            calc_tooltip_dim();
            tooltip.TrackPosition( tooltip_x, tooltip_y + window.GetProperty(" vertical item padding") / 2);
            active_tooltip();
            tooltip.Text = " ";   
        }       
    } else {   
        deactive_tooltip();   
    }
}

function calc_tooltip_dim(){
    tooltip_t_w = calc_text_data( "w", tooltip_text, font_tooltip );   
    tooltip_t_h = calc_text_data( "h", tooltip_text, font_tooltip );
    tooltip_t_tmp = calc_text_data( "a", tooltip_text, font_tooltip, tooltip_max_w );
   
    tooltip_t = [];
    tooltip_l = [];

    for (var i = 0; i < tooltip_t_tmp.length; i += 1) {
        if (i % 2 == 0) {
            tooltip_t.push(tooltip_t_tmp[i].replace(/^\s+|\s+$/g, ""));
        } else {
            tooltip_l.push(tooltip_t_tmp[i]);
        }
    }
   
    if (tooltip_t_w <= tooltip_max_w){
        tooltip.Width = tooltip_t_w + 5;
        tooltip.Height = tooltip_t_h;
    } else {
        tooltip.Width = Math.max.apply(null, tooltip_l) + 5;
        tooltip.Height = tooltip_t_h * tooltip_t.length;
    }
}   

function calc_text_data(d, text, font, max_w) {
    var temp_bmp = gdi.CreateImage(1, 1);
    var temp_gr = temp_bmp.GetGraphics();
    var tmp;
   
    switch (d) {
    case "w":
        tmp = temp_gr.CalcTextWidth(text, font);
        break;
    case "h":
        tmp = temp_gr.CalcTextHeight(text, font);
        break;
    case "a":
        tmp = temp_gr.EstimateLineWrap(text, font, max_w).toArray();
        break;
    }
   
    temp_bmp.ReleaseGraphics(temp_gr);
    temp_bmp.Dispose();
    temp_gr = null;
    temp_bmp = null;
    return tmp;
}

/////////////////////////////  jscript tooltip

function tooltip_activate_jscript(x, y) {
    tooltip_x = t_x2 - 5;
    tooltip_y = idx * f_h - Math.abs(s);

    var value_width = calc_text_data("w",  item_value_array[idx], font_item_value)
   
    if (value_width > ww - t_x2 - t_x1 && x > t_x2 && x < ww - t_x1 && y > tooltip_y + 1 && y < tooltip_y + f_h - 1){
        if (tooltip_time.Time > tooltip_delay_time) {
            tooltip.Text = item_value_array[idx];
            tooltip.TrackPosition( tooltip_x, tooltip_y + window.GetProperty(" vertical item padding") / 2);
            tooltip.TrackActivate = true;
            tooltip.Activate();
            tooltip_state = true;   
        }
    } else {
        deactive_tooltip();
    }
}

/////////////////////////////  lastFM data

function get_lastFM_similar(a){
    if (!a) return
    var xmlhttp0 = new ActiveXObject("Microsoft.XMLHTTP");   
    var url0 = ("https://www.last.fm/music/" + encodeURIComponent(a) + "/+similar");
    xmlhttp0.open("GET", url0, true );
    xmlhttp0.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
    xmlhttp0.send(null);     
    xmlhttp0.onreadystatechange = function () {
        if (xmlhttp0.readyState == 4) {
            if (xmlhttp0.status == 200) {
                doc.open();     
                var div = doc.createElement("div");
                div.innerHTML = xmlhttp0.responsetext;
                var a = div.getElementsByTagName("a");
               
                var tmp = [];
                var j = 0;
             
                for (i = 0; i < a.length; i++) {
                    if (a[i].className == "link-block-target"){
                        tmp[j] = a[i].innerHTML.replace(/(&amp;)/g,'&');
                        j++
                        if (j == 6) break;
                    }
                }
                doc.close();
                similar = tmp.join(";");
                create_array();
            }
        }
    }     
}

function get_lastFM_artist_info(a){
    if (!a) return
    var xmlhttp1 = new ActiveXObject("Microsoft.XMLHTTP");   
    var url1 = ("https://www.last.fm/music/" + encodeURIComponent(a));
    xmlhttp1.open("GET", url1, true );
    xmlhttp1.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
    xmlhttp1.send(null);     
    xmlhttp1.onreadystatechange = function () {
        if (xmlhttp1.readyState == 4) {
            if (xmlhttp1.status == 200) {
                doc.open();     
                var div = doc.createElement("div");
                div.innerHTML = xmlhttp1.responsetext;
                var abbr = div.getElementsByTagName("abbr");
               
                for (i = 0; i < abbr.length; i++) {
                    if (abbr[i].className == "intabbr"){
                        artist_info.push(abbr[i].title.replace(/\,/g, " "));
                    }
                }
                doc.close();
                create_array();
            }
        }
    }     
}

function get_lastFM_album_info(a, al){
    if (!a || !al) return
    var xmlhttp2 = new ActiveXObject("Microsoft.XMLHTTP");   
    var url2 = ("https://www.last.fm/music/" + encodeURIComponent(a) + "/" + encodeURIComponent(al));
    xmlhttp2.open("GET", url2, true );
    xmlhttp2.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
    xmlhttp2.send(null);     
    xmlhttp2.onreadystatechange = function () {
        if (xmlhttp2.readyState == 4) {
            if (xmlhttp2.status == 200) {
                doc.open();     
                var div = doc.createElement("div");
                div.innerHTML = xmlhttp2.responsetext;
                var abbr = div.getElementsByTagName("abbr");
               
                for (i = 0; i < abbr.length; i++) {
                    if (abbr[i].className == "intabbr"){
                        album_info.push(abbr[i].title.replace(/\,/g, " "));
                    }
                }
                doc.close();
                create_array();
            }
        }
    }
}
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет 7 месяцев

Сообщение #2079 maniac736 » 29.12.2017, 17:59

Требуется помощь. Попробовал скрипт WSH из сборки s8e подогнать под цветовую схему сборки Dr.Death. Угробил на это дело почти неделю, а кроме бешенства в результате ноль.

Код: Выделить всё
// Maxim Terpilovsky's script
// http://terpilovsky.ru
// Playlist Tabs Panel / Updated: 15-02-2013

// ==PREPROCESSOR==
// @feature "dragdrop"
// ==/PREPROCESSOR==


DT_TOP = 0x00000000;
DT_LEFT = 0x00000000;
DT_CENTER = 0x00000001;
DT_RIGHT = 0x00000002;
DT_VCENTER = 0x00000004;
DT_BOTTOM = 0x00000008;
DT_WORDBREAK = 0x00000010;
DT_SINGLELINE = 0x00000020;
DT_EXPANDTABS = 0x00000040;
DT_TABSTOP = 0x00000080;
DT_NOCLIP = 0x00000100;
DT_EXTERNALLEADING = 0x00000200;
DT_CALCRECT = 0x00000400;
DT_NOPREFIX = 0x00000800;
DT_INTERNAL = 0x00001000;
DT_EDITCONTROL = 0x00002000;
DT_PATH_ELLIPSIS = 0x00004000;
DT_END_ELLIPSIS = 0x00008000;
DT_MODIFYSTRING = 0x00010000;
DT_RTLREADING = 0x00020000;
DT_WORD_ELLIPSIS = 0x00040000;
DT_NOFULLWIDTHCHARBREAK = 0x00080000;
DT_HIDEPREFIX = 0x00100000;
DT_PREFIXONLY = 0x00200000;

MF_SEPARATOR = 0x00000800;
MF_ENABLED = 0x00000000;
MF_GRAYED = 0x00000001;
MF_DISABLED = 0x00000002;
MF_UNCHECKED = 0x00000000;
MF_CHECKED = 0x00000008;
MF_STRING = 0x00000000;
MF_POPUP = 0x00000010;
MF_MENUBARBREAK = 0x00000020;
MF_MENUBREAK = 0x00000040;


var blue_1 = RGB(245,246,247);
var blue_1b = RGB(238,243,247);
var blue_2 = RGB(237,242,250);
var blue_2b = RGB(223,232,247);
var blue_3 = RGB(215,228,244);
var blue_4 = RGB(193,210,232);

var blue_5 = RGB(210,245,190);
var blue_5b = RGB(193,241,165);
var blue_6 = RGB(145,210,250);
var blue_6b = RGB(125,200,250);
var blue_7 = RGB(125,200,250);
var blue_8 = RGB(65,170,245);




// Loading images
try { page_image = gdi.Image( fb.FoobarPath + "\\s7e_files\\images\\playlist-full.png" ); }
catch(e) { page_image = false; }

try { page_white = gdi.Image( fb.FoobarPath + "\\s7e_files\\images\\playlist-empty.png" ); }
catch(e) { page_white = false; }

try { page_image_add = gdi.Image( fb.FoobarPath + "\\s7e_files\\images\\playlist-add.png" ); }
catch(e) { page_image_add = false; }

try { page_white_link = gdi.Image( fb.FoobarPath + "\\s7e_files\\images\\playlist-auto.png" ); }
catch(e) { page_white_link = false; }

try { music_image = gdi.Image( fb.FoobarPath + "\\s7e_files\\images\\music.png" ); }
catch(e) { music_image = false; }

try { quit_image = gdi.Image( fb.FoobarPath + "\\s7e_files\\images\\cross.png" ); }
catch(e) { music_image = false; }

try { green_arrow_image = gdi.Image( fb.FoobarPath + "\\s7e_files\\images\\arrow_down_green.png" ); }
catch(e) { green_arrow_image = false; }

try { blue_arrow_image = gdi.Image( fb.FoobarPath + "\\s7e_files\\images\\blue_arrow_image.png" ); }
catch(e) { blue_arrow_image = false; }

try { grey_arrow_image = gdi.Image( fb.FoobarPath + "\\s7e_files\\images\\grey_arrow_image.png" ); }
catch(e) { grey_arrow_image = false; }

try { arrow_image = gdi.Image( fb.FoobarPath + "\\s7e_files\\images\\arrow_down_black.png" ); }
catch(e) { arrow_image = false; }
   
try { cross_image = gdi.Image( fb.FoobarPath + "\\s7e_files\\images\\cross_black.png" ); }
catch(e) { cross_image = false; }
   



var tooltip = window.CreateTooltip();
tooltip.SetMaxWidth(200);


if ( utils.CheckFont( "Segoe UI" ) ) {

    var font = gdi.Font("Segoe UI", 12, 0);
    var font_bold = gdi.Font("Segoe UI", 12, 1);

} else {

    var font = gdi.Font("Tahoma", 11, 0);
    var font_bold = gdi.Font("Tahoma", 11, 1);

}



function RGBA(r, g, b, a) {
   return ((a << 24) | (r << 16) | (g << 8) | (b));
}


function RGB(r, g, b) {
   return (0xff000000 | (r << 16) | (g << 8) | (b));
}

function unique(arr) {
    var o = {}, i, l = arr.length, r = [];
    for(i=0; i<l;i+=1) o[arr[i]] = arr[i];
    for(i in o) r.push(o[i]);
    return r;
}

function PlaylistTabs() {


   this.GetPlaylists = function() {

      var pls = [];

      for ( i = 0; i < fb.PlaylistCount; i++ ) {
         pls[ pls.length ] = fb.GetPlaylistName(i);
      }

      this.Playlists = pls;

   }

   this.AvailableWidth = ww - 62;


   this.Update = function() {

      this.GetPlaylists();

        this.MaxWidth = 250;
        this.MinWidth = 135;
        this.MaxTabs  = Math.floor( (ww - 62) / 135 );

      this.PlaylistsDrawnNumber = Math.max( Math.min( this.Playlists.length, this.MaxTabs), 3 );

      this.TabWidth = Math.round( Math.min( this.AvailableWidth / this.PlaylistsDrawnNumber, this.MaxWidth) );

      this.TabsWidth = this.TabWidth * this.Playlists.length;

   }

   this.Update();

   this.Offset = 0;



   this.AdjustOffset = function() {

        if ( Tabs.Playlists.length > 0 ) {

            if ( !fb.GetPlaylistName( fb.ActivePlaylist ) ) fb.ActivePlaylist = 0;

            var new_tab_x = ( fb.ActivePlaylist + 1) * this.TabWidth;
            var tab_center_x = new_tab_x - this.TabWidth / 2;
            var tab_x1 = new_tab_x - this.TabWidth;
            var tab_x2 = new_tab_x;
            var view_x1 = this.Offset;
            var view_x2 = this.Offset + this.AvailableWidth;

            //fb.trace( 'Offset = ' + this.Offset + '\ntab_x1 = ' + tab_x1 + '\ntab_x2 = ' + tab_x2 + '\nview_x2=' + view_x2 + '\ntab_center_x = ' + tab_center_x );

            if ( tab_x1 < view_x1 || tab_x2 < view_x1 ) {
                this.Offset = tab_x1;
            }
            else if ( tab_x1 > view_x2 || tab_x2 > view_x2 ) {
                this.Offset = view_x1 + tab_x2 - view_x2;
            }
            else if ( tab_x1 < 0 ) {
                this.Offset = 0;
            }
            else if ( tab_x2 > this.TabsWidth && tab_center_x > this.AvailableWidth ) {
                this.Offset = this.TabsWidth - this.AvailableWidth;
            }

        } else this.Offset = 0;

   }


   this.DeleteTab = function( tab ) {

      var hovertab_cached = tab;

      var active_cached = fb.ActivePlaylist;
      fb.RemovePlaylist( hovertab_cached - 1 );

      this.Update();
      this.Offset = ( this.TabsWidth > this.AvailableWidth ) ? ( (this.Offset > this.TabsWidth - this.AvailableWidth ) ? this.TabsWidth - this.AvailableWidth : this.Offset) : 0;


      if ( ( hovertab_cached - 1 ) == active_cached ) {

         if ( fb.GetPlaylistName( hovertab_cached ) ) {
            fb.ActivePlaylist = hovertab_cached;
         }
         else if ( fb.GetPlaylistName( hovertab_cached - 2 ) ) {
            fb.ActivePlaylist = hovertab_cached - 2;
         }
      }

   }

   this.CreateTab = function() {

      var new_playlist_idx = fb.CreatePlaylist( fb.PlaylistCount, "Playlist " + ( fb.PlaylistCount + 1 ) );
      fb.ActivePlaylist = new_playlist_idx;

      this.Update();

      var new_tab_x = ( new_playlist_idx + 1 ) * this.TabWidth;
      if ( new_tab_x > this.AvailableWidth ) this.Offset = new_tab_x - this.AvailableWidth;

   }


   this.HiddenOffset = 20;

   this.HoverTab = null;
   this.HoverTabCached = null;
   this.HoverTabCloseButton = 0;

   this.Clicked = 0;
    this.DragOver = 0;
    this.DragTabFrom = 0;
    this.DragTabTo = 0;

}





var ww, wh, Tabs, x1, x2;


function on_size() {

   wh = window.Height;
   ww = window.Width;
   Tabs = new PlaylistTabs();
   Tabs.AdjustOffset();

}


function on_paint(gr) {

   //gr.SetSmoothingMode(3);
    gr.SetTextRenderingHint(5);

    //gr.DrawLine(0, 21, window.Width, 21, 1, RGB(255, 0, 0));

   for ( a in Tabs.Playlists ) {

      var x = Math.round( Tabs.HiddenOffset + a * Tabs.TabWidth - Tabs.Offset );
      var y_offset = -1;

      if ( fb.ActivePlaylist != a && a != fb.PlayingPlaylist ) {

         gr.FillSolidRect(x, y_offset, Tabs.TabWidth, wh, Tabs.HoverTab - 1 != a ? blue_1 : blue_1b );

        }
      if ( fb.PlayingPlaylist == a && fb.ActivePlaylist != fb.PlayingPlaylist ) {

         gr.FillSolidRect(x, y_offset, Tabs.TabWidth, wh, Tabs.HoverTab - 1 != a ? blue_5 : blue_5b );

      }

        if ( fb.ActivePlaylist == a ) gr.DrawLine(x, wh - 1, x + Tabs.TabWidth, wh - 1, 1, RGB(255,255,255));

      gr.DrawRect(x, 0 + y_offset, Tabs.TabWidth, wh, 1, RGB(218,219,220));


        // Tab bottom line
        gr.DrawLine(x, wh - 1, x + Tabs.TabWidth, wh - 1, 1, RGB(218,219,220));
        if ( fb.ActivePlaylist == a ) gr.DrawLine(x + 1, wh - 1, x + Tabs.TabWidth, wh - 1, 1, RGB(255,255,255));


        // Playlist icon
      if ( Tabs.DragOver && a == Tabs.HoverTab - 1 && page_image_add ) {

            gr.DrawImage( page_image_add, x + 5, (wh - 16) / 2, 16, 16, 0, 0, 16, 16, 0, 255);

        }
        else if ( page_image && music_image && page_white_link && page_white ) gr.DrawImage( ( fb.PlayingPlaylist == a ) ? music_image : ( fb.IsAutoPlaylist(a) ? page_white_link : ( fb.PlaylistItemCount(a) > 0 ? page_image : page_white ) ) , x + 5, (wh - 16) / 2, 16, 16, 0, 0, 16, 16, 0, 255);


      if ( (fb.ActivePlaylist ) == a ) {

         if ( Tabs.HoverTabCloseButton == 1 && Tabs.HoverTab - 1 == a ) {

            gr.DrawRect(x + Tabs.TabWidth - 20, (wh - 18) / 2, 16, 17, 1, RGB(218,219,220));

         }
         if ( quit_image ) gr.DrawImage( quit_image, x + Tabs.TabWidth - 16.5, (wh - 8) / 2 - 1, 10, 10, 0, 0, 16, 16, 0, 255);
         var text_sub = 20;

      }
      else text_sub = 6;

      try {

         gr.GdiDrawText( Tabs.Playlists[a] + ' (' + fb.PlaylistItemCount(a) + ')', ( fb.ActivePlaylist == a ) ? font_bold : font, ( fb.ActivePlaylist == a || fb.PlayingPlaylist == a ) ? RGB(0,0,0) : RGB(60,60,60), x + 24, 0, Tabs.TabWidth - 26 - text_sub, wh, DT_NOPREFIX | DT_LEFT | DT_VCENTER | DT_CALCRECT | DT_END_ELLIPSIS );

        } catch(e) { fb.trace( e.message ); fb.trace( Tabs.Playlists[a] ); }

        if ( Tabs.DragOver && a == Tabs.HoverTab - 1 ) {
            //gr.DrawImage( green_arrow_image, x = Tabs.HiddenOffset + a * Tabs.TabWidth - Tabs.Offset + Tabs.TabWidth / 2, 0, 16, 16, 0, 0, 16, 16, 0, 255);
        }

    }


   gr.FillSolidRect( -1, -1, 21, wh + 2, RGB(255,255,255));
   gr.FillSolidRect( ww - 42, -1, 42, wh + 2, RGB(255,255,255));



   // BUTTONS
   //gr.FillGradRect( 0, 2, 20, wh / 2, 90, RGB(248,251,254), RGB(237,242,250));
   //gr.FillGradRect( 0, wh / 2, 20, wh / 2 - 1, 90, RGB(215,228,244), RGB(193,210,232));

   //gr.DrawRoundRect( 0, 1, 20, wh - 1, 1, 1, 1, RGB(255,255,255));
   gr.DrawRoundRect( -1, -1, 21, wh, 1, 1, 1, RGB(218,219,220));
   if ( arrow_image ) gr.DrawImage( arrow_image, 2, (wh - 10)/2, 14, 10, 0, 0, 16, 16, 90, Tabs.Offset > 0 ? 255 : 55);


   //gr.FillGradRect( ww - 40, 2, 20, wh / 2, 90, RGB(248,251,254), RGB(237,242,250));
   //gr.FillGradRect( ww - 40, wh / 2, 20, wh / 2 - 1, 90, RGB(215,228,244), RGB(193,210,232));

   //gr.DrawRoundRect( ww - 40, 1, 20, wh - 1, 1, 1, 1, RGB(255,255,255));
   gr.DrawRoundRect( ww - 42, -1, 21, wh, 1, 1, 1, RGB(218,219,220));
   if ( cross_image ) gr.DrawImage( cross_image, ww - 39, (wh - 16)/2, 16, 16, 0, 0, 16, 16, 0, 255);


   //gr.FillGradRect( ww - 20, 2, 20, wh / 2, 90, RGB(248,251,254), RGB(237,242,250));
   //gr.FillGradRect( ww - 20, wh / 2, 20, wh / 2 - 1, 90, RGB(215,228,244), RGB(193,210,232));

   //gr.DrawRoundRect( ww - 20, 1, 20, wh - 1, 1, 1, 1, RGB(255,255,255));
   gr.DrawRoundRect( ww - 21, -1, 21, wh, 1, 1, 1, RGB(218,219,220));
   if ( arrow_image ) gr.DrawImage( arrow_image, ww - 17, (wh - 10)/2 - 1, 14, 10, 0, 0, 16, 16, -90, ( Tabs.Offset + 30 > Tabs.TabsWidth - Tabs.AvailableWidth ) ? 55 : 255);

    // Underlining buttons
    gr.DrawLine(0, wh - 1, 20, wh - 1, 1, RGB(218,219,220));
    gr.DrawLine(ww-42, wh - 1, ww, wh - 1, 1, RGB(218,219,220));
    gr.DrawLine(Tabs.HiddenOffset + Tabs.Playlists.length * Tabs.TabWidth - Tabs.Offset, wh - 1, ww - 40, wh - 1, 1, RGB(218,219,220));


    // DRAG TAB ICON
    if ( Tabs.DragTabFrom && Tabs.DragTabTo && Tabs.DragTabFrom != Tabs.DragTabTo && blue_arrow_image && grey_arrow_image ) {
        var с = ( Tabs.DragTabTo > Tabs.DragTabFrom ) ? 0 : 1;
        //( Tabs.DragTabFrom != Tabs.DragTabTo ) ? blue_arrow_image : grey_arrow_image
        gr.DrawImage( grey_arrow_image, x = Tabs.HiddenOffset + ( Tabs.DragTabTo - с ) * Tabs.TabWidth - Tabs.Offset - 8, -4, 16, 16, 0, 0, 16, 16, 0, 255);
    }

}


function trackmouse( x ) {

    if ( Tabs.Playlists.length > 0 ) {

        var real_x = Tabs.Offset - Tabs.HiddenOffset + x;
        var tab_num = Math.ceil( real_x / Tabs.TabWidth );


        if ( !fb.GetPlaylistName(tab_num - 1) ) tab_num = null;

        if ( tab_num != null ){
            var close_x = Tabs.TabWidth - (real_x - ( (tab_num - 1) * Tabs.TabWidth));
            var closehover = ( close_x < 22 && close_x > 4 ) ? 1 : 0;
        } else {
            var closehover = 0;
        }

        return new Array(tab_num, closehover);

    } else return false;

}


function on_mouse_move( x, y) {

   var got = trackmouse(x);
    x2 = x;

   if ( got && ( got[0] != Tabs.HoverTab || Tabs.HoverTabCloseButton != got[1] ) ) {

      tooltip.Deactivate();

      Tabs.HoverTabCached = Tabs.HoverTab;
      Tabs.HoverTab = got[0];
      Tabs.HoverTabCloseButton = got[1];

        if      ( Tabs.DragTabFrom && Tabs.DragTabFrom != Tabs.HoverTab && got[0] )  Tabs.DragTabTo = Tabs.HoverTab;
        else if ( Tabs.DragTabFrom && Tabs.DragTabFrom == Tabs.HoverTab )            Tabs.DragTabTo = Tabs.DragTabFrom;


      if ( Tabs.HoverTab != null ) {

         // Activating Tooltip
            var pn = Tabs.Playlists[Tabs.HoverTab - 1];
            var pc = fb.PlaylistItemCount( Tabs.HoverTab - 1 );
            var text = 'Name: ' + pn + '\nItems: ' + pc;
            tooltip.Text = text;

         tooltip.Activate();

      }
      else {

         // Deactivating Tooltip
         tooltip.Deactivate();

      }

      window.Repaint();

   }
    //else if ( Tabs.DragTabFrom == Tabs.HoverTab && !Tabs.DragTabTo && Math.abs(x1 - x2) > 16 ) {

        //Tabs.DragTabTo = Tabs.HoverTab;
        //window.Repaint();

    //}


   if ( Tabs.HoverTab != null || x > ww - 42 || x < 20 || Tabs.DragTabFrom ) {

      // Changing cursor
      window.SetCursor(32649);

   }
   else {

      // Reversing cursor
      window.SetCursor(32512);

   }   

}

function on_mouse_leave() {


   Tabs.HoverTab = null;
   Tabs.HoverTabCloseButton = 0;

    Tabs.DragTabTo = 0;
    Tabs.DragTabFrom = 0;

   window.SetCursor(32512);
   window.Repaint();

   tooltip.Deactivate();

}

function on_playlists_changed() {

   Tabs.Update();

   window.Repaint();

}


function on_playlist_switch() {

   Tabs.Update();

   if ( !Tabs.Clicked ) Tabs.AdjustOffset();

   window.Repaint();

}




function on_mouse_wheel( delta ) {

   // Down
   if ( delta < 0 && Tabs.Offset < Tabs.TabsWidth - Tabs.AvailableWidth ) {
      ( Tabs.Offset - delta * 50 > Tabs.TabsWidth - Tabs.AvailableWidth ) ? Tabs.Offset = Tabs.TabsWidth - Tabs.AvailableWidth : Tabs.Offset -= delta * 50;
      window.Repaint();
   }
   // Up
   else if ( delta > 0 && Tabs.Offset > 0 ) {
      ( Tabs.Offset - delta * 50 > 0 ) ? Tabs.Offset -= delta * 50 : Tabs.Offset = 0;
      window.Repaint();
   }
   
   //fb.trace( Tabs.Offset );
   //fb.trace( Tabs.TabsWidth - Tabs.AvailableWidth );
}




function on_mouse_lbtn_up(x, y) {

    // End x coordinate
    x2 = x;

   if ( x > ww - 21 && !Tabs.Clicked ) {

      if ( Tabs.TabsWidth > Tabs.AvailableWidth ) ( Tabs.Offset + 60 > Tabs.TabsWidth - Tabs.AvailableWidth ) ? Tabs.Offset = Tabs.TabsWidth - Tabs.AvailableWidth : Tabs.Offset += 60;
      fb.trace( Tabs.Offset );
      window.Repaint();

   }
   else if ( x > ww - 42 && x < ww - 21 && !Tabs.Clicked ) {

            var _menu = window.CreatePopupMenu();
            var i = 1;
            var ret;
            var metadb = fb.GetNowPlaying() ? fb.GetNowPlaying() : ( fb.GetFocusItem() ? fb.GetFocusItem() : false);

            var _firstgroup = window.CreatePopupMenu();
            var _secondgroup = window.CreatePopupMenu();

            _menu.AppendMenuItem(MF_STRING, i++, "Create an empty playlist");

            if ( metadb ) {

                _menu.AppendMenuSeparator();


                // ARTIST
                var artist = fb.TitleFormat("[%artist%]").EvalWithMetadb( metadb );

                _firstgroup.AppendMenuItem(MF_STRING, i++, "Artist (" + (artist ? artist : 'Unknown') + ')');
                if ( !artist ) _firstgroup.EnableMenuItem( i - 1, 1);


                // GENRE
                var genre = fb.TitleFormat("[%genre%]").EvalWithMetadb( metadb );

                _firstgroup.AppendMenuItem(MF_STRING, i++, "Genre (" + (genre ? genre : 'Unknown') + ')');
                if ( !genre ) _firstgroup.EnableMenuItem( i - 1, 1);



                // STYLE
                var style = fb.TitleFormat("[%style%]").EvalWithMetadb( metadb );

                _firstgroup.AppendMenuItem(MF_STRING, i++, "Style (" + (style ? style : 'Unknown') + ')');
                if ( !style ) _firstgroup.EnableMenuItem( i - 1, 1);



                // DATE
                var date = fb.TitleFormat("[%date%]").EvalWithMetadb( metadb );

                _firstgroup.AppendMenuItem(MF_STRING, i++, "Date (" + (date ? date : 'Unknown') + ')');
                if ( !date ) _firstgroup.EnableMenuItem( i - 1, 1);


                // LABEL
                var label = fb.TitleFormat("$if3(%LABEL%,%PUBLISHER%,%DISCOGS_LABEL_LINK%,)").EvalWithMetadb( metadb );

                _firstgroup.AppendMenuItem(MF_STRING, i++, "Label (" + (label ? decodeURIComponent( label ) : 'Unknown') + ')');
                if ( !label ) _firstgroup.EnableMenuItem( i - 1, 1);


                // COUNTRY
                var country = fb.TitleFormat("$if3(%COUNTRY%,%DISCOGS_COUNTRY%,)").EvalWithMetadb( metadb );

                _firstgroup.AppendMenuItem(MF_STRING, i++, "Country (" + (country ? country : 'Unknown') + ')');
                if ( !country ) _firstgroup.EnableMenuItem( i - 1, 1);


                // FORMAT
                var codec = fb.TitleFormat("[$codec()]").EvalWithMetadb( metadb );

                _firstgroup.AppendMenuItem(MF_STRING, i++, "Format (" + (codec ? codec : 'Unknown') + ')');
                if ( !codec ) _firstgroup.EnableMenuItem( i - 1, 1);


                _menu.AppendMenuItem(MF_STRING | MF_POPUP, _firstgroup.ID, "Create an autoplaylist for this...");

            }





            ret = _menu.TrackPopupMenu(x, y);
           
            if (ret == 1 ) {

                Tabs.CreateTab();

            }
            else if (ret == 2 ) {

                var artists = artist.split(', ');

                if ( artists.length > 1 ) var query = artists.join('" OR artist HAS "');
                else var query = artist;

                query = 'artist HAS "' + query + '"';

                fb.CreateAutoPlaylist( fb.PlaylistCount, "Autoplaylist for " + artist, query, "%album artist% $sub(9999,%date%) %album% %discnumber% %tracknumber%");
                fb.ActivePlaylist = fb.PlaylistCount - 1;

            }
            else if (ret == 3) {

                var genres = genre.split(', ');

                if ( genres.length > 1 ) var query = genres.join('" OR genre HAS "');
                else var query = genre;

                query = 'genre HAS "' + query + '"';

                fb.CreateAutoPlaylist( fb.PlaylistCount, "Autoplaylist for " + genre, query, "%album artist% $sub(9999,%date%) %album% %discnumber% %tracknumber%");
                fb.ActivePlaylist = fb.PlaylistCount - 1;

            }
            else if (ret == 4 ) {

                var styles = style.split(', ');

                if ( styles.length > 1 ) var query = styles.join('" OR %style% HAS "');
                else var query = style;

                query = '%style% HAS "' + query + '"';

                fb.CreateAutoPlaylist( fb.PlaylistCount, "Autoplaylist for " + style, query, "%album artist% $sub(9999,%date%) %album% %discnumber% %tracknumber%");
                fb.ActivePlaylist = fb.PlaylistCount - 1;

            }
            else if (ret == 5) {

                date = date.replace(/.*(\d{4}).*/g, "$1");
                query = 'date HAS ' + date;

                fb.CreateAutoPlaylist( fb.PlaylistCount, "Autoplaylist for " + date, query, "%album artist% $sub(9999,%date%) %album% %discnumber% %tracknumber%");
                fb.ActivePlaylist = fb.PlaylistCount - 1;

            }
            else if (ret == 6 ) {

                label = decodeURIComponent( label );
                query = '%LABEL% HAS "' + label + '" OR %PUBLISHER% HAS "' + label + '" OR %DISCOGS_LABEL_LINK% HAS "' + encodeURIComponent( label ) + '"';

                fb.CreateAutoPlaylist( fb.PlaylistCount, "Autoplaylist for " + label, query, "%album artist% $sub(9999,%date%) %album% %discnumber% %tracknumber%");
                fb.ActivePlaylist = fb.PlaylistCount - 1;

            }
            else if (ret == 7 ) {

                query = '%COUNTRY% IS "' + country + '" OR %DISCOGS_COUNTRY% IS "' + country + '"';

                fb.CreateAutoPlaylist( fb.PlaylistCount, "Autoplaylist for " + country, query, "%album artist% $sub(9999,%date%) %album% %discnumber% %tracknumber%");
                fb.ActivePlaylist = fb.PlaylistCount - 1;

            }
            else if (ret == 8 ) {

                query = '%codec% IS ' + codec;

                fb.CreateAutoPlaylist( fb.PlaylistCount, "Autoplaylist for " + codec, query, "%album artist% $sub(9999,%date%) %album% %discnumber% %tracknumber%");
                fb.ActivePlaylist = fb.PlaylistCount - 1;

            }


   }
   else if ( x < 20 && !Tabs.Clicked ) {

      ( Tabs.Offset - 60 > 0 ) ? Tabs.Offset -= 60 : Tabs.Offset = 0;
      window.Repaint();

   }
   else {

      if ( Tabs.HoverTabCloseButton == 1 && Tabs.HoverTab - 1 == fb.ActivePlaylist ) {

         Tabs.DeleteTab( Tabs.HoverTab );

      }
        else if ( Tabs.DragTabFrom && Tabs.DragTabTo && Math.abs(x1 - x2) > 16 ) {

            fb.MovePlaylist( Tabs.DragTabFrom - 1, Tabs.DragTabTo - 1);

        }
        else if ( Tabs.HoverTab != null && Tabs.HoverTab - 1 == fb.ActivePlaylist && !Tabs.DragTabTo ) {

         fb.RunMainMenuCommand('Edit/Select all');
            Tabs.AdjustOffset();

      }
        else if ( Tabs.Clicked && !Tabs.DragTabTo ) {

         fb.ActivePlaylist = Tabs.HoverTab - 1;

      }

        // Emptying useless vars
        Tabs.DragTabFrom = 0;
        Tabs.DragTabTo = 0;

   }

   Tabs.Clicked = 0;

}


function on_mouse_lbtn_down(x, y) {

   if ( x > 20 && x < ww - 40 && Tabs.HoverTab != null ) {

        Tabs.Clicked = 1;
        Tabs.DragTabFrom = Tabs.HoverTab;
        x1 = x;

   }

}



function on_mouse_mbtn_down(x, y, mask) {

   if ( x > 20 && x < ww - 40 ) {

      if ( Tabs.HoverTab != null ) {

         Tabs.DeleteTab( Tabs.HoverTab );

      }
      else {

         Tabs.CreateTab();

      }

   }

}


function on_playback_new_track( metadb ) {

   window.Repaint();

}


function on_playback_starting(cmd, is_paused) {

   window.Repaint();

}


function on_playlist_items_added(playlist) { window.Repaint(); }


function on_playlist_items_removed(playlist, new_count) { window.Repaint(); }


function on_playback_stop(reason) {

   if ( reason == 0 ) {
        fb.PlayingPlaylist = 4294967295;
        window.Repaint();
    }

}

function on_mouse_lbtn_dblclk(x, y, mask) {

   if ( x > 20 && x < ww - 40 ) {
        if ( Tabs.HoverTab != null ) {

            if ( fb.IsAutoPlaylist( Tabs.HoverTab - 1 ) ) fb.ShowAutoPlaylistUI( Tabs.HoverTab - 1 );
            else fb.RunMainMenuCommand( 'View/Playlist Manager' );

       }
        else fb.RunMainMenuCommand( 'View/Playlist Manager' );
   }

}


function on_mouse_rbtn_up(x, y, mask) {

   var _menu = window.CreatePopupMenu();
   var _submenu = window.CreatePopupMenu();
    var _newplaylistmenu = window.CreatePopupMenu();
    var selected_tracks = plman.GetPlaylistSelectedItems( fb.ActivePlaylist );
   var i = 1;
   var ret;

   // Saving tab ID
   Tabs.HoverTabCached = Tabs.HoverTab;

   // Creating menu items
   _menu.AppendMenuItem(MF_STRING, i++, "Create an empty playlist");

    _newplaylistmenu.AppendMenuItem(MF_STRING, i++, '... and copy selected tracks there');
    _newplaylistmenu.AppendMenuItem(MF_STRING, i++, '... and move selected tracks there');
    _newplaylistmenu.AppendTo(  _menu, MF_STRING | ( selected_tracks.Count > 0 ? MF_ENABLED : MF_DISABLED ), "Create a new playlist...");

    if ( selected_tracks.Count > 0 ) {

        var artist = [];
        function iterate( item ) {

            info = item.GetFileInfo();
            var artist_current = info.MetaValue( info.MetaFind('artist'), 0);
            if ( artist_current ) artist.push( artist_current );

        }

        function duff(iterations) {
            var i = iterations % 8;
            var n = 0;
            if( i>0 ) {
                do {
                    var item = selected_tracks.Item( n++ );
                    iterate(item);
                }
                while(--i);
            }
            i = parseInt( iterations / 8 );
            if( i>0 ) {
            do {

                var item = selected_tracks.Item( n++ );
                iterate(item);

                var item = selected_tracks.Item( n++ );
                iterate(item);

                var item = selected_tracks.Item( n++ );
                iterate(item);

                var item = selected_tracks.Item( n++ );
                iterate(item);

                var item = selected_tracks.Item( n++ );
                iterate(item);

                var item = selected_tracks.Item( n++ );
                iterate(item);

                var item = selected_tracks.Item( n++ );
                iterate(item);

                var item = selected_tracks.Item( n++ );
                iterate(item);

            }
            while(--i);
            }
        }

        duff( selected_tracks.Count );
        //fb.trace(artist);
        artist = unique(artist);
        if ( artist.length > 1 ) artist = 'Various artists';
        else {
            artist = artist[0];
        }

    }

    if ( Tabs.Playlists.length > 0 ) {

        _menu.AppendMenuSeparator();

        for ( a in Tabs.Playlists ) {

            _submenu.AppendMenuItem(MF_STRING, i++, Tabs.Playlists[a] + ' (' + fb.PlaylistItemCount(a) + ')');

        }

        if ( fb.ActivePlaylist < i ) {
            _submenu.EnableMenuItem( fb.ActivePlaylist + 4, 1, bypos = false);
            _submenu.CheckMenuItem( fb.ActivePlaylist + 4, 1, bypos = false);
        }

        _submenu.AppendTo(  _menu, MF_STRING, "Choose playlist");

    }


    if ( fb.PlaylistItemCount( Tabs.HoverTabCached - 1 ) > 0 ) {
        _menu.AppendMenuSeparator();
        _menu.AppendMenuItem(MF_STRING, i++, "Clear “" + fb.GetPlaylistName( Tabs.HoverTabCached - 1 ) + "”" );
        if ( fb.IsAutoPlaylist( Tabs.HoverTabCached - 1 ) ) _menu.EnableMenuItem( i-1, 1, bypos = false);
    }

   if ( Tabs.HoverTab != null ) {
      _menu.AppendMenuSeparator();
      _menu.AppendMenuItem(MF_STRING, i, "Delete “" + fb.GetPlaylistName( Tabs.HoverTabCached - 1 ) + "”" );
        n = 1;
   }

   ret = _menu.TrackPopupMenu(x, y);


   if (ret == 1 ) {

      Tabs.CreateTab();

   }
    else if ( ret == 2 ) {

        var new_playlist = fb.CreatePlaylist(fb.PlaylistCount, artist);
        plman.InsertPlaylistItems( new_playlist, 0, selected_tracks, true);
        fb.ActivePlaylist = new_playlist;

    }
    else if ( ret == 3 ) {

        var new_playlist = fb.CreatePlaylist(fb.PlaylistCount, artist);
        plman.InsertPlaylistItems( new_playlist, 0, selected_tracks, true);
        plman.RemovePlaylistSelection( fb.ActivePlaylist );
        fb.ActivePlaylist = new_playlist;

    }
    else if ( ret >= 4 && ret < i-1 ) {

        fb.ActivePlaylist = ret - 4;

    }
    else if ( ret == i-1 ) {

        b = [];
        for ( p = 0; p < fb.PlaylistItemCount( Tabs.HoverTabCached - 1 ); p++) {
            b.push( p );
        }

        plman.SetPlaylistSelection( Tabs.HoverTabCached - 1, b, true);
        plman.RemovePlaylistSelection( Tabs.HoverTabCached - 1 );
       

    }
   else if ( ret == i ) {

      Tabs.DeleteTab( Tabs.HoverTabCached );

   }
   return true;

}


function on_drag_over( Drag, x, y, mask) {

    Tabs.DragOver = 1;
    on_mouse_move(x, y);

}


function on_drag_drop( Drag, x, y, mask) {

    on_mouse_move(x, y);

    Drag.Parsable = true;
    Drag.ToSelect = true;

    //fb.trace('Tabs.HoverTab = ' + Tabs.HoverTab);

    Drag.Playlist = Tabs.HoverTab - 1;
    Drag.ToPlaylist();
    fb.ActivePlaylist = Tabs.HoverTab - 1;
    Tabs.DragOver = 0;

}

function on_drag_leave() {
    Tabs.DragOver = 0;
    on_mouse_leave();
}
maniac736 M
Аватара
Откуда: Россия Иркутск
Репутация: 11
С нами: 7 лет 1 месяц

Сообщение #2080 vladj » 29.12.2017, 21:58

Ты-бы еще постарше скрипт нашел.... :smile:
vladj M
Аватара
Откуда: Пермский край
Репутация: 427
С нами: 14 лет 9 месяцев

Пред.След.

Вернуться в Секреты foobar2000