Скрипты для foo_uie_wsh_panel_mod

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

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

Сообщение #1521 kgena_ua » 09.12.2016, 13:42

MC Web писал(а):остается полоса прокрутки от предыдущей биографии
MC Web, добавить строку get_text_array(); в function clear_txt_var()
Код: Выделить всё
function clear_txt_var() {
    album = "";
    s_text = 0;
    text = "";
    text_array = [];
    get_text_array();
    window.Repaint();
}

MC Web писал(а):для переноса длинных заголовков исполнитель
Если есть необходимость, то можно реализовать. Флага переноса будет недостаточно, т.к. Y - (t_y) текста (билграфии, описания) привязан к Y - (h1_y или h2_y) артиста и высоте строки артиста - h_text_row_height
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 53
Откуда: Украина, Днепр
Репутация: 325
С нами: 4 года 2 месяца

Сообщение #1522 MC Web » 09.12.2016, 15:12

kgena_ua писал(а):добавить строку get_text_array(); в function clear_txt_var()
Да, полоса прокрутки не остается, но сообщение ". . ." или как у меня "Ничего не найдено" не появляется, т.е. пустое поле.
Пока оставил, как писал в предыдущем сообщении. Кстати на что эти исправления могут повлиять, на работе скрипта пока ничего не заметил...
kgena_ua писал(а):Если есть необходимость, то можно реализовать.
Думаю было бы не плохо, если крупный шрифт и длинное название очень помогло бы всем.
MC Web
Мастер
Репутация: 65
С нами: 3 года 10 месяцев

Сообщение #1523 kgena_ua » 09.12.2016, 22:09

MC Web писал(а):"Ничего не найдено" не появляется, т.е. пустое поле
MC Web, если нет никаких тегов (артиста), то и обработки никакой нет - ничего нет. Так и было.
Если артист есть, а для него ничего не найдено, то отображалось "...", или как пользователь пропишет.
MC Web писал(а):Кстати на что эти исправления могут повлиять, на работе скрипта пока ничего не заметил...
Какие именно, MC Web,
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 53
Откуда: Украина, Днепр
Репутация: 325
С нами: 4 года 2 месяца

Сообщение #1524 MC Web » 09.12.2016, 23:36

kgena_ua писал(а):Какие именно
Вроде разобрался.

Добавлено спустя 5 минут 55 секунд:
kgena_ua писал(а):если нет никаких тегов (артиста), то и обработки никакой нет - ничего нет. Так и было.
Если артист есть, а для него ничего не найдено, то отображалось "...", или как пользователь пропишет.
Да в том то и дело, что в предыдущих версиях во всех случаях появлялось сообщение ". . ." при отсутствии информации.
Привык уже к этому, поэтому и написал. Не суть важно, нет так нет.
MC Web
Мастер
Репутация: 65
С нами: 3 года 10 месяцев

Сообщение #1525 kgena_ua » 12.12.2016, 23:38

Функция Load album image
для Biography Text & Album Info & Picture. www.last.fm
для версии 01122016

- сохраняет в папку с треком;
- для радио сохраняет в папку tmp_lastFM_img;
- предложенный путь сохранения можно изменить.

Заменить код на (внизу после /////////////...)
Код: Выделить всё
function search_lastFM_album_img(){
    if (!metadb) return; 
    var tf_album = Eval("%album%");
    var tmp_album;
    var tmp_artist = artist;

    if (tf_album){
        tmp_album = input_box("Search album image for", tf_album, "Foobar 2000");

        if (tmp_album) get_lastFM_albums_pages(tmp_album, tmp_artist);
    }
}

function get_lastFM_albums_pages(tmp_album, tmp_artist){
    xmlhttp0 = new ActiveXObject("Microsoft.XMLHTTP");   
    url0 = ("http://www.last.fm/" + lang_query[lang] + "music/" + encodeURIComponent(tmp_artist) + "/" + "+albums");
    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 data = div.getElementsByTagName("li");
                var albums_pages = 0;   
                for (i = 0; i < data.length; i++) {
                    if (data[i].className == "pages"){
                        albums_pages = data[i].innerHTML.replace(/^\s+|\s+$/g,"").replace(/^(.*\s)/g,'');
                    }
                }
            }     
            doc.close();
            albums_pages = albums_pages == 0 ? 1 : albums_pages;
            for (i = 1; i <= albums_pages; i++) { 
                get_lastFM_album_img(i, tmp_album, tmp_artist);
            }
        }
    }
}     

function get_lastFM_album_img(i, tmp_album, tmp_artist){
    var xmlhttp3  = new ActiveXObject("Microsoft.XMLHTTP");   
    var url3 = ("http://www.last.fm/" + lang_query[lang] + "music/" + encodeURIComponent(tmp_artist) + "/" + "+albums" + "?page=" + i); 
    xmlhttp3.open("GET", url3, true ); 
    xmlhttp3.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
    xmlhttp3.send(null);     
    xmlhttp3.onreadystatechange = function () {
        if (xmlhttp3.readyState == 4) {
            if (xmlhttp3.status == 200) { 
                doc.open();     
                var div = doc.createElement("div");
                div.innerHTML = xmlhttp3.responsetext;
                var data = div.getElementsByTagName("img");
                var urls = [];
                var files = [];
                for (i = 0; i < data.length; i++) {   
                    if (data[i].className == "album-grid-album-art"){ 
                        if ((data[i].src.indexOf("http://img2-ak.lst.fm/i/u/300") == 0 || data[i].src.indexOf("https://lastfm-img2.akamaized.net/i/u/300") == 0) && data[i].src.indexOf("c6f59c1e5e7240a4c0d427abd71f3dbb") < 0) {                       
                            if (data[i].alt.replace(/^(.*?)'|'$/g,'').replace(/\s/,'').toLowerCase() == tmp_album.replace(/\s/,'').toLowerCase()){
                                urls.push(data[i].src.replace("300x300", quality[download_quality][2]));
                                files.push(clean_name(tmp_artist) + "_" + clean_name(tmp_album) + "_" + i + ".jpg");
                            }
                        }     
                    }
                }
                doc.close();
                for (i = 0; i < urls.length; i++) { 
                    save_lastFM_album_img(files[i], urls[i]);
                }
            }
        }
    }     
}

function save_lastFM_album_img(file_name, url){
    var destination_path;
    var tmp_directory_path;

    if (path.indexOf('://') > 0 || path.indexOf('youtube') == 0 || path.indexOf('cdda') == 0) {
        tmp_directory_path = fb.ProfilePath + "tmp_lastFM_img\\";
    } else {
        tmp_directory_path = directory_path + "\\";
    }   
   
    var nl = "\" + chr(10) + \"";
    var input_box_text = "Save  " + nl + nl + file_name + nl + "file to";
    var string = input_box(input_box_text, tmp_directory_path, "Foobar 2000");
   
    if (string){
        destination_path = folder_exists(string);
       
        if(fso.FolderExists(destination_path)) {
            var file_path = "\"" + destination_path + "\\" + file_name + "\"";
            WshShell.Run(vbs + " " + url + " " + file_path, 0, false);
        }else{
            save_lastFM_album_img(file_name, url);
        }
    }
}
вызывается из меню (есть в версии 01122016)
Код: Выделить всё
    _menu.AppendMenuItem(MF_ENABLED, 120, "Load album image (in work)");
Код: Выделить всё
    case 120:
        search_lastFM_album_img();
        break;
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 53
Откуда: Украина, Днепр
Репутация: 325
С нами: 4 года 2 месяца

Сообщение #1526 MC Web » 13.12.2016, 20:47

kgena_ua, приветствую.

kgena_ua писал(а):для радио сохраняет в папку tmp_lastFM_img;
Как я понял это должно касаться %album%, но не замечал чтобы радиостанции передавали тег %album%.
Или что то другое, короче с радиостанциями у меня ничего не получилось сохранить.

С файлами с диска проверил все работает.
MC Web
Мастер
Репутация: 65
С нами: 3 года 10 месяцев

Сообщение #1527 AHAPXICT » 14.12.2016, 05:12

Приветствую всех. Я немного выпал из тестирования пока занимался настройкой ELP, а потом объявил классовую борьбу Scrollbar-ам. Ну что сказать, одержал полную и безоговорочною победу :smoke: В общем пока в WSH даже не заглядываю - отформатировал мозги под PSS. Решил интересную задачу по совмещению на одной кнопке 3-х команд! Раньше для этих целей использовалось три отдельные кнопки две WSH одна PSS. Надеюсь скоро появлюсь, а пока только занимаюсь отправкой сообщений по почте.
AHAPXICT M
Мастер
Аватара
Возраст: 46
Откуда: Киев
Репутация: 101
С нами: 3 года 7 месяцев

