Результатов поиска: 240: Biography

Поисковый запрос: biography

Re: Скрипты для foo_uie_wsh_panel_mod

kgena_ua Biography & Albums & Similar
У меня в какой-то момент начало просить функцию lang_query , понял , что массив дублирует её название и скорей всего лишний :
var lang_query = new Array("", "ru/");
seriousstas
16.01.2018, 02:05
 
Раздел: Секреты foobar2000
Тема: Скрипты для foo_uie_wsh_panel_mod
Ответы: 2988
Просмотры: 574390

Re: Скрипты для foo_uie_wsh_panel_mod

seriousstas:а я чем буду заниматься)))
С удовольствием подкину задачу...этот скрипт био качает картинки в любом случае, даже если и панель био не в работе. У меня боязнь перед усталостью ячеек на SSD поэтому с осторожностью выбираю станции если запускаю сборку (одну из многочисленных) не с рам диска. Хотелось-бы что-бы при работе сборки с не запущенной панелькой био картинки и био не качались вообще. Проверять утверждения, что мне SSD хватит при любом использовании очень надолго как-то не хочется при их цене и учитывая, что я живу только на пенсию. В принципе можно забить и кидать нужную в данный момент сборку на рам диск (2-3 лишних движения)....все-равно рам диск настроен так, что при выключении он не перезаписывает образ, а только грузит его при включении.
Еще лучше если папка tmp_Biography всегда будет создаватся в виртуальном диске В:.....как я понимаю он в оперативе создается, диск В: ?
А так...запустил сборку, панель био не открывал ни разу, а картинки все-равно туда пишет....
https://yadi.sk/i/kmTUjg2v3RPxef
vladj
12.01.2018, 16:54
 
Раздел: Секреты foobar2000
Тема: Скрипты для foo_uie_wsh_panel_mod
Ответы: 2988
Просмотры: 574390

Re: Скрипты для foo_uie_wsh_panel_mod

// @name "Biography & Albums & Similar artist info. www.last.fm"
// @author "kgena_ua"
version "15122017"
Открытие-закрытие текста в одно касание с запоминанием позиции + скрол текста и картинок под палец (кто-то спрашивал ранее)
С кнопками и остальным - нужно повозится ..
seriousstas
12.01.2018, 03:38
 
Раздел: Секреты foobar2000
Тема: Скрипты для foo_uie_wsh_panel_mod
Ответы: 2988
Просмотры: 574390
  • 1

Re: Скрипты для foo_uie_wsh_panel_mod

kgena_ua
В связи с изменениями на LastFm
Только заметил , что в 18112016 альбомы не грузятся , не стал разбираться с класами, просто убрал проверку для альбомов :
Код: Выделить всё
if (data[i].className == "album-grid-album-art"
(в старых версиях переключение через 0:1)
Норм теперь) Обновил :
Biography Text & Album Info & Picture 18112016
Скачать
seriousstas
10.01.2018, 03:28
 
Раздел: Секреты foobar2000
Тема: Скрипты для foo_uie_wsh_panel_mod
Ответы: 2988
Просмотры: 574390

Re: Скрипты для foo_uie_wsh_panel_mod

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

Добавлено спустя 12 минут 19 секунд:
seriousstas:вариант , когда толкаем из любой точки
Смотрю, и это мне кажется более удобным. Ранее в "волумебарах" так не делали.
kgena_ua
26.12.2017, 22:02
 
Раздел: Секреты foobar2000
Тема: Скрипты для foo_uie_wsh_panel_mod
Ответы: 2988
Просмотры: 574390
  • 4

Re: Скрипты для foo_uie_wsh_panel_mod

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
26.12.2017, 07:00
 
Раздел: Секреты foobar2000
Тема: Скрипты для foo_uie_wsh_panel_mod
Ответы: 2988
Просмотры: 574390

Re: Скрипты для foo_uie_wsh_panel_mod

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
25.12.2017, 19:28
 
Раздел: Секреты foobar2000
Тема: Скрипты для foo_uie_wsh_panel_mod
Ответы: 2988
Просмотры: 574390
  • 5

Re: Скрипты для foo_uie_wsh_panel_mod

