您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Mejora Tu Experiencia Al Navegar En Google IMÁGENES | Improves Your Browsing Experience In Google IMAGES.
当前为
// ==UserScript== // @name Google Images Enhancer // @author Keyser Söze // @namespace http://userscripts.org/users/KeyserSoze // @homepageURL https://userscripts.org/scripts/show/150950 // @website http://userscripts.org/scripts/show/150950 // @icon http://files.myopera.com/TrikiTran/albums/11598242/avatar117399_1.gif // @description Mejora Tu Experiencia Al Navegar En Google IMÁGENES | Improves Your Browsing Experience In Google IMAGES. // @grant GM_addStyle // @version 2.0 // @include htt*://*.google.*/*tbm=isch* // @include htt*://*.google.*/images?* // @include htt*://images.google.*/search?*imghp* // @include htt*://*.google.*/search?* // @include htt*://*.google.*/ // @include htt*://*.google.*/firefox // @exclude htt*://*.google.com/ // @exclude htt*://*.google.tld/ // @exclude htt*://*.google.*/mail/* // Basado en "Google Enlarge", "PicViewer" & "Greased LightBox"... Así que, muchas gracias a los autores originales! // Based on "Google Enlarge", "PicViewer" & "Greased LightBox"... So, many thanks to original authors // ==/UserScript== (function() { /* ============================= || Google From Dusk 2 Dawn || ============================= */ { var css = "#pmocntr2,#gt-bbar{display:none!important}select,select > button{-moz-appearance:none!important;-webkit-appearance:none!important}*{color:hsl(0,0%,80%);outline:none!important}h1,h2,h3,h4,h5,h6,strong,span,select,#rhs *,.jfk-button-standard,#sections-header,div[style=\"display:table-cell;padding-left:16px;font-size:13px;color:#222\"],.cell-header-label,.header-label,.sllabel,.goog-slider li,#srchButton,.ksb,.ab_button{color:hsl(0,0%,80%)!important}a{color:hsl(240,99%,73%)!important}a:hover,a:active,#gbz .gbts:hover{color:hsl(0,0%,85%)!important;text-shadow:0 0 5px hsla(0,0%,90%,.9)!important;-moz-transition:text-shadow .2s ease!important;-webkit-transition:text-shadow .2s ease!important} a:visited{color:hsla(105,66%,39%,.6)!important} .f,#pocs,.gt-baf-word{color:hsl(240,96%,90%)!important} .goog-menuitem-highlight div,.goog-option-selected .goog-menuitem-content{color:hsl(0,0%,99%)!important} b,em,.gt-baf-pos,#lc a,.tbou > a.q, #tbpi,#tbtro,.tbt label,#prc_opt,#set_location_section a,.tbtctlabel,#swr a{color:hsl(240,99%,80%)!important} #gt-src-wrap *,#gt-res-wrap *{color:hsl(0,0%,0%)!important}html,body,div[style=\"border-bottom:1px solid #dedede;height:57px\"],#gbx1,#gbx2,.rg_hv,.uh_hv,li.g.psgi:hover,#il_m,#il_ic{background:hsl(0,0%,5%)!important} .c,.gssb_c,.gssb_c td,#nycp,select{background-color:hsl(0,0%,17%)!important} select > button,.gbxms{background-color:hsla(0,0%,17%,.6)!important} select > optgroup{background-color:hsl(0,0%,6%)!important} #nycp{background-color:hsl(0,0%,28%)!important} #gt-src-wrap{background-color:hsl(0,0%,66%)!important} #gt-res-wrap,.close_lk{background-color:hsl(0,0%,77%)!important} .gssb_a span *,.gbto #gbs,#gbx3,#gbx4,.lst-d,.lst-t,.ab_wrp,#appbar,.lhshdr,.tphdr,#tbbcc,.rshdr{background:transparent!important} #header,#footer,.signin-box,.accountchooser-box,.google-header-bar,#leftnav,#tbdi,#hidden_modes,#hmp,#sc-block .sc,#leftnav a,#gt-appbar,#gt-ft-res,.goog-menuitem-content,div.bottom-links-wrapper,.gssb_m,.gbgt-hvr #gbgs3,#gbg3:focus #gbgs3,#gbg3:active #gbgs3,.flyr-o,.flyr-w,#advd-search-header h1{background-color:transparent!important}#bms *,#gbx1,#gbx2,div[style=\"border-bottom:1px solid #dedede;height:57px\"],.google-header-bar,#footer,#footer > div,.google-footer-bar,#top-content,#header,#gt-ft-res,#nycp,.gstl_0.gssb_c *,.lst-d,.lst-d:hover{border-color:transparent!important}.gbm ol *,.c,.appbar_b,div.splitter,.ab_dropdownrule,.ab_wrp{border-color:hsla(0,0%,6%,.6)!important}.gsq_a tr{border:2px solid transparent!important} button:not(#nycx):not(.eswd),.vsh.nyc_opening .vsc:hover .vspii,.vsh.nyc_open .vsc:hover .vspii,.vso .vspii,.jfk-button-standard,.jfk-button,.g-button,select,.cpbb,.kpbb,.kprb,.kpgb,.kpgrb,.ksb,.ab_button{border:hsl(0,0%,70%) 2px ridge!important}button,select,select > optgroup,select > option,.vsh.nyc_opening .vsc:hover .vspii,.vsh.nyc_open .vsc:hover .vspii,.vso .vspii,.mitem,.msel .kls,.c,.gbmc,.gssb_c,.gssb_c table,.goog-flat-menu-button,.gsq_a span,.jfk-button-standard,.jfk-button,.g-button,.rgsh,.cpbb,.kpbb,.kprb,.kpgb,.kpgrb,.ksb,.ab_button,#taw div,.selector,.ab_dropdownitem,ol,ul,li,.goog-menuitem,#gt-src-wrap,#gt-res-wrap,#nycp,.rg_hv,.uh_hv,.gssb_a td,.gssb_e,#srchButton,#il_ic,#il_fi,.close_lk{border-radius:4px!important} img,.rg_i{border-radius:2px!important}.rg-hi,.rg_hv:hover,#rhs,#nycp,.uh_hv,li.g.psgi:hover{border-radius:6px!important;box-shadow:1px 1px 2px #000,-1px -1px 2px hsl(0,0%,32%),2px 6px 16px 5px hsl(0,0%,0%)!important} .lst-d:hover{box-shadow:none!important}.goog-menu,.gbmc,.ab_dropdown{-moz-appearance:none!important;-webkit-appearance:none!important;background:hsl(60,3%,6%) -moz-linear-gradient(left,hsl(0,0%,6%),hsl(0,0%,28%))!important;background:hsl(60,3%,6%) -webkit-linear-gradient(left,hsl(0,0%,6%),hsl(0,0%,28%))!important;background-repeat:repeat!important;background-position:left!important;background-attachment:fixed!important;text-shadow:1px 1px 1px hsl(0,0%,0%)!important;border-radius:6px!important;box-shadow:2px 2px 5px 5px hsl(0,0%,0%),1px 1px 3px hsl(0,0%,6%),-1px -1px 3px hsl(0,0%,28%)!important} #gbx3,#gsr .p_ksb{-moz-appearance:none!important;-webkit-appearance:none!important;background:-moz-linear-gradient(top,hsl(0,0%,33%) 48%,hsl(0,0%,20%) 49%,hsl(0,0%,0%) 85%,hsl(0,0%,20%))!important;background:-webkit-linear-gradient(top,hsl(0,0%,33%) 48%,hsl(0,0%,20%) 49%,hsl(0,0%,0%) 85%,hsl(0,0%,20%))!important;text-shadow:1px 1px 1px hsl(227,32%,28%)!important;box-shadow:0 1px 5px hsl(0,0%,0%)!important} :not(select) > button:not(#nycx):not(.eswd),.vsh.nyc_opening .vsc:hover .vspii,.vsh.nyc_open .vsc:hover .vspii,.vso .vspii,#gbgs4,.gbgs,.kpbb,.g-button,.jfk-button,.goog-flat-menu-button,.cpbb,.kpbb,.kprb,.kpgb,.kpgrb,.ksb,.ab_button,.goog-button-base-pos,#srchButton{-moz-appearance:none!important;-webkit-appearance:none!important;background:transparent!important;background-image:-moz-linear-gradient(top,hsl(0,0%,33%) 48%,hsl(0,0%,20%) 49%,hsl(0,0%,0%) 85%,hsl(0,0%,20%))!important;background-image:-webkit-linear-gradient(top,hsl(0,0%,33%) 48%,hsl(0,0%,20%) 49%,hsl(0,0%,0%) 85%,hsl(0,0%,20%))!important;text-shadow:1px 1px 3px hsl(0,0%,0%)!important;box-shadow:1px 1px 5px hsl(0,0%,0%),-1px -1px 5px hsl(219,16%,32%)!important}button:not(#nycx):not(.eswd):hover,.mitem:hover,.vsh.nyc_opening .vsc:hover .vspii,.vsh.nyc_open .vsc:hover .vspii,.vso .vspii:hover,#gbgs4:hover,.gbgs:hover,.kpbb:hover,.g-button:hover,.jfk-button:hover,.gbto .gbts,.gbmcc li:hover,.ab_dropdownlnk:hover,.ab_dropdownlnkinfo:hover,.goog-menuitem:hover,.cpbb:hover,.kpbb:hover,.kprb:hover,.kpgb:hover,.kpgrb:hover,.ksb:hover,.ab_button:hover,.scroll-tree li a:hover,.selector:hover,.lhn-section-primary:hover,.ab_dropdownitem:hover,#gsr .p_ksb:hover,#doodle-site-navigation li a:hover,.gbmcc.gbsbic li a:hover,.goog-toolbar-button:hover,.goog-flat-menu-button:hover,select > option:hover,.gssb_a td:hover,#srchButton:hover{-moz-appearance:none;-webkit-appearance:none;background:-moz-radial-gradient(center bottom,hsla(123,50%,65%,.6),transparent), -moz-linear-gradient(top,hsl(0,0%,33%) 48%,hsl(0,0%,20%) 49%,hsl(0,0%,0%) 85%,hsl(0,0%,20%))!important;background:-webkit-radial-gradient(center bottom,hsla(123,50%,65%,.6),transparent), -webkit-linear-gradient(top,hsl(0,0%,33%) 48%,hsl(0,0%,20%) 49%,hsl(0,0%,0%) 85%,hsl(0,0%,20%))!important;-moz-transition:background-color .1s ease-in!important;-webkit-transition:background-color .1s ease-in!important;outline:none!important;opacity:1.0!important;color:hsl(0,0%,99%)!important;text-shadow:1px 1px 1px hsl(0,0%,0%),0 0 2px hsla(123,50%,50%,.8)!important} button:not(#nycx):not(.eswd):hover,.mitem:hover,.vsh.nyc_opening .vsc:hover .vspii,.vsh.nyc_open .vsc:hover .vspii,.vso .vspii:hover,#gbgs4:hover,.gbgs:hover,.kpbb:hover,.g-button:hover,.jfk-button:hover,.gbto .gbts,.gbmcc li:hover,.ab_dropdownlnk:hover,.ab_dropdownlnkinfo:hover,.goog-menuitem:hover,.gsq_a tr:hover span,.cpbb:hover,.kpbb:hover,.kprb:hover,.kpgb:hover,.kpgrb:hover,.ksb:hover,.ab_button:hover,.scroll-tree li a:hover,.selector:hover,.lhn-section-primary:hover,.ab_dropdownitem:hover,#gsr .p_ksb:hover,.mitem:hover,.goog-flat-menu-button:hover,select > option:hover,#srchButton:hover,.close_lk:hover{-moz-appearance:none;-webkit-appearance:none;border-color:hsla(123,50%,75%,.6) hsla(123,50%,65%,.6) hsla(123,50%,55%,.6)!important;box-shadow:0 0 10px hsl(123,50%,75%)!important;-moz-transition:border-color .2s ease,box-shadow .3s ease!important;-webkit-transition:border-color .2s ease,box-shadow .3s ease!important} li.selected,.msel .kls,.goog-option-selected,.rgsh,#scrollable-sections .tree-link-selected,.selector.selected,#tbbc,.goog-toolbar-button-selected,.goog-toolbar-button-checked,.goog-toolbar-menu-button-open,.goog-option-selected .goog-menuitem-content{background-image:-moz-radial-gradient(center bottom,hsl(123,99%,55%),transparent),-moz-linear-gradient(top,hsl(0,0%,33%) 48%,hsl(0,0%,20%) 49%,hsl(0,0%,0%) 85%,hsl(0,0%,20%))!important;background-image:-webkit-radial-gradient(center bottom,hsl(123,99%,55%),transparent),-webkit-linear-gradient(top,hsl(0,0%,33%) 48%,hsl(0,0%,20%) 49%,hsl(0,0%,0%) 85%,hsl(0,0%,20%))!important;-moz-transition:all .3s!important;-webkit-transition:all .3s!important}.gbqfqw,#lst-ib,input[type=\"email\"],input[type=\"number\"],input[type=\"password\"],input[type=\"tel\"],input[type=\"url\"],.signin-box input[type=\"text\"],.advtable input[type=\"text\"],#newu,#search_box,.as-text-input,.as-table-cont td input[type=\"text\"],.ktf{-moz-appearance:none!important;-webkit-appearance:none!important;font-weight:bold!important;box-shadow:1px 1px 5px hsl(0,0%,0%) inset,0 -1px 1px 1px hsl(240,20%,30%) inset!important;background:hsl(0,0%,17%)!important;text-shadow:1px 1px 1px hsla(123,99%,89%,.6),-1px -1px 1px hsl(0,0%,0%)!important;color:hsl(0,0%,80%)!important;border-radius:50px!important;border:none!important;padding-left:4px!important}#lga > *{opacity:0!important}#lga {background:transparent url(\"https://lh6.ggpht.com/_6Bqt_HqYues/THR8YbT0qxI/AAAAAAAAADc/NALhWF1Xjsk/logo.png\") top center no-repeat!important;height:100%!important;top:9px!important;margin-bottom:10px!important;background-size:contain!important}"; if (typeof GM_addStyle != "undefined") { GM_addStyle(css); } else if (typeof PRO_addStyle != "undefined") { PRO_addStyle(css); } else if (typeof addStyle != "undefined") { addStyle(css); } else { var heads = document.getElementsByTagName("head"); if (heads.length > 0) { var node = document.createElement("style"); node.type = "text/css"; node.appendChild(document.createTextNode(css)); heads[0].appendChild(node);} } var css = "*, \n* {cursor: \nurl(\"http://reloaded.site88.net/Data/aero_arrow.cur\"), \ndefault !important\n}\na, a \n* {cursor: \nurl(\"http://reloaded.site88.net/Data/aero_link.cur\"), \npointer !important\n}\nHtml, Div.Span\n, DIV.gb_yb.gb_3b, Div#LeftNav, Span.st, Div#fbar, Div.fbar, Div.gb_Ab.gb_5b, Div.gb_na.gb_5b.gb_k.gb_4b, Div.gb_t.gb_u, Div.gb_t.gb_A, UL.gb_v.gb_z, UL.gb_v.gb_Kb, Div#hdtbSum, Div#gbd, Div#gbmmb, a#gb, ol#gbmm, p.sp_cnt, Div#res.med, Div#center_col, Div#cnt.big, Div#LeftNavc, Div#gbx3, Div#hdtb_more_mn, a#hdtb_tls, Div#hdtbMenus, Box, A#ShowModes, Div#More_Link, Span.Tbpo, A#Tbpi, Div#Ms.Open, Div#Bms, Div.Insep, DIV.gb_yb.gb_Fb.gb_j, DIV.gb_fa.gb_Fb.gb_j.gb_Eb, DIV.gb_ib.gb_Fb, DIV#gb.gb_Bb.gb_1a, DIV#mngb, DIV#tphdr.tphdr,Box1, Box2, Box3, Box4, Box5, O1, Table, Div.Gbmc, #Gbmm, Li, Input, Input.Post, Body\n {\nBackground : url(\"data:image/png;base64,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\") \nFixed Repeat Center!important\n; Background-color: Black !important\n; Color : SkyBlue !important\n}\na:Link\n{\nColor: YellowGreen !important;\n}\na:Visited\n{\nColor: Plum !important;\n}\na:Hover\n{\nBackground-color: #222334 !important;\nText-decoration: none !important;\nColor: Teal !important;\n}\na.gbmt, a.gbml1, .gbmt:visited {\n background-color: transparent !important;\n color: Red !important;\n border-color: #444 !important;\n text-decoration: none !important}\n*, *:focus {outline: none !important}\n\nh1, h2, h3, h4, h5, h6, h1 *, h2 *, h3 *, .med, em, #rg_hta, .qbtt, .ss-link.ss-selected, td > font > b, #qbut b, #qbft b, a.spell, a.spell *, a.spell_orig, #gen-query .operator, .threadCountNumber, #popup_dialog_title, .settings-title, .thread-subject, .leftTitle, #conditions #temp, #conditions #condition, .mapBalloon .b {color: Yellow !important}\n#hplogo div, #ftby a, .page-title, .jhp input[type=\"submit\"], body > div[style*=\"fixed\"] > div > b, .rhsvw span > .fl, .rhsvw span > .fl b, .rhsvw span > b, .rhsvw fieldset > legend {color: #c75805 !important}\n\n.titleBox, .titleBox *, .tablib_selected .tab_content {color: #444 !important; text-shadow: 0 1px 0 #000 !important}\n\n.msel, .msel .kls, .tbos, .tbos b, .tbots, .tbotu, #leftnav > h2, .selectedTab .kdSidebarContent > div, .cb .G-G- {color: Crimson !important}\n.a, .cite, cite, cite a, cite b, #ans > i, .f .bc, cite .bc, #rg_hr, #rg_hr a {color: Orange !important}\n.gac_b *, .gssb_i *, .esc.kb, .ac-row.active, .ac-row.active *, .dropdown-box > div:hover {color: Violet !important}\n.xsm, .psgiprice, .psliprice b, .selectionTools span, .pagination-div a, .f span[style*=\"background:#aaa;border:#999 1px solid;border-radius:2px;\"] {color: #F80 !important}\n#GMmessages a, .bubble .item-body a, .mapBalloon a, .item-body a, #weather .on a, #weather a.active, #weather .active a, #conditions #obsTable .b, #conditions #obsTable .b *, #stars table .b, #conditions .b {color: Purple !important}\n#leftnav a, #leftnav a *, .cb > div, .kdSidebarContent > div, .kdSidebar > div, #talk_title, a.ss-link, .fl > span {color: DeepSkyBlue !important}\n.f, .f span, .osl, .osl a, .bc a, .gl a, .esc > a, #knavm, .pslipricecol cite > a, .goog-date-picker-other-month, .RssSummary div, .RssEntryOuterContent, #bp-bd form span.small, .thread_table .read .thread, .read .subject_and_snippet, #views .Nk.Pk *,\n.tn-snippet, .tn-time, .tn-source, #container .source, #container .source-link {color: Cyan !important}\n.msel, #leftnav > h2 {font-weight: bold !important}\n.msel, #leftnav > h2, .tbos, .selectedTab div.kdTabTitle, .selectedGadgetTitle {text-shadow: 0 1px 0 rgba(0,0,0,0.5) !important}\n.gbts, #gbgs4dn {text-shadow: 0 1px 0 #000 !important}\n#knavm {text-shadow: 0 0 2px #000 !important}\n#content .uim .title-cell strong, #content .uim .callout strong, .thread_table .unread b, .thread_table .selected b, #views .Nk.Ok b {color: #FFF !important; text-shadow: 0 0 6px rgba(255,255,200,0.8) !important}\nspan.bd, .controls > b > a, td.goog-date-picker-month, td.goog-date-picker-year, th.goog-date-picker-wday {border-bottom: 1px dotted #444 !important}\n.f span[style*=\"background:#aaa;border:#999 1px solid;border-radius:2px;\"] {border-style: dashed !important}\n\n#res a:hover img, .videobox a:hover img, .vstb, .vsbb, .vstbb, .vstbt, a:hover .newsimg {border-color: #FA0 !important}\n.f span[style*=\"background:#aaa;border:#999 1px solid;border-radius:2px;\"] {border-color: #F80 !important}\n\na:hover, a:hover *, .link:hover, #gbgs4dn:hover, .cb > div:hover, .kdSidebarContent > div:hover, #sharesLink:hover, #updatesLink:hover, #friendsLink:hover, #talk_title:hover, .as-tip-span:hover, .g a:visited:hover, .g a:visited:hover *, #footer a:hover, #leftnav a:hover, #leftnav a:hover *, .chip_x:hover, .gsib_b:hover, #rg_hta:hover, .goog-date-picker-date:hover, #add_gadget:hover, #change_theme:hover, #themes_keep_theme_link:hover, .selectionTools span:hover, #GMmessages a:hover, .bubble .item-body a:hover {\n color: LightPink !important;\n text-shadow: 0 0 6px rgba(255,255,200,0.8) !important}\na.kd-button:hover *, a.nolink:hover {text-shadow: none !important; color: #999 !important}\ntd.menulist:hover {\n color: #BBB !important;\n background: -o-linear-gradient(left, #333, #111) !important;\n background: -moz-linear-gradient(left, #333, #111) !important;\n background: -webkit-linear-gradient(left, #333, #111) !important}\n\n.vst {border-bottom: 1px dotted #666 !important}\n.g a:visited, .g a:visited * {color: DarkCyan !important}"; if (typeof GM_addStyle != "undefined") { GM_addStyle(css); } else if (typeof PRO_addStyle != "undefined") { PRO_addStyle(css); } else if (typeof addStyle != "undefined") { addStyle(css); } else { var heads = document.getElementsByTagName("head"); if (heads.length > 0) { var node = document.createElement("style"); node.type = "text/css"; node.appendChild(document.createTextNode(css)); heads[0].appendChild(node); } } }{ /* ================================ || Google Images Enhancements || ================================ */ var doubleDecodeURIComponent = function (component){ var tmp = decodeURIComponent(component); tmp = decodeURIComponent(tmp); return tmp; } var parseUrl = function (url) { var qstr = url.split('?'); if (qstr.length <= 1) return []; var rawparams = qstr[1].split('&'); var par = []; for (var i=0 ; i<rawparams.length ; i++){ var p = rawparams[i].split("="); par[p[0]] = p[1]; } return par; } var getImageLinks = function (url) { var param = parseUrl(url); var links = new Object(); links.toImgHref = decodeURIComponent(param["imgurl"]); links.toPageHref = decodeURIComponent(param["url"]); return links; } var getNewImageLinks = function (url) { var param = parseUrl(url); var links = new Object(); links.toImgHref = doubleDecodeURIComponent(param["imgurl"]); links.toPageHref = decodeURIComponent(param["imgrefurl"]); return links; } var firstOrNull = function (elems) { return (elems.length > 0 ) ? elems[0] : null; } var imgTable = firstOrNull(document.getElementsByClassName('images_table')); if ( imgTable ) { // for basic version var imgCell = imgTable.getElementsByTagName('td'); for( j=0 ; j<imgCell.length ; j++ ) { var imageAnchor = imgCell[j].getElementsByTagName('a')[0]; var domainText = imgCell[j].getElementsByTagName('cite')[0]; console.log(imageAnchor.href); var links = getImageLinks(imageAnchor.href); //links.toPageHref = imageAnchor.href; // TODO fixme links.toImgHref = imageAnchor.href; // TODO fixme domainText.innerHTML = '<a href="' + links.toPageHref + '">' + domainText.innerHTML + '/…<\a>'; imageAnchor.href = links.toImgHref; } } else { // standard version console.log("standard version"); var stopEvent = function(event){ event.stopPropagation() } var fixStyle = function(target){ var parent = target.parentNode; parent.style.height = target.style.height; parent.style.width = target.style.width; parent.style.left = target.style.left; target.style.left = 'auto'; } var fixBoxObserver = new MutationObserver(function(mutations){ mutations.forEach(function(mutation) { var target = mutation.target; var parent = mutation.target.parentNode; if (mutation.attributeName === 'style' && target.style.left !== 'auto'){ fixStyle(target); } }); }); var fixBoxMutationConfig = { attributes: true, childList: true, characterData: false, subtree: false }; var fixImageBox = function(image){ if ( /\blinkOk\b/.test(image.className) ) { return; } var span = image.querySelector('span.rg_ilmn'); if (span !== null) { var a = firstOrNull(image.getElementsByTagName('a')); var links = getNewImageLinks(a.href); a.href = links.toImgHref; a.addEventListener('click', stopEvent, false); a.addEventListener('mousedown', stopEvent, false); var newContainer = document.createElement('div'); newContainer.className = 'newCont'; a.parentNode.appendChild(newContainer); newContainer.appendChild(a); newContainer.appendChild(span.parentNode); fixStyle(a); var desc = span.innerHTML; span.innerHTML = '<a style="color:#fff" href="' + links.toPageHref + '">' + desc + '</a>'; image.className += ' linkOk' fixBoxObserver.observe(a, fixBoxMutationConfig); } else { console.log("incomplete span"); image.className += ' notComplete'; } } var fixImages = function(){ var imagesContainer = document.getElementById('rg_s'); if ( imagesContainer == null ) return; var images = imagesContainer.getElementsByClassName('rg_di'); for (var i = 0 ; i< images.length ; i++) { fixImageBox(images[i]); } } var newBoxMutationConfig = { attributes: false, childList: true, characterData: false, subtree: true }; var newBoxObserver = new MutationObserver(function(mutations){ var needFix = false; mutations.forEach(function(mutation) { needFix = needFix || mutation.target.id == 'rg_s'; }); if (needFix) fixImages(); }); fixImages(); newBoxObserver.observe(document.body, newBoxMutationConfig); var css = []; var i = 0; css[i++] = '.newCont { position: relative; }'; css[i++] = '.newCont .rg_ilmbg { display: none; }'; css[i++] = '.newCont:hover .rg_ilmbg { display: block; }'; css[i++] = '.imgSiteLnk {'; ///img preview css[i++] = ' background-color: rgba(255, 255, 255, 0.77);'; css[i++] = ' bottom: 0;'; css[i++] = ' color: #000000;'; css[i++] = ' display: block;'; css[i++] = ' line-height: normal;'; css[i++] = ' position: absolute;'; css[i++] = ' text-decoration: none;'; css[i++] = ' width: 100%; '; css[i++] = ' display: none }'; css[i++] = '.imgPrev:hover .imgSiteLnk { display: block }';///img preview var style = document.createElement('style'); style.type = 'text/css'; style.appendChild(document.createTextNode(css.join('\n'))); document.head.appendChild(style); ///img preview in google search (only links to page) var fixImagePreview = function(div){ var images = document.getElementsByClassName('bicc'); for (var i = 0 ; i<images.length ; i++) { var div = images[i]; var el = div.getElementsByTagName('a'); if ( el.length == 1 ) { div.className += ' imgPrev'; //div.style.border = '4em solid black'; var href = el[0].href; var link = doubleDecodeURIComponent(parseUrl(href)['imgil']); link = decodeURIComponent(link.split(';')[5]); var a = document.createElement('a'); a.href = link; a.className = 'imgSiteLnk'; a.textContent = link.split('/')[2]; div.appendChild(a); } } } var searchObserver = new MutationObserver(function(mutations){ fixImagePreview(); }); searchObserver.observe(document.body, { attributes: false, childList: true, characterData: false, subtree: true } ); // visually similar search img preview (oly links to image) var similars = document.querySelectorAll('div._mj a'); console.log(similars.length) for (var i = 0 ; i < similars.length ; i++){ var a = similars[i]; var href = getNewImageLinks(a.href); console.log(href) if ( typeof href.toImgHref === 'undefined' ) { console.log('skip') continue; } console.log(href.toImgHref) var newA = document.createElement('a'); newA.href = href.toImgHref; newA.appendChild(a.firstChild); a.parentNode.replaceChild(newA, a); } } }{ /* ================================= || Additional Google SearchBar || ================================= */ var langs = { '':'-' ,'Any Language': '-' ,'Spanish': 'es' ,'Russian': 'ru' ,'Portuguese': 'pt' ,'Italian': 'it' ,'Greek': 'el' ,'German': 'de' ,'French': 'fr' ,'English': 'en' ,'==========': '-' ,'Afrikaans': 'af' ,'Arabic': 'ar' ,'Armenian': 'hy' ,'Belarusian': 'be' ,'Bulgarian': 'bg' //,'Catalan': 'ca' ,'Chinese': 'zh-CN' //,'Chinese (Traditional)': 'zh-TW' ,'Croatian': 'hr' ,'Czech': 'cs' ,'Danish': 'da' ,'Dutch': 'nl' //,'Esperanto': 'eo' ,'Estonian': 'et' ,'Filipino': 'tl' ,'Finnish': 'fi' ,'Hebrew': 'iw' ,'Hindi': 'hi' ,'Hungarian': 'hu' ,'Icelandic': 'is' ,'Indonesian': 'id' ,'Japanese': 'ja' ,'Korean': 'ko' ,'Latvian': 'lv' ,'Lithuanian': 'lt' ,'Norwegian': 'no' ,'Persian': 'fa' ,'Polish': 'pl' ,'Romanian': 'ro' ,'Serbian': 'sr' ,'Slovak': 'sk' ,'Slovenian': 'sl' //,'Swahili': 'sw' ,'Swedish': 'sv' ,'Thai': 'th' ,'Turkish': 'tr' ,'Ukrainian': 'uk' ,'Vietnamese': 'vi' }; var filetypes = { '':'-' ,'Any Format': '-' ,'Adobe PDF (.pdf)': 'pdf' ,'Adobe Postscript (.ps)': 'ps' ,'Autodesk DWF (.dwf)': 'dwf' ,'Digital Audio M4A (.m4a)': 'm4a' ,'Digital Audio MP3 (.mp3)': 'mp3' ,'Digital Video Avi (.avi)': 'avi' ,'Digital Video MP4 (.mp4)': 'mp4' ,'Digital Video MKV (.mkv)': 'mkv' ,'Excel Datasheet(.xls)': 'xls' ,'Google Earth KML (.kml)': 'kml' ,'Google Earth KMZ (.kmz)': 'kmz' ,'Metadata File (.torrent)': 'torrent' ,'PowerPoint (.ppt)': 'ppt' ,'Rich Text Format (.rtf)': 'rtf' ,'Shockwave Flash (.swf)': 'swf' ,'WinRAR Archiver (.rar)': 'rar' ,'Word Document (.doc)': 'doc' }; var sitesearches = { '':'-' ,'Any Site': '-' ,'AvaxHome': 'avaxho.me' ,'Ba-K': 'ba-k.com' ,'EbookBrowse': 'ebookbrowse.com' ,'EbooksBay': 'ebooksbay.org' ,'Education': '.edu' ,'Fapdu': 'fapdu.com' ,'FileShut': 'fileshut.com' ,'Gobierno MX': '.gob.mx' ,'Government': '.gov' ,'IATE': 'iate.europa.eu' ,'Identi': 'identi.li' ,'Redalyc': 'redalyc.org' ,'Taringa': 'taringa.net' ,'Twilight': 'twilight.ws' }; var holder = document.createElement('div') ,cboLang = document.createElement('select') ,cboFileType = document.createElement('select') ,cboSiteSearch = document.createElement('select') ,btnSearch = document.createElement('button') ,searchBoxHolderID = 'gbqfw' ,searchBoxID = 'gbqfq' ,query = location.search; /* Fill combo boxes */ for (var l in langs) { cboLang.innerHTML += '<option ' + ((query.indexOf('&lr=lang_' + langs[l]) !== -1) ? 'selected="selected"' : '') + 'value="' + langs[l] + '">' + l + '</option>'; } for (var f in filetypes) { cboFileType.innerHTML += '<option ' + ((query.indexOf('&as_filetype=' + filetypes[f]) !== -1) ? 'selected="selected"' : '') + 'value="' + filetypes[f] + '">' + f + '</option>'; } for (var s in sitesearches) { cboSiteSearch.innerHTML += '<option ' + ((query.indexOf('&as_sitesearch=' + sitesearches[s]) !== -1) ? 'selected="selected"' : '') + 'value="' + sitesearches[s] + '">' + s + '</option>'; } /* Add elements to the page */ holder.setAttribute('style','background-color:inherit;border:1px solid inherit;padding:1px 5px;'); holder.appendChild(document.createTextNode(' Language: ')); holder.appendChild(cboLang); holder.appendChild(document.createTextNode(' File Type: ')); holder.appendChild(cboFileType); holder.appendChild(document.createTextNode(' Site: ')); holder.appendChild(cboSiteSearch); btnSearch.appendChild(document.createTextNode('Search')); btnSearch.setAttribute('style','margin-left:5px;'); holder.appendChild(btnSearch); document.getElementById(searchBoxHolderID).appendChild(holder); /* Search with customized settings */ btnSearch.onclick = function () { var selectedLang = cboLang.options[cboLang.selectedIndex].value ,searchTerm = document.getElementById(searchBoxID).value.replace(/ +filetype:[^ ]*/gi, '') ,selectedFileType = cboFileType.options[cboFileType.selectedIndex].value ,searchTerm = document.getElementById(searchBoxID).value.replace(/ +OR+sitesearch:[^ ]*/gi, '') ,selectedSiteSearch = cboSiteSearch.options[cboSiteSearch.selectedIndex].value ,lang = (selectedLang == '-') ? '' : ('&lr=lang_' + selectedLang) ,filetype = (selectedFileType == '-') ? '' : ('&as_filetype=' + selectedFileType) ,sitesearch = (selectedSiteSearch == '-') ? '' : ('&as_sitesearch=' + selectedSiteSearch) ,url = location.protocol + '//' + location.host + '/search?q=' + encodeURIComponent(searchTerm) + lang + filetype + sitesearch; window.location.replace(url); }; }{ /* ======================================== || Pictures Viewer & Greased LightBox || ======================================== */ (function(topObject,window,document){ 'use strict'; function init(topObject,window,document,arrayFn,envir){ //一些设定。 var prefs={ floatBar:{//浮动工具栏相关设置. butonOrder:['actual','current','magnifier','gallery'],//按钮排列顺序'actual'(实际的图片),'current'(当前显示的图片),'magnifier'(放大镜观察),'gallery'(图集) showDelay:366,//浮动工具栏显示延时.单位(毫秒) hideDelay:566,//浮动工具栏隐藏延时.单位(毫秒) position:'top left',// 取值为: 'top left'(图片左上角) 或者 'top right'(图片右上角) 'bottom right'(图片右下角) 'bottom left'(图片左下角); offset:{//浮动工具栏偏移.单位(像素) x:-15,//x轴偏移(正值,向右偏移,负值向左) y:-15,//y轴偏移(正值,向下,负值向上) }, forceShow:{//在没有被缩放的图片上,但是大小超过下面设定的尺寸时,强制显示浮动框.(以便进行旋转,放大,翻转等等操作).. enabled:true,//启用强制显示. size:{//图片尺寸.单位(像素); w:166, h:166, }, }, minSizeLimit:{//就算是图片被缩放了(看到的图片被设定了width或者height限定了大小,这种情况下),如果没有被缩放的原图片小于设定值,那么也不显示浮动工具栏. w:100, h:100, }, }, magnifier:{//放大镜的设置. radius:77,//默认半径.单位(像素). wheelZoom:{//滚轮缩放. enabled:true, pauseFirst:true,//需要暂停(单击暂停)后,才能缩放.(推荐,否则因为放大镜会跟着鼠标,如果放大镜过大,那么会影响滚动.).. range:[0.4,0.5,0.6,0.7,0.8,0.9,1,1.1,1.2,1.3,1.4,1.5,1.7,1.9,2,2.5,3.0,4.0],//缩放的范围 }, }, gallery:{//图库相关设定 fitToScreen:false,//图片适应屏幕(适应方式为contain,非cover). sidebarPosition:'bottom',//'top' 'right' 'bottom' 'left' 四个可能值 sidebarSize:130,//侧栏的高(如果是水平放置)或者宽(如果是垂直放置) preload:true,//对附近的图片进行预读。 max:5,//最多预读多少张(前后各多少张) }, imgWindow:{//图片窗相关设置 fitToScreen:false,//适应屏幕,并且水平垂直居中(适应方式为contain,非cover). defaultTool:'hand',//"hand","rotate","zoom";打开窗口的时候默认选择的工具 overlayer:{//覆盖层. shown:false,//显示 color:'rgba(0,0,0,0.73)',//颜色和不透明度设置. clickToClose:[true,'click'],//[是否使用点击关闭窗口 "true,false",关闭触发方式,"click,dblclick"] }, zoom:{//滚轮缩放 range:[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.1,1.2,1.3,1.4,1.5,1.7,1.9,2,2.5,3.0,4.0],//缩放比例.(不要出现负数,谢谢-_-!~) mouseWheelZoom:true,//是否允许使用滚轮缩放。 }, }, //旋转的时候,按住shift键时,旋转的步进.单位:度. shiftRotateStep:15, //等图片完全载入后,才开始执行弹出,放大等等操作, //按住ctrl键的时候,可以临时执行和这个设定相反的设定. waitImgLoad:true, //框架里面的图片在顶层窗口展示出来,但是当frame与顶层窗口domain不一样的时候,可能导致图片被反盗链拦截, //按住shift键,可以临时执行和这个设定相反的设定 framesPicOpenInTopWindow:true, }; //各网站高级规则; var siteInfo=[ {siteName:"google图片搜索", //网址例子.(方便测试.查看.之类的) siteExample:"http://www.google.com.hk/search?q=opera&tbm=isch", //是否启用 enabled:true, //站点正则 url:/https?:\/\/www.google(\.\w{1,3}){1,3}\/search\?.*&tbm=isch/, //鼠标左键点击直接打开..(这个只是当高级规则的getImage()返回图片的时候生效) clikToOpen:{ enabled:true, preventDefault:true,//是否尝试阻止点击的默认行为(比如如果是你点的是一个链接,默认行为是打开这个链接,如果是true,js会尝试阻止链接的打开(如果想临时打开这个链接,请使用右键的打开命令)) type:'actual',//默认的打开方式: 'actual'(弹出,原始图片) 'magnifier'(放大镜) 'current'(弹出,当前图片) }, //获取图片实际地址的处理函数, //this 为当前鼠标悬浮图片的引用, //第一个参数为当前图片的引用, //第二个参数为包裹当前图片的第一个a元素(可能不存在). getImage:function(img,a){ if(!a)return; return (a.href.match(/imgurl=(.*?\.\w{1,5})&/i) || [])[1]; }, }, {sitename:"百度图片搜索", enabled:true, url:/^https?:\/\/image\.baidu\.com\/i\?/i, getImage:function(img,a){ var origin=img.dataset['origin']; if(origin){ return origin }else{ if(a){ var onclick=a.getAttribute('onclick'); if(onclick){ return (onclick.match(/u:'(https?:\/\/[^']+)'/i) || [])[1]; }; }; }; }, }, {sitename:"豆瓣", siteExample:"http://movie.douban.com/photos/photo/1000656155/", enabled:true, url:/^https?:\/\/[^.]*\.douban\.com/i, getImage:function(){ var oldsrc=this.src; var newsrc=oldsrc.replace(/\/view\/photo\/photo\/public\//i,'/view/photo/raw/public/'); if(newsrc!=oldsrc)return newsrc; } }, {sitename:"deviantart", enabled:true, url:/^https?:\/\/[^.]*\.deviantart\.com/i, siteExample:"http://www.deviantart.com", getImage:function(){ var oldsrc=this.src; var newsrc=oldsrc.replace(/(http:\/\/[^\/]+\/fs\d+\/)200H\/(.*)/i,'$1$2'); return newsrc==oldsrc? '' : newsrc; }, }, {sitename:"opera官方论坛", enabled:true, url:/^http:\/\/bbs\.operachina\.com/i, siteExample:"http://bbs.operachina.com", getImage:function(){ var src=this.src; if(/file.php\?id=\d+$/i.test(src)){ return src+'&mode=view'; }; }, }, {sitename:"QQ微博", enabled:true, url:/^http:\/\/[^\/]*t\.qq\.com\//i, siteExample:"http://t.qq.com/p/news", getImage:function(img){ var pic=/(\.qpic\.cn\/mblogpic\/\w+)\/\d+/i;//图片 var head=/(\.qlogo\.cn\/mbloghead\/\w+)\/\d+/i;//头像. var oldsrc=this.src; var newsrc; if(pic.test(oldsrc)){ newsrc=oldsrc.replace(pic,'$1/2000'); return newsrc==oldsrc? '' : newsrc;; }else if(head.test(oldsrc)){ newsrc=oldsrc.replace(head,'$1/0'); return newsrc==oldsrc? '' : newsrc;; }; }, }, {sitename:"新浪微博", enabled:true, url:/^http:\/\/weibo\.com/i, siteExample:"http://weibo.com/pub/?source=toptray", getImage:function(img){ var oldsrc=this.src; var pic=/(\.sinaimg\.cn\/)(?:bmiddle|thumbnail)/i;//图片. var head=/(\.sinaimg\.cn\/\d+)\/50\//i;//头像. var photoList=/\.sinaimg\.cn\/thumb150\/\w+/i//相册 var newsrc; if(pic.test(oldsrc)){ newsrc=oldsrc.replace(pic,'$1large'); return newsrc==oldsrc? '' : newsrc; }else if(head.test(oldsrc)){ newsrc=oldsrc.replace(head,'$1/180/'); return newsrc==oldsrc? '' : newsrc; }else if(photoList.test(oldsrc)){ newsrc=oldsrc.replace('/thumb150/','/mw690/'); return newsrc==oldsrc? '' : newsrc; }; }, }, {sitename:"pixiv", enabled:true, url:/^http:\/\/www\.pixiv\.net/i, getImage:function(img){ var oldsrc=this.src; var reg=/(\d+)(_\w)(\.\w{2,5})$/i if(reg.test(oldsrc)){ return oldsrc.replace(reg,'$1$3'); }; }, }, {sitename:"沪江碎碎", enabled:true, url:/^https?:\/\/([^.]+\.)*(?:yeshj\.com|hjenglish\.com|hujiang\.com)/i, getImage:function(img){ var oldsrc=this.src; var reg=/^(https?:\/\/(?:[^.]+\.)*hjfile.cn\/.+)(_(?:s|m))(\.\w+)$/i; if(reg.test(oldsrc)){ return oldsrc.replace(reg,'$1$3'); }; }, }, {sitename:"百度贴吧", enabled:true, url:/^http:\/\/tieba\.baidu\.com\/.+/i, getImage:function(img){ var src=img.src; var reg=/^(http:\/\/imgsrc\.baidu\.com\/forum\/)ab(pic\/item\/[\w.]+)/i var result=src.match(reg); if(result){ return result[1]+result[2]; }else{ var id=img.id; if(id.indexOf('big_img_')==0){ return src; }; }; }, }, {sitename:"178.com", enabled:true, url:/^https?:\/\/(?:\w+\.)+178\.com\//i, clikToOpen:{ enabled:true, preventDefault:true, type:'actual', }, getImage:function(img,a){ if(!a)return; var reg=/^https?:\/\/(?:\w+\.)+178\.com\/.+?(https?:\/\/img\d*.178.com\/[^.]+\.(?:jpg|jpeg|png|gif|bmp))/i; var matched=a.href.match(reg); return (a.href.match(reg) || [])[1]; }, }, ]; //通配型规则,无视站点. var tprules=[ function(img,a){//解决新的dz论坛的原图获取方式. var reg=/(.+\/attachments?\/.+)\.thumb\.\w{2,5}$/i; var oldsrc=this.src; var newsrc=oldsrc.replace(reg,'$1'); if(oldsrc!=newsrc)return newsrc; }, ]; //图标 prefs.icons={ actual:'', magnifier:'', current:'', gallery:'', loading:'data:image/gif;base64,R0lGODlhGAAYALMPACgoKOnp6cnJyaamppmZmVhYWGdnZ3d3d4aGhgEBAdnZ2UNDQ/b29r29vbGx sf///yH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/ IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRv YmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwg MjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8v d3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiBy ZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxu czp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0 dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9y VG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9Inht cC5paWQ6QUU5MTZGNDMxQ0E4MTFFMkE1Q0NEMTFGODU0MkUzNzUiIHhtcE1NOkRvY3VtZW50SUQ9 InhtcC5kaWQ6QUU5MTZGNDQxQ0E4MTFFMkE1Q0NEMTFGODU0MkUzNzUiPiA8eG1wTU06RGVyaXZl ZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBRTkxNkY0MTFDQTgxMUUyQTVDQ0QxMUY4 NTQyRTM3NSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBRTkxNkY0MjFDQTgxMUUyQTVDQ0Qx MUY4NTQyRTM3NSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4g PD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb 2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOi oaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2pp aGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEw Ly4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAUFAA8A LAAAAAAYABgAAATMMMlJq710GQQAMgBmLYMSKMuirMQiSocZnOlqH68h06qtFJhPomASEDoEwQpY MFQWM2fhEJoADkyBwDVxMBgBp6igVBAm0C8D8YqtBFWDWlHFABo2MQLMGLwkCFoCbAkAKQt1IoaL Eh2Of4WOVQUDBANiL4ENAjgJJAOViRYADoJAhZagpxgGgg11BqAtLwWbgxQABLMaiQAGLrUNXGgu JA4EVB4DDQ7AmE8DDtIDHQ4N18200dIO1dfMq3YI0dSkDQMckI1NHb+i6vARACH5BAUFAA8ALAAA AAABAAEAAAQC8EUAIfkEBQUADwAsAQABABYAFgAABJbwySkPoYtq6gILEzhsmsd8YQCS4YlK6roV meEpY0gdE0AQNQRLolBMDoMBcEiUjHzJQYFJUSwW0QtVQCkoBwbqg1A0PgBo8SSj3mRqjjhPLVAI 444cs1EOD/BhQwdlXA8HcXpDdQpaD0lMcw8ChRJTEg4NiQ4CDZYsmA0NDhINk5yeG6ANE6WTq0MZ mKMPpa9tcweoFBEAIfkEBQUADwAsAAAAAAEAAQAABALwRQAh+QQFBQAPACwBAAEAFQAVAAAEgvDJ +cAykhzKJzjEQABPwARONxXhIJImc6rP0r6lfGKqLfIDxe7Bk7gki0IHgSlKHI4BjRMIGKGpqaRq fWC1FK4BuwGbz+gOqfFgmwkKhaRBPws4dPdZ3m5ktXwUWUoqhHEdBQ0CDggZDYGFigICbgJxCncq BpKUEpZxAk4dipWYHREAIfkEBQUADwAsAAAAAAEAAQAABALwRQAh+QQFBQAPACwBAAEAFgAWAAAE n/DJKcs0C9A9FxrO8ADEQBzcBjrhWA6mlT5rS8Lmwhky+KAPQ4mgeyA6LFmqUAwEZIhGw6FMGQIM BkXaMMwkiKz2UeCKvhKFGNUAoyUDBpbwrkuK9oXuIGgIjnYTBQKEDnZOARJ+hEAzCIgPOgiEDVUz TmcPUjKNE4AzMgIKbRMCDwoSBp2lCq2mC6hpaKKukbF2BKICerFEdQsGgJ8cEQAh+QQFBQAPACwA AAAAAQABAAAEAvBFACH5BAUFAA8ALAEAAQAWABYAAASU8Mk5zyw0a9ecHM6AABrFNd3nrEMpFWf6 gKz7eq10gPmCTaiJwbYgEEgSgaBhkxQHA8ujoRQ0HwUolFT1XAnagoV6lRgG4GE5A2hTkGuKQvEg lAeMAMM+VzCvCgyCUn1lgnkTc1ZNBnoMXg9KV0ONARRqDwoBAnYSmg+YJXQBAXQSpJahGZ+lE6im TXQKSK1rcGYuEQAh+QQFBQAPACwAAAAAAQABAAAEAvBFACH5BAUFAA8ALAEAAQAWABYAAASV8MlJ 5amYkiaadI3zLJlkcEL3NaxYPqj6gO0rcQ5ChUWWSj2MYTIYkB4EhUJgkwwcOYlAqbjYoK4H1dOc QaVMQvfgeEpIx25lwVY/APCHTqs2DAiD4YTZxBdJfHI2BUV3AEgSCk0LflYkihJzGYwEhxV6FAMP DAFnQRRDnWcPAQymohlWoiSlpg9WJZqdrAwPml1pTREAIfkEBQUADwAsAAAAAAEAAQAABALwRQAh +QQFBQAPACwBAAEAFgAWAAAEi/DJKQ2iOFOhhGxCo2Gc0n1C2hjjU54PqBbZMXGihDjhxE6mloT2 cDgAGIVQ4mjkHsplxdlwPH5SyYAqMUWzVpsEmS2bywfHwGoIuL9Co4OmcAek8sHEnV1bgVeBGQUL WnoUPwEMCocGBAMEhS2KDAx3AI8DkJIalJYPmJqbcYqXjwQGZEsHBEOcGBEAIfkEBQUADwAsAAAA AAEAAQAABALwRQAh+QQFBQAPACwBAAEAFgAWAAAEk/DJSSUyNc+hnlqPoAiENh2dlIrKaKrTF7au hnlhKTV1YUuHTPBRaDRAj0Eg8JoUBQLKktkMQRuSabTqgEYR1KpF0NhKkOK0mhFgDNSOR5BBTw+M WAmdUTXgN3QBNy8ORghSZz4Vgw5xJ2cEAwQ3BwMOby8LkQOSAEmNly8Fm5yelo0DihoAB5EEppdD VQALN4MZEQAh+QQFBQAPACwAAAAAAQABAAAEAvBFADs=', loadingCancle:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0 NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl SUQ9InhtcC5paWQ6MzBFMjYzRTUxQ0IwMTFFMkE5RkRDMDFGNUY3NTA2OTYiIHhtcE1NOkRvY3Vt ZW50SUQ9InhtcC5kaWQ6MzBFMjYzRTYxQ0IwMTFFMkE5RkRDMDFGNUY3NTA2OTYiPiA8eG1wTU06 RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozMEUyNjNFMzFDQjAxMUUyQTlG REMwMUY1Rjc1MDY5NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozMEUyNjNFNDFDQjAxMUUy QTlGREMwMUY1Rjc1MDY5NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w bWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmI2XfsAAADqSURBVHja7FTLDYMwDI1puwQr5MCJKZCy B3cklsg9GzAAEjAEezBFhRtHISr/T9VD1VgyJP68ZzsBQET2TQFP8McEaZoGJ7F6pdTMeN9KaNv2 nR3iODYLbaeX82k7nO6g67oRiBCC6VgDBABYluUIhx5hGM5w9sbgKrOARLgIfrWDQXCvgLUOVgmi KGJ2HEarqhoFJklicod8zjkriuL0iLY6OHS/jxCgrn5mtDb8lADrunabPM8fpMPe+vASAc20aZrp gT6tusOlGIpdk60PLciy7EYLKWW/dIO0P5gU2vu/qSf4QYKXAAMAJ5qBE+5PPaUAAAAASUVORK5C YII=', hand:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0 NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl SUQ9InhtcC5paWQ6QjI3OEJEQkYxQ0U3MTFFMjg5NDZFNzJBMTc5RTBBMzMiIHhtcE1NOkRvY3Vt ZW50SUQ9InhtcC5kaWQ6QjI3OEJEQzAxQ0U3MTFFMjg5NDZFNzJBMTc5RTBBMzMiPiA8eG1wTU06 RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCMjc4QkRCRDFDRTcxMUUyODk0 NkU3MkExNzlFMEEzMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCMjc4QkRCRTFDRTcxMUUy ODk0NkU3MkExNzlFMEEzMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w bWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjEL5KQAAAHBSURBVHja5FRNywFhFGVmkM9EEaWQEik1 Fqws/AWJn2Dl/8haKTsW/ANljaQslLLwka98NjNOpvTkfeadUXo371k83bndOXPuufcZfT6f130D jO5L+EOi0Wg0GAxUyzhqdj6fX6/XYDDIsmytVlssFo1G43w+z2Yzh8Ph9/u1KspkMsViURRF+dHn 8+G0WCzVarVQKHygqFQqCYIwHo+Px+MrGY1GcTqdzg882mw2OMPhMOheSbvdTvY+nU7ViWCKJEmx WOx0OklPrNdrtCbHt9stnU6Xy2V1ot1uB4O8Xq/b7RafQEfJZBLB/X4/HA5YY7PZTL7CxuNxOdpu t5g0JNhsNqPRGIlE8PFUKiWrgAQ5QNcejycQCGCsqKcQ8TxfqVSsVmu/30d1NpuVaHC5XGAxmUyt VgtfpUxtuVxyHIfBJxKJer2+3+9hitL6YaFQT28N9AzDhEIhGAF1l8vFYDBQRWFLu90uKed9j3q9 HkwFF4rgJTl7EhC7Wq1U9qjT6UAzLBCVIW+Z+kI2m01MEIGgAK1EQLvdFpTxZvNvRPBoOBxS+8IQ cD+0XlpgMpnkcrmfefIak9D/53+2RjwEGAAlkHhWHev9/QAAAABJRU5ErkJggg==', rotate:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0 NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl SUQ9InhtcC5paWQ6RjM2M0UyRTcxQ0U3MTFFMjgxRDNEQkM4N0Q3NTg2QkMiIHhtcE1NOkRvY3Vt ZW50SUQ9InhtcC5kaWQ6RjM2M0UyRTgxQ0U3MTFFMjgxRDNEQkM4N0Q3NTg2QkMiPiA8eG1wTU06 RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGMzYzRTJFNTFDRTcxMUUyODFE M0RCQzg3RDc1ODZCQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGMzYzRTJFNjFDRTcxMUUy ODFEM0RCQzg3RDc1ODZCQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w bWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlX779gAAAJXSURBVHja3JQ5a6pREIbzqbigoqBeNyI2 pghEAnZiJZZ2/gMLQZBgoYUEXIJgYyD+gYhYxcJGtDKQH6CIImKhuIAGFHHfl9yXyPV6DZoUKS6Z YjhHzzxn5p05H2EwGM6+w0hn32T/H4hy7I/RaNTpdCaTCYVCWa1W6/X617vVajV4BoPxOQgx1WpV oVCYzWa5XD6fz2k0Gn58fHxMJpMmk+n5+RlbMpm8H0UcdA0n6vX67e2tQCCIx+OlUqlQKFxeXl5f X+t0OuQokUiAttvtfD5/n3Wo0XA49Hq9r6+vgUAAFKSGLXw6nQady+WiWFx2c3OD+05lpNfrZ7MZ SsAa8R6Ph0qlLhYLv99/d3fH4XB2J/v9Pi47CtpZLpfTarVisVilUkEjsFwuFyT7avszmUyr1cLC arUul8tsNnt/f48t8kJ2yPGrIIfDgRgsNBoN2ux2u5VKZT6fh3aQ1ul0HmMdglgslsVi2Sa1NQj8 9PQUiUQwTSQSCZJXKpXPQegFhCAIYrPZNJtNeOTi8/l4PN763cBC1h9ZpH11Go0GWo6bUQK80WiE Pz8/Z7PZ0Gv9x8B6eHg4CrLZbEwm8+XlBY8ABSKATqfDq9VqeIzfDiQUCkOh0NEngmvRl0Qi0W63 RSLRwblutwsEFlKpNBgM9nq9gwNkjP92hXbIZLKrqys8js2/ViwW397eoDooyAWjeEpsDHQ0GsUL WH0w5IhROEE57BpYsVjsIwjtu7i4CIfDg8Hg2ED+LW1r4/EYg4dm7+pKpVLlchkjPp1OT3zYiJ/7 8f8twABFT5G5Yf+a5QAAAABJRU5ErkJggg==', zoom:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0 NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl SUQ9InhtcC5paWQ6MzI2NDFENzExQ0NBMTFFMjhDOUNGQ0NDOTYzODI4REUiIHhtcE1NOkRvY3Vt ZW50SUQ9InhtcC5kaWQ6MzI2NDFENzIxQ0NBMTFFMjhDOUNGQ0NDOTYzODI4REUiPiA8eG1wTU06 RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozMjY0MUQ2RjFDQ0ExMUUyOEM5 Q0ZDQ0M5NjM4MjhERSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozMjY0MUQ3MDFDQ0ExMUUy OEM5Q0ZDQ0M5NjM4MjhERSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w bWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjUXtsUAAAHTSURBVHjazJTHakJREIZzc63YS2xYsKx0 5cYXEHwBfQb3PpgbwRdw60oXtoWoWBAL9i7mQyGERMNNWeRfXA4znO/M/GfuEZLJ5NNf6Pnpj/T/ QLK70cPhMBgMlsslC4VCodPpnE4ni++BVqsViFQqFQgEjEbjbDZrNpu5XA6cVqt9BBLD4fCHWuRy eSaT4fxOp1Ov17fbrdvtTiQSpVLpdDqJoijJo/1+n06nQTQajcvlQkXn87larbZaLeJkpZodj8fp pd/v04UgCFD46vX6Xq83nU7JSgX5/X4oarWawyFOJpP5fL7b7TQaDXGyUs2mF7ygKTafryKITSqV itKi0ajUiqjCZDJh6of48XgkTlYqaDQacUcc/nyVeNVt7fV6y+UylUoCFYtFs9nMBMES3ykYDNps NpfL1e1277LuzNFwOIzFYlarFYPokUUkEgmFQuv1+uWqQqHAncpksq9AaLFYMERs8Hg8ZNnD3dGa wWDgGIfDYbfbP7ME6e8RPw30zWbDGrOy2azP53sb9DsVPVKlUuEe+OPwiH6xkgjz9W0QqtVqsGjq xrrN6g/fI56B8XhssVgY3bdyHr5HXyufz+OOUqnkB/wVCLXb7X//Zr8KMADSBu6sAZizOwAAAABJ RU5ErkJggg==', flipVertical:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0 NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl SUQ9InhtcC5paWQ6Mzc5RkM3NzYxQ0Y0MTFFMkFGQzk4NzFDMzc4MTVBMTIiIHhtcE1NOkRvY3Vt ZW50SUQ9InhtcC5kaWQ6Mzc5RkM3NzcxQ0Y0MTFFMkFGQzk4NzFDMzc4MTVBMTIiPiA8eG1wTU06 RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozNzlGQzc3NDFDRjQxMUUyQUZD OTg3MUMzNzgxNUExMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozNzlGQzc3NTFDRjQxMUUy QUZDOTg3MUMzNzgxNUExMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w bWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoWGg/MAAAFCSURBVHja3JTNboMwDMftaVyKVlrYCU68 Ae/Ci/MQE1JRCuok1gNCnuMExgQEJnGaUaIA8S9/fwDmeQ5H2AscZIeBXqc3Xde1bcvzppvneb7v 87wMSpIkjuOdEsqyrKpqGcSUoigQkPQgQuQZkN8gkKz0JUuALMtWQWxBEOyRQ+4csYXXUCTovYR6 IGo3lHsYFRJtgKL3SPbooSMD8TPBoDxGOYeo73snKArFGa2z4AxJpOEo7XarXKArhzac7TKEDdDb +Qw/9TGx2AFDesAG7MyRfzqtVAn/0NlsX88n6BzIhNNiGyGms+ZFm4E+H495OrYStgSq68Y0r9QK x8sCLdH0lhN0r5XeRxYCQ3bpl7gFkTOQuoNtOrQlI3HTeZl8bQCX4OICNU2z8+t3gZRSaZruBPHm VdCH2H/5Zx8G+hZgAJcamqB3G0N7AAAAAElFTkSuQmCC', flipHorizontal:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0 NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl SUQ9InhtcC5paWQ6NUVBRDRDOTkxQ0Y0MTFFMkI0OUU5NThEQzI4NTFGNDMiIHhtcE1NOkRvY3Vt ZW50SUQ9InhtcC5kaWQ6NUVBRDRDOUExQ0Y0MTFFMkI0OUU5NThEQzI4NTFGNDMiPiA8eG1wTU06 RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1RUFENEM5NzFDRjQxMUUyQjQ5 RTk1OERDMjg1MUY0MyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1RUFENEM5ODFDRjQxMUUy QjQ5RTk1OERDMjg1MUY0MyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w bWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pnl92swAAAFKSURBVHja3JTJjoMwDIbxqBw6SKVAT3Di DXgX3l9cRkhFLKIjekHIk9gJoXQhB07jILPFX37bAcjz3NnDvpydbDfQYXkzjuMwDMJvhrmu63me 8K9BSZLEcWwpoSzLqqpegwSlKIogCKJLFIWXMAxOvv99PA73++/t1nVt07RN3bRd2/d9lmVL0Lsa gRhkSA75Sp7h4fUnEIhZKkhPpzhyqPBg1TVAMcBEMJnRjAJECxBKkloUlo+FWLkG8S1SU8sDPjDm M2u0UwScnJFDUCEHqIIrpR9qhHIAeZ2Tfj4rsUptlZW6RWSk2RAbIFw2Ho2nxFSN0E4RzUe9qUxi YPTZ1Agck5rqDhdbooC1gGNZbN7JWpFOEFbpb9VIBZnNrLCyj6KZT4znr7+u6zRNxcU0Tdequi4+ 7tn881kcPPkt6Ifsv/yzdwP9CTAAzDedWzss4SgAAAAASUVORK5CYII=', close:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAARCAIAAAAt9wkYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0 NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl SUQ9InhtcC5paWQ6Q0I3NzA1RDAxQ0Y3MTFFMkJGMTU4MTc4OEQ2N0MzQjkiIHhtcE1NOkRvY3Vt ZW50SUQ9InhtcC5kaWQ6Q0I3NzA1RDExQ0Y3MTFFMkJGMTU4MTc4OEQ2N0MzQjkiPiA8eG1wTU06 RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDQjc3MDVDRTFDRjcxMUUyQkYx NTgxNzg4RDY3QzNCOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDQjc3MDVDRjFDRjcxMUUy QkYxNTgxNzg4RDY3QzNCOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w bWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUW1owAAADqSURBVHja5FWxCoQwDL2W+x4X/QmHujvX zV0XadHN31HUn2gR/KD2AgWRAytETpTLEF5eSfqaaEvyPH/dw97W2rtIMcY8uytKKQeiKPKTP5fS dZ0DSZKEYQhAa72SdV0japIsy3D9XPdjjIHv+96FUkpPFqV0VwrnHD3dpmm+GCHEwdEJ2VVpTlhV VdtaEB6m2H2j9oTN87yVAuFhikclviuw8TAMWykQAonuCvJeWZZlmiaHy7IE37Yt+HEc4zgOggBR EzmgVUdRFI4B4BhYwg2IpGl65ZXq+ZmvfoM838MfP4fPGNBHgAEAi7gyuvHuhZcAAAAASUVORK5C YII=', rotateIndicatorBG:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALoAAAC5CAYAAACfmiVfAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0 NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu MC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVz b3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1N Ok9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowNDQzRDlCNjE4MjRFMjExQTlDNjhCQTlBOTYy NUVGMyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGRDEzOEEzQTI0MjAxMUUyOTRGREE2Njky QjdBREQ5OCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGRDEzOEEzOTI0MjAxMUUyOTRGREE2 NjkyQjdBREQ5OCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dz KSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjMwOTI1OTNB MUUyNEUyMTFBOUM2OEJBOUE5NjI1RUYzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA0NDNE OUI2MTgyNEUyMTFBOUM2OEJBOUE5NjI1RUYzIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpS 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 9BnasNkcSoMAAAAASUVORK5CYII=', rotateIndicatorPointer:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAADxCAYAAACEXZTsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0 NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl SUQ9InhtcC5paWQ6OTQ0RjM2N0YyNDJFMTFFMjk1QkFBRDIwRTU4OTdBRDgiIHhtcE1NOkRvY3Vt ZW50SUQ9InhtcC5kaWQ6OTQ0RjM2ODAyNDJFMTFFMjk1QkFBRDIwRTU4OTdBRDgiPiA8eG1wTU06 RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5NDRGMzY3RDI0MkUxMUUyOTVC QUFEMjBFNTg5N0FEOCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5NDRGMzY3RTI0MkUxMUUy OTVCQUFEMjBFNTg5N0FEOCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w bWV0YT4gPD94cGFja2V0IGVuZD0iciI/Psfyr6YAAArZSURBVHja3J1bbyNJFcfL7cT25D6Jc2Em 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', arrowTop:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAdCAYAAADsMO9vAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0 NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl SUQ9InhtcC5paWQ6QjNFMkVGMDEyQzI0MTFFMjg3QzRFMzA4RUMzNUU1M0UiIHhtcE1NOkRvY3Vt ZW50SUQ9InhtcC5kaWQ6QjNFMkVGMDIyQzI0MTFFMjg3QzRFMzA4RUMzNUU1M0UiPiA8eG1wTU06 RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCM0UyRUVGRjJDMjQxMUUyODdD NEUzMDhFQzM1RTUzRSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCM0UyRUYwMDJDMjQxMUUy ODdDNEUzMDhFQzM1RTUzRSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w bWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlvCjVAAAAD/SURBVHja1JjRDYQgDIbZgBEYwREcgREY xREcoSMxwo3gCHc+0MQQPCgUKCT/G8r3GW0RpfoNfceHaLXYQPhvyFISJoJ/Shjp8NudKwGPucKc JeFFS9hC+KeElQLvCOBx3Mrw0yVOBnjMORoeGOExIBEeKuYP664UGIpEl67dAj9dwjDA10o0bz1K uyulmlCqV1PXpsK7Tv2jSsJ2hK+VsD1u3NpJ2dcaCc++JvXj2hnL9N5aLGBUZWAsGiAJvknCC4Gv kfC4Tchd8Bn8G7iFNXMPVJdYzzoS+bf/Sr4NThB8TuK1lB4CD6NiiaPkh0XaSRpKQOlkiceASa6f AAMADgHRdvHjSZ0AAAAASUVORK5CYII=', arrowBottom:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAdCAYAAADsMO9vAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0 NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl SUQ9InhtcC5paWQ6Qzg4RUFEREQyQzI0MTFFMkJGRTVENTM1RUFERUEyNjMiIHhtcE1NOkRvY3Vt ZW50SUQ9InhtcC5kaWQ6Qzg4RUFEREUyQzI0MTFFMkJGRTVENTM1RUFERUEyNjMiPiA8eG1wTU06 RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDODhFQUREQjJDMjQxMUUyQkZF NUQ1MzVFQURFQTI2MyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDODhFQUREQzJDMjQxMUUy QkZFNUQ1MzVFQURFQTI2MyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w bWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pl7tKzkAAAEVSURBVHja1JjREYQgDES5CizhSqAES7gS UoolUAIlUcKVQAmRD5hhPBXDkRgzk79V3uK4Roz5LZ86pJ6Mnpoyk28Jl9SYW4uJAl+4liMhVCIt JrbwpWErtKnjjvBOE0fwmFltLTyCL/2tLxAom9c8Y4plY0NDuOuaGT5eZAoldVCJCQo81qmkwUQ3 fClHNDEPhJ+J8I4SpWcNA+CHrylpgm2tD/GRAjN8zEysLxUwwlupZHAX7umkE+9N+NhhY2KkxHXI a7PPJVdNUOGHz1//mLgdvncnfYdepDwxv1XB96TJiPRiKRgAD+bmgifD944eXaOBlj8pqT87FhOq 4Vujx9DRQPpIRNtJH8kEK/wLEc2TaxVgABhX1Dief8wFAAAAAElFTkSuQmCC', arrowLeft:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAwCAYAAADtoXHnAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0 NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl SUQ9InhtcC5paWQ6NTkwNjJDNTkyQzI0MTFFMkI0NzZFM0NEMTRCQUU4NzAiIHhtcE1NOkRvY3Vt ZW50SUQ9InhtcC5kaWQ6NTkwNjJDNUEyQzI0MTFFMkI0NzZFM0NEMTRCQUU4NzAiPiA8eG1wTU06 RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1OTA2MkM1NzJDMjQxMUUyQjQ3 NkUzQ0QxNEJBRTg3MCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1OTA2MkM1ODJDMjQxMUUy QjQ3NkUzQ0QxNEJBRTg3MCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w bWV0YT4gPD94cGFja2V0IGVuZD0iciI/Ps3mm0sAAAEHSURBVHjaxNhhDcMgEIZhMgOVMAmVMAmV gJRJQAKSJmESJoHRhSVkNIM7oC/J/WrSJ2nhA86EEMyk4WM9Yi3Fk0noDoZUr1jrbNRlYA7bWag9 APO6j0Zr4Lf8KHRrBMNncg1A1/TP2sB9NneicrDzn15VYAe6pBe1gM8iIBSoBCyDQYn2gQrUd4NC dAwoQJ1g8d+qb2tArQC0Td+sgo4HK+g2BfyDSuLNiqPlAJWAThWgP6gkT716m8hQSbzpwQw9D8zQ 88A4LoYY5OdFJhK2ZLBwwGIQC3xsa8M2cey4gh3MsCModtjGrhXIBQq7KmKXYuz6jzU6sJYO1rzC 2nRYQ7Laen0LMACbElNZVX4epQAAAABJRU5ErkJggg==', arrowRight:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAwCAYAAADtoXHnAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0 NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl SUQ9InhtcC5paWQ6N0M5MkUyMEIyQzI0MTFFMkJEREE4MzFDNDE2ODE0OTAiIHhtcE1NOkRvY3Vt ZW50SUQ9InhtcC5kaWQ6N0M5MkUyMEMyQzI0MTFFMkJEREE4MzFDNDE2ODE0OTAiPiA8eG1wTU06 RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3QzkyRTIwOTJDMjQxMUUyQkRE QTgzMUM0MTY4MTQ5MCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3QzkyRTIwQTJDMjQxMUUy QkREQTgzMUM0MTY4MTQ5MCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w bWV0YT4gPD94cGFja2V0IGVuZD0iciI/PrqtTzoAAADVSURBVHja5NjhCYMwEAXgows4giN0BEdw hBvFETpCRsoIjuAINsIJpfgjoZf3YhN4/4QPgj6TE7leQ0pMCQJaz5QtZbdUh/ULPPOqBS4X2GfU ExtsC/eMqCcaM9EjMwPe7GXrCx494TUTjvZ8lYJoFhYGHP4CngrKw7WntQDW7uCZAbvWpdgLQ4ED o6dLYNe6vAf8kBsv+PY2C7p9MvBy0FZBt8KH/9rgIPy4Aj+YNQ1GBvhzvcEvUPCrIvxSTLmFwwcd lJEOZXhFHdPRBpKQ0etbgAEA5TXHBKbv1IkAAAAASUVORK5CYII=', }; //获取位置 function getTargetPosition(target){ var target=target; var rect=target.getBoundingClientRect(); var compStyle=getComputedStyle(target,''); var pFloat=parseFloat; var t=rect.top + pFloat(compStyle.paddingTop) + pFloat(compStyle.borderTopWidth); var l=rect.left + pFloat(compStyle.paddingLeft) + pFloat(compStyle.borderLeftWidth); var r=rect.right - pFloat(compStyle.paddingRight) - pFloat(compStyle.borderRightWidth); var b=rect.bottom - pFloat(compStyle.paddingBottom) - pFloat(compStyle.borderBottomWidth); var scrollXY={ x:window.scrollX, y:window.scrollY, }; return { t:t, l:l, r:r, b:b, top: t + scrollXY.y, left: l + scrollXY.x, right: r + scrollXY.x, bottom: b + scrollXY.y, }; }; //获取窗口大小. function getWindowSize(){ //window.innerHeight;window.innerWidth; return { h:window.innerHeight, w:window.innerWidth, }; /* var de=document.documentElement; return { h:document.compatMode=='BackCompat'? document.body.clientHeight : de.clientHeight, w:de.clientWidth, }; */ }; function getCurrentSize(target){//获取页面上显示的图片的宽 高. var iCS=getComputedStyle(target,''); return { h:parseFloat(iCS.height), w:parseFloat(iCS.width), }; }; //xpath 获取单个元素 function getElementByXpath(xpath,contextNode,doc){ doc=doc || document; contextNode=contextNode || doc; return doc.evaluate(xpath,contextNode,null,9,null).singleNodeValue; }; //事件支持检测. function eventSupported( eventName,el ){ el = el || document.createElement("div"); eventName = "on" + eventName; var isSupported = (eventName in el); if (!isSupported && el.setAttribute) { el.setAttribute(eventName, "return;"); isSupported = typeof el[eventName] === "function"; }; return isSupported; }; //检测属性支持. function attrSupported(proName,el){ el = el || document.createElement("div"); var isSupported = (proName in el); return isSupported; }; //css属性支持 function cssProSupported(proName,elem){ var prefix=['','-webkit-','-o-','-moz-','-ms-']; elem=elem || document.createElement('div'); var style=elem.style; var camelPro; for(var i=0,ii=prefix.length;i<ii;i++){ camelPro=(prefix[i]+proName).replace(/-([a-z])/g,function(a,b){ return b.toUpperCase(); }); if(camelPro in style){ return camelPro; }; }; }; //css属性值支持 function cssValueSupported(proName,value,elem){ var prefix=['','-webkit-','-o-','-moz-','-ms-']; elem=elem || document.createElement('div'); var style=elem.style; var prefixedValue; for(var i=0,ii=prefix.length;i<ii;i++){ prefixedValue=prefix[i] + value; style[proName]=prefixedValue; if(style[proName]==prefixedValue){ return prefixedValue; }; }; }; //抛出错误到错误控制台 function throwErrorInfo(err){ if(console && console.error){ console.error(err.message + '\n\n' + (err.stacktrace? err.stacktrace : '') + '\n\n' , err); }; }; //支持情况. var support={ cssTransform:cssProSupported('transform'), cssCursorValue:{ zoomIn:cssValueSupported('cursor','zoom-in'), zoomOut:cssValueSupported('cursor','zoom-out'), }, requestFullscreen:(function(){ var array=['webkitRequestFullScreen','mozRequestFullScreen','requestFullscreen']; var tempEle=document.body; var ret; for(var i=array.length-1;i>=0;i--){ ret=array[i]; if(ret in tempEle){ return ret; }; }; })(), }; //console.log('浏览器的一些对象支持情况:',support); //imgReady var imgReady=(function(){ var iRInterval, iRReadyFn=[], isrcs=[] ; var timeLimit=3 * 60 * 1000;//3分钟 function checkReady(){ var now=Date.now(); for(var i=0,ii=iRReadyFn.length,iRReadyFn_i;i<ii;i++){ iRReadyFn_i=iRReadyFn[i]; //now - iRReadyFn_i.startTime >= timeLimit || if(iRReadyFn_i()){ iRReadyFn.splice(i,1); isrcs.splice(i,1); i--; ii--; }; }; //console.log('checkReady',iRReadyFn.length) if(iRReadyFn.length==0){ clearInterval(iRInterval); iRInterval=null; }; }; var imgReady=function(img,opts){ if(/NodeList|HTMLCollection/.test(Object.prototype.toString.call(img)) || Array.isArray(img)){ arrayFn.forEach.call(img,function(img,index,array){ if(img instanceof HTMLImageElement){ imgReady(img,opts); }; }); return; }; if(!(img instanceof HTMLImageElement)){ var t_img=new Image(); t_img.src=img; img=t_img; t_img=null; }; var ready,load,error,loadEnd,abort,timeout,time; ready=opts.ready; load=opts.load; error=opts.error; loadEnd=opts.loadEnd; abort=opts.abort; timeout=opts.timeout; time=typeof opts.time=='number'? opts.time : 0; if(time){ setTimeout(function(){ if(!loadEndDone){ aborted=true; removeListener(); img.src='data:'; if(timeout){ timeout.call(img,{ target:img, type:'timeout', }); }; loadEndDone=true; if(loadEnd){ loadEnd.call(img,{ target:img, type:'timeout', }); }; }; },time); }; var src=img.src; var loadEndDone; function go(type,e){ switch(type){ case 'load':{ removeListener(); go('ready');//如果直接触发load,那么先触发ready if(load){ load.call(img,e); }; loadEndDone=true; if(loadEnd){ loadEnd.call(img,e); }; }break; case 'ready':{ if(!ready || readyHandler.done)return; readyHandler.done=true; ready.call(img,{ target:img, type:'ready', }); }break; case 'error':{ removeListener(); if(error){ error.call(img,e); }; loadEndDone=true; if(loadEnd){ loadEnd.call(img,e); }; }break; }; }; var aborted; var ret={ img:img, abort:function(){ if(!loadEndDone){ aborted=true; removeListener(); img.src='data:'; if(abort){ abort.call(img,{ target:img, type:'abort', }); }; loadEndDone=true; if(loadEnd){ loadEnd.call(img,{ target:img, type:'abort', }); }; }; }, }; function readyHandler(){//尽快的检测图片大小. if(loadEndDone || aborted)return true; if(img.naturalWidth==0 || img.naturalHeight==0)return; go('ready'); return true; }; function loadHandler(e){ go('load',e); }; function errorHandler(e){ go('error',e); }; function removeListener(){ img.removeEventListener('load',loadHandler,true); img.removeEventListener('error',errorHandler,true); }; //ready必须在load之前触发。 if(img.complete){//图片已经加载完成. if(typeof img.width=='number' && img.width && img.height){//图片 setTimeout(function(){ if(aborted)return; go('load',{ type:'load', target:img, }); },0); }else{//这不是图片.opera会识别错误. setTimeout(function(){ if(aborted)return; go('error',{ type:'error', target:img, }); },0); }; return ret; }; img.addEventListener('load',loadHandler,true); img.addEventListener('error',errorHandler,true); if(ready){ var index=isrcs.indexOf(src); if(index==-1){ isrcs.push(src); readyHandler.startTime=Date.now(); iRReadyFn.push(readyHandler); }else{ iRReadyFn[index].startTime=Date.now(); }; if(!iRInterval){ iRInterval=setInterval(checkReady,66); }; }; return ret; }; return imgReady; })(); var addWheelEvent=(function(){ var eventName; if('onwheel' in document){//w3c FF>=17 ie>=9 eventName='wheel'; }else if('onmousewheel' in document){//ie eventName='mousewheel'; }else{// < FF17 eventName='DOMMouseScroll'; }; return function(ele,callback,useCapture){ ele.addEventListener(eventName,function(e){ var type=e.type; var ne; if(type!='wheel'){ ne={}; for(var i in e){ ne[i]=e[i]; }; ne.type='wheel'; ne.deltaX=0; ne.deltaY=0; ne.deltaZ=0; ne.deltaMode=1;//line ne.preventDefault=e.preventDefault.bind(e); ne.stopPropagation=e.stopPropagation.bind(e); if((typeof e.axis=='number' && e.axis==2) || (typeof e.wheelDeltaY=='number' && e.wheelDeltaY!=0)){//Y轴的滚动 ne.deltaY = e.wheelDeltaY? -e.wheelDeltaY/40 : e.detail; }else{ ne.deltaX = e.wheelDeltaX? -e.wheelDeltaX/40 : e.detail; }; }; callback.call(this,ne? ne : e); },useCapture || false); }; })(); var addCusMouseEvent=(function(){ var tele= document.documentElement || document.createElement('div'); var support={ mouseleave:'onmouseleave' in tele, mouseenter:'onmouseenter' in tele, }; tele=null; var map={ 'mouseleave':'mouseout', 'mouseenter':'mouseover', }; return function(type, ele, fn){//事件类型,元素,监听函数 type=type.toLowerCase(); if(support[type]){ ele.addEventListener(type,fn,false);//mouseleave,enter不冒泡 }else{ ele.addEventListener(map[type],function(e){ var relatedTarget=e.relatedTarget;//mouseout,去往的元素;mouseover,来自的元素 if(!this.contains(relatedTarget)){ fn.call(this,e); }; },true); }; }; })(); //库 function GalleryC(){ this.init(); }; var gallery; var galleryMode; GalleryC.prototype={ init:function(){ this.addStyle(); var container=document.createElement('span'); this.gallery=container; container.className='pv-gallery-container'; container.tabIndex=1; container.innerHTML=''+ '<span class="pv-gallery-head">'+ '<span title="弹出照片进行复杂操作" class="pv-gallery-operate">折腾</span>'+ '<span title="一些命令菜单" class="pv-gallery-commands">命令</span>'+ '<span title="分享" class="pv-gallery-share">分享</span>'+ '<span title="Close | Cerrar" class="pv-gallery-close"></span>'+ '</span>'+ '<span class="pv-gallery-body">'+ '<span class="pv-gallery-img-container">'+ '<span class="pv-gallery-img-container-left-side">'+ '<span class="pv-gallery-img-controler-pre"></span>'+ '</span>'+ '<span class="pv-gallery-img-content">'+ '<span class="pv-gallery-img-parent"><!--图片放在这个里面--></span>'+ '<span class="pv-gallery-vertical-align-helper"></span>'+ '</span>'+ '<span class="pv-gallery-img-container-right-side">'+ '<span class="pv-gallery-scrollbar-v pv-gallery-img-scrollbar-v">'+ '<span class="pv-gallery-scrollbar-v-track pv-gallery-img-scrollbar-v-track">'+ '<span class="pv-gallery-scrollbar-v-handle pv-gallery-img-scrollbar-v-handle"></span>'+ '</span>'+ '</span>'+ '<span class="pv-gallery-img-controler-next"></span>'+ '</span>'+ '<span class="pv-gallery-img-container-bottom-side">'+ '<span class="pv-gallery-scrollbar-h pv-gallery-img-scrollbar-h">'+ '<span class="pv-gallery-scrollbar-h-track pv-gallery-img-scrollbar-h-track">'+ '<span class="pv-gallery-scrollbar-h-handle pv-gallery-img-scrollbar-h-handle"></span>'+ '</span>'+ '</span>'+ '</span>'+ '</span>'+ '<span class="pv-gallery-sidebar-container" unselectable="on">'+ '<span class="pv-gallery-sidebar-content" >'+ '<span class="pv-gallery-scrollbar-h pv-gallery-thumb-scrollbar-h">'+ '<span class="pv-gallery-scrollbar-h-track pv-gallery-thumb-scrollbar-h-track">'+ '<span class="pv-gallery-scrollbar-h-handle pv-gallery-thumb-scrollbar-h-handle"></span>'+ '</span>'+ '</span>'+ '<span class="pv-gallery-sidebar-controler-pre"></span>'+ '<span class="pv-gallery-sidebar-thumbnails-container">'+ '<span class="pv-gallery-sidebar-thumbnails">'+ '<!--用innerHTML写入被span.pv-gallery-sidebar-thumb包裹的img元素,并设置宽度货高度-->'+ '</span>'+ '</span>'+ '<span class="pv-gallery-scrollbar-v pv-gallery-thumb-scrollbar-v">'+ '<span class="pv-gallery-scrollbar-v-track pv-gallery-thumb-scrollbar-v-track">'+ '<span class="pv-gallery-scrollbar-v-handle pv-gallery-thumb-scrollbar-v-handle"></span>'+ '</span>'+ '</span>'+ '<span class="pv-gallery-sidebar-controler-next"></span>'+ '</span>'+ '</span>'+ '</span>'; document.body.appendChild(container); var validPos=['top','right','bottom','left']; var sBarPosition=prefs.gallery.sidebarPosition.trim(); if(validPos.indexOf(sBarPosition)==-1){ sBarPosition='bottom'; }; this.sBarPosition=sBarPosition; this.selectedClassName='pv-gallery-sidebar-thumb_selected-' + sBarPosition; var sBarDirection; var isHorizontal=false; if(sBarPosition=='top' || sBarPosition=='bottom'){ sBarDirection='h';//水平放置 isHorizontal=true; }else{ sBarDirection='v';//垂直放置 }; this.sBarDirection=sBarDirection; this.isHorizontal=isHorizontal; var classPrefix='pv-gallery-'; var validClass=[ 'close', 'body', 'img-container', 'img-scrollbar-h', 'img-scrollbar-h-handle', 'img-scrollbar-h-track', 'img-scrollbar-v', 'img-scrollbar-v-handle', 'img-scrollbar-v-track', 'thumb-scrollbar-h', 'thumb-scrollbar-h-handle', 'thumb-scrollbar-h-track', 'thumb-scrollbar-v', 'thumb-scrollbar-v-handle', 'thumb-scrollbar-v-track', 'img-content', 'img-parent', 'img-controler-pre', 'img-controler-next', 'sidebar-container', 'sidebar-content', 'sidebar-controler-pre', 'sidebar-controler-next', 'sidebar-thumbnails', 'sidebar-thumbnails-container', ]; var eleMaps={}; this.eleMaps=eleMaps; validClass.forEach(function(c){ eleMaps[c]=container.querySelector('.'+ classPrefix + c); }); var posClass=[//需要添加'top bottom left right'class的元素 'img-container', 'sidebar-container', 'sidebar-thumbnails-container', ]; posClass.forEach(function(c){ eleMaps[c].classList.add(classPrefix + c + '-' +sBarPosition); }); var hvClass=[//需要添加'v h'class的元素 'sidebar-container', 'sidebar-content', 'sidebar-controler-pre', 'sidebar-controler-next', 'sidebar-thumbnails', ]; hvClass.forEach(function(c){ eleMaps[c].classList.add(classPrefix + c + '-' + sBarDirection); }); //图片区域水平方向的滚动条 var imgScrollbarH=new this.Scrollbar({ bar:eleMaps['img-scrollbar-h'], handle:eleMaps['img-scrollbar-h-handle'], track:eleMaps['img-scrollbar-h-track'], }, eleMaps['img-parent'], eleMaps['img-content'], true); this.imgScrollbarH=imgScrollbarH; //图片区域垂直方向的滚动条 var imgScrollbarV=new this.Scrollbar({ bar:eleMaps['img-scrollbar-v'], handle:eleMaps['img-scrollbar-v-handle'], track:eleMaps['img-scrollbar-v-track'], }, eleMaps['img-parent'], eleMaps['img-content'], false); this.imgScrollbarV=imgScrollbarV; //缩略图区域的滚动条 var thumbScrollbar; if(isHorizontal){ thumbScrollbar=new this.Scrollbar({ bar:eleMaps['thumb-scrollbar-h'], handle:eleMaps['thumb-scrollbar-h-handle'], track:eleMaps['thumb-scrollbar-h-track'], }, eleMaps['sidebar-thumbnails'], eleMaps['sidebar-thumbnails-container'], true); }else{ thumbScrollbar=new this.Scrollbar({ bar:eleMaps['thumb-scrollbar-v'], handle:eleMaps['thumb-scrollbar-v-handle'], track:eleMaps['thumb-scrollbar-v-track'], }, eleMaps['sidebar-thumbnails'], eleMaps['sidebar-thumbnails-container'], false); }; this.thumbScrollbar=thumbScrollbar; var self=this; eleMaps['sidebar-thumbnails-container'].addEventListener('scroll',function(e){//发生scroll事件时加载缩略图 self.loadThumb(); },false); addWheelEvent(eleMaps['body'],function(e){//wheel事件 var target=e.target; e.preventDefault(); if(eleMaps['sidebar-container'].contains(target)){//缩略图区滚动滚轮翻图片 var distance=self.sideLengthO; if(e.deltaY<0 || e.deltaX<0 || e.deltaZ<0){//向上滚 distance=-distance; }; thumbScrollbar.scrollBy(distance) }else{//图片区域滚动 var distance=100; if(e.deltaY!=0){//y轴 if(e.deltaY < 0){ distance=-distance; }; imgScrollbarV.scrollBy(distance); }else if(e.deltaX!=0){//x轴 if(e.deltaX < 0){ distance=-distance; }; imgScrollbarH.scrollBy(distance); }; }; self.forceRepaint(); },true); var validKeyCode=[38,39,40,37]//上右下左 var keyUp=true; var keyIntervalTimer; container.addEventListener('keydown',function(e){//上下左右切换图片 e.stopPropagation(); var keyCode=e.keyCode; var index=validKeyCode.indexOf(keyCode); if(index==-1)return; e.preventDefault(); if(!keyUp)return;//已按下。 keyUp=false; switch(index){ case 0:; case 3:{ self.selectPrevious(); keyIntervalTimer=setInterval(function(e){ self.selectPrevious(); },800); }break; case 1:; case 2:{ self.selectNext(); keyIntervalTimer=setInterval(function(e){ self.selectNext(); },800); }break; }; function keyUpHandler(e){ if(e.keyCode!=validKeyCode[index])return; this.removeEventListener('keyup',keyUpHandler,false); clearInterval(keyIntervalTimer); keyUp=true; }; this.addEventListener('keyup',keyUpHandler,false); },false); var imgDraged; eleMaps['img-parent'].addEventListener('mousedown',function(e){//如果图片尺寸大于屏幕的时候按住图片进行拖移 var target=e.target; if(e.button!=0 || target.nodeName!='IMG')return; var bigger=target.classList.contains('pv-gallery-img_zoom-out');//如果是大于屏幕 var oClient={ x:e.clientX, y:e.clientY, }; var oScroll={ left:self.imgScrollbarH.getScrolled(), top:self.imgScrollbarV.getScrolled(), }; var moveHandler=function(e){ imgDraged=true; if(bigger){ target.style.cursor='pointer'; self.imgScrollbarV.scroll(oScroll.top-(e.clientY-oClient.y)); self.imgScrollbarH.scroll(oScroll.left-(e.clientX-oClient.x)); }; }; var upHandler=function(){ target.style.cursor=''; //拖曳之后阻止随后可能产生click事件产生的大小切换。 //确保在随后的click事件发生后执行 setTimeout(function(){ imgDraged=false; },0); document.removeEventListener('mousemove',moveHandler,true); document.removeEventListener('mouseup',upHandler,true); }; document.addEventListener('mousemove',moveHandler,true); document.addEventListener('mouseup',upHandler,true); },true); eleMaps['img-parent'].addEventListener('click',function(e){//点击图片本身就行图片缩放处理 var target=e.target; if(e.button!=0 || target.nodeName!='IMG')return; if(imgDraged){//在拖动后触发的click事件,取消掉。免得一拖动完就立即进行的缩放。。。 imgDraged=false; return; }; if(target.classList.contains('pv-gallery-img_zoom-in')){//放大 self.fitContains=false; var zoomX = typeof e.offsetX=='undefined' ? e.layerX : e.offsetX; var zoomY = typeof e.offsetY=='undefined' ? e.layerY : e.offsetY; var scaleX=zoomX/target.clientWidth; var scaleY=zoomY/target.clientHeight; self.fitToScreen({ x:scaleX, y:scaleY, }); }else if(target.classList.contains('pv-gallery-img_zoom-out')){ self.fitContains=true; self.fitToScreen(); }; },true); var mouseIntervalTimer; container.addEventListener('mousedown',function(e){//鼠标按在导航上,切换图片 if(e.button!=0)return;//左键 var target=e.target; if(target.nodeName=='IMG')e.preventDefault(); var matched=true; switch(target){ case eleMaps['img-controler-pre']:; case eleMaps['sidebar-controler-pre']:{//上一个 self.selectPrevious(); clearInterval(mouseIntervalTimer); mouseIntervalTimer=setInterval(function(e){ self.selectPrevious(); },800); }break; case eleMaps['img-controler-next']:; case eleMaps['sidebar-controler-next']:{//下一个 self.selectNext(); clearInterval(mouseIntervalTimer); mouseIntervalTimer=setInterval(function(e){ self.selectNext(); },800); }break; default:{ matched=false; }break; }; function mouseUpHandler(e){//opera,按下左键的时候,按右键然后松开不会触发mouseup,再松开左键,还是不会触发mouseup document.removeEventListener('mouseup',mouseUpHandler,true); clearInterval(mouseIntervalTimer); }; if(matched){ e.preventDefault(); document.addEventListener('mouseup',mouseUpHandler,true); }; },false); eleMaps['sidebar-content'].addEventListener('click',function(e){//点击缩略图切换 if(e.button!=0)return;//左键 var target=e.target; if(!target.dataset['src'])return; self.select((target.nodeName=='SPAN'? target : target.parentNode)); },false); eleMaps['close'].addEventListener('click',function(e){//关闭 self.close(); },false); this._resizeHandler=this.resizeHandler.bind(this); this.sideLength=isHorizontal ? eleMaps['sidebar-thumbnails'].clientHeight : eleMaps['sidebar-thumbnails'].clientWidth; this.sideLengthO=this.sideLength + 3;//加上margin this.thumbSpanStyle=isHorizontal ? ';width:' + this.sideLength +'px;' : ';height:' + this.sideLength +'px;'; container.style.display='none'; }, selectPrevious:function(){ var pre; var _pre=this.selected.previousElementSibling; while(_pre){ if(_pre.clientWidth!=0){ pre=_pre; break; }; _pre=_pre.previousElementSibling; }; this.select(pre); }, selectNext:function(){ var next; var _next=this.selected.nextElementSibling; while(_next){ if(_next.clientWidth!=0){ next=_next; break; }; _next=_next.nextElementSibling; }; this.select(next); }, close:function(){ galleryMode=false; this.gallery.blur(); this.gallery.style.display='none'; var des=document.documentElement.style; des.overflowX=this.deOverflow.x; des.overflowY=this.deOverflow.y; window.removeEventListener('resize',this._resizeHandler,true); }, selectedIntoView:function(){ var thumBC=this.eleMaps['sidebar-thumbnails-container']; //需要滚动的距离。 var needScrollDis=this.isHorizontal ? this.selected.offsetLeft : this.selected.offsetTop; //尽可能的居中显示 var thumBCClient=this.isHorizontal ? thumBC.clientWidth : thumBC.clientHeight; var scrollCenter=Math.max((thumBCClient - this.sideLengthO)/2,0); needScrollDis=Math.max(needScrollDis-scrollCenter,0); this.thumbScrollbar.scroll(needScrollDis); }, select:function(ele){ if(!ele || this.selected==ele)return; if(this.selected){ this.selected.classList.remove(this.selectedClassName); this.selected.classList.remove('pv-gallery-sidebar-thumb_selected'); }; ele.classList.add(this.selectedClassName); ele.classList.add('pv-gallery-sidebar-thumb_selected'); this.selected=ele; var self=this; clearTimeout(this.loadImgTimer); this.loadImgTimer=setTimeout(function(){//快速跳转的时候不要尝试读取图片。 self.loadImg(ele); },200); this.selectedIntoView(); this.forceRepaint(); }, clear:function(){ this.allLoading=[];//读取中的图片数组 this.allImgs={//图片的总类,统计 rule:{ shown:true, number:0, }, tpRule:{ shown:true, number:0, }, scale:{ shown:true, number:0, }, force:{ shown:true, number:0, }, }; if(this.img){ this.img.style.display='none'; }; this.img=null; this.selected==null; this.eleMaps['sidebar-thumbnails'].innerHTML=''; this.imgScrollbarV.hide(); this.imgScrollbarH.hide(); this.thumbScrollbar.hide(); window.removeEventListener('resize',this._resizeHandler,true); }, load:function(img,data,from){ this.clear();//还原对象的一些修改,以便复用。 galleryMode=true; var gallery=this.gallery; var galleryStyle=gallery.style; if(galleryStyle.display=='none'){ var des=document.documentElement.style; this.deOverflow={ x:des.overflowX, y:des.overflowY, }; des.overflow='hidden'; galleryStyle.display=''; gallery.focus(); }; var imgSrc=img.src; var dataSrcs=[]; var data_i; var index; var data_i_src; for(var i=0,ii=data.length;i<ii;i++){//unique顺便算出img所在data中的index; data_i=data[i]; data_i_src=data_i.src; if(dataSrcs.indexOf(data_i_src)!=-1){//已经存在 data.splice(i,1);//移除 i--; ii--; continue; }; dataSrcs.push(data_i_src); if(imgSrc==data_i_src){ index=i; }; }; if(typeof index =='undefined'){ index=0; data.unshift(data.target); }; //console.log(data); this.data=data; this.from=from;//如果来自frame,那么这个from应该保存了那个frame的窗口id,便于以后通信。 var thumbnails=this.eleMaps['sidebar-thumbnails']; if(this.isHorizontal){ thumbnails.style.width=this.sideLengthO * data.length + 'px';//如果是水平放置,需要设置宽度 }; var spanMark=''; var data_i; for(var i=0,ii=data.length;i<ii;i++){ data_i=data[i]; this.allImgs[data_i.type].number++; spanMark += '<span class="pv-gallery-sidebar-thumb-container'+ '" data-type="' + data_i.type + '" data-src="' + data_i.src + '" data-img-src="' + data_i.imgSrc + '" style="'+ this.thumbSpanStyle +'">'+ '<span class="pv-gallery-vertical-align-helper"></span>'+ '<span class="pv-gallery-sidebar-thumb-loading" title="正在读取中......"></span>'+ '</span>'; }; //console.log(this.allImgs); thumbnails.innerHTML=spanMark; //初始化滚动条 this.thumbScrollbar.reset(); this.imgSpans=thumbnails.children; this.select(this.imgSpans[index]); this.loadThumb(); //resize监听 window.addEventListener('resize',this._resizeHandler,true); }, forceRepaint:function(){//解决opera的fixed元素,当滚动条不再最高处的时候,不重绘fixed元素的问题。 if(envir.opera){ window.scrollBy(0,1); window.scrollBy(0,-1); }; }, resizeHandler:function(){//窗口变化时,调整一些东西。 this.fitToScreen(); this.thumbScrollbar.reset(); this.selectedIntoView(); this.loadThumb(); }, getImg:function(ele){ var allLoading=this.allLoading; var src=ele.dataset['src'] var index=allLoading.indexOf(src); if(index!=-1){ allLoading.splice(index,1); }; allLoading.push(src); if(this.imgReady && this.img && this.imgReady.img.src!=this.img.src){ this.imgReady.abort(); this.imgReady.loadingIndicator.style.removeProperty('display'); }; var loadingIndicator=ele.querySelector('.pv-gallery-sidebar-thumb-loading'); loadingIndicator.style.display='block'; var self=this; this.imgReady=imgReady(src,{ ready:function(){ if(allLoading.indexOf(src)!=allLoading.length-1)return;//如果不是最后一张 loadingIndicator.style.removeProperty('display'); self.loadImg(this); }, loadEnd:function(){//在loadend后开始预读。 if(allLoading.indexOf(src)!=allLoading.length-1)return; if(self.preloading){//结束上次的预读。 self.preloading.finish(); }; //console.log(this,'预读开始'); if(prefs.gallery.preload){ self.preloading=new self.Preload(ele); }; }, }); this.imgReady.loadingIndicator=loadingIndicator; }, Preload:function(ele){ this.ele=ele; this.init(); }, Scrollbar:function(scrollbar,content,container,isHorizontal){ this.scrollbar=scrollbar; this.content=content; this.container=container; this.isHorizontal=isHorizontal this.init(); }, loadImg:function(img){ if(img.nodeName!='IMG'){//先读取。 this.getImg(img); return; }; if(this.img){ this.img.style.display='none'; }; this.img=img; img.className='pv-gallery-img'; this.eleMaps['img-parent'].appendChild(img); this.fitContains=prefs.gallery.fitToScreen;//适应屏幕 this.fitToScreen(); }, fitToScreen:function(scale){ var container=this.eleMaps['img-content']; var containerSize={ h:container.clientHeight, w:container.clientWidth, }; var img=this.img; img.classList.remove('pv-gallery-img_zoom-in'); img.classList.remove('pv-gallery-img_zoom-out'); img.removeAttribute('height'); img.removeAttribute('width'); var content=this.eleMaps['img-parent']; var contentSize={ w:content.offsetWidth, h:content.offsetHeight, }; var larger=contentSize.w > containerSize.w || contentSize.h > containerSize.h; if(this.fitContains){//适应屏幕 this.imgScrollbarV.hide(); this.imgScrollbarH.hide(); if(larger){ img.classList.add('pv-gallery-img_zoom-in'); if(contentSize.h/contentSize.w >=containerSize.h/containerSize.w){ img.height=containerSize.h-20;//20是父元素padding之和 }else{ img.width=containerSize.w-20; }; }; }else{//不做尺寸调整,如果大于屏幕就出现滚动条 this.imgScrollbarV.reset(); this.imgScrollbarH.reset(); if(larger){ img.classList.add('pv-gallery-img_zoom-out'); if(scale){//通过鼠标点击进行的切换。 this.imgScrollbarH.scroll(container.scrollWidth * scale.x - containerSize.w/2); this.imgScrollbarV.scroll(container.scrollHeight * scale.y - containerSize.h/2); }; }; }; }, loadThumb:function(){//读取可视范围里面的缩略图 var self=this; function ready(){ var naturalSize={ h:this.naturalHeight, w:this.naturalWidth, }; var style=this.style; style.removeProperty('width'); style.removeProperty('height'); if(naturalSize.h > self.sideLength || naturalSize.w > self.sideLength){ if(naturalSize.h>=naturalSize.w){ style.height='100%'; }else{ style.width='100%'; }; }; self.forceRepaint(); }; var thumBC=this.eleMaps['sidebar-thumbnails-container']; var scrolled=this.isHorizontal ? thumBC.scrollLeft : thumBC.scrollTop; var thumBCClient=this.isHorizontal ? thumBC.clientWidth : thumBC.clientHeight; var loadDis=scrolled - this.sideLengthO; var loadIndex=Math.floor(scrolled/this.sideLengthO);//至少从第几张开始读取。 var loadStopDis=scrolled + thumBCClient; var imgSpans=this.imgSpans; var span_i; var pro=this.isHorizontal ? 'offsetLeft' : 'offsetTop'; var proValue; var thumb; for(var i=loadIndex,ii=imgSpans.length;i<ii;i++){ span_i=imgSpans[i]; if(span_i.clientWidth==0)continue;//隐藏的 proValue=span_i[pro]; if(proValue <= loadDis)continue;//在滚动条上面了 if(proValue >= loadStopDis)break;//在滚动条下面了 if(span_i.dataset['loaded'])continue;//已经加载了缩略图 thumb=new Image(); thumb.src=span_i.dataset['imgSrc']; //+ '?' +Math.random(); thumb.style.cssText='\ height:100%;\ width:100%;\ '; thumb.className='pv-gallery-sidebar-thumb'; //GM环境下的dataset可读不可写。。 thumb.setAttribute('data-src',span_i.dataset['src']); span_i.setAttribute('data-loaded','true'); span_i.appendChild(thumb); imgReady(thumb,{ ready:ready, }); }; }, addStyle:function(){ var style=document.createElement('style'); style.type='text/css'; style.textContent='\ .pv-gallery-container {\ position: fixed;\ top: 0;\ left: 0;\ width: 100%;\ height: 100%;\ padding: 0;\ margin: 0;\ border: none;\ z-index:899999999;\ background-color: transparent;\ }\ .pv-gallery-container span{\ -moz-box-sizing: border-box;\ box-sizing: border-box;\ }\ .pv-gallery-head {\ position: absolute;\ top: 0;\ left: 0;\ width: 100%;\ height:26px;\ z-index:1;\ background-color:rgba(0,0,0,0.96);\ border:none;\ border-bottom:1px solid #333333;\ }\ .pv-gallery-operate,\ .pv-gallery-commands,\ .pv-gallery-share{\ color:#ccc;\ display:none;\ }\ .pv-gallery-close{\ cursor:pointer;\ position:absolute;\ top:0;\ right:0;\ height:100%;\ width:40px;\ border:none;\ border-left: 1px solid #333333;\ opacity:0.6;\ background:transparent no-repeat center;\ background-image:url("'+prefs.icons.loadingCancle+'");\ }\ .pv-gallery-close:hover{\ opacity:1;\ }\ .pv-gallery-body {\ display: block;\ height: 100%;\ width: 100%;\ margin: 0;\ padding: 0;\ border: none;\ border-top: 26px solid transparent;\ position: relative;\ background-clip: padding-box;\ }\ .pv-gallery-img-container {\ display: block;\ padding: 0;\ margin: 0;\ border: none;\ height: 100%;\ width: 100%;\ background-clip: padding-box;\ background-color: rgba(20,20,20,0.96);\ position:relative;\ }\ .pv-gallery-img-container-top {\ border-top: '+ prefs.gallery.sidebarSize +'px solid transparent;\ }\ .pv-gallery-img-container-right {\ border-right: '+ prefs.gallery.sidebarSize +'px solid transparent;\ }\ .pv-gallery-img-container-bottom {\ border-bottom: '+ prefs.gallery.sidebarSize +'px solid transparent;\ }\ .pv-gallery-img-container-left {\ border-left: '+ prefs.gallery.sidebarSize +'px solid transparent;\ }\ .pv-gallery-img-container-left-side,\ .pv-gallery-img-container-right-side{\ position:absolute;\ height:100%;\ top:0;\ z-index:2;\ }\ .pv-gallery-img-container-left-side{\ left:0;\ }\ .pv-gallery-img-container-right-side{\ right:0;\ }\ .pv-gallery-img-container-bottom-side{\ position:absolute;\ width:100%;\ left:0;\ bottom:0;\ z-index:2;\ }\ .pv-gallery-img-controler-pre,\ .pv-gallery-img-controler-next{\ position:absolute;\ top:50%;\ height:120px;\ width:50px;\ margin-top:-60px;\ cursor:pointer;\ opacity:0.3;\ }\ .pv-gallery-img-controler-pre{\ background:rgba(70,70,70,0.5) url("'+prefs.icons.arrowLeft+'") no-repeat center;\ left:10px;\ }\ .pv-gallery-img-controler-next{\ background:rgba(70,70,70,0.5) url("'+prefs.icons.arrowRight+'") no-repeat center;\ right:10px;\ }\ .pv-gallery-img-controler-pre:hover,\ .pv-gallery-img-controler-next:hover{\ opacity:0.8;\ }\ /*滚动条样式--开始*/\ .pv-gallery-scrollbar-h,\ .pv-gallery-scrollbar-v{\ display:none;\ position:relative;\ z-index:1;\ opacity:0.6;\ }\ .pv-gallery-thumb-scrollbar-v,\ .pv-gallery-thumb-scrollbar-h{\ position:absolute;\ }\ .pv-gallery-scrollbar-h:hover,\ .pv-gallery-scrollbar-v:hover{\ opacity:0.95;\ }\ .pv-gallery-scrollbar-h{\ width:100%;\ overflow:hidden;\ padding:0;\ padding-left:2px;\ padding-right:16px;\ }\ .pv-gallery-scrollbar-v{\ height:100%;\ padding:0;\ padding-top:2px;\ padding-bottom:16px;\ }\ .pv-gallery-thumb-scrollbar-h{\ bottom:0;\ left:0;\ padding:0 2px;\ }\ .pv-gallery-thumb-scrollbar-v{\ right:0;\ top:0;\ padding:2px 0;\ }\ .pv-gallery-scrollbar-h-track,\ .pv-gallery-scrollbar-v-track{\ position:relative;\ display:block;\ background-color:rgba(100,100,100,1);\ }\ .pv-gallery-scrollbar-h-track{\ margin:5px 0;\ height:10px;\ width:100%;\ }\ .pv-gallery-scrollbar-h:hover .pv-gallery-scrollbar-h-track{\ height:16px;\ }\ .pv-gallery-scrollbar-v-track{\ height:100%;\ width:10px;\ margin:0 5px;\ }\ .pv-gallery-scrollbar-v:hover .pv-gallery-scrollbar-v-track{\ width:16px;\ }\ .pv-gallery-scrollbar-h-handle,\ .pv-gallery-scrollbar-v-handle{\ position:absolute;\ background-color:black;\ }\ .pv-gallery-scrollbar-h-handle:hover,\ .pv-gallery-scrollbar-v-handle:hover{\ background-color:#502121;\ }\ .pv-gallery-scrollbar-h-handle:active,\ .pv-gallery-scrollbar-v-handle:active{\ background-color:#391A1A;\ }\ .pv-gallery-scrollbar-h-handle{\ height:100%;\ width:20px;\ left:10px;\ top:0;\ }\ .pv-gallery-scrollbar-v-handle{\ height:20px;\ width:100%;\ top:10px;\ left:0;\ }\ /*滚动条样式--结束*/\ .pv-gallery-img-content{\ display:block;\ width:100%;\ height:100%;\ overflow:hidden;\ text-align:center;\ padding:0;\ border:none;\ margin:0;\ line-height:0;\ font-size:0;\ white-space:nowrap;\ }\ .pv-gallery-img-parent{\ display:inline-block;\ vertical-align:middle;\ padding:10px;\ border:none;\ margin:0;\ line-height:0;\ font-size:0;\ }\ .pv-gallery-img{\ box-shadow:0 0 10px rgba(0,0,0,0.6);\ display:inline-block;\ vertical-align:middle;\ padding:0;\ border:none;\ margin:0;\ }\ .pv-gallery-img_zoom-out{\ cursor:'+support.cssCursorValue.zoomOut+';\ }\ .pv-gallery-img_zoom-in{\ cursor:'+support.cssCursorValue.zoomIn+';\ }\ .pv-gallery-sidebar-container {\ position: absolute;\ background-color:rgba(0,0,0,0.96);\ padding:10px;\ border:none;\ margin:none;\ -o-user-select: none;\ -webkit-user-select: none;\ -moz-user-select: -moz-none;\ user-select: none;\ }\ .pv-gallery-sidebar-container-h {\ height: '+ prefs.gallery.sidebarSize +'px;\ width: 100%;\ }\ .pv-gallery-sidebar-container-v {\ width: '+ prefs.gallery.sidebarSize +'px;\ height: 100%;\ }\ .pv-gallery-sidebar-container-top {\ top: 0;\ left: 0;\ border-bottom:1px solid #333333;\ }\ .pv-gallery-sidebar-container-right {\ top: 0;\ right: 0;\ border-left:1px solid #333333;\ }\ .pv-gallery-sidebar-container-bottom {\ bottom: 0;\ left: 0;\ border-top:1px solid #333333;\ }\ .pv-gallery-sidebar-container-left {\ top: 0;\ left: 0;\ border-right:1px solid #333333;\ }\ .pv-gallery-sidebar-content {\ display: block;\ margin: 0;\ padding: 0;\ border: 0;\ background-clip: padding-box;\ position: relative;\ }\ .pv-gallery-sidebar-content-h {\ height: 100%;\ width: 90%;\ margin-left: auto;\ margin-right: auto;\ border-left: 40px solid transparent;\ border-right: 40px solid transparent;\ }\ .pv-gallery-sidebar-content-v {\ height: 90%;\ width: 100%;\ top: 5%;\ border-top: 40px solid transparent;\ border-bottom: 40px solid transparent;\ }\ .pv-gallery-sidebar-controler-pre,\ .pv-gallery-sidebar-controler-next{\ cursor:pointer;\ position:absolute;\ background:rgba(255,255,255,0.1) no-repeat center;\ }\ .pv-gallery-sidebar-controler-pre-h,\ .pv-gallery-sidebar-controler-next-h{\ top:2px;\ width:36px;\ height:100%;\ }\ .pv-gallery-sidebar-controler-pre-v,\ .pv-gallery-sidebar-controler-next-v{\ left:2px;\ width:100%;\ height:36px;\ }\ .pv-gallery-sidebar-controler-pre-h {\ left: -40px;\ background-image: url("'+prefs.icons.arrowLeft+'");\ }\ .pv-gallery-sidebar-controler-next-h {\ right: -40px;\ background-image: url("'+prefs.icons.arrowRight+'");\ }\ .pv-gallery-sidebar-controler-pre-h:hover{\ box-shadow:inset 22px 0 0 rgba(255,255,255,0.2) ,inset -14px 0 0 rgba(0,0,0,0.2);\ }\ .pv-gallery-sidebar-controler-next-h:hover{\ box-shadow:inset -22px 0 0 rgba(255,255,255,0.2),inset 14px 0 0 rgba(0,0,0,0.2);\ }\ .pv-gallery-sidebar-controler-pre-v {\ top: -40px;\ background-image: url("'+prefs.icons.arrowTop+'");\ }\ .pv-gallery-sidebar-controler-next-v {\ bottom: -40px;\ background-image: url("'+prefs.icons.arrowBottom+'");\ }\ .pv-gallery-sidebar-controler-pre-v:hover{\ box-shadow:inset 0 22px 0 rgba(255,255,255,0.2) ,inset 0 -14px 0 rgba(0,0,0,0.2);\ }\ .pv-gallery-sidebar-controler-next-v:hover{\ box-shadow:inset 0 -22px 0 rgba(255,255,255,0.2),inset 0 14px 0 rgba(0,0,0,0.2);\ }\ .pv-gallery-sidebar-thumbnails-container {\ display: block;\ overflow: hidden;\ height: 100%;\ width: 100%;\ margin:0;\ border:none;\ padding:0;\ }\ .pv-gallery-sidebar-thumbnails-container-top {\ padding-bottom:5px;\ }\ .pv-gallery-sidebar-thumbnails-container-right {\ padding-left:5px;\ }\ .pv-gallery-sidebar-thumbnails-container-bottom {\ padding-top:5px;\ }\ .pv-gallery-sidebar-thumbnails-container-left {\ padding-right:5px;\ }\ .pv-gallery-sidebar-thumbnails {\ position:relative;\ display: block;\ padding: 0;\ margin: 0;\ border: none;\ line-height:0;/*竖列时消除inline-block元素的行高*/\ }\ .pv-gallery-sidebar-thumbnails-h {\ height: 100%;\ }\ .pv-gallery-sidebar-thumbnails-v {\ width: 100%;\ }\ .pv-gallery-sidebar-thumb-container {\ display:inline-block;\ text-align: center;\ border:2px solid rgb(52,52,52);\ cursor:pointer;\ position:relative;\ padding:2px;\ font-size:0;\ line-height:0;\ /*强制图片后面作为vertical-align参考的字符不换行,以防vertical-align:middle达不到预期效果*/\ white-space:nowrap;\ }\ .pv-gallery-sidebar-container-h .pv-gallery-sidebar-thumb-container {\ margin:0 3px 0 0;\ height:100%;\ }\ .pv-gallery-sidebar-container-v .pv-gallery-sidebar-thumb-container {\ margin:0 0 3px 0;\ width:100%;\ }\ .pv-gallery-sidebar-thumb-container:hover {\ border:2px solid rgb(57,149,211);\ }\ .pv-gallery-sidebar-thumb_selected {\ border:2px solid rgb(229,59,62);\ }\ .pv-gallery-sidebar-thumb_selected-top {\ bottom:-5px;\ }\ .pv-gallery-sidebar-thumb_selected-right {\ left:-5px;\ }\ .pv-gallery-sidebar-thumb_selected-bottom {\ top:-5px;\ }\ .pv-gallery-sidebar-thumb_selected-left {\ right:-5px;\ }\ .pv-gallery-sidebar-thumb-loading{\ position:absolute;\ top:0;\ left:0;\ width:100%;\ height:100%;\ display:none;\ opacity:0.5;\ background:black url("'+ prefs.icons.loading + '") no-repeat center ;\ }\ .pv-gallery-sidebar-thumb-loading:hover{\ opacity:0.6;\ }\ .pv-gallery-sidebar-thumb {\ display: inline-block;\ vertical-align: middle;\ }\ .pv-gallery-vertical-align-helper{\ display:inline-block;\ vertical-align:middle;\ width:0;\ height:100%;\ margin:0;\ border:0;\ padding:0;\ visibility:hidden;\ white-space:nowrap;\ }\ '; document.querySelector('head').appendChild(style); }, }; GalleryC.prototype.Preload.prototype={//预读对象 container:(function(){ var div=document.createElement('div'); div.className='pv-gallery-preloaded-img-container'; div.style.display='none'; document.body.appendChild(div); return div; })(), init:function(){ this.max=prefs.gallery.max; this.nextNumber=0; this.nextEle=this.ele; this.preNumber=0; this.preEle=this.ele; this.direction='pre'; this.preload(); }, preload:function(){ var ele=this.getPreloadEle(); if(!ele){ //conole.log('预读正常结束'); return; }; //conole.log('正在预读:',ele); var self=this; this.imgReady=imgReady(ele.dataset['src'],{ loadEnd:function(){ if(self.finished){ //conole.log('强制终止了'); return; }; ele.setAttribute('data-preloaded','true'); self.container.appendChild(this); self.preload(); }, time:60 * 1000,//限时一分钟,否则强制结束并开始预读下一张。 }); }, getPreloadEle:function(){ if((this.max<=this.nextNumber && this.max<=this.preNumber) || (!this.nextEle && !this.preEle)){ return; }; var ele=this.direction=='pre'? this.getNext() : this.getPrevious(); if(ele && !ele.dataset['preloaded']){ return ele; }else{ return this.getPreloadEle(); }; }, getNext:function(){ this.nextNumber++; this.direction='next'; if(!this.nextEle)return; var next; var _next=this.nextEle.nextElementSibling; while(_next){ if(_next.clientWidth!=0){ next=_next; break; }; _next=_next.nextElementSibling; }; this.nextEle=next; return next; }, getPrevious:function(){ this.preNumber++; this.direction='pre'; if(!this.preEle)return; var pre; var _pre=this.preEle.previousElementSibling; while(_pre){ if(_pre.clientWidth!=0){ pre=_pre; break; }; _pre=_pre.previousElementSibling; }; this.preEle=pre; return pre; }, finish:function(){ this.finished=true; if(this.imgReady){ this.imgReady.abort(); }; }, }; GalleryC.prototype.Scrollbar.prototype={//滚动条对象 init:function(){ var self=this; this.scrollbar.bar.addEventListener('mousedown',function(e){//点击滚动条区域,该干点什么! e.preventDefault(); var target=e.target; var handle=self.scrollbar.handle; var track=self.scrollbar.track; switch(target){ case handle:{//手柄;功能,拖动手柄来滚动窗口 var pro=self.isHorizontal ? ['left','clientX'] : ['top','clientY']; var oHOffset=parseFloat(handle.style[pro[0]]); var oClient=e[pro[1]]; var moveHandler=function(e){ self.scroll(oHOffset + e[pro[1]] - oClient,true); }; var upHandler=function(){ document.removeEventListener('mousemove',moveHandler,true); document.removeEventListener('mouseup',upHandler,true); }; document.addEventListener('mousemove',moveHandler,true); document.addEventListener('mouseup',upHandler,true); }break; case track:{//轨道;功能,按住不放来连续滚动一个页面的距离 var pro=self.isHorizontal ? ['left','offsetX','layerX','clientWidth','offsetWidth'] : ['top' , 'offsetY' ,'layerY','clientHeight','offsetHeight']; var clickOffset=typeof e[pro[1]]=='undefined' ? e[pro[2]] : e[pro[1]]; var handleOffset=parseFloat(handle.style[pro[0]]); var handleSize=handle[pro[4]]; var under= clickOffset > handleOffset ;//点击在滚动手柄的下方 var containerSize=self.container[pro[3]]; var scroll=function(){ self.scrollBy(under? (containerSize - 10) : (-containerSize + 10));//滚动一个页面距离少一点 }; scroll(); var checkStop=function(){//当手柄到达点击位置时停止 var handleOffset=parseFloat(handle.style[pro[0]]); if(clickOffset >= handleOffset && clickOffset <= (handleOffset + handleSize)){ clearInterval(scrollInterval); }; }; var scrollInterval=setInterval(function(){ scroll(); checkStop(); },300); checkStop(); var upHandler=function(){ clearInterval(scrollInterval); document.removeEventListener('mouseup',upHandler,true); }; document.addEventListener('mouseup',upHandler,true); }break; }; },true); }, reset:function(){//判断滚动条该显示还是隐藏 var contentPro,containerPro,trackPro,handlePro; if(this.isHorizontal){ contentPro='offsetWidth'; containerPro='clientWidth'; handlePro='width'; trackPro='clientWidth'; }else{ contentPro='offsetHeight'; containerPro='clientHeight'; handlePro='height'; trackPro='clientHeight'; }; //如果内容大于容器的content区域 var contentSize=this.content[contentPro]; var containerSize=this.container[containerPro]; if(contentSize > containerSize){ this.show(); var trackSize=this.scrollbar.track[trackPro]; this.trackSize=trackSize; var handleSize=Math.floor((containerSize/contentSize) * trackSize); handleSize=Math.max(20,handleSize);//限制手柄的最小大小; this.handleSize=handleSize; this.one=(trackSize-handleSize) / (contentSize-containerSize);//一个像素对应的滚动条长度 this.scrollbar.handle.style[handlePro]= handleSize + 'px'; this.scroll(this.getScrolled()); }else{ this.hide(); }; }, show:function(){ this.scrollbar.bar.style.display='block'; this.shown=true; }, hide:function(){ this.scrollbar.bar.style.display='none'; this.shown=false; }, scrollBy:function(distance,handleDistance){ this.scroll(this.getScrolled() + (handleDistance? distance / this.one : distance)); }, scroll:function(distance,handleDistance){ if(!this.shown)return; var pro; //滚动实际滚动条 var _distance=distance; _distance=handleDistance? distance / this.one : distance; if(this.isHorizontal){ pro='left'; this.container.scrollLeft=_distance; }else{ pro='top'; this.container.scrollTop=_distance; }; //滚动虚拟滚动条 //根据比例转换为滚动条上应该滚动的距离。 distance=handleDistance? distance : this.one * distance; //处理非法值 distance=Math.max(0,distance);//如果值小于0那么取0 distance=Math.min(distance,this.trackSize - this.handleSize);//大于极限值,取极限值 this.scrollbar.handle.style[pro]=distance + 'px'; }, getScrolled:function(){ if(this.isHorizontal){ return this.container.scrollLeft; }else{ return this.container.scrollTop; }; }, }; //放大镜 function MagnifierC(img,data){ this.img=img; this.data=data; this.init(); }; MagnifierC.all=[]; MagnifierC.styleZIndex=900000000;//全局z-index; MagnifierC.zoomRange=prefs.magnifier.wheelZoom.range.slice(0).sort();//升序 MagnifierC.zoomRangeR=MagnifierC.zoomRange.slice(0).reverse();//降序 MagnifierC.prototype={ init:function(){ this.addStyle(); MagnifierC.all.push(this); var container=document.createElement('span'); container.className='pv-magnifier-container'; document.body.appendChild(container); this.magnifier=container; var imgNaturalSize={ h:this.img.naturalHeight, w:this.img.naturalWidth, }; this.imgNaturalSize=imgNaturalSize; var cs=container.style; cs.zIndex=MagnifierC.styleZIndex++; var maxDia=Math.ceil(Math.sqrt(Math.pow(1/2*imgNaturalSize.w,2) + Math.pow(1/2*imgNaturalSize.h,2)) * 2); this.maxDia=maxDia; var radius=prefs.magnifier.radius; radius=Math.min(maxDia/2,radius); this.radius=radius; var diameter=radius * 2; this.diameter=diameter; cs.width=diameter + 'px'; cs.height=diameter + 'px'; cs.borderRadius=radius+1 + 'px'; cs.backgroundImage='url("'+ this.img.src +'")'; cs.marginLeft= -radius +'px'; cs.marginTop= -radius +'px'; var imgPos=getTargetPosition(this.data.img); var imgRange={//图片所在范围 x:[imgPos.left , imgPos.right], y:[imgPos.top , imgPos.bottom], }; var imgW=imgRange.x[1] - imgRange.x[0]; var imgH=imgRange.y[1] - imgRange.y[0]; //如果图片太小的话,进行范围扩大。 var minSize=60; if(imgW < minSize){ imgRange.x[1] +=(minSize - imgW)/2; imgRange.x[0] -=(minSize - imgW)/2; imgW=minSize; }; if(imgH < minSize){ imgRange.y[1] +=(minSize - imgH)/2; imgRange.y[0] -=(minSize - imgH)/2; imgH=minSize; }; this.imgSize={ w:imgW, h:imgH, }; this.imgRange=imgRange; //console.log(this.imgRange,this.imgSize); this.setMouseRange(); this.move({ pageX:imgRange.x[0], pageY:imgRange.y[0], }); this._focus=this.focus.bind(this); this._blur=this.blur.bind(this); this._move=this.move.bind(this); this._remove=this.remove.bind(this); this._pause=this.pause.bind(this); this._zoom=this.zoom.bind(this); if(prefs.magnifier.wheelZoom.enabled){ this.zoomLevel=1; this.defaultDia=diameter; addWheelEvent(container,this._zoom,false); }; container.addEventListener('mouseover',this._focus,false); container.addEventListener('mouseout',this._blur,false); container.addEventListener('dblclick',this._remove,false); container.addEventListener('click',this._pause,false); document.addEventListener('mousemove',this._move,true); }, addStyle:function(){ if(MagnifierC.style)return; var style=document.createElement('style'); style.type='text/css'; MagnifierC.style=style; style.textContent='\ .pv-magnifier-container{\ position:absolute;\ padding:0;\ margin:0;\ background-origin:border-box;\ -moz-box-sizing:border-box;\ box-sizing:border-box;\ border:3px solid #CCCCCC;\ background:rgba(40, 40, 40, 0.9) no-repeat;\ }\ .pv-magnifier-container_focus{\ box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.7);\ }\ .pv-magnifier-container_pause{\ border-color:red;\ }\ '; document.querySelector('head').appendChild(style); }, focus:function(){ this.magnifier.classList.add('pv-magnifier-container_focus'); this.magnifier.style.zIndex=MagnifierC.styleZIndex++; }, blur:function(){ this.magnifier.classList.remove('pv-magnifier-container_focus'); }, move:function(e){ var mouseCoor={ x:e.pageX, y:e.pageY, }; var mouseRange=this.mouseRange; var imgRange=this.imgRange; if( !(mouseCoor.x >= mouseRange.x[0] && mouseCoor.x <= mouseRange.x[1] && mouseCoor.y >= mouseRange.y[0] && mouseCoor.y <= mouseRange.y[1]))return;//如果不再鼠标范围 if(mouseCoor.x > imgRange.x[1]){ mouseCoor.x = imgRange.x[1]; }else if(mouseCoor.x < imgRange.x[0]){ mouseCoor.x = imgRange.x[0]; }; if(mouseCoor.y > imgRange.y[1]){ mouseCoor.y = imgRange.y[1]; }else if(mouseCoor.y < imgRange.y[0]){ mouseCoor.y = imgRange.y[0]; }; var ms=this.magnifier.style; ms.top= mouseCoor.y + 'px'; ms.left= mouseCoor.x + 'px'; var radius=this.radius; var imgSize=this.imgSize; var imgNaturalSize=this.imgNaturalSize; var px=-((mouseCoor.x-imgRange.x[0])/imgSize.w * imgNaturalSize.w) + radius +'px'; var py=-((mouseCoor.y-imgRange.y[0])/imgSize.h * imgNaturalSize.h) + radius +'px'; //console.log(px,py); ms.backgroundPosition=px + ' ' + py; }, getNextZoomLevel:function(){ var level; var self=this; if(this.zoomOut){//缩小 MagnifierC.zoomRangeR._find(function(value){ if(value < self.zoomLevel){ level=value; return true; } }) }else{ MagnifierC.zoomRange._find(function(value){ if(value > self.zoomLevel){ level=value; return true; }; }); } return level; }, zoom:function(e){ if(e.deltaY===0)return;//非Y轴的滚动 if(prefs.magnifier.wheelZoom.pauseFirst && !this.paused)return; e.preventDefault(); if(e.deltaY < 0){//向上滚,放大; if(this.diameter >= this.maxDia)return; this.zoomOut=false; }else{ this.zoomOut=true; }; var level=this.getNextZoomLevel(); if(!level)return; this.zoomLevel=level; var diameter=this.defaultDia * level; if(diameter > this.maxDia){ diameter = this.maxDia; }; var radius=diameter/2 this.diameter=diameter; var bRadius=this.radius; this.radius=radius; this.setMouseRange(); var ms=this.magnifier.style; ms.width=diameter+'px'; ms.height=diameter+'px'; ms.borderRadius=radius+1 + 'px'; ms.marginLeft=-radius+'px'; ms.marginTop=-radius+'px'; var bBP=ms.backgroundPosition.split(' '); ms.backgroundPosition=parseFloat(bBP[0]) + (radius - bRadius) + 'px' + ' ' + (parseFloat(bBP[1]) + ( radius - bRadius) + 'px'); }, pause:function(){ if(this.paused){ this.magnifier.classList.remove('pv-magnifier-container_pause'); document.addEventListener('mousemove',this._move,true); }else{ this.magnifier.classList.add('pv-magnifier-container_pause'); document.removeEventListener('mousemove',this._move,true); }; this.paused=!this.paused; }, setMouseRange:function(){ var imgRange=this.imgRange; var radius=this.radius; this.mouseRange={//鼠标活动范围 x:[imgRange.x[0]-radius , imgRange.x[1] + radius], y:[imgRange.y[0]-radius , imgRange.y[1] + radius], }; }, remove:function(){ this.magnifier.parentNode.removeChild(this.magnifier); document.removeEventListener('mousemove',this._move,true); MagnifierC.all.splice(MagnifierC.all.indexOf(this),1); }, }; //图片窗口 function ImgWindowC(img){ this.img=img; this.src=img.src; this.init(); }; ImgWindowC.styleZIndex=1000000000;//全局z-index; ImgWindowC.all=[];//所有的窗口对象 ImgWindowC.zoomRange=prefs.imgWindow.zoom.range.slice(0).sort();//升序 ImgWindowC.zoomRangeR=ImgWindowC.zoomRange.slice(0).reverse();//降序 ImgWindowC.prototype={ init:function(){ var self=this; //图片是否已经被打开 if(ImgWindowC.all._find(function(iwin){ if(iwin.src==self.src){ iwin.firstOpen(); return true; }; }))return; this.addStyle(); this.addRotateIndicator(); var img=this.img; img.className='pv-pic-window-pic pv-pic-not-allowed'; img.style.cssText='\ top:0px;\ left:0px;\ '; var imgNaturalSize={ h:img.naturalHeight, w:img.naturalWidth, }; this.imgNaturalSize=imgNaturalSize; var container=document.createElement('span'); container.style.cssText='\ cursor:pointer;\ top:0px;\ left:0px;\ '; container.className='pv-pic-window-container'; container.innerHTML=''+ '<span class="pv-pic-window-toolbar">'+ '<span class="pv-pic-window-tb-hand pv-pic-window-tb-tool pv-pic-window-tb-tool-selected" title="Hand Tool"></span>'+ '<span class="pv-pic-window-tb-tool-badge-container">'+ '<span class="pv-pic-window-tb-rotate pv-pic-window-tb-tool" title="Rotate | Rotar"></span>'+ '<span class="pv-pic-window-tb-tool-badge">0</span>'+ '</span>'+ '<span class="pv-pic-window-tb-tool-badge-container">'+ '<span class="pv-pic-window-tb-zoom pv-pic-window-tb-tool" title="Zoom"></span>'+ '<span class="pv-pic-window-tb-tool-badge">0</span>'+ '</span>'+ '<span class="pv-pic-window-tb-flip-horizontal pv-pic-window-tb-command" title="Giro HORIZONTAL Flip"></span>'+ '<span class="pv-pic-window-tb-flip-vertical pv-pic-window-tb-command" title="Giro VERTICAL Flip"></span>'+ '</span>'+ '<span class="pv-pic-window-close"></span>'+ '<span class="pv-pic-window-range"></span>'; container.insertBefore(img,container.firstChild); this.imgWindow=container; var toolMap={ 'hand':container.querySelector('.pv-pic-window-tb-hand'), 'rotate':container.querySelector('.pv-pic-window-tb-rotate'), 'zoom':container.querySelector('.pv-pic-window-tb-zoom'), 'fh':container.querySelector('.pv-pic-window-tb-flip-horizontal'), 'fv':container.querySelector('.pv-pic-window-tb-flip-vertical'), }; this.toolMap=toolMap; this.viewRange=container.querySelector('.pv-pic-window-range'); //关闭 var closeButton=container.querySelector('.pv-pic-window-close'); closeButton.style.cssText='\ top: -24px;\ right: 0px;\ '; this.closeButton=closeButton; closeButton.addEventListener('click',function(e){ self.remove(); },false); var toolbar=container.querySelector('.pv-pic-window-toolbar'); toolbar.style.cssText='\ top: 0px;\ left: -45px;\ '; this.toolbar=toolbar; this.selectedTool='hand'; this.cursor='hand'; this.selectedToolClass='pv-pic-window-tb-tool-selected'; this.hKeyUp=true; this.rKeyUp=true; this.zKeyUp=true; this.spaceKeyUp=true; this.ctrlKeyUp=true; this.altKeyUp=true; this.shiftKeyUp=true; toolbar.addEventListener('mousedown',function(e){//鼠标按下选择工具 self.toolbarEventHandler(e); },false); toolbar.addEventListener('dblclick',function(e){//鼠标双击工具 self.toolbarEventHandler(e); },false); //阻止浏览器对图片的默认控制行为 img.addEventListener('mousedown',function(e){ e.preventDefault(); },false); container.addEventListener('mousedown',function(e){//当按下的时,执行平移,缩放,旋转操作 self.imgWindowEventHandler(e); },false); container.addEventListener('click',function(e){//阻止opera ctrl+点击保存图片 self.imgWindowEventHandler(e); },false); if(prefs.imgWindow.zoom.mouseWheelZoom){//是否使用鼠标缩放 addWheelEvent(container,function(e){//滚轮缩放 self.imgWindowEventHandler(e); },false); }; if(prefs.imgWindow.overlayer.shown){//是否显示覆盖层 var overlayer=document.createElement('span'); this.overlayer=overlayer; overlayer.className='pv-pic-window-overlayer'; overlayer.style.backgroundColor=prefs.imgWindow.overlayer.color; document.body.appendChild(overlayer); if(prefs.imgWindow.overlayer.clickToClose[0]){ overlayer.addEventListener(prefs.imgWindow.overlayer.clickToClose[1],function(e){ self.remove(); },false); } }; document.body.appendChild(container); ImgWindowC.all.push(this); this._blur=this.blur.bind(this); this._focusedKeydown=this.focusedKeydown.bind(this); this._focusedKeyup=this.focusedKeyup.bind(this); this.rotatedRadians=0;//已经旋转的角度 this.zoomLevel=1;//缩放级别 this.setToolBadge('zoom',1); //选中默认工具 this.selectTool(prefs.imgWindow.defaultTool); this.firstOpen(); }, firstOpen:function(){ this.focus(); var imgWindow=this.imgWindow; imgWindow.style.left=-5 + window.scrollX + 'px'; imgWindow.style.top=-5 + window.scrollY + 'px'; if(prefs.imgWindow.fitToScreen){ this.fitToScreen(); this.center(true,true); }else{ //window的尺寸 var wSize=getWindowSize(); //空隙 wSize.h -= 16; wSize.w -= 16; var imgWindowCS=getComputedStyle(imgWindow,''); var rectSize={ h:parseFloat(imgWindowCS.height), w:parseFloat(imgWindowCS.width), }; this.center(rectSize.w <= wSize.w , rectSize.h <= wSize.h); }; this.keepScreenInside(); }, addStyle:function(){ if(ImgWindowC.style)return; var style=document.createElement('style'); ImgWindowC.style=style; style.textContent='\ .pv-pic-window-container {\ position: absolute;\ background-color: rgba(40,40,40,0.9);\ padding: 8px;\ border: 5px solid #ccc;\ line-height: 0;\ text-align: left;\ }\ .pv-pic-window-container_focus {\ box-shadow: 0 0 10px rgba(0,0,0,0.6);\ }\ .pv-pic-window-close, .pv-pic-window-toolbar {\ -webkit-transition: opacity 0.2s ease-in-out;\ transition: opacity 0.2s ease-in-out;\ }\ .pv-pic-window-toolbar {\ position: absolute;\ background-color: #535353;\ padding: 0;\ opacity: 0.9;\ display: none;\ cursor: default;\ }\ .pv-pic-window-toolbar:hover {\ opacity: 1;\ }\ .pv-pic-window-toolbar_focus {\ display: block;\ }\ .pv-pic-window-close {\ cursor: pointer;\ position: absolute;\ right: 0px;\ top: -24px;\ background: url("'+prefs.icons.close+'") no-repeat center bottom;\ height: 17px;\ width: 46px;\ opacity: 0.9;\ border:none;\ padding:0;\ padding-top:2px;\ background-color:#1771FF;\ display: none;\ }\ .pv-pic-window-close:hover {\ background-color:red;\ opacity: 1;\ }\ .pv-pic-window-close_focus {\ display: block;\ }\ .pv-pic-window-pic {\ position: relative;\ display:inline-block;\/*opera把图片设置display:block会出现渲染问题,会有残影,还会引发其他各种问题,吓尿*/\ max-width:none;\ min-width:none;\ max-height:none;\ min-height:none;\ padding:0;\ margin:0;\ }\ .pv-pic-window-pic_focus {\ box-shadow: 0 0 6px black;\ }\ .pv-pic-window-tb-tool, .pv-pic-window-tb-command{\ height: 24px;\ width: 24px;\ padding: 12px 8px 6px 6px;\ margin:0;\ display: block;\ background: transparent no-repeat center;\ cursor: pointer;\ position: relative;\ border: none;\ border-left: 2px solid transparent;\ border-bottom: 1px solid #868686;\ background-origin: content-box;\ }\ .pv-pic-window-toolbar > span:last-child {\ border-bottom: none;\ }\ .pv-pic-window-tb-tool:hover, .pv-pic-window-tb-command:hover{\ border-left: 2px solid red;\ }\ .pv-pic-window-tb-tool-selected{\ box-shadow: inset 0 21px 0 rgba(255,255,255,0.3) ,inset 0 -21px 0 rgba(0,0,0,0.3);\ border-left:2px solid #1771FF;\ }\ .pv-pic-window-tb-hand {\ background-image: url("'+prefs.icons.hand+'");\ }\ .pv-pic-window-tb-rotate {\ background-image: url("'+prefs.icons.rotate+'");\ }\ .pv-pic-window-tb-zoom {\ background-image: url("'+prefs.icons.zoom+'");\ }\ .pv-pic-window-tb-flip-horizontal {\ background-image: url("'+prefs.icons.flipHorizontal+'");\ }\ .pv-pic-window-tb-flip-vertical {\ background-image: url("'+prefs.icons.flipVertical+'");\ }\ .pv-pic-window-tb-tool-badge-container {\ display: block;\ position: relative;\ }\ .pv-pic-window-tb-tool-badge {\ position: absolute;\ top: -3px;\ right: 1px;\ font-size: 10px;\ line-height: 1.5;\ padding: 0 3px;\ background-color: #F93;\ border-radius: 50px;\ opacity: 0.5;\ color: black;\ }\ .pv-pic-window-overlayer{\ height:100%;\ width:100%;\ position:fixed;\ z-index:999999999;\ top:0;\ left:0;\ }\ .pv-pic-window-rotate-indicator{\ cursor: progress;\ position:absolute;\ z-index:1100000000;\ width:250px;\ height:250px;\ padding:10px;\ margin-top:-135px;\ margin-left:-135px;\ background:transparent url("'+ prefs.icons.rotateIndicatorBG +'") no-repeat center;\ }\ .pv-pic-window-rotate-indicator-pointer{\ display:block;\ margin-left:auto;\ margin-right:auto;\ background:transparent url("'+ prefs.icons.rotateIndicatorPointer +'") no-repeat center;\ width:60px;\ height:240px;\ position:relative;\ top:5px;\ }\ .pv-pic-window-range{\ position:absolute;\ border:none;\ width:100px;\ height:100px;\ box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.8);\ display:none;\ padding:0;\ background-color:rgba(255, 0, 0, 0.150);\ }\ '; document.querySelector('head').appendChild(style); }, addRotateIndicator:function(){ if(ImgWindowC.rotateIndicator)return; var rotateIndicator=document.createElement('span'); rotateIndicator.className='pv-pic-window-rotate-indicator'; ImgWindowC.rotateIndicator=rotateIndicator; rotateIndicator.style.cssText='\ display:none;\ '; var rotateIndicatorPointer=document.createElement('span'); rotateIndicatorPointer.className='pv-pic-window-rotate-indicator-pointer'; ImgWindowC.rotateIndicatorPointer=rotateIndicatorPointer; rotateIndicator.appendChild(rotateIndicatorPointer); document.body.appendChild(rotateIndicator); }, keepScreenInside:function(){//保持按钮在屏幕里面. var imgWindow=this.imgWindow; var imgWindowFullSize={ h:imgWindow.offsetHeight, w:imgWindow.offsetWidth, }; var windowSize=getWindowSize(); function keepSI(obj,offsetDirection,defaultValue){ var objRect=obj.getBoundingClientRect(); var objStyle=obj.style; while(offsetDirection.length){ var oD=offsetDirection[0]; var oDV=defaultValue[0]; offsetDirection.shift(); defaultValue.shift(); var oValue=parseFloat(objStyle[oD]); var newValue; switch(oD){ case 'top':{ newValue=oValue - objRect.top; if(objRect.top<0){ newValue=Math.min(newValue,imgWindowFullSize.h); }else{ newValue=Math.max(newValue,oDV); }; }break; case 'right':{ newValue=oValue + (objRect.right - windowSize.w); if(objRect.right > windowSize.w){//屏幕外 newValue=Math.min(newValue,imgWindowFullSize.w); }else{ newValue=Math.max(newValue,oDV); }; }break; case 'bottom':{ newValue=oValue + (objRect.bottom - windowSize.h); if(objRect.bottom > windowSize.h){//屏幕外 newValue=Math.min(newValue,imgWindowFullSize.h); }else{ newValue=Math.max(newValue,oDV); }; }break; case 'left':{ newValue=oValue - objRect.left; if(objRect.left<0){ newValue=Math.min(newValue,imgWindowFullSize.w); }else{ newValue=Math.max(newValue,oDV); } }break; }; //console.log(newValue); objStyle[oD]=newValue + 'px'; }; }; keepSI(this.closeButton,['top','right'],[-24,0]); keepSI(this.toolbar,['top','left'],[0,-45]); }, fitToScreen:function(){ var wSize=getWindowSize(); //空隙 wSize.h -= 16; wSize.w -= 16; var imgWindow=this.imgWindow; var imgWindowCS=getComputedStyle(imgWindow,''); var rectSize={ h:parseFloat(imgWindowCS.height), w:parseFloat(imgWindowCS.width), }; var size; if(rectSize.w - wSize.w>0 || rectSize.h - wSize.h>0){//超出屏幕,那么缩小。 if(rectSize.w/rectSize.h > wSize.w/wSize.h){ size={ w:wSize.w, h:wSize.w / (rectSize.w/rectSize.h), }; }else{ size={ h:wSize.h, w:wSize.h * (rectSize.w/rectSize.h), } }; this.zoom(this.getRotatedImgCliSize(size).w/this.imgNaturalSize.w); }; }, center:function(horizontal,vertical){ if(!horizontal && !vertical)return; var wSize=getWindowSize(); var imgWindow=this.imgWindow; if(horizontal)imgWindow.style.left= (wSize.w - imgWindow.offsetWidth)/2 + window.scrollX +'px'; if(vertical)imgWindow.style.top= (wSize.h - imgWindow.offsetHeight)/2 + window.scrollY +'px'; }, move:function(e){ this.working=true; var mouseCoor={ x:e.pageX, y:e.pageY, }; var imgWindow=this.imgWindow; var imgWStyle=imgWindow.style; var oriOffset={ left:parseFloat(imgWStyle.left), top:parseFloat(imgWStyle.top), }; var self=this; var moveHandler=function(e){ imgWStyle.left=oriOffset.left+ e.pageX-mouseCoor.x +'px'; imgWStyle.top=oriOffset.top + e.pageY-mouseCoor.y +'px'; self.keepScreenInside(); }; var mouseupHandler=function(){ e.preventDefault(); self.working=false; if(self.tempHand && self.spaceKeyUp){//如果是临时切换到抓手工具,平移完成后返回上个工具 self.tempHand=false; self.changeCursor(self.selectedTool); }; document.removeEventListener('mousemove',moveHandler,true); document.removeEventListener('mouseup',mouseupHandler,true); }; document.addEventListener('mousemove',moveHandler,true); document.addEventListener('mouseup',mouseupHandler,true); }, rotate:function(origin,topLeft){ var img=this.img; var imgWindow=this.imgWindow; var iTransform=img.style[support.cssTransform].replace(/rotate\([^)]*\)/i,''); var imgWindowCS=getComputedStyle(imgWindow,''); var imgRectSize={ h:parseFloat(imgWindowCS.height), w:parseFloat(imgWindowCS.width), }; var rectOffset={ top:parseFloat(imgWindow.style.top), left:parseFloat(imgWindow.style.left), }; var imgSize={ h:img.clientHeight, w:img.clientWidth, }; var imgOffset={ top:parseFloat(img.style.top), left:parseFloat(img.style.left), }; var self=this; var PI=Math.PI; var rotate=function (radians){ if(self.rotatedRadians==radians)return; img.style[support.cssTransform] = ' rotate('+ radians +'rad) ' + iTransform; ImgWindowC.rotateIndicatorPointer.style[support.cssTransform]='rotate('+ radians +'rad)'; self.rotatedRadians=radians; self.setToolBadge('rotate',radians/(PI/180)); var afterimgRectSize=self.getRotatedImgRectSize( radians, imgSize ); imgWindow.style.width=afterimgRectSize.w +'px'; imgWindow.style.height=afterimgRectSize.h + 'px'; if(!topLeft)self.setImgWindowOffset(rectOffset,imgRectSize,afterimgRectSize); self.setImgOffset(imgOffset,imgRectSize,afterimgRectSize); self.keepScreenInside(); }; if(typeof origin=='number'){ rotate(origin); return; }; this.working=true; var lastRotatedRadians=this.rotatedRadians; this.shiftKeyUp=true; var shiftRotateStep=prefs.shiftRotateStep / (180/Math.PI);//转成弧度 var moveHandler=function(e){ var radians=lastRotatedRadians + Math.atan2( e.pageY - origin.pageY, e.pageX - origin.pageX ); if(radians>2*PI){ radians-=2*PI; }else if(radians<0){ radians+=2*PI; }; if(!self.shiftKeyUp){//如果按下了shift键,那么步进缩放 radians -= radians % shiftRotateStep; radians += shiftRotateStep; }; rotate(radians); }; var mouseupHandler=function(){ self.working=false; ImgWindowC.rotateIndicator.style.display='none'; document.removeEventListener('mousemove',moveHandler,true); document.removeEventListener('mouseup',mouseupHandler,true); }; document.addEventListener('mousemove',moveHandler,true); document.addEventListener('mouseup',mouseupHandler,true); }, getNextZoomLevel:function(){ var level; var self=this; if(this.zoomOut){//缩小 ImgWindowC.zoomRangeR._find(function(value){ if(value < self.zoomLevel){ level=value; return true; } }) }else{ ImgWindowC.zoomRange._find(function(value){ if(value > self.zoomLevel){ level=value; return true; }; }); } return level; }, getZoomRatio:function(mouseCoor){ var ibcRect=this.img.getBoundingClientRect(); var ratio={ x:(mouseCoor.x-ibcRect.left)/ibcRect.width, y:(mouseCoor.y-ibcRect.top)/ibcRect.height, }; if(ratio.x<0){ ratio.x=0 }else if(ratio.x>1){ ratio.x=1 }; if(ratio.y<0){ ratio.y=0 }else if(ratio.y>1){ ratio.y=1 }; return ratio; }, zoom:function(e,ratio){//e可能是undefined,可能是事件对象,可能是直接的缩放级别数字 var imgWindow=this.imgWindow; var imgWindowCS=getComputedStyle(imgWindow,''); var imgRectSize={ h:parseFloat(imgWindowCS.height), w:parseFloat(imgWindowCS.width), }; var rectOffset={ top:parseFloat(imgWindow.style.top), left:parseFloat(imgWindow.style.left), }; var img=this.img; var self=this; var zoom=function(level){//缩放到指定级别 if(typeof level==='undefined' || level<0 || level==self.zoomLevel)return; var afterImgSize={ h:self.imgNaturalSize.h * level, w:self.imgNaturalSize.w * level, }; img.width=afterImgSize.w; img.height=afterImgSize.h; var afterimgRectSize=self.getRotatedImgRectSize( self.rotatedRadians, afterImgSize ); imgWindow.style.width=afterimgRectSize.w +'px'; imgWindow.style.height=afterimgRectSize.h + 'px'; self.setImgWindowOffset(rectOffset,imgRectSize,afterimgRectSize,ratio); self.setImgOffset({top:0,left:0},afterImgSize,afterimgRectSize);//如果旋转了,调整偏移 self.zoomLevel=level; self.setToolBadge('zoom',level); self.keepScreenInside(); }; if(typeof e!='object'){ ratio=ratio? ratio : { x:1/2, y:1/2, }; zoom(e); return; }; this.working=true; ratio=this.getZoomRatio({ x:e.clientX, y:e.clientY, }); var moved; var lastPageX=e.pageX; var currentLevel=this.zoomLevel; var moveHandler=function(e){ moved=true; var pageX=e.pageX; var level; if(pageX > lastPageX){//向右移,zoomin扩大 self.changeCursor('zoom',false); level=0.05; }else{//向左移,zoomout缩小 self.changeCursor('zoom',true); level=-0.05; }; lastPageX=pageX; currentLevel += level; zoom(currentLevel); }; var mouseupHandler=function(e){ self.working=false; document.removeEventListener('mousemove',moveHandler,true); document.removeEventListener('mouseup',mouseupHandler,true); var level=self.getNextZoomLevel(); if(self.zoomOut && self.altKeyUp){ self.zoomOut=false; }; if(!moved){//如果没有平移缩放。 zoom(level); }; self.changeCursor('zoom',self.zoomOut); if(self.tempZoom && self.ctrlKeyUp && self.altKeyUp){ self.tempZoom=false; self.changeCursor(self.selectedTool); }; }; document.addEventListener('mousemove',moveHandler,true); document.addEventListener('mouseup',mouseupHandler,true); }, convertToValidRadians:function(radians){ //转成0-90的等价角度。 var PI=Math.PI; if(radians > PI){ radians = 2*PI - radians; }; if(radians > 1/2*PI){ radians = PI - radians; }; return radians; }, getRotatedImgRectSize:function( radians, imgSize ){//通过旋转后的角度和图片的大小,求虚拟矩形的大小 imgSize= imgSize ? imgSize :{ h:this.img.clientHeight, w:this.img.clentWidth, }; if(typeof radians==='undefined'){ radians = this.rotatedRadians; }; radians=this.convertToValidRadians(radians); return { h:imgSize.h* Math.cos(radians) + imgSize.w * Math.sin(radians), w:imgSize.h* Math.sin(radians) + imgSize.w * Math.cos(radians), }; }, getRotatedImgCliSize:function(rectSize,radians){//通过虚拟矩形的大小和图片的旋转角度,求图片的大小 if(typeof radians==='undefined'){ radians = this.rotatedRadians; }; radians=this.convertToValidRadians(radians); if(radians==0){ //radians=Math.PI/180 * 1/100; return rectSize; }; var h=(rectSize.h-rectSize.w * Math.tan(radians))/(Math.cos(radians)-Math.sin(radians)*Math.tan(radians)); var w=(rectSize.h - h*Math.cos(radians))/Math.sin(radians); return { h:h, w:w, }; }, setImgOffset:function(oriOffset,bImgSize,aImgSize){ var imgStyle=this.img.style; var top=Math.floor(oriOffset.top + (aImgSize.h-bImgSize.h)*1/2) + 'px'; var left=Math.floor(oriOffset.left + (aImgSize.w-bImgSize.w)*1/2) + 'px'; imgStyle.top= top; imgStyle.left= left; }, setImgWindowOffset:function(oriOffset,bImgWindowSize,aImgWidnowSize,ratio){ ratio= ratio? ratio : {x:1/2,y:1/2}; var imgWindowStyle=this.imgWindow.style; var top=oriOffset.top - (aImgWidnowSize.h-bImgWindowSize.h)*ratio.y + 'px'; var left=oriOffset.left - (aImgWidnowSize.w-bImgWindowSize.w)*ratio.x + 'px'; imgWindowStyle.top= top; imgWindowStyle.left= left; }, setToolBadge:function(tool,content){ var scale=0; switch(tool){ case 'zoom':{ scale=2; }break; case 'rotate':{ scale=1; }break; default:break; } content=typeof content=='string'? content : content.toFixed(scale); this.toolMap[tool].nextElementSibling.textContent=content; }, changeCursor:function(tool,zoomOut){ if(tool=='zoom'){ tool+=zoomOut? '-out' : '-in'; }; if(this.cursor==tool)return; this.cursor=tool; var imgWStyle=this.imgWindow.style; switch(tool){ case 'hand':{ imgWStyle.cursor='pointer'; }break; case 'zoom-in':{ imgWStyle.cursor=support.cssCursorValue.zoomIn; }break; case 'zoom-out':{ imgWStyle.cursor=support.cssCursorValue.zoomOut; }break; case 'rotate':{ imgWStyle.cursor='progress'; }break; case 'default':{ imgWStyle.removeProperty('cursor'); }break; default:break; }; }, blur:function(e){ if(!this.focused)return; var imgWindow =this.imgWindow; //点击imgWinodw的外部的时候失去焦点 if(e!==true && (imgWindow==e.target || (imgWindow.compareDocumentPosition(e.target) & 16)))return; imgWindow.classList.remove('pv-pic-window-container_focus'); this.toolbar.classList.remove('pv-pic-window-toolbar_focus'); this.closeButton.classList.remove('pv-pic-window-close_focus'); this.img.classList.remove('pv-pic-window-pic_focus'); document.removeEventListener('mousedown',this._blur,true); document.removeEventListener('keydown',this._focusedKeydown,true); document.removeEventListener('keyup',this._focusedKeyup,true); this.changeCursor('default'); this.focused=false; }, focus:function(){ if(this.focused)return; this.imgWindow.classList.add('pv-pic-window-container_focus'); this.toolbar.classList.add('pv-pic-window-toolbar_focus'); this.closeButton.classList.add('pv-pic-window-close_focus'); this.img.classList.add('pv-pic-window-pic_focus'); this.imgWindow.style.zIndex= ImgWindowC.styleZIndex; this.zIndex=ImgWindowC.styleZIndex; ImgWindowC.styleZIndex ++; document.addEventListener('keydown',this._focusedKeydown,true); document.addEventListener('keyup',this._focusedKeyup,true); document.addEventListener('mousedown',this._blur,true); this.changeCursor(this.selectedTool);//还原鼠标样式。 this.focused=true; }, focusedKeyup:function(e){ var keyCode=e.keyCode; var valid=[32,18,16,72,17,72,82,90,67]; if(valid.indexOf(keyCode)==-1)return; e.preventDefault(); switch(keyCode){ case 32:{//空格键,临时切换到移动 this.spaceKeyUp=true; if(!this.tempHand)return;//如果之前没有临时切换到抓手工具(当已经在工作的时候,按下空格不会临时切换到抓手工具) if(!this.working){//松开按键的时候,没有在继续平移了。 this.tempHand=false; this.changeCursor(this.selectedTool); }; }break; case 18:{//alt键盘切换缩小放大。 this.altKeyUp=true; if(!this.zoomOut)return; if(!this.working){ this.zoomOut=false; this.changeCursor('zoom'); if(this.tempZoom && this.ctrlKeyUp){ this.tempZoom=false; this.changeCursor(this.selectedTool); }; }; }break; case 16:{//shift键,旋转的时候按住shift键,步进缩放。 this.shiftKeyUp=true; }break; case 17:{//ctrl键 clearTimeout(this.ctrlkeyDownTimer); if(!this.justCKeyUp){//如果刚才没有松开c,规避划词软件的ctrl+c松开 this.ctrlKeyUp=true; if(!this.tempZoom)return;//如果没有切换到了缩放 if(!this.working && this.altKeyUp){ this.tempZoom=false; this.changeCursor(this.selectedTool); }; }; }break; case 67:{//c键 this.justCKeyUp=true; var self=this; clearTimeout(this.justCKeyUpTimer); this.justCKeyUpTimer=setTimeout(function(){ self.justCKeyUp=false; },100) }break; case 72:{//h键 this.hKeyUp=true; }break; case 82:{//r键 this.rKeyUp=true; }break; case 90:{//z键 this.zKeyUp=true; }break; default:break; }; if([72,82,90].indexOf(keyCode)!=-1){ if(!this.working && this.restoreBeforeTool){ this.restoreBeforeTool=false; this.selectTool(this.beforeTool); }; }; }, focusedKeydown:function(e){ var keyCode=e.keyCode; var valid=[32,82,72,90,18,16,17,27,67];//有效的按键 if(valid.indexOf(keyCode)==-1) return; e.preventDefault(); if(this.working){//working的时候也可以接受按下shift键,以便旋转的时候可以任何时候按下 if(keyCode==16){//shift键 this.shiftKeyUp=false; }; return; }; switch(keyCode){ case 82:{//r键,切换到旋转工具 if(this.rKeyUp){ this.rKeyUp=false; this.beforeTool=this.selectedTool; this.selectTool('rotate'); }; }break; case 72:{//h键,切换到抓手工具 if(this.hKeyUp){ this.hKeyUp=false; this.beforeTool=this.selectedTool; this.selectTool('hand'); }; }break; case 90:{//z键,切换到缩放工具 if(this.zKeyUp){ this.zKeyUp=false; this.beforeTool=this.selectedTool; this.selectTool('zoom'); }; }break; case 32:{//空格键阻止,临时切换到抓手功能 if(this.spaceKeyUp){ this.spaceKeyUp=false; if(this.selectedTool!='hand'){ this.tempHand=true; this.changeCursor('hand'); }; }; }break; case 18:{//alt键,在当前选择是缩放工具的时候,按下的时候切换到缩小功能 if(this.altKeyUp){ if((this.selectedTool!='zoom' && !this.tempZoom) || this.zoomOut)return; this.zoomOut=true; this.altKeyUp=false; this.changeCursor('zoom',true); }; }break; case 17:{//ctrl键临时切换到缩放工具 if(this.ctrlKeyUp){ var self=this; this.ctrlkeyDownTimer=setTimeout(function(){//规避词典软件的ctrl+c,一瞬间切换到缩放的问题 self.ctrlKeyUp=false; if(self.selectedTool!='zoom'){ self.tempZoom=true; self.changeCursor('zoom'); }; },100); }; }break; case 67:{//c键 clearTimeout(this.ctrlkeyDownTimer); }break; case 27:{//ese关闭窗口 this.remove(); }break; default:break; }; }, toolbarEventHandler:function(e){ e.stopPropagation(); var target=e.target; var toolMap=this.toolMap; for(var i in toolMap){ if(toolMap.hasOwnProperty(i) && toolMap[i]==target){ switch(e.type){ case 'mousedown':{ this.selectTool(i); }break; case 'dblclick':{ this.dblclickCommand(i); }break; default:break; }; break; }; }; }, imgWindowEventHandler:function(e){ e.stopPropagation(); switch(e.type){ case 'click':{//阻止opera的图片保存 if(e.ctrlKey && e.target.nodeName=='IMG'){ e.preventDefault(); }; }break; case 'mousedown':{ if(!this.focused){//如果没有focus,先focus this.focus(); this.keepScreenInside(); }; var target=e.target; if(e.button!=0 || (target!=this.imgWindow && target!=this.img))return; var selectedTool=this.selectedTool; if(this.tempHand){ this.move(e); }else if(this.tempZoom){ this.zoom(e); }else if(selectedTool=='hand'){ this.restoreBeforeTool=!this.hKeyUp; if(this.hKeyUp){ this.move(e); }else{//鸟瞰视图 this.aerialView(e); }; }else if(selectedTool=='rotate'){ var rIS=ImgWindowC.rotateIndicator.style; rIS.display='block'; var origin={//旋转原点 pageX:e.pageX - 30,//稍微偏左一点。 pageY:e.pageY, }; rIS.top=origin.pageY + 'px'; rIS.left=origin.pageX + 'px'; ImgWindowC.rotateIndicatorPointer.style[support.cssTransform]='rotate(' + this.rotatedRadians + 'rad)'; this.restoreBeforeTool=!this.rKeyUp; this.rotate(origin); }else if(selectedTool=='zoom'){ this.restoreBeforeTool=!this.zKeyUp; this.zoom(e); }; }break; case 'wheel':{ if(!this.focused)return;//如果没有focus if(e.deltaY===0)return;//非Y轴的滚动 e.preventDefault(); if(this.working)return; var oriZoomOut=this.zoomOut; this.zoomOut = !!(e.deltaY > 0); var ratio=this.getZoomRatio({ x:e.clientX, y:e.clientY, }); var level=this.getNextZoomLevel(); this.zoom(level,ratio); this.zoomOut=oriZoomOut; }break; default:break; }; }, dblclickCommand:function(tool){ var done; switch(tool){ case 'hand':{//双击居中,并且适应屏幕 this.zoom(1); this.fitToScreen(); this.center(true,true); this.keepScreenInside(); }break; case 'rotate':{//双击还原旋转 if(this.rotatedRadians==0)return; done=true; this.rotate(0,true); }break; case 'zoom':{//双击还原缩放 if(this.zoomLevel==1)return; done=true; this.zoom(1,{x:0,y:0}); }break; default:break; }; if((tool=='rotate' || tool=='zoom') && done){ var imgWindow=this.imgWindow; var imgWinodowRect=imgWindow.getBoundingClientRect(); var imgWindowStyle=imgWindow.style; if(imgWinodowRect.left<40){ imgWindowStyle.left=40 + window.scrollX + 'px'; }; if(imgWinodowRect.top<-5){ imgWindowStyle.top=-5 + window.scrollY +'px'; }; this.keepScreenInside(); }; }, doFlipCommand:function(command){ var map={ fv:[/scaleY\([^)]*\)/i,' scaleY(-1) '], fh:[/scaleX\([^)]*\)/i,' scaleX(-1) '], }; var iTransform=this.img.style[support.cssTransform]; var toolClassList=this.toolMap[command].classList; if(map[command][0].test(iTransform)){ iTransform=iTransform.replace(map[command][0],''); toolClassList.remove(this.selectedToolClass); }else{ iTransform += map[command][1]; toolClassList.add(this.selectedToolClass); }; this.img.style[support.cssTransform]=iTransform; }, selectTool:function(tool){ var command=['fv','fh']; if(command.indexOf(tool)==-1){//工具选择 if(this.selectedTool==tool)return; var selectedTool=this.selectedTool; this.selectedTool=tool; if(this.tempHand || this.tempZoom){//临时工具中。不变鼠标 return; }; this.toolMap[selectedTool].classList.remove(this.selectedToolClass); this.toolMap[tool].classList.add(this.selectedToolClass); this.changeCursor(tool); }else{//命令 this.doFlipCommand(tool); }; }, remove:function(){ if(this.removed)return; this.removed=true; this.blur(true); this.img.src='';//如果在加载中取消,图片也取消读取。 if(this.overlayer){ this.overlayer.parentNode.removeChild(this.overlayer); }; this.imgWindow.parentNode.removeChild(this.imgWindow); var index=ImgWindowC.all.indexOf(this); ImgWindowC.all.splice(index,1); //focus next var topmost=0; ImgWindowC.all.forEach(function(iwin){ if(iwin.zIndex > topmost){ topmost=iwin; }; }); if(topmost){ topmost.focus(); }; }, aerialView:function(e){ this.working=true; //记住现在的缩放比例 var cLevel=this.zoomLevel; var wSize=getWindowSize(); wSize.h -= 16; wSize.w -= 16; var imgWindow=this.imgWindow; var imgWindowCS=getComputedStyle(imgWindow,''); var rectSize={ h:parseFloat(imgWindowCS.height), w:parseFloat(imgWindowCS.width), }; var rectRatio=rectSize.h/rectSize.w; var windowRatio=wSize.h/wSize.w; var size; var rangeSize={}; if(rectRatio > windowRatio){ size={ h:wSize.h, w:wSize.h / rectRatio, }; rangeSize.h=Math.min(wSize.h * (size.h / rectSize.h), size.h); rangeSize.w=Math.min(rangeSize.h / windowRatio , size.w); }else{ size={ w:wSize.w, h:wSize.w * rectRatio, }; rangeSize.w=Math.min(wSize.w * (size.w / rectSize.w), size.w); rangeSize.h=Math.min(rangeSize.w * windowRatio , size.h); }; this.zoom(this.getRotatedImgCliSize(size).w/this.imgNaturalSize.w); this.center(true,true); this.keepScreenInside(); var viewRange=this.viewRange; var vRS=viewRange.style; vRS.display='block'; vRS.height=rangeSize.h + 'px'; vRS.width=rangeSize.w + 'px'; vRS.top=0 + 'px'; vRS.left=0 + 'px'; var viewRangeRect=viewRange.getBoundingClientRect(); var viewRangeCenterCoor={ x:viewRangeRect.left + window.scrollX + 1/2 * rangeSize.w, y:viewRangeRect.top + window.scrollY + 1/2 * rangeSize.h, }; var self=this; var moveRange={ x:[8,8+size.w-rangeSize.w], y:[8,8+size.h-rangeSize.h] }; function setViewRangePosition(pageXY){ var top=pageXY.y - viewRangeCenterCoor.y; var left=pageXY.x - viewRangeCenterCoor.x; if(top<=moveRange.y[0]){ top=moveRange.y[0]; }else if(top>=moveRange.y[1]){ top=moveRange.y[1]; }; vRS.top= top + 'px'; if(left<=moveRange.x[0]){ left=moveRange.x[0]; }else if(left>=moveRange.x[1]){ left=moveRange.x[1]; }; vRS.left= left + 'px'; }; setViewRangePosition({ x:e.pageX, y:e.pageY, }); var moveHandler=function(e){ setViewRangePosition({ x:e.pageX, y:e.pageY, }); }; var mouseupHandler=function(){ self.working=false; viewRange.style.display='none'; self.zoom(cLevel); imgWindow.style.top= -13 - rectSize.h * ((parseFloat(vRS.top) - moveRange.y[0])/size.h) + window.scrollY +'px'; imgWindow.style.left= -13 - rectSize.w * ((parseFloat(vRS.left) - moveRange.x[0])/size.w) + window.scrollX +'px'; //说明图片的高度没有屏幕高,居中 //说明图片的宽度没有屏幕宽,居中 self.center(rangeSize.w == size.w , rangeSize.h == size.h); self.keepScreenInside(); document.removeEventListener('mousemove',moveHandler,true); document.removeEventListener('mouseup',mouseupHandler,true); }; document.addEventListener('mousemove',moveHandler,true); document.addEventListener('mouseup',mouseupHandler,true); }, }; //载入动画 function LoadingAnimC(data,buttonType,waitImgLoad,openInTopWindow){ this.data=data;//data this.buttonType=buttonType;//点击的按钮类型 this.openInTopWindow=openInTopWindow;//是否在顶层窗口打开,如果在frame里面的话 this.waitImgLoad=waitImgLoad;//是否等待完全读取后打开 this.init(); }; LoadingAnimC.all=[]; LoadingAnimC.prototype={ init:function(){ LoadingAnimC.all.push(this); this.addStyle(); var container=document.createElement('span'); container.classList.add('pv-loading-container'); this.loadingAnim=container; container.title='正在加载:' + this.data.src; container.innerHTML=''+ '<span class="pv-loading-error" style="display:none;">Error</span>'+ '<span class="pv-loading-cancle" title="取消"></span>'; var loadingError=container.querySelector('.pv-loading-error'); var loadingCancle=container.querySelector('.pv-loading-cancle'); this.loadingError=loadingError; this.loadingCancle=loadingCancle; var self=this; loadingCancle.addEventListener('click',function(e){ self.imgReady.abort(); self.remove(); },true); document.body.appendChild(container); this.setPosition(); var img=new Image(); img.src= this.buttonType=='current'? this.data.imgSrc : this.data.src; var opts={ error:function(e){ self.error(this,e); }, }; opts[this.waitImgLoad? 'load' : 'ready' ]=function(e){ self.load(this,e); }; this.imgReady=imgReady(img,opts); }, addStyle:function(){ if(LoadingAnimC.styleAdded)return; LoadingAnimC.styleAdded=true; var style=document.createElement('style'); style.type='text/css'; style.textContent='\ .pv-loading-container {\ position: absolute;\ z-index:999999997;\ top: 100px;\ left: 100px;\ background-color: black;\ background-image: url("'+prefs.icons.loading+'");\ background-repeat: no-repeat;\ background-position: center;\ background-origin: content-box;\ border: none;\ padding: 1px 30px 1px 2px;\ margin: 0;\ opacity: 0.6;\ height: 24px;\ min-width: 24px;\ box-shadow: 2px 2px 0px #666;\ -webkit-transition: opacity 0.15s ease-in-out;\ transition: opacity 0.15s ease-in-out;\ }\ .pv-loading-container:hover {\ opacity: 0.9;\ }\ .pv-loading-cancle {\ cursor: pointer;\ background-image: url("'+prefs.icons.loadingCancle+'");\ height: 24px;\ width: 24px;\ position: absolute;\ right: 0;\ top: 0;\ opacity: 0.2;\ display: block;\ -webkit-transition: opacity 0.15s ease-in-out;\ transition: opacity 0.15s ease-in-out;\ }\ .pv-loading-cancle:hover {\ opacity: 1;\ }\ .pv-loading-error {\ line-height: 24px;\ color: red;\ font-size: 12px;\ }\ '; document.querySelector('head').appendChild(style); }, remove:function(){ if(!this.removed){ this.removed=true; this.loadingAnim.parentNode.removeChild(this.loadingAnim); LoadingAnimC.all.splice(LoadingAnimC.all.indexOf(this),1); }; }, error:function(img,e){ this.loadingAnim.style.backgroundImage='none'; this.loadingError.style.removeProperty('display'); var self=this; setTimeout(function(){ self.remove(); },2000) }, setPosition:function(){ var position=getTargetPosition(this.data.img); var cs=this.loadingAnim.style; cs.top=position.top +1 + 'px'; cs.left=position.left +1 + 'px'; cs.removeProperty('display'); }, load:function(img,e){ this.remove(); this.img=img; var buttonType=this.buttonType; if(buttonType=='gallery'){ var allData=this.getAllValidImgs(); allData.target=this.data; this.data=allData; }; if(this.openInTopWindow && isFrame && buttonType!='magnifier'){ var data=this.data; //删除不能发送的项。 var delCantClone=function(obj){ delete obj.img; delete obj.imgPA; }; if(Array.isArray(data)){ delCantClone(data.target); data.forEach(function(obj){ delCantClone(obj); }); }else{ delCantClone(data); }; window.postMessage({ messageID:messageID, src:img.src, data:data, buttonType:buttonType, to:'top', },'*'); }else{ this.open(); }; }, getAllValidImgs:function(){ var imgs=document.getElementsByTagName('img'),//html collection validImgs=[] ; arrayFn.forEach.call(imgs,function(img,index,imgs){ var result=findPic(img); if(result){ validImgs.push(result); }; }); return validImgs; }, open:function(){ switch(this.buttonType){ case 'gallery':{ if(!gallery){ gallery=new GalleryC(); }; gallery.load(this.img,this.data,this.from); }break; case 'magnifier':{ new MagnifierC(this.img,this.data); }break; case 'actual':; case 'current':; case 'original':{//original 是为了兼容以前的规则 new ImgWindowC(this.img); }break; }; }, }; //工具栏 function FloatBarC(){ this.init(); }; FloatBarC.prototype={ init:function(){ this.addStyle(); var container=document.createElement('span'); container.id='pv-float-bar-container'; //innerHTML中的span不能加空格 container.innerHTML=''+ '<span class="pv-float-bar-button"></span>'+ '<span class="pv-float-bar-button"></span>'+ '<span class="pv-float-bar-button"></span>'+ '<span class="pv-float-bar-button"></span>'; document.body.appendChild(container); var buttons={}; this.buttons=buttons; this.children=container.children; arrayFn.forEach.call(this.children,function(child,index,children){ var titleMap={ actual:'Tamaño REAL Size', gallery:'Picture Gallery | Galeria de Imágenes', current:'Current Size | Tamaño Actual', magnifier:'Lupa | Magnifier', }; var buttonName=prefs.floatBar.butonOrder[index]; buttons[buttonName]=child; child.title=titleMap[buttonName]; child.classList.add('pv-float-bar-button-' + buttonName); }); this.floatBar=container; this.shown=true; this.preShownImg=null; var self=this; container.addEventListener('click',function(e){ var buttonType; var target=e.target; for(var type in buttons){ if(!buttons.hasOwnProperty(type))return; if(target==buttons[type]){ buttonType=type; break; }; }; if(!buttonType)return; self.hide(); self.open(e,buttonType); },true); addCusMouseEvent('mouseleave',container,function(e){ clearTimeout(self.hideTimer); self.hideTimer=setTimeout(function(){ self.hide(); },prefs.floatBar.hideDelay); }); addCusMouseEvent('mouseenter',container,function(e){ clearTimeout(self.hideTimer); }); }, addStyle:function(){ var style=document.createElement('style'); style.type='text/css'; style.textContent='\ #pv-float-bar-container {\ position: absolute;\ z-index:999999998;\ top: -100px;\ left: -100px;\ padding: 5px;\ margin: 0;\ border: none;\ opacity: 0.6;\ line-height: 0;\ -webkit-transition: opacity 0.2s ease-in-out;\ transition: opacity 0.2s ease-in-out;\ }\ #pv-float-bar-container:hover {\ opacity: 1;\ }\ .pv-float-bar-button {\ cursor: pointer;\ width: 18px;\ height: 18px;\ padding: 1px;\ margin: 0;\ border: none;\ display: inline-block;\ position: relative;\ border-radius: 100px;\ box-shadow: 1px 1px 3px 0px black;\ background-color: transparent;\ background-repeat: no-repeat;\ background-origin: content-box;\ background-clip: content-box;\ background-size: 100% 100%;\ -webkit-transition: margin-left 0.15s ease-in-out, width 0.15s ease-in-out, height 0.15s ease-in-out;\ transition: margin-left 0.15s ease-in-out, width 0.15s ease-in-out, height 0.15s ease-in-out;\ }\ .pv-float-bar-button:nth-child(n+2){\ margin-left: -16px;\ }\ .pv-float-bar-button:first-child {\ z-index: 4;\ }\ .pv-float-bar-button:nth-child(2) {\ z-index: 3;\ }\ .pv-float-bar-button:nth-child(3) {\ z-index: 2;\ }\ .pv-float-bar-button:last-child {\ z-index: 1;\ }\ #pv-float-bar-container:hover > .pv-float-bar-button {\ width: 24px;\ height: 24px;\ }\ #pv-float-bar-container:hover > .pv-float-bar-button:nth-child(n+2) {\ margin-left: 0;\ }\ .pv-float-bar-button-actual {\ background-image:url("'+ prefs.icons.actual +'");\ background-color: red;\ }\ .pv-float-bar-button-gallery {\ background-image:url("'+ prefs.icons.gallery +'");\ background-color: yellow;\ }\ .pv-float-bar-button-current {\ background-image:url("'+ prefs.icons.current +'");\ background-color: blue;\ }\ .pv-float-bar-button-magnifier {\ background-image:url("'+ prefs.icons.magnifier +'");\ background-color: pink;\ }\ '; document.querySelector('head').appendChild(style); }, start:function(data){ //读取中的图片,不显示浮动栏,调整读取图标的位置. if(LoadingAnimC.all._find(function(item,index,array){ if(data.img==item.data.img){ return true; }; }))return; //被放大镜盯上的图片,不要显示浮动栏. if(MagnifierC.all._find(function(item,index,array){ if(data.img==item.data.img){ return true; }; }))return; this.data=data; var self=this; clearTimeout(this.hideTimer); var imgOutHandler=function(e){ document.removeEventListener('mouseout',imgOutHandler,true); clearTimeout(self.showTimer); clearTimeout(self.hideTimer); self.hideTimer=setTimeout(function(){ self.hide(); },prefs.floatBar.hideDelay); }; clearTimeout(this.globarOutTimer); this.globarOutTimer=setTimeout(function(){//稍微延时。错开由于css hover样式发生的out; document.addEventListener('mouseout',imgOutHandler,true); },100); if(data.img==this.preShownImg && this.shown){ this.setPosition(); return; }; clearTimeout(this.showTimer); this.showTimer=setTimeout(function(){ self.show(); },prefs.floatBar.showDelay); }, setButton:function(){ if(this.data.type=='force'){ this.buttons['actual'].style.display='none'; this.buttons['magnifier'].style.display='none'; }else{ this.buttons['actual'].style.removeProperty('display'); this.buttons['magnifier'].style.removeProperty('display'); }; //如果隐藏的按钮是第一个,css弹出层叠按钮的动画会有些维和,这些修正一下。 var firstHidden; arrayFn._find.call(this.children,function(child, index, children){ var cs=child.style; if(index==0){ if(cs.display=='none'){ firstHidden=true; }; }; if(firstHidden){//如果第一个是隐藏的,那么去掉以后第一个非隐藏的marginleft if(cs.display!='none'){ cs.marginLeft=0; return true; }; }else{ cs.removeProperty('margin-left'); }; }); }, setPosition:function(){ //如果图片被删除了,或者隐藏了。 var bCR=this.data.img.getBoundingClientRect(); if((bCR.left==0 && bCR.right==0) || (bCR.top==0 && bCR.bottom==0))return false; var targetPosi=getTargetPosition(this.data.img); var windowSize=getWindowSize(); var floatBarPosi=prefs.floatBar.position.toLowerCase().trim().split(/\s+/); var offsetX=prefs.floatBar.offset.x; var offsetY=prefs.floatBar.offset.y; var scrollXY={ x:window.scrollX, y:window.scrollY, }; var fbs=this.floatBar.style; var setPosition={ top:function(){ var top=targetPosi.top; if(targetPosi.t < -offsetY){//满足图标被遮住的条件. top=scrollXY.y; offsetY=0; }; fbs.top=top + offsetY + 'px'; }, right:function(){ var right=windowSize.w - targetPosi.r; if(right < offsetX){ right= -scrollXY.x; offsetX=0; }else{ right -=scrollXY.x; }; fbs.right=right - offsetX + 'px'; }, bottom:function(){ var bottom=windowSize.h-targetPosi.b; if(bottom <= offsetY){ offsetY=0; }; bottom -= scrollXY.y; fbs.bottom=bottom - offsetY + 'px'; }, left:function(){ var left=targetPosi.left; if(targetPosi.l < -offsetX){ left=scrollXY.x; offsetX=0; }; fbs.left=left + offsetX + 'px'; }, }; setPosition[floatBarPosi[0]](); setPosition[floatBarPosi[1]](); }, show:function(){ if(this.setPosition()===false){ return; }; this.preShownImg=this.data.img; this.shown=true; this.setButton(); this.floatBar.style.removeProperty('display'); clearTimeout(this.hideTimer); }, hide:function(){ clearTimeout(this.showTimer); this.shown=false; this.floatBar.style.display='none'; }, open:function(e,buttonType){ var waitImgLoad=e.ctrlKey? !prefs.waitImgLoad : prefs.waitImgLoad;//按住ctrl取反向值 var openInTopWindow=e.shiftKey? !prefs.framesPicOpenInTopWindow : prefs.framesPicOpenInTopWindow;//按住shift取反向值 if(!waitImgLoad && buttonType=='magnifier' && !envir.chrome){//非chrome的background-image需要全部载入后才能显示出来 waitImgLoad=true; }; new LoadingAnimC(this.data,buttonType,waitImgLoad,openInTopWindow); }, }; var matchedRule, URL=location.href, floatBar ; function findPic(img){ var imgPA=getElementByXpath('./ancestor::a[1]',img); var iPASrc=imgPA? imgPA.href : ''; //base64字符串过场导致正则匹配卡死浏览器 var base64Img=/^data:[^;]+;base64,/i.test(img.src); if(matchedRule===undefined){//找到符合站点的高级规则,并缓存. matchedRule=siteInfo._find(function(site,index,array){ if(site.enabled && site.url && site.url.test(URL)){ return true; }; }); matchedRule=matchedRule? matchedRule[0] : false; //console.log('匹配的规则:',matchedRule); }; var src, type; if(!src && matchedRule){//通过高级规则获取. try{ src=matchedRule.getImage.call(img,img,imgPA); }catch(err){ throwErrorInfo(err); }; if(src)type='rule'; }; if(!src && !base64Img){//遍历通配规则 tprules._find(function(rule,index,array){ try{ src=rule.call(img,img,imgPA); if(src){ //console.log('匹配的通配规则',rule); return true; }; }catch(err){ throwErrorInfo(err); }; }); if(src)type='tpRule'; }; if(!src && imgPA){//链接可能是一张图片... if(/\.(?:jpg|jpeg|png|gif|bmp)$/i.test(iPASrc)){ src=iPASrc; }; if(src)type='scale'; }; if(!src){//本图片是否被缩放. var imgAS={//实际尺寸。 h:img.naturalHeight, w:img.naturalWidth, }; var imgCS=getCurrentSize(img); if(!(imgAS.w==imgCS.w && imgAS.h==imgCS.h)){//如果不是两者完全相等,那么被缩放了. if(imgAS.h > prefs.floatBar.minSizeLimit.h || imgAS.w > prefs.floatBar.minSizeLimit.w){//最小限定判断. src=img.src; type='scale'; }; }else{ if(prefs.floatBar.forceShow.enabled && (imgCS.w>=prefs.floatBar.forceShow.size.w && imgCS.h>=prefs.floatBar.forceShow.size.h)){ src=img.src; type='force'; }; }; }; if(!src)return; var ret={ src:src,//得到的src type:type,//通过哪种方式得到的 imgSrc:img.src,//处理的图片的src iPASrc:iPASrc,//图片的第一个父a元素的链接地址 img:img,//处理的图片 imgPA:imgPA,//图片的第一个父a元素 }; //console.log('图片查找结果:',ret); return ret; }; var isFrame=window!=window.parent; window.addEventListener('message',function(e){//contentscript里面的message监听,监听来自别的窗口的数据。 var data=e.data; if( !data || !data.messageID || data.messageID != messageID )return;//通信ID认证 var source=e.source; if(typeof source=='undefined' || source!==window){//来自别的窗口 if(!isFrame){//顶层窗口 //console.log('top-contentscript接收到:',e); /* window.postMessage({ messageID:messageID, to:data.from, data:'hello', },'*'); */ var img=new Image(); img.src=data.src; imgReady(img,{ ready:function(){ LoadingAnimC.prototype.open.call({ img:img, data:data.data, buttonType:data.buttonType, from:data.from,//来自哪个窗口 }); }, }); }else{//frame窗口 //console.log('frame-contentscript接收到',e); }; }; },true); //页面脚本用来转发消息 //原因chrome的contentscript无法访问非自己外的别的窗口。都会返回undefined,自然也无法向其他的窗口发送信息,这里用pagescript做个中间代理 //通讯逻辑..A页面的contentscript发送到A页面的pagescript,pagescript转交给B页面的contentscript var messageID='pv-0.5106795670312598'; var pageScript=document.createElement('script'); var pageScriptText=function(messageID){ var frameID=Math.random(); var frames={ top:window.top, }; window.addEventListener('message',function(e){ var data=e.data; if( !data || !data.messageID || data.messageID != messageID )return;//通信ID认证 var source=e.source; if(source===window){//来自contentscript,发送出去 data.from=frameID; frames[data.to].postMessage(data,'*'); }else{//来自别的窗口的,contentscript可以直接接收,这里保存下来自的窗口的引用 frames[data.from]=source; }; },true) }; pageScript.textContent='(' + pageScriptText.toString() + ')('+ JSON.stringify(messageID) +')'; document.querySelector('head').appendChild(pageScript); function clikToOpen(data){ var preventDefault = matchedRule.clikToOpen.preventDefault; function mouseout(){ document.removeEventListener('mouseout',mouseout,true); document.removeEventListener('click',click,true); if(data.imgPA && preventDefault){ data.imgPA.removeEventListener('click',clickA,false); }; }; function click(e){ FloatBarC.prototype.open.call({ data:data, }, e, matchedRule.clikToOpen.type); }; function clickA(e){//阻止a的默认行为 e.preventDefault(); }; document.addEventListener('click',click,true); if(data.imgPA && preventDefault){ data.imgPA.addEventListener('click',clickA,false); }; setTimeout(function(){//稍微延时。错开由于css hover样式发生的out; document.addEventListener('mouseout',mouseout,true); },100); return function(){ mouseout() }; }; //监听 mouseover var canclePreCTO; function globalMouseoverHandler(e){ if(galleryMode)return;//库模式全屏中...... var target=e.target; if(target.nodeName!='IMG' || target.classList.contains('pv-pic-not-allowed')){ return; }; var result=findPic(target); if(result){ if(!floatBar){ floatBar=new FloatBarC(); }; if(result.type=='rule' && matchedRule.clikToOpen && matchedRule.clikToOpen.enabled){ if(canclePreCTO){//取消上次的,防止一次点击打开多张图片 canclePreCTO(); }; canclePreCTO=clikToOpen(result); }; floatBar.start(result);//出现悬浮工具栏 }; }; document.addEventListener('mouseover',globalMouseoverHandler,true); }; function init2(){ init(topObject,window,document,arrayFn,envir); }; var arrayFn=(function(){ //Array的某些方法对所有的类数组都有效,比如HTMLCollection,NodeList //添加一个当函数返回true时,返回[array[index],index],并且跳出循环的方法 //类似做到 for 循环,在满足条件的时候直接break跳出的效果。 if(typeof Array.prototype['_find']!='function'){ Object.defineProperty(Array.prototype,'_find',{ value:function(callback , thisArg){ if (this == null){ throw new TypeError( "this is null or not defined" ); }; if(typeof callback != 'function') { throw new TypeError( callback + " is not a function" ); }; var i = 0, l = this.length, value, hasOwnProperty=Object.prototype.hasOwnProperty ; while(i<l){ if(hasOwnProperty.call(this,i)){ value = this[i]; if(callback.call( thisArg, value, i, this )===true){ return [value,i,this]; }; }; i++; }; }, writable:true, enumerable:false,//与原生方法一样不可枚举,维护网页和谐。。。 configurable:true, }); }; var arrayProto=Array.prototype; return { _find:arrayProto._find, slice:arrayProto.slice, forEach:arrayProto.forEach, some:arrayProto.some, every:arrayProto.every, map:arrayProto.map, filter:arrayProto.filter, indexOf:arrayProto.indexOf, lastIndexOf:arrayProto.lastIndexOf, }; })(); //检测运行环境 var envir={ opera:!!window.opera, chrome:!!window.chrome, firefox:typeof XPCNativeWrapper=='function'? true : false, }; if(document.readyState=='loading'){ document.addEventListener('DOMContentLoaded',init2,true); }else if(document.readyState!='complete'){ document.addEventListener('DOMContentLoaded',function(){ window.removeEventListener('load',init2,true); init2(); },true); window.addEventListener('load',init2,true); }else{ init2(); }; })(this,window,document) }{ var greasedLightbox = { aspectRatio : null, timer : null, slideTime : 3, currentAddress : null, allImageLinks : [], currentImagePosition : 0, lastMove : 1, isShowing : false, isSlideShow : false, searchDefs : [ // wikipedia (needs to come before 'show') { name : 'wikipedia', includeRegExp : /^https?:\/\/(.*?\.)?wikipedia\.org/i, linkRegExp : /.*?\/(Fi(le?|xter|txategi|gura|n?ch(ier|eiro))|Fa(il|sciculus)|Dat(oteka|ei)|Delwedd|Dosiero|Be(stand|rkas)|Billede|Skeudenn|Soubor|Slika|Pilt|Archivo|Mynd|Vaizdas|Tiedosto|Larawan|Resim):.*\.(jpe?g|gif|png)$/i, findImageRegExp : /(.+?)\/thumb\/(.+?)\.(jpe?g|gif|png).*$/i, replaceString : '$1/$2.$3', showFunction : function(event) { greasedLightbox.showFrom(event, 'wikipedia'); return false; } }, // wikipedia // imagesocket (needs to come before 'show') { name : 'imagesocket', includeRegExp : /./, // used on every page linkRegExp : /^(https?:\/\/)(.*?\.)?imagesocket\.com\/(view|thumbs)\/(.*?\.(jpe?g|gif|png))$/i, replaceString : '$1content.imagesocket.com/images/$4', showFunction : function(event) { greasedLightbox.showFrom(event, 'imagesocket'); return false; } }, // imagesocket // imagesocket site (needs to come before 'show') { name : 'imagesocketSite', includeRegExp : /^https?:\/\/(.*?\.)?imagesocket\.com/i, linkRegExp : /^\/view\/(.*?\.(jpe?g|gif|png))$/i, replaceString : 'http://content.imagesocket.com/images/$1', showFunction : function(event) { greasedLightbox.showFrom(event, 'imagesocketSite'); return false; } }, // imagesocket site // blogger/blogspot (needs to come before 'show') { name : 'blogger', includeRegExp : /^https?:\/\/(.*?\.)?blog(ger|spot)\.com/i, linkRegExp : /^(https?:\/\/.*?\.blogger\.com\/.*?\/.*?\/.*?\/.*?)\/.*?-h(\/.*?\.(jpe?g|gif|png))$/i, replaceString : '$1$2', showFunction : function(event) { greasedLightbox.showFrom(event, 'blogger'); return false; } }, // blogger/blogspot // radikal.ru { name : 'radikal', includeRegExp : /./, // used in every page linkRegExp : /http:\/\/(radikal.ru\/F\/)?(.*\.(jpg|png))(\.html)?$/i, replaceString : 'http://$2', showFunction : function(event) { greasedLightbox.showFrom(event, 'radikal'); return false; } }, // radikal.ru // regular links to images { name : 'show', includeRegExp : /./, // used on every page linkRegExp : /.*?\.(jpe?g|gif|png)$/i, excludeLinkRegExp : /\?/i, showFunction : function(event) { greasedLightbox.show(event); return false; } }, // regular links to images // picasa /* "view in original context" is not worked propertly */ { name : 'picasa', includeRegExp : /./, // used on every page linkRegExp : /https?:\/\/picasaweb\.google\..*\/.+/i, findImageRegExp : /^(https?:\/\/.*)\/s[0-9]+\/(.*)\.jpg$/i, replaceString : '$1/s1024/$2.jpg', showFunction : function(event) { greasedLightbox.showFrom(event, 'picasa'); return false; } }, // ipicture/upload { name : 'ipicture', includeRegExp : /./, // used on every page linkRegExp : /http:\/\/ipicture\.ru\/upload\/(.*(jpg|png|jpeg|gif))$/i, replaceString : 'http://ipicture.ru/upload/$1', showFunction : function(event) { greasedLightbox.showFrom(event, 'picasa'); return false; } }, // search engine images (google, yahoo, ask jeeves, blingo) { name : 'search', includeRegExp : /^https?:\/\/(.*?\.)?(google\..*|search\.yahoo\.com|blingo\.com\/images)/i, linkRegExp : /.*?(im(age|g)(ur(i|l)|src))=(http(s?):\/\/)?(.*?)&.*/i, replaceString : 'http$6://$7', showFunction : function(event) { greasedLightbox.showFrom(event, 'search'); return false; } }, // search engine images // doubanpic { name : 'doubanpic', includeRegExp : /^http:\/\/www\.douban\.com\/subject\/[0-9]+\//i, linkRegExp : /^(http:\/\/t\.douban\.com\/)l(pic\/s[0-9]+\.jpg)/i, replaceString : '$1m$2', showFunction : function(event) { greasedLightbox.showFrom(event, 'doubanpic'); return false; } }, // doubanpic // doubanphoto { name : 'doubanphoto', includeRegExp : /^http:\/\/www\.douban\.com\/photos\/album\/[0-9]+\//i, linkRegExp : /^http:\/\/www\.douban\.com\/photos\/photo\/([0-9]+)\/$/i, replaceString : 'http://t.douban.com/view/photo/photo/public/p$1.jpg', showFunction : function(event) { greasedLightbox.showFrom(event, 'doubanphoto'); return false; } }, // doubanphoto // doubanevent { name : 'doubanevent', includeRegExp : /^http:\/\/www\.douban\.com\/event\/album\/[0-9]+\//i, linkRegExp : /^http:\/\/www\.douban\.com\/event\/photo\/([0-9]+)\/$/i, replaceString : 'http://t.douban.com/view/photo/photo/public/p$1.jpg', showFunction : function(event) { greasedLightbox.showFrom(event, 'doubanevent'); return false; } }, // doubanevent // doubanonline { name : 'doubanonline', includeRegExp : /^http:\/\/www\.douban\.com\/online\/[0-9]+\/album\/[0-9]+\//i, linkRegExp : /^http:\/\/www\.douban\.com\/online\/[0-9]+\/photo\/([0-9]+)\/$/i, replaceString : 'http://img2.douban.com/view/photo/photo/public/p$1.jpg', showFunction : function(event) { greasedLightbox.showFrom(event, 'doubanonline'); return false; } }, // doubanonline // doubanartist1 { name : 'doubanartist1', includeRegExp : /^http:\/\/www\.douban\.com\/artist\/[a-z]+\/album\/[0-9]+\//i, linkRegExp : /^http:\/\/www\.douban\.com\/artist\/[a-z]+\/photo\/([0-9]+)\/$/i, replaceString : 'http://t.douban.com/view/photo/photo/public/p$1.jpg', showFunction : function(event) { greasedLightbox.showFrom(event, 'doubanartist1'); return false; } }, // artist1 // doubanartist2 { name : 'doubanartist2', includeRegExp : /^http:\/\/www\.douban\.com\/artist\/[a-z]+\/public_album\/[0-9]+\//i, linkRegExp : /^http:\/\/www\.douban\.com\/artist\/[a-z]+\/public_photo\/([0-9]+)\/$/i, replaceString : 'http://t.douban.com/view/photo/photo/public/p$1.jpg', showFunction : function(event) { greasedLightbox.showFrom(event, 'doubanartist2'); return false; } }, // doubanartist2 // flickr { name : 'flickr', includeRegExp : /^https?:\/\/(.*?\.)?flickr\.com/i, linkRegExp : /\/photos\/[^\/]+\/[0-9]+/i, findImageRegExp : /_[tsm]\.jpg/i, replaceString : '.jpg', showFunction : function(event) { greasedLightbox.showFrom(event, 'flickr'); return false; } }, // flickr // facebook /* removed support because they now have nice built-in image viewing features { name : 'facebook', includeRegExp : /^https?:\/\/(.*?\.)?facebook\.com/i, linkRegExp : /photo\.php\?pid=[0-9]+/i, findImageRegExp : /[st]([0-9]+.*?)\.jpg/i, replaceString : 'n$1.jpg', showFunction : function(event) { greasedLightbox.showFrom(event, 'facebook'); return false; } }, // facebook */ // myspace1 { name : 'myspace1', includeRegExp : /^https?:\/\/(.*?\.)?myspace\.com/i, linkRegExp : /imageID=[0-9]+/i, findImageRegExp : /m_(.+)\.jpg/i, replaceString : 'l_$1.jpg', showFunction : function(event) { greasedLightbox.showFrom(event, 'myspace1'); return false; } }, // myspace1 // myspace2 { name : 'myspace2', includeRegExp : /^https?:\/\/(.*?\.)?myspace\.com/i, linkRegExp : /imageID/i, findImageRegExp : /_m/i, replaceString : '_l', showFunction : function(event) { greasedLightbox.showFrom(event, 'myspace2'); return false; } }, // myspace2 // deviantart { name : 'deviantart', includeRegExp : /^https?:\/\/(.*?\.)?deviantart\.com/i, linkRegExp : /deviantart\.com\/(deviation|print|art)\/.+/i, findImageRegExp : /^http(s)?:\/\/.*?\.deviantart\.com\/([^\/]*)\/[^\/]*\/(.*?)\.(jpe?g|gif|png)$/i, replaceString : 'http$1://fc01.deviantart.com/$2/$3.$4', showFunction : function(event) { greasedLightbox.showFrom(event, 'deviantart'); return false; } }, // deviantart // subvariance { name : 'subvariance', includeRegExp : /^https?:\/\/(.*?\.)?subvariance\.com/i, linkRegExp : /\/view\/[0-9]+/i, findImageRegExp : /\/items\/thumbs\/(.*?)\.jpg/i, replaceString : '/items/$1.jpg', showFunction : function(event) { greasedLightbox.showFrom(event, 'subvariance'); return false; } }, // subvariance // gmail { name : 'gmail', includeRegExp : /^https?:\/\/mail\.google\..*/i, linkRegExp : /^(\/mail\/\?view=att&(amp;)?disp=)inline/i, replaceString : 'http://' + window.location.host + '$1emb', showFunction : function(event) { greasedLightbox.showFrom(event, 'gmail'); return false; } }, // gmail // imagefap { name : 'imagefap', includeRegExp : /^https?:\/\/(.*?\.)?imagefap\.com/i, linkRegExp : /(image.php\?id=|gallery\/)[0-9]+/i, findImageRegExp : /\/images\/(thumb|mini)\/([0-9]+)\/([0-9]+)\/([0-9]+)\.jpg/i, replaceString : '/full/$2/$3/$4.jpg', showFunction : function(event) { greasedLightbox.showFrom(event, 'imagefap'); return false; } }, // ffffound! { name : 'ffffound', includeRegExp : /^https?:\/\/(.*?\.)?ffffound\.com/i, linkRegExp : /\/image\/[\w]+$/i, findImageRegExp : /img(-thumb)?\.ffffound\.com\/static-data\/assets\/([\w\/]+?)_[\w]+\.(jpe?g|gif|png)$/i, replaceString : 'img.ffffound.com/static-data/assets/$2.$3', showFunction : function(event) { greasedLightbox.showFrom(event, 'ffffound'); return false; } }, // textamerica /* removed support because they are now subscription-based { name : 'textamerica', includeRegExp : /^http(s)?:\/\/(.*?\.)?textamerica\.com/i, linkRegExp : /\?r=[0-9]+$/i, findImageRegExp : /user\.images\.x\/(.*?\/.*?)\/(.*?)\/(.*?)\.jpg(.*)$/i, replaceString : 'user.images.x/$1\/$3.jpg', showFunction : function(event) { greasedLightbox.showFrom(event, 'textamerica'); return false; } } // textamerica */ // image http://bp2.blogger.com/_a7jkcMVp5Vg/SAGu9Ym-S2I/AAAAAAAAEoM/WCGF3uywJzE/s400/empty.jpg // link http://bp2.blogger.com/_a7jkcMVp5Vg/SAGu9Ym-S2I/AAAAAAAAEoM/WCGF3uywJzE/s1600-h/empty.jpg // final image http://bp2.blogger.com/_a7jkcMVp5Vg/SAGu9Ym-S2I/AAAAAAAAEoM/WCGF3uywJzE/s1600/empty.jpg ], // searchDefs[] // useLinkForShow() useLinkForShow : function(searchDef) { if (searchDef.findImageRegExp) return false; else return true; }, // showFrom() // generic helper function that calls show() with the correct parameters showFrom : function(event, showName) { var link; if (event.currentTarget) link = event.currentTarget; else link = event; var address = unescape(unescape(greasedLightbox.getAddress(link))); var img = greasedLightbox.getImageToShow(link, address, showName); greasedLightbox.show(event, img, address); }, // showFromLink() // getImageToShow() getImageToShow : function(link, address, showName) { var searchDef = greasedLightbox.getRegExpObj(greasedLightbox.searchDefs, showName); if (greasedLightbox.useLinkForShow(searchDef)) { address = unescape(unescape(address)); if (searchDef['replaceString']) var img = address.replace(searchDef['linkRegExp'], searchDef['replaceString']); else var img = address.match(searchDef['linkRegExp'])[0]; } else { var img = greasedLightbox.containsThumb(link, greasedLightbox.getRegExpObj(greasedLightbox.searchDefs, showName), true); } return img; }, // getImageToShow() // getRegExpObj() // returns the requested regular expression object from the regExp array getRegExpObj : function(regExpObject, showName) { var rExObj; for (var i = 0; i < regExpObject.length; i++) { rExObj = regExpObject[i]; if (rExObj['name'] == showName) return rExObj; } }, // getRegExpObj() // containsThumb() containsThumb : function(elem, rExObj, verbose) { var images, image, src; images = document.evaluate('descendant::img[@src]', elem, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for(var i = 0; i < images.snapshotLength; i++) { thisImage = images.snapshotItem(i); src = thisImage.getAttribute('src'); if(rExObj['findImageRegExp'].test(src)) { if(!verbose) return true; return src.replace(rExObj['findImageRegExp'], rExObj['replaceString']); } } return false; }, // containsThumb() // getAddress() // extracts an address out of a linkObj getAddress : function(linkObj) { var address = linkObj.getAttribute('href'); // for GreaseKit users because Safari doesn't like stopping events even though it says it does... if(/Safari/.test(navigator.userAgent)) { linkObj.onclick = function() { return false; }; } return address; }, // getAddress() // getPageScroll() // Returns array with x,y page scroll values. // Core code from - quirksmode.org getPageScroll : function() { var xScroll, yScroll; if (self.pageYOffset) { yScroll = self.pageYOffset; } else if (document.documentElement && document.documentElement.scrollTop){ // Explorer 6 Strict yScroll = document.documentElement.scrollTop; } else if (document.body) {// all other Explorers yScroll = document.body.scrollTop; } if (self.pageXOffset) { xScroll = self.pageXOffset; } else if (document.documentElement && document.documentElement.scrollLeft){ // Explorer 6 Strict xScroll = document.documentElement.scrollLeft; } else if (document.body) {// all other Explorers xScroll = document.body.scrollLeft; } arrayPageScroll = new Array(xScroll,yScroll) return arrayPageScroll; }, // getPageScroll() // getPageSize() // Returns array with page width, height and window width, height // Core code from - quirksmode.org // Edit for Firefox by pHaez getPageSize : function() { var xScroll, yScroll; if (window.innerHeight && window.scrollMaxY) { xScroll = document.body.scrollWidth; yScroll = window.innerHeight + window.scrollMaxY; } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac xScroll = document.body.scrollWidth; yScroll = document.body.scrollHeight; } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari xScroll = document.body.offsetWidth; yScroll = document.body.offsetHeight; } var windowWidth, windowHeight; if (self.innerHeight) { // all except Explorer windowWidth = self.innerWidth; windowHeight = self.innerHeight; } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode windowWidth = document.documentElement.clientWidth; windowHeight = document.documentElement.clientHeight; } else if (document.body) { // other Explorers windowWidth = document.body.clientWidth; windowHeight = document.body.clientHeight; } // for small pages with total height less then height of the viewport if(yScroll < windowHeight){ pageHeight = windowHeight; } else { pageHeight = yScroll; } // for small pages with total width less then width of the viewport if(xScroll < windowWidth){ pageWidth = windowWidth; } else { pageWidth = xScroll; } arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight); return arrayPageSize; }, // getPageSize() // center() // centers the object in the page center : function(objToCenter, arrayPageScroll, arrayPageSize) { var oldDisplay = new Array(objToCenter.style.visibility, objToCenter.style.display); objToCenter.style.display = 'none'; var arrayPageScroll = (arrayPageScroll) ? arrayPageScroll : greasedLightbox.getPageScroll(); var arrayPageSize = (arrayPageSize) ? arrayPageSize : greasedLightbox.getPageSize(); objToCenter.style.visibility = 'hidden'; objToCenter.style.display = 'block'; var objTop = arrayPageScroll[1] + ((arrayPageSize[3] + 35 - objToCenter.offsetHeight) / 2); var objLeft = (arrayPageSize[0] - objToCenter.offsetWidth) / 2; objToCenter.style.top = (objTop < 0) ? "0px" : objTop + "px"; objToCenter.style.left = (objLeft < 0) ? "0px" : objLeft + "px"; objToCenter.style.visibility = oldDisplay[0]; objToCenter.style.display = oldDisplay[1]; }, // center() // centerItAll() // Centers the lightbox object and the loading/error object on the page centerItAll : function() { var objLightbox = document.getElementById('greasedLightbox'); var objLoading = document.getElementById('greasedLightboxLoading'); var arrayPageSize = greasedLightbox.getPageSize(); var arrayPageScroll = greasedLightbox.getPageScroll(); greasedLightbox.center(objLightbox, arrayPageScroll, arrayPageSize); greasedLightbox.center(objLoading, arrayPageScroll, arrayPageSize); }, // centerItAll() // show() // Preloads images. Pleaces new image in lightbox then centers and displays. show : function(event, img, context) { //alert(img); // let shift+click and ctrl+click (but not ctrl+shift+click) through without lightbox if ((event.shiftKey || event.ctrlKey) && !(event.shiftKey && event.ctrlKey)) return true; // if this is a real event stop the click and set the link, otherwise, just set the link if (event.currentTarget) { var link = event.currentTarget; greasedLightbox.stopEvents(event); } else { var link = event; } if (img == null || img == '') img = link.getAttribute('href'); greasedLightbox.currentAddress = unescape(unescape(greasedLightbox.getAddress(link))); // make ctrl+shift+click follow link without lightbox if (event.shiftKey && event.ctrlKey) { window.location.href = greasedLightbox.currentAddress; return true; } // center when resized if (greasedLightbox.isShowing != true) window.addEventListener('resize', greasedLightbox.centerItAll, true); greasedLightbox.isShowing = true; // get the caption from the title attribute of the link. if that doesn't exist, look for it in the title attribute of the image. capt = link.getAttribute('title'); if (capt == null || capt == '') { try { var imgObj = link.firstChild; capt = imgObj.getAttribute('title'); } catch (e) { } } if (capt == null || capt == '') { try { var imgObj = link.firstChild; capt = imgObj.getAttribute('alt'); } catch (e) { } } // prep objects var objOverlay = document.getElementById('greasedLightboxOverlay'); var objMenu = document.getElementById('greasedLightboxMenu'); var objLightbox = document.getElementById('greasedLightbox'); var objCaption = document.getElementById('greasedLightboxCaption'); var imgPreload = document.getElementById('greasedLightboxPreload'); var objImage = document.getElementById('greasedLightboxImage'); var objLoading = document.getElementById('greasedLightboxLoading'); objOverlay.style.display = 'none'; // This will ensure that we have a correct reading of the page size var arrayPageSize = greasedLightbox.getPageSize(); var arrayPageScroll = greasedLightbox.getPageScroll(); // set height of Overlay to take up whole page and show objOverlay.style.height = (arrayPageSize[1] + 'px'); objOverlay.style.display = 'block'; // show menu objMenu.style.display = 'block'; // center loader and error message objLoading.style.visibility = 'hidden'; objLoading.style.display = 'block'; greasedLightbox.center(objLoading, arrayPageScroll, arrayPageSize); objLoading.style.visibility = 'visible'; var imgPreload = document.getElementById('greasedLightboxPreload'); // preload image preloaderDone = function() { loaderDone = function() { objImage.removeAttribute('width'); objImage.removeAttribute('height'); greasedLightbox.aspectRatio = null; if (capt) { objCaption.innerHTML = capt; } else { objCaption.innerHTML = img; } // dimensions // objCaption.innerHTML = objCaption.innerHTML + '<br/><br/>(width: ' + objImage.width + 'px; height: ' + objImage.height + 'px;)'; // add a link for context if (context) objCaption.innerHTML = objCaption.innerHTML + '<br/><br/><a href="' + context + '">' + greasedLanguage[greasedLanguage.language][0].context + '</a>'; // center lightbox and make sure that the top and left values are not negative // and the image placed outside the viewport //objLightbox.style.visibility = 'hidden'; objLightbox.style.display = 'block'; greasedLightbox.aspectRatio = objImage.height / objImage.width; // if image is larger than the screen if (objImage.height > arrayPageSize[3] - 70) { var newHeight = arrayPageSize[3] - 70; var newWidth = (objImage.width / objImage.height) * newHeight; objImage.height = newHeight; objImage.width = newWidth; } if (objImage.width > arrayPageSize[2] - 70) { var newWidth = arrayPageSize[2] - 70; var newHeight = greasedLightbox.aspectRatio * newWidth; objImage.height = newHeight; objImage.width = newWidth; } greasedLightbox.center(objLightbox, arrayPageScroll, arrayPageSize); // if it went bigger than the page if (objLightbox.offsetHeight > objOverlay.offsetHeight) objOverlay.style.height = objLightbox.offsetHeight + 'px'; if (objLightbox.offsetWidth > objOverlay.offsetwidth) objOverlay.style.width = objLightbox.offsetWidth + 'px'; greasedLightbox.center(objLightbox, arrayPageScroll, arrayPageSize); objLoading.style.display = 'none'; objCaption.style.display = 'block'; objLightbox.style.visibility = 'visible'; // clean it up a bit for memory's sake objImage.removeEventListener('load', loaderDone, false); imgPreload.removeEventListener('load', preloaderDone, false); imgPreload.removeEventListener('error', greasedLightbox.noImage, false); imgPreload.src = ''; if (greasedLightbox.isSlideShow) greasedLightbox.timer = setTimeout(function(event) { greasedLightbox.moveSlide(event, 1) }, greasedLightbox.slideTime * 1000); return false; } // loaderDone() objImage.addEventListener('load', loaderDone, false); objImage.src = img; return false; } // preloaderDone() if (imgPreload.src != img) { imgPreload.addEventListener('load', preloaderDone, false); imgPreload.addEventListener('error', greasedLightbox.noImage, false); imgPreload.src = img; } else { preloaderDone(); } // hides flash movies that peek through the overlay var obtrusives, thisObtrusive; obtrusives = document.evaluate('//object|//embed|//iframe', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for(var i = 0; i < obtrusives.snapshotLength; i++) { thisObtrusive = obtrusives.snapshotItem(i); thisObtrusive.style.visibility = 'hidden'; } if (greasedLightbox.allImageLinks.length > 1) { // initialize slideshow // set currentImagePosition findCurrentPosition : for(var i = 0; i < greasedLightbox.allImageLinks.length; i++) { if (greasedLightbox.allImageLinks[i]['link'] == link) { greasedLightbox.currentImagePosition = i; break findCurrentPosition; } } // for() // pre-fetch next image if (!window.opera) { // for some reason this pre-fetching breaks lightbox in opera var imgPrefetch = document.getElementById('greasedLightboxPrefetch'); var nextImagePosition = (greasedLightbox.currentImagePosition + greasedLightbox.lastMove) % greasedLightbox.allImageLinks.length; if (nextImagePosition < 0) nextImagePosition = greasedLightbox.allImageLinks.length - 1; var nextImage = greasedLightbox.allImageLinks[nextImagePosition]; var nextImageSrc = greasedLightbox.getImageToShow(nextImage['link'], greasedLightbox.getAddress(nextImage['link']), nextImage['name']); imgPrefetch.src = nextImageSrc; } } // if() }, // show() // slideShow() // cycles through all of the lightboxable images slideShow: function(cmd) { var objMenuButtonShow = document.getElementById('greasedLightboxButtonSlide'); if (cmd != 'stop') { // start the show greasedLightbox.isSlideShow = true; greasedLightbox.moveSlide(null, 1); // switch function to stop button objMenuButtonShow.removeEventListener('click', greasedLightbox.slideShow, false); objMenuButtonShow.innerHTML = '\u2169'; objMenuButtonShow.addEventListener('click', function(event) { greasedLightbox.slideShow('stop') }, false); } else { // stop the show clearTimeout(greasedLightbox.timer); greasedLightbox.isSlideShow = false; objMenuButtonShow.removeEventListener('click', function(event) { greasedLightbox.slideShow('stop') }, false); objMenuButtonShow.innerHTML = '\u21BB'; objMenuButtonShow.addEventListener('click', greasedLightbox.slideShow, false); } }, // slideShow() // hide() // Stops the preloader in case it hasn't finished and then hides all of the lightbox components hide : function(event) { greasedLightbox.stopEvents(event); greasedLightbox.isShowing = false; window.removeEventListener('resize', greasedLightbox.centerItAll, true); // get objects var objPreloader = document.getElementById('greasedLightboxPreload'); var objLoading = document.getElementById('greasedLightboxLoading'); var objError = document.getElementById('greasedLightboxError'); var objOverlay = document.getElementById('greasedLightboxOverlay'); var objLightbox = document.getElementById('greasedLightbox'); var objMenu = document.getElementById('greasedLightboxMenu'); var imgPreload = document.getElementById('greasedLightboxPreload'); // stop preloader objPreloader.removeEventListener('load', preloaderDone, false); imgPreload.removeEventListener('error', greasedLightbox.noImage, false); //imgPreload.src = ''; // show flash movies again var obtrusives, thisObtrusive; obtrusives = document.evaluate('//object|//embed|//iframe', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for(var i = 0; i < obtrusives.snapshotLength; i++) { thisObtrusive = obtrusives.snapshotItem(i); thisObtrusive.style.visibility = 'visible'; } // hide everything objLoading.style.display = 'none'; objError.style.display = 'none'; objOverlay.style.display = 'none'; objLightbox.style.display = 'none'; objMenu.style.display = 'none'; }, // hide() // halt() // stops the slideshow and hides the lightbox halt : function() { greasedLightbox.slideShow('stop'); greasedLightbox.hide(); }, // stopEvents() stopEvents : function(event) { if (event) { if (event.stopPropagation) event.stopPropagation(); if (event.preventDefault) event.preventDefault(); } }, // resize() resize : function(event, resizeByAmount) { greasedLightbox.stopEvents(event); // stop slidshow greasedLightbox.slideShow('stop'); // resize the image var objImage = document.getElementById('greasedLightboxImage'); var imgPreload = document.getElementById('greasedLightboxPreload'); if (resizeByAmount == 0) { objImage.removeAttribute('width'); objImage.removeAttribute('height'); } else { var newWidth = objImage.width + (objImage.width * (resizeByAmount/100)); var newHeight = this.aspectRatio * newWidth; if (newWidth > 30 || newHeight > 30) { objImage.width = newWidth; objImage.height = newHeight; } } // re-center the lightbox var objLightbox = document.getElementById('greasedLightbox'); greasedLightbox.center(objLightbox); }, // resize() // noImage() // Displays a nice error message when no image can be found. noImage : function(event) { var objLoading = document.getElementById('greasedLightboxLoading'); var objError = document.getElementById('greasedLightboxError'); var objErrorContext = document.getElementById('greasedLightboxErrorContext'); objError.style.visibility = 'hidden'; objError.style.display = 'block'; objErrorContext.innerHTML = '<a href="' + greasedLightbox.currentAddress + '">' + greasedLanguage[greasedLanguage.language][0].context + '</a>'; greasedLightbox.center(objError); objLoading.style.display = 'none'; objError.style.visibility = 'visible'; if (greasedLightbox.isSlideShow) greasedLightbox.timer = setTimeout(function(event) { greasedLightbox.moveSlide(event, 1) }, 500); }, // noImage() // handleKey(event) // handles keypress. If 'x' is pressed then it hides the lightbox. If a left or right arrow is pressed it cycles through images on a page handleKey : function(event) { if (greasedLightbox.isShowing) { var keycode = event.which; var key = String.fromCharCode(keycode).toLowerCase(); switch(key) { case 'x': greasedLightbox.halt(event); break; case '+': // increase size greasedLightbox.resize(event, 13); break; case '-': // decrease size greasedLightbox.resize(event, -13); break; case '0': // set to default size greasedLightbox.resize(event, 0); break; /* @todo case 'v': // view image in original context break; */ default: switch(event.keyCode) { // esc key case 27: greasedLightbox.halt(event); break; // left arrow case 37: // firefox case 63234: // safari greasedLightbox.slideShow('stop'); greasedLightbox.moveSlide(event, -1); break; // right arrow case 39: // firefox case 63235: // safari greasedLightbox.slideShow('stop'); greasedLightbox.moveSlide(event, 1); break; } // switch(event.keyCode) break; } // switch(key) } // if }, // getKey() // moveSlide() // loads another image from allImageLinks[] moveSlide : function(event, moveByAmount) { if (greasedLightbox.allImageLinks.length > 1) { if (greasedLightbox.currentImagePosition + moveByAmount == -1) greasedLightbox.currentImagePosition = greasedLightbox.allImageLinks.length; var newSlidePosition = (greasedLightbox.currentImagePosition + moveByAmount) % greasedLightbox.allImageLinks.length; var slideToLoad = greasedLightbox.allImageLinks[newSlidePosition]; greasedLightbox.hide(event); slideToLoad['showFunction'](slideToLoad['link']); greasedLightbox.lastMove = moveByAmount; } // if }, // moveSlide() // lightBulbOnIcon // used when an update is available lightBulbOnIcon :"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAAABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKgSURBVDjLlZLrS1NxGMd90ZvovdEfEBEUEhZIb0xMjdyLIuyGkiHGUFKydFKKJiRegjIyFJRwojMxzfJSaVOYeTfxtpSNuZ1tXnY2z27nsss5334uWloG9uLD7%2FA7z%2FfzPPx4IgBE7ISl3qWyelUvu9JIueZqeOdUmcCMFDgcQ3fntjSK0j%2Frwx%2BcsesIZ3jbL1j6EbCPIej5DpE3QRIoBJ3LEFb74BjIxkbXVYNdrTixS8Ca3h%2Fy6pSTfloD0UcRjCS8BJGbRdA7QRgjd1pIfhruyeewKOMdm%2BrCw2GBV1tXKZh7SIEVoqAjpwVS0AlIvhBSkCGyeQRcPYDogO1DNixvrveFBa6ZCkuAmSe1OtJpFVLATkJboWCIAE3%2BGYngI6ENgnUK%2BhcxfFiw9fWRT%2BRWEWTHEeRmyPhaMvYCgu5ZEpgkbzCCgPszBNsr8NY8iF4Ky5WnpLDArs41%2BzYnSPdF8OYi0qEcTHc6mF45mJ4M2Ftl4C1lYPU34KerwFNTWKmO%2Fj2BfbiwghmvJuPawZsUsNVHgTPlEx6ANcjJeR9r5QfhWUqEJOlhbc%2BFoV42FBY4R0sPbPbKlz2LLeQB9aCbYkJhzpIFlkoDZ8zDRk0kRHYYrm8d0JYeEyyduUd37QH9pTBqvSOV9iy0wtmZ%2BVNAOm%2BHOeM92JtlYDQN0JYcD1BtmTf%2FWqRtbJ%2FyTxtUt9fXGhPBq5MhriVBtMYhoLkMQ1Ek5sqi3eb2O4l7buIvhlRPkmsfZ%2Fibax%2BiruosnpacQUFOOq7Fn5TUypJz%2F1zlnRQr5JSypRVKZRvq6htR%2FewlriTH03vV7ilQ5NwaHRgchM1GY3p6Bq%2BbmpEii9XtWzCgqkhLuXSBTUg4L8XFxUoXk2K57obirH0L%2FocfNQ8V8wE%2BuE0AAAAASUVORK5CYII%3D')", // showUpdate() // shows the user that an update is available showUpdate : function(latestVersion) { var titleLink = document.getElementById('greasedLightboxTitleLink'); titleLink.setAttribute('title', greasedLanguage[greasedLanguage.language][0].update + ' (v' + latestVersion + ')'); titleLink.innerHTML = titleLink.innerHTML + ' - ' + greasedLanguage[greasedLanguage.language][0].update + ' (v' + latestVersion + ')'; var cssStr = '#greasedLightboxTitleLink { background-image: ' + greasedLightbox.lightBulbOnIcon + ' !important; }'; var styleSheet = document.getElementById('greasedLightboxCSS'); var cssText = document.createTextNode(cssStr); styleSheet.appendChild(cssText); }, // init() // Function runs on window load, going through link tags looking for links to images. // These links receive onclick events that enable the lightbox display for their targets. // The function also inserts html markup at the top of the page which will be used as a // container for the overlay pattern and the inline image. init : function() { // initialize localization greasedLanguage.init(); // set up list of searchDefs to use based on how includeRegExp matches window.location.href var currentURL, searchDefsToUse; currentURL = window.location.href; searchDefsToUse = new Array(); for(var i = 0; i < greasedLightbox.searchDefs.length; i++) { if(greasedLightbox.searchDefs[i]['includeRegExp'].test(currentURL)) searchDefsToUse.push(greasedLightbox.searchDefs[i]); } if(!searchDefsToUse.length) return; // set variables var links, thisLink, href, lightboxedLinksTotal = 0; links = document.evaluate('//a[@href]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); for(var i = 0; i < links.snapshotLength; i++) { thisLink = links.snapshotItem(i); href = unescape(thisLink.getAttribute('href')); // check regularExpressions from searchDefsToUse checkLink : for (var ii = 0; ii < searchDefsToUse.length; ii++) { // for links that reveal larger image's location if (!searchDefsToUse[ii]['findImageRegExp']) { if(searchDefsToUse[ii]['linkRegExp'].test(href)) { if (!searchDefsToUse[ii]['excludeLinkRegExp'] || !searchDefsToUse[ii]['excludeLinkRegExp'].test(href)) { if (!(thisLink.getAttribute('rel') && thisLink.getAttribute('rel').toLowerCase().match('lightbox'))) // prevents doubling lightboxes thisLink.addEventListener('click', searchDefsToUse[ii]['showFunction'], true); this.allImageLinks[lightboxedLinksTotal] = new Array(3); this.allImageLinks[lightboxedLinksTotal]['name'] = searchDefsToUse[ii]['name']; this.allImageLinks[lightboxedLinksTotal]['showFunction'] = searchDefsToUse[ii]['showFunction']; this.allImageLinks[lightboxedLinksTotal]['link'] = thisLink; lightboxedLinksTotal++; break checkLink; } } // for links that contain images that reveal larger image's location } else if (searchDefsToUse[ii]['findImageRegExp']) { if(this.containsThumb(thisLink, searchDefsToUse[ii], false)) { if(searchDefsToUse[ii]['linkRegExp'].test(href)) { if (!searchDefsToUse[ii]['excludeLinkRegExp'] || !searchDefsToUse[ii]['excludeLinkRegExp'].test(href)) { if (!(thisLink.getAttribute('rel') && thisLink.getAttribute('rel').toLowerCase().match('lightbox'))) // prevents doubling lightboxes thisLink.addEventListener('click', searchDefsToUse[ii]['showFunction'], true); /*for (ii = 0; ii < lightboxedLinksTotal; ii++) { if(greasedLightbox.allImageLinks[ii]['link'] == links[i]) break checkLink; }*/ this.allImageLinks[lightboxedLinksTotal] = new Array(3); this.allImageLinks[lightboxedLinksTotal]['name'] = searchDefsToUse[ii]['name']; this.allImageLinks[lightboxedLinksTotal]['showFunction'] = searchDefsToUse[ii]['showFunction']; this.allImageLinks[lightboxedLinksTotal]['link'] = thisLink; lightboxedLinksTotal++; break checkLink; } } } } } // checkLink : for() } // for() if (lightboxedLinksTotal == 0) return; window.addEventListener('unload', this.unload, false); var objBody = document.getElementsByTagName("body").item(0); var pngOverlay = "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAPSURBVHjaYmJgYDgDEGAAANsAz1TKIeAAAAAASUVORK5CYII%3D')"; var lightbulbOffIcon = "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAAABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJOSURBVDjLlZLdTxJQGMa96K4%2FoPUHdFfrpntyZrXsoq25tlbroi6qi7ZuYsuZ0UXRWiv72NS0gjIgDQ1LS0wkwU%2FUVEREUkEIBBFE%2BV48ve%2FZICza7OLZOTt739%2FznHPeEgAlhZpyB8%2BMLa58HHL63H2zy4muycVku8UZahl2TNJ688%2F6wsbd31yBLps3BNdqFCvrMYRjSURIvOdzzdAcmozWhTaLc%2B8WADXvHHb6RhYCEdEU2kiIJu%2FaBtwEywE3k2lQKjz8NB7Sjs7vygPMDu9ddogmUliNxsWaSGfwM5sViqcy%2BBHeFCl4r6YkzwzTnXlA9%2FSSh924md25qFDszMnmfGuga4pEd3QjiTxAN%2F49xY0c10MgjsuOuSssBdfh8IdBSUG1AibTDmbzAHrhZab6IzHQq6N3xo3%2BLyqY%2B1phMmig%2F9AISolm8yyMdo9IcKtt6HcC%2Bh653uoScTsJ0K65jw5yYrWOOISrol6Kht4pcUV%2Bg0efJwx5ADXtUA3a7aMLflHQoa0VzfTSoHMBUClqwL9EM4Lrb01JOt%2BzZQ7ob%2Fc%2FN1qDDGEHBugKxO6mOS%2BqWswZRb%2Ft9F%2BDxCLHAzQovsfdEyAYXn6d4cHBa7r7NXU%2FbrwbiCpNtsNFJzEnaqp4KjufblDU4XbtJVTJL%2BBqjQynyvZl6e8P%2FnOUC1UtvehWNr%2BBUqlGXX0T7j14gpMVZcFitUUB0ivnBvQ9PQgEgrBYxvBC8QqVxyXz2wboVfKzlSeOxsrLD2VLSyXZY0ck8feN1Ze3Dfgf%2FQJBCig%2B4GhFlwAAAABJRU5ErkJggg%3D%3D')"; // CSS var head, styleSheet, cssStr, cssText; head = document.getElementsByTagName('head')[0]; styleSheet = document.createElement('style'); styleSheet.setAttribute('id','greasedLightboxCSS'); styleSheet.setAttribute('type','text/css'); head.appendChild(styleSheet); cssStr = ''+ '#greasedLightboxOverlay { position: absolute; top: 0; left: 0; z-index: 10000000; width: 100%; background-image: ' + pngOverlay + '; background-repeat: repeat; cursor: pointer; }'+ '#greasedLightboxMenu { position: fixed; top: 0; left: 0; width: 100%; z-index: 10000100; background: #000; font-family: "Terbuchet MS", Tahoma, Arial, Verdana, sans-serif; font-size: 14px; font-weight: bold; height: 35px; line-height: 35px; opacity: .5; }'+ '#greasedLightboxMenu:hover { opacity: 1; }'+ 'a#greasedLightboxTitleLink { position: absolute; top: 0; left: 0; display: block; height: 35px; line-height: 35px; margin: 0 5px; padding: 0 5px 0 27px; background-image: ' + lightbulbOffIcon + '; background-repeat: no-repeat; background-position: 5px 55%; color: #aaa; background-color: #000; text-decoration: none; cursor: pointer; z-index: 10000450; }'+ 'a#greasedLightboxTitleLink:hover { color: #fff; background-color: #333; }'+ '#greasedLightboxButtons { position: absolute; top: 0; left: 0; height: 35px; width: 100%; line-height: 35px; margin: 0; padding: 0; z-index: 10000400; }'+ '#greasedLightboxButtons a { display: block; width: 33px; height: 33px; border: 1px solid #000; background: #000; cursor: pointer; float: right; text-align: center; color: #aaa; z-index: 10000450; }'+ '#greasedLightboxButtons a:hover { border-color: orange; background-color: #333; color: #fff; }'+ '#greasedLightboxLoading { position: absolute; z-index: 10000050; color: #fff; font-weight: bold; font-family: "Trebuchet MS", Tahoma, Arial, Verdana, sans-serif; text-align: center; line-height: 2em; }'+ 'p#greasedLightboxLoadingText { margin: 0; padding: 25px 0 5px 0; font-size: 45px; color: #fff; font-weight: bold; font-family: "Trebuchet MS", Tahoma, Arial, Verdana, sans-serif; line-height: 1em; text-align: center; }'+ 'p#greasedLightboxLoadingHelp { margin: 0; padding: 5px 0; font-weight: normal; font-size: 11px; color: #fff; font-family: "Trebuchet MS", Tahoma, Arial, Verdana, sans-serif; line-height: 1em; text-align: center; }'+ '#greasedLightboxError { position: absolute; z-index: 10000050; text-align: center; background: #000; color: #aaa; padding: 10px; border: 1px solid #444; -moz-border-radius: 10px; font-family: verdana, sans-serif; font-size: 11px; }'+ 'p#greasedLightboxErrorMessage { color: #fff; font-size: 45px; font-weight: bold; margin: 10px 20px; font-family: "Trebuchet MS", Tahoma, Arial, Verdana, sans-serif; text-decoration: none; border: none; text-align: center; }'+ '#greasedLightboxError a, #greasedLightbox a { color: #aaa; text-decoration: none; border-bottom: 1px solid #777; }'+ 'p#greasedLightboxErrorContext { margin: 0; padding: 5px 0; font-weight: normal; font-size: 11px; color: #fff; font-family: "Trebuchet MS", Tahoma, Arial, Verdana, sans-serif; line-height: 1em; text-align: center; }'+ '#greasedLightbox { position: absolute; z-index: 10000050; text-align: center; background: #000; color: #aaa; padding: 10px; border: 1px solid #444; -moz-border-radius: 10px; font-family: verdana, sans-serif; font-size: 12px; }'+ 'img#greasedLightboxImage { border: none; cursor: pointer; }'+ 'img#greasedLightboxImage, img#greasedLightboxPreload, img#greasedLightboxPrefetch { max-height: none; max-width: none; }'+ '#greasedLightbox, #greasedLightboxMenu, #greasedLightboxOverlay, #greasedLightboxError, #greasedLightboxLoading, img#greasedLightboxPreload, img#greasedLightboxPrefetch { display: none; }'+ '#greasedLightboxCaption { color: #aaa; padding: 10px 0; }'; cssText = document.createTextNode(cssStr); styleSheet.appendChild(cssText); // overlay div var objOverlay = document.createElement("div"); objOverlay.addEventListener('click', greasedLightbox.halt, false); objOverlay.setAttribute('id','greasedLightboxOverlay'); objBody.appendChild(objOverlay); // menu div var objMenu = document.createElement("div"); objMenu.setAttribute('id', 'greasedLightboxMenu'); objBody.appendChild(objMenu); // title link var objMenuLink = document.createElement("a"); objMenuLink.setAttribute('id', 'greasedLightboxTitleLink'); objMenuLink.setAttribute('href', 'http://userscripts.org/users/426977/scripts'); objMenuLink.innerHTML = 'Keyser Söze Scripts'; objMenu.appendChild(objMenuLink); // menu buttons div var objMenuButtons = document.createElement("div"); objMenuButtons.setAttribute('id', 'greasedLightboxButtons'); objMenu.appendChild(objMenuButtons); // right button var objMenuButtonRight = document.createElement("a"); objMenuButtonRight.setAttribute('id', 'greasedLightboxButtonRight'); objMenuButtonRight.setAttribute('title', greasedLanguage[greasedLanguage.language][0].next); objMenuButtonRight.innerHTML = '\u2192'; objMenuButtonRight.addEventListener('click', function(event) { greasedLightbox.slideShow('stop'); greasedLightbox.moveSlide(event, 1); }, false); objMenuButtons.appendChild(objMenuButtonRight); // left button var objMenuButtonLeft = document.createElement("a"); objMenuButtonLeft.setAttribute('id', 'greasedLightboxButtonLeft'); objMenuButtonLeft.setAttribute('title', greasedLanguage[greasedLanguage.language][0].previous); objMenuButtonLeft.innerHTML = '\u2190'; objMenuButtonLeft.addEventListener('click', function(event) { greasedLightbox.slideShow('stop'); greasedLightbox.moveSlide(event, -1); }, false); objMenuButtons.appendChild(objMenuButtonLeft); // magnify button var objMenuButtonPlus = document.createElement("a"); objMenuButtonPlus.setAttribute('id', 'greasedLightboxButtonPlus'); objMenuButtonPlus.setAttribute('title', greasedLanguage[greasedLanguage.language][0].magnify); objMenuButtonPlus.innerHTML = '+'; objMenuButtonPlus.addEventListener('click', function(event) { greasedLightbox.slideShow('stop'); greasedLightbox.resize(event, 13); }, false); objMenuButtons.appendChild(objMenuButtonPlus); // shrink button var objMenuButtonMinus = document.createElement("a"); objMenuButtonMinus.setAttribute('id', 'greasedLightboxButtonMinus'); objMenuButtonMinus.setAttribute('title', greasedLanguage[greasedLanguage.language][0].shrink); objMenuButtonMinus.innerHTML = '-'; objMenuButtonMinus.addEventListener('click', function(event) { greasedLightbox.slideShow('stop'); greasedLightbox.resize(event, -13); }, false); objMenuButtons.appendChild(objMenuButtonMinus); // slideshow button var objMenuButtonShow = document.createElement('a'); objMenuButtonShow.setAttribute('id', 'greasedLightboxButtonSlide'); objMenuButtonShow.setAttribute('title', greasedLanguage[greasedLanguage.language][0].slideshow); objMenuButtonShow.innerHTML = '\u21BB'; objMenuButtonShow.addEventListener('click', greasedLightbox.slideShow, false); objMenuButtons.appendChild(objMenuButtonShow); // loader div var objLoading = document.createElement("div"); objLoading.setAttribute('id','greasedLightboxLoading'); objLoading.addEventListener('click', greasedLightbox.halt, false); objBody.appendChild(objLoading); var loadingGif = document.createElement('img'); loadingGif.src = "data:image/gif,GIF89a%80%00%80%00%A2%00%00%FF%FF%FF%DD%DD%DD%BB%BB%BB%99%99%99%00%00%FF%00%00%00%00%00%00%00%00%00!%FF%0BNETSCAPE2."+ "0%03%01%00%00%00!%F9%04%05%05%00%04%00%2C%02%00%02%00%7C%00%7C%00%00%03%FFH%BA%DC%FE0%CA%06*%988%EB%CD%BB_%96%F5%8Ddibax%AEl%AB%A5%A2%2B%CF.%5C%D1x%"+ "3E%DA%97%EE%FF%12%1EpHT%08%8B%C8G%60%190%1DI%83%E8%20%F9a2K%CF%8FTJ%E5X%AD%A4lg%BB%EDj%BE%D7%9D%0DJ%8E%9A3%E8%B4G%BCis%DF%93%B8%9CC%CF%D8%EFx%12zMsk"+ "%1E%7FS%81%18%83%850%87%7F%8Apz%8D)%8Fv%91%92q%1D%7D%12%88%98%99%9A%1B%9C%10%88%89%9Fy%93%A2%86%1A%9E%A7%8B%8C%2F%AB%18%A5%AE%A0_%AA%8E%AC%90%B5%B6%"+ "60%19%A3%0D%AD%BC%AF%A1(%B2%9D%BB%C3%C4h%BF%C7%A4%C9%CA%A8%A9A%CE%0E%B4%D1%BD%7B%10%C0%0A%C2%D8%D2%C5%DB%D5%0C%D7%DF%CB%B7%13%B9%C8%97x%02%EE%02%2B%"+ "B0%D47%13%DEln%1E%EF%EF'%F2%2B%F6Zd%3A%E8%1Bhb%9A%3Fv%F7%DAp%18%C8%90%84%C1%13%D0%C6%94%CB%C0%B0%E2%08f2%14%02%2Ce%8A%FFb%C5%86U%B4%B5(%B3%91%A3%C0%"+ "8F%20%CD%CD%E2%08h!%CA%94*%AD%B1l%99%EF%25%C1%98%0Bf%D2%1Ca%F3fL%9D%F8X%F4%D4g%0EhG%17C%F7%0D3%EA%23%A9%3B%5EL%818u%054%C9P%AA%2C%DF%D8%C4%FA%8F%CAK"+ "%AE%08%15Y%AC%15%F6%13%D1%A5%3Bq%AA%5D%CB%B6%AD%DB%B7p%E3%CA%9DK%B7%AE%DD%BBx%F3B4%DA%F5%1B_a%7F'%16%0D%0C%89%B0%E0h%86%13%F3%FD%A9%B8qV%95%8E%23%F7"+ "%85*%D9Me%B5%97%BB9f%1BY%AF%E7%CF%A0C%8B%1EM%BA%B4%E9%D3%A8S%AB%C6A%92r%D0Se1%C5~s8P%ED%24%26a%DF%1E2%13%EC%E4%1CUu%F7%06%12%D5wn%E0%C1%5D%0F%9FQ%1C"+ "q%F2%83%3A1%3FO%F8Xzt%EA%C7%DB6%AFs%5D%EE%F4%95%D5%25%BEv%D1Z%7Cv%F0%BB%EB%05%CC%B8%DERz%99%BF%D5kd%11%91%C3y%F9%F3G%D4%2F%B1%DF~%FF%08%BC%F9%E9%F7_"+ "I%EDaW%12t%01%3EP%DE3%B3%B9g%DB%80%9A-%A8%20%84%8CAha%7C%90Q%A8!%85~a%B8!%87%CE5%18%8C%88%E4%80%88%16%89%25%26%C8%A0%8A%19%A2%98%93%8B%11%B2%D8!%8C1"+ "J%08%A0%89%9F%BC%97b%81%F8%C9x%A2%8F%F0%F1%D8%A3%8D%CA%E8%B8%23%91%2B%02)%9C%92%232y%24%92%C6%A55%E4x~%E0H%9B%95%04%60%89%A1%22%5B%06%09%E5%8D4%9Aa%"+ "A4%97RNY%26%97X%D6x%E6%3ANv%91%A6%9ATr%D7%26%15of%19%26%99q%E6(%A4%7Fs%929%E3Q%EE%7D%89%1Eiu%AAVhj%87%A2%96%E8i%8B%9A%D6%A8%A3%7B%AE%C6'%A0%AE%24%00"+ "%00!%F9%04%05%05%00%04%00%2C%0A%00%02%00W%000%00%00%03%FFH%BA%DC%FE0%BE%40%83%BC8%EB%3D%2B%E5%60(J%9E7%9E(WVi%EBv%EB%2B%BF%EB7%DFgm%E1%3C%A8%F7%23%8"+ "1P%90%FA%A1%00H%40k8D%19G%C9%24%8A%C9%CC%D5N%D1%E8%89%DA%1C%3DCYi%90%2B%F4%5EEa%B1%88%DC%F5%9DAi%F5%9A-%FAn%E2%CA%14%9B%E8%8E%C1%E3.%7B!v%19x%2F%82*"+ "o%1A%86%87%88%1A%84%12xy%8Dd%89~%8B%803%7B%7C%19%90%10%928%8E%18%9E%0F%8C%A1t%9D%8A%91%99%3C%A2%24%AA%11%A6%AD%A8%17%A4%0C%B2%B3%B4%11%B6%0A%A0%40%0"+ "A%AE0%25%18%B8%3D%9B%B5%B0%0D%BE%BF%C0%BA%10%97%B1%AC%10%03%D4%03%81%CE%C2%C4%D2%0F%D5%D5K%D8G%DB%0D%DD%E4z%952%E2%E3%E4%E5c%5C3%E9%0C%EB%F2%EDm%E8Y"+ "%18%F2%F3se%3CZ%19%F9%FA%98%09%04%18P%E0%2F%82%EB%0C2C%C8N!%10%86%DD%1C%1E%84HMb%0F%8A%15-%F2%C0%A8%F1%13%22%C3%8E%0F%09%82%0C%99o%E4%C4%86%26IZK%A9"+ "!%01%00!%F9%04%05%05%00%04%00%2C%1F%00%02%00W%000%00%00%03%FFH%BA%DC%FEKH%01%AB%BD8%EB6%E7%FE%60%A8u%9Dh%9E%22%E9%A1l%5B%A9%92%2B%CF%04L%D1%F8i%E7%7"+ "C%B8%F7%A2%81p%C0%FA%9D%02%C8%40k8D%19E%C9%24%8A%C9%D4%C1%8EQ%A9%89%DA4%3DAYm%90%2B%F4%5E%A1a%E4%89%DC%05%7D5i%F1%98%9C%3A%83%E3K%B6%CF%BE%89%2B%F3t"+ "n%7Cpx.lD%1Fo%17~3%87%88%23%83%8B%8C%8Dz%1B%8A%15%93%94%95%19%97%0F~%7F4%87%96%91%98%859%A2%9C%A4%9E%A6%A7%9B%17%9D%0D%99%3C%A8%AF%AA%B1%AC%B3%B4%2F"+ "%B6%0B%9F%40%0B%BA%10%B0%0A%B2%40%8E%B5*%92%B8%C6%AE%C2%24%18%C5%BF%04%C1%0F%25%CAa.%00%DA%00%18%D4(%D1!%DB%DB%DD%812%CB%20%E2%E9%17%CD%2C%E7%1A%E9%"+ "F0%E4U8%D8%22%F0%F7%19%F39Q%26%F7%F8%D2%D2%FC%FD%03%D8C%E0%40%828%0C%C6C%C8C%A1%3A%86%09%1D%8E%83HC%E2D%8A3%2Cj%C3X%D1%14%22%C7%88%0A%3F%E6%08)r%A4%"+ "C0%92%05%17%A2L%B9%D1D%02%00!%F9%04%05%05%00%04%00%2C%3C%00%02%00B%00B%00%00%03%FEH4%3C%FA0%CAI%AB%9D%AD%DD%CD%7B%CD%99'%8E%16%A8%91hj2i%3B%AE%8E%2B"+ "o%F0l%7F%EB%ADG%B5%2B%FC%82%DD%A3%97%02%02%85%8B%5C%D1x%DC%11I%CC%A6%EE)%8AJo%D4%8E%F5j%CBr%B6A%A1%F7%02F%26M%D0%ADy%5C)%AF%95Z7%92%3D%91%CF%E1%1Bp%"+ "F8%8D%8E%5B%CDCx%16v%7C%20~Q%80%81%7Ddj%89%0At%0Az%8E%8F%82u%8D%93%90%92%93%94!%8C%7F%9B%8A1%83%97.%01%A6%01%3B%84(%A7%A7%3A%A4%AB%AC%AC7%AF%22%B1%B"+ "6%AEL)%B6%BB%A9%5C%1E%BB%BC%A0%1B%C0%C1%C2%15%C4%C5%C6%12%C8%B7%CA%14%CC%B1%CE%13%D0%B2%D2%11%D4%AD%D6%D7%D8%A8%DA%10%DC%DE%CB%D0%E1%D3%C8%E4%CF%C4%"+ "E7%C7%CD%EA%EB%A6%ED%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FA%00%FD%FE%FF%00%03%024%26%B0%A0%C1%7F%A0%0E*4%B8i%A1%C3%81%93%1EJ%04%D0p%A2%C3%84%16%0F%12%C"+ "C(%03PA%02%00!%F9%04%05%05%00%04%00%2CN%00%0A%000%00W%00%00%03%ECH%BA%BC%F3%A3%C9I%2B%85%D0%EA%7Dq%E6%E0%E6%7Da)%8D%A4%A9%A2%A9Z%B2%91%BB%B2%B2%0B%D"+ "7%E6%8D%87p%BCs%BA%9F((%B4%10%8B%1D%14r%A8%5CV%8ENF%2F%9A%1CQ'%D3k%03z%E5%AA%04%60%81%91%B6%0B%87%9F%CD%9Ay%5D%C5%A8%D7%EC%B6%CF%04%AF%8F%1F%B2%BA%9"+ "D%AA%DF%3B%FB~H%80p%7C%83fQ%86%87%7F%89%60%85%8C%8E%86Z%89Z%0A%83%94%0B%80%97%0C%81%9A%95g%9D%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA*%01%AD%AE%AF%B0%B1%B0"+ "5%B2%B5%B6%AF.%B7%BA%B6%AC%BB%BE%B8%26%BF%C2%01%BD%C3%BB%B9%C6%B7%B4%C9%B2%AB%CE%CF%D0%D1%D2%D3%D4%D52%00%D8%00%A5%D9%DC%A2%DC%DF%DA%9D%E0%DF%E2%E3%"+ "E4%94%E6%E3%E8%E9%E0Z%EC%ED%EE%EF%DD%F1%F2%D8%F4%F5%EB%F5%E1W%FA%FB%FC%F8%F9%D8%95K%17%8A%A0%B7s%A3%E6QH%00%00!%F9%04%05%05%00%04%00%2CN%00%1F%000%0"+ "0W%00%00%03%E9H%BA%DC%FEn%C8%01%AB%BDmN%CC%3B%D1%A0'F%608%8Eez%8A%A9%BAb%AD%FBV%B1%3C%93%B5v%D3%B9%BE%E3%3D%CA%2F%13%94%0C%81%BD%231%A8D%B6%9A%8F%1C"+ "%14R%9B%F2L%D6%AB0%CB%EDz%BF%E0%B0xL.%9B%CF%5C%81z%CDn%BB%DB%B3%B7%7C%CE%5E%D1%EF%F3%13~%0F%1F%F1%FF%02z%80%7Bv%83tq%86oh%8B%8C%8D%8E%8F%90%91%92%93"+ "%0A%01%96%01f%97%9Ac%9A%9D%98%60%9E%9D%A0%A1%A2%5D%A4%A1%A6%A7%9E%5C%AA%AB%AC%AD%9B%AF%B0%96%B2%B3%A9%B3%9FY%B8%B9%10%00%BE%00%2F%B8%15%BF%BF%C1%B0%"+ "BD%C4%C5%C6%A7%C8%C9%C07%CC%0F%CE%CA%D0%A5%D2%D3%CF%3B%B1%C3%D8b%D8%BE%DE%DDa%DF%D9_%DFc%E7%E3%E2%EA%D3%E1%EB%E6%EF%5E%E4%EE%CE%E8%F1%5D%E9%EC%F5%FA"+ "%FB%60%F9%FE%ED%E8%11%23%D3%CF%1E%B8)%09%00%00!%F9%04%05%05%00%04%00%2C%3C%00%3C%00B%00B%00%00%03%F9H%BA%DC%FEP%8DI%AB%BD6%EA%1D%B1%FF%15'r%60%F9%8D"+ "%E8c%AEY%EAJl%FC%BE%B1%3C%BB%B5y%CF%F9%B9%FF%C0%A0pH%2C%1A%8F%C8%A4r%C9l%3A%9F%D0%A8tJ%10X%05%D4%D7u%9B%1Dm%BF%D8%AE%06%FC%15G%C8%60%B3%03MV3%D8mw%1"+ "5%5E%96%CF%E9W%FB%1D%1Fv%F3%F3v%7FVz%82F%01%87%017%7FD%88%88%8AxC%8D%8D%3Bt%91%92%87%40l%96%97%89%99u%11%00%A1%00%1C%9C%98A%5C%1A%A2%A2%A4%A5O%AA%AA"+ "%1B%A5%A6L%AF%AB%B1%ADM%B5%A1%AC%B8K%BA%A3%BC%97%B9%BA%23%B2%B4%C4%22%C6%BE%C8%C9%BDH%BF(%B2%9D%CF%CC%CD%9CJ%D0%D1%CAG%D9%DA%D7%D4%B5%2F%DBE%DD%DE%C"+ "2%DC%D5%E6%92%E8%E1%E2%E3B%E5)%EFA%F1%F2%DFD%F5%EA%8E%E4%E9.%E7%FC%EDvLb%F7J%8F%83%7Cv%10%CAQ%E8%86%A1%1A%87%0F%0B%1A%7C%00kb%83%04%00!%F9%04%05%05%"+ "00%04%00%2C%1F%00N%00W%000%00%00%03%FFH%BA%DC%FE0%CA7%EA%988%EB%CD%89%FD%5D(%8E%CDg%5Ed%AAJ%A7%B9%BE%B0%D7%BAq%1D%CE%AD%ADkx%BE%FF%90%DE%09Ht%08i%C5"+ "%E4%11%94%2C.-M%E5%13%15%05N5%80%2C%E0'%E8%0AFO%8CV%AB%F3z%C1%C7%C9x%5C3%9BIB%F5%3A%DBvwU8%C9%9C%1C%B3%9F%F1H%10%7Bt%13%01%86%01%18~w%2BL%11%83%5B%8"+ "5%87%86%89%8AQ%8F%90%11%92%92%13%8A%8BE%8F%18%9A%87%94~I%97%A1%A2%88%9C%9D%9F%83%19%A9%AA%AB%A5%40%A0%AF%A9%1A%AC%3F%B5%A8%A2%B8%95%3B%BB%BC%9A%1B%B"+ "95%A7%1A%B0%C4%C50%C1%C2%9B%CA%B3%CC%CD%91%BD%D0%D1%2B%D3%D4%C3%1C%CB)%D9%DA%CF%DC%BF*%DF%12%C9%1D%DD%22%E5%E6%B7!%E9%1C%C7%1D%E7%E8%EFX%AE%22%F3%F4"+ "%D7%1D%F7%F8%ED%22%E3B%F4%0B%91O%9F%1BokR%144%E8%89%04%1B%85%FFF%BC%A9%E2l%14%C5(%0B%2F%FE%C8%A8Q%13%07%C7%8E5%3E%82%84!r%E4%8Bj%26%89%84K%A9%20%01%"+ "00!%F9%04%05%05%00%04%00%2C%0A%00N%00W%000%00%00%03%FFH%BA%DC%0E%10%B8I%AB%BD8%B7%C8%B5%FF%E0%C7%8DRh%9E!9%A2lK%A9%A4%2B%B7%B0%3A%DF%60m%E3%3C%A6%C7"+ "%BD%E0%E4%B7%12%1A%17%C4%CEq%99%8C%2C%8FM%C8%13%DA%9CR%89%A7%806%20%1Cx%07%99dv%AB%ED%7D%BF%3E%1D%8AL%C6%9D%CF%97Z%8B%BDu%BF%BDi%25%8B%5E%BF%DD%D1qN"+ ".%7Ce%17%02%87%02%18%7FxV%04%84%5C%86%88%87%8A%8BV%8F%90%15%92%92%17%8B%8CK%8F%18%9A%88%94%7FO%97%A1%A2%89%9C%9D%9F%84%19%A9%AA%AB%A5F%A0%AF%A9%1A%A"+ "CB%B5%A8%A2%B8%95A%BB%BC%9A%1E%B98%A7%1A%B0%C4%C53%C1%C2%9B%CA%B3%CC%CD%91%BD%D0%D1%83%AE%1F%C9%1F%CB%7B%D9%DA%B7%20%DDc%7C!%DB%DC%BF%DE%E5%E6%E1%E2"+ "%E9%26%C7%20%E7%E8%EF%20%D3%C8%ED%EE%D7%F6%EB%26%F3%FAo%D6%F4cW%CDD%3D~mP%FC%03%E8I%60!%85%F9%0C%02jDm%18E%2B%0B%2F%0A%C9%A8%B1%12%07%C7%8E8%3E%82%9"+ "C!r%A4%8C%82%26%8D%3C%E3%91%00%00!%F9%04%05%05%00%04%00%2C%02%00%3C%00B%00B%00%00%03%F5H%04%DC%FE%F0%A9I%AB%BD%98%C6%CD%5D%FE%E0%D5%8D%5Ch%82d*%9D%A"+ "C%A5%BE%40%2BO%B0%3A%DF%F5x%EF%F9%B6%FF%C0%A0pH%2C%1A%8F%C8%A4r%C9l%3A%9F%D0%A8tJ%3D%05%AE%81%AA%0C%CB%D5%9A%B8%E0%AC7%13%06%8F%2F%E5%F0%99%92.%AF%0"+ "9m%F7%3A%AE%3E%D3%CD%F6%3B%F6%AD%DF%E7%FB%7C%80%81w%3B%02%86%02Fz%85%87%86Et%3F%8C%8CDmA%91%87%8Ex%40%96%97%98WC%9B%8D%20%03%A3%03R%A0%88%A2%A4%A3P%"+ "A7%A8%19%AA%AAO%A7!%B0%A4N%AD%B4%B5%A5M%B3%B9%B5%BC%A0'%BA%BBK%BD%BE%B0L%C6%C7%B1J%B8%C2%BA%C5%C1%2C%C3%CD%CA%CB%B6I%D6%D7%ABH%DA%DB%C4F%DE%A9%BFG%E"+ "2%E3%C8%E1%E6%1F%D4%E9%9B%3B%ECE%D27%F0D%F23%F4%F5%91%40%F8%F9%A1%3F%FCo%26%00%0CH%60%60%40%83o%10%AEQx%86aCt%0410K%00%00!%F9%04%05%05%00%04%00%2C%0"+ "2%00%1F%000%00W%00%00%03%E7H%BA%0C%0E%2C%CAIk%7B%CE%EAM%B1%E7%E0%E6%8Da)%8D%A8%A9%A2%A9Z%B2%AD%CB%C1%B1%AC%D1%A4%7D%E3%98.%F2%0F%DF%0E%08%11v%88E%E3"+ "%04%A9%AC%00%9B%16%1C4%0A%9B%0E%7B%D6_%26%CB%EDz%BF%E0%B0xL.%9B%CF%A1%80z%CDn%BB%DB%B6%B7%7C%CEv%D1%EFs%15~%0F7%F1%FF%01z%80%7Bv%83tq%86oh%8B%8C%8D%"+ "8E%8F%90%91%92%93h%02%96%02f%97%9Ac%9A%9D%98%60%9E%9D_%A1%9E%5D%A4%A1Y%A7%A8V%AA%A5S%AD%A2%AF%B0%97%A9%B3%96%AC%B6%9F%B2%B3%5C%B62%03%C0%03%16%BC.%C"+ "1%C1%15%AD6%C6%C6%14%A7%3E%CB%C7%CD%B1%3A%D0%D1%D2%B7B%D5%C0b%DA%C2a%DD%DE%60%DD%DC%E3%DF%DA%E4%D5c%E5%E2%E7%E6%ED%EC%E9%EE%F1%F0%D0%E8%F5%F6%CB%F8%"+ "CC%F2%F7%F4%F9%FA%DB%D4%CD%D3wf%9F%86%04%00!%F9%04%09%05%00%04%00%2C%02%00%02%00%7C%00%7C%00%00%03%FFH%BA%DC%FE0%CAI%AB%BD8%EB%CD%BB%FF%60(%8Edi%9Eh"+ "%AA%AEl%EB%BEp%2C%CFt%0A%DC%40%AD%938%BE%FF%9E%5E%0FH%CC%08%7D%C5%24%E5%88T%3A%1D%CC%E6sJ%88%E6%A8X%2B%96%AA%DDN%BB%5E%A5%F5%1AN%82%CB%C41%DA%1C%5D%"+ "B3%99%EEt%3B%0E%3C%D3i%EA%BB%CE%AE%8F%E5%FB3%7C%80%12%01%85%01!%82%83%0E%86%86%20%89%8A%0B%8C%92%1Fs%90%10%92%98%1D%95%96%8B%98%99%1BG%9C%11%9E%9E%1"+ "CC%A2%A3%A4%9F%A8%26%AA%A5%AC%AD%AE%93%B0%24%B2%B3%B4%23%B6%8C%B8%B5%BA%85%BC%22%BE%BF%C0!%C2%C4%C1%B6%C7%B9%AE%CA%CB%A4%CD%BD%B7%D0%CE%87%D3%D6%D7%"+ "D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%C0%02%E4%E5%E6%E7%E8%E7%DC%E9%EC%ED%E6%DA%EE%F1%ED%D9%F2%F5%EA%D8%F6%F9%02%F4%FA%F5%F0%FD%EE%D6%01L'%AE%A0%C1%83%08%13"+ "*%5C%C8%B0%A1%C3%87h%06H%1C%00q%C1%C4%8B%10%2Fj%A4%D8pP%A3F%86%1E7*%0C%E9%11!%C9%92%07O%8A4%A8%F2%23%CB%96%13M%C2%94%98r%26%C7%970%13%CE%5C%98%93%E7"+ "I%87%24%2B%AE%ACH%00%23%D1%A3H%93*%5D%CA%B4%A9%D3%A7P%A3J%9DJ%B5%AA%D5%ABX%B3j%DD%CA%B5%AB%D7%AF%60%C3%16I%00%00%3B"; loadingGif.style.border = 'none'; objLoading.appendChild(loadingGif); // loading text var objLoadingText = document.createElement("p"); objLoadingText.setAttribute('id','greasedLightboxLoadingText'); objLoadingText.innerHTML = greasedLanguage[greasedLanguage.language][0].loading; objLoading.appendChild(objLoadingText); // helper message var objLoadingHelp = document.createElement("p"); objLoadingHelp.setAttribute('id','greasedLightboxLoadingHelp'); objLoadingHelp.innerHTML = greasedLanguage[greasedLanguage.language][0].loadingSub; objLoading.appendChild(objLoadingHelp); // error div var objErrorBox = document.createElement("div"); objErrorBox.setAttribute('id','greasedLightboxError'); objBody.appendChild(objErrorBox); // error message var objError = document.createElement("p"); objError.setAttribute('id','greasedLightboxErrorMessage'); objError.innerHTML = greasedLanguage[greasedLanguage.language][0].error + '<p id="greasedLightboxErrorContext"></p>'; objErrorBox.appendChild(objError); // lightbox div var objLightbox = document.createElement("div"); objLightbox.setAttribute('id','greasedLightbox'); objOverlay.appendChild(objLightbox); // empty image var objImage = document.createElement("img"); objImage.addEventListener('click', greasedLightbox.halt, false); objImage.setAttribute('id','greasedLightboxImage'); objLightbox.appendChild(objImage); // empty preloader var objPreload = document.createElement("img"); objPreload.setAttribute('id','greasedLightboxPreload'); objBody.appendChild(objPreload); // empty prefetcher var objPrefetch = document.createElement("img"); objPrefetch.setAttribute('id','greasedLightboxPrefetch'); objPrefetch.addEventListener('error', function() { return false; }, false); objBody.appendChild(objPrefetch); // empty caption var objCaption = document.createElement("div"); objCaption.setAttribute('id','greasedLightboxCaption'); objLightbox.appendChild(objCaption); document.addEventListener('keypress', greasedLightbox.handleKey, true); }, // init() // unload // runs onunload to clear up possible memory leaks unload : function () { var objOverlay = document.getElementById('greasedLightboxOverlay'); objOverlay.removeEventListener('click', greasedLightbox.halt, false); var objMenuButtonRight = document.getElementById('greasedLightboxButtonRight'); objMenuButtonRight.removeEventListener('click', function(event) { greasedLightbox.moveSlide(event, 1); }, false); var objMenuButtonLeft = document.getElementById('greasedLightboxButtonLeft'); objMenuButtonLeft.removeEventListener('click', function(event) { greasedLightbox.moveSlide(event, -1); }, false); var objMenuButtonPlus = document.getElementById('greasedLightboxButtonPlus'); objMenuButtonPlus.removeEventListener('click', function(event) { greasedLightbox.resize(event, 13); }, false); var objMenuButtonMinus = document.getElementById('greasedLightboxButtonMinus'); objMenuButtonMinus.removeEventListener('click', function(event) { greasedLightbox.resize(event, -13); }, false); var objLoading = document.getElementById('greasedLightboxLoading'); objLoading.removeEventListener('click', greasedLightbox.halt, false); var objError = document.getElementById('greasedLightboxErrorMessage'); objError.removeEventListener('click', greasedLightbox.halt, false); var objImage = document.getElementById('greasedLightboxImage'); objImage.removeEventListener('click', greasedLightbox.halt, false); var objPrefetch = document.getElementById('greasedLightboxPrefetch'); objPrefetch.removeEventListener('error', function() { return false; }, false); document.removeEventListener('keypress', greasedLightbox.handleKey, true); } // unload() } // greasedLightbox var greasedLanguage = { // english en : [ { loading : 'Loading image', loadingSub : 'Click anywhere to cancel', context : 'View image in its original context', error : 'Image unavailable', next : 'Next image (right arrow key)', previous : 'Previous image (left arrow key)', magnify : 'Magnify image (+ key)', shrink : 'Shrink image (- key)', update : 'Update available', slideshow : 'Start/stop slideshow' } ], // english // español es : [ { loading : 'Cargando imagen', loadingSub : 'Click en cualquier sitio para cancelar', context : 'Ver imagen en su contexto original', error : 'La imagen no está disponible', next : 'Siguiente imagen (tecla derecha)', previous : 'Imagen anterior (tecla izquierda)', magnify : 'Aumentar tamaño (tecla +)', shrink : 'Reducir tamaño (tecla -)', update : 'Actualización disponible', slideshow : '' } ], // español // português (portuguese) pt : [ { loading : 'Carregando imagem', loadingSub : 'Clique em qualquer lugar para cancelar', context : 'Imagem no contexto original', error : 'Imagem indisponível', next : 'Próxima imagem (tecle na seta da direita)', previous : 'Imagem anterior (tecle na seta da esquerda)', magnify : 'Aumente o zoom (tecle +)', shrink : 'Diminua o zoom (tecle -)', update : 'Atualização disponível', slideshow : 'Iniciar/cancelar apresentação' } ], // português // deutsch (german) de : [ { loading : 'Bild wird geladen', loadingSub : 'Zum Abbrechen irgendwo klicken', context : 'Bild im ursprünglichen Kontext anzeigen', error : 'Bild nicht verfügbar', next : 'Nächstes Bild (Pfeil rechts)', previous : 'Vorheriges Bild (Pfeil links)', magnify : 'Bild vergrößern (+ Taste)', shrink : 'Bild verkleinern (- Taste)', update : 'Aktualisierung verfügbar', slideshow : 'Diashow starten/beenden' } ], // deutsch // français (french) fr : [ { loading : 'Chargement de l\'image', loadingSub : 'Cliquez n\'importe où pour annuler', context : 'Voir cette image dans son contexte original', error : 'Image indisponible', next : 'Image suivante (Touche flèche droite) ', previous : 'Image précédente (Touche fléche gauche)', magnify : 'Agrandir l\'image (Touche +)', shrink : 'Reduire l\'image (Touche -)', update : 'Mise à jour disponible', slideshow : '' } ], // français // het Nederlands (dutch) nl : [ { loading : 'Laden', loadingSub : 'Klik ergens om terug te keren', context : 'Bekijk het plaatje in zijn originele context', error : 'Plaatje niet beschikbaar', next : 'Volgend plaatje (rechter pijltjestoets)', previous : 'Vorig plaatje (linker pijltjestoets)', magnify : 'Vergoot plaatje (+ toets)', shrink : 'Verklein plaatje (- toets)', update : 'Update beschikbaar', slideshow : 'Start/stop diavoorstelling' } ], // het Nederlands // italiano (italian) it : [ { loading : 'Scarico immagine', loadingSub : 'Fai clic sullo sfondo per annullare', context : 'Mostra nel suo contesto originale', error : 'Immagine non disponibile', next : 'Successiva (tasto freccia a destra)', previous : 'Precedente (tasto freccia a sinistra)', magnify : 'Ingrandisci (tasto +)', shrink : 'Riduci zoom (tasto -)', update : 'Aggiornamento disponibile', slideshow : 'Avvia/ferma presentazione' } ], // italiano // ???????? (greek) el : [ { loading : '?????a f??t?s??', loadingSub : '?t?p?ste ?p??d?p?te ??a ?a a????sete', context : '?????a ?p???? st? a????? p?a?s?? t??', error : '?????a µ? d?a??s?µ?', next : 'Next image (right arrow key)', previous : 'Previous image (left arrow key)', magnify : 'Magnify image (+ key)', shrink : 'Shrink image (- key)', update : 'Update available', slideshow : '' } ], // ???????? // russki (russian) ru : [ { loading : '??????????? ????????', loadingSub : 'Click ???-????, ????? ????? ????????', context : '??????????? ??????? ? ????? ????????????? ??????', error : '??????????? ?????????????', next : 'Next image (right arrow key)', previous : 'Previous image (left arrow key)', magnify : 'Magnify image (+ key)', shrink : 'Shrink image (- key)', update : 'Update available', slideshow : '' } ], // russki // hungarian hu : [ { loading : 'K\u00E9p bet\u00F6lt\u00E9se', loadingSub : 'Kattints a visszal\u00E9p\u00E9shez', context : 'Megtekint\u00E9s az eredeti k\u00F6rnyezet\u00E9ben', error : 'K\u00E9p nem el\u00E9rhet\u0151', next : 'K\u00F6vetkez\u0150 k\u00E9p (jobbra gomb)', previous : 'El\u0150z\u0150 k\u00E9p (balra gomb)', magnify : 'Nagy\u00EDtás (+ gomb)', shrink : 'Kicsiny\u00EDt\u00E9s (- gomb)', update : 'El\u00E9rhet\u0150 az \u00FAjabb verzi\u00F3', slideshow : '' } ], // hungarian // finnish fi : [ { loading : 'Ladataan kuvaa', loadingSub : 'Napsauta kerran keskeyttääksesi', context : 'Näytä kuva alkuperäisessä kontekstissa', error : 'Kuvaa ei saatavissa', next : 'Seuraava kuva (oikea nuolinäppäin)', previous : 'Edellinen kuva (vasen nuolinäppäin)', magnify : 'Suurenna kuvaa (+ näppäin)', shrink : 'Pienennä kuvaa (- näppäin)', update : 'Päivitys saatavilla', slideshow : 'Käynnistä/Pysäytä dia esitys' } ], // finnish // japanese ja : [ { loading : '\u8AAD\u307F\u8FBC\u307F\u4E2D', loadingSub : '\u30AF\u30EA\u30C3\u30AF\u3067\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3059', context : '\u5143\u306E\u753B\u50CF\u3092\u8868\u793A', error : '\u753B\u50CF\u304C\u5B58\u5728\u3057\u307E\u305B\u3093', next : '\u6B21\u306E\u753B\u50CF', previous : '\u524D\u306E\u753B\u50CF', magnify : '\u753B\u50CF\u3092\u62E1\u5927 (+)', shrink : '\u753B\u50CF\u3092\u7E2E\u5C0F (-)', update : '\u65B0\u3057\u3044\u66F4\u65B0\u304C\u3042\u308A\u307E\u3059', slideshow : '\u30B9\u30E9\u30A4\u30C9\u30B7\u30E7\u30FC\u3092\u958B\u59CB\u002F\u505C\u6B62' } ], // japanese // chinese (simplified) zh : [ { loading : '\u8BFB\u53D6\u56FE\u7247', loadingSub : '\u6309\u4EFB\u610F\u952E\u6765\u53D6\u6D88', context : '\u4EE5\u539F\u6587\u672C\u67E5\u770B\u56FE\u7247', error : '\u56FE\u7247\u4E0D\u53EF\u8BFB', next : '\u4E0B\u4E00\u4E2A\u56FE\u7247 (\u53F3\u952E)', previous : '\u524D\u4E00\u4E2A\u56FE\u7247 (\u56FE\u7247)', magnify : '\u653E\u5927\u56FE\u7247 (+\u952E)', shrink : '\u7F29\u5C0F\u56FE\u7247 (-\u952E)', update : '\u53EF\u63D0\u4F9B\u66F4\u65B0', slideshow : '' } ], // chinese (simplified) // Chinese (traditional) tw : [ { loading : '\\u8F09\\u5165\\u5716\\u7247\\u4E2D', loadingSub : '\\u6309\\u4EFB\\u610F\\u9375\\u53D6\\u6D88', context : '\\u6253\\u958B\\u5716\\u7247\\u539F\\u59CB\\u7DB2\\u5740', error : '\\u7121\\u6CD5\\u8F09\\u5165\\u5716\\u7247', next : '\\u4E0B\\u4E00\\u5F35\\u5716 (\\u53F3\\u9375)', previous : '\\u4E0A\\u4E00\\u5F35\\u5716 (\\u5DE6\\u9375)', magnify : '\\u653E\\u5927\\u5716\\u7247 (+\\u9375)', shrink : '\\u7E2E\\u5C0F\\u5716\\u7247 (-\\u9375)', update : '\\u6709\\u66F4\\u65B0\\u7248\\u672C', slideshow : '\\u958B\\u59CB/\\u505C\\u6B62\\u5FAA\\u5E8F\\u64AD\\u653E' } ], // Chinese (traditional) // polish pl : [ { loading : '\u0141aduj\u0119 obraz', loadingSub : 'Kliknij aby przerwa\u010B', context : 'Zobacz obraz w oryginalnym kontek\u015Bcie', error : 'Obraz niedost\u0119pny', next : 'Nast\u0119pny obraz (klawisz \u2192)', previous : 'Poprzedni obraz (klawisz \u2190)', magnify : 'Powi\u0119ksz obraz (klawisz +)', shrink : 'Zmniejsz obraz (klawisz -)', update : 'Dost\u0119pna nowa wersja', slideshow : 'Uruchom/zatrzymaj pokaz slajd\u00F3w' } ], // polish // czech cs : [ { loading : 'Nahrávám obrázek', loadingSub : 'Kliknete kamkoliv pro zrušení', context : 'Prohlížet obrázek v orignálním kontextu', error : 'Obrázek není dostupný', next : 'Další obrázek (šipka doprava)', previous : 'Predchozí obrázek (šipka doleva)', magnify : 'Priblížit obrázek (klávesa +)', shrink : 'Oddálit obrázek (klávesa -)', update : 'Je dostupná aktualizace', slideshow : 'Spustit/zastavit slideshow' } ], // czech // slovak sk : [ { loading : 'Nahrávam obrázok', loadingSub : 'Pre zrušenie kliknite kdekolvek', context : 'Prezriet obrázok v orignálnom kontexte', error : 'Obrázok nie je dostupný', next : 'Další obrázok (šípka doprava)', previous : 'Predchádzajúci obrázok (šípka dolava)', magnify : 'Priblížit obrázok (klávesa +)', shrink : 'Oddialit obrázok (klávesa -)', update : 'Je dostupná aktualizácia', slideshow : '' } ], // slovak // swedish sv : [ { loading : 'Laddar bild', loadingSub : 'Klicka för att avbryta', context : 'Visa originalbild', error : 'Bild inte tillgänglig', next : 'Nästa bild (höger piltangent)', previous : 'Föregående bild (vänster piltangent)', magnify : 'Förstora bild (+-tangent)', shrink : 'Förminska bild (–tangent)', update : 'Ny uppdatering tillgänglig', slideshow : 'Starta/stoppa bildspel' } ], // swedish /* language template // : [ { loading : '', loadingSub : '', context : '', error : '', next : '', previous : '', magnify : '', shrink : '', update : '', slideshow : '' } ], // end */ // lauguage // the correct language for localization is set in init() language : null, // init() // sets this.language to the correct value based on navigator.language init : function() { this.language = this[navigator.language.substring(0,2)] ? navigator.language.substring(0,2) : 'en'; } // init() }; // greasedLanguage if (document.body) greasedLightbox.init();} var offInstantSearch = true; if (offInstantSearch) { if (top != self) return; var target = document.getElementById("po-off"); if (!target) return; var className = target.className; if (!className) return; if (/unselected/.test(className))window.location = target.href;} })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址