Сообщение #1528 kgena_ua » 14.12.2016, 13:13

MC Web писал(а):но не замечал чтобы радиостанции передавали тег %album%
MC Web, я тестировал на плейлисте [EX.UA] Best Of VA с EX, а для меня все что не с диска это радио :smile: .
Т.е. описание
для радио сохраняет в папку tmp_lastFM_img
не совсем корректно.
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 53
Откуда: Украина, Днепр
Репутация: 325
С нами: 4 года 2 месяца

Сообщение #1529 MC Web » 14.12.2016, 15:43

kgena_ua писал(а):я тестировал на плейлисте [EX.UA] Best Of VA с EX, а для меня все что не с диска это радио
Тогда понятно, только у меня несколько другое представление об этом сервисе - это своего рода удаленный жесткий диск, можно самому выбирать, что хочется послушать, с Интернет-радио это не прокатит.
Будет жалко, если он закроется.
MC Web
Мастер
Репутация: 65
С нами: 3 года 10 месяцев

Сообщение #1530 kgena_ua » 17.12.2016, 00:40

Biography Text & Album Info & Picture. www.last.fm
version "16122016"


Мелкие изменения.
Доделан пункт меню Load album image.
Пожалуй все.

Безымянный.jpg
Безымянный2.png

Безымянный3.png

Код: Выделить всё
// ==PREPROCESSOR==
// @name "Biography Text & Album Info & Picture. www.last.fm"
// @author "kgena_ua"
// @version "16122016"
// @feature "v1.4"
// @feature "watch-metadb"
// ==/PREPROCESSOR==

function RGB(r,g,b) { return (0xff000000|(r<<16)|(g<<8)|(b)); }
function RGBA(r,g,b,a) { return ((a << 24) | (r << 16) | (g << 8) | (b)); }
function getRed(color) {return ((color >> 16) & 0xff);};
function getGreen(color) {return ((color >> 8) & 0xff);};
function getBlue(color) {return (color & 0xff);};

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

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

var ww = 200, wh = 200;

var font_name_h = window.GetProperty(" font name: artist", "Arial");
var font_name_t = window.GetProperty(" font name: biography", "Arial");
var font_size_h = window.GetProperty("font size: artist", 12);
var font_size_t = window.GetProperty("font size: biography", 12);
var h_font_style = window.GetProperty(" font style: artist", 1);
var t_font_style = window.GetProperty(" font style: biography", 0);
var min_font_size = 12;
var max_font_size = 16;
var txt_shadow = window.GetProperty(" shadow of the text", true);

var h_font, t_font;
get_font();

function get_font(){
    h_font = gdi.Font(font_name_h, font_size_h, h_font_style);
    h2_font = gdi.Font(font_name_t, font_size_t, h_font_style);
    t_font = gdi.Font(font_name_t, font_size_t, t_font_style);
}   

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);
        h_color = window.GetColorCUI(ColorTypeCUI.text);
        t_color = window.GetColorCUI(ColorTypeCUI.inactive_selection_text);
    } else if (window.InstanceType == 1) {
        bgcolor = window.GetColorDUI(ColorTypeDUI.background);
        h_color = window.GetColorDUI(ColorTypeDUI.text);
        t_color = window.GetColorDUI(ColorTypeDUI.highlight);
    }
    window.Repaint();
};

get_color();

function on_colors_changed(){
    get_color();
}

var fso = new ActiveXObject("Scripting.FileSystemObject");

var tmp_b_path = fb.ProfilePath + "\\tmp_Biography\\";
if (!fso.FolderExists(tmp_b_path)) {fso.CreateFolder(tmp_b_path)};

var script_path = tmp_b_path + "_download\\";
if (!fso.FolderExists(script_path)) {fso.CreateFolder(script_path)};
if (!fso.FileExists(script_path + "download.vbs")) {create_download_file()};

var doc = new ActiveXObject("htmlfile");
var WshShell = new ActiveXObject("WScript.Shell");
var vbs = "cscript //nologo \"" + script_path + "download.vbs\"";

var default_img_path = window.GetProperty(" default img path",".\\maybe\\textures\\nocover\\nocover.png");
var default_img = window.GetProperty(" default img", false);
var default_img_transparent = window.GetProperty(" default img transparent (0-255)", 100);

load_last_fm_logo();
var logo_img = gdi.Image(script_path + "footer_logo.png");

var artist, tf_artist, old_artist, album;
var path, directory_path;