В связи с изменениями на LastFm

"Biography & Albums & Similar artist info. www.last.fm"
version "15122017"


- выбор языка - 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
25.12.2017, 01:28
 
Раздел: Секреты foobar2000
Тема: Скрипты для foo_uie_wsh_panel_mod
Ответы: 2988
Просмотры: 574390
  • 4

Re: Скрипты для foo_uie_wsh_panel_mod

Безымянный.png
Безымянный.png (933 байт) Просмотров: 2979

Мои кнопки. Плавное изменение яркости при наведении на кнопку. Подсветка состояния кнопки.
Размер: 26 х 26. Возможная минимальная ширина панели соответственно: 26 * 5 = 130.

//////////////

по
Biography & Albums & Similar artist info. www.last.fm
в связи с изменениями на LastFM: новая функция для "похожий артист".

для версии 06102017.
Заменить.
Код: Выделить всё
function get_lastFM_similar_img(p){
    var xmlhttp1 = new ActiveXObject("Microsoft.XMLHTTP");   
    var url1 = ("https://www.last.fm/" + lang_query(lang_idx) + "music/" + encodeURIComponent(artist) + "/+similar"); 
    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 imgs = div.getElementsByTagName("img");
                var an = div.getElementsByTagName("a");
               
                var img_urls = [];
                var link_block_target = [];
               
                for (i = 0; i < an.length; i++) { 
                    if (an[i].className == "link-block-target"){    // similar artist name
                        link_block_target.push(an[i].innerHTML.replace(/(&amp;)/g,'&'));
                    }
                }

                for (i = 0; i < imgs.length; i++) {
                    if (imgs[i].src.indexOf("https://lastfm-img2.akamaized.net/i/u/270x205") == 0){
                    //if (imgs[i].className == "avatar big-artist-list-avatar-desktop"){
                        img_urls.push(imgs[i].src.replace("270x205", quality[download_quality][1]));
                    //}
                    }
                }

                for (i = 0; i < Math.min(img_urls.length, limit); i++) {
                    utils.WriteINI( p + "\\" + artist + "_album_info.ini", data_other[data_other_idx][2] + " : name", i, link_block_target[i]);
                   
                    var img_file = "\"" + p + "\\" + artist + "_"  + i + "_" + data_other[data_other_idx][2] + ".jpg" + "\""; 
                    WshShell.Run(vbs + " " + img_urls[i] + " " + img_file, 0, false);
                }   
                doc.close();
                if (img_urls.length > 0) get_files_if_loaded(p);
                get_text();
            }
        }
    }     
}
kgena_ua
17.12.2017, 11:46
 
Раздел: Секреты foobar2000
Тема: Скрипты для foo_uie_wsh_panel_mod
Ответы: 2988
Просмотры: 574390
  • 4

Re: Скрипты для foo_uie_wsh_panel_mod

Финальная версия модифицированного под тач варианта
@name "Biography Text & Album Info & Picture. www.last.fm"
@author "kgena_ua"
@version "18112016"
Подробно здесь .
Скачать
Можно использовать и в обычных условиях ..
Изменения восновном в плане стабильности, исправления , например это исправил
работает и с JScript Panel v1.3.2 [25.11.2017]

За коментами есть возможность управления циклом из MPS (что-б не листал , когда спрятан)
и отключение кнопок и текста , когда используется ,как аватарка (мелкое окно)
применял в своей сборке, мож пригодится кому..
seriousstas
26.11.2017, 04:20
 
Раздел: Секреты foobar2000
Тема: Скрипты для foo_uie_wsh_panel_mod
Ответы: 2988
Просмотры: 574390

Re: Скрипты для foo_uie_wsh_panel_mod

musikomaniak, если разговор идет про скрипт Biography Text & Album Info & Picture Last.fm, то открываем окно Свойства и в строке language (codes) оставляем нужные языки:

Изображение
MC Web
12.11.2017, 02:24
 
Раздел: Секреты foobar2000
Тема: Скрипты для foo_uie_wsh_panel_mod
Ответы: 2988
Просмотры: 574390
  • 2

Re: Скрипты для foo_uie_wsh_panel_mod

