Google Images Enhancer

Mejora Tu Experiencia Al Navegar En Google IMÁGENES | Improves Your Browsing Experience In Google IMAGES.

  1. // ==UserScript==
  2. // @name Google Images Enhancer
  3. // @author Keyser Söze
  4. // @namespace http://userscripts.org/users/KeyserSoze
  5. // @homepageURL https://userscripts.org/scripts/show/150950
  6. // @website http://userscripts.org/scripts/show/150950
  7. // @icon http://files.myopera.com/TrikiTran/albums/11598242/avatar117399_1.gif
  8. // @description Mejora Tu Experiencia Al Navegar En Google IMÁGENES | Improves Your Browsing Experience In Google IMAGES.
  9. // @grant GM_addStyle
  10. // @version 2.0
  11. // @include htt*://*.google.*/*tbm=isch*
  12. // @include htt*://*.google.*/images?*
  13. // @include htt*://images.google.*/search?*imghp*
  14. // @include htt*://*.google.*/search?*
  15. // @include htt*://*.google.*/
  16. // @include htt*://*.google.*/firefox
  17. // @exclude htt*://*.google.com/
  18. // @exclude htt*://*.google.tld/
  19. // @exclude htt*://*.google.*/mail/*
  20. // Basado en "Google Enlarge", "PicViewer" & "Greased LightBox"... Así que, muchas gracias a los autores originales!
  21. // Based on "Google Enlarge", "PicViewer" & "Greased LightBox"... So, many thanks to original authors
  22. // ==/UserScript==
  23.  
  24. (function() {
  25.  
  26. /*
  27. =============================
  28. || Google From Dusk 2 Dawn ||
  29. =============================
  30. */
  31.  
  32. { 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}";
  33. if (typeof GM_addStyle != "undefined") {
  34. GM_addStyle(css);
  35. } else if (typeof PRO_addStyle != "undefined") {
  36. PRO_addStyle(css);
  37. } else if (typeof addStyle != "undefined") {
  38. addStyle(css);
  39. } else {
  40. var heads = document.getElementsByTagName("head");
  41. if (heads.length > 0) {
  42. var node = document.createElement("style");
  43. node.type = "text/css";
  44. node.appendChild(document.createTextNode(css));
  45. heads[0].appendChild(node);}
  46. }
  47. 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}";
  48. if (typeof GM_addStyle != "undefined") {
  49. GM_addStyle(css);
  50. } else if (typeof PRO_addStyle != "undefined") {
  51. PRO_addStyle(css);
  52. } else if (typeof addStyle != "undefined") {
  53. addStyle(css);
  54. } else {
  55. var heads = document.getElementsByTagName("head");
  56. if (heads.length > 0) {
  57. var node = document.createElement("style");
  58. node.type = "text/css";
  59. node.appendChild(document.createTextNode(css));
  60. heads[0].appendChild(node);
  61. }
  62. }
  63. }{
  64. /*
  65. ================================
  66. || Google Images Enhancements ||
  67. ================================
  68. */
  69.  
  70. var doubleDecodeURIComponent = function (component){
  71. var tmp = decodeURIComponent(component);
  72. tmp = decodeURIComponent(tmp);
  73. return tmp;
  74. }
  75.  
  76. var parseUrl = function (url) {
  77. var qstr = url.split('?');
  78. if (qstr.length <= 1)
  79. return [];
  80. var rawparams = qstr[1].split('&');
  81. var par = [];
  82. for (var i=0 ; i<rawparams.length ; i++){
  83. var p = rawparams[i].split("=");
  84. par[p[0]] = p[1];
  85. }
  86. return par;
  87. }
  88.  
  89. var getImageLinks = function (url) {
  90. var param = parseUrl(url);
  91. var links = new Object();
  92. links.toImgHref = decodeURIComponent(param["imgurl"]);
  93. links.toPageHref = decodeURIComponent(param["url"]);
  94. return links;
  95. }
  96.  
  97. var getNewImageLinks = function (url) {
  98. var param = parseUrl(url);
  99. var links = new Object();
  100. links.toImgHref = doubleDecodeURIComponent(param["imgurl"]);
  101. links.toPageHref = decodeURIComponent(param["imgrefurl"]);
  102. return links;
  103. }
  104.  
  105. var firstOrNull = function (elems) {
  106. return (elems.length > 0 ) ? elems[0] : null;
  107. }
  108.  
  109. var imgTable = firstOrNull(document.getElementsByClassName('images_table'));
  110. if ( imgTable ) { // for basic version
  111. var imgCell = imgTable.getElementsByTagName('td');
  112. for( j=0 ; j<imgCell.length ; j++ ) {
  113. var imageAnchor = imgCell[j].getElementsByTagName('a')[0];
  114. var domainText = imgCell[j].getElementsByTagName('cite')[0];
  115. console.log(imageAnchor.href);
  116. var links = getImageLinks(imageAnchor.href);
  117. //links.toPageHref = imageAnchor.href; // TODO fixme
  118. links.toImgHref = imageAnchor.href; // TODO fixme
  119. domainText.innerHTML = '<a href="' + links.toPageHref + '">' + domainText.innerHTML + '/&hellip;<\a>';
  120. imageAnchor.href = links.toImgHref;
  121. }
  122. }
  123. else { // standard version
  124. console.log("standard version");
  125. var stopEvent = function(event){ event.stopPropagation() }
  126. var fixStyle = function(target){
  127. var parent = target.parentNode;
  128. parent.style.height = target.style.height;
  129. parent.style.width = target.style.width;
  130. parent.style.left = target.style.left;
  131. target.style.left = 'auto';
  132. }
  133. var fixBoxObserver = new MutationObserver(function(mutations){
  134. mutations.forEach(function(mutation) {
  135. var target = mutation.target;
  136. var parent = mutation.target.parentNode;
  137. if (mutation.attributeName === 'style' && target.style.left !== 'auto'){
  138. fixStyle(target);
  139. }
  140. });
  141. });
  142. var fixBoxMutationConfig = { attributes: true, childList: true, characterData: false, subtree: false };
  143. var fixImageBox = function(image){
  144. if ( /\blinkOk\b/.test(image.className) ) {
  145. return;
  146. }
  147. var span = image.querySelector('span.rg_ilmn');
  148. if (span !== null) {
  149. var a = firstOrNull(image.getElementsByTagName('a'));
  150. var links = getNewImageLinks(a.href);
  151. a.href = links.toImgHref;
  152. a.addEventListener('click', stopEvent, false);
  153. a.addEventListener('mousedown', stopEvent, false);
  154.  
  155. var newContainer = document.createElement('div');
  156. newContainer.className = 'newCont';
  157.  
  158. a.parentNode.appendChild(newContainer);
  159. newContainer.appendChild(a);
  160. newContainer.appendChild(span.parentNode);
  161.  
  162. fixStyle(a);
  163. var desc = span.innerHTML;
  164. span.innerHTML = '<a style="color:#fff" href="' + links.toPageHref + '">' + desc + '</a>';
  165. image.className += ' linkOk'
  166. fixBoxObserver.observe(a, fixBoxMutationConfig);
  167. }
  168. else {
  169. console.log("incomplete span");
  170. image.className += ' notComplete';
  171. }
  172. }
  173. var fixImages = function(){
  174. var imagesContainer = document.getElementById('rg_s');
  175. if ( imagesContainer == null ) return;
  176. var images = imagesContainer.getElementsByClassName('rg_di');
  177. for (var i = 0 ; i< images.length ; i++) {
  178. fixImageBox(images[i]);
  179. }
  180. }
  181. var newBoxMutationConfig = { attributes: false, childList: true, characterData: false, subtree: true };
  182. var newBoxObserver = new MutationObserver(function(mutations){
  183. var needFix = false;
  184. mutations.forEach(function(mutation) {
  185. needFix = needFix || mutation.target.id == 'rg_s';
  186. });
  187. if (needFix)
  188. fixImages();
  189. });
  190.  
  191. fixImages();
  192. newBoxObserver.observe(document.body, newBoxMutationConfig);
  193.  
  194. var css = []; var i = 0;
  195. css[i++] = '.newCont { position: relative; }';
  196. css[i++] = '.newCont .rg_ilmbg { display: none; }';
  197. css[i++] = '.newCont:hover .rg_ilmbg { display: block; }';
  198. css[i++] = '.imgSiteLnk {'; ///img preview
  199. css[i++] = ' background-color: rgba(255, 255, 255, 0.77);';
  200. css[i++] = ' bottom: 0;';
  201. css[i++] = ' color: #000000;';
  202. css[i++] = ' display: block;';
  203. css[i++] = ' line-height: normal;';
  204. css[i++] = ' position: absolute;';
  205. css[i++] = ' text-decoration: none;';
  206. css[i++] = ' width: 100%; ';
  207. css[i++] = ' display: none }';
  208. css[i++] = '.imgPrev:hover .imgSiteLnk { display: block }';///img preview
  209. var style = document.createElement('style');
  210. style.type = 'text/css';
  211. style.appendChild(document.createTextNode(css.join('\n')));
  212. document.head.appendChild(style);
  213.  
  214. ///img preview in google search (only links to page)
  215. var fixImagePreview = function(div){
  216. var images = document.getElementsByClassName('bicc');
  217. for (var i = 0 ; i<images.length ; i++) {
  218. var div = images[i];
  219. var el = div.getElementsByTagName('a');
  220. if ( el.length == 1 ) {
  221. div.className += ' imgPrev';
  222. //div.style.border = '4em solid black';
  223. var href = el[0].href;
  224. var link = doubleDecodeURIComponent(parseUrl(href)['imgil']);
  225. link = decodeURIComponent(link.split(';')[5]);
  226. var a = document.createElement('a');
  227. a.href = link;
  228. a.className = 'imgSiteLnk';
  229. a.textContent = link.split('/')[2];
  230. div.appendChild(a);
  231. }
  232. }
  233. }
  234. var searchObserver = new MutationObserver(function(mutations){
  235. fixImagePreview();
  236. });
  237. searchObserver.observe(document.body,
  238. {
  239. attributes: false,
  240. childList: true,
  241. characterData: false,
  242. subtree: true
  243. }
  244. );
  245. // visually similar search img preview (oly links to image)
  246. var similars = document.querySelectorAll('div._mj a');
  247. console.log(similars.length)
  248. for (var i = 0 ; i < similars.length ; i++){
  249. var a = similars[i];
  250. var href = getNewImageLinks(a.href);
  251. console.log(href)
  252. if ( typeof href.toImgHref === 'undefined' ) {
  253. console.log('skip')
  254. continue;
  255. }
  256. console.log(href.toImgHref)
  257. var newA = document.createElement('a');
  258. newA.href = href.toImgHref;
  259. newA.appendChild(a.firstChild);
  260. a.parentNode.replaceChild(newA, a);
  261. }
  262.  
  263. }
  264.  
  265. }{
  266.  
  267. /* =================================
  268. || Additional Google SearchBar ||
  269. =================================
  270. */
  271.  
  272. var langs = {
  273. '':'-'
  274. ,'Any Language': '-'
  275. ,'Spanish': 'es'
  276. ,'Russian': 'ru'
  277. ,'Portuguese': 'pt'
  278. ,'Italian': 'it'
  279. ,'Greek': 'el'
  280. ,'German': 'de'
  281. ,'French': 'fr'
  282. ,'English': 'en'
  283. ,'==========': '-'
  284. ,'Afrikaans': 'af'
  285. ,'Arabic': 'ar'
  286. ,'Armenian': 'hy'
  287. ,'Belarusian': 'be'
  288. ,'Bulgarian': 'bg'
  289. //,'Catalan': 'ca'
  290. ,'Chinese': 'zh-CN'
  291. //,'Chinese (Traditional)': 'zh-TW'
  292. ,'Croatian': 'hr'
  293. ,'Czech': 'cs'
  294. ,'Danish': 'da'
  295. ,'Dutch': 'nl'
  296. //,'Esperanto': 'eo'
  297. ,'Estonian': 'et'
  298. ,'Filipino': 'tl'
  299. ,'Finnish': 'fi'
  300. ,'Hebrew': 'iw'
  301. ,'Hindi': 'hi'
  302. ,'Hungarian': 'hu'
  303. ,'Icelandic': 'is'
  304. ,'Indonesian': 'id'
  305. ,'Japanese': 'ja'
  306. ,'Korean': 'ko'
  307. ,'Latvian': 'lv'
  308. ,'Lithuanian': 'lt'
  309. ,'Norwegian': 'no'
  310. ,'Persian': 'fa'
  311. ,'Polish': 'pl'
  312. ,'Romanian': 'ro'
  313. ,'Serbian': 'sr'
  314. ,'Slovak': 'sk'
  315. ,'Slovenian': 'sl'
  316. //,'Swahili': 'sw'
  317. ,'Swedish': 'sv'
  318. ,'Thai': 'th'
  319. ,'Turkish': 'tr'
  320. ,'Ukrainian': 'uk'
  321. ,'Vietnamese': 'vi'
  322. };
  323.  
  324. var filetypes = {
  325. '':'-'
  326. ,'Any Format': '-'
  327. ,'Adobe PDF (.pdf)': 'pdf'
  328. ,'Adobe Postscript (.ps)': 'ps'
  329. ,'Autodesk DWF (.dwf)': 'dwf'
  330. ,'Digital Audio M4A (.m4a)': 'm4a'
  331. ,'Digital Audio MP3 (.mp3)': 'mp3'
  332. ,'Digital Video Avi (.avi)': 'avi'
  333. ,'Digital Video MP4 (.mp4)': 'mp4'
  334. ,'Digital Video MKV (.mkv)': 'mkv'
  335. ,'Excel Datasheet(.xls)': 'xls'
  336. ,'Google Earth KML (.kml)': 'kml'
  337. ,'Google Earth KMZ (.kmz)': 'kmz'
  338. ,'Metadata File (.torrent)': 'torrent'
  339. ,'PowerPoint (.ppt)': 'ppt'
  340. ,'Rich Text Format (.rtf)': 'rtf'
  341. ,'Shockwave Flash (.swf)': 'swf'
  342. ,'WinRAR Archiver (.rar)': 'rar'
  343. ,'Word Document (.doc)': 'doc'
  344. };
  345.  
  346. var sitesearches = {
  347. '':'-'
  348. ,'Any Site': '-'
  349. ,'AvaxHome': 'avaxho.me'
  350. ,'Ba-K': 'ba-k.com'
  351. ,'EbookBrowse': 'ebookbrowse.com'
  352. ,'EbooksBay': 'ebooksbay.org'
  353. ,'Education': '.edu'
  354. ,'Fapdu': 'fapdu.com'
  355. ,'FileShut': 'fileshut.com'
  356. ,'Gobierno MX': '.gob.mx'
  357. ,'Government': '.gov'
  358. ,'IATE': 'iate.europa.eu'
  359. ,'Identi': 'identi.li'
  360. ,'Redalyc': 'redalyc.org'
  361. ,'Taringa': 'taringa.net'
  362. ,'Twilight': 'twilight.ws'
  363.  
  364. };
  365.  
  366. var holder = document.createElement('div')
  367. ,cboLang = document.createElement('select')
  368. ,cboFileType = document.createElement('select')
  369. ,cboSiteSearch = document.createElement('select')
  370. ,btnSearch = document.createElement('button')
  371. ,searchBoxHolderID = 'gbqfw'
  372. ,searchBoxID = 'gbqfq'
  373. ,query = location.search;
  374.  
  375. /* Fill combo boxes */
  376. for (var l in langs) {
  377. cboLang.innerHTML += '<option ' +
  378. ((query.indexOf('&lr=lang_' + langs[l]) !== -1) ? 'selected="selected"' : '') +
  379. 'value="' + langs[l] + '">' + l + '</option>';
  380. }
  381.  
  382. for (var f in filetypes) {
  383. cboFileType.innerHTML += '<option ' +
  384. ((query.indexOf('&as_filetype=' + filetypes[f]) !== -1) ? 'selected="selected"' : '') +
  385. 'value="' + filetypes[f] + '">' + f + '</option>';
  386. }
  387.  
  388. for (var s in sitesearches) {
  389. cboSiteSearch.innerHTML += '<option ' +
  390. ((query.indexOf('&as_sitesearch=' + sitesearches[s]) !== -1) ? 'selected="selected"' : '') +
  391. 'value="' + sitesearches[s] + '">' + s + '</option>';
  392. }
  393.  
  394. /* Add elements to the page */
  395. holder.setAttribute('style','background-color:inherit;border:1px solid inherit;padding:1px 5px;');
  396. holder.appendChild(document.createTextNode(' Language: '));
  397. holder.appendChild(cboLang);
  398. holder.appendChild(document.createTextNode(' File Type: '));
  399. holder.appendChild(cboFileType);
  400. holder.appendChild(document.createTextNode(' Site: '));
  401. holder.appendChild(cboSiteSearch);
  402. btnSearch.appendChild(document.createTextNode('Search'));
  403. btnSearch.setAttribute('style','margin-left:5px;');
  404. holder.appendChild(btnSearch);
  405. document.getElementById(searchBoxHolderID).appendChild(holder);
  406.  
  407. /* Search with customized settings */
  408. btnSearch.onclick = function () {
  409. var selectedLang = cboLang.options[cboLang.selectedIndex].value
  410. ,searchTerm = document.getElementById(searchBoxID).value.replace(/ +filetype:[^ ]*/gi, '')
  411. ,selectedFileType = cboFileType.options[cboFileType.selectedIndex].value
  412. ,searchTerm = document.getElementById(searchBoxID).value.replace(/ +OR+sitesearch:[^ ]*/gi, '')
  413. ,selectedSiteSearch = cboSiteSearch.options[cboSiteSearch.selectedIndex].value
  414. ,lang = (selectedLang == '-') ? '' : ('&lr=lang_' + selectedLang)
  415. ,filetype = (selectedFileType == '-') ? '' : ('&as_filetype=' + selectedFileType)
  416. ,sitesearch = (selectedSiteSearch == '-') ? '' : ('&as_sitesearch=' + selectedSiteSearch)
  417. ,url = location.protocol + '//' + location.host + '/search?q=' + encodeURIComponent(searchTerm) + lang + filetype + sitesearch;
  418. window.location.replace(url);
  419. };
  420.  
  421. }{
  422.  
  423. /*
  424. ========================================
  425. || Pictures Viewer & Greased LightBox ||
  426. ========================================
  427. */
  428.  
  429. (function(topObject,window,document){
  430. 'use strict';
  431.  
  432. function init(topObject,window,document,arrayFn,envir){
  433. //一些设定。
  434. var prefs={
  435. floatBar:{//浮动工具栏相关设置.
  436. butonOrder:['actual','current','magnifier','gallery'],//按钮排列顺序'actual'(实际的图片),'current'(当前显示的图片),'magnifier'(放大镜观察),'gallery'(图集)
  437. showDelay:366,//浮动工具栏显示延时.单位(毫秒)
  438. hideDelay:566,//浮动工具栏隐藏延时.单位(毫秒)
  439. position:'top left',// 取值为: 'top left'(图片左上角) 或者 'top right'(图片右上角) 'bottom right'(图片右下角) 'bottom left'(图片左下角);
  440. offset:{//浮动工具栏偏移.单位(像素)
  441. x:-15,//x轴偏移(正值,向右偏移,负值向左)
  442. y:-15,//y轴偏移(正值,向下,负值向上)
  443. },
  444. forceShow:{//在没有被缩放的图片上,但是大小超过下面设定的尺寸时,强制显示浮动框.(以便进行旋转,放大,翻转等等操作)..
  445. enabled:true,//启用强制显示.
  446. size:{//图片尺寸.单位(像素);
  447. w:166,
  448. h:166,
  449. },
  450. },
  451. minSizeLimit:{//就算是图片被缩放了(看到的图片被设定了width或者height限定了大小,这种情况下),如果没有被缩放的原图片小于设定值,那么也不显示浮动工具栏.
  452. w:100,
  453. h:100,
  454. },
  455. },
  456.  
  457. magnifier:{//放大镜的设置.
  458. radius:77,//默认半径.单位(像素).
  459. wheelZoom:{//滚轮缩放.
  460. enabled:true,
  461. pauseFirst:true,//需要暂停(单击暂停)后,才能缩放.(推荐,否则因为放大镜会跟着鼠标,如果放大镜过大,那么会影响滚动.)..
  462. 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],//缩放的范围
  463. },
  464. },
  465.  
  466. gallery:{//图库相关设定
  467. fitToScreen:false,//图片适应屏幕(适应方式为contain,非cover).
  468. sidebarPosition:'bottom',//'top' 'right' 'bottom' 'left' 四个可能值
  469. sidebarSize:130,//侧栏的高(如果是水平放置)或者宽(如果是垂直放置)
  470. preload:true,//对附近的图片进行预读。
  471. max:5,//最多预读多少张(前后各多少张)
  472. },
  473.  
  474. imgWindow:{//图片窗相关设置
  475. fitToScreen:false,//适应屏幕,并且水平垂直居中(适应方式为contain,非cover).
  476. defaultTool:'hand',//"hand","rotate","zoom";打开窗口的时候默认选择的工具
  477. overlayer:{//覆盖层.
  478. shown:false,//显示
  479. color:'rgba(0,0,0,0.73)',//颜色和不透明度设置.
  480. clickToClose:[true,'click'],//[是否使用点击关闭窗口 "true,false",关闭触发方式,"click,dblclick"]
  481. },
  482. zoom:{//滚轮缩放
  483. 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],//缩放比例.(不要出现负数,谢谢-_-!~)
  484. mouseWheelZoom:true,//是否允许使用滚轮缩放。
  485. },
  486. },
  487.  
  488. //旋转的时候,按住shift键时,旋转的步进.单位:度.
  489. shiftRotateStep:15,
  490.  
  491. //等图片完全载入后,才开始执行弹出,放大等等操作,
  492. //按住ctrl键的时候,可以临时执行和这个设定相反的设定.
  493. waitImgLoad:true,
  494.  
  495. //框架里面的图片在顶层窗口展示出来,但是当frame与顶层窗口domain不一样的时候,可能导致图片被反盗链拦截,
  496. //按住shift键,可以临时执行和这个设定相反的设定
  497. framesPicOpenInTopWindow:true,
  498. };
  499.  
  500.  
  501. //各网站高级规则;
  502. var siteInfo=[
  503. {siteName:"google图片搜索",
  504. //网址例子.(方便测试.查看.之类的)
  505. siteExample:"http://www.google.com.hk/search?q=opera&tbm=isch",
  506. //是否启用
  507. enabled:true,
  508. //站点正则
  509. url:/https?:\/\/www.google(\.\w{1,3}){1,3}\/search\?.*&tbm=isch/,
  510. //鼠标左键点击直接打开..(这个只是当高级规则的getImage()返回图片的时候生效)
  511. clikToOpen:{
  512. enabled:true,
  513. preventDefault:true,//是否尝试阻止点击的默认行为(比如如果是你点的是一个链接,默认行为是打开这个链接,如果是true,js会尝试阻止链接的打开(如果想临时打开这个链接,请使用右键的打开命令))
  514. type:'actual',//默认的打开方式: 'actual'(弹出,原始图片) 'magnifier'(放大镜) 'current'(弹出,当前图片)
  515. },
  516. //获取图片实际地址的处理函数,
  517. //this 为当前鼠标悬浮图片的引用,
  518. //第一个参数为当前图片的引用,
  519. //第二个参数为包裹当前图片的第一个a元素(可能不存在).
  520. getImage:function(img,a){
  521. if(!a)return;
  522. return (a.href.match(/imgurl=(.*?\.\w{1,5})&/i) || [])[1];
  523. },
  524. },
  525. {sitename:"百度图片搜索",
  526. enabled:true,
  527. url:/^https?:\/\/image\.baidu\.com\/i\?/i,
  528. getImage:function(img,a){
  529. var origin=img.dataset['origin'];
  530. if(origin){
  531. return origin
  532. }else{
  533. if(a){
  534. var onclick=a.getAttribute('onclick');
  535. if(onclick){
  536. return (onclick.match(/u:'(https?:\/\/[^']+)'/i) || [])[1];
  537. };
  538. };
  539. };
  540. },
  541. },
  542. {sitename:"豆瓣",
  543. siteExample:"http://movie.douban.com/photos/photo/1000656155/",
  544. enabled:true,
  545. url:/^https?:\/\/[^.]*\.douban\.com/i,
  546. getImage:function(){
  547. var oldsrc=this.src;
  548. var newsrc=oldsrc.replace(/\/view\/photo\/photo\/public\//i,'/view/photo/raw/public/');
  549. if(newsrc!=oldsrc)return newsrc;
  550. }
  551. },
  552. {sitename:"deviantart",
  553. enabled:true,
  554. url:/^https?:\/\/[^.]*\.deviantart\.com/i,
  555. siteExample:"http://www.deviantart.com",
  556. getImage:function(){
  557. var oldsrc=this.src;
  558. var newsrc=oldsrc.replace(/(http:\/\/[^\/]+\/fs\d+\/)200H\/(.*)/i,'$1$2');
  559. return newsrc==oldsrc? '' : newsrc;
  560. },
  561. },
  562. {sitename:"opera官方论坛",
  563. enabled:true,
  564. url:/^http:\/\/bbs\.operachina\.com/i,
  565. siteExample:"http://bbs.operachina.com",
  566. getImage:function(){
  567. var src=this.src;
  568. if(/file.php\?id=\d+$/i.test(src)){
  569. return src+'&mode=view';
  570. };
  571. },
  572. },
  573. {sitename:"QQ微博",
  574. enabled:true,
  575. url:/^http:\/\/[^\/]*t\.qq\.com\//i,
  576. siteExample:"http://t.qq.com/p/news",
  577. getImage:function(img){
  578. var pic=/(\.qpic\.cn\/mblogpic\/\w+)\/\d+/i;//图片
  579. var head=/(\.qlogo\.cn\/mbloghead\/\w+)\/\d+/i;//头像.
  580. var oldsrc=this.src;
  581. var newsrc;
  582. if(pic.test(oldsrc)){
  583. newsrc=oldsrc.replace(pic,'$1/2000');
  584. return newsrc==oldsrc? '' : newsrc;;
  585. }else if(head.test(oldsrc)){
  586. newsrc=oldsrc.replace(head,'$1/0');
  587. return newsrc==oldsrc? '' : newsrc;;
  588. };
  589. },
  590. },
  591. {sitename:"新浪微博",
  592. enabled:true,
  593. url:/^http:\/\/weibo\.com/i,
  594. siteExample:"http://weibo.com/pub/?source=toptray",
  595. getImage:function(img){
  596. var oldsrc=this.src;
  597. var pic=/(\.sinaimg\.cn\/)(?:bmiddle|thumbnail)/i;//图片.
  598. var head=/(\.sinaimg\.cn\/\d+)\/50\//i;//头像.
  599. var photoList=/\.sinaimg\.cn\/thumb150\/\w+/i//相册
  600. var newsrc;
  601. if(pic.test(oldsrc)){
  602. newsrc=oldsrc.replace(pic,'$1large');
  603. return newsrc==oldsrc? '' : newsrc;
  604. }else if(head.test(oldsrc)){
  605. newsrc=oldsrc.replace(head,'$1/180/');
  606. return newsrc==oldsrc? '' : newsrc;
  607. }else if(photoList.test(oldsrc)){
  608. newsrc=oldsrc.replace('/thumb150/','/mw690/');
  609. return newsrc==oldsrc? '' : newsrc;
  610. };
  611. },
  612. },
  613. {sitename:"pixiv",
  614. enabled:true,
  615. url:/^http:\/\/www\.pixiv\.net/i,
  616. getImage:function(img){
  617. var oldsrc=this.src;
  618. var reg=/(\d+)(_\w)(\.\w{2,5})$/i
  619. if(reg.test(oldsrc)){
  620. return oldsrc.replace(reg,'$1$3');
  621. };
  622. },
  623. },
  624. {sitename:"沪江碎碎",
  625. enabled:true,
  626. url:/^https?:\/\/([^.]+\.)*(?:yeshj\.com|hjenglish\.com|hujiang\.com)/i,
  627. getImage:function(img){
  628. var oldsrc=this.src;
  629. var reg=/^(https?:\/\/(?:[^.]+\.)*hjfile.cn\/.+)(_(?:s|m))(\.\w+)$/i;
  630. if(reg.test(oldsrc)){
  631. return oldsrc.replace(reg,'$1$3');
  632. };
  633. },
  634. },
  635. {sitename:"百度贴吧",
  636. enabled:true,
  637. url:/^http:\/\/tieba\.baidu\.com\/.+/i,
  638. getImage:function(img){
  639. var src=img.src;
  640. var reg=/^(http:\/\/imgsrc\.baidu\.com\/forum\/)ab(pic\/item\/[\w.]+)/i
  641. var result=src.match(reg);
  642. if(result){
  643. return result[1]+result[2];
  644. }else{
  645. var id=img.id;
  646. if(id.indexOf('big_img_')==0){
  647. return src;
  648. };
  649. };
  650. },
  651. },
  652. {sitename:"178.com",
  653. enabled:true,
  654. url:/^https?:\/\/(?:\w+\.)+178\.com\//i,
  655. clikToOpen:{
  656. enabled:true,
  657. preventDefault:true,
  658. type:'actual',
  659. },
  660. getImage:function(img,a){
  661. if(!a)return;
  662. var reg=/^https?:\/\/(?:\w+\.)+178\.com\/.+?(https?:\/\/img\d*.178.com\/[^.]+\.(?:jpg|jpeg|png|gif|bmp))/i;
  663. var matched=a.href.match(reg);
  664. return (a.href.match(reg) || [])[1];
  665. },
  666. },
  667. ];
  668.  
  669. //通配型规则,无视站点.
  670. var tprules=[
  671. function(img,a){//解决新的dz论坛的原图获取方式.
  672. var reg=/(.+\/attachments?\/.+)\.thumb\.\w{2,5}$/i;
  673. var oldsrc=this.src;
  674. var newsrc=oldsrc.replace(reg,'$1');
  675. if(oldsrc!=newsrc)return newsrc;
  676. },
  677. ];
  678.  
  679. //图标
  680. prefs.icons={
  681. actual:'',
  682. magnifier:'',
  683. current:'',
  684. gallery:'',
  685.  
  686.  
  687. 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=',
  688. 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=',
  689.  
  690. 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==',
  691. 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==',
  692. 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==',
  693. 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',
  694. 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=',
  695. 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=',
  696. 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=',
  697. 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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',
  698.  
  699. 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=',
  700. 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',
  701. 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==',
  702. 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=',
  703. };
  704.  
  705.  
  706. //获取位置
  707. function getTargetPosition(target){
  708. var target=target;
  709. var rect=target.getBoundingClientRect();
  710. var compStyle=getComputedStyle(target,'');
  711. var pFloat=parseFloat;
  712. var t=rect.top + pFloat(compStyle.paddingTop) + pFloat(compStyle.borderTopWidth);
  713. var l=rect.left + pFloat(compStyle.paddingLeft) + pFloat(compStyle.borderLeftWidth);
  714. var r=rect.right - pFloat(compStyle.paddingRight) - pFloat(compStyle.borderRightWidth);
  715. var b=rect.bottom - pFloat(compStyle.paddingBottom) - pFloat(compStyle.borderBottomWidth);
  716. var scrollXY={
  717. x:window.scrollX,
  718. y:window.scrollY,
  719. };
  720. return {
  721. t:t,
  722. l:l,
  723. r:r,
  724. b:b,
  725. top: t + scrollXY.y,
  726. left: l + scrollXY.x,
  727. right: r + scrollXY.x,
  728. bottom: b + scrollXY.y,
  729. };
  730. };
  731.  
  732. //获取窗口大小.
  733. function getWindowSize(){
  734. //window.innerHeight;window.innerWidth;
  735. return {
  736. h:window.innerHeight,
  737. w:window.innerWidth,
  738. };
  739. /*
  740. var de=document.documentElement;
  741. return {
  742. h:document.compatMode=='BackCompat'? document.body.clientHeight : de.clientHeight,
  743. w:de.clientWidth,
  744. };
  745. */
  746. };
  747.  
  748.  
  749. function getCurrentSize(target){//获取页面上显示的图片的宽 高.
  750. var iCS=getComputedStyle(target,'');
  751. return {
  752. h:parseFloat(iCS.height),
  753. w:parseFloat(iCS.width),
  754. };
  755. };
  756.  
  757.  
  758. //xpath 获取单个元素
  759. function getElementByXpath(xpath,contextNode,doc){
  760. doc=doc || document;
  761. contextNode=contextNode || doc;
  762. return doc.evaluate(xpath,contextNode,null,9,null).singleNodeValue;
  763. };
  764.  
  765.  
  766. //事件支持检测.
  767. function eventSupported( eventName,el ){
  768. el = el || document.createElement("div");
  769. eventName = "on" + eventName;
  770. var isSupported = (eventName in el);
  771. if (!isSupported && el.setAttribute) {
  772. el.setAttribute(eventName, "return;");
  773. isSupported = typeof el[eventName] === "function";
  774. };
  775. return isSupported;
  776. };
  777.  
  778.  
  779. //检测属性支持.
  780. function attrSupported(proName,el){
  781. el = el || document.createElement("div");
  782. var isSupported = (proName in el);
  783. return isSupported;
  784. };
  785.  
  786. //css属性支持
  787. function cssProSupported(proName,elem){
  788. var prefix=['','-webkit-','-o-','-moz-','-ms-'];
  789. elem=elem || document.createElement('div');
  790. var style=elem.style;
  791. var camelPro;
  792. for(var i=0,ii=prefix.length;i<ii;i++){
  793. camelPro=(prefix[i]+proName).replace(/-([a-z])/g,function(a,b){
  794. return b.toUpperCase();
  795. });
  796. if(camelPro in style){
  797. return camelPro;
  798. };
  799. };
  800. };
  801.  
  802. //css属性值支持
  803. function cssValueSupported(proName,value,elem){
  804. var prefix=['','-webkit-','-o-','-moz-','-ms-'];
  805. elem=elem || document.createElement('div');
  806. var style=elem.style;
  807. var prefixedValue;
  808. for(var i=0,ii=prefix.length;i<ii;i++){
  809. prefixedValue=prefix[i] + value;
  810. style[proName]=prefixedValue;
  811. if(style[proName]==prefixedValue){
  812. return prefixedValue;
  813. };
  814. };
  815. };
  816.  
  817. //抛出错误到错误控制台
  818. function throwErrorInfo(err){
  819. if(console && console.error){
  820. console.error(err.message + '\n\n' + (err.stacktrace? err.stacktrace : '') + '\n\n' , err);
  821. };
  822. };
  823.  
  824.  
  825. //支持情况.
  826. var support={
  827. cssTransform:cssProSupported('transform'),
  828. cssCursorValue:{
  829. zoomIn:cssValueSupported('cursor','zoom-in'),
  830. zoomOut:cssValueSupported('cursor','zoom-out'),
  831. },
  832. requestFullscreen:(function(){
  833. var array=['webkitRequestFullScreen','mozRequestFullScreen','requestFullscreen'];
  834. var tempEle=document.body;
  835. var ret;
  836. for(var i=array.length-1;i>=0;i--){
  837. ret=array[i];
  838. if(ret in tempEle){
  839. return ret;
  840. };
  841. };
  842. })(),
  843. };
  844.  
  845.  
  846. //console.log('浏览器的一些对象支持情况:',support);
  847.  
  848. //imgReady
  849. var imgReady=(function(){
  850. var iRInterval,
  851. iRReadyFn=[],
  852. isrcs=[]
  853. ;
  854.  
  855. var timeLimit=3 * 60 * 1000;//3分钟
  856.  
  857. function checkReady(){
  858. var now=Date.now();
  859. for(var i=0,ii=iRReadyFn.length,iRReadyFn_i;i<ii;i++){
  860. iRReadyFn_i=iRReadyFn[i];
  861. //now - iRReadyFn_i.startTime >= timeLimit ||
  862. if(iRReadyFn_i()){
  863. iRReadyFn.splice(i,1);
  864. isrcs.splice(i,1);
  865. i--;
  866. ii--;
  867. };
  868. };
  869. //console.log('checkReady',iRReadyFn.length)
  870. if(iRReadyFn.length==0){
  871. clearInterval(iRInterval);
  872. iRInterval=null;
  873. };
  874. };
  875.  
  876.  
  877.  
  878. var imgReady=function(img,opts){
  879.  
  880. if(/NodeList|HTMLCollection/.test(Object.prototype.toString.call(img)) || Array.isArray(img)){
  881. arrayFn.forEach.call(img,function(img,index,array){
  882. if(img instanceof HTMLImageElement){
  883. imgReady(img,opts);
  884. };
  885. });
  886. return;
  887. };
  888.  
  889. if(!(img instanceof HTMLImageElement)){
  890. var t_img=new Image();
  891. t_img.src=img;
  892. img=t_img;
  893. t_img=null;
  894. };
  895.  
  896. var ready,load,error,loadEnd,abort,timeout,time;
  897. ready=opts.ready;
  898. load=opts.load;
  899. error=opts.error;
  900. loadEnd=opts.loadEnd;
  901. abort=opts.abort;
  902. timeout=opts.timeout;
  903. time=typeof opts.time=='number'? opts.time : 0;
  904.  
  905. if(time){
  906. setTimeout(function(){
  907. if(!loadEndDone){
  908. aborted=true;
  909. removeListener();
  910. img.src='data:';
  911. if(timeout){
  912. timeout.call(img,{
  913. target:img,
  914. type:'timeout',
  915. });
  916. };
  917. loadEndDone=true;
  918. if(loadEnd){
  919. loadEnd.call(img,{
  920. target:img,
  921. type:'timeout',
  922. });
  923. };
  924. };
  925. },time);
  926. };
  927.  
  928. var src=img.src;
  929. var loadEndDone;
  930.  
  931. function go(type,e){
  932. switch(type){
  933. case 'load':{
  934. removeListener();
  935. go('ready');//如果直接触发load,那么先触发ready
  936. if(load){
  937. load.call(img,e);
  938. };
  939. loadEndDone=true;
  940. if(loadEnd){
  941. loadEnd.call(img,e);
  942. };
  943. }break;
  944. case 'ready':{
  945. if(!ready || readyHandler.done)return;
  946. readyHandler.done=true;
  947. ready.call(img,{
  948. target:img,
  949. type:'ready',
  950. });
  951. }break;
  952. case 'error':{
  953. removeListener();
  954. if(error){
  955. error.call(img,e);
  956. };
  957. loadEndDone=true;
  958. if(loadEnd){
  959. loadEnd.call(img,e);
  960. };
  961. }break;
  962. };
  963. };
  964.  
  965. var aborted;
  966. var ret={
  967. img:img,
  968. abort:function(){
  969. if(!loadEndDone){
  970. aborted=true;
  971. removeListener();
  972. img.src='data:';
  973. if(abort){
  974. abort.call(img,{
  975. target:img,
  976. type:'abort',
  977. });
  978. };
  979. loadEndDone=true;
  980. if(loadEnd){
  981. loadEnd.call(img,{
  982. target:img,
  983. type:'abort',
  984. });
  985. };
  986. };
  987. },
  988. };
  989.  
  990. function readyHandler(){//尽快的检测图片大小.
  991. if(loadEndDone || aborted)return true;
  992. if(img.naturalWidth==0 || img.naturalHeight==0)return;
  993. go('ready');
  994. return true;
  995. };
  996.  
  997.  
  998. function loadHandler(e){
  999. go('load',e);
  1000. };
  1001.  
  1002. function errorHandler(e){
  1003. go('error',e);
  1004. };
  1005.  
  1006. function removeListener(){
  1007. img.removeEventListener('load',loadHandler,true);
  1008. img.removeEventListener('error',errorHandler,true);
  1009. };
  1010.  
  1011. //ready必须在load之前触发。
  1012.  
  1013. if(img.complete){//图片已经加载完成.
  1014. if(typeof img.width=='number' && img.width && img.height){//图片
  1015. setTimeout(function(){
  1016. if(aborted)return;
  1017. go('load',{
  1018. type:'load',
  1019. target:img,
  1020. });
  1021. },0);
  1022. }else{//这不是图片.opera会识别错误.
  1023. setTimeout(function(){
  1024. if(aborted)return;
  1025. go('error',{
  1026. type:'error',
  1027. target:img,
  1028. });
  1029. },0);
  1030. };
  1031. return ret;
  1032. };
  1033.  
  1034.  
  1035. img.addEventListener('load',loadHandler,true);
  1036. img.addEventListener('error',errorHandler,true);
  1037.  
  1038.  
  1039. if(ready){
  1040. var index=isrcs.indexOf(src);
  1041. if(index==-1){
  1042. isrcs.push(src);
  1043. readyHandler.startTime=Date.now();
  1044. iRReadyFn.push(readyHandler);
  1045. }else{
  1046. iRReadyFn[index].startTime=Date.now();
  1047. };
  1048.  
  1049. if(!iRInterval){
  1050. iRInterval=setInterval(checkReady,66);
  1051. };
  1052. };
  1053.  
  1054. return ret;
  1055. };
  1056.  
  1057. return imgReady;
  1058. })();
  1059.  
  1060.  
  1061. var addWheelEvent=(function(){
  1062. var eventName;
  1063.  
  1064. if('onwheel' in document){//w3c FF>=17 ie>=9
  1065. eventName='wheel';
  1066. }else if('onmousewheel' in document){//ie
  1067. eventName='mousewheel';
  1068. }else{// < FF17
  1069. eventName='DOMMouseScroll';
  1070. };
  1071.  
  1072. return function(ele,callback,useCapture){
  1073. ele.addEventListener(eventName,function(e){
  1074. var type=e.type;
  1075. var ne;
  1076. if(type!='wheel'){
  1077. ne={};
  1078. for(var i in e){
  1079. ne[i]=e[i];
  1080. };
  1081.  
  1082. ne.type='wheel';
  1083. ne.deltaX=0;
  1084. ne.deltaY=0;
  1085. ne.deltaZ=0;
  1086. ne.deltaMode=1;//line
  1087. ne.preventDefault=e.preventDefault.bind(e);
  1088. ne.stopPropagation=e.stopPropagation.bind(e);
  1089.  
  1090. if((typeof e.axis=='number' && e.axis==2) || (typeof e.wheelDeltaY=='number' && e.wheelDeltaY!=0)){//Y轴的滚动
  1091. ne.deltaY = e.wheelDeltaY? -e.wheelDeltaY/40 : e.detail;
  1092. }else{
  1093. ne.deltaX = e.wheelDeltaX? -e.wheelDeltaX/40 : e.detail;
  1094. };
  1095. };
  1096.  
  1097. callback.call(this,ne? ne : e);
  1098. },useCapture || false);
  1099. };
  1100. })();
  1101.  
  1102.  
  1103. var addCusMouseEvent=(function(){
  1104. var tele= document.documentElement || document.createElement('div');
  1105.  
  1106. var support={
  1107. mouseleave:'onmouseleave' in tele,
  1108. mouseenter:'onmouseenter' in tele,
  1109. };
  1110.  
  1111. tele=null;
  1112.  
  1113. var map={
  1114. 'mouseleave':'mouseout',
  1115. 'mouseenter':'mouseover',
  1116. };
  1117.  
  1118. return function(type, ele, fn){//事件类型,元素,监听函数
  1119. type=type.toLowerCase();
  1120. if(support[type]){
  1121. ele.addEventListener(type,fn,false);//mouseleave,enter不冒泡
  1122. }else{
  1123. ele.addEventListener(map[type],function(e){
  1124. var relatedTarget=e.relatedTarget;//mouseout,去往的元素;mouseover,来自的元素
  1125. if(!this.contains(relatedTarget)){
  1126. fn.call(this,e);
  1127. };
  1128. },true);
  1129. };
  1130. };
  1131.  
  1132. })();
  1133.  
  1134.  
  1135.  
  1136. //库
  1137. function GalleryC(){
  1138. this.init();
  1139. };
  1140.  
  1141.  
  1142. var gallery;
  1143. var galleryMode;
  1144. GalleryC.prototype={
  1145. init:function(){
  1146. this.addStyle();
  1147. var container=document.createElement('span');
  1148.  
  1149. this.gallery=container;
  1150. container.className='pv-gallery-container';
  1151. container.tabIndex=1;
  1152. container.innerHTML=''+
  1153. '<span class="pv-gallery-head">'+
  1154. '<span title="弹出照片进行复杂操作" class="pv-gallery-operate">折腾</span>'+
  1155. '<span title="一些命令菜单" class="pv-gallery-commands">命令</span>'+
  1156. '<span title="分享" class="pv-gallery-share">分享</span>'+
  1157. '<span title="Close | Cerrar" class="pv-gallery-close"></span>'+
  1158. '</span>'+
  1159. '<span class="pv-gallery-body">'+
  1160. '<span class="pv-gallery-img-container">'+
  1161. '<span class="pv-gallery-img-container-left-side">'+
  1162. '<span class="pv-gallery-img-controler-pre"></span>'+
  1163. '</span>'+
  1164. '<span class="pv-gallery-img-content">'+
  1165. '<span class="pv-gallery-img-parent"><!--图片放在这个里面--></span>'+
  1166. '<span class="pv-gallery-vertical-align-helper"></span>'+
  1167. '</span>'+
  1168. '<span class="pv-gallery-img-container-right-side">'+
  1169. '<span class="pv-gallery-scrollbar-v pv-gallery-img-scrollbar-v">'+
  1170. '<span class="pv-gallery-scrollbar-v-track pv-gallery-img-scrollbar-v-track">'+
  1171. '<span class="pv-gallery-scrollbar-v-handle pv-gallery-img-scrollbar-v-handle"></span>'+
  1172. '</span>'+
  1173. '</span>'+
  1174. '<span class="pv-gallery-img-controler-next"></span>'+
  1175. '</span>'+
  1176. '<span class="pv-gallery-img-container-bottom-side">'+
  1177. '<span class="pv-gallery-scrollbar-h pv-gallery-img-scrollbar-h">'+
  1178. '<span class="pv-gallery-scrollbar-h-track pv-gallery-img-scrollbar-h-track">'+
  1179. '<span class="pv-gallery-scrollbar-h-handle pv-gallery-img-scrollbar-h-handle"></span>'+
  1180. '</span>'+
  1181. '</span>'+
  1182. '</span>'+
  1183. '</span>'+
  1184. '<span class="pv-gallery-sidebar-container" unselectable="on">'+
  1185. '<span class="pv-gallery-sidebar-content" >'+
  1186. '<span class="pv-gallery-scrollbar-h pv-gallery-thumb-scrollbar-h">'+
  1187. '<span class="pv-gallery-scrollbar-h-track pv-gallery-thumb-scrollbar-h-track">'+
  1188. '<span class="pv-gallery-scrollbar-h-handle pv-gallery-thumb-scrollbar-h-handle"></span>'+
  1189. '</span>'+
  1190. '</span>'+
  1191. '<span class="pv-gallery-sidebar-controler-pre"></span>'+
  1192. '<span class="pv-gallery-sidebar-thumbnails-container">'+
  1193. '<span class="pv-gallery-sidebar-thumbnails">'+
  1194. '<!--用innerHTML写入被span.pv-gallery-sidebar-thumb包裹的img元素,并设置宽度货高度-->'+
  1195. '</span>'+
  1196. '</span>'+
  1197. '<span class="pv-gallery-scrollbar-v pv-gallery-thumb-scrollbar-v">'+
  1198. '<span class="pv-gallery-scrollbar-v-track pv-gallery-thumb-scrollbar-v-track">'+
  1199. '<span class="pv-gallery-scrollbar-v-handle pv-gallery-thumb-scrollbar-v-handle"></span>'+
  1200. '</span>'+
  1201. '</span>'+
  1202. '<span class="pv-gallery-sidebar-controler-next"></span>'+
  1203. '</span>'+
  1204. '</span>'+
  1205. '</span>';
  1206. document.body.appendChild(container);
  1207.  
  1208. var validPos=['top','right','bottom','left'];
  1209. var sBarPosition=prefs.gallery.sidebarPosition.trim();
  1210. if(validPos.indexOf(sBarPosition)==-1){
  1211. sBarPosition='bottom';
  1212. };
  1213.  
  1214. this.sBarPosition=sBarPosition;
  1215. this.selectedClassName='pv-gallery-sidebar-thumb_selected-' + sBarPosition;
  1216.  
  1217.  
  1218. var sBarDirection;
  1219. var isHorizontal=false;
  1220. if(sBarPosition=='top' || sBarPosition=='bottom'){
  1221. sBarDirection='h';//水平放置
  1222. isHorizontal=true;
  1223. }else{
  1224. sBarDirection='v';//垂直放置
  1225. };
  1226. this.sBarDirection=sBarDirection;
  1227. this.isHorizontal=isHorizontal;
  1228.  
  1229. var classPrefix='pv-gallery-';
  1230. var validClass=[
  1231. 'close',
  1232. 'body',
  1233. 'img-container',
  1234.  
  1235. 'img-scrollbar-h',
  1236. 'img-scrollbar-h-handle',
  1237. 'img-scrollbar-h-track',
  1238.  
  1239. 'img-scrollbar-v',
  1240. 'img-scrollbar-v-handle',
  1241. 'img-scrollbar-v-track',
  1242.  
  1243. 'thumb-scrollbar-h',
  1244. 'thumb-scrollbar-h-handle',
  1245. 'thumb-scrollbar-h-track',
  1246.  
  1247. 'thumb-scrollbar-v',
  1248. 'thumb-scrollbar-v-handle',
  1249. 'thumb-scrollbar-v-track',
  1250.  
  1251. 'img-content',
  1252. 'img-parent',
  1253.  
  1254. 'img-controler-pre',
  1255. 'img-controler-next',
  1256.  
  1257. 'sidebar-container',
  1258. 'sidebar-content',
  1259.  
  1260. 'sidebar-controler-pre',
  1261. 'sidebar-controler-next',
  1262.  
  1263. 'sidebar-thumbnails',
  1264. 'sidebar-thumbnails-container',
  1265. ];
  1266.  
  1267. var eleMaps={};
  1268. this.eleMaps=eleMaps;
  1269.  
  1270. validClass.forEach(function(c){
  1271. eleMaps[c]=container.querySelector('.'+ classPrefix + c);
  1272. });
  1273.  
  1274. var posClass=[//需要添加'top bottom left right'class的元素
  1275. 'img-container',
  1276. 'sidebar-container',
  1277. 'sidebar-thumbnails-container',
  1278. ];
  1279. posClass.forEach(function(c){
  1280. eleMaps[c].classList.add(classPrefix + c + '-' +sBarPosition);
  1281. });
  1282.  
  1283. var hvClass=[//需要添加'v h'class的元素
  1284. 'sidebar-container',
  1285. 'sidebar-content',
  1286. 'sidebar-controler-pre',
  1287. 'sidebar-controler-next',
  1288. 'sidebar-thumbnails',
  1289. ];
  1290. hvClass.forEach(function(c){
  1291. eleMaps[c].classList.add(classPrefix + c + '-' + sBarDirection);
  1292. });
  1293.  
  1294.  
  1295.  
  1296. //图片区域水平方向的滚动条
  1297. var imgScrollbarH=new this.Scrollbar({
  1298. bar:eleMaps['img-scrollbar-h'],
  1299. handle:eleMaps['img-scrollbar-h-handle'],
  1300. track:eleMaps['img-scrollbar-h-track'],
  1301. },
  1302. eleMaps['img-parent'],
  1303. eleMaps['img-content'],
  1304. true);
  1305. this.imgScrollbarH=imgScrollbarH;
  1306.  
  1307. //图片区域垂直方向的滚动条
  1308. var imgScrollbarV=new this.Scrollbar({
  1309. bar:eleMaps['img-scrollbar-v'],
  1310. handle:eleMaps['img-scrollbar-v-handle'],
  1311. track:eleMaps['img-scrollbar-v-track'],
  1312. },
  1313. eleMaps['img-parent'],
  1314. eleMaps['img-content'],
  1315. false);
  1316. this.imgScrollbarV=imgScrollbarV;
  1317.  
  1318. //缩略图区域的滚动条
  1319. var thumbScrollbar;
  1320. if(isHorizontal){
  1321. thumbScrollbar=new this.Scrollbar({
  1322. bar:eleMaps['thumb-scrollbar-h'],
  1323. handle:eleMaps['thumb-scrollbar-h-handle'],
  1324. track:eleMaps['thumb-scrollbar-h-track'],
  1325. },
  1326. eleMaps['sidebar-thumbnails'],
  1327. eleMaps['sidebar-thumbnails-container'],
  1328. true);
  1329. }else{
  1330. thumbScrollbar=new this.Scrollbar({
  1331. bar:eleMaps['thumb-scrollbar-v'],
  1332. handle:eleMaps['thumb-scrollbar-v-handle'],
  1333. track:eleMaps['thumb-scrollbar-v-track'],
  1334. },
  1335. eleMaps['sidebar-thumbnails'],
  1336. eleMaps['sidebar-thumbnails-container'],
  1337. false);
  1338. };
  1339. this.thumbScrollbar=thumbScrollbar;
  1340.  
  1341.  
  1342.  
  1343. var self=this;
  1344.  
  1345. eleMaps['sidebar-thumbnails-container'].addEventListener('scroll',function(e){//发生scroll事件时加载缩略图
  1346. self.loadThumb();
  1347. },false);
  1348.  
  1349. addWheelEvent(eleMaps['body'],function(e){//wheel事件
  1350. var target=e.target;
  1351. e.preventDefault();
  1352. if(eleMaps['sidebar-container'].contains(target)){//缩略图区滚动滚轮翻图片
  1353. var distance=self.sideLengthO;
  1354. if(e.deltaY<0 || e.deltaX<0 || e.deltaZ<0){//向上滚
  1355. distance=-distance;
  1356. };
  1357. thumbScrollbar.scrollBy(distance)
  1358. }else{//图片区域滚动
  1359. var distance=100;
  1360. if(e.deltaY!=0){//y轴
  1361. if(e.deltaY < 0){
  1362. distance=-distance;
  1363. };
  1364. imgScrollbarV.scrollBy(distance);
  1365. }else if(e.deltaX!=0){//x轴
  1366. if(e.deltaX < 0){
  1367. distance=-distance;
  1368. };
  1369. imgScrollbarH.scrollBy(distance);
  1370. };
  1371. };
  1372.  
  1373. self.forceRepaint();
  1374. },true);
  1375.  
  1376.  
  1377.  
  1378. var validKeyCode=[38,39,40,37]//上右下左
  1379. var keyUp=true;
  1380. var keyIntervalTimer;
  1381. container.addEventListener('keydown',function(e){//上下左右切换图片
  1382. e.stopPropagation();
  1383. var keyCode=e.keyCode;
  1384. var index=validKeyCode.indexOf(keyCode);
  1385. if(index==-1)return;
  1386. e.preventDefault();
  1387.  
  1388. if(!keyUp)return;//已按下。
  1389. keyUp=false;
  1390.  
  1391. switch(index){
  1392. case 0:;
  1393. case 3:{
  1394. self.selectPrevious();
  1395. keyIntervalTimer=setInterval(function(e){
  1396. self.selectPrevious();
  1397. },800);
  1398. }break;
  1399. case 1:;
  1400. case 2:{
  1401. self.selectNext();
  1402. keyIntervalTimer=setInterval(function(e){
  1403. self.selectNext();
  1404. },800);
  1405. }break;
  1406. };
  1407.  
  1408. function keyUpHandler(e){
  1409. if(e.keyCode!=validKeyCode[index])return;
  1410. this.removeEventListener('keyup',keyUpHandler,false);
  1411. clearInterval(keyIntervalTimer);
  1412. keyUp=true;
  1413. };
  1414. this.addEventListener('keyup',keyUpHandler,false);
  1415.  
  1416. },false);
  1417.  
  1418.  
  1419. var imgDraged;
  1420. eleMaps['img-parent'].addEventListener('mousedown',function(e){//如果图片尺寸大于屏幕的时候按住图片进行拖移
  1421. var target=e.target;
  1422. if(e.button!=0 || target.nodeName!='IMG')return;
  1423. var bigger=target.classList.contains('pv-gallery-img_zoom-out');//如果是大于屏幕
  1424.  
  1425. var oClient={
  1426. x:e.clientX,
  1427. y:e.clientY,
  1428. };
  1429.  
  1430. var oScroll={
  1431. left:self.imgScrollbarH.getScrolled(),
  1432. top:self.imgScrollbarV.getScrolled(),
  1433. };
  1434.  
  1435. var moveHandler=function(e){
  1436. imgDraged=true;
  1437. if(bigger){
  1438. target.style.cursor='pointer';
  1439. self.imgScrollbarV.scroll(oScroll.top-(e.clientY-oClient.y));
  1440. self.imgScrollbarH.scroll(oScroll.left-(e.clientX-oClient.x));
  1441. };
  1442. };
  1443.  
  1444. var upHandler=function(){
  1445. target.style.cursor='';
  1446.  
  1447. //拖曳之后阻止随后可能产生click事件产生的大小切换。
  1448. //确保在随后的click事件发生后执行
  1449. setTimeout(function(){
  1450. imgDraged=false;
  1451. },0);
  1452.  
  1453. document.removeEventListener('mousemove',moveHandler,true);
  1454. document.removeEventListener('mouseup',upHandler,true);
  1455. };
  1456.  
  1457. document.addEventListener('mousemove',moveHandler,true);
  1458. document.addEventListener('mouseup',upHandler,true);
  1459. },true);
  1460.  
  1461. eleMaps['img-parent'].addEventListener('click',function(e){//点击图片本身就行图片缩放处理
  1462.  
  1463. var target=e.target;
  1464. if(e.button!=0 || target.nodeName!='IMG')return;
  1465.  
  1466. if(imgDraged){//在拖动后触发的click事件,取消掉。免得一拖动完就立即进行的缩放。。。
  1467. imgDraged=false;
  1468. return;
  1469. };
  1470.  
  1471. if(target.classList.contains('pv-gallery-img_zoom-in')){//放大
  1472. self.fitContains=false;
  1473. var zoomX = typeof e.offsetX=='undefined' ? e.layerX : e.offsetX;
  1474. var zoomY = typeof e.offsetY=='undefined' ? e.layerY : e.offsetY;
  1475. var scaleX=zoomX/target.clientWidth;
  1476. var scaleY=zoomY/target.clientHeight;
  1477. self.fitToScreen({
  1478. x:scaleX,
  1479. y:scaleY,
  1480. });
  1481. }else if(target.classList.contains('pv-gallery-img_zoom-out')){
  1482. self.fitContains=true;
  1483. self.fitToScreen();
  1484. };
  1485. },true);
  1486.  
  1487. var mouseIntervalTimer;
  1488. container.addEventListener('mousedown',function(e){//鼠标按在导航上,切换图片
  1489. if(e.button!=0)return;//左键
  1490. var target=e.target;
  1491. if(target.nodeName=='IMG')e.preventDefault();
  1492.  
  1493. var matched=true;
  1494. switch(target){
  1495. case eleMaps['img-controler-pre']:;
  1496. case eleMaps['sidebar-controler-pre']:{//上一个
  1497. self.selectPrevious();
  1498. clearInterval(mouseIntervalTimer);
  1499. mouseIntervalTimer=setInterval(function(e){
  1500. self.selectPrevious();
  1501. },800);
  1502. }break;
  1503. case eleMaps['img-controler-next']:;
  1504. case eleMaps['sidebar-controler-next']:{//下一个
  1505. self.selectNext();
  1506. clearInterval(mouseIntervalTimer);
  1507. mouseIntervalTimer=setInterval(function(e){
  1508. self.selectNext();
  1509. },800);
  1510. }break;
  1511. default:{
  1512. matched=false;
  1513. }break;
  1514. };
  1515.  
  1516. function mouseUpHandler(e){//opera,按下左键的时候,按右键然后松开不会触发mouseup,再松开左键,还是不会触发mouseup
  1517. document.removeEventListener('mouseup',mouseUpHandler,true);
  1518. clearInterval(mouseIntervalTimer);
  1519. };
  1520.  
  1521. if(matched){
  1522. e.preventDefault();
  1523. document.addEventListener('mouseup',mouseUpHandler,true);
  1524. };
  1525. },false);
  1526.  
  1527. eleMaps['sidebar-content'].addEventListener('click',function(e){//点击缩略图切换
  1528. if(e.button!=0)return;//左键
  1529. var target=e.target;
  1530. if(!target.dataset['src'])return;
  1531. self.select((target.nodeName=='SPAN'? target : target.parentNode));
  1532. },false);
  1533.  
  1534. eleMaps['close'].addEventListener('click',function(e){//关闭
  1535. self.close();
  1536. },false);
  1537.  
  1538. this._resizeHandler=this.resizeHandler.bind(this);
  1539.  
  1540. this.sideLength=isHorizontal ? eleMaps['sidebar-thumbnails'].clientHeight : eleMaps['sidebar-thumbnails'].clientWidth;
  1541. this.sideLengthO=this.sideLength + 3;//加上margin
  1542.  
  1543. this.thumbSpanStyle=isHorizontal ? ';width:' + this.sideLength +'px;' : ';height:' + this.sideLength +'px;';
  1544.  
  1545. container.style.display='none';
  1546. },
  1547. selectPrevious:function(){
  1548. var pre;
  1549. var _pre=this.selected.previousElementSibling;
  1550. while(_pre){
  1551. if(_pre.clientWidth!=0){
  1552. pre=_pre;
  1553. break;
  1554. };
  1555. _pre=_pre.previousElementSibling;
  1556. };
  1557.  
  1558. this.select(pre);
  1559.  
  1560. },
  1561. selectNext:function(){
  1562. var next;
  1563. var _next=this.selected.nextElementSibling;
  1564. while(_next){
  1565. if(_next.clientWidth!=0){
  1566. next=_next;
  1567. break;
  1568. };
  1569. _next=_next.nextElementSibling;
  1570. };
  1571.  
  1572. this.select(next);
  1573.  
  1574. },
  1575. close:function(){
  1576. galleryMode=false;
  1577. this.gallery.blur();
  1578. this.gallery.style.display='none';
  1579. var des=document.documentElement.style;
  1580. des.overflowX=this.deOverflow.x;
  1581. des.overflowY=this.deOverflow.y;
  1582. window.removeEventListener('resize',this._resizeHandler,true);
  1583. },
  1584. selectedIntoView:function(){
  1585. var thumBC=this.eleMaps['sidebar-thumbnails-container'];
  1586. //需要滚动的距离。
  1587. var needScrollDis=this.isHorizontal ? this.selected.offsetLeft : this.selected.offsetTop;
  1588. //尽可能的居中显示
  1589. var thumBCClient=this.isHorizontal ? thumBC.clientWidth : thumBC.clientHeight;
  1590. var scrollCenter=Math.max((thumBCClient - this.sideLengthO)/2,0);
  1591.  
  1592. needScrollDis=Math.max(needScrollDis-scrollCenter,0);
  1593. this.thumbScrollbar.scroll(needScrollDis);
  1594. },
  1595. select:function(ele){
  1596. if(!ele || this.selected==ele)return;
  1597. if(this.selected){
  1598. this.selected.classList.remove(this.selectedClassName);
  1599. this.selected.classList.remove('pv-gallery-sidebar-thumb_selected');
  1600. };
  1601. ele.classList.add(this.selectedClassName);
  1602. ele.classList.add('pv-gallery-sidebar-thumb_selected');
  1603.  
  1604. this.selected=ele;
  1605.  
  1606. var self=this;
  1607. clearTimeout(this.loadImgTimer);
  1608. this.loadImgTimer=setTimeout(function(){//快速跳转的时候不要尝试读取图片。
  1609. self.loadImg(ele);
  1610. },200);
  1611.  
  1612. this.selectedIntoView();
  1613. this.forceRepaint();
  1614. },
  1615. clear:function(){
  1616.  
  1617. this.allLoading=[];//读取中的图片数组
  1618.  
  1619. this.allImgs={//图片的总类,统计
  1620. rule:{
  1621. shown:true,
  1622. number:0,
  1623. },
  1624. tpRule:{
  1625. shown:true,
  1626. number:0,
  1627. },
  1628. scale:{
  1629. shown:true,
  1630. number:0,
  1631. },
  1632. force:{
  1633. shown:true,
  1634. number:0,
  1635. },
  1636. };
  1637.  
  1638. if(this.img){
  1639. this.img.style.display='none';
  1640. };
  1641.  
  1642. this.img=null;
  1643. this.selected==null;
  1644. this.eleMaps['sidebar-thumbnails'].innerHTML='';
  1645. this.imgScrollbarV.hide();
  1646. this.imgScrollbarH.hide();
  1647. this.thumbScrollbar.hide();
  1648. window.removeEventListener('resize',this._resizeHandler,true);
  1649. },
  1650. load:function(img,data,from){
  1651. this.clear();//还原对象的一些修改,以便复用。
  1652. galleryMode=true;
  1653.  
  1654. var gallery=this.gallery;
  1655. var galleryStyle=gallery.style;
  1656.  
  1657. if(galleryStyle.display=='none'){
  1658. var des=document.documentElement.style;
  1659. this.deOverflow={
  1660. x:des.overflowX,
  1661. y:des.overflowY,
  1662. };
  1663. des.overflow='hidden';
  1664. galleryStyle.display='';
  1665. gallery.focus();
  1666. };
  1667.  
  1668.  
  1669. var imgSrc=img.src;
  1670. var dataSrcs=[];
  1671. var data_i;
  1672. var index;
  1673. var data_i_src;
  1674. for(var i=0,ii=data.length;i<ii;i++){//unique顺便算出img所在data中的index;
  1675. data_i=data[i];
  1676. data_i_src=data_i.src;
  1677. if(dataSrcs.indexOf(data_i_src)!=-1){//已经存在
  1678. data.splice(i,1);//移除
  1679. i--;
  1680. ii--;
  1681. continue;
  1682. };
  1683. dataSrcs.push(data_i_src);
  1684.  
  1685. if(imgSrc==data_i_src){
  1686. index=i;
  1687. };
  1688. };
  1689.  
  1690. if(typeof index =='undefined'){
  1691. index=0;
  1692. data.unshift(data.target);
  1693. };
  1694.  
  1695. //console.log(data);
  1696. this.data=data;
  1697. this.from=from;//如果来自frame,那么这个from应该保存了那个frame的窗口id,便于以后通信。
  1698.  
  1699. var thumbnails=this.eleMaps['sidebar-thumbnails'];
  1700.  
  1701.  
  1702. if(this.isHorizontal){
  1703. thumbnails.style.width=this.sideLengthO * data.length + 'px';//如果是水平放置,需要设置宽度
  1704. };
  1705.  
  1706.  
  1707.  
  1708. var spanMark='';
  1709. var data_i;
  1710. for(var i=0,ii=data.length;i<ii;i++){
  1711. data_i=data[i];
  1712. this.allImgs[data_i.type].number++;
  1713. spanMark +=
  1714. '<span class="pv-gallery-sidebar-thumb-container'+
  1715. '" data-type="' + data_i.type +
  1716. '" data-src="' + data_i.src +
  1717. '" data-img-src="' + data_i.imgSrc +
  1718. '" style="'+ this.thumbSpanStyle +'">'+
  1719. '<span class="pv-gallery-vertical-align-helper"></span>'+
  1720. '<span class="pv-gallery-sidebar-thumb-loading" title="正在读取中......"></span>'+
  1721. '</span>';
  1722. };
  1723. //console.log(this.allImgs);
  1724.  
  1725. thumbnails.innerHTML=spanMark;
  1726.  
  1727. //初始化滚动条
  1728. this.thumbScrollbar.reset();
  1729.  
  1730. this.imgSpans=thumbnails.children;
  1731.  
  1732. this.select(this.imgSpans[index]);
  1733. this.loadThumb();
  1734.  
  1735. //resize监听
  1736. window.addEventListener('resize',this._resizeHandler,true);
  1737. },
  1738. forceRepaint:function(){//解决opera的fixed元素,当滚动条不再最高处的时候,不重绘fixed元素的问题。
  1739. if(envir.opera){
  1740. window.scrollBy(0,1);
  1741. window.scrollBy(0,-1);
  1742. };
  1743. },
  1744. resizeHandler:function(){//窗口变化时,调整一些东西。
  1745. this.fitToScreen();
  1746. this.thumbScrollbar.reset();
  1747. this.selectedIntoView();
  1748. this.loadThumb();
  1749. },
  1750. getImg:function(ele){
  1751. var allLoading=this.allLoading;
  1752.  
  1753. var src=ele.dataset['src']
  1754. var index=allLoading.indexOf(src);
  1755. if(index!=-1){
  1756. allLoading.splice(index,1);
  1757. };
  1758.  
  1759. allLoading.push(src);
  1760.  
  1761.  
  1762. if(this.imgReady && this.img && this.imgReady.img.src!=this.img.src){
  1763. this.imgReady.abort();
  1764. this.imgReady.loadingIndicator.style.removeProperty('display');
  1765. };
  1766.  
  1767.  
  1768. var loadingIndicator=ele.querySelector('.pv-gallery-sidebar-thumb-loading');
  1769. loadingIndicator.style.display='block';
  1770.  
  1771. var self=this;
  1772.  
  1773. this.imgReady=imgReady(src,{
  1774. ready:function(){
  1775. if(allLoading.indexOf(src)!=allLoading.length-1)return;//如果不是最后一张
  1776.  
  1777. loadingIndicator.style.removeProperty('display');
  1778. self.loadImg(this);
  1779. },
  1780. loadEnd:function(){//在loadend后开始预读。
  1781. if(allLoading.indexOf(src)!=allLoading.length-1)return;
  1782. if(self.preloading){//结束上次的预读。
  1783. self.preloading.finish();
  1784. };
  1785. //console.log(this,'预读开始');
  1786. if(prefs.gallery.preload){
  1787. self.preloading=new self.Preload(ele);
  1788. };
  1789. },
  1790. });
  1791.  
  1792. this.imgReady.loadingIndicator=loadingIndicator;
  1793. },
  1794. Preload:function(ele){
  1795. this.ele=ele;
  1796. this.init();
  1797. },
  1798. Scrollbar:function(scrollbar,content,container,isHorizontal){
  1799. this.scrollbar=scrollbar;
  1800. this.content=content;
  1801. this.container=container;
  1802. this.isHorizontal=isHorizontal
  1803. this.init();
  1804. },
  1805. loadImg:function(img){
  1806. if(img.nodeName!='IMG'){//先读取。
  1807. this.getImg(img);
  1808. return;
  1809. };
  1810.  
  1811. if(this.img){
  1812. this.img.style.display='none';
  1813. };
  1814.  
  1815. this.img=img;
  1816. img.className='pv-gallery-img';
  1817. this.eleMaps['img-parent'].appendChild(img);
  1818. this.fitContains=prefs.gallery.fitToScreen;//适应屏幕
  1819. this.fitToScreen();
  1820. },
  1821. fitToScreen:function(scale){
  1822.  
  1823. var container=this.eleMaps['img-content'];
  1824. var containerSize={
  1825. h:container.clientHeight,
  1826. w:container.clientWidth,
  1827. };
  1828.  
  1829. var img=this.img;
  1830. img.classList.remove('pv-gallery-img_zoom-in');
  1831. img.classList.remove('pv-gallery-img_zoom-out');
  1832. img.removeAttribute('height');
  1833. img.removeAttribute('width');
  1834.  
  1835. var content=this.eleMaps['img-parent'];
  1836. var contentSize={
  1837. w:content.offsetWidth,
  1838. h:content.offsetHeight,
  1839. };
  1840.  
  1841. var larger=contentSize.w > containerSize.w || contentSize.h > containerSize.h;
  1842.  
  1843. if(this.fitContains){//适应屏幕
  1844. this.imgScrollbarV.hide();
  1845. this.imgScrollbarH.hide();
  1846. if(larger){
  1847. img.classList.add('pv-gallery-img_zoom-in');
  1848. if(contentSize.h/contentSize.w >=containerSize.h/containerSize.w){
  1849. img.height=containerSize.h-20;//20是父元素padding之和
  1850. }else{
  1851. img.width=containerSize.w-20;
  1852. };
  1853. };
  1854. }else{//不做尺寸调整,如果大于屏幕就出现滚动条
  1855. this.imgScrollbarV.reset();
  1856. this.imgScrollbarH.reset();
  1857. if(larger){
  1858. img.classList.add('pv-gallery-img_zoom-out');
  1859. if(scale){//通过鼠标点击进行的切换。
  1860. this.imgScrollbarH.scroll(container.scrollWidth * scale.x - containerSize.w/2);
  1861. this.imgScrollbarV.scroll(container.scrollHeight * scale.y - containerSize.h/2);
  1862. };
  1863. };
  1864. };
  1865. },
  1866. loadThumb:function(){//读取可视范围里面的缩略图
  1867.  
  1868. var self=this;
  1869.  
  1870. function ready(){
  1871. var naturalSize={
  1872. h:this.naturalHeight,
  1873. w:this.naturalWidth,
  1874. };
  1875. var style=this.style;
  1876. style.removeProperty('width');
  1877. style.removeProperty('height');
  1878. if(naturalSize.h > self.sideLength || naturalSize.w > self.sideLength){
  1879. if(naturalSize.h>=naturalSize.w){
  1880. style.height='100%';
  1881. }else{
  1882. style.width='100%';
  1883. };
  1884. };
  1885. self.forceRepaint();
  1886. };
  1887.  
  1888.  
  1889. var thumBC=this.eleMaps['sidebar-thumbnails-container'];
  1890. var scrolled=this.isHorizontal ? thumBC.scrollLeft : thumBC.scrollTop;
  1891. var thumBCClient=this.isHorizontal ? thumBC.clientWidth : thumBC.clientHeight;
  1892.  
  1893. var loadDis=scrolled - this.sideLengthO;
  1894. var loadIndex=Math.floor(scrolled/this.sideLengthO);//至少从第几张开始读取。
  1895. var loadStopDis=scrolled + thumBCClient;
  1896.  
  1897. var imgSpans=this.imgSpans;
  1898. var span_i;
  1899. var pro=this.isHorizontal ? 'offsetLeft' : 'offsetTop';
  1900. var proValue;
  1901. var thumb;
  1902.  
  1903. for(var i=loadIndex,ii=imgSpans.length;i<ii;i++){
  1904. span_i=imgSpans[i];
  1905. if(span_i.clientWidth==0)continue;//隐藏的
  1906.  
  1907. proValue=span_i[pro];
  1908. if(proValue <= loadDis)continue;//在滚动条上面了
  1909. if(proValue >= loadStopDis)break;//在滚动条下面了
  1910.  
  1911. if(span_i.dataset['loaded'])continue;//已经加载了缩略图
  1912.  
  1913. thumb=new Image();
  1914. thumb.src=span_i.dataset['imgSrc']; //+ '?' +Math.random();
  1915. thumb.style.cssText='\
  1916. height:100%;\
  1917. width:100%;\
  1918. ';
  1919. thumb.className='pv-gallery-sidebar-thumb';
  1920.  
  1921. //GM环境下的dataset可读不可写。。
  1922. thumb.setAttribute('data-src',span_i.dataset['src']);
  1923. span_i.setAttribute('data-loaded','true');
  1924.  
  1925. span_i.appendChild(thumb);
  1926. imgReady(thumb,{
  1927. ready:ready,
  1928. });
  1929. };
  1930.  
  1931. },
  1932. addStyle:function(){
  1933. var style=document.createElement('style');
  1934. style.type='text/css';
  1935. style.textContent='\
  1936. .pv-gallery-container {\
  1937. position: fixed;\
  1938. top: 0;\
  1939. left: 0;\
  1940. width: 100%;\
  1941. height: 100%;\
  1942. padding: 0;\
  1943. margin: 0;\
  1944. border: none;\
  1945. z-index:899999999;\
  1946. background-color: transparent;\
  1947. }\
  1948. .pv-gallery-container span{\
  1949. -moz-box-sizing: border-box;\
  1950. box-sizing: border-box;\
  1951. }\
  1952. .pv-gallery-head {\
  1953. position: absolute;\
  1954. top: 0;\
  1955. left: 0;\
  1956. width: 100%;\
  1957. height:26px;\
  1958. z-index:1;\
  1959. background-color:rgba(0,0,0,0.96);\
  1960. border:none;\
  1961. border-bottom:1px solid #333333;\
  1962. }\
  1963. .pv-gallery-operate,\
  1964. .pv-gallery-commands,\
  1965. .pv-gallery-share{\
  1966. color:#ccc;\
  1967. display:none;\
  1968. }\
  1969. .pv-gallery-close{\
  1970. cursor:pointer;\
  1971. position:absolute;\
  1972. top:0;\
  1973. right:0;\
  1974. height:100%;\
  1975. width:40px;\
  1976. border:none;\
  1977. border-left: 1px solid #333333;\
  1978. opacity:0.6;\
  1979. background:transparent no-repeat center;\
  1980. background-image:url("'+prefs.icons.loadingCancle+'");\
  1981. }\
  1982. .pv-gallery-close:hover{\
  1983. opacity:1;\
  1984. }\
  1985. .pv-gallery-body {\
  1986. display: block;\
  1987. height: 100%;\
  1988. width: 100%;\
  1989. margin: 0;\
  1990. padding: 0;\
  1991. border: none;\
  1992. border-top: 26px solid transparent;\
  1993. position: relative;\
  1994. background-clip: padding-box;\
  1995. }\
  1996. .pv-gallery-img-container {\
  1997. display: block;\
  1998. padding: 0;\
  1999. margin: 0;\
  2000. border: none;\
  2001. height: 100%;\
  2002. width: 100%;\
  2003. background-clip: padding-box;\
  2004. background-color: rgba(20,20,20,0.96);\
  2005. position:relative;\
  2006. }\
  2007. .pv-gallery-img-container-top {\
  2008. border-top: '+ prefs.gallery.sidebarSize +'px solid transparent;\
  2009. }\
  2010. .pv-gallery-img-container-right {\
  2011. border-right: '+ prefs.gallery.sidebarSize +'px solid transparent;\
  2012. }\
  2013. .pv-gallery-img-container-bottom {\
  2014. border-bottom: '+ prefs.gallery.sidebarSize +'px solid transparent;\
  2015. }\
  2016. .pv-gallery-img-container-left {\
  2017. border-left: '+ prefs.gallery.sidebarSize +'px solid transparent;\
  2018. }\
  2019. .pv-gallery-img-container-left-side,\
  2020. .pv-gallery-img-container-right-side{\
  2021. position:absolute;\
  2022. height:100%;\
  2023. top:0;\
  2024. z-index:2;\
  2025. }\
  2026. .pv-gallery-img-container-left-side{\
  2027. left:0;\
  2028. }\
  2029. .pv-gallery-img-container-right-side{\
  2030. right:0;\
  2031. }\
  2032. .pv-gallery-img-container-bottom-side{\
  2033. position:absolute;\
  2034. width:100%;\
  2035. left:0;\
  2036. bottom:0;\
  2037. z-index:2;\
  2038. }\
  2039. .pv-gallery-img-controler-pre,\
  2040. .pv-gallery-img-controler-next{\
  2041. position:absolute;\
  2042. top:50%;\
  2043. height:120px;\
  2044. width:50px;\
  2045. margin-top:-60px;\
  2046. cursor:pointer;\
  2047. opacity:0.3;\
  2048. }\
  2049. .pv-gallery-img-controler-pre{\
  2050. background:rgba(70,70,70,0.5) url("'+prefs.icons.arrowLeft+'") no-repeat center;\
  2051. left:10px;\
  2052. }\
  2053. .pv-gallery-img-controler-next{\
  2054. background:rgba(70,70,70,0.5) url("'+prefs.icons.arrowRight+'") no-repeat center;\
  2055. right:10px;\
  2056. }\
  2057. .pv-gallery-img-controler-pre:hover,\
  2058. .pv-gallery-img-controler-next:hover{\
  2059. opacity:0.8;\
  2060. }\
  2061. /*滚动条样式--开始*/\
  2062. .pv-gallery-scrollbar-h,\
  2063. .pv-gallery-scrollbar-v{\
  2064. display:none;\
  2065. position:relative;\
  2066. z-index:1;\
  2067. opacity:0.6;\
  2068. }\
  2069. .pv-gallery-thumb-scrollbar-v,\
  2070. .pv-gallery-thumb-scrollbar-h{\
  2071. position:absolute;\
  2072. }\
  2073. .pv-gallery-scrollbar-h:hover,\
  2074. .pv-gallery-scrollbar-v:hover{\
  2075. opacity:0.95;\
  2076. }\
  2077. .pv-gallery-scrollbar-h{\
  2078. width:100%;\
  2079. overflow:hidden;\
  2080. padding:0;\
  2081. padding-left:2px;\
  2082. padding-right:16px;\
  2083. }\
  2084. .pv-gallery-scrollbar-v{\
  2085. height:100%;\
  2086. padding:0;\
  2087. padding-top:2px;\
  2088. padding-bottom:16px;\
  2089. }\
  2090. .pv-gallery-thumb-scrollbar-h{\
  2091. bottom:0;\
  2092. left:0;\
  2093. padding:0 2px;\
  2094. }\
  2095. .pv-gallery-thumb-scrollbar-v{\
  2096. right:0;\
  2097. top:0;\
  2098. padding:2px 0;\
  2099. }\
  2100. .pv-gallery-scrollbar-h-track,\
  2101. .pv-gallery-scrollbar-v-track{\
  2102. position:relative;\
  2103. display:block;\
  2104. background-color:rgba(100,100,100,1);\
  2105. }\
  2106. .pv-gallery-scrollbar-h-track{\
  2107. margin:5px 0;\
  2108. height:10px;\
  2109. width:100%;\
  2110. }\
  2111. .pv-gallery-scrollbar-h:hover .pv-gallery-scrollbar-h-track{\
  2112. height:16px;\
  2113. }\
  2114. .pv-gallery-scrollbar-v-track{\
  2115. height:100%;\
  2116. width:10px;\
  2117. margin:0 5px;\
  2118. }\
  2119. .pv-gallery-scrollbar-v:hover .pv-gallery-scrollbar-v-track{\
  2120. width:16px;\
  2121. }\
  2122. .pv-gallery-scrollbar-h-handle,\
  2123. .pv-gallery-scrollbar-v-handle{\
  2124. position:absolute;\
  2125. background-color:black;\
  2126. }\
  2127. .pv-gallery-scrollbar-h-handle:hover,\
  2128. .pv-gallery-scrollbar-v-handle:hover{\
  2129. background-color:#502121;\
  2130. }\
  2131. .pv-gallery-scrollbar-h-handle:active,\
  2132. .pv-gallery-scrollbar-v-handle:active{\
  2133. background-color:#391A1A;\
  2134. }\
  2135. .pv-gallery-scrollbar-h-handle{\
  2136. height:100%;\
  2137. width:20px;\
  2138. left:10px;\
  2139. top:0;\
  2140. }\
  2141. .pv-gallery-scrollbar-v-handle{\
  2142. height:20px;\
  2143. width:100%;\
  2144. top:10px;\
  2145. left:0;\
  2146. }\
  2147. /*滚动条样式--结束*/\
  2148. .pv-gallery-img-content{\
  2149. display:block;\
  2150. width:100%;\
  2151. height:100%;\
  2152. overflow:hidden;\
  2153. text-align:center;\
  2154. padding:0;\
  2155. border:none;\
  2156. margin:0;\
  2157. line-height:0;\
  2158. font-size:0;\
  2159. white-space:nowrap;\
  2160. }\
  2161. .pv-gallery-img-parent{\
  2162. display:inline-block;\
  2163. vertical-align:middle;\
  2164. padding:10px;\
  2165. border:none;\
  2166. margin:0;\
  2167. line-height:0;\
  2168. font-size:0;\
  2169. }\
  2170. .pv-gallery-img{\
  2171. box-shadow:0 0 10px rgba(0,0,0,0.6);\
  2172. display:inline-block;\
  2173. vertical-align:middle;\
  2174. padding:0;\
  2175. border:none;\
  2176. margin:0;\
  2177. }\
  2178. .pv-gallery-img_zoom-out{\
  2179. cursor:'+support.cssCursorValue.zoomOut+';\
  2180. }\
  2181. .pv-gallery-img_zoom-in{\
  2182. cursor:'+support.cssCursorValue.zoomIn+';\
  2183. }\
  2184. .pv-gallery-sidebar-container {\
  2185. position: absolute;\
  2186. background-color:rgba(0,0,0,0.96);\
  2187. padding:10px;\
  2188. border:none;\
  2189. margin:none;\
  2190. -o-user-select: none;\
  2191. -webkit-user-select: none;\
  2192. -moz-user-select: -moz-none;\
  2193. user-select: none;\
  2194. }\
  2195. .pv-gallery-sidebar-container-h {\
  2196. height: '+ prefs.gallery.sidebarSize +'px;\
  2197. width: 100%;\
  2198. }\
  2199. .pv-gallery-sidebar-container-v {\
  2200. width: '+ prefs.gallery.sidebarSize +'px;\
  2201. height: 100%;\
  2202. }\
  2203. .pv-gallery-sidebar-container-top {\
  2204. top: 0;\
  2205. left: 0;\
  2206. border-bottom:1px solid #333333;\
  2207. }\
  2208. .pv-gallery-sidebar-container-right {\
  2209. top: 0;\
  2210. right: 0;\
  2211. border-left:1px solid #333333;\
  2212. }\
  2213. .pv-gallery-sidebar-container-bottom {\
  2214. bottom: 0;\
  2215. left: 0;\
  2216. border-top:1px solid #333333;\
  2217. }\
  2218. .pv-gallery-sidebar-container-left {\
  2219. top: 0;\
  2220. left: 0;\
  2221. border-right:1px solid #333333;\
  2222. }\
  2223. .pv-gallery-sidebar-content {\
  2224. display: block;\
  2225. margin: 0;\
  2226. padding: 0;\
  2227. border: 0;\
  2228. background-clip: padding-box;\
  2229. position: relative;\
  2230. }\
  2231. .pv-gallery-sidebar-content-h {\
  2232. height: 100%;\
  2233. width: 90%;\
  2234. margin-left: auto;\
  2235. margin-right: auto;\
  2236. border-left: 40px solid transparent;\
  2237. border-right: 40px solid transparent;\
  2238. }\
  2239. .pv-gallery-sidebar-content-v {\
  2240. height: 90%;\
  2241. width: 100%;\
  2242. top: 5%;\
  2243. border-top: 40px solid transparent;\
  2244. border-bottom: 40px solid transparent;\
  2245. }\
  2246. .pv-gallery-sidebar-controler-pre,\
  2247. .pv-gallery-sidebar-controler-next{\
  2248. cursor:pointer;\
  2249. position:absolute;\
  2250. background:rgba(255,255,255,0.1) no-repeat center;\
  2251. }\
  2252. .pv-gallery-sidebar-controler-pre-h,\
  2253. .pv-gallery-sidebar-controler-next-h{\
  2254. top:2px;\
  2255. width:36px;\
  2256. height:100%;\
  2257. }\
  2258. .pv-gallery-sidebar-controler-pre-v,\
  2259. .pv-gallery-sidebar-controler-next-v{\
  2260. left:2px;\
  2261. width:100%;\
  2262. height:36px;\
  2263. }\
  2264. .pv-gallery-sidebar-controler-pre-h {\
  2265. left: -40px;\
  2266. background-image: url("'+prefs.icons.arrowLeft+'");\
  2267. }\
  2268. .pv-gallery-sidebar-controler-next-h {\
  2269. right: -40px;\
  2270. background-image: url("'+prefs.icons.arrowRight+'");\
  2271. }\
  2272. .pv-gallery-sidebar-controler-pre-h:hover{\
  2273. box-shadow:inset 22px 0 0 rgba(255,255,255,0.2) ,inset -14px 0 0 rgba(0,0,0,0.2);\
  2274. }\
  2275. .pv-gallery-sidebar-controler-next-h:hover{\
  2276. box-shadow:inset -22px 0 0 rgba(255,255,255,0.2),inset 14px 0 0 rgba(0,0,0,0.2);\
  2277. }\
  2278. .pv-gallery-sidebar-controler-pre-v {\
  2279. top: -40px;\
  2280. background-image: url("'+prefs.icons.arrowTop+'");\
  2281. }\
  2282. .pv-gallery-sidebar-controler-next-v {\
  2283. bottom: -40px;\
  2284. background-image: url("'+prefs.icons.arrowBottom+'");\
  2285. }\
  2286. .pv-gallery-sidebar-controler-pre-v:hover{\
  2287. box-shadow:inset 0 22px 0 rgba(255,255,255,0.2) ,inset 0 -14px 0 rgba(0,0,0,0.2);\
  2288. }\
  2289. .pv-gallery-sidebar-controler-next-v:hover{\
  2290. box-shadow:inset 0 -22px 0 rgba(255,255,255,0.2),inset 0 14px 0 rgba(0,0,0,0.2);\
  2291. }\
  2292. .pv-gallery-sidebar-thumbnails-container {\
  2293. display: block;\
  2294. overflow: hidden;\
  2295. height: 100%;\
  2296. width: 100%;\
  2297. margin:0;\
  2298. border:none;\
  2299. padding:0;\
  2300. }\
  2301. .pv-gallery-sidebar-thumbnails-container-top {\
  2302. padding-bottom:5px;\
  2303. }\
  2304. .pv-gallery-sidebar-thumbnails-container-right {\
  2305. padding-left:5px;\
  2306. }\
  2307. .pv-gallery-sidebar-thumbnails-container-bottom {\
  2308. padding-top:5px;\
  2309. }\
  2310. .pv-gallery-sidebar-thumbnails-container-left {\
  2311. padding-right:5px;\
  2312. }\
  2313. .pv-gallery-sidebar-thumbnails {\
  2314. position:relative;\
  2315. display: block;\
  2316. padding: 0;\
  2317. margin: 0;\
  2318. border: none;\
  2319. line-height:0;/*竖列时消除inline-block元素的行高*/\
  2320. }\
  2321. .pv-gallery-sidebar-thumbnails-h {\
  2322. height: 100%;\
  2323. }\
  2324. .pv-gallery-sidebar-thumbnails-v {\
  2325. width: 100%;\
  2326. }\
  2327. .pv-gallery-sidebar-thumb-container {\
  2328. display:inline-block;\
  2329. text-align: center;\
  2330. border:2px solid rgb(52,52,52);\
  2331. cursor:pointer;\
  2332. position:relative;\
  2333. padding:2px;\
  2334. font-size:0;\
  2335. line-height:0;\
  2336. /*强制图片后面作为vertical-align参考的字符不换行,以防vertical-align:middle达不到预期效果*/\
  2337. white-space:nowrap;\
  2338. }\
  2339. .pv-gallery-sidebar-container-h .pv-gallery-sidebar-thumb-container {\
  2340. margin:0 3px 0 0;\
  2341. height:100%;\
  2342. }\
  2343. .pv-gallery-sidebar-container-v .pv-gallery-sidebar-thumb-container {\
  2344. margin:0 0 3px 0;\
  2345. width:100%;\
  2346. }\
  2347. .pv-gallery-sidebar-thumb-container:hover {\
  2348. border:2px solid rgb(57,149,211);\
  2349. }\
  2350. .pv-gallery-sidebar-thumb_selected {\
  2351. border:2px solid rgb(229,59,62);\
  2352. }\
  2353. .pv-gallery-sidebar-thumb_selected-top {\
  2354. bottom:-5px;\
  2355. }\
  2356. .pv-gallery-sidebar-thumb_selected-right {\
  2357. left:-5px;\
  2358. }\
  2359. .pv-gallery-sidebar-thumb_selected-bottom {\
  2360. top:-5px;\
  2361. }\
  2362. .pv-gallery-sidebar-thumb_selected-left {\
  2363. right:-5px;\
  2364. }\
  2365. .pv-gallery-sidebar-thumb-loading{\
  2366. position:absolute;\
  2367. top:0;\
  2368. left:0;\
  2369. width:100%;\
  2370. height:100%;\
  2371. display:none;\
  2372. opacity:0.5;\
  2373. background:black url("'+ prefs.icons.loading + '") no-repeat center ;\
  2374. }\
  2375. .pv-gallery-sidebar-thumb-loading:hover{\
  2376. opacity:0.6;\
  2377. }\
  2378. .pv-gallery-sidebar-thumb {\
  2379. display: inline-block;\
  2380. vertical-align: middle;\
  2381. }\
  2382. .pv-gallery-vertical-align-helper{\
  2383. display:inline-block;\
  2384. vertical-align:middle;\
  2385. width:0;\
  2386. height:100%;\
  2387. margin:0;\
  2388. border:0;\
  2389. padding:0;\
  2390. visibility:hidden;\
  2391. white-space:nowrap;\
  2392. }\
  2393. ';
  2394. document.querySelector('head').appendChild(style);
  2395. },
  2396. };
  2397.  
  2398. GalleryC.prototype.Preload.prototype={//预读对象
  2399. container:(function(){
  2400. var div=document.createElement('div');
  2401. div.className='pv-gallery-preloaded-img-container';
  2402. div.style.display='none';
  2403. document.body.appendChild(div);
  2404. return div;
  2405. })(),
  2406. init:function(){
  2407. this.max=prefs.gallery.max;
  2408. this.nextNumber=0;
  2409. this.nextEle=this.ele;
  2410. this.preNumber=0;
  2411. this.preEle=this.ele;
  2412. this.direction='pre';
  2413. this.preload();
  2414. },
  2415. preload:function(){
  2416. var ele=this.getPreloadEle();
  2417. if(!ele){
  2418. //conole.log('预读正常结束');
  2419. return;
  2420. };
  2421.  
  2422. //conole.log('正在预读:',ele);
  2423. var self=this;
  2424. this.imgReady=imgReady(ele.dataset['src'],{
  2425. loadEnd:function(){
  2426. if(self.finished){
  2427. //conole.log('强制终止了');
  2428. return;
  2429. };
  2430. ele.setAttribute('data-preloaded','true');
  2431. self.container.appendChild(this);
  2432. self.preload();
  2433. },
  2434. time:60 * 1000,//限时一分钟,否则强制结束并开始预读下一张。
  2435. });
  2436. },
  2437. getPreloadEle:function(){
  2438. if((this.max<=this.nextNumber && this.max<=this.preNumber) || (!this.nextEle && !this.preEle)){
  2439. return;
  2440. };
  2441. var ele=this.direction=='pre'? this.getNext() : this.getPrevious();
  2442. if(ele && !ele.dataset['preloaded']){
  2443. return ele;
  2444. }else{
  2445. return this.getPreloadEle();
  2446. };
  2447. },
  2448. getNext:function(){
  2449. this.nextNumber++;
  2450. this.direction='next';
  2451. if(!this.nextEle)return;
  2452.  
  2453. var next;
  2454. var _next=this.nextEle.nextElementSibling;
  2455. while(_next){
  2456. if(_next.clientWidth!=0){
  2457. next=_next;
  2458. break;
  2459. };
  2460. _next=_next.nextElementSibling;
  2461. };
  2462. this.nextEle=next;
  2463. return next;
  2464. },
  2465. getPrevious:function(){
  2466. this.preNumber++;
  2467. this.direction='pre';
  2468. if(!this.preEle)return;
  2469.  
  2470. var pre;
  2471. var _pre=this.preEle.previousElementSibling;
  2472. while(_pre){
  2473. if(_pre.clientWidth!=0){
  2474. pre=_pre;
  2475. break;
  2476. };
  2477. _pre=_pre.previousElementSibling;
  2478. };
  2479. this.preEle=pre;
  2480. return pre;
  2481. },
  2482. finish:function(){
  2483. this.finished=true;
  2484. if(this.imgReady){
  2485. this.imgReady.abort();
  2486. };
  2487. },
  2488. };
  2489.  
  2490. GalleryC.prototype.Scrollbar.prototype={//滚动条对象
  2491. init:function(){
  2492. var self=this;
  2493. this.scrollbar.bar.addEventListener('mousedown',function(e){//点击滚动条区域,该干点什么!
  2494. e.preventDefault();
  2495. var target=e.target;
  2496. var handle=self.scrollbar.handle;
  2497. var track=self.scrollbar.track;
  2498. switch(target){
  2499. case handle:{//手柄;功能,拖动手柄来滚动窗口
  2500. var pro=self.isHorizontal ? ['left','clientX'] : ['top','clientY'];
  2501. var oHOffset=parseFloat(handle.style[pro[0]]);
  2502. var oClient=e[pro[1]];
  2503.  
  2504. var moveHandler=function(e){
  2505. self.scroll(oHOffset + e[pro[1]] - oClient,true);
  2506. };
  2507. var upHandler=function(){
  2508. document.removeEventListener('mousemove',moveHandler,true);
  2509. document.removeEventListener('mouseup',upHandler,true);
  2510. };
  2511. document.addEventListener('mousemove',moveHandler,true);
  2512. document.addEventListener('mouseup',upHandler,true);
  2513. }break;
  2514. case track:{//轨道;功能,按住不放来连续滚动一个页面的距离
  2515. var pro=self.isHorizontal ? ['left','offsetX','layerX','clientWidth','offsetWidth'] : ['top' , 'offsetY' ,'layerY','clientHeight','offsetHeight'];
  2516. var clickOffset=typeof e[pro[1]]=='undefined' ? e[pro[2]] : e[pro[1]];
  2517. var handleOffset=parseFloat(handle.style[pro[0]]);
  2518. var handleSize=handle[pro[4]];
  2519. var under= clickOffset > handleOffset ;//点击在滚动手柄的下方
  2520. var containerSize=self.container[pro[3]];
  2521.  
  2522. var scroll=function(){
  2523. self.scrollBy(under? (containerSize - 10) : (-containerSize + 10));//滚动一个页面距离少一点
  2524. };
  2525. scroll();
  2526.  
  2527. var checkStop=function(){//当手柄到达点击位置时停止
  2528. var handleOffset=parseFloat(handle.style[pro[0]]);
  2529. if(clickOffset >= handleOffset && clickOffset <= (handleOffset + handleSize)){
  2530. clearInterval(scrollInterval);
  2531. };
  2532. };
  2533.  
  2534. var scrollInterval=setInterval(function(){
  2535. scroll();
  2536. checkStop();
  2537. },300);
  2538.  
  2539. checkStop();
  2540.  
  2541. var upHandler=function(){
  2542. clearInterval(scrollInterval);
  2543. document.removeEventListener('mouseup',upHandler,true);
  2544. };
  2545. document.addEventListener('mouseup',upHandler,true);
  2546. }break;
  2547. };
  2548. },true);
  2549. },
  2550. reset:function(){//判断滚动条该显示还是隐藏
  2551. var contentPro,containerPro,trackPro,handlePro;
  2552.  
  2553. if(this.isHorizontal){
  2554. contentPro='offsetWidth';
  2555. containerPro='clientWidth';
  2556. handlePro='width';
  2557. trackPro='clientWidth';
  2558. }else{
  2559. contentPro='offsetHeight';
  2560. containerPro='clientHeight';
  2561. handlePro='height';
  2562. trackPro='clientHeight';
  2563. };
  2564. //如果内容大于容器的content区域
  2565. var contentSize=this.content[contentPro];
  2566. var containerSize=this.container[containerPro];
  2567. if(contentSize > containerSize){
  2568. this.show();
  2569. var trackSize=this.scrollbar.track[trackPro];
  2570. this.trackSize=trackSize;
  2571. var handleSize=Math.floor((containerSize/contentSize) * trackSize);
  2572. handleSize=Math.max(20,handleSize);//限制手柄的最小大小;
  2573. this.handleSize=handleSize;
  2574. this.one=(trackSize-handleSize) / (contentSize-containerSize);//一个像素对应的滚动条长度
  2575. this.scrollbar.handle.style[handlePro]= handleSize + 'px';
  2576. this.scroll(this.getScrolled());
  2577. }else{
  2578. this.hide();
  2579. };
  2580. },
  2581. show:function(){
  2582. this.scrollbar.bar.style.display='block';
  2583. this.shown=true;
  2584. },
  2585. hide:function(){
  2586. this.scrollbar.bar.style.display='none';
  2587. this.shown=false;
  2588. },
  2589. scrollBy:function(distance,handleDistance){
  2590. this.scroll(this.getScrolled() + (handleDistance? distance / this.one : distance));
  2591. },
  2592. scroll:function(distance,handleDistance){
  2593. if(!this.shown)return;
  2594.  
  2595. var pro;
  2596.  
  2597. //滚动实际滚动条
  2598. var _distance=distance;
  2599. _distance=handleDistance? distance / this.one : distance;
  2600. if(this.isHorizontal){
  2601. pro='left';
  2602. this.container.scrollLeft=_distance;
  2603. }else{
  2604. pro='top';
  2605. this.container.scrollTop=_distance;
  2606. };
  2607.  
  2608. //滚动虚拟滚动条
  2609. //根据比例转换为滚动条上应该滚动的距离。
  2610. distance=handleDistance? distance : this.one * distance;
  2611. //处理非法值
  2612. distance=Math.max(0,distance);//如果值小于0那么取0
  2613. distance=Math.min(distance,this.trackSize - this.handleSize);//大于极限值,取极限值
  2614. this.scrollbar.handle.style[pro]=distance + 'px';
  2615. },
  2616. getScrolled:function(){
  2617. if(this.isHorizontal){
  2618. return this.container.scrollLeft;
  2619. }else{
  2620. return this.container.scrollTop;
  2621. };
  2622. },
  2623. };
  2624.  
  2625.  
  2626. //放大镜
  2627. function MagnifierC(img,data){
  2628. this.img=img;
  2629. this.data=data;
  2630. this.init();
  2631. };
  2632.  
  2633. MagnifierC.all=[];
  2634. MagnifierC.styleZIndex=900000000;//全局z-index;
  2635. MagnifierC.zoomRange=prefs.magnifier.wheelZoom.range.slice(0).sort();//升序
  2636. MagnifierC.zoomRangeR=MagnifierC.zoomRange.slice(0).reverse();//降序
  2637.  
  2638. MagnifierC.prototype={
  2639. init:function(){
  2640. this.addStyle();
  2641. MagnifierC.all.push(this);
  2642. var container=document.createElement('span');
  2643.  
  2644. container.className='pv-magnifier-container';
  2645. document.body.appendChild(container);
  2646.  
  2647. this.magnifier=container;
  2648.  
  2649. var imgNaturalSize={
  2650. h:this.img.naturalHeight,
  2651. w:this.img.naturalWidth,
  2652. };
  2653.  
  2654. this.imgNaturalSize=imgNaturalSize;
  2655.  
  2656. var cs=container.style;
  2657. cs.zIndex=MagnifierC.styleZIndex++;
  2658.  
  2659.  
  2660.  
  2661. var maxDia=Math.ceil(Math.sqrt(Math.pow(1/2*imgNaturalSize.w,2) + Math.pow(1/2*imgNaturalSize.h,2)) * 2);
  2662. this.maxDia=maxDia;
  2663.  
  2664. var radius=prefs.magnifier.radius;
  2665. radius=Math.min(maxDia/2,radius);
  2666. this.radius=radius;
  2667. var diameter=radius * 2;
  2668. this.diameter=diameter;
  2669.  
  2670. cs.width=diameter + 'px';
  2671. cs.height=diameter + 'px';
  2672. cs.borderRadius=radius+1 + 'px';
  2673. cs.backgroundImage='url("'+ this.img.src +'")';
  2674. cs.marginLeft= -radius +'px';
  2675. cs.marginTop= -radius +'px';
  2676.  
  2677. var imgPos=getTargetPosition(this.data.img);
  2678. var imgRange={//图片所在范围
  2679. x:[imgPos.left , imgPos.right],
  2680. y:[imgPos.top , imgPos.bottom],
  2681. };
  2682. var imgW=imgRange.x[1] - imgRange.x[0];
  2683. var imgH=imgRange.y[1] - imgRange.y[0];
  2684. //如果图片太小的话,进行范围扩大。
  2685. var minSize=60;
  2686. if(imgW < minSize){
  2687. imgRange.x[1] +=(minSize - imgW)/2;
  2688. imgRange.x[0] -=(minSize - imgW)/2;
  2689. imgW=minSize;
  2690. };
  2691. if(imgH < minSize){
  2692. imgRange.y[1] +=(minSize - imgH)/2;
  2693. imgRange.y[0] -=(minSize - imgH)/2;
  2694. imgH=minSize;
  2695. };
  2696. this.imgSize={
  2697. w:imgW,
  2698. h:imgH,
  2699. };
  2700. this.imgRange=imgRange;
  2701. //console.log(this.imgRange,this.imgSize);
  2702.  
  2703. this.setMouseRange();
  2704.  
  2705.  
  2706. this.move({
  2707. pageX:imgRange.x[0],
  2708. pageY:imgRange.y[0],
  2709. });
  2710.  
  2711. this._focus=this.focus.bind(this);
  2712. this._blur=this.blur.bind(this);
  2713. this._move=this.move.bind(this);
  2714. this._remove=this.remove.bind(this);
  2715. this._pause=this.pause.bind(this);
  2716. this._zoom=this.zoom.bind(this);
  2717.  
  2718. if(prefs.magnifier.wheelZoom.enabled){
  2719. this.zoomLevel=1;
  2720. this.defaultDia=diameter;
  2721. addWheelEvent(container,this._zoom,false);
  2722. };
  2723.  
  2724. container.addEventListener('mouseover',this._focus,false);
  2725. container.addEventListener('mouseout',this._blur,false);
  2726. container.addEventListener('dblclick',this._remove,false);
  2727. container.addEventListener('click',this._pause,false);
  2728.  
  2729.  
  2730. document.addEventListener('mousemove',this._move,true);
  2731. },
  2732. addStyle:function(){
  2733. if(MagnifierC.style)return;
  2734. var style=document.createElement('style');
  2735. style.type='text/css';
  2736. MagnifierC.style=style;
  2737. style.textContent='\
  2738. .pv-magnifier-container{\
  2739. position:absolute;\
  2740. padding:0;\
  2741. margin:0;\
  2742. background-origin:border-box;\
  2743. -moz-box-sizing:border-box;\
  2744. box-sizing:border-box;\
  2745. border:3px solid #CCCCCC;\
  2746. background:rgba(40, 40, 40, 0.9) no-repeat;\
  2747. }\
  2748. .pv-magnifier-container_focus{\
  2749. box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.7);\
  2750. }\
  2751. .pv-magnifier-container_pause{\
  2752. border-color:red;\
  2753. }\
  2754. ';
  2755. document.querySelector('head').appendChild(style);
  2756. },
  2757. focus:function(){
  2758. this.magnifier.classList.add('pv-magnifier-container_focus');
  2759. this.magnifier.style.zIndex=MagnifierC.styleZIndex++;
  2760. },
  2761. blur:function(){
  2762. this.magnifier.classList.remove('pv-magnifier-container_focus');
  2763. },
  2764. move:function(e){
  2765. var mouseCoor={
  2766. x:e.pageX,
  2767. y:e.pageY,
  2768. };
  2769. var mouseRange=this.mouseRange;
  2770. var imgRange=this.imgRange;
  2771.  
  2772. if( !(mouseCoor.x >= mouseRange.x[0] && mouseCoor.x <= mouseRange.x[1] && mouseCoor.y >= mouseRange.y[0] && mouseCoor.y <= mouseRange.y[1]))return;//如果不再鼠标范围
  2773. if(mouseCoor.x > imgRange.x[1]){
  2774. mouseCoor.x = imgRange.x[1];
  2775. }else if(mouseCoor.x < imgRange.x[0]){
  2776. mouseCoor.x = imgRange.x[0];
  2777. };
  2778. if(mouseCoor.y > imgRange.y[1]){
  2779. mouseCoor.y = imgRange.y[1];
  2780. }else if(mouseCoor.y < imgRange.y[0]){
  2781. mouseCoor.y = imgRange.y[0];
  2782. };
  2783.  
  2784. var ms=this.magnifier.style;
  2785. ms.top= mouseCoor.y + 'px';
  2786. ms.left= mouseCoor.x + 'px';
  2787.  
  2788. var radius=this.radius;
  2789. var imgSize=this.imgSize;
  2790. var imgNaturalSize=this.imgNaturalSize;
  2791. var px=-((mouseCoor.x-imgRange.x[0])/imgSize.w * imgNaturalSize.w) + radius +'px';
  2792. var py=-((mouseCoor.y-imgRange.y[0])/imgSize.h * imgNaturalSize.h) + radius +'px';
  2793. //console.log(px,py);
  2794. ms.backgroundPosition=px + ' ' + py;
  2795. },
  2796. getNextZoomLevel:function(){
  2797. var level;
  2798. var self=this;
  2799. if(this.zoomOut){//缩小
  2800. MagnifierC.zoomRangeR._find(function(value){
  2801. if(value < self.zoomLevel){
  2802. level=value;
  2803. return true;
  2804. }
  2805. })
  2806. }else{
  2807. MagnifierC.zoomRange._find(function(value){
  2808. if(value > self.zoomLevel){
  2809. level=value;
  2810. return true;
  2811. };
  2812. });
  2813. }
  2814. return level;
  2815. },
  2816. zoom:function(e){
  2817. if(e.deltaY===0)return;//非Y轴的滚动
  2818. if(prefs.magnifier.wheelZoom.pauseFirst && !this.paused)return;
  2819. e.preventDefault();
  2820. if(e.deltaY < 0){//向上滚,放大;
  2821. if(this.diameter >= this.maxDia)return;
  2822. this.zoomOut=false;
  2823. }else{
  2824. this.zoomOut=true;
  2825. };
  2826. var level=this.getNextZoomLevel();
  2827. if(!level)return;
  2828.  
  2829. this.zoomLevel=level;
  2830. var diameter=this.defaultDia * level;
  2831. if(diameter > this.maxDia){
  2832. diameter = this.maxDia;
  2833. };
  2834.  
  2835. var radius=diameter/2
  2836. this.diameter=diameter;
  2837. var bRadius=this.radius;
  2838. this.radius=radius;
  2839. this.setMouseRange();
  2840. var ms=this.magnifier.style;
  2841. ms.width=diameter+'px';
  2842. ms.height=diameter+'px';
  2843. ms.borderRadius=radius+1 + 'px';
  2844. ms.marginLeft=-radius+'px';
  2845. ms.marginTop=-radius+'px';
  2846. var bBP=ms.backgroundPosition.split(' ');
  2847. ms.backgroundPosition=parseFloat(bBP[0]) + (radius - bRadius) + 'px' + ' ' + (parseFloat(bBP[1]) + ( radius - bRadius) + 'px');
  2848.  
  2849. },
  2850. pause:function(){
  2851. if(this.paused){
  2852. this.magnifier.classList.remove('pv-magnifier-container_pause');
  2853. document.addEventListener('mousemove',this._move,true);
  2854. }else{
  2855. this.magnifier.classList.add('pv-magnifier-container_pause');
  2856. document.removeEventListener('mousemove',this._move,true);
  2857. };
  2858. this.paused=!this.paused;
  2859. },
  2860. setMouseRange:function(){
  2861. var imgRange=this.imgRange;
  2862. var radius=this.radius;
  2863. this.mouseRange={//鼠标活动范围
  2864. x:[imgRange.x[0]-radius , imgRange.x[1] + radius],
  2865. y:[imgRange.y[0]-radius , imgRange.y[1] + radius],
  2866. };
  2867. },
  2868. remove:function(){
  2869. this.magnifier.parentNode.removeChild(this.magnifier);
  2870. document.removeEventListener('mousemove',this._move,true);
  2871. MagnifierC.all.splice(MagnifierC.all.indexOf(this),1);
  2872. },
  2873. };
  2874.  
  2875.  
  2876.  
  2877. //图片窗口
  2878. function ImgWindowC(img){
  2879. this.img=img;
  2880. this.src=img.src;
  2881. this.init();
  2882. };
  2883.  
  2884. ImgWindowC.styleZIndex=1000000000;//全局z-index;
  2885. ImgWindowC.all=[];//所有的窗口对象
  2886. ImgWindowC.zoomRange=prefs.imgWindow.zoom.range.slice(0).sort();//升序
  2887. ImgWindowC.zoomRangeR=ImgWindowC.zoomRange.slice(0).reverse();//降序
  2888.  
  2889.  
  2890. ImgWindowC.prototype={
  2891. init:function(){
  2892. var self=this;
  2893. //图片是否已经被打开
  2894. if(ImgWindowC.all._find(function(iwin){
  2895. if(iwin.src==self.src){
  2896. iwin.firstOpen();
  2897. return true;
  2898. };
  2899. }))return;
  2900.  
  2901. this.addStyle();
  2902. this.addRotateIndicator();
  2903.  
  2904. var img=this.img;
  2905. img.className='pv-pic-window-pic pv-pic-not-allowed';
  2906. img.style.cssText='\
  2907. top:0px;\
  2908. left:0px;\
  2909. ';
  2910.  
  2911. var imgNaturalSize={
  2912. h:img.naturalHeight,
  2913. w:img.naturalWidth,
  2914. };
  2915. this.imgNaturalSize=imgNaturalSize;
  2916.  
  2917. var container=document.createElement('span');
  2918. container.style.cssText='\
  2919. cursor:pointer;\
  2920. top:0px;\
  2921. left:0px;\
  2922. ';
  2923. container.className='pv-pic-window-container';
  2924. container.innerHTML=''+
  2925. '<span class="pv-pic-window-toolbar">'+
  2926. '<span class="pv-pic-window-tb-hand pv-pic-window-tb-tool pv-pic-window-tb-tool-selected" title="Hand Tool"></span>'+
  2927. '<span class="pv-pic-window-tb-tool-badge-container">'+
  2928. '<span class="pv-pic-window-tb-rotate pv-pic-window-tb-tool" title="Rotate | Rotar"></span>'+
  2929. '<span class="pv-pic-window-tb-tool-badge">0</span>'+
  2930. '</span>'+
  2931. '<span class="pv-pic-window-tb-tool-badge-container">'+
  2932. '<span class="pv-pic-window-tb-zoom pv-pic-window-tb-tool" title="Zoom"></span>'+
  2933. '<span class="pv-pic-window-tb-tool-badge">0</span>'+
  2934. '</span>'+
  2935. '<span class="pv-pic-window-tb-flip-horizontal pv-pic-window-tb-command" title="Giro HORIZONTAL Flip"></span>'+
  2936. '<span class="pv-pic-window-tb-flip-vertical pv-pic-window-tb-command" title="Giro VERTICAL Flip"></span>'+
  2937. '</span>'+
  2938. '<span class="pv-pic-window-close"></span>'+
  2939. '<span class="pv-pic-window-range"></span>';
  2940.  
  2941. container.insertBefore(img,container.firstChild);
  2942.  
  2943. this.imgWindow=container;
  2944.  
  2945. var toolMap={
  2946. 'hand':container.querySelector('.pv-pic-window-tb-hand'),
  2947. 'rotate':container.querySelector('.pv-pic-window-tb-rotate'),
  2948. 'zoom':container.querySelector('.pv-pic-window-tb-zoom'),
  2949. 'fh':container.querySelector('.pv-pic-window-tb-flip-horizontal'),
  2950. 'fv':container.querySelector('.pv-pic-window-tb-flip-vertical'),
  2951. };
  2952. this.toolMap=toolMap;
  2953.  
  2954. this.viewRange=container.querySelector('.pv-pic-window-range');
  2955.  
  2956.  
  2957.  
  2958.  
  2959. //关闭
  2960. var closeButton=container.querySelector('.pv-pic-window-close');
  2961. closeButton.style.cssText='\
  2962. top: -24px;\
  2963. right: 0px;\
  2964. ';
  2965. this.closeButton=closeButton;
  2966.  
  2967. closeButton.addEventListener('click',function(e){
  2968. self.remove();
  2969. },false);
  2970.  
  2971. var toolbar=container.querySelector('.pv-pic-window-toolbar');
  2972. toolbar.style.cssText='\
  2973. top: 0px;\
  2974. left: -45px;\
  2975. ';
  2976. this.toolbar=toolbar;
  2977.  
  2978. this.selectedTool='hand';
  2979. this.cursor='hand';
  2980. this.selectedToolClass='pv-pic-window-tb-tool-selected';
  2981.  
  2982.  
  2983. this.hKeyUp=true;
  2984. this.rKeyUp=true;
  2985. this.zKeyUp=true;
  2986.  
  2987. this.spaceKeyUp=true;
  2988. this.ctrlKeyUp=true;
  2989. this.altKeyUp=true;
  2990. this.shiftKeyUp=true;
  2991.  
  2992.  
  2993. toolbar.addEventListener('mousedown',function(e){//鼠标按下选择工具
  2994. self.toolbarEventHandler(e);
  2995. },false);
  2996.  
  2997.  
  2998. toolbar.addEventListener('dblclick',function(e){//鼠标双击工具
  2999. self.toolbarEventHandler(e);
  3000. },false);
  3001.  
  3002.  
  3003. //阻止浏览器对图片的默认控制行为
  3004. img.addEventListener('mousedown',function(e){
  3005. e.preventDefault();
  3006. },false);
  3007.  
  3008.  
  3009. container.addEventListener('mousedown',function(e){//当按下的时,执行平移,缩放,旋转操作
  3010. self.imgWindowEventHandler(e);
  3011. },false);
  3012.  
  3013. container.addEventListener('click',function(e){//阻止opera ctrl+点击保存图片
  3014. self.imgWindowEventHandler(e);
  3015. },false);
  3016.  
  3017. if(prefs.imgWindow.zoom.mouseWheelZoom){//是否使用鼠标缩放
  3018. addWheelEvent(container,function(e){//滚轮缩放
  3019. self.imgWindowEventHandler(e);
  3020. },false);
  3021. };
  3022.  
  3023.  
  3024. if(prefs.imgWindow.overlayer.shown){//是否显示覆盖层
  3025. var overlayer=document.createElement('span');
  3026. this.overlayer=overlayer;
  3027. overlayer.className='pv-pic-window-overlayer';
  3028. overlayer.style.backgroundColor=prefs.imgWindow.overlayer.color;
  3029. document.body.appendChild(overlayer);
  3030. if(prefs.imgWindow.overlayer.clickToClose[0]){
  3031. overlayer.addEventListener(prefs.imgWindow.overlayer.clickToClose[1],function(e){
  3032. self.remove();
  3033. },false);
  3034. }
  3035. };
  3036.  
  3037. document.body.appendChild(container);
  3038. ImgWindowC.all.push(this);
  3039.  
  3040. this._blur=this.blur.bind(this);
  3041. this._focusedKeydown=this.focusedKeydown.bind(this);
  3042. this._focusedKeyup=this.focusedKeyup.bind(this);
  3043.  
  3044. this.rotatedRadians=0;//已经旋转的角度
  3045. this.zoomLevel=1;//缩放级别
  3046. this.setToolBadge('zoom',1);
  3047.  
  3048. //选中默认工具
  3049. this.selectTool(prefs.imgWindow.defaultTool);
  3050.  
  3051. this.firstOpen();
  3052. },
  3053. firstOpen:function(){
  3054. this.focus();
  3055. var imgWindow=this.imgWindow;
  3056. imgWindow.style.left=-5 + window.scrollX + 'px';
  3057. imgWindow.style.top=-5 + window.scrollY + 'px';
  3058.  
  3059. if(prefs.imgWindow.fitToScreen){
  3060. this.fitToScreen();
  3061. this.center(true,true);
  3062. }else{
  3063. //window的尺寸
  3064. var wSize=getWindowSize();
  3065. //空隙
  3066. wSize.h -= 16;
  3067. wSize.w -= 16;
  3068.  
  3069. var imgWindowCS=getComputedStyle(imgWindow,'');
  3070.  
  3071. var rectSize={
  3072. h:parseFloat(imgWindowCS.height),
  3073. w:parseFloat(imgWindowCS.width),
  3074. };
  3075.  
  3076. this.center(rectSize.w <= wSize.w , rectSize.h <= wSize.h);
  3077. };
  3078.  
  3079. this.keepScreenInside();
  3080. },
  3081. addStyle:function(){
  3082. if(ImgWindowC.style)return;
  3083. var style=document.createElement('style');
  3084. ImgWindowC.style=style;
  3085. style.textContent='\
  3086. .pv-pic-window-container {\
  3087. position: absolute;\
  3088. background-color: rgba(40,40,40,0.9);\
  3089. padding: 8px;\
  3090. border: 5px solid #ccc;\
  3091. line-height: 0;\
  3092. text-align: left;\
  3093. }\
  3094. .pv-pic-window-container_focus {\
  3095. box-shadow: 0 0 10px rgba(0,0,0,0.6);\
  3096. }\
  3097. .pv-pic-window-close, .pv-pic-window-toolbar {\
  3098. -webkit-transition: opacity 0.2s ease-in-out;\
  3099. transition: opacity 0.2s ease-in-out;\
  3100. }\
  3101. .pv-pic-window-toolbar {\
  3102. position: absolute;\
  3103. background-color: #535353;\
  3104. padding: 0;\
  3105. opacity: 0.9;\
  3106. display: none;\
  3107. cursor: default;\
  3108. }\
  3109. .pv-pic-window-toolbar:hover {\
  3110. opacity: 1;\
  3111. }\
  3112. .pv-pic-window-toolbar_focus {\
  3113. display: block;\
  3114. }\
  3115. .pv-pic-window-close {\
  3116. cursor: pointer;\
  3117. position: absolute;\
  3118. right: 0px;\
  3119. top: -24px;\
  3120. background: url("'+prefs.icons.close+'") no-repeat center bottom;\
  3121. height: 17px;\
  3122. width: 46px;\
  3123. opacity: 0.9;\
  3124. border:none;\
  3125. padding:0;\
  3126. padding-top:2px;\
  3127. background-color:#1771FF;\
  3128. display: none;\
  3129. }\
  3130. .pv-pic-window-close:hover {\
  3131. background-color:red;\
  3132. opacity: 1;\
  3133. }\
  3134. .pv-pic-window-close_focus {\
  3135. display: block;\
  3136. }\
  3137. .pv-pic-window-pic {\
  3138. position: relative;\
  3139. display:inline-block;\/*opera把图片设置display:block会出现渲染问题,会有残影,还会引发其他各种问题,吓尿*/\
  3140. max-width:none;\
  3141. min-width:none;\
  3142. max-height:none;\
  3143. min-height:none;\
  3144. padding:0;\
  3145. margin:0;\
  3146. }\
  3147. .pv-pic-window-pic_focus {\
  3148. box-shadow: 0 0 6px black;\
  3149. }\
  3150. .pv-pic-window-tb-tool, .pv-pic-window-tb-command{\
  3151. height: 24px;\
  3152. width: 24px;\
  3153. padding: 12px 8px 6px 6px;\
  3154. margin:0;\
  3155. display: block;\
  3156. background: transparent no-repeat center;\
  3157. cursor: pointer;\
  3158. position: relative;\
  3159. border: none;\
  3160. border-left: 2px solid transparent;\
  3161. border-bottom: 1px solid #868686;\
  3162. background-origin: content-box;\
  3163. }\
  3164. .pv-pic-window-toolbar > span:last-child {\
  3165. border-bottom: none;\
  3166. }\
  3167. .pv-pic-window-tb-tool:hover, .pv-pic-window-tb-command:hover{\
  3168. border-left: 2px solid red;\
  3169. }\
  3170. .pv-pic-window-tb-tool-selected{\
  3171. box-shadow: inset 0 21px 0 rgba(255,255,255,0.3) ,inset 0 -21px 0 rgba(0,0,0,0.3);\
  3172. border-left:2px solid #1771FF;\
  3173. }\
  3174. .pv-pic-window-tb-hand {\
  3175. background-image: url("'+prefs.icons.hand+'");\
  3176. }\
  3177. .pv-pic-window-tb-rotate {\
  3178. background-image: url("'+prefs.icons.rotate+'");\
  3179. }\
  3180. .pv-pic-window-tb-zoom {\
  3181. background-image: url("'+prefs.icons.zoom+'");\
  3182. }\
  3183. .pv-pic-window-tb-flip-horizontal {\
  3184. background-image: url("'+prefs.icons.flipHorizontal+'");\
  3185. }\
  3186. .pv-pic-window-tb-flip-vertical {\
  3187. background-image: url("'+prefs.icons.flipVertical+'");\
  3188. }\
  3189. .pv-pic-window-tb-tool-badge-container {\
  3190. display: block;\
  3191. position: relative;\
  3192. }\
  3193. .pv-pic-window-tb-tool-badge {\
  3194. position: absolute;\
  3195. top: -3px;\
  3196. right: 1px;\
  3197. font-size: 10px;\
  3198. line-height: 1.5;\
  3199. padding: 0 3px;\
  3200. background-color: #F93;\
  3201. border-radius: 50px;\
  3202. opacity: 0.5;\
  3203. color: black;\
  3204. }\
  3205. .pv-pic-window-overlayer{\
  3206. height:100%;\
  3207. width:100%;\
  3208. position:fixed;\
  3209. z-index:999999999;\
  3210. top:0;\
  3211. left:0;\
  3212. }\
  3213. .pv-pic-window-rotate-indicator{\
  3214. cursor: progress;\
  3215. position:absolute;\
  3216. z-index:1100000000;\
  3217. width:250px;\
  3218. height:250px;\
  3219. padding:10px;\
  3220. margin-top:-135px;\
  3221. margin-left:-135px;\
  3222. background:transparent url("'+ prefs.icons.rotateIndicatorBG +'") no-repeat center;\
  3223. }\
  3224. .pv-pic-window-rotate-indicator-pointer{\
  3225. display:block;\
  3226. margin-left:auto;\
  3227. margin-right:auto;\
  3228. background:transparent url("'+ prefs.icons.rotateIndicatorPointer +'") no-repeat center;\
  3229. width:60px;\
  3230. height:240px;\
  3231. position:relative;\
  3232. top:5px;\
  3233. }\
  3234. .pv-pic-window-range{\
  3235. position:absolute;\
  3236. border:none;\
  3237. width:100px;\
  3238. height:100px;\
  3239. box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.8);\
  3240. display:none;\
  3241. padding:0;\
  3242. background-color:rgba(255, 0, 0, 0.150);\
  3243. }\
  3244. ';
  3245. document.querySelector('head').appendChild(style);
  3246. },
  3247. addRotateIndicator:function(){
  3248. if(ImgWindowC.rotateIndicator)return;
  3249. var rotateIndicator=document.createElement('span');
  3250. rotateIndicator.className='pv-pic-window-rotate-indicator';
  3251. ImgWindowC.rotateIndicator=rotateIndicator;
  3252. rotateIndicator.style.cssText='\
  3253. display:none;\
  3254. ';
  3255. var rotateIndicatorPointer=document.createElement('span');
  3256. rotateIndicatorPointer.className='pv-pic-window-rotate-indicator-pointer';
  3257. ImgWindowC.rotateIndicatorPointer=rotateIndicatorPointer;
  3258. rotateIndicator.appendChild(rotateIndicatorPointer);
  3259. document.body.appendChild(rotateIndicator);
  3260. },
  3261. keepScreenInside:function(){//保持按钮在屏幕里面.
  3262. var imgWindow=this.imgWindow;
  3263. var imgWindowFullSize={
  3264. h:imgWindow.offsetHeight,
  3265. w:imgWindow.offsetWidth,
  3266. };
  3267.  
  3268. var windowSize=getWindowSize();
  3269.  
  3270. function keepSI(obj,offsetDirection,defaultValue){
  3271. var objRect=obj.getBoundingClientRect();
  3272. var objStyle=obj.style;
  3273.  
  3274. while(offsetDirection.length){
  3275. var oD=offsetDirection[0];
  3276. var oDV=defaultValue[0];
  3277. offsetDirection.shift();
  3278. defaultValue.shift();
  3279. var oValue=parseFloat(objStyle[oD]);
  3280. var newValue;
  3281. switch(oD){
  3282. case 'top':{
  3283. newValue=oValue - objRect.top;
  3284. if(objRect.top<0){
  3285. newValue=Math.min(newValue,imgWindowFullSize.h);
  3286. }else{
  3287. newValue=Math.max(newValue,oDV);
  3288. };
  3289. }break;
  3290. case 'right':{
  3291. newValue=oValue + (objRect.right - windowSize.w);
  3292. if(objRect.right > windowSize.w){//屏幕外
  3293. newValue=Math.min(newValue,imgWindowFullSize.w);
  3294. }else{
  3295. newValue=Math.max(newValue,oDV);
  3296. };
  3297. }break;
  3298. case 'bottom':{
  3299. newValue=oValue + (objRect.bottom - windowSize.h);
  3300. if(objRect.bottom > windowSize.h){//屏幕外
  3301. newValue=Math.min(newValue,imgWindowFullSize.h);
  3302. }else{
  3303. newValue=Math.max(newValue,oDV);
  3304. };
  3305. }break;
  3306. case 'left':{
  3307. newValue=oValue - objRect.left;
  3308. if(objRect.left<0){
  3309. newValue=Math.min(newValue,imgWindowFullSize.w);
  3310. }else{
  3311. newValue=Math.max(newValue,oDV);
  3312. }
  3313. }break;
  3314. };
  3315. //console.log(newValue);
  3316. objStyle[oD]=newValue + 'px';
  3317. };
  3318. };
  3319.  
  3320. keepSI(this.closeButton,['top','right'],[-24,0]);
  3321. keepSI(this.toolbar,['top','left'],[0,-45]);
  3322. },
  3323. fitToScreen:function(){
  3324. var wSize=getWindowSize();
  3325. //空隙
  3326. wSize.h -= 16;
  3327. wSize.w -= 16;
  3328.  
  3329. var imgWindow=this.imgWindow;
  3330. var imgWindowCS=getComputedStyle(imgWindow,'');
  3331. var rectSize={
  3332. h:parseFloat(imgWindowCS.height),
  3333. w:parseFloat(imgWindowCS.width),
  3334. };
  3335.  
  3336.  
  3337. var size;
  3338. if(rectSize.w - wSize.w>0 || rectSize.h - wSize.h>0){//超出屏幕,那么缩小。
  3339. if(rectSize.w/rectSize.h > wSize.w/wSize.h){
  3340. size={
  3341. w:wSize.w,
  3342. h:wSize.w / (rectSize.w/rectSize.h),
  3343. };
  3344. }else{
  3345. size={
  3346. h:wSize.h,
  3347. w:wSize.h * (rectSize.w/rectSize.h),
  3348. }
  3349. };
  3350.  
  3351. this.zoom(this.getRotatedImgCliSize(size).w/this.imgNaturalSize.w);
  3352. };
  3353. },
  3354. center:function(horizontal,vertical){
  3355. if(!horizontal && !vertical)return;
  3356. var wSize=getWindowSize();
  3357. var imgWindow=this.imgWindow;
  3358. if(horizontal)imgWindow.style.left= (wSize.w - imgWindow.offsetWidth)/2 + window.scrollX +'px';
  3359. if(vertical)imgWindow.style.top= (wSize.h - imgWindow.offsetHeight)/2 + window.scrollY +'px';
  3360. },
  3361. move:function(e){
  3362. this.working=true;
  3363. var mouseCoor={
  3364. x:e.pageX,
  3365. y:e.pageY,
  3366. };
  3367. var imgWindow=this.imgWindow;
  3368. var imgWStyle=imgWindow.style;
  3369. var oriOffset={
  3370. left:parseFloat(imgWStyle.left),
  3371. top:parseFloat(imgWStyle.top),
  3372. };
  3373. var self=this;
  3374. var moveHandler=function(e){
  3375. imgWStyle.left=oriOffset.left+ e.pageX-mouseCoor.x +'px';
  3376. imgWStyle.top=oriOffset.top + e.pageY-mouseCoor.y +'px';
  3377. self.keepScreenInside();
  3378. };
  3379. var mouseupHandler=function(){
  3380. e.preventDefault();
  3381. self.working=false;
  3382. if(self.tempHand && self.spaceKeyUp){//如果是临时切换到抓手工具,平移完成后返回上个工具
  3383. self.tempHand=false;
  3384. self.changeCursor(self.selectedTool);
  3385. };
  3386. document.removeEventListener('mousemove',moveHandler,true);
  3387. document.removeEventListener('mouseup',mouseupHandler,true);
  3388. };
  3389. document.addEventListener('mousemove',moveHandler,true);
  3390. document.addEventListener('mouseup',mouseupHandler,true);
  3391. },
  3392. rotate:function(origin,topLeft){
  3393.  
  3394. var img=this.img;
  3395. var imgWindow=this.imgWindow;
  3396.  
  3397. var iTransform=img.style[support.cssTransform].replace(/rotate\([^)]*\)/i,'');
  3398.  
  3399. var imgWindowCS=getComputedStyle(imgWindow,'');
  3400. var imgRectSize={
  3401. h:parseFloat(imgWindowCS.height),
  3402. w:parseFloat(imgWindowCS.width),
  3403. };
  3404.  
  3405. var rectOffset={
  3406. top:parseFloat(imgWindow.style.top),
  3407. left:parseFloat(imgWindow.style.left),
  3408. };
  3409.  
  3410. var imgSize={
  3411. h:img.clientHeight,
  3412. w:img.clientWidth,
  3413. };
  3414.  
  3415. var imgOffset={
  3416. top:parseFloat(img.style.top),
  3417. left:parseFloat(img.style.left),
  3418. };
  3419.  
  3420.  
  3421. var self=this;
  3422. var PI=Math.PI;
  3423.  
  3424. var rotate=function (radians){
  3425. if(self.rotatedRadians==radians)return;
  3426. img.style[support.cssTransform] = ' rotate('+ radians +'rad) ' + iTransform;
  3427. ImgWindowC.rotateIndicatorPointer.style[support.cssTransform]='rotate('+ radians +'rad)';
  3428.  
  3429. self.rotatedRadians=radians;
  3430. self.setToolBadge('rotate',radians/(PI/180));
  3431.  
  3432. var afterimgRectSize=self.getRotatedImgRectSize( radians, imgSize );
  3433. imgWindow.style.width=afterimgRectSize.w +'px';
  3434. imgWindow.style.height=afterimgRectSize.h + 'px';
  3435. if(!topLeft)self.setImgWindowOffset(rectOffset,imgRectSize,afterimgRectSize);
  3436. self.setImgOffset(imgOffset,imgRectSize,afterimgRectSize);
  3437. self.keepScreenInside();
  3438. };
  3439.  
  3440.  
  3441. if(typeof origin=='number'){
  3442. rotate(origin);
  3443. return;
  3444. };
  3445.  
  3446.  
  3447. this.working=true;
  3448.  
  3449. var lastRotatedRadians=this.rotatedRadians;
  3450. this.shiftKeyUp=true;
  3451. var shiftRotateStep=prefs.shiftRotateStep / (180/Math.PI);//转成弧度
  3452.  
  3453. var moveHandler=function(e){
  3454. var radians=lastRotatedRadians + Math.atan2( e.pageY - origin.pageY, e.pageX - origin.pageX );
  3455.  
  3456. if(radians>2*PI){
  3457. radians-=2*PI;
  3458. }else if(radians<0){
  3459. radians+=2*PI;
  3460. };
  3461.  
  3462. if(!self.shiftKeyUp){//如果按下了shift键,那么步进缩放
  3463. radians -= radians % shiftRotateStep;
  3464. radians += shiftRotateStep;
  3465. };
  3466. rotate(radians);
  3467. };
  3468.  
  3469. var mouseupHandler=function(){
  3470. self.working=false;
  3471. ImgWindowC.rotateIndicator.style.display='none';
  3472. document.removeEventListener('mousemove',moveHandler,true);
  3473. document.removeEventListener('mouseup',mouseupHandler,true);
  3474. };
  3475.  
  3476. document.addEventListener('mousemove',moveHandler,true);
  3477. document.addEventListener('mouseup',mouseupHandler,true);
  3478. },
  3479. getNextZoomLevel:function(){
  3480. var level;
  3481. var self=this;
  3482. if(this.zoomOut){//缩小
  3483. ImgWindowC.zoomRangeR._find(function(value){
  3484. if(value < self.zoomLevel){
  3485. level=value;
  3486. return true;
  3487. }
  3488. })
  3489. }else{
  3490. ImgWindowC.zoomRange._find(function(value){
  3491. if(value > self.zoomLevel){
  3492. level=value;
  3493. return true;
  3494. };
  3495. });
  3496. }
  3497. return level;
  3498. },
  3499. getZoomRatio:function(mouseCoor){
  3500. var ibcRect=this.img.getBoundingClientRect();
  3501. var ratio={
  3502. x:(mouseCoor.x-ibcRect.left)/ibcRect.width,
  3503. y:(mouseCoor.y-ibcRect.top)/ibcRect.height,
  3504. };
  3505. if(ratio.x<0){
  3506. ratio.x=0
  3507. }else if(ratio.x>1){
  3508. ratio.x=1
  3509. };
  3510. if(ratio.y<0){
  3511. ratio.y=0
  3512. }else if(ratio.y>1){
  3513. ratio.y=1
  3514. };
  3515. return ratio;
  3516. },
  3517. zoom:function(e,ratio){//e可能是undefined,可能是事件对象,可能是直接的缩放级别数字
  3518. var imgWindow=this.imgWindow;
  3519. var imgWindowCS=getComputedStyle(imgWindow,'');
  3520. var imgRectSize={
  3521. h:parseFloat(imgWindowCS.height),
  3522. w:parseFloat(imgWindowCS.width),
  3523. };
  3524.  
  3525. var rectOffset={
  3526. top:parseFloat(imgWindow.style.top),
  3527. left:parseFloat(imgWindow.style.left),
  3528. };
  3529.  
  3530. var img=this.img;
  3531. var self=this;
  3532.  
  3533. var zoom=function(level){//缩放到指定级别
  3534. if(typeof level==='undefined' || level<0 || level==self.zoomLevel)return;
  3535.  
  3536. var afterImgSize={
  3537. h:self.imgNaturalSize.h * level,
  3538. w:self.imgNaturalSize.w * level,
  3539. };
  3540. img.width=afterImgSize.w;
  3541. img.height=afterImgSize.h;
  3542.  
  3543. var afterimgRectSize=self.getRotatedImgRectSize( self.rotatedRadians, afterImgSize );
  3544. imgWindow.style.width=afterimgRectSize.w +'px';
  3545. imgWindow.style.height=afterimgRectSize.h + 'px';
  3546. self.setImgWindowOffset(rectOffset,imgRectSize,afterimgRectSize,ratio);
  3547. self.setImgOffset({top:0,left:0},afterImgSize,afterimgRectSize);//如果旋转了,调整偏移
  3548. self.zoomLevel=level;
  3549. self.setToolBadge('zoom',level);
  3550. self.keepScreenInside();
  3551. };
  3552.  
  3553. if(typeof e!='object'){
  3554. ratio=ratio? ratio : {
  3555. x:1/2,
  3556. y:1/2,
  3557. };
  3558. zoom(e);
  3559. return;
  3560. };
  3561.  
  3562. this.working=true;
  3563.  
  3564. ratio=this.getZoomRatio({
  3565. x:e.clientX,
  3566. y:e.clientY,
  3567. });
  3568.  
  3569.  
  3570. var moved;
  3571. var lastPageX=e.pageX;
  3572. var currentLevel=this.zoomLevel;
  3573. var moveHandler=function(e){
  3574. moved=true;
  3575. var pageX=e.pageX;
  3576. var level;
  3577. if(pageX > lastPageX){//向右移,zoomin扩大
  3578. self.changeCursor('zoom',false);
  3579. level=0.05;
  3580. }else{//向左移,zoomout缩小
  3581. self.changeCursor('zoom',true);
  3582. level=-0.05;
  3583. };
  3584. lastPageX=pageX;
  3585. currentLevel += level;
  3586. zoom(currentLevel);
  3587. };
  3588.  
  3589. var mouseupHandler=function(e){
  3590. self.working=false;
  3591. document.removeEventListener('mousemove',moveHandler,true);
  3592. document.removeEventListener('mouseup',mouseupHandler,true);
  3593.  
  3594. var level=self.getNextZoomLevel();
  3595.  
  3596. if(self.zoomOut && self.altKeyUp){
  3597. self.zoomOut=false;
  3598. };
  3599.  
  3600. if(!moved){//如果没有平移缩放。
  3601. zoom(level);
  3602. };
  3603.  
  3604. self.changeCursor('zoom',self.zoomOut);
  3605.  
  3606. if(self.tempZoom && self.ctrlKeyUp && self.altKeyUp){
  3607. self.tempZoom=false;
  3608. self.changeCursor(self.selectedTool);
  3609. };
  3610.  
  3611. };
  3612.  
  3613. document.addEventListener('mousemove',moveHandler,true);
  3614. document.addEventListener('mouseup',mouseupHandler,true);
  3615. },
  3616. convertToValidRadians:function(radians){
  3617. //转成0-90的等价角度。
  3618. var PI=Math.PI;
  3619. if(radians > PI){
  3620. radians = 2*PI - radians;
  3621. };
  3622. if(radians > 1/2*PI){
  3623. radians = PI - radians;
  3624. };
  3625. return radians;
  3626. },
  3627. getRotatedImgRectSize:function( radians, imgSize ){//通过旋转后的角度和图片的大小,求虚拟矩形的大小
  3628. imgSize= imgSize ? imgSize :{
  3629. h:this.img.clientHeight,
  3630. w:this.img.clentWidth,
  3631. };
  3632.  
  3633. if(typeof radians==='undefined'){
  3634. radians = this.rotatedRadians;
  3635. };
  3636.  
  3637. radians=this.convertToValidRadians(radians);
  3638.  
  3639. return {
  3640. h:imgSize.h* Math.cos(radians) + imgSize.w * Math.sin(radians),
  3641. w:imgSize.h* Math.sin(radians) + imgSize.w * Math.cos(radians),
  3642. };
  3643. },
  3644. getRotatedImgCliSize:function(rectSize,radians){//通过虚拟矩形的大小和图片的旋转角度,求图片的大小
  3645.  
  3646. if(typeof radians==='undefined'){
  3647. radians = this.rotatedRadians;
  3648. };
  3649.  
  3650. radians=this.convertToValidRadians(radians);
  3651.  
  3652. if(radians==0){
  3653. //radians=Math.PI/180 * 1/100;
  3654. return rectSize;
  3655. };
  3656.  
  3657. var h=(rectSize.h-rectSize.w * Math.tan(radians))/(Math.cos(radians)-Math.sin(radians)*Math.tan(radians));
  3658. var w=(rectSize.h - h*Math.cos(radians))/Math.sin(radians);
  3659. return {
  3660. h:h,
  3661. w:w,
  3662. };
  3663.  
  3664. },
  3665. setImgOffset:function(oriOffset,bImgSize,aImgSize){
  3666. var imgStyle=this.img.style;
  3667. var top=Math.floor(oriOffset.top + (aImgSize.h-bImgSize.h)*1/2) + 'px';
  3668. var left=Math.floor(oriOffset.left + (aImgSize.w-bImgSize.w)*1/2) + 'px';
  3669. imgStyle.top= top;
  3670. imgStyle.left= left;
  3671. },
  3672. setImgWindowOffset:function(oriOffset,bImgWindowSize,aImgWidnowSize,ratio){
  3673. ratio= ratio? ratio : {x:1/2,y:1/2};
  3674. var imgWindowStyle=this.imgWindow.style;
  3675. var top=oriOffset.top - (aImgWidnowSize.h-bImgWindowSize.h)*ratio.y + 'px';
  3676. var left=oriOffset.left - (aImgWidnowSize.w-bImgWindowSize.w)*ratio.x + 'px';
  3677. imgWindowStyle.top= top;
  3678. imgWindowStyle.left= left;
  3679. },
  3680. setToolBadge:function(tool,content){
  3681. var scale=0;
  3682. switch(tool){
  3683. case 'zoom':{
  3684. scale=2;
  3685. }break;
  3686. case 'rotate':{
  3687. scale=1;
  3688. }break;
  3689. default:break;
  3690. }
  3691. content=typeof content=='string'? content : content.toFixed(scale);
  3692. this.toolMap[tool].nextElementSibling.textContent=content;
  3693. },
  3694. changeCursor:function(tool,zoomOut){
  3695. if(tool=='zoom'){
  3696. tool+=zoomOut? '-out' : '-in';
  3697. };
  3698. if(this.cursor==tool)return;
  3699. this.cursor=tool;
  3700. var imgWStyle=this.imgWindow.style;
  3701. switch(tool){
  3702. case 'hand':{
  3703. imgWStyle.cursor='pointer';
  3704. }break;
  3705. case 'zoom-in':{
  3706. imgWStyle.cursor=support.cssCursorValue.zoomIn;
  3707. }break;
  3708. case 'zoom-out':{
  3709. imgWStyle.cursor=support.cssCursorValue.zoomOut;
  3710. }break;
  3711. case 'rotate':{
  3712. imgWStyle.cursor='progress';
  3713. }break;
  3714. case 'default':{
  3715. imgWStyle.removeProperty('cursor');
  3716. }break;
  3717. default:break;
  3718. };
  3719. },
  3720. blur:function(e){
  3721. if(!this.focused)return;
  3722. var imgWindow =this.imgWindow;
  3723. //点击imgWinodw的外部的时候失去焦点
  3724. if(e!==true && (imgWindow==e.target || (imgWindow.compareDocumentPosition(e.target) & 16)))return;
  3725. imgWindow.classList.remove('pv-pic-window-container_focus');
  3726. this.toolbar.classList.remove('pv-pic-window-toolbar_focus');
  3727. this.closeButton.classList.remove('pv-pic-window-close_focus');
  3728. this.img.classList.remove('pv-pic-window-pic_focus');
  3729. document.removeEventListener('mousedown',this._blur,true);
  3730. document.removeEventListener('keydown',this._focusedKeydown,true);
  3731. document.removeEventListener('keyup',this._focusedKeyup,true);
  3732. this.changeCursor('default');
  3733. this.focused=false;
  3734. },
  3735. focus:function(){
  3736. if(this.focused)return;
  3737. this.imgWindow.classList.add('pv-pic-window-container_focus');
  3738. this.toolbar.classList.add('pv-pic-window-toolbar_focus');
  3739. this.closeButton.classList.add('pv-pic-window-close_focus');
  3740. this.img.classList.add('pv-pic-window-pic_focus');
  3741. this.imgWindow.style.zIndex= ImgWindowC.styleZIndex;
  3742. this.zIndex=ImgWindowC.styleZIndex;
  3743. ImgWindowC.styleZIndex ++;
  3744. document.addEventListener('keydown',this._focusedKeydown,true);
  3745. document.addEventListener('keyup',this._focusedKeyup,true);
  3746. document.addEventListener('mousedown',this._blur,true);
  3747. this.changeCursor(this.selectedTool);//还原鼠标样式。
  3748. this.focused=true;
  3749. },
  3750. focusedKeyup:function(e){
  3751. var keyCode=e.keyCode;
  3752. var valid=[32,18,16,72,17,72,82,90,67];
  3753. if(valid.indexOf(keyCode)==-1)return;
  3754.  
  3755. e.preventDefault();
  3756.  
  3757. switch(keyCode){
  3758. case 32:{//空格键,临时切换到移动
  3759. this.spaceKeyUp=true;
  3760. if(!this.tempHand)return;//如果之前没有临时切换到抓手工具(当已经在工作的时候,按下空格不会临时切换到抓手工具)
  3761. if(!this.working){//松开按键的时候,没有在继续平移了。
  3762. this.tempHand=false;
  3763. this.changeCursor(this.selectedTool);
  3764. };
  3765. }break;
  3766. case 18:{//alt键盘切换缩小放大。
  3767. this.altKeyUp=true;
  3768. if(!this.zoomOut)return;
  3769. if(!this.working){
  3770. this.zoomOut=false;
  3771. this.changeCursor('zoom');
  3772. if(this.tempZoom && this.ctrlKeyUp){
  3773. this.tempZoom=false;
  3774. this.changeCursor(this.selectedTool);
  3775. };
  3776. };
  3777. }break;
  3778. case 16:{//shift键,旋转的时候按住shift键,步进缩放。
  3779. this.shiftKeyUp=true;
  3780. }break;
  3781. case 17:{//ctrl键
  3782. clearTimeout(this.ctrlkeyDownTimer);
  3783. if(!this.justCKeyUp){//如果刚才没有松开c,规避划词软件的ctrl+c松开
  3784. this.ctrlKeyUp=true;
  3785. if(!this.tempZoom)return;//如果没有切换到了缩放
  3786. if(!this.working && this.altKeyUp){
  3787. this.tempZoom=false;
  3788. this.changeCursor(this.selectedTool);
  3789. };
  3790. };
  3791. }break;
  3792. case 67:{//c键
  3793. this.justCKeyUp=true;
  3794. var self=this;
  3795. clearTimeout(this.justCKeyUpTimer);
  3796. this.justCKeyUpTimer=setTimeout(function(){
  3797. self.justCKeyUp=false;
  3798. },100)
  3799. }break;
  3800. case 72:{//h键
  3801. this.hKeyUp=true;
  3802. }break;
  3803. case 82:{//r键
  3804. this.rKeyUp=true;
  3805. }break;
  3806. case 90:{//z键
  3807. this.zKeyUp=true;
  3808. }break;
  3809. default:break;
  3810. };
  3811.  
  3812. if([72,82,90].indexOf(keyCode)!=-1){
  3813. if(!this.working && this.restoreBeforeTool){
  3814. this.restoreBeforeTool=false;
  3815. this.selectTool(this.beforeTool);
  3816. };
  3817. };
  3818. },
  3819. focusedKeydown:function(e){
  3820. var keyCode=e.keyCode;
  3821. var valid=[32,82,72,90,18,16,17,27,67];//有效的按键
  3822. if(valid.indexOf(keyCode)==-1) return;
  3823.  
  3824. e.preventDefault();
  3825.  
  3826. if(this.working){//working的时候也可以接受按下shift键,以便旋转的时候可以任何时候按下
  3827. if(keyCode==16){//shift键
  3828. this.shiftKeyUp=false;
  3829. };
  3830. return;
  3831. };
  3832.  
  3833. switch(keyCode){
  3834. case 82:{//r键,切换到旋转工具
  3835. if(this.rKeyUp){
  3836. this.rKeyUp=false;
  3837. this.beforeTool=this.selectedTool;
  3838. this.selectTool('rotate');
  3839. };
  3840. }break;
  3841. case 72:{//h键,切换到抓手工具
  3842. if(this.hKeyUp){
  3843. this.hKeyUp=false;
  3844. this.beforeTool=this.selectedTool;
  3845. this.selectTool('hand');
  3846. };
  3847. }break;
  3848. case 90:{//z键,切换到缩放工具
  3849. if(this.zKeyUp){
  3850. this.zKeyUp=false;
  3851. this.beforeTool=this.selectedTool;
  3852. this.selectTool('zoom');
  3853. };
  3854. }break;
  3855. case 32:{//空格键阻止,临时切换到抓手功能
  3856. if(this.spaceKeyUp){
  3857. this.spaceKeyUp=false;
  3858. if(this.selectedTool!='hand'){
  3859. this.tempHand=true;
  3860. this.changeCursor('hand');
  3861. };
  3862. };
  3863. }break;
  3864. case 18:{//alt键,在当前选择是缩放工具的时候,按下的时候切换到缩小功能
  3865. if(this.altKeyUp){
  3866. if((this.selectedTool!='zoom' && !this.tempZoom) || this.zoomOut)return;
  3867. this.zoomOut=true;
  3868. this.altKeyUp=false;
  3869. this.changeCursor('zoom',true);
  3870. };
  3871. }break;
  3872. case 17:{//ctrl键临时切换到缩放工具
  3873. if(this.ctrlKeyUp){
  3874. var self=this;
  3875. this.ctrlkeyDownTimer=setTimeout(function(){//规避词典软件的ctrl+c,一瞬间切换到缩放的问题
  3876. self.ctrlKeyUp=false;
  3877. if(self.selectedTool!='zoom'){
  3878. self.tempZoom=true;
  3879. self.changeCursor('zoom');
  3880. };
  3881. },100);
  3882. };
  3883. }break;
  3884. case 67:{//c键
  3885. clearTimeout(this.ctrlkeyDownTimer);
  3886. }break;
  3887. case 27:{//ese关闭窗口
  3888. this.remove();
  3889. }break;
  3890. default:break;
  3891. };
  3892. },
  3893. toolbarEventHandler:function(e){
  3894. e.stopPropagation();
  3895. var target=e.target;
  3896. var toolMap=this.toolMap;
  3897. for(var i in toolMap){
  3898. if(toolMap.hasOwnProperty(i) && toolMap[i]==target){
  3899. switch(e.type){
  3900. case 'mousedown':{
  3901. this.selectTool(i);
  3902. }break;
  3903. case 'dblclick':{
  3904. this.dblclickCommand(i);
  3905. }break;
  3906. default:break;
  3907. };
  3908. break;
  3909. };
  3910. };
  3911. },
  3912. imgWindowEventHandler:function(e){
  3913. e.stopPropagation();
  3914. switch(e.type){
  3915. case 'click':{//阻止opera的图片保存
  3916. if(e.ctrlKey && e.target.nodeName=='IMG'){
  3917. e.preventDefault();
  3918. };
  3919. }break;
  3920. case 'mousedown':{
  3921. if(!this.focused){//如果没有focus,先focus
  3922. this.focus();
  3923. this.keepScreenInside();
  3924. };
  3925.  
  3926. var target=e.target;
  3927. if(e.button!=0 || (target!=this.imgWindow && target!=this.img))return;
  3928. var selectedTool=this.selectedTool;
  3929. if(this.tempHand){
  3930. this.move(e);
  3931. }else if(this.tempZoom){
  3932. this.zoom(e);
  3933. }else if(selectedTool=='hand'){
  3934. this.restoreBeforeTool=!this.hKeyUp;
  3935. if(this.hKeyUp){
  3936. this.move(e);
  3937. }else{//鸟瞰视图
  3938. this.aerialView(e);
  3939. };
  3940. }else if(selectedTool=='rotate'){
  3941. var rIS=ImgWindowC.rotateIndicator.style;
  3942. rIS.display='block';
  3943. var origin={//旋转原点
  3944. pageX:e.pageX - 30,//稍微偏左一点。
  3945. pageY:e.pageY,
  3946. };
  3947. rIS.top=origin.pageY + 'px';
  3948. rIS.left=origin.pageX + 'px';
  3949. ImgWindowC.rotateIndicatorPointer.style[support.cssTransform]='rotate(' + this.rotatedRadians + 'rad)';
  3950. this.restoreBeforeTool=!this.rKeyUp;
  3951. this.rotate(origin);
  3952. }else if(selectedTool=='zoom'){
  3953. this.restoreBeforeTool=!this.zKeyUp;
  3954. this.zoom(e);
  3955. };
  3956. }break;
  3957. case 'wheel':{
  3958. if(!this.focused)return;//如果没有focus
  3959. if(e.deltaY===0)return;//非Y轴的滚动
  3960. e.preventDefault();
  3961. if(this.working)return;
  3962. var oriZoomOut=this.zoomOut;
  3963. this.zoomOut = !!(e.deltaY > 0);
  3964.  
  3965. var ratio=this.getZoomRatio({
  3966. x:e.clientX,
  3967. y:e.clientY,
  3968. });
  3969.  
  3970. var level=this.getNextZoomLevel();
  3971.  
  3972. this.zoom(level,ratio);
  3973. this.zoomOut=oriZoomOut;
  3974. }break;
  3975. default:break;
  3976. };
  3977. },
  3978. dblclickCommand:function(tool){
  3979. var done;
  3980. switch(tool){
  3981. case 'hand':{//双击居中,并且适应屏幕
  3982. this.zoom(1);
  3983. this.fitToScreen();
  3984. this.center(true,true);
  3985. this.keepScreenInside();
  3986. }break;
  3987. case 'rotate':{//双击还原旋转
  3988. if(this.rotatedRadians==0)return;
  3989. done=true;
  3990. this.rotate(0,true);
  3991. }break;
  3992. case 'zoom':{//双击还原缩放
  3993. if(this.zoomLevel==1)return;
  3994. done=true;
  3995. this.zoom(1,{x:0,y:0});
  3996. }break;
  3997. default:break;
  3998. };
  3999.  
  4000. if((tool=='rotate' || tool=='zoom') && done){
  4001. var imgWindow=this.imgWindow;
  4002. var imgWinodowRect=imgWindow.getBoundingClientRect();
  4003. var imgWindowStyle=imgWindow.style;
  4004. if(imgWinodowRect.left<40){
  4005. imgWindowStyle.left=40 + window.scrollX + 'px';
  4006. };
  4007. if(imgWinodowRect.top<-5){
  4008. imgWindowStyle.top=-5 + window.scrollY +'px';
  4009. };
  4010. this.keepScreenInside();
  4011. };
  4012.  
  4013. },
  4014. doFlipCommand:function(command){
  4015. var map={
  4016. fv:[/scaleY\([^)]*\)/i,' scaleY(-1) '],
  4017. fh:[/scaleX\([^)]*\)/i,' scaleX(-1) '],
  4018. };
  4019.  
  4020. var iTransform=this.img.style[support.cssTransform];
  4021.  
  4022. var toolClassList=this.toolMap[command].classList;
  4023.  
  4024. if(map[command][0].test(iTransform)){
  4025. iTransform=iTransform.replace(map[command][0],'');
  4026. toolClassList.remove(this.selectedToolClass);
  4027. }else{
  4028. iTransform += map[command][1];
  4029. toolClassList.add(this.selectedToolClass);
  4030. };
  4031. this.img.style[support.cssTransform]=iTransform;
  4032. },
  4033. selectTool:function(tool){
  4034. var command=['fv','fh'];
  4035. if(command.indexOf(tool)==-1){//工具选择
  4036. if(this.selectedTool==tool)return;
  4037. var selectedTool=this.selectedTool;
  4038. this.selectedTool=tool;
  4039. if(this.tempHand || this.tempZoom){//临时工具中。不变鼠标
  4040. return;
  4041. };
  4042. this.toolMap[selectedTool].classList.remove(this.selectedToolClass);
  4043. this.toolMap[tool].classList.add(this.selectedToolClass);
  4044. this.changeCursor(tool);
  4045. }else{//命令
  4046. this.doFlipCommand(tool);
  4047. };
  4048. },
  4049. remove:function(){
  4050. if(this.removed)return;
  4051. this.removed=true;
  4052. this.blur(true);
  4053. this.img.src='';//如果在加载中取消,图片也取消读取。
  4054. if(this.overlayer){
  4055. this.overlayer.parentNode.removeChild(this.overlayer);
  4056. };
  4057. this.imgWindow.parentNode.removeChild(this.imgWindow);
  4058.  
  4059. var index=ImgWindowC.all.indexOf(this);
  4060. ImgWindowC.all.splice(index,1);
  4061.  
  4062. //focus next
  4063. var topmost=0;
  4064. ImgWindowC.all.forEach(function(iwin){
  4065. if(iwin.zIndex > topmost){
  4066. topmost=iwin;
  4067. };
  4068. });
  4069. if(topmost){
  4070. topmost.focus();
  4071. };
  4072. },
  4073. aerialView:function(e){
  4074. this.working=true;
  4075. //记住现在的缩放比例
  4076. var cLevel=this.zoomLevel;
  4077.  
  4078. var wSize=getWindowSize();
  4079. wSize.h -= 16;
  4080. wSize.w -= 16;
  4081.  
  4082. var imgWindow=this.imgWindow;
  4083. var imgWindowCS=getComputedStyle(imgWindow,'');
  4084. var rectSize={
  4085. h:parseFloat(imgWindowCS.height),
  4086. w:parseFloat(imgWindowCS.width),
  4087. };
  4088. var rectRatio=rectSize.h/rectSize.w;
  4089. var windowRatio=wSize.h/wSize.w;
  4090.  
  4091. var size;
  4092. var rangeSize={};
  4093. if(rectRatio > windowRatio){
  4094. size={
  4095. h:wSize.h,
  4096. w:wSize.h / rectRatio,
  4097. };
  4098. rangeSize.h=Math.min(wSize.h * (size.h / rectSize.h), size.h);
  4099. rangeSize.w=Math.min(rangeSize.h / windowRatio , size.w);
  4100. }else{
  4101. size={
  4102. w:wSize.w,
  4103. h:wSize.w * rectRatio,
  4104. };
  4105. rangeSize.w=Math.min(wSize.w * (size.w / rectSize.w), size.w);
  4106. rangeSize.h=Math.min(rangeSize.w * windowRatio , size.h);
  4107. };
  4108.  
  4109.  
  4110. this.zoom(this.getRotatedImgCliSize(size).w/this.imgNaturalSize.w);
  4111.  
  4112. this.center(true,true);
  4113.  
  4114. this.keepScreenInside();
  4115.  
  4116. var viewRange=this.viewRange;
  4117. var vRS=viewRange.style;
  4118. vRS.display='block';
  4119. vRS.height=rangeSize.h + 'px';
  4120. vRS.width=rangeSize.w + 'px';
  4121. vRS.top=0 + 'px';
  4122. vRS.left=0 + 'px';
  4123.  
  4124.  
  4125. var viewRangeRect=viewRange.getBoundingClientRect();
  4126. var viewRangeCenterCoor={
  4127. x:viewRangeRect.left + window.scrollX + 1/2 * rangeSize.w,
  4128. y:viewRangeRect.top + window.scrollY + 1/2 * rangeSize.h,
  4129. };
  4130.  
  4131. var self=this;
  4132.  
  4133. var moveRange={
  4134. x:[8,8+size.w-rangeSize.w],
  4135. y:[8,8+size.h-rangeSize.h]
  4136. };
  4137.  
  4138.  
  4139. function setViewRangePosition(pageXY){
  4140. var top=pageXY.y - viewRangeCenterCoor.y;
  4141. var left=pageXY.x - viewRangeCenterCoor.x;
  4142. if(top<=moveRange.y[0]){
  4143. top=moveRange.y[0];
  4144. }else if(top>=moveRange.y[1]){
  4145. top=moveRange.y[1];
  4146. };
  4147. vRS.top= top + 'px';
  4148. if(left<=moveRange.x[0]){
  4149. left=moveRange.x[0];
  4150. }else if(left>=moveRange.x[1]){
  4151. left=moveRange.x[1];
  4152. };
  4153. vRS.left= left + 'px';
  4154. };
  4155.  
  4156. setViewRangePosition({
  4157. x:e.pageX,
  4158. y:e.pageY,
  4159. });
  4160.  
  4161. var moveHandler=function(e){
  4162. setViewRangePosition({
  4163. x:e.pageX,
  4164. y:e.pageY,
  4165. });
  4166. };
  4167.  
  4168. var mouseupHandler=function(){
  4169. self.working=false;
  4170. viewRange.style.display='none';
  4171. self.zoom(cLevel);
  4172. imgWindow.style.top= -13 - rectSize.h * ((parseFloat(vRS.top) - moveRange.y[0])/size.h) + window.scrollY +'px';
  4173. imgWindow.style.left= -13 - rectSize.w * ((parseFloat(vRS.left) - moveRange.x[0])/size.w) + window.scrollX +'px';
  4174. //说明图片的高度没有屏幕高,居中
  4175. //说明图片的宽度没有屏幕宽,居中
  4176. self.center(rangeSize.w == size.w , rangeSize.h == size.h);
  4177.  
  4178. self.keepScreenInside();
  4179.  
  4180. document.removeEventListener('mousemove',moveHandler,true);
  4181. document.removeEventListener('mouseup',mouseupHandler,true);
  4182. };
  4183. document.addEventListener('mousemove',moveHandler,true);
  4184. document.addEventListener('mouseup',mouseupHandler,true);
  4185. },
  4186. };
  4187.  
  4188.  
  4189. //载入动画
  4190. function LoadingAnimC(data,buttonType,waitImgLoad,openInTopWindow){
  4191. this.data=data;//data
  4192. this.buttonType=buttonType;//点击的按钮类型
  4193. this.openInTopWindow=openInTopWindow;//是否在顶层窗口打开,如果在frame里面的话
  4194. this.waitImgLoad=waitImgLoad;//是否等待完全读取后打开
  4195. this.init();
  4196. };
  4197.  
  4198. LoadingAnimC.all=[];
  4199.  
  4200. LoadingAnimC.prototype={
  4201. init:function(){
  4202. LoadingAnimC.all.push(this);
  4203. this.addStyle();
  4204. var container=document.createElement('span');
  4205.  
  4206. container.classList.add('pv-loading-container');
  4207. this.loadingAnim=container;
  4208.  
  4209. container.title='正在加载:' + this.data.src;
  4210. container.innerHTML=''+
  4211. '<span class="pv-loading-error" style="display:none;">Error</span>'+
  4212. '<span class="pv-loading-cancle" title="取消"></span>';
  4213.  
  4214.  
  4215. var loadingError=container.querySelector('.pv-loading-error');
  4216. var loadingCancle=container.querySelector('.pv-loading-cancle');
  4217.  
  4218. this.loadingError=loadingError;
  4219. this.loadingCancle=loadingCancle;
  4220.  
  4221. var self=this;
  4222. loadingCancle.addEventListener('click',function(e){
  4223. self.imgReady.abort();
  4224. self.remove();
  4225. },true);
  4226.  
  4227. document.body.appendChild(container);
  4228. this.setPosition();
  4229.  
  4230. var img=new Image();
  4231. img.src= this.buttonType=='current'? this.data.imgSrc : this.data.src;
  4232.  
  4233. var opts={
  4234. error:function(e){
  4235. self.error(this,e);
  4236. },
  4237. };
  4238.  
  4239. opts[this.waitImgLoad? 'load' : 'ready' ]=function(e){
  4240. self.load(this,e);
  4241. };
  4242.  
  4243. this.imgReady=imgReady(img,opts);
  4244. },
  4245. addStyle:function(){
  4246. if(LoadingAnimC.styleAdded)return;
  4247. LoadingAnimC.styleAdded=true;
  4248. var style=document.createElement('style');
  4249. style.type='text/css';
  4250. style.textContent='\
  4251. .pv-loading-container {\
  4252. position: absolute;\
  4253. z-index:999999997;\
  4254. top: 100px;\
  4255. left: 100px;\
  4256. background-color: black;\
  4257. background-image: url("'+prefs.icons.loading+'");\
  4258. background-repeat: no-repeat;\
  4259. background-position: center;\
  4260. background-origin: content-box;\
  4261. border: none;\
  4262. padding: 1px 30px 1px 2px;\
  4263. margin: 0;\
  4264. opacity: 0.6;\
  4265. height: 24px;\
  4266. min-width: 24px;\
  4267. box-shadow: 2px 2px 0px #666;\
  4268. -webkit-transition: opacity 0.15s ease-in-out;\
  4269. transition: opacity 0.15s ease-in-out;\
  4270. }\
  4271. .pv-loading-container:hover {\
  4272. opacity: 0.9;\
  4273. }\
  4274. .pv-loading-cancle {\
  4275. cursor: pointer;\
  4276. background-image: url("'+prefs.icons.loadingCancle+'");\
  4277. height: 24px;\
  4278. width: 24px;\
  4279. position: absolute;\
  4280. right: 0;\
  4281. top: 0;\
  4282. opacity: 0.2;\
  4283. display: block;\
  4284. -webkit-transition: opacity 0.15s ease-in-out;\
  4285. transition: opacity 0.15s ease-in-out;\
  4286. }\
  4287. .pv-loading-cancle:hover {\
  4288. opacity: 1;\
  4289. }\
  4290. .pv-loading-error {\
  4291. line-height: 24px;\
  4292. color: red;\
  4293. font-size: 12px;\
  4294. }\
  4295. ';
  4296. document.querySelector('head').appendChild(style);
  4297. },
  4298. remove:function(){
  4299. if(!this.removed){
  4300. this.removed=true;
  4301. this.loadingAnim.parentNode.removeChild(this.loadingAnim);
  4302. LoadingAnimC.all.splice(LoadingAnimC.all.indexOf(this),1);
  4303. };
  4304. },
  4305. error:function(img,e){
  4306. this.loadingAnim.style.backgroundImage='none';
  4307. this.loadingError.style.removeProperty('display');
  4308. var self=this;
  4309. setTimeout(function(){
  4310. self.remove();
  4311. },2000)
  4312. },
  4313. setPosition:function(){
  4314. var position=getTargetPosition(this.data.img);
  4315. var cs=this.loadingAnim.style;
  4316. cs.top=position.top +1 + 'px';
  4317. cs.left=position.left +1 + 'px';
  4318. cs.removeProperty('display');
  4319. },
  4320. load:function(img,e){
  4321. this.remove();
  4322. this.img=img;
  4323. var buttonType=this.buttonType;
  4324.  
  4325. if(buttonType=='gallery'){
  4326. var allData=this.getAllValidImgs();
  4327. allData.target=this.data;
  4328. this.data=allData;
  4329. };
  4330.  
  4331. if(this.openInTopWindow && isFrame && buttonType!='magnifier'){
  4332. var data=this.data;
  4333. //删除不能发送的项。
  4334. var delCantClone=function(obj){
  4335. delete obj.img;
  4336. delete obj.imgPA;
  4337. };
  4338. if(Array.isArray(data)){
  4339. delCantClone(data.target);
  4340. data.forEach(function(obj){
  4341. delCantClone(obj);
  4342. });
  4343. }else{
  4344. delCantClone(data);
  4345. };
  4346.  
  4347. window.postMessage({
  4348. messageID:messageID,
  4349. src:img.src,
  4350. data:data,
  4351. buttonType:buttonType,
  4352. to:'top',
  4353. },'*');
  4354. }else{
  4355. this.open();
  4356. };
  4357.  
  4358.  
  4359. },
  4360. getAllValidImgs:function(){
  4361. var imgs=document.getElementsByTagName('img'),//html collection
  4362. validImgs=[]
  4363. ;
  4364. arrayFn.forEach.call(imgs,function(img,index,imgs){
  4365. var result=findPic(img);
  4366. if(result){
  4367. validImgs.push(result);
  4368. };
  4369. });
  4370. return validImgs;
  4371. },
  4372. open:function(){
  4373. switch(this.buttonType){
  4374. case 'gallery':{
  4375. if(!gallery){
  4376. gallery=new GalleryC();
  4377. };
  4378. gallery.load(this.img,this.data,this.from);
  4379. }break;
  4380. case 'magnifier':{
  4381. new MagnifierC(this.img,this.data);
  4382. }break;
  4383. case 'actual':;
  4384. case 'current':;
  4385. case 'original':{//original 是为了兼容以前的规则
  4386. new ImgWindowC(this.img);
  4387. }break;
  4388. };
  4389. },
  4390. };
  4391.  
  4392. //工具栏
  4393. function FloatBarC(){
  4394. this.init();
  4395. };
  4396.  
  4397.  
  4398. FloatBarC.prototype={
  4399. init:function(){
  4400. this.addStyle();
  4401. var container=document.createElement('span');
  4402. container.id='pv-float-bar-container';
  4403. //innerHTML中的span不能加空格
  4404. container.innerHTML=''+
  4405. '<span class="pv-float-bar-button"></span>'+
  4406. '<span class="pv-float-bar-button"></span>'+
  4407. '<span class="pv-float-bar-button"></span>'+
  4408. '<span class="pv-float-bar-button"></span>';
  4409. document.body.appendChild(container);
  4410.  
  4411. var buttons={};
  4412. this.buttons=buttons;
  4413. this.children=container.children;
  4414.  
  4415. arrayFn.forEach.call(this.children,function(child,index,children){
  4416. var titleMap={
  4417. actual:'Tamaño REAL Size',
  4418. gallery:'Picture Gallery | Galeria de Imágenes',
  4419. current:'Current Size | Tamaño Actual',
  4420. magnifier:'Lupa | Magnifier',
  4421. };
  4422. var buttonName=prefs.floatBar.butonOrder[index];
  4423. buttons[buttonName]=child;
  4424. child.title=titleMap[buttonName];
  4425. child.classList.add('pv-float-bar-button-' + buttonName);
  4426. });
  4427.  
  4428.  
  4429. this.floatBar=container;
  4430. this.shown=true;
  4431. this.preShownImg=null;
  4432.  
  4433.  
  4434. var self=this;
  4435. container.addEventListener('click',function(e){
  4436. var buttonType;
  4437. var target=e.target;
  4438. for(var type in buttons){
  4439. if(!buttons.hasOwnProperty(type))return;
  4440. if(target==buttons[type]){
  4441. buttonType=type;
  4442. break;
  4443. };
  4444. };
  4445. if(!buttonType)return;
  4446.  
  4447. self.hide();
  4448. self.open(e,buttonType);
  4449.  
  4450. },true);
  4451.  
  4452.  
  4453. addCusMouseEvent('mouseleave',container,function(e){
  4454. clearTimeout(self.hideTimer);
  4455. self.hideTimer=setTimeout(function(){
  4456. self.hide();
  4457. },prefs.floatBar.hideDelay);
  4458. });
  4459.  
  4460. addCusMouseEvent('mouseenter',container,function(e){
  4461. clearTimeout(self.hideTimer);
  4462. });
  4463. },
  4464. addStyle:function(){
  4465. var style=document.createElement('style');
  4466. style.type='text/css';
  4467. style.textContent='\
  4468. #pv-float-bar-container {\
  4469. position: absolute;\
  4470. z-index:999999998;\
  4471. top: -100px;\
  4472. left: -100px;\
  4473. padding: 5px;\
  4474. margin: 0;\
  4475. border: none;\
  4476. opacity: 0.6;\
  4477. line-height: 0;\
  4478. -webkit-transition: opacity 0.2s ease-in-out;\
  4479. transition: opacity 0.2s ease-in-out;\
  4480. }\
  4481. #pv-float-bar-container:hover {\
  4482. opacity: 1;\
  4483. }\
  4484. .pv-float-bar-button {\
  4485. cursor: pointer;\
  4486. width: 18px;\
  4487. height: 18px;\
  4488. padding: 1px;\
  4489. margin: 0;\
  4490. border: none;\
  4491. display: inline-block;\
  4492. position: relative;\
  4493. border-radius: 100px;\
  4494. box-shadow: 1px 1px 3px 0px black;\
  4495. background-color: transparent;\
  4496. background-repeat: no-repeat;\
  4497. background-origin: content-box;\
  4498. background-clip: content-box;\
  4499. background-size: 100% 100%;\
  4500. -webkit-transition: margin-left 0.15s ease-in-out, width 0.15s ease-in-out, height 0.15s ease-in-out;\
  4501. transition: margin-left 0.15s ease-in-out, width 0.15s ease-in-out, height 0.15s ease-in-out;\
  4502. }\
  4503. .pv-float-bar-button:nth-child(n+2){\
  4504. margin-left: -16px;\
  4505. }\
  4506. .pv-float-bar-button:first-child {\
  4507. z-index: 4;\
  4508. }\
  4509. .pv-float-bar-button:nth-child(2) {\
  4510. z-index: 3;\
  4511. }\
  4512. .pv-float-bar-button:nth-child(3) {\
  4513. z-index: 2;\
  4514. }\
  4515. .pv-float-bar-button:last-child {\
  4516. z-index: 1;\
  4517. }\
  4518. #pv-float-bar-container:hover > .pv-float-bar-button {\
  4519. width: 24px;\
  4520. height: 24px;\
  4521. }\
  4522. #pv-float-bar-container:hover > .pv-float-bar-button:nth-child(n+2) {\
  4523. margin-left: 0;\
  4524. }\
  4525. .pv-float-bar-button-actual {\
  4526. background-image:url("'+ prefs.icons.actual +'");\
  4527. background-color: red;\
  4528. }\
  4529. .pv-float-bar-button-gallery {\
  4530. background-image:url("'+ prefs.icons.gallery +'");\
  4531. background-color: yellow;\
  4532. }\
  4533. .pv-float-bar-button-current {\
  4534. background-image:url("'+ prefs.icons.current +'");\
  4535. background-color: blue;\
  4536. }\
  4537. .pv-float-bar-button-magnifier {\
  4538. background-image:url("'+ prefs.icons.magnifier +'");\
  4539. background-color: pink;\
  4540. }\
  4541. ';
  4542. document.querySelector('head').appendChild(style);
  4543. },
  4544. start:function(data){
  4545.  
  4546. //读取中的图片,不显示浮动栏,调整读取图标的位置.
  4547. if(LoadingAnimC.all._find(function(item,index,array){
  4548. if(data.img==item.data.img){
  4549. return true;
  4550. };
  4551. }))return;
  4552.  
  4553.  
  4554. //被放大镜盯上的图片,不要显示浮动栏.
  4555. if(MagnifierC.all._find(function(item,index,array){
  4556. if(data.img==item.data.img){
  4557. return true;
  4558. };
  4559. }))return;
  4560.  
  4561. this.data=data;
  4562. var self=this;
  4563. clearTimeout(this.hideTimer);
  4564.  
  4565. var imgOutHandler=function(e){
  4566. document.removeEventListener('mouseout',imgOutHandler,true);
  4567. clearTimeout(self.showTimer);
  4568. clearTimeout(self.hideTimer);
  4569. self.hideTimer=setTimeout(function(){
  4570. self.hide();
  4571. },prefs.floatBar.hideDelay);
  4572. };
  4573.  
  4574. clearTimeout(this.globarOutTimer);
  4575. this.globarOutTimer=setTimeout(function(){//稍微延时。错开由于css hover样式发生的out;
  4576. document.addEventListener('mouseout',imgOutHandler,true);
  4577. },100);
  4578.  
  4579.  
  4580. if(data.img==this.preShownImg && this.shown){
  4581. this.setPosition();
  4582. return;
  4583. };
  4584.  
  4585. clearTimeout(this.showTimer);
  4586. this.showTimer=setTimeout(function(){
  4587. self.show();
  4588. },prefs.floatBar.showDelay);
  4589. },
  4590. setButton:function(){
  4591. if(this.data.type=='force'){
  4592. this.buttons['actual'].style.display='none';
  4593. this.buttons['magnifier'].style.display='none';
  4594. }else{
  4595. this.buttons['actual'].style.removeProperty('display');
  4596. this.buttons['magnifier'].style.removeProperty('display');
  4597. };
  4598.  
  4599. //如果隐藏的按钮是第一个,css弹出层叠按钮的动画会有些维和,这些修正一下。
  4600. var firstHidden;
  4601. arrayFn._find.call(this.children,function(child, index, children){
  4602. var cs=child.style;
  4603. if(index==0){
  4604. if(cs.display=='none'){
  4605. firstHidden=true;
  4606. };
  4607. };
  4608.  
  4609. if(firstHidden){//如果第一个是隐藏的,那么去掉以后第一个非隐藏的marginleft
  4610. if(cs.display!='none'){
  4611. cs.marginLeft=0;
  4612. return true;
  4613. };
  4614. }else{
  4615. cs.removeProperty('margin-left');
  4616. };
  4617. });
  4618. },
  4619. setPosition:function(){
  4620. //如果图片被删除了,或者隐藏了。
  4621. var bCR=this.data.img.getBoundingClientRect();
  4622.  
  4623. if((bCR.left==0 && bCR.right==0) || (bCR.top==0 && bCR.bottom==0))return false;
  4624.  
  4625. var targetPosi=getTargetPosition(this.data.img);
  4626. var windowSize=getWindowSize();
  4627.  
  4628. var floatBarPosi=prefs.floatBar.position.toLowerCase().trim().split(/\s+/);
  4629.  
  4630. var offsetX=prefs.floatBar.offset.x;
  4631. var offsetY=prefs.floatBar.offset.y;
  4632.  
  4633.  
  4634. var scrollXY={
  4635. x:window.scrollX,
  4636. y:window.scrollY,
  4637. };
  4638.  
  4639. var fbs=this.floatBar.style;
  4640. var setPosition={
  4641. top:function(){
  4642. var top=targetPosi.top;
  4643. if(targetPosi.t < -offsetY){//满足图标被遮住的条件.
  4644. top=scrollXY.y;
  4645. offsetY=0;
  4646. };
  4647. fbs.top=top + offsetY + 'px';
  4648. },
  4649. right:function(){
  4650. var right=windowSize.w - targetPosi.r;
  4651. if(right < offsetX){
  4652. right= -scrollXY.x;
  4653. offsetX=0;
  4654. }else{
  4655. right -=scrollXY.x;
  4656. };
  4657. fbs.right=right - offsetX + 'px';
  4658. },
  4659. bottom:function(){
  4660. var bottom=windowSize.h-targetPosi.b;
  4661. if(bottom <= offsetY){
  4662. offsetY=0;
  4663. };
  4664. bottom -= scrollXY.y;
  4665. fbs.bottom=bottom - offsetY + 'px';
  4666. },
  4667. left:function(){
  4668. var left=targetPosi.left;
  4669. if(targetPosi.l < -offsetX){
  4670. left=scrollXY.x;
  4671. offsetX=0;
  4672. };
  4673. fbs.left=left + offsetX + 'px';
  4674. },
  4675. };
  4676.  
  4677. setPosition[floatBarPosi[0]]();
  4678. setPosition[floatBarPosi[1]]();
  4679. },
  4680. show:function(){
  4681. if(this.setPosition()===false){
  4682. return;
  4683. };
  4684. this.preShownImg=this.data.img;
  4685. this.shown=true;
  4686. this.setButton();
  4687. this.floatBar.style.removeProperty('display');
  4688. clearTimeout(this.hideTimer);
  4689. },
  4690. hide:function(){
  4691. clearTimeout(this.showTimer);
  4692. this.shown=false;
  4693. this.floatBar.style.display='none';
  4694. },
  4695. open:function(e,buttonType){
  4696. var waitImgLoad=e.ctrlKey? !prefs.waitImgLoad : prefs.waitImgLoad;//按住ctrl取反向值
  4697. var openInTopWindow=e.shiftKey? !prefs.framesPicOpenInTopWindow : prefs.framesPicOpenInTopWindow;//按住shift取反向值
  4698.  
  4699. if(!waitImgLoad && buttonType=='magnifier' && !envir.chrome){//非chrome的background-image需要全部载入后才能显示出来
  4700. waitImgLoad=true;
  4701. };
  4702. new LoadingAnimC(this.data,buttonType,waitImgLoad,openInTopWindow);
  4703. },
  4704. };
  4705.  
  4706.  
  4707. var matchedRule,
  4708. URL=location.href,
  4709. floatBar
  4710. ;
  4711.  
  4712. function findPic(img){
  4713. var imgPA=getElementByXpath('./ancestor::a[1]',img);
  4714.  
  4715. var iPASrc=imgPA? imgPA.href : '';
  4716. //base64字符串过场导致正则匹配卡死浏览器
  4717. var base64Img=/^data:[^;]+;base64,/i.test(img.src);
  4718.  
  4719.  
  4720. if(matchedRule===undefined){//找到符合站点的高级规则,并缓存.
  4721. matchedRule=siteInfo._find(function(site,index,array){
  4722. if(site.enabled && site.url && site.url.test(URL)){
  4723. return true;
  4724. };
  4725. });
  4726. matchedRule=matchedRule? matchedRule[0] : false;
  4727. //console.log('匹配的规则:',matchedRule);
  4728. };
  4729.  
  4730. var src, type;
  4731.  
  4732. if(!src && matchedRule){//通过高级规则获取.
  4733. try{
  4734. src=matchedRule.getImage.call(img,img,imgPA);
  4735. }catch(err){
  4736. throwErrorInfo(err);
  4737. };
  4738.  
  4739. if(src)type='rule';
  4740. };
  4741.  
  4742. if(!src && !base64Img){//遍历通配规则
  4743. tprules._find(function(rule,index,array){
  4744. try{
  4745. src=rule.call(img,img,imgPA);
  4746. if(src){
  4747. //console.log('匹配的通配规则',rule);
  4748. return true;
  4749. };
  4750. }catch(err){
  4751. throwErrorInfo(err);
  4752. };
  4753. });
  4754. if(src)type='tpRule';
  4755. };
  4756.  
  4757. if(!src && imgPA){//链接可能是一张图片...
  4758. if(/\.(?:jpg|jpeg|png|gif|bmp)$/i.test(iPASrc)){
  4759. src=iPASrc;
  4760. };
  4761. if(src)type='scale';
  4762. };
  4763.  
  4764. if(!src){//本图片是否被缩放.
  4765. var imgAS={//实际尺寸。
  4766. h:img.naturalHeight,
  4767. w:img.naturalWidth,
  4768. };
  4769. var imgCS=getCurrentSize(img);
  4770. if(!(imgAS.w==imgCS.w && imgAS.h==imgCS.h)){//如果不是两者完全相等,那么被缩放了.
  4771. if(imgAS.h > prefs.floatBar.minSizeLimit.h || imgAS.w > prefs.floatBar.minSizeLimit.w){//最小限定判断.
  4772. src=img.src;
  4773. type='scale';
  4774. };
  4775. }else{
  4776. if(prefs.floatBar.forceShow.enabled && (imgCS.w>=prefs.floatBar.forceShow.size.w && imgCS.h>=prefs.floatBar.forceShow.size.h)){
  4777. src=img.src;
  4778. type='force';
  4779. };
  4780. };
  4781. };
  4782.  
  4783.  
  4784. if(!src)return;
  4785.  
  4786. var ret={
  4787. src:src,//得到的src
  4788. type:type,//通过哪种方式得到的
  4789. imgSrc:img.src,//处理的图片的src
  4790. iPASrc:iPASrc,//图片的第一个父a元素的链接地址
  4791.  
  4792. img:img,//处理的图片
  4793. imgPA:imgPA,//图片的第一个父a元素
  4794. };
  4795.  
  4796. //console.log('图片查找结果:',ret);
  4797. return ret;
  4798. };
  4799.  
  4800.  
  4801. var isFrame=window!=window.parent;
  4802.  
  4803. window.addEventListener('message',function(e){//contentscript里面的message监听,监听来自别的窗口的数据。
  4804. var data=e.data;
  4805. if( !data || !data.messageID || data.messageID != messageID )return;//通信ID认证
  4806. var source=e.source;
  4807. if(typeof source=='undefined' || source!==window){//来自别的窗口
  4808. if(!isFrame){//顶层窗口
  4809. //console.log('top-contentscript接收到:',e);
  4810.  
  4811. /*
  4812. window.postMessage({
  4813. messageID:messageID,
  4814. to:data.from,
  4815. data:'hello',
  4816. },'*');
  4817. */
  4818.  
  4819. var img=new Image();
  4820. img.src=data.src;
  4821.  
  4822.  
  4823. imgReady(img,{
  4824. ready:function(){
  4825. LoadingAnimC.prototype.open.call({
  4826. img:img,
  4827. data:data.data,
  4828. buttonType:data.buttonType,
  4829. from:data.from,//来自哪个窗口
  4830. });
  4831. },
  4832. });
  4833. }else{//frame窗口
  4834. //console.log('frame-contentscript接收到',e);
  4835. };
  4836.  
  4837. };
  4838. },true);
  4839.  
  4840.  
  4841.  
  4842. //页面脚本用来转发消息
  4843. //原因chrome的contentscript无法访问非自己外的别的窗口。都会返回undefined,自然也无法向其他的窗口发送信息,这里用pagescript做个中间代理
  4844. //通讯逻辑..A页面的contentscript发送到A页面的pagescript,pagescript转交给B页面的contentscript
  4845.  
  4846. var messageID='pv-0.5106795670312598';
  4847.  
  4848. var pageScript=document.createElement('script');
  4849.  
  4850. var pageScriptText=function(messageID){
  4851. var frameID=Math.random();
  4852. var frames={
  4853. top:window.top,
  4854. };
  4855.  
  4856. window.addEventListener('message',function(e){
  4857. var data=e.data;
  4858. if( !data || !data.messageID || data.messageID != messageID )return;//通信ID认证
  4859. var source=e.source;
  4860. if(source===window){//来自contentscript,发送出去
  4861. data.from=frameID;
  4862. frames[data.to].postMessage(data,'*');
  4863. }else{//来自别的窗口的,contentscript可以直接接收,这里保存下来自的窗口的引用
  4864. frames[data.from]=source;
  4865. };
  4866. },true)
  4867. };
  4868.  
  4869. pageScript.textContent='(' + pageScriptText.toString() + ')('+ JSON.stringify(messageID) +')';
  4870. document.querySelector('head').appendChild(pageScript);
  4871.  
  4872.  
  4873. function clikToOpen(data){
  4874.  
  4875. var preventDefault = matchedRule.clikToOpen.preventDefault;
  4876.  
  4877. function mouseout(){
  4878. document.removeEventListener('mouseout',mouseout,true);
  4879. document.removeEventListener('click',click,true);
  4880. if(data.imgPA && preventDefault){
  4881. data.imgPA.removeEventListener('click',clickA,false);
  4882. };
  4883. };
  4884.  
  4885. function click(e){
  4886. FloatBarC.prototype.open.call({
  4887. data:data,
  4888. },
  4889. e,
  4890. matchedRule.clikToOpen.type);
  4891. };
  4892.  
  4893. function clickA(e){//阻止a的默认行为
  4894. e.preventDefault();
  4895. };
  4896.  
  4897. document.addEventListener('click',click,true);
  4898.  
  4899. if(data.imgPA && preventDefault){
  4900. data.imgPA.addEventListener('click',clickA,false);
  4901. };
  4902.  
  4903. setTimeout(function(){//稍微延时。错开由于css hover样式发生的out;
  4904. document.addEventListener('mouseout',mouseout,true);
  4905. },100);
  4906. return function(){
  4907. mouseout()
  4908. };
  4909. };
  4910.  
  4911. //监听 mouseover
  4912. var canclePreCTO;
  4913. function globalMouseoverHandler(e){
  4914.  
  4915. if(galleryMode)return;//库模式全屏中......
  4916.  
  4917. var target=e.target;
  4918. if(target.nodeName!='IMG' || target.classList.contains('pv-pic-not-allowed')){
  4919. return;
  4920. };
  4921.  
  4922. var result=findPic(target);
  4923. if(result){
  4924. if(!floatBar){
  4925. floatBar=new FloatBarC();
  4926. };
  4927. if(result.type=='rule' && matchedRule.clikToOpen && matchedRule.clikToOpen.enabled){
  4928. if(canclePreCTO){//取消上次的,防止一次点击打开多张图片
  4929. canclePreCTO();
  4930. };
  4931. canclePreCTO=clikToOpen(result);
  4932. };
  4933. floatBar.start(result);//出现悬浮工具栏
  4934. };
  4935. };
  4936.  
  4937. document.addEventListener('mouseover',globalMouseoverHandler,true);
  4938. };
  4939.  
  4940.  
  4941. function init2(){
  4942. init(topObject,window,document,arrayFn,envir);
  4943. };
  4944.  
  4945.  
  4946. var arrayFn=(function(){
  4947. //Array的某些方法对所有的类数组都有效,比如HTMLCollection,NodeList
  4948.  
  4949. //添加一个当函数返回true时,返回[array[index],index],并且跳出循环的方法
  4950. //类似做到 for 循环,在满足条件的时候直接break跳出的效果。
  4951. if(typeof Array.prototype['_find']!='function'){
  4952. Object.defineProperty(Array.prototype,'_find',{
  4953. value:function(callback , thisArg){
  4954. if (this == null){
  4955. throw new TypeError( "this is null or not defined" );
  4956. };
  4957.  
  4958. if(typeof callback != 'function') {
  4959. throw new TypeError( callback + " is not a function" );
  4960. };
  4961.  
  4962. var i = 0,
  4963. l = this.length,
  4964. value,
  4965. hasOwnProperty=Object.prototype.hasOwnProperty
  4966. ;
  4967.  
  4968.  
  4969. while(i<l){
  4970. if(hasOwnProperty.call(this,i)){
  4971. value = this[i];
  4972. if(callback.call( thisArg, value, i, this )===true){
  4973. return [value,i,this];
  4974. };
  4975. };
  4976. i++;
  4977. };
  4978. },
  4979. writable:true,
  4980. enumerable:false,//与原生方法一样不可枚举,维护网页和谐。。。
  4981. configurable:true,
  4982. });
  4983. };
  4984.  
  4985. var arrayProto=Array.prototype;
  4986. return {
  4987. _find:arrayProto._find,
  4988. slice:arrayProto.slice,
  4989. forEach:arrayProto.forEach,
  4990. some:arrayProto.some,
  4991. every:arrayProto.every,
  4992. map:arrayProto.map,
  4993. filter:arrayProto.filter,
  4994. indexOf:arrayProto.indexOf,
  4995. lastIndexOf:arrayProto.lastIndexOf,
  4996. };
  4997.  
  4998. })();
  4999.  
  5000.  
  5001. //检测运行环境
  5002. var envir={
  5003. opera:!!window.opera,
  5004. chrome:!!window.chrome,
  5005. firefox:typeof XPCNativeWrapper=='function'? true : false,
  5006. };
  5007.  
  5008.  
  5009. if(document.readyState=='loading'){
  5010. document.addEventListener('DOMContentLoaded',init2,true);
  5011. }else if(document.readyState!='complete'){
  5012. document.addEventListener('DOMContentLoaded',function(){
  5013. window.removeEventListener('load',init2,true);
  5014. init2();
  5015. },true);
  5016. window.addEventListener('load',init2,true);
  5017. }else{
  5018. init2();
  5019. };
  5020. })(this,window,document)
  5021.  
  5022. }{ var greasedLightbox = {
  5023. aspectRatio : null,
  5024. timer : null,
  5025. slideTime : 3,
  5026. currentAddress : null,
  5027. allImageLinks : [],
  5028. currentImagePosition : 0,
  5029. lastMove : 1,
  5030. isShowing : false,
  5031. isSlideShow : false,
  5032. searchDefs : [
  5033. // wikipedia (needs to come before 'show')
  5034. {
  5035. name : 'wikipedia',
  5036. includeRegExp : /^https?:\/\/(.*?\.)?wikipedia\.org/i,
  5037. 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,
  5038. findImageRegExp : /(.+?)\/thumb\/(.+?)\.(jpe?g|gif|png).*$/i,
  5039. replaceString : '$1/$2.$3',
  5040. showFunction : function(event) { greasedLightbox.showFrom(event, 'wikipedia'); return false; }
  5041. }, // wikipedia
  5042. // imagesocket (needs to come before 'show')
  5043. {
  5044. name : 'imagesocket',
  5045. includeRegExp : /./, // used on every page
  5046. linkRegExp : /^(https?:\/\/)(.*?\.)?imagesocket\.com\/(view|thumbs)\/(.*?\.(jpe?g|gif|png))$/i,
  5047. replaceString : '$1content.imagesocket.com/images/$4',
  5048. showFunction : function(event) { greasedLightbox.showFrom(event, 'imagesocket'); return false; }
  5049. }, // imagesocket
  5050. // imagesocket site (needs to come before 'show')
  5051. {
  5052. name : 'imagesocketSite',
  5053. includeRegExp : /^https?:\/\/(.*?\.)?imagesocket\.com/i,
  5054. linkRegExp : /^\/view\/(.*?\.(jpe?g|gif|png))$/i,
  5055. replaceString : 'http://content.imagesocket.com/images/$1',
  5056. showFunction : function(event) { greasedLightbox.showFrom(event, 'imagesocketSite'); return false; }
  5057. }, // imagesocket site
  5058. // blogger/blogspot (needs to come before 'show')
  5059. {
  5060. name : 'blogger',
  5061. includeRegExp : /^https?:\/\/(.*?\.)?blog(ger|spot)\.com/i,
  5062. linkRegExp : /^(https?:\/\/.*?\.blogger\.com\/.*?\/.*?\/.*?\/.*?)\/.*?-h(\/.*?\.(jpe?g|gif|png))$/i,
  5063. replaceString : '$1$2',
  5064. showFunction : function(event) { greasedLightbox.showFrom(event, 'blogger'); return false; }
  5065. }, // blogger/blogspot
  5066. // radikal.ru
  5067. {
  5068. name : 'radikal',
  5069. includeRegExp : /./, // used in every page
  5070. linkRegExp : /http:\/\/(radikal.ru\/F\/)?(.*\.(jpg|png))(\.html)?$/i,
  5071. replaceString : 'http://$2',
  5072. showFunction : function(event) { greasedLightbox.showFrom(event, 'radikal'); return false; }
  5073. }, // radikal.ru
  5074. // regular links to images
  5075. {
  5076. name : 'show',
  5077. includeRegExp : /./, // used on every page
  5078. linkRegExp : /.*?\.(jpe?g|gif|png)$/i,
  5079. excludeLinkRegExp : /\?/i,
  5080. showFunction : function(event) { greasedLightbox.show(event); return false; }
  5081. }, // regular links to images
  5082. // picasa
  5083. /* "view in original context" is not worked propertly */
  5084. {
  5085. name : 'picasa',
  5086. includeRegExp : /./, // used on every page
  5087. linkRegExp : /https?:\/\/picasaweb\.google\..*\/.+/i,
  5088. findImageRegExp : /^(https?:\/\/.*)\/s[0-9]+\/(.*)\.jpg$/i,
  5089. replaceString : '$1/s1024/$2.jpg',
  5090. showFunction : function(event) { greasedLightbox.showFrom(event, 'picasa'); return false; }
  5091. },
  5092. // ipicture/upload
  5093. {
  5094. name : 'ipicture',
  5095. includeRegExp : /./, // used on every page
  5096. linkRegExp : /http:\/\/ipicture\.ru\/upload\/(.*(jpg|png|jpeg|gif))$/i,
  5097. replaceString : 'http://ipicture.ru/upload/$1',
  5098. showFunction : function(event) { greasedLightbox.showFrom(event, 'picasa'); return false; }
  5099. },
  5100. // search engine images (google, yahoo, ask jeeves, blingo)
  5101. {
  5102. name : 'search',
  5103. includeRegExp : /^https?:\/\/(.*?\.)?(google\..*|search\.yahoo\.com|blingo\.com\/images)/i,
  5104. linkRegExp : /.*?(im(age|g)(ur(i|l)|src))=(http(s?):\/\/)?(.*?)&.*/i,
  5105. replaceString : 'http$6://$7',
  5106. showFunction : function(event) { greasedLightbox.showFrom(event, 'search'); return false; }
  5107. }, // search engine images
  5108. // doubanpic
  5109. {
  5110. name : 'doubanpic',
  5111. includeRegExp : /^http:\/\/www\.douban\.com\/subject\/[0-9]+\//i,
  5112. linkRegExp : /^(http:\/\/t\.douban\.com\/)l(pic\/s[0-9]+\.jpg)/i,
  5113. replaceString : '$1m$2',
  5114. showFunction : function(event) { greasedLightbox.showFrom(event, 'doubanpic'); return false; }
  5115. }, // doubanpic
  5116. // doubanphoto
  5117. {
  5118. name : 'doubanphoto',
  5119. includeRegExp : /^http:\/\/www\.douban\.com\/photos\/album\/[0-9]+\//i,
  5120. linkRegExp : /^http:\/\/www\.douban\.com\/photos\/photo\/([0-9]+)\/$/i,
  5121. replaceString : 'http://t.douban.com/view/photo/photo/public/p$1.jpg',
  5122. showFunction : function(event) { greasedLightbox.showFrom(event, 'doubanphoto'); return false; }
  5123. }, // doubanphoto
  5124. // doubanevent
  5125. {
  5126. name : 'doubanevent',
  5127. includeRegExp : /^http:\/\/www\.douban\.com\/event\/album\/[0-9]+\//i,
  5128. linkRegExp : /^http:\/\/www\.douban\.com\/event\/photo\/([0-9]+)\/$/i,
  5129. replaceString : 'http://t.douban.com/view/photo/photo/public/p$1.jpg',
  5130. showFunction : function(event) { greasedLightbox.showFrom(event, 'doubanevent'); return false; }
  5131. }, // doubanevent
  5132. // doubanonline
  5133. {
  5134. name : 'doubanonline',
  5135. includeRegExp : /^http:\/\/www\.douban\.com\/online\/[0-9]+\/album\/[0-9]+\//i,
  5136. linkRegExp : /^http:\/\/www\.douban\.com\/online\/[0-9]+\/photo\/([0-9]+)\/$/i,
  5137. replaceString : 'http://img2.douban.com/view/photo/photo/public/p$1.jpg',
  5138. showFunction : function(event) { greasedLightbox.showFrom(event, 'doubanonline'); return false; }
  5139. }, // doubanonline
  5140. // doubanartist1
  5141. {
  5142. name : 'doubanartist1',
  5143. includeRegExp : /^http:\/\/www\.douban\.com\/artist\/[a-z]+\/album\/[0-9]+\//i,
  5144. linkRegExp : /^http:\/\/www\.douban\.com\/artist\/[a-z]+\/photo\/([0-9]+)\/$/i,
  5145. replaceString : 'http://t.douban.com/view/photo/photo/public/p$1.jpg',
  5146. showFunction : function(event) { greasedLightbox.showFrom(event, 'doubanartist1'); return false; }
  5147. }, // artist1
  5148. // doubanartist2
  5149. {
  5150. name : 'doubanartist2',
  5151. includeRegExp : /^http:\/\/www\.douban\.com\/artist\/[a-z]+\/public_album\/[0-9]+\//i,
  5152. linkRegExp : /^http:\/\/www\.douban\.com\/artist\/[a-z]+\/public_photo\/([0-9]+)\/$/i,
  5153. replaceString : 'http://t.douban.com/view/photo/photo/public/p$1.jpg',
  5154. showFunction : function(event) { greasedLightbox.showFrom(event, 'doubanartist2'); return false; }
  5155. }, // doubanartist2
  5156. // flickr
  5157. {
  5158. name : 'flickr',
  5159. includeRegExp : /^https?:\/\/(.*?\.)?flickr\.com/i,
  5160. linkRegExp : /\/photos\/[^\/]+\/[0-9]+/i,
  5161. findImageRegExp : /_[tsm]\.jpg/i,
  5162. replaceString : '.jpg',
  5163. showFunction : function(event) { greasedLightbox.showFrom(event, 'flickr'); return false; }
  5164. }, // flickr
  5165. // facebook
  5166. /* removed support because they now have nice built-in image viewing features
  5167. {
  5168. name : 'facebook',
  5169. includeRegExp : /^https?:\/\/(.*?\.)?facebook\.com/i,
  5170. linkRegExp : /photo\.php\?pid=[0-9]+/i,
  5171. findImageRegExp : /[st]([0-9]+.*?)\.jpg/i,
  5172. replaceString : 'n$1.jpg',
  5173. showFunction : function(event) { greasedLightbox.showFrom(event, 'facebook'); return false; }
  5174. }, // facebook
  5175. */
  5176. // myspace1
  5177. {
  5178. name : 'myspace1',
  5179. includeRegExp : /^https?:\/\/(.*?\.)?myspace\.com/i,
  5180. linkRegExp : /imageID=[0-9]+/i,
  5181. findImageRegExp : /m_(.+)\.jpg/i,
  5182. replaceString : 'l_$1.jpg',
  5183. showFunction : function(event) { greasedLightbox.showFrom(event, 'myspace1'); return false; }
  5184. }, // myspace1
  5185. // myspace2
  5186. {
  5187. name : 'myspace2',
  5188. includeRegExp : /^https?:\/\/(.*?\.)?myspace\.com/i,
  5189. linkRegExp : /imageID/i,
  5190. findImageRegExp : /_m/i,
  5191. replaceString : '_l',
  5192. showFunction : function(event) { greasedLightbox.showFrom(event, 'myspace2'); return false; }
  5193. }, // myspace2
  5194. // deviantart
  5195. {
  5196. name : 'deviantart',
  5197. includeRegExp : /^https?:\/\/(.*?\.)?deviantart\.com/i,
  5198. linkRegExp : /deviantart\.com\/(deviation|print|art)\/.+/i,
  5199. findImageRegExp : /^http(s)?:\/\/.*?\.deviantart\.com\/([^\/]*)\/[^\/]*\/(.*?)\.(jpe?g|gif|png)$/i,
  5200. replaceString : 'http$1://fc01.deviantart.com/$2/$3.$4',
  5201. showFunction : function(event) { greasedLightbox.showFrom(event, 'deviantart'); return false; }
  5202. }, // deviantart
  5203. // subvariance
  5204. {
  5205. name : 'subvariance',
  5206. includeRegExp : /^https?:\/\/(.*?\.)?subvariance\.com/i,
  5207. linkRegExp : /\/view\/[0-9]+/i,
  5208. findImageRegExp : /\/items\/thumbs\/(.*?)\.jpg/i,
  5209. replaceString : '/items/$1.jpg',
  5210. showFunction : function(event) { greasedLightbox.showFrom(event, 'subvariance'); return false; }
  5211. }, // subvariance
  5212. // gmail
  5213. {
  5214. name : 'gmail',
  5215. includeRegExp : /^https?:\/\/mail\.google\..*/i,
  5216. linkRegExp : /^(\/mail\/\?view=att&(amp;)?disp=)inline/i,
  5217. replaceString : 'http://' + window.location.host + '$1emb',
  5218. showFunction : function(event) { greasedLightbox.showFrom(event, 'gmail'); return false; }
  5219. }, // gmail
  5220. // imagefap
  5221. {
  5222. name : 'imagefap',
  5223. includeRegExp : /^https?:\/\/(.*?\.)?imagefap\.com/i,
  5224. linkRegExp : /(image.php\?id=|gallery\/)[0-9]+/i,
  5225. findImageRegExp : /\/images\/(thumb|mini)\/([0-9]+)\/([0-9]+)\/([0-9]+)\.jpg/i,
  5226. replaceString : '/full/$2/$3/$4.jpg',
  5227. showFunction : function(event) { greasedLightbox.showFrom(event, 'imagefap'); return false; }
  5228. },
  5229. // ffffound!
  5230. {
  5231. name : 'ffffound',
  5232. includeRegExp : /^https?:\/\/(.*?\.)?ffffound\.com/i,
  5233. linkRegExp : /\/image\/[\w]+$/i,
  5234. findImageRegExp : /img(-thumb)?\.ffffound\.com\/static-data\/assets\/([\w\/]+?)_[\w]+\.(jpe?g|gif|png)$/i,
  5235. replaceString : 'img.ffffound.com/static-data/assets/$2.$3',
  5236. showFunction : function(event) { greasedLightbox.showFrom(event, 'ffffound'); return false; }
  5237. },
  5238. // textamerica
  5239. /* removed support because they are now subscription-based
  5240. {
  5241. name : 'textamerica',
  5242. includeRegExp : /^http(s)?:\/\/(.*?\.)?textamerica\.com/i,
  5243. linkRegExp : /\?r=[0-9]+$/i,
  5244. findImageRegExp : /user\.images\.x\/(.*?\/.*?)\/(.*?)\/(.*?)\.jpg(.*)$/i,
  5245. replaceString : 'user.images.x/$1\/$3.jpg',
  5246. showFunction : function(event) { greasedLightbox.showFrom(event, 'textamerica'); return false; }
  5247. } // textamerica
  5248. */
  5249. // image http://bp2.blogger.com/_a7jkcMVp5Vg/SAGu9Ym-S2I/AAAAAAAAEoM/WCGF3uywJzE/s400/empty.jpg
  5250. // link http://bp2.blogger.com/_a7jkcMVp5Vg/SAGu9Ym-S2I/AAAAAAAAEoM/WCGF3uywJzE/s1600-h/empty.jpg
  5251. // final image http://bp2.blogger.com/_a7jkcMVp5Vg/SAGu9Ym-S2I/AAAAAAAAEoM/WCGF3uywJzE/s1600/empty.jpg
  5252. ], // searchDefs[]
  5253. // useLinkForShow()
  5254. useLinkForShow : function(searchDef) {
  5255. if (searchDef.findImageRegExp)
  5256. return false;
  5257. else
  5258. return true;
  5259. },
  5260. // showFrom()
  5261. // generic helper function that calls show() with the correct parameters
  5262. showFrom : function(event, showName) {
  5263. var link;
  5264. if (event.currentTarget)
  5265. link = event.currentTarget;
  5266. else
  5267. link = event;
  5268. var address = unescape(unescape(greasedLightbox.getAddress(link)));
  5269. var img = greasedLightbox.getImageToShow(link, address, showName);
  5270. greasedLightbox.show(event, img, address);
  5271. }, // showFromLink()
  5272. // getImageToShow()
  5273. getImageToShow : function(link, address, showName) {
  5274. var searchDef = greasedLightbox.getRegExpObj(greasedLightbox.searchDefs, showName);
  5275. if (greasedLightbox.useLinkForShow(searchDef)) {
  5276. address = unescape(unescape(address));
  5277. if (searchDef['replaceString'])
  5278. var img = address.replace(searchDef['linkRegExp'], searchDef['replaceString']);
  5279. else
  5280. var img = address.match(searchDef['linkRegExp'])[0];
  5281. } else {
  5282. var img = greasedLightbox.containsThumb(link, greasedLightbox.getRegExpObj(greasedLightbox.searchDefs, showName), true);
  5283. }
  5284. return img;
  5285. }, // getImageToShow()
  5286. // getRegExpObj()
  5287. // returns the requested regular expression object from the regExp array
  5288. getRegExpObj : function(regExpObject, showName) {
  5289. var rExObj;
  5290. for (var i = 0; i < regExpObject.length; i++) {
  5291. rExObj = regExpObject[i];
  5292. if (rExObj['name'] == showName)
  5293. return rExObj;
  5294. }
  5295. }, // getRegExpObj()
  5296. // containsThumb()
  5297. containsThumb : function(elem, rExObj, verbose) {
  5298. var images, image, src;
  5299. images = document.evaluate('descendant::img[@src]', elem, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  5300. for(var i = 0; i < images.snapshotLength; i++) {
  5301. thisImage = images.snapshotItem(i);
  5302. src = thisImage.getAttribute('src');
  5303. if(rExObj['findImageRegExp'].test(src)) {
  5304. if(!verbose) return true;
  5305. return src.replace(rExObj['findImageRegExp'], rExObj['replaceString']);
  5306. }
  5307. }
  5308. return false;
  5309. }, // containsThumb()
  5310. // getAddress()
  5311. // extracts an address out of a linkObj
  5312. getAddress : function(linkObj) {
  5313. var address = linkObj.getAttribute('href');
  5314. // for GreaseKit users because Safari doesn't like stopping events even though it says it does...
  5315. if(/Safari/.test(navigator.userAgent)) {
  5316. linkObj.onclick = function() { return false; };
  5317. }
  5318. return address;
  5319. }, // getAddress()
  5320. // getPageScroll()
  5321. // Returns array with x,y page scroll values.
  5322. // Core code from - quirksmode.org
  5323. getPageScroll : function() {
  5324. var xScroll, yScroll;
  5325. if (self.pageYOffset) {
  5326. yScroll = self.pageYOffset;
  5327. } else if (document.documentElement && document.documentElement.scrollTop){ // Explorer 6 Strict
  5328. yScroll = document.documentElement.scrollTop;
  5329. } else if (document.body) {// all other Explorers
  5330. yScroll = document.body.scrollTop;
  5331. }
  5332. if (self.pageXOffset) {
  5333. xScroll = self.pageXOffset;
  5334. } else if (document.documentElement && document.documentElement.scrollLeft){ // Explorer 6 Strict
  5335. xScroll = document.documentElement.scrollLeft;
  5336. } else if (document.body) {// all other Explorers
  5337. xScroll = document.body.scrollLeft;
  5338. }
  5339. arrayPageScroll = new Array(xScroll,yScroll)
  5340. return arrayPageScroll;
  5341. }, // getPageScroll()
  5342. // getPageSize()
  5343. // Returns array with page width, height and window width, height
  5344. // Core code from - quirksmode.org
  5345. // Edit for Firefox by pHaez
  5346. getPageSize : function() {
  5347. var xScroll, yScroll;
  5348. if (window.innerHeight && window.scrollMaxY) {
  5349. xScroll = document.body.scrollWidth;
  5350. yScroll = window.innerHeight + window.scrollMaxY;
  5351. } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
  5352. xScroll = document.body.scrollWidth;
  5353. yScroll = document.body.scrollHeight;
  5354. } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
  5355. xScroll = document.body.offsetWidth;
  5356. yScroll = document.body.offsetHeight;
  5357. }
  5358. var windowWidth, windowHeight;
  5359. if (self.innerHeight) { // all except Explorer
  5360. windowWidth = self.innerWidth;
  5361. windowHeight = self.innerHeight;
  5362. } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
  5363. windowWidth = document.documentElement.clientWidth;
  5364. windowHeight = document.documentElement.clientHeight;
  5365. } else if (document.body) { // other Explorers
  5366. windowWidth = document.body.clientWidth;
  5367. windowHeight = document.body.clientHeight;
  5368. }
  5369. // for small pages with total height less then height of the viewport
  5370. if(yScroll < windowHeight){
  5371. pageHeight = windowHeight;
  5372. } else {
  5373. pageHeight = yScroll;
  5374. }
  5375. // for small pages with total width less then width of the viewport
  5376. if(xScroll < windowWidth){
  5377. pageWidth = windowWidth;
  5378. } else {
  5379. pageWidth = xScroll;
  5380. }
  5381. arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight);
  5382. return arrayPageSize;
  5383. }, // getPageSize()
  5384. // center()
  5385. // centers the object in the page
  5386. center : function(objToCenter, arrayPageScroll, arrayPageSize) {
  5387. var oldDisplay = new Array(objToCenter.style.visibility, objToCenter.style.display);
  5388. objToCenter.style.display = 'none';
  5389. var arrayPageScroll = (arrayPageScroll) ? arrayPageScroll : greasedLightbox.getPageScroll();
  5390. var arrayPageSize = (arrayPageSize) ? arrayPageSize : greasedLightbox.getPageSize();
  5391. objToCenter.style.visibility = 'hidden';
  5392. objToCenter.style.display = 'block';
  5393. var objTop = arrayPageScroll[1] + ((arrayPageSize[3] + 35 - objToCenter.offsetHeight) / 2);
  5394. var objLeft = (arrayPageSize[0] - objToCenter.offsetWidth) / 2;
  5395. objToCenter.style.top = (objTop < 0) ? "0px" : objTop + "px";
  5396. objToCenter.style.left = (objLeft < 0) ? "0px" : objLeft + "px";
  5397. objToCenter.style.visibility = oldDisplay[0];
  5398. objToCenter.style.display = oldDisplay[1];
  5399. }, // center()
  5400. // centerItAll()
  5401. // Centers the lightbox object and the loading/error object on the page
  5402. centerItAll : function() {
  5403. var objLightbox = document.getElementById('greasedLightbox');
  5404. var objLoading = document.getElementById('greasedLightboxLoading');
  5405. var arrayPageSize = greasedLightbox.getPageSize();
  5406. var arrayPageScroll = greasedLightbox.getPageScroll();
  5407. greasedLightbox.center(objLightbox, arrayPageScroll, arrayPageSize);
  5408. greasedLightbox.center(objLoading, arrayPageScroll, arrayPageSize);
  5409. }, // centerItAll()
  5410. // show()
  5411. // Preloads images. Pleaces new image in lightbox then centers and displays.
  5412. show : function(event, img, context) {
  5413. //alert(img);
  5414. // let shift+click and ctrl+click (but not ctrl+shift+click) through without lightbox
  5415. if ((event.shiftKey || event.ctrlKey) && !(event.shiftKey && event.ctrlKey)) return true;
  5416. // if this is a real event stop the click and set the link, otherwise, just set the link
  5417. if (event.currentTarget) {
  5418. var link = event.currentTarget;
  5419. greasedLightbox.stopEvents(event);
  5420. } else {
  5421. var link = event;
  5422. }
  5423. if (img == null || img == '') img = link.getAttribute('href');
  5424. greasedLightbox.currentAddress = unescape(unescape(greasedLightbox.getAddress(link)));
  5425. // make ctrl+shift+click follow link without lightbox
  5426. if (event.shiftKey && event.ctrlKey) {
  5427. window.location.href = greasedLightbox.currentAddress;
  5428. return true;
  5429. }
  5430. // center when resized
  5431. if (greasedLightbox.isShowing != true)
  5432. window.addEventListener('resize', greasedLightbox.centerItAll, true);
  5433. greasedLightbox.isShowing = true;
  5434. // 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.
  5435. capt = link.getAttribute('title');
  5436. if (capt == null || capt == '') {
  5437. try {
  5438. var imgObj = link.firstChild;
  5439. capt = imgObj.getAttribute('title');
  5440. } catch (e) { }
  5441. }
  5442. if (capt == null || capt == '') {
  5443. try {
  5444. var imgObj = link.firstChild;
  5445. capt = imgObj.getAttribute('alt');
  5446. } catch (e) { }
  5447. }
  5448. // prep objects
  5449. var objOverlay = document.getElementById('greasedLightboxOverlay');
  5450. var objMenu = document.getElementById('greasedLightboxMenu');
  5451. var objLightbox = document.getElementById('greasedLightbox');
  5452. var objCaption = document.getElementById('greasedLightboxCaption');
  5453. var imgPreload = document.getElementById('greasedLightboxPreload');
  5454. var objImage = document.getElementById('greasedLightboxImage');
  5455. var objLoading = document.getElementById('greasedLightboxLoading');
  5456. objOverlay.style.display = 'none'; // This will ensure that we have a correct reading of the page size
  5457. var arrayPageSize = greasedLightbox.getPageSize();
  5458. var arrayPageScroll = greasedLightbox.getPageScroll();
  5459. // set height of Overlay to take up whole page and show
  5460. objOverlay.style.height = (arrayPageSize[1] + 'px');
  5461. objOverlay.style.display = 'block';
  5462. // show menu
  5463. objMenu.style.display = 'block';
  5464. // center loader and error message
  5465. objLoading.style.visibility = 'hidden';
  5466. objLoading.style.display = 'block';
  5467. greasedLightbox.center(objLoading, arrayPageScroll, arrayPageSize);
  5468. objLoading.style.visibility = 'visible';
  5469. var imgPreload = document.getElementById('greasedLightboxPreload');
  5470. // preload image
  5471. preloaderDone = function() {
  5472. loaderDone = function() {
  5473. objImage.removeAttribute('width');
  5474. objImage.removeAttribute('height');
  5475. greasedLightbox.aspectRatio = null;
  5476. if (capt) {
  5477. objCaption.innerHTML = capt;
  5478. } else {
  5479. objCaption.innerHTML = img;
  5480. }
  5481. // dimensions
  5482. // objCaption.innerHTML = objCaption.innerHTML + '<br/><br/>(width: ' + objImage.width + 'px; height: ' + objImage.height + 'px;)';
  5483. // add a link for context
  5484. if (context) objCaption.innerHTML = objCaption.innerHTML + '<br/><br/><a href="' + context + '">' + greasedLanguage[greasedLanguage.language][0].context + '</a>';
  5485. // center lightbox and make sure that the top and left values are not negative
  5486. // and the image placed outside the viewport
  5487. //objLightbox.style.visibility = 'hidden';
  5488. objLightbox.style.display = 'block';
  5489. greasedLightbox.aspectRatio = objImage.height / objImage.width;
  5490. // if image is larger than the screen
  5491. if (objImage.height > arrayPageSize[3] - 70) {
  5492. var newHeight = arrayPageSize[3] - 70;
  5493. var newWidth = (objImage.width / objImage.height) * newHeight;
  5494. objImage.height = newHeight;
  5495. objImage.width = newWidth;
  5496. }
  5497. if (objImage.width > arrayPageSize[2] - 70) {
  5498. var newWidth = arrayPageSize[2] - 70;
  5499. var newHeight = greasedLightbox.aspectRatio * newWidth;
  5500. objImage.height = newHeight;
  5501. objImage.width = newWidth;
  5502. }
  5503. greasedLightbox.center(objLightbox, arrayPageScroll, arrayPageSize);
  5504. // if it went bigger than the page
  5505. if (objLightbox.offsetHeight > objOverlay.offsetHeight) objOverlay.style.height = objLightbox.offsetHeight + 'px';
  5506. if (objLightbox.offsetWidth > objOverlay.offsetwidth) objOverlay.style.width = objLightbox.offsetWidth + 'px';
  5507. greasedLightbox.center(objLightbox, arrayPageScroll, arrayPageSize);
  5508. objLoading.style.display = 'none';
  5509. objCaption.style.display = 'block';
  5510. objLightbox.style.visibility = 'visible';
  5511. // clean it up a bit for memory's sake
  5512. objImage.removeEventListener('load', loaderDone, false);
  5513. imgPreload.removeEventListener('load', preloaderDone, false);
  5514. imgPreload.removeEventListener('error', greasedLightbox.noImage, false);
  5515. imgPreload.src = '';
  5516. if (greasedLightbox.isSlideShow)
  5517. greasedLightbox.timer = setTimeout(function(event) { greasedLightbox.moveSlide(event, 1) }, greasedLightbox.slideTime * 1000);
  5518. return false;
  5519. } // loaderDone()
  5520. objImage.addEventListener('load', loaderDone, false);
  5521. objImage.src = img;
  5522. return false;
  5523. } // preloaderDone()
  5524. if (imgPreload.src != img) {
  5525. imgPreload.addEventListener('load', preloaderDone, false);
  5526. imgPreload.addEventListener('error', greasedLightbox.noImage, false);
  5527. imgPreload.src = img;
  5528. } else {
  5529. preloaderDone();
  5530. }
  5531. // hides flash movies that peek through the overlay
  5532. var obtrusives, thisObtrusive;
  5533. obtrusives = document.evaluate('//object|//embed|//iframe', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  5534. for(var i = 0; i < obtrusives.snapshotLength; i++) {
  5535. thisObtrusive = obtrusives.snapshotItem(i);
  5536. thisObtrusive.style.visibility = 'hidden';
  5537. }
  5538. if (greasedLightbox.allImageLinks.length > 1) {
  5539. // initialize slideshow
  5540. // set currentImagePosition
  5541. findCurrentPosition : for(var i = 0; i < greasedLightbox.allImageLinks.length; i++) {
  5542. if (greasedLightbox.allImageLinks[i]['link'] == link) {
  5543. greasedLightbox.currentImagePosition = i;
  5544. break findCurrentPosition;
  5545. }
  5546. } // for()
  5547. // pre-fetch next image
  5548. if (!window.opera) { // for some reason this pre-fetching breaks lightbox in opera
  5549. var imgPrefetch = document.getElementById('greasedLightboxPrefetch');
  5550. var nextImagePosition = (greasedLightbox.currentImagePosition + greasedLightbox.lastMove) % greasedLightbox.allImageLinks.length;
  5551. if (nextImagePosition < 0) nextImagePosition = greasedLightbox.allImageLinks.length - 1;
  5552. var nextImage = greasedLightbox.allImageLinks[nextImagePosition];
  5553. var nextImageSrc = greasedLightbox.getImageToShow(nextImage['link'], greasedLightbox.getAddress(nextImage['link']), nextImage['name']);
  5554. imgPrefetch.src = nextImageSrc;
  5555. }
  5556. } // if()
  5557. }, // show()
  5558. // slideShow()
  5559. // cycles through all of the lightboxable images
  5560. slideShow: function(cmd) {
  5561. var objMenuButtonShow = document.getElementById('greasedLightboxButtonSlide');
  5562. if (cmd != 'stop') { // start the show
  5563. greasedLightbox.isSlideShow = true;
  5564. greasedLightbox.moveSlide(null, 1);
  5565. // switch function to stop button
  5566. objMenuButtonShow.removeEventListener('click', greasedLightbox.slideShow, false);
  5567. objMenuButtonShow.innerHTML = '\u2169';
  5568. objMenuButtonShow.addEventListener('click', function(event) { greasedLightbox.slideShow('stop') }, false);
  5569. }
  5570. else { // stop the show
  5571. clearTimeout(greasedLightbox.timer);
  5572. greasedLightbox.isSlideShow = false;
  5573. objMenuButtonShow.removeEventListener('click', function(event) { greasedLightbox.slideShow('stop') }, false);
  5574. objMenuButtonShow.innerHTML = '\u21BB';
  5575. objMenuButtonShow.addEventListener('click', greasedLightbox.slideShow, false);
  5576. }
  5577. }, // slideShow()
  5578. // hide()
  5579. // Stops the preloader in case it hasn't finished and then hides all of the lightbox components
  5580. hide : function(event) {
  5581. greasedLightbox.stopEvents(event);
  5582. greasedLightbox.isShowing = false;
  5583. window.removeEventListener('resize', greasedLightbox.centerItAll, true);
  5584. // get objects
  5585. var objPreloader = document.getElementById('greasedLightboxPreload');
  5586. var objLoading = document.getElementById('greasedLightboxLoading');
  5587. var objError = document.getElementById('greasedLightboxError');
  5588. var objOverlay = document.getElementById('greasedLightboxOverlay');
  5589. var objLightbox = document.getElementById('greasedLightbox');
  5590. var objMenu = document.getElementById('greasedLightboxMenu');
  5591. var imgPreload = document.getElementById('greasedLightboxPreload');
  5592. // stop preloader
  5593. objPreloader.removeEventListener('load', preloaderDone, false);
  5594. imgPreload.removeEventListener('error', greasedLightbox.noImage, false);
  5595. //imgPreload.src = '';
  5596. // show flash movies again
  5597. var obtrusives, thisObtrusive;
  5598. obtrusives = document.evaluate('//object|//embed|//iframe', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  5599. for(var i = 0; i < obtrusives.snapshotLength; i++) {
  5600. thisObtrusive = obtrusives.snapshotItem(i);
  5601. thisObtrusive.style.visibility = 'visible';
  5602. }
  5603. // hide everything
  5604. objLoading.style.display = 'none';
  5605. objError.style.display = 'none';
  5606. objOverlay.style.display = 'none';
  5607. objLightbox.style.display = 'none';
  5608. objMenu.style.display = 'none';
  5609. }, // hide()
  5610. // halt()
  5611. // stops the slideshow and hides the lightbox
  5612. halt : function() {
  5613. greasedLightbox.slideShow('stop');
  5614. greasedLightbox.hide();
  5615. },
  5616. // stopEvents()
  5617. stopEvents : function(event) {
  5618. if (event) {
  5619. if (event.stopPropagation) event.stopPropagation();
  5620. if (event.preventDefault) event.preventDefault();
  5621. }
  5622. },
  5623. // resize()
  5624. resize : function(event, resizeByAmount) {
  5625. greasedLightbox.stopEvents(event);
  5626. // stop slidshow
  5627. greasedLightbox.slideShow('stop');
  5628. // resize the image
  5629. var objImage = document.getElementById('greasedLightboxImage');
  5630. var imgPreload = document.getElementById('greasedLightboxPreload');
  5631. if (resizeByAmount == 0) {
  5632. objImage.removeAttribute('width');
  5633. objImage.removeAttribute('height');
  5634. } else {
  5635. var newWidth = objImage.width + (objImage.width * (resizeByAmount/100));
  5636. var newHeight = this.aspectRatio * newWidth;
  5637. if (newWidth > 30 || newHeight > 30) {
  5638. objImage.width = newWidth;
  5639. objImage.height = newHeight;
  5640. }
  5641. }
  5642. // re-center the lightbox
  5643. var objLightbox = document.getElementById('greasedLightbox');
  5644. greasedLightbox.center(objLightbox);
  5645. }, // resize()
  5646. // noImage()
  5647. // Displays a nice error message when no image can be found.
  5648. noImage : function(event) {
  5649. var objLoading = document.getElementById('greasedLightboxLoading');
  5650. var objError = document.getElementById('greasedLightboxError');
  5651. var objErrorContext = document.getElementById('greasedLightboxErrorContext');
  5652. objError.style.visibility = 'hidden';
  5653. objError.style.display = 'block';
  5654. objErrorContext.innerHTML = '<a href="' + greasedLightbox.currentAddress + '">' + greasedLanguage[greasedLanguage.language][0].context + '</a>';
  5655. greasedLightbox.center(objError);
  5656. objLoading.style.display = 'none';
  5657. objError.style.visibility = 'visible';
  5658. if (greasedLightbox.isSlideShow)
  5659. greasedLightbox.timer = setTimeout(function(event) { greasedLightbox.moveSlide(event, 1) }, 500);
  5660. }, // noImage()
  5661. // handleKey(event)
  5662. // 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
  5663. handleKey : function(event) {
  5664. if (greasedLightbox.isShowing) {
  5665. var keycode = event.which;
  5666. var key = String.fromCharCode(keycode).toLowerCase();
  5667. switch(key) {
  5668. case 'x':
  5669. greasedLightbox.halt(event);
  5670. break;
  5671. case '+': // increase size
  5672. greasedLightbox.resize(event, 13);
  5673. break;
  5674. case '-': // decrease size
  5675. greasedLightbox.resize(event, -13);
  5676. break;
  5677. case '0': // set to default size
  5678. greasedLightbox.resize(event, 0);
  5679. break;
  5680. /* @todo
  5681. case 'v': // view image in original context
  5682. break;
  5683. */
  5684. default:
  5685. switch(event.keyCode) {
  5686. // esc key
  5687. case 27:
  5688. greasedLightbox.halt(event);
  5689. break;
  5690. // left arrow
  5691. case 37: // firefox
  5692. case 63234: // safari
  5693. greasedLightbox.slideShow('stop');
  5694. greasedLightbox.moveSlide(event, -1);
  5695. break;
  5696. // right arrow
  5697. case 39: // firefox
  5698. case 63235: // safari
  5699. greasedLightbox.slideShow('stop');
  5700. greasedLightbox.moveSlide(event, 1);
  5701. break;
  5702. } // switch(event.keyCode)
  5703. break;
  5704. } // switch(key)
  5705. } // if
  5706. }, // getKey()
  5707. // moveSlide()
  5708. // loads another image from allImageLinks[]
  5709. moveSlide : function(event, moveByAmount) {
  5710. if (greasedLightbox.allImageLinks.length > 1) {
  5711. if (greasedLightbox.currentImagePosition + moveByAmount == -1) greasedLightbox.currentImagePosition = greasedLightbox.allImageLinks.length;
  5712. var newSlidePosition = (greasedLightbox.currentImagePosition + moveByAmount) % greasedLightbox.allImageLinks.length;
  5713. var slideToLoad = greasedLightbox.allImageLinks[newSlidePosition];
  5714. greasedLightbox.hide(event);
  5715. slideToLoad['showFunction'](slideToLoad['link']);
  5716. greasedLightbox.lastMove = moveByAmount;
  5717. } // if
  5718. }, // moveSlide()
  5719. // lightBulbOnIcon
  5720. // used when an update is available
  5721. 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')",
  5722. // showUpdate()
  5723. // shows the user that an update is available
  5724. showUpdate : function(latestVersion) {
  5725. var titleLink = document.getElementById('greasedLightboxTitleLink');
  5726. titleLink.setAttribute('title', greasedLanguage[greasedLanguage.language][0].update + ' (v' + latestVersion + ')');
  5727. titleLink.innerHTML = titleLink.innerHTML + ' - ' + greasedLanguage[greasedLanguage.language][0].update + ' (v' + latestVersion + ')';
  5728. var cssStr = '#greasedLightboxTitleLink { background-image: ' + greasedLightbox.lightBulbOnIcon + ' !important; }';
  5729. var styleSheet = document.getElementById('greasedLightboxCSS');
  5730. var cssText = document.createTextNode(cssStr);
  5731. styleSheet.appendChild(cssText);
  5732. },
  5733. // init()
  5734. // Function runs on window load, going through link tags looking for links to images.
  5735. // These links receive onclick events that enable the lightbox display for their targets.
  5736. // The function also inserts html markup at the top of the page which will be used as a
  5737. // container for the overlay pattern and the inline image.
  5738. init : function() {
  5739. // initialize localization
  5740. greasedLanguage.init();
  5741. // set up list of searchDefs to use based on how includeRegExp matches window.location.href
  5742. var currentURL, searchDefsToUse;
  5743. currentURL = window.location.href;
  5744. searchDefsToUse = new Array();
  5745. for(var i = 0; i < greasedLightbox.searchDefs.length; i++) {
  5746. if(greasedLightbox.searchDefs[i]['includeRegExp'].test(currentURL)) searchDefsToUse.push(greasedLightbox.searchDefs[i]);
  5747. }
  5748. if(!searchDefsToUse.length) return;
  5749. // set variables
  5750. var links, thisLink, href, lightboxedLinksTotal = 0;
  5751. links = document.evaluate('//a[@href]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  5752. for(var i = 0; i < links.snapshotLength; i++) {
  5753. thisLink = links.snapshotItem(i);
  5754. href = unescape(thisLink.getAttribute('href'));
  5755. // check regularExpressions from searchDefsToUse
  5756. checkLink : for (var ii = 0; ii < searchDefsToUse.length; ii++) {
  5757. // for links that reveal larger image's location
  5758. if (!searchDefsToUse[ii]['findImageRegExp']) {
  5759. if(searchDefsToUse[ii]['linkRegExp'].test(href)) {
  5760. if (!searchDefsToUse[ii]['excludeLinkRegExp'] || !searchDefsToUse[ii]['excludeLinkRegExp'].test(href)) {
  5761. if (!(thisLink.getAttribute('rel') && thisLink.getAttribute('rel').toLowerCase().match('lightbox'))) // prevents doubling lightboxes
  5762. thisLink.addEventListener('click', searchDefsToUse[ii]['showFunction'], true);
  5763. this.allImageLinks[lightboxedLinksTotal] = new Array(3);
  5764. this.allImageLinks[lightboxedLinksTotal]['name'] = searchDefsToUse[ii]['name'];
  5765. this.allImageLinks[lightboxedLinksTotal]['showFunction'] = searchDefsToUse[ii]['showFunction'];
  5766. this.allImageLinks[lightboxedLinksTotal]['link'] = thisLink;
  5767. lightboxedLinksTotal++;
  5768. break checkLink;
  5769. }
  5770. }
  5771. // for links that contain images that reveal larger image's location
  5772. } else if (searchDefsToUse[ii]['findImageRegExp']) {
  5773. if(this.containsThumb(thisLink, searchDefsToUse[ii], false)) {
  5774. if(searchDefsToUse[ii]['linkRegExp'].test(href)) {
  5775. if (!searchDefsToUse[ii]['excludeLinkRegExp'] || !searchDefsToUse[ii]['excludeLinkRegExp'].test(href)) {
  5776. if (!(thisLink.getAttribute('rel') && thisLink.getAttribute('rel').toLowerCase().match('lightbox'))) // prevents doubling lightboxes
  5777. thisLink.addEventListener('click', searchDefsToUse[ii]['showFunction'], true);
  5778. /*for (ii = 0; ii < lightboxedLinksTotal; ii++) {
  5779. if(greasedLightbox.allImageLinks[ii]['link'] == links[i]) break checkLink;
  5780. }*/
  5781. this.allImageLinks[lightboxedLinksTotal] = new Array(3);
  5782. this.allImageLinks[lightboxedLinksTotal]['name'] = searchDefsToUse[ii]['name'];
  5783. this.allImageLinks[lightboxedLinksTotal]['showFunction'] = searchDefsToUse[ii]['showFunction'];
  5784. this.allImageLinks[lightboxedLinksTotal]['link'] = thisLink;
  5785. lightboxedLinksTotal++;
  5786. break checkLink;
  5787. }
  5788. }
  5789. }
  5790. }
  5791. } // checkLink : for()
  5792. } // for()
  5793. if (lightboxedLinksTotal == 0) return;
  5794. window.addEventListener('unload', this.unload, false);
  5795. var objBody = document.getElementsByTagName("body").item(0);
  5796. var pngOverlay = "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAPSURBVHjaYmJgYDgDEGAAANsAz1TKIeAAAAAASUVORK5CYII%3D')";
  5797. 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')";
  5798. // CSS
  5799. var head, styleSheet, cssStr, cssText;
  5800. head = document.getElementsByTagName('head')[0];
  5801. styleSheet = document.createElement('style');
  5802. styleSheet.setAttribute('id','greasedLightboxCSS');
  5803. styleSheet.setAttribute('type','text/css');
  5804. head.appendChild(styleSheet);
  5805. cssStr = ''+
  5806. '#greasedLightboxOverlay { position: absolute; top: 0; left: 0; z-index: 10000000; width: 100%; background-image: ' + pngOverlay + '; background-repeat: repeat; cursor: pointer; }'+
  5807. '#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; }'+
  5808. '#greasedLightboxMenu:hover { opacity: 1; }'+
  5809. '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; }'+
  5810. 'a#greasedLightboxTitleLink:hover { color: #fff; background-color: #333; }'+
  5811. '#greasedLightboxButtons { position: absolute; top: 0; left: 0; height: 35px; width: 100%; line-height: 35px; margin: 0; padding: 0; z-index: 10000400; }'+
  5812. '#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; }'+
  5813. '#greasedLightboxButtons a:hover { border-color: orange; background-color: #333; color: #fff; }'+
  5814. '#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; }'+
  5815. '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; }'+
  5816. '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; }'+
  5817. '#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; }'+
  5818. '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; }'+
  5819. '#greasedLightboxError a, #greasedLightbox a { color: #aaa; text-decoration: none; border-bottom: 1px solid #777; }'+
  5820. '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; }'+
  5821. '#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; }'+
  5822. 'img#greasedLightboxImage { border: none; cursor: pointer; }'+
  5823. 'img#greasedLightboxImage, img#greasedLightboxPreload, img#greasedLightboxPrefetch { max-height: none; max-width: none; }'+
  5824. '#greasedLightbox, #greasedLightboxMenu, #greasedLightboxOverlay, #greasedLightboxError, #greasedLightboxLoading, img#greasedLightboxPreload, img#greasedLightboxPrefetch { display: none; }'+
  5825. '#greasedLightboxCaption { color: #aaa; padding: 10px 0; }';
  5826. cssText = document.createTextNode(cssStr);
  5827. styleSheet.appendChild(cssText);
  5828. // overlay div
  5829. var objOverlay = document.createElement("div");
  5830. objOverlay.addEventListener('click', greasedLightbox.halt, false);
  5831. objOverlay.setAttribute('id','greasedLightboxOverlay');
  5832. objBody.appendChild(objOverlay);
  5833. // menu div
  5834. var objMenu = document.createElement("div");
  5835. objMenu.setAttribute('id', 'greasedLightboxMenu');
  5836. objBody.appendChild(objMenu);
  5837. // title link
  5838. var objMenuLink = document.createElement("a");
  5839. objMenuLink.setAttribute('id', 'greasedLightboxTitleLink');
  5840. objMenuLink.setAttribute('href', 'http://userscripts.org/users/426977/scripts');
  5841. objMenuLink.innerHTML = 'Keyser Söze Scripts';
  5842. objMenu.appendChild(objMenuLink);
  5843. // menu buttons div
  5844. var objMenuButtons = document.createElement("div");
  5845. objMenuButtons.setAttribute('id', 'greasedLightboxButtons');
  5846. objMenu.appendChild(objMenuButtons);
  5847. // right button
  5848. var objMenuButtonRight = document.createElement("a");
  5849. objMenuButtonRight.setAttribute('id', 'greasedLightboxButtonRight');
  5850. objMenuButtonRight.setAttribute('title', greasedLanguage[greasedLanguage.language][0].next);
  5851. objMenuButtonRight.innerHTML = '\u2192';
  5852. objMenuButtonRight.addEventListener('click', function(event) { greasedLightbox.slideShow('stop'); greasedLightbox.moveSlide(event, 1); }, false);
  5853. objMenuButtons.appendChild(objMenuButtonRight);
  5854. // left button
  5855. var objMenuButtonLeft = document.createElement("a");
  5856. objMenuButtonLeft.setAttribute('id', 'greasedLightboxButtonLeft');
  5857. objMenuButtonLeft.setAttribute('title', greasedLanguage[greasedLanguage.language][0].previous);
  5858. objMenuButtonLeft.innerHTML = '\u2190';
  5859. objMenuButtonLeft.addEventListener('click', function(event) { greasedLightbox.slideShow('stop'); greasedLightbox.moveSlide(event, -1); }, false);
  5860. objMenuButtons.appendChild(objMenuButtonLeft);
  5861. // magnify button
  5862. var objMenuButtonPlus = document.createElement("a");
  5863. objMenuButtonPlus.setAttribute('id', 'greasedLightboxButtonPlus');
  5864. objMenuButtonPlus.setAttribute('title', greasedLanguage[greasedLanguage.language][0].magnify);
  5865. objMenuButtonPlus.innerHTML = '+';
  5866. objMenuButtonPlus.addEventListener('click', function(event) { greasedLightbox.slideShow('stop'); greasedLightbox.resize(event, 13); }, false);
  5867. objMenuButtons.appendChild(objMenuButtonPlus);
  5868. // shrink button
  5869. var objMenuButtonMinus = document.createElement("a");
  5870. objMenuButtonMinus.setAttribute('id', 'greasedLightboxButtonMinus');
  5871. objMenuButtonMinus.setAttribute('title', greasedLanguage[greasedLanguage.language][0].shrink);
  5872. objMenuButtonMinus.innerHTML = '-';
  5873. objMenuButtonMinus.addEventListener('click', function(event) { greasedLightbox.slideShow('stop'); greasedLightbox.resize(event, -13); }, false);
  5874. objMenuButtons.appendChild(objMenuButtonMinus);
  5875. // slideshow button
  5876. var objMenuButtonShow = document.createElement('a');
  5877. objMenuButtonShow.setAttribute('id', 'greasedLightboxButtonSlide');
  5878. objMenuButtonShow.setAttribute('title', greasedLanguage[greasedLanguage.language][0].slideshow);
  5879. objMenuButtonShow.innerHTML = '\u21BB';
  5880. objMenuButtonShow.addEventListener('click', greasedLightbox.slideShow, false);
  5881. objMenuButtons.appendChild(objMenuButtonShow);
  5882. // loader div
  5883. var objLoading = document.createElement("div");
  5884. objLoading.setAttribute('id','greasedLightboxLoading');
  5885. objLoading.addEventListener('click', greasedLightbox.halt, false);
  5886. objBody.appendChild(objLoading);
  5887. var loadingGif = document.createElement('img');
  5888. 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."+
  5889. "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%"+
  5890. "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"+
  5891. "%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%"+
  5892. "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%"+
  5893. "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%"+
  5894. "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"+
  5895. "%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"+
  5896. "%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"+
  5897. "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_"+
  5898. "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"+
  5899. "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%"+
  5900. "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"+
  5901. "%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"+
  5902. "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*"+
  5903. "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"+
  5904. "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"+
  5905. "%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"+
  5906. "!%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"+
  5907. "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"+
  5908. "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"+
  5909. "%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%"+
  5910. "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%"+
  5911. "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"+
  5912. "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%"+
  5913. "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"+
  5914. "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%"+
  5915. "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"+
  5916. "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"+
  5917. "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"+
  5918. "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"+
  5919. "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%"+
  5920. "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"+
  5921. "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"+
  5922. "%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"+
  5923. "%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%"+
  5924. "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"+
  5925. "%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"+
  5926. "%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"+
  5927. "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"+
  5928. "%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"+
  5929. "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%"+
  5930. "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"+
  5931. "%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"+
  5932. "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"+
  5933. "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"+
  5934. "%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%"+
  5935. "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"+
  5936. "%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"+
  5937. ".%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"+
  5938. "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"+
  5939. "%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"+
  5940. "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"+
  5941. "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"+
  5942. "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%"+
  5943. "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"+
  5944. "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"+
  5945. "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"+
  5946. "%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%"+
  5947. "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"+
  5948. "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%"+
  5949. "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"+
  5950. "%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%"+
  5951. "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"+
  5952. "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%"+
  5953. "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"+
  5954. "*%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"+
  5955. "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";
  5956. loadingGif.style.border = 'none';
  5957. objLoading.appendChild(loadingGif);
  5958. // loading text
  5959. var objLoadingText = document.createElement("p");
  5960. objLoadingText.setAttribute('id','greasedLightboxLoadingText');
  5961. objLoadingText.innerHTML = greasedLanguage[greasedLanguage.language][0].loading;
  5962. objLoading.appendChild(objLoadingText);
  5963. // helper message
  5964. var objLoadingHelp = document.createElement("p");
  5965. objLoadingHelp.setAttribute('id','greasedLightboxLoadingHelp');
  5966. objLoadingHelp.innerHTML = greasedLanguage[greasedLanguage.language][0].loadingSub;
  5967. objLoading.appendChild(objLoadingHelp);
  5968. // error div
  5969. var objErrorBox = document.createElement("div");
  5970. objErrorBox.setAttribute('id','greasedLightboxError');
  5971. objBody.appendChild(objErrorBox);
  5972. // error message
  5973. var objError = document.createElement("p");
  5974. objError.setAttribute('id','greasedLightboxErrorMessage');
  5975. objError.innerHTML = greasedLanguage[greasedLanguage.language][0].error +
  5976. '<p id="greasedLightboxErrorContext"></p>';
  5977. objErrorBox.appendChild(objError);
  5978. // lightbox div
  5979. var objLightbox = document.createElement("div");
  5980. objLightbox.setAttribute('id','greasedLightbox');
  5981. objOverlay.appendChild(objLightbox);
  5982. // empty image
  5983. var objImage = document.createElement("img");
  5984. objImage.addEventListener('click', greasedLightbox.halt, false);
  5985. objImage.setAttribute('id','greasedLightboxImage');
  5986. objLightbox.appendChild(objImage);
  5987. // empty preloader
  5988. var objPreload = document.createElement("img");
  5989. objPreload.setAttribute('id','greasedLightboxPreload');
  5990. objBody.appendChild(objPreload);
  5991. // empty prefetcher
  5992. var objPrefetch = document.createElement("img");
  5993. objPrefetch.setAttribute('id','greasedLightboxPrefetch');
  5994. objPrefetch.addEventListener('error', function() { return false; }, false);
  5995. objBody.appendChild(objPrefetch);
  5996. // empty caption
  5997. var objCaption = document.createElement("div");
  5998. objCaption.setAttribute('id','greasedLightboxCaption');
  5999. objLightbox.appendChild(objCaption);
  6000. document.addEventListener('keypress', greasedLightbox.handleKey, true);
  6001. }, // init()
  6002. // unload
  6003. // runs onunload to clear up possible memory leaks
  6004. unload : function () {
  6005. var objOverlay = document.getElementById('greasedLightboxOverlay');
  6006. objOverlay.removeEventListener('click', greasedLightbox.halt, false);
  6007. var objMenuButtonRight = document.getElementById('greasedLightboxButtonRight');
  6008. objMenuButtonRight.removeEventListener('click', function(event) { greasedLightbox.moveSlide(event, 1); }, false);
  6009. var objMenuButtonLeft = document.getElementById('greasedLightboxButtonLeft');
  6010. objMenuButtonLeft.removeEventListener('click', function(event) { greasedLightbox.moveSlide(event, -1); }, false);
  6011. var objMenuButtonPlus = document.getElementById('greasedLightboxButtonPlus');
  6012. objMenuButtonPlus.removeEventListener('click', function(event) { greasedLightbox.resize(event, 13); }, false);
  6013. var objMenuButtonMinus = document.getElementById('greasedLightboxButtonMinus');
  6014. objMenuButtonMinus.removeEventListener('click', function(event) { greasedLightbox.resize(event, -13); }, false);
  6015. var objLoading = document.getElementById('greasedLightboxLoading');
  6016. objLoading.removeEventListener('click', greasedLightbox.halt, false);
  6017. var objError = document.getElementById('greasedLightboxErrorMessage');
  6018. objError.removeEventListener('click', greasedLightbox.halt, false);
  6019. var objImage = document.getElementById('greasedLightboxImage');
  6020. objImage.removeEventListener('click', greasedLightbox.halt, false);
  6021. var objPrefetch = document.getElementById('greasedLightboxPrefetch');
  6022. objPrefetch.removeEventListener('error', function() { return false; }, false);
  6023. document.removeEventListener('keypress', greasedLightbox.handleKey, true);
  6024. } // unload()
  6025. } // greasedLightbox
  6026. var greasedLanguage = {
  6027. // english
  6028. en : [
  6029. {
  6030. loading : 'Loading image',
  6031. loadingSub : 'Click anywhere to cancel',
  6032. context : 'View image in its original context',
  6033. error : 'Image unavailable',
  6034. next : 'Next image (right arrow key)',
  6035. previous : 'Previous image (left arrow key)',
  6036. magnify : 'Magnify image (+ key)',
  6037. shrink : 'Shrink image (- key)',
  6038. update : 'Update available',
  6039. slideshow : 'Start/stop slideshow'
  6040. }
  6041. ], // english
  6042. // español
  6043. es : [
  6044. {
  6045. loading : 'Cargando imagen',
  6046. loadingSub : 'Click en cualquier sitio para cancelar',
  6047. context : 'Ver imagen en su contexto original',
  6048. error : 'La imagen no está disponible',
  6049. next : 'Siguiente imagen (tecla derecha)',
  6050. previous : 'Imagen anterior (tecla izquierda)',
  6051. magnify : 'Aumentar tamaño (tecla +)',
  6052. shrink : 'Reducir tamaño (tecla -)',
  6053. update : 'Actualización disponible',
  6054. slideshow : ''
  6055. }
  6056. ], // español
  6057. // português (portuguese)
  6058. pt : [
  6059. {
  6060. loading : 'Carregando imagem',
  6061. loadingSub : 'Clique em qualquer lugar para cancelar',
  6062. context : 'Imagem no contexto original',
  6063. error : 'Imagem indisponível',
  6064. next : 'Próxima imagem (tecle na seta da direita)',
  6065. previous : 'Imagem anterior (tecle na seta da esquerda)',
  6066. magnify : 'Aumente o zoom (tecle +)',
  6067. shrink : 'Diminua o zoom (tecle -)',
  6068. update : 'Atualização disponível',
  6069. slideshow : 'Iniciar/cancelar apresentação'
  6070. }
  6071. ], // português
  6072. // deutsch (german)
  6073. de : [
  6074. {
  6075. loading : 'Bild wird geladen',
  6076. loadingSub : 'Zum Abbrechen irgendwo klicken',
  6077. context : 'Bild im ursprünglichen Kontext anzeigen',
  6078. error : 'Bild nicht verfügbar',
  6079. next : 'Nächstes Bild (Pfeil rechts)',
  6080. previous : 'Vorheriges Bild (Pfeil links)',
  6081. magnify : 'Bild vergrößern (+ Taste)',
  6082. shrink : 'Bild verkleinern (- Taste)',
  6083. update : 'Aktualisierung verfügbar',
  6084. slideshow : 'Diashow starten/beenden'
  6085. }
  6086. ], // deutsch
  6087. // français (french)
  6088. fr : [
  6089. {
  6090. loading : 'Chargement de l\'image',
  6091. loadingSub : 'Cliquez n\'importe où pour annuler',
  6092. context : 'Voir cette image dans son contexte original',
  6093. error : 'Image indisponible',
  6094. next : 'Image suivante (Touche flèche droite) ',
  6095. previous : 'Image précédente (Touche fléche gauche)',
  6096. magnify : 'Agrandir l\'image (Touche +)',
  6097. shrink : 'Reduire l\'image (Touche -)',
  6098. update : 'Mise à jour disponible',
  6099. slideshow : ''
  6100. }
  6101. ], // français
  6102. // het Nederlands (dutch)
  6103. nl : [
  6104. {
  6105. loading : 'Laden',
  6106. loadingSub : 'Klik ergens om terug te keren',
  6107. context : 'Bekijk het plaatje in zijn originele context',
  6108. error : 'Plaatje niet beschikbaar',
  6109. next : 'Volgend plaatje (rechter pijltjestoets)',
  6110. previous : 'Vorig plaatje (linker pijltjestoets)',
  6111. magnify : 'Vergoot plaatje (+ toets)',
  6112. shrink : 'Verklein plaatje (- toets)',
  6113. update : 'Update beschikbaar',
  6114. slideshow : 'Start/stop diavoorstelling'
  6115. }
  6116. ], // het Nederlands
  6117. // italiano (italian)
  6118. it : [
  6119. {
  6120. loading : 'Scarico immagine',
  6121. loadingSub : 'Fai clic sullo sfondo per annullare',
  6122. context : 'Mostra nel suo contesto originale',
  6123. error : 'Immagine non disponibile',
  6124. next : 'Successiva (tasto freccia a destra)',
  6125. previous : 'Precedente (tasto freccia a sinistra)',
  6126. magnify : 'Ingrandisci (tasto +)',
  6127. shrink : 'Riduci zoom (tasto -)',
  6128. update : 'Aggiornamento disponibile',
  6129. slideshow : 'Avvia/ferma presentazione'
  6130. }
  6131. ], // italiano
  6132. // ???????? (greek)
  6133. el : [
  6134. {
  6135. loading : '?????a f??t?s??',
  6136. loadingSub : '?t?p?ste ?p??d?p?te ??a ?a a????sete',
  6137. context : '?????a ?p???? st? a????? p?a?s?? t??',
  6138. error : '?????a µ? d?a??s?µ?',
  6139. next : 'Next image (right arrow key)',
  6140. previous : 'Previous image (left arrow key)',
  6141. magnify : 'Magnify image (+ key)',
  6142. shrink : 'Shrink image (- key)',
  6143. update : 'Update available',
  6144. slideshow : ''
  6145. }
  6146. ], // ????????
  6147. // russki (russian)
  6148. ru : [
  6149. {
  6150. loading : '??????????? ????????',
  6151. loadingSub : 'Click ???-????, ????? ????? ????????',
  6152. context : '??????????? ??????? ? ????? ????????????? ??????',
  6153. error : '??????????? ?????????????',
  6154. next : 'Next image (right arrow key)',
  6155. previous : 'Previous image (left arrow key)',
  6156. magnify : 'Magnify image (+ key)',
  6157. shrink : 'Shrink image (- key)',
  6158. update : 'Update available',
  6159. slideshow : ''
  6160. }
  6161. ], // russki
  6162. // hungarian
  6163. hu : [
  6164. {
  6165. loading : 'K\u00E9p bet\u00F6lt\u00E9se',
  6166. loadingSub : 'Kattints a visszal\u00E9p\u00E9shez',
  6167. context : 'Megtekint\u00E9s az eredeti k\u00F6rnyezet\u00E9ben',
  6168. error : 'K\u00E9p nem el\u00E9rhet\u0151',
  6169. next : 'K\u00F6vetkez\u0150 k\u00E9p (jobbra gomb)',
  6170. previous : 'El\u0150z\u0150 k\u00E9p (balra gomb)',
  6171. magnify : 'Nagy\u00EDtás (+ gomb)',
  6172. shrink : 'Kicsiny\u00EDt\u00E9s (- gomb)',
  6173. update : 'El\u00E9rhet\u0150 az \u00FAjabb verzi\u00F3',
  6174. slideshow : ''
  6175. }
  6176. ], // hungarian
  6177. // finnish
  6178. fi : [
  6179. {
  6180. loading : 'Ladataan kuvaa',
  6181. loadingSub : 'Napsauta kerran keskeyttääksesi',
  6182. context : 'Näytä kuva alkuperäisessä kontekstissa',
  6183. error : 'Kuvaa ei saatavissa',
  6184. next : 'Seuraava kuva (oikea nuolinäppäin)',
  6185. previous : 'Edellinen kuva (vasen nuolinäppäin)',
  6186. magnify : 'Suurenna kuvaa (+ näppäin)',
  6187. shrink : 'Pienennä kuvaa (- näppäin)',
  6188. update : 'Päivitys saatavilla',
  6189. slideshow : 'Käynnistä/Pysäytä dia esitys'
  6190. }
  6191. ], // finnish
  6192. // japanese
  6193. ja : [
  6194. {
  6195. loading : '\u8AAD\u307F\u8FBC\u307F\u4E2D',
  6196. loadingSub : '\u30AF\u30EA\u30C3\u30AF\u3067\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3059',
  6197. context : '\u5143\u306E\u753B\u50CF\u3092\u8868\u793A',
  6198. error : '\u753B\u50CF\u304C\u5B58\u5728\u3057\u307E\u305B\u3093',
  6199. next : '\u6B21\u306E\u753B\u50CF',
  6200. previous : '\u524D\u306E\u753B\u50CF',
  6201. magnify : '\u753B\u50CF\u3092\u62E1\u5927 (+)',
  6202. shrink : '\u753B\u50CF\u3092\u7E2E\u5C0F (-)',
  6203. update : '\u65B0\u3057\u3044\u66F4\u65B0\u304C\u3042\u308A\u307E\u3059',
  6204. slideshow : '\u30B9\u30E9\u30A4\u30C9\u30B7\u30E7\u30FC\u3092\u958B\u59CB\u002F\u505C\u6B62'
  6205. }
  6206. ], // japanese
  6207. // chinese (simplified)
  6208. zh : [
  6209. {
  6210. loading : '\u8BFB\u53D6\u56FE\u7247',
  6211. loadingSub : '\u6309\u4EFB\u610F\u952E\u6765\u53D6\u6D88',
  6212. context : '\u4EE5\u539F\u6587\u672C\u67E5\u770B\u56FE\u7247',
  6213. error : '\u56FE\u7247\u4E0D\u53EF\u8BFB',
  6214. next : '\u4E0B\u4E00\u4E2A\u56FE\u7247 (\u53F3\u952E)',
  6215. previous : '\u524D\u4E00\u4E2A\u56FE\u7247 (\u56FE\u7247)',
  6216. magnify : '\u653E\u5927\u56FE\u7247 (+\u952E)',
  6217. shrink : '\u7F29\u5C0F\u56FE\u7247 (-\u952E)',
  6218. update : '\u53EF\u63D0\u4F9B\u66F4\u65B0',
  6219. slideshow : ''
  6220. }
  6221. ], // chinese (simplified)
  6222. // Chinese (traditional)
  6223. tw : [
  6224. {
  6225. loading : '\\u8F09\\u5165\\u5716\\u7247\\u4E2D',
  6226. loadingSub : '\\u6309\\u4EFB\\u610F\\u9375\\u53D6\\u6D88',
  6227. context : '\\u6253\\u958B\\u5716\\u7247\\u539F\\u59CB\\u7DB2\\u5740',
  6228. error : '\\u7121\\u6CD5\\u8F09\\u5165\\u5716\\u7247',
  6229. next : '\\u4E0B\\u4E00\\u5F35\\u5716 (\\u53F3\\u9375)',
  6230. previous : '\\u4E0A\\u4E00\\u5F35\\u5716 (\\u5DE6\\u9375)',
  6231. magnify : '\\u653E\\u5927\\u5716\\u7247 (+\\u9375)',
  6232. shrink : '\\u7E2E\\u5C0F\\u5716\\u7247 (-\\u9375)',
  6233. update : '\\u6709\\u66F4\\u65B0\\u7248\\u672C',
  6234. slideshow : '\\u958B\\u59CB/\\u505C\\u6B62\\u5FAA\\u5E8F\\u64AD\\u653E'
  6235. }
  6236. ], // Chinese (traditional)
  6237. // polish
  6238. pl : [
  6239. {
  6240. loading : '\u0141aduj\u0119 obraz',
  6241. loadingSub : 'Kliknij aby przerwa\u010B',
  6242. context : 'Zobacz obraz w oryginalnym kontek\u015Bcie',
  6243. error : 'Obraz niedost\u0119pny',
  6244. next : 'Nast\u0119pny obraz (klawisz \u2192)',
  6245. previous : 'Poprzedni obraz (klawisz \u2190)',
  6246. magnify : 'Powi\u0119ksz obraz (klawisz +)',
  6247. shrink : 'Zmniejsz obraz (klawisz -)',
  6248. update : 'Dost\u0119pna nowa wersja',
  6249. slideshow : 'Uruchom/zatrzymaj pokaz slajd\u00F3w'
  6250. }
  6251. ], // polish
  6252. // czech
  6253. cs : [
  6254. {
  6255. loading : 'Nahrávám obrázek',
  6256. loadingSub : 'Kliknete kamkoliv pro zrušení',
  6257. context : 'Prohlížet obrázek v orignálním kontextu',
  6258. error : 'Obrázek není dostupný',
  6259. next : 'Další obrázek (šipka doprava)',
  6260. previous : 'Predchozí obrázek (šipka doleva)',
  6261. magnify : 'Priblížit obrázek (klávesa +)',
  6262. shrink : 'Oddálit obrázek (klávesa -)',
  6263. update : 'Je dostupná aktualizace',
  6264. slideshow : 'Spustit/zastavit slideshow'
  6265. }
  6266. ], // czech
  6267. // slovak
  6268. sk : [
  6269. {
  6270. loading : 'Nahrávam obrázok',
  6271. loadingSub : 'Pre zrušenie kliknite kdekolvek',
  6272. context : 'Prezriet obrázok v orignálnom kontexte',
  6273. error : 'Obrázok nie je dostupný',
  6274. next : 'Další obrázok (šípka doprava)',
  6275. previous : 'Predchádzajúci obrázok (šípka dolava)',
  6276. magnify : 'Priblížit obrázok (klávesa +)',
  6277. shrink : 'Oddialit obrázok (klávesa -)',
  6278. update : 'Je dostupná aktualizácia',
  6279. slideshow : ''
  6280. }
  6281. ], // slovak
  6282. // swedish
  6283. sv : [
  6284. {
  6285. loading : 'Laddar bild',
  6286. loadingSub : 'Klicka för att avbryta',
  6287. context : 'Visa originalbild',
  6288. error : 'Bild inte tillgänglig',
  6289. next : 'Nästa bild (höger piltangent)',
  6290. previous : 'Föregående bild (vänster piltangent)',
  6291. magnify : 'Förstora bild (+-tangent)',
  6292. shrink : 'Förminska bild (–tangent)',
  6293. update : 'Ny uppdatering tillgänglig',
  6294. slideshow : 'Starta/stoppa bildspel'
  6295. }
  6296. ], // swedish
  6297. /* language template
  6298. //
  6299. : [
  6300. {
  6301. loading : '',
  6302. loadingSub : '',
  6303. context : '',
  6304. error : '',
  6305. next : '',
  6306. previous : '',
  6307. magnify : '',
  6308. shrink : '',
  6309. update : '',
  6310. slideshow : ''
  6311. }
  6312. ], // end
  6313. */
  6314. // lauguage
  6315. // the correct language for localization is set in init()
  6316. language : null,
  6317. // init()
  6318. // sets this.language to the correct value based on navigator.language
  6319. init : function() {
  6320. this.language = this[navigator.language.substring(0,2)] ? navigator.language.substring(0,2) : 'en';
  6321. } // init()
  6322. }; // greasedLanguage
  6323. if (document.body) greasedLightbox.init();}
  6324.  
  6325. var offInstantSearch = true;
  6326.  
  6327. if (offInstantSearch) {
  6328. if (top != self) return;
  6329. var target = document.getElementById("po-off");
  6330. if (!target) return;
  6331.  
  6332. var className = target.className;
  6333. if (!className) return;
  6334.  
  6335. if (/unselected/.test(className))window.location = target.href;}
  6336.  
  6337. })();