function clean_name(n) {
    if (!n) return;
    return n.replace(/[\/\:\*\?\"\<\>\|]/g,'').replace(/^\s+|\s+$/g,"").substr(0,200);
}

function artist_folder_path(n) {
    if (!n) return;
    return tmp_b_path + n;
}

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

function get_fn(p) {
    if (!p) return;
    return p.replace(/.*\\|\.[^.]+$/g,'')
}

function get_fnext(p) {
    if (!p) return;
    return p.replace(/.*\\/g,'');
}

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 g_img = null;
var p_margin = window.GetProperty(" margin: picture", 0);
var align_mode_a = new Array("adjust", "adjust top - center", "adjust top - left", "centre", "centre - top", "stretch");
var align_mode = window.GetProperty("align mode", 1);
var selected = 0;
var files = [];
var images = [];
var test_found = 0;
var save_images = window.GetProperty("save images", true);
var limit = window.GetProperty(" download limit",5);
var cycle = window.GetProperty("auto cycle (sec)", 0);
if (cycle > 0) set_cycle_timer();
var fader = 255;
var fade_effect = window.GetProperty("fade effect", false);
var fade_step = window.GetProperty("fade step", 25);
var on_pic = false;

var download_quality = window.GetProperty("download quality", 1);
var quality = [
    [ "low", "avatar170s" , "avatar300s"],
    [ "medium", "300x300" , "300x300"],
    [ "high", "770x0" , ""]
];

var scrollbar = window.GetProperty(" scrollbar", true);
var scrollbar_w = window.GetProperty(" scrollbar width ", 4);
var scrollbar_k;
var st_x = 0;
var sb_posy = 0;
var on_sb = false;
var on_sb_down = false;
var st_color;

var bg_transparent = window.GetProperty(" bg transparent (0-255)", 200);
var t_margin = window.GetProperty(" margin: text", 10);
var txt_x = window.GetProperty("txt_x", window.Width / 2);
var old_txt_x = 0;
var txt_y = window.GetProperty("txt_y", window.Height / 2);
var delta_x, delta_y;
var h_x, h1_y, h2_y, t_x, t_x;
var text = "";
var text_not_found = new Array(". . .", ". . .", ". . .");
var s_text = 0;
var h_text_row_height = 0;
var text_row_height = 0;
var text_rows = 0;
var text_visable_rows = 0;
var text_visable_height = 0;
var text_array = [];
var on_text = false;
var on_header = false;
var on_text_down = false;
var refresh_txt = true;

var album_info = window.GetProperty("album info", true);

var lang_query = new Array("", "ru/");
var lang_text = new Array("in", "ru");

var lang_query = new Array("", "ru/", "zh/");
var lang_text = new Array("in", "ru", "zh");

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

var select_p_a = window.GetProperty("artist/album", 0);
var p_a = new Array("images", "albums");

var panel_on = true;

var selection_mode = window.GetProperty("selection mode", 0);
var metadb;
on_item_focus_change();


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

    if(set_cycle){   
        gr.FillSolidRect(0, 0, ww, wh, RGBA(getRed(bgcolor),getGreen(bgcolor),getBlue(bgcolor),bg_transparent));   
        var txt_cycle = cycle == 0 ? "off" : cycle + " sec";   
        set_cycle && gr.GdiDrawText("auto cycle:   " + txt_cycle, t_font, t_color, 0, 20, ww, wh, DT_CENTER | DT_WORD_ELLIPSIS );
    } else{   
        gr.FillSolidRect(txt_x, txt_y, ww - txt_x, wh - txt_y, RGBA(getRed(bgcolor),getGreen(bgcolor),getBlue(bgcolor),bg_transparent));   
    }   

    draw_scrollbar(gr);   
   
    txt_shadow && gr.GdiDrawText( tf_artist, h_font, RGB(0,0,0), h_x + 1, h1_y + 2, ww - h_x - t_margin, wh, DT_LEFT | DT_WORD_ELLIPSIS | DT_NOPREFIX );   
    gr.GdiDrawText( tf_artist, h_font, h_color, h_x, h1_y, ww - h_x - t_margin, wh, DT_LEFT | DT_WORD_ELLIPSIS | DT_NOPREFIX );   

    if (album_info && select_p_a == 1){
        txt_shadow && gr.GdiDrawText( album, h2_font, RGB(0,0,0), h_x + 1, h2_y + 2, ww - h_x - t_margin, wh, DT_LEFT | DT_WORD_ELLIPSIS | DT_NOPREFIX );   
        gr.GdiDrawText( album, h2_font, t_color, h_x, h2_y, ww - h_x - t_margin, wh, DT_LEFT | DT_WORD_ELLIPSIS | DT_NOPREFIX );   
    }

    for (var i = 0; i < text_visable_rows * 2; i += 2) {
        try {
            txt_shadow && gr.GdiDrawText( text_array[i + s_text * 2].replace(/^\s+|\s+$/g, ""), t_font, RGB(0,0,0), t_x + 1, t_y + text_row_height * i / 2 + 2, ww, wh, DT_LEFT | DT_NOPREFIX );
            gr.GdiDrawText( text_array[i + s_text * 2].replace(/^\s+|\s+$/g, ""), t_font, t_color, t_x, t_y + text_row_height * i / 2 , ww, wh, DT_LEFT | DT_NOPREFIX );
        } catch(e) {}
    }

    //gr.GdiDrawText( "files " + files.length, gdi.Font("Arial",12, 0), t_color, 10, 0, ww, wh, DT_LEFT | DT_WORD_ELLIPSIS );
    //gr.GdiDrawText( "images " + images.length, gdi.Font("Arial",12, 0), t_color, 10, 20, ww, wh, DT_LEFT | DT_WORD_ELLIPSIS );
    //gr.GdiDrawText( "found " + test_found, gdi.Font("Arial",12, 0), t_color, 10, 40, ww, wh, DT_LEFT | DT_WORD_ELLIPSIS );
    //gr.GdiDrawText( "selected " + selected, gdi.Font("Arial",12, 0), t_color, 10, 60, ww, wh, DT_LEFT | DT_WORDBREAK );
}

function draw_image(gr){
    if (g_img && images.length > 0){
        var size = calc_img_size(g_img);
       
        gr.DrawRect(size.x, size.y, size.width, size.height, 1, RGBA(getRed(bgcolor),getGreen(bgcolor),getBlue(bgcolor),fader));
        gr.DrawImage(g_img, size.x, size.y, size.width, size.height, size.cx, size.cy, size.cwidth, size.cheight, 0, fader);
    }
   
    if (logo_img && images.length == 0 && !default_img){
        gr.DrawImage(logo_img, 10, 10, logo_img.Width * 1, logo_img.Height * 1, 0, 0, logo_img.Width, logo_img.Height, 0, 100);         
    }

    if (images.length == 0 && default_img){
        try {
            nc_img = gdi.Image(default_img_path);
            var size = calc_img_size(nc_img);
            gr.DrawImage(nc_img, size.x, size.y, size.width, size.height, size.cx, size.cy, size.cwidth, size.cheight, 0, default_img_transparent);
        } catch(e) {};
    }
}

function draw_scrollbar(gr){
    scrollbar_h = text_rows > text_visable_rows ? text_visable_height * (text_visable_rows / text_rows) : 0;
    if (text_rows > text_visable_rows){ scrollbar_h = Math.max(5, scrollbar_h)}
    scrollbar_y = s_text > 0 ? s_text * scrollbar_k : 0;

    st_x = ww - t_margin - scrollbar_w;
   
    sb_t = on_sb || on_sb_down ? 150 : 50;
    st_color = RGBA(getRed(h_color), getGreen(h_color), getBlue(h_color), sb_t);
   
    scrollbar && gr.FillSolidRect(st_x, t_y + scrollbar_y, scrollbar_w, scrollbar_h, st_color);
}

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 Eval(field) {   
    if (!metadb) return;   
    path = fb.Titleformat("%path%").EvalWithMetadb(metadb);
    directory_path = fb.Titleformat("$directory_path(%path%)").EvalWithMetadb(metadb);
    return path.indexOf('://') > 0 ? fb.TitleFormat("[" + field + "]").Eval(true) : fb.TitleFormat("[" + field + "]").EvalWithMetadb(metadb);
}   

function on_metadb_changed() {
    if (!panel_on) return;
    if (!metadb) return; 
    artist = Eval("%artist%");
    if (artist) {artist = clean_name(artist); tf_artist = Eval("%artist%")} else {artist = ""; tf_artist = ""};
    if (artist != old_artist){
        check_folder(artist_folder_path(artist));
        if (!save_images) del_folders(artist);
        get_pic();
        old_artist = artist;
    }
}   

function get_pic() {
    clear_txt_var();
    images = [];
    files = [];
    selected = 0;
    g_img = null;
    test_found = 0;
    window.Repaint();
   
    if (fso.FolderExists(artist_folder_path(artist))){
        get_files_from_dir(artist_folder_path(artist));
        if (!g_img && images.length > 0) {
            next_image(0);
            get_text();
        } else {
            get_lastFM_pic(artist_folder_path(artist));
        }
    }
}

function get_lastFM_pic(p){
    var xmlhttp1 = new ActiveXObject("Microsoft.XMLHTTP");   
    var url1 = ("http://www.last.fm/" + lang_query[lang] + "music/" + encodeURIComponent(artist) + "/+" + p_a[select_p_a]+ "?page=" + 1); 
    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 data = div.getElementsByTagName("img");
                var an = div.getElementsByTagName("p");
                var urls = [];
                var name = [];      // album name
                var name2 = [];     // album name
                var name3_tmp = []; // release date
                var name3 = [];     // release date
                var img_exist = [];
 
                if (select_p_a == 1){ 
                    for (i = 0; i < an.length; i++) {   
                        if (an[i].className == "album-grid-item-main-text" ){ 
                            name2.push(an[i].innerHTML.replace(/(&amp;)/g,'&'));
                        }
                    } 

                    for (i = 0; i < an.length; i++) {   
                        if (an[i].className == "album-grid-item-aux-text" ){
                            name3_tmp.push(an[i].innerHTML.replace(/\,/g,''));
                        }
                    }
                   
                    for (i = 0; i < name3_tmp.length; i++) {   
                        if (i%2 != 0) {                           
                            name3.push(name3_tmp[i].replace(/^\s+|\s+$/g,'').replace(/^(.*)\s/g,''));
                        }
                    }
                   
                    if (name3) utils.WriteINI( p + "\\" + artist + "_album_info.ini", "album-grid-item-aux-text", "name3", name3);
                }

                for (i = 0; i < data.length; i++) {   
                    if (data[i].className == "image-list-image" && select_p_a == 0){       
                        if (data[i].src.indexOf("http://img2-ak.lst.fm/i/u/avatar170s") == 0 || data[i].src.indexOf("https://lastfm-img2.akamaized.net/i/u/avatar170s") == 0) {
                            urls.push(data[i].src.replace("avatar170s", quality[download_quality][1]));
                        }     
                    }
                    if (data[i].className == "album-grid-album-art" && select_p_a == 1){ 
                        if ((data[i].src.indexOf("http://img2-ak.lst.fm/i/u/300") == 0 || data[i].src.indexOf("https://lastfm-img2.akamaized.net/i/u/300") == 0) && data[i].src.indexOf("c6f59c1e5e7240a4c0d427abd71f3dbb") < 0) {   
                            //urls.push(data[i].src.replace("300x300", quality[download_quality][2]));
                            //name.push(data[i].alt.replace(/^(.*)'.*$/g,'$1').replace(/^(.*?)'/g,''));
                            if (data[i].src.indexOf("c6f59c1e5e7240a4c0d427abd71f3dbb") < 0) { 
                                urls.push(data[i].src.replace("300x300", quality[download_quality][2]));
                                name.push(data[i].alt.replace(/^(.*)'.*$/g,'$1').replace(/^(.*?)'/g,''));
                                img_exist.push(i - 3);
                            }
                        } 
                        utils.WriteINI( p + "\\" + artist + "_album_info.ini", "img_exist", "img_exist", img_exist);
                    }
                }

                var found = urls.length;
                test_found = found;
               
                for (i = 0; i < Math.min(urls.length, limit); i++) { 
                    if (select_p_a == 0){                   
                        var file = "\"" + p + "\\" + artist + "_"  + i + "_" + p_a[select_p_a] + ".jpg" + "\"";     
                        WshShell.Run(vbs + " " + urls[i] + " " + file, 0, false);
                    }

                    if (select_p_a == 1){
                        //utils.WriteINI( p + "\\" + artist + "_album_info.ini", "album_name", i, name[i]);
                        utils.WriteINI( p + "\\" + artist + "_album_info.ini", "album_name", i, name2[img_exist[i]]);
                        var file2 = "\"" + p + "\\" + artist + "_"  + i + "_" + p_a[select_p_a] + ".jpg" + "\"";   
                        WshShell.Run(vbs + " " + urls[i] + " " + file2, 0, false);
                    }
                }     
                doc.close();
                if (found > 0) get_files_if_loaded(p);
                get_text();
            }
        }
    }     
}