Properties & properties file (ml)
version "25102017"


Скрипт вычистил.
При наличии foo_uie_biography будет брать данные используя компонент.
При отсутствии foo_uie_biography - напрямую с сайта LastFM.
Изменение ширины колонки : Shift + лев.кн.мыши.
Сохранение в буфере обмена : Ctrl + лев.кн.мыши на значении(ях), отмена выделения - двойной клик лев.кн.мыши.

Код: Выделить всё
// ==PREPROCESSOR==
// @name "Properties & properties file (ml)"
// @author "kgena_ua"
// @version "25102017"
// @feature "v1.4"
// @feature "watch-metadb"
// @tooltip "custom-paint"
// ==/PREPROCESSOR==

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

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, wh_old;

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
};

function get_color(){   
    if (window.InstanceType == 0){
        bgcolor = window.GetColorCUI(ColorTypeCUI.background);
        color_item_name = window.GetColorCUI(ColorTypeCUI.text);
        color_item_value = window.GetColorCUI(ColorTypeCUI.inactive_selection_text);
        color_group_text = window.GetColorCUI(ColorTypeCUI.inactive_selection_background);
    } else if (window.InstanceType == 1) {
        bgcolor = window.GetColorDUI(ColorTypeDUI.background);
        color_item_name = window.GetColorDUI(ColorTypeDUI.text);
        color_item_value = window.GetColorDUI(ColorTypeDUI.highlight);
        color_group_text = window.GetColorDUI(ColorTypeDUI.selection);
    }
    window.Repaint();
}

get_color();

function on_colors_changed(){
    get_color();
}

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

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"));

bgcolor = custom_colors ? c_bgcolor : bgcolor;
color_item_name = custom_colors ? c_color_item_name : color_item_name;
color_item_value = custom_colors ? c_color_item_value : color_item_value;
color_group_text = custom_colors ? c_color_group_text : color_group_text;

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

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

var idx, old_idx;
var item_name_array = [];
var item_name_array_2 = [];
var item_value_array = [];
var tmp_item_name_array = [];
var tmp_item_name_array_2 = [];
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 t_h;
var t_x1 = window.GetProperty(" text: margin", 10);
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", 300);

/////  WSH panel
var tooltip = window.CreateTooltip();

/////  jscript panel
//var tooltip = window.CreateTooltip(font_name_item_value, font_size_tooltip, font_style_item_value);
//tooltip.SetMaxWidth(tooltip_max_w);

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

htmlfile = new ActiveXObject('htmlfile');
var clipboardData = "";

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, 60, 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 = [
["$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%", "Имя файла"],
["$directory_path(%path%)", "Путь к файлу"],
["%url%", "Ссылка"],
["%subsong%", "Позиция трека"],       
["%filesize_natural%", "Размер файла"],
["%last_modified%", "Изменен"],
["%folder_name%", "Имя папки"],

["group_" + groups[4], "Cтатистика воспроизведения"],
["%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%", "Похожие исполнители"]
];

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

var selected_idx = [];

function on_mouse_lbtn_down(x, y) {
    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[idx] && item_name_array[idx].search('group') >= 0 ? true : false;
       
    if (group){
        group_name = item_name_array[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)) / t_h);

    pos_x = x;
    mouse_on_pos();
   
    if (old_y != y || old_x != x){
        if (Tooltip && !control_down) tooltip_activate_wsh(x, y);
        //if (Tooltip) tooltip_activate_jscript(x, y)
        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;
        }
    }

    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;
    }

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

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

function applyDelta() {
    s = s > 0 ? 0 : s;
    s = s < (wh - item_name_array.length * t_h) && s < 0 ? (wh - item_name_array.length * t_h) : s;
    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) {
    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;
    if (wh != wh_old  && s < 0) {
        s = wh >= wh_old ? 0 : s;
        wh_old = wh;
    }
    create_array();
}

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 data_format(n) {
    if (!n) return;
    d = n.substr(8, 2);
    m = parseInt(n.substr(5, 2), 10);
    y = n.substr(0, 4);
    t = n.substr(11, 8);
    m_text = lang == 0 ? months_en[m - 1] : months_ru[m - 1];
    return d + " " + m_text + " " + y + ", " + t;
}

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_en = ["Jan.", "Feb.", "Mar.", "Apr.", "May", "Jun.", "Jul.", "Aug.", "Sept.", "Oct.", "Nov.", "Dec."];
var months_ru = ["Янв.", "Фев.", "Мрт", "Апр.", "Май", "Июн.", "Июл.", "Авг.", "Сен.", "Окт.", "Нбр", "Дек."];

