Guest User

Userscript для exhentai.org

a guest
Dec 2nd, 2016
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name        SadPandaScript
  3. // @namespace   Rozenfag
  4. // @include     https://exhentai.org/*
  5. // @match       https://exhentai.org/*
  6. // @version     6
  7. // @author      Aleksandr Petrov
  8. // @run-at      document-end
  9. // @grant       none
  10. // ==/UserScript==
  11.  
  12. /*
  13.     Здравствуй мой дорогой любитель фапа =3
  14.     Для тебя (ну и конечно же для себя любимого), я накатал небольшой скрипт расширяющий функционал любимой грустнопанды.
  15.     Для его запуска тебе понадобится современный браузер и расширение для выполнения UserScript-ов.
  16.     Для Firefox это будет "Greasemonkey", для Opera  нужно "Tampermonkey" или "Violent monkey", а для Chrome ищи "Trampermonkey".
  17.  
  18.     После установки нужного расширения, добавь в него этот скрипт и ты получишь следующие вкусности:
  19.     1) Возможность листать по пробелу. Очень удобно, особенно когда руки заняты, просто жмакнуть по большой конпке, а не целиться)))
  20.     2) Предзагрузка изображений, что позволяет избежать "морганий" при перелистывании контента. Незаменимая вещь на игровом арте, где зачастую фон не меняется, а меняются "эмоции" и появляются детали, вроде брызг спермы.
  21.     3) Слайдшоу режим, для полноценного освобождения рук)))))))))))))) Таймаут в секундах можете установить свой в переменной TIMEOUT_SEC_SLIDE_SHOW чуть ниже.
  22.     4) Автоматическое масштабирование изображения с помощью трех режимов: уменьшение до пределов окна, уменьшение или увеличение до пределов окна, и исходный размер.
  23.     5) Минимализм)) Только картинка и ты. Управление все через клавиши, т.к. как по мне это самое удобное. Кстати, очень круто в полноэкранном режиме браузера фапать))
  24.     6) Перевод на русский язык множества тегов, да еще и в виде крутой таблицы) Просто зайди на https://exhentai.org/ и нажми на "Показать список тегов" под поисковой формой. Очень удобно на лету выделить нужные фетиши, и сразу получить результат. А еще часть тегов автоматом переводится в галерее.
  25.  
  26.     [УПРАВЛЕНИЕ]
  27.     ПРОБЕЛ или СТРЕЛОЧКА ВПРАВО: Следующая картинка.
  28.     СТРЕРОЧКА ВЛЕВО: Предыдущая картинка.
  29.     СТРЕЛОЧКА ВВЕРХ: Вернуться в галерею.
  30.     СТРЕЛОЧКА ВНИЗ, F5: Обновить страницу, для получения настоящего URL, а не первого, т.н. "входного".
  31.     TAB: Запуск и остановка слайдшоу.
  32.     КЛИК ПО КАРТИНКЕ: Изменение режима масштабирования. Текущий можно посмотреть в значке вкладки.
  33. */
  34.  
  35. var TIMEOUT_SEC_SLIDE_SHOW = 9; //По умолчанию картинка сменяется раз в 9 секунд.
  36.  
  37. //  'tag_name'      [Категория тега - catTag, [Фетиши - fetCat], 'Перевод',   'Описание'],
  38. var tag = {
  39.     'russian':              [3, [0],    'Русский',               'Перевод на русский язык.'],
  40.     'english':              [3, [0],    'Английский',         'Перевод на английский язык.'],
  41.     'translated':           [3, [0],    'Перевод',               'Любой перевод с языка оригинала.'],
  42.     'age_progression':      [2, [2,4],  'Увеличение возраста',    'Человек быстро становится старше.'],
  43.     'age_regression':       [2, [2,4],  'Уменьшение возраста',    'Человек быстро становится моложе.'],
  44.     'dilf':                 [1, [2],    'Взрослый мужчина',      'Мужик в возрасте 30-50 лет.'],
  45.     'infantilism':          [2, [2],    'Инфантилизм',           'Сексуальные действия, связанные с взрослым партнером, как если бы они были младенцем. Например, смена подгузника взрослому человеку..'],
  46.     'lolicon':              [0, [2],    'Лоликон',               'Несовершеннолетние девушки с неразвитым телом в эротических ситуациях. Не следует путать с подростками или молодыми девушками.'],
  47.     'low_lolicon':          [0, [2],    'Мягкий лоликон',      'Лоликон, не вписавшийся в правила ресурса.'],
  48.     'low_shotacon':         [1, [2],    'Мягкий шотакон',      'Шотакон, не вписавшийся в правила ресурса.'],
  49.     'milf':                 [0, [2],    'Милфа',               'Женщина в возрасте 30-50 лет.'],
  50.     'old_lady':             [0, [2],    'Старуха',               'Пожилая женщина за 50.'],
  51.     'old_man':              [1, [2],    'Старик',             'Пожилой мужчина за 50.'],
  52.     'shotacon':             [1, [2],    'Шотакон',               'Несовершеннолетние мальчики с неразвитым телом в эротических ситуациях. Не следует путать с подростками или молодыми парнями.'],
  53.     'toddlercon':           [2, [2],    'Дети',                 'Эротические сцены с детьми.'],
  54.     'amputee':              [2, [3],    'Ампутации',           'У человека отсутствует одна или несколько конечностей. Может присутствовать гуро.'],
  55.     'body modification':    [2, [3],    'Бодмод',             'Измененные части тела.'],
  56.     'conjoined':            [0, [3],    'Сиамские близнецы',    'Две или более голов, из одного тела.'],
  57.     'doll_joints':          [2, [3],    'Кукольные суставы',    'Шарнирные или похожие на них искуственные суставы.'],
  58.     'gijinka':              [2, [3],    'Очеловечивание',     'Персонаж, не являющийся человеком, превращается или становится похож на него.'],
  59.     'inflation':            [2, [3],    'Раздутие',             'Область живота неестественно выпуклая, словно надутый воздушный шарик. Часто, из-за заполнения газами/щупальцами/яйцами/жидкостями/существами и т.д.'],
  60.     'invisible':            [2, [3],    'Невидимость',           'Совершение сексуальных действий, будучи невидимым.'],
  61.     'multiple_arms':        [2, [3],    'Многорукость',         'Рук больше, чем две.'],
  62.     'multiple_breasts':     [0, [3],    'Многогрудость',       'Грудей больше, чем две.'],
  63.     'multiple_nipples':     [2, [3],    'Многососковость',       'Сосков больше чем обычно.'],
  64.     'multiple_penises':     [2, [3],    'Мультипенисы',         'Обладание более чем одним пенисом.'],
  65.     'multiple_vaginas':     [2, [3],    'Мультивагины',         'Обладание более чем одной вагиной.'],
  66.     'muscle':               [2, [3],    'Мышцы',               'Мускулистое телосложение.'],
  67.     'muscle_growth':        [2, [3,4],  'Мышечный рост',        'Мышцы увеличиваются в размерах или появляются там, где их небыло.'],
  68.     'pregnant':             [2, [3],    'Беременность',         'Сексуальные действия с беременным человеком.'],
  69.     'stretching':           [2, [3],    'Растяжение',         'Растяжение частей тела за пределами человеческих возможностей.'],
  70.     'tailjob':              [2, [3],    'Хвост',               'Использование хвоста, чтобы стимулировать половые органы.'],
  71.     'wings':                [2, [3],    'Крылья',             'На теле присутствуют крылья.'],
  72.     'absorption':           [2, [4],    'Поглощение',         ''],
  73.     'ass_expansion':        [0, [4],    'Увеличение попы',        'Ягодицы увеличиваются по какой-нибудь причине.'],
  74.     'balls_expansion':      [1, [4],    'Увеличение яиц',      'Тестикулы увеличиваются по какой-нибудь причине.'],
  75.     'body_swap':            [2, [4],    'Обмен телами',          'Обмен телом с другим человеком.']
  76. };
  77.  
  78. //Категория тега (зависимости)
  79. var catTag = [
  80.     ['female', 'женское:'],      // 0
  81.     ['male', 'мужское:'],        // 1
  82.     ['female/male'],            // 2
  83.     ['language', 'язык:'],      // 3
  84.     ['misc', 'разное:']           // 4
  85. ];
  86.  
  87. //Список фетишей
  88. var fetCat = [
  89.     'язык:',        // 0
  90.     'разное:',        // 1
  91.     'возраст:',      // 2
  92.     'тело:',        // 3
  93.     'изменения:'   // 4
  94. ];
  95.  
  96.  
  97.  
  98. window.addEventListener('load', function(){
  99.     var regexpMain    = /^https:\/\/exhentai\.org\/?[^\.\/]*$/;         //Главная
  100.     var regexpGallery = /^https:\/\/exhentai\.org\/g\/\d+\/[\d\w]+\/.*$/;   //Галерея
  101.     var regexpImage   = /^https:\/\/exhentai\.org\/s\/[\d\w]+\/[\d\-]+$/;   //Изображение
  102.     var genderColor   = "url('data:image/gif;base64,R0lGODlhLAEUAKECAEZOjLNCj////////yH5BAEKAAIALAAAAAAsARQAAAKahI+py+0Po5xUhouz3rz7D4biSJZjhabqyraOCcfyTNefi+f6rtr+DwzKeMSicSdMKpfBo/MJhTCn1Goois1CrdxuVQsO67zkMlCMTqPM7DZMDY833PS6R47P2/f8vB/OF0j3RygmeGhWqJiF2Ni1CPnkOEkVaVlEmal0yTmm+fnTKdoCWlozippiuhqT6jrBGkvySvsgewtSAAA7')";
  103. //-----------------------------------------------------------------------------------------------------
  104.     if(regexpMain.test(document.location.toString())){ //         [Создание таблицы тегов на главной]
  105. //-----------------------------------------------------------------------------------------------------
  106.         var show = false; var fetID=[];
  107.         var space = document.createTextNode(' \u00A0\u00A0');
  108.         var tagDivCont = document.createElement('div');
  109.         var showHideTag = document.createElement('a');
  110.         var advdiv=document.getElementById('advdiv');
  111.         var inpSearch = document.getElementsByName('f_search')[0];
  112.  
  113.         Element.prototype.addCategory = function(text) {
  114.             var tr = document.createElement('tr');
  115.             var td1= document.createElement('td');
  116.             var td2 = document.createElement('td');
  117.             td1.className = 'tc';
  118.             td1.innerHTML = text;
  119.             tr.appendChild(td1);
  120.             tr.appendChild(td2);
  121.             this.appendChild(tr);
  122.             return td2;
  123.         };
  124.  
  125.         Element.prototype.addTag = function(tagname) {
  126.             var div = document.createElement('div');
  127.             var a = document.createElement('a');
  128.             var tagid = tag[tagname];
  129.             div.className = 'gt';
  130.             a.innerHTML = tagid[2];
  131.             a.href = '#';
  132.             a.title = tagid[3];
  133.             a.clr = -1;
  134.             for(var z=0; z<tagid[1].length; z++){
  135.                 if(document.getElementById(tagname+z) === null){
  136.                     a.id = tagname+z;
  137.                     break;
  138.                 }
  139.             }
  140.             div.appendChild(a);
  141.             this.appendChild(div);
  142.         };
  143.        
  144.         function changeTagForm(tgn, del){
  145.             if(del === true){
  146.                 var pos = inpSearch.value.indexOf(tgn);
  147.                 if(pos >= 0) inpSearch.value = inpSearch.value.replace((pos===0?'':' ') + tgn + (pos===0?(inpSearch.value.length==tgn.length?'':' '):''), '');
  148.             }else{
  149.                 inpSearch.value += (inpSearch.value.length>0?' ':'') + tgn;
  150.             }
  151.         };
  152.  
  153.         function changeTag(tgn, modF){
  154.             var ptag = tgn.split(':');
  155.             if ((ptag.length>0)&&(typeof tag[ptag[1]] !== 'undefined')) {
  156.                 var rTag = ptag[1];
  157.                 var pos = inpSearch.value.indexOf(tgn);
  158.                 var clr, currClr = document.getElementById(rTag+'0').clr;
  159.                 if(modF === true){
  160.                     if(tag[rTag][0] == 2){
  161.                         clr = (currClr<0?0:(currClr<1?1:(currClr<2?2:-1)));
  162.                     }else{
  163.                         clr = (currClr<0?tag[rTag][0]:-1);
  164.                     }
  165.                     switch(clr){
  166.                         case -1:
  167.                             if(tag[rTag][0] == 2){
  168.                                 changeTagForm('female:'+rTag,true);
  169.                                 changeTagForm('male:'+rTag,true);
  170.                             }else{
  171.                                 changeTagForm(tgn,true);
  172.                             }
  173.                             break;
  174.                         case 0:
  175.                             if(inpSearch.value.indexOf('female:'+rTag) < 0) changeTagForm('female:'+rTag,false);
  176.                             changeTagForm('male:'+rTag,true);
  177.                             break;
  178.                         case 1:
  179.                             changeTagForm('female:'+rTag,true);
  180.                             if(inpSearch.value.indexOf('male:'+rTag) < 0)    changeTagForm('male:'+rTag,false);
  181.                             break;
  182.                         case 2:
  183.                             if(inpSearch.value.indexOf('female:'+rTag) < 0) changeTagForm('female:'+rTag,false);
  184.                             if(inpSearch.value.indexOf('male:'+rTag) < 0)   changeTagForm('male:'+rTag,false);
  185.                             break;
  186.                         default:
  187.                             changeTagForm(tgn,false);
  188.                             break;
  189.                     }
  190.                 }else{
  191.                     if(tag[rTag][0] == 2){
  192.                         clr = (currClr<0?(ptag[0]=='male'?1:0):(currClr<1?(ptag[0]=='male'?2:0):(ptag[0]=='male'?1:2)));
  193.                     }else{
  194.                         clr = tag[rTag][0];
  195.                     }
  196.                 }
  197.                 for(var zz=0, tg; zz<tag[rTag][1].length; zz++){
  198.                     tg = document.getElementById(rTag+zz);
  199.                     switch(clr){
  200.                         case -1:
  201.                             tg.parentNode.style.backgroundColor = '';
  202.                             tg.parentNode.style.backgroundImage = '';
  203.                             break;
  204.                         case 0:
  205.                             tg.parentNode.style.backgroundImage = genderColor;
  206.                             tg.parentNode.style.backgroundPosition = 'right';
  207.                             break;
  208.                         case 1:
  209.                             tg.parentNode.style.backgroundImage = genderColor;
  210.                             tg.parentNode.style.backgroundPosition = 'left';
  211.                             break;
  212.                         case 2:
  213.                             tg.parentNode.style.backgroundImage = genderColor;
  214.                             tg.parentNode.style.backgroundPosition = 'center';
  215.                             break;
  216.                         default:
  217.                             tg.parentNode.style.backgroundColor = 'grey';
  218.                             break;
  219.                     }
  220.                     tg.clr = clr;
  221.                 }
  222.             }
  223.         }
  224.  
  225.         showHideTag.innerHTML = 'Показать список тегов';
  226.         showHideTag.href = '#';
  227.         advdiv.previousSibling.appendChild(space);
  228.         advdiv.previousSibling.appendChild(showHideTag);
  229.         showHideTag.addEventListener ('click', function(){
  230.             if(show === true){
  231.                 showHideTag.innerHTML = 'Показать список тегов';
  232.                 tagDivCont.style.display='none';
  233.             }else{
  234.                 showHideTag.innerHTML = 'Скрыть список тегов';
  235.                 tagDivCont.style.display="";
  236.             }
  237.             show = !show;
  238.         }, false);
  239.  
  240.         var toppane=document.getElementById('toppane');
  241.         tagDivCont.className = 'idi';
  242.         tagDivCont.style.display='none';
  243.         toppane.appendChild(tagDivCont);
  244.  
  245.         var tagDiv = document.createElement('div');
  246.         var tagTable = document.createElement('table');
  247.         var tagTbody = document.createElement('tbody');
  248.         tagDiv.id = 'taglist';
  249.         tagDiv.style.height = 'auto';
  250.         tagDivCont.appendChild(tagDiv);
  251.         tagDiv.appendChild(tagTable);
  252.         tagTable.appendChild(tagTbody);
  253.  
  254.         for(var f=0; f<fetCat.length; f++){
  255.             fetID[f] = tagTbody.addCategory(fetCat[f]);
  256.         }
  257.         for (var key in tag) {
  258.             for(var t=0; t<tag[key][1].length; t++)
  259.                 fetID[tag[key][1][t]].addTag(key);
  260.         }
  261.  
  262.         if(inpSearch.value.length>0){
  263.             var tags = inpSearch.value.split(' ');
  264.             tags.forEach(function(item) {
  265.                 if(item.indexOf(':')>0) changeTag(item, false);
  266.             });
  267.             showHideTag.click();
  268.         }
  269.  
  270.         tagTable.addEventListener ('click', function(e){
  271.             if(e.target.tagName == 'A'){
  272.                 var zn=e.target.id.toString().substring(0,e.target.id.toString().length-1);
  273.                 zn = (tag[zn][0]!=2?catTag[tag[zn][0]][0]:'kostil') + ':' + zn;
  274.                 changeTag(zn, true);
  275.             }
  276.         }, false);
  277. //-----------------------------------------------------------------------------------------------------
  278.     }else if(regexpGallery.test(document.location.toString())){ //            [Перевод тегов в галерее]
  279. //-----------------------------------------------------------------------------------------------------
  280.         var taglist = document.getElementById('taglist').getElementsByTagName('tr');
  281.         if(taglist.length>0){
  282.             for(var i=0; i<taglist.length; i++){
  283.                 var trTag = taglist[i].firstChild.innerHTML.substring(0,taglist[i].firstChild.innerHTML.length-1);
  284.                 for(var j=0; j<catTag.length; j++) {
  285.                     if(catTag[j][0] == trTag){
  286.                         var aList = taglist[i].lastChild.getElementsByTagName('a');
  287.                         for(var k=0; k<aList.length; k++){
  288.                             var atag = aList[k].id.toString().substr(4+trTag.length);
  289.                             if(typeof tag[atag] !== 'undefined'){
  290.                                 aList[k].innerHTML = tag[atag][2];
  291.                                 aList[k].title = tag[atag][3];
  292.                             }
  293.                         }
  294.                         taglist[i].firstChild.innerHTML = catTag[j][1];
  295.                         break;
  296.                     }
  297.                 }
  298.             }
  299.         }
  300. //--------------------------------------------------------------------------------------------------------
  301.     }else if(regexpImage.test(document.location.toString())){ // [Прокачка режима просмотра изображений]
  302. //--------------------------------------------------------------------------------------------------------
  303.         //Всякие переменные и картинки в base64 формате.
  304.         var gallURL = document.getElementById('i5').getElementsByTagName('a')[0].href;
  305.         var currURL, nextURL, prevURL;
  306.         var block = false, blockIMG = false;
  307.         var timer;
  308.         var timeoutURL, timeoutIMG;
  309.         var ScaleMode = 1;
  310.         var slideShow = false;
  311.         var loadIMG, showIMG;
  312.         var loadImgW, loadImgH, showImgW, showImgH;
  313.         var timeout_LoadIMG = 14000; //Таймаут в мс, на загрузку изображения.
  314.         var favicons = [
  315.             'data:image/gif;base64,R0lGODlhEAAQAMIGAGYGEYCAgJmZmbOzs8zMzOXl5f///////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgAHACwAAAAAEAAQAAADNAi63HowSvmmhfXOrCPvx9eJGnk9jhMCYVEQxDAIQhCwqAvLtI3jutisdlutUgsjyINEJgAAIfkEBQoABwAsAwAKAAoAAwAAAw1IVKUzQijmoFyNvJgAACH5BAUKAAcALAMACgAKAAMAAAMLOENUxUoxB+N8RCUAIfkEBQoABwAsAwAKAAoAAwAAAw0oMkNUxSnmoFztRZIAACH5BAUKAAcALAMACgAKAAMAAAMNGCEyQ6QUxRyUtL1YEgAh+QQFCgAHACwDAAoACgADAAADDSgSoTOEKOagXE28mAAAIfkEBQoABwAsAwAKAAoAAwAAAws4IxLBSjEH43xCJQAh+QQBCgAHACwDAAoACgADAAADDUg0IxLBKeagXO1FkQAAOw==',
  316.             'data:image/gif;base64,R0lGODlhEAAQAIABAGYGEf///yH5BAEKAAEALAAAAAAQABAAAAIohI9pwe2+nmRxvmobzmFnb4FThFCHCQGoplKd23bt7L6yHd4cq/RGAQA7',
  317.             'data:image/gif;base64,R0lGODlhEAAQAIABAGYGEf///yH5BAEKAAEALAAAAAAQABAAAAIthI9pwe2+EDwhgtds3e96z1xZWIkjl5lYp65pR06cKn5be5f6qkmp5mIphoYCADs=',
  318.             'data:image/gif;base64,R0lGODlhEAAQAIABAGYGEf///yH5BAEKAAEALAAAAAAQABAAAAIghI9pwe2+nmRxvmobzmFnb4GTKJEXwEFoSq2sqSqyUQAAOw=='
  319.         ];
  320.         //Удаляем все ненужное со страницы
  321.         window.onpopstate = null;
  322.         window.onresize = null;
  323.         window.onload = null;
  324.         document.onkeydown = null;
  325.         document.body.innerHTML = "";
  326.         document.body.style.textAlign = 'center';
  327.         document.body.style.padding = '0px';
  328.  
  329.         //Создаем два пустых изображения. Первое сделаем скрытым от глаз, и будем в него грузить нужную картинку, а после загрузки, без всяких морганий,перекинем во второе, которое видимо. Кароче, в одном все грузится, во втором показывается.
  330.         loadIMG = document.createElement("img");
  331.         showIMG = document.createElement("img");
  332.         document.body.appendChild(loadIMG);
  333.         document.body.appendChild(showIMG);
  334.         loadIMG.style.width = '0px';
  335.         loadIMG.style.height = '0px';
  336.         showIMG.style.cursor = 'pointer';
  337.  
  338.         //Функция, для изменения значка во вкладке, чтоб было видно загрузку изображения и текущий режим масштабирования.
  339.         function changeFavicon(mode){
  340.             var head = document.head || document.getElementsByTagName('head')[0];
  341.             var link = document.createElement('link');
  342.             link.id = 'dynamic-favicon';
  343.             link.rel = 'shortcut icon';
  344.             link.href = favicons[(mode<0?ScaleMode:mode)];
  345.             var oldLink = document.getElementById('dynamic-favicon');
  346.             if(oldLink) head.removeChild(oldLink);
  347.             head.appendChild(link);
  348.         }
  349.  
  350.         //Обрабатываем событие окончания загрузки нашей картинки в скрытом от глаз изображении.
  351.         loadIMG.addEventListener ('load', function(){
  352.             blockIMG = true;
  353.             clearTimeout(timeoutIMG); //Удаляем таймаут на загрузку пикчи, а то вылезет попап, что мы якобы еще её грузим.
  354.             showImgW = loadImgW;
  355.             showImgH = loadImgH;
  356.             ScaleImage();
  357.             showIMG.src = loadIMG.src;
  358.             changeFavicon(-1);
  359.             block = false;
  360.             blockIMG = false;
  361.             window.scrollTo(0,0);
  362.         }, false);
  363.  
  364.         //Функция для изменения размеров картинки в зависимости от режима маштабирования.
  365.         function ScaleImage(){
  366.             var ratio = Math.min((window.innerWidth-2) / showImgW, (window.innerHeight-2) / showImgH);
  367.             if( ((ScaleMode == 1) && (ratio >= 1)) || (ScaleMode == 3) ) ratio = 1;
  368.             showIMG.style.width = parseInt(showImgW*ratio)+'px';
  369.             showIMG.style.height = parseInt(showImgH*ratio)+'px';
  370.         }
  371.  
  372.         //Обрабатываем клик по изображению. Это меняет режим масштабирования.
  373.         showIMG.addEventListener ('click', function(){
  374.             ScaleMode = (ScaleMode==3?1:ScaleMode+1);
  375.             if(blockIMG === false) ScaleImage();
  376.             if(block === false) changeFavicon(ScaleMode);
  377.         }, false);
  378.  
  379.         //Эта функция грузит нужную страницу в галерее и получает все данные о изображении на ней.
  380.         function getImage(url){
  381.             if(block === false){ //Если заблочено, значит что-то грузится и делать ничо не будем)
  382.                 if(url === currURL){ //На случай окончания картинок в галерее. Просто выходим в ее корень, с превьюхами.
  383.                     slideShow=false;
  384.                     document.location = gallURL;
  385.                 }else{ //Все ОК можно грузить страницу.
  386.                     block = true; //Блочим функцию на период ее асинхронного выполнения.
  387.                     changeFavicon(0); //Анимируем значок во вкладке.
  388.                     var xmlhttp = new XMLHttpRequest();
  389.                     xmlhttp.open('GET', url, true); //Формируем запрос на грустнопанду.
  390.  
  391.                     //Обрабатываем событие прихода ответа.
  392.                     xmlhttp.onreadystatechange=function(){
  393.                         if(xmlhttp.readyState != 4) return;
  394.  
  395.                         clearTimeout(timeoutURL); //Ответ пришел, можно удалять таймаут на него.
  396.  
  397.                         if(xmlhttp.status == 200){ //Ответ пришел какой мы и ждали)
  398.                             //Тут мы долго и скучно вытаскиваем из пришедшего html кода адреса для навигации, размер картинки и т.д.
  399.                             var tempDOM = new DOMParser().parseFromString(xmlhttp.responseText, "text/xml");
  400.                             nextURL=tempDOM.getElementById("next").href;
  401.                             prevURL=tempDOM.getElementById("prev").href;
  402.                             currURL=url;
  403.  
  404.                             var imageSize = tempDOM.getElementById("i2").childNodes[1].innerHTML.split(' :: ')[1].split(' x ');
  405.                             loadImgW = imageSize[0];
  406.                             loadImgH = imageSize[1];
  407.  
  408.                             //Начинаем грузить картинку в скрытое изображение по полученному адресу из ответа.
  409.                             loadIMG.src = tempDOM.getElementById("img").src;
  410.  
  411.                             //Таймаут на загрузку картинки, т.к. грустнопанда не отличается идеальной стабильностью.
  412.                             timeoutIMG = setTimeout( function(){
  413.                                 alert('ОШИБКА: Загрузка изображения длилась более '+parseInt(timeout_LoadIMG/2000)+' сек. и была прервана.');
  414.                                 changeFavicon(-1);
  415.                                 block = false;
  416.                             }, 100+parseInt(timeout_LoadIMG/2));
  417.                         } else {//Все ужасно(((
  418.                             alert('ОШИБКА: При загрузке exhentai.org возникли неполадки. Подробнее: ' + xmlhttp.statusText);
  419.                         }
  420.                     };
  421.  
  422.                     xmlhttp.send(null); //Отправляем запрос на грутснопанду.
  423.  
  424.                     //Таймаут запроса, на случай подвисшего инета, глюков на грустнопанде и прочих сетевых неврозах.
  425.                     timeoutURL = setTimeout( function(){
  426.                         xmlhttp.abort();
  427.                         alert('ОШИБКА: Загрузка exhentai.org длилась более '+parseInt(timeout_LoadIMG/2000)+' сек. и была прервана.');
  428.                         changeFavicon(-1);
  429.                         block = false;
  430.                     }, 100+parseInt(timeout_LoadIMG/2));
  431.                 }
  432.             }
  433.         }
  434.         //Обрабатываем нажатие клавиш.
  435.         document.body.addEventListener ('keydown', function(event){
  436.             switch(event.keyCode){
  437.                 case 9://TAB
  438.                     slideShow = (slideShow===false?true:false);
  439.                     if(slideShow===true){
  440.                         alert('СЛАЙДШОУ: Запущена смена изображений раз в '+TIMEOUT_SEC_SLIDE_SHOW+' сек.');
  441.                         timer = setInterval(function(){
  442.                             if(slideShow===false){
  443.                                 clearInterval(timer);
  444.                             }else{
  445.                                 getImage(nextURL);
  446.                             }
  447.                         }, TIMEOUT_SEC_SLIDE_SHOW*1000);
  448.                     }else{
  449.                         alert('СЛАЙДШОУ: Остановлено.');
  450.                     }
  451.                     break;
  452.                 case 32://ПРОБЕЛ
  453.                 case 39://СТРЕЛОЧКА ВПРАВО
  454.                     getImage(nextURL); //Следущее изображение.
  455.                     break;
  456.                 case 37://СТРЕЛОЧКА ВЛЕВО
  457.                     getImage(prevURL); //Предыдущее изображение.
  458.                     break;
  459.                 case 38://СТРЕЛОЧКА ВВЕРХ
  460.                     document.location = gallURL; //Возвращение в галерею с превьюшками.
  461.                     break;
  462.                 case 40://СТРЕЛОЧКА ВНИЗ
  463.                 case 116://F5
  464.                     event.preventDefault();
  465.                     document.location = currURL; //Рефрешнуть страницу. Полезно для получения правильной ссылки на страницу в адресной строке.
  466.                     break;
  467.             }
  468.         }, false);
  469.         getImage(document.URL); //Загружаем картинку начальной страницы, ведь мы удалили все в теге <body> очистив от всего лишнего.
  470.     }
  471. }, false);
Add Comment
Please, Sign In to add comment