function get_files_from_dir(p) {
    if (!artist) return;
    files = utils.Glob(p + "\\" + artist + "*" + p_a[select_p_a] + ".jpg").toArray();

    if (files.length > images.length){
        images = [];
        files = naturalSort(files);
       
        for (var i = 0; i < files.length; i += 1) {
            try {
                images.push(resize_image(gdi.Image(files[i])));
            } catch(e) {}
        }
    }
}

function next_image(d){
    fader = fade_effect ? 0 : 255;
    if (d < 0) {selected = selected <= 0 ? images.length - 1 : selected = selected - 1};
    if (d > 0) {selected = selected >= images.length - 1 ? 0 : selected = selected + 1};
    g_img = images[selected];
    if (g_img && fade_effect) fader_timer();
    window.Repaint();
    if (album_info && select_p_a == 1) get_a_text(selected);
}

function resize_image(img){
    if (!img) return;

    var scale_w = (ww - p_margin * 2) / img.Width;
    var scale_h = (wh - p_margin * 2) / img.Height;
    var scale = Math.min(scale_w, scale_h);
    var nww = img.Width * scale;
    var nwh = img.Height * scale

    var temp_bmp = gdi.CreateImage(nww, nwh);
    var temp_gr = temp_bmp.GetGraphics();
    temp_gr.SetSmoothingMode(2);
    temp_gr.SetInterpolationMode(7);
    temp_gr.DrawImage(img, 0, 0, nww, nwh, 0, 0, img.width, img.height);
    temp_bmp.ReleaseGraphics(temp_gr);
   
    CollectGarbage();
    return temp_bmp;
    temp_bmp.Dispose();
    temp_gr = null;
    temp_bmp = null;
}

function get_text(){
    if (album_info && select_p_a == 1){
        get_a_text(selected);
    } else {
        get_b_text();
    }
}

function clear_txt_var() {
    album = "";
    s_text = 0;
    text = "";
    text_array = [];
    get_text_array();
    window.Repaint();
}

function get_b_text() {
    clear_txt_var();
    refresh_txt = true;
    var b_text_file = artist_folder_path(artist) + "\\" + artist + "_biography_" + lang_text[lang] + ".txt";

    if (fso.FolderExists(artist_folder_path(artist))){
        if (fso.FileExists(b_text_file)){
            text = utils.ReadTextFile(b_text_file);
            get_text_array();
        } else{
            get_lastFM_b_text(b_text_file);
        }
    }
}

function get_lastFM_b_text(p){
    xmlhttp2 = new ActiveXObject("Microsoft.XMLHTTP");
    url2 = ("http://www.last.fm/" + lang_query[lang] + "music/" + encodeURIComponent(artist) + "/+wiki");
    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 data = div.getElementsByTagName("div");
                for (i = 0; i < data.length; i++) {
                    if (data[i].className == "wiki-content") {
                        text = strip_tags(data[i].innerHTML).replace(/^\s+|\s+$/g,"");
                        break;
                    }
                }
                doc.close();
            }
            if (text != "") save_txt_file(text, p);
            if (text == "") text = text_not_found[lang];
            get_text_array();
        }
    }
}

function strip_tags(t) {
    doc.open();
    var div = doc.createElement("div");
    div.innerHTML = t.replace(/<[Pp][^>]*>/g, "").replace(/<\/[Pp]>/g, "<br>").replace(/\n/g, "<br>");
    var text = div.innerText;
    doc.close();
    return text;
}

function get_text_array() {
    h_x = txt_x + t_margin;
    h1_y = txt_y + t_margin;
 
    temp_bmp = gdi.CreateImage(1, 1);
    temp_gr = temp_bmp.GetGraphics();

    h_text_row_height = temp_gr.CalcTextHeight("Text", h_font);
    text_row_height = temp_gr.CalcTextHeight("Text", t_font);
   
    h2_y = h1_y + h_text_row_height;
   
    t_x = txt_x + t_margin;
    t_y = (album_info && select_p_a == 1 ? h2_y + h_text_row_height : h1_y + h_text_row_height) + text_row_height;
   
    string_width = scrollbar ? Math.max(ww - t_x - t_margin - scrollbar_w - 10, 0) : Math.max(ww - t_x - t_margin, 0);

    if (Math.abs(txt_x - old_txt_x) > 5 || refresh_txt){
        text_array = [];
        if (text) text_array = temp_gr.EstimateLineWrap(text.replace(/^\s+|\s+$/g,""), t_font, string_width).toArray();
        old_txt_x = txt_x;
        refresh_txt = false;
    }
   
    text_rows = text_array.length / 2;

    b_text_visable_area = Math.floor(Math.max(0, window.Height - t_margin - t_y));
    text_visable_rows = Math.floor(b_text_visable_area / text_row_height);
    text_visable_height = text_visable_rows * text_row_height;


    if (text_visable_rows + s_text > text_rows && s_text > 0) {
        s_text = (text_rows - text_visable_rows);
    }

    scrollbar_k = text_visable_height / text_rows;
   
    temp_bmp.ReleaseGraphics(temp_gr);
    temp_bmp.Dispose();
    temp_gr = null;
    temp_bmp = null;

    window.Repaint();
}

function save_txt_file(t, p){
    if (!artist) return;
    if (fso.FolderExists(artist_folder_path(artist))){
        try {
            file = fso.OpenTextFile( p, 2, true, -1)
            file.WriteLine(t);
            file.Close();
        } catch(e) {
            return;
        }
    }
}