function create_array() {
    tmp_item_name_array = [];
    tmp_item_name_array_2 = [];
    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.push(tfname[j][0]);
            tmp_item_name_array_2.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.push("");
            tmp_item_name_array_2.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 = [];
    item_name_array_2 = [];
    item_value_array = [];
   
    group_name = groups[0];
   
    for (j = 0; j < tmp_item_name_array.length; j++) {
        group = tmp_item_name_array[j].search('group') >= 0 ? true : false;
       
        if (group){
            group_name = tmp_item_name_array[j].replace("group_", "");
        }

        selected_items = window.GetProperty(group_name);

        item_nane = tmp_item_name_array[j];
        item_nane_2 = tmp_item_name_array_2[j];
        item_value = tmp_item_value_array[j];
       
        if (!group){
            if (selected_items){
                item_name_array.push(item_nane);
                item_name_array_2.push(item_nane_2);
                item_value_array.push(item_value);
            }           
        }
       
        if (group){
            if (tmp_item_value_array[j + 1]){
                item_name_array.push(item_nane);
                item_name_array_2.push(item_nane_2);
                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);
   
    t_h = f_h + window.GetProperty(" vertical item padding");
   
    text_h = item_name_array.length * t_h;
    panel_h = Math.round(window.Height / t_h) * t_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.length; i++) {
        group = item_name_array[i].search('group') >= 0 ? true : false;
       
        t_y =  i * t_h + s;
        l_y = t_y + t_h / 2;
       
        if (!group){
            rating_text = item_name_array[i] == "$meta(rating)" ? lang == 0 ? "  (tag)" : "  (тег)" : "";
           
            name = lang == 0 ? clear_item_name(item_name_array[i]) : item_name_array_2[i];
            t_w = Math.min(ww - (ww - t_x2)- t_x1, ww - t_x1 * 2) - 10;
            gr.GdiDrawText(name + rating_text, font_item_name, color_item_name, t_x1, t_y, t_w, t_h, DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_WORD_ELLIPSIS | DT_NOPREFIX);         
        }
       
        if (group){
            name = lang == 0 ? clear_group_text(item_name_array[i]) : item_name_array_2[i];
            t_w = ww - t_x1 * 2;
           
            group_text && gr.GdiDrawText(name, font_group, color_group_text, t_x1, t_y, t_w, t_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;

        if (item_name_array[i].search(/rating/g) > 0){     
            for (var r = 0; r < Math.min(item_value_array[i] * star_offset, ww - t_x2 - t_x1); r = r + star_offset) {
                draw_star(gr, t_x2 + star_size / 3 + r, t_y + t_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, t_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.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,y);

    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.ProfilePath + "\\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, 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.length; j++) {
        selected_idx[j] = n;
    }
}

function copy_to_clipboard(){
    var clipboard_text = "";

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

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

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

/////////////////////////////  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(){     
    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 * t_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 + t_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 {   
        tooltip_time.Reset();
        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 * t_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 + t_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 {
        tooltip.Deactivate();
        tooltip.TrackActivate = false;
        tooltip_time.Reset();
        tooltip_state = false;   
    }
}

/////////////////////////////  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();
            }
        }
    }     
}

function print(msg) {   
   fb.trace(msg);
}   

kgena_ua
27.10.2017, 22:07
 
Раздел: Секреты foobar2000
Тема: Скрипты для foo_uie_wsh_panel_mod
Ответы: 2988
Просмотры: 574390

Re: Скрипты для foo_uie_wsh_panel_mod

kgena_ua, три дня как установил скрипт, пока работает нормально без foo_uie_biography :beer:
Aliado_71
25.10.2017, 11:56
 
Раздел: Секреты foobar2000
Тема: Скрипты для foo_uie_wsh_panel_mod
Ответы: 2988
Просмотры: 574390
  • 4

Re: Скрипты для foo_uie_wsh_panel_mod

Properties & properties file (ml)
version "22102017"


Без библиотеки foo_uie_biography
особо не тестировал
Код: Выделить всё
// ==PREPROCESSOR==
// @name "Properties & properties file (ml)"
// @author "kgena_ua"
// @version "22102017"
// @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)); }

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, wh_old;

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
};

function get_color(){   
    if (window.InstanceType == 0){
        bgcolor = window.GetColorCUI(ColorTypeCUI.background);
        color_item_name = window.GetColorCUI(ColorTypeCUI.text);
        color_item_value = window.GetColorCUI(ColorTypeCUI.inactive_selection_text);
        color_group_text = window.GetColorCUI(ColorTypeCUI.inactive_selection_background);
    } else if (window.InstanceType == 1) {
        bgcolor = window.GetColorDUI(ColorTypeDUI.background);
        color_item_name = window.GetColorDUI(ColorTypeDUI.text);
        color_item_value = window.GetColorDUI(ColorTypeDUI.highlight);
        color_group_text = window.GetColorDUI(ColorTypeDUI.selection);
    }
    window.Repaint();
}

get_color();

function on_colors_changed(){
    get_color();
}

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

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"));

bgcolor = custom_colors ? c_bgcolor : bgcolor;
color_item_name = custom_colors ? c_color_item_name : color_item_name;
color_item_value = custom_colors ? c_color_item_value : color_item_value;
color_group_text = custom_colors ? c_color_group_text : color_group_text;

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

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

var idx, old_idx;
var item_name_array = [];
var item_name_array_2 = [];
var item_value_array = [];
var tmp_item_name_array = [];
var tmp_item_name_array_2 = [];
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 t_h;
var t_x1 = window.GetProperty(" text: margin", 10);
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", 300);

/////  WSH panel
var tooltip = window.CreateTooltip();

/////  jscript panel
//var tooltip = window.CreateTooltip(font_name_item_value, font_size_tooltip, font_style_item_value);
//tooltip.SetMaxWidth(tooltip_max_w);

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

htmlfile = new ActiveXObject('htmlfile');
var clipboardData = "";

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, 60, ww, wh, DT_RIGHT | DT_WORD_ELLIPSIS);
    gr.GdiDrawText( "", font_item_value, color_item_value, 0, 80, ww, wh, DT_RIGHT | DT_WORD_ELLIPSIS);
    gr.GdiDrawText( "", font_item_value, color_item_value, 0, 100, ww, wh, DT_RIGHT | DT_WORD_ELLIPSIS);
    gr.GdiDrawText( "", font_item_value, color_item_value, 0, 120, ww, wh, DT_RIGHT | DT_WORD_ELLIPSIS);
    gr.GdiDrawText( "", font_item_value, color_item_value, 0, 140, 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 = [
["$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%", "Имя файла"],
["$directory_path(%path%)", "Путь к файлу"],
["%url%", "Ссылка"],
["%subsong%", "Позиция трека"],       
["%filesize_natural%", "Размер файла"],
["%last_modified%", "Изменен"],
["%folder_name%", "Имя папки"],

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

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

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

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

var selected_idx = [];

function on_mouse_lbtn_down(x, y) {
    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[idx] && item_name_array[idx].search('group') >= 0 ? true : false;
       
    if (group){
        group_name = item_name_array[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)) / t_h);

    pos_x = x;
    mouse_on_pos();
   
    if (old_y != y || old_x != x){
        if (Tooltip && !control_down) tooltip_activate_wsh(x, y);
        //if (Tooltip) tooltip_activate_jscript(x, y)
        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;
        }
    }

    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;
    }

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

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

