Google Images Enhancer

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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name           Google Images Enhancer
// @author         Keyser Söze
// @namespace	   http://userscripts.org/users/KeyserSoze
// @homepageURL    https://userscripts.org/scripts/show/150950
// @website        http://userscripts.org/scripts/show/150950
// @icon           http://files.myopera.com/TrikiTran/albums/11598242/avatar117399_1.gif
// @description    Mejora Tu Experiencia Al Navegar En Google IMÁGENES | Improves Your Browsing Experience In Google IMAGES.
// @grant          GM_addStyle
// @version        2.0
// @include        htt*://*.google.*/*tbm=isch*
// @include        htt*://*.google.*/images?*
// @include        htt*://images.google.*/search?*imghp*
// @include        htt*://*.google.*/search?*
// @include        htt*://*.google.*/
// @include        htt*://*.google.*/firefox
// @exclude        htt*://*.google.com/
// @exclude        htt*://*.google.tld/
// @exclude        htt*://*.google.*/mail/*
// Basado en	   "Google Enlarge", "PicViewer" & "Greased LightBox"... Así que, muchas gracias a los autores originales!
// Based on 	   "Google Enlarge", "PicViewer" & "Greased LightBox"... So, many thanks to original authors
// ==/UserScript==

(function() {

/*
		=============================
		|| Google From Dusk 2 Dawn ||
		=============================
*/

{	var css = "#pmocntr2,#gt-bbar{display:none!important}select,select > button{-moz-appearance:none!important;-webkit-appearance:none!important}*{color:hsl(0,0%,80%);outline:none!important}h1,h2,h3,h4,h5,h6,strong,span,select,#rhs *,.jfk-button-standard,#sections-header,div[style=\"display:table-cell;padding-left:16px;font-size:13px;color:#222\"],.cell-header-label,.header-label,.sllabel,.goog-slider li,#srchButton,.ksb,.ab_button{color:hsl(0,0%,80%)!important}a{color:hsl(240,99%,73%)!important}a:hover,a:active,#gbz .gbts:hover{color:hsl(0,0%,85%)!important;text-shadow:0 0 5px hsla(0,0%,90%,.9)!important;-moz-transition:text-shadow .2s ease!important;-webkit-transition:text-shadow .2s ease!important}  a:visited{color:hsla(105,66%,39%,.6)!important} .f,#pocs,.gt-baf-word{color:hsl(240,96%,90%)!important} .goog-menuitem-highlight div,.goog-option-selected .goog-menuitem-content{color:hsl(0,0%,99%)!important} b,em,.gt-baf-pos,#lc a,.tbou > a.q, #tbpi,#tbtro,.tbt label,#prc_opt,#set_location_section a,.tbtctlabel,#swr a{color:hsl(240,99%,80%)!important} #gt-src-wrap *,#gt-res-wrap *{color:hsl(0,0%,0%)!important}html,body,div[style=\"border-bottom:1px solid #dedede;height:57px\"],#gbx1,#gbx2,.rg_hv,.uh_hv,li.g.psgi:hover,#il_m,#il_ic{background:hsl(0,0%,5%)!important} .c,.gssb_c,.gssb_c td,#nycp,select{background-color:hsl(0,0%,17%)!important} select > button,.gbxms{background-color:hsla(0,0%,17%,.6)!important} select > optgroup{background-color:hsl(0,0%,6%)!important} #nycp{background-color:hsl(0,0%,28%)!important} #gt-src-wrap{background-color:hsl(0,0%,66%)!important} #gt-res-wrap,.close_lk{background-color:hsl(0,0%,77%)!important} .gssb_a span *,.gbto #gbs,#gbx3,#gbx4,.lst-d,.lst-t,.ab_wrp,#appbar,.lhshdr,.tphdr,#tbbcc,.rshdr{background:transparent!important}  #header,#footer,.signin-box,.accountchooser-box,.google-header-bar,#leftnav,#tbdi,#hidden_modes,#hmp,#sc-block .sc,#leftnav a,#gt-appbar,#gt-ft-res,.goog-menuitem-content,div.bottom-links-wrapper,.gssb_m,.gbgt-hvr #gbgs3,#gbg3:focus #gbgs3,#gbg3:active #gbgs3,.flyr-o,.flyr-w,#advd-search-header h1{background-color:transparent!important}#bms *,#gbx1,#gbx2,div[style=\"border-bottom:1px solid #dedede;height:57px\"],.google-header-bar,#footer,#footer > div,.google-footer-bar,#top-content,#header,#gt-ft-res,#nycp,.gstl_0.gssb_c *,.lst-d,.lst-d:hover{border-color:transparent!important}.gbm ol *,.c,.appbar_b,div.splitter,.ab_dropdownrule,.ab_wrp{border-color:hsla(0,0%,6%,.6)!important}.gsq_a tr{border:2px solid transparent!important} button:not(#nycx):not(.eswd),.vsh.nyc_opening .vsc:hover .vspii,.vsh.nyc_open .vsc:hover .vspii,.vso .vspii,.jfk-button-standard,.jfk-button,.g-button,select,.cpbb,.kpbb,.kprb,.kpgb,.kpgrb,.ksb,.ab_button{border:hsl(0,0%,70%) 2px ridge!important}button,select,select > optgroup,select > option,.vsh.nyc_opening .vsc:hover .vspii,.vsh.nyc_open .vsc:hover .vspii,.vso .vspii,.mitem,.msel .kls,.c,.gbmc,.gssb_c,.gssb_c table,.goog-flat-menu-button,.gsq_a span,.jfk-button-standard,.jfk-button,.g-button,.rgsh,.cpbb,.kpbb,.kprb,.kpgb,.kpgrb,.ksb,.ab_button,#taw div,.selector,.ab_dropdownitem,ol,ul,li,.goog-menuitem,#gt-src-wrap,#gt-res-wrap,#nycp,.rg_hv,.uh_hv,.gssb_a td,.gssb_e,#srchButton,#il_ic,#il_fi,.close_lk{border-radius:4px!important} img,.rg_i{border-radius:2px!important}.rg-hi,.rg_hv:hover,#rhs,#nycp,.uh_hv,li.g.psgi:hover{border-radius:6px!important;box-shadow:1px 1px 2px #000,-1px -1px 2px hsl(0,0%,32%),2px 6px 16px 5px hsl(0,0%,0%)!important} .lst-d:hover{box-shadow:none!important}.goog-menu,.gbmc,.ab_dropdown{-moz-appearance:none!important;-webkit-appearance:none!important;background:hsl(60,3%,6%) -moz-linear-gradient(left,hsl(0,0%,6%),hsl(0,0%,28%))!important;background:hsl(60,3%,6%) -webkit-linear-gradient(left,hsl(0,0%,6%),hsl(0,0%,28%))!important;background-repeat:repeat!important;background-position:left!important;background-attachment:fixed!important;text-shadow:1px 1px 1px hsl(0,0%,0%)!important;border-radius:6px!important;box-shadow:2px 2px 5px 5px hsl(0,0%,0%),1px 1px 3px hsl(0,0%,6%),-1px -1px 3px hsl(0,0%,28%)!important} #gbx3,#gsr .p_ksb{-moz-appearance:none!important;-webkit-appearance:none!important;background:-moz-linear-gradient(top,hsl(0,0%,33%) 48%,hsl(0,0%,20%) 49%,hsl(0,0%,0%) 85%,hsl(0,0%,20%))!important;background:-webkit-linear-gradient(top,hsl(0,0%,33%) 48%,hsl(0,0%,20%) 49%,hsl(0,0%,0%) 85%,hsl(0,0%,20%))!important;text-shadow:1px 1px 1px hsl(227,32%,28%)!important;box-shadow:0 1px 5px hsl(0,0%,0%)!important} :not(select) > button:not(#nycx):not(.eswd),.vsh.nyc_opening .vsc:hover .vspii,.vsh.nyc_open .vsc:hover .vspii,.vso .vspii,#gbgs4,.gbgs,.kpbb,.g-button,.jfk-button,.goog-flat-menu-button,.cpbb,.kpbb,.kprb,.kpgb,.kpgrb,.ksb,.ab_button,.goog-button-base-pos,#srchButton{-moz-appearance:none!important;-webkit-appearance:none!important;background:transparent!important;background-image:-moz-linear-gradient(top,hsl(0,0%,33%) 48%,hsl(0,0%,20%) 49%,hsl(0,0%,0%) 85%,hsl(0,0%,20%))!important;background-image:-webkit-linear-gradient(top,hsl(0,0%,33%) 48%,hsl(0,0%,20%) 49%,hsl(0,0%,0%) 85%,hsl(0,0%,20%))!important;text-shadow:1px 1px 3px hsl(0,0%,0%)!important;box-shadow:1px 1px 5px hsl(0,0%,0%),-1px -1px 5px hsl(219,16%,32%)!important}button:not(#nycx):not(.eswd):hover,.mitem:hover,.vsh.nyc_opening .vsc:hover .vspii,.vsh.nyc_open .vsc:hover .vspii,.vso .vspii:hover,#gbgs4:hover,.gbgs:hover,.kpbb:hover,.g-button:hover,.jfk-button:hover,.gbto .gbts,.gbmcc li:hover,.ab_dropdownlnk:hover,.ab_dropdownlnkinfo:hover,.goog-menuitem:hover,.cpbb:hover,.kpbb:hover,.kprb:hover,.kpgb:hover,.kpgrb:hover,.ksb:hover,.ab_button:hover,.scroll-tree li a:hover,.selector:hover,.lhn-section-primary:hover,.ab_dropdownitem:hover,#gsr .p_ksb:hover,#doodle-site-navigation li a:hover,.gbmcc.gbsbic li a:hover,.goog-toolbar-button:hover,.goog-flat-menu-button:hover,select > option:hover,.gssb_a td:hover,#srchButton:hover{-moz-appearance:none;-webkit-appearance:none;background:-moz-radial-gradient(center bottom,hsla(123,50%,65%,.6),transparent), -moz-linear-gradient(top,hsl(0,0%,33%) 48%,hsl(0,0%,20%) 49%,hsl(0,0%,0%) 85%,hsl(0,0%,20%))!important;background:-webkit-radial-gradient(center bottom,hsla(123,50%,65%,.6),transparent), -webkit-linear-gradient(top,hsl(0,0%,33%) 48%,hsl(0,0%,20%) 49%,hsl(0,0%,0%) 85%,hsl(0,0%,20%))!important;-moz-transition:background-color .1s ease-in!important;-webkit-transition:background-color .1s ease-in!important;outline:none!important;opacity:1.0!important;color:hsl(0,0%,99%)!important;text-shadow:1px 1px 1px hsl(0,0%,0%),0 0 2px hsla(123,50%,50%,.8)!important} button:not(#nycx):not(.eswd):hover,.mitem:hover,.vsh.nyc_opening .vsc:hover .vspii,.vsh.nyc_open .vsc:hover .vspii,.vso .vspii:hover,#gbgs4:hover,.gbgs:hover,.kpbb:hover,.g-button:hover,.jfk-button:hover,.gbto .gbts,.gbmcc li:hover,.ab_dropdownlnk:hover,.ab_dropdownlnkinfo:hover,.goog-menuitem:hover,.gsq_a tr:hover span,.cpbb:hover,.kpbb:hover,.kprb:hover,.kpgb:hover,.kpgrb:hover,.ksb:hover,.ab_button:hover,.scroll-tree li a:hover,.selector:hover,.lhn-section-primary:hover,.ab_dropdownitem:hover,#gsr .p_ksb:hover,.mitem:hover,.goog-flat-menu-button:hover,select > option:hover,#srchButton:hover,.close_lk:hover{-moz-appearance:none;-webkit-appearance:none;border-color:hsla(123,50%,75%,.6) hsla(123,50%,65%,.6) hsla(123,50%,55%,.6)!important;box-shadow:0 0 10px hsl(123,50%,75%)!important;-moz-transition:border-color .2s ease,box-shadow .3s ease!important;-webkit-transition:border-color .2s ease,box-shadow .3s ease!important} li.selected,.msel .kls,.goog-option-selected,.rgsh,#scrollable-sections .tree-link-selected,.selector.selected,#tbbc,.goog-toolbar-button-selected,.goog-toolbar-button-checked,.goog-toolbar-menu-button-open,.goog-option-selected .goog-menuitem-content{background-image:-moz-radial-gradient(center bottom,hsl(123,99%,55%),transparent),-moz-linear-gradient(top,hsl(0,0%,33%) 48%,hsl(0,0%,20%) 49%,hsl(0,0%,0%) 85%,hsl(0,0%,20%))!important;background-image:-webkit-radial-gradient(center bottom,hsl(123,99%,55%),transparent),-webkit-linear-gradient(top,hsl(0,0%,33%) 48%,hsl(0,0%,20%) 49%,hsl(0,0%,0%) 85%,hsl(0,0%,20%))!important;-moz-transition:all .3s!important;-webkit-transition:all .3s!important}.gbqfqw,#lst-ib,input[type=\"email\"],input[type=\"number\"],input[type=\"password\"],input[type=\"tel\"],input[type=\"url\"],.signin-box input[type=\"text\"],.advtable input[type=\"text\"],#newu,#search_box,.as-text-input,.as-table-cont td input[type=\"text\"],.ktf{-moz-appearance:none!important;-webkit-appearance:none!important;font-weight:bold!important;box-shadow:1px 1px 5px hsl(0,0%,0%) inset,0 -1px 1px 1px hsl(240,20%,30%) inset!important;background:hsl(0,0%,17%)!important;text-shadow:1px 1px 1px hsla(123,99%,89%,.6),-1px -1px 1px hsl(0,0%,0%)!important;color:hsl(0,0%,80%)!important;border-radius:50px!important;border:none!important;padding-left:4px!important}#lga > *{opacity:0!important}#lga {background:transparent url(\"https://lh6.ggpht.com/_6Bqt_HqYues/THR8YbT0qxI/AAAAAAAAADc/NALhWF1Xjsk/logo.png\") top center no-repeat!important;height:100%!important;top:9px!important;margin-bottom:10px!important;background-size:contain!important}";
if (typeof GM_addStyle != "undefined") {
	GM_addStyle(css);
} else if (typeof PRO_addStyle != "undefined") {
	PRO_addStyle(css);
} else if (typeof addStyle != "undefined") {
	addStyle(css);
} else {
	var heads = document.getElementsByTagName("head");
	if (heads.length > 0) {
		var node = document.createElement("style");
		node.type = "text/css";
		node.appendChild(document.createTextNode(css));
		heads[0].appendChild(node);}
  }
	var css = "*, \n* {cursor: \nurl(\"http://reloaded.site88.net/Data/aero_arrow.cur\"), \ndefault !important\n}\na, a \n* {cursor: \nurl(\"http://reloaded.site88.net/Data/aero_link.cur\"), \npointer !important\n}\nHtml, Div.Span\n, DIV.gb_yb.gb_3b, Div#LeftNav, Span.st, Div#fbar, Div.fbar, Div.gb_Ab.gb_5b, Div.gb_na.gb_5b.gb_k.gb_4b, Div.gb_t.gb_u, Div.gb_t.gb_A, UL.gb_v.gb_z, UL.gb_v.gb_Kb, Div#hdtbSum, Div#gbd, Div#gbmmb, a#gb, ol#gbmm, p.sp_cnt, Div#res.med, Div#center_col, Div#cnt.big, Div#LeftNavc, Div#gbx3, Div#hdtb_more_mn, a#hdtb_tls, Div#hdtbMenus, Box, A#ShowModes, Div#More_Link, Span.Tbpo, A#Tbpi, Div#Ms.Open, Div#Bms, Div.Insep, DIV.gb_yb.gb_Fb.gb_j, DIV.gb_fa.gb_Fb.gb_j.gb_Eb, DIV.gb_ib.gb_Fb, DIV#gb.gb_Bb.gb_1a, DIV#mngb, DIV#tphdr.tphdr,Box1, Box2, Box3, Box4, Box5, O1, Table, Div.Gbmc, #Gbmm, Li, Input, Input.Post, Body\n {\nBackground        : url(\"data:image/png;base64,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\") \nFixed Repeat Center!important\n; Background-color: Black !important\n; Color           : SkyBlue !important\n}\na:Link\n{\nColor: YellowGreen !important;\n}\na:Visited\n{\nColor: Plum !important;\n}\na:Hover\n{\nBackground-color: #222334 !important;\nText-decoration: none !important;\nColor: Teal !important;\n}\na.gbmt, a.gbml1, .gbmt:visited {\n  background-color: transparent !important;\n  color: Red !important;\n  border-color: #444 !important;\n  text-decoration: none !important}\n*, *:focus {outline: none !important}\n\nh1, h2, h3, h4, h5, h6, h1 *, h2 *, h3 *, .med, em, #rg_hta, .qbtt, .ss-link.ss-selected, td > font > b, #qbut b, #qbft b, a.spell, a.spell *, a.spell_orig, #gen-query .operator, .threadCountNumber, #popup_dialog_title, .settings-title, .thread-subject, .leftTitle, #conditions #temp, #conditions #condition, .mapBalloon .b {color: Yellow !important}\n#hplogo div, #ftby a, .page-title, .jhp input[type=\"submit\"], body > div[style*=\"fixed\"] > div > b, .rhsvw span > .fl, .rhsvw span > .fl b, .rhsvw span > b, .rhsvw fieldset > legend {color: #c75805 !important}\n\n.titleBox, .titleBox *, .tablib_selected .tab_content {color: #444 !important; text-shadow: 0 1px 0 #000 !important}\n\n.msel, .msel .kls, .tbos,  .tbos b, .tbots, .tbotu, #leftnav > h2, .selectedTab .kdSidebarContent > div, .cb .G-G- {color: Crimson !important}\n.a, .cite, cite, cite a, cite b, #ans > i, .f .bc, cite .bc, #rg_hr, #rg_hr a {color: Orange !important}\n.gac_b *, .gssb_i *, .esc.kb, .ac-row.active, .ac-row.active *, .dropdown-box > div:hover {color: Violet !important}\n.xsm, .psgiprice, .psliprice b, .selectionTools span, .pagination-div a, .f span[style*=\"background:#aaa;border:#999 1px solid;border-radius:2px;\"] {color: #F80 !important}\n#GMmessages a, .bubble .item-body a, .mapBalloon a, .item-body a, #weather .on a, #weather a.active, #weather .active a, #conditions #obsTable .b, #conditions #obsTable .b *, #stars table .b, #conditions .b {color: Purple !important}\n#leftnav a, #leftnav a *, .cb > div, .kdSidebarContent > div, .kdSidebar > div, #talk_title, a.ss-link, .fl > span {color: DeepSkyBlue !important}\n.f, .f span, .osl, .osl a, .bc a, .gl a, .esc > a, #knavm, .pslipricecol cite > a, .goog-date-picker-other-month, .RssSummary div, .RssEntryOuterContent, #bp-bd form span.small, .thread_table .read .thread, .read .subject_and_snippet, #views .Nk.Pk *,\n.tn-snippet, .tn-time, .tn-source, #container .source, #container .source-link {color: Cyan !important}\n.msel, #leftnav > h2 {font-weight: bold !important}\n.msel, #leftnav > h2, .tbos, .selectedTab div.kdTabTitle, .selectedGadgetTitle {text-shadow: 0 1px 0 rgba(0,0,0,0.5) !important}\n.gbts, #gbgs4dn {text-shadow: 0 1px 0 #000 !important}\n#knavm {text-shadow: 0 0 2px #000 !important}\n#content .uim .title-cell strong, #content .uim .callout strong, .thread_table .unread b, .thread_table .selected b, #views .Nk.Ok b {color: #FFF !important; text-shadow: 0 0 6px rgba(255,255,200,0.8) !important}\nspan.bd, .controls > b > a, td.goog-date-picker-month, td.goog-date-picker-year, th.goog-date-picker-wday {border-bottom: 1px dotted #444 !important}\n.f span[style*=\"background:#aaa;border:#999 1px solid;border-radius:2px;\"] {border-style: dashed !important}\n\n#res a:hover img, .videobox a:hover img, .vstb, .vsbb, .vstbb, .vstbt, a:hover .newsimg {border-color: #FA0 !important}\n.f span[style*=\"background:#aaa;border:#999 1px solid;border-radius:2px;\"] {border-color: #F80 !important}\n\na:hover, a:hover *, .link:hover, #gbgs4dn:hover, .cb > div:hover, .kdSidebarContent > div:hover, #sharesLink:hover, #updatesLink:hover, #friendsLink:hover, #talk_title:hover, .as-tip-span:hover, .g a:visited:hover, .g a:visited:hover *, #footer a:hover, #leftnav a:hover, #leftnav a:hover *, .chip_x:hover, .gsib_b:hover, #rg_hta:hover, .goog-date-picker-date:hover, #add_gadget:hover, #change_theme:hover, #themes_keep_theme_link:hover, .selectionTools span:hover, #GMmessages a:hover, .bubble .item-body a:hover {\n  color: LightPink !important;\n  text-shadow: 0 0 6px rgba(255,255,200,0.8) !important}\na.kd-button:hover *, a.nolink:hover {text-shadow: none !important; color: #999 !important}\ntd.menulist:hover {\n  color: #BBB !important;\n  background: -o-linear-gradient(left, #333, #111) !important;\n  background: -moz-linear-gradient(left, #333, #111) !important;\n  background: -webkit-linear-gradient(left, #333, #111) !important}\n\n.vst {border-bottom: 1px dotted #666 !important}\n.g a:visited, .g a:visited * {color: DarkCyan !important}";
if (typeof GM_addStyle != "undefined") {
	GM_addStyle(css);
} else if (typeof PRO_addStyle != "undefined") {
	PRO_addStyle(css);
} else if (typeof addStyle != "undefined") {
	addStyle(css);
} else {
	var heads = document.getElementsByTagName("head");
	if (heads.length > 0) {
		var node = document.createElement("style");
		node.type = "text/css";
		node.appendChild(document.createTextNode(css));
		heads[0].appendChild(node); 
	}
    }
}{
    
/*
		================================
		|| Google Images Enhancements ||
		================================
*/

var doubleDecodeURIComponent = function (component){
  var tmp = decodeURIComponent(component);
  tmp = decodeURIComponent(tmp);
  return tmp;
}

var parseUrl = function (url) {
  var qstr = url.split('?');
  if (qstr.length <= 1)
    return [];
  var rawparams = qstr[1].split('&');
  var par = [];
  for (var i=0 ; i<rawparams.length ; i++){
    var p = rawparams[i].split("=");
    par[p[0]] = p[1];
  }
  return par;
}

var getImageLinks = function (url) {
  var param = parseUrl(url);
  var links = new Object();
  links.toImgHref = decodeURIComponent(param["imgurl"]);
  links.toPageHref = decodeURIComponent(param["url"]);
  return links;  
}

var getNewImageLinks = function (url) {
  var param = parseUrl(url);
  var links = new Object();
  links.toImgHref = doubleDecodeURIComponent(param["imgurl"]);
  links.toPageHref = decodeURIComponent(param["imgrefurl"]);
  return links;  
}

var firstOrNull = function (elems) {
  return (elems.length > 0 ) ? elems[0] : null;
}

var imgTable = firstOrNull(document.getElementsByClassName('images_table'));
if ( imgTable ) { // for basic version
  var imgCell = imgTable.getElementsByTagName('td');
  for( j=0 ; j<imgCell.length ; j++ ) {
    var imageAnchor = imgCell[j].getElementsByTagName('a')[0];
    var domainText =  imgCell[j].getElementsByTagName('cite')[0];
    console.log(imageAnchor.href);
    var links = getImageLinks(imageAnchor.href);
    //links.toPageHref = imageAnchor.href; // TODO fixme
    links.toImgHref = imageAnchor.href; // TODO fixme
    
    domainText.innerHTML = '<a href="' + links.toPageHref + '">' + domainText.innerHTML + '/&hellip;<\a>';
    imageAnchor.href = links.toImgHref;
  }
}
else { // standard version
  console.log("standard version");
  var stopEvent = function(event){ event.stopPropagation() }
  
  var fixStyle = function(target){
    var parent = target.parentNode;
    parent.style.height = target.style.height;
    parent.style.width = target.style.width;
    parent.style.left = target.style.left;
    target.style.left = 'auto';
  }
  
  var fixBoxObserver = new MutationObserver(function(mutations){
    mutations.forEach(function(mutation) {
      var target = mutation.target;
      var parent = mutation.target.parentNode;
      if (mutation.attributeName === 'style' && target.style.left !== 'auto'){
	fixStyle(target);
      }
    });
  });
  var fixBoxMutationConfig = { attributes: true, childList: true, characterData: false, subtree: false };
    
  var fixImageBox = function(image){
    if ( /\blinkOk\b/.test(image.className) ) {
      return;
    }
    var span = image.querySelector('span.rg_ilmn');
    if (span !== null) {
      var a = firstOrNull(image.getElementsByTagName('a'));
      var links = getNewImageLinks(a.href);
      a.href = links.toImgHref;
      a.addEventListener('click', stopEvent, false);
	  a.addEventListener('mousedown', stopEvent, false);

      var newContainer = document.createElement('div');
      newContainer.className = 'newCont';

      a.parentNode.appendChild(newContainer);
      newContainer.appendChild(a);
      newContainer.appendChild(span.parentNode);

      fixStyle(a);
      
      var desc = span.innerHTML;
      span.innerHTML = '<a style="color:#fff" href="' + links.toPageHref + '">' + desc + '</a>';
      image.className += ' linkOk'
      fixBoxObserver.observe(a, fixBoxMutationConfig);
    }
    else {
      console.log("incomplete span");
      image.className += ' notComplete';
    }
  }
 
  var fixImages = function(){
    var imagesContainer = document.getElementById('rg_s');
	if ( imagesContainer == null ) return;
    var images = imagesContainer.getElementsByClassName('rg_di');
    for (var i = 0 ; i< images.length ; i++) {
      fixImageBox(images[i]);
    }
  }
  
  var newBoxMutationConfig = { attributes: false, childList: true, characterData: false, subtree: true };
  var newBoxObserver = new MutationObserver(function(mutations){
    var needFix = false;
    mutations.forEach(function(mutation) {
      needFix = needFix || mutation.target.id == 'rg_s';
    });
    if (needFix)
      fixImages();
  });

  fixImages();
  newBoxObserver.observe(document.body, newBoxMutationConfig);

  var css = [];  var i = 0;
  css[i++] = '.newCont { position: relative; }';
  css[i++] = '.newCont .rg_ilmbg { display: none; }';
  css[i++] = '.newCont:hover .rg_ilmbg { display: block; }';
  
  css[i++] = '.imgSiteLnk {'; ///img preview
  css[i++] = '  background-color: rgba(255, 255, 255, 0.77);';
  css[i++] = '  bottom: 0;';
  css[i++] = '  color: #000000;';
  css[i++] = '  display: block;';
  css[i++] = '  line-height: normal;';
  css[i++] = '  position: absolute;';
  css[i++] = '  text-decoration: none;';
  css[i++] = '  width: 100%; ';
  css[i++] = '  display: none }';
  css[i++] = '.imgPrev:hover .imgSiteLnk { display: block }';///img preview
  var style = document.createElement('style');
  style.type = 'text/css';
  style.appendChild(document.createTextNode(css.join('\n')));
  document.head.appendChild(style);

  ///img preview in google search (only links to page)
  var fixImagePreview = function(div){
	var images = document.getElementsByClassName('bicc');
	for (var i = 0 ; i<images.length ; i++) {
		var div = images[i];
		var el = div.getElementsByTagName('a');
		if ( el.length == 1 ) {
			div.className += ' imgPrev';
			//div.style.border = '4em solid black';
			var href = el[0].href;
			var link = doubleDecodeURIComponent(parseUrl(href)['imgil']);
			link = decodeURIComponent(link.split(';')[5]);
			
			var a = document.createElement('a');
			a.href = link;
			a.className = 'imgSiteLnk';
			a.textContent = link.split('/')[2];
			div.appendChild(a);
		}
	}
  }
  var searchObserver = new MutationObserver(function(mutations){
	fixImagePreview();
  });
  searchObserver.observe(document.body, 
	{ 
		attributes: false, 
		childList: true, 
		characterData: false, 
		subtree: true 
	}
	);
  
  // visually similar search img preview (oly links to image)
  var similars = document.querySelectorAll('div._mj a');
  console.log(similars.length)
  for (var i = 0 ; i < similars.length ; i++){
	var a = similars[i];
	var href = getNewImageLinks(a.href);
	console.log(href)
	if ( typeof href.toImgHref === 'undefined' ) {
		console.log('skip')
		continue;
	}
	console.log(href.toImgHref)
	var newA = document.createElement('a');
	newA.href = href.toImgHref;
	newA.appendChild(a.firstChild);
	a.parentNode.replaceChild(newA, a);
  }

}

}{

/*		=================================
		|| Additional Google SearchBar ||
		=================================
*/

var langs = {
	'':'-'
	,'Any Language': '-'
	,'Spanish': 'es'
	,'Russian': 'ru'
	,'Portuguese': 'pt'
	,'Italian': 'it'
	,'Greek': 'el'
	,'German': 'de'
	,'French': 'fr'
	,'English': 'en'
	,'==========': '-'
	,'Afrikaans': 'af'
	,'Arabic': 'ar'
	,'Armenian': 'hy'
	,'Belarusian': 'be'
	,'Bulgarian': 'bg'
	//,'Catalan': 'ca'
	,'Chinese': 'zh-CN'
	//,'Chinese (Traditional)': 'zh-TW'
	,'Croatian': 'hr'
	,'Czech': 'cs'
	,'Danish': 'da'
	,'Dutch': 'nl'
	//,'Esperanto': 'eo'
	,'Estonian': 'et'
	,'Filipino': 'tl'
	,'Finnish': 'fi'
	,'Hebrew': 'iw'
	,'Hindi': 'hi'
	,'Hungarian': 'hu'
	,'Icelandic': 'is'
	,'Indonesian': 'id'
	,'Japanese': 'ja'
	,'Korean': 'ko'
	,'Latvian': 'lv'
	,'Lithuanian': 'lt'
	,'Norwegian': 'no'
	,'Persian': 'fa'
	,'Polish': 'pl'
	,'Romanian': 'ro'
	,'Serbian': 'sr'
	,'Slovak': 'sk'
	,'Slovenian': 'sl'
	//,'Swahili': 'sw'
	,'Swedish': 'sv'
	,'Thai': 'th'
	,'Turkish': 'tr'
	,'Ukrainian': 'uk'
	,'Vietnamese': 'vi'
};

var filetypes = {
	'':'-'
	,'Any Format': '-'
	,'Adobe PDF (.pdf)': 'pdf'
	,'Adobe Postscript (.ps)': 'ps'
	,'Autodesk DWF (.dwf)': 'dwf'
	,'Digital Audio M4A (.m4a)': 'm4a'
	,'Digital Audio MP3 (.mp3)': 'mp3'
	,'Digital Video Avi (.avi)': 'avi'
	,'Digital Video MP4 (.mp4)': 'mp4'
	,'Digital Video MKV (.mkv)': 'mkv'
	,'Excel Datasheet(.xls)': 'xls'
	,'Google Earth KML (.kml)': 'kml'
	,'Google Earth KMZ (.kmz)': 'kmz'
	,'Metadata File (.torrent)': 'torrent'
	,'PowerPoint (.ppt)': 'ppt'
	,'Rich Text Format (.rtf)': 'rtf'
	,'Shockwave Flash (.swf)': 'swf'
	,'WinRAR Archiver (.rar)': 'rar'
	,'Word Document (.doc)': 'doc'
};

var sitesearches = {
	'':'-'
	,'Any Site': '-'
	,'AvaxHome': 'avaxho.me'
	,'Ba-K': 'ba-k.com'
	,'EbookBrowse': 'ebookbrowse.com'
	,'EbooksBay': 'ebooksbay.org'
	,'Education': '.edu'
	,'Fapdu': 'fapdu.com'
	,'FileShut': 'fileshut.com'
	,'Gobierno MX': '.gob.mx'
	,'Government': '.gov'
	,'IATE': 'iate.europa.eu'
	,'Identi': 'identi.li'
	,'Redalyc': 'redalyc.org'
	,'Taringa': 'taringa.net'
	,'Twilight': 'twilight.ws'

};

var holder = document.createElement('div')
	,cboLang = document.createElement('select')
	,cboFileType = document.createElement('select')
	,cboSiteSearch = document.createElement('select')
	,btnSearch = document.createElement('button')
	,searchBoxHolderID = 'gbqfw'
	,searchBoxID = 'gbqfq'
	,query = location.search;

/* Fill combo boxes */
for (var l in langs) {
		cboLang.innerHTML += '<option ' + 
			((query.indexOf('&lr=lang_' + langs[l]) !== -1) ? 'selected="selected"' : '') + 
			'value="' + langs[l] + '">' + l + '</option>';
}

for (var f in filetypes) {
	cboFileType.innerHTML += '<option ' + 
			((query.indexOf('&as_filetype=' + filetypes[f]) !== -1) ? 'selected="selected"' : '') + 
			'value="' + filetypes[f] + '">' + f + '</option>';
}

for (var s in sitesearches) {
	cboSiteSearch.innerHTML += '<option ' + 
			((query.indexOf('&as_sitesearch=' + sitesearches[s]) !== -1) ? 'selected="selected"' : '') + 
			'value="' + sitesearches[s] + '">' + s + '</option>';
}

/* Add elements to the page */
holder.setAttribute('style','background-color:inherit;border:1px solid inherit;padding:1px 5px;');
holder.appendChild(document.createTextNode(' Language: '));
holder.appendChild(cboLang);
holder.appendChild(document.createTextNode(' File Type: '));
holder.appendChild(cboFileType);
holder.appendChild(document.createTextNode(' Site: '));
holder.appendChild(cboSiteSearch);
btnSearch.appendChild(document.createTextNode('Search'));
btnSearch.setAttribute('style','margin-left:5px;');
holder.appendChild(btnSearch);
document.getElementById(searchBoxHolderID).appendChild(holder);

/* Search with customized settings */
btnSearch.onclick = function () {
	var selectedLang = cboLang.options[cboLang.selectedIndex].value
		,searchTerm = document.getElementById(searchBoxID).value.replace(/ +filetype:[^ ]*/gi, '')
		,selectedFileType = cboFileType.options[cboFileType.selectedIndex].value
		,searchTerm = document.getElementById(searchBoxID).value.replace(/ +OR+sitesearch:[^ ]*/gi, '')
		,selectedSiteSearch = cboSiteSearch.options[cboSiteSearch.selectedIndex].value
		,lang = (selectedLang == '-') ? '' : ('&lr=lang_' + selectedLang)
		,filetype = (selectedFileType == '-') ? '' : ('&as_filetype=' + selectedFileType)
		,sitesearch = (selectedSiteSearch == '-') ? '' : ('&as_sitesearch=' + selectedSiteSearch)
		,url = location.protocol + '//' + location.host + '/search?q=' + encodeURIComponent(searchTerm) + lang + filetype + sitesearch;
	
	window.location.replace(url);
};

}{

/*
		========================================
		|| Pictures Viewer & Greased LightBox ||
		========================================
*/

(function(topObject,window,document){
	'use strict';

	function init(topObject,window,document,arrayFn,envir){
		//一些设定。
		var prefs={
			floatBar:{//浮动工具栏相关设置.
				butonOrder:['actual','current','magnifier','gallery'],//按钮排列顺序'actual'(实际的图片),'current'(当前显示的图片),'magnifier'(放大镜观察),'gallery'(图集)
				showDelay:366,//浮动工具栏显示延时.单位(毫秒)
				hideDelay:566,//浮动工具栏隐藏延时.单位(毫秒)
				position:'top left',// 取值为: 'top left'(图片左上角) 或者 'top right'(图片右上角) 'bottom right'(图片右下角) 'bottom left'(图片左下角);
				offset:{//浮动工具栏偏移.单位(像素)
					x:-15,//x轴偏移(正值,向右偏移,负值向左)
					y:-15,//y轴偏移(正值,向下,负值向上)
				},
				forceShow:{//在没有被缩放的图片上,但是大小超过下面设定的尺寸时,强制显示浮动框.(以便进行旋转,放大,翻转等等操作)..
					enabled:true,//启用强制显示.
					size:{//图片尺寸.单位(像素);
						w:166,
						h:166,
					},
				},
				minSizeLimit:{//就算是图片被缩放了(看到的图片被设定了width或者height限定了大小,这种情况下),如果没有被缩放的原图片小于设定值,那么也不显示浮动工具栏.
					w:100,
					h:100,
				},
			},

			magnifier:{//放大镜的设置.
				radius:77,//默认半径.单位(像素).
				wheelZoom:{//滚轮缩放.
					enabled:true,
					pauseFirst:true,//需要暂停(单击暂停)后,才能缩放.(推荐,否则因为放大镜会跟着鼠标,如果放大镜过大,那么会影响滚动.)..
					range:[0.4,0.5,0.6,0.7,0.8,0.9,1,1.1,1.2,1.3,1.4,1.5,1.7,1.9,2,2.5,3.0,4.0],//缩放的范围
				},
			},

			gallery:{//图库相关设定
				fitToScreen:false,//图片适应屏幕(适应方式为contain,非cover).
				sidebarPosition:'bottom',//'top' 'right' 'bottom' 'left'  四个可能值
				sidebarSize:130,//侧栏的高(如果是水平放置)或者宽(如果是垂直放置)
				preload:true,//对附近的图片进行预读。
				max:5,//最多预读多少张(前后各多少张)
			},

			imgWindow:{//图片窗相关设置
				fitToScreen:false,//适应屏幕,并且水平垂直居中(适应方式为contain,非cover).
				defaultTool:'hand',//"hand","rotate","zoom";打开窗口的时候默认选择的工具
				overlayer:{//覆盖层.
					shown:false,//显示
					color:'rgba(0,0,0,0.73)',//颜色和不透明度设置.
					clickToClose:[true,'click'],//[是否使用点击关闭窗口 "true,false",关闭触发方式,"click,dblclick"]
				},
				zoom:{//滚轮缩放
					range:[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.1,1.2,1.3,1.4,1.5,1.7,1.9,2,2.5,3.0,4.0],//缩放比例.(不要出现负数,谢谢-_-!~)
					mouseWheelZoom:true,//是否允许使用滚轮缩放。
				},
			},

			//旋转的时候,按住shift键时,旋转的步进.单位:度.
			shiftRotateStep:15,

			//等图片完全载入后,才开始执行弹出,放大等等操作,
			//按住ctrl键的时候,可以临时执行和这个设定相反的设定.
			waitImgLoad:true,

			//框架里面的图片在顶层窗口展示出来,但是当frame与顶层窗口domain不一样的时候,可能导致图片被反盗链拦截,
			//按住shift键,可以临时执行和这个设定相反的设定
			framesPicOpenInTopWindow:true,
		};


		//各网站高级规则;
		var siteInfo=[
			{siteName:"google图片搜索",
				//网址例子.(方便测试.查看.之类的)
				siteExample:"http://www.google.com.hk/search?q=opera&tbm=isch",
				//是否启用
				enabled:true,
				//站点正则
				url:/https?:\/\/www.google(\.\w{1,3}){1,3}\/search\?.*&tbm=isch/,
				//鼠标左键点击直接打开..(这个只是当高级规则的getImage()返回图片的时候生效)
				clikToOpen:{
					enabled:true,
					preventDefault:true,//是否尝试阻止点击的默认行为(比如如果是你点的是一个链接,默认行为是打开这个链接,如果是true,js会尝试阻止链接的打开(如果想临时打开这个链接,请使用右键的打开命令))
					type:'actual',//默认的打开方式: 'actual'(弹出,原始图片) 'magnifier'(放大镜) 'current'(弹出,当前图片)
				},
				//获取图片实际地址的处理函数,
				//this 为当前鼠标悬浮图片的引用,
				//第一个参数为当前图片的引用,
				//第二个参数为包裹当前图片的第一个a元素(可能不存在).
				getImage:function(img,a){
					if(!a)return;
					return (a.href.match(/imgurl=(.*?\.\w{1,5})&/i) || [])[1]; 
				},
			},
			{sitename:"百度图片搜索",
				enabled:true,
				url:/^https?:\/\/image\.baidu\.com\/i\?/i,
				getImage:function(img,a){
					var origin=img.dataset['origin'];
					if(origin){
						return origin
					}else{
						if(a){
							var onclick=a.getAttribute('onclick');
							if(onclick){
								return (onclick.match(/u:'(https?:\/\/[^']+)'/i) || [])[1];
							};
						};
					};
				},
			},
			{sitename:"豆瓣",
				siteExample:"http://movie.douban.com/photos/photo/1000656155/",
				enabled:true,
				url:/^https?:\/\/[^.]*\.douban\.com/i,
				getImage:function(){
					var oldsrc=this.src;
					var newsrc=oldsrc.replace(/\/view\/photo\/photo\/public\//i,'/view/photo/raw/public/');
					if(newsrc!=oldsrc)return newsrc;
				}
			},
			{sitename:"deviantart",
				enabled:true,
				url:/^https?:\/\/[^.]*\.deviantart\.com/i,
				siteExample:"http://www.deviantart.com",
				getImage:function(){
					var oldsrc=this.src;
					var newsrc=oldsrc.replace(/(http:\/\/[^\/]+\/fs\d+\/)200H\/(.*)/i,'$1$2');
					return newsrc==oldsrc? '' : newsrc;
				},
			},
			{sitename:"opera官方论坛",
				enabled:true,
				url:/^http:\/\/bbs\.operachina\.com/i,
				siteExample:"http://bbs.operachina.com",
				getImage:function(){
					var src=this.src;
					if(/file.php\?id=\d+$/i.test(src)){
						return src+'&mode=view';
					};
				},
			},
			{sitename:"QQ微博",
				enabled:true,
				url:/^http:\/\/[^\/]*t\.qq\.com\//i,
				siteExample:"http://t.qq.com/p/news",
				getImage:function(img){
					var pic=/(\.qpic\.cn\/mblogpic\/\w+)\/\d+/i;//图片
					var head=/(\.qlogo\.cn\/mbloghead\/\w+)\/\d+/i;//头像.
					var oldsrc=this.src;
					var newsrc;
					if(pic.test(oldsrc)){
						newsrc=oldsrc.replace(pic,'$1/2000');
						return newsrc==oldsrc? '' : newsrc;;
					}else if(head.test(oldsrc)){
						newsrc=oldsrc.replace(head,'$1/0');
						return newsrc==oldsrc? '' : newsrc;;
					};
				},
			},
			{sitename:"新浪微博",
				enabled:true,
				url:/^http:\/\/weibo\.com/i,
				siteExample:"http://weibo.com/pub/?source=toptray",
				getImage:function(img){
					var oldsrc=this.src;
					var pic=/(\.sinaimg\.cn\/)(?:bmiddle|thumbnail)/i;//图片.
					var head=/(\.sinaimg\.cn\/\d+)\/50\//i;//头像.
					var photoList=/\.sinaimg\.cn\/thumb150\/\w+/i//相册
					var newsrc;
					if(pic.test(oldsrc)){
						newsrc=oldsrc.replace(pic,'$1large');
						return newsrc==oldsrc? '' : newsrc;
					}else if(head.test(oldsrc)){
						newsrc=oldsrc.replace(head,'$1/180/');
						return newsrc==oldsrc? '' : newsrc;
					}else if(photoList.test(oldsrc)){
						newsrc=oldsrc.replace('/thumb150/','/mw690/');
						return newsrc==oldsrc? '' : newsrc;
					};
				},
			},
			{sitename:"pixiv",
				enabled:true,
				url:/^http:\/\/www\.pixiv\.net/i,
				getImage:function(img){
					var oldsrc=this.src;
					var reg=/(\d+)(_\w)(\.\w{2,5})$/i
					if(reg.test(oldsrc)){
						return oldsrc.replace(reg,'$1$3');
					};
				},
			},
			{sitename:"沪江碎碎",
				enabled:true,
				url:/^https?:\/\/([^.]+\.)*(?:yeshj\.com|hjenglish\.com|hujiang\.com)/i,
				getImage:function(img){
					var oldsrc=this.src;
					var reg=/^(https?:\/\/(?:[^.]+\.)*hjfile.cn\/.+)(_(?:s|m))(\.\w+)$/i;
					if(reg.test(oldsrc)){
						return oldsrc.replace(reg,'$1$3');
					};
				},
			},
			{sitename:"百度贴吧",
				enabled:true,
				url:/^http:\/\/tieba\.baidu\.com\/.+/i,
				getImage:function(img){
					var src=img.src;
					var reg=/^(http:\/\/imgsrc\.baidu\.com\/forum\/)ab(pic\/item\/[\w.]+)/i
					var result=src.match(reg);
					if(result){
						return result[1]+result[2];
					}else{
						var id=img.id;
						if(id.indexOf('big_img_')==0){
							return src;
						};
					};
				},
			},
			{sitename:"178.com",
				enabled:true,
				url:/^https?:\/\/(?:\w+\.)+178\.com\//i,
				clikToOpen:{
					enabled:true,
					preventDefault:true,
					type:'actual',
				},
				getImage:function(img,a){
					if(!a)return;
					var reg=/^https?:\/\/(?:\w+\.)+178\.com\/.+?(https?:\/\/img\d*.178.com\/[^.]+\.(?:jpg|jpeg|png|gif|bmp))/i;
					var matched=a.href.match(reg);
					return (a.href.match(reg) || [])[1];
				},
			},
		];

		//通配型规则,无视站点.
		var tprules=[
			function(img,a){//解决新的dz论坛的原图获取方式.
				var reg=/(.+\/attachments?\/.+)\.thumb\.\w{2,5}$/i;
				var oldsrc=this.src;
				var newsrc=oldsrc.replace(reg,'$1');
				if(oldsrc!=newsrc)return newsrc;
			},
		];

		//图标
		prefs.icons={
			actual:'',
			magnifier:'',
			current:'',
			gallery:'',


			loading:'data:image/gif;base64,R0lGODlhGAAYALMPACgoKOnp6cnJyaamppmZmVhYWGdnZ3d3d4aGhgEBAdnZ2UNDQ/b29r29vbGx  sf///yH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/  IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRv  YmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwg  MjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8v  d3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiBy  ZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxu  czp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0  dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9y  VG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9Inht  cC5paWQ6QUU5MTZGNDMxQ0E4MTFFMkE1Q0NEMTFGODU0MkUzNzUiIHhtcE1NOkRvY3VtZW50SUQ9  InhtcC5kaWQ6QUU5MTZGNDQxQ0E4MTFFMkE1Q0NEMTFGODU0MkUzNzUiPiA8eG1wTU06RGVyaXZl  ZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBRTkxNkY0MTFDQTgxMUUyQTVDQ0QxMUY4  NTQyRTM3NSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBRTkxNkY0MjFDQTgxMUUyQTVDQ0Qx  MUY4NTQyRTM3NSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4g  PD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb  2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOi  oaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2pp  aGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEw  Ly4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAUFAA8A  LAAAAAAYABgAAATMMMlJq710GQQAMgBmLYMSKMuirMQiSocZnOlqH68h06qtFJhPomASEDoEwQpY  MFQWM2fhEJoADkyBwDVxMBgBp6igVBAm0C8D8YqtBFWDWlHFABo2MQLMGLwkCFoCbAkAKQt1IoaL  Eh2Of4WOVQUDBANiL4ENAjgJJAOViRYADoJAhZagpxgGgg11BqAtLwWbgxQABLMaiQAGLrUNXGgu  JA4EVB4DDQ7AmE8DDtIDHQ4N18200dIO1dfMq3YI0dSkDQMckI1NHb+i6vARACH5BAUFAA8ALAAA  AAABAAEAAAQC8EUAIfkEBQUADwAsAQABABYAFgAABJbwySkPoYtq6gILEzhsmsd8YQCS4YlK6roV  meEpY0gdE0AQNQRLolBMDoMBcEiUjHzJQYFJUSwW0QtVQCkoBwbqg1A0PgBo8SSj3mRqjjhPLVAI  444cs1EOD/BhQwdlXA8HcXpDdQpaD0lMcw8ChRJTEg4NiQ4CDZYsmA0NDhINk5yeG6ANE6WTq0MZ  mKMPpa9tcweoFBEAIfkEBQUADwAsAAAAAAEAAQAABALwRQAh+QQFBQAPACwBAAEAFQAVAAAEgvDJ  +cAykhzKJzjEQABPwARONxXhIJImc6rP0r6lfGKqLfIDxe7Bk7gki0IHgSlKHI4BjRMIGKGpqaRq  fWC1FK4BuwGbz+gOqfFgmwkKhaRBPws4dPdZ3m5ktXwUWUoqhHEdBQ0CDggZDYGFigICbgJxCncq  BpKUEpZxAk4dipWYHREAIfkEBQUADwAsAAAAAAEAAQAABALwRQAh+QQFBQAPACwBAAEAFgAWAAAE  n/DJKcs0C9A9FxrO8ADEQBzcBjrhWA6mlT5rS8Lmwhky+KAPQ4mgeyA6LFmqUAwEZIhGw6FMGQIM  BkXaMMwkiKz2UeCKvhKFGNUAoyUDBpbwrkuK9oXuIGgIjnYTBQKEDnZOARJ+hEAzCIgPOgiEDVUz  TmcPUjKNE4AzMgIKbRMCDwoSBp2lCq2mC6hpaKKukbF2BKICerFEdQsGgJ8cEQAh+QQFBQAPACwA  AAAAAQABAAAEAvBFACH5BAUFAA8ALAEAAQAWABYAAASU8Mk5zyw0a9ecHM6AABrFNd3nrEMpFWf6  gKz7eq10gPmCTaiJwbYgEEgSgaBhkxQHA8ujoRQ0HwUolFT1XAnagoV6lRgG4GE5A2hTkGuKQvEg  lAeMAMM+VzCvCgyCUn1lgnkTc1ZNBnoMXg9KV0ONARRqDwoBAnYSmg+YJXQBAXQSpJahGZ+lE6im  TXQKSK1rcGYuEQAh+QQFBQAPACwAAAAAAQABAAAEAvBFACH5BAUFAA8ALAEAAQAWABYAAASV8MlJ  5amYkiaadI3zLJlkcEL3NaxYPqj6gO0rcQ5ChUWWSj2MYTIYkB4EhUJgkwwcOYlAqbjYoK4H1dOc  QaVMQvfgeEpIx25lwVY/APCHTqs2DAiD4YTZxBdJfHI2BUV3AEgSCk0LflYkihJzGYwEhxV6FAMP  DAFnQRRDnWcPAQymohlWoiSlpg9WJZqdrAwPml1pTREAIfkEBQUADwAsAAAAAAEAAQAABALwRQAh  +QQFBQAPACwBAAEAFgAWAAAEi/DJKQ2iOFOhhGxCo2Gc0n1C2hjjU54PqBbZMXGihDjhxE6mloT2  cDgAGIVQ4mjkHsplxdlwPH5SyYAqMUWzVpsEmS2bywfHwGoIuL9Co4OmcAek8sHEnV1bgVeBGQUL  WnoUPwEMCocGBAMEhS2KDAx3AI8DkJIalJYPmJqbcYqXjwQGZEsHBEOcGBEAIfkEBQUADwAsAAAA  AAEAAQAABALwRQAh+QQFBQAPACwBAAEAFgAWAAAEk/DJSSUyNc+hnlqPoAiENh2dlIrKaKrTF7au  hnlhKTV1YUuHTPBRaDRAj0Eg8JoUBQLKktkMQRuSabTqgEYR1KpF0NhKkOK0mhFgDNSOR5BBTw+M  WAmdUTXgN3QBNy8ORghSZz4Vgw5xJ2cEAwQ3BwMOby8LkQOSAEmNly8Fm5yelo0DihoAB5EEppdD  VQALN4MZEQAh+QQFBQAPACwAAAAAAQABAAAEAvBFADs=',
			loadingCancle:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ  bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp  bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6  eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0  NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo  dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw  dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv  IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS  ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD  cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl  SUQ9InhtcC5paWQ6MzBFMjYzRTUxQ0IwMTFFMkE5RkRDMDFGNUY3NTA2OTYiIHhtcE1NOkRvY3Vt  ZW50SUQ9InhtcC5kaWQ6MzBFMjYzRTYxQ0IwMTFFMkE5RkRDMDFGNUY3NTA2OTYiPiA8eG1wTU06  RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozMEUyNjNFMzFDQjAxMUUyQTlG  REMwMUY1Rjc1MDY5NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozMEUyNjNFNDFDQjAxMUUy  QTlGREMwMUY1Rjc1MDY5NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w  bWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmI2XfsAAADqSURBVHja7FTLDYMwDI1puwQr5MCJKZCy  B3cklsg9GzAAEjAEezBFhRtHISr/T9VD1VgyJP68ZzsBQET2TQFP8McEaZoGJ7F6pdTMeN9KaNv2  nR3iODYLbaeX82k7nO6g67oRiBCC6VgDBABYluUIhx5hGM5w9sbgKrOARLgIfrWDQXCvgLUOVgmi  KGJ2HEarqhoFJklicod8zjkriuL0iLY6OHS/jxCgrn5mtDb8lADrunabPM8fpMPe+vASAc20aZrp  gT6tusOlGIpdk60PLciy7EYLKWW/dIO0P5gU2vu/qSf4QYKXAAMAJ5qBE+5PPaUAAAAASUVORK5C  YII=',

			hand:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ  bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp  bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6  eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0  NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo  dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw  dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv  IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS  ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD  cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl  SUQ9InhtcC5paWQ6QjI3OEJEQkYxQ0U3MTFFMjg5NDZFNzJBMTc5RTBBMzMiIHhtcE1NOkRvY3Vt  ZW50SUQ9InhtcC5kaWQ6QjI3OEJEQzAxQ0U3MTFFMjg5NDZFNzJBMTc5RTBBMzMiPiA8eG1wTU06  RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCMjc4QkRCRDFDRTcxMUUyODk0  NkU3MkExNzlFMEEzMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCMjc4QkRCRTFDRTcxMUUy  ODk0NkU3MkExNzlFMEEzMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w  bWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjEL5KQAAAHBSURBVHja5FRNywFhFGVmkM9EEaWQEik1  Fqws/AWJn2Dl/8haKTsW/ANljaQslLLwka98NjNOpvTkfeadUXo371k83bndOXPuufcZfT6f130D  jO5L+EOi0Wg0GAxUyzhqdj6fX6/XYDDIsmytVlssFo1G43w+z2Yzh8Ph9/u1KspkMsViURRF+dHn  8+G0WCzVarVQKHygqFQqCYIwHo+Px+MrGY1GcTqdzg882mw2OMPhMOheSbvdTvY+nU7ViWCKJEmx  WOx0OklPrNdrtCbHt9stnU6Xy2V1ot1uB4O8Xq/b7RafQEfJZBLB/X4/HA5YY7PZTL7CxuNxOdpu  t5g0JNhsNqPRGIlE8PFUKiWrgAQ5QNcejycQCGCsqKcQ8TxfqVSsVmu/30d1NpuVaHC5XGAxmUyt  VgtfpUxtuVxyHIfBJxKJer2+3+9hitL6YaFQT28N9AzDhEIhGAF1l8vFYDBQRWFLu90uKed9j3q9  HkwFF4rgJTl7EhC7Wq1U9qjT6UAzLBCVIW+Z+kI2m01MEIGgAK1EQLvdFpTxZvNvRPBoOBxS+8IQ  cD+0XlpgMpnkcrmfefIak9D/53+2RjwEGAAlkHhWHev9/QAAAABJRU5ErkJggg==',
			rotate:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ  bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp  bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6  eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0  NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo  dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw  dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv  IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS  ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD  cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl  SUQ9InhtcC5paWQ6RjM2M0UyRTcxQ0U3MTFFMjgxRDNEQkM4N0Q3NTg2QkMiIHhtcE1NOkRvY3Vt  ZW50SUQ9InhtcC5kaWQ6RjM2M0UyRTgxQ0U3MTFFMjgxRDNEQkM4N0Q3NTg2QkMiPiA8eG1wTU06  RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGMzYzRTJFNTFDRTcxMUUyODFE  M0RCQzg3RDc1ODZCQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGMzYzRTJFNjFDRTcxMUUy  ODFEM0RCQzg3RDc1ODZCQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w  bWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlX779gAAAJXSURBVHja3JQ5a6pREIbzqbigoqBeNyI2  pghEAnZiJZZ2/gMLQZBgoYUEXIJgYyD+gYhYxcJGtDKQH6CIImKhuIAGFHHfl9yXyPV6DZoUKS6Z  YjhHzzxn5p05H2EwGM6+w0hn32T/H4hy7I/RaNTpdCaTCYVCWa1W6/X617vVajV4BoPxOQgx1WpV  oVCYzWa5XD6fz2k0Gn58fHxMJpMmk+n5+RlbMpm8H0UcdA0n6vX67e2tQCCIx+OlUqlQKFxeXl5f  X+t0OuQokUiAttvtfD5/n3Wo0XA49Hq9r6+vgUAAFKSGLXw6nQady+WiWFx2c3OD+05lpNfrZ7MZ  SsAa8R6Ph0qlLhYLv99/d3fH4XB2J/v9Pi47CtpZLpfTarVisVilUkEjsFwuFyT7avszmUyr1cLC  arUul8tsNnt/f48t8kJ2yPGrIIfDgRgsNBoN2ux2u5VKZT6fh3aQ1ul0HmMdglgslsVi2Sa1NQj8  9PQUiUQwTSQSCZJXKpXPQegFhCAIYrPZNJtNeOTi8/l4PN763cBC1h9ZpH11Go0GWo6bUQK80WiE  Pz8/Z7PZ0Gv9x8B6eHg4CrLZbEwm8+XlBY8ABSKATqfDq9VqeIzfDiQUCkOh0NEngmvRl0Qi0W63  RSLRwblutwsEFlKpNBgM9nq9gwNkjP92hXbIZLKrqys8js2/ViwW397eoDooyAWjeEpsDHQ0GsUL  WH0w5IhROEE57BpYsVjsIwjtu7i4CIfDg8Hg2ED+LW1r4/EYg4dm7+pKpVLlchkjPp1OT3zYiJ/7  8f8twABFT5G5Yf+a5QAAAABJRU5ErkJggg==',
			zoom:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ  bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp  bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6  eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0  NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo  dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw  dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv  IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS  ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD  cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl  SUQ9InhtcC5paWQ6MzI2NDFENzExQ0NBMTFFMjhDOUNGQ0NDOTYzODI4REUiIHhtcE1NOkRvY3Vt  ZW50SUQ9InhtcC5kaWQ6MzI2NDFENzIxQ0NBMTFFMjhDOUNGQ0NDOTYzODI4REUiPiA8eG1wTU06  RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozMjY0MUQ2RjFDQ0ExMUUyOEM5  Q0ZDQ0M5NjM4MjhERSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozMjY0MUQ3MDFDQ0ExMUUy  OEM5Q0ZDQ0M5NjM4MjhERSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w  bWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjUXtsUAAAHTSURBVHjazJTHakJREIZzc63YS2xYsKx0  5cYXEHwBfQb3PpgbwRdw60oXtoWoWBAL9i7mQyGERMNNWeRfXA4znO/M/GfuEZLJ5NNf6Pnpj/T/  QLK70cPhMBgMlsslC4VCodPpnE4ni++BVqsViFQqFQgEjEbjbDZrNpu5XA6cVqt9BBLD4fCHWuRy  eSaT4fxOp1Ov17fbrdvtTiQSpVLpdDqJoijJo/1+n06nQTQajcvlQkXn87larbZaLeJkpZodj8fp  pd/v04UgCFD46vX6Xq83nU7JSgX5/X4oarWawyFOJpP5fL7b7TQaDXGyUs2mF7ygKTafryKITSqV  itKi0ajUiqjCZDJh6of48XgkTlYqaDQacUcc/nyVeNVt7fV6y+UylUoCFYtFs9nMBMES3ykYDNps  NpfL1e1277LuzNFwOIzFYlarFYPokUUkEgmFQuv1+uWqQqHAncpksq9AaLFYMERs8Hg8ZNnD3dGa  wWDgGIfDYbfbP7ME6e8RPw30zWbDGrOy2azP53sb9DsVPVKlUuEe+OPwiH6xkgjz9W0QqtVqsGjq  xrrN6g/fI56B8XhssVgY3bdyHr5HXyufz+OOUqnkB/wVCLXb7X//Zr8KMADSBu6sAZizOwAAAABJ  RU5ErkJggg==',
			flipVertical:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ  bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp  bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6  eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0  NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo  dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw  dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv  IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS  ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD  cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl  SUQ9InhtcC5paWQ6Mzc5RkM3NzYxQ0Y0MTFFMkFGQzk4NzFDMzc4MTVBMTIiIHhtcE1NOkRvY3Vt  ZW50SUQ9InhtcC5kaWQ6Mzc5RkM3NzcxQ0Y0MTFFMkFGQzk4NzFDMzc4MTVBMTIiPiA8eG1wTU06  RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozNzlGQzc3NDFDRjQxMUUyQUZD  OTg3MUMzNzgxNUExMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozNzlGQzc3NTFDRjQxMUUy  QUZDOTg3MUMzNzgxNUExMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w  bWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoWGg/MAAAFCSURBVHja3JTNboMwDMftaVyKVlrYCU68  Ae/Ci/MQE1JRCuok1gNCnuMExgQEJnGaUaIA8S9/fwDmeQ5H2AscZIeBXqc3Xde1bcvzppvneb7v  87wMSpIkjuOdEsqyrKpqGcSUoigQkPQgQuQZkN8gkKz0JUuALMtWQWxBEOyRQ+4csYXXUCTovYR6  IGo3lHsYFRJtgKL3SPbooSMD8TPBoDxGOYeo73snKArFGa2z4AxJpOEo7XarXKArhzac7TKEDdDb  +Qw/9TGx2AFDesAG7MyRfzqtVAn/0NlsX88n6BzIhNNiGyGms+ZFm4E+H495OrYStgSq68Y0r9QK  x8sCLdH0lhN0r5XeRxYCQ3bpl7gFkTOQuoNtOrQlI3HTeZl8bQCX4OICNU2z8+t3gZRSaZruBPHm  VdCH2H/5Zx8G+hZgAJcamqB3G0N7AAAAAElFTkSuQmCC',
			flipHorizontal:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ  bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp  bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6  eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0  NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo  dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw  dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv  IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS  ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD  cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl  SUQ9InhtcC5paWQ6NUVBRDRDOTkxQ0Y0MTFFMkI0OUU5NThEQzI4NTFGNDMiIHhtcE1NOkRvY3Vt  ZW50SUQ9InhtcC5kaWQ6NUVBRDRDOUExQ0Y0MTFFMkI0OUU5NThEQzI4NTFGNDMiPiA8eG1wTU06  RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1RUFENEM5NzFDRjQxMUUyQjQ5  RTk1OERDMjg1MUY0MyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1RUFENEM5ODFDRjQxMUUy  QjQ5RTk1OERDMjg1MUY0MyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w  bWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pnl92swAAAFKSURBVHja3JTJjoMwDIbxqBw6SKVAT3Di  DXgX3l9cRkhFLKIjekHIk9gJoXQhB07jILPFX37bAcjz3NnDvpydbDfQYXkzjuMwDMJvhrmu63me  8K9BSZLEcWwpoSzLqqpegwSlKIogCKJLFIWXMAxOvv99PA73++/t1nVt07RN3bRd2/d9lmVL0Lsa  gRhkSA75Sp7h4fUnEIhZKkhPpzhyqPBg1TVAMcBEMJnRjAJECxBKkloUlo+FWLkG8S1SU8sDPjDm  M2u0UwScnJFDUCEHqIIrpR9qhHIAeZ2Tfj4rsUptlZW6RWSk2RAbIFw2Ho2nxFSN0E4RzUe9qUxi  YPTZ1Agck5rqDhdbooC1gGNZbN7JWpFOEFbpb9VIBZnNrLCyj6KZT4znr7+u6zRNxcU0Tdequi4+  7tn881kcPPkt6Ifsv/yzdwP9CTAAzDedWzss4SgAAAAASUVORK5CYII=',
			close:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAARCAIAAAAt9wkYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ  bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp  bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6  eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0  NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo  dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw  dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv  IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS  ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD  cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl  SUQ9InhtcC5paWQ6Q0I3NzA1RDAxQ0Y3MTFFMkJGMTU4MTc4OEQ2N0MzQjkiIHhtcE1NOkRvY3Vt  ZW50SUQ9InhtcC5kaWQ6Q0I3NzA1RDExQ0Y3MTFFMkJGMTU4MTc4OEQ2N0MzQjkiPiA8eG1wTU06  RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDQjc3MDVDRTFDRjcxMUUyQkYx  NTgxNzg4RDY3QzNCOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDQjc3MDVDRjFDRjcxMUUy  QkYxNTgxNzg4RDY3QzNCOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w  bWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUW1owAAADqSURBVHja5FWxCoQwDL2W+x4X/QmHujvX  zV0XadHN31HUn2gR/KD2AgWRAytETpTLEF5eSfqaaEvyPH/dw97W2rtIMcY8uytKKQeiKPKTP5fS  dZ0DSZKEYQhAa72SdV0japIsy3D9XPdjjIHv+96FUkpPFqV0VwrnHD3dpmm+GCHEwdEJ2VVpTlhV  VdtaEB6m2H2j9oTN87yVAuFhikclviuw8TAMWykQAonuCvJeWZZlmiaHy7IE37Yt+HEc4zgOggBR  EzmgVUdRFI4B4BhYwg2IpGl65ZXq+ZmvfoM838MfP4fPGNBHgAEAi7gyuvHuhZcAAAAASUVORK5C  YII=',
			rotateIndicatorBG:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALoAAAC5CAYAAACfmiVfAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ  bWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp  bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6  eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0  NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo  dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw  dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu  MC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVz  b3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1N  Ok9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowNDQzRDlCNjE4MjRFMjExQTlDNjhCQTlBOTYy  NUVGMyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGRDEzOEEzQTI0MjAxMUUyOTRGREE2Njky  QjdBREQ5OCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGRDEzOEEzOTI0MjAxMUUyOTRGREE2  NjkyQjdBREQ5OCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dz  KSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjMwOTI1OTNB  MUUyNEUyMTFBOUM2OEJBOUE5NjI1RUYzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA0NDNE  OUI2MTgyNEUyMTFBOUM2OEJBOUE5NjI1RUYzIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpS  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  9BnasNkcSoMAAAAASUVORK5CYII=',
			rotateIndicatorPointer:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAADxCAYAAACEXZTsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ  bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp  bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6  eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0  NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo  dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw  dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv  IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS  ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD  cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl  SUQ9InhtcC5paWQ6OTQ0RjM2N0YyNDJFMTFFMjk1QkFBRDIwRTU4OTdBRDgiIHhtcE1NOkRvY3Vt  ZW50SUQ9InhtcC5kaWQ6OTQ0RjM2ODAyNDJFMTFFMjk1QkFBRDIwRTU4OTdBRDgiPiA8eG1wTU06  RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5NDRGMzY3RDI0MkUxMUUyOTVC  QUFEMjBFNTg5N0FEOCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5NDRGMzY3RTI0MkUxMUUy  OTVCQUFEMjBFNTg5N0FEOCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w  bWV0YT4gPD94cGFja2V0IGVuZD0iciI/Psfyr6YAAArZSURBVHja3J1bbyNJFcfL7cT25D6Jc2Em  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',

			arrowTop:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAdCAYAAADsMO9vAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ  bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp  bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6  eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0  NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo  dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw  dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv  IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS  ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD  cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl  SUQ9InhtcC5paWQ6QjNFMkVGMDEyQzI0MTFFMjg3QzRFMzA4RUMzNUU1M0UiIHhtcE1NOkRvY3Vt  ZW50SUQ9InhtcC5kaWQ6QjNFMkVGMDIyQzI0MTFFMjg3QzRFMzA4RUMzNUU1M0UiPiA8eG1wTU06  RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCM0UyRUVGRjJDMjQxMUUyODdD  NEUzMDhFQzM1RTUzRSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCM0UyRUYwMDJDMjQxMUUy  ODdDNEUzMDhFQzM1RTUzRSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w  bWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlvCjVAAAAD/SURBVHja1JjRDYQgDIbZgBEYwREcgREY  xREcoSMxwo3gCHc+0MQQPCgUKCT/G8r3GW0RpfoNfceHaLXYQPhvyFISJoJ/Shjp8NudKwGPucKc  JeFFS9hC+KeElQLvCOBx3Mrw0yVOBnjMORoeGOExIBEeKuYP664UGIpEl67dAj9dwjDA10o0bz1K  uyulmlCqV1PXpsK7Tv2jSsJ2hK+VsD1u3NpJ2dcaCc++JvXj2hnL9N5aLGBUZWAsGiAJvknCC4Gv  kfC4Tchd8Bn8G7iFNXMPVJdYzzoS+bf/Sr4NThB8TuK1lB4CD6NiiaPkh0XaSRpKQOlkiceASa6f  AAMADgHRdvHjSZ0AAAAASUVORK5CYII=',
			arrowBottom:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAdCAYAAADsMO9vAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ  bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp  bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6  eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0  NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo  dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw  dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv  IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS  ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD  cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl  SUQ9InhtcC5paWQ6Qzg4RUFEREQyQzI0MTFFMkJGRTVENTM1RUFERUEyNjMiIHhtcE1NOkRvY3Vt  ZW50SUQ9InhtcC5kaWQ6Qzg4RUFEREUyQzI0MTFFMkJGRTVENTM1RUFERUEyNjMiPiA8eG1wTU06  RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDODhFQUREQjJDMjQxMUUyQkZF  NUQ1MzVFQURFQTI2MyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDODhFQUREQzJDMjQxMUUy  QkZFNUQ1MzVFQURFQTI2MyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w  bWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pl7tKzkAAAEVSURBVHja1JjREYQgDES5CizhSqAES7gS  UoolUAIlUcKVQAmRD5hhPBXDkRgzk79V3uK4Roz5LZ86pJ6Mnpoyk28Jl9SYW4uJAl+4liMhVCIt  JrbwpWErtKnjjvBOE0fwmFltLTyCL/2tLxAom9c8Y4plY0NDuOuaGT5eZAoldVCJCQo81qmkwUQ3  fClHNDEPhJ+J8I4SpWcNA+CHrylpgm2tD/GRAjN8zEysLxUwwlupZHAX7umkE+9N+NhhY2KkxHXI  a7PPJVdNUOGHz1//mLgdvncnfYdepDwxv1XB96TJiPRiKRgAD+bmgifD944eXaOBlj8pqT87FhOq  4Vujx9DRQPpIRNtJH8kEK/wLEc2TaxVgABhX1Dief8wFAAAAAElFTkSuQmCC',
			arrowLeft:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAwCAYAAADtoXHnAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ  bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp  bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6  eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0  NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo  dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw  dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv  IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS  ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD  cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl  SUQ9InhtcC5paWQ6NTkwNjJDNTkyQzI0MTFFMkI0NzZFM0NEMTRCQUU4NzAiIHhtcE1NOkRvY3Vt  ZW50SUQ9InhtcC5kaWQ6NTkwNjJDNUEyQzI0MTFFMkI0NzZFM0NEMTRCQUU4NzAiPiA8eG1wTU06  RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1OTA2MkM1NzJDMjQxMUUyQjQ3  NkUzQ0QxNEJBRTg3MCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1OTA2MkM1ODJDMjQxMUUy  QjQ3NkUzQ0QxNEJBRTg3MCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w  bWV0YT4gPD94cGFja2V0IGVuZD0iciI/Ps3mm0sAAAEHSURBVHjaxNhhDcMgEIZhMgOVMAmVMAmV  gJRJQAKSJmESJoHRhSVkNIM7oC/J/WrSJ2nhA86EEMyk4WM9Yi3Fk0noDoZUr1jrbNRlYA7bWag9  APO6j0Zr4Lf8KHRrBMNncg1A1/TP2sB9NneicrDzn15VYAe6pBe1gM8iIBSoBCyDQYn2gQrUd4NC  dAwoQJ1g8d+qb2tArQC0Td+sgo4HK+g2BfyDSuLNiqPlAJWAThWgP6gkT716m8hQSbzpwQw9D8zQ  88A4LoYY5OdFJhK2ZLBwwGIQC3xsa8M2cey4gh3MsCModtjGrhXIBQq7KmKXYuz6jzU6sJYO1rzC  2nRYQ7Laen0LMACbElNZVX4epQAAAABJRU5ErkJggg==',
			arrowRight:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAwCAYAAADtoXHnAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ  bWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp  bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6  eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0  NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo  dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw  dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv  IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS  ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD  cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNl  SUQ9InhtcC5paWQ6N0M5MkUyMEIyQzI0MTFFMkJEREE4MzFDNDE2ODE0OTAiIHhtcE1NOkRvY3Vt  ZW50SUQ9InhtcC5kaWQ6N0M5MkUyMEMyQzI0MTFFMkJEREE4MzFDNDE2ODE0OTAiPiA8eG1wTU06  RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3QzkyRTIwOTJDMjQxMUUyQkRE  QTgzMUM0MTY4MTQ5MCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3QzkyRTIwQTJDMjQxMUUy  QkREQTgzMUM0MTY4MTQ5MCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1w  bWV0YT4gPD94cGFja2V0IGVuZD0iciI/PrqtTzoAAADVSURBVHja5NjhCYMwEAXgows4giN0BEdw  hBvFETpCRsoIjuAINsIJpfgjoZf3YhN4/4QPgj6TE7leQ0pMCQJaz5QtZbdUh/ULPPOqBS4X2GfU  ExtsC/eMqCcaM9EjMwPe7GXrCx494TUTjvZ8lYJoFhYGHP4CngrKw7WntQDW7uCZAbvWpdgLQ4ED  o6dLYNe6vAf8kBsv+PY2C7p9MvBy0FZBt8KH/9rgIPy4Aj+YNQ1GBvhzvcEvUPCrIvxSTLmFwwcd  lJEOZXhFHdPRBpKQ0etbgAEA5TXHBKbv1IkAAAAASUVORK5CYII=',
		};


		//获取位置
		function getTargetPosition(target){
			var target=target;
			var rect=target.getBoundingClientRect();
			var compStyle=getComputedStyle(target,'');
			var pFloat=parseFloat;
			var t=rect.top + pFloat(compStyle.paddingTop) + pFloat(compStyle.borderTopWidth);
			var l=rect.left + pFloat(compStyle.paddingLeft) + pFloat(compStyle.borderLeftWidth);
			var r=rect.right - pFloat(compStyle.paddingRight) - pFloat(compStyle.borderRightWidth);
			var b=rect.bottom - pFloat(compStyle.paddingBottom) - pFloat(compStyle.borderBottomWidth);
			var scrollXY={
				x:window.scrollX,
				y:window.scrollY,
			};
			return {
				t:t,
				l:l,
				r:r,
				b:b,
				top: t + scrollXY.y,
				left: l + scrollXY.x,
				right: r + scrollXY.x,
				bottom: b + scrollXY.y,
			};
		};

		//获取窗口大小.
		function getWindowSize(){
			//window.innerHeight;window.innerWidth;
			return {
				h:window.innerHeight,
				w:window.innerWidth,
			};
			/*
			var de=document.documentElement;
			return {
				h:document.compatMode=='BackCompat'? document.body.clientHeight : de.clientHeight,
				w:de.clientWidth,
			};
			*/
		};


		function getCurrentSize(target){//获取页面上显示的图片的宽 高.
			var iCS=getComputedStyle(target,'');
			return {
				h:parseFloat(iCS.height),
				w:parseFloat(iCS.width),
			};
		};


		//xpath 获取单个元素
		function getElementByXpath(xpath,contextNode,doc){
			doc=doc || document;
			contextNode=contextNode || doc;
			return doc.evaluate(xpath,contextNode,null,9,null).singleNodeValue;
		};


		//事件支持检测.
		function eventSupported( eventName,el ){
			el = el || document.createElement("div");
			eventName = "on" + eventName;
			var isSupported = (eventName in el);
			if (!isSupported && el.setAttribute) {
				el.setAttribute(eventName, "return;");
				isSupported = typeof el[eventName] === "function";
			};
			return isSupported;
		};


		//检测属性支持.
		function attrSupported(proName,el){
			el = el || document.createElement("div");
			var isSupported = (proName in el);
			return isSupported;
		};

		//css属性支持
		function cssProSupported(proName,elem){
			var prefix=['','-webkit-','-o-','-moz-','-ms-'];
			elem=elem || document.createElement('div');
			var style=elem.style;
			var camelPro;
			for(var i=0,ii=prefix.length;i<ii;i++){
				camelPro=(prefix[i]+proName).replace(/-([a-z])/g,function(a,b){
					return b.toUpperCase();
				});
				if(camelPro in style){
					return camelPro;
				};
			};
		};

		//css属性值支持
		function cssValueSupported(proName,value,elem){
			var prefix=['','-webkit-','-o-','-moz-','-ms-'];
			elem=elem || document.createElement('div');
			var style=elem.style;
			var prefixedValue;
			for(var i=0,ii=prefix.length;i<ii;i++){
				prefixedValue=prefix[i] + value;
				style[proName]=prefixedValue;
				if(style[proName]==prefixedValue){
					return prefixedValue;
				};
			};
		};

		//抛出错误到错误控制台
		function throwErrorInfo(err){
			if(console && console.error){
				console.error(err.message + '\n\n' + (err.stacktrace? err.stacktrace : '') + '\n\n' , err);
			};
		};


		//支持情况.
		var support={
			cssTransform:cssProSupported('transform'),
			cssCursorValue:{
				zoomIn:cssValueSupported('cursor','zoom-in'),
				zoomOut:cssValueSupported('cursor','zoom-out'),
			},
			requestFullscreen:(function(){
				var array=['webkitRequestFullScreen','mozRequestFullScreen','requestFullscreen'];
				var tempEle=document.body;
				var ret;
				for(var i=array.length-1;i>=0;i--){
					ret=array[i];
					if(ret in tempEle){
						return ret;
					};
				};
			})(),
		};


		//console.log('浏览器的一些对象支持情况:',support);

		//imgReady
		var imgReady=(function(){
			var iRInterval,
				iRReadyFn=[],
				isrcs=[]
			;

			var timeLimit=3 * 60 * 1000;//3分钟

			function checkReady(){
				var now=Date.now();
				for(var i=0,ii=iRReadyFn.length,iRReadyFn_i;i<ii;i++){
					iRReadyFn_i=iRReadyFn[i];
					//now - iRReadyFn_i.startTime >= timeLimit || 
					if(iRReadyFn_i()){
						iRReadyFn.splice(i,1);
						isrcs.splice(i,1);
						i--;
						ii--;
					};
				};
				//console.log('checkReady',iRReadyFn.length)
				if(iRReadyFn.length==0){
					clearInterval(iRInterval);
					iRInterval=null;
				};
			};



			var imgReady=function(img,opts){

				if(/NodeList|HTMLCollection/.test(Object.prototype.toString.call(img))  || Array.isArray(img)){
					arrayFn.forEach.call(img,function(img,index,array){
						if(img instanceof HTMLImageElement){
							imgReady(img,opts);
						};
					});
					return;
				};

				if(!(img instanceof HTMLImageElement)){
					var t_img=new Image();
					t_img.src=img;
					img=t_img;
					t_img=null;
				};

				var ready,load,error,loadEnd,abort,timeout,time;
				ready=opts.ready;
				load=opts.load;
				error=opts.error;
				loadEnd=opts.loadEnd;
				abort=opts.abort;
				timeout=opts.timeout;
				time=typeof opts.time=='number'? opts.time : 0;

				if(time){
					setTimeout(function(){
						if(!loadEndDone){
							aborted=true;
							removeListener();
							img.src='data:';
							if(timeout){
								timeout.call(img,{
									target:img,
									type:'timeout',
								});
							};
							loadEndDone=true;
							if(loadEnd){
								loadEnd.call(img,{
									target:img,
									type:'timeout',
								});
							};
							
						};
					},time);
				};

				var src=img.src;
				var loadEndDone;

				function go(type,e){
					switch(type){
						case 'load':{
							removeListener();
							go('ready');//如果直接触发load,那么先触发ready
							if(load){
								load.call(img,e);
							};
							loadEndDone=true;
							if(loadEnd){
								loadEnd.call(img,e);
							};
						}break;
						case 'ready':{
							if(!ready || readyHandler.done)return;
							readyHandler.done=true;
							ready.call(img,{
								target:img,
								type:'ready',
							});
						}break;
						case 'error':{
							removeListener();
							if(error){
								error.call(img,e);
							};
							loadEndDone=true;
							if(loadEnd){
								loadEnd.call(img,e);
							};
						}break;
					};
				};

				var aborted;
				var ret={
					img:img,
					abort:function(){
						if(!loadEndDone){
							aborted=true;
							removeListener();
							img.src='data:';
							if(abort){
								abort.call(img,{
									target:img,
									type:'abort',
								});
							};
							loadEndDone=true;
							if(loadEnd){
								loadEnd.call(img,{
									target:img,
									type:'abort',
								});
							};
						};
					},
				};

				function readyHandler(){//尽快的检测图片大小.
					if(loadEndDone || aborted)return true;
					if(img.naturalWidth==0 || img.naturalHeight==0)return;
					go('ready');
					return true;
				};


				function loadHandler(e){
					go('load',e);
				};

				function errorHandler(e){
					go('error',e);
				};

				function removeListener(){
					img.removeEventListener('load',loadHandler,true);
					img.removeEventListener('error',errorHandler,true);
				};

				//ready必须在load之前触发。

				if(img.complete){//图片已经加载完成.
					if(typeof img.width=='number' && img.width && img.height){//图片
						setTimeout(function(){
							if(aborted)return;
							go('load',{
								type:'load',
								target:img,
							});
						},0);
					}else{//这不是图片.opera会识别错误.
						setTimeout(function(){
							if(aborted)return;
							go('error',{
								type:'error',
								target:img,
							});
						},0);
					};
					return ret;
				};


				img.addEventListener('load',loadHandler,true);
				img.addEventListener('error',errorHandler,true);


				if(ready){
					var index=isrcs.indexOf(src);
					if(index==-1){
						isrcs.push(src);
						readyHandler.startTime=Date.now();
						iRReadyFn.push(readyHandler);
					}else{
						iRReadyFn[index].startTime=Date.now();
					};

					if(!iRInterval){
						iRInterval=setInterval(checkReady,66);
					};
				};

				return ret;
			};

			return imgReady;
		})();


		var addWheelEvent=(function(){
			var eventName;

			if('onwheel' in document){//w3c FF>=17 ie>=9
				eventName='wheel';
			}else if('onmousewheel' in document){//ie
				eventName='mousewheel';
			}else{// < FF17
				eventName='DOMMouseScroll';
			};

			return function(ele,callback,useCapture){
				ele.addEventListener(eventName,function(e){
					var type=e.type;
					var ne;
					if(type!='wheel'){
						ne={};
						for(var i in e){
							ne[i]=e[i];
						};

						ne.type='wheel';
						ne.deltaX=0;
						ne.deltaY=0;
						ne.deltaZ=0;
						ne.deltaMode=1;//line
						ne.preventDefault=e.preventDefault.bind(e);
						ne.stopPropagation=e.stopPropagation.bind(e);

						if((typeof e.axis=='number' && e.axis==2) || (typeof e.wheelDeltaY=='number' && e.wheelDeltaY!=0)){//Y轴的滚动
							ne.deltaY = e.wheelDeltaY? -e.wheelDeltaY/40 : e.detail;
						}else{
							ne.deltaX = e.wheelDeltaX? -e.wheelDeltaX/40 : e.detail;
						};
					};

					callback.call(this,ne? ne : e);
				},useCapture || false);
			};
		})();


		var addCusMouseEvent=(function(){
			var tele= document.documentElement || document.createElement('div');

			var support={
				mouseleave:'onmouseleave' in tele,
				mouseenter:'onmouseenter' in tele,
			}; 

			tele=null;

			var map={
				'mouseleave':'mouseout',
				'mouseenter':'mouseover',
			};

			return function(type, ele, fn){//事件类型,元素,监听函数
				type=type.toLowerCase();
				if(support[type]){
					ele.addEventListener(type,fn,false);//mouseleave,enter不冒泡
				}else{
					ele.addEventListener(map[type],function(e){
						var relatedTarget=e.relatedTarget;//mouseout,去往的元素;mouseover,来自的元素
						if(!this.contains(relatedTarget)){
							fn.call(this,e);
						};
					},true);
				};
			};

		})();



		//库
		function GalleryC(){
			this.init();
		};


		var gallery;
		var galleryMode;
		GalleryC.prototype={
			init:function(){
				this.addStyle();
				var container=document.createElement('span');

				this.gallery=container;
				container.className='pv-gallery-container';
				container.tabIndex=1;
				container.innerHTML=''+
					'<span class="pv-gallery-head">'+
						'<span title="弹出照片进行复杂操作" class="pv-gallery-operate">折腾</span>'+
						'<span title="一些命令菜单" class="pv-gallery-commands">命令</span>'+
						'<span title="分享" class="pv-gallery-share">分享</span>'+
						'<span title="Close | Cerrar" class="pv-gallery-close"></span>'+
					'</span>'+
					'<span class="pv-gallery-body">'+
						'<span class="pv-gallery-img-container">'+
							'<span class="pv-gallery-img-container-left-side">'+
								'<span class="pv-gallery-img-controler-pre"></span>'+
							'</span>'+
							'<span class="pv-gallery-img-content">'+
								'<span class="pv-gallery-img-parent"><!--图片放在这个里面--></span>'+
								'<span class="pv-gallery-vertical-align-helper"></span>'+
							'</span>'+
							'<span class="pv-gallery-img-container-right-side">'+
								'<span class="pv-gallery-scrollbar-v pv-gallery-img-scrollbar-v">'+
									'<span class="pv-gallery-scrollbar-v-track pv-gallery-img-scrollbar-v-track">'+
										'<span class="pv-gallery-scrollbar-v-handle pv-gallery-img-scrollbar-v-handle"></span>'+
									'</span>'+
								'</span>'+
								'<span class="pv-gallery-img-controler-next"></span>'+
							'</span>'+
							'<span class="pv-gallery-img-container-bottom-side">'+
								'<span class="pv-gallery-scrollbar-h pv-gallery-img-scrollbar-h">'+
									'<span class="pv-gallery-scrollbar-h-track pv-gallery-img-scrollbar-h-track">'+
										'<span class="pv-gallery-scrollbar-h-handle pv-gallery-img-scrollbar-h-handle"></span>'+
									'</span>'+
								'</span>'+
							'</span>'+
						'</span>'+
						'<span class="pv-gallery-sidebar-container" unselectable="on">'+
							'<span class="pv-gallery-sidebar-content" >'+
								'<span class="pv-gallery-scrollbar-h pv-gallery-thumb-scrollbar-h">'+
									'<span class="pv-gallery-scrollbar-h-track pv-gallery-thumb-scrollbar-h-track">'+
										'<span class="pv-gallery-scrollbar-h-handle pv-gallery-thumb-scrollbar-h-handle"></span>'+
									'</span>'+
								'</span>'+
								'<span class="pv-gallery-sidebar-controler-pre"></span>'+
								'<span class="pv-gallery-sidebar-thumbnails-container">'+
									'<span class="pv-gallery-sidebar-thumbnails">'+
										'<!--用innerHTML写入被span.pv-gallery-sidebar-thumb包裹的img元素,并设置宽度货高度-->'+
									'</span>'+
								'</span>'+
								'<span class="pv-gallery-scrollbar-v pv-gallery-thumb-scrollbar-v">'+
									'<span class="pv-gallery-scrollbar-v-track pv-gallery-thumb-scrollbar-v-track">'+
										'<span class="pv-gallery-scrollbar-v-handle pv-gallery-thumb-scrollbar-v-handle"></span>'+
									'</span>'+
								'</span>'+
								'<span class="pv-gallery-sidebar-controler-next"></span>'+
							'</span>'+
						'</span>'+
					'</span>';
				document.body.appendChild(container);

				var validPos=['top','right','bottom','left'];
				var sBarPosition=prefs.gallery.sidebarPosition.trim();
				if(validPos.indexOf(sBarPosition)==-1){
					sBarPosition='bottom';
				};

				this.sBarPosition=sBarPosition;
				this.selectedClassName='pv-gallery-sidebar-thumb_selected-' + sBarPosition;


				var sBarDirection;
				var isHorizontal=false;
				if(sBarPosition=='top' || sBarPosition=='bottom'){
					sBarDirection='h';//水平放置
					isHorizontal=true;
				}else{
					sBarDirection='v';//垂直放置
				};
				this.sBarDirection=sBarDirection;
				this.isHorizontal=isHorizontal;

				var classPrefix='pv-gallery-';
				var validClass=[
					'close',
					'body',
					'img-container',

					'img-scrollbar-h',
					'img-scrollbar-h-handle',
					'img-scrollbar-h-track',

					'img-scrollbar-v',
					'img-scrollbar-v-handle',
					'img-scrollbar-v-track',

					'thumb-scrollbar-h',
					'thumb-scrollbar-h-handle',
					'thumb-scrollbar-h-track',

					'thumb-scrollbar-v',
					'thumb-scrollbar-v-handle',
					'thumb-scrollbar-v-track',

					'img-content',
					'img-parent',

					'img-controler-pre',
					'img-controler-next',

					'sidebar-container',
					'sidebar-content',

					'sidebar-controler-pre',
					'sidebar-controler-next',

					'sidebar-thumbnails',
					'sidebar-thumbnails-container',
				];

				var eleMaps={};
				this.eleMaps=eleMaps;

				validClass.forEach(function(c){
					eleMaps[c]=container.querySelector('.'+ classPrefix + c);
				});

				var posClass=[//需要添加'top bottom left right'class的元素
					'img-container',
					'sidebar-container',
					'sidebar-thumbnails-container',
				];
				posClass.forEach(function(c){
					eleMaps[c].classList.add(classPrefix + c + '-' +sBarPosition);
				});

				var hvClass=[//需要添加'v h'class的元素
					'sidebar-container',
					'sidebar-content',
					'sidebar-controler-pre',
					'sidebar-controler-next',
					'sidebar-thumbnails',
				];
				hvClass.forEach(function(c){
					eleMaps[c].classList.add(classPrefix + c + '-' + sBarDirection);
				});



				//图片区域水平方向的滚动条
				var imgScrollbarH=new this.Scrollbar({
						bar:eleMaps['img-scrollbar-h'],
						handle:eleMaps['img-scrollbar-h-handle'],
						track:eleMaps['img-scrollbar-h-track'],
					},
					eleMaps['img-parent'],
					eleMaps['img-content'],
					true);
					this.imgScrollbarH=imgScrollbarH;

				//图片区域垂直方向的滚动条
				var imgScrollbarV=new this.Scrollbar({
						bar:eleMaps['img-scrollbar-v'],
						handle:eleMaps['img-scrollbar-v-handle'],
						track:eleMaps['img-scrollbar-v-track'],
					},
					eleMaps['img-parent'],
					eleMaps['img-content'],
					false);
				this.imgScrollbarV=imgScrollbarV;

				//缩略图区域的滚动条
				var thumbScrollbar;
				if(isHorizontal){
					thumbScrollbar=new this.Scrollbar({
						bar:eleMaps['thumb-scrollbar-h'],
						handle:eleMaps['thumb-scrollbar-h-handle'],
						track:eleMaps['thumb-scrollbar-h-track'],
					},
					eleMaps['sidebar-thumbnails'],
					eleMaps['sidebar-thumbnails-container'],
					true); 
				}else{
					thumbScrollbar=new this.Scrollbar({
						bar:eleMaps['thumb-scrollbar-v'],
						handle:eleMaps['thumb-scrollbar-v-handle'],
						track:eleMaps['thumb-scrollbar-v-track'],
					},
					eleMaps['sidebar-thumbnails'],
					eleMaps['sidebar-thumbnails-container'],
					false); 
				};
				this.thumbScrollbar=thumbScrollbar;



				var self=this;

				eleMaps['sidebar-thumbnails-container'].addEventListener('scroll',function(e){//发生scroll事件时加载缩略图
					self.loadThumb();
				},false);

				addWheelEvent(eleMaps['body'],function(e){//wheel事件
					var target=e.target;
					e.preventDefault();
					if(eleMaps['sidebar-container'].contains(target)){//缩略图区滚动滚轮翻图片
						var distance=self.sideLengthO;
						if(e.deltaY<0 || e.deltaX<0 || e.deltaZ<0){//向上滚
							distance=-distance;
						};
						thumbScrollbar.scrollBy(distance)
					}else{//图片区域滚动
						var distance=100;
						if(e.deltaY!=0){//y轴
							if(e.deltaY < 0){
								distance=-distance;
							};
							imgScrollbarV.scrollBy(distance);
						}else if(e.deltaX!=0){//x轴
							if(e.deltaX < 0){
								distance=-distance;
							};
							imgScrollbarH.scrollBy(distance);
						};
					};

					self.forceRepaint();
				},true);



				var validKeyCode=[38,39,40,37]//上右下左
				var keyUp=true;
				var keyIntervalTimer;
				container.addEventListener('keydown',function(e){//上下左右切换图片
					e.stopPropagation();
					var keyCode=e.keyCode;
					var index=validKeyCode.indexOf(keyCode);
					if(index==-1)return;
					e.preventDefault();

					if(!keyUp)return;//已按下。
					keyUp=false;

					switch(index){
						case 0:;
						case 3:{
							self.selectPrevious();
							keyIntervalTimer=setInterval(function(e){
								self.selectPrevious();
							},800);
						}break;
						case 1:;
						case 2:{
							self.selectNext();
							keyIntervalTimer=setInterval(function(e){
								self.selectNext();
							},800);
						}break;
					};

					function keyUpHandler(e){
						if(e.keyCode!=validKeyCode[index])return;
						this.removeEventListener('keyup',keyUpHandler,false);
						clearInterval(keyIntervalTimer);
						keyUp=true;
					};
					this.addEventListener('keyup',keyUpHandler,false);

				},false);


				var imgDraged;
				eleMaps['img-parent'].addEventListener('mousedown',function(e){//如果图片尺寸大于屏幕的时候按住图片进行拖移
					var target=e.target;
					if(e.button!=0 || target.nodeName!='IMG')return;
					var bigger=target.classList.contains('pv-gallery-img_zoom-out');//如果是大于屏幕

					var oClient={
						x:e.clientX,
						y:e.clientY,
					};

					var oScroll={
						left:self.imgScrollbarH.getScrolled(),
						top:self.imgScrollbarV.getScrolled(),
					};

					var moveHandler=function(e){
						imgDraged=true;
						if(bigger){
							target.style.cursor='pointer';
							self.imgScrollbarV.scroll(oScroll.top-(e.clientY-oClient.y));
							self.imgScrollbarH.scroll(oScroll.left-(e.clientX-oClient.x));
						};
					};

					var upHandler=function(){
						target.style.cursor='';

						//拖曳之后阻止随后可能产生click事件产生的大小切换。
						//确保在随后的click事件发生后执行
						setTimeout(function(){
							imgDraged=false;
						},0);

						document.removeEventListener('mousemove',moveHandler,true);
						document.removeEventListener('mouseup',upHandler,true);
					};

					document.addEventListener('mousemove',moveHandler,true);
					document.addEventListener('mouseup',upHandler,true);
				},true);

				eleMaps['img-parent'].addEventListener('click',function(e){//点击图片本身就行图片缩放处理

					var target=e.target;
					if(e.button!=0 || target.nodeName!='IMG')return;

					if(imgDraged){//在拖动后触发的click事件,取消掉。免得一拖动完就立即进行的缩放。。。
						imgDraged=false;
						return;
					}; 

					if(target.classList.contains('pv-gallery-img_zoom-in')){//放大
						self.fitContains=false;
						var zoomX = typeof e.offsetX=='undefined' ? e.layerX : e.offsetX;
						var zoomY = typeof e.offsetY=='undefined' ? e.layerY : e.offsetY;
						var scaleX=zoomX/target.clientWidth;
						var scaleY=zoomY/target.clientHeight;
						self.fitToScreen({
							x:scaleX,
							y:scaleY,
						});
					}else if(target.classList.contains('pv-gallery-img_zoom-out')){
						self.fitContains=true;
						self.fitToScreen();
					};
				},true);

				var mouseIntervalTimer;
				container.addEventListener('mousedown',function(e){//鼠标按在导航上,切换图片
					if(e.button!=0)return;//左键
					var target=e.target;
					if(target.nodeName=='IMG')e.preventDefault();

					var matched=true;
					switch(target){
						case eleMaps['img-controler-pre']:;
						case eleMaps['sidebar-controler-pre']:{//上一个
							self.selectPrevious();
							clearInterval(mouseIntervalTimer);
							mouseIntervalTimer=setInterval(function(e){
								self.selectPrevious();
							},800);
						}break;
						case eleMaps['img-controler-next']:;
						case eleMaps['sidebar-controler-next']:{//下一个
							self.selectNext();
							clearInterval(mouseIntervalTimer);
							mouseIntervalTimer=setInterval(function(e){
								self.selectNext();
							},800);
						}break;
						default:{
							matched=false;
						}break;
					};

					function mouseUpHandler(e){//opera,按下左键的时候,按右键然后松开不会触发mouseup,再松开左键,还是不会触发mouseup
						document.removeEventListener('mouseup',mouseUpHandler,true);
						clearInterval(mouseIntervalTimer);
					};

					if(matched){
						e.preventDefault();
						document.addEventListener('mouseup',mouseUpHandler,true);
					};
				},false);

				eleMaps['sidebar-content'].addEventListener('click',function(e){//点击缩略图切换
					if(e.button!=0)return;//左键
					var target=e.target;
					if(!target.dataset['src'])return;
					self.select((target.nodeName=='SPAN'? target : target.parentNode));
				},false);

				eleMaps['close'].addEventListener('click',function(e){//关闭
					self.close();
				},false);

				this._resizeHandler=this.resizeHandler.bind(this);

				this.sideLength=isHorizontal ?  eleMaps['sidebar-thumbnails'].clientHeight : eleMaps['sidebar-thumbnails'].clientWidth;
				this.sideLengthO=this.sideLength + 3;//加上margin

				this.thumbSpanStyle=isHorizontal ? ';width:' + this.sideLength +'px;' : ';height:' + this.sideLength +'px;';

				container.style.display='none';
			},
			selectPrevious:function(){
				var pre;
				var _pre=this.selected.previousElementSibling;
				while(_pre){
					if(_pre.clientWidth!=0){
						pre=_pre;
						break;
					};
					_pre=_pre.previousElementSibling;
				};

				this.select(pre);

			},
			selectNext:function(){
				var next;
				var _next=this.selected.nextElementSibling;
				while(_next){
					if(_next.clientWidth!=0){
						next=_next;
						break;
					};
					_next=_next.nextElementSibling;
				};

				this.select(next);

			},
			close:function(){
				galleryMode=false;
				this.gallery.blur();
				this.gallery.style.display='none';
				var des=document.documentElement.style;
				des.overflowX=this.deOverflow.x;
				des.overflowY=this.deOverflow.y;
				window.removeEventListener('resize',this._resizeHandler,true);
			},
			selectedIntoView:function(){
				var thumBC=this.eleMaps['sidebar-thumbnails-container'];
				//需要滚动的距离。
				var needScrollDis=this.isHorizontal ? this.selected.offsetLeft : this.selected.offsetTop;
				//尽可能的居中显示
				var thumBCClient=this.isHorizontal ? thumBC.clientWidth : thumBC.clientHeight;
				var scrollCenter=Math.max((thumBCClient - this.sideLengthO)/2,0);

				needScrollDis=Math.max(needScrollDis-scrollCenter,0);
				this.thumbScrollbar.scroll(needScrollDis);
			},
			select:function(ele){
				if(!ele || this.selected==ele)return;
				if(this.selected){
					this.selected.classList.remove(this.selectedClassName);
					this.selected.classList.remove('pv-gallery-sidebar-thumb_selected');
				};
				ele.classList.add(this.selectedClassName);
				ele.classList.add('pv-gallery-sidebar-thumb_selected');

				this.selected=ele;

				var self=this;
				clearTimeout(this.loadImgTimer);
				this.loadImgTimer=setTimeout(function(){//快速跳转的时候不要尝试读取图片。
					self.loadImg(ele);
				},200);

				this.selectedIntoView();
				this.forceRepaint();
			},
			clear:function(){

				this.allLoading=[];//读取中的图片数组

				this.allImgs={//图片的总类,统计
					rule:{
						shown:true,
						number:0,
					},
					tpRule:{
						shown:true,
						number:0,
					},
					scale:{
						shown:true,
						number:0,
					},
					force:{
						shown:true,
						number:0,
					},
				};

				if(this.img){
					this.img.style.display='none';
				};

				this.img=null;
				this.selected==null;
				this.eleMaps['sidebar-thumbnails'].innerHTML='';
				this.imgScrollbarV.hide();
				this.imgScrollbarH.hide();
				this.thumbScrollbar.hide();
				window.removeEventListener('resize',this._resizeHandler,true);
			},
			load:function(img,data,from){
				this.clear();//还原对象的一些修改,以便复用。
				galleryMode=true;

				var gallery=this.gallery;
				var galleryStyle=gallery.style;

				if(galleryStyle.display=='none'){
					var des=document.documentElement.style;
					this.deOverflow={
						x:des.overflowX,
						y:des.overflowY,
					};
					des.overflow='hidden';
					galleryStyle.display='';
					gallery.focus();
				};


				var imgSrc=img.src;
				var dataSrcs=[];
				var data_i;
				var index;
				var data_i_src;
				for(var i=0,ii=data.length;i<ii;i++){//unique顺便算出img所在data中的index;
					data_i=data[i];
					data_i_src=data_i.src;
					if(dataSrcs.indexOf(data_i_src)!=-1){//已经存在
						data.splice(i,1);//移除
						i--;
						ii--;
						continue;
					};
					dataSrcs.push(data_i_src);

					if(imgSrc==data_i_src){
						index=i;
					};
				};

				if(typeof index =='undefined'){
					index=0;
					data.unshift(data.target);
				};

				//console.log(data);
				this.data=data;
				this.from=from;//如果来自frame,那么这个from应该保存了那个frame的窗口id,便于以后通信。

				var thumbnails=this.eleMaps['sidebar-thumbnails'];


				if(this.isHorizontal){
					thumbnails.style.width=this.sideLengthO * data.length + 'px';//如果是水平放置,需要设置宽度
				};



				var spanMark='';
				var data_i;
				 for(var i=0,ii=data.length;i<ii;i++){
					data_i=data[i];
					this.allImgs[data_i.type].number++;
					 spanMark += 
					 '<span class="pv-gallery-sidebar-thumb-container'+
						'" data-type="' + data_i.type + 
						'" data-src="' + data_i.src + 
						'" data-img-src="' + data_i.imgSrc +
						'" style="'+ this.thumbSpanStyle +'">'+
						'<span class="pv-gallery-vertical-align-helper"></span>'+
						'<span class="pv-gallery-sidebar-thumb-loading" title="正在读取中......"></span>'+
					'</span>';
				};
				//console.log(this.allImgs);

				thumbnails.innerHTML=spanMark;

				//初始化滚动条
				this.thumbScrollbar.reset();

				this.imgSpans=thumbnails.children;

				this.select(this.imgSpans[index]);
				this.loadThumb();

				//resize监听
				window.addEventListener('resize',this._resizeHandler,true);
			},
			forceRepaint:function(){//解决opera的fixed元素,当滚动条不再最高处的时候,不重绘fixed元素的问题。
				if(envir.opera){
					window.scrollBy(0,1);
					window.scrollBy(0,-1);
				};
			},
			resizeHandler:function(){//窗口变化时,调整一些东西。
				this.fitToScreen();
				this.thumbScrollbar.reset();
				this.selectedIntoView();
				this.loadThumb();
			},
			getImg:function(ele){
				var allLoading=this.allLoading;

				var src=ele.dataset['src']
				var index=allLoading.indexOf(src);
				if(index!=-1){
					allLoading.splice(index,1);
				};

				allLoading.push(src);


				if(this.imgReady && this.img && this.imgReady.img.src!=this.img.src){
					this.imgReady.abort();
					this.imgReady.loadingIndicator.style.removeProperty('display');
				};


				var loadingIndicator=ele.querySelector('.pv-gallery-sidebar-thumb-loading');
				loadingIndicator.style.display='block';

				var self=this;

				this.imgReady=imgReady(src,{
					ready:function(){
						if(allLoading.indexOf(src)!=allLoading.length-1)return;//如果不是最后一张

						loadingIndicator.style.removeProperty('display');
						self.loadImg(this);
					},
					loadEnd:function(){//在loadend后开始预读。
						if(allLoading.indexOf(src)!=allLoading.length-1)return;
						if(self.preloading){//结束上次的预读。
							self.preloading.finish();
						};
						//console.log(this,'预读开始');
						if(prefs.gallery.preload){
							self.preloading=new self.Preload(ele);
						};
					},
				});

				this.imgReady.loadingIndicator=loadingIndicator;
			},
			Preload:function(ele){
				this.ele=ele;
				this.init();
			},
			Scrollbar:function(scrollbar,content,container,isHorizontal){
				this.scrollbar=scrollbar;
				this.content=content;
				this.container=container;
				this.isHorizontal=isHorizontal
				this.init();
			},
			loadImg:function(img){
				if(img.nodeName!='IMG'){//先读取。
					this.getImg(img);
					return;
				};

				if(this.img){
					this.img.style.display='none';
				};

				this.img=img;
				img.className='pv-gallery-img';
				this.eleMaps['img-parent'].appendChild(img);
				this.fitContains=prefs.gallery.fitToScreen;//适应屏幕
				this.fitToScreen();
			},
			fitToScreen:function(scale){

				var container=this.eleMaps['img-content'];
				var containerSize={
					h:container.clientHeight,
					w:container.clientWidth,
				};

				var img=this.img;
				img.classList.remove('pv-gallery-img_zoom-in');
				img.classList.remove('pv-gallery-img_zoom-out');
				img.removeAttribute('height');
				img.removeAttribute('width');

				var content=this.eleMaps['img-parent'];
				var contentSize={
					w:content.offsetWidth,
					h:content.offsetHeight,
				};

				var larger=contentSize.w > containerSize.w || contentSize.h > containerSize.h;

				if(this.fitContains){//适应屏幕
					this.imgScrollbarV.hide();
					this.imgScrollbarH.hide();
					if(larger){
						img.classList.add('pv-gallery-img_zoom-in');
						if(contentSize.h/contentSize.w >=containerSize.h/containerSize.w){
							img.height=containerSize.h-20;//20是父元素padding之和
						}else{
							img.width=containerSize.w-20;
						};
					};
				}else{//不做尺寸调整,如果大于屏幕就出现滚动条
					this.imgScrollbarV.reset();
					this.imgScrollbarH.reset();
					if(larger){
						img.classList.add('pv-gallery-img_zoom-out');
						if(scale){//通过鼠标点击进行的切换。
							this.imgScrollbarH.scroll(container.scrollWidth * scale.x - containerSize.w/2);
							this.imgScrollbarV.scroll(container.scrollHeight * scale.y - containerSize.h/2);
						};
					};
				};
			},
			loadThumb:function(){//读取可视范围里面的缩略图

				var self=this;

				function ready(){
					var naturalSize={
						h:this.naturalHeight,
						w:this.naturalWidth,
					};
					var style=this.style;
					style.removeProperty('width');
					style.removeProperty('height');
					if(naturalSize.h > self.sideLength || naturalSize.w > self.sideLength){
						if(naturalSize.h>=naturalSize.w){
							style.height='100%';
						}else{
							style.width='100%';
						};
					};
					self.forceRepaint();
				};


				var thumBC=this.eleMaps['sidebar-thumbnails-container'];
				var scrolled=this.isHorizontal ? thumBC.scrollLeft : thumBC.scrollTop;
				var thumBCClient=this.isHorizontal ? thumBC.clientWidth : thumBC.clientHeight;

				var loadDis=scrolled - this.sideLengthO;
				var loadIndex=Math.floor(scrolled/this.sideLengthO);//至少从第几张开始读取。
				var loadStopDis=scrolled + thumBCClient;

				var imgSpans=this.imgSpans;
				var span_i;
				var pro=this.isHorizontal ? 'offsetLeft' : 'offsetTop';
				var proValue;
				var thumb;

				for(var i=loadIndex,ii=imgSpans.length;i<ii;i++){
					span_i=imgSpans[i];
					if(span_i.clientWidth==0)continue;//隐藏的

					proValue=span_i[pro];
					if(proValue <= loadDis)continue;//在滚动条上面了
					if(proValue >= loadStopDis)break;//在滚动条下面了

					if(span_i.dataset['loaded'])continue;//已经加载了缩略图

					thumb=new Image();
					thumb.src=span_i.dataset['imgSrc']; //+ '?' +Math.random();
					thumb.style.cssText='\
						height:100%;\
						width:100%;\
					';
					thumb.className='pv-gallery-sidebar-thumb';

					//GM环境下的dataset可读不可写。。
					thumb.setAttribute('data-src',span_i.dataset['src']);
					span_i.setAttribute('data-loaded','true');

					span_i.appendChild(thumb);
					imgReady(thumb,{
						ready:ready,
					});
				};

			},
			addStyle:function(){
				var style=document.createElement('style');
				style.type='text/css';
				style.textContent='\
					.pv-gallery-container {\
						position: fixed;\
						top: 0;\
						left: 0;\
						width: 100%;\
						height: 100%;\
						padding: 0;\
						margin: 0;\
						border: none;\
						z-index:899999999;\
						background-color: transparent;\
					}\
					.pv-gallery-container span{\
						-moz-box-sizing: border-box;\
						box-sizing: border-box;\
					}\
					.pv-gallery-head {\
						position: absolute;\
						top: 0;\
						left: 0;\
						width: 100%;\
						height:26px;\
						z-index:1;\
						background-color:rgba(0,0,0,0.96);\
						border:none;\
						border-bottom:1px solid #333333;\
					}\
					.pv-gallery-operate,\
					.pv-gallery-commands,\
					.pv-gallery-share{\
						color:#ccc;\
						display:none;\
					}\
					.pv-gallery-close{\
						cursor:pointer;\
						position:absolute;\
						top:0;\
						right:0;\
						height:100%;\
						width:40px;\
						border:none;\
						border-left: 1px solid #333333;\
						opacity:0.6;\
						background:transparent no-repeat center;\
						background-image:url("'+prefs.icons.loadingCancle+'");\
					}\
					.pv-gallery-close:hover{\
						opacity:1;\
					}\
					.pv-gallery-body {\
						display: block;\
						height: 100%;\
						width: 100%;\
						margin: 0;\
						padding: 0;\
						border: none;\
						border-top: 26px solid transparent;\
						position: relative;\
						background-clip: padding-box;\
					}\
					.pv-gallery-img-container {\
						display: block;\
						padding: 0;\
						margin: 0;\
						border: none;\
						height: 100%;\
						width: 100%;\
						background-clip: padding-box;\
						background-color: rgba(20,20,20,0.96);\
						position:relative;\
					}\
					.pv-gallery-img-container-top {\
						border-top: '+ prefs.gallery.sidebarSize +'px solid transparent;\
					}\
					.pv-gallery-img-container-right {\
						border-right: '+ prefs.gallery.sidebarSize +'px solid transparent;\
					}\
					.pv-gallery-img-container-bottom {\
						border-bottom: '+ prefs.gallery.sidebarSize +'px solid transparent;\
					}\
					.pv-gallery-img-container-left {\
						border-left: '+ prefs.gallery.sidebarSize +'px solid transparent;\
					}\
					.pv-gallery-img-container-left-side,\
					.pv-gallery-img-container-right-side{\
						position:absolute;\
						height:100%;\
						top:0;\
						z-index:2;\
					}\
					.pv-gallery-img-container-left-side{\
						left:0;\
					}\
					.pv-gallery-img-container-right-side{\
						right:0;\
					}\
					.pv-gallery-img-container-bottom-side{\
						position:absolute;\
						width:100%;\
						left:0;\
						bottom:0;\
						z-index:2;\
					}\
					.pv-gallery-img-controler-pre,\
					.pv-gallery-img-controler-next{\
						position:absolute;\
						top:50%;\
						height:120px;\
						width:50px;\
						margin-top:-60px;\
						cursor:pointer;\
						opacity:0.3;\
					}\
					.pv-gallery-img-controler-pre{\
						background:rgba(70,70,70,0.5) url("'+prefs.icons.arrowLeft+'") no-repeat center;\
						left:10px;\
					}\
					.pv-gallery-img-controler-next{\
						background:rgba(70,70,70,0.5) url("'+prefs.icons.arrowRight+'") no-repeat center;\
						right:10px;\
					}\
					.pv-gallery-img-controler-pre:hover,\
					.pv-gallery-img-controler-next:hover{\
						opacity:0.8;\
					}\
					/*滚动条样式--开始*/\
					.pv-gallery-scrollbar-h,\
					.pv-gallery-scrollbar-v{\
						display:none;\
						position:relative;\
						z-index:1;\
						opacity:0.6;\
					}\
					.pv-gallery-thumb-scrollbar-v,\
					.pv-gallery-thumb-scrollbar-h{\
						position:absolute;\
					}\
					.pv-gallery-scrollbar-h:hover,\
					.pv-gallery-scrollbar-v:hover{\
						opacity:0.95;\
					}\
					.pv-gallery-scrollbar-h{\
						width:100%;\
						overflow:hidden;\
						padding:0;\
						padding-left:2px;\
						padding-right:16px;\
					}\
					.pv-gallery-scrollbar-v{\
						height:100%;\
						padding:0;\
						padding-top:2px;\
						padding-bottom:16px;\
					}\
					.pv-gallery-thumb-scrollbar-h{\
						bottom:0;\
						left:0;\
						padding:0 2px;\
					}\
					.pv-gallery-thumb-scrollbar-v{\
						right:0;\
						top:0;\
						padding:2px 0;\
					}\
					.pv-gallery-scrollbar-h-track,\
					.pv-gallery-scrollbar-v-track{\
						position:relative;\
						display:block;\
						background-color:rgba(100,100,100,1);\
					}\
					.pv-gallery-scrollbar-h-track{\
						margin:5px 0;\
						height:10px;\
						width:100%;\
					}\
					.pv-gallery-scrollbar-h:hover .pv-gallery-scrollbar-h-track{\
						height:16px;\
					}\
					.pv-gallery-scrollbar-v-track{\
						height:100%;\
						width:10px;\
						margin:0 5px;\
					}\
					.pv-gallery-scrollbar-v:hover .pv-gallery-scrollbar-v-track{\
						width:16px;\
					}\
					.pv-gallery-scrollbar-h-handle,\
					.pv-gallery-scrollbar-v-handle{\
						position:absolute;\
						background-color:black;\
					}\
					.pv-gallery-scrollbar-h-handle:hover,\
					.pv-gallery-scrollbar-v-handle:hover{\
						background-color:#502121;\
					}\
					.pv-gallery-scrollbar-h-handle:active,\
					.pv-gallery-scrollbar-v-handle:active{\
						background-color:#391A1A;\
					}\
					.pv-gallery-scrollbar-h-handle{\
						height:100%;\
						width:20px;\
						left:10px;\
						top:0;\
					}\
					.pv-gallery-scrollbar-v-handle{\
						height:20px;\
						width:100%;\
						top:10px;\
						left:0;\
					}\
					/*滚动条样式--结束*/\
					.pv-gallery-img-content{\
						display:block;\
						width:100%;\
						height:100%;\
						overflow:hidden;\
						text-align:center;\
						padding:0;\
						border:none;\
						margin:0;\
						line-height:0;\
						font-size:0;\
						white-space:nowrap;\
					}\
					.pv-gallery-img-parent{\
						display:inline-block;\
						vertical-align:middle;\
						padding:10px;\
						border:none;\
						margin:0;\
						line-height:0;\
						font-size:0;\
					}\
					.pv-gallery-img{\
						box-shadow:0 0 10px rgba(0,0,0,0.6);\
						display:inline-block;\
						vertical-align:middle;\
						padding:0;\
						border:none;\
						margin:0;\
					}\
					.pv-gallery-img_zoom-out{\
						cursor:'+support.cssCursorValue.zoomOut+';\
					}\
					.pv-gallery-img_zoom-in{\
						cursor:'+support.cssCursorValue.zoomIn+';\
					}\
					.pv-gallery-sidebar-container {\
						position: absolute;\
						background-color:rgba(0,0,0,0.96);\
						padding:10px;\
						border:none;\
						margin:none;\
						-o-user-select: none;\
						-webkit-user-select: none;\
						-moz-user-select: -moz-none;\
						user-select: none;\
					}\
					.pv-gallery-sidebar-container-h {\
						height: '+ prefs.gallery.sidebarSize +'px;\
						width: 100%;\
					}\
					.pv-gallery-sidebar-container-v {\
						width: '+ prefs.gallery.sidebarSize +'px;\
						height: 100%;\
					}\
					.pv-gallery-sidebar-container-top {\
						top: 0;\
						left: 0;\
						border-bottom:1px solid #333333;\
					}\
					.pv-gallery-sidebar-container-right {\
						top: 0;\
						right: 0;\
						border-left:1px solid #333333;\
					}\
					.pv-gallery-sidebar-container-bottom {\
						bottom: 0;\
						left: 0;\
						border-top:1px solid #333333;\
					}\
					.pv-gallery-sidebar-container-left {\
						top: 0;\
						left: 0;\
						border-right:1px solid #333333;\
					}\
					.pv-gallery-sidebar-content {\
						display: block;\
						margin: 0;\
						padding: 0;\
						border: 0;\
						background-clip: padding-box;\
						position: relative;\
					}\
					.pv-gallery-sidebar-content-h {\
						height: 100%;\
						width: 90%;\
						margin-left: auto;\
						margin-right: auto;\
						border-left: 40px solid transparent;\
						border-right: 40px solid transparent;\
					}\
					.pv-gallery-sidebar-content-v {\
						height: 90%;\
						width: 100%;\
						top: 5%;\
						border-top: 40px solid transparent;\
						border-bottom: 40px solid transparent;\
					}\
					.pv-gallery-sidebar-controler-pre,\
					.pv-gallery-sidebar-controler-next{\
						cursor:pointer;\
						position:absolute;\
						background:rgba(255,255,255,0.1) no-repeat center;\
					}\
					.pv-gallery-sidebar-controler-pre-h,\
					.pv-gallery-sidebar-controler-next-h{\
						top:2px;\
						width:36px;\
						height:100%;\
					}\
					.pv-gallery-sidebar-controler-pre-v,\
					.pv-gallery-sidebar-controler-next-v{\
						left:2px;\
						width:100%;\
						height:36px;\
					}\
					.pv-gallery-sidebar-controler-pre-h {\
						left: -40px;\
						background-image: url("'+prefs.icons.arrowLeft+'");\
					}\
					.pv-gallery-sidebar-controler-next-h {\
						right: -40px;\
						background-image: url("'+prefs.icons.arrowRight+'");\
					}\
					.pv-gallery-sidebar-controler-pre-h:hover{\
						box-shadow:inset 22px 0 0 rgba(255,255,255,0.2) ,inset -14px 0 0 rgba(0,0,0,0.2);\
					}\
					.pv-gallery-sidebar-controler-next-h:hover{\
						box-shadow:inset -22px 0 0 rgba(255,255,255,0.2),inset 14px 0 0 rgba(0,0,0,0.2);\
					}\
					.pv-gallery-sidebar-controler-pre-v {\
						top: -40px;\
						background-image: url("'+prefs.icons.arrowTop+'");\
					}\
					.pv-gallery-sidebar-controler-next-v {\
						bottom: -40px;\
						background-image: url("'+prefs.icons.arrowBottom+'");\
					}\
					.pv-gallery-sidebar-controler-pre-v:hover{\
						box-shadow:inset 0 22px 0 rgba(255,255,255,0.2) ,inset 0 -14px 0 rgba(0,0,0,0.2);\
					}\
					.pv-gallery-sidebar-controler-next-v:hover{\
						box-shadow:inset 0 -22px 0 rgba(255,255,255,0.2),inset 0 14px 0 rgba(0,0,0,0.2);\
					}\
					.pv-gallery-sidebar-thumbnails-container {\
						display: block;\
						overflow: hidden;\
						height: 100%;\
						width: 100%;\
						margin:0;\
						border:none;\
						padding:0;\
					}\
					.pv-gallery-sidebar-thumbnails-container-top {\
						padding-bottom:5px;\
					}\
					.pv-gallery-sidebar-thumbnails-container-right {\
						padding-left:5px;\
					}\
					.pv-gallery-sidebar-thumbnails-container-bottom {\
						padding-top:5px;\
					}\
					.pv-gallery-sidebar-thumbnails-container-left {\
						padding-right:5px;\
					}\
					.pv-gallery-sidebar-thumbnails {\
						position:relative;\
						display: block;\
						padding: 0;\
						margin: 0;\
						border: none;\
						line-height:0;/*竖列时消除inline-block元素的行高*/\
					}\
					.pv-gallery-sidebar-thumbnails-h {\
						height: 100%;\
					}\
					.pv-gallery-sidebar-thumbnails-v {\
						width: 100%;\
					}\
					.pv-gallery-sidebar-thumb-container {\
						display:inline-block;\
						text-align: center;\
						border:2px solid rgb(52,52,52);\
						cursor:pointer;\
						position:relative;\
						padding:2px;\
						font-size:0;\
						line-height:0;\
						/*强制图片后面作为vertical-align参考的字符不换行,以防vertical-align:middle达不到预期效果*/\
						white-space:nowrap;\
					}\
					.pv-gallery-sidebar-container-h  .pv-gallery-sidebar-thumb-container {\
						margin:0 3px 0 0;\
						height:100%;\
					}\
					.pv-gallery-sidebar-container-v .pv-gallery-sidebar-thumb-container {\
						margin:0 0 3px 0;\
						width:100%;\
					}\
					.pv-gallery-sidebar-thumb-container:hover {\
						border:2px solid rgb(57,149,211);\
					}\
					.pv-gallery-sidebar-thumb_selected {\
						border:2px solid rgb(229,59,62);\
					}\
					.pv-gallery-sidebar-thumb_selected-top {\
						bottom:-5px;\
					}\
					.pv-gallery-sidebar-thumb_selected-right {\
						left:-5px;\
					}\
					.pv-gallery-sidebar-thumb_selected-bottom {\
						top:-5px;\
					}\
					.pv-gallery-sidebar-thumb_selected-left {\
						right:-5px;\
					}\
					.pv-gallery-sidebar-thumb-loading{\
						position:absolute;\
						top:0;\
						left:0;\
						width:100%;\
						height:100%;\
						display:none;\
						opacity:0.5;\
						background:black url("'+ prefs.icons.loading + '") no-repeat center ;\
					}\
					.pv-gallery-sidebar-thumb-loading:hover{\
						opacity:0.6;\
					}\
					.pv-gallery-sidebar-thumb {\
						display: inline-block;\
						vertical-align: middle;\
					}\
					.pv-gallery-vertical-align-helper{\
						display:inline-block;\
						vertical-align:middle;\
						width:0;\
						height:100%;\
						margin:0;\
						border:0;\
						padding:0;\
						visibility:hidden;\
						white-space:nowrap;\
					}\
				';
				document.querySelector('head').appendChild(style);
			},
		};

		GalleryC.prototype.Preload.prototype={//预读对象
			container:(function(){
				var div=document.createElement('div');
				div.className='pv-gallery-preloaded-img-container';
				div.style.display='none';
				document.body.appendChild(div);
				return div;
			})(),
			init:function(){
				this.max=prefs.gallery.max;
				this.nextNumber=0;
				this.nextEle=this.ele;
				this.preNumber=0;
				this.preEle=this.ele;
				this.direction='pre';
				this.preload();
			},
			preload:function(){
				var ele=this.getPreloadEle();
				if(!ele){
					//conole.log('预读正常结束');
					return;
				};

				//conole.log('正在预读:',ele);
				var self=this;
				this.imgReady=imgReady(ele.dataset['src'],{
					loadEnd:function(){
						if(self.finished){
							//conole.log('强制终止了');
							return;
						};
						ele.setAttribute('data-preloaded','true');
						self.container.appendChild(this);
						self.preload();
					},
					time:60 * 1000,//限时一分钟,否则强制结束并开始预读下一张。
				});
			},
			getPreloadEle:function(){
				if((this.max<=this.nextNumber && this.max<=this.preNumber) || (!this.nextEle && !this.preEle)){
					return;
				};
				var ele=this.direction=='pre'?  this.getNext() : this.getPrevious();
				if(ele && !ele.dataset['preloaded']){
					return ele;
				}else{
					return this.getPreloadEle();
				};
			},
			getNext:function(){
				this.nextNumber++;
				this.direction='next';
				if(!this.nextEle)return;

				var next;
				var _next=this.nextEle.nextElementSibling;
				while(_next){
					if(_next.clientWidth!=0){
						next=_next;
						break;
					};
					_next=_next.nextElementSibling;
				};
				this.nextEle=next;
				return next;
			},
			getPrevious:function(){
				this.preNumber++;
				this.direction='pre';
				if(!this.preEle)return;

				var pre;
				var _pre=this.preEle.previousElementSibling;
				while(_pre){
					if(_pre.clientWidth!=0){
						pre=_pre;
						break;
					};
					_pre=_pre.previousElementSibling;
				};
				this.preEle=pre;
				return pre;
			},
			finish:function(){
				this.finished=true;
				if(this.imgReady){
					this.imgReady.abort();
				};
			},
		};

		GalleryC.prototype.Scrollbar.prototype={//滚动条对象
			init:function(){
				var self=this;
				this.scrollbar.bar.addEventListener('mousedown',function(e){//点击滚动条区域,该干点什么!
					e.preventDefault();
					var target=e.target;
					var handle=self.scrollbar.handle;
					var track=self.scrollbar.track;
					switch(target){
						case handle:{//手柄;功能,拖动手柄来滚动窗口
							var pro=self.isHorizontal ? ['left','clientX'] : ['top','clientY'];
							var oHOffset=parseFloat(handle.style[pro[0]]);
							var oClient=e[pro[1]];

							var moveHandler=function(e){
								self.scroll(oHOffset + e[pro[1]] - oClient,true);
							};
							var upHandler=function(){
								document.removeEventListener('mousemove',moveHandler,true);
								document.removeEventListener('mouseup',upHandler,true);
							};
							document.addEventListener('mousemove',moveHandler,true);
							document.addEventListener('mouseup',upHandler,true);
						}break;
						case track:{//轨道;功能,按住不放来连续滚动一个页面的距离
							var pro=self.isHorizontal ? ['left','offsetX','layerX','clientWidth','offsetWidth'] : ['top' , 'offsetY' ,'layerY','clientHeight','offsetHeight'];
							var clickOffset=typeof e[pro[1]]=='undefined' ?  e[pro[2]] : e[pro[1]];
							var handleOffset=parseFloat(handle.style[pro[0]]);
							var handleSize=handle[pro[4]];
							var under= clickOffset > handleOffset ;//点击在滚动手柄的下方
							var containerSize=self.container[pro[3]];

							var scroll=function(){
								self.scrollBy(under?  (containerSize - 10) : (-containerSize + 10));//滚动一个页面距离少一点
							};
							scroll();

							var checkStop=function(){//当手柄到达点击位置时停止
								var handleOffset=parseFloat(handle.style[pro[0]]);
								if(clickOffset >= handleOffset && clickOffset <= (handleOffset + handleSize)){
									clearInterval(scrollInterval);
								};
							};

							var scrollInterval=setInterval(function(){
								scroll();
								checkStop();
							},300);

							checkStop();

							var upHandler=function(){
								clearInterval(scrollInterval);
								document.removeEventListener('mouseup',upHandler,true);
							};
							document.addEventListener('mouseup',upHandler,true);
						}break;
					};
					
				},true);
			},
			reset:function(){//判断滚动条该显示还是隐藏
				var contentPro,containerPro,trackPro,handlePro;

				if(this.isHorizontal){
					contentPro='offsetWidth';
					containerPro='clientWidth';
					handlePro='width';
					trackPro='clientWidth';
				}else{
					contentPro='offsetHeight';
					containerPro='clientHeight';
					handlePro='height';
					trackPro='clientHeight';
				};
				//如果内容大于容器的content区域
				var contentSize=this.content[contentPro];
				var containerSize=this.container[containerPro];
				if(contentSize > containerSize){
					this.show();
					var trackSize=this.scrollbar.track[trackPro];
					this.trackSize=trackSize;
					var handleSize=Math.floor((containerSize/contentSize) * trackSize);
					handleSize=Math.max(20,handleSize);//限制手柄的最小大小;
					this.handleSize=handleSize;
					this.one=(trackSize-handleSize) / (contentSize-containerSize);//一个像素对应的滚动条长度
					this.scrollbar.handle.style[handlePro]= handleSize + 'px';
					this.scroll(this.getScrolled());
				}else{
					this.hide();
				};
			},
			show:function(){
				this.scrollbar.bar.style.display='block';
				this.shown=true;
			},
			hide:function(){
				this.scrollbar.bar.style.display='none';
				this.shown=false;
			},
			scrollBy:function(distance,handleDistance){
				this.scroll(this.getScrolled() + (handleDistance?  distance / this.one :  distance));
			},
			scroll:function(distance,handleDistance){
				if(!this.shown)return;

				var pro;

				//滚动实际滚动条
				var _distance=distance;
				_distance=handleDistance?  distance / this.one :  distance;
				if(this.isHorizontal){
					pro='left';
					this.container.scrollLeft=_distance;
				}else{
					pro='top';
					this.container.scrollTop=_distance;
				};

				//滚动虚拟滚动条
				//根据比例转换为滚动条上应该滚动的距离。
				distance=handleDistance? distance : this.one * distance;
				//处理非法值
				distance=Math.max(0,distance);//如果值小于0那么取0
				distance=Math.min(distance,this.trackSize - this.handleSize);//大于极限值,取极限值
				this.scrollbar.handle.style[pro]=distance + 'px';
			},
			getScrolled:function(){
				if(this.isHorizontal){
					return this.container.scrollLeft;
				}else{
					return this.container.scrollTop;
				};
			},
		};


		//放大镜
		function MagnifierC(img,data){
			this.img=img;
			this.data=data;
			this.init();
		};

		MagnifierC.all=[];
		MagnifierC.styleZIndex=900000000;//全局z-index;
		MagnifierC.zoomRange=prefs.magnifier.wheelZoom.range.slice(0).sort();//升序
		MagnifierC.zoomRangeR=MagnifierC.zoomRange.slice(0).reverse();//降序

		MagnifierC.prototype={
			init:function(){
				this.addStyle();
				MagnifierC.all.push(this);
				var container=document.createElement('span');

				container.className='pv-magnifier-container';
				document.body.appendChild(container);

				this.magnifier=container;

				var imgNaturalSize={
					h:this.img.naturalHeight,
					w:this.img.naturalWidth,
				};

				this.imgNaturalSize=imgNaturalSize;

				var cs=container.style;
				cs.zIndex=MagnifierC.styleZIndex++;



				var maxDia=Math.ceil(Math.sqrt(Math.pow(1/2*imgNaturalSize.w,2) + Math.pow(1/2*imgNaturalSize.h,2)) * 2);
				this.maxDia=maxDia;

				var radius=prefs.magnifier.radius;
				radius=Math.min(maxDia/2,radius);
				this.radius=radius;
				var diameter=radius * 2;
				this.diameter=diameter;

				cs.width=diameter + 'px';
				cs.height=diameter + 'px';
				cs.borderRadius=radius+1 + 'px';
				cs.backgroundImage='url("'+ this.img.src +'")';
				cs.marginLeft= -radius +'px';
				cs.marginTop= -radius +'px';

				var imgPos=getTargetPosition(this.data.img);
				var imgRange={//图片所在范围
					x:[imgPos.left , imgPos.right],
					y:[imgPos.top , imgPos.bottom],
				};
				var imgW=imgRange.x[1] - imgRange.x[0];
				var imgH=imgRange.y[1] - imgRange.y[0];
				//如果图片太小的话,进行范围扩大。
				var minSize=60;
				if(imgW < minSize){
					imgRange.x[1] +=(minSize - imgW)/2;
					imgRange.x[0] -=(minSize - imgW)/2;
					imgW=minSize;
				};
				if(imgH < minSize){
					imgRange.y[1] +=(minSize - imgH)/2;
					imgRange.y[0] -=(minSize - imgH)/2;
					imgH=minSize;
				};
				this.imgSize={
					w:imgW,
					h:imgH,
				};
				this.imgRange=imgRange;
				//console.log(this.imgRange,this.imgSize);

				this.setMouseRange();


				this.move({
					pageX:imgRange.x[0],
					pageY:imgRange.y[0],
				});

				this._focus=this.focus.bind(this);
				this._blur=this.blur.bind(this);
				this._move=this.move.bind(this);
				this._remove=this.remove.bind(this);
				this._pause=this.pause.bind(this);
				this._zoom=this.zoom.bind(this);

				if(prefs.magnifier.wheelZoom.enabled){
					this.zoomLevel=1;
					this.defaultDia=diameter;
					addWheelEvent(container,this._zoom,false);
				};

				container.addEventListener('mouseover',this._focus,false);
				container.addEventListener('mouseout',this._blur,false);
				container.addEventListener('dblclick',this._remove,false);
				container.addEventListener('click',this._pause,false);


				document.addEventListener('mousemove',this._move,true);
			},
			addStyle:function(){
				if(MagnifierC.style)return;
				var style=document.createElement('style');
				style.type='text/css';
				MagnifierC.style=style;
				style.textContent='\
					.pv-magnifier-container{\
						position:absolute;\
						padding:0;\
						margin:0;\
						background-origin:border-box;\
						-moz-box-sizing:border-box;\
						box-sizing:border-box;\
						border:3px solid #CCCCCC;\
						background:rgba(40, 40, 40, 0.9) no-repeat;\
					}\
					.pv-magnifier-container_focus{\
						box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.7);\
					}\
					.pv-magnifier-container_pause{\
						border-color:red;\
					}\
				';
				document.querySelector('head').appendChild(style);
			},
			focus:function(){
				this.magnifier.classList.add('pv-magnifier-container_focus');
				this.magnifier.style.zIndex=MagnifierC.styleZIndex++;
			},
			blur:function(){
				this.magnifier.classList.remove('pv-magnifier-container_focus');
			},
			move:function(e){
				var mouseCoor={
					x:e.pageX,
					y:e.pageY,
				};
				var mouseRange=this.mouseRange;
				var imgRange=this.imgRange;

				if( !(mouseCoor.x >= mouseRange.x[0] && mouseCoor.x <= mouseRange.x[1] && mouseCoor.y >= mouseRange.y[0] && mouseCoor.y <= mouseRange.y[1]))return;//如果不再鼠标范围
				if(mouseCoor.x > imgRange.x[1]){
					mouseCoor.x = imgRange.x[1];
				}else if(mouseCoor.x < imgRange.x[0]){
					mouseCoor.x = imgRange.x[0];
				};
				if(mouseCoor.y > imgRange.y[1]){
					mouseCoor.y = imgRange.y[1];
				}else if(mouseCoor.y < imgRange.y[0]){
					mouseCoor.y = imgRange.y[0];
				};

				var ms=this.magnifier.style;
				ms.top= mouseCoor.y + 'px';
				ms.left= mouseCoor.x + 'px';

				var radius=this.radius;
				var imgSize=this.imgSize;
				var imgNaturalSize=this.imgNaturalSize;
				var px=-((mouseCoor.x-imgRange.x[0])/imgSize.w * imgNaturalSize.w) + radius +'px';
				var py=-((mouseCoor.y-imgRange.y[0])/imgSize.h * imgNaturalSize.h) + radius +'px';
				//console.log(px,py);
				ms.backgroundPosition=px + ' ' + py;
			},
			getNextZoomLevel:function(){
				var level;
				var self=this;
				if(this.zoomOut){//缩小
					MagnifierC.zoomRangeR._find(function(value){
						if(value < self.zoomLevel){
							level=value;
							return true;
						}
					})
				}else{
					MagnifierC.zoomRange._find(function(value){
						if(value > self.zoomLevel){
							level=value;
							return true;
						};
					});
				}
				return level;
			},
			zoom:function(e){
				if(e.deltaY===0)return;//非Y轴的滚动
				if(prefs.magnifier.wheelZoom.pauseFirst && !this.paused)return;
				e.preventDefault();
				if(e.deltaY < 0){//向上滚,放大;
					if(this.diameter >= this.maxDia)return;
					this.zoomOut=false;
				}else{
					this.zoomOut=true;
				};
				var level=this.getNextZoomLevel();
				if(!level)return;

				this.zoomLevel=level;
				var diameter=this.defaultDia * level;
				if(diameter > this.maxDia){
					diameter = this.maxDia;
				};

				var radius=diameter/2
				this.diameter=diameter;
				var bRadius=this.radius;
				this.radius=radius;
				this.setMouseRange();
				var ms=this.magnifier.style;
				ms.width=diameter+'px';
				ms.height=diameter+'px';
				ms.borderRadius=radius+1 + 'px';
				ms.marginLeft=-radius+'px';
				ms.marginTop=-radius+'px';
				var bBP=ms.backgroundPosition.split(' ');
				ms.backgroundPosition=parseFloat(bBP[0]) + (radius - bRadius) + 'px' + ' ' + (parseFloat(bBP[1]) + ( radius - bRadius) + 'px');

			},
			pause:function(){
				if(this.paused){
					this.magnifier.classList.remove('pv-magnifier-container_pause');
					document.addEventListener('mousemove',this._move,true);
				}else{
					this.magnifier.classList.add('pv-magnifier-container_pause');
					document.removeEventListener('mousemove',this._move,true);
				};
				this.paused=!this.paused;
			},
			setMouseRange:function(){
				var imgRange=this.imgRange;
				var radius=this.radius;
				this.mouseRange={//鼠标活动范围
					x:[imgRange.x[0]-radius , imgRange.x[1] + radius],
					y:[imgRange.y[0]-radius , imgRange.y[1] + radius],
				};
			},
			remove:function(){
				this.magnifier.parentNode.removeChild(this.magnifier);
				document.removeEventListener('mousemove',this._move,true);
				MagnifierC.all.splice(MagnifierC.all.indexOf(this),1);
			},
		};



		//图片窗口
		function ImgWindowC(img){
			this.img=img;
			this.src=img.src;
			this.init();
		};

		ImgWindowC.styleZIndex=1000000000;//全局z-index;
		ImgWindowC.all=[];//所有的窗口对象
		ImgWindowC.zoomRange=prefs.imgWindow.zoom.range.slice(0).sort();//升序
		ImgWindowC.zoomRangeR=ImgWindowC.zoomRange.slice(0).reverse();//降序


		ImgWindowC.prototype={
			init:function(){
				var self=this;
				//图片是否已经被打开
				if(ImgWindowC.all._find(function(iwin){
					if(iwin.src==self.src){
						iwin.firstOpen();
						return true;
					};
				}))return;

				this.addStyle();
				this.addRotateIndicator();

				var img=this.img;
				img.className='pv-pic-window-pic pv-pic-not-allowed';
				img.style.cssText='\
					top:0px;\
					left:0px;\
				';

				var imgNaturalSize={
					h:img.naturalHeight,
					w:img.naturalWidth,
				};
				this.imgNaturalSize=imgNaturalSize;

				var container=document.createElement('span');
				container.style.cssText='\
					cursor:pointer;\
					top:0px;\
					left:0px;\
				';
				container.className='pv-pic-window-container';
				container.innerHTML=''+
									'<span class="pv-pic-window-toolbar">'+
										'<span class="pv-pic-window-tb-hand pv-pic-window-tb-tool pv-pic-window-tb-tool-selected" title="Hand Tool"></span>'+
										'<span class="pv-pic-window-tb-tool-badge-container">'+
											'<span class="pv-pic-window-tb-rotate pv-pic-window-tb-tool" title="Rotate | Rotar"></span>'+
											'<span class="pv-pic-window-tb-tool-badge">0</span>'+
										'</span>'+
										'<span class="pv-pic-window-tb-tool-badge-container">'+
											'<span class="pv-pic-window-tb-zoom pv-pic-window-tb-tool" title="Zoom"></span>'+
											'<span class="pv-pic-window-tb-tool-badge">0</span>'+
										'</span>'+
										'<span class="pv-pic-window-tb-flip-horizontal pv-pic-window-tb-command" title="Giro HORIZONTAL Flip"></span>'+
										'<span class="pv-pic-window-tb-flip-vertical pv-pic-window-tb-command" title="Giro VERTICAL Flip"></span>'+
									'</span>'+
									'<span class="pv-pic-window-close"></span>'+
									'<span class="pv-pic-window-range"></span>';

				container.insertBefore(img,container.firstChild);

				this.imgWindow=container;

				var toolMap={
					'hand':container.querySelector('.pv-pic-window-tb-hand'),
					'rotate':container.querySelector('.pv-pic-window-tb-rotate'),
					'zoom':container.querySelector('.pv-pic-window-tb-zoom'),
					'fh':container.querySelector('.pv-pic-window-tb-flip-horizontal'),
					'fv':container.querySelector('.pv-pic-window-tb-flip-vertical'),
				};
				this.toolMap=toolMap;

				this.viewRange=container.querySelector('.pv-pic-window-range');




				//关闭
				var closeButton=container.querySelector('.pv-pic-window-close');
				closeButton.style.cssText='\
					top: -24px;\
					right: 0px;\
				';
				this.closeButton=closeButton;

				closeButton.addEventListener('click',function(e){
					self.remove();
				},false);

				var toolbar=container.querySelector('.pv-pic-window-toolbar');
				toolbar.style.cssText='\
					top: 0px;\
					left: -45px;\
				';
				this.toolbar=toolbar;

				this.selectedTool='hand';
				this.cursor='hand';
				this.selectedToolClass='pv-pic-window-tb-tool-selected';
				


				this.hKeyUp=true;
				this.rKeyUp=true;
				this.zKeyUp=true;

				this.spaceKeyUp=true;
				this.ctrlKeyUp=true;
				this.altKeyUp=true;
				this.shiftKeyUp=true;


				toolbar.addEventListener('mousedown',function(e){//鼠标按下选择工具
					self.toolbarEventHandler(e);
				},false);


				toolbar.addEventListener('dblclick',function(e){//鼠标双击工具
					self.toolbarEventHandler(e);
				},false);


				//阻止浏览器对图片的默认控制行为
				img.addEventListener('mousedown',function(e){
					e.preventDefault();
				},false);


				container.addEventListener('mousedown',function(e){//当按下的时,执行平移,缩放,旋转操作
					self.imgWindowEventHandler(e);
				},false);

				container.addEventListener('click',function(e){//阻止opera ctrl+点击保存图片
					self.imgWindowEventHandler(e);
				},false);

				if(prefs.imgWindow.zoom.mouseWheelZoom){//是否使用鼠标缩放
					addWheelEvent(container,function(e){//滚轮缩放
						self.imgWindowEventHandler(e);
					},false);
				};


				if(prefs.imgWindow.overlayer.shown){//是否显示覆盖层
					var overlayer=document.createElement('span');
					this.overlayer=overlayer;
					overlayer.className='pv-pic-window-overlayer';
					overlayer.style.backgroundColor=prefs.imgWindow.overlayer.color;
					document.body.appendChild(overlayer);
					if(prefs.imgWindow.overlayer.clickToClose[0]){
						overlayer.addEventListener(prefs.imgWindow.overlayer.clickToClose[1],function(e){
							self.remove();
						},false);
					}
				};

				document.body.appendChild(container);
				ImgWindowC.all.push(this);

				this._blur=this.blur.bind(this);
				this._focusedKeydown=this.focusedKeydown.bind(this);
				this._focusedKeyup=this.focusedKeyup.bind(this);

				this.rotatedRadians=0;//已经旋转的角度
				this.zoomLevel=1;//缩放级别
				this.setToolBadge('zoom',1);

				//选中默认工具
				this.selectTool(prefs.imgWindow.defaultTool);

				this.firstOpen();
			},
			firstOpen:function(){
				this.focus();
				var imgWindow=this.imgWindow;
				imgWindow.style.left=-5 + window.scrollX + 'px';
				imgWindow.style.top=-5 + window.scrollY + 'px';

				if(prefs.imgWindow.fitToScreen){
					this.fitToScreen();
					this.center(true,true);
				}else{
					//window的尺寸
					var wSize=getWindowSize();
					//空隙
					wSize.h -= 16;
					wSize.w -= 16;

					var imgWindowCS=getComputedStyle(imgWindow,'');

					var rectSize={
						h:parseFloat(imgWindowCS.height),
						w:parseFloat(imgWindowCS.width),
					};

					this.center(rectSize.w <= wSize.w , rectSize.h <= wSize.h);
				};

				this.keepScreenInside();
			},
			addStyle:function(){
				if(ImgWindowC.style)return;
				var style=document.createElement('style');
				ImgWindowC.style=style;
				style.textContent='\
					.pv-pic-window-container {\
						position: absolute;\
						background-color: rgba(40,40,40,0.9);\
						padding: 8px;\
						border: 5px solid #ccc;\
						line-height: 0;\
						text-align: left;\
					}\
					.pv-pic-window-container_focus {\
						box-shadow: 0 0 10px rgba(0,0,0,0.6);\
					}\
					.pv-pic-window-close, .pv-pic-window-toolbar {\
						-webkit-transition: opacity 0.2s ease-in-out;\
						transition: opacity 0.2s ease-in-out;\
					}\
					.pv-pic-window-toolbar {\
						position: absolute;\
						background-color: #535353;\
						padding: 0;\
						opacity: 0.9;\
						display: none;\
						cursor: default;\
					}\
					.pv-pic-window-toolbar:hover {\
						opacity: 1;\
					}\
					.pv-pic-window-toolbar_focus {\
						display: block;\
					}\
					.pv-pic-window-close {\
						cursor: pointer;\
						position: absolute;\
						right: 0px;\
						top: -24px;\
						background: url("'+prefs.icons.close+'") no-repeat center bottom;\
						height: 17px;\
						width: 46px;\
						opacity: 0.9;\
						border:none;\
						padding:0;\
						padding-top:2px;\
						background-color:#1771FF;\
						display: none;\
					}\
					.pv-pic-window-close:hover {\
						background-color:red;\
						opacity: 1;\
					}\
					.pv-pic-window-close_focus {\
						display: block;\
					}\
					.pv-pic-window-pic {\
						position: relative;\
						display:inline-block;\/*opera把图片设置display:block会出现渲染问题,会有残影,还会引发其他各种问题,吓尿*/\
						max-width:none;\
						min-width:none;\
						max-height:none;\
						min-height:none;\
						padding:0;\
						margin:0;\
					}\
					.pv-pic-window-pic_focus {\
						box-shadow: 0 0 6px black;\
					}\
					.pv-pic-window-tb-tool, .pv-pic-window-tb-command{\
						height: 24px;\
						width: 24px;\
						padding: 12px 8px 6px 6px;\
						margin:0;\
						display: block;\
						background: transparent no-repeat center;\
						cursor: pointer;\
						position: relative;\
						border: none;\
						border-left: 2px solid transparent;\
						border-bottom: 1px solid #868686;\
						background-origin: content-box;\
					}\
					.pv-pic-window-toolbar > span:last-child {\
						border-bottom: none;\
					}\
					.pv-pic-window-tb-tool:hover, .pv-pic-window-tb-command:hover{\
						border-left: 2px solid red;\
					}\
					.pv-pic-window-tb-tool-selected{\
						box-shadow: inset 0 21px 0 rgba(255,255,255,0.3) ,inset 0 -21px 0 rgba(0,0,0,0.3);\
						border-left:2px solid #1771FF;\
					}\
					.pv-pic-window-tb-hand {\
						background-image: url("'+prefs.icons.hand+'");\
					}\
					.pv-pic-window-tb-rotate {\
						background-image: url("'+prefs.icons.rotate+'");\
					}\
					.pv-pic-window-tb-zoom {\
						background-image: url("'+prefs.icons.zoom+'");\
					}\
					.pv-pic-window-tb-flip-horizontal {\
						background-image: url("'+prefs.icons.flipHorizontal+'");\
					}\
					.pv-pic-window-tb-flip-vertical {\
						background-image: url("'+prefs.icons.flipVertical+'");\
					}\
					.pv-pic-window-tb-tool-badge-container {\
						display: block;\
						position: relative;\
					}\
					.pv-pic-window-tb-tool-badge {\
						position: absolute;\
						top: -3px;\
						right: 1px;\
						font-size: 10px;\
						line-height: 1.5;\
						padding: 0 3px;\
						background-color: #F93;\
						border-radius: 50px;\
						opacity: 0.5;\
						color: black;\
					}\
					.pv-pic-window-overlayer{\
						height:100%;\
						width:100%;\
						position:fixed;\
						z-index:999999999;\
						top:0;\
						left:0;\
					}\
					.pv-pic-window-rotate-indicator{\
						cursor: progress;\
						position:absolute;\
						z-index:1100000000;\
						width:250px;\
						height:250px;\
						padding:10px;\
						margin-top:-135px;\
						margin-left:-135px;\
						background:transparent url("'+ prefs.icons.rotateIndicatorBG +'") no-repeat center;\
					}\
					.pv-pic-window-rotate-indicator-pointer{\
						display:block;\
						margin-left:auto;\
						margin-right:auto;\
						background:transparent url("'+ prefs.icons.rotateIndicatorPointer +'") no-repeat center;\
						width:60px;\
						height:240px;\
						position:relative;\
						top:5px;\
					}\
					.pv-pic-window-range{\
						position:absolute;\
						border:none;\
						width:100px;\
						height:100px;\
						box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.8);\
						display:none;\
						padding:0;\
						background-color:rgba(255, 0, 0, 0.150);\
					}\
				';
				document.querySelector('head').appendChild(style);
			},
			addRotateIndicator:function(){
				if(ImgWindowC.rotateIndicator)return;
				var rotateIndicator=document.createElement('span');
				rotateIndicator.className='pv-pic-window-rotate-indicator';
				ImgWindowC.rotateIndicator=rotateIndicator;
				rotateIndicator.style.cssText='\
					display:none;\
				';
				var rotateIndicatorPointer=document.createElement('span');
				rotateIndicatorPointer.className='pv-pic-window-rotate-indicator-pointer';
				ImgWindowC.rotateIndicatorPointer=rotateIndicatorPointer;
				rotateIndicator.appendChild(rotateIndicatorPointer);
				document.body.appendChild(rotateIndicator);
			},
			keepScreenInside:function(){//保持按钮在屏幕里面.
				var imgWindow=this.imgWindow;
				var imgWindowFullSize={
					h:imgWindow.offsetHeight,
					w:imgWindow.offsetWidth,
				};

				var windowSize=getWindowSize();

				function keepSI(obj,offsetDirection,defaultValue){
					var objRect=obj.getBoundingClientRect();
					var objStyle=obj.style;

					while(offsetDirection.length){
						var oD=offsetDirection[0];
						var oDV=defaultValue[0];
						offsetDirection.shift();
						defaultValue.shift();
						var oValue=parseFloat(objStyle[oD]);
						var newValue;
						switch(oD){
							case 'top':{
								newValue=oValue - objRect.top;
								if(objRect.top<0){
									newValue=Math.min(newValue,imgWindowFullSize.h);
								}else{
									newValue=Math.max(newValue,oDV);
								};
							}break;
							case 'right':{
								newValue=oValue + (objRect.right - windowSize.w);
								if(objRect.right > windowSize.w){//屏幕外
									newValue=Math.min(newValue,imgWindowFullSize.w);
								}else{
									newValue=Math.max(newValue,oDV);
								};
							}break;
							case 'bottom':{
								newValue=oValue + (objRect.bottom - windowSize.h);
								if(objRect.bottom > windowSize.h){//屏幕外
									newValue=Math.min(newValue,imgWindowFullSize.h);
								}else{
									newValue=Math.max(newValue,oDV);
								};
							}break;
							case 'left':{
								newValue=oValue - objRect.left;
								if(objRect.left<0){
									newValue=Math.min(newValue,imgWindowFullSize.w);
								}else{
									newValue=Math.max(newValue,oDV);
								}
							}break;
						};
						//console.log(newValue);
						objStyle[oD]=newValue + 'px';
						
					};
				};

				keepSI(this.closeButton,['top','right'],[-24,0]);
				keepSI(this.toolbar,['top','left'],[0,-45]);
			},
			fitToScreen:function(){
				var wSize=getWindowSize();
				//空隙
				wSize.h -= 16;
				wSize.w -= 16;

				var imgWindow=this.imgWindow;
				var imgWindowCS=getComputedStyle(imgWindow,'');
				var rectSize={
					h:parseFloat(imgWindowCS.height),
					w:parseFloat(imgWindowCS.width),
				};


				var size;
				if(rectSize.w - wSize.w>0 || rectSize.h - wSize.h>0){//超出屏幕,那么缩小。
					if(rectSize.w/rectSize.h > wSize.w/wSize.h){
						size={
							w:wSize.w,
							h:wSize.w / (rectSize.w/rectSize.h),
						};
					}else{
						size={
							h:wSize.h,
							w:wSize.h * (rectSize.w/rectSize.h),
						}
					};

					this.zoom(this.getRotatedImgCliSize(size).w/this.imgNaturalSize.w);
				};
			},
			center:function(horizontal,vertical){
				if(!horizontal && !vertical)return;
				var wSize=getWindowSize();
				var imgWindow=this.imgWindow;
				if(horizontal)imgWindow.style.left= (wSize.w - imgWindow.offsetWidth)/2 + window.scrollX +'px';
				if(vertical)imgWindow.style.top= (wSize.h - imgWindow.offsetHeight)/2 + window.scrollY +'px';
			},
			move:function(e){
				this.working=true;
				var mouseCoor={
					x:e.pageX,
					y:e.pageY,
				};
				var imgWindow=this.imgWindow;
				var imgWStyle=imgWindow.style;
				var oriOffset={
					left:parseFloat(imgWStyle.left),
					top:parseFloat(imgWStyle.top),
				};
				var self=this;
				var moveHandler=function(e){
					imgWStyle.left=oriOffset.left+ e.pageX-mouseCoor.x +'px';
					imgWStyle.top=oriOffset.top + e.pageY-mouseCoor.y +'px';
					self.keepScreenInside();
				};
				var mouseupHandler=function(){
					e.preventDefault();
					self.working=false;
					if(self.tempHand && self.spaceKeyUp){//如果是临时切换到抓手工具,平移完成后返回上个工具
						self.tempHand=false;
						self.changeCursor(self.selectedTool);
					};
					document.removeEventListener('mousemove',moveHandler,true);
					document.removeEventListener('mouseup',mouseupHandler,true);
				};
				document.addEventListener('mousemove',moveHandler,true);
				document.addEventListener('mouseup',mouseupHandler,true);
			},
			rotate:function(origin,topLeft){

				var img=this.img;
				var imgWindow=this.imgWindow;

				var iTransform=img.style[support.cssTransform].replace(/rotate\([^)]*\)/i,'');

				var imgWindowCS=getComputedStyle(imgWindow,'');
				var imgRectSize={
					h:parseFloat(imgWindowCS.height),
					w:parseFloat(imgWindowCS.width),
				};

				var rectOffset={
					top:parseFloat(imgWindow.style.top),
					left:parseFloat(imgWindow.style.left),
				};

				var imgSize={
					h:img.clientHeight,
					w:img.clientWidth,
				};

				var imgOffset={
					top:parseFloat(img.style.top),
					left:parseFloat(img.style.left),
				};


				var self=this;
				var PI=Math.PI;

				var rotate=function (radians){
					if(self.rotatedRadians==radians)return;
					img.style[support.cssTransform] = ' rotate('+ radians +'rad) ' + iTransform;
					ImgWindowC.rotateIndicatorPointer.style[support.cssTransform]='rotate('+ radians +'rad)';

					self.rotatedRadians=radians;
					self.setToolBadge('rotate',radians/(PI/180));

					var afterimgRectSize=self.getRotatedImgRectSize( radians, imgSize );
					imgWindow.style.width=afterimgRectSize.w +'px';
					imgWindow.style.height=afterimgRectSize.h + 'px';
					if(!topLeft)self.setImgWindowOffset(rectOffset,imgRectSize,afterimgRectSize);
					self.setImgOffset(imgOffset,imgRectSize,afterimgRectSize);
					self.keepScreenInside();
				};


				if(typeof origin=='number'){
					rotate(origin);
					return;
				};


				this.working=true;

				var lastRotatedRadians=this.rotatedRadians;
				this.shiftKeyUp=true;
				var shiftRotateStep=prefs.shiftRotateStep / (180/Math.PI);//转成弧度

				var moveHandler=function(e){
					var radians=lastRotatedRadians + Math.atan2( e.pageY - origin.pageY, e.pageX - origin.pageX );

					if(radians>2*PI){
						radians-=2*PI;
					}else if(radians<0){
						radians+=2*PI;
					};

					if(!self.shiftKeyUp){//如果按下了shift键,那么步进缩放
						radians -= radians % shiftRotateStep;
						radians += shiftRotateStep;
					};
					rotate(radians);
				};

				var mouseupHandler=function(){
					self.working=false;
					ImgWindowC.rotateIndicator.style.display='none';
					document.removeEventListener('mousemove',moveHandler,true);
					document.removeEventListener('mouseup',mouseupHandler,true);
				};

				document.addEventListener('mousemove',moveHandler,true);
				document.addEventListener('mouseup',mouseupHandler,true);
			},
			getNextZoomLevel:function(){
				var level;
				var self=this;
				if(this.zoomOut){//缩小
					ImgWindowC.zoomRangeR._find(function(value){
						if(value < self.zoomLevel){
							level=value;
							return true;
						}
					})
				}else{
					ImgWindowC.zoomRange._find(function(value){
						if(value > self.zoomLevel){
							level=value;
							return true;
						};
					});
				}
				return level;
			},
			getZoomRatio:function(mouseCoor){
				var ibcRect=this.img.getBoundingClientRect();
				var ratio={
					x:(mouseCoor.x-ibcRect.left)/ibcRect.width,
					y:(mouseCoor.y-ibcRect.top)/ibcRect.height,
				};
				if(ratio.x<0){
					ratio.x=0
				}else if(ratio.x>1){
					ratio.x=1
				};
				if(ratio.y<0){
					ratio.y=0
				}else if(ratio.y>1){
					ratio.y=1
				};
				return ratio;
			},
			zoom:function(e,ratio){//e可能是undefined,可能是事件对象,可能是直接的缩放级别数字
				var imgWindow=this.imgWindow;
				var imgWindowCS=getComputedStyle(imgWindow,'');
				var imgRectSize={
					h:parseFloat(imgWindowCS.height),
					w:parseFloat(imgWindowCS.width),
				};

				var rectOffset={
					top:parseFloat(imgWindow.style.top),
					left:parseFloat(imgWindow.style.left),
				};

				var img=this.img;
				var self=this;

				var zoom=function(level){//缩放到指定级别
					if(typeof level==='undefined' || level<0 || level==self.zoomLevel)return;

					var afterImgSize={
						h:self.imgNaturalSize.h * level,
						w:self.imgNaturalSize.w * level,
					};
					img.width=afterImgSize.w;
					img.height=afterImgSize.h;

					var afterimgRectSize=self.getRotatedImgRectSize( self.rotatedRadians, afterImgSize );
					imgWindow.style.width=afterimgRectSize.w +'px';
					imgWindow.style.height=afterimgRectSize.h + 'px';
					self.setImgWindowOffset(rectOffset,imgRectSize,afterimgRectSize,ratio);
					self.setImgOffset({top:0,left:0},afterImgSize,afterimgRectSize);//如果旋转了,调整偏移
					self.zoomLevel=level;
					self.setToolBadge('zoom',level);
					self.keepScreenInside();
				};

				if(typeof e!='object'){
					ratio=ratio? ratio : {
						x:1/2,
						y:1/2,
					};
					zoom(e);
					return;
				};

				this.working=true;

				ratio=this.getZoomRatio({
					x:e.clientX,
					y:e.clientY,
				});


				var moved;
				var lastPageX=e.pageX;
				var currentLevel=this.zoomLevel;
				var moveHandler=function(e){
					moved=true;
					var pageX=e.pageX;
					var level;
					if(pageX > lastPageX){//向右移,zoomin扩大
						self.changeCursor('zoom',false);
						level=0.05;
					}else{//向左移,zoomout缩小
						self.changeCursor('zoom',true);
						level=-0.05;
					};
					lastPageX=pageX;
					currentLevel += level;
					zoom(currentLevel);
				};

				var mouseupHandler=function(e){
					self.working=false;
					document.removeEventListener('mousemove',moveHandler,true);
					document.removeEventListener('mouseup',mouseupHandler,true);

					var level=self.getNextZoomLevel();

					if(self.zoomOut && self.altKeyUp){
						self.zoomOut=false;
					};

					if(!moved){//如果没有平移缩放。
						zoom(level);
					};

					self.changeCursor('zoom',self.zoomOut);

					if(self.tempZoom && self.ctrlKeyUp && self.altKeyUp){
						self.tempZoom=false;
						self.changeCursor(self.selectedTool);
					};

				};

				document.addEventListener('mousemove',moveHandler,true);
				document.addEventListener('mouseup',mouseupHandler,true);
			},
			convertToValidRadians:function(radians){
				//转成0-90的等价角度。
				var PI=Math.PI;
				if(radians > PI){
					radians = 2*PI - radians;
				};
				if(radians > 1/2*PI){
					radians = PI - radians;
				};
				return radians;
			},
			getRotatedImgRectSize:function( radians, imgSize ){//通过旋转后的角度和图片的大小,求虚拟矩形的大小
				imgSize= imgSize ? imgSize :{
					h:this.img.clientHeight,
					w:this.img.clentWidth,
				};

				if(typeof radians==='undefined'){
					radians = this.rotatedRadians;
				};

				radians=this.convertToValidRadians(radians);

				return {
					h:imgSize.h* Math.cos(radians) + imgSize.w * Math.sin(radians),
					w:imgSize.h* Math.sin(radians) + imgSize.w * Math.cos(radians),
				};
			},
			getRotatedImgCliSize:function(rectSize,radians){//通过虚拟矩形的大小和图片的旋转角度,求图片的大小

				if(typeof radians==='undefined'){
					radians = this.rotatedRadians;
				};

				radians=this.convertToValidRadians(radians);

				if(radians==0){
					//radians=Math.PI/180 * 1/100;
					return rectSize;
				};

				var h=(rectSize.h-rectSize.w * Math.tan(radians))/(Math.cos(radians)-Math.sin(radians)*Math.tan(radians));
				var w=(rectSize.h - h*Math.cos(radians))/Math.sin(radians);
				return {
					h:h,
					w:w,
				};

			},
			setImgOffset:function(oriOffset,bImgSize,aImgSize){
				var imgStyle=this.img.style;
				var top=Math.floor(oriOffset.top + (aImgSize.h-bImgSize.h)*1/2) + 'px';
				var left=Math.floor(oriOffset.left + (aImgSize.w-bImgSize.w)*1/2) + 'px';
				imgStyle.top= top;
				imgStyle.left= left;
			},
			setImgWindowOffset:function(oriOffset,bImgWindowSize,aImgWidnowSize,ratio){
				ratio= ratio? ratio : {x:1/2,y:1/2};
				var imgWindowStyle=this.imgWindow.style;
				var top=oriOffset.top - (aImgWidnowSize.h-bImgWindowSize.h)*ratio.y + 'px';
				var left=oriOffset.left - (aImgWidnowSize.w-bImgWindowSize.w)*ratio.x + 'px';
				imgWindowStyle.top= top;
				imgWindowStyle.left= left;
			},
			setToolBadge:function(tool,content){
				var scale=0;
				switch(tool){
					case 'zoom':{
						scale=2;
					}break;
					case 'rotate':{
						scale=1;
					}break;
					default:break;
				}
				content=typeof content=='string'? content : content.toFixed(scale);
				this.toolMap[tool].nextElementSibling.textContent=content;
			},
			changeCursor:function(tool,zoomOut){
				if(tool=='zoom'){
					tool+=zoomOut? '-out' : '-in';
				};
				if(this.cursor==tool)return;
				this.cursor=tool;
				var imgWStyle=this.imgWindow.style;
				switch(tool){
					case 'hand':{
						imgWStyle.cursor='pointer';
					}break;
					case 'zoom-in':{
						imgWStyle.cursor=support.cssCursorValue.zoomIn;
					}break;
					case 'zoom-out':{
						imgWStyle.cursor=support.cssCursorValue.zoomOut;
					}break;
					case 'rotate':{
						imgWStyle.cursor='progress';
					}break;
					case 'default':{
						imgWStyle.removeProperty('cursor');
					}break;
					default:break;
				};
			},
			blur:function(e){
				if(!this.focused)return;
				var imgWindow =this.imgWindow;
				//点击imgWinodw的外部的时候失去焦点
				if(e!==true && (imgWindow==e.target || (imgWindow.compareDocumentPosition(e.target) & 16)))return;
				imgWindow.classList.remove('pv-pic-window-container_focus');
				this.toolbar.classList.remove('pv-pic-window-toolbar_focus');
				this.closeButton.classList.remove('pv-pic-window-close_focus');
				this.img.classList.remove('pv-pic-window-pic_focus');
				document.removeEventListener('mousedown',this._blur,true);
				document.removeEventListener('keydown',this._focusedKeydown,true);
				document.removeEventListener('keyup',this._focusedKeyup,true);
				this.changeCursor('default');
				this.focused=false;
			},
			focus:function(){
				if(this.focused)return;
				this.imgWindow.classList.add('pv-pic-window-container_focus');
				this.toolbar.classList.add('pv-pic-window-toolbar_focus');
				this.closeButton.classList.add('pv-pic-window-close_focus');
				this.img.classList.add('pv-pic-window-pic_focus');
				this.imgWindow.style.zIndex= ImgWindowC.styleZIndex;
				this.zIndex=ImgWindowC.styleZIndex;
				ImgWindowC.styleZIndex ++;
				document.addEventListener('keydown',this._focusedKeydown,true);
				document.addEventListener('keyup',this._focusedKeyup,true);
				document.addEventListener('mousedown',this._blur,true);
				this.changeCursor(this.selectedTool);//还原鼠标样式。
				this.focused=true;
			},
			focusedKeyup:function(e){
				var keyCode=e.keyCode;
				var valid=[32,18,16,72,17,72,82,90,67];
				if(valid.indexOf(keyCode)==-1)return;

				e.preventDefault();

				switch(keyCode){
					case 32:{//空格键,临时切换到移动
						this.spaceKeyUp=true;
						if(!this.tempHand)return;//如果之前没有临时切换到抓手工具(当已经在工作的时候,按下空格不会临时切换到抓手工具)
						if(!this.working){//松开按键的时候,没有在继续平移了。
							this.tempHand=false;
							this.changeCursor(this.selectedTool);
						};
					}break;
					case 18:{//alt键盘切换缩小放大。
						this.altKeyUp=true;
						if(!this.zoomOut)return;
						if(!this.working){
							this.zoomOut=false;
							this.changeCursor('zoom');
							if(this.tempZoom && this.ctrlKeyUp){
								this.tempZoom=false;
								this.changeCursor(this.selectedTool);
							};
						};
					}break;
					case 16:{//shift键,旋转的时候按住shift键,步进缩放。
						this.shiftKeyUp=true;
					}break;
					case 17:{//ctrl键
						clearTimeout(this.ctrlkeyDownTimer);
						if(!this.justCKeyUp){//如果刚才没有松开c,规避划词软件的ctrl+c松开
							this.ctrlKeyUp=true;
							if(!this.tempZoom)return;//如果没有切换到了缩放
							if(!this.working && this.altKeyUp){
								this.tempZoom=false;
								this.changeCursor(this.selectedTool);
							};
						};
					}break;
					case 67:{//c键
						this.justCKeyUp=true;
						var self=this;
						clearTimeout(this.justCKeyUpTimer);
						this.justCKeyUpTimer=setTimeout(function(){
							self.justCKeyUp=false;
						},100)
					}break;
					case 72:{//h键
						this.hKeyUp=true;
					}break;
					case 82:{//r键
						this.rKeyUp=true;
					}break;
					case 90:{//z键
						this.zKeyUp=true;
					}break;
					default:break;
				};

				if([72,82,90].indexOf(keyCode)!=-1){
					if(!this.working && this.restoreBeforeTool){
						this.restoreBeforeTool=false;
						this.selectTool(this.beforeTool);
					};
				};
			},
			focusedKeydown:function(e){
				var keyCode=e.keyCode;
				var valid=[32,82,72,90,18,16,17,27,67];//有效的按键
				if(valid.indexOf(keyCode)==-1) return;

				e.preventDefault();

				if(this.working){//working的时候也可以接受按下shift键,以便旋转的时候可以任何时候按下
					if(keyCode==16){//shift键
						this.shiftKeyUp=false;
					};
					return;
				};

				switch(keyCode){
					case 82:{//r键,切换到旋转工具
						if(this.rKeyUp){
							this.rKeyUp=false;
							this.beforeTool=this.selectedTool;
							this.selectTool('rotate');
						};
					}break;
					case 72:{//h键,切换到抓手工具
						if(this.hKeyUp){
							this.hKeyUp=false;
							this.beforeTool=this.selectedTool;
							this.selectTool('hand');
						};
					}break;
					case 90:{//z键,切换到缩放工具
						if(this.zKeyUp){
							this.zKeyUp=false;
							this.beforeTool=this.selectedTool;
							this.selectTool('zoom');
						};
					}break;
					case 32:{//空格键阻止,临时切换到抓手功能
						if(this.spaceKeyUp){
							this.spaceKeyUp=false;
							if(this.selectedTool!='hand'){
								this.tempHand=true;
								this.changeCursor('hand');
							};
						};
					}break;
					case 18:{//alt键,在当前选择是缩放工具的时候,按下的时候切换到缩小功能
						if(this.altKeyUp){
							if((this.selectedTool!='zoom' && !this.tempZoom) || this.zoomOut)return;
							this.zoomOut=true;
							this.altKeyUp=false;
							this.changeCursor('zoom',true);
						};
					}break;
					case 17:{//ctrl键临时切换到缩放工具
						if(this.ctrlKeyUp){
							var self=this;
							this.ctrlkeyDownTimer=setTimeout(function(){//规避词典软件的ctrl+c,一瞬间切换到缩放的问题
								self.ctrlKeyUp=false;
								if(self.selectedTool!='zoom'){
									self.tempZoom=true;
									self.changeCursor('zoom');
								};
							},100);
						};
					}break;
					case 67:{//c键
						clearTimeout(this.ctrlkeyDownTimer);
					}break;
					case 27:{//ese关闭窗口
						this.remove();
					}break;
					default:break;
				};
			},
			toolbarEventHandler:function(e){
				e.stopPropagation();
				var target=e.target;
				var toolMap=this.toolMap;
				for(var i in toolMap){
					if(toolMap.hasOwnProperty(i) && toolMap[i]==target){
						switch(e.type){
							case 'mousedown':{
								this.selectTool(i);
							}break;
							case 'dblclick':{
								this.dblclickCommand(i);
							}break;
							default:break;
						};
						break;
					};
				};
			},
			imgWindowEventHandler:function(e){
				e.stopPropagation();
				switch(e.type){
					case 'click':{//阻止opera的图片保存
						if(e.ctrlKey && e.target.nodeName=='IMG'){
							e.preventDefault();
						};
					}break;
					case 'mousedown':{
						if(!this.focused){//如果没有focus,先focus
							this.focus();
							this.keepScreenInside();
						};

						var target=e.target;
						if(e.button!=0 || (target!=this.imgWindow && target!=this.img))return;
						var selectedTool=this.selectedTool;
						if(this.tempHand){
							this.move(e);
						}else if(this.tempZoom){
							this.zoom(e);
						}else if(selectedTool=='hand'){
							this.restoreBeforeTool=!this.hKeyUp;
							if(this.hKeyUp){
								this.move(e);
							}else{//鸟瞰视图
								this.aerialView(e);
							};
						}else if(selectedTool=='rotate'){
							var rIS=ImgWindowC.rotateIndicator.style;
							rIS.display='block';
							var origin={//旋转原点
								pageX:e.pageX - 30,//稍微偏左一点。
								pageY:e.pageY,
							};
							rIS.top=origin.pageY + 'px';
							rIS.left=origin.pageX + 'px';
							ImgWindowC.rotateIndicatorPointer.style[support.cssTransform]='rotate(' + this.rotatedRadians + 'rad)';
							this.restoreBeforeTool=!this.rKeyUp;
							this.rotate(origin);
						}else if(selectedTool=='zoom'){
							this.restoreBeforeTool=!this.zKeyUp;
							this.zoom(e);
						};
					}break;
					case 'wheel':{
						if(!this.focused)return;//如果没有focus
						if(e.deltaY===0)return;//非Y轴的滚动
						e.preventDefault();
						if(this.working)return;
						var oriZoomOut=this.zoomOut;
						this.zoomOut = !!(e.deltaY > 0);

						var ratio=this.getZoomRatio({
							x:e.clientX,
							y:e.clientY,
						});

						var level=this.getNextZoomLevel();

						this.zoom(level,ratio);
						this.zoomOut=oriZoomOut;
					}break;
					default:break;
				};
			},
			dblclickCommand:function(tool){
				var done;
				switch(tool){
					case 'hand':{//双击居中,并且适应屏幕
						this.zoom(1);
						this.fitToScreen();
						this.center(true,true);
						this.keepScreenInside();
					}break;
					case 'rotate':{//双击还原旋转
						if(this.rotatedRadians==0)return;
						done=true;
						this.rotate(0,true);
					}break;
					case 'zoom':{//双击还原缩放
						if(this.zoomLevel==1)return;
						done=true;
						this.zoom(1,{x:0,y:0});
					}break;
					default:break;
				};

				if((tool=='rotate' || tool=='zoom') && done){
					var imgWindow=this.imgWindow;
					var imgWinodowRect=imgWindow.getBoundingClientRect();
					var imgWindowStyle=imgWindow.style;
					if(imgWinodowRect.left<40){
						imgWindowStyle.left=40 + window.scrollX + 'px';
					};
					if(imgWinodowRect.top<-5){
						imgWindowStyle.top=-5 + window.scrollY +'px';
					};
					this.keepScreenInside();
				};

				},
			doFlipCommand:function(command){
				var map={
					fv:[/scaleY\([^)]*\)/i,' scaleY(-1) '],
					fh:[/scaleX\([^)]*\)/i,' scaleX(-1) '],
				};

				var iTransform=this.img.style[support.cssTransform];

				var toolClassList=this.toolMap[command].classList;

				if(map[command][0].test(iTransform)){
					iTransform=iTransform.replace(map[command][0],'');
					toolClassList.remove(this.selectedToolClass);
				}else{
					iTransform += map[command][1];
					toolClassList.add(this.selectedToolClass);
				};
				this.img.style[support.cssTransform]=iTransform;
				
			},
			selectTool:function(tool){
				var command=['fv','fh'];
				if(command.indexOf(tool)==-1){//工具选择
					if(this.selectedTool==tool)return;
					var selectedTool=this.selectedTool;
					this.selectedTool=tool;
					if(this.tempHand || this.tempZoom){//临时工具中。不变鼠标
						return;
					};
					this.toolMap[selectedTool].classList.remove(this.selectedToolClass);
					this.toolMap[tool].classList.add(this.selectedToolClass);
					this.changeCursor(tool);
				}else{//命令
					this.doFlipCommand(tool);
				};
			},
			remove:function(){
				if(this.removed)return;
				this.removed=true;
				this.blur(true);
				this.img.src='';//如果在加载中取消,图片也取消读取。
				if(this.overlayer){
					this.overlayer.parentNode.removeChild(this.overlayer);
				};
				this.imgWindow.parentNode.removeChild(this.imgWindow);

				var index=ImgWindowC.all.indexOf(this);
				ImgWindowC.all.splice(index,1);

				//focus next
				var topmost=0;
				ImgWindowC.all.forEach(function(iwin){
					if(iwin.zIndex > topmost){
						topmost=iwin;
					};
				});
				if(topmost){
					topmost.focus();
				};
			},
			aerialView:function(e){
				this.working=true;
				//记住现在的缩放比例
				var cLevel=this.zoomLevel;

				var wSize=getWindowSize();
				wSize.h -= 16;
				wSize.w -= 16;

				var imgWindow=this.imgWindow;
				var imgWindowCS=getComputedStyle(imgWindow,'');
				var rectSize={
					h:parseFloat(imgWindowCS.height),
					w:parseFloat(imgWindowCS.width),
				};
				var rectRatio=rectSize.h/rectSize.w;
				var windowRatio=wSize.h/wSize.w;

				var size;
				var rangeSize={};
				if(rectRatio > windowRatio){
					size={
						h:wSize.h,
						w:wSize.h / rectRatio,
					};
					rangeSize.h=Math.min(wSize.h *  (size.h / rectSize.h), size.h);
					rangeSize.w=Math.min(rangeSize.h / windowRatio , size.w);
				}else{
					size={
						w:wSize.w,
						h:wSize.w * rectRatio,
					};
					rangeSize.w=Math.min(wSize.w *  (size.w / rectSize.w), size.w);
					rangeSize.h=Math.min(rangeSize.w * windowRatio , size.h);
				};


				this.zoom(this.getRotatedImgCliSize(size).w/this.imgNaturalSize.w);

				this.center(true,true);

				this.keepScreenInside();

				var viewRange=this.viewRange;
				var vRS=viewRange.style;
				vRS.display='block';
				vRS.height=rangeSize.h + 'px';
				vRS.width=rangeSize.w + 'px';
				vRS.top=0 + 'px';
				vRS.left=0 + 'px';
				


				var viewRangeRect=viewRange.getBoundingClientRect();
				var viewRangeCenterCoor={
					x:viewRangeRect.left + window.scrollX + 1/2 * rangeSize.w,
					y:viewRangeRect.top + window.scrollY + 1/2 * rangeSize.h,
				};

				var self=this;

				var moveRange={
					x:[8,8+size.w-rangeSize.w],
					y:[8,8+size.h-rangeSize.h]
				};


				function setViewRangePosition(pageXY){
					var top=pageXY.y - viewRangeCenterCoor.y;
					var left=pageXY.x - viewRangeCenterCoor.x;
					if(top<=moveRange.y[0]){
						top=moveRange.y[0];
					}else if(top>=moveRange.y[1]){
						top=moveRange.y[1];
					};
					vRS.top= top + 'px';
					if(left<=moveRange.x[0]){
						left=moveRange.x[0];
					}else if(left>=moveRange.x[1]){
						left=moveRange.x[1];
					};
					vRS.left= left + 'px';
				};

				setViewRangePosition({
					x:e.pageX,
					y:e.pageY,
				});

				var moveHandler=function(e){
					setViewRangePosition({
						x:e.pageX,
						y:e.pageY,
					});
				};

				var mouseupHandler=function(){
					self.working=false;
					viewRange.style.display='none';
					self.zoom(cLevel);
					imgWindow.style.top= -13 -  rectSize.h * ((parseFloat(vRS.top) - moveRange.y[0])/size.h) + window.scrollY +'px'; 
					imgWindow.style.left= -13 - rectSize.w * ((parseFloat(vRS.left) - moveRange.x[0])/size.w) + window.scrollX +'px';
					
					//说明图片的高度没有屏幕高,居中
					//说明图片的宽度没有屏幕宽,居中
					self.center(rangeSize.w == size.w , rangeSize.h == size.h);

					self.keepScreenInside();

					document.removeEventListener('mousemove',moveHandler,true);
					document.removeEventListener('mouseup',mouseupHandler,true);
				};
				document.addEventListener('mousemove',moveHandler,true);
				document.addEventListener('mouseup',mouseupHandler,true);
			},
		};


		//载入动画
		function LoadingAnimC(data,buttonType,waitImgLoad,openInTopWindow){
			this.data=data;//data
			this.buttonType=buttonType;//点击的按钮类型
			this.openInTopWindow=openInTopWindow;//是否在顶层窗口打开,如果在frame里面的话
			this.waitImgLoad=waitImgLoad;//是否等待完全读取后打开
			this.init();
		};

		LoadingAnimC.all=[];

		LoadingAnimC.prototype={
			init:function(){
				LoadingAnimC.all.push(this);
				this.addStyle();
				var container=document.createElement('span');

				container.classList.add('pv-loading-container');
				this.loadingAnim=container;

				container.title='正在加载:' + this.data.src;
				container.innerHTML=''+
									'<span class="pv-loading-error" style="display:none;">Error</span>'+
									'<span class="pv-loading-cancle" title="取消"></span>';


				var loadingError=container.querySelector('.pv-loading-error');
				var loadingCancle=container.querySelector('.pv-loading-cancle');

				this.loadingError=loadingError;
				this.loadingCancle=loadingCancle;

				var self=this;
				loadingCancle.addEventListener('click',function(e){
					self.imgReady.abort();
					self.remove();
				},true);

				document.body.appendChild(container);
				this.setPosition();

				var img=new Image();
				img.src= this.buttonType=='current'? this.data.imgSrc : this.data.src;

				var opts={
					error:function(e){
						self.error(this,e);
					},
				};

				opts[this.waitImgLoad? 'load' : 'ready' ]=function(e){
					self.load(this,e);
				};

				this.imgReady=imgReady(img,opts);
			},
			addStyle:function(){
				if(LoadingAnimC.styleAdded)return;
				LoadingAnimC.styleAdded=true;
				var style=document.createElement('style');
				style.type='text/css';
				style.textContent='\
					.pv-loading-container {\
						position: absolute;\
						z-index:999999997;\
						top: 100px;\
						left: 100px;\
						background-color: black;\
						background-image: url("'+prefs.icons.loading+'");\
						background-repeat: no-repeat;\
						background-position: center;\
						background-origin: content-box;\
						border: none;\
						padding: 1px 30px 1px 2px;\
						margin: 0;\
						opacity: 0.6;\
						height: 24px;\
						min-width: 24px;\
						box-shadow: 2px 2px 0px #666;\
						-webkit-transition: opacity 0.15s ease-in-out;\
						transition: opacity 0.15s ease-in-out;\
					}\
					.pv-loading-container:hover {\
						opacity: 0.9;\
					}\
					.pv-loading-cancle {\
						cursor: pointer;\
						background-image: url("'+prefs.icons.loadingCancle+'");\
						height: 24px;\
						width: 24px;\
						position: absolute;\
						right: 0;\
						top: 0;\
						opacity: 0.2;\
						display: block;\
						-webkit-transition: opacity 0.15s ease-in-out;\
						transition: opacity 0.15s ease-in-out;\
					}\
					.pv-loading-cancle:hover {\
						opacity: 1;\
					}\
					.pv-loading-error {\
						line-height: 24px;\
						color: red;\
						font-size: 12px;\
					}\
				';
				document.querySelector('head').appendChild(style);
			},
			remove:function(){
				if(!this.removed){
					this.removed=true;
					this.loadingAnim.parentNode.removeChild(this.loadingAnim);
					LoadingAnimC.all.splice(LoadingAnimC.all.indexOf(this),1);
				};
			},
			error:function(img,e){
				this.loadingAnim.style.backgroundImage='none';
				this.loadingError.style.removeProperty('display');
				var self=this;
				setTimeout(function(){
					self.remove();
				},2000)
			},
			setPosition:function(){
				var position=getTargetPosition(this.data.img);
				var cs=this.loadingAnim.style;
				cs.top=position.top +1 + 'px';
				cs.left=position.left +1 + 'px';
				cs.removeProperty('display');
			},
			load:function(img,e){
				this.remove();
				this.img=img;
				var buttonType=this.buttonType;

				if(buttonType=='gallery'){
					var allData=this.getAllValidImgs();
					allData.target=this.data;
					this.data=allData;
				};

				if(this.openInTopWindow && isFrame && buttonType!='magnifier'){
					var data=this.data;
					//删除不能发送的项。
					var delCantClone=function(obj){
						delete obj.img;
						delete obj.imgPA;
					};
					if(Array.isArray(data)){
						delCantClone(data.target);
						data.forEach(function(obj){
							delCantClone(obj);
						});
					}else{
						delCantClone(data);
					};

					window.postMessage({
						messageID:messageID,
						src:img.src,
						data:data,
						buttonType:buttonType,
						to:'top',
					},'*');
				}else{
					this.open();
				};


			},
			getAllValidImgs:function(){
				var imgs=document.getElementsByTagName('img'),//html collection
					validImgs=[]
				;
				arrayFn.forEach.call(imgs,function(img,index,imgs){
					var result=findPic(img);
					if(result){
						validImgs.push(result);
					};
				});
				return validImgs;
			},
			open:function(){
				switch(this.buttonType){
					case 'gallery':{
						if(!gallery){
							gallery=new GalleryC();
						};
						gallery.load(this.img,this.data,this.from);
					}break;
					case 'magnifier':{
						new MagnifierC(this.img,this.data);
					}break;
					case 'actual':;
					case 'current':;
					case 'original':{//original 是为了兼容以前的规则
						new ImgWindowC(this.img);
					}break;
				};
			},
		};

		//工具栏
		function FloatBarC(){
			this.init();
		};


		FloatBarC.prototype={
			init:function(){
				this.addStyle();
				var container=document.createElement('span');
				container.id='pv-float-bar-container';
				//innerHTML中的span不能加空格
				container.innerHTML=''+
									'<span class="pv-float-bar-button"></span>'+
									'<span class="pv-float-bar-button"></span>'+
									'<span class="pv-float-bar-button"></span>'+
									'<span class="pv-float-bar-button"></span>';
				document.body.appendChild(container);

				var buttons={};
				this.buttons=buttons;
				this.children=container.children;

				arrayFn.forEach.call(this.children,function(child,index,children){
					var titleMap={
						actual:'Tamaño REAL Size',
						gallery:'Picture Gallery | Galeria de Imágenes',
						current:'Current Size | Tamaño Actual',
						magnifier:'Lupa | Magnifier',
					};
					var buttonName=prefs.floatBar.butonOrder[index];
					buttons[buttonName]=child;
					child.title=titleMap[buttonName];
					child.classList.add('pv-float-bar-button-' + buttonName);
				});


				this.floatBar=container;
				this.shown=true;
				this.preShownImg=null;


				var self=this;
				container.addEventListener('click',function(e){
					var buttonType;
					var target=e.target;
					for(var type in buttons){
						if(!buttons.hasOwnProperty(type))return;
						if(target==buttons[type]){
							buttonType=type;
							break;
						};
					};
					if(!buttonType)return;

					self.hide();
					self.open(e,buttonType);

				},true);


				addCusMouseEvent('mouseleave',container,function(e){
					clearTimeout(self.hideTimer);
					self.hideTimer=setTimeout(function(){
						self.hide();
					},prefs.floatBar.hideDelay);
				});

				addCusMouseEvent('mouseenter',container,function(e){
					clearTimeout(self.hideTimer);
				});
			},
			addStyle:function(){
				var style=document.createElement('style');
				style.type='text/css';
				style.textContent='\
					#pv-float-bar-container {\
						position: absolute;\
						z-index:999999998;\
						top: -100px;\
						left: -100px;\
						padding: 5px;\
						margin: 0;\
						border: none;\
						opacity: 0.6;\
						line-height: 0;\
						-webkit-transition: opacity 0.2s ease-in-out;\
						transition: opacity 0.2s ease-in-out;\
					}\
					#pv-float-bar-container:hover {\
						opacity: 1;\
					}\
					.pv-float-bar-button {\
						cursor: pointer;\
						width: 18px;\
						height: 18px;\
						padding: 1px;\
						margin: 0;\
						border: none;\
						display: inline-block;\
						position: relative;\
						border-radius: 100px;\
						box-shadow: 1px 1px 3px 0px black;\
						background-color: transparent;\
						background-repeat: no-repeat;\
						background-origin: content-box;\
						background-clip: content-box;\
						background-size: 100% 100%;\
						-webkit-transition: margin-left 0.15s ease-in-out,  width 0.15s ease-in-out,  height 0.15s ease-in-out;\
						transition: margin-left 0.15s ease-in-out,  width 0.15s ease-in-out,  height 0.15s ease-in-out;\
					}\
					.pv-float-bar-button:nth-child(n+2){\
						margin-left: -16px;\
					}\
					.pv-float-bar-button:first-child {\
						z-index: 4;\
					}\
					.pv-float-bar-button:nth-child(2) {\
						z-index: 3;\
					}\
					.pv-float-bar-button:nth-child(3) {\
						z-index: 2;\
					}\
					.pv-float-bar-button:last-child {\
						z-index: 1;\
					}\
					#pv-float-bar-container:hover > .pv-float-bar-button {\
						width: 24px;\
						height: 24px;\
					}\
					#pv-float-bar-container:hover > .pv-float-bar-button:nth-child(n+2) {\
						margin-left: 0;\
					}\
					.pv-float-bar-button-actual {\
						background-image:url("'+ prefs.icons.actual +'");\
						background-color: red;\
					}\
					.pv-float-bar-button-gallery {\
						background-image:url("'+ prefs.icons.gallery +'");\
						background-color: yellow;\
					}\
					.pv-float-bar-button-current {\
						background-image:url("'+ prefs.icons.current +'");\
						background-color: blue;\
					}\
					.pv-float-bar-button-magnifier {\
						background-image:url("'+ prefs.icons.magnifier +'");\
						background-color: pink;\
					}\
				';
				document.querySelector('head').appendChild(style);
			},
			start:function(data){

				//读取中的图片,不显示浮动栏,调整读取图标的位置.
				if(LoadingAnimC.all._find(function(item,index,array){
					if(data.img==item.data.img){
						return true;
					};
				}))return;


				//被放大镜盯上的图片,不要显示浮动栏.
				if(MagnifierC.all._find(function(item,index,array){
					if(data.img==item.data.img){
						return true;
					};
				}))return;

				this.data=data;
				var self=this;
				clearTimeout(this.hideTimer);

				var imgOutHandler=function(e){
					document.removeEventListener('mouseout',imgOutHandler,true);
					clearTimeout(self.showTimer);
					clearTimeout(self.hideTimer);
					self.hideTimer=setTimeout(function(){
						self.hide();
					},prefs.floatBar.hideDelay);
				};

				clearTimeout(this.globarOutTimer);
				this.globarOutTimer=setTimeout(function(){//稍微延时。错开由于css hover样式发生的out;
					document.addEventListener('mouseout',imgOutHandler,true);
				},100);


				if(data.img==this.preShownImg && this.shown){
					this.setPosition();
					return;
				};

				clearTimeout(this.showTimer);
				this.showTimer=setTimeout(function(){
					self.show();
				},prefs.floatBar.showDelay);
			},
			setButton:function(){
				if(this.data.type=='force'){
					this.buttons['actual'].style.display='none';
					this.buttons['magnifier'].style.display='none';
				}else{
					this.buttons['actual'].style.removeProperty('display');
					this.buttons['magnifier'].style.removeProperty('display');
				};

				//如果隐藏的按钮是第一个,css弹出层叠按钮的动画会有些维和,这些修正一下。
				var firstHidden;
				arrayFn._find.call(this.children,function(child, index, children){
					var cs=child.style;
					if(index==0){
						if(cs.display=='none'){
							firstHidden=true;
						};
					};

					if(firstHidden){//如果第一个是隐藏的,那么去掉以后第一个非隐藏的marginleft
						if(cs.display!='none'){
							cs.marginLeft=0;
							return true;
						};
					}else{
						cs.removeProperty('margin-left');
					};
				});
			},
			setPosition:function(){
				//如果图片被删除了,或者隐藏了。
				var bCR=this.data.img.getBoundingClientRect();

				if((bCR.left==0 && bCR.right==0) || (bCR.top==0 && bCR.bottom==0))return false;

				var targetPosi=getTargetPosition(this.data.img);
				var windowSize=getWindowSize();

				var floatBarPosi=prefs.floatBar.position.toLowerCase().trim().split(/\s+/);

				var offsetX=prefs.floatBar.offset.x;
				var offsetY=prefs.floatBar.offset.y;


				var scrollXY={
					x:window.scrollX,
					y:window.scrollY,
				};

				var fbs=this.floatBar.style;
				var setPosition={
					top:function(){
						var top=targetPosi.top;
						if(targetPosi.t < -offsetY){//满足图标被遮住的条件.
							top=scrollXY.y;
							offsetY=0;
						};
						fbs.top=top + offsetY + 'px';
					},
					right:function(){
						var right=windowSize.w - targetPosi.r;
						if(right < offsetX){
							right= -scrollXY.x;
							offsetX=0;
						}else{
							right -=scrollXY.x;
						};
						fbs.right=right - offsetX + 'px';
					},
					bottom:function(){
						var bottom=windowSize.h-targetPosi.b;
						if(bottom <= offsetY){
							offsetY=0;
						};
						bottom -= scrollXY.y;
						fbs.bottom=bottom - offsetY + 'px';
					},
					left:function(){
						var left=targetPosi.left;
						if(targetPosi.l < -offsetX){
							left=scrollXY.x;
							offsetX=0;
						};
						fbs.left=left + offsetX + 'px';
					},
				};

				setPosition[floatBarPosi[0]]();
				setPosition[floatBarPosi[1]]();
			},
			show:function(){
				if(this.setPosition()===false){
					return;
				};
				this.preShownImg=this.data.img;
				this.shown=true;
				this.setButton();
				this.floatBar.style.removeProperty('display');
				clearTimeout(this.hideTimer);
			},
			hide:function(){
				clearTimeout(this.showTimer);
				this.shown=false;
				this.floatBar.style.display='none';
			},
			open:function(e,buttonType){
				var waitImgLoad=e.ctrlKey? !prefs.waitImgLoad : prefs.waitImgLoad;//按住ctrl取反向值
				var openInTopWindow=e.shiftKey? !prefs.framesPicOpenInTopWindow : prefs.framesPicOpenInTopWindow;//按住shift取反向值

				if(!waitImgLoad && buttonType=='magnifier' && !envir.chrome){//非chrome的background-image需要全部载入后才能显示出来
					waitImgLoad=true;
				};
				new LoadingAnimC(this.data,buttonType,waitImgLoad,openInTopWindow);
			},
		};


		var matchedRule,
			URL=location.href,
			floatBar
		;

		function findPic(img){
			var imgPA=getElementByXpath('./ancestor::a[1]',img);

			var iPASrc=imgPA? imgPA.href : '';
			//base64字符串过场导致正则匹配卡死浏览器
			var base64Img=/^data:[^;]+;base64,/i.test(img.src);


			if(matchedRule===undefined){//找到符合站点的高级规则,并缓存.
				matchedRule=siteInfo._find(function(site,index,array){
					if(site.enabled && site.url && site.url.test(URL)){
						return true;
					};
				});
				matchedRule=matchedRule? matchedRule[0] : false;
				//console.log('匹配的规则:',matchedRule);
			};

			var src, type;

			if(!src && matchedRule){//通过高级规则获取.
				try{
					src=matchedRule.getImage.call(img,img,imgPA);
				}catch(err){
					throwErrorInfo(err);
				};

				if(src)type='rule';
			};

			if(!src && !base64Img){//遍历通配规则
				tprules._find(function(rule,index,array){
					try{
						src=rule.call(img,img,imgPA);
						if(src){
							//console.log('匹配的通配规则',rule);
							return true;
						};
					}catch(err){
						throwErrorInfo(err);
					};
				});
				if(src)type='tpRule';
			};

			if(!src && imgPA){//链接可能是一张图片...
				if(/\.(?:jpg|jpeg|png|gif|bmp)$/i.test(iPASrc)){
					src=iPASrc;
				};
				if(src)type='scale';
			};

			if(!src){//本图片是否被缩放.
				var imgAS={//实际尺寸。
					h:img.naturalHeight,
					w:img.naturalWidth,
				};
				var imgCS=getCurrentSize(img);
				if(!(imgAS.w==imgCS.w && imgAS.h==imgCS.h)){//如果不是两者完全相等,那么被缩放了.
					if(imgAS.h > prefs.floatBar.minSizeLimit.h || imgAS.w > prefs.floatBar.minSizeLimit.w){//最小限定判断.
						src=img.src;
						type='scale';
					};
				}else{
					if(prefs.floatBar.forceShow.enabled && (imgCS.w>=prefs.floatBar.forceShow.size.w && imgCS.h>=prefs.floatBar.forceShow.size.h)){
						src=img.src;
						type='force';
					};
				};
			};


			if(!src)return;

			var ret={
				src:src,//得到的src
				type:type,//通过哪种方式得到的
				imgSrc:img.src,//处理的图片的src
				iPASrc:iPASrc,//图片的第一个父a元素的链接地址

				img:img,//处理的图片
				imgPA:imgPA,//图片的第一个父a元素
			};

			//console.log('图片查找结果:',ret);
			return ret;
		};


		var isFrame=window!=window.parent;

		window.addEventListener('message',function(e){//contentscript里面的message监听,监听来自别的窗口的数据。
			var data=e.data;
			if( !data || !data.messageID || data.messageID != messageID )return;//通信ID认证
			var source=e.source;
			if(typeof source=='undefined' || source!==window){//来自别的窗口
				if(!isFrame){//顶层窗口
					//console.log('top-contentscript接收到:',e);

/*
					window.postMessage({
						messageID:messageID,
						to:data.from,
						data:'hello',
					},'*');
*/

					var img=new Image();
					img.src=data.src;


					imgReady(img,{
						ready:function(){
							LoadingAnimC.prototype.open.call({
								img:img,
								data:data.data,
								buttonType:data.buttonType,
								from:data.from,//来自哪个窗口
							});
						},
					});
				}else{//frame窗口
					//console.log('frame-contentscript接收到',e);
				};

			};
		},true);



		//页面脚本用来转发消息
		//原因chrome的contentscript无法访问非自己外的别的窗口。都会返回undefined,自然也无法向其他的窗口发送信息,这里用pagescript做个中间代理
		//通讯逻辑..A页面的contentscript发送到A页面的pagescript,pagescript转交给B页面的contentscript

		var messageID='pv-0.5106795670312598';

		var pageScript=document.createElement('script');

		var pageScriptText=function(messageID){
			var frameID=Math.random();
			var frames={
				top:window.top,
			};

			window.addEventListener('message',function(e){
				var data=e.data;
				if( !data || !data.messageID || data.messageID != messageID )return;//通信ID认证
				var source=e.source;
				if(source===window){//来自contentscript,发送出去
					data.from=frameID;
					frames[data.to].postMessage(data,'*');
				}else{//来自别的窗口的,contentscript可以直接接收,这里保存下来自的窗口的引用
					frames[data.from]=source;
				};
			},true)
		};

		pageScript.textContent='(' + pageScriptText.toString() + ')('+ JSON.stringify(messageID) +')';
		document.querySelector('head').appendChild(pageScript);


		function clikToOpen(data){

			var preventDefault = matchedRule.clikToOpen.preventDefault;

			function mouseout(){
				document.removeEventListener('mouseout',mouseout,true);
				document.removeEventListener('click',click,true);
				if(data.imgPA && preventDefault){
					data.imgPA.removeEventListener('click',clickA,false);
				};
			};

			function click(e){
				FloatBarC.prototype.open.call({
					data:data,
				},
				e,
				matchedRule.clikToOpen.type);
			};

			function clickA(e){//阻止a的默认行为
				e.preventDefault();
			};

			document.addEventListener('click',click,true);

			if(data.imgPA && preventDefault){
				data.imgPA.addEventListener('click',clickA,false);
			};

			setTimeout(function(){//稍微延时。错开由于css hover样式发生的out;
				document.addEventListener('mouseout',mouseout,true);
			},100);
			
			return function(){
				mouseout()
			};
		};

		//监听 mouseover
		var canclePreCTO;
		function globalMouseoverHandler(e){

			if(galleryMode)return;//库模式全屏中......

			var target=e.target;
			if(target.nodeName!='IMG' || target.classList.contains('pv-pic-not-allowed')){
				return;
			};

			var result=findPic(target);
			if(result){
				if(!floatBar){
					floatBar=new FloatBarC();
				};
				if(result.type=='rule' && matchedRule.clikToOpen && matchedRule.clikToOpen.enabled){
					if(canclePreCTO){//取消上次的,防止一次点击打开多张图片
						canclePreCTO();
					};
					canclePreCTO=clikToOpen(result);
				};
				floatBar.start(result);//出现悬浮工具栏
			};
		};

		document.addEventListener('mouseover',globalMouseoverHandler,true);
	};


	function init2(){
		init(topObject,window,document,arrayFn,envir);
	};


	var arrayFn=(function(){
		//Array的某些方法对所有的类数组都有效,比如HTMLCollection,NodeList

		//添加一个当函数返回true时,返回[array[index],index],并且跳出循环的方法
		//类似做到 for 循环,在满足条件的时候直接break跳出的效果。
		if(typeof Array.prototype['_find']!='function'){
			Object.defineProperty(Array.prototype,'_find',{
				value:function(callback , thisArg){
					if (this == null){
						throw new TypeError( "this is null or not defined" );
					};

					if(typeof callback != 'function') {
						throw new TypeError( callback + " is not a function" );
					};

					var i = 0,
						l = this.length,
						value,
						hasOwnProperty=Object.prototype.hasOwnProperty
					;


					while(i<l){
						if(hasOwnProperty.call(this,i)){
							value = this[i];
							if(callback.call( thisArg, value, i, this )===true){
								return [value,i,this];
							};
						};
						i++;
					};
				},
				writable:true,
				enumerable:false,//与原生方法一样不可枚举,维护网页和谐。。。
				configurable:true,
			});
		};

		var arrayProto=Array.prototype;
		return {
			_find:arrayProto._find,
			slice:arrayProto.slice,
			forEach:arrayProto.forEach,
			some:arrayProto.some,
			every:arrayProto.every,
			map:arrayProto.map,
			filter:arrayProto.filter,
			indexOf:arrayProto.indexOf,
			lastIndexOf:arrayProto.lastIndexOf,
		};

	})();


	//检测运行环境
	var envir={
		opera:!!window.opera,
		chrome:!!window.chrome,
		firefox:typeof XPCNativeWrapper=='function'? true : false,
	};


	if(document.readyState=='loading'){
		document.addEventListener('DOMContentLoaded',init2,true);
	}else if(document.readyState!='complete'){
		document.addEventListener('DOMContentLoaded',function(){
			window.removeEventListener('load',init2,true);
			init2();
		},true);
		window.addEventListener('load',init2,true);
	}else{
		init2();
	};
})(this,window,document)

}{     var greasedLightbox = {
	
	aspectRatio : null,
	timer : null, 
	slideTime : 3,
	currentAddress : null,
	allImageLinks : [],
	currentImagePosition : 0,
	lastMove : 1,
	isShowing : false,
	isSlideShow : false,
	searchDefs : [
		// wikipedia (needs to come before 'show')
		{
			name				: 'wikipedia',
			includeRegExp		: /^https?:\/\/(.*?\.)?wikipedia\.org/i,
			linkRegExp			: /.*?\/(Fi(le?|xter|txategi|gura|n?ch(ier|eiro))|Fa(il|sciculus)|Dat(oteka|ei)|Delwedd|Dosiero|Be(stand|rkas)|Billede|Skeudenn|Soubor|Slika|Pilt|Archivo|Mynd|Vaizdas|Tiedosto|Larawan|Resim):.*\.(jpe?g|gif|png)$/i,
			findImageRegExp		: /(.+?)\/thumb\/(.+?)\.(jpe?g|gif|png).*$/i,
			replaceString		: '$1/$2.$3',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'wikipedia'); return false; }
		}, // wikipedia
		
		// imagesocket (needs to come before 'show')
		{
			name				: 'imagesocket',
			includeRegExp		: /./, // used on every page
			linkRegExp			: /^(https?:\/\/)(.*?\.)?imagesocket\.com\/(view|thumbs)\/(.*?\.(jpe?g|gif|png))$/i,
			replaceString		: '$1content.imagesocket.com/images/$4',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'imagesocket'); return false; }
		}, // imagesocket
		
		// imagesocket site (needs to come before 'show')
		{
			name				: 'imagesocketSite',
			includeRegExp		: /^https?:\/\/(.*?\.)?imagesocket\.com/i,
			linkRegExp			: /^\/view\/(.*?\.(jpe?g|gif|png))$/i,
			replaceString		: 'http://content.imagesocket.com/images/$1',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'imagesocketSite'); return false; }
		}, // imagesocket site
		
		// blogger/blogspot (needs to come before 'show')
		{
			name				: 'blogger',
			includeRegExp		: /^https?:\/\/(.*?\.)?blog(ger|spot)\.com/i,
			linkRegExp			: /^(https?:\/\/.*?\.blogger\.com\/.*?\/.*?\/.*?\/.*?)\/.*?-h(\/.*?\.(jpe?g|gif|png))$/i,
			replaceString		: '$1$2',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'blogger'); return false; }
		}, // blogger/blogspot
        // radikal.ru
        {
            name                : 'radikal',
            includeRegExp       : /./, // used in every page
            linkRegExp          : /http:\/\/(radikal.ru\/F\/)?(.*\.(jpg|png))(\.html)?$/i,
            replaceString       : 'http://$2',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'radikal'); return false; }
            
        },  // radikal.ru
		// regular links to images
		{
			name				: 'show',
			includeRegExp		: /./, // used on every page
			linkRegExp			: /.*?\.(jpe?g|gif|png)$/i,
			excludeLinkRegExp	: /\?/i,
			showFunction		: function(event) { greasedLightbox.show(event); return false; }
		}, // regular links to images
		
		// picasa
		/* "view in original context" is not worked propertly */
		{
			name				: 'picasa',
			includeRegExp		: /./, // used on every page
			linkRegExp			: /https?:\/\/picasaweb\.google\..*\/.+/i,
			findImageRegExp		: /^(https?:\/\/.*)\/s[0-9]+\/(.*)\.jpg$/i,
			replaceString		: '$1/s1024/$2.jpg',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'picasa'); return false; }
		},
		
		// ipicture/upload
		{
			name				: 'ipicture',
			includeRegExp		: /./, // used on every page
			linkRegExp			: /http:\/\/ipicture\.ru\/upload\/(.*(jpg|png|jpeg|gif))$/i,
			replaceString		: 'http://ipicture.ru/upload/$1',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'picasa'); return false; }			
		},
		
		// search engine images (google, yahoo, ask jeeves, blingo)
		{
			name				: 'search',
			includeRegExp		: /^https?:\/\/(.*?\.)?(google\..*|search\.yahoo\.com|blingo\.com\/images)/i, 
			linkRegExp			: /.*?(im(age|g)(ur(i|l)|src))=(http(s?):\/\/)?(.*?)&.*/i,
			replaceString		: 'http$6://$7',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'search'); return false; }
		}, // search engine images
		
		// doubanpic
		{
			name				: 'doubanpic',
			includeRegExp		: /^http:\/\/www\.douban\.com\/subject\/[0-9]+\//i,
			linkRegExp			: /^(http:\/\/t\.douban\.com\/)l(pic\/s[0-9]+\.jpg)/i,
			replaceString		: '$1m$2',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'doubanpic'); return false; }
		}, // doubanpic
		// doubanphoto
		{
			name				: 'doubanphoto',
			includeRegExp		: /^http:\/\/www\.douban\.com\/photos\/album\/[0-9]+\//i,
			linkRegExp			: /^http:\/\/www\.douban\.com\/photos\/photo\/([0-9]+)\/$/i,
			replaceString		: 'http://t.douban.com/view/photo/photo/public/p$1.jpg',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'doubanphoto'); return false; }
		}, // doubanphoto
		// doubanevent
		{
			name				: 'doubanevent',
			includeRegExp		: /^http:\/\/www\.douban\.com\/event\/album\/[0-9]+\//i,
			linkRegExp			: /^http:\/\/www\.douban\.com\/event\/photo\/([0-9]+)\/$/i,
			replaceString		: 'http://t.douban.com/view/photo/photo/public/p$1.jpg',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'doubanevent'); return false; }
		}, // doubanevent
		// doubanonline
		{
			name				: 'doubanonline',
			includeRegExp		: /^http:\/\/www\.douban\.com\/online\/[0-9]+\/album\/[0-9]+\//i,
			linkRegExp			: /^http:\/\/www\.douban\.com\/online\/[0-9]+\/photo\/([0-9]+)\/$/i,
			replaceString		: 'http://img2.douban.com/view/photo/photo/public/p$1.jpg',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'doubanonline'); return false; }
		}, // doubanonline
		// doubanartist1
		{
			name				: 'doubanartist1',
			includeRegExp		: /^http:\/\/www\.douban\.com\/artist\/[a-z]+\/album\/[0-9]+\//i,
			linkRegExp			: /^http:\/\/www\.douban\.com\/artist\/[a-z]+\/photo\/([0-9]+)\/$/i,
			replaceString		: 'http://t.douban.com/view/photo/photo/public/p$1.jpg',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'doubanartist1'); return false; }
		}, // artist1
		// doubanartist2
		{
			name				: 'doubanartist2',
			includeRegExp		: /^http:\/\/www\.douban\.com\/artist\/[a-z]+\/public_album\/[0-9]+\//i,
			linkRegExp			: /^http:\/\/www\.douban\.com\/artist\/[a-z]+\/public_photo\/([0-9]+)\/$/i,
			replaceString		: 'http://t.douban.com/view/photo/photo/public/p$1.jpg',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'doubanartist2'); return false; }
		}, // doubanartist2
		
		// flickr
		{
			name				: 'flickr',
			includeRegExp		: /^https?:\/\/(.*?\.)?flickr\.com/i,
			linkRegExp			: /\/photos\/[^\/]+\/[0-9]+/i,
			findImageRegExp		: /_[tsm]\.jpg/i,
			replaceString		: '.jpg',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'flickr'); return false; }
		}, // flickr
		
		// facebook
		/* removed support because they now have nice built-in image viewing features
		{
			name				: 'facebook',
			includeRegExp		: /^https?:\/\/(.*?\.)?facebook\.com/i,
			linkRegExp			: /photo\.php\?pid=[0-9]+/i,
			findImageRegExp		: /[st]([0-9]+.*?)\.jpg/i,
			replaceString		: 'n$1.jpg',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'facebook'); return false; }
		}, // facebook
		*/
		
		// myspace1
		{
			name				: 'myspace1',
			includeRegExp		: /^https?:\/\/(.*?\.)?myspace\.com/i,
			linkRegExp			: /imageID=[0-9]+/i,
			findImageRegExp		: /m_(.+)\.jpg/i,
			replaceString		: 'l_$1.jpg',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'myspace1'); return false; }
		},  // myspace1
		
		// myspace2
		{
			name				: 'myspace2',
			includeRegExp		: /^https?:\/\/(.*?\.)?myspace\.com/i,
			linkRegExp			: /imageID/i,
			findImageRegExp		: /_m/i,
			replaceString		: '_l',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'myspace2'); return false; }
		},  // myspace2
		
		// deviantart
		{
			name				: 'deviantart',
			includeRegExp		: /^https?:\/\/(.*?\.)?deviantart\.com/i,
			linkRegExp			: /deviantart\.com\/(deviation|print|art)\/.+/i,
			findImageRegExp		: /^http(s)?:\/\/.*?\.deviantart\.com\/([^\/]*)\/[^\/]*\/(.*?)\.(jpe?g|gif|png)$/i,
			replaceString		: 'http$1://fc01.deviantart.com/$2/$3.$4',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'deviantart'); return false; }
		}, // deviantart
		
		// subvariance
		{
			name				: 'subvariance',
			includeRegExp		: /^https?:\/\/(.*?\.)?subvariance\.com/i,
			linkRegExp			: /\/view\/[0-9]+/i,
			findImageRegExp		: /\/items\/thumbs\/(.*?)\.jpg/i,
			replaceString		: '/items/$1.jpg',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'subvariance'); return false; }
		}, // subvariance
		
		// gmail
		{
			name				: 'gmail',
			includeRegExp		: /^https?:\/\/mail\.google\..*/i,
			linkRegExp			: /^(\/mail\/\?view=att&(amp;)?disp=)inline/i,
			replaceString		: 'http://' + window.location.host + '$1emb',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'gmail'); return false; }
		}, // gmail
		
		// imagefap
		{
			name				: 'imagefap',
			includeRegExp		: /^https?:\/\/(.*?\.)?imagefap\.com/i,
			linkRegExp			: /(image.php\?id=|gallery\/)[0-9]+/i,
			findImageRegExp		: /\/images\/(thumb|mini)\/([0-9]+)\/([0-9]+)\/([0-9]+)\.jpg/i,
			replaceString		: '/full/$2/$3/$4.jpg',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'imagefap'); return false; }
		},
		
		// ffffound!
		{
			name				: 'ffffound',
			includeRegExp		: /^https?:\/\/(.*?\.)?ffffound\.com/i,
			linkRegExp			: /\/image\/[\w]+$/i,
			findImageRegExp		: /img(-thumb)?\.ffffound\.com\/static-data\/assets\/([\w\/]+?)_[\w]+\.(jpe?g|gif|png)$/i,
			replaceString		: 'img.ffffound.com/static-data/assets/$2.$3',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'ffffound'); return false; }
		},
		
		// textamerica
		/* removed support because they are now subscription-based
		{
			name				: 'textamerica',
			includeRegExp		: /^http(s)?:\/\/(.*?\.)?textamerica\.com/i,
			linkRegExp			: /\?r=[0-9]+$/i,
			findImageRegExp		: /user\.images\.x\/(.*?\/.*?)\/(.*?)\/(.*?)\.jpg(.*)$/i,
			replaceString		: 'user.images.x/$1\/$3.jpg',
			showFunction		: function(event) { greasedLightbox.showFrom(event, 'textamerica'); return false; }
		} // textamerica
		*/
		
		// image		http://bp2.blogger.com/_a7jkcMVp5Vg/SAGu9Ym-S2I/AAAAAAAAEoM/WCGF3uywJzE/s400/empty.jpg
		// link			http://bp2.blogger.com/_a7jkcMVp5Vg/SAGu9Ym-S2I/AAAAAAAAEoM/WCGF3uywJzE/s1600-h/empty.jpg
		// final image	http://bp2.blogger.com/_a7jkcMVp5Vg/SAGu9Ym-S2I/AAAAAAAAEoM/WCGF3uywJzE/s1600/empty.jpg
		
	], // searchDefs[]
	
	// useLinkForShow()
	useLinkForShow : function(searchDef) {
		if (searchDef.findImageRegExp)
			return false;
		else
			return true;
	},
	
	// showFrom()
	// generic helper function that calls show() with the correct parameters
	showFrom : function(event, showName) {
		var link;
		if (event.currentTarget)
			link							= event.currentTarget;
		else
			link							= event;
		
		var address							= unescape(unescape(greasedLightbox.getAddress(link)));
		var img								= greasedLightbox.getImageToShow(link, address, showName);
		
		greasedLightbox.show(event, img, address);
	}, // showFromLink()
	
	// getImageToShow()
	getImageToShow : function(link, address, showName) {
		var searchDef						= greasedLightbox.getRegExpObj(greasedLightbox.searchDefs, showName);
		
		if (greasedLightbox.useLinkForShow(searchDef)) {
			address							= unescape(unescape(address));
			if (searchDef['replaceString'])
				var img						= address.replace(searchDef['linkRegExp'], searchDef['replaceString']);
			else
				var img						= address.match(searchDef['linkRegExp'])[0];
		} else {
			var img							= greasedLightbox.containsThumb(link, greasedLightbox.getRegExpObj(greasedLightbox.searchDefs, showName), true);
		}
		
		return img;
	}, // getImageToShow()
	
	// getRegExpObj()
	// returns the requested regular expression object from the regExp array
	getRegExpObj : function(regExpObject, showName) {
		var rExObj;
		
		for (var i = 0; i < regExpObject.length; i++) {
			rExObj							= regExpObject[i];
			if (rExObj['name'] == showName)
				return rExObj;
		}
	}, // getRegExpObj()
	
	// containsThumb()
	containsThumb : function(elem, rExObj, verbose) {
		var images, image, src;
		images = document.evaluate('descendant::img[@src]', elem, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
		
		for(var i = 0; i < images.snapshotLength; i++) {
			thisImage	= images.snapshotItem(i);
			src			= thisImage.getAttribute('src');
			if(rExObj['findImageRegExp'].test(src)) {
				if(!verbose) return true;
					return src.replace(rExObj['findImageRegExp'], rExObj['replaceString']);
			}
		}
		
		return false;
	}, // containsThumb()
	
	// getAddress()
	// extracts an address out of a linkObj
	getAddress : function(linkObj) {
        var address                            = linkObj.getAttribute('href');
		
        // for GreaseKit users because Safari doesn't like stopping events even though it says it does...
        if(/Safari/.test(navigator.userAgent)) {
            linkObj.onclick = function() { return false; };
        }
        return address;
    }, // getAddress()
	
	// getPageScroll()
	// Returns array with x,y page scroll values.
	// Core code from - quirksmode.org
	getPageScroll : function() {
		var xScroll, yScroll;
		if (self.pageYOffset) {
			yScroll 						= self.pageYOffset;
		} else if (document.documentElement && document.documentElement.scrollTop){	 // Explorer 6 Strict
			yScroll 						= document.documentElement.scrollTop;
		} else if (document.body) {// all other Explorers
			yScroll 						= document.body.scrollTop;
		}
		
		if (self.pageXOffset) {
			xScroll 						= self.pageXOffset;
		} else if (document.documentElement && document.documentElement.scrollLeft){	 // Explorer 6 Strict
			xScroll 						= document.documentElement.scrollLeft;
		} else if (document.body) {// all other Explorers
			xScroll 						= document.body.scrollLeft;
		}
	
		arrayPageScroll 					= new Array(xScroll,yScroll) 
		return arrayPageScroll;
	}, // getPageScroll()
	
	// getPageSize()
	// Returns array with page width, height and window width, height
	// Core code from - quirksmode.org
	// Edit for Firefox by pHaez
	getPageSize : function() {
		var xScroll, yScroll;
		
		if (window.innerHeight && window.scrollMaxY) {	
			xScroll							= document.body.scrollWidth;
			yScroll							= window.innerHeight + window.scrollMaxY;
		} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
			xScroll							= document.body.scrollWidth;
			yScroll							= document.body.scrollHeight;
		} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
			xScroll							= document.body.offsetWidth;
			yScroll							= document.body.offsetHeight;
		}
		
		var windowWidth, windowHeight;
		if (self.innerHeight) {	// all except Explorer
			windowWidth						= self.innerWidth;
			windowHeight					= self.innerHeight;
		} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
			windowWidth						= document.documentElement.clientWidth;
			windowHeight					= document.documentElement.clientHeight;
		} else if (document.body) { // other Explorers
			windowWidth						= document.body.clientWidth;
			windowHeight					= document.body.clientHeight;
		}	
		
		// for small pages with total height less then height of the viewport
		if(yScroll < windowHeight){
			pageHeight						= windowHeight;
		} else { 
			pageHeight						= yScroll;
		}
	
		// for small pages with total width less then width of the viewport
		if(xScroll < windowWidth){	
			pageWidth						= windowWidth;
		} else {
			pageWidth						= xScroll;
		}
	
		arrayPageSize						= new Array(pageWidth,pageHeight,windowWidth,windowHeight);
		return arrayPageSize;
	}, // getPageSize()
	
	// center()
	// centers the object in the page
	center : function(objToCenter, arrayPageScroll, arrayPageSize) {
		var oldDisplay					= new Array(objToCenter.style.visibility, objToCenter.style.display);
		
		objToCenter.style.display		= 'none';
		
		var arrayPageScroll				= (arrayPageScroll) ? arrayPageScroll : greasedLightbox.getPageScroll();
		var arrayPageSize				= (arrayPageSize) ? arrayPageSize : greasedLightbox.getPageSize();
		objToCenter.style.visibility	= 'hidden';
		objToCenter.style.display		= 'block';
		
		var objTop						= arrayPageScroll[1] + ((arrayPageSize[3] + 35 - objToCenter.offsetHeight) / 2);
		var objLeft						= (arrayPageSize[0] - objToCenter.offsetWidth) / 2;
		
		objToCenter.style.top			= (objTop < 0) ? "0px" : objTop + "px";
		objToCenter.style.left			= (objLeft < 0) ? "0px" : objLeft + "px";
		
		objToCenter.style.visibility	= oldDisplay[0];
		objToCenter.style.display		= oldDisplay[1];
	}, // center()
	
	// centerItAll()
	// Centers the lightbox object and the loading/error object on the page
	centerItAll : function() {
		var objLightbox					= document.getElementById('greasedLightbox');
		var objLoading					= document.getElementById('greasedLightboxLoading');
		var arrayPageSize				= greasedLightbox.getPageSize();
		var arrayPageScroll 			= greasedLightbox.getPageScroll();
		
		greasedLightbox.center(objLightbox, arrayPageScroll, arrayPageSize);
		greasedLightbox.center(objLoading, arrayPageScroll, arrayPageSize);
	}, // centerItAll()
	
	// show()
	// Preloads images. Pleaces new image in lightbox then centers and displays.
	show : function(event, img, context) {
		//alert(img);
		// let shift+click and ctrl+click (but not ctrl+shift+click) through without lightbox
		if ((event.shiftKey || event.ctrlKey) && !(event.shiftKey && event.ctrlKey)) return true;
			
		// if this is a real event stop the click and set the link, otherwise, just set the link
		if (event.currentTarget) {
			var link						= event.currentTarget;
			greasedLightbox.stopEvents(event);
		} else {
			var link						= event;
		}
		
		if (img == null || img == '') img	= link.getAttribute('href');
		greasedLightbox.currentAddress		= unescape(unescape(greasedLightbox.getAddress(link)));
		
		// make ctrl+shift+click follow link without lightbox
		if (event.shiftKey && event.ctrlKey) {
			window.location.href			= greasedLightbox.currentAddress;
			return true;
		}
		
		// center when resized
		if (greasedLightbox.isShowing != true)
			window.addEventListener('resize', greasedLightbox.centerItAll, true);
		
		greasedLightbox.isShowing			= true;
		
		// get the caption from the title attribute of the link. if that doesn't exist, look for it in the title attribute of the image.
		capt								= link.getAttribute('title');
		
		if (capt == null || capt == '') {
			try {
				var imgObj					= link.firstChild;
				capt						= imgObj.getAttribute('title');
			} catch (e) { }
		}
		if (capt == null || capt == '') {
			try {
				var imgObj					= link.firstChild;
				capt						= imgObj.getAttribute('alt');
			} catch (e) { }
		}
		
		// prep objects
		var objOverlay						= document.getElementById('greasedLightboxOverlay');
		var objMenu							= document.getElementById('greasedLightboxMenu');
		var objLightbox						= document.getElementById('greasedLightbox');
		var objCaption						= document.getElementById('greasedLightboxCaption');
		var imgPreload						= document.getElementById('greasedLightboxPreload');
		var objImage						= document.getElementById('greasedLightboxImage');
		var objLoading						= document.getElementById('greasedLightboxLoading');
		
		objOverlay.style.display			= 'none'; // This will ensure that we have a correct reading of the page size
		var arrayPageSize					= greasedLightbox.getPageSize();
		var arrayPageScroll 				= greasedLightbox.getPageScroll();
	
		// set height of Overlay to take up whole page and show
		objOverlay.style.height				= (arrayPageSize[1] + 'px');
		objOverlay.style.display			= 'block';
		
		// show menu
		objMenu.style.display				= 'block';
		
		// center loader and error message
		objLoading.style.visibility			= 'hidden';
		objLoading.style.display			= 'block';
		greasedLightbox.center(objLoading, arrayPageScroll, arrayPageSize);
		objLoading.style.visibility			= 'visible';
		
		var imgPreload						= document.getElementById('greasedLightboxPreload');
		
		// preload image
		preloaderDone = function() {
			loaderDone	= function() {
				objImage.removeAttribute('width');
				objImage.removeAttribute('height');
				greasedLightbox.aspectRatio		= null;
				
				if (capt) {
					objCaption.innerHTML		= capt;
				} else {
					objCaption.innerHTML		= img;
				}
				
				// dimensions
				// objCaption.innerHTML			= objCaption.innerHTML + '<br/><br/>(width: ' + objImage.width + 'px; height: ' + objImage.height + 'px;)';
				
				// add a link for context
				if (context) objCaption.innerHTML	= objCaption.innerHTML + '<br/><br/><a href="' + context + '">' + greasedLanguage[greasedLanguage.language][0].context + '</a>';
				
				// center lightbox and make sure that the top and left values are not negative
				// and the image placed outside the viewport
				//objLightbox.style.visibility	= 'hidden';
				objLightbox.style.display		= 'block';
				
				greasedLightbox.aspectRatio		= objImage.height / objImage.width;
				
				// if image is larger than the screen
				if (objImage.height > arrayPageSize[3] - 70) {
						var newHeight			= arrayPageSize[3] - 70;
						var newWidth			= (objImage.width / objImage.height) * newHeight;
						objImage.height			= newHeight;
						objImage.width			= newWidth;
				}
				if (objImage.width > arrayPageSize[2] - 70) {
						var newWidth			= arrayPageSize[2] - 70;
						var newHeight			= greasedLightbox.aspectRatio * newWidth;
						objImage.height			= newHeight;
						objImage.width			= newWidth;
				}
				
				greasedLightbox.center(objLightbox, arrayPageScroll, arrayPageSize);
				
				// if it went bigger than the page
				if (objLightbox.offsetHeight > objOverlay.offsetHeight) objOverlay.style.height		= objLightbox.offsetHeight + 'px';
				if (objLightbox.offsetWidth > objOverlay.offsetwidth) objOverlay.style.width		= objLightbox.offsetWidth + 'px';
				
				greasedLightbox.center(objLightbox, arrayPageScroll, arrayPageSize);
				
				objLoading.style.display		= 'none';
				objCaption.style.display		= 'block';
				objLightbox.style.visibility	= 'visible';
				
				// clean it up a bit for memory's sake
				objImage.removeEventListener('load', loaderDone, false);
				imgPreload.removeEventListener('load', preloaderDone, false);
				imgPreload.removeEventListener('error', greasedLightbox.noImage, false);
				imgPreload.src					= '';
				
				if (greasedLightbox.isSlideShow)
					greasedLightbox.timer = setTimeout(function(event) { greasedLightbox.moveSlide(event, 1) }, greasedLightbox.slideTime * 1000);
				
				return false;
			} // loaderDone()
			
			objImage.addEventListener('load', loaderDone, false);
			objImage.src					= img;
			
			return false;
		} // preloaderDone()
		
		
		if (imgPreload.src != img) {
			imgPreload.addEventListener('load', preloaderDone, false);
			imgPreload.addEventListener('error', greasedLightbox.noImage, false);
			imgPreload.src					= img;
		} else {
			preloaderDone();
		}
		
		// hides flash movies that peek through the overlay
		var obtrusives, thisObtrusive;
		obtrusives	= document.evaluate('//object|//embed|//iframe', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
		
		for(var i = 0; i < obtrusives.snapshotLength; i++) {
			thisObtrusive					= obtrusives.snapshotItem(i);
			thisObtrusive.style.visibility	= 'hidden';
		}
		
		if (greasedLightbox.allImageLinks.length > 1) {
			// initialize slideshow
			// set currentImagePosition
			findCurrentPosition : for(var i = 0; i < greasedLightbox.allImageLinks.length; i++) {
				if (greasedLightbox.allImageLinks[i]['link'] == link) {
					greasedLightbox.currentImagePosition	= i;
					break findCurrentPosition;
				}
			} // for()
			
			// pre-fetch next image
			if (!window.opera) { // for some reason this pre-fetching breaks lightbox in opera
				var imgPrefetch			= document.getElementById('greasedLightboxPrefetch');
				
				var nextImagePosition	= (greasedLightbox.currentImagePosition + greasedLightbox.lastMove) % greasedLightbox.allImageLinks.length;
				if (nextImagePosition < 0) nextImagePosition = greasedLightbox.allImageLinks.length - 1;
				
				var nextImage			= greasedLightbox.allImageLinks[nextImagePosition];
				var nextImageSrc		= greasedLightbox.getImageToShow(nextImage['link'], greasedLightbox.getAddress(nextImage['link']), nextImage['name']);
				imgPrefetch.src			= nextImageSrc;
			}
		} // if()
		
	}, // show()
	
	// slideShow()
	// cycles through all of the lightboxable images
	slideShow: function(cmd) {
		var objMenuButtonShow = document.getElementById('greasedLightboxButtonSlide');
		if (cmd != 'stop') { // start the show
			greasedLightbox.isSlideShow	= true;
			greasedLightbox.moveSlide(null, 1);
			
			// switch function to stop button
			objMenuButtonShow.removeEventListener('click', greasedLightbox.slideShow, false);
			objMenuButtonShow.innerHTML	= '\u2169';
			objMenuButtonShow.addEventListener('click', function(event) { greasedLightbox.slideShow('stop') }, false);
		}
		else { // stop the show
			clearTimeout(greasedLightbox.timer);
			greasedLightbox.isSlideShow	= false;
			objMenuButtonShow.removeEventListener('click', function(event) { greasedLightbox.slideShow('stop') }, false);
			objMenuButtonShow.innerHTML	= '\u21BB';
			objMenuButtonShow.addEventListener('click', greasedLightbox.slideShow, false);
		}
	}, // slideShow()
	
	// hide()
	// Stops the preloader in case it hasn't finished and then hides all of the lightbox components
	hide : function(event) {
		greasedLightbox.stopEvents(event);
		greasedLightbox.isShowing			= false;
		window.removeEventListener('resize', greasedLightbox.centerItAll, true);
		
		// get objects
		var objPreloader					= document.getElementById('greasedLightboxPreload');
		var objLoading						= document.getElementById('greasedLightboxLoading');
		var objError						= document.getElementById('greasedLightboxError');
		var objOverlay						= document.getElementById('greasedLightboxOverlay');
		var objLightbox						= document.getElementById('greasedLightbox');
		var objMenu							= document.getElementById('greasedLightboxMenu');
		var imgPreload						= document.getElementById('greasedLightboxPreload');
		
		// stop preloader
		objPreloader.removeEventListener('load', preloaderDone, false);
		imgPreload.removeEventListener('error', greasedLightbox.noImage, false);
		//imgPreload.src					= '';
		
		// show flash movies again
		var obtrusives, thisObtrusive;
		obtrusives	= document.evaluate('//object|//embed|//iframe', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
		
		for(var i = 0; i < obtrusives.snapshotLength; i++) {
			thisObtrusive					= obtrusives.snapshotItem(i);
			thisObtrusive.style.visibility	= 'visible';
		}
		
		// hide everything
		objLoading.style.display			= 'none';
		objError.style.display				= 'none';
		objOverlay.style.display			= 'none';
		objLightbox.style.display			= 'none';
		objMenu.style.display				= 'none';
		
	}, // hide()
	
	// halt()
	// stops the slideshow and hides the lightbox
	halt : function() {
		greasedLightbox.slideShow('stop');
		greasedLightbox.hide();
	},
	
	// stopEvents()
	stopEvents : function(event) {
		if (event) {
			if (event.stopPropagation) event.stopPropagation();
			if (event.preventDefault) event.preventDefault();
		}
	},
	
	// resize()
	resize : function(event, resizeByAmount) {
		greasedLightbox.stopEvents(event);
		
		// stop slidshow
		greasedLightbox.slideShow('stop');
		
		// resize the image
		var objImage						= document.getElementById('greasedLightboxImage');
		var imgPreload						= document.getElementById('greasedLightboxPreload');
                
		if (resizeByAmount == 0) {
			objImage.removeAttribute('width');
			objImage.removeAttribute('height');
		} else {
			var newWidth					= objImage.width + (objImage.width * (resizeByAmount/100));
			var newHeight					= this.aspectRatio * newWidth;
			if (newWidth > 30 || newHeight > 30) {
				objImage.width				= newWidth;
				objImage.height				= newHeight;
			}
		}
		
		// re-center the lightbox
		var objLightbox						= document.getElementById('greasedLightbox');
		greasedLightbox.center(objLightbox);
	}, // resize()
	
	// noImage()
	// Displays a nice error message when no image can be found.
	noImage : function(event) {
		var objLoading						= document.getElementById('greasedLightboxLoading');
		var objError						= document.getElementById('greasedLightboxError');
		var objErrorContext					= document.getElementById('greasedLightboxErrorContext');
		
		objError.style.visibility			= 'hidden';
		objError.style.display				= 'block';
		
		objErrorContext.innerHTML			= '<a href="' + greasedLightbox.currentAddress + '">' + greasedLanguage[greasedLanguage.language][0].context + '</a>';
		
		greasedLightbox.center(objError);
		
		objLoading.style.display			= 'none';
		objError.style.visibility			= 'visible';
		
		if (greasedLightbox.isSlideShow)
			greasedLightbox.timer = setTimeout(function(event) { greasedLightbox.moveSlide(event, 1) }, 500);
	}, // noImage()
	    
	// handleKey(event)
	// handles keypress. If 'x' is pressed then it hides the lightbox. If a left or right arrow is pressed it cycles through images on a page
	handleKey : function(event) {
		if (greasedLightbox.isShowing) {
			var keycode							= event.which;
			var key								= String.fromCharCode(keycode).toLowerCase();
			
			switch(key) {
				case 'x':
					greasedLightbox.halt(event);
					break;
				case '+': // increase size
					greasedLightbox.resize(event, 13);
					break;
				case '-': // decrease size
					greasedLightbox.resize(event, -13);
					break;
				case '0': // set to default size
					greasedLightbox.resize(event, 0);
					break;
				/* @todo
				case 'v': // view image in original context
					
					break;
				*/
				default:
					switch(event.keyCode) {
						// esc key
						case 27:
							greasedLightbox.halt(event);
							break;
							
						// left arrow
						case 37:		// firefox
						case 63234:		// safari
							greasedLightbox.slideShow('stop');
							greasedLightbox.moveSlide(event, -1);
							break;
							
						// right arrow
						case 39:		// firefox
						case 63235:		// safari
							greasedLightbox.slideShow('stop');
							greasedLightbox.moveSlide(event, 1);
							break;
							
					} // switch(event.keyCode)
					break;
			} // switch(key)
		} // if
	}, // getKey()
	
	// moveSlide()
	// loads another image from allImageLinks[]
	moveSlide : function(event, moveByAmount) {
		if (greasedLightbox.allImageLinks.length > 1) {
			if (greasedLightbox.currentImagePosition + moveByAmount == -1) greasedLightbox.currentImagePosition = greasedLightbox.allImageLinks.length;
			var newSlidePosition				= (greasedLightbox.currentImagePosition + moveByAmount) % greasedLightbox.allImageLinks.length;
			var slideToLoad						= greasedLightbox.allImageLinks[newSlidePosition];
			
			greasedLightbox.hide(event);
			slideToLoad['showFunction'](slideToLoad['link']);
			greasedLightbox.lastMove			= moveByAmount;
		} // if
	}, // moveSlide()
	
	// lightBulbOnIcon
	// used when an update is available
	lightBulbOnIcon :"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAAABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKgSURBVDjLlZLrS1NxGMd90ZvovdEfEBEUEhZIb0xMjdyLIuyGkiHGUFKydFKKJiRegjIyFJRwojMxzfJSaVOYeTfxtpSNuZ1tXnY2z27nsss5334uWloG9uLD7%2FA7z%2FfzPPx4IgBE7ISl3qWyelUvu9JIueZqeOdUmcCMFDgcQ3fntjSK0j%2Frwx%2BcsesIZ3jbL1j6EbCPIej5DpE3QRIoBJ3LEFb74BjIxkbXVYNdrTixS8Ca3h%2Fy6pSTfloD0UcRjCS8BJGbRdA7QRgjd1pIfhruyeewKOMdm%2BrCw2GBV1tXKZh7SIEVoqAjpwVS0AlIvhBSkCGyeQRcPYDogO1DNixvrveFBa6ZCkuAmSe1OtJpFVLATkJboWCIAE3%2BGYngI6ENgnUK%2BhcxfFiw9fWRT%2BRWEWTHEeRmyPhaMvYCgu5ZEpgkbzCCgPszBNsr8NY8iF4Ky5WnpLDArs41%2BzYnSPdF8OYi0qEcTHc6mF45mJ4M2Ftl4C1lYPU34KerwFNTWKmO%2Fj2BfbiwghmvJuPawZsUsNVHgTPlEx6ANcjJeR9r5QfhWUqEJOlhbc%2BFoV42FBY4R0sPbPbKlz2LLeQB9aCbYkJhzpIFlkoDZ8zDRk0kRHYYrm8d0JYeEyyduUd37QH9pTBqvSOV9iy0wtmZ%2BVNAOm%2BHOeM92JtlYDQN0JYcD1BtmTf%2FWqRtbJ%2FyTxtUt9fXGhPBq5MhriVBtMYhoLkMQ1Ek5sqi3eb2O4l7buIvhlRPkmsfZ%2Fibax%2BiruosnpacQUFOOq7Fn5TUypJz%2F1zlnRQr5JSypRVKZRvq6htR%2FewlriTH03vV7ilQ5NwaHRgchM1GY3p6Bq%2BbmpEii9XtWzCgqkhLuXSBTUg4L8XFxUoXk2K57obirH0L%2FocfNQ8V8wE%2BuE0AAAAASUVORK5CYII%3D')",
	
	// showUpdate()
	// shows the user that an update is available
	showUpdate : function(latestVersion) {
		var titleLink	= document.getElementById('greasedLightboxTitleLink');
		titleLink.setAttribute('title', greasedLanguage[greasedLanguage.language][0].update + ' (v' + latestVersion + ')');
		titleLink.innerHTML				= titleLink.innerHTML + ' - ' + greasedLanguage[greasedLanguage.language][0].update + ' (v' + latestVersion + ')';
		var cssStr 						= '#greasedLightboxTitleLink { background-image: ' + greasedLightbox.lightBulbOnIcon + ' !important; }';
		
		var styleSheet					= document.getElementById('greasedLightboxCSS');
		var cssText						= document.createTextNode(cssStr);
		styleSheet.appendChild(cssText);
	},
	
	// init()
	// Function runs on window load, going through link tags looking for links to images.
	// These links receive onclick events that enable the lightbox display for their targets.
	// The function also inserts html markup at the top of the page which will be used as a
	// container for the overlay pattern and the inline image.
	init : function() {
		// initialize localization
		greasedLanguage.init();
		
		// set up list of searchDefs to use based on how includeRegExp matches window.location.href
		var currentURL, searchDefsToUse;
		currentURL			= window.location.href;
		searchDefsToUse		= new Array();
		
		
		for(var i = 0; i < greasedLightbox.searchDefs.length; i++) {
			if(greasedLightbox.searchDefs[i]['includeRegExp'].test(currentURL)) searchDefsToUse.push(greasedLightbox.searchDefs[i]);
		}
		
		if(!searchDefsToUse.length) return;
		
		// set variables
		var links, thisLink, href, lightboxedLinksTotal = 0;
		links 			= document.evaluate('//a[@href]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
		
		for(var i = 0; i < links.snapshotLength; i++) {
			thisLink	= links.snapshotItem(i);
			href		= unescape(thisLink.getAttribute('href'));
		
			// check regularExpressions from searchDefsToUse
			checkLink : for (var ii = 0; ii < searchDefsToUse.length; ii++) {
				
				// for links that reveal larger image's location
				if (!searchDefsToUse[ii]['findImageRegExp']) {
					if(searchDefsToUse[ii]['linkRegExp'].test(href)) {
						if (!searchDefsToUse[ii]['excludeLinkRegExp'] || !searchDefsToUse[ii]['excludeLinkRegExp'].test(href)) {
							if (!(thisLink.getAttribute('rel') && thisLink.getAttribute('rel').toLowerCase().match('lightbox'))) // prevents doubling lightboxes
								thisLink.addEventListener('click', searchDefsToUse[ii]['showFunction'], true);
							this.allImageLinks[lightboxedLinksTotal]						= new Array(3);
							this.allImageLinks[lightboxedLinksTotal]['name']				= searchDefsToUse[ii]['name'];
							this.allImageLinks[lightboxedLinksTotal]['showFunction']		= searchDefsToUse[ii]['showFunction'];
							this.allImageLinks[lightboxedLinksTotal]['link']				= thisLink;
							lightboxedLinksTotal++;
							break checkLink;
						}
					}
				// for links that contain images that reveal larger image's location
				} else if (searchDefsToUse[ii]['findImageRegExp']) {
					if(this.containsThumb(thisLink, searchDefsToUse[ii], false)) {
						if(searchDefsToUse[ii]['linkRegExp'].test(href)) {
							if (!searchDefsToUse[ii]['excludeLinkRegExp'] || !searchDefsToUse[ii]['excludeLinkRegExp'].test(href)) {
								if (!(thisLink.getAttribute('rel') && thisLink.getAttribute('rel').toLowerCase().match('lightbox'))) // prevents doubling lightboxes
									thisLink.addEventListener('click', searchDefsToUse[ii]['showFunction'], true);
								/*for (ii = 0; ii < lightboxedLinksTotal; ii++) {
									if(greasedLightbox.allImageLinks[ii]['link'] == links[i]) break checkLink;
								}*/
								this.allImageLinks[lightboxedLinksTotal]					= new Array(3);
								this.allImageLinks[lightboxedLinksTotal]['name']			= searchDefsToUse[ii]['name'];
								this.allImageLinks[lightboxedLinksTotal]['showFunction']	= searchDefsToUse[ii]['showFunction'];
								this.allImageLinks[lightboxedLinksTotal]['link']			= thisLink;
								lightboxedLinksTotal++;
								break checkLink;
							}
						}
					}
				}
			} // checkLink : for()
		} // for()
		
		if (lightboxedLinksTotal == 0) return;
		
		window.addEventListener('unload', this.unload, false);
		
		var objBody							= document.getElementsByTagName("body").item(0);
		
		var pngOverlay						= "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAPSURBVHjaYmJgYDgDEGAAANsAz1TKIeAAAAAASUVORK5CYII%3D')";
											   
		var lightbulbOffIcon				= "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAAABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJOSURBVDjLlZLdTxJQGMa96K4%2FoPUHdFfrpntyZrXsoq25tlbroi6qi7ZuYsuZ0UXRWiv72NS0gjIgDQ1LS0wkwU%2FUVEREUkEIBBFE%2BV48ve%2FZICza7OLZOTt739%2FznHPeEgAlhZpyB8%2BMLa58HHL63H2zy4muycVku8UZahl2TNJ688%2F6wsbd31yBLps3BNdqFCvrMYRjSURIvOdzzdAcmozWhTaLc%2B8WADXvHHb6RhYCEdEU2kiIJu%2FaBtwEywE3k2lQKjz8NB7Sjs7vygPMDu9ddogmUliNxsWaSGfwM5sViqcy%2BBHeFCl4r6YkzwzTnXlA9%2FSSh924md25qFDszMnmfGuga4pEd3QjiTxAN%2F49xY0c10MgjsuOuSssBdfh8IdBSUG1AibTDmbzAHrhZab6IzHQq6N3xo3%2BLyqY%2B1phMmig%2F9AISolm8yyMdo9IcKtt6HcC%2Bh653uoScTsJ0K65jw5yYrWOOISrol6Kht4pcUV%2Bg0efJwx5ADXtUA3a7aMLflHQoa0VzfTSoHMBUClqwL9EM4Lrb01JOt%2BzZQ7ob%2Fc%2FN1qDDGEHBugKxO6mOS%2BqWswZRb%2Ft9F%2BDxCLHAzQovsfdEyAYXn6d4cHBa7r7NXU%2FbrwbiCpNtsNFJzEnaqp4KjufblDU4XbtJVTJL%2BBqjQynyvZl6e8P%2FnOUC1UtvehWNr%2BBUqlGXX0T7j14gpMVZcFitUUB0ivnBvQ9PQgEgrBYxvBC8QqVxyXz2wboVfKzlSeOxsrLD2VLSyXZY0ck8feN1Ze3Dfgf%2FQJBCig%2B4GhFlwAAAABJRU5ErkJggg%3D%3D')";
		
		// CSS
		var head, styleSheet, cssStr, cssText;
		head = document.getElementsByTagName('head')[0];
		styleSheet						= document.createElement('style');
		styleSheet.setAttribute('id','greasedLightboxCSS');
		styleSheet.setAttribute('type','text/css');
		head.appendChild(styleSheet);
		
		cssStr							= ''+
		'#greasedLightboxOverlay { position: absolute; top: 0; left: 0; z-index: 10000000; width: 100%; background-image: ' + pngOverlay + '; background-repeat: repeat; cursor: pointer; }'+
		
		'#greasedLightboxMenu { position: fixed; top: 0; left: 0; width: 100%; z-index: 10000100; background: #000; font-family: "Terbuchet MS", Tahoma, Arial, Verdana, sans-serif; font-size: 14px; font-weight: bold; height: 35px; line-height: 35px; opacity: .5; }'+
		'#greasedLightboxMenu:hover { opacity: 1; }'+
		'a#greasedLightboxTitleLink { position: absolute; top: 0; left: 0; display: block; height: 35px; line-height: 35px; margin: 0 5px; padding: 0 5px 0 27px; background-image: ' + lightbulbOffIcon + '; background-repeat: no-repeat; background-position: 5px 55%; color: #aaa; background-color: #000; text-decoration: none; cursor: pointer; z-index: 10000450; }'+
		'a#greasedLightboxTitleLink:hover { color: #fff; background-color: #333; }'+
		'#greasedLightboxButtons { position: absolute; top: 0; left: 0; height: 35px; width: 100%; line-height: 35px; margin: 0; padding: 0; z-index: 10000400; }'+
		'#greasedLightboxButtons a { display: block; width: 33px; height: 33px; border: 1px solid #000; background: #000; cursor: pointer; float: right; text-align: center; color: #aaa; z-index: 10000450; }'+
		'#greasedLightboxButtons a:hover { border-color: orange; background-color: #333; color: #fff; }'+
		'#greasedLightboxLoading { position: absolute; z-index: 10000050; color: #fff; font-weight: bold; font-family: "Trebuchet MS", Tahoma, Arial, Verdana, sans-serif; text-align: center; line-height: 2em; }'+
		'p#greasedLightboxLoadingText { margin: 0; padding: 25px 0 5px 0; font-size: 45px; color: #fff; font-weight: bold; font-family: "Trebuchet MS", Tahoma, Arial, Verdana, sans-serif; line-height: 1em; text-align: center; }'+
		'p#greasedLightboxLoadingHelp { margin: 0; padding: 5px 0; font-weight: normal; font-size: 11px; color: #fff; font-family: "Trebuchet MS", Tahoma, Arial, Verdana, sans-serif; line-height: 1em; text-align: center; }'+
		'#greasedLightboxError { position: absolute; z-index: 10000050; text-align: center; background: #000; color: #aaa; padding: 10px; border: 1px solid #444; -moz-border-radius: 10px; font-family: verdana, sans-serif; font-size: 11px; }'+
		'p#greasedLightboxErrorMessage { color: #fff; font-size: 45px; font-weight: bold; margin: 10px 20px; font-family: "Trebuchet MS", Tahoma, Arial, Verdana, sans-serif; text-decoration: none; border: none; text-align: center; }'+
		'#greasedLightboxError a, #greasedLightbox a { color: #aaa; text-decoration: none; border-bottom: 1px solid #777; }'+
		'p#greasedLightboxErrorContext { margin: 0; padding: 5px 0; font-weight: normal; font-size: 11px; color: #fff; font-family: "Trebuchet MS", Tahoma, Arial, Verdana, sans-serif; line-height: 1em; text-align: center; }'+
		'#greasedLightbox { position: absolute; z-index: 10000050; text-align: center; background: #000; color: #aaa; padding: 10px; border: 1px solid #444; -moz-border-radius: 10px; font-family: verdana, sans-serif; font-size: 12px; }'+
		'img#greasedLightboxImage { border: none; cursor: pointer; }'+
		'img#greasedLightboxImage, img#greasedLightboxPreload, img#greasedLightboxPrefetch {  max-height: none; max-width: none; }'+
		'#greasedLightbox, #greasedLightboxMenu, #greasedLightboxOverlay, #greasedLightboxError, #greasedLightboxLoading, img#greasedLightboxPreload, img#greasedLightboxPrefetch { display: none; }'+
		'#greasedLightboxCaption { color: #aaa; padding: 10px 0; }';
		
		cssText							= document.createTextNode(cssStr);
		styleSheet.appendChild(cssText);
		
		// overlay div
		var objOverlay						= document.createElement("div");
		objOverlay.addEventListener('click', greasedLightbox.halt, false);
		objOverlay.setAttribute('id','greasedLightboxOverlay');
		objBody.appendChild(objOverlay);
		
		// menu div
		var objMenu							= document.createElement("div");
		objMenu.setAttribute('id', 'greasedLightboxMenu');
		objBody.appendChild(objMenu);
		
		// title link
		var objMenuLink						= document.createElement("a");
		objMenuLink.setAttribute('id', 'greasedLightboxTitleLink');
		objMenuLink.setAttribute('href', 'http://userscripts.org/users/426977/scripts');
		objMenuLink.innerHTML					= 'Keyser Söze Scripts';
		objMenu.appendChild(objMenuLink);
		
		// menu buttons div
		var objMenuButtons					= document.createElement("div");
		objMenuButtons.setAttribute('id', 'greasedLightboxButtons');
		objMenu.appendChild(objMenuButtons);
		
		// right button
		var objMenuButtonRight				= document.createElement("a");
		objMenuButtonRight.setAttribute('id', 'greasedLightboxButtonRight');
		objMenuButtonRight.setAttribute('title', greasedLanguage[greasedLanguage.language][0].next);
		objMenuButtonRight.innerHTML		= '\u2192';
		objMenuButtonRight.addEventListener('click', function(event) { greasedLightbox.slideShow('stop'); greasedLightbox.moveSlide(event, 1); }, false);
		objMenuButtons.appendChild(objMenuButtonRight);
		
		// left button
		var objMenuButtonLeft				= document.createElement("a");
		objMenuButtonLeft.setAttribute('id', 'greasedLightboxButtonLeft');
		objMenuButtonLeft.setAttribute('title', greasedLanguage[greasedLanguage.language][0].previous);
		objMenuButtonLeft.innerHTML			= '\u2190';
		objMenuButtonLeft.addEventListener('click', function(event) { greasedLightbox.slideShow('stop'); greasedLightbox.moveSlide(event, -1); }, false);
		objMenuButtons.appendChild(objMenuButtonLeft);
		
		// magnify button
		var objMenuButtonPlus				= document.createElement("a");
		objMenuButtonPlus.setAttribute('id', 'greasedLightboxButtonPlus');
		objMenuButtonPlus.setAttribute('title', greasedLanguage[greasedLanguage.language][0].magnify);
		objMenuButtonPlus.innerHTML		= '+';
		objMenuButtonPlus.addEventListener('click', function(event) { greasedLightbox.slideShow('stop'); greasedLightbox.resize(event, 13); }, false);
		objMenuButtons.appendChild(objMenuButtonPlus);
		
		// shrink button
		var objMenuButtonMinus				= document.createElement("a");
		objMenuButtonMinus.setAttribute('id', 'greasedLightboxButtonMinus');
		objMenuButtonMinus.setAttribute('title', greasedLanguage[greasedLanguage.language][0].shrink);
		objMenuButtonMinus.innerHTML		= '-';
		objMenuButtonMinus.addEventListener('click', function(event) { greasedLightbox.slideShow('stop'); greasedLightbox.resize(event, -13); }, false);
		objMenuButtons.appendChild(objMenuButtonMinus);
		
		// slideshow button
		var objMenuButtonShow				= document.createElement('a');
		objMenuButtonShow.setAttribute('id', 'greasedLightboxButtonSlide');
		objMenuButtonShow.setAttribute('title', greasedLanguage[greasedLanguage.language][0].slideshow);
		objMenuButtonShow.innerHTML			= '\u21BB';
		objMenuButtonShow.addEventListener('click', greasedLightbox.slideShow, false);
		objMenuButtons.appendChild(objMenuButtonShow);
		
		// loader div
		var objLoading						= document.createElement("div");
		objLoading.setAttribute('id','greasedLightboxLoading');
		objLoading.addEventListener('click', greasedLightbox.halt, false);
		objBody.appendChild(objLoading);
		
		var loadingGif = document.createElement('img');
		loadingGif.src = "data:image/gif,GIF89a%80%00%80%00%A2%00%00%FF%FF%FF%DD%DD%DD%BB%BB%BB%99%99%99%00%00%FF%00%00%00%00%00%00%00%00%00!%FF%0BNETSCAPE2."+
		"0%03%01%00%00%00!%F9%04%05%05%00%04%00%2C%02%00%02%00%7C%00%7C%00%00%03%FFH%BA%DC%FE0%CA%06*%988%EB%CD%BB_%96%F5%8Ddibax%AEl%AB%A5%A2%2B%CF.%5C%D1x%"+
		"3E%DA%97%EE%FF%12%1EpHT%08%8B%C8G%60%190%1DI%83%E8%20%F9a2K%CF%8FTJ%E5X%AD%A4lg%BB%EDj%BE%D7%9D%0DJ%8E%9A3%E8%B4G%BCis%DF%93%B8%9CC%CF%D8%EFx%12zMsk"+
		"%1E%7FS%81%18%83%850%87%7F%8Apz%8D)%8Fv%91%92q%1D%7D%12%88%98%99%9A%1B%9C%10%88%89%9Fy%93%A2%86%1A%9E%A7%8B%8C%2F%AB%18%A5%AE%A0_%AA%8E%AC%90%B5%B6%"+
		"60%19%A3%0D%AD%BC%AF%A1(%B2%9D%BB%C3%C4h%BF%C7%A4%C9%CA%A8%A9A%CE%0E%B4%D1%BD%7B%10%C0%0A%C2%D8%D2%C5%DB%D5%0C%D7%DF%CB%B7%13%B9%C8%97x%02%EE%02%2B%"+
		"B0%D47%13%DEln%1E%EF%EF'%F2%2B%F6Zd%3A%E8%1Bhb%9A%3Fv%F7%DAp%18%C8%90%84%C1%13%D0%C6%94%CB%C0%B0%E2%08f2%14%02%2Ce%8A%FFb%C5%86U%B4%B5(%B3%91%A3%C0%"+
		"8F%20%CD%CD%E2%08h!%CA%94*%AD%B1l%99%EF%25%C1%98%0Bf%D2%1Ca%F3fL%9D%F8X%F4%D4g%0EhG%17C%F7%0D3%EA%23%A9%3B%5EL%818u%054%C9P%AA%2C%DF%D8%C4%FA%8F%CAK"+
		"%AE%08%15Y%AC%15%F6%13%D1%A5%3Bq%AA%5D%CB%B6%AD%DB%B7p%E3%CA%9DK%B7%AE%DD%BBx%F3B4%DA%F5%1B_a%7F'%16%0D%0C%89%B0%E0h%86%13%F3%FD%A9%B8qV%95%8E%23%F7"+
		"%85*%D9Me%B5%97%BB9f%1BY%AF%E7%CF%A0C%8B%1EM%BA%B4%E9%D3%A8S%AB%C6A%92r%D0Se1%C5~s8P%ED%24%26a%DF%1E2%13%EC%E4%1CUu%F7%06%12%D5wn%E0%C1%5D%0F%9FQ%1C"+
		"q%F2%83%3A1%3FO%F8Xzt%EA%C7%DB6%AFs%5D%EE%F4%95%D5%25%BEv%D1Z%7Cv%F0%BB%EB%05%CC%B8%DERz%99%BF%D5kd%11%91%C3y%F9%F3G%D4%2F%B1%DF~%FF%08%BC%F9%E9%F7_"+
		"I%EDaW%12t%01%3EP%DE3%B3%B9g%DB%80%9A-%A8%20%84%8CAha%7C%90Q%A8!%85~a%B8!%87%CE5%18%8C%88%E4%80%88%16%89%25%26%C8%A0%8A%19%A2%98%93%8B%11%B2%D8!%8C1"+
		"J%08%A0%89%9F%BC%97b%81%F8%C9x%A2%8F%F0%F1%D8%A3%8D%CA%E8%B8%23%91%2B%02)%9C%92%232y%24%92%C6%A55%E4x~%E0H%9B%95%04%60%89%A1%22%5B%06%09%E5%8D4%9Aa%"+
		"A4%97RNY%26%97X%D6x%E6%3ANv%91%A6%9ATr%D7%26%15of%19%26%99q%E6(%A4%7Fs%929%E3Q%EE%7D%89%1Eiu%AAVhj%87%A2%96%E8i%8B%9A%D6%A8%A3%7B%AE%C6'%A0%AE%24%00"+
		"%00!%F9%04%05%05%00%04%00%2C%0A%00%02%00W%000%00%00%03%FFH%BA%DC%FE0%BE%40%83%BC8%EB%3D%2B%E5%60(J%9E7%9E(WVi%EBv%EB%2B%BF%EB7%DFgm%E1%3C%A8%F7%23%8"+
		"1P%90%FA%A1%00H%40k8D%19G%C9%24%8A%C9%CC%D5N%D1%E8%89%DA%1C%3DCYi%90%2B%F4%5EEa%B1%88%DC%F5%9DAi%F5%9A-%FAn%E2%CA%14%9B%E8%8E%C1%E3.%7B!v%19x%2F%82*"+
		"o%1A%86%87%88%1A%84%12xy%8Dd%89~%8B%803%7B%7C%19%90%10%928%8E%18%9E%0F%8C%A1t%9D%8A%91%99%3C%A2%24%AA%11%A6%AD%A8%17%A4%0C%B2%B3%B4%11%B6%0A%A0%40%0"+
		"A%AE0%25%18%B8%3D%9B%B5%B0%0D%BE%BF%C0%BA%10%97%B1%AC%10%03%D4%03%81%CE%C2%C4%D2%0F%D5%D5K%D8G%DB%0D%DD%E4z%952%E2%E3%E4%E5c%5C3%E9%0C%EB%F2%EDm%E8Y"+
		"%18%F2%F3se%3CZ%19%F9%FA%98%09%04%18P%E0%2F%82%EB%0C2C%C8N!%10%86%DD%1C%1E%84HMb%0F%8A%15-%F2%C0%A8%F1%13%22%C3%8E%0F%09%82%0C%99o%E4%C4%86%26IZK%A9"+
		"!%01%00!%F9%04%05%05%00%04%00%2C%1F%00%02%00W%000%00%00%03%FFH%BA%DC%FEKH%01%AB%BD8%EB6%E7%FE%60%A8u%9Dh%9E%22%E9%A1l%5B%A9%92%2B%CF%04L%D1%F8i%E7%7"+
		"C%B8%F7%A2%81p%C0%FA%9D%02%C8%40k8D%19E%C9%24%8A%C9%D4%C1%8EQ%A9%89%DA4%3DAYm%90%2B%F4%5E%A1a%E4%89%DC%05%7D5i%F1%98%9C%3A%83%E3K%B6%CF%BE%89%2B%F3t"+
		"n%7Cpx.lD%1Fo%17~3%87%88%23%83%8B%8C%8Dz%1B%8A%15%93%94%95%19%97%0F~%7F4%87%96%91%98%859%A2%9C%A4%9E%A6%A7%9B%17%9D%0D%99%3C%A8%AF%AA%B1%AC%B3%B4%2F"+
		"%B6%0B%9F%40%0B%BA%10%B0%0A%B2%40%8E%B5*%92%B8%C6%AE%C2%24%18%C5%BF%04%C1%0F%25%CAa.%00%DA%00%18%D4(%D1!%DB%DB%DD%812%CB%20%E2%E9%17%CD%2C%E7%1A%E9%"+
		"F0%E4U8%D8%22%F0%F7%19%F39Q%26%F7%F8%D2%D2%FC%FD%03%D8C%E0%40%828%0C%C6C%C8C%A1%3A%86%09%1D%8E%83HC%E2D%8A3%2Cj%C3X%D1%14%22%C7%88%0A%3F%E6%08)r%A4%"+
		"C0%92%05%17%A2L%B9%D1D%02%00!%F9%04%05%05%00%04%00%2C%3C%00%02%00B%00B%00%00%03%FEH4%3C%FA0%CAI%AB%9D%AD%DD%CD%7B%CD%99'%8E%16%A8%91hj2i%3B%AE%8E%2B"+
		"o%F0l%7F%EB%ADG%B5%2B%FC%82%DD%A3%97%02%02%85%8B%5C%D1x%DC%11I%CC%A6%EE)%8AJo%D4%8E%F5j%CBr%B6A%A1%F7%02F%26M%D0%ADy%5C)%AF%95Z7%92%3D%91%CF%E1%1Bp%"+
		"F8%8D%8E%5B%CDCx%16v%7C%20~Q%80%81%7Ddj%89%0At%0Az%8E%8F%82u%8D%93%90%92%93%94!%8C%7F%9B%8A1%83%97.%01%A6%01%3B%84(%A7%A7%3A%A4%AB%AC%AC7%AF%22%B1%B"+
		"6%AEL)%B6%BB%A9%5C%1E%BB%BC%A0%1B%C0%C1%C2%15%C4%C5%C6%12%C8%B7%CA%14%CC%B1%CE%13%D0%B2%D2%11%D4%AD%D6%D7%D8%A8%DA%10%DC%DE%CB%D0%E1%D3%C8%E4%CF%C4%"+
		"E7%C7%CD%EA%EB%A6%ED%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FA%00%FD%FE%FF%00%03%024%26%B0%A0%C1%7F%A0%0E*4%B8i%A1%C3%81%93%1EJ%04%D0p%A2%C3%84%16%0F%12%C"+
		"C(%03PA%02%00!%F9%04%05%05%00%04%00%2CN%00%0A%000%00W%00%00%03%ECH%BA%BC%F3%A3%C9I%2B%85%D0%EA%7Dq%E6%E0%E6%7Da)%8D%A4%A9%A2%A9Z%B2%91%BB%B2%B2%0B%D"+
		"7%E6%8D%87p%BCs%BA%9F((%B4%10%8B%1D%14r%A8%5CV%8ENF%2F%9A%1CQ'%D3k%03z%E5%AA%04%60%81%91%B6%0B%87%9F%CD%9Ay%5D%C5%A8%D7%EC%B6%CF%04%AF%8F%1F%B2%BA%9"+
		"D%AA%DF%3B%FB~H%80p%7C%83fQ%86%87%7F%89%60%85%8C%8E%86Z%89Z%0A%83%94%0B%80%97%0C%81%9A%95g%9D%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA*%01%AD%AE%AF%B0%B1%B0"+
		"5%B2%B5%B6%AF.%B7%BA%B6%AC%BB%BE%B8%26%BF%C2%01%BD%C3%BB%B9%C6%B7%B4%C9%B2%AB%CE%CF%D0%D1%D2%D3%D4%D52%00%D8%00%A5%D9%DC%A2%DC%DF%DA%9D%E0%DF%E2%E3%"+
		"E4%94%E6%E3%E8%E9%E0Z%EC%ED%EE%EF%DD%F1%F2%D8%F4%F5%EB%F5%E1W%FA%FB%FC%F8%F9%D8%95K%17%8A%A0%B7s%A3%E6QH%00%00!%F9%04%05%05%00%04%00%2CN%00%1F%000%0"+
		"0W%00%00%03%E9H%BA%DC%FEn%C8%01%AB%BDmN%CC%3B%D1%A0'F%608%8Eez%8A%A9%BAb%AD%FBV%B1%3C%93%B5v%D3%B9%BE%E3%3D%CA%2F%13%94%0C%81%BD%231%A8D%B6%9A%8F%1C"+
		"%14R%9B%F2L%D6%AB0%CB%EDz%BF%E0%B0xL.%9B%CF%5C%81z%CDn%BB%DB%B3%B7%7C%CE%5E%D1%EF%F3%13~%0F%1F%F1%FF%02z%80%7Bv%83tq%86oh%8B%8C%8D%8E%8F%90%91%92%93"+
		"%0A%01%96%01f%97%9Ac%9A%9D%98%60%9E%9D%A0%A1%A2%5D%A4%A1%A6%A7%9E%5C%AA%AB%AC%AD%9B%AF%B0%96%B2%B3%A9%B3%9FY%B8%B9%10%00%BE%00%2F%B8%15%BF%BF%C1%B0%"+
		"BD%C4%C5%C6%A7%C8%C9%C07%CC%0F%CE%CA%D0%A5%D2%D3%CF%3B%B1%C3%D8b%D8%BE%DE%DDa%DF%D9_%DFc%E7%E3%E2%EA%D3%E1%EB%E6%EF%5E%E4%EE%CE%E8%F1%5D%E9%EC%F5%FA"+
		"%FB%60%F9%FE%ED%E8%11%23%D3%CF%1E%B8)%09%00%00!%F9%04%05%05%00%04%00%2C%3C%00%3C%00B%00B%00%00%03%F9H%BA%DC%FEP%8DI%AB%BD6%EA%1D%B1%FF%15'r%60%F9%8D"+
		"%E8c%AEY%EAJl%FC%BE%B1%3C%BB%B5y%CF%F9%B9%FF%C0%A0pH%2C%1A%8F%C8%A4r%C9l%3A%9F%D0%A8tJ%10X%05%D4%D7u%9B%1Dm%BF%D8%AE%06%FC%15G%C8%60%B3%03MV3%D8mw%1"+
		"5%5E%96%CF%E9W%FB%1D%1Fv%F3%F3v%7FVz%82F%01%87%017%7FD%88%88%8AxC%8D%8D%3Bt%91%92%87%40l%96%97%89%99u%11%00%A1%00%1C%9C%98A%5C%1A%A2%A2%A4%A5O%AA%AA"+
		"%1B%A5%A6L%AF%AB%B1%ADM%B5%A1%AC%B8K%BA%A3%BC%97%B9%BA%23%B2%B4%C4%22%C6%BE%C8%C9%BDH%BF(%B2%9D%CF%CC%CD%9CJ%D0%D1%CAG%D9%DA%D7%D4%B5%2F%DBE%DD%DE%C"+
		"2%DC%D5%E6%92%E8%E1%E2%E3B%E5)%EFA%F1%F2%DFD%F5%EA%8E%E4%E9.%E7%FC%EDvLb%F7J%8F%83%7Cv%10%CAQ%E8%86%A1%1A%87%0F%0B%1A%7C%00kb%83%04%00!%F9%04%05%05%"+
		"00%04%00%2C%1F%00N%00W%000%00%00%03%FFH%BA%DC%FE0%CA7%EA%988%EB%CD%89%FD%5D(%8E%CDg%5Ed%AAJ%A7%B9%BE%B0%D7%BAq%1D%CE%AD%ADkx%BE%FF%90%DE%09Ht%08i%C5"+
		"%E4%11%94%2C.-M%E5%13%15%05N5%80%2C%E0'%E8%0AFO%8CV%AB%F3z%C1%C7%C9x%5C3%9BIB%F5%3A%DBvwU8%C9%9C%1C%B3%9F%F1H%10%7Bt%13%01%86%01%18~w%2BL%11%83%5B%8"+
		"5%87%86%89%8AQ%8F%90%11%92%92%13%8A%8BE%8F%18%9A%87%94~I%97%A1%A2%88%9C%9D%9F%83%19%A9%AA%AB%A5%40%A0%AF%A9%1A%AC%3F%B5%A8%A2%B8%95%3B%BB%BC%9A%1B%B"+
		"95%A7%1A%B0%C4%C50%C1%C2%9B%CA%B3%CC%CD%91%BD%D0%D1%2B%D3%D4%C3%1C%CB)%D9%DA%CF%DC%BF*%DF%12%C9%1D%DD%22%E5%E6%B7!%E9%1C%C7%1D%E7%E8%EFX%AE%22%F3%F4"+
		"%D7%1D%F7%F8%ED%22%E3B%F4%0B%91O%9F%1BokR%144%E8%89%04%1B%85%FFF%BC%A9%E2l%14%C5(%0B%2F%FE%C8%A8Q%13%07%C7%8E5%3E%82%84!r%E4%8Bj%26%89%84K%A9%20%01%"+
		"00!%F9%04%05%05%00%04%00%2C%0A%00N%00W%000%00%00%03%FFH%BA%DC%0E%10%B8I%AB%BD8%B7%C8%B5%FF%E0%C7%8DRh%9E!9%A2lK%A9%A4%2B%B7%B0%3A%DF%60m%E3%3C%A6%C7"+
		"%BD%E0%E4%B7%12%1A%17%C4%CEq%99%8C%2C%8FM%C8%13%DA%9CR%89%A7%806%20%1Cx%07%99dv%AB%ED%7D%BF%3E%1D%8AL%C6%9D%CF%97Z%8B%BDu%BF%BDi%25%8B%5E%BF%DD%D1qN"+
		".%7Ce%17%02%87%02%18%7FxV%04%84%5C%86%88%87%8A%8BV%8F%90%15%92%92%17%8B%8CK%8F%18%9A%88%94%7FO%97%A1%A2%89%9C%9D%9F%84%19%A9%AA%AB%A5F%A0%AF%A9%1A%A"+
		"CB%B5%A8%A2%B8%95A%BB%BC%9A%1E%B98%A7%1A%B0%C4%C53%C1%C2%9B%CA%B3%CC%CD%91%BD%D0%D1%83%AE%1F%C9%1F%CB%7B%D9%DA%B7%20%DDc%7C!%DB%DC%BF%DE%E5%E6%E1%E2"+
		"%E9%26%C7%20%E7%E8%EF%20%D3%C8%ED%EE%D7%F6%EB%26%F3%FAo%D6%F4cW%CDD%3D~mP%FC%03%E8I%60!%85%F9%0C%02jDm%18E%2B%0B%2F%0A%C9%A8%B1%12%07%C7%8E8%3E%82%9"+
		"C!r%A4%8C%82%26%8D%3C%E3%91%00%00!%F9%04%05%05%00%04%00%2C%02%00%3C%00B%00B%00%00%03%F5H%04%DC%FE%F0%A9I%AB%BD%98%C6%CD%5D%FE%E0%D5%8D%5Ch%82d*%9D%A"+
		"C%A5%BE%40%2BO%B0%3A%DF%F5x%EF%F9%B6%FF%C0%A0pH%2C%1A%8F%C8%A4r%C9l%3A%9F%D0%A8tJ%3D%05%AE%81%AA%0C%CB%D5%9A%B8%E0%AC7%13%06%8F%2F%E5%F0%99%92.%AF%0"+
		"9m%F7%3A%AE%3E%D3%CD%F6%3B%F6%AD%DF%E7%FB%7C%80%81w%3B%02%86%02Fz%85%87%86Et%3F%8C%8CDmA%91%87%8Ex%40%96%97%98WC%9B%8D%20%03%A3%03R%A0%88%A2%A4%A3P%"+
		"A7%A8%19%AA%AAO%A7!%B0%A4N%AD%B4%B5%A5M%B3%B9%B5%BC%A0'%BA%BBK%BD%BE%B0L%C6%C7%B1J%B8%C2%BA%C5%C1%2C%C3%CD%CA%CB%B6I%D6%D7%ABH%DA%DB%C4F%DE%A9%BFG%E"+
		"2%E3%C8%E1%E6%1F%D4%E9%9B%3B%ECE%D27%F0D%F23%F4%F5%91%40%F8%F9%A1%3F%FCo%26%00%0CH%60%60%40%83o%10%AEQx%86aCt%0410K%00%00!%F9%04%05%05%00%04%00%2C%0"+
		"2%00%1F%000%00W%00%00%03%E7H%BA%0C%0E%2C%CAIk%7B%CE%EAM%B1%E7%E0%E6%8Da)%8D%A8%A9%A2%A9Z%B2%AD%CB%C1%B1%AC%D1%A4%7D%E3%98.%F2%0F%DF%0E%08%11v%88E%E3"+
		"%04%A9%AC%00%9B%16%1C4%0A%9B%0E%7B%D6_%26%CB%EDz%BF%E0%B0xL.%9B%CF%A1%80z%CDn%BB%DB%B6%B7%7C%CEv%D1%EFs%15~%0F7%F1%FF%01z%80%7Bv%83tq%86oh%8B%8C%8D%"+
		"8E%8F%90%91%92%93h%02%96%02f%97%9Ac%9A%9D%98%60%9E%9D_%A1%9E%5D%A4%A1Y%A7%A8V%AA%A5S%AD%A2%AF%B0%97%A9%B3%96%AC%B6%9F%B2%B3%5C%B62%03%C0%03%16%BC.%C"+
		"1%C1%15%AD6%C6%C6%14%A7%3E%CB%C7%CD%B1%3A%D0%D1%D2%B7B%D5%C0b%DA%C2a%DD%DE%60%DD%DC%E3%DF%DA%E4%D5c%E5%E2%E7%E6%ED%EC%E9%EE%F1%F0%D0%E8%F5%F6%CB%F8%"+
		"CC%F2%F7%F4%F9%FA%DB%D4%CD%D3wf%9F%86%04%00!%F9%04%09%05%00%04%00%2C%02%00%02%00%7C%00%7C%00%00%03%FFH%BA%DC%FE0%CAI%AB%BD8%EB%CD%BB%FF%60(%8Edi%9Eh"+
		"%AA%AEl%EB%BEp%2C%CFt%0A%DC%40%AD%938%BE%FF%9E%5E%0FH%CC%08%7D%C5%24%E5%88T%3A%1D%CC%E6sJ%88%E6%A8X%2B%96%AA%DDN%BB%5E%A5%F5%1AN%82%CB%C41%DA%1C%5D%"+
		"B3%99%EEt%3B%0E%3C%D3i%EA%BB%CE%AE%8F%E5%FB3%7C%80%12%01%85%01!%82%83%0E%86%86%20%89%8A%0B%8C%92%1Fs%90%10%92%98%1D%95%96%8B%98%99%1BG%9C%11%9E%9E%1"+
		"CC%A2%A3%A4%9F%A8%26%AA%A5%AC%AD%AE%93%B0%24%B2%B3%B4%23%B6%8C%B8%B5%BA%85%BC%22%BE%BF%C0!%C2%C4%C1%B6%C7%B9%AE%CA%CB%A4%CD%BD%B7%D0%CE%87%D3%D6%D7%"+
		"D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%C0%02%E4%E5%E6%E7%E8%E7%DC%E9%EC%ED%E6%DA%EE%F1%ED%D9%F2%F5%EA%D8%F6%F9%02%F4%FA%F5%F0%FD%EE%D6%01L'%AE%A0%C1%83%08%13"+
		"*%5C%C8%B0%A1%C3%87h%06H%1C%00q%C1%C4%8B%10%2Fj%A4%D8pP%A3F%86%1E7*%0C%E9%11!%C9%92%07O%8A4%A8%F2%23%CB%96%13M%C2%94%98r%26%C7%970%13%CE%5C%98%93%E7"+
		"I%87%24%2B%AE%ACH%00%23%D1%A3H%93*%5D%CA%B4%A9%D3%A7P%A3J%9DJ%B5%AA%D5%ABX%B3j%DD%CA%B5%AB%D7%AF%60%C3%16I%00%00%3B";
		loadingGif.style.border					= 'none';
		
		objLoading.appendChild(loadingGif);
		
		// loading text
		var objLoadingText					= document.createElement("p");
		objLoadingText.setAttribute('id','greasedLightboxLoadingText');
		objLoadingText.innerHTML			= greasedLanguage[greasedLanguage.language][0].loading;
		objLoading.appendChild(objLoadingText);
		
		// helper message
		var objLoadingHelp					= document.createElement("p");
		objLoadingHelp.setAttribute('id','greasedLightboxLoadingHelp');
		objLoadingHelp.innerHTML			= greasedLanguage[greasedLanguage.language][0].loadingSub;
		objLoading.appendChild(objLoadingHelp);
		
		// error div
		var objErrorBox						= document.createElement("div");
		objErrorBox.setAttribute('id','greasedLightboxError');
		objBody.appendChild(objErrorBox);
		
		
		// error message
		var objError						= document.createElement("p");
		objError.setAttribute('id','greasedLightboxErrorMessage');
		objError.innerHTML					= greasedLanguage[greasedLanguage.language][0].error +
			'<p id="greasedLightboxErrorContext"></p>';
		objErrorBox.appendChild(objError);
		// lightbox div
		var objLightbox						= document.createElement("div");
		objLightbox.setAttribute('id','greasedLightbox');
		objOverlay.appendChild(objLightbox);
		
		// empty image
		var objImage						= document.createElement("img");
		objImage.addEventListener('click', greasedLightbox.halt, false);
		objImage.setAttribute('id','greasedLightboxImage');
		objLightbox.appendChild(objImage);
		
		// empty preloader
		var objPreload						= document.createElement("img");
		objPreload.setAttribute('id','greasedLightboxPreload');
		objBody.appendChild(objPreload);
		
		// empty prefetcher
		var objPrefetch						= document.createElement("img");
		objPrefetch.setAttribute('id','greasedLightboxPrefetch');
		objPrefetch.addEventListener('error', function() { return false; }, false);
		objBody.appendChild(objPrefetch);
		
		// empty caption
		var objCaption						= document.createElement("div");
		objCaption.setAttribute('id','greasedLightboxCaption');
		objLightbox.appendChild(objCaption);
		
		document.addEventListener('keypress', greasedLightbox.handleKey, true);
		
	}, // init()
	
	// unload
	// runs onunload to clear up possible memory leaks
	unload : function () {
		var objOverlay			= document.getElementById('greasedLightboxOverlay');
		objOverlay.removeEventListener('click', greasedLightbox.halt, false);
		
		var objMenuButtonRight	= document.getElementById('greasedLightboxButtonRight');
		objMenuButtonRight.removeEventListener('click', function(event) { greasedLightbox.moveSlide(event, 1); }, false);
		
		var objMenuButtonLeft	= document.getElementById('greasedLightboxButtonLeft');
		objMenuButtonLeft.removeEventListener('click', function(event) { greasedLightbox.moveSlide(event, -1); }, false);
		
		var objMenuButtonPlus	= document.getElementById('greasedLightboxButtonPlus');
		objMenuButtonPlus.removeEventListener('click', function(event) { greasedLightbox.resize(event, 13); }, false);
		
		var objMenuButtonMinus	= document.getElementById('greasedLightboxButtonMinus');
		objMenuButtonMinus.removeEventListener('click', function(event) { greasedLightbox.resize(event, -13); }, false);
		
		var objLoading			= document.getElementById('greasedLightboxLoading');
		objLoading.removeEventListener('click', greasedLightbox.halt, false);
		
		var objError			= document.getElementById('greasedLightboxErrorMessage');
		objError.removeEventListener('click', greasedLightbox.halt, false);
		
		var objImage			= document.getElementById('greasedLightboxImage');
		objImage.removeEventListener('click', greasedLightbox.halt, false);
		
		var objPrefetch			= document.getElementById('greasedLightboxPrefetch');
		objPrefetch.removeEventListener('error', function() { return false; }, false);
		
		document.removeEventListener('keypress', greasedLightbox.handleKey, true);
		
	} // unload()
} // greasedLightbox
var greasedLanguage = {
	
	// english
	en : [
		{
			loading			: 'Loading image',
			loadingSub		: 'Click anywhere to cancel',
			context			: 'View image in its original context',
			error			: 'Image unavailable',
			next			: 'Next image (right arrow key)',
			previous		: 'Previous image (left arrow key)',
			magnify			: 'Magnify image (+ key)',
			shrink			: 'Shrink image (- key)',
			update			: 'Update available',
			slideshow		: 'Start/stop slideshow'
		}
	], // english
	
	// español
	es : [
		{
			loading			: 'Cargando imagen',
			loadingSub		: 'Click en cualquier sitio para cancelar',
			context			: 'Ver imagen en su contexto original',
			error			: 'La imagen no está disponible',
			next			: 'Siguiente imagen (tecla derecha)',
			previous		: 'Imagen anterior (tecla izquierda)',
			magnify			: 'Aumentar tamaño (tecla +)',
			shrink			: 'Reducir tamaño (tecla -)',
			update			: 'Actualización disponible',
			slideshow		: ''
		}
	], // español
	
	// português (portuguese)
    pt : [
		{
			loading			: 'Carregando imagem',
			loadingSub		: 'Clique em qualquer lugar para cancelar',
			context			: 'Imagem no contexto original',
			error			: 'Imagem indisponível',
			next			: 'Próxima imagem (tecle na seta da direita)',
			previous		: 'Imagem anterior (tecle na seta da esquerda)',
			magnify			: 'Aumente o zoom (tecle +)',
			shrink			: 'Diminua o zoom (tecle -)',
			update			: 'Atualização disponível',
			slideshow		: 'Iniciar/cancelar apresentação'
		}
    ], // português
	
	// deutsch (german)
	de : [
		{
		  	loading			: 'Bild wird geladen',
			loadingSub		: 'Zum Abbrechen irgendwo klicken',
			context			: 'Bild im ursprünglichen Kontext anzeigen',
			error			: 'Bild nicht verfügbar',
			next			: 'Nächstes Bild (Pfeil rechts)',
			previous		: 'Vorheriges Bild (Pfeil links)',
			magnify			: 'Bild vergrößern (+ Taste)',
			shrink			: 'Bild verkleinern (- Taste)',
			update			: 'Aktualisierung verfügbar',
			slideshow		: 'Diashow starten/beenden'
		}
	], // deutsch
	
	// français (french)
	fr : [
		{
			loading			: 'Chargement de l\'image',
			loadingSub		: 'Cliquez n\'importe où pour annuler',
			context			: 'Voir cette image dans son contexte original',
			error			: 'Image indisponible',
			next			: 'Image suivante (Touche flèche droite) ',
			previous		: 'Image précédente (Touche fléche gauche)',
			magnify			: 'Agrandir l\'image (Touche +)',
			shrink			: 'Reduire l\'image (Touche -)',
			update			: 'Mise à jour disponible',
			slideshow		: ''
		}
	], // français
	
	// het Nederlands (dutch)
	nl : [
		{
			loading			: 'Laden',
			loadingSub		: 'Klik ergens om terug te keren',
			context			: 'Bekijk het plaatje in zijn originele context',
			error			: 'Plaatje niet beschikbaar',
			next			: 'Volgend plaatje (rechter pijltjestoets)',
			previous		: 'Vorig plaatje (linker pijltjestoets)',
			magnify			: 'Vergoot plaatje (+ toets)',
			shrink			: 'Verklein plaatje (- toets)',
			update			: 'Update beschikbaar',
			slideshow		: 'Start/stop diavoorstelling'
		}
	], // het Nederlands
	
	// italiano (italian)
	it : [
		{
		  	loading			: 'Scarico immagine',
			loadingSub		: 'Fai clic sullo sfondo per annullare',
			context			: 'Mostra nel suo contesto originale',
			error			: 'Immagine non disponibile',
			next			: 'Successiva (tasto freccia a destra)',
			previous		: 'Precedente (tasto freccia a sinistra)',
			magnify			: 'Ingrandisci (tasto +)',
			shrink			: 'Riduci zoom (tasto -)',
			update			: 'Aggiornamento disponibile',
			slideshow		: 'Avvia/ferma presentazione'
		}
	], // italiano
	
	// ???????? (greek)
	el : [
		{
		  	loading			: '?????a f??t?s??',
			loadingSub		: '?t?p?ste ?p??d?p?te ??a ?a a????sete',
			context			: '?????a ?p???? st? a????? p?a?s?? t??',
			error			: '?????a µ? d?a??s?µ?',
			next			: 'Next image (right arrow key)',
			previous		: 'Previous image (left arrow key)',
			magnify			: 'Magnify image (+ key)',
			shrink			: 'Shrink image (- key)',
			update			: 'Update available',
			slideshow		: ''
		}
	], // ????????
	
	// russki (russian)
	ru : [
		{
		  	loading			: '??????????? ????????',
			loadingSub		: 'Click ???-????, ????? ????? ????????',
			context			: '??????????? ??????? ? ????? ????????????? ??????',
			error			: '??????????? ?????????????',
			next			: 'Next image (right arrow key)',
			previous		: 'Previous image (left arrow key)',
			magnify			: 'Magnify image (+ key)',
			shrink			: 'Shrink image (- key)',
			update			: 'Update available',
			slideshow		: ''
		}
	], // russki
	
	// hungarian
	hu : [
		{
			loading			: 'K\u00E9p bet\u00F6lt\u00E9se',
			loadingSub		: 'Kattints a visszal\u00E9p\u00E9shez',
			context			: 'Megtekint\u00E9s az eredeti k\u00F6rnyezet\u00E9ben',
			error			: 'K\u00E9p nem el\u00E9rhet\u0151',
			next			: 'K\u00F6vetkez\u0150 k\u00E9p (jobbra gomb)',
			previous		: 'El\u0150z\u0150 k\u00E9p (balra gomb)',
			magnify			: 'Nagy\u00EDtás (+ gomb)',
			shrink			: 'Kicsiny\u00EDt\u00E9s (- gomb)',
			update			: 'El\u00E9rhet\u0150 az \u00FAjabb verzi\u00F3',
			slideshow		: ''
		}
	], // hungarian
	
	// finnish
	fi : [
	  {
			loading			: 'Ladataan kuvaa',
			loadingSub		: 'Napsauta kerran keskeyttääksesi',
			context			: 'Näytä kuva alkuperäisessä kontekstissa',
			error			: 'Kuvaa ei saatavissa',
			next     		: 'Seuraava kuva (oikea nuolinäppäin)',
			previous 		: 'Edellinen kuva (vasen nuolinäppäin)',
			magnify  		: 'Suurenna kuvaa (+ näppäin)',
			shrink   		: 'Pienennä kuvaa (- näppäin)',
			update   		: 'Päivitys saatavilla',
			slideshow		: 'Käynnistä/Pysäytä dia esitys'
	  }
	], // finnish
	
	// japanese
	ja : [
		{
		  	loading			: '\u8AAD\u307F\u8FBC\u307F\u4E2D',
			loadingSub		: '\u30AF\u30EA\u30C3\u30AF\u3067\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3059',
			context			: '\u5143\u306E\u753B\u50CF\u3092\u8868\u793A',
			error			: '\u753B\u50CF\u304C\u5B58\u5728\u3057\u307E\u305B\u3093',
			next			: '\u6B21\u306E\u753B\u50CF',
			previous		: '\u524D\u306E\u753B\u50CF',
			magnify			: '\u753B\u50CF\u3092\u62E1\u5927 (+)',
			shrink			: '\u753B\u50CF\u3092\u7E2E\u5C0F (-)',
			update			: '\u65B0\u3057\u3044\u66F4\u65B0\u304C\u3042\u308A\u307E\u3059',
			slideshow		: '\u30B9\u30E9\u30A4\u30C9\u30B7\u30E7\u30FC\u3092\u958B\u59CB\u002F\u505C\u6B62'
		}
	], // japanese 
	
	// chinese (simplified)
	zh : [
		{
		  	loading			: '\u8BFB\u53D6\u56FE\u7247',
			loadingSub		: '\u6309\u4EFB\u610F\u952E\u6765\u53D6\u6D88',
			context			: '\u4EE5\u539F\u6587\u672C\u67E5\u770B\u56FE\u7247',
			error			: '\u56FE\u7247\u4E0D\u53EF\u8BFB',
			next			: '\u4E0B\u4E00\u4E2A\u56FE\u7247 (\u53F3\u952E)',
			previous		: '\u524D\u4E00\u4E2A\u56FE\u7247 (\u56FE\u7247)',
			magnify			: '\u653E\u5927\u56FE\u7247 (+\u952E)',
			shrink			: '\u7F29\u5C0F\u56FE\u7247 (-\u952E)',
			update			: '\u53EF\u63D0\u4F9B\u66F4\u65B0',
			slideshow		: ''
		}
	], // chinese (simplified)
	
    // Chinese (traditional)
	tw : [
		{
			loading			: '\\u8F09\\u5165\\u5716\\u7247\\u4E2D',
			loadingSub		: '\\u6309\\u4EFB\\u610F\\u9375\\u53D6\\u6D88',
			context			: '\\u6253\\u958B\\u5716\\u7247\\u539F\\u59CB\\u7DB2\\u5740',
			error			: '\\u7121\\u6CD5\\u8F09\\u5165\\u5716\\u7247',
			next			: '\\u4E0B\\u4E00\\u5F35\\u5716 (\\u53F3\\u9375)',
			previous		: '\\u4E0A\\u4E00\\u5F35\\u5716 (\\u5DE6\\u9375)',
			magnify			: '\\u653E\\u5927\\u5716\\u7247 (+\\u9375)',
			shrink			: '\\u7E2E\\u5C0F\\u5716\\u7247 (-\\u9375)',
			update			: '\\u6709\\u66F4\\u65B0\\u7248\\u672C',
			slideshow		: '\\u958B\\u59CB/\\u505C\\u6B62\\u5FAA\\u5E8F\\u64AD\\u653E'
		}
	], // Chinese (traditional)
    
    // polish
	pl : [
		{
			loading			: '\u0141aduj\u0119 obraz',
			loadingSub		: 'Kliknij aby przerwa\u010B',
			context			: 'Zobacz obraz w oryginalnym kontek\u015Bcie',
			error			: 'Obraz niedost\u0119pny',
			next			: 'Nast\u0119pny obraz (klawisz \u2192)',
			previous		: 'Poprzedni obraz (klawisz \u2190)',
			magnify			: 'Powi\u0119ksz obraz (klawisz +)',
			shrink			: 'Zmniejsz obraz (klawisz -)',
			update			: 'Dost\u0119pna nowa wersja',
			slideshow		: 'Uruchom/zatrzymaj pokaz slajd\u00F3w'
		}
	], // polish 
	
	// czech
	cs : [
		{
			loading			: 'Nahrávám obrázek',
			loadingSub		: 'Kliknete kamkoliv pro zrušení',
			context			: 'Prohlížet obrázek v orignálním kontextu',
			error			: 'Obrázek není dostupný',
			next			: 'Další obrázek (šipka doprava)',
			previous		: 'Predchozí obrázek (šipka doleva)',
			magnify			: 'Priblížit obrázek (klávesa +)',
			shrink			: 'Oddálit obrázek (klávesa -)',
			update			: 'Je dostupná aktualizace',
			slideshow		: 'Spustit/zastavit slideshow'
		}
	], // czech
	
	// slovak
	sk : [
		{
			loading			: 'Nahrávam obrázok',
			loadingSub		: 'Pre zrušenie kliknite kdekolvek',
			context			: 'Prezriet obrázok v orignálnom kontexte',
			error			: 'Obrázok nie je dostupný',
			next			: 'Další obrázok (šípka doprava)',
			previous		: 'Predchádzajúci obrázok (šípka dolava)',
			magnify			: 'Priblížit obrázok (klávesa +)',
			shrink			: 'Oddialit obrázok (klávesa -)',
			update			: 'Je dostupná aktualizácia',
			slideshow		: ''
		}
	], // slovak
	
	// swedish
	sv : [
		{
			loading			: 'Laddar bild',
			loadingSub		: 'Klicka för att avbryta',
			context			: 'Visa originalbild',
			error			: 'Bild inte tillgänglig',
			next			: 'Nästa bild (höger piltangent)',
			previous		: 'Föregående bild (vänster piltangent)',
			magnify			: 'Förstora bild (+-tangent)',
			shrink			: 'Förminska bild (–tangent)',
			update			: 'Ny uppdatering tillgänglig',
			slideshow		: 'Starta/stoppa bildspel'
		}
	], // swedish
	 
	/* language template
	// 
	 : [
		{
		  	loading			: '',
			loadingSub		: '',
			context			: '',
			error			: '',
			next			: '',
			previous		: '',
			magnify			: '',
			shrink			: '',
			update			: '',
			slideshow		: ''
		}
	], // end 
	*/
	
	// lauguage
	// the correct language for localization is set in init()
	language : null,
	
	// init()
	// sets this.language to the correct value based on navigator.language
	init : function() {
		this.language		= this[navigator.language.substring(0,2)] ? navigator.language.substring(0,2) : 'en';
	} // init()
}; // greasedLanguage
if (document.body) greasedLightbox.init();}

var offInstantSearch = true;

if (offInstantSearch) {
	if (top != self) return;
	var target = document.getElementById("po-off");
	if (!target) return;

	var className = target.className;
	if (!className) return;

	if (/unselected/.test(className))window.location = target.href;}

})();