function on_mouse_rbtn_up (x, y){     
    var _menu = window.CreatePopupMenu();
   
    _menu.AppendMenuItem(MF_ENABLED, 10, lang_text[0] + " text");   
    _menu.AppendMenuItem(MF_ENABLED, 11, lang_text[1] + " text");   
    _menu.AppendMenuItem(MF_ENABLED, 12, lang_text[2] + " text");   
    _menu.CheckMenuRadioItem(10, 12, lang + 10);         
    _menu.EnableMenuItem(lang + 10, 1);     

    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);   
    _menu.AppendMenuItem(MF_ENABLED, 20, "Prefer now playing");   
    _menu.AppendMenuItem(MF_ENABLED, 21, "Follow selected track");   
    _menu.CheckMenuRadioItem(20, 21 , selection_mode + 20);   
    _menu.EnableMenuItem(selection_mode + 20, 1);
       
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0); 
    _menu.AppendMenuItem(MF_ENABLED, 30, "Artist pictures");   
    _menu.AppendMenuItem(MF_ENABLED, 31, "Albums pictures");   
    _menu.CheckMenuRadioItem(30, 31 , select_p_a + 30);   
    _menu.EnableMenuItem(select_p_a + 30, 1);

    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0); 
    _menu.AppendMenuItem(MF_ENABLED, 40, "Album info");
    _menu.CheckMenuItem(40, album_info);

    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);   
    IS_ARTIST = artist ? MF_ENABLED : MF_GRAYED;   
    _menu.AppendMenuItem(IS_ARTIST, 50, "last.fm Artist");
    _menu.AppendMenuItem(IS_ARTIST, 51, "last.fm Albums");
   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 60, "Fade effect");
    _menu.CheckMenuItem(60, fade_effect);

    _firstgroup = window.CreatePopupMenu();
    _firstgroup.AppendTo(_menu,MF_ENABLED,  "Align : " + align_mode_a[align_mode]);
   
    _firstgroup.AppendMenuItem(MF_ENABLED, 70, align_mode_a[0]);         
    _firstgroup.AppendMenuItem(MF_ENABLED, 71, align_mode_a[1]);
    _firstgroup.AppendMenuItem(MF_ENABLED, 72, align_mode_a[2]);
    _firstgroup.AppendMenuItem(MF_ENABLED, 73, align_mode_a[3]);
    _firstgroup.AppendMenuItem(MF_ENABLED, 74, align_mode_a[4]);
    _firstgroup.AppendMenuItem(MF_ENABLED, 75, align_mode_a[5]);
    _firstgroup.CheckMenuRadioItem(70, 75, align_mode + 70);
    _firstgroup.EnableMenuItem(align_mode + 70, 1);

    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _secondgroup = window.CreatePopupMenu();
    _secondgroup.AppendTo(_menu,MF_ENABLED,  "Download quality : " + quality[download_quality][0]);
   
    _secondgroup.AppendMenuItem(MF_ENABLED, 80, "Low");
    _secondgroup.AppendMenuItem(MF_ENABLED, 81, "Medium");
    _secondgroup.AppendMenuItem(MF_ENABLED, 82, "High");
    _secondgroup.CheckMenuRadioItem(80, 82, download_quality + 80);
    _secondgroup.EnableMenuItem(download_quality + 80, 1);

    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _thirdgroup = window.CreatePopupMenu();
   
    MF_STRING = images.length > 0 ? MF_ENABLED : MF_GRAYED;
    _thirdgroup.AppendTo(_menu,MF_STRING,  "Copy to folder containing track...");
   
    _thirdgroup.AppendMenuItem(MF_STRING, 90, "Copy file");
    _thirdgroup.AppendMenuItem(MF_STRING, 91, "Copy files");
   
    _menu.AppendMenuItem(MF_STRING, 100, "Open image");
   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 110, "Save images and text");
    _menu.CheckMenuItem(110, save_images);
   
   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 120, "Load album image");

    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);   
    _menu.AppendMenuItem(MF_ENABLED, 500, "Reload");   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);   
    _menu.AppendMenuItem(MF_ENABLED, 510, "Properties");   
    _menu.AppendMenuItem(MF_ENABLED, 520, "Configure ...");

    ret = _menu.TrackPopupMenu(x,y);

    switch (ret) {
    case 10:
    case 11:
    case 12:
        lang = ret - 10;
        window.SetProperty("lang", lang);
        get_text();
        break;
    case 20:
        selection_mode = 0;
        window.SetProperty("selection mode", selection_mode);
        on_item_focus_change();
        break;
    case 21:
        selection_mode = 1;
        window.SetProperty("selection mode", selection_mode);
        on_item_focus_change();
        break;
    case 30:
        select_p_a = 0;
        window.SetProperty("artist/album", select_p_a);
        get_pic();
        break;
    case 31:
        select_p_a = 1;
        window.SetProperty("artist/album", select_p_a);
        get_pic();
        break;
    case 40:
        window.SetProperty("album info", ! album_info);
        album_info = window.GetProperty("album info");
        get_text();
        break;
    case 50:
        WshShell.run("http://www.last.fm/" + lang_query[lang] + "music/" + encodeURIComponent(artist));
        break;
    case 51:
        WshShell.run("http://www.last.fm/" + lang_query[lang] + "music/" + encodeURIComponent(artist) + "/" + "+albums");
        break;
    case 60:
        window.SetProperty("fade effect", !fade_effect);
        fade_effect = window.GetProperty("fade effect");
        break;
    case 70:
    case 71:
    case 72:
    case 73:
    case 74:
    case 75:
        align_mode = ret - 70;
        window.SetProperty("align mode", align_mode);
        window.Repaint();
        break;
    case 80:
    case 81:
    case 82:   
        download_quality = ret - 80;
        window.SetProperty("download quality", download_quality);
        break;
    case 90:
        select_file = 0;
        copy_files();
        break;
    case 91:
        select_file = 1;
        copy_files();
        break;
    case 100:
        try {
            if (images[selected]) WshShell.run( '"' + artist_folder_path(artist)+ "\\" + artist + "_"  + selected + "_" + p_a[select_p_a] + ".jpg" + '"' );
        } catch(e) {}
        break;
    case 110:
        window.SetProperty("Save images", !save_images);
        save_images = window.GetProperty("Save images");
        break;
    case 120:
        search_lastFM_album_img();
        break;
    case 500:
        window.Reload();
        break;
    case 510:
        window.ShowProperties();
        break;   
    case 520:
        window.ShowConfigure();   
        break;   
   }
    _menu.Dispose();   
    return true;   
}   

var timer;

function get_files_if_loaded(p){
    timer && window.ClearInterval(timer);
    timer = window.SetInterval(function() {
        get_files_from_dir(p);
        for (var i = 0; i < files.length; i += 1) {
            if (get_fn(files[i]).replace(/^(.*?)_|_.*/g,'') == 0 && images.length > 0) {
                next_image(0);
                window.ClearInterval(timer);
             }                 
        }
    }, 500 );
}

var set_cycle = false;

function on_key_down(vkey) {
    if (vkey == 16){
        set_cycle = true;
        dis_set();
        window.Repaint();
    }
}

var cycle_timer, step = 0;

function set_cycle_timer(){
    cycle_timer && window.ClearInterval(cycle_timer);
    cycle_timer = window.SetInterval(function() {
        step =  set_cycle ? 0 : step + 1;
        if (cycle > 0 && step >= cycle){
            get_files_from_dir(artist_folder_path(artist));
            if (images.length > 1){
                next_image(1);
                step = 0;
            }
        }
        window.Repaint();
    }, 1000 );
}

var dis_timer, dis = 0;

function dis_set(){
    dis = 0;
    dis_timer && window.ClearInterval(dis_timer);
    dis_timer = window.SetInterval(function() {
        if (set_cycle) {
            dis++;
            if(dis == 1) {
                set_cycle = false;
                if (cycle > 0) set_cycle_timer();
                if (cycle == 0) window.ClearInterval(cycle_timer);
                window.ClearInterval(dis_timer)
                window.Repaint();
            };
        }
    }, 1000 );
}

var delay = false;

function fdelay(){
    var delay_timer = window.SetTimeout(function() {
        delay = false;
        window.ClearTimeout(delay_timer);
    }, 200);
}

var ftimer;

function fader_timer(){
    fader = 0;
    ftimer && window.ClearInterval(ftimer);
    ftimer = window.SetInterval(function() {
        fader = fader + fade_step;
        if (fader >= 255) {
            fader= 255;
            window.ClearInterval(ftimer);
        }
        window.Repaint();
    }, 42 );
}

function load_last_fm_logo(){
    if(!fso.FileExists(script_path + "footer_logo.png")) {
        var url = "http://static-web.last.fm/static/images/favicon.702b239b6194.ico"
        var file = "\"" + script_path + "last_fm_ico.ico" + "\"";
        WshShell.Run(vbs + " " + url + " " + file, false);

        var url = "http://static-web.last.fm/static/images/footer_logo.ddcfd65712a6.png"
        var file = "\"" + script_path + "footer_logo.png" + "\"";
        WshShell.Run(vbs + " " + url + " " + file, false);
    }
}

function create_download_file() {
    try {
        file = fso.CreateTextFile(script_path + "download.vbs" )
       
        var text =   
            "If (WScript.Arguments.Count <> 2) Then" + "\n\r" +   
            "   WScript.Quit" + "\n\r" +
            "End If" + "\n\r" + "\n\r" +   

            "url = WScript.Arguments(0)" + "\n\r" +   
            "file = WScript.Arguments(1)" + "\n\r"  + "\n\r" +   

            "Set objFSO = Createobject(" + '"Scripting.FileSystemObject"' + ")" + "\n\r" +   
            "If objFSO.Fileexists(file) Then" + "\n\r" +   
            "   Set objFSO = Nothing" + "\n\r" +
            "   WScript.Quit" + "\n\r" +
            "End If" + "\n\r" + "\n\r" +   

            "Set objXMLHTTP = CreateObject(" + '"MSXML2.XMLHTTP"' + ")" + "\n\r" +   
            "objXMLHTTP.open " + '"GET"' + ", url,false" + "\n\r" +   
            "objXMLHTTP.send()" + "\n\r" + "\n\r" +   

            "If objXMLHTTP.Status = 200 Then" + "\n\r" +   
            "   Set objADOStream = CreateObject(" + '"ADODB.Stream"' + ")" + "\n\r" +
            "   objADOStream.Open" + "\n\r" +
            "   objADOStream.Type = 1" + "\n\r" +
            "   objADOStream.Write objXMLHTTP.ResponseBody" + "\n\r" +
            "   objADOStream.Position = 0" + "\n\r" +
            "   objADOStream.SaveToFile file" + "\n\r" +
            "   objADOStream.Close" + "\n\r" +
            "   Set objADOStream = Nothing" + "\n\r" +
            "End If" + "\n\r" + "\n\r" +   

            "Set objFSO = Nothing" + "\n\r" +   
            "Set objXMLHTTP = Nothing"   
        ;

        file.WriteLine(text);
        file.Close();
    } catch(e) {};
}

function on_mouse_move(x, y) {
    window.SetCursor(32649);

    on_header = x >= txt_x && x < st_x && y >= h1_y && y < t_y ? true : false;
    on_text = x >= txt_x && x < st_x && y >= t_y ? true : false;
    on_sb =  x >= st_x && x < ww && y >= txt_y && y < wh ? true : false;
    on_pic = !on_text && !on_header && !on_sb ? true : false;

    if (on_text_down){
        txt_x = x - delta_x;
        txt_y = y - delta_y;

        txt_x = txt_x <= 0 ? 0 : txt_x >= ww - 50 ? ww - 50: txt_x;
        txt_y = txt_y <= 0 ? 0 : txt_y >= wh - (h_text_row_height + t_margin * 1) ? wh - (h_text_row_height + t_margin * 1) : txt_y;

        get_text_array();
    }

    if (on_sb_down && scrollbar && text_rows > text_visable_rows){
        sb_posy = y + delta_y;
        s_text = y + delta_y >= 0 ? y + delta_y <= (text_rows - text_visable_rows) * scrollbar_k ? Math.round(sb_posy / scrollbar_k) : text_rows - text_visable_rows : 0;
        window.RepaintRect(txt_x, txt_y, ww - txt_x, wh - txt_y);
    }
   
    window.RepaintRect(st_x, txt_y, ww, wh);
}