function applyDelta() {
    s = s > 0 ? 0 : s;
    s = s < (wh - item_name_array.length * t_h) && s < 0 ? (wh - item_name_array.length * t_h) : s;
    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) {
    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;
    if (wh != wh_old  && s < 0) {
        s = wh >= wh_old ? 0 : s;
        wh_old = wh;
    }
    create_array();
}

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 data_format(n) {
    if (!n) return;
    d = n.substr(8, 2);
    m = parseInt(n.substr(5, 2), 10);
    y = n.substr(0, 4);
    t = n.substr(11, 8);
    m_text = lang == 0 ? months_en[m - 1] : months_ru[m - 1];
    return d + " " + m_text + " " + y + ", " + t;
}

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_en = ["Jan.", "Feb.", "Mar.", "Apr.", "May", "Jun.", "Jul.", "Aug.", "Sept.", "Oct.", "Nov.", "Dec."];
var months_ru = ["Янв.", "Фев.", "Мрт", "Апр.", "Май", "Июн.", "Июл.", "Авг.", "Сен.", "Окт.", "Нбр", "Дек."];

function create_array() {
    tmp_item_name_array = [];
    tmp_item_name_array_2 = [];
    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_similar_artist%":
                value = Eval(tfname[j][0]) ? Eval(tfname[j][0]) : similar;
                break;
            case "%lastfm_artist_playcount%":
                value = Eval(tfname[j][0]) ? Eval(tfname[j][0]) : artist_info[0];
                break;
            case "%lastfm_artist_listeners%":
                value = Eval(tfname[j][0]) ? Eval(tfname[j][0]) : artist_info[1];
                break;
            case "%lastfm_album_playcount%":
                value = Eval(tfname[j][0]) ? Eval(tfname[j][0]) : album_info[0];
                break;
            case "%lastfm_album_listeners%":
                value = Eval(tfname[j][0]) ? Eval(tfname[j][0]) : album_info[1];
                break;
            default:
                value = Eval(tfname[j][0]);
            }
        }

        if (value && value != 0 || group) {
            m_text = get_measure(tfname[j][0]);
            value = value + (m_text ? "  " + m_text : "");
       
            tmp_item_name_array.push(tfname[j][0]);
            tmp_item_name_array_2.push(tfname[j][1]);
           
            if (tfname[j][0] != "%lastfm_similar_artist%"){
                tmp_item_value_array.push(value);
            }
           
            if (tfname[j][0] == "%lastfm_similar_artist%") {
                similar_artist = similar;
            }
        }
       
        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.push("");
            tmp_item_name_array_2.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 = [];
    item_name_array_2 = [];
    item_value_array = [];
   
    group_name = groups[0];
   
    for (j = 0; j < tmp_item_name_array.length; j++) {
        group = tmp_item_name_array[j].search('group') >= 0 ? true : false;
       
        if (group){
            group_name = tmp_item_name_array[j].replace("group_", "");
        }

        selected_items = window.GetProperty(group_name);

        item_nane = tmp_item_name_array[j];
        item_nane_2 = tmp_item_name_array_2[j];
        item_value = tmp_item_value_array[j];
       
        if (!group){
            if (selected_items){
                item_name_array.push(item_nane);
                item_name_array_2.push(item_nane_2);
                item_value_array.push(item_value); 
            }           
        }
       
        if (group){
            if (tmp_item_value_array[j + 1]){
                item_name_array.push(item_nane);
                item_name_array_2.push(item_nane_2);
                item_value_array.push(item_value); 
            }
        }
    }
}

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);
   
    t_h = f_h + window.GetProperty(" vertical item padding");
   
    text_h = item_name_array.length * t_h;
    panel_h = Math.round(window.Height / t_h) * t_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.length; i++) {
        group = item_name_array[i].search('group') >= 0 ? true : false;
       
        t_y =  i * t_h + s;
        l_y = t_y + t_h / 2;
       
        if (!group){
            name = clear_item_name(item_name_array[i]);
            rating_text = item_name_array[i] == "$meta(rating)" ? lang == 0 ? "  (tag)" : "  (тег)" : "";
            t_w = Math.min(ww - (ww - t_x2)- t_x1, ww - t_x1 * 2) - 10;
           
            name = lang == 0 ? name : item_name_array_2[i];
            gr.GdiDrawText(name + rating_text, font_item_name, color_item_name, t_x1, t_y, t_w, t_h, DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_WORD_ELLIPSIS | DT_NOPREFIX);         
        }
       
        if (group){
            name = lang == 0 ? item_name_array[i] : item_name_array_2[i];
            name = group_text ? clear_group_text(name) : "";
            t_w = ww - t_x1 * 2;
           
            group_name = item_name_array[i].replace("group_", "");
            group_collapsed = window.GetProperty(group_name);
            color = color_group_text;
           
            gr.GdiDrawText(name, font_group, color, t_x1, t_y, t_w, t_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;

        if (item_name_array[i].search(/rating/g) > 0){     
            for (var r = 0; r < Math.min(item_value_array[i] * star_offset, ww - t_x2 - t_x1); r = r + star_offset) {
                draw_star(gr, t_x2 + star_size / 3 + r, t_y + t_h / 2, star_size, true, 0, color, false, bgcolor, 255);
            }
        } else {
            value = item_name_array[i].search(/_modified|_played|_played|added/g) > 0 ? data_format(item_value_array[i]) : item_value_array[i];
            t_w2 = ww - t_x2 - t_x1;

            gr.GdiDrawText( value, font_item_value, color, t_x2, t_y, t_w2, t_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%") ? Eval("%artist%") : "";
    //album = Eval("%album%") ? Eval("%album%") : "";
    artist = Eval("%artist%");
    album = Eval("%album%");

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

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

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.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,y);

    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");
        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.ProfilePath + "\\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){
        //if (tfname[j].indexOf('group') < 0 || tfname[j].indexOf('%lastfm') < 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, 0);
    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 == 1 ) {output_array.push(tmp_output_item_name_array[j])};
        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.CheckMenuItem(i - 1, sel_arr[i - 3 + 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, 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 == 0 ? 1 : 0);
        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, 1);
            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, 0);
            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.length; j++) {
        selected_idx[j] = n;
    }
}

