mx pak1!Vmbackground.htmlwI css\options.css5%֚def.json+QF defaults.jsn.u'xZ icon-18.png_0s icon.pngD4r&"icons\icon_16.pngVN#Jicons\icon_32.pngPR'Uicons\icon_48.pngwY- ^includes\app.jsb ڃ includes\opener.jsmSkzincludes\viewer.js}50 js\app_bg.jsPwpjs\background.jsgc js\frames.jsYnLJM js\options.jsZ,G#locale\cs-cz.iniÕlocale\el-gr.inid d| locale\en.iniE -ϖlocale\es-mx.ini5 Nlocale\fi-fi.ini:vlocale\fr-ca.inidlYMlocale\hu-hu.iniz 2=locale\nl-nl.ini>=plocale\pl-pl.ini3Vlocale\pt-br.iniKlocale\ru-ru.iniOQZlocale\tr-tr.iniS  locale\uk-ua.ini+ )locale\zh-cn.inifx4locale\zh-tw.iniv#!g locales.jsn&ƿ options.htmlf. :: Viewhance :: bgProcess ::-moz-selection { background: #adf; } ::selection { background: #adf; } html { cursor: default; min-height: 100%; background-color: #f3f3f5; } body { display: none; font: 13px "Lucida Grande", "Lucida Sans Unicode", "Tahoma", sans-serif; position: relative; background-color: #fff; max-width: 700px; min-height: 300px; margin: 0 auto; padding: 6px 15px 15px; border-top: 0; box-shadow: 0 0 6px #000; -webkit-box-shadow: 0 0 6px #000; } a { color: #1155ef; text-decoration: none; } a:hover { color: #000; } :focus { outline: none; } .fn { float: none; } .cur_zmin { cursor: -webkit-zoom-in; cursor: -moz-zoom-in; cursor: zoom-in; } /* http://nicolasgallagher.com/micro-clearfix-hack/ */ .cf:before, .cf:after { content: ""; display: table; } .cf:after { clear: both; } #app_version { display: block; padding-bottom: 5px; } hr { border: 1px solid #eee; margin: 10px 0; } #right_panel { position: absolute; left: 100%; top: 0; } #right_panel > aside { padding: 0 5px 3px 8px; position: fixed; top: 0; background-color: rgba(255, 255, 255, .8); text-align: center; box-shadow: 2px 2px 2px #aaa; -webkit-box-shadow: 2px 2px 2px #aaa; overflow: hidden; } #right_panel > aside, section { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .hidden, body.opera .opera, body.firefox .firefox, body.chrome .chrome, body.safari .safari, body.maxthon .maxthon { display: none; } .logo { display: block; margin-top: 5px; width: 128px; height: 128px; background: url(../icon.png) no-repeat center; -webkit-transition: -webkit-box-shadow .2s; -moz-transition: box-shadow .2s; transition: box-shadow .2s; border-radius: 10px; } .logo:hover { box-shadow: 0 0 10px #bef; -webkit-box-shadow: 0 0 10px #bef; } body > form > section { display: none; } nav { margin-bottom: 20px; text-align: center; } nav > a { -webkit-transition: border-bottom-color .5s; -moz-transition: border-bottom-color .5s; -o-transition: border-bottom-color .5s; transition: border-bottom-color .5s; text-decoration: none; display: inline-block; color: #1155ef; padding: 5px 6px; border-bottom: 3px solid transparent; } nav > a:hover { -webkit-transition: border-bottom-color 0s; -moz-transition: border-bottom-color 0s; -o-transition: border-bottom-color 0s; transition: border-bottom-color 0s; border-bottom: 3px solid #aaf; color: #000; } nav > .active { color: #000; border-bottom: 3px solid #000; } .prow { clear: both; padding-bottom: 3px; } .prow, .tiptop { position: relative; } .tip { overflow: hidden; position: absolute; padding: 5px 7px; left: -48px; top: -5px; border: 1px solid transparent; max-width: 100%; width: 33px; height: 25px; font: 12px/150% Verdana, sans-serif; white-space: pre-wrap; color: rgba(0, 0, 0, 0); z-index: 1; visibility: hidden; opacity: 0; -webkit-transition: visibility 0s 0.5s, opacity 0.5s, color .7s; -moz-transition: visibility 0s 0.5s, opacity 0.5s, color .7s; -o-transition: visibility 0s 0.5s, opacity 0.5s, color .7s; transition: visibility 0s 0.5s, opacity 0.5s, color .7s; } .tiptop:hover > .tip:not(:empty), .tipvis > .tip:not(:empty) { -webkit-transition-delay: 0s; -moz-transition-delay: 0s; -o-transition-delay: 0s; transition-delay: 0s; visibility: visible; opacity: 1; } .tip:hover { overflow: visible; left: -45px; background-color: rgba(245, 245, 255, .9); background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #fff), color-stop(100%, rgba(245, 245, 255, 0))); background-image: -moz-linear-gradient(top, #fff, rgba(245, 245, 255, 0)); background-image: -o-linear-gradient(top, #fff, rgba(245, 245, 255, 0)); background-image: linear-gradient(to bottom, #fff, rgba(245, 245, 255, 0)); color: #000; padding: 10px; padding-left: 40px; border: 1px solid #ddd; border-left: none; border-radius: 6px; box-shadow: 0 0 10px #666; -webkit-box-shadow: 0 0 10px #666; width: auto; height: auto; } .tip::before { display: inline-block; padding: 0 6px 2px; margin-right: 20px; border: 3px solid #aaa; border-right: none; border-radius: 10px 6px 6px 10px; text-align: center; font: 700 17px Verdana, sans-serif; color: #fff; text-shadow: 0 0 3px #000, 0 0 3px #000; content: "?"; } .tip:hover::before { position: absolute; top: 5px; left: 5px; } .prow > label, .prow > span:not(.clean) { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; display: inline-block; width: 49.6%; } .prow > label { padding-top: 8px; } .prow:hover label:not(.checkbox), label:not(.checkbox):hover { color: #45f; } .prow > span:not(.clean) { float: right; margin-top: 4px; max-width: 50%; text-align: right; } .prow input[type="text"] { width: 300px; } .prow select { max-width: 308px; } .prow input[type="color"] + input[type="text"], .shorter_input { width: 242px; vertical-align: middle; } .prowone > label, .prowone > span { width: auto !important; padding: 2px 0; } .inp_tf_short { width: 100px !important; } .sub_opt { padding-left: 20px; } input, textarea, select, code, .checkbox, .pager > a { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; -webkit-transition: color .2s, border-color .2s; -moz-transition: color .2s, border-color .2s; -o-transition: color .2s, border-top-color .2s, border-right-color .2s, border-left-color .2s, border-bottom-color .2s; transition: color .2s, border-color .2s; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #fff), color-stop(100%, #f5f5f5)); background-image: -moz-linear-gradient(top, #fff, #f5f5f5); background-image: -o-linear-gradient(top, #fff, #f5f5f5); background-image: linear-gradient(to bottom, #fff, #f5f5f5); background-color: rgba(242, 242, 242, 0); padding: 3px; margin: 2px; border: 1px solid #ddd; border-radius: 3px; font: 13px Verdana, sans-serif; } pre, code, textarea { font: 13px Consolas, Monaco, monospace; } code { display: inline-block; background-image: linear-gradient(to bottom, #FFFFFF, #F5F5F5); border: 1px solid silver; padding: 3px 5px; } select { max-width: 100%; } textarea { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; -webkit-tab-size: 4; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; resize: none; width: 100%; } select:focus, textarea:focus, input[type="text"]:focus, input:hover, select:hover, textarea:hover, .prow:hover input, .prow:hover select, label:hover input, .pager > a:hover, .prow:hover .checkbox, label:hover > .checkbox, .checkbox:hover { border: 1px solid #888; } input[type="checkbox"] { display: none; } .checkbox { -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; color: transparent; display: inline-block; vertical-align: middle; width: 20px; height: 20px; padding: 0; position: relative; } .checkbox:after { content: "✔"; font-weight: 700; position: absolute; top: 0; left: 3px; } input[type="checkbox"]:checked + .checkbox { color: #616161; } input[type="number"], input[type="color"] { width: 50px; text-align: center; } input[type="color"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; background: none; padding: 2px; vertical-align: middle; } input[type="number"] { width: 60px; box-shadow: none; /* Firefox marks "invalid" inputs */ } input[type="range"] { height: 24px; vertical-align: middle; } output { display: inline-block; min-width: 24px; } h3 { clear: left; } .color_helper { transition: opacity .3s; float: right; opacity: 0.3; } .color_helper:hover { opacity: 1; } .color_helper > input[type="text"] { width: 80px !important; } .shortcuts > label { display: block; } .shortcuts > label:hover input { border: 1px solid #aaa; } .shortcuts input, .sub_shortcuts input { margin: 5px; width: 35px; text-align: center; } .sub_shortcuts input { margin: 0; } .sub_shortcuts li { line-height: 200%; } .op_buttons > button, .action_buttons > span { position: relative; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #fff), color-stop(100%, #f5f5f5)); background-image: -moz-linear-gradient(top, #fff, #f5f5f5); background-image: -o-linear-gradient(top, #fff, #f5f5f5); background-image: linear-gradient(to bottom, #fff, #f5f5f5); cursor: pointer; color: #000; font-weight: 700; font-size: 14px; border-radius: 3px; border: 1px solid #ddd; } .op_buttons > button { -webkit-transition: border-color .3s, color .3s; -moz-transition: border-color .3s, color .3s; -o-transition-property: border-top-color, border-right-color, border-left-color, border-bottom-color, color; -o-transition-duration: .3s; transition: border-color .3s, color .3s; box-shadow: 0 1px 2px rgba(0, 0, 0, .5); -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .5); margin-bottom: 10px; font: 700 14px Arial; width: 95%; padding: 10px 0; } .op_buttons > button:hover { border: 1px solid #999; } .container_info { text-align: center; } #info_sec > pre { white-space: pre-line; } #locales_table { border-collapse: separate; border-spacing: 25px 2px; margin: 0 auto; font: 13px Consolas, Monaco; } #locales_table > tr:hover { border-collapse: separate; border-spacing: 25px 2px; margin: 0 auto; font: 13px Consolas, Monaco; } #locales_table th:first-child { text-align: left; } #locales_table td:last-child { text-align: center; }[{ "type": "extension", "frameworkVersion": "1.0.1", "guid": "{000008f5-8a32-4389-a7da-2daa0e9d7760}", "version": "0.9.1", "title": {"en": "Viewhance"}, "description": {"_t": "APP_DESCRIPTION"}, "author": { "name": "Deathamns", "email": "deathamns@gmail.com" }, "permissions": {"httpRequest": ["*"]}, "config": "options.html", "service": { "main": "background.html" }, "actions": [ { "type": "script", "entryPoints": ["doc_start"], "exclude": ["res"], "js": [ "includes/app.js", "includes/viewer.js" ], "includeFrames": true }, { "type": "script", "entryPoints": ["doc_end"], "exclude": ["res"], "js": [ "includes/opener.js" ], "includeFrames": true } ] }] // Tue, 08 Jul 2014 10:10:19 GMT { "mode": 1, "minUpscale": 0, "imgInfo": "%ow×%oh | %name (%perc%)", "favicon": "", "customCSS": "", "center": true, "wheelZoom": false, "lpDelay": 350, "lpLeft": 1, "lpRight": 0, "key_mOrig": "0", "key_mFit": "1", "key_mFitW": "2", "key_mFitH": "3", "key_rotL": "E", "key_rotR": "R", "key_flipH": "Q", "key_flipV": "W", "key_cycle": "C", "opener": 0 }PNG  IHDRVΎWIDAT8oTU3Ngj -!Z0jq>\r^]pmA6IiJC;;y9~>n%R %"ԍsxywy?RRh0ZhEV_7b]1rlXg)QR?o]k@1es˫K\ѣ/D!pej38Ȑo}gNҡYzuH70Q184XYhr ,.&YO,ZE&^%Ĭ%s'dU1³cc䝘c:1//'ZOk[zTOxLf<WJ+r9HC{k/MnmDŽZ]#BCLYY@`+P*/lw"wIDATx^}\y{oL!"aB CJfM ;ة-QFF&6 ,JZvx7"Ļ|H`&,rbhFf43=}ϻ;ۭAVܹV?yޏVrAE0- $ @9BNLO%2P''`L(}yD!8Ao'^TU4JS@+CyAބ.~'{U5TQ* hO0mʊ>^9УLV9䑲"NEmY; iN_?+A%l aWB:V01EK1>7W 8YP-2W%=ƔdWR_9J>b' Z'QP,Ok'ӬF#SB#>· wAB'VP ,;_M& <8Iޛ +bi}y pն,LE,?I!%arrYc/N^R9(XNPa`gloV)y&"]fz\VL ? !,K'p"~Y;YKؒ\^HOz@Y)X~f.{G$[@j$(81I!]/Jo!TqNkTpdoOSs_Q@8C0t.лٯ鍴uGVTC1>~7NhCR>|ƚ@o pe Y#,Ƒ 4k.'=OlOUƝyOؚ@Qa IDI+9<9]H < u[MEXCJ 8%Lr\`9 pP#lO2pGDu'#hIbGNqHWTp1(Fѫ!(VH^o茂/E3XMfJfb%8pD}Eq2 {ŮGYNYeMvu)`yǂw5$EZ̒P$@mHiΤ>,i; F~DpBOe(Y9+E1P~ {m>& 㰮 Vvnd@ ¾@)#{U( ?Bf >~=C7\ h("{zt'ɳ nBN7\Dҳbƻ{&BoOVSčk4sU #iǚX8S*#E`2cMcLM QmBi,8fʖ _~n߽{LdD8Xa`S$m34]λ~ {GENHV P_pMH7j^v+u`h ;lpv2VBy&!`8@rH;C避xw1>?% i׌Ǐv݀ˊNˉ ,7atXI$.xkHnչWuXpoٞm;Wv\u0p9xL<+Q"WZRIcɲ1$!/3ː=#+/;p^ᤁv@T5XpW :fw92(܀2/ o3",F,qJG[>8{7TPgR2?'=9K۹ARE:et6&>yu]^D%1$= gO8p~;Aё^/kҀdlPyPˁݺ8g&"ZCu,+ 9B038~- 㴂CNxx׌ .Vގi;]x<`G[Rъj)椠 CI( kĕ{vYBv(vxi?AQj d9ۂAj/\noR( x;R!rCv%;lㅀytz`‹f?]>vզ}lE$\_cZp,?@$p໮֦<@{1{uGú)ǸQHQc͉'r5C x c< .Q7t#@υ7@[Ӑ~\vٺuTLj@b]pIgC\24fJo)g8.v˜*+OdX%,~El]}яͳOѫH'ޔ@A]>)tFv\^Qk'>xstN9p@MPE%N`GgϭɊ.R塆0J^@8 LՐeUhUV} <^nW 53to&˝+ \NZD^2!E~TIBPgk\*WGgPm:)_2JpH_qb 1@vHr z!t,Z-e&aΩQBxޓi_KODsZ*()-Sc:@]o%?67waL,ZSO ɫ02U~Uk?hC_RoBHJ7ح ߕӑ#i jODHVt I(laS`DtVh/挗0&I1/: 8###x5󟭶Xn{E?ъUg<3SӐ> \^^l=3fDpI_Aӿ(N[JyH`]lh3Pi+R#SPձN9BvҾ;Ib7(7\MXSSY8[ٰ[B`t$\cB@&p)*uy|ݭ'?kS+3dž9rJ&r*74~]@{iZC FTƐ#p>BGzY?ҬQUS6qp2W&зRjdZ3G3)SOj:G,xJPo2Y [FDgϋ{.8 94R͏wj~Dbmt~dՈ p%%ڋ 9:Sq倫4(H_I:!}چ KN"(o=]u GN\G"m Xno X;-ʃX Gj|BiLQYm0 o6γI#,_p^ܙOYX0rDP_@VFK̉Sqp\8xTj8ʷL.oE` . 9/9u? 2(־9;)Vlv{ҥ_$\2A’k.Tj="=,? yߨEoB<}A蟟8οs$P`p rMSC A,S}3X»ܩ/8;pAsh%k@0ȋ8 n|c7́I3tǔ4:ہ`R၍3Q_>>)Li,}eblVZkCz@X[Ṕj( /ŝȡ].>;"s4S䮸@[9Yq;sG[?g;ز|0#_ȁC?5 2^p>%78vkjǥ 6>{r`LJ+ |Ng,]q;ՂAD~d@y;G ;pO?>Efas q7F1P 0qd3̱! 9c|vӓAB2_󡒘6|{;+>q>qX Ld!P8hC}ɂDhpON:tqgI*zŤzǐ<'9 A,.-A /d^36wu; '#ä~++s΃&0"zfQXxKib|X߼AAOG`EꄽfqHh *J(*z\  2!w^1 y̿ mT^ <\O4zt R"@8@'2priE:o8H`~U@? Uc[tR %qq/ZE3SS @GD71%[1h肜J~A`pcoe* b5RxQDdP*$Ah Ϋ eE߷&]8qL;=F2D1 lD|h*Sj?:L!n g0y V~y[}ndlfuJ\ ](! 1'\eJ_~jHnqB/.IrԄnIENDB`PNG  IHDRasRGBgAMA a pHYsodtEXtSoftwarepaint.net 4.0;imIDAT8O-Ogg-zv%[nD3c&u )ȀЁRhK-WGKKm)-`2~{J<;s]ܒTy[ǁx#PLm#HCIO|/cQ9K^ex)`UxUJ&Dps 7vrᵋ̆"K#ĥlNd<;q5,]J6}/d&'IrB ͨYEaG.G[ G+GS5cIQtk M?!.!OCR9*\<`iSbMZ Uzp-@SG>@f(%7R4xtv)e|] wpoZ x@#͗C>jܚKro]t,'(LIFW;Ẓ^'< qFb1M=EXjwtyDq *=.bk[vNiԌopJ,:g#\jRP?9CBl:~vɯln3F~kf8U9Li<:*tV:3 q /7Ňl}{{\OsM^f?UkLs;3?(yN >R=J6`r&^I.?n(%-xﺞ_aa+U[LwYYiz3M׊Jz(}sa:*wE:ߋ2OMiLE2 ~эyh 0Q4K{]9ߟ4nd KF?֌r﹋ujcqGW+aIENDB`PNG  IHDR DPLTEֱԭԣϝԝˍЊ҇ч҇ӋՍԌҐ֔Քڙڔ֑Շ΃͂Ђ̅}urrk|ۄޅ}uruvzrnpswx~ܑܛޡߠݩݮ۳ڮ֚ڙ̍ЅȒÌʷyzrĴsqfgc^TNI}Bw:t>p9f2e5_;Z8T1W3N2I1F8B@IEMCXHbJdPoWwVvbjkukxj|lor|}{}jph{nj[_Q_F~EB8ӌ+fH؀ D fl8{sM8 ]#r;c=ht!Z!֋ay|[u߽7nˆe [of_-vb.@|yҐ,o~AX4/ޓh.8?є4*KvGC,Fo?װXBSez+QLő #L'֛፣CNڪ?EC,e䋭`nj~L&kӓBteL}08!$5J('U~^ja4(v)0~@T+nH "h%@K3 ^#UQ MT@9_ zĚ^'[IENDB`PNG  IHDR00` PLTEms$v(z084:?H~EzBw?q;k3i9c3`2Z:[:T2S9N7J0J4C;EBLCXASNZHaPfPn^hm`TT2;1rMVQX\dblluqkox~}ل܇҇ыӑ֌ԍѐՌדٔ՘טܕےݗٛߵݦוӖztwvsmmg`V^bhqy~}ysouqɃЂ~̂̇φЍӉɅ̝ʤΗ٤ܵ٥ɠqlxY\cSSrJKA@S`lzeqZ{b}jϴ֖omyqidyъޠűǣܧިץ̟s8itRNS0>I|IDATx]ole video:first-child, body > div > video:first-child"); if (d && d.length === 1) { return document.media_type = "video"; } }; app = { "name": /*~APP_NAME~*/"Viewhance", "version": /*~APP_VERSION~*/"0.9.1" }; app.runtime = external.mxGetRuntime(); Port = { listener_id: parseInt(Math.random() * 1e10, 10).toString(36), empty_listener: function() {}, listen: function(listener) { if (this.listener && !listener) { app.runtime.listen(this.listener_id, this.empty_listener); } this.listener = listener; if (listener) { app.runtime.listen(this.listener_id, this.listener); } }, send: function(message, msg_name) { app.runtime.post(msg_name || "service", { "message": message, "mxPort": { "id": this.listener_id, "url": location.href } }); } }; if (location.host === "{000008f5-8a32-4389-a7da-2daa0e9d7760}") { cfg = { storage: app.runtime.storage, getItem: function(k, fn) { fn(this.storage.getConfig(k)); } }; _ = function(s, t) { if (t = app.runtime.locale.t(s)) { return t[0] === '"' ? JSON.parse(t) : t; } return s; }; } browser.maxthon = true; /* global browser, app, Port, _, cfg:true */ // should not run on image pages if (!media_type() && document instanceof window.HTMLDocument) { Port.listen(function(cfg) { Port.listen(null); cfg = JSON.parse((cfg && (cfg.data || cfg.message || cfg).prefs)).opener; if (!cfg) { return; } var mdownstart, md_x, md_y, checkBG = function(imgs) { // ("...\"") - Gecko // (...) or ('...)') - WebKit // ("..."") - Presto imgs = (imgs.backgroundImage + imgs.content + imgs.listStyleImage).match(/\burl\(([^'"\)][^\)]*|"[^"\\]+(?:\\.[^"\\]*)*|'[^'\\]+(?:\\.[^'\\]*)*)(?=['"]?\))/g); if (Array.isArray(imgs)) { for (var i = 0; i < imgs.length; ++i) { imgs[i] = imgs[i].slice(/'|"/.test(imgs[i][4]) ? 5 : 4); } } return imgs; }, checkIMG = function(node) { var nname = node.nodeName.toUpperCase(); if (nname === "IMG" || node.type === "image" || nname === "EMBED") { return node.src; } else if (nname === "CANVAS") { return node.toDataURL(); } else if (nname === "OBJECT" && node.data) { return node.data; } else if (nname === "AREA") { var img = document.querySelector('img[usemap="#' + node.parentNode.name + '"]'); return img.src; } else if (nname === "VIDEO") { nname = document.createElement("canvas"); nname.width = node.clientWidth; nname.height = node.clientHeight; nname.getContext("2d").drawImage(node, 0, 0, nname.width, nname.height); return nname.toDataURL("image/jpeg"); } else if (window.SVGDocument && node.document instanceof window.SVGDocument || /^\[object SVG/.test(node.toString())) { if (node.ownerDocument && !/^\[object SVG/.test(node.ownerDocument.toString())) { node = (new window.XMLSerializer).serializeToString( node.ownerSVGElement === null ? node : node.ownerSVGElement ); if (typeof node === "string") { return "data:image/svg+xml," + encodeURIComponent(node); } } } else if (node.poster) { return node.poster; } return null; }; window.addEventListener("mousedown", function(e) { if (e.button === 2) { mdownstart = Date.now(); // e.timeStamp // context menu should work where the mousedown event happened (Chrome...) md_x = e.clientX; md_y = e.clientY; } }, true); window.addEventListener("contextmenu", function(e) { if (!mdownstart || e.button !== 2 || md_x != e.clientX || md_y != e.clientY) { return; } var elapsed = Date.now() - mdownstart >= 300; if (!(e.ctrlKey && e.altKey && !e.shiftKey && !elapsed && cfg > 1 || elapsed && (cfg === 1 || cfg === 3) && !e.ctrlKey && !e.shiftKey && !e.altKey)) { return; } var url, urls = [], r, el = 30, rgxHTMLBODY = /HTML|BODY/i; // not exactly what we want var XPath = document.evaluate( ". | ./ancestor::*[position()<" + el + "] | ./preceding::*[position()<" + el + "][not(head) and not(ancestor::head)] | ./descendant::*[position()<" + el + "] | ./following::*[position()<" + el + "]", e.target, null, 4, null ); while (el = XPath.iterateNext()) { r = el.getBoundingClientRect(); if (e.clientX >= r.left && e.clientX <= r.left + r.width && e.clientY >= r.top && e.clientY <= r.top + r.height) { if (rgxHTMLBODY.test(el.nodeName) && !rgxHTMLBODY.test(e.target.nodeName)) { continue; } if (url = checkIMG(el)) { urls.push(url); } if (url = checkBG(window.getComputedStyle(el))) { urls = urls.concat(url); } } } if (urls && urls.length) { e.stopPropagation(); e.preventDefault(); var filter = {}; for (i = 0; i < urls.length; ++i) { filter[urls[i]] = true; } Port.send({ "cmd": "open", "url": Object.keys(filter).reverse() }); } }, true); }); Port.send({"cmd": "hello"}); }/* global browser, app, Port, _, cfg:true */ "use strict"; var init = function(win, doc, head) { // cfg is not available in normal web-pages, but in extension pages only if (typeof Port === "undefined" || typeof cfg === "object" || !doc || !doc.body) { return; } var transform = { flip: function(el, ori) { if (!el.scale) { el.scale = {"h": 1, "v": 1}; } el.scale[ori ? "h" : "v"] *= -1; ori = el.scale.h !== 1 || el.scale.v !== 1 ? "scale(" + el.scale.h + "," + el.scale.v + ")" : ""; if (el.curdeg) { ori += " rotate(" + el.curdeg + "deg)"; } el.style[browser["transform"]] = ori; } }, pdsp = function(e, d, p) { if (!d && e.preventDefault) { e.preventDefault(); } if (p) { return; } if (e.stopImmediatePropagation) { e.stopImmediatePropagation(); } else if (e.stopPropagation) { e.stopPropagation(); } }, shortcut = { specKeys: { 8: "Backspace", 9: "Tab", 13: "Enter", 16: "shift", 17: "ctrl", 18: "alt", // control keys are not capital 27: "Esc", 32: "Space", 33: "PgUp", 34: "PgDn", 35: "End", 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 45: "Ins", 46: "Del", 96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7", 104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111: "/", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", 221: "]", 222: "'", 112: "F1", 113: "F2", 114: "F3", 115: "F4", 116: "F5", 117: "F6", 118: "F7", 119: "F8", 120: "F9", 121: "F10", 122: "F11", 123: "F12" }, isModifier: function(e) { return e.which > 15 && e.which < 19; }, key: function(e) { return this.specKeys[e.which] || String.fromCharCode(e.which).toUpperCase(); } }; cfg = JSON.parse((head && (head.data || head.message || head)).prefs); var media = doc.body.querySelector("img" + (cfg.video ? ", video" : "")); if (!media) { init = null; return; } if (browser.opera || browser.firefox) { media.style.display = "none"; } if (browser.opera && media_type() === "img") { win.donotrun = media.error = true; media.naturalWidth = 0; media.onclick = win.ondragstart = win.onkeypress = win.onmousedown = win.onmouseup = win.onmousemove = null; } ["class", "style"].forEach(function(attr) { doc.documentElement.removeAttribute(attr); doc.body.removeAttribute(attr); }); var root, init_params, after_calc, moving, winW, winH, sX, sY, noFit = {cur: false, real: false}, lastEvent = {}, progress = null, cancelAction = false, fZoom = null, dragSlide = [], borderSize = 0, MAXSIZE = 0x7fff; if (head = doc.querySelector("head")) { doc.documentElement.removeChild(head); } head = doc.createElement("head"); if (cfg.favicon) { root = doc.createElement("link"); root.rel = "shortcut icon"; root.href = cfg.favicon === "%url" ? win.location.href : cfg.favicon.replace("%url", encodeURIComponent(win.location.href)); } if (root) { head.appendChild(root); } root = doc.createElement("style"); root.appendChild(doc.createTextNode([ "html, body{width: 100%; height: 100%; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none}", "body {cursor: default; margin:0; padding: 0; font: 12px 'Trebuchet MS', sans-serif}", "body > img, body > video {margin:0 !important; background-clip: padding-box;" + browser["box-sizing_css"] + ": border-box; position: absolute}", "h2 {margin: 0; padding-top: 15%; text-align: center; text-shadow: 1px 1px 15px #000; color: #fff; font: 700 30px 'Trebuchet MS', sans-serif}", ".m_1 {max-width: 100%; max-height: 100%; width: auto; height: auto}", ".m_2 {width: 100%; height:auto} .m_3 {height: 100%; width: auto}", "a {text-decoration: none}", ":root.error img, :root.error video {box-shadow: 0 0 10px red}", ":root.error>body>h2 {text-shadow: 1px 1px 15px firebrick}", ":focus {outline: 0}", "#menu {position: fixed; " + browser["transition_css"] + ": opacity .25s, left .2s; width: 50px; height: 33.33%; top: 0; opacity: 0}", "ul {display: inline-block; text-align: center; margin: 0; padding: 5px 15px; list-style: none; font-size: 25px; font-weight: 700; background: rgba(0, 0, 0, .6); color: #fff}", "li {display: block; position: relative}", "li[data-cmd] {cursor: pointer}", "li[data-cmd=cycle], li[data-cmd=rotate] {position: relative}", "li[data-cmd=cycle]::after {content: '\u2195'; position: absolute; left: 25%}", "li[data-cmd=rotate]::after {content: '\u21BB'; position: absolute; left: 2px}", "li ul {position: absolute; left: 100%; top: 0; visibility: hidden; opacity: 0; " + browser["transition_css"] + ": visibility .4s, opacity .2s .3s; text-align: left}", "li:hover ul {display: block; opacity: 1; visibility: visible}", "li ul>li {display: block !important; font-size: 15px; padding: 3px 0}", ".send_hosts li > a {color: #fff; background-size: 16px 16px; background-repeat: no-repeat; background-position: 0 3px; padding-left: 25px;}", "#menu>ul>li:hover, .send_hosts li > a:hover {color: silver}", "li ul>li {white-space: nowrap}", ".filters>ul {font-size: 15px} .filters>form {margin: 0; padding: 0}", "body.frames, body.frames {text-align: center; overflow-y: scroll !important} body.frames * {margin: 2px}", "#frames > canvas, #frames > img {display: none}", "#current_frame+output {display: inline-block; font-family: Conoslas, monospace; width: 65px; text-align: right}", ".back {font-size: 150%; color: black; text-decoration: none}", "#frames.showall > img, #frames.showall > canvas {display: inline-block !important}", (cfg.customCSS || "body {background: silver; overflow: hidden} img {background: white; box-shadow: 0 0 5px grey}") ].join(""))); head.appendChild(root); doc.documentElement.insertBefore(head, doc.body); init = function() { if (!(media.naturalWidth || media.videoWidth || init_params === null)) { if (init_params && ++init_params.loop >= init_params.maxLoop && progress) { clearInterval(progress); } return; } if (media_type() === "video") { media.naturalWidth = media.videoWidth; media.naturalHeight = media.videoHeight; } root.classList.add(media.nodeName.toLowerCase()); if (progress) { clearInterval(progress); } if (browser.opera || browser.firefox || !doc.images.length) { doc.body.textContent = ""; doc.body.appendChild(media); } else { doc.body.replaceChild(media, doc.body.firstChild); // TODO: Maybe remove everything else } if (!cfg.imgInfo) { cfg.imgInfo = false; } head.appendChild(doc.createElement("style")).textContent = "body > img, body > video {max-width:" + Math.min( MAXSIZE, Math.floor(media.naturalWidth * MAXSIZE / media.naturalHeight) ) + "px;max-height:" + Math.min( MAXSIZE, Math.floor(media.naturalHeight * MAXSIZE / media.naturalWidth) ) + "px}"; cfg.hiddenScrollbars = win.getComputedStyle(root).overflow === "hidden" || win.getComputedStyle(doc.body).overflow === "hidden"; var menu = doc.body.appendChild(doc.createElement("div")); menu.id = "menu"; if (win.getComputedStyle(menu).display === "none") { doc.body.removeChild(menu); } else { menu.style.cssText = "-webkit-filter: blur(1px); filter: blur(1px)"; if (menu.style.webkitFilter || menu.style.filter) { media.filters = {}; menu.onchange = function(e) { var t = e.target, f = ""; if (t.value) { if (t.value === t.defaultValue) { delete media.filters[e.target.parentNode.textContent.trim()]; } else { media.filters[t.parentNode.textContent.trim()] = t.value + t.getAttribute("unit"); } for (var fname in media.filters) { f += fname + "(" + media.filters[fname] + ") "; } } media.style.webkitFilter = f; media.style.filter = f; }; } menu.innerHTML = '
    ' + '
  • ' + '
  • ' + '
  • ' + '
  • .' + '
  • ' + (media.filters ? '
  • ≡' + '
      ' + '
    • brightness
    • ' + '
    • contrast
    • ' + '
    • saturate
    • ' + '
    • grayscale
    • ' + '
    • invert
    • ' + '
    • sepia
    • ' + '
    • hue-rotate
    • ' + '
    • blur
    • ' + '
    ' + '
  • ' : "") + '
  • ' + '
  • ↗' + '' + '
  • ' + (media_type() === "video" ? "" : '
  • ') + '
  • ' + '