function on_mouse_wheel(delta) {
    ShiftDown = utils.IsKeyPressed(0x10) ? true : false;
   
    if (on_pic && !ShiftDown && !delay){
        get_files_from_dir(artist_folder_path(artist));
        if (files.length > 1){
            delay = true;
            fdelay();
            next_image(delta);
            if (cycle > 0) step = 0;
        }
    }
   
    if ((on_header || on_text) && !ShiftDown){
        if (text_rows > text_visable_rows){
            if (delta < 0) {s_text = text_rows - s_text <= text_visable_rows ? text_rows - text_visable_rows : s_text += 1}
            if (delta > 0) {s_text = s_text <= 0 ? 0 : s_text -= 1}
        }
        window.RepaintRect(txt_x, txt_y, ww - txt_x, wh - txt_y);
    }
   
    if ((on_header || on_text) && ShiftDown && !delay){
        delay = true;
        fdelay();
        if (on_header && delta < 0) {font_size_h = font_size_h <= min_font_size ? min_font_size : font_size_h - 2;};
        if (on_header && delta > 0) {font_size_h = font_size_h >= max_font_size ? max_font_size : font_size_h + 2;};
        window.SetProperty("font size: artist", font_size_h);
        if (on_text && delta < 0) {font_size_t = font_size_t <= min_font_size ? min_font_size : font_size_t - 2;};
        if (on_text && delta > 0) {font_size_t = font_size_t >= max_font_size ? max_font_size : font_size_t + 2;};
        window.SetProperty("font size: biography", font_size_t);
        get_font();
        refresh_txt = true;
        get_text_array();
    }

    if (set_cycle && on_pic) {
        if (delta < 0) {cycle = cycle <= 0 ? 0 : cycle - 5;};
        if (delta > 0) {cycle = cycle >= 60 ? 60 : cycle + 5;};
        window.SetProperty("auto cycle (sec)", cycle);
        window.Repaint();
    }
}

function on_mouse_lbtn_down(x,y){
    if (on_header || on_text){
        on_text_down = true;
        delta_x = x - txt_x;
        delta_y = y - txt_y;
    }
    if (on_sb){
        on_sb_down = true;
        sb_posy = s_text * scrollbar_k;
        delta_y = sb_posy - y;
    }
}

function on_mouse_lbtn_up(x,y){
    window.SetProperty("txt_x", txt_x);
    window.SetProperty("txt_y", txt_y);
    on_text_down = false;
    on_sb_down = false;
}

function on_mouse_lbtn_dblclk (x,y){
    if (on_text){
        lang = lang == 1 ? 0 : 1;
        window.SetProperty("lang", lang);
        get_text();
    }

    if (on_pic){
        select_p_a = select_p_a == 1 ? 0 : 1;
        window.SetProperty("artist/album", select_p_a);
        get_pic();
    }
}

function on_mouse_leave() {
    window.SetCursor(32512);
    on_sb = false;
    window.Repaint();
}

function on_size(){
    ww = window.Width;   
    wh = window.Height;
   
    txt_x = window.GetProperty("txt_x");
    txt_y = window.GetProperty("txt_y");

    txt_x = txt_x >= ww - 50 && txt_x >= 0 ? ww - 50 : txt_x;
    txt_y = txt_y >= wh - (h_text_row_height + t_margin * 1) && txt_y >= 0 ? wh - (h_text_row_height + t_margin * 1) : txt_y;
   
    refresh_txt = true;
    get_text_array();
}

function del_folders(n){
    var dir = fso.GetFolder(tmp_b_path);
    var e = new Enumerator( dir.SubFolders );
    try {
        for(; !e.atEnd(); e.moveNext() ) {
            var name = e.item().Name;
            if (name.indexOf("_download") < 0){
                if (name.indexOf(n) < 0){
                    fso.deleteFolder(tmp_b_path + name, true);
                }
            }   
        }
    } catch(e) {};
}

function calc_img_size(img){
    if(!img) return;
    var size = {x:0, y:0, width:0, height:0, cx:0, cy:0, cwidth:0, cheight:0};

    switch(align_mode) {   
   case 0: // adjust      
        var sw = ww / img.Width;
        var sh = wh / img.Height;
        var s = Math.min(sw, sh);
       
        var x = 0;
        var y = 0;
       
        if (sw > sh) x = (ww - img.Width * s) / 2;
        else if (sw < sh) y = (wh - img.height * s) / 2;

        var width = img.Width * s;
        var height = img.Height * s;
        var cx = 0;
        var cy = 0;
        var cwidth = img.Width;
        var cheight = img.Height;
      break;
       
    case 1: // adjust top - center
        var sw = ww / img.Width;
        var sh = wh / img.Height;
        var s = Math.min(sw, sh);

        var x = 0;
        if (sw > sh) x = (ww - img.Width * s) / 2;
        var y = 0;
        var width = img.Width * s;
        var height = img.Height * s;
        var cx = 0;
        var cy = 0;
        var cwidth = img.Width;
        var cheight = img.Height;
      break;
       
    case 2: // adjust top - left
        var sw = ww / img.Width;
        var sh = wh / img.Height;
        var s = Math.min(sw, sh);
       
        var x = 0;
        var y = 0;
        var width = img.Width * s;
        var height = img.Height * s;
        var cx = 0;
        var cy = 0;
        var cwidth = img.Width;
        var cheight = img.Height;
      break;

   case 3: // centre   
      var sr = img.Width / img.Height;   
      var dr = ww / wh;   
      if (sr < dr) {   
         var r = img.Width / ww;
         var cheight = wh * r;
         var cy = Math.round((img.Height - cheight) / 2);
         var cwidth = img.Width;
         var cx = 0;
      } else {   
         var r = img.Height / wh;
         var cwidth = ww * r;
         var cx = Math.round((img.Width - cwidth) / 2);
         var cheight = img.Height;
         var cy = 0;
      }   
        var x = 0;         
        var y = 0;         
        var width = ww;         
        var height = wh;         
      break;   
       
   case 4: // centre - top      
      var sr = img.Width / img.Height;   
      var dr = ww / wh;   
      if (sr < dr) {   
         var r = img.Width / ww;
         var cheight = wh * r;
         var cy = 0;
         var cwidth = img.Width;
         var cx = 0;
      } else {   
         var r = img.Height / wh;
         var cwidth = ww * r;
         var cx = Math.round((img.Width - cwidth) / 2);
         var cheight = img.Height;
         var cy = 0;
      }
        var x = 0;
        var y = 0;
        var width = ww;
        var height = wh;
      break;   
       
   case 5: // stretch      
        var x = 0;
        var y = 0;
        var width = ww;
        var height = wh;
        var cx = 0;
        var cy = 0;
        var cwidth = img.Width;
        var cheight = img.Height;
      break;   
    }
   
    size.x = x + p_margin;
    size.y = y + p_margin;
    size.width = width - p_margin * 2;
    size.height = height - p_margin * 2;
    size.cx = cx;
    size.cy = cy;
    size.cwidth = cwidth;
    size.cheight = cheight;
   
    return size;
}

var select_file = 0;

function copy_files(){
    var destination_path;
    var tmp_files = [];
    var tmp_artist = artist;
    var tmp_p_a = p_a[select_p_a];
    var tmp_directory_path;

    if (path.indexOf('://') > 0 || path.indexOf('youtube') == 0 || path.indexOf('cdda') == 0) {
        tmp_directory_path = fb.ProfilePath + "tmp_lastFM_img\\";
    } else {
        tmp_directory_path = directory_path + "\\" + tmp_p_a + "\\";
    }   
   
    var nl = "\" + chr(10) + \"";

    if (select_file == 0){
        files = naturalSort(files);
        tmp_files.push(files[selected]);
        var input_box_text = "Copy  " + nl + nl + get_fnext(tmp_files[0]) + nl + "file to";
    } else {
        tmp_files = files;
        var input_box_text = "Copy  " + nl + nl + tmp_artist + " " + tmp_p_a + ".jpg" + nl + "files to";
    }

    var string = input_box(input_box_text, tmp_directory_path, "Foobar 2000");
   
    if (string){
        destination_path = folder_exists(string);
       
        if(fso.FolderExists(destination_path)) {
            copy_files_to_folder(destination_path, tmp_files, tmp_p_a);
        }else{
            copy_files();
        }
    }
}