function copy_to_clipboard(){
    var clipboard_text = "";

    for (var i = 0; i < item_name_array.length; i++) {
       
        if (selected_idx[i] > 0){
            group = item_name_array[i].search('group') >= 0 ? true : false;
       
            if (!group){
                name = clear_item_name(item_name_array[i]);
                rating_text = item_name_array[i] == "$meta(rating)" ? lang == 0 ? "  (tag)" : "  (тег)" : "";
           
                name = lang == 0 ? name : item_name_array_2[i];
                value = item_value_array[i];
               
                name = clipboard_item_name ? name + "\t" : "";

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

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

/////////////////////////////  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(){      
    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 * t_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 + t_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 {   
        tooltip_time.Reset();
        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 * t_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 + t_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 {
        tooltip.Deactivate();
        tooltip.TrackActivate = false;
        tooltip_time.Reset();
        tooltip_state = false;   
    }
}

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");
               
                j = 0;
             
                for (i = 0; i < a.length; i++) { 
                    if (a[i].className == "link-block-target"){
                        similar[j] = a[i].innerHTML.replace(/(&amp;)/g,'&');
                        j++
                        if (j == 6) break;
                    }
                }
                doc.close();
                create_array();
                window.Repaint();
            }
        }
    }     
}

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();
                window.Repaint();
            }
        }
    }     
}

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");
               
                var tmp = [];
               
                for (i = 0; i < abbr.length; i++) { 
                    if (abbr[i].className == "intabbr"){
                        album_info.push(abbr[i].title.replace(/\,/g, " "));
                    }
                }
                doc.close();
                create_array();
                window.Repaint();
            }
        }
    }     
}

