Guest User

Userscript для exhentai.org

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