function copy_files_to_folder(p, f, pa){
    for (i in f) {
        if (f[i].indexOf(pa) > 0){
            try {
                fso.CopyFile (f[i], p  , 1 );
            } catch(e) {}
        }
    }
}

function input_box(p_text, d_text, w_title){
    vbe = new ActiveXObject('ScriptControl');
    vbe.Language = 'VBScript';
    return vbe.eval( "InputBox(\"" + p_text + "\",\"" + w_title + "\",\"" + d_text + "\")");
}

function clean_path_name(n) {
    if (!n) return;
    return n.replace(/[\/\:\*\?\"\<\>\|]/g,'');
}

function folder_exists(n) {
    var driver = fso.GetDriveName(n);
    if (!fso.DriveExists(driver)) {
        return "";
    } else {
        var p = "";
        var split_string = [];
        split_string = n.replace(/\\$/g, "").split("\\");

        for (var i = 1; i < split_string.length; i += 1) {
            p = p + clean_path_name(split_string[i]) + "\\";
            try {
                if(!fso.FolderExists(driver + "\\" + p)) fso.CreateFolder(driver + "\\" + p);
            } catch(e) {};
        }
        return driver + "\\" + p;
    }
}

function on_notify_data(name, info) {
    if(name == "panel") {
        if (info == "bio"){
            panel_on = true;
            artist = "";
            on_metadb_changed();
        } else{
            panel_on =  false;
        }
    }
}

function naturalSort(stringArray) {
    var xor = function(a, b) {
        return a ? !b : b;
    }
    var isDigit = function(chr) {
        var charCode = function(ch) {
            return ch.charCodeAt(0);
        };
        var code = charCode(chr);
        return (code >= charCode('0')) && (code <= charCode('9'));
    }
    var splitString = function(str) {
        var from = 0;   
        var index = 0;
        var count = 0; 
        var splitter = {};

        splitter.count = function () {
            return count;
        }
        splitter.next = function() {
            if (index === str.length) {
                return null;
            }
            while(++index) {
                var currentIsDigit = isDigit(str.charAt(index - 1)); 
                var nextChar = str.charAt(index);
                var currentIsLast = (index === str.length);
                var isBorder = currentIsLast || xor(currentIsDigit, isDigit(nextChar));       
                if (isBorder) {
                var part = str.slice(from, index);
                    from = index;
                    count++;
                    return {
                        IsNumber: currentIsDigit,
                        Value: currentIsDigit ? Number(part) : part
                    }
                }
            }
        }
        return splitter;
    }
    var compareStrings = function(str1, str2) {
        var compare = function(a, b) { 
            return (a < b) ? -1 : (a > b) ? 1 : 0;
        }
        var splitter1 = splitString(str1);
        var splitter2 = splitString(str2);
        while (true) {
            var first = splitter1.next();
            var second = splitter2.next();
            if (null !== first && null !== second) {
                if (xor(first.IsNumber, second.IsNumber)) {
                    return first.IsNumber ? -1 : 1;       
                } else {                   
                    var comp = compare(first.Value, second.Value);   
                    if (comp != 0) {
                        return comp;
                    }
                }
            } else {
                return compare(splitter1.count(), splitter2.count());
            }
        }
    }
    var arr = stringArray;
    return arr.sort(compareStrings); 
}

function get_a_text(s) {
    clear_txt_var();
    refresh_txt = true;
    var a_text_file = artist_folder_path(artist) + "\\" + artist + "_" + s + "_albums_" + lang_text[lang] + ".txt";   album_2 = utils.ReadINI( artist_folder_path(artist) + "\\" + artist + "_album_info.ini", "album_name", s );
    album = utils.ReadINI( artist_folder_path(artist) + "\\" + artist + "_album_info.ini", "album_name", s );
   
    if (fso.FileExists(a_text_file)){
        text = utils.ReadTextFile(a_text_file);
        get_text_array();
    } else{
        get_lastFM_a_text(album, a_text_file);
    }
}

function get_lastFM_a_text(album, p){
    xmlhttp3 = new ActiveXObject("Microsoft.XMLHTTP");
    url3 = ("http://www.last.fm/" + lang_query[lang] + "music/" + encodeURIComponent(artist) + "/" + encodeURIComponent(album) + "/+wiki");
    xmlhttp3.open("GET", url3, true);
    xmlhttp3.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
    xmlhttp3.send(null);
    xmlhttp3.onreadystatechange = function () {
        if (xmlhttp3.readyState == 4) {
            if (xmlhttp3.status == 200) {
                doc.open();
                var div = doc.createElement("div");
                div.innerHTML = xmlhttp3.responsetext;
                var data = div.getElementsByTagName("div");

                for (i = 0; i < data.length; i++) {
                    if (data[i].className == "wiki-content" && album) {
                        text = strip_tags(data[i].innerHTML).replace(/^\s+|\s+$/g,"");
                        if (text != "") save_txt_file(text, p);
                        break;
                    }
                }
                doc.close();
            }
            if (text == "") text = text_not_found[lang];
            get_text_array();
        }
    }
}

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

 
function search_lastFM_album_img(){
    if (!metadb) return; 
    var tf_album = Eval("%album%");
    var tmp_album;
    var tmp_artist = artist;

    if (tf_album){
        tmp_album = input_box("Search album image for", tf_album, "Foobar 2000");

        if (tmp_album) get_lastFM_albums_pages(tmp_album, tmp_artist);
    }
}

function get_lastFM_albums_pages(tmp_album, tmp_artist){
    xmlhttp0 = new ActiveXObject("Microsoft.XMLHTTP");   
    url0 = ("http://www.last.fm/" + lang_query[lang] + "music/" + encodeURIComponent(tmp_artist) + "/" + "+albums");
    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 data = div.getElementsByTagName("li");
                var albums_pages = 0;   
                for (i = 0; i < data.length; i++) {
                    if (data[i].className == "pages"){
                        albums_pages = data[i].innerHTML.replace(/^\s+|\s+$/g,"").replace(/^(.*\s)/g,'');
                    }
                }
            }     
            doc.close();
            albums_pages = albums_pages == 0 ? 1 : albums_pages;
            for (i = 1; i <= albums_pages; i++) { 
                get_lastFM_album_img(i, tmp_album, tmp_artist);
            }
        }
    }
}     

function get_lastFM_album_img(i, tmp_album, tmp_artist){
    var xmlhttp3  = new ActiveXObject("Microsoft.XMLHTTP");   
    var url3 = ("http://www.last.fm/" + lang_query[lang] + "music/" + encodeURIComponent(tmp_artist) + "/" + "+albums" + "?page=" + i); 
    xmlhttp3.open("GET", url3, true ); 
    xmlhttp3.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
    xmlhttp3.send(null);     
    xmlhttp3.onreadystatechange = function () {
        if (xmlhttp3.readyState == 4) {
            if (xmlhttp3.status == 200) { 
                doc.open();     
                var div = doc.createElement("div");
                div.innerHTML = xmlhttp3.responsetext;
                var data = div.getElementsByTagName("img");
                var urls = [];
                var files = [];
                for (i = 0; i < data.length; i++) {   
                    if (data[i].className == "album-grid-album-art"){ 
                        if ((data[i].src.indexOf("http://img2-ak.lst.fm/i/u/300") == 0 || data[i].src.indexOf("https://lastfm-img2.akamaized.net/i/u/300") == 0) && data[i].src.indexOf("c6f59c1e5e7240a4c0d427abd71f3dbb") < 0) {                       
                            if (data[i].alt.replace(/^(.*?)'|'$/g,'').replace(/\s/,'').toLowerCase() == tmp_album.replace(/\s/,'').toLowerCase()){
                                urls.push(data[i].src.replace("300x300", quality[download_quality][2]));
                                files.push(clean_name(tmp_artist) + "_" + clean_name(tmp_album) + "_" + i + ".jpg");
                            }
                        }     
                    }
                }
                doc.close();
                for (i = 0; i < urls.length; i++) { 
                    save_lastFM_album_img(files[i], urls[i]);
                }
            }
        }
    }     
}