function print(msg) {   
   fb.trace(msg);
}   

kgena_ua
22.10.2017, 22:53
 
Раздел: Секреты foobar2000
Тема: Скрипты для foo_uie_wsh_panel_mod
Ответы: 2988
Просмотры: 574390

Re: Скрипты для foo_uie_wsh_panel_mod

MC Web
foo_uie_wsh_panel_mod V1.5.6
Biography, Albums, Similar artist info. www.last.fm 06102017
MC Web
I use foo_uie_wsh_panel_mod V1.5.6
Biography, Albums, Similar info info. Www.last.fm 06102017 or none of the previous versions! Not a script of the problem, IE browser 8 itself can not open the site! Even if the use of a variety of proxy server, modify the DNS will not work, but I can use Google Chrome browser can open the site!

MC Web
Я использую foo_uie_wsh_panel_mod V1.5.6
Биография, альбомы, аналогичная информация. Www.last.fm 06102017 или ни одна из предыдущих версий! Не сценарий проблемы, браузер IE 8 сам не может открыть сайт! Даже если использование различных прокси-серверов, изменение DNS не будет работать, но я могу использовать браузер Google Chrome, вы можете открыть сайт!
ximenlangzige
19.10.2017, 23:00
 
Раздел: Секреты foobar2000
Тема: Скрипты для foo_uie_wsh_panel_mod
Ответы: 2988
Просмотры: 574390