'; menu.style.cssText = "display: none; left: -" + menu.offsetWidth + "px"; menu.addEventListener("mousedown", function(e) { var t = e.target; if (t.href && t.href.slice(-1) === "%") { t.href = t.href.slice(0, -1) + encodeURIComponent(win.location.href); } if (t.textContent) { pdsp(e); } }, false); // load favicons only when the menu item is hovered the first time menu.querySelector(".send_hosts").onmouseover = function() { this.onmouseover = null; [].forEach.call(this.querySelectorAll(".send_hosts > ul > li > a"), function(el) { el.style.backgroundImage = "url(http://" + (el.getAttribute("data-favicon") || (el.host + "/favicon.ico")) + ")"; }); }; var handle_cmd = function(cmd, e) { if (e.button === 1) { return; } var p = e.type.indexOf("wheel") > -1 && (-e.wheelDelta || e.deltaY || e.detail) > 0 || e.button === 2 ? 1 : 0; if (cmd === "cycle") { media.cycle(!p); } else if (cmd === "flip") { transform.flip(media, p); } else if (cmd === "rotate") { media.rotate(!p, e.ctrlKey); } else if (cmd === "zoom") { media.zoomToCenter({wheelDelta: p ? -1 : 1}); } else if (cmd === "reset" && e.button === 0) { media.reset(); } else if (cmd === "frames") { Port.listen(function(js) { js = js && (js.data || js.message || js); Port.listen(null); Function("win", "draw_full_frame", "error_handler", js['frames.js'])(win, e.button === 0, function(msg) { alert(msg); msg = menu.querySelector("li[data-cmd='frames']"); msg.removeAttribute("data-cmd"); msg.style.opacity = "0.2"; }); }); Port.send({"cmd": "load_frames.js"}); } else if (cmd === "options" && e.button === 0) { Port.send({"cmd": "open", "url": "options.html"}); } else { p = null; } if (p !== null) { pdsp(e); } }; menu.addEventListener(browser["wheel"], function(e) { var t = e.target; if (t.nodeType === 3) { t = t.parentNode; } if (t.type === "range") { t.value = Math.max(t.getAttribute("min"), Math.min(parseInt(t.value, 10) + t.getAttribute("step") * ((-e.wheelDelta || e.deltaY || e.detail) > 0 ? -1 : 1), t.getAttribute("max"))); menu.onchange(e); pdsp(e); } else if (!/reset|frames|options/.test(t.getAttribute("data-cmd") || (t = t.parentNode) && t.getAttribute("data-cmd"))) { handle_cmd(t.getAttribute("data-cmd"), e); } }, false); menu.onclick = function(e) { var t = e.target; if (t.hasAttribute("data-cmd") || (t = t.parentNode) && t.hasAttribute("data-cmd")) { handle_cmd(t.getAttribute("data-cmd"), e); } }; menu.oncontextmenu = function(e) { var t = e.target; if (t.type === "range") { t.value = t.defaultValue; menu.onchange(e); pdsp(e); } else if (t.hasAttribute("data-cmd") || (t = t.parentNode) && t.hasAttribute("data-cmd")) { handle_cmd(t.getAttribute("data-cmd"), e); } }; menu.addEventListener(browser["transitionend"], function(e) { if (e.propertyName === "left" && this.style.left[0] === "-") { menu.style.display = "none"; } }, false); if (win.Node.prototype && !win.Node.prototype.contains) { win.Node.prototype.contains = function(n) { return n instanceof Node && (this === n || !!(this.compareDocumentPosition(n) & 16)); }; } menu.onmouseover = function() { if (menu.mtimer) { clearTimeout(menu.mtimer); menu.mtimer = null; menu.style.left = "0"; menu.style.opacity = "1"; } }; menu.onmouseout = function(e) { if (!this.contains(e.relatedTarget)) { doc.addEventListener("mousemove", menu_trigger, false); menu.mtimer = setTimeout(function() { menu.style.left = "-" + menu.offsetWidth + "px"; menu.style.opacity = "0"; menu.mtimer = null; }, 800); } }; var menu_trigger = function(e) { if (!moving && !e.ctrlKey && e.clientX < 40 && e.clientY < win.innerHeight / 3) { if (menu.style.display !== "block") { menu.style.display = "block"; setTimeout(function() { menu.style.left = "0"; menu.style.opacity = "1"; }, 50); doc.removeEventListener("mousemove", menu_trigger, false); } } } // Safari showed the menu even if the cursor wasn't at the edge setTimeout(function() { doc.addEventListener("mousemove", menu_trigger, false); }, 500); } after_calc = function() { if (media.calcFit) { winH = doc.compatMode[0] === "B" ? doc.body : root; winW = winH.clientWidth; winH = winH.clientHeight; media.setPos(); setTimeout(function() { // Gecko and WebKit/Blink render scrollbars for a split of a second // even if the image fits into the view-port winH = doc.compatMode[0] === "B" ? doc.body : root; winW = winH.clientWidth; winH = winH.clientHeight; media.calcFit(); media.setInfo(); media.setCur(); }, 0xf); } }; media.resize = function(m, w) { if (m === -1 || (m === -1 && fZoom)) { if (w) { this.style.width = w; } } if (m === void 0) { m = 1; } if (m !== -1 && this.mode === -1) { this.style.width = this.style.height = ""; } this.mode = m; this.className = "m_" + m; if (this.naturalWidth) { after_calc(); } }; media.setPos = function() { var s = this.style; if (cfg.center) { s.top = Math.max(0, (winH - this.offsetHeight) / 2) + "px"; s.left = Math.max(0, (winW - this.offsetWidth) / 2) + "px"; } else { s.top = s.left = "0"; } this.box = this.getBoundingClientRect(); if (this.box.left < 0) { s.left = (parseInt(s.left, 10) - this.box.left - win.pageXOffset) + "px"; } if (this.box.top < 0) { s.top = (parseInt(s.top, 10) - this.box.top - win.pageYOffset) + "px"; } }; media.setInfo = function() { if (!cfg.imgInfo || !(media.naturalWidth && media.naturalHeight)) { return; } doc.title = cfg.imgInfo.replace(/%(o?[wh]|url|name|ratio|perc)/g, function(a, a1) { switch (a1) { case "w": return media.clientWidth; case "h": return media.clientHeight; case "ow": return media.naturalWidth; case "oh": return media.naturalHeight; case "url": return win.location; case "name": return media.alt; case "ratio": return Math.round(media.clientWidth / media.clientHeight * 100) / 100; case "perc": return ~~(0.5 + 1e4 * (media.clientWidth / media.naturalWidth)) / 100; } }); }; media.calcFit = function() { var box = this.box || this.getBoundingClientRect(); noFit = { cur: (box.width <= winW && box.height <= winH), real: (this.naturalWidth <= winW && this.naturalHeight <= winH) }; }; media.wheelZoom = function(e) { stopScroll(); pdsp(e); var w = media.offsetWidth, h = media.offsetHeight; if ((-e.wheelDelta || e.deltaY || e.detail) > 0) { media.resize(-1, Math.max(1, w * 0.75) + "px"); } else { var width = w * (4 / 3); media.resize(-1, (width > 10 ? width : width + 3) + "px"); } if (e.keypress || e.target.nodeName.toUpperCase() === "IMG") { win.scrollTo( (e.offsetX || e.layerX || 0) * media.offsetWidth / w - e.clientX + borderSize, (e.offsetY || e.layerY || 0) * media.offsetHeight / h - e.clientY + borderSize ); } }; media.zoomToCenter = function(e) { pdsp(e); this.wheelZoom({ keypress: true, wheelDelta: e.wheelDelta, clientX: winW / 2, clientY: winH / 2, offsetX: win.pageXOffset + media.offsetLeft + winW / 2, offsetY: win.pageYOffset + media.offsetTop + winH / 2 }); }; if (cfg.wheelZoom) { doc.addEventListener(browser["wheel"], media.wheelZoom, false); } else { doc.addEventListener(browser["wheel"], function(e) { if (media.clientWidth > winW || media.clientHeight > winH) { stopScroll(); var x = 0, y = ((-e.wheelDelta || e.deltaY || e.detail) > 0 ? winH : -winH) / 5; if (media.clientWidth <= winW && media.clientHeight > winH) { if (!cfg.hiddenScrollbars) { return; } } else if (media.clientHeight <= winH && media.clientWidth > winW || e.clientX < winW / 2 && e.clientY > winH - 100) { x = (y < 0 ? -winW : winW) / 5; y = 0; } else if (!cfg.hiddenScrollbars) { return; } win.scrollBy(x, y); pdsp(e); } }, false); } media.setCur = function() { if (this.width > winW || this.height > winH) { this.style.cursor = "move"; } else if ( ((winH >= this.height && winW >= this.width) && (winH < this.naturalHeight || winW < this.naturalWidth)) || (noFit.cur && noFit.real && (this.height < this.naturalHeight || this.width < this.naturalWidth))) { this.style.cursor = browser["zoom-in"]; } else { this.style.cursor = "default"; } }; win.addEventListener("resize", after_calc, false); doc.addEventListener("contextmenu", function(e) { doc.removeEventListener("mousemove", onmove, true); if (progress) { clearTimeout(progress); progress = null; } if (cancelAction) { e.preventDefault(); } }, false); var x, y; var onmove = function(e) { x = e.clientX; y = e.clientY; if (x === lastEvent.clientX && y === lastEvent.clientY) { return; } else if (progress) { clearTimeout(progress); progress = lastEvent.button = null; } if (sX === true || noFit.cur) { doc.removeEventListener("mousemove", onmove, true); return; } if (!moving) { moving = win.requestAnimationFrame(onmoveframe); } if (dragSlide.length !== 3) { dragSlide = [[x, y], [x, y], [x, y]]; return; } // Opera fires move event before mouseup if (dragSlide[2][0] === x && dragSlide[2][1] === y) { return; } dragSlide[0] = [dragSlide[1][0], dragSlide[1][1]]; dragSlide[1] = [dragSlide[2][0], dragSlide[2][1]]; dragSlide[2] = [x, y]; // e.timeStamp; media.dragSlideTime = Date.now(); }; var pan = function() { win.scrollBy(sX - x, sY - y); sX = x; sY = y; }; var onmoveframe = function() { pan(); moving = null; }; var stopScroll = function(e) { if (dragSlide.length) { clearInterval(progress); progress = null; cancelAction = false; dragSlide.length = 0; media.dragSlideTime = false; } if (e) { doc.removeEventListener(browser["wheel"], stopScroll, false); } }; var startScroll = function() { progress = setInterval(function() { win.scrollBy(dragSlide[0], dragSlide[1]); if (dragSlide[0]) { if (Math.abs(dragSlide[0]) < 1) { dragSlide[0] = 0; } dragSlide[0] /= 1.11; } if (dragSlide[1]) { if (Math.abs(dragSlide[1]) < 1) { dragSlide[1] = 0; } dragSlide[1] /= 1.11; } var atRight = root.scrollWidth - win.pageXOffset === winW, atBottom = root.scrollHeight - win.pageYOffset === winH; if (!(dragSlide[0] && dragSlide[1]) || (!win.pageYOffset && !win.pageXOffset) || (!win.pageYOffset && atRight) || (atBottom && !win.pageXOffset) || (atBottom && atRight)) { stopScroll(); } }, 25); }; var draw_mask = function(e) { if (++fZoom.counter % 3) { return; } var x = e.clientX - fZoom.left, y = e.clientY - fZoom.top; if (e.ctrlKey) { var rx = fZoom.prevX ? x - fZoom.prevX : 0, ry = fZoom.prevY ? y - fZoom.prevY : 0; fZoom.prevX = x; fZoom.prevY = y; fZoom.x += rx; fZoom.y += ry; fZoom.X += rx; fZoom.Y += ry; } else { if (fZoom.prevX) { delete fZoom.prevX; delete fZoom.prevY; } fZoom.w = Math.abs(fZoom.X - x); fZoom.h = Math.abs(fZoom.Y - y); fZoom.x = fZoom.X < x ? fZoom.X : fZoom.X - fZoom.w; fZoom.y = fZoom.Y < y ? fZoom.Y : fZoom.Y - fZoom.h; } media.mctx.clearRect(0, 0, media.mask.width, media.mask.height); media.mctx.fillRect(0, 0, media.mask.width, media.mask.height); media.mctx.clearRect(fZoom.x, fZoom.y, fZoom.w, fZoom.h); }; media.addEventListener("mousedown", function(e) { if (e.button === 1 || e.ctrlKey || e.altKey) { return; } if ((e.button === 0 && media.mode < 4) || e.button === 2) { if (e.button === 2) { sX = true; } else { if (!e.shiftKey && noFit.cur && media.clientWidth >= 60 && media.clientWidth - (e.offsetX || e.layerX || 0) <= 30) { lastEvent.clientX = e.clientX; lastEvent.clientY = e.clientY; return; } e.preventDefault(); win.focus(); sX = e.clientX; sY = e.clientY; } if (!e.shiftKey) { doc.addEventListener("mousemove", onmove, true); } } if (!cfg.lpDelay) { return; } // for fine move and free zoom if (e.shiftKey) { cancelAction = true; if (e.button === 0) { fZoom = { counter: 0, left: parseInt(media.style.left, 10), top: parseInt(media.style.top, 10) }; fZoom.X = e.clientX - fZoom.left; fZoom.Y = e.clientY - fZoom.top; if (!media.mask) { media.mask = doc.createElement("canvas"); media.mask.className = "mask"; media.mask.style.cssText = "display: block; position: fixed; left: 0; top: 0;"; media.mctx = media.mask.getContext("2d"); } doc.addEventListener("mousemove", draw_mask, false); var h = media.curdeg && Math.sin(media.curdeg) ? true : false, w = h ? media.offsetHeight : media.offsetWidth; h = h ? media.offsetWidth : media.offsetHeight; media.mask.width = Math.min(winW, w); media.mask.height = Math.min(winH, h); media.mask.style.left = media.style.left; media.mask.style.top = media.style.top; media.mctx.clearRect(0, 0, media.mask.width, media.mask.height); doc.body.appendChild(media.mask); w = win.getComputedStyle(media.mask).color; media.mctx.fillStyle = !w || w === "rgb(0, 0, 0)" ? "rgba(0,0,0,.4)" : w; } } // is dragSlideing if (progress) { if (stopScroll) { stopScroll(); cancelAction = e.button === 0; } if (e.button === 0) { return; } } if (e.shiftKey || (e.button === 0 && !cfg.lpLeft) || (e.button === 2 && !cfg.lpRight)) { return; } lastEvent.clientX = e.clientX; lastEvent.clientY = e.clientY; lastEvent.layerX = e.offsetX || e.layerX || 0; lastEvent.layerY = e.offsetY || e.layerY || 0; lastEvent.button = e.button; progress = setTimeout(longpress_handler, cfg.lpDelay); }, false); var longpress_handler = function() { cancelAction = true; progress = null; longpress_func(cfg[lastEvent.button === 2 ? "lpRight" : "lpLeft"]); }, longpress_func = function(id) { switch (id) { case 1: // fit to width/height var x, y; if (media.mode === 2 || media.clientWidth === doc.body.clientWidth || (doc.body.clientHeight > media.clientHeight && winW < doc.body.clientWidth)) { x = media.clientWidth; media.resize(3); x = lastEvent.layerX * media.clientWidth / x - winW / 2; y = 0; } else { y = media.clientHeight; media.resize(2); x = 0; y = lastEvent.layerY * media.clientHeight / y - winH / 2; } win.scrollTo(x, y); break; } }; doc.addEventListener("mouseup", function(e) { if (e.button !== 0) { return; } var x, y; if (media.mode < 4) { doc.removeEventListener("mousemove", onmove, true); if (fZoom) { doc.removeEventListener("mousemove", draw_mask, false); doc.body.removeChild(media.mask); var w = Math.min( media.clientWidth, fZoom.w + Math.min(fZoom.x, 0) + (fZoom.x + fZoom.w > media.mask.width ? media.mask.width - fZoom.x - fZoom.w : 0) ), h = Math.min( media.clientHeight, fZoom.h + Math.min(fZoom.y, 0) + (fZoom.y + fZoom.h > media.mask.height ? media.mask.height - fZoom.y - fZoom.h : 0) ); x = Math.max(0, fZoom.x); y = Math.max(0, fZoom.y); fZoom = null; cancelAction = false; if (!w || !h || x >= media.clientWidth || y >= media.clientHeight) { return; } var nimgw, nimgh, scrollbars = (win.innerWidth - winW) || (win.innerHeight - winH); var fitW = winW < w * winH / h; fitW = e.ctrlKey ? !fitW : fitW; if (fitW) { nimgw = media.clientWidth * winW / w; nimgh = nimgw * media.clientHeight / media.clientWidth; } else { nimgh = media.clientHeight * winH / h; nimgw = nimgh * media.clientWidth / media.clientHeight; } // not needed in Opera 12, except for positioning if (nimgw > MAXSIZE) { nimgw = MAXSIZE; nimgh = media.clientHeight * MAXSIZE / media.clientWidth; } if (nimgh > MAXSIZE) { nimgw = media.clientWidth * MAXSIZE / media.clientHeight; nimgh = MAXSIZE; } var cx = (win.pageXOffset + x + w / 2) * nimgw / media.clientWidth - winW / 2 - scrollbars; var cy = (win.pageYOffset + y + h / 2) * nimgh / media.clientHeight - winH / 2 - scrollbars; media.resize(-1, nimgw + "px"); win.scrollTo(cx, cy); return; } else if (dragSlide.length === 3) { x = dragSlide[0][0] - dragSlide[2][0]; y = dragSlide[0][1] - dragSlide[2][1]; // e.timeStamp if ((Date.now() - media.dragSlideTime) > 100) { cancelAction = false; dragSlide.length = 0; return; } if (x || y) { dragSlide.length = 2; dragSlide[0] = x; dragSlide[1] = y; startScroll(); doc.addEventListener(browser["wheel"], stopScroll, false); return; } } } if (progress) { clearTimeout(progress); progress = null; } if (cancelAction) { cancelAction = false; return; } if (e.shiftKey || e.ctrlKey || e.altKey || e.target !== media || lastEvent.button === null || e.clientX !== lastEvent.clientX || e.clientY !== lastEvent.clientY) { return; } if (media.mode < 2 && noFit.real) { if (media.mode === -1) { media.resize(0); } else if (winW / winH < media.naturalWidth / media.naturalHeight || winH === media.offsetHeight && winW > media.offsetWidth) { media.resize(2); } else { media.resize(3); } } else if (media.mode === 1 || noFit.cur) { if (media.naturalWidth === media.clientWidth && media.naturalHeight === media.clientHeight) { return; } x = e.offsetX || e.layerX || 0; y = e.offsetY || e.layerY || 0; if (media.scale) { if (media.scale.h === -1) { x = media.clientWidth - x; } if (media.scale.v === -1) { y = media.clientHeight - y; } } x = x * media.naturalWidth / media.clientWidth - winW / 2; y = y * media.naturalHeight / media.clientHeight - winH / 2; media.resize(0); win.scrollTo(x, y); } else { media.resize(1); } }, false); doc.addEventListener("keydown", function(e) { if (stopScroll) { stopScroll(); } if (shortcut.isModifier(e)) { return; } var key = shortcut.key(e); if (e.ctrlKey || (fZoom && key !== "Esc")) { return; } if (key === "+" || key === "-") { e.wheelDelta = key === "+" ? 1 : -1; media.zoomToCenter(e); return false; } var x, y, z; switch (key) { case "Esc": media.reset(); break; case "PgUp": x = e.shiftKey ? -winW / 2 : 0; y = e.shiftKey ? 0 : -winH / 2; break; case "PgDn": x = e.shiftKey ? winW / 2 : 0; y = e.shiftKey ? 0 : winH / 2; break; case "End": x = e.shiftKey ? root.scrollWidth : win.pageXOffset; y = e.shiftKey ? win.pageYOffset : root.scrollHeight; z = true; break; case "Home": x = e.shiftKey ? 0 : win.pageXOffset; y = e.shiftKey ? win.pageYOffset : 0; z = true; break; default: x = true; } if (x !== true) { if (x !== void 0) { win[z ? "scrollTo" : "scrollBy"](x, y); e.preventDefault(); } return; } switch (key) { case cfg.key_mOrig: media.resize(0); break; case cfg.key_mFit: media.resize(1); break; case cfg.key_mFitW: media.resize(2); break; case cfg.key_mFitH: media.resize(3); break; case cfg.key_cycle: media.cycle(e.shiftKey); break; case cfg.key_rotL: media.rotate(false, e.shiftKey); break; case cfg.key_rotR: media.rotate(true, e.shiftKey); break; case cfg.key_flipH: transform.flip(media, 0); break; case cfg.key_flipV: transform.flip(media, 1); break; default: x = true; } if (x !== true) { pdsp(e); } }, false); media.cycle = function(back) { var n_s = (this.mode === 1 ? 0 : this.mode) - (back ? 1 : -1); if (n_s === 1) { n_s = n_s - (back ? 1 : -1); } else if (n_s < 0) { n_s = 3; } else if (n_s > 3) { n_s = 0; } this.resize(n_s); }; media.reset = function() { if (fZoom) { doc.removeEventListener("mousemove", draw_mask, false); doc.body.removeChild(media.mask); fZoom = null; cancelAction = false; return; } if (doc.readyState !== "complete") { return; } var filters = doc.body.querySelector("#menu li.filters > form"); if (filters) { this.style.filter = this.style.webkitFilter = ""; media.filters = {}; filters.reset(); } delete this.curdeg; delete this.scale; this.style[browser["transform"]] = this.style.width = this.style.height = ""; this.resize(0); }; media.rotate = function(deg, fine) { var rot; if (!this.curdeg) { this.curdeg = 0; } if (deg) { this.curdeg += (fine ? 10 : 90); } else { this.curdeg -= (fine ? 10 : 90); } win.status = this.curdeg + "°"; rot = "rotate(" + this.curdeg + "deg)"; if (this.scale) { rot += " scale(" + this.scale.h + ", " + this.scale.v + ")"; } this.style[browser["transform"]] = rot; this.setPos(); }; media.mode = cfg.mode; media.calcFit(); progress = []; if (cfg.minUpscale) { if (media.naturalWidth >= winW * cfg.minUpscale / 100) { progress[0] = 1; } if (media.naturalHeight >= winH * cfg.minUpscale / 100) { progress[1] = 1; } } if (media.mode === 4) { media.mode = media.naturalWidth / media.naturalHeight > winW / winH ? 3 : 2; } else if ((media.mode === 1 || (media.mode === 0 && noFit.real)) && progress.length) { media.mode = media.naturalWidth / media.naturalHeight > winW / winH ? 2 : 3; } if ((media.mode === 2 && media.naturalWidth < winW && !progress[0]) || (media.mode === 3 && media.naturalHeight < winH && !progress[1])) { media.mode = 0; } progress = null; media.resize(media.mode); }; root = doc.documentElement; if (media_type() !== "video") { media = doc.createElement("img"); } media.onerror = function() { clearInterval(progress); root.classList.add("error"); }; media.src = win.location.href; if (/^data:/.test(media.src)) { media.alt = media.nodeName + " (data:)"; if (!cfg.imgInfo) { doc.title = media.alt; } } else { media.alt = media.src.replace(/#.*/, "").match(/(?:[^\/]+)?$/)[0] || media.nodeName; try { // some Unicode characters caused problems media.alt = decodeURIComponent(media.alt); } catch (ex) {} } if (media.naturalWidth) { init_params = null; // Firefox and Safari won't position the image without setTimeout setTimeout(init, 0xf); } else { if (browser.opera || browser.firefox) { doc.body.textContent = ""; progress = doc.body.appendChild(doc.createElement("h2")); progress.textContent = media.alt; progress.addEventListener("click", function() { doc.body.replaceChild(media, this); }, false); } init_params = {loop: 0, wait: 150, maxLoop: 900}; progress = setInterval(init, init_params.wait); } }; (function() { if (browser.opera || browser.firefox) { if (media_type()) { Port.listen(function(e) { Port.listen(null); init(window, document, e); }); Port.send({"cmd": "hello"}); } else { init = null; } } else { Port.listen(function(e) { Port.listen(null); if (!media_type()) { init = null; return; } init(window, document, e); }); Port.send({"cmd": "hello"}); } })(); "use strict"; var app, cfg, Tabs, Port; app = { "name": /*~APP_NAME~*/"Viewhance", "version": /*~APP_VERSION~*/"0.9.1" }; app.runtime = external.mxGetRuntime(); cfg = { storage: app.runtime.storage, getItem: function(k, fn) { fn(this.storage.getConfig(k)); }, setItem: function(k, v) { return this.storage.setConfig(k, v); } }; Tabs = new mx.browser.tabs; Tabs.baseURI = app.runtime.getPrivateUrl(); Tabs.rgxNoLocal = /^[^:]{2,20}:/; Tabs.getSelected = function(cb) { cb(this.getCurrentTab()); }; Tabs.create = function(p) { if (!this.rgxNoLocal.test(p["url"])) { p["url"] = this.baseURI + p["url"]; } this.newTab({ "url": p["url"], "activate": p["active"] }); }; Port = { parse_msg: function(msg) { var id = msg.mxPort.id; return { msg: msg.message, origin: msg.mxPort.url, postMessage: function(msg) { app.runtime.post(id, msg); } }; }, listen: function(func, name) { app.runtime.listen(name || "service", func); } }; Port.listen(function(e) { e = Port.parse_msg(e); if (e.msg.cmd === "function") { window[e.msg.fn_name](); } }, "mx"); /* global cfg, Port */ "use strict"; cfg.getItem("cfg", function(v) { var def_prefs = new XMLHttpRequest, need_update = false; def_prefs.overrideMimeType("application/json;charset=utf-8"); def_prefs.open("GET", "defaults.jsn", false); def_prefs.send(null); def_prefs = JSON.parse(def_prefs.responseText); v = v ? JSON.parse(v) : {}; for (var p in def_prefs) { if (v[p] === void 0) { v[p] = def_prefs[p]; need_update = true; } } if (need_update) { cfg.setItem("cfg", JSON.stringify(v)); } }); function onMessage(ev, origin, postMessage) { var e = Port.parse_msg(ev, origin, postMessage), msg = e.msg; if (!msg.cmd) { return; } switch (msg.cmd) { case "hello": cfg.getItem("cfg", function(v) { e.postMessage({ "cmd": "hello", "prefs": v }); }); break; case "save": cfg.setItem("cfg", JSON.stringify(msg.prefs)); break; case "open": if (!Array.isArray(msg.url)) { msg.url = [msg.url]; } Tabs.getSelected(function(tab) { var create_params = {}; if (tab["incognito"]) { create_params["incognito"] = true; } for (var i = 0; i < msg.url.length; ++i) { create_params["url"] = msg.url[i]; create_params["active"] = !msg.nf; Tabs.create(create_params); } }); break; case "load_frames.js": msg = new XMLHttpRequest; msg.open("GET", "js/frames.js", false); msg.send(null); e.postMessage({"frames.js": msg.responseText}); break; } return true; // Chrome } Port.listen(onMessage);"use strict"; function $(id) { return document.getElementById(id); } var crc32 = (function() { var crc_table = [], n = 0, c, k; for (; n < 256; ++n) { for (c = n, k = 0; k < 8; ++k) { c = (c & 1) ? 0xedb88320 ^ (c >>> 1) : c >>> 1; } crc_table[n] = c; } return function(s) { var crc = -1, n = 0, l = s.length; while (n < l) { crc = crc_table[(crc ^ s.charCodeAt(n++)) & 0xff] ^ (crc >>> 8); } return crc ^ -1; }; })(); function BinaryTools(data) { this.pos = 0; this.data = data; this.length = data.length; this.littleEndian = false; this.zeropad = "00000000"; this.readByte = function(pos) { return this.data.charCodeAt( pos === void 0 || pos < 0 ? this.pos++ : pos ) & 0xff; }; this.readString = function(length, pos) { if (pos === void 0 || pos < 0) { pos = this.pos; this.pos += length || 0; } return this.data.substr(pos, length || 0); }; this.readBits = function(length, pos) { var curbyte, bitarray = [], i = 0; while (i++ < length) { curbyte = this.readByte(pos).toString(2); bitarray.push( this.zeropad.substr(0, this.zeropad.length - curbyte.length) + curbyte ); } return (this.littleEndian ? bitarray.reverse() : bitarray).join(""); }; this.readInt = function(bytes, pos) { if (bytes < 1) { return null; } if (pos === void 0 || pos < 0) { pos = this.pos; this.pos += bytes; } var i, integer = 0; if (this.littleEndian) { i = bytes - 1; while (i >= 0) { integer += this.readByte(pos + i) << (i-- * 8); } } else { i = 0; while (i < bytes) { integer += this.readByte(pos + i++) << ((bytes - i) * 8); } } return integer >>> 0; }; this.intToBytes = function(integer, i) { if (!i) { i = 4; } var bytes = []; while (i--) { bytes.push((integer >> (i * 8)) & 0xff); } return String.fromCharCode.apply( null, this.littleEndian ? bytes.reverse() : bytes ); }; } if (!win.opera) { var b64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; win.btoa = function(b64str) { var c1, c2, pos = 0, res = "", mod = b64str.length % 3, l = b64str.length - mod; while (pos < l) { c1 = b64str.charCodeAt(pos++) & 0xff; c2 = b64str.charCodeAt(pos++) & 0xff; res += b64chars[c1 >> 2]; res += b64chars[((c1 & 3) << 4) | (c2 >> 4)]; c1 = b64str.charCodeAt(pos++) & 0xff; res += b64chars[((c2 & 0x0f) << 2) | (c1 >> 6)]; res += b64chars[c1 & 0x3f]; } if (mod) { c1 = b64str.charCodeAt(pos++) & 0xff; res += b64chars[c1 >> 2]; if (mod === 1) { res += b64chars[(c1 & 3) << 4]; res += "=="; } else { c2 = b64str.charCodeAt(pos++) & 0xff; res += b64chars[((c1 & 3) << 4) | (c2 >> 4)]; res += b64chars[(c2 & 0x0f) << 2]; res += "="; } } return res; }; } var maxSize = 20 * 1024 * 1024; var xhr = new win.XMLHttpRequest; xhr.overrideMimeType("text/plain; charset=x-user-defined"); xhr.onreadystatechange = function() { if (this.readyState === 2) { var length = this.getResponseHeader("Content-Length"); if (length && length > maxSize) { this.abort(); error_handler("Image is too large..."); return; } } if (this.responseText) { if (!this.img_type) { // PNG or GIF or WEBP signature img_head = /^(?:\x89(PNG)\r\n\x1a\n|(GIF)8[79]a|RIFF....(WEBP)VP8X)/; this.img_type = this.responseText.match(img_head); // seems like in some cases a character encoding is applied anyway, // however it's enough to check the signature only if (!this.img_type && (this.responseText[1] === "P" && (chunkSize = 8) || this.responseText[0] === "G" && (chunkSize = 6) || this.responseText[0] === "R" && (chunkSize = 16))) { this.img_type = this.responseText.slice(0, chunkSize).split(""); for (i = 0; i < this.img_type.length; ++i) { this.img_type[i] = this.img_type[i].charCodeAt(0) & 0xff; } this.img_type = String.fromCharCode.apply(null, this.img_type).match(img_head); } if (this.img_type) { this.img_type = this.img_type[2] || this.img_type[1] || this.img_type[3]; } else { this.abort(); this.onprogress = null; error_handler("Not animated..."); return; } } if (this.readyState !== 4/* || this.status !== 200*/) { return; } if (this.responseText.length > maxSize) { this.onprogress = null; error_handler("Image is too large..."); return; } var i, IHDR, chunkType, chunkSize, frames = [], bin = new BinaryTools(this.responseText), animation = {}, img_head = ""; if (this.img_type === "PNG") { // https://wiki.mozilla.org/APNG_Specification // skip signature bin.pos = 8; while (bin.pos < bin.length) { // read the chunk type chunkType = bin.readString(4, bin.pos + 4); // console.log(i, chunkType, bin.readInt(4, bin.pos)); if (chunkType === "IHDR") { // skip chunk length and name bin.pos += 8; animation.width = bin.readInt(4); animation.height = bin.readInt(4); IHDR = bin.readString(5); // skip crc bin.pos += 4; } else if (!frames.length && chunkType === "acTL") { animation.num_frames = bin.readInt(4, bin.pos + 8); animation.num_plays = bin.readInt(4, bin.pos + 12); bin.pos += 20; } else if (chunkType === "fcTL") { bin.pos += 12; i = frames.length; frames.push({ width: bin.readInt(4), height: bin.readInt(4), x_offset: bin.readInt(4), y_offset: bin.readInt(4), delay: 1000 * bin.readInt(2) / (bin.readInt(2) || 100), dispose_op: bin.readInt(1), blend_op: bin.readInt(1), data: "IDAT" }); if (i === 0 && frames[i].dispose_op === 2) { frames[i].dispose_op = 1; } // skip crc bin.pos += 4; // console.log(frames[frames.length - 1]); } else if (chunkType === "IDAT" || chunkType === "fdAT") { if (!animation.num_frames || animation.num_frames < 2) { break; } // IDAT without acTL chunk should be ignored else if (chunkType === "IDAT" && !frames.length) { console.log("PNG: ignoring IDAT from animation..."); bin.pos += bin.readInt(4, bin.pos) + 12; continue; } i = (chunkType === "fdAT" ? 4 : 0); // read the length, also skip the sequence number from fdAT chunkSize = bin.readInt(4) - i; // skip chunk type, also the sequence number // in case of the fdAT chunk type bin.pos += 4 + i; frames[frames.length - 1].data += bin.readString(chunkSize); // skip crc bin.pos += 4; } else if (!frames.length) { // read the full chunk (length + chunk type + chunkdate + crc) img_head += bin.readString(bin.readInt(4, bin.pos) + 12); } else { bin.pos += bin.readInt(4, bin.pos) + 12; } } } else if (this.img_type === "GIF") { // http://www.w3.org/Graphics/GIF/spec-gif89a.txt bin.littleEndian = true; bin.skipSubBlock = function() { do { this.pos += this.readInt(1, this.pos) + 1; if (bin.pos >= bin.length) { throw this.img_type + ": end reached..."; } } while (this.readInt(1, this.pos) !== 0x00); ++this.pos; }; // skip signature bin.pos = 6; // Logical Screen Descriptor animation.width = bin.readInt(2); animation.height = bin.readInt(2); bin.packed = bin.readBits(1, 10); bin.packed = (bin.packed[0] === "1" ? 3 * 1 << (parseInt(bin.packed.slice(-3), 2) + 1) : 0); img_head += bin.readString(3 + bin.packed); i = 0; // frame index while (bin.pos < bin.length) { chunkType = bin.readString(1); // console.log("sentinel: " + chunkType); // Extension block (0x21, an exclamation point '!') if (chunkType === "!") { // optional chunkType = bin.readInt(1); // console.log("ext_label: " + chunkType.toString(16)); // Plain Text Extension if (chunkType === 0x01) { // no support for this, so skip bin.pos += 13; bin.skipSubBlock(); } // Graphics Control Extension else if (chunkType === 0xf9) { bin.packed = bin.readBits(1, bin.pos + 1); frames.push({ delay: (10 * bin.readInt(2, bin.pos + 2)) || 100, // -1 in order to match PNG's indexes, also treat 0 as 1 dispose_op: Math.max(0, parseInt(bin.packed.slice(3, -2), 2) - 1), data: bin.readString(4, bin.pos - 2) + // sentinel + ext_label bin.intToBytes(0, 2) + // with zero delay // transparent color index + block terminator bin.readString(2, bin.pos + 4) }); bin.pos += 6; } // Comment Block Extension else if (chunkType === 0xfe) { bin.skipSubBlock(); } // Application Block Extension else if (chunkType === 0xff) { bin.pos += 12; bin.skipSubBlock(); } // try to skip anything else else { bin.pos = bin.data.indexOf("\x00", bin.pos); if (bin.pos === -1) { bin.pos = bin.length; } else { ++bin.pos; } } } // Image (0x2C, a comma ',') else if (chunkType === ",") { if (!frames[i]) { frames.push({ delay: 100, dispose_op: 0, // sentinel, ext_label, block size, packed field, delay, // transparent color index, terminator data: "\x21\xf9\x04\x00\x00\x00\x00\x00" }); } frames[i].x_offset = bin.readInt(2); frames[i].y_offset = bin.readInt(2); bin._pos = bin.pos; frames[i].width = bin.readInt(2); frames[i].height = bin.readInt(2); bin.packed = bin.readBits(1); bin.pos += (bin.packed[0] === "1" ? 3 * (1 << (parseInt(bin.packed.slice(-3), 2) + 1)) : 0); ++bin.pos; // LZW minimum code size bin.skipSubBlock(); frames[i]._data = [bin.pos - bin._pos, bin._pos]; ++i; } // Trailer (0x3B, a semi-colon ';') or something else else { break; } } } else if (this.img_type === "WEBP") { // https://developers.google.com/speed/webp/docs/riff_container bin.littleEndian = true; bin.pos = 20; // WebP file header + VP8X and its chunk size bin.packed = bin.readBits(1); // VP8X flags if (bin.packed[6] === "0") { // animation flag this.onprogress = null; error_handler(this.img_type + ": not animated..."); return; } bin.pos += 3; // reserved 24 bits animation.width = bin.readInt(3) + 1; // canvas width animation.height = bin.readInt(3) + 1; // canvas height while (bin.pos < bin.length) { chunkType = bin.readString(4); if (chunkType === "ANIM") { // skip Background Color: 32 bits + Loop Count: 16 bits bin.pos += 4 + bin.readInt(4); // chunk size + chunk payload animation.ANIM = true; } else if (chunkType === "ANMF") { if (!animation.ANIM) { this.onprogress = null; error_handler(this.img_type + ": ANIM chunk not found!"); return; } i = frames.length; // size of the Frame Data chunkSize = bin.readInt(4); // if the chunk size is odd, then a padding byte is added chunkSize += chunkSize & 1; // remove the size of the ANMF properties listed below chunkSize -= 16; frames.push({ x_offset: bin.readInt(3) * 2, y_offset: bin.readInt(3) * 2, width: bin.readInt(3) + 1, height: bin.readInt(3) + 1, delay: bin.readInt(3), dispose_op: bin.readInt(1) & 1, data: "" }); bin._pos = bin.pos + chunkSize; while (bin.pos < bin._pos) { chunkType = bin.readString(4); chunkSize = bin.readInt(4); chunkSize += chunkSize & 1; // should exist before the 'VP8 ' chunk only /*if (chunkType === "ALPH") { if (bin.readString(4, bin.pos + chunkSize) === "VP8 ") { // the whole ALPH chunk frames[i].data += bin.readString(8, bin.pos - 8) + bin.readString(chunkSize); } else { bin.pos += chunkSize; } } else */if (chunkType === "VP8 " || chunkType === "VP8L") { // chunk type + chunk size + VP8? bitstream; frames[i].data += bin.readString(8, bin.pos - 8) + bin.readString(chunkSize); } else { bin.pos += chunkSize; } } // frames[i].data += bin.readString(chunkSize); } else { // skip chunk bin.pos += 4 + bin.readInt(4); } } } if (frames.length > 1) { var generateImageSRC, img = new Image, canvas = document.createElement("canvas"), ctx = canvas.getContext("2d"), speed, current_frame; canvas.width = animation.width; canvas.height = animation.height; if (this.img_type === "PNG") { chunkSize = bin.intToBytes(13); var img_end = bin.readString(12, bin.length - 12); generateImageSRC = function() { var frm = frames[frames.idx], IHDR_ = "IHDR" + bin.intToBytes(frm.width) + bin.intToBytes(frm.height) + IHDR; IHDR_ += bin.intToBytes(crc32(IHDR_)); return "data:image/png;base64," + win.btoa( "\x89PNG\r\n\x1a\n" + chunkSize + IHDR_ + img_head + bin.intToBytes(frm.data.length - 4) + frm.data + bin.intToBytes(crc32(frm.data)) + img_end ); }; } else if (this.img_type === "GIF") { chunkSize = bin.intToBytes(0, 2); chunkSize = "," + chunkSize + chunkSize; generateImageSRC = function() { var frm = frames[frames.idx]; return "data:image/gif;base64," + win.btoa( "GIF89a" + bin.intToBytes(frm.width, 2) + bin.intToBytes(frm.height, 2) + img_head + frm.data + chunkSize + bin.readString(frm._data[0], frm._data[1]) + ";" ); }; } else if (this.img_type === "WEBP") { generateImageSRC = function() { var frm = frames[frames.idx]; return "data:image/webp;base64," + win.btoa( "RIFF" + bin.intToBytes(frm.data.length + 4) + "WEBP" + frm.data ); }; } img.onerror = function() { wrap.innerHTML = xhr.img_type + ": frame (" + (frames.idx + 1) + ") couldn't be parsed!
"; wrap.appendChild(this); }; img.onload = function() { if (draw_full_frame) { var frame = frames[frames.idx]; var prev = frames[frames.idx - 1]; if (prev) { if (prev.dispose_op === 1) { ctx.clearRect( prev.x_offset, prev.y_offset, prev.width, prev.height ); } else if (prev.dispose_op === 2) { ctx.putImageData( this.prev_dispose_data, prev.x_offset, prev.y_offset ); } } if (frame.dispose_op === 2) { this.prev_dispose_data = ctx.getImageData( frame.x_offset, frame.y_offset, frame.width, frame.height ); } if (frame.blend_op === 0) { // only for PNG ctx.clearRect( frame.x_offset, frame.y_offset, frame.width, frame.height ); } ctx.drawImage( this, frame.x_offset, frame.y_offset ); } var c = canvas.cloneNode(false); if (draw_full_frame) { c.getContext("2d").putImageData( ctx.getImageData(0, 0, canvas.width, canvas.height), 0, 0 ); } else { c.width = this.width; c.height = this.height; c.getContext("2d").drawImage(this, 0, 0); } wrap.appendChild(c); if (c.previousElementSibling) { c.previousElementSibling.style.display = ""; ++current_frame.value; } c.style.display = "inline-block"; this.removeAttribute("src"); ++frames.idx; processNextFrame(); }; var processNextFrame = function() { if (frames.idx < frames.length) { img.src = generateImageSRC(); frames[frames.idx].data = null; } else { img.onload = null; img = null; done(); } }; var done = function() { wrap.current = 0; wrap.children[wrap.children.length - 1].style.display = ""; wrap.children[wrap.current].style.display = "inline-block"; current_frame.value = 1; current_frame.oninput = function() { if (parseFloat(speed.value, 10) !== 0) { wrap.stop(); } if (wrap.classList.contains("showall")) { wrap.onmouseup({button: 0}); } wrap.step(null); }; speed.oninput = function() { if (parseFloat(speed.value, 10) === 0) { wrap.stop(); wrap.addEventListener(browser["wheel"], wrap.wheeler, false); } else { wrap.classList.remove("showall"); wrap.removeEventListener(browser["wheel"], wrap.wheeler, false); wrap.animate(); } }; wrap.wheeler = function(e) { this.step((-e.wheelDelta || e.deltaY || e.detail) > 0); e.preventDefault(); }; wrap.addEventListener(browser["wheel"], wrap.wheeler, false); wrap.onmouseup = function(e) { if (e.button !== 0) { return; } if (e.ctrlKey) { if (e.target.toDataURL && speed.value < 1) { var img = new Image; img.src = e.target.toDataURL(); this.replaceChild(img, e.target); wrap.step(null); } return; } this.stop(); if (this.classList.contains("showall")) { if (e.target && e.target.parentNode === wrap) { current_frame.value = [].indexOf.call(wrap.childNodes, e.target) + 1; wrap.step(null); } this.addEventListener(browser["wheel"], this.wheeler, false); } else { this.removeEventListener(browser["wheel"], this.wheeler, false); } this.classList.toggle("showall"); }; wrap.animate = function() { clearTimeout(wrap.timeout); wrap.step(parseFloat(speed.value, 10) < 0); if (parseFloat(speed.value, 10)) { wrap.timeout = setTimeout( wrap.animate, frames[wrap.current].delay / Math.abs(parseFloat(speed.value, 10) || 0) ); } }; wrap.stop = function() { clearTimeout(this.timeout); speed.value = 0; }; wrap.step = function(backward) { wrap.children[wrap.current].style.display = ""; if (backward === null) { wrap.current = Math.max( 1, Math.min(parseInt(current_frame.value, 10) || 1, current_frame.max) ) - 1; } else { if (backward) { --wrap.current; } else { ++wrap.current; } } if (wrap.current >= wrap.children.length) { wrap.current = 0; } else if (wrap.current < 0) { wrap.current = wrap.children.length - 1; } wrap.children[wrap.current].style.display = "inline-block"; current_frame.value = wrap.current + 1; current_frame.nextElementSibling.value = current_frame.value + " / " + frames.length; }; }; document.body.className = "frames"; document.body.innerHTML = '' + ' x '+ ' ' + ' 1 / ' + frames.length + '' + '
'; var wrap = $("frames"); speed = $("speed"); current_frame = $("current_frame"); current_frame.max = frames.length; frames.idx = 0; processNextFrame(); } else { this.onprogress = null; error_handler(this.img_type + ": not animated..."); } } }; xhr.onerror = function() { this.onprogress = null; error_handler(_("LOAD_FAILED")); }; xhr.open("GET", win.location.href, true); xhr.send(null);/* global browser, app, Port, _, cfg */ "use strict"; // Older Gecko versions open a pop-up window instead of a content tab if (!location.hash && app.platform_version < 7) { Port.send({ "cmd": "open", "url": "options.html#general" }); window.close(); } var def_prefs, input_changes = {}, $ = function(id) { return document.getElementById(id); }, processLNG = function(nodes) { var i = nodes.length, els, l, args, string; while (i--) { if (nodes[i].lng_loaded) { continue; } els = nodes[i].querySelectorAll("[data-lng]"); l = els.length; while (l--) { string = _(els[l].dataset["lng"]); if (els[l].dataset["lngargs"]) { args = els[l].dataset["lngargs"].split(" "); args.idx = args.length; while (args.idx--) { string = string.replace( "%" + args[args.idx], els[l].dataset[args[args.idx]] || args[args.idx] ); } } els[l][els[l].dataset["lngattr"] || "innerHTML"] = string; } nodes[i].lng_loaded = true; } }; function color_trans(node, color, time) { clearTimeout(node.col_trans_timer); if (color === null) { node.style.color = ""; delete node.col_trans_timer; return; } node.style.color = color; node.col_trans_timer = setTimeout(function() { color_trans(node, null); }, time || 2000); } function fill_output(e) { e = e.target || e; var op = e.previousElementSibling; op.value = op.dataset["as_percent"] ? parseInt(e.value * 100, 10) : e.value; op.defaultValue = def_prefs[e.name]; } function color_text_input(e) { e = e.type === "input" ? this : e; var v = /^#([\da-f]{3}){1,2}/i.test(e.value) ? e.value : "#ffffff"; e.previousElementSibling.value = v.length === 4 ? "#" + v[1] + v[1] + v[2] + v[2] + v[3] + v[3]: v; } function color_change() { this.nextElementSibling.value = this.value; } function setDefault(query) { if (!query) { return; } [].forEach.call(typeof query === "string" ? document.querySelectorAll(query) : [query], function(el) { if (el.type === "checkbox") { el.checked = el.defaultChecked; } else if (/^SELECT/i.test(el.type)) { for (var i = el.length; i--;) { if (el[i].hasAttribute("selected")) { el.selectedIndex = i; break; } } } else { el.value = el.defaultValue; if (el.type === "range") { fill_output(el); } } }); } function load(prefs) { if (!prefs) { cfg.getItem("cfg", function(value) { load(value && JSON.parse(value) || {}); }); return; } var fields = document.querySelectorAll("[name]"), i = fields.length, m, fld, fld_type, pref; def_prefs = new XMLHttpRequest; def_prefs.overrideMimeType("application/json;charset=utf-8"); def_prefs.open("GET", "defaults.jsn", false); def_prefs.send(null); def_prefs = JSON.parse(def_prefs.responseText); while (i--) { fld = fields[i]; pref = fld.name; if (fld.disabled || fld.readOnly || def_prefs[pref] === void 0) { continue; } fld_type = fld.getAttribute("type") || "text"; if (fld.type !== fld_type) { fld_type = fld.type; } if (fld_type === "checkbox") { fld.checked = fld.defChecked = !!(prefs[pref] === void 0 ? def_prefs : prefs)[pref]; fld.defaultChecked = def_prefs[pref]; } else { if (fld_type.slice(0, 6) === "select") { [].some.call(fld, function(el) { if (el.value == def_prefs[pref]) { el.defaultSelected = true; return true; } }); } else { fld.defaultValue = def_prefs[pref]; } fld.value = fld.defValue = (prefs[pref] === void 0 ? def_prefs : prefs)[pref]; if (fld_type === "range") { m = fld.previousElementSibling; if (m && m.nodeName === "OUTPUT") { fill_output(fld); } m = m.previousElementSibling; if (m && m.getAttribute("type") === "color") { m.style.opacity = fld.value; } fld.addEventListener("change", fill_output, false); } else if (fld_type === "text" && fld.previousElementSibling && fld.previousElementSibling.getAttribute("type") === "color") { fld.addEventListener("input", color_text_input, false); color_text_input(fld); fld.previousElementSibling.addEventListener("change", color_change, false); } } } } function save() { var i, m, fld, fld_type, fields = document.querySelectorAll("[name]"), pref, prefs = {}; for (i = 0; i < fields.length; ++i) { fld = fields[i]; pref = fld.name; if (fld.disabled || fld.readOnly || def_prefs[pref] === void 0) { continue; } fld_type = fld.getAttribute("type"); if (fld_type === "checkbox") { prefs[pref] = fld.checked; } else if (fld_type === "range" || fld_type === "number" || fld.classList.contains("number")) { prefs[pref] = (fld.min ? Math.max(fld.min, Math.min(fld.max, parseFloat(fld.value))) : parseFloat(fld.value)); if (typeof prefs[pref] !== "number") { prefs[pref] = parseFloat(fld.defaultValue); } fld.value = prefs[pref]; } else { prefs[pref] = fld.value; } if (prefs[pref] === void 0) { prefs[pref] = def_prefs[pref]; } } Port.send({"cmd": "save", "prefs": prefs}); } window.onhashchange = function() { var section, args = [], menu = $("nav_menu"), old = menu && menu.active && menu.active.hash.slice(1) || "general", hash = location.hash.slice(1) || "general"; if (hash.indexOf("/") > -1) { args = hash.split("/"); hash = args.shift(); } section = $(hash + "_sec"); if (!section.lng_loaded) { if (hash === "info") { if (args[0]) { $(args[0] === "0" ? "app_installed" : "app_updated").style.display = "block"; } if (!_.locales) { _.locales = new XMLHttpRequest; _.locales.overrideMimeType("application/json;charset=utf-8"); _.locales.open("GET", "./locales.jsn", false); _.locales.send(null); _.locales = _.locales.responseText ? JSON.parse(_.locales.responseText) : []; } var locales = ""; var lng_map = function(el) { el.name = ((el.name || el.fullname || "") + (el.fullname && el.name ? " (" + el.fullname + ")" : "")) || el.email || el.web; return el.email || el.web ? '' + el.name + "" : el.name; }; for (var alpha2 in _.locales) { if (alpha2 === "_") { continue; } locales += '' + "" + alpha2 + ", " + _.locales[alpha2].name + "" + "" + (_.locales[alpha2].translators ? _.locales[alpha2].translators.map(lng_map).join(", ") : "anonymous") + ""; } $("locales_table").innerHTML += locales; } } if (old !== hash && (old = $(old + "_sec"))) { old.style.display = "none"; } if (section) { processLNG([section]); section.style.display = "block"; } if (menu.active) { menu.active.classList.remove("active"); } if (menu.active = menu.querySelector('a[href="#' + hash + '"]')) { menu.active.classList.add("active"); } }; window.addEventListener("load", function() { var tmp = $("app_version"); tmp.textContent = app.name + " v" + app.version; ["opera", "firefox", "chrome", "safari", "maxthon"].some(function(el) { if (browser[el]) { document.body.classList.add(el); return true; } return false; }); var menu = $("nav_menu"); processLNG([menu, $("right_panel").firstElementChild]); load(); tmp = document.body.querySelector('.color_helper>input[type="text"]'); if (tmp) { tmp.addEventListener("input", color_text_input, false); color_text_input(tmp); tmp.previousElementSibling.addEventListener("change", color_change, false); } menu.onclick = function(e) { if (e.target.hash) { e.preventDefault(); location.hash = e.target.hash; } }; window.onhashchange(); document.body.style.display = "block"; document.forms[0].addEventListener("keydown", function(e) { e.stopPropagation(); if (e.which === 13) { e.target.form_saved = true; } if (e.repeat || !e.target.name || e.target.name.indexOf("key_") !== 0 || e.ctrlKey || e.altKey || e.metaKey || e.which < 47) { return; } e.preventDefault(); color_trans(e.target, null); var keys = { 96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7", 104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111: "/", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", 221: "]", 222: "'", 112: "F1", 113: "F2", 114: "F3", 115: "F4", 116: "F5", 117: "F6", 118: "F7", 119: "F8", 120: "F9", 121: "F10", 122: "F11", 123: "F12" }, key = keys[e.which] || String.fromCharCode(e.which).toUpperCase(); keys = document.body.querySelectorAll('input[name^="key_"]'); for (var i = 0; i < keys.length; ++i) { if (keys[i].value.toUpperCase() === key) { if (e.target !== keys[i]) { color_trans(e.target, "red"); } return false; } } e.target.value = key; document.forms[0].onchange(e); }, false); document.forms[0].addEventListener("contextmenu", function(e) { e.stopPropagation(); var t = e.target; if (t.classList.contains("checkbox")) { t = t.previousElementSibling; } if (!t.name) { return; } if (e.ctrlKey) { e.preventDefault(); setDefault(t); document.forms[0].onchange({target: t}); } }, false); // leave it callable document.forms[0].onchange = function(e) { if (e.stopPropagation) { e.stopPropagation(); } var defval, t = e.target; if (t.form_saved) { delete t.form_saved; } else if (t.parentNode.dataset["form"] || t.parentNode.parentNode.dataset["form"]) { defval = "default"; } else if (t.name.indexOf("_") > 0) { defval = "def"; } if (!defval) { return; } if ((t.type === "checkbox" && t[defval + "Checked"] !== t.checked) || (t.type !== "checkbox" && t[defval + "Value"] != t.value)) { // != is not a mistake input_changes[t.name] = true; } else { delete input_changes[t.name]; } $("save_button").style.color = Object.keys(input_changes).length ? "#e03c00" : ""; }; var reset_button = $("reset_button"); reset_button.reset = function() { delete reset_button.pending; reset_button.style.color = "#000"; }; reset_button.addEventListener("click", function(e) { if (reset_button.pending) { input_changes["form_reset"] = true; clearTimeout(reset_button.pending); delete this.pending; reset_button.style.color = ""; reset_button.nextElementSibling.style.color = "#e03c00"; if (e.ctrlKey) { e.preventDefault(); e = (location.hash || "#general") + "_sec "; setDefault(e + "input," + e + "select," + e + "textarea"); reset_button.style.color = "lime"; } else { reset_button.style.color = "green"; } reset_button.pending = setTimeout(reset_button.reset, 2000); return; } reset_button.style.color = "orange"; reset_button.pending = setTimeout(reset_button.reset, 2000); e.preventDefault(); }, false); $("save_button").addEventListener("click", function(e) { e.preventDefault(); save(); color_trans(this, "green"); }, false); [].forEach.call(document.body.querySelectorAll(".action_buttons") || [], function(el) { el.onmousedown = function(e) { e.preventDefault(); }; }); }, false);; @language cs, Czech (čeština) (84.91%) ; @translators jaramat (Jaroslav Matura) [lang] APP_DESCRIPTION=Rozšiřuje funkčnost v oblasti obrázků vašeho prohlížeče. NAV_GENERAL=Obecné NAV_INFO=O doplňku SHORTCUTS=Klávesové zkratky PH_CLICKFORSAMPLE=kliknutím zobrazíte příklady... DISABLED=zakázáno BUTTON_RESET=Výchozí nastavení BUTTON_SAVE=Uložit VW_MODE=Výchozí přiblížení VW_MODE_NATURL=původní velikost VW_MODE_AUTOFIT=přizpůsobit automaticky VW_MODE_FITWIDTH=roztáhnout na šířku VW_MODE_FITHEIGHT=roztáhnout na výšku VW_MODE_BESTFIT=roztáhnout automaticky VW_MINUPSCALE=Zvětšit malé obrázky VW_MINUPSCALE_TIP="Ve výchozím nastavení nebudou malé obrázky automaticky zvětšovány. Přeje-li si to, použijte tuto volbu.\nObrázky, které jsou větší než daný počet procent šířky nebo výšky okna prohlížeče (záleží na předchozí volbě) budou automaticky roztaženy." VW_IMGINFO=Vlastnosti obrázku VW_FAVICON=Vlastní ikona VW_FAVICON_TIP="Toto vám umožňuje nastavit vlastní ikonu, která se zobrazí vedle názvu panelu v prohlížeči.\nChcete-li jako ikonu použít obrázek samotný, použijte proměnnou %url." VW_WHEELZOOM=Povolit použití kolečka myši jako lupy VW_LPDELAY=Prodleva dlouhého stisku VW_LPLEFT=Akce při dlouhém stisku levého tlačítka myši VW_LPRIGHT=Akce při dlouhém stisku pravého tlačítka myši VW_LPA_FITWH=roztáhnout na výšku/šířku VW_SC_CYCLE=Přepínat mezi režimy zvětšení: původní velikost, roztáhnout na šířku a roztáhnout na výšku VW_SC_DRAGNDROP=Držte Ctrl nebo začněte v pravé části obrázku, chcete-li obrázek přetáhnout jinam (např. mimo okno prohlížeče) VW_SC_RESET=Esc obnoví obrázek do jeho původní podoby (např. pokud byl zvětšen, otočen nebo převrácen) nebo ukončí režim ručního zvětšení VW_SC_FREEZOOM=Shift + výběr myší pro vyvolání režimu ručního zvětšení (pro posunutí výběru držte Ctrl) SC_ZOOMINOUT=Přiblížit / oddálit SC_FLIPH=Překlopit vodorovně SC_FLIPV=Překlopit svisle SC_ROTL=Otočit vlevo SC_ROTR=Otočit vpravo SC_MORIG=Skutečná velikost SC_MFIT=Automaticky SC_MFITW=Roztáhnout na šířku SC_MFITH=Roztáhnout na výšku LANGUAGE=Jazyk TRANSLATIONS=Překlady TRANSLATIONS_TIP=Chcete-li se stát překladatelem, pošlete e-mail na tuto adresu a uveďte jazyky, kterými mluvíte. TRANSLATORS=Překladatelé VW_CENTER=Zarovnat na střed CUSTOM_CSS=Vlastní styl (CSS) VW_SC_HORIZONTALSCROLL=Pro vodorovné posouvání obrázku kolečkem myši přesuňte kurzor do levé dolní části obrázku VW_IMGINFO_TIP="Display custom information in the title of the tab. It may contain the following variables:\n%ow - original width\n%oh - original height\n%ratio - current width / current height\n%w - current width\n%h - current height\n%perc - percent of the original size\n%url - full URL\n%name - filename" CUSTOM_CSS_TIP="body {\n background: #f3f3f5; /* Any valid background property (color, url(), gradient...). */\n overflow: hidden; /* Hides the scrollbars. To show them, change \"hidden\" to \"auto\". */\n}\n\nimg {\n background: #eef; /* Different background for the image. */\n border: 10px solid white; /* Image border. */\n box-shadow: 0 0 10px grey; /* Shadow of the image. */\n cursor: default !important; /* Don't allow the mouse curosr to change. */\n}\n\n.mask {\n color: rgba(0, 0, 0, .4); /* Color of the free-zoom mask. */\n}\n\n#menu {\n display: none; /* Disable the floating menu. */\n}\n" CUSTOM_CSS_PH="Change the background color, image border/shadow, and hide the scrollbars or the floating menu... \nHover the question mark to see examples, use the color picker above for getting color codes." VW_SC_FLOATMENU=Move the cursor to the top left edge of the page to show the menu OPENER=Open images from regular web-pages OP_RIGHTLONG=right long-press OP_CTRLALTCLICK=Ctrl + Alt + right click OP_BOTH=both ; @language el, Greek (Ελληνικά) (69.81%) ; @translators Farow [lang] NAV_INFO=Πληροφορίες SHORTCUTS=Συντομεύσεις DISABLED=απενεργοποιημένο BUTTON_RESET=Επαναφορά BUTTON_SAVE=Αποθήκευση VW_MODE=Αρχικό μεγέθος VW_MODE_NATURL=φυσικό μέγεθος VW_MODE_AUTOFIT=αυτόματη προσαρμογή VW_MODE_FITWIDTH=προσαρμογή στο πλάτος VW_MODE_FITHEIGHT=προσαρμογή στο ύψος VW_MODE_BESTFIT=βέλτιστη προσαρμογή VW_MINUPSCALE=Μεγέθυνση μικρών εικόνων VW_MINUPSCALE_TIP="Μικρές εικόνες δεν μεγεθύνονται. Αυτή η επιλογή τις αναγκάζει να μεγεθυνθούν.\nΗ τιμή είναι σε ποσοστό και μεγεθύνει τις εικόνες που είναι μεγαλύτερες από το επιλεγμένο ποσοστό του ύψους ή του πλάτους της οθόνης." VW_IMGINFO=Πληροφορίες εικόνας VW_FAVICON=Προσαρμοσμένο εικονίδιο VW_FAVICON_TIP="Η επιλογή αυτή ορίζει ένα εικονίδιο καρτέλας για την ανοιγμένη εικόνα.\nΗ διεύθυνση της εικόνας μπορεί να χρησιμοποιηθεί και ως μια μεταβλητή: %url" VW_WHEELZOOM=Μεγεύθυνση με τη ροδέλα του ποντικιού VW_LPDELAY=Καθυστέριση παρατετημένου πατήματος (ms) VW_LPLEFT=Λειτουργία παρατετημένου πατήματος αριστερού κουμπιού VW_LPRIGHT=Λειτουργία παρατετημένου πατήματος δεξιού κουμπιού VW_LPA_FITWH=προσαρμογή στο πλάτος/ύψος VW_SC_CYCLE=Εναλαγή μεταξύ μεγεθών: φυσικό, προσαρμογή στο πλάτος, προσαρμογή στο ύψος VW_SC_RESET=To Esc θα επαναφέρει την εικόνα στην αρχική της μορφή ή θα κλείσει την ελεύθερη μεγέθυνση VW_SC_FREEZOOM=Shift + μεταφορά στην εικόνα για ελεύθερη μεγέθυνση, κρατήστε το Ctrl για να μετακινήσετε την επιλογή SC_FLIPH=Οριζόντια αναστροφή SC_FLIPV=Κάθετη αναστροφή SC_ROTL=Περιστροφή αριστερά SC_ROTR=Περιστροφή δεξιά SC_MORIG=Φυσικό μέγεθος SC_MFIT=Αυτόματη προσαρμογή SC_MFITW=Προσρμογή στο πλάτος SC_MFITH=Προσρμογή στο ύψος LANGUAGE=Γλώσσα TRANSLATIONS=Μεταφράσεις TRANSLATIONS_TIP=Εάν θέλεις να γίνεις μεταφραστής, τότε στείλε ένα e-mail σε αυτή τη διεύθυνση αναφέροντας τις γλώσσες ομιλείτε. TRANSLATORS=Μεταφραστές CUSTOM_CSS=Προσαρμοσμένο στυλ ; @language en, English (100%) ; @translators Deathamns [lang] APP_DESCRIPTION=Additional functionality for the browser's default image viewer. NAV_GENERAL=General NAV_INFO=Info SHORTCUTS=Shortcuts PH_CLICKFORSAMPLE=click for examples... DISABLED=disabled BUTTON_RESET=Default BUTTON_SAVE=Save VW_MODE=Initial sizing mode VW_MODE_NATURL=natural size VW_MODE_AUTOFIT=contain VW_MODE_FITWIDTH=fit to width VW_MODE_FITHEIGHT=fit to height VW_MODE_BESTFIT=best fit VW_MINUPSCALE=Enlarge small images VW_MINUPSCALE_TIP="Normally, smaller images won't be upscaled to the view-port. This option forces them to do so.\nThe value is given in percent, and tells the script to enlarge those images that are larger than the given percent of view-port's width or height (it depends on the previous option)." VW_IMGINFO=Image informations VW_IMGINFO_TIP="Display custom information in the title of the tab. It may contain the following variables:\n%ow - original width\n%oh - original height\n%ratio - current width / current height\n%w - current width\n%h - current height\n%perc - percent of the original size\n%url - full URL\n%name - filename" VW_FAVICON=Custom favicon VW_FAVICON_TIP="This option allows to set a custom tab-icon for the opened image.\nThe address of the image can be used as a variable: %url" VW_WHEELZOOM=Zoom with mouse wheel VW_LPDELAY=Long-press delay (ms) VW_LPLEFT=Left long-press action VW_LPRIGHT=Right long-press action VW_LPA_FITWH=fit to width/height VW_SC_CYCLE=Cycle through sizing modes: natural, fit to width, fit to height VW_SC_DRAGNDROP=Hold Ctrl to allow drag-and-drop, or drag from the right edge of the image, if that fits into the window VW_SC_RESET=Esc will reset the image to its original form, or quits from free-zoom VW_SC_FREEZOOM=Shift + drag on the image to use free-zoom, hold Ctrl to move the selection SC_ZOOMINOUT=Zoom in / out SC_FLIPH=Flip horizontal SC_FLIPV=Flip vertical SC_ROTL=Rotate left SC_ROTR=Rotate right SC_MORIG=Natural size SC_MFIT=Auto fit SC_MFITW=Fit to width SC_MFITH=Fit to height LANGUAGE=Language TRANSLATIONS=Translations TRANSLATIONS_TIP=If you want to become a translator, then send an e-mail to this address mentioning your spoken languages. TRANSLATORS=Translators VW_CENTER=Center content CUSTOM_CSS=Custom style (CSS) CUSTOM_CSS_TIP="body {\n background: #f3f3f5; /* Any valid background property (color, url(), gradient...). */\n overflow: hidden; /* Hides the scrollbars. To show them, change \"hidden\" to \"auto\". */\n}\n\nimg {\n background: #eef; /* Different background for the image. */\n border: 10px solid white; /* Image border. */\n box-shadow: 0 0 10px grey; /* Shadow of the image. */\n cursor: default !important; /* Don't allow the mouse curosr to change. */\n}\n\n.mask {\n color: rgba(0, 0, 0, .4); /* Color of the free-zoom mask. */\n}\n\n#menu {\n display: none; /* Disable the floating menu. */\n}\n" VW_SC_HORIZONTALSCROLL=To scroll the image horizontally, use the mouse wheel over the left bottom edge CUSTOM_CSS_PH="Change the background color, image border/shadow, and hide the scrollbars or the floating menu... \nHover the question mark to see examples, use the color picker above for getting color codes." VW_SC_FLOATMENU=Move the cursor to the top left edge of the page to show the menu OPENER=Open images from regular web-pages OP_RIGHTLONG=right long-press OP_CTRLALTCLICK=Ctrl + Alt + right click OP_BOTH=both ; @language es, Spanish (español) (73.58%) ; @translators DurianZheitk (JavierVH) [lang] NAV_INFO=Información SHORTCUTS=Atajos PH_CLICKFORSAMPLE=haz clic para mostrar ejemplos... DISABLED=deshabilitado BUTTON_RESET=Predeterminado BUTTON_SAVE=Guardar VW_MODE=Modo inicial de escalado VW_MODE_NATURL=tamaño original VW_MODE_AUTOFIT=ajustar VW_MODE_FITWIDTH=ajustar solo a lo ancho VW_MODE_FITHEIGHT=ajustar solo a lo alto VW_MODE_BESTFIT=mejor ajuste VW_MINUPSCALE=Ampliar imágenes pequeñas VW_MINUPSCALE_TIP="Por defecto, las imágenes pequeñas no serán ampliadas para encajar en la ventana de visualización. Esta opción las fuerza a hacerlo.\nEl valor esta dado en porcentaje, e indica a la extensión que amplié las imágenes que sean mayores al porcentaje en anchura o altura de la ventana de visualización (esto depende de la opción anterior).\n Ejemplo: si el valor esta fijado en 20%, y una imagen ocupa el 30% de la ventana de visualización, será ampliada de acuerdo a la opción anterior (Modo inicial de escalado)." VW_IMGINFO=Información de la imagen VW_FAVICON=Icono personalizado VW_FAVICON_TIP="Esta opción permite establecer un favicono personalizado para las pestañas con imágenes abiertas.\nLa dirección de la imagen puede ser usada como variable: %url" VW_WHEELZOOM=Ampliar (zoom) con la rueda del ratón VW_LPDELAY=Retraso para activar una pulsación larga (ms) VW_LPLEFT=Acción para una pulsación larga con el botón izquierdo VW_LPRIGHT=Acción para una pulsación larga con el botón derecho VW_LPA_FITWH=ajustar a la anchura/altura VW_SC_CYCLE=Cambiar entre los modos de escalado: tamaño original, ajustar a la anchura, ajustar a la altura VW_SC_RESET=Esc devolverá la imagen a su forma original, o saldrá del modo de ampliación de selección VW_SC_FREEZOOM=Shift + arrastrar sobre la imagen para usar el modo de ampliación de selección, mantén presionado Ctrl (sin soltar Shift) para mover la selección SC_ZOOMINOUT=Acercar/alejar la imagen SC_FLIPH=Voltear horizontalmente SC_FLIPV=Voltear verticalmente SC_ROTL=Girar a la izquierda SC_ROTR=Girar a la derecha SC_MORIG=Tamaño original SC_MFIT=Ajuste automático SC_MFITW=Ajustar a lo ancho SC_MFITH=Ajustar a lo alto LANGUAGE=Idioma TRANSLATIONS=Traducciones TRANSLATIONS_TIP=Si quieres ayudar en la traducción la extensión, envía un e-mail a esta dirección mencionando los idiomas que dominas. TRANSLATORS=Traductores CUSTOM_CSS=Estilo personalizado (CSS) ; @language fi, Finnish (suomi) (64.15%) ; @translators Opeeera [lang] NAV_INFO=Tietoja SHORTCUTS=Näppäinoikotiet PH_CLICKFORSAMPLE=klikkaa nähdäksesi esimerkkejä... DISABLED=poissa käytöstä BUTTON_RESET=Palauta oletukset BUTTON_SAVE=Tallenna VW_MODE=Oletuskoko VW_MODE_NATURL=luonnollinen koko VW_MODE_AUTOFIT=automaattinen sovitus VW_MODE_FITWIDTH=sovita leveyteen VW_MODE_FITHEIGHT=sovita korkeuteen VW_MODE_BESTFIT=paras sovitus VW_MINUPSCALE=Suurenna pieniä kuvia (%) VW_MINUPSCALE_TIP="Tavallisesti pieniä kuvia ei skaalata näkymäalueeseen, mutta tämä asetus pakottaa sen päälle.\nArvo annetaan prosentteina, ja se saa skriptin suurentamaan kuvia, jotka ovat suurempia kuin annettu prosenttiosuus näkymäalueen leveydestä tai korkeudesta (riippuen edellisestä asetuksesta)." VW_IMGINFO=Kuvan tiedot VW_FAVICON=Oma kuvake VW_WHEELZOOM=Suurennus hiiren rullalla VW_LPDELAY=Pitkän hiiren painalluksen viive (ms) VW_LPLEFT=Ykköspainikkeen pitkän painalluksen toiminto VW_LPRIGHT=Kakkospainikkeen pitkän painalluksen toiminto VW_LPA_FITWH=sovita leveyteen tai korkeuteen VW_SC_CYCLE=Siirry suurennustilojen välillä: luonnollinen koko, sovita leveyteen, sovita korkeuteen VW_SC_RESET=Esc palauttaa kuvan alkuperäiseen tilaan tai poistuu FreeZoom-tilasta VW_SC_FREEZOOM=Pidä Vaihtoa pohjassa ja vedä kuvan päällä käyttääksesi FreeZoomia, pidä Ctrl:ia pohjassa siirtääksesi valittua aluetta SC_ZOOMINOUT=Suurenna / pienennä SC_FLIPH=Käännä pystysuunnassa SC_FLIPV=Käännä vaakasuunnassa SC_ROTL=Kierrä vasemmalle SC_ROTR=Kierrä oikealle SC_MORIG=Luonnollinen koko SC_MFIT=Automaattinen sovitus SC_MFITW=Sovita leveyteen SC_MFITH=Sovita korkeuteen LANGUAGE=Kieli ; @language fr, French (français) (75.47%) ; @translators Tmnath [lang] NAV_INFO=Infos SHORTCUTS=Raccourcis PH_CLICKFORSAMPLE=cliquez pour avoir un exemple... DISABLED=désactivé BUTTON_RESET=Par défaut BUTTON_SAVE=Sauvegarder VW_MODE=Redimensionnement VW_MODE_NATURL=taille initiale VW_MODE_AUTOFIT=réduire VW_MODE_FITWIDTH=adapter à la largeur VW_MODE_FITHEIGHT=adapter à la hauteur VW_MODE_BESTFIT=taille optimale VW_MINUPSCALE=Agrandir les petites images VW_MINUPSCALE_TIP="En temps normal, les petites images ne sont pas élargies à la taille de la fenêtre. Cette option les y force.\nLa valeur est un pourcentage, et indique au script d'élargir les images plus grandes qu'un certain pourcentage de la hauteur ou de la largeur de la fenêtre (en fonction de l'option choisie précédemment)." VW_IMGINFO=Détails de l'image VW_FAVICON=Favicon personnalisé VW_FAVICON_TIP="Cette option permet de choisir un icône personnalisé pour l'onglet de l'image ouverte.\nL'adresse de l'image peut être utilisée comme une variable : %url" VW_WHEELZOOM=Zoomer avec la molette VW_LPDELAY=Durée du clic prolongé (ms) VW_LPLEFT=Clic gauche prolongé VW_LPRIGHT=Clic droit prolongé VW_LPA_FITWH=adapter à la largeur/hauteur VW_SC_CYCLE=Faire défiler les différents modes : taille initiale, adapter à la largeur, adapter à la hauteur VW_SC_RESET=Échap ramènera l'image à sa taille initiale, ou sortira du zoom libre VW_SC_FREEZOOM=Maj + glisser sur l'image pour utiliser le zoom libre, maintenir Ctrl pour déplacer la sélection SC_ZOOMINOUT=Zoom avant / arrière SC_FLIPH=Inverser horizontalement SC_FLIPV=Inverser verticalement SC_ROTL=Rotation vers la gauche SC_ROTR=Rotation vers la droite SC_MORIG=Taille initiale SC_MFIT=Redimensionnement automatique SC_MFITW=Adapter à la largeur SC_MFITH=Adapter à la hauteur LANGUAGE=Langue TRANSLATIONS=Traductions TRANSLATIONS_TIP=Si vous souhaitez devenir un traducteur, envoyez-moi un mail à cette adresse en indiquant les langues que vous parlez. TRANSLATORS=Traducteurs CUSTOM_CSS=Style personnalisé (CSS) ; @language hu, Hungarian (magyar) (100%) ; @translators Deathamns [lang] APP_DESCRIPTION=A beépített képnézegető funkcióit bővíti. NAV_GENERAL=Beállítások NAV_INFO=Infó SHORTCUTS=Billentyűparancsok PH_CLICKFORSAMPLE=kattints példákért... DISABLED=kikapcsolva BUTTON_RESET=Alap BUTTON_SAVE=Mentés VW_MODE=Alap méretezés VW_MODE_NATURL=eredeti méret VW_MODE_AUTOFIT=ablakhoz méretez VW_MODE_FITWIDTH=szélességhez méretez VW_MODE_FITHEIGHT=magassághoz méretez VW_MODE_BESTFIT=illeszkedés az ablakhoz VW_MINUPSCALE=Kis képek nagyítása VW_MINUPSCALE_TIP="A kisebb képek alapból nem méreteződnek az ablakhoz. Ez a beállítás az ellenkezőjére kényszeríti őket.\nAzok a képek méreteződnek fel, amelyek méretei nagyobbak, mint a százalékban megadott ablak szélessége vagy magassága (az előző beállítástól függ)." VW_IMGINFO=Képinformációk VW_IMGINFO_TIP="Egyéni adatok megjelenítése a fül címében, a következő változók felhaszanálásával:\n%ow - eredeti szélesség\n%oh - eredeti magasság\n%ratio - jelenlegi szélesség és magasság aránya\n%w - jelenlegi szélesség\n%h - jelenlegi magasság\n%perc - átméretezés százalékban\n%url - teljes cím\n%name - fájl neve" VW_FAVICON=Egyéni ikon a fülön VW_FAVICON_TIP=A kép címe használható változóként a megadott értékben: %url VW_WHEELZOOM=Nagyítás görgetéssel VW_LPDELAY=Egérgomb hosszan-tartás ideje (ms) VW_LPLEFT=Bal hosszan-tartás funkciója VW_LPRIGHT=Jobb hosszan-tartás funkciója VW_LPA_FITWH=szélességhez/magassághoz méretez VW_SC_CYCLE=Méretezések közti váltás: eredeti, szélességhez-, magassághoz méretez VW_SC_DRAGNDROP=Ctrl nyomva-tartása engedélyezi a kép vonszolását, vagy ha a kép belefér a nézetablakba, akkor vonszolható a jobb élénél fogva VW_SC_RESET=Esc a képet az eredeti állapotára állítja, vagy kilép a szabad méretezésből VW_SC_FREEZOOM=Shift + vonszolás nagyít a kijelölt részre, Ctrl tartásával a kijelölés mozgatható SC_ZOOMINOUT=Nagyítás / kicsinyítés SC_FLIPH=Vízszintes tükrözés SC_FLIPV=Függőleges tükrözés SC_ROTL=Forgatás jobbra SC_ROTR=Forgatás balra SC_MORIG=Eredeti méret SC_MFIT=Ablakhoz méretez SC_MFITW=Szélességhez méretez SC_MFITH=Magassághoz méretez LANGUAGE=Nyelv TRANSLATIONS=Fordítások TRANSLATIONS_TIP=Ha szeretnél fordító lenni, ezen az e-mail címen lehet jelentkezni, az általad beszélt nyelvek megemlítésével. TRANSLATORS=Fordítók VW_CENTER=Tartalom középre helyezése CUSTOM_CSS=Egyedi stílus (CSS) CUSTOM_CSS_TIP="body {\n background: #f3f3f5; /* Bármilyen elfogadott background érték (szín, url(), színátmenet...). */\n overflow: hidden; /* Elrejti a görgősávot. \"hidden\" változtatása \"auto\"-ra a megjelenítésükhöz. */\n}\n\nimg {\n background: #eef; /* Más háttér kizárólag a képnek. */\n border: 10px solid white; /* Egyéni képkeret. */\n box-shadow: 0 0 10px grey; /* Kép körüli árnyék. */\n cursor: default !important; /* Az egérkurzor változatlan marad ezzel az értékkel. */\n}\n\n.mask {\n color: rgba(0, 0, 0, .4); /* A szabad méretezés mask színe. */\n}\n\n#menu {\n display: none; /* A lebegő menü elrejtése. */\n}\n" VW_SC_HORIZONTALSCROLL=A kép vízszintes mozgatása az oldal bal also élén való görgetéssel lehetséges. CUSTOM_CSS_PH="Itt lehetseéges a háttér színének, kép keretének/árnyékának, stb. beállítása, illetve a görgősávok és a lebegő menü elrejtése. \nPéldákért vidd az egérkurzort a kérdőjel fölé, a színkódokhoz pedig használd a fenti színválasztót." VW_SC_FLOATMENU=A menü megjelenítéséhez mozgasd az egérkurzort az oldal bel felső szélére OPENER=Képek megnyitása normál web-oldalkról OP_RIGHTLONG=jobb klikk hosszan-tartva OP_CTRLALTCLICK=Ctrl + Alt + jobb klikk OP_BOTH=mindkettő ; @language nl, Dutch (Nederlands) (75.47%) ; @translators Kaçkar [lang] NAV_INFO=Info SHORTCUTS=Snelkoppelingen PH_CLICKFORSAMPLE=klikken voor voorbeelden... DISABLED=uit BUTTON_RESET=Reset BUTTON_SAVE=Opslaan VW_MODE=Oorspronkelijke pas-modus VW_MODE_NATURL=natuurlijk formaat VW_MODE_AUTOFIT=bevatten VW_MODE_FITWIDTH=breedte passend maken VW_MODE_FITHEIGHT=hoogte passend maken VW_MODE_BESTFIT=best afstemmen VW_MINUPSCALE=Kleine afbeeldingen vergroten VW_MINUPSCALE_TIP="Normaal gesproken worden kleinere afbeeldingen niet vergroot. Deze optie dwingt afbeeldingen te vergroten.\nDe waarde is in procenten, en vertelt het script om afbeeldingen die groter zijn de gegeven procenten van de breedte of hoogte van de kijker te vergroten (afhankelijk van de vorige optie)." VW_IMGINFO=Afbeeldings informatie VW_FAVICON=Aangepaste favicon VW_FAVICON_TIP="Deze optie maakt het mogelijk om een aangepaste tab-icoon te gebruiken voor de geopende afbeelding.\nHet adres van de afbeelding kan gebruikt worden als variabele: %url" VW_WHEELZOOM=Zoomen met muiswiel VW_LPDELAY=Lange druk vertraging (ms) VW_LPLEFT=Linker lange druk aktie VW_LPRIGHT=Rechter lange druk aktie VW_LPA_FITWH=breedte/hoogte passend maken VW_SC_CYCLE=Door sizing modi wisselen: normaal, breedte passend maken, hoogte passend maken VW_SC_RESET=Esc herstelt de afbeelding naar origineel formaat, of verlaat de vrije-zoom VW_SC_FREEZOOM=Shift + Sleep de afbeelding om free-zoom te gebruiken, Ctrl ingedrukt houden om de selectie te verplaatsen SC_ZOOMINOUT=In-/uitzoomen SC_FLIPH=Horizontaal omdraaien SC_FLIPV=Verticaal omdraaien SC_ROTL=Links roteren SC_ROTR=Rechts roteren SC_MORIG=Normale grootte SC_MFIT=Automatisch passen SC_MFITW=Breedte passend maken SC_MFITH=Hoogte passend maken LANGUAGE=Taal TRANSLATIONS=Vertalingen TRANSLATIONS_TIP=Wil je een vertaler worden, stuur dan een e-mail naar dit adres, vermeld je gesproken talen TRANSLATORS=Vertalers CUSTOM_CSS=Aangepaste stijl (CSS) ; @language pl, Polish (polski) (75.47%) ; @translators pafflick (Paweł Pawlak) [http://www.pafflick.com/] [lang] NAV_INFO=Info SHORTCUTS=Skróty PH_CLICKFORSAMPLE=kliknij, by zobaczyć przykłady... DISABLED=brak BUTTON_RESET=Resetuj BUTTON_SAVE=Zapisz VW_MODE=Skalowanie obrazów VW_MODE_NATURL=rzeczywisty wymiar VW_MODE_AUTOFIT=zmieść na ekranie VW_MODE_FITWIDTH=dopasuj do szerokości VW_MODE_FITHEIGHT=dopasuj do wysokości VW_MODE_BESTFIT=automatyczne dopasowanie VW_MINUPSCALE=Powiększanie małych obrazków VW_MINUPSCALE_TIP="Domyślnie małe obrazki nie są powiększane do rozmiarów okna. Ta funkcja wymusza ich skalowanie.\nFunkcja ta powoduje powiększenie tych obrazków, których wymiary przekraczają określony procent wysokości lub szerokości okna (w zależności od ustawień poprzedniej funkcji)." VW_IMGINFO=Informacje o obrazku VW_FAVICON=Własna ikona pliku VW_FAVICON_TIP="Zmienia ikonę pliku w pasku tytułu (domyślnie przeglądarka używa obrazka jako ikony).\nAdres obrazka można wprowadzić za pomocą zmiennej: %url" VW_WHEELZOOM=Powiększaj za pomocą kółka myszki VW_LPDELAY=Opóźnienie długiego przytrzymania (ms) VW_LPLEFT=Funkcja dla przytrzymania lewego przycisku VW_LPRIGHT=Funkcja dla przytrzymania prawego przycisku VW_LPA_FITWH=zmieść w oknie VW_SC_CYCLE=Przełącza tryby powiększenia: rzeczywiste wymiary, zmieść w poziomie, zmieść w pionie VW_SC_RESET=Esc przywraca domyślne ustawienia obrazka lub opuszcza tryb powiększania wybranego obszaru VW_SC_FREEZOOM=Przeciągnij z Shiftem na obrazku, by aktywować powiększanie obszarowe. Przytrzymaj Ctrl aby przesunąć zaznaczenie SC_ZOOMINOUT=Powiększ / Pomniejsz SC_FLIPH=Odbij w poziomie SC_FLIPV=Odbij w pionie SC_ROTL=Obróć w lewo SC_ROTR=Obróć w prawo SC_MORIG=Rzeczywisty wymiar SC_MFIT=Auto dopasowanie SC_MFITW=Dopasuj do szerokości SC_MFITH=Dopasuj do wysokości LANGUAGE=Język TRANSLATIONS=Tłumaczenia TRANSLATIONS_TIP=Jeżeli chcesz przetłumaczyć tę wtyczkę na inny język, wyślij e-mail na ten adres z informacją o języku którym się posługujesz. TRANSLATORS=Tłumacze CUSTOM_CSS=Własne style (CSS) ; @language pt-BR, Portuguese (Brazil) (português (Brasil)) (75.47%) ; @translators Rômulo Godoi [lang] NAV_INFO=Dados SHORTCUTS=Atalhos do teclado PH_CLICKFORSAMPLE=clique para ver exemplos... DISABLED=desativado BUTTON_RESET=Padrão BUTTON_SAVE=Salvar VW_MODE=Tamanho de exibição VW_MODE_NATURL=tamanho original VW_MODE_AUTOFIT=redimensionar à tela VW_MODE_FITWIDTH=redimensionar à largura VW_MODE_FITHEIGHT=redimensionar à altura VW_MODE_BESTFIT=redimensionar da melhor forma VW_MINUPSCALE=Aumentar imagens pequenas VW_MINUPSCALE_TIP="Geralmente imagens pequenas não são exibidas em grande parte da tela. Esta função força que elas sejam.\nO valor é dado em porcentagem, e informa ao script para deixa-las de acordo com os dados de altura e largura fornecidos (isso depende das opções selecionadas)." VW_IMGINFO=Informações da imagem. VW_FAVICON=Ícone personalizado VW_FAVICON_TIP="Esta opção possibilita adicionar um ícone personalizado à imagem aberta.\nO endereço da imagem pode ser usado como variável: %url" VW_WHEELZOOM=Fazer zoom ao rodar roda do mouse VW_LPDELAY=Atraso de resposta (ms) VW_LPLEFT=Clique longo com o botão esquerdo do mouse VW_LPRIGHT=Clique longo com o botão direito do mouse VW_LPA_FITWH=caber na altura/largura VW_SC_CYCLE=Trocar entre os modos: tamanho original, caber na altura, caber na largura VW_SC_RESET=Esc voltará a imagem à sua forma normal, ou sairá do zoom-livre VW_SC_FREEZOOM=Shift + arrastrar em cima da imagem para usar o modo de ampliação de seleção, mantenha pressionado Ctrl (sem soltar Shift) para mover a seleção SC_ZOOMINOUT=Zoom mais/menos SC_FLIPH=Virar à horizontal SC_FLIPV=Virar à vertical SC_ROTL=Rodar à esquerda SC_ROTR=Rodar à direita SC_MORIG=Tamanho original SC_MFIT=Dimensionar automaticamente SC_MFITW=Dimensionar à largura SC_MFITH=Dimensionar à altura LANGUAGE=Idioma TRANSLATIONS=Traduções TRANSLATIONS_TIP=Se você quiser se tornar um tradutor, envie um e-mail para este endereço, mencionando os idiomas que você fala. TRANSLATORS=Tradutores CUSTOM_CSS=Estilo de CSS personalizado ; @language ru, Russian (русский) (100%) ; @translators Rodny [lang] APP_DESCRIPTION=Дополнительная функциональность при просмотре изображений в браузере. NAV_GENERAL=Общие NAV_INFO=Инфо SHORTCUTS=Сочетания клавиш PH_CLICKFORSAMPLE=посмотреть примеры... DISABLED=отключено BUTTON_RESET=По умолчанию BUTTON_SAVE=Сохранить VW_MODE=Размер по умолчанию VW_MODE_NATURL=оригинальный размер VW_MODE_AUTOFIT=вписать VW_MODE_FITWIDTH=подогнать по ширине VW_MODE_FITHEIGHT=подогнать по высоте VW_MODE_BESTFIT=наилучшее заполнение VW_MINUPSCALE=Увеличивать маленькие изображения VW_MINUPSCALE_TIP="Как правило, небольшие изображения не увеличиваются до размеров области просмотра при масштабировании. Этот параметр заставит их это делать.\nЗначение задаётся в процентах, скрипт увеличит те изображения, размер которых больше данного процента от ширины или высоты области просмотра (в зависимости от предыдущей настройки)." VW_IMGINFO=Информация об изображении VW_IMGINFO_TIP="Отображение пользовательской информации в заголовке вкладки. Она может содержать следующие переменные:\n%ow - оригинальная ширина\n%oh - оригинальная высота\n%ratio - текущая ширина / текущая высота\n%w - текущая ширина\n%h - текущая высота\n%perc - процент от оригинального размера\n%url - полный URL\n%name - имя файла" VW_FAVICON=Пользовательская иконка VW_FAVICON_TIP="Этот параметр позволяет назначить произвольную иконку для вкладки с открытым изображением.\nАдрес изображения можно использовать как переменную: %url" VW_WHEELZOOM=Масштабировать колесом мыши VW_LPDELAY=Длительность нажатия (мс) VW_LPLEFT=Действие длительного нажатия левой кнопкой мыши VW_LPRIGHT=Действие длительного нажатия правой кнопкой мыши VW_LPA_FITWH=подогнать по ширине/высоте VW_SC_CYCLE=Переключить между режимами: оригинальный, подгон по ширине, подгон по высоте VW_SC_DRAGNDROP=Зажмите Ctrl, чтобы позволить drag-and-drop, или протяните от правого края изображения, если оно вписано в окно VW_SC_RESET=Esc возвращает изображение к первоначальному виду или выходит из режима свободного масштабирования. VW_SC_FREEZOOM=Зажать Shift + левую кнопку мыши на изображении для свободного масштабирования, дополнительно зажать Ctrl для перемещения выделения SC_ZOOMINOUT=Увеличить / уменьшить SC_FLIPH=Отразить по горизонтали SC_FLIPV=Отразить по вертикали SC_ROTL=Повернуть влево SC_ROTR=Повернуть вправо SC_MORIG=Оригинальный размер SC_MFIT=Вписать SC_MFITW=Подогнать по ширине SC_MFITH=Подогнать по высоте LANGUAGE=Язык TRANSLATIONS=Переводы TRANSLATIONS_TIP=Если вы хотите стать переводчиком, напишите по электронной почте на этот адрес, указав ваши языки. TRANSLATORS=Переводчики VW_CENTER=Центрировать содержимое CUSTOM_CSS=Пользовательский стиль (CSS) CUSTOM_CSS_TIP="body {\n background: #f3f3f5; /* Любое допустимое свойство фона (color, url(), gradient...). */\n overflow: hidden; /* Скрыть полосы прокрутки. Чтобы показать их, измените \"hidden\" на \"auto\". */\n}\n\nimg {\n background: #eef; /* Различный фон для изображения. */\n border: 10px solid white; /* Граница изображения. */\n box-shadow: 0 0 10px grey; /* Тень изображения. */\n cursor: default !important; /* Запретить изменение курсора. */\n}\n\n.mask {\n color: rgba(0, 0, 0, .4); /* Цвет маски свободного масштабирования. */\n}\n\n#menu {\n display: none; /* Отключить всплывающее меню. */\n}\n" VW_SC_HORIZONTALSCROLL=Для прокрутки изображения по горизонтали используйте колёсико мыши над левым нижним краем CUSTOM_CSS_PH="Можно изменять цвета фона, границу/тень изображения, скрывать полосы прокрутки или всплывающее меню... \nНаведите курсор на вопросительный знак, чтобы увидеть примеры, используйте палитру цветов выше для получения кодов цвета." VW_SC_FLOATMENU=Подведите курсор к верхнему левому краю страницы, чтобы показать меню OPENER=Открытие изображений c обычных веб-страниц OP_RIGHTLONG=длительное нажатие правой кнопки мыши OP_CTRLALTCLICK=Ctrl + Alt + правая кнопка мыши OP_BOTH=оба ; @language tr, Turkish (Türkçe) (35.85%) ; @translators Saner Apaydın [lang] NAV_INFO=Bilgi SHORTCUTS=Kısayollar PH_CLICKFORSAMPLE=örnekler için tıkla... DISABLED=devre dışı BUTTON_RESET=Varsayılan BUTTON_SAVE=Kaydet VW_MODE=İlk boyutlandırma modu VW_MODE_AUTOFIT=sığdır VW_MINUPSCALE=Küçük resimleri büyüt VW_IMGINFO=Resim bilgileri VW_FAVICON=Özel favicon VW_WHEELZOOM=Fare tekeriyle yakınlaştır VW_LPDELAY=Uzun basış gecikmesi (ms) SC_FLIPV=Dikey çevir SC_ROTR=Sağa döndür SC_MORIG=Orijinal boyutlar SC_MFITW=Genişliğe sığdır SC_MFITH=Yüksekliğe sığdır TRANSLATORS=Çevirmenler ; @language uk, Ukrainian (українська) (75.47%) ; @translators Simofon [lang] NAV_INFO=Інфо SHORTCUTS=Поєднання клавіш PH_CLICKFORSAMPLE=Дивитить приклади... DISABLED=відключено BUTTON_RESET=Дефолні налаштування BUTTON_SAVE=Зберегти VW_MODE=Розмір за замовчуванням VW_MODE_NATURL=оригінальний розмір VW_MODE_AUTOFIT=вписати VW_MODE_FITWIDTH=підігнати по ширині VW_MODE_FITHEIGHT=підігнати по висоті VW_MODE_BESTFIT=найкраще заповнення VW_MINUPSCALE=Збільшувати маленькі зображення VW_MINUPSCALE_TIP="Як правило, невеликі зображення не збільшуються до розмірів області перегляду при масштабування. Цей параметр змусить їх це робити.\nЗначення задається у відсотках, скрипт збільшить ті зображення, розмір яких більше даного відсотка від ширини або висоти області перегляду (залежно від попередньої настройки)." VW_IMGINFO=Інформація про зображення VW_FAVICON=Іконка VW_FAVICON_TIP="Цей параметр дозволяє призначити довільну іконку для вкладки з відкритим зображенням.\nАдреса зображення можна використовувати як змінну: %url" VW_WHEELZOOM=Масштабувати колесом миші VW_LPDELAY=Тривалість натискання (мс) VW_LPLEFT=Дія тривалого натискання лівою кнопкою миші VW_LPRIGHT=Дія тривалого натискання правою кнопкою миші VW_LPA_FITWH=підігнати по ширині / висоті VW_SC_CYCLE=Переключити між режимами: оригінальний, підгін по ширині, підгін по висоті VW_SC_RESET=Esc повертає зображення до первісного вигляду або виходить з режиму вільного масштабування. VW_SC_FREEZOOM=Зажати Shift + ліву кнопку миші на зображенні для вільного масштабування, додатково затиснути Ctrl для переміщення виділення SC_ZOOMINOUT=Збільшити / зменшити SC_FLIPH=Відобразити по горизонталі SC_FLIPV=Відобразити по вертикалі SC_ROTL=Повернути вліво SC_ROTR=Повернути вправо SC_MORIG=Оригінальний розмір SC_MFIT=Вписати SC_MFITW=Підігнати по ширині SC_MFITH=Підігнати по висоті LANGUAGE=Мова TRANSLATIONS=Переклади TRANSLATIONS_TIP=Якщо ви хочете стати перекладачем, напишіть електронною поштою на цю адресу, вказавши ваші мови. TRANSLATORS=Перекладачі CUSTOM_CSS=Стиль (CSS) ; @language zh-CN, Chinese (Simplified Han) (中文(简体中文)) (75.47%) ; @translators fang5566 [lang] NAV_INFO=信息 SHORTCUTS=快捷键 PH_CLICKFORSAMPLE=点击查看样例... DISABLED=禁用 BUTTON_RESET=重置 BUTTON_SAVE=保存 VW_MODE=图片默认显示模式 VW_MODE_NATURL=原始尺寸 VW_MODE_AUTOFIT=嵌入查看器 VW_MODE_FITWIDTH=适应宽度 VW_MODE_FITHEIGHT=适应高度 VW_MODE_BESTFIT=最佳适应方式 VW_MINUPSCALE=放大小图片 VW_MINUPSCALE_TIP="通常小图片不会被放大到视图窗口(view-port)那么大,而该选项可以强制放大这些小图片。\n该选项值表示视图窗口宽度和高度值(这由前一个选项来决定)的百分比,用于告知脚本凡是大于该百分比的图片都强制放大。" VW_IMGINFO=图片信息 VW_FAVICON=自定义 favicon VW_FAVICON_TIP="该选项用于为打开的图片设置一个自定义的标签页图标。\n图片地址可使用以下变量:%url" VW_WHEELZOOM=使用鼠标滚轮缩放 VW_LPDELAY=鼠标点击时长(毫秒) VW_LPLEFT=鼠标左键长按时的操作 VW_LPRIGHT=鼠标右键长按时的操作 VW_LPA_FITWH=适应宽度/高度 VW_SC_CYCLE=在原始大小,适应宽度和适应高度三种显示模式中切换 VW_SC_RESET=Esc 键可重置图片为原始显示方式,或退出自由缩放模式 VW_SC_FREEZOOM=Shift + 拖动 图片进入自由缩放模式,按住 Ctrl 时可移动选区 SC_ZOOMINOUT=缩小 / 放大 SC_FLIPH=水平翻转 SC_FLIPV=垂直翻转 SC_ROTL=向左旋转 SC_ROTR=向右旋转 SC_MORIG=原始尺寸 SC_MFIT=自动适应 SC_MFITW=适应宽度 SC_MFITH=适应高度 LANGUAGE=语言 TRANSLATIONS=翻译 TRANSLATIONS_TIP=如果您想参与翻译,请发送 e-mail 到这里并说明您要翻译的语言。 TRANSLATORS=译者 CUSTOM_CSS=自定义样式 (CSS) ; @language zh-TW, Chinese (Traditional Han) (中文 (繁體中文)) (49.06%) ; @translators TYKuo [lang] NAV_INFO=相關訊息 SHORTCUTS=快捷鍵 PH_CLICKFORSAMPLE=點擊以做為範例... DISABLED=停用 BUTTON_RESET=預設 BUTTON_SAVE=儲存 VW_MODE=初始尺寸模式 VW_MODE_NATURL=原始大小 VW_MODE_AUTOFIT=自動縮放 VW_MODE_FITWIDTH=符合寬度 VW_MODE_FITHEIGHT=符合高度 VW_MODE_BESTFIT=適合圖片 VW_MINUPSCALE=放大小圖片 VW_IMGINFO=影像資訊 VW_FAVICON=自訂網站圖標 VW_WHEELZOOM=以滑鼠滾輪縮放 VW_LPDELAY=長按延遲(毫秒) VW_LPLEFT=左鍵長按動作 VW_LPRIGHT=右鍵長按動作 VW_LPA_FITWH=符合寬度/高度 SC_FLIPV=垂直翻轉 SC_ROTR=向右旋轉 SC_MORIG=原始大小 SC_MFITW=適合寬度 SC_MFITH=適合高度 {"_": "en", "cs": {"%": 84.91, "name": "Czech (čeština)", "translators": [{"email": "jaramat@email.cz", "fullname": "Jaroslav Matura", "name": "jaramat"}]}, "el": {"%": 69.81, "name": "Greek (Ελληνικά)", "translators": [{"email": "farow.the.time.traveler@gmail.com", "name": "Farow"}]}, "en": {"name": "English", "translators": [{"email": "deathamns@gmail.com", "name": "Deathamns"}]}, "es": {"%": 73.58, "name": "Spanish (español)", "translators": [{"email": "nightroad@mail.com", "fullname": "JavierVH", "name": "DurianZheitk"}]}, "fi": {"%": 64.15, "name": "Finnish (suomi)", "translators": [{"email": "opeeera@myopera.com", "name": "Opeeera"}]}, "fr": {"%": 75.47, "name": "French (français)", "translators": [{"email": "tmnath2@gmail.com", "name": "Tmnath"}]}, "hu": {"name": "Hungarian (magyar)", "translators": [{"email": "deathamns@gmail.com", "name": "Deathamns"}]}, "nl": {"%": 75.47, "name": "Dutch (Nederlands)", "translators": [{"email": "kackar@outlook.com", "name": "Kaçkar"}]}, "pl": {"%": 75.47, "name": "Polish (polski)", "translators": [{"fullname": "Paweł Pawlak", "name": "pafflick", "web": "http://www.pafflick.com/"}]}, "pt-BR": {"%": 75.47, "name": "Portuguese (Brazil) (português (Brasil))", "translators": [{"email": "romulo@brazilmail.com", "fullname": "Rômulo Godoi"}]}, "ru": {"name": "Russian (русский)", "translators": [{"email": "rodny0@gmail.com", "name": "Rodny"}]}, "tr": {"%": 35.85, "name": "Turkish (Türkçe)", "translators": [{"email": "sanerapaydin86@gmail.com", "fullname": "Saner Apaydın"}]}, "uk": {"%": 75.47, "name": "Ukrainian (українська)", "translators": [{"email": "simofon@yandex.ru", "name": "Simofon"}]}, "zh-CN": {"%": 75.47, "name": "Chinese (Simplified Han) (中文(简体中文))", "translators": [{"email": "wlq105556@gmail.com", "name": "fang5566"}]}, "zh-TW": {"%": 49.06, "name": "Chinese (Traditional Han) (中文 (繁體中文))", "translators": [{"email": "tingyang@gmail.com", "name": "TYKuo"}]}} :: Viewhance ::
0%

  • + / -