function save_lastFM_album_img(file_name, url){
    var destination_path;
    var tmp_directory_path;

    if (path.indexOf('://') > 0 || path.indexOf('youtube') == 0 || path.indexOf('cdda') == 0) {
        tmp_directory_path = fb.ProfilePath + "tmp_lastFM_img\\";
    } else {
        tmp_directory_path = directory_path + "\\";
    }   
   
    var nl = "\" + chr(10) + \"";
    var input_box_text = "Save  " + nl + nl + file_name + nl + "file to";
    var string = input_box(input_box_text, tmp_directory_path, "Foobar 2000");
   
    if (string){
        destination_path = folder_exists(string);
       
        if(fso.FolderExists(destination_path)) {
            var file_path = "\"" + destination_path + "\\" + file_name + "\"";
            WshShell.Run(vbs + " " + url + " " + file_path, 0, false);
        }else{
            save_lastFM_album_img(file_name, url);
        }
    }
}



I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 53
Откуда: Украина, Днепр
Репутация: 325
С нами: 4 года 2 месяца

Сообщение #1531 MC Web » 17.12.2016, 22:09

kgena_ua, привет.

Я так думаю от предыдущей версии не сильно отличается ?
Пока времени нет сравнивать.
MC Web
Мастер
Репутация: 65
С нами: 3 года 10 месяцев

Сообщение #1532 kgena_ua » 17.12.2016, 22:38

MC Web, вечер добрый.
От предыдущей версии не отличается в основном. Мелкие изменения, которые обсуждались после предыдущей версии. Основные изменения по пункту Load album image в связи с пожеланиями.
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 53
Откуда: Украина, Днепр
Репутация: 325
С нами: 4 года 2 месяца

Сообщение #1533 seriousstas » 19.12.2016, 15:56

потом объявил классовую борьбу Scrollbar
С праздником ВСЕХ!
Пользуюсь вариантом с бегущей строкой от kgena_ua ,
наверное не я один.
Проблема с выходом ПК из режима сна . При долгом простое -
строку начинает "колбасить" - это излечимо ?
Я понимаю , что таймер пытается "догнать упущенное" , но может есть "таблетка" ?
Пока решаю так
принимаю, скажем NUMPAD3
Код: Выделить всё
function on_key_down(vkey) {
if  (vkey == 0x63) {
window.Reload();}
}
Отправляю в сикбар через Autoit при выходе из сна :
Код: Выделить всё
ControlSend("[CLASS:{E7076D1C-A7BF-4f39-B771-BCBE88F2A2A8}]", "", "uie_wsh_panel_mod_class14", "{NUMPAD3}")
seriousstas
Мастер
Откуда: Украина , Ивано-Франковск
Репутация: 64
С нами: 2 года 4 месяца

Сообщение #1534 kgena_ua » 20.12.2016, 23:39

seriousstas писал(а):Проблема с выходом ПК из режима сна
Может иду не в верном направлении, может есть возможность получить информацию из системы о выходе из сна, используя, ну например, объекты Shell, или не знаю чего там. Надо искать.

seriousstas писал(а):ControlSend("[CLASS:{E7076D1C-A7BF-4f39-B771-BCBE88F2A2A8}]", "", "uie_wsh_panel_mod_class14", "{NUMPAD3}")
seriousstas, а где почитать про этого зверя.
Какие бываю классы, что такое в "uie_wsh_panel_mod_class14 class14, какие бывают.

В работе.
Решил заняться анимацией кнопок.
phpBB [media]
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 53
Откуда: Украина, Днепр
Репутация: 325
С нами: 4 года 2 месяца

Сообщение #1535 AHAPXICT » 22.12.2016, 01:51

seriousstas, понял. У меня компьютер не спит на работе, причём уже много лет, если попытается, то по вырываю все микросхемы - плоскогубцами.
seriousstas писал(а):таймер пытается "догнать упущенное"
Не знал что есть такая проблема, так бывает если компьютер в этот момент перегружен(не важно чем), то она стартует с места как драгстер на полигоне.
kgena_ua, вы случайно не делали новую версию "Get Covers (Artwork)" с поддержкой "Radio Logo"? К чему спрашиваю. Решил добавить альтернативную "Cover Panel", так что бы можно было переключать по одному клику. Ну и ваша Get Covers (Artwork) вне конкуренции, для просмотра всех (именно всех доступных) картинок лучше не найти. Вот и думаю спрошу у вас, может есть такой вариант, ну а если нет, то и в оригинале тоже хорошо будет!
После детального изучения основных команд в PSS, делаю то что уже около года было оставлено в скриптах на потом, но вот время пришло и модернизация продолжается :smoke:
Для скриншота сделал кнопки подсвеченными, а будут не видимыми и появляться только после наведения курсора мыши.
Change Panel.png

P.S. Уже нафаршировал свою модификацию скрытыми кнопками и двойного назначения. Пока очень доволен - и глаз не режет и всё под рукой)))
AHAPXICT M
Мастер
Аватара
Возраст: 46
Откуда: Киев
Репутация: 101
С нами: 3 года 7 месяцев

Сообщение #1536 seriousstas » 22.12.2016, 20:14

kgena_ua
Это Autoit - товский скрипт (сам в дебри не влезал про классы окон ..)
внизу есть функция , назвал её Func _restfoob() ,( тут по ссылке - длиный срипт для слежения за сном с разными задачами)
http://pccar.ru/showthread.php?t=23331
Вызываю её при выходе из сна вот так : _Func _restfoob()
и скрипт отправляет в Фубар, что внутри.

ControlSend("[CLASS:{E7076D1C-A7BF-4f39-B771-BCBE88F2A2A8}]", "", "MegaPanelSplitterWindowContainer1", "{NUMPAD3}")
Тут все просто :
Когда скачаете https://www.autoitscript.com/site/autoit/
После установки появится инструмент Au3Info
"C:\Program Files (x86)\AutoIt3\Au3Info_x64.exe"
Там есть прицел - перетяните на окно и он все выдаст про него .
Это общий класс плеера :
[CLASS:{E7076D1C-A7BF-4f39-B771-BCBE88F2A2A8}]
а это MegaPanelSplitterWindowContainer1
именно окно Вашего сикбара в моем плеере ClassNN.
Меняются только цифры .
далее отправка NUMPAD3
Про функцию
https://autohotkey.com/docs/commands/ControlSend.htm

ну например, объекты Shell, или не знаю чего там
Тут по тому где Виндовс ставит метки , на АНК правда :
http://forum.script-coding.com/viewtopic.php?pid=107477#p107477
Может в журнал смотреть ?

Это было супер - на кар форуме многие переходят на сон - попернул ключ и
слушаем музыку, как с магнитолой
Не знаю только выдержит-ли "бедный плеер" ))
А пока - либо скриптом перезапускать отдельные скрипты)) ,
либо просто перезапустить плеер при выходе и (более получасового) сна ..

Добавлено спустя 2 минуты 48 секунд:
AHAPXICT
Тоже понял - да сам ранне не сталкивался . пока не стал КарПК-маном -
это кстати плохоизлечимый недуг :)
seriousstas
Мастер
Откуда: Украина , Ивано-Франковск
Репутация: 64
С нами: 2 года 4 месяца

Сообщение #1537 kgena_ua » 23.12.2016, 13:07

seriousstas, спасибо. Будем разбираться.
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 53
Откуда: Украина, Днепр
Репутация: 325
С нами: 4 года 2 месяца

Сообщение #1538 kgena_ua » 23.12.2016, 22:09

AHAPXICT писал(а):"Get Covers (Artwork)" с поддержкой "Radio Logo"
AHAPXICT, приветствую.
Теоретически можно, только я пока не созрел :smile: т.к. не хочется объединять разные панели по функционалу в одну.
Проще (лучше) сделать автоматическое переключение с одной панели на другую, с MC Web мы что-то делали подобное, только для чего-то другого.
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 53
Откуда: Украина, Днепр
Репутация: 325
С нами: 4 года 2 месяца

Сообщение #1539 Cerberus » 23.12.2016, 22:24

kgena_ua, Добрый вечер! заметил в скрипте Get Covers (Artwork) когда только запускаешь фубар или когда нажимаешь кнопку Reload размытое изображение обложки. Но если выбрать в плейлисте другой альбом или нажать на кнопку info, mode то резкость приходит в норму. можно ли как то исправить это?
Cerberus
Бывалый
Репутация: 9
С нами: 8 месяцев 2 дня

Сообщение #1540 MC Web » 23.12.2016, 22:34

kgena_ua, привет.
kgena_ua писал(а):Решил заняться анимацией кнопок.
Вот если бы научить foobar2000 понимать анимированные GIF, тогда легче и быстрее это можно было сделать, а также "оживить" обложки / лого и прочее.

Добавлено спустя 3 минуты 10 секунд:
kgena_ua писал(а):Проще (лучше) сделать автоматическое переключение с одной панели на другую, с MC Web мы что-то делали подобное, только для чего-то другого.
Переключение панелей обложек и видео YouTube.
MC Web
Мастер
Репутация: 65
С нами: 3 года 10 месяцев

Пред.След.

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