Re: Скрипты для foo_uie_wsh_panel_mod

kgena_ua:Хотя может это уже не совсем актуально, т.к. скрипт Biography & Albums & Similar artist info. www.last.fm выводит информацию об "похожих артистах".
Как раз актуально, особенно для моей новой сборки, без него никак :pray:
Если можно поправить скрипт чтобы работал без доп компонентов, было бы здорово :smile: если нет, то и так все работает нормально с foo_uie_biography
Aliado_71
19.10.2017, 00:10
 
Раздел: Секреты foobar2000
Тема: Скрипты для foo_uie_wsh_panel_mod
Ответы: 2988
Просмотры: 574390

Re: Скрипты для foo_uie_wsh_panel_mod

ximenlangzige, если разговор про скрипт Biography, Albums, Similar artist info last.fm, с какими версиями компонентов foo_uie_wsh_panel_mod или foo_jscript_panel используете?
Попробуйте старые версии компонентов.
MC Web
18.10.2017, 19:27
 
Раздел: Секреты foobar2000
Тема: Скрипты для foo_uie_wsh_panel_mod
Ответы: 2988
Просмотры: 574390

Re: Скрипты для foo_uie_wsh_panel_mod

Спойлер
Windows xp3 IE8 can not open https://www.last.fm, even if you change the proxy server, modify the DNS is still not open the site, before using the proxy server is possible. So now Biography is no longer available!
Windows xp3 IE8 не может открыть https://www.last.fm, даже если вы измените прокси-сервер, изменить DNS по-прежнему не открывается, прежде чем использовать прокси-сервер. Итак, теперь биография недоступна! :zombie:
ximenlangzige
18.10.2017, 10:53
 
Раздел: Секреты foobar2000
Тема: Скрипты для foo_uie_wsh_panel_mod
Ответы: 2988
Просмотры: 574390

Re: Скрипты для foo_uie_wsh_panel_mod

kgena_ua, привет.

Что то не соображу, как в скрипте Biography & Albums & Similar artist info last.fm сделать, что бы имя исполнителя выводилось заглавными буквами, в предыдущих версиях переделывал, а тут сделано по другому...

И сейчас заметил, длинные заголовки не переносятся, как раньше? В частности на Похожих исполнителях и Альбомах.
MC Web
16.10.2017, 18:46
 
Раздел: Секреты foobar2000
Тема: Скрипты для foo_uie_wsh_panel_mod
Ответы: 2988
Просмотры: 574390
  • 1

Re: Скрипты для foo_uie_wsh_panel_mod

vladj, у меня как и было, кстати по Вашему пожеланию, двойной клик ср.кл. по артисту - текст уходит вниз - вправо, оставляя видимой первую букву артиста.

Добавлено спустя 17 минут 29 секунд:
Aliado_71:какие именно пункты?
Посмотрел, у меня настройки такие
Спойлер
Безымянный.png

Хотя может это уже не совсем актуально, т.к. скрипт Biography & Albums & Similar artist info. www.last.fm выводит информацию об "похожих артистах".
kgena_ua
16.10.2017, 17:06
 
Раздел: Секреты foobar2000
Тема: Скрипты для foo_uie_wsh_panel_mod
Ответы: 2988
Просмотры: 574390
Пред.След.

Вернуться в: Скрипты для foo_uie_wsh_panel_mod