PageSourceSearch

https://publicaffairs-sme.com/Community/_static/??-eJyVT0sSwiAMvZA…zF4xqsr99Lpf4eYj2VRNPthV222y2Vdr1d1/wAtMpd8

js publicaffairs-sme.com collected 2026-09-24 19:59:12 UTC 221,140 bytes, 3,702 lines download raw bytes

1"function"==typeof jQuery&&jQuery(document).ready(function(a){a("body").on("post-load",function(){window.a2a&&a2a.init_all()})});;
2/* jquery.nicescroll
3-- version 3.5.0 BETA5
4-- copyright 2011-12-13 InuYaksa*2013
5-- licensed under the MIT
6--
7-- http://areaaperta.com/nicescroll
8-- https://github.com/inuyaksa/jquery.nicescroll
9--
10*/
11
12(function(jQuery){
13
14  // globals
15  var domfocus = false;
16  var mousefocus = false;
17  var zoomactive = false;
18  var tabindexcounter = 5000;
19  var ascrailcounter = 2000;
20  var globalmaxzindex = 0;
21  
22  var $ = jQuery;  // sandbox
23 
24  // http://stackoverflow.com/questions/2161159/get-script-path
25  function getScriptPath() {
26    var scripts=document.getElementsByTagName('script');
27    var path=scripts[scripts.length-1].src.split('?')[0];
28    return (path.split('/').length>0) ? path.split('/').slice(0,-1).join('/')+'/' : '';
29  }
30  var scriptpath = getScriptPath();
31  
32  var vendors = ['ms','moz','webkit','o'];
33  
34  var setAnimationFrame = window.requestAnimationFrame||false;
35  var clearAnimationFrame = window.cancelAnimationFrame||false;
36
37  if (!setAnimationFrame) {
38    for(var vx in vendors) {
39      var v = vendors[vx];
40      if (!setAnimationFrame) setAnimationFrame = window[v+'RequestAnimationFrame'];
41      if (!clearAnimationFrame) clearAnimationFrame = window[v+'CancelAnimationFrame']||window[v+'CancelRequestAnimationFrame'];
42    }
43  }
44  
45  var clsMutationObserver = window.MutationObserver || window.WebKitMutationObserver || false;
46  
47  var _globaloptions = {
48      zindex:"auto",
49      cursoropacitymin:0,
50      cursoropacitymax:1,
51      cursorcolor:"#424242",
52      cursorwidth:"5px",
53      cursorborder:"1px solid #fff",
54      cursorborderradius:"5px",
55      scrollspeed:60,
56      mousescrollstep:8*3,
57      touchbehavior:false,
58      hwacceleration:true,
59      usetransition:true,
60      boxzoom:false,
61      dblclickzoom:true,
62      gesturezoom:true,
63      grabcursorenabled:true,
64      autohidemode:true,
65      background:"",
66      iframeautoresize:true,
67      cursorminheight:32,
68      preservenativescrolling:true,
69      railoffset:false,
70      bouncescroll:true,
71      spacebarenabled:true,
72      railpadding:{top:0,right:0,left:0,bottom:0},
73      disableoutline:true,
74      horizrailenabled:true,
75      railalign:"right",
76      railvalign:"bottom",
77      enabletranslate3d:true,
78      enablemousewheel:true,
79      enablekeyboard:true,
80      smoothscroll:true,
81      sensitiverail:true,
82      enablemouselockapi:true,
83//      cursormaxheight:false,
84      cursorfixedheight:false,      
85      directionlockdeadzone:6,
86      hidecursordelay:400,
87      nativeparentscrolling:true,
88      enablescrollonselection:true,
89      overflowx:true,
90      overflowy:true,
91      cursordragspeed:0.3,
92      rtlmode:false,
93      cursordragontouch:false,
94      oneaxismousemode:"auto"
95  }
96  
97  var browserdetected = false;
98  
99  var getBrowserDetection = function() {
100  
101    if (browserdetected) return browserdetected;
102  
103    var domtest = document.createElement('DIV');
104
105    var d = {};
106    
107		d.haspointerlock = "pointerLockElement" in document || "mozPointerLockElement" in document || "webkitPointerLockElement" in document;
108		
109    d.isopera = ("opera" in window);
110    d.isopera12 = (d.isopera&&("getUserMedia" in navigator));
111    d.isoperamini = (Object.prototype.toString.call(window.operamini) === "[object OperaMini]");
112    
113    d.isie = (("all" in document) && ("attachEvent" in domtest) && !d.isopera);
114    d.isieold = (d.isie && !("msInterpolationMode" in domtest.style));  // IE6 and older
115    d.isie7 = d.isie&&!d.isieold&&(!("documentMode" in document)||(document.documentMode==7));
116    d.isie8 = d.isie&&("documentMode" in document)&&(document.documentMode==8);
117    d.isie9 = d.isie&&("performance" in window)&&(document.documentMode>=9);
118    d.isie10 = d.isie&&("performance" in window)&&(document.documentMode>=10);
119    
120    d.isie9mobile = /iemobile.9/i.test(navigator.userAgent);  //wp 7.1 mango
121    if (d.isie9mobile) d.isie9 = false;
122    d.isie7mobile = (!d.isie9mobile&&d.isie7) && /iemobile/i.test(navigator.userAgent);  //wp 7.0
123    
124    d.ismozilla = ("MozAppearance" in domtest.style);
125		
126    d.iswebkit = ("WebkitAppearance" in domtest.style);
127    
128    d.ischrome = ("chrome" in window);
129		d.ischrome22 = (d.ischrome&&d.haspointerlock);
130    d.ischrome26 = (d.ischrome&&("transition" in domtest.style));  // issue with transform detection (maintain prefix)
131    
132    d.cantouch = ("ontouchstart" in document.documentElement)||("ontouchstart" in window);  // detection for Chrome Touch Emulation
133    d.hasmstouch = (window.navigator.msPointerEnabled||false);  // IE10+ pointer events
134		
135    d.ismac = /^mac$/i.test(navigator.platform);
136    
137    d.isios = (d.cantouch && /iphone|ipad|ipod/i.test(navigator.platform));
138    d.isios4 = ((d.isios)&&!("seal" in Object));
139    
140    d.isandroid = (/android/i.test(navigator.userAgent));
141    
142    d.trstyle = false;
143    d.hastransform = false;
144    d.hastranslate3d = false;
145    d.transitionstyle = false;
146    d.hastransition = false;
147    d.transitionend = false;
148    
149    var check = ['transform','msTransform','webkitTransform','MozTransform','OTransform'];
150    for(var a=0;a<check.length;a++){
151      if (typeof domtest.style[check[a]] != "undefined") {
152        d.trstyle = check[a];
153        break;
154      }
155    }
156    d.hastransform = (d.trstyle != false);
157    if (d.hastransform) {
158      domtest.style[d.trstyle] = "translate3d(1px,2px,3px)";
159      d.hastranslate3d = /translate3d/.test(domtest.style[d.trstyle]);
160    }
161    
162    d.transitionstyle = false;
163    d.prefixstyle = '';
164    d.transitionend = false;
165    var check = ['transition','webkitTransition','MozTransition','OTransition','OTransition','msTransition','KhtmlTransition'];
166    var prefix = ['','-webkit-','-moz-','-o-','-o','-ms-','-khtml-'];
167    var evs = ['transitionend','webkitTransitionEnd','transitionend','otransitionend','oTransitionEnd','msTransitionEnd','KhtmlTransitionEnd'];
168    for(var a=0;a<check.length;a++) {
169      if (check[a] in domtest.style) {
170        d.transitionstyle = check[a];
171        d.prefixstyle = prefix[a];
172        d.transitionend = evs[a];
173        break;
174      }
175    }
176    if (d.ischrome26) {  // use always prefix
177      d.prefixstyle = prefix[1];
178    }
179    
180    d.hastransition = (d.transitionstyle);
181    
182    function detectCursorGrab() {      
183      var lst = ['-moz-grab','-webkit-grab','grab'];
184      if ((d.ischrome&&!d.ischrome22)||d.isie) lst=[];  // force setting for IE returns false positive and chrome cursor bug
185      for(var a=0;a<lst.length;a++) {
186        var p = lst[a];
187        domtest.style['cursor']=p;
188        if (domtest.style['cursor']==p) return p;
189      }
190      return 'url(http://www.google.com/intl/en_ALL/mapfiles/openhand.cur),n-resize';  // thank you google for custom cursor!
191    }
192    d.cursorgrabvalue = detectCursorGrab();
193
194    d.hasmousecapture = ("setCapture" in domtest);
195    
196    d.hasMutationObserver = (clsMutationObserver !== false);
197    
198    domtest = null;  //memory released
199
200    browserdetected = d;
201    
202    return d;  
203  }
204  
205  var NiceScrollClass = function(myopt,me) {
206
207    var self = this;
208
209    this.version = '3.5.0 BETA5';
210    this.name = 'nicescroll';
211    
212    this.me = me;
213    
214    this.opt = {
215      doc:$("body"),
216      win:false
217    };
218    
219    $.extend(this.opt,_globaloptions);
220    
221// Options for internal use
222    this.opt.snapbackspeed = 80;
223    
224    if (myopt||false) {
225      for(var a in self.opt) {
226        if (typeof myopt[a] != "undefined") self.opt[a] = myopt[a];
227      }
228    }
229    
230    this.doc = self.opt.doc;
231    this.iddoc = (this.doc&&this.doc[0])?this.doc[0].id||'':'';    
232    this.ispage = /BODY|HTML/.test((self.opt.win)?self.opt.win[0].nodeName:this.doc[0].nodeName);
233    this.haswrapper = (self.opt.win!==false);
234    this.win = self.opt.win||(this.ispage?$(window):this.doc);
235    this.docscroll = (this.ispage&&!this.haswrapper)?$(window):this.win;
236    this.body = $("body");
237    this.viewport = false;
238    
239    this.isfixed = false;
240    
241    this.iframe = false;
242    this.isiframe = ((this.doc[0].nodeName == 'IFRAME') && (this.win[0].nodeName == 'IFRAME'));
243    
244    this.istextarea = (this.win[0].nodeName == 'TEXTAREA');
245    
246    this.forcescreen = false; //force to use screen position on events
247
248    this.canshowonmouseevent = (self.opt.autohidemode!="scroll");
249    
250// Events jump table    
251    this.onmousedown = false;
252    this.onmouseup = false;
253    this.onmousemove = false;
254    this.onmousewheel = false;
255    this.onkeypress = false;
256    this.ongesturezoom = false;
257    this.onclick = false;
258    
259// Nicescroll custom events
260    this.onscrollstart = false;
261    this.onscrollend = false;
262    this.onscrollcancel = false;    
263    
264    this.onzoomin = false;
265    this.onzoomout = false;
266    
267// Let's start!  
268    this.view = false;
269    this.page = false;
270    
271    this.scroll = {x:0,y:0};
272    this.scrollratio = {x:0,y:0};    
273    this.cursorheight = 20;
274    this.scrollvaluemax = 0;
275    
276    this.checkrtlmode = false;
277    
278    this.scrollrunning = false;
279    
280    this.scrollmom = false;
281    
282    this.observer = false;
283    this.observerremover = false;  // observer on parent for remove detection
284    
285    do {
286      this.id = "ascrail"+(ascrailcounter++);
287    } while (document.getElementById(this.id));
288    
289    this.rail = false;
290    this.cursor = false;
291    this.cursorfreezed = false;  
292    this.selectiondrag = false;
293    
294    this.zoom = false;
295    this.zoomactive = false;
296    
297    this.hasfocus = false;
298    this.hasmousefocus = false;
299    
300    this.visibility = true;
301    this.locked = false;
302    this.hidden = false; // rails always hidden
303    this.cursoractive = true; // user can interact with cursors
304    
305    this.overflowx = self.opt.overflowx;
306    this.overflowy = self.opt.overflowy;
307    
308    this.nativescrollingarea = false;
309    this.checkarea = 0;
310    
311    this.events = [];  // event list for unbind
312    
313    this.saved = {};
314    
315    this.delaylist = {};
316    this.synclist = {};
317    
318    this.lastdeltax = 0;
319    this.lastdeltay = 0;
320    
321    this.detected = getBrowserDetection(); 
322    
323    var cap = $.extend({},this.detected);
324 
325    this.canhwscroll = (cap.hastransform&&self.opt.hwacceleration);
326    this.ishwscroll = (this.canhwscroll&&self.haswrapper);
327    
328    this.istouchcapable = false;  // desktop devices with touch screen support
329    
330//## Check Chrome desktop with touch support
331    if (cap.cantouch&&cap.ischrome&&!cap.isios&&!cap.isandroid) {
332      this.istouchcapable = true;
333      cap.cantouch = false;  // parse normal desktop events
334    }    
335
336//## Firefox 18 nightly build (desktop) false positive (or desktop with touch support)
337    if (cap.cantouch&&cap.ismozilla&&!cap.isios&&!cap.isandroid) {
338      this.istouchcapable = true;
339      cap.cantouch = false;  // parse normal desktop events
340    }    
341    
342//## disable MouseLock API on user request
343
344    if (!self.opt.enablemouselockapi) {
345      cap.hasmousecapture = false;
346      cap.haspointerlock = false;
347    }
348    
349    this.delayed = function(name,fn,tm,lazy) {
350      var dd = self.delaylist[name];
351      var nw = (new Date()).getTime();
352      if (!lazy&&dd&&dd.tt) return false;
353      if (dd&&dd.tt) clearTimeout(dd.tt);
354      if (dd&&dd.last+tm>nw&&!dd.tt) {      
355        self.delaylist[name] = {
356          last:nw+tm,
357          tt:setTimeout(function(){self.delaylist[name].tt=0;fn.call();},tm)
358        }
359      }
360      else if (!dd||!dd.tt) {
361        self.delaylist[name] = {
362          last:nw,
363          tt:0
364        }
365        setTimeout(function(){fn.call();},0);
366      }
367    };
368    
369    this.debounced = function(name,fn,tm) {
370      var dd = self.delaylist[name];
371      var nw = (new Date()).getTime();      
372      self.delaylist[name] = fn;
373      if (!dd) {        
374        setTimeout(function(){var fn=self.delaylist[name];self.delaylist[name]=false;fn.call();},tm);
375      }
376    }
377    
378    this.synched = function(name,fn) {
379    
380      function requestSync() {
381        if (self.onsync) return;
382        setAnimationFrame(function(){
383          self.onsync = false;
384          for(name in self.synclist){
385            var fn = self.synclist[name];
386            if (fn) fn.call(self);
387            self.synclist[name] = false;
388          }
389        });
390        self.onsync = true;
391      };    
392    
393      self.synclist[name] = fn;
394      requestSync();
395      return name;
396    };
397    
398    this.unsynched = function(name) {
399      if (self.synclist[name]) self.synclist[name] = false;
400    }
401    
402    this.css = function(el,pars) {  // save & set
403      for(var n in pars) {
404        self.saved.css.push([el,n,el.css(n)]);
405        el.css(n,pars[n]);
406      }
407    };
408    
409    this.scrollTop = function(val) {
410      return (typeof val == "undefined") ? self.getScrollTop() : self.setScrollTop(val);
411    };
412
413    this.scrollLeft = function(val) {
414      return (typeof val == "undefined") ? self.getScrollLeft() : self.setScrollLeft(val);
415    };
416    
417// derived by by Dan Pupius www.pupius.net
418    BezierClass = function(st,ed,spd,p1,p2,p3,p4) {
419      this.st = st;
420      this.ed = ed;
421      this.spd = spd;
422      
423      this.p1 = p1||0;
424      this.p2 = p2||1;
425      this.p3 = p3||0;
426      this.p4 = p4||1;
427      
428      this.ts = (new Date()).getTime();
429      this.df = this.ed-this.st;
430    };
431    BezierClass.prototype = {
432      B2:function(t){ return 3*t*t*(1-t) },
433      B3:function(t){ return 3*t*(1-t)*(1-t) },
434      B4:function(t){ return (1-t)*(1-t)*(1-t) },
435      getNow:function(){
436        var nw = (new Date()).getTime();
437        var pc = 1-((nw-this.ts)/this.spd);
438        var bz = this.B2(pc) + this.B3(pc) + this.B4(pc);
439        return (pc<0) ? this.ed : this.st+Math.round(this.df*bz);
440      },
441      update:function(ed,spd){
442        this.st = this.getNow();
443        this.ed = ed;
444        this.spd = spd;
445        this.ts = (new Date()).getTime();
446        this.df = this.ed-this.st;
447        return this;
448      }
449    };
450    
451    if (this.ishwscroll) {  
452    // hw accelerated scroll
453      this.doc.translate = {x:0,y:0,tx:"0px",ty:"0px"};
454      
455      //this one can help to enable hw accel on ios6 http://indiegamr.com/ios6-html-hardware-acceleration-changes-and-how-to-fix-them/
456      if (cap.hastranslate3d&&cap.isios) this.doc.css("-webkit-backface-visibility","hidden");  // prevent flickering http://stackoverflow.com/questions/3461441/      
457      
458      //derived from http://stackoverflow.com/questions/11236090/
459      function getMatrixValues() {
460        var tr = self.doc.css(cap.trstyle);
461        if (tr&&(tr.substr(0,6)=="matrix")) {
462          return tr.replace(/^.*\((.*)\)$/g, "$1").replace(/px/g,'').split(/, +/);
463        }
464        return false;
465      }
466      
467      this.getScrollTop = function(last) {
468        if (!last) {
469          var mtx = getMatrixValues();
470          if (mtx) return (mtx.length==16) ? -mtx[13] : -mtx[5];  //matrix3d 16 on IE10
471          if (self.timerscroll&&self.timerscroll.bz) return self.timerscroll.bz.getNow();
472        }
473        return self.doc.translate.y;
474      };
475
476      this.getScrollLeft = function(last) {
477        if (!last) {
478          var mtx = getMatrixValues();          
479          if (mtx) return (mtx.length==16) ? -mtx[12] : -mtx[4];  //matrix3d 16 on IE10
480          if (self.timerscroll&&self.timerscroll.bh) return self.timerscroll.bh.getNow();
481        }
482        return self.doc.translate.x;
483      };
484      
485      if (document.createEvent) {
486        this.notifyScrollEvent = function(el) {
487          var e = document.createEvent("UIEvents");
488          e.initUIEvent("scroll", false, true, window, 1);
489          el.dispatchEvent(e);
490        };
491      }
492      else if (document.fireEvent) {
493        this.notifyScrollEvent = function(el) {
494          var e = document.createEventObject();
495          el.fireEvent("onscroll");
496          e.cancelBubble = true; 
497        };
498      }
499      else {
500        this.notifyScrollEvent = function(el,add) {}; //NOPE
501      }
502      
503      if (cap.hastranslate3d&&self.opt.enabletranslate3d) {
504        this.setScrollTop = function(val,silent) {
505          self.doc.translate.y = val;
506          self.doc.translate.ty = (val*-1)+"px";
507          self.doc.css(cap.trstyle,"translate3d("+self.doc.translate.tx+","+self.doc.translate.ty+",0px)");          
508          if (!silent) self.notifyScrollEvent(self.win[0]);
509        };
510        this.setScrollLeft = function(val,silent) {          
511          self.doc.translate.x = val;
512          self.doc.translate.tx = (val*-1)+"px";
513          self.doc.css(cap.trstyle,"translate3d("+self.doc.translate.tx+","+self.doc.translate.ty+",0px)");          
514          if (!silent) self.notifyScrollEvent(self.win[0]);
515        };
516      } else {
517        this.setScrollTop = function(val,silent) {
518          self.doc.translate.y = val;
519          self.doc.translate.ty = (val*-1)+"px";
520          self.doc.css(cap.trstyle,"translate("+self.doc.translate.tx+","+self.doc.translate.ty+")");
521          if (!silent) self.notifyScrollEvent(self.win[0]);          
522        };
523        this.setScrollLeft = function(val,silent) {        
524          self.doc.translate.x = val;
525          self.doc.translate.tx = (val*-1)+"px";
526          self.doc.css(cap.trstyle,"translate("+self.doc.translate.tx+","+self.doc.translate.ty+")");
527          if (!silent) self.notifyScrollEvent(self.win[0]);
528        };
529      }
530    } else {
531    // native scroll
532      this.getScrollTop = function() {
533        return self.docscroll.scrollTop();
534      };
535      this.setScrollTop = function(val) {        
536        return self.docscroll.scrollTop(val);
537      };
538      this.getScrollLeft = function() {
539        return self.docscroll.scrollLeft();
540      };
541      this.setScrollLeft = function(val) {
542        return self.docscroll.scrollLeft(val);
543      };
544    }
545    
546    this.getTarget = function(e) {
547      if (!e) return false;
548      if (e.target) return e.target;
549      if (e.srcElement) return e.srcElement;
550      return false;
551    };
552    
553    this.hasParent = function(e,id) {
554      if (!e) return false;
555      var el = e.target||e.srcElement||e||false;
556      while (el && el.id != id) {
557        el = el.parentNode||false;
558      }
559      return (el!==false);
560    };
561    
562    function getZIndex() {
563      var dom = self.win;
564      if ("zIndex" in dom) return dom.zIndex();  // use jQuery UI method when available
565      while (dom.length>0) {        
566        if (dom[0].nodeType==9) return false;
567        var zi = dom.css('zIndex');        
568        if (!isNaN(zi)&&zi!=0) return parseInt(zi);
569        dom = dom.parent();
570      }
571      return false;
572    };
573    
574//inspired by http://forum.jquery.com/topic/width-includes-border-width-when-set-to-thin-medium-thick-in-ie
575    var _convertBorderWidth = {"thin":1,"medium":3,"thick":5};
576    function getWidthToPixel(dom,prop,chkheight) {
577      var wd = dom.css(prop);
578      var px = parseFloat(wd);
579      if (isNaN(px)) {
580        px = _convertBorderWidth[wd]||0;
581        var brd = (px==3) ? ((chkheight)?(self.win.outerHeight() - self.win.innerHeight()):(self.win.outerWidth() - self.win.innerWidth())) : 1; //DON'T TRUST CSS
582        if (self.isie8&&px) px+=1;
583        return (brd) ? px : 0; 
584      }
585      return px;
586    };
587    
588    this.getOffset = function() {
589      if (self.isfixed) return {top:parseFloat(self.win.css('top')),left:parseFloat(self.win.css('left'))};
590      if (!self.viewport) return self.win.offset();
591      var ww = self.win.offset();
592      var vp = self.viewport.offset();
593      return {top:ww.top-vp.top+self.viewport.scrollTop(),left:ww.left-vp.left+self.viewport.scrollLeft()};
594    };
595    
596    this.updateScrollBar = function(len) {
597      if (self.ishwscroll) {
598        self.rail.css({height:self.win.innerHeight()});
599        if (self.railh) self.railh.css({width:self.win.innerWidth()});
600      } else {
601        var wpos = self.getOffset();
602        var pos = {top:wpos.top,left:wpos.left};
603        pos.top+= getWidthToPixel(self.win,'border-top-width',true);
604        var brd = (self.win.outerWidth() - self.win.innerWidth())/2;
605        pos.left+= (self.rail.align) ? self.win.outerWidth() - getWidthToPixel(self.win,'border-right-width') - self.rail.width : getWidthToPixel(self.win,'border-left-width');
606        
607        var off = self.opt.railoffset;
608        if (off) {
609          if (off.top) pos.top+=off.top;
610          if (self.rail.align&&off.left) pos.left+=off.left;
611        }
612        
613				if (!self.locked) self.rail.css({top:pos.top,left:pos.left,height:(len)?len.h:self.win.innerHeight()});
614				
615				if (self.zoom) {				  
616				  self.zoom.css({top:pos.top+1,left:(self.rail.align==1) ? pos.left-20 : pos.left+self.rail.width+4});
617			  }
618				
619				if (self.railh&&!self.locked) {
620					var pos = {top:wpos.top,left:wpos.left};
621					var y = (self.railh.align) ? pos.top + getWidthToPixel(self.win,'border-top-width',true) + self.win.innerHeight() - self.railh.height : pos.top + getWidthToPixel(self.win,'border-top-width',true);
622					var x = pos.left + getWidthToPixel(self.win,'border-left-width');
623					self.railh.css({top:y,left:x,width:self.railh.width});
624				}
625		
626				
627      }
628    };
629    
630    this.doRailClick = function(e,dbl,hr) {
631
632      var fn,pg,cur,pos;
633      
634//      if (self.rail.drag&&self.rail.drag.pt!=1) return;
635      if (self.locked) return;
636//      if (self.rail.drag) return;
637
638//      self.cancelScroll();       
639      
640      self.cancelEvent(e);
641      
642      if (dbl) {
643        fn = (hr) ? self.doScrollLeft : self.doScrollTop;
644        cur = (hr) ? ((e.pageX - self.railh.offset().left - (self.cursorwidth/2)) * 
644self.scrollratio.x) : ((e.pageY - self.rail.offset().top - (self.cursorheight/2)) * self.scrollratio.y);
645        fn(cur);
646      } else {
647//        console.log(e.pageY);
648        fn = (hr) ? self.doScrollLeftBy : self.doScrollBy;
649        cur = (hr) ? self.scroll.x : self.scroll.y;
650        pos = (hr) ? e.pageX - self.railh.offset().left : e.pageY - self.rail.offset().top;
651        pg = (hr) ? self.view.w : self.view.h;        
652        (cur>=pos) ? fn(pg) : fn(-pg);
653      }
654    
655    }
656    
657    self.hasanimationframe = (setAnimationFrame);
658    self.hascancelanimationframe = (clearAnimationFrame);
659    
660    if (!self.hasanimationframe) {
661      setAnimationFrame=function(fn){return setTimeout(fn,15-Math.floor((+new Date)/1000)%16)}; // 1000/60)};
662      clearAnimationFrame=clearInterval;
663    } 
664    else if (!self.hascancelanimationframe) clearAnimationFrame=function(){self.cancelAnimationFrame=true};
665    
666    this.init = function() {
667
668      self.saved.css = [];
669      
670      if (cap.isie7mobile) return true; // SORRY, DO NOT WORK!
671      if (cap.isoperamini) return true; // SORRY, DO NOT WORK!
672      
673      if (cap.hasmstouch) self.css((self.ispage)?$("html"):self.win,{'-ms-touch-action':'none'});
674      
675      self.zindex = "auto";
676      if (!self.ispage&&self.opt.zindex=="auto") {
677        self.zindex = getZIndex()||"auto";
678      } else {
679        self.zindex = self.opt.zindex;
680      }
681      
682      if (!self.ispage&&self.zindex!="auto") {
683        if (self.zindex>globalmaxzindex) globalmaxzindex=self.zindex;
684      }
685      
686      if (self.isie&&self.zindex==0&&self.opt.zindex=="auto") {  // fix IE auto == 0
687        self.zindex="auto";
688      }
689      
690/*      
691      self.ispage = true;
692      self.haswrapper = true;
693//      self.win = $(window);
694      self.docscroll = $("body");
695//      self.doc = $("body");
696*/
697      
698      if (!self.ispage || (!cap.cantouch && !cap.isieold && !cap.isie9mobile)) {
699      
700        var cont = self.docscroll;
701        if (self.ispage) cont = (self.haswrapper)?self.win:self.doc;
702        
703        if (!cap.isie9mobile) self.css(cont,{'overflow-y':'hidden'});      
704        
705        if (self.ispage&&cap.isie7) {
706          if (self.doc[0].nodeName=='BODY') self.css($("html"),{'overflow-y':'hidden'});  //IE7 double scrollbar issue
707          else if (self.doc[0].nodeName=='HTML') self.css($("body"),{'overflow-y':'hidden'});  //IE7 double scrollbar issue
708        }
709        
710        if (cap.isios&&!self.ispage&&!self.haswrapper) self.css($("body"),{"-webkit-overflow-scrolling":"touch"});  //force hw acceleration
711        
712        var cursor = $(document.createElement('div'));
713        cursor.css({
714          position:"relative",top:0,"float":"right",width:self.opt.cursorwidth,height:"0px",
715          'background-color':self.opt.cursorcolor,
716          border:self.opt.cursorborder,
717          'background-clip':'padding-box',
718          '-webkit-border-radius':self.opt.cursorborderradius,
719          '-moz-border-radius':self.opt.cursorborderradius,
720          'border-radius':self.opt.cursorborderradius
721        });   
722        
723        cursor.hborder = parseFloat(cursor.outerHeight() - cursor.innerHe
723ight());        
724        self.cursor = cursor;        
725        
726        var rail = $(document.createElement('div'));
727        rail.attr('id',self.id);
728        rail.addClass('nicescroll-rails');
729        
730        var v,a,kp = ["left","right"];  //"top","bottom"
731        for(var n in kp) {
732          a=kp[n];
733          v = self.opt.railpadding[a];
734          (v) ? rail.css("padding-"+a,v+"px") : self.opt.railpadding[a] = 0;
735        }
736        
737        rail.append(cursor);
738        
739        rail.width = Math.max(parseFloat(self.opt.cursorwidth),cursor.outerWidth()) + self.opt.railpadding['left'] + self.opt.railpadding['right'];
740        rail.css({width:rail.width+"px",'zIndex':self.zindex,"background":self.opt.background,cursor:"default"});        
741        
742        rail.visibility = true;
743        rail.scrollable = true;
744        
745        rail.align = (self.opt.railalign=="left") ? 0 : 1;
746        
747        self.rail = rail;
748        
749        self.rail.drag = false;
750        
751        var zoom = false;
752        if (self.opt.boxzoom&&!self.ispage&&!cap.isieold) {
753          zoom = document.createElement('div');          
754          self.bind(zoom,"click",self.doZoom);
755          self.zoom = $(zoom);
756          self.zoom.css({"cursor":"pointer",'z-index':self.zindex,'backgroundImage':'url('+scriptpath+'zoomico.png)','height':18,'width':18,'backgroundPosition':'0px 0px'});
757          if (self.opt.dblclickzoom) self.bind(self.win,"dblclick",self.doZoom);
758          if (cap.cantouch&&self.opt.gesturezoom) {
759            self.ongesturezoom = function(e) {
760              if (e.scale>1.5) self.doZoomIn(e);
761              if (e.scale<0.8) self.doZoomOut(e);
762              return self.cancelEvent(e);
763            };
764            self.bind(self.win,"gestureend",self.ongesturezoom);             
765          }
766        }
767        
768// init HORIZ
769
770        self.railh = false;
771
772        if (self.opt.horizrailenabled) {
773
774          self.css(cont,{'overflow-x':'hidden'});
775
776          var cursor = $(document.createElement('div'));
777          cursor.css({
778            position:"relative",top:0,height:self.opt.cursorwidth,width:"0px",
779            'background-color':self.opt.cursorcolor,
780            border:self.opt.cursorborder,
781            'background-clip':'padding-box',
782            '-webkit-border-radius':self.opt.cursorborderradius,
783            '-moz-border-radius':self.opt.cursorborderradius,
784            'border-radius':self.opt.cursorborderradius
785          });   
786          
787          cursor.wborder = parseFloat(cursor.outerWidth() - cursor.innerWidth());
788          self.cursorh = cursor;
789          
790          var railh = $(document.createElement('div'));
791          railh.attr('id',self.id+'-hr');
792          railh.addClass('nicescroll-rails');
793          railh.height = Math.max(parseFloat(self.opt.cursorwidth),cursor.outerHeight());
794          railh.css({height:railh.height+"px",'zIndex':self.zindex,"background":self.opt.background});
795          
796          railh.append(cursor);
797          
798          railh.visibility = true;
799          railh.scrollable = true;
800          
801          railh.align = (self.opt.railvalign=="top") ? 0 : 1;
802          
803          self.railh = railh;
804          
805          self.railh.drag = false;
806          
807        }
808        
809//        
810        
811        if (self.ispage) {
812          rail.css({position:"fixed",top:"0px",height:"100%"});
813          (rail.align) ? rail.css({right:"0px"}) : rail.css({left:"0px"});
814          self.body.append(rail);
815          if (self.railh) {
816            railh.css({position:"fixed",left:"0px",width:"100%"});
817            (railh.align) ? railh.css({bottom:"0px"}) : railh.css({top:"0px"});
818            self.body.append(railh);
819          }
820        } else {          
821          if (self.ishwscroll) {
822            if (self.win.css('position')=='static') self.css(self.win,{'position':'relative'});
823            var bd = (self.win[0].nodeName == 'HTML') ? self.body : self.win;
824            if (self.zoom) {
825              self.zoom.css({position:"absolute",top:1,right:0,"margin-right":rail.width+4});
826              bd.append(self.zoom);
827            }
828            rail.css({position:"absolute",top:0});
829            (rail.align) ? rail.css({right:0}) : rail.css({left:0});
830            bd.append(rail);
831            if (railh) {
832              railh.css({position:"absolute",left:0,bottom:0});
833              (railh.align) ? railh.css({bottom:0}) : railh.css({top:0});
834              bd.append(railh);
835            }
836          } else {
837            self.isfixed = (self.win.css("position")=="fixed");
838            var rlpos = (self.isfixed) ? "fixed" : "absolute";
839            
840            if (!self.isfixed) self.viewport = self.getViewport(self.win[0]);
841            if (self.viewport) {
842              self.body = self.viewport;              
843              if ((/relative|absolute/.test(self.viewport.css("position")))==false) self.css(self.viewport,{"position":"relative"});
844            }            
845            
846            rail.css({position:rlpos});
847            if (self.zoom) self.zoom.css({position:rlpos});
848            self.updateScrollBar();
849            self.body.append(rail);
850            if (self.zoom) self.body.append(self.zoom);
851            if (self.railh) {
852              railh.css({position:rlpos});
853              self.body.append(railh);           
854            }
855          }
856          
857          if (cap.isios) self.css(self.win,{'-webkit-tap-highlight-color':'rgba(0,0,0,0)','-webkit-touch-callout':'none'});  // prevent grey layer on click
858          
859					if (cap.isie&&self.opt.disableoutline) self.win.attr("hideFocus","true");  // IE, prevent dotted rectangle on focused div
860					if (cap.iswebkit&&self.opt.disableoutline) self.win.css({"outline":"none"});
861//          if (cap.isopera&&self.opt.disableoutline) self.win.css({"outline":"0"});  // Opera to test [TODO]
862          
863        }
864        
865        if (self.opt.autohidemode===false) {
866          self.autohidedom = false;
867          self.rail.css({opacity:self.opt.cursoropacitymax});          
868          if (self.railh) self.railh.css({opacity:self.opt.cursoropacitymax});
869        }
870        else if (self.opt.autohidemode===true) {
871          self.autohidedom = $().add(self.rail);          
872          if (cap.isie8) self.autohidedom=self.autohidedom.add(self.cursor);
873          if (self.railh) self.autohidedom=self.autohidedom.add(self.railh);
874          if (self.railh&&cap.isie8) self.autohidedom=self.autohidedom.add(self.cursorh);
875        }
876        else if (self.opt.autohidemode=="scroll") {
877          self.autohidedom = $().add(self.rail);
878          if (self.railh) self.autohidedom=self.autohidedom.add(self.railh);
879        }
880        else if (self.opt.autohidemode=="cursor") {
881          self.autohidedom = $().add(self.cursor);
882          if (self.railh) self.autohidedom=self.autohidedom.add(self.cursorh);
883        }
884        else if (self.opt.autohidemode=="hidden") {
885          self.autohidedom = false;
886          self.hide();
887          self.locked = false;
888        }
889        
890        if (cap.isie9mobile) {
891
892          self.scrollmom = new ScrollMomentumClass2D(self);        
893
894          /*
895          var trace = function(msg) {
896            var db = $("#debug");
897            if (isNaN(msg)&&(typeof msg != "string")) {
898              var x = [];
899              for(var a in msg) {
900                x.push(a+":"+msg[a]);
901              }
902              msg ="{"+x.join(",")+"}";
903            }
904            if (db.children().length>0) {
905              db.children().eq(0).before("<div>"+msg+"</div>");
906            } else {
907              db.append("<div>"+msg+"</div>");
908            }
909          }
910          window.onerror = function(msg,url,ln) {
911            trace("ERR: "+msg+" at "+ln);
912          }
913*/          
914  
915          self.onmangotouch = function(e) {
916            var py = self.getScrollTop();
917            var px = self.getScrollLeft();
918            
919            if ((py == self.scrollmom.lastscrolly)&&(px == self.scrollmom.lastscrollx)) return true;
920//            $("#debug").html('DRAG:'+py);
921
922            var dfy = py-self.mangotouch.sy;
923            var dfx = px-self.mangotouch.sx;            
924            var df = Math.round(Math.sqrt(Math.pow(dfx,2)+Math.pow(dfy,2)));            
925            if (df==0) return;
926            
927            var dry = (dfy<0)?-1:1;
928            var drx = (dfx<0)?-1:1;
929            
930            var tm = +new Date();
931            if (self.mangotouch.lazy) clearTimeout(self.mangotouch.lazy);
932            
933            if (((tm-self.mangotouch.tm)>80)||(self.mangotouch.dry!=dry)||(self.mangotouch.drx!=drx)) {
934//              trace('RESET+'+(tm-self.mangotouch.tm));
935              self.scrollmom.stop();
936              self.scrollmom.reset(px,py);
937              self.mangotouch.sy = py;
938              self.mangotouch.ly = py;
939              self.mangotouch.sx = px;
940              self.mangotouch.lx = px;
941              self.mangotouch.dry = dry;
942              self.mangotouch.drx = drx;
943              self.mangotouch.tm = tm;
944            } else {
945              
946              self.scrollmom.stop();
947              self.scrollmom.update(self.mangotouch.sx-dfx,self.mangotouch.sy-dfy);
948              var gap = tm - self.mangotouch.tm;              
949              self.mangotouch.tm = tm;
950              
951//              trace('MOVE:'+df+" - "+gap);
952              
953              var ds = Math.max(Math.abs(self.mangotouch.ly-py),Math.abs(self.mangotouch.lx-px));
954              self.mangotouch.ly = py;
955              self.mangotouch.lx = px;
956              
957              if (ds>2) {
958                self.mangotouch.lazy = setTimeout(function(){
959//                  trace('END:'+ds+'+'+gap);                  
960                  self.mangotouch.lazy = false;
961                  self.mangotouch.dry = 0;
962                  self.mangotouch.drx = 0;
963                  self.mangotouch.tm = 0;                  
964                  self.scrollmom.doMomentum(30);
965                },100);
966              }
967            }
968          }
969          
970          var top = self.getScrollTop();
971          var lef = self.getScrollLeft();
972          self.mangotouch = {sy:top,ly:top,dry:0,sx:lef,lx:lef,drx:0,lazy:false,tm:0};
973          
974          self.bind(self.docscroll,"scroll",self.onmangotouch);
975        
976        } else {
977        
978          if (cap.cantouch||self.istouchcapable||self.opt.touchbehavior||cap.hasmstouch) {
979          
980            self.scrollmom = new ScrollMomentumClass2D(self);
981          
982            self.ontouchstart = function(e) {
983              if (e.pointerType&&e.pointerType!=2) return false;
984              
985              if (!self.locked) {
986              
987                if (cap.hasmstouch) {
988                  var tg = (e.target) ? e.target : false;
989                  while (tg) {
990                    var nc = $(tg).getNiceScroll();
991                    if ((nc.length>0)&&(nc[0].me == self.me)) break;
992                    if (nc.length>0) return false;
993                    if ((tg.nodeName=='DIV')&&(tg.id==self.id)) break;
994                    tg = (tg.parentNode) ? tg.parentNode : false;
995                  }
996                }
997              
998                self.cancelScroll();
999                
1000                var tg = self.getTarget(e);
1001                
1002                if (tg) {
1003                  var skp = (/INPUT/i.test(tg.nodeName))&&(/range/i.test(tg.type));
1004                  if (skp) return self.stopPropagation(e);
1005                }
1006                
1007                if (!("clientX" in e) && ("changedTouches" in e)) {
1008                  e.clientX = e.changedTouches[0].clientX;
1009                  e.clientY = e.changedTouches[0].clientY;
1010                }
1011                
1012                if (self.forcescreen) {
1013                  var le = e;
1014                  var e = {"original":(e.original)?e.original:e};
1015                  e.clientX = le.screenX;
1016                  e.clientY = le.screenY;    
1017                }
1018                
1019                self.rail.drag = {x:e.clientX,y:e.clientY,sx:self.scroll.x,sy:self.scroll.y,st:self.getScrollTop(),sl:self.getScrollLeft(),pt:2,dl:false};
1020                
1021                if (self.ispage||!self.opt.directionlockdeadzone) {
1022                  self.rail.drag.dl = "f";
1023                } else {
1024                
1025                  var view = {
1026                    w:$(window).width(),
1027                    h:$(window).height()
1028                  };
1029                  
1030                  var page = {
1031                    w:Math.max(document.body.scrollWidth,document.documentElement.scrollWidth),
1032                    h:Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)
1033                  }
1034                  
1035                  var maxh = Math.max(0,page.h - view.h);
1036                  var maxw = Math.max(0,page.w - view.w);                
1037                
1038                  if (!self.rail.scrollable&&self.railh.scrollable) self.rail.drag.ck = (maxh>0) ? "v" : false;
1039                  else if (self.rail.scrollable&&!self.railh.scrollable) self.rail.drag.ck = (maxw>0) ? "h" : false;
1040                  else self.rail.drag.ck = false;
1041                  if (!self.rail.drag.ck) self.rail.drag.dl = "f";
1042                }
1043                
1044                if (self.opt.touchbehavior&&self.isiframe&&cap.isie) {
1045                  var wp = self.win.position();
1046                  self.rail.drag.x+=wp.left;
1047                  self.rail.drag.y+=wp.top;
1048                }
1049                
1050                self.hasmoving = false;
1051                self.lastmouseup = false;
1052                self.scrollmom.reset(e.clientX,e.clientY);
1053                if (!cap.cantouch&&!this.istouchcapable&&!cap.hasmstouch) {
1054                  
1055                  var ip = (tg)?/INPUT|SELECT|TEXTAREA/i.test(tg.nodeName):false;
1056                  if (!ip) {
1057                    if (!self.ispage&&cap.hasmousecapture) tg.setCapture();                   
1058//                  return self.cancelEvent(e);
1059                    return (self.opt.touchbehavior) ? self.cancelEvent(e) : self.stopPropagation(e);
1060                  }
1061                  if (/SUBMIT|CANCEL|BUTTON/i.test($(tg).attr('type'))) {
1062                    pc = {"tg":tg,"click":false};
1063                    self.preventclick = pc;
1064                  }
1065                  
1066                }
1067              }
1068              
1069            };
1070            
1071            self.ontouchend = function(e) {
1072              if (e.pointerType&&e.pointerType!=2) return false;
1073              if (self.rail.drag&&(self.rail.drag.pt==2)) {
1074                self.scrollmom.doMomentum();
1075                self.rail.drag = false;
1076                if (self.hasmoving) {
1077                  self.hasmoving = false;
1078                  self.lastmouseup = true;
1079                  self.hideCursor();
1080                  if (cap.hasmousecapture) document.releaseCapture();
1081                  if (!cap.cantouch) return self.cancelEvent(e);
1082                }                            
1083              }                        
1084              
1085            };
1086            
1087            var moveneedoffset = (self.opt.touchbehavior&&self.isiframe&&!cap.hasmousecapture);
1088            
1089            self.ontouchmove = function(e,byiframe) {
1090              
1091              if (e.pointerType&&e.pointerType!=2) return false;
1092    
1093              if (self.rail.drag&&(self.rail.drag.pt==2)) {
1094                if (cap.cantouch&&(typeof e.original == "undefined")) return true;  // prevent ios "ghost" events by clickable elements
1095              
1096                self.hasmoving = true;
1097
1098                if (self.preventclick&&!self.preventclick.click) {
1099                  self.preventclick.click = self.preventclick.tg.onclick||false;                
1100                  self.preventclick.tg.onclick = self.onpreventclick;
1101                }
1102
1103                var ev = $.extend({"original":e},e);
1104                e = ev;
1105                
1106                if (("changedTouches" in e)) {
1107                  e.clientX = e.changedTouches[0].clientX;
1108                  e.clientY = e.changedTouches[0].clientY;
1109                }                
1110                
1111                if (self.forcescreen) {
1112                  var le = e;
1113                  var e = {"original":(e.original)?e.original:e};
1114                  e.clientX = le.screenX;
1115                  e.clientY = le.screenY;      
1116                }
1117                
1118                var ofx = ofy = 0;
1119                
1120                if (moveneedoffset&&!byiframe) {
1121                  var wp = self.win.position();
1122                  ofx=-wp.left;
1123                  ofy=-wp.top;
1124                }                
1125                
1126                var fy = e.clientY + ofy;
1127                var my = (fy-self.rail.drag.y);
1128                var fx = e.clientX + ofx;
1129                var mx = (fx-self.rail.drag.x);
1130                
1131                var ny = self.rail.drag.st-my;
1132                
1133                if (self.ishwscroll&&self.opt.bouncescroll) {
1134                  if (ny<0) {
1135                    ny = Math.round(ny/2);
1136//                    fy = 0;
1137                  }
1138                  else if (ny>self.page.maxh) {
1139                    ny = self.page.maxh+Math.round((ny-self.page.maxh)/2);
1140//                    fy = 0;
1141                  }
1142                } else {
1143                  if (ny<0) {ny=0;fy=0}
1144                  if (ny>self.page.maxh) {ny=self.page.maxh;fy=0}
1145                }
1146                  
1147                if (self.railh&&self.railh.scrollable) {
1148                  var nx = self.rail.drag.sl-mx;
1149                  
1150                  if (self.ishwscroll&&self.opt.bouncescroll) {                  
1151                    if (nx<0) {
1152                      nx = Math.round(nx/2);
1153//                      fx = 0;
1154                    }
1155                    else if (nx>self.page.maxw) {
1156                      nx = self.page.maxw+Math.round((nx-self.page.maxw)/2);
1157//                      fx = 0;
1158                    }
1159                  } else {
1160                    if (nx<0) {nx=0;fx=0}
1161                    if (nx>self.page.maxw) {nx=self.page.maxw;fx=0}
1162                  }
1163                
1164                }
1165                
1166                var grabbed = false;
1167                if (self.rail.drag.dl) {
1168                  grabbed = true;
1169                  if (self.rail.drag.dl=="v") nx = self.rail.drag.sl;
1170                  else if (self.rail.drag.dl=="h") ny = self.rail.drag.st;                  
1171                } else {
1172                  var ay = Math.abs(my);
1173                  var ax = Math.abs(mx);
1174                  var dz = self.opt.directionlockdeadzone;
1175                  if (self.rail.drag.ck=="v") {    
1176                    if (ay>dz&&(ax<=(ay*0.3))) {
1177                      self.rail.drag = false;                      
1178                      return true;
1179                    }
1180                    else if (ax>dz) {
1181                      self.rail.drag.dl="f";                      
1182                      $("body").scrollTop($("body").scrollTop());  // stop iOS native scrolling (when active javascript has blocked)
1183                    }
1184                  }
1185                  else if (self.rail.drag.ck=="h") {
1186                    if (ax>dz&&(ay<=(ax*0.3))) {
1187                      self.rail.drag = false;                      
1188                      return true;
1189                    }
1190                    else if (ay>dz) {                      
1191                      self.rail.drag.dl="f";
1192                      $("body").scrollLeft($("body").scrollLeft());  // stop iOS native scrolling (when active javascript has blocked)
1193                    }
1194                  }  
1195                }
1196                
1197                self.synched("touchmove",function(){
1198                  if (self.rail.drag&&(self.rail.drag.pt==2)) {
1199                    if (self.prepareTransition) self.prepareTransition(0);
1200                    if (self.rail.scrollable) self.setScrollTop(ny);
1201                    self.scrollmom.update(fx,fy);
1202                    if (self.railh&&self.railh.scrollable) {
1203                      self.setScrollLeft(nx);
1204                      self.showCursor(ny,nx);
1205                    } else {
1206                      self.showCursor(ny);
1207                    }
1208                    if (cap.isie10) document.selection.clear();
1209                  }
1210                });
1211                
1212                if (cap.ischrome&&self.istouchcapable) grabbed=false;  //chrome touch emulation doesn't like!
1213                if (grabbed) return self.cancelEvent(e);
1214              }
1215              
1216            };
1217          
1218          }
1219          
1220          self.onmousedown = function(e,hronly) {    
1221            if (self.rail.drag&&self.rail.drag.pt!=1) return;
1222            if (self.locked) return self.cancelEvent(e);            
1223            self.cancelScroll();              
1224            self.rail.drag = {x:e.clientX,y:e.clientY,sx:self.scroll.x,sy:self.scroll.y,pt:1,hr:(!!hronly)};
1225            var tg = self.getTarget(e);
1226            if (!self.ispage&&cap.hasmousecapture) tg.setCapture();
1227            if (self.isiframe&&!cap.hasmousecapture) {
1228              self.saved["csspointerevents"] = self.doc.css("pointer-events");
1229              self.css(self.doc,{"pointer-events":"none"});
1230            }
1231            return self.cancelEvent(e);
1232          };
1233          
1234          self.onmouseup = function(e) {
1235            if (self.rail.drag) {
1236              if (cap.hasmousecapture) document.releaseCapture();
1237              if (self.isiframe&&!cap.hasmousecapture) self.doc.css("pointer-events",self.saved["csspointerevents"]);
1238              if(self.rail.drag.pt!=1)return;
1239              self.rail.drag = false;
1240              //if (!self.rail.active) self.hideCursor();
1241              return self.cancelEvent(e);
1242            }
1243          };        
1244          
1245          self.onmousemove = function(e) {
1246            if (self.rail.drag) {
1247              if(self.rail.drag.pt!=1)return;
1248              
1249              if (cap.ischrome&&e.which==0) return self.onmouseup(e);
1250              
1251              self.cursorfreezed = true;
1252                  
1253              if (self.rail.drag.hr) {
1254                self.scroll.x = self.rail.drag.sx + (e.clientX-self.rail.drag.x);
1255                if (self.scroll.x<0) self.scroll.x=0;
1256                var mw = self.scrollvaluemaxw;
1257                if (self.scroll.x>mw) self.scroll.x=mw;
1258              } else {                
1259                self.scroll.y = self.rail.drag.sy + (e.clientY-self.rail.drag.y);
1260                if (self.scroll.y<0) self.scroll.y=0;
1261                var my = self.scrollvaluemax;
1262                if (self.scroll.y>my) self.scroll.y=my;
1263              }
1264              
1265              self.synched('mousemove',function(){
1266                if (self.rail.drag&&(self.rail.drag.pt==1)) {
1267                  self.showCursor();
1268                  if (self.rail.drag.hr) self.doScrollLeft(Math.round(self.scroll.x*self.scrollratio.x),self.opt.cursordragspeed);
1269                  else self.doScrollTop(Math.round(self.scroll.y*self.scrollratio.y),self.opt.cursordragspeed);
1270                }
1271              });
1272              
1273              return self.cancelEvent(e);
1274            } 
1275/*              
1276            else {
1277              self.checkarea = true;
1278            }
1279*/              
1280          };          
1281         
1282          if (cap.cantouch||self.opt.touchbehavior) {
1283          
1284            self.onpreventclick = function(e) {
1285              if (self.preventclick) {
1286                self.preventclick.tg.onclick = self.preventclick.click;
1287                self.preventclick = false;            
1288                return self.cancelEvent(e);
1289              }
1290            }
1291          
1292//            self.onmousedown = self.ontouchstart;            
1293//            self.onmouseup = self.ontouchend;
1294//            self.onmousemove = self.ontouchmove;
1295
1296            self.bind(self.win,"mousedown",self.ontouchstart);  // control content dragging
1297
1298            self.onclick = (cap.isios) ? false : function(e) { 
1299              if (self.lastmouseup) {
1300                self.lastmouseup = false;
1301                return self.cancelEvent(e);
1302              } else {
1303                return true;
1304              }
1305            }; 
1306            
1307            if (self.opt.grabcursorenabled&&cap.cursorgrabvalue) {
1308              self.css((self.ispage)?self.doc:self.win,{'cursor':cap.cursorgrabvalue});            
1309              self.css(self.rail,{'cursor':cap.cursorgrabvalue});
1310            }
1311            
1312          } else {
1313
1314            function checkSelectionScroll(e) {
1315              if (!self.selectiondrag) return;
1316              
1317              if (e) {
1318                var ww = self.win.outerHeight();
1319                var df = (e.pageY - self.selectiondrag.top);
1320                if (df>0&&df<ww) df=0;
1321                if (df>=ww) df-=ww;
1322                self.selectiondrag.df = df;                
1323              }
1324              if (self.selectiondrag.df==0) return;
1325              
1326              var rt = -Math.floor(self.selectiondrag.df/6)*2;              
1327//              self.doScrollTop(self.getScrollTop(true)+rt);
1328              self.doScrollBy(rt);
1329              
1330              self.debounced("doselectionscroll",function(){checkSelectionScroll()},50);
1331            }
1332            
1333            if ("getSelection" in document) {  // A grade - Major browsers
1334              self.hasTextSelected = function() {  
1335                return (document.getSelection().rangeCount>0);
1336              }
1337            } 
1338            else if ("selection" in document) {  //IE9-
1339              self.hasTextSelected = function() {
1340                return (document.selection.type != "None");
1341              }
1342            } 
1343            else {
1344              self.hasTextSelected = function() {  // no support
1345                return false;
1346              }
1347            }            
1348            
1349            self.onselectionstart = function(e) {
1350              if (self.ispage) return;
1351              self.selectiondrag = self.win.offset();
1352            }
1353            self.onselectionend = function(e) {
1354              self.selectiondrag = false;
1355            }
1356            self.onselectiondrag = function(e) {              
1357              if (!self.selectiondrag) return;
1358              if (self.hasTextSelected()) self.debounced("selectionscroll",function(){checkSelectionScroll(e)},250);
1359            }
1360            
1361            
1362          }
1363          
1364          if (cap.hasmstouch) {
1365            self.css(self.rail,{'-ms-touch-action':'none'});
1366            self.css(self.cursor,{'-ms-touch-action':'none'});
1367            
1368            self.bind(self.win,"MSPointerDown",self.ontouchstart);
1369            self.bind(document,"MSPointerUp",self.ontouchend);
1370            self.bind(document,"MSPointerMove",self.ontouchmove);
1371            self.bind(self.cursor,"MSGestureHold",function(e){e.preventDefault()});
1372            self.bind(self.cursor,"contextmenu",function(e){e.preventDefault()});
1373          }
1374
1375          if (this.istouchcapable) {  //desktop with screen touch enabled
1376            self.bind(self.win,"touchstart",self.ontouchstart);
1377            self.bind(document,"touchend",self.ontouchend);
1378            self.bind(document,"touchcancel",self.ontouchend);
1379            self.bind(document,"touchmove",self.ontouchmove);            
1380          }
1381          
1382          self.bind(self.cursor,"mousedown",self.onmousedown);
1383          self.bind(self.cursor,"mouseup",self.onmouseup);
1384
1385          if (self.railh) {
1386            self.bind(self.cursorh,"mousedown",function(e){self.onmousedown(e,true)});
1387            self.bind(self.cursorh,"mouseup",function(e){
1388              if (self.rail.drag&&self.rail.drag.pt==2) return;
1389              self.rail.drag = false;
1390              self.hasmoving = false;
1391              self.hideCursor();
1392              if (cap.hasmousecapture) document.releaseCapture();
1393              return self.cancelEvent(e);
1394            });
1395          }
1396		
1397          if (self.opt.cursordragontouch||!cap.cantouch&&!self.opt.touchbehavior) {
1398
1399            self.rail.css({"cursor":"default"});
1400            self.railh&&self.railh.css({"cursor":"default"});          
1401          
1402            self.jqbind(self.rail,"mouseenter",function() {
1403              if (self.canshowonmouseevent) self.showCursor();
1404              self.rail.active = true;
1405            });
1406            self.jqbind(self.rail,"mouseleave",function() { 
1407              self.rail.active = false;
1408              if (!self.rail.drag) self.hideCursor();
1409            });
1410            
1411            if (self.opt.sensitiverail) {
1412              self.bind(self.rail,"click",function(e){self.doRailClick(e,false,false)});
1413              self.bind(self.rail,"dblclick",function(e){self.doRailClick(e,true,false)});
1414              self.bind(self.cursor,"click",function(e){self.cancelEvent(e)});
1415              self.bind(self.cursor,"dblclick",function(e){self.cancelEvent(e)});
1416            }
1417
1418            if (self.railh) {
1419              self.jqbind(self.railh,"mouseenter",function() {
1420                if (self.canshowonmouseevent) self.showCursor();
1421                self.rail.active = true;
1422              });          
1423              self.jqbind(self.railh,"mouseleave",function() { 
1424                self.rail.active = false;
1425                if (!self.rail.drag) self.hideCursor();
1426              });
1427              
1428              if (self.opt.sensitiverail) {
1429                self.bind(self.railh, "click", function(e){self.doRailClick(e,false,true)});
1430                self.bind(self.railh, "dblclick", function(e){self.doRailClick(e, true, true) });
1431                self.bind(self.cursorh, "click", function (e) { self.cancelEvent(e) });
1432                self.bind(self.cursorh, "dblclick", function (e) { self.cancelEvent(e) });
1433              }
1434              
1435            }
1436          
1437          }
1438    
1439          if (!cap.cantouch&&!self.opt.touchbehavior) {
1440
1441            self.bind((cap.hasmousecapture)?self.win:document,"mouseup",self.onmouseup);            
1442            self.bind(document,"mousemove",self.onmousemove);
1443            if (self.onclick) self.bind(document,"click",self.onclick);
1444            
1445            if (!self.ispage&&self.opt.enablescrollonselection) {
1446              self.bind(self.win[0],"mousedown",self.onselectionstart);
1447              self.bind(document,"mouseup",self.onselectionend);
1448              self.bind(self.cursor,"mouseup",self.onselectionend);
1449              if (self.cursorh) self.bind(self.cursorh,"mouseup",self.onselectionend);
1450              self.bind(document,"mousemove",self.onselectiondrag);
1451            }
1452
1453						if (self.zoom) {
1454							self.jqbind(self.zoom,"mouseenter",function() {
1455								if (self.canshowonmouseevent) self.showCursor();
1456								self.rail.active = true;
1457							});          
1458							self.jqbind(self.zoom,"mouseleave",function() { 
1459								self.rail.active = false;
1460								if (!self.rail.drag) self.hideCursor();
1461							});
1462						}
1463
1464          } else {
1465            
1466            self.bind((cap.hasmousecapture)?self.win:document,"mouseup",self.ontouchend);
1467            self.bind(document,"mousemove",self.ontouchmove);
1468            if (self.onclick) self.bind(document,"click",self.onclick);
1469            
1470            if (self.opt.cursordragontouch) {
1471              self.bind(self.cursor,"mousedown",self.onmousedown);
1472              self.bind(self.cursor,"mousemove",self.onmousemove);
1473              self.cursorh&&self.bind(self.cursorh,"mousedown",self.onmousedown);
1474              self.cursorh&&self.bind(self.cursorh,"mousemove",self.onmousemove);
1475            }
1476          
1477          }
1478						
1479					if (self.opt.enablemousewheel) {
1480						if (!self.isiframe) self.bind((cap.isie&&self.ispage) ? document : self.win /*self.docscroll*/ ,"mousewheel",self.onmousewheel);
1481						self.bind(self.rail,"mousewheel",self.onmousewheel);
1482						if (self.railh) self.bind(self.railh,"mousewheel",self.onmousewheelhr);
1483					}						
1484						
1485          if (!self.ispage&&!cap.cantouch&&!(/HTML|BODY/.test(self.win[0].nodeName))) {
1486            if (!self.win.attr("tabindex")) self.win.attr({"tabindex":tabindexcounter++});
1487            
1488            self.jqbind(self.win,"focus",function(e) {
1489              domfocus = (self.getTarget(e)).id||true;
1490              self.hasfocus = true;
1491              if (self.canshowonmouseevent) self.noticeCursor();
1492            });
1493            self.jqbind(self.win,"blur",function(e) {
1494              domfocus = false;
1495              self.hasfocus = false;
1496            });
1497            
1498            self.jqbind(self.win,"mouseenter",function(e) {
1499              mousefocus = (self.getTarget(e)).id||true;
1500              self.hasmousefocus = true;
1501              if (self.canshowonmouseevent) self.noticeCursor();
1502            });
1503            self.jqbind(self.win,"mouseleave",function() {
1504              mousefocus = false;
1505              self.hasmousefocus = false;
1506            });
1507            
1508          };
1509          
1510        }  // !ie9mobile
1511        
1512        //Thanks to http://www.quirksmode.org !!
1513        self.onkeypress = function(e) {
1514          if (self.locked&&self.page.maxh==0) return true;
1515          
1516          e = (e) ? e : window.e;
1517          var tg = self.getTarget(e);
1518          if (tg&&/INPUT|TEXTAREA|SELECT|OPTION/.test(tg.nodeName)) {
1519            var tp = tg.getAttribute('type')||tg.type||false;            
1520            if ((!tp)||!(/submit|button|cancel/i.tp)) return true;
1521          }
1522          
1523          if (self.hasfocus||(self.hasmousefocus&&!domfocus)||(self.ispage&&!domfocus&&!mousefocus)) {
1524            var key = e.keyCode;
1525            
1526            if (self.locked&&key!=27) return self.cancelEvent(e);
1527
1528            var ctrl = e.ctrlKey||false;
1529            var shift = e.shiftKey || false;
1530            
1531            var ret = false;
1532            switch (key) {
1533              case 38:
1534              case 63233: //safari
1535                self.doScrollBy(24*3);
1536                ret = true;
1537                break;
1538              case 40:
1539              case 63235: //safari
1540                self.doScrollBy(-24*3);
1541                ret = true;
1542                break;
1543              case 37:
1544              case 63232: //safari
1545                if (self.railh) {
1546                  (ctrl) ? self.doScrollLeft(0) : self.doScrollLeftBy(24*3);
1547                  ret = true;
1548                }
1549                break;
1550              case 39:
1551              case 63234: //safari
1552                if (self.railh) {
1553                  (ctrl) ? self.doScrollLeft(self.page.maxw) : self.doScrollLeftBy(-24*3);
1554                  ret = true;
1555                }
1556                break;
1557              case 33:
1558              case 63276: // safari
1559                self.doScrollBy(self.view.h);
1560                ret = true;
1561                break;
1562              case 34:
1563              case 63277: // safari
1564                self.doScrollBy(-self.view.h);
1565                ret = true;
1566                break;
1567              case 36:
1568              case 63273: // safari                
1569                (self.railh&&ctrl) ? self.doScrollPos(0,0) : self.doScrollTo(0);
1570                ret = true;
1571                break;
1572              case 35:
1573              case 63275: // safari
1574                (self.railh&&ctrl) ? self.doScrollPos(self.page.maxw,self.page.maxh) : self.doScrollTo(self.page.maxh);
1575                ret = true;
1576                break;
1577              case 32:
1578                if (self.opt.spacebarenabled) {
1579                  (shift) ? self.doScrollBy(self.view.h) : self.doScrollBy(-self.view.h);
1580                  ret = true;
1581                }
1582                break;
1583              case 27: // ESC
1584                if (self.zoomactive) {
1585                  self.doZoom();
1586                  ret = true;
1587                }
1588                break;
1589            }
1590            if (ret) return self.cancelEvent(e);
1591          }
1592        };
1593        
1594        if (self.opt.enablekeyboard) self.bind(document,(cap.isopera&&!cap.isopera12)?"keypress":"keydown",self.onkeypress);
1595        
1596        self.bind(window,'resize',self.lazyResize);
1597        self.bind(window,'orientationchange',self.lazyResize);
1598        
1599        self.bind(window,"load",self.lazyResize);
1600		
1601        if (cap.ischrome&&!self.ispage&&!self.haswrapper) { //chrome void scrollbar bug - it persists in version 26
1602          var tmp=self.win.attr("style");
1603					var ww = parseFloat(self.win.css("width"))+1;
1604          self.win.css('width',ww);
1605          self.synched("chromefix",function(){self.win.attr("style",tmp)});
1606        }
1607        
1608        
1609// Trying a cross-browser implementation - good luck!
1610
1611        self.onAttributeChange = function(e) {
1612          self.lazyResize(250);
1613        }
1614        
1615        if (!self.ispage&&!self.haswrapper) {
1616          // redesigned MutationObserver for Chrome18+/Firefox14+/iOS6+ with support for: remove div, add/remove content
1617          if (clsMutationObserver !== false) {
1618            self.observer = new clsMutationObserver(function(mutations) {            
1619              mutations.forEach(self.onAttributeChange);
1620            });
1621            self.observer.observe(self.win[0],{childList: true, characterData: false, attributes: true, subtree: false});
1622            
1623            self.observerremover = new clsMutationObserver(function(mutations) {
1624               mutations.forEach(function(mo){
1625                 if (mo.removedNodes.length>0) {
1626                   for (var dd in mo.removedNodes) {
1627                     if (mo.removedNodes[dd]==self.win[0]) return self.remove();
1628                   }
1629                 }
1630               });
1631            });
1632            self.observerremover.observe(self.win[0].parentNode,{childList: true, characterData: false, attributes: false, subtree: false});
1633            
1634          } else {        
1635            self.bind(self.win,(cap.isie&&!cap.isie9)?"propertychange":"DOMAttrModified",self.onAttributeChange);            
1636            if (cap.isie9) self.win[0].attachEvent("onpropertychange",self.onAttributeChange); //IE9 DOMAttrModified bug
1637            self.bind(self.win,"DOMNodeRemoved",function(e){
1638              if (e.target==self.win[0]) self.remove();
1639            });
1640          }
1641        }
1642        
1643//
1644
1645        if (!self.ispage&&self.opt.boxzoom) self.bind(window,"resize",self.resizeZoom);
1646        if (self.istextarea) self.bind(self.win,"mouseup",self.lazyResize);
1647        
1648        self.checkrtlmode = true;
1649        self.lazyResize(30);
1650        
1651      }
1652      
1653      if (this.doc[0].nodeName == 'IFRAME') {
1654        function oniframeload(e) {
1655          self.iframexd = false;
1656          try {
1657            var doc = 'contentDocument' in this ? this.contentDocument : this.contentWindow.document;
1658            var a = doc.domain;            
1659          } catch(e){self.iframexd = true;doc=false};
1660          
1661          if (self.iframexd) {
1662            if ("console" in window) console.log('NiceScroll error: policy restriced iframe');
1663            return true;  //cross-domain - I can't manage this        
1664          }
1665          
1666          self.forcescreen = true;
1667          
1668          if (self.isiframe) {            
1669            self.iframe = {
1670              "doc":$(doc),
1671              "html":self.doc.contents().find('html')[0],
1672              "body":self.doc.contents().find('body')[0]
1673            };
1674            self.getContentSize = function(){
1675              return {
1676                w:Math.max(self.iframe.html.scrollWidth,self.iframe.body.scrollWidth),
1677                h:Math.max(self.iframe.html.scrollHeight,self.iframe.body.scrollHeight)
1678              }
1679            }            
1680            self.docscroll = $(self.iframe.body);//$(this.contentWindow);
1681          }
1682          
1683          if (!cap.isios&&self.opt.iframeautoresize&&!self.isiframe) {
1684            self.win.scrollTop(0); // reset position
1685            self.doc.height("");  //reset height to fix browser bug
1686            var hh=Math.max(doc.getElementsByTagName('html')[0].scrollHeight,doc.body.scrollHeight);
1687            self.doc.height(hh);          
1688          }
1689          self.lazyResize(30);
1690          
1691          if (cap.isie7) self.css($(self.iframe.html),{'overflow-y':'hidden'});
1692          //self.css($(doc.body),{'overflow-y':'hidden'});
1693          self.css($(self.iframe.body),{'overflow-y':'hidden'});
1694          
1695          if (cap.isios&&self.haswrapper) {
1696            self.css($(doc.body),{'-webkit-transform':'translate3d(0,0,0)'});  // avoid iFrame content clipping - thanks to http://blog.derraab.com/2012/04/02/avoid-iframe-content-clipping-with-css-transform-on-ios/
1697            
1698            console.log(1);
1699            
1700          }
1701          
1702          if ('contentWindow' in this) {
1703            self.bind(this.contentWindow,"scroll",self.onscroll);  //IE8 & minor
1704          } else {          
1705            self.bind(doc,"scroll",self.onscroll);
1706          }                    
1707          
1708          if (self.opt.enablemousewheel) {
1709            self.bind(doc,"mousewheel",self.onmousewheel);
1710          }
1711          
1712          if (self.opt.enablekeyboard) self.bind(doc,(cap.isopera)?"keypress":"keydown",self.onkeypress);
1713          
1714          if (cap.cantouch||self.opt.touchbehavior) {
1715            self.bind(doc,"mousedown",self.ontouchstart);
1716            self.bind(doc,"mousemove",function(e){self.ontouchmove(e,true)});
1717            if (self.opt.grabcursorenabled&&cap.cursorgrabvalue) self.css($(doc.body),{'cursor':cap.cursorgrabvalue});
1718          }
1719          
1720          self.bind(doc,"mouseup",self.ontouchend);
1721          
1722          if (self.zoom) {
1723            if (self.opt.dblclickzoom) self.bind(doc,'dblclick',self.doZoom);
1724            if (self.ongesturezoom) self.bind(doc,"gestureend",self.ongesturezoom);             
1725          }
1726        };
1727        
1728        if (this.doc[0].readyState&&this.doc[0].readyState=="complete"){
1729          setTimeout(function(){oniframeload.call(self.doc[0],false)},500);
1730        }
1731        self.bind(this.doc,"load",oniframeload);
1732        
1733      }
1734      
1735    };
1736    
1737    this.showCursor = function(py,px) {
1738      if (self.cursortimeout) {
1739        clearTimeout(self.cursortimeout);
1740        self.cursortimeout = 0;
1741      }
1742      if (!self.rail) return;
1743      if (self.autohidedom) {
1744        self.autohidedom.stop().css({opacity:self.opt.cursoropacitymax});
1745        self.cursoractive = true;
1746      }
1747      
1748      if (!self.rail.drag||self.rail.drag.pt!=1) {      
1749        if ((typeof py != "undefined")&&(py!==false)) {
1750          self.scroll.y = Math.round(py * 1/self.scrollratio.y);
1751        }
1752        if (typeof px != "undefined") {
1753          self.scroll.x = Math.round(px * 1/self.scrollratio.x);
1754        }
1755      }
1756      
1757      self.cursor.css({height:self.cursorheight,top:self.scroll.y}); 
1758      if (self.cursorh) {
1759        (!self.rail.align&&self.rail.visibility) ? self.cursorh.css({width:self.cursorwidth,left:self.scroll.x+self.rail.width}) : self.cursorh.css({width:self.cursorwidth,left:self.scroll.x});
1760        self.cursoractive = true;
1761      }
1762      
1763      if (self.zoom) self.zoom.stop().css({opacity:self.opt.cursoropacitymax});      
1764    };
1765    
1766    this.hideCursor = function(tm) {
1767      if (self.cursortimeout) return;
1768      if (!self.rail) return;
1769      if (!self.autohidedom) return;
1770      self.cursortimeout = setTimeout(function() {
1771         if (!self.rail.active||!self.showonmouseevent) {
1772           self.autohidedom.stop().animate({opacity:self.opt.cursoropacitymin});
1773           if (self.zoom) self.zoom.stop().animate({opacity:self.opt.cursoropacitymin});
1774           self.cursoractive = false;
1775         }
1776         self.cursortimeout = 0;
1777      },tm||self.opt.hidecursordelay);
1778    };
1779    
1780    this.noticeCursor = function(tm,py,px) {
1781      self.showCursor(py,px);
1782      if (!self.rail.active) self.hideCursor(tm);
1783    };
1784        
1785    this.getContentSize = 
1786      (self.ispage) ?
1787        function(){
1788          return {
1789            w:Math.max(document.body.scrollWidth,document.documentElement.scrollWidth),
1790            h:Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)
1791          }
1792        }
1793      : (self.haswrapper) ?
1794        function(){
1795          return {
1796            w:self.doc.outerWidth()+parseInt(self.win.css('paddingLeft'))+parseInt(self.win.css('paddingRight')),
1797            h:self.doc.outerHeight()+parseInt(self.win.css('paddingTop'))+parseInt(self.win.css('paddingBottom'))
1798          }
1799        }
1800      : function() {        
1801        return {
1802          w:self.docscroll[0].scrollWidth,
1803          h:self.docscroll[0].scrollHeight
1804        }
1805      };
1806  
1807    this.onResize = function(e,page) {
1808    
1809	  if (!self.win) return false;
1810	
1811      if (!self.haswrapper&&!self.ispage) {
1812        if (self.win.css('display')=='none') {
1813          if (self.visibility) self.hideRail().hideRailHr();
1814          return false;
1815        } else {          
1816          if (!self.hidden&&!self.visibility) self.showRail().showRailHr();
1817        }        
1818      }
1819    
1820      var premaxh = self.page.maxh;
1821      var premaxw = self.page.maxw;
1822
1823      var preview = {h:self.view.h,w:self.view.w};   
1824      
1825      self.view = {
1826        w:(self.ispage) ? self.win.width() : parseInt(self.win[0].clientWidth),
1827        h:(self.ispage) ? self.win.height() : parseInt(self.win[0].clientHeight)
1828      };
1829      
1830      self.page = (page) ? page : self.getContentSize();
1831      
1832      self.page.maxh = Math.max(0,self.page.h - self.view.h);
1833      self.page.maxw = Math.max(0,self.page.w - self.view.w);
1834      
1835      if ((self.page.maxh==premaxh)&&(self.page.maxw==premaxw)&&(self.view.w==preview.w)) {
1836        // test position        
1837        if (!self.ispage) {
1838          var pos = self.win.offset();
1839          if (self.lastposition) {
1840            var lst = self.lastposition;
1841            if ((lst.top==pos.top)&&(lst.left==pos.left)) return self; //nothing to do            
1842          }
1843          self.lastposition = pos;
1844        } else {
1845          return self; //nothing to do
1846        }
1847      }
1848      
1849      if (self.page.maxh==0) {
1850        self.hideRail();        
1851        self.scrollvaluemax = 0;
1852        self.scroll.y = 0;
1853        self.scrollratio.y = 0;
1854        self.cursorheight = 0;
1855        self.setScrollTop(0);
1856        self.rail.scrollable = false;
1857      } else {       
1858        self.rail.scrollable = true;
1859      }
1860      
1861      if (self.page.maxw==0) {
1862        self.hideRailHr();
1863        self.scrollvaluemaxw = 0;
1864        self.scroll.x = 0;
1865        self.scrollratio.x = 0;
1866        self.cursorwidth = 0;
1867        self.setScrollLeft(0);
1868        self.railh.scrollable = false;
1869      } else {        
1870        self.railh.scrollable = true;
1871      }
1872  
1873      self.locked = (self.page.maxh==0)&&(self.page.maxw==0);
1874      if (self.locked) {
1875				if (!self.ispage) self.updateScrollBar(self.view);
1876			  return false;
1877		  }
1878
1879      if (!self.hidden&&!self.visibility) {
1880        self.showRail().showRailHr();
1881      }      
1882      else if (!self.hidden&&!self.railh.visibility) self.showRailHr();
1883      
1884      if (self.istextarea&&self.win.css('resize')&&self.win.css('resize')!='none') self.view.h-=20;      
1885
1886      self.cursorheight = Math.min(self.view.h,Math.round(self.view.h * (self.view.h / self.page.h)));
1887      self.cursorheight = (self.opt.cursorfixedheight) ? self.opt.cursorfixedheight : Math.max(self.opt.cursorminheight,self.cursorheight);
1888
1889      self.cursorwidth = Math.min(self.view.w,Math.round(self.view.w * (self.view.w / self.page.w)));
1890      self.cursorwidth = (self.opt.cursorfixedheight) ? self.opt.cursorfixedheight : Math.max(self.opt.cursorminheight,self.cursorwidth);
1891      
1892      self.scrollvaluemax = self.view.h-self.cursorheight-self.cursor.hborder;
1893      
1894      if (self.railh) {
1895        self.railh.width = (self.page.maxh>0) ? (self.view.w-self.rail.width) : self.view.w;
1896        self.scrollvaluemaxw = self.railh.width-self.cursorwidth-self.cursorh.wborder;
1897      }
1898      
1899      if (self.checkrtlmode&&self.railh) {
1900        self.checkrtlmode = false;
1901        if (self.opt.rtlmode&&self.scroll.x==0) self.setScrollLeft(self.page.maxw);
1902      }
1903      
1904      if (!self.ispage) self.updateScrollBar(self.view);
1905      
1906      self.scrollratio = {
1907        x:(self.page.maxw/self.scrollvaluemaxw),
1908        y:(self.page.maxh/self.scrollvaluemax)
1909      };
1910     
1911      var sy = self.getScrollTop();
1912      if (sy>self.page.maxh) {
1913        self.doScrollTop(self.page.maxh);
1914      } else {     
1915        self.scroll.y = Math.round(self.getScrollTop() * (1/self.scrollratio.y));
1916        self.scroll.x = Math.round(self.getScrollLeft() * (1/self.scrollratio.x));
1917        if (self.cursoractive) self.noticeCursor();     
1918      }      
1919      
1920      if (self.scroll.y&&(self.getScrollTop()==0)) self.doScrollTo(Math.floor(self.scroll.y*self.scrollratio.y));
1921      
1922      return self;
1923    };
1924    
1925    this.resize = self.onResize;
1926    
1927    this.lazyResize = function(tm) {   // event debounce
1928      tm = (isNaN(tm)) ? 30 : tm;
1929      self.delayed('resize',self.resize,tm);
1930      return self;
1931    }
1932   
1933// modified by MDN https://developer.mozilla.org/en-US/docs/DOM/Mozilla_event_reference/wheel
1934    function _modernWheelEvent(dom,name,fn,bubble) {      
1935      self._bind(dom,name,function(e){
1936        var  e = (e) ? e : window.event;
1937        var event = {
1938          original: e,
1939          target: e.target || e.srcElement,
1940          type: "wheel",
1941          deltaMode: e.type == "MozMousePixelScroll" ? 0 : 1,
1942          deltaX: 0,
1943          deltaZ: 0,
1944          preventDefault: function() {
1945            e.preventDefault ? e.preventDefault() : e.returnValue = false;
1946            return false;
1947          },
1948          stopImmediatePropagation: function() {
1949            (e.stopImmediatePropagation) ? e.stopImmediatePropagation() : e.cancelBubble = true;
1950          }
1951        };
1952            
1953        if (name=="mousewheel") {
1954          event.deltaY = - 1/40 * e.wheelDelta;
1955          e.wheelDeltaX && (event.deltaX = - 1/40 * e.wheelDeltaX);
1956        } else {
1957          event.deltaY = e.detail;
1958        }
1959
1960        return fn.call(dom,event);      
1961      },bubble);
1962    };     
1963   
1964    this._bind = function(el,name,fn,bubble) {  // primitive bind
1965      self.events.push({e:el,n:name,f:fn,b:bubble,q:false});
1966      if (el.addEventListener) {
1967        el.addEventListener(name,fn,bubble||false);
1968      }
1969      else if (el.attachEvent) {
1970        el.attachEvent("on"+name,fn);
1971      }
1972      else {
1973        el["on"+name] = fn;        
1974      }        
1975    };
1976   
1977    this.jqbind = function(dom,name,fn) {  // use jquery bind for non-native events (mouseenter/mouseleave)
1978      self.events.push({e:dom,n:name,f:fn,q:true});
1979      $(dom).bind(name,fn);
1980    }
1981   
1982    this.bind = function(dom,name,fn,bubble) {  // touch-oriented & fixing jquery bind
1983      var el = ("jquery" in dom) ? dom[0] : dom;
1984      
1985      if (name=='mousewheel') {
1986        if ("onwheel" in self.win) {            
1987          self._bind(el,"wheel",fn,bubble||false);
1988        } else {            
1989          var wname = (typeof document.onmousewheel != "undefined") ? "mousewheel" : "DOMMouseScroll";  // older IE/Firefox
1990          _modernWheelEvent(el,wname,fn,bubble||false);
1991          if (wname=="DOMMouseScroll") _modernWheelEvent(el,"MozMousePixelScroll",fn,bubble||false);  // Firefox legacy
1992        }
1993      } 
1994      else if (el.addEventListener) {
1995        if (cap.cantouch && /mouseup|mousedown|mousemove/.test(name)) {  // touch device support
1996          var tt=(name=='mousedown')?'touchstart':(name=='mouseup')?'touchend':'touchmove';
1997          self._bind(el,tt,function(e){
1998            if (e.touches) {
1999              if (e.touches.length<2) {var ev=(e.touches.length)?e.touches[0]:e;ev.original=e;fn.call(this,ev);}
2000            } 
2001            else if (e.changedTouches) {var ev=e.changedTouches[0];ev.original=e;fn.call(this,ev);}  //blackberry
2002          },bubble||false);
2003        }
2004        self._bind(el,name,fn,bubble||false);
2005        if (cap.cantouch && name=="mouseup") self._bind(el,"touchcancel",fn,bubble||false);
2006      }
2007      else {
2008        self._bind(el,name,function(e) {
2009          e = e||window.event||false;
2010          if (e) {
2011            if (e.srcElement) e.target=e.srcElement;
2012          }
2013          if (!("pageY" in e)) {
2014            e.pageX = e.clientX + document.documentElement.scrollLeft;
2015            e.pageY = e.clientY + document.documentElement.scrollTop; 
2016          }
2017          return ((fn.call(el,e)===false)||bubble===false) ? self.cancelEvent(e) : true;
2018        });
2019      } 
2020    };
2021    
2022    this._unbind = function(el,name,fn,bub) {  // primitive unbind
2023      if (el.removeEventListener) {
2024        el.removeEventListener(name,fn,bub);
2025      }
2026      else if (el.detachEvent) {
2027        el.detachEvent('on'+name,fn);
2028      } else {
2029        el['on'+name] = false;
2030      }
2031    };
2032    
2033    this.unbindAll = function() {
2034      for(var a=0;a<self.events.length;a++) {
2035        var r = self.events[a];        
2036        (r.q) ? r.e.unbind(r.n,r.f) : self._unbind(r.e,r.n,r.f,r.b);
2037      }
2038    };
2039    
2040    // Thanks to http://www.switchonthecode.com !!
2041    this.cancelEvent = function(e) {
2042      var e = (e.original) ? e.original : (e) ? e : window.event||false;
2043      if (!e) return false;      
2044      if(e.preventDefault) e.preventDefault();
2045      if(e.stopPropagation) e.stopPropagation();
2046      if(e.preventManipulation) e.preventManipulation();  //IE10
2047      e.cancelBubble = true;
2048      e.cancel = true;
2049      e.returnValue = false;
2050      return false;
2051    };
2052
2053    this.stopPropagation = function(e) {
2054      var e = (e.original) ? e.original : (e) ? e : window.event||false;
2055      if (!e) return false;
2056      if (e.stopPropagation) return e.stopPropagation();
2057      if (e.cancelBubble) e.cancelBubble=true;
2058      return false;
2059    }
2060    
2061    this.showRail = function() {
2062      if ((self.page.maxh!=0)&&(self.ispage||self.win.css('display')!='none')) {
2063        self.visibility = true;
2064        self.rail.visibility = true;
2065        self.rail.css('display','block');
2066      }
2067      return self;
2068    };
2069
2070    this.showRailHr = function() {
2071      if (!self.railh) return self;
2072      if ((self.page.maxw!=0)&&(self.ispage||self.win.css('display')!='none')) {
2073        self.railh.visibility = true;
2074        self.railh.css('display','block');
2075      }
2076      return self;
2077    };
2078    
2079    this.hideRail = function() {
2080      self.visibility = false;
2081      self.rail.visibility = false;
2082      self.rail.css('display','none');
2083      return self;
2084    };
2085
2086    this.hideRailHr = function() {
2087      if (!self.railh) return self;
2088      self.railh.visibility = false;
2089      self.railh.css('display','none');
2090      return self;
2091    };
2092    
2093    this.show = function() {
2094      self.hidden = false;
2095      self.locked = false;
2096      return self.showRail().showRailHr();
2097    };
2098
2099    this.hide = function() {
2100      self.hidden = true;
2101      self.locked = true;
2102      return self.hideRail().hideRailHr();
2103    };
2104    
2105    this.toggle = function() {
2106      return (self.hidden) ? self.show() : self.hide();
2107    };
2108    
2109    this.remove = function() {
2110      self.stop();
2111      if (self.cursortimeout) clearTimeout(self.cursortimeout);
2112      self.doZoomOut();
2113      self.unbindAll();     
2114
2115      if (cap.isie9) self.win[0].detachEvent("onpropertychange",self.onAttributeChange); //IE9 DOMAttrModified bug
2116      
2117      if (self.observer !== false) self.observer.disconnect();
2118      if (self.observerremover !== false) self.observerremover.disconnect();      
2119      
2120      self.events = null;
2121      
2122      if (self.cursor) {
2123        self.cursor.remove();
2124      }
2125      if (self.cursorh) {
2126        self.cursorh.remove();
2127      }
2128      if (self.rail) {
2129        self.rail.remove();
2130      }
2131      if (self.railh) {
2132        self.railh.remove();
2133      }
2134      if (self.zoom) {
2135        self.zoom.remove();
2136      }
2137      for(var a=0;a<self.saved.css.length;a++) {
2138        var d=self.saved.css[a];
2139        d[0].css(d[1],(typeof d[2]=="undefined") ? '' : d[2]);
2140      }
2141      self.saved = false;      
2142      self.me.data('__nicescroll',''); //erase all traces
2143      
2144      // memory leak fixed by GianlucaGuarini - thanks a lot!
2145      // remove the current nicescroll from the $.nicescroll array & normalize array
2146      var lst = $.nicescroll;
2147      lst.each(function(i){
2148        if (!this) return;
2149        if(this.id === self.id) {
2150          delete lst[i];          
2151          for(var b=++i;b<lst.length;b++,i++) lst[i]=lst[b];
2152          lst.length--;
2153          if (lst.length) delete lst[lst.length];
2154        }
2155      });      
2156      
2157      for (var i in self) {
2158        self[i] = null;
2159        delete self[i];
2160      }
2161      
2162      self = null;
2163      
2164    };
2165    
2166    this.scrollstart = function(fn) {
2167      this.onscrollstart = fn;
2168      return self;
2169    }
2170    this.scrollend = function(fn) {
2171      this.onscrollend = fn;
2172      return self;
2173    }
2174    this.scrollcancel = function(fn) {
2175      this.onscrollcancel = fn;
2176      return self;
2177    }
2178    
2179    this.zoomin = function(fn) {
2180      this.onzoomin = fn;
2181      return self;
2182    }
2183    this.zoomout = function(fn) {
2184      this.onzoomout = fn;
2185      return self;
2186    }
2187    
2188    this.isScrollable = function(e) {      
2189      var dom = (e.target) ? e.target : e;
2190      if (dom.nodeName == 'OPTION') return true;
2191      while (dom&&(dom.nodeType==1)&&!(/BODY|HTML/.test(dom.nodeName))) {
2192        var dd = $(dom);
2193        var ov = dd.css('overflowY')||dd.css('overflowX')||dd.css('overflow')||'';
2194        if (/scroll|auto/.test(ov)) return (dom.clientHeight!=dom.scrollHeight);
2195        dom = (dom.parentNode) ? dom.parentNode : false;        
2196      }
2197      return false;
2198    };
2199
2200    this.getViewport = function(me) {      
2201      var dom = (me&&me.parentNode) ? me.parentNode : false;
2202      while (dom&&(dom.nodeType==1)&&!(/BODY|HTML/.test(dom.nodeName))) {
2203        var dd = $(dom);
2204        var ov = dd.css('overflowY')||dd.css('overflowX')||dd.css('overflow')||'';
2205        if ((/scroll|auto/.test(ov))&&(dom.clientHeight!=dom.scrollHeight)) return dd;
2206        if (dd.getNiceScroll().length>0) return dd;
2207        dom = (dom.parentNode) ? dom.parentNode : false;
2208      }
2209      return false;
2210    };
2211    
2212    function execScrollWheel(e,hr,chkscroll) {
2213      var px,py;
2214      var rt = 1;
2215      
2216      if (e.deltaMode==0) {  // PIXEL
2217        px = -Math.floor(e.deltaX*(self.opt.mousescrollstep/(18*3)));
2218        py = -Math.floor(e.deltaY*(self.opt.mousescrollstep/(18*3)));
2219      }
2220      else if (e.deltaMode==1) {  // LINE
2221        px = -Math.floor(e.deltaX*self.opt.mousescrollstep);
2222        py = -Math.floor(e.deltaY*self.opt.mousescrollstep);
2223      }
2224      
2225      if (hr&&self.opt.oneaxismousemode&&(px==0)&&py) {  // classic vertical-only mousewheel + browser with x/y support 
2226        px = py;
2227        py = 0;
2228      }
2229
2230      if (px) {
2231        if (self.scrollmom) {self.scrollmom.stop()}
2232        self.lastdeltax+=px;
2233        self.debounced("mousewheelx",function(){var dt=self.lastdeltax;self.lastdeltax=0;if(!self.rail.drag){self.doScrollLeftBy(dt)}},120);
2234      }
2235      if (py) {
2236        if (self.opt.nativeparentscrolling&&chkscroll&&!self.ispage&&!self.zoomactive) {
2237          if (py<0) {
2238            if (self.getScrollTop()>=self.page.maxh) return true;
2239          } else {
2240            if (self.getScrollTop()<=0) return true;
2241          }
2242        }
2243        if (self.scrollmom) {self.scrollmom.stop()}
2244        self.lastdeltay+=py;
2245        self.debounced("mousewheely",function(){var dt=self.lastdeltay;self.lastdeltay=0;if(!self.rail.drag){self.doScrollBy(dt)}},120);
2246      }
2247      
2248      e.stopImmediatePropagation();
2249      return e.preventDefault();
2250//      return self.cancelEvent(e);
2251    };
2252    
2253    this.onmousewheel = function(e) {          
2254      if (self.locked) {
2255        self.debounced("checkunlock",self.resize,250);
2256        return true;
2257      }
2258      if (self.rail.drag) return self.cancelEvent(e);
2259      
2260      if (self.opt.oneaxismousemode=="auto"&&e.deltaX!=0) self.opt.oneaxismousemode = false;  // check two-axis mouse support (not very elegant)
2261      
2262      if (self.opt.oneaxismousemode&&e.deltaX==0) {
2263        if (!self.rail.scrollable) {
2264          if (self.railh&&self.railh.scrollable) {
2265            return self.onmousewheelhr(e);
2266          } else {          
2267            return true;
2268          }
2269        }
2270      }
2271      
2272      var nw = +(new Date());
2273      var chk = false;
2274      if (self.opt.preservenativescrolling&&((self.checkarea+600)<nw)) {
2275//        self.checkarea = false;
2276        self.nativescrollingarea = self.isScrollable(e);
2277        chk = true;
2278      }
2279      self.checkarea = nw;
2280      if (self.nativescrollingarea) return true; // this isn't my business
2281//      if (self.locked) return self.cancelEvent(e);
2282      var ret = execScrollWheel(e,false,chk);
2283      if (ret) self.checkarea = 0;
2284      return ret;
2285    };
2286
2287    this.onmousewheelhr = function(e) {
2288      if (self.locked||!self.railh.scrollable) return true;
2289      if (self.rail.drag) return self.cancelEvent(e);
2290      
2291      var nw = +(new Date());
2292      var chk = false;
2293      if (self.opt.preservenativescrolling&&((self.checkarea+600)<nw)) {
2294//        self.checkarea = false;
2295        self.nativescrollingarea = self.isScrollable(e); 
2296        chk = true;
2297      }
2298      self.checkarea = nw;
2299      if (self.nativescrollingarea) return true; // this isn't my business
2300      if (self.locked) return self.cancelEvent(e);
2301
2302      return execScrollWheel(e,true,chk);
2303    };
2304    
2305    this.stop = function() {
2306      self.cancelScroll();
2307      if (self.scrollmon) self.scrollmon.stop();
2308      self.cursorfreezed = false;
2309      self.scroll.y = Math.round(self.getScrollTop() * (1/self.scrollratio.y));      
2310      self.noticeCursor();
2311      return self;
2312    };
2313    
2314    this.getTransitionSpeed = function(dif) {
2315      var sp = Math.round(self.opt.scrollspeed*10);
2316      var ex = Math.min(sp,Math.round((dif / 20) * self.opt.scrollspeed));
2317      return (ex>
231720) ? ex : 0;
2318    }
2319    
2320    if (!self.opt.smoothscroll) {
2321      this.doScrollLeft = function(x,spd) {  //direct
2322        var y = self.getScrollTop();
2323        self.doScrollPos(x,y,spd);
2324      }      
2325      this.doScrollTop = function(y,spd) {   //direct
2326        var x = self.getScrollLeft();
2327        self.doScrollPos(x,y,spd);
2328      }
2329      this.doScrollPos = function(x,y,spd) {  //direct
2330        var nx = (x>self.page.maxw) ? self.page.maxw : x;
2331        if (nx<0) nx=0;
2332        var ny = (y>self.page.maxh) ? self.page.maxh : y;
2333        if (ny<0) ny=0;
2334        self.synched('scroll',function(){
2335          self.setScrollTop(ny);
2336          self.setScrollLeft(nx);
2337        });
2338      }
2339      this.cancelScroll = function() {}; // direct
2340    } 
2341    else if (self.ishwscroll&&cap.hastransition&&self.opt.usetransition) {
2342      this.prepareTransition = function(dif,istime) {
2343        var ex = (istime) ? ((dif>20)?dif:0) : self.getTransitionSpeed(dif);        
2344        var trans = (ex) ? cap.prefixstyle+'transform '+ex+'ms ease-out' : '';
2345        if (!self.lasttransitionstyle||self.lasttransitionstyle!=trans) {
2346          self.lasttransitionstyle = trans;
2347          self.doc.css(cap.transitionstyle,trans);
2348        }
2349        return ex;
2350      };
2351      
2352      this.doScrollLeft = function(x,spd) {  //trans
2353        var y = (self.scrollrunning) ? self.newscrolly : self.getScrollTop();
2354        self.doScrollPos(x,y,spd);
2355      }      
2356      
2357      this.doScrollTop = function(y,spd) {   //trans
2358        var x = (self.scrollrunning) ? self.newscrollx : self.getScrollLeft();
2359        self.doScrollPos(x,y,spd);
2360      }
2361      
2362      this.doScrollPos = function(x,y,spd) {  //trans
2363   
2364        var py = self.getScrollTop();
2365        var px = self.getScrollLeft();        
2366      
2367        if (((self.newscrolly-py)*(y-py)<0)||((self.newscrollx-px)*(x-px)<0)) self.cancelScroll();  //inverted movement detection      
2368        
2369        if (self.opt.bouncescroll==false) {
2370          if (y<0) y=0;
2371          else if (y>self.page.maxh) y=self.page.maxh;
2372          if (x<0) x=0;
2373          else if (x>self.page.maxw) x=self.page.maxw;
2374        }
2375        
2376        if (self.scrollrunning&&x==self.newscrollx&&y==self.newscrolly) return false;
2377        
2378        self.newscrolly = y;
2379        self.newscrollx = x;
2380        
2381        self.newscrollspeed = spd||false;
2382        
2383        if (self.timer) return false;
2384        
2385        self.timer = setTimeout(function(){
2386        
2387          var top = self.getScrollTop();
2388          var lft = self.getScrollLeft();
2389          
2390          var dst = {};
2391          dst.x = x-lft;
2392          dst.y = y-top;
2393          dst.px = lft;
2394          dst.py = top;
2395          
2396          var dd = Math.round(Math.sqrt(Math.pow(dst.x,2)+Math.pow(dst.y,2)));          
2397          
2398//          var df = (self.newscrollspeed) ? self.newscrollspeed : dd;
2399          
2400          var ms = (self.newscrollspeed && self.newscrollspeed>1) ? self.newscrollspeed : self.getTransitionSpeed(dd);
2401          if (self.newscrollspeed&&self.newscrollspeed<=1) ms*=self.newscrollspeed;
2402          
2403          self.prepareTransition(ms,true);
2404          
2405          if (self.timerscroll&&self.timerscroll.tm) clearInterval(self.timerscroll.tm);    
2406          
2407          if (ms>0) {
2408          
2409            if (!self.scrollrunning&&self.onscrollstart) {
2410              var info = {"type":"scrollstart","current":{"x":lft,"y":top},"request":{"x":x,"y":y},"end":{"x":self.newscrollx,"y":self.newscrolly},"speed":ms};
2411              self.onscrollstart.call(self,info);
2412            }
2413            
2414            if (cap.transitionend) {
2415              if (!self.scrollendtrapped) {
2416                self.scrollendtrapped = true;
2417                self.bind(self.doc,cap.transitionend,self.onScrollEnd,false); //I have got to do something usefull!!
2418              }
2419            } else {              
2420              if (self.scrollendtrapped) clearTimeout(self.scrollendtrapped);
2421              self.scrollendtrapped = setTimeout(self.onScrollEnd,ms);  // simulate transitionend event
2422            }
2423            
2424            var py = top;
2425            var px = lft;
2426            self.timerscroll = {
2427              bz: new BezierClass(py,self.newscrolly,ms,0,0,0.58,1),
2428              bh: new BezierClass(px,self.newscrollx,ms,0,0,0.58,1)
2429            };            
2430            if (!self.cursorfreezed) self.timerscroll.tm=setInterval(function(){self.showCursor(self.getScrollTop(),self.getScrollLeft())},60);
2431            
2432          }
2433          
2434          self.synched("doScroll-set",function(){
2435            self.timer = 0;
2436            if (self.scrollendtrapped) self.scrollrunning = true;
2437            self.setScrollTop(self.newscrolly);
2438            self.setScrollLeft(self.newscrollx);
2439            if (!self.scrollendtrapped) self.onScrollEnd();
2440          });
2441          
2442          
2443        },50);
2444        
2445      };
2446      
2447      this.cancelScroll = function() {
2448        if (!self.scrollendtrapped) return true;        
2449        var py = self.getScrollTop();
2450        var px = self.getScrollLeft();
2451        self.scrollrunning = false;
2452        if (!cap.transitionend) clearTimeout(cap.transitionend);
2453        self.scrollendtrapped = false;
2454        self._unbind(self.doc,cap.transitionend,self.onScrollEnd);        
2455        self.prepareTransition(0);
2456        self.setScrollTop(py); // fire event onscroll
2457        if (self.railh) self.setScrollLeft(px);
2458        if (self.timerscroll&&self.timerscroll.tm) clearInterval(self.timerscroll.tm);
2459        self.timerscroll = false;
2460        
2461        self.cursorfreezed = false;
2462
2463        //self.noticeCursor(false,py,px);
2464        self.showCursor(py,px);
2465        return self;
2466      };
2467      this.onScrollEnd = function() {                
2468        if (self.scrollendtrapped) self._unbind(self.doc,cap.transitionend,self.onScrollEnd);
2469        self.scrollendtrapped = false;        
2470        self.prepareTransition(0);
2471        if (self.timerscroll&&self.timerscroll.tm) clearInterval(self.timerscroll.tm);
2472        self.timerscroll = false;        
2473        var py = self.getScrollTop();
2474        var px = self.getScrollLeft();
2475        self.setScrollTop(py);  // fire event onscroll        
2476        if (self.railh) self.setScrollLeft(px);  // fire event onscroll left
2477        
2478        self.noticeCursor(false,py,px);     
2479        
2480        self.cursorfreezed = false;
2481        
2482        if (py<0) py=0
2483        else if (py>self.page.maxh) py=self.page.maxh;
2484        if (px<0) px=0
2485        else if (px>self.page.maxw) px=self.page.maxw;
2486        if((py!=self.newscrolly)||(px!=self.newscrollx)) return self.doScrollPos(px,py,self.opt.snapbackspeed);
2487        
2488        if (self.onscrollend&&self.scrollrunning) {
2489          var info = {"type":"scrollend","current":{"x":px,"y":py},"end":{"x":self.newscrollx,"y":self.newscrolly}};
2490          self.onscrollend.call(self,info);
2491        } 
2492        self.scrollrunning = false;
2493        
2494      };
2495
2496    } else {
2497
2498      this.doScrollLeft = function(x,spd) {  //no-trans
2499        var y = (self.scrollrunning) ? self.newscrolly : self.getScrollTop();
2500        self.doScrollPos(x,y,spd);
2501      }
2502
2503      this.doScrollTop = function(y,spd) {  //no-trans
2504        var x = (self.scrollrunning) ? self.newscrollx : self.getScrollLeft();
2505        self.doScrollPos(x,y,spd);
2506      }
2507
2508      this.doScrollPos = function(x,y,spd) {  //no-trans
2509        var y = ((typeof y == "undefined")||(y===false)) ? self.getScrollTop(true) : y;
2510      
2511        if  ((self.timer)&&(self.newscrolly==y)&&(self.newscrollx==x)) return true;
2512      
2513        if (self.timer) clearAnimationFrame(self.timer);
2514        self.timer = 0;      
2515
2516        var py = self.getScrollTop();
2517        var px = self.getScrollLeft();
2518        
2519        if (((self.newscrolly-py)*(y-py)<0)||((self.newscrollx-px)*(x-px)<0)) self.cancelScroll();  //inverted movement detection
2520        
2521        self.newscrolly = y;
2522        self.newscrollx = x;
2523        
2524        if (!self.bouncescroll||!self.rail.visibility) {
2525          if (self.newscrolly<0) {
2526            self.newscrolly = 0;
2527          }
2528          else if (self.newscrolly>self.page.maxh) {
2529            self.newscrolly = self.page.maxh;
2530          }
2531        }
2532        if (!self.bouncescroll||!self.railh.visibility) {
2533          if (self.newscrollx<0) {
2534            self.newscrollx = 0;
2535          }
2536          else if (self.newscrollx>self.page.maxw) {
2537            self.newscrollx = self.page.maxw;
2538          }
2539        }
2540
2541        self.dst = {};
2542        self.dst.x = x-px;
2543        self.dst.y = y-py;
2544        self.dst.px = px;
2545        self.dst.py = py;
2546        
2547        var dst = Math.round(Math.sqrt(Math.pow(self.dst.x,2)+Math.pow(self.dst.y,2)));
2548        
2549        self.dst.ax = self.dst.x / dst;
2550        self.dst.ay = self.dst.y / dst;
2551        
2552        var pa = 0;
2553        var pe = dst;
2554        
2555        if (self.dst.x==0) {
2556          pa = py;
2557          pe = y;
2558          self.dst.ay = 1;
2559          self.dst.py = 0;
2560        } else if (self.dst.y==0) {
2561          pa = px;
2562          pe = x;
2563          self.dst.ax = 1;
2564          self.dst.px = 0;
2565        }
2566
2567        var ms = self.getTransitionSpeed(dst);
2568        if (spd&&spd<=1) ms*=spd;
2569        if (ms>0) {
2570          self.bzscroll = (self.bzscroll) ? self.bzscroll.update(pe,ms) : new BezierClass(pa,pe,ms,0,1,0,1);
2571        } else {
2572          self.bzscroll = false;
2573        }
2574        
2575        if (self.timer) return;
2576        
2577        if ((py==self.page.maxh&&y>=self.page.maxh)||(px==self.page.maxw&&x>=self.page.maxw)) self.checkContentSize();
2578        
2579        var sync = 1;
2580        
2581        function scrolling() {          
2582          if (self.cancelAnimationFrame) return true;
2583          
2584          self.scrollrunning = true;
2585          
2586          sync = 1-sync;
2587          if (sync) return (self.timer = setAnimationFrame(scrolling)||1);
2588
2589          var done = 0;
2590          
2591          var sc = sy = self.getScrollTop();
2592          if (self.dst.ay) {            
2593            sc = (self.bzscroll) ? self.dst.py + (self.bzscroll.getNow()*self.dst.ay) : self.newscrolly;
2594            var dr=sc-sy;          
2595            if ((dr<0&&sc<self.newscrolly)||(dr>0&&sc>self.newscrolly)) sc = self.newscrolly;
2596            self.setScrollTop(sc);
2597            if (sc == self.newscrolly) done=1;
2598          } else {
2599            done=1;
2600          }
2601          
2602          var scx = sx = self.getScrollLeft();
2603          if (self.dst.ax) {            
2604            scx = (self.bzscroll) ? self.dst.px + (self.bzscroll.getNow()*self.dst.ax) : self.newscrollx;            
2605            var dr=scx-sx;
2606            if ((dr<0&&scx<self.newscrollx)||(dr>0&&scx>self.newscrollx)) scx = self.newscrollx;
2607            self.setScrollLeft(scx);
2608            if (scx == self.newscrollx) done+=1;
2609          } else {
2610            done+=1;
2611          }
2612          
2613          if (done==2) {
2614            self.timer = 0;
2615            self.cursorfreezed = false;
2616            self.bzscroll = false;
2617            self.scrollrunning = false;
2618            if (sc<0) sc=0;
2619            else if (sc>self.page.maxh) sc=self.page.maxh;
2620            if (scx<0) scx=0;
2621            else if (scx>self.page.maxw) scx=self.page.maxw;
2622            if ((scx!=self.newscrollx)||(sc!=self.newscrolly)) self.doScrollPos(scx,sc);
2623            else {
2624              if (self.onscrollend) {
2625                var info = {"type":"scrollend","current":{"x":sx,"y":sy},"end":{"x":self.newscrollx,"y":self.newscrolly}};
2626                self.onscrollend.call(self,info);
2627              }             
2628            } 
2629          } else {
2630            self.timer = setAnimationFrame(scrolling)||1;
2631          }
2632        };
2633        self.cancelAnimationFrame=false;
2634        self.timer = 1;
2635
2636        if (self.onscrollstart&&!self.scrollrunning) {
2637          var info = {"type":"scrollstart","current":{"x":px,"y":py},"request":{"x":x,"y":y},"end":{"x":self.newscrollx,"y":self.newscrolly},"speed":ms};
2638          self.onscrollstart.call(self,info);
2639        }        
2640
2641        scrolling();
2642        
2643        if ((py==self.page.maxh&&y>=py)||(px==self.page.maxw&&x>=px)) self.checkContentSize();
2644        
2645        self.noticeCursor();
2646      };
2647  
2648      this.cancelScroll = function() {        
2649        if (self.timer) clearAnimationFrame(self.timer);
2650        self.timer = 0;
2651        self.bzscroll = false;
2652        self.scrollrunning = false;
2653        return self;
2654      };
2655      
2656    }
2657    
2658    this.doScrollBy = function(stp,relative) {
2659      var ny = 0;
2660      if (relative) {
2661        ny = Math.floor((self.scroll.y-stp)*self.scrollratio.y)
2662      } else {        
2663        var sy = (self.timer) ? self.newscrolly : self.getScrollTop(true);
2664        ny = sy-stp;
2665      }
2666      if (self.bouncescroll) {
2667        var haf = Math.round(self.view.h/2);
2668        if (ny<-haf) ny=-haf
2669        else if (ny>(self.page.maxh+haf)) ny = (self.page.maxh+haf);
2670      }
2671      self.cursorfreezed = false;      
2672
2673      py = self.getScrollTop(true);
2674      if (ny<0&&py<=0) return self.noticeCursor();      
2675      else if (ny>self.page.maxh&&py>=self.page.maxh) {
2676        self.checkContentSize();
2677        return self.noticeCursor();
2678      }
2679      
2680      self.doScrollTop(ny);
2681    };
2682
2683    this.doScrollLeftBy = function(stp,relative) {
2684      var nx = 0;
2685      if (relative) {
2686        nx = Math.floor((self.scroll.x-stp)*self.scrollratio.x)
2687      } else {
2688        var sx = (self.timer) ? self.newscrollx : self.getScrollLeft(true);
2689        nx = sx-stp;
2690      }
2691      if (self.bouncescroll) {
2692        var haf = Math.round(self.view.w/2);
2693        if (nx<-haf) nx=-haf
2694        else if (nx>(self.page.maxw+haf)) nx = (self.page.maxw+haf);
2695      }
2696      self.cursorfreezed = false;    
2697
2698      px = self.getScrollLeft(true);
2699      if (nx<0&&px<=0) return self.noticeCursor();      
2700      else if (nx>self.page.maxw&&px>=self.page.maxw) return self.noticeCursor();
2701      
2702      self.doScrollLeft(nx);
2703    };
2704    
2705    this.doScrollTo = function(pos,relative) {
2706      var ny = (relative) ? Math.round(pos*self.scrollratio.y) : pos;
2707      if (ny<0) ny=0
2708      else if (ny>self.page.maxh) ny = self.page.maxh;
2709      self.cursorfreezed = false;
2710      self.doScrollTop(pos);
2711    };
2712    
2713    this.checkContentSize = function() {      
2714      var pg = self.getContentSize();
2715      if ((pg.h!=self.page.h)||(pg.w!=self.page.w)) self.resize(false,pg);
2716    };
2717    
2718    self.onscroll = function(e) {    
2719      if (self.rail.drag) return;
2720      if (!self.cursorfreezed) {
2721        self.synched('scroll',function(){
2722          self.scroll.y = Math.round(self.getScrollTop() * (1/self.scrollratio.y));
2723          if (self.railh) self.scroll.x = Math.round(self.getScrollLeft() * (1/self.scrollratio.x));
2724          self.noticeCursor();
2725        });
2726      }
2727    };
2728    self.bind(self.docscroll,"scroll",self.onscroll);
2729    
2730    this.doZoomIn = function(e) {
2731      if (self.zoomactive) return;
2732      self.zoomactive = true;
2733      
2734      self.zoomrestore = {
2735        style:{}
2736      };
2737      var lst = ['position','top','left','zIndex','backgroundColor','marginTop','marginBottom','marginLeft','marginRight'];
2738      var win = self.win[0].style;
2739      for(var a in lst) {
2740        var pp = lst[a];
2741        self.zoomrestore.style[pp] = (typeof win[pp] != "undefined") ? win[pp] : '';        
2742      }
2743      
2744      self.zoomrestore.style.width = self.win.css('width');
2745      self.zoomrestore.style.height = self.win.css('height');
2746      
2747      self.zoomrestore.padding = {
2748        w:self.win.outerWidth()-self.win.width(),
2749        h:self.win.outerHeight()-self.win.height()
2750      };
2751      
2752      if (cap.isios4) {
2753        self.zoomrestore.scrollTop = $(window).scrollTop();
2754        $(window).scrollTop(0);
2755      }
2756      
2757      self.win.css({
2758        "position":(cap.isios4)?"absolute":"fixed",
2759        "top":0,
2760        "left":0,
2761        "z-index":globalmaxzindex+100,
2762        "margin":"0px"
2763      });
2764      var bkg = self.win.css("backgroundColor");      
2765      if (bkg==""||/transparent|rgba\(0, 0, 0, 0\)|rgba\(0,0,0,0\)/.test(bkg)) self.win.css("backgroundColor","#fff");
2766      self.rail.css({"z-index":globalmaxzindex+101});
2767      self.zoom.css({"z-index":globalmaxzindex+102});      
2768      self.zoom.css('backgroundPosition','0px -18px');
2769      self.resizeZoom();
2770      
2771      if (self.onzoomin) self.onzoomin.call(self);
2772      
2773      return self.cancelEvent(e);
2774    };
2775
2776    this.doZoomOut = function(e) {
2777      if (!self.zoomactive) return;
2778      self.zoomactive = false;
2779      
2780      self.win.css("margin","");
2781      self.win.css(self.zoomrestore.style);
2782      
2783      if (cap.isios4) {
2784        $(window).scrollTop(self.zoomrestore.scrollTop);
2785      }
2786      
2787      self.rail.css({"z-index":self.zindex});
2788      self.zoom.css({"z-index":self.zindex});
2789      self.zoomrestore = false;
2790      self.zoom.css('backgroundPosition','0px 0px');
2791      self.onResize();
2792      
2793      if (self.onzoomout) self.onzoomout.call(self);
2794      
2795      return self.cancelEvent(e);
2796    };
2797    
2798    this.doZoom = function(e) {
2799      return (self.zoomactive) ? self.doZoomOut(e) : self.doZoomIn(e);
2800    };
2801    
2802    this.resizeZoom = function() {
2803      if (!self.zoomactive) return;
2804
2805      var py = self.getScrollTop(); //preserve scrolling position
2806      self.win.css({
2807        width:$(window).width()-self.zoomrestore.padding.w+"px",
2808        height:$(window).height()-self.zoomrestore.padding.h+"px"
2809      });
2810      self.onResize();
2811      
2812      self.setScrollTop(Math.min(self.page.maxh,py));
2813    };
2814   
2815    this.init();
2816    
2817    $.nicescroll.push(this);
2818
2819  };
2820  
2821// Inspired by the work of Kin Blas
2822// http://webpro.host.adobe.com/people/jblas/momentum/includes/jquery.momentum.0.7.js  
2823  
2824  
2825  var ScrollMomentumClass2D = function(nc) {
2826    var self = this;
2827    this.nc = nc;
2828    
2829    this.lastx = 0;
2830    this.lasty = 0;
2831    this.speedx = 0;
2832    this.speedy = 0;
2833    this.lasttime = 0;
2834    this.steptime = 0;
2835    this.snapx = false;
2836    this.snapy = false;
2837    this.demulx = 0;
2838    this.demuly = 0;
2839    
2840    this.lastscrollx = -1;
2841    this.lastscrolly = -1;
2842    
2843    this.chkx = 0;
2844    this.chky = 0;
2845    
2846    this.timer = 0;
2847    
2848    this.time = function() {
2849      return +new Date();//beautifull hack
2850    };
2851    
2852    this.reset = function(px,py) {
2853      self.stop();
2854      var now = self.time();
2855      self.steptime = 0;
2856      self.lasttime = now;
2857      self.speedx = 0;
2858      self.speedy = 0;
2859      self.lastx = px;
2860      self.lasty = py;
2861      self.lastscrollx = -1;
2862      self.lastscrolly = -1;
2863    };
2864    
2865    this.update = function(px,py) {
2866      var now = self.time();
vendor: 1,674 bytes, lines 2867-2930
2867      self.steptime = now - self.lasttime;
2868      self.lasttime = now;      
2869      var dy = py - self.lasty;
2870      var dx = px - self.lastx;
2871      var sy = self.nc.getScrollTop();
2872      var sx = self.nc.getScrollLeft();
2873      var newy = sy + dy;
2874      var newx = sx + dx;
2875      self.snapx = (newx<0)||(newx>self.nc.page.maxw);
2876      self.snapy = (newy<0)||(newy>self.nc.page.maxh);
2877      self.speedx = dx;
2878      self.speedy = dy;
2879      self.lastx = px;
2880      self.lasty = py;
2881    };
2882    
2883    this.stop = function() {
2884      self.nc.unsynched("domomentum2d");
2885      if (self.timer) clearTimeout(self.timer);
2886      self.timer = 0;
2887      self.lastscrollx = -1;
2888      self.lastscrolly = -1;
2889    };
2890    
2891    this.doSnapy = function(nx,ny) {
2892      var snap = false;
2893      
2894      if (ny<0) {
2895        ny=0;
2896        snap=true;        
2897      } 
2898      else if (ny>self.nc.page.maxh) {
2899        ny=self.nc.page.maxh;
2900        snap=true;
2901      }
2902
2903      if (nx<0) {
2904        nx=0;
2905        snap=true;        
2906      } 
2907      else if (nx>self.nc.page.maxw) {
2908        nx=self.nc.page.maxw;
2909        snap=true;
2910      }
2911      
2912      if (snap) self.nc.doScrollPos(nx,ny,self.nc.opt.snapbackspeed);
2913    };
2914    
2915    this.doMomentum = function(gp) {
2916      var t = self.time();
2917      var l = (gp) ? t+gp : self.lasttime;
2918
2919      var sl = self.nc.getScrollLeft();
2920      var st = self.nc.getScrollTop();
2921      
2922      var pageh = self.nc.page.maxh;
2923      var pagew = self.nc.page.maxw;
2924      
2925      self.speedx = (pagew>0) ? Math.min(60,self.speedx) : 0;
2926      self.speedy = (pageh>0) ? Math.min(60,self.speedy) : 0;
2927      
2928      var chk = l && (t - l) <= 60;
2929      
2930      if ((st<0)||(st>pageh)||(sl<0)||(sl>
2930pagew)) chk = false;
2931      
2932      var sy = (self.speedy && chk) ? self.speedy : false;
2933      var sx = (self.speedx && chk) ? self.speedx : false;
2934      
2935      if (sy||sx) {
2936        var tm = Math.max(16,self.steptime); //timeout granularity
2937        
2938        if (tm>50) {  // do smooth
2939          var xm = tm/50;
2940          self.speedx*=xm;
2941          self.speedy*=xm;
2942          tm = 50;
2943        }
2944        
2945        self.demulxy = 0;
2946
2947        self.lastscrollx = self.nc.getScrollLeft();
2948        self.chkx = self.lastscrollx;
2949        self.lastscrolly = self.nc.getScrollTop();
2950        self.chky = self.lastscrolly;
2951        
2952        var nx = self.lastscrollx;
2953        var ny = self.lastscrolly;
2954        
2955        var onscroll = function(){
2956          var df = ((self.time()-t)>600) ? 0.04 : 0.02;
2957        
2958          if (self.speedx) {
2959            nx = Math.floor(self.lastscrollx - (self.speedx*(1-self.demulxy)));
2960            self.lastscrollx = nx;
2961            if ((nx<0)||(nx>pagew)) df=0.10;
2962          }
2963
2964          if (self.speedy) {
2965            ny = Math.floor(self.lastscrolly - (self.speedy*(1-self.demulxy)));
2966            self.lastscrolly = ny;
2967            if ((ny<0)||(ny>pageh)) df=0.10;
2968          }
2969          
2970          self.demulxy = Math.min(1,self.demulxy+df);
2971          
2972          self.nc.synched("domomentum2d",function(){
2973
2974            if (self.speedx) {
2975              var scx = self.nc.getScrollLeft();
2976              if (scx!=self.chkx) self.stop();
2977              self.chkx=nx;
2978              self.nc.setScrollLeft(nx);
2979            }
2980          
2981            if (self.speedy) {
2982              var scy = self.nc.getScrollTop();
2983              if (scy!=self.chky) self.stop();          
2984              self.chky=ny;
2985              self.nc.setScrollTop(ny);
2986            }
2987            
2988            if(!self.timer) {
2989              self.nc.hideCursor();
2990              self.doSnapy(nx,ny);
2991            }
2992            
2993          });
2994          
2995          if (self.demulxy<1) {            
2996            self.timer = setTimeout(onscroll,tm);
2997          } else {
2998            self.stop();
2999            self.nc.hideCursor();
3000            self.doSnapy(nx,ny);
3001          }
3002        };
3003        
3004        onscroll();
3005        
3006      } else {
3007        self.doSnapy(self.nc.getScrollLeft(),self.nc.getScrollTop());
3008      }      
3009      
3010    }
3011    
3012  };
3013
3014  
3015// override jQuery scrollTop
3016 
3017  var _scrollTop = jQuery.fn.scrollTop; // preserve original function
3018   
3019  jQuery.cssHooks["pageYOffset"] = {
3020    get: function(elem,computed,extra) {      
3021      var nice = $.data(elem,'__nicescroll')||false;
3022      return (nice&&nice.ishwscroll) ? nice.getScrollTop() : _scrollTop.call(elem);
3023    },
3024    set: function(elem,value) {
3025      var nice = $.data(elem,'__nicescroll')||false;    
3026      (nice&&nice.ishwscroll) ? nice.setScrollTop(parseInt(value)) : _scrollTop.call(elem,value);
3027      return this;
3028    }
3029  };
3030  
3031/*  
3032  $.fx.step["scrollTop"] = function(fx){    
3033    $.cssHooks["scrollTop"].set( fx.elem, fx.now + fx.unit );
3034  };
3035*/  
3036  
3037  jQuery.fn.scrollTop = function(value) {    
3038    if (typeof value == "undefined") {
3039      var nice = (this[0]) ? $.data(this[0],'__nicescroll')||false : false;
3040      return (nice&&nice.ishwscroll) ? nice.getScrollTop() : _scrollTop.call(this);
3041    } else {      
3042      return this.each(function() {
3043        var nice = $.data(this,'__nicescroll')||false;
3044        (nice&&nice.ishwscroll) ? nice.setScrollTop(parseInt(value)) : _scrollTop.call($(this),value);
3045      });
3046    }
3047  }
3048
3049// override jQuery scrollLeft
3050 
3051  var _scrollLeft = jQuery.fn.scrollLeft; // preserve original function
3052   
3053  $.cssHooks.pageXOffset = {
3054    get: function(elem,computed,extra) {
3055      var nice = $.data(elem,'__nicescroll')||false;
3056      return (nice&&nice.ishwscroll) ? nice.getScrollLeft() : _scrollLeft.call(elem);
3057    },
3058    set: function(elem,value) {
3059      var nice = $.data(elem,'__nicescroll')||false;    
3060      (nice&&nice.ishwscroll) ? nice.setScrollLeft(parseInt(value)) : _scrollLeft.call(elem,value);
3061      return this;
3062    }
3063  };
3064  
3065/*  
3066  $.fx.step["scrollLeft"] = function(fx){
3067    $.cssHooks["scrollLeft"].set( fx.elem, fx.now + fx.unit );
3068  };  
3069*/  
3070 
3071  jQuery.fn.scrollLeft = function(value) {    
3072    if (typeof value == "undefined") {
3073      var nice = (this[0]) ? $.data(this[0],'__nicescroll')||false : false;
3074      return (nice&&nice.ishwscroll) ? nice.getScrollLeft() : _scrollLeft.call(this);
3075    } else {
3076      return this.each(function() {     
3077        var nice = $.data(this,'__nicescroll')||false;
3078        (nice&&nice.ishwscroll) ? nice.setScrollLeft(parseInt(value)) : _scrollLeft.call($(this),value);
3079      });
3080    }
3081  }
3082  
3083  var NiceScrollArray = function(doms) {
3084    var self = this;
3085    this.length = 0;
3086    this.name = "nicescrollarray";
3087  
3088    this.each = function(fn) {
3089      for(var a=0,i=0;a<self.length;a++) fn.call(self[a],i++);
3090      return self;
3091    };
3092    
3093    this.push = function(nice) {
3094      self[self.length]=nice;
3095      self.length++;
3096    };
3097    
3098    this.eq = function(idx) {
3099      return self[idx];
3100    };
3101    
3102    if (doms) {
3103      for(a=0;a<doms.length;a++) {
3104        var nice = $.data(doms[a],'__nicescroll')||false;
3105        if (nice) {
3106          this[this.length]=nice;
3107          this.length++;
3108        }
3109      };
3110    }
3111    
3112    return this;
3113  };
3114  
3115  function mplex(el,lst,fn) {
3116    for(var a=0;a<lst.length;a++) fn(el,lst[a]);
3117  };  
3118  mplex(
3119    NiceScrollArray.prototype,
3120    ['show','hide','toggle','onResize','resize','remove','stop','doScrollPos'],
3121    function(e,n) {
3122      e[n] = function(){
3123        var args = arguments;
3124        return this.each(function(){          
3125          this[n].apply(this,args);
3126        });
3127      };
3128    }
3129  );  
3130  
3131  jQuery.fn.getNiceScroll = function(index) {
3132    if (typeof index == "undefined") {
3133      return new NiceScrollArray(this);
3134    } else {      
3135      var nice = this[index]&&$.data(this[index],'__nicescroll')||false;
3136      return nice;
3137    }
3138  };
3139  
3140  jQuery.extend(jQuery.expr[':'], {
3141    nicescroll: function(a) {
3142      return ($.data(a,'__nicescroll'))?true:false;
3143    }
3144  });  
3145  
3146  $.fn.niceScroll = function(wrapper,opt) {        
3147    if (typeof opt=="undefined") {
3148      if ((typeof wrapper=="object")&&!("jquery" in wrapper)) {
3149        opt = wrapper;
3150        wrapper = false;        
3151      }
3152    }
3153    var ret = new NiceScrollArray();
3154    if (typeof opt=="undefined") opt = {};
3155    
3156    if (wrapper||false) {      
3157      opt.doc = $(wrapper);
3158      opt.win = $(this);
3159    }    
3160    var docundef = !("doc" in opt);   
3161    if (!docundef&&!("win" in opt)) opt.win = $(this);    
3162    
3163    this.each(function() {
3164      var nice = $(this).data('__nicescroll')||false;
3165      if (!nice) {
3166        opt.doc = (docundef) ? $(this) : opt.doc;
3167        nice = new NiceScrollClass(opt,$(this));        
3168        $(this).data('__nicescroll',nice);
3169      }
3170      ret.push(nice);
3171    });
3172    return (ret.length==1) ? ret[0] : ret;
3173  };
3174  
3175  window.NiceScroll = {
3176    getjQuery:function(){return jQuery}
3177  };
3178  
3179  if (!$.nicescroll) {
3180   $.nicescroll = new NiceScrollArray();
3181   $.nicescroll.options = _globaloptions;
3182  }
3183  
3184})( jQuery );
3185  ;
3186(function(e){"use strict";e.fn.lightGallery=function(t){var n={mode:"slide",useCSS:true,easing:"linear",speed:1e3,start:0,loop:false,auto:false,pause:4e3,escKey:true,rel:false,lang:{allPhotos:"All photos"},exThumbImage:false,thumbnail:true,caption:false,captionLink:false,desc:false,counter:false,controls:true,hideControlOnEnd:false,mobileSrc:false,mobileSrcMaxWidth:640,swipeThreshold:50,vimeoColor:"CCCCCC",videoAutoplay:true,videoMaxWidth:855,dynamic:false,dynamicEl:[],onOpen:function(){},onSlideBefore:function(){},onSlideAfter:function(){},onSlideNext:function(){},onSlidePrev:function(){},onBeforeClose:function(){},onCloseAfter:function(){}},r=e(this),i,s,o=false,u='<div id="lightGallery-outer"><div id="lightGallery-Gallery"><div id="lightGallery-slider"></div><a id="lightGallery-close" class="close"></a></div></div>',a=document.createTouch!==undefined||"ontouchstart"in window||"onmsgesturechange"in window||navigator.msMaxTouchPoints,f,l,c,h,p,d,v,m,g,y,b,w=false,E=false,S=false;var x=e.extend(true,{},n,t);var T={init:function(){r.each(function(){var t=e(this);if(x.dynamic==true){i=x.dynamicEl;s=x.start;v=s;N.init(s)}else{i=e(this).children();i.click(function(n){if(x.rel==true&&t.data("rel")){var r=t.data("rel");i=e('[data-rel="'+r+'"]').children()}else{i=t.children()}n.preventDefault();n.stopPropagation();s=i.index(this);v=s;N.init(s)})}})}};var N={init:function(){this.start();this.build()},start:function(){this.structure();this.getWidth();this.closeSlide()},build:function(){this.loadContent(s);this.addCaption();this.addDesc();this.counter();this.slideTo();this.buildThumbnail();this.keyPress();this.slide(s);this.touch();this.enableTouch();setTimeout(function(){f.addClass("opacity")},50)},structure:function(){e("body").append(u).addClass("lightGallery");l=e("#lightGallery-outer");f=e("#lightGallery-Gallery");c=f.find("#lightGallery-slider");var t="";if(x.dynamic==true){for(var n=0;n<x.dynamicEl.length;n++){t+='<div class="lightGallery-slide"></div>'}}else{i.each(function(){t+='<div class="lightGallery-slide"></div>'})}c.append(t);h=f.find(".lightGallery-slide")},closeSlide:function(){var t=this;e("#lightGallery-close").bind("click touchend",function(){t.destroy()})},getWidth:function(){var t=function(){y=e(window).width()};e(window).bind("resize.lightGallery",t())},doCss:function(){var e=function(){var e=["transition","MozTransition","WebkitTransition","OTransition","msTransition","KhtmlTransition"];var t=document.documentElement;for(var n=0;n<e.length;n++){if(e[n]in t.style){return true}}};if(x.useCSS&&e()){return true}return false},enableTouch:function(){var t=this;if(a){var n={},r={};e("body").on("touchstart.lightGallery",function(e){r=e.originalEvent.targetTouches[0];n.pageX=e.originalEvent.targetTouches[0].pageX;n.pageY=e.originalEvent.targetTouches[0].pageY});e("body").on("touchmove.lightGallery",function(e){var t=e.originalEvent;r=t.targetTouches[0];e.preventDefault()});e("body").on("touchend.lightGallery",function(e){var i=r.pageX-n.pageX,s=x.swipeThreshold;if(i>=s){t.prevSlide();clearInterval(b)}
3186else if(i<=-s){t.nextSlide();clearInterval(b)}})}},touch:function(){var t,n;var r=this;e(".lightGallery").bind("mousedown",function(e){e.stopPropagation();e.preventDefault();t=e.pageX});e(".lightGallery").bind("mouseup",function(e){e.stopPropagation();e.preventDefault();n=e.pageX;if(n-t>20){r.prevSlide()}else if(t-n>20){r.nextSlide()}})},isVideo:function(e){var t=e.match(/youtube\.com\/watch\?v=([a-zA-Z0-9\-_]+)/);var n=e.match(/vimeo\.com\/([0-9]*)/);if(t||n){return true}},loadVideo:function(e,t,n){var r=e.match(/watch\?v=([a-zA-Z0-9\-_]+)/);var i=e.match(/vimeo\.com\/([0-9]*)/);var s="";if(r){if(x.videoAutoplay===true&&t===true){t="?autoplay=1&rel=0&wmode=opaque"}else{t="?wmode=opaque"}s='<iframe id="video'+n+'" width="560" height="315" src="//www.youtube.com/embed/'+r[1]+t+'" frameborder="0" allowfullscreen></iframe>'}else if(i){if(x.videoAutoplay===true&&t===true){t="autoplay=1&"}else{t=""}s='<iframe id="video'+n+'" width="560" height="315"  src="http://player.vimeo.com/video/'+i[1]+"?"+t+"byline=0&portrait=0&color="+x.vimeoColor+'" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>'}return'<div class="video_cont" style="max-width:'+x.videoMaxWidth+'px !important;"><div class="video">'+s+"</div></div>"},loadContent:function(t){var n=this;var r,s,o,u=i.length-t;var a;n.autoStart();if(x.mobileSrc===true&&y<=x.mobileSrcMaxWidth){if(x.dynamic==true){a=x.dynamicEl[t]["mobileSrc"]}else{a=i.eq(t).attr("data-responsive-src")}}else{if(x.dynamic==true){a=x.dynamicEl[t]["src"]}else{a=i.eq(t).attr("data-src")}}if(!n.isVideo(a)){h.eq(t).prepend('<img src="'+a+'" />');o=e("img")}else{h.eq(t).prepend(n.loadVideo(a,true,t));o=e("iframe");if(x.auto&&x.videoAutoplay===true){clearInterval(b)}}if(i.length>1){h.eq(t).find(o).on("load error",function(){for(r=0;r<=t-1;r++){var e;if(x.mobileSrc===true&&y<=x.mobileSrcMaxWidth){if(x.dynamic==true){e=x.dynamicEl[t-r-1
3186]["mobileSrc"]}else{e=i.eq(t-r-1).attr("data-responsive-src")}}else{if(x.dynamic==true){e=x.dynamicEl[t-r-1]["src"]}else{e=i.eq(t-r-1).attr("data-src")}}if(!n.isVideo(e)){h.eq(t-r-1).prepend('<img src="'+e+'" />')}else{h.eq(t-r-1).prepend(n.loadVideo(e,false,t-r-1))}}for(s=1;s<u;s++){var e;if(x.mobileSrc===true&&y<=x.mobileSrcMaxWidth){if(x.dynamic==true){e=x.dynamicEl[t+s]["mobileSrc"]}else{e=i.eq(t+s).attr("data-responsive-src")}}else{if(x.dynamic==true){e=x.dynamicEl[t+s]["src"]}else{e=i.eq(t+s).attr("data-src")}}if(!n.isVideo(e)){h.eq(t+s).prepend('<img src="'+e+'" />')}else{h.eq(t+s).prepend(n.loadVideo(e,false,t+s))}}})}},addCaption:function(){if(x.caption===true){var e,t=false;for(e=0;e<i.length;e++){if(x.dynamic==true){t=x.dynamicEl[e]["caption"]}else{t=i.eq(e).attr("data-title")}if(typeof t=="undefined"||t==null){t="image "+e+""}if(x.captionLink===true){var n=i.eq(e).attr("data-link");if(typeof n!=="undefined"&&n!==""){n=n}else{n="#"}h.eq(e).append('<div class="info group"><a href="'+n+'" class="title">'+t+"</a></div>")}else{h.eq(e).append('<div class="info group"><span class="title">'+t+"</span></div>")}}}},addDesc:function(){if(x.desc===true){var e,t=false;for(e=0;e<i.length;e++){if(x.dynamic==true){t=x.dynamicEl[e]["desc"]}else{t=i.eq(e).attr("data-desc");}if(typeof t=="undefined"||t==null){t="image "+e+""}if(x.caption===false){h.eq(e).append('<div class="info group"><span class="desc">'+t+"</span></div>")}else{h.eq(e).find(".info").append('<span class="desc">'+t+"</span>")}}}},counter:function(){if(x.counter===true){var t=e("#lightGallery-slider > div").length;f.append("<div id='lightGallery_counter'><span id='lightGallery_counter_current'></span> / <span id='lightGallery_counter_all'>"+t+"</span></div>")}},buildThumbnail:function(){if(x.thumbnail===true&&i.length>1){var t=this;f.append('<div class="thumb_cont"><div class="thumb_info"><span class="close ib"><i class="bUi-iCn-rMv-16" aria-hidden="true"></i></span></div><div class="thumb_inner"></div></div>');m=f.find(".thumb_cont");p.after('<a class="cLthumb"></a>');f.find(".cLthumb").bind("click touchend",function(){m.addClass("open");if(t.doCss()&&x.mode==="slide"){h.eq(s).prevAll().removeClass("nextSlide").addClass("prevSlide");h.eq(s).nextAll().removeClass("prevSlide").addClass("nextSlide")}});f.find(".close").bind("click touchend",function(){m.removeClass("open")});var n=f.find(".thumb_info");var r=f.find(".thumb_inner");var o="";var u;if(x.dynamic==true){for(var a=0;a<x.dynamicEl.length;a++){u=x.dynamicEl[a]["thumb"];o+='<div class="thumb"><img src="'+u+'" /></div>'}}else{i.each(function(){if(x.exThumbImage===false||typeof e(this).attr(x.exThumbImage)=="undefined"||e(this).attr(x.exThumbImage)==null){u=e(this).find("img").attr("src")}else{u=e(this).attr(x.exThumbImage)}o+='<div class="thumb"><img src="'+u+'" /></div>'})}r.append(o);g=r.find(".thumb");g.bind("click touchend",function(){w=true;var n=e(this).index();g.removeClass("active");e(this).addClass("active");t.slide(n);clearInterval(b)});n.prepend('<span class="ib count">'+x.lang.allPhotos+" ("+g.length+")</span>")}},slideTo:function(){var e=this;if(x.controls===true&&i.length>1){f.append('<div id="lightGallery-action"><a id="lightGallery-prev"></a><a id="lightGallery-next"></a></div>');p=f.find("#lightGallery-prev");d=f.find("#lightGallery-next");p.bind("click",function(){e.prevSlide();clearInterval(b)});d.bind("click",function(){e.nextSlide();clearInterval(b)})}},autoStart:function(){var e=this;if(x.auto===true){b=setInterval(function(){if(s+1<i.length){s=s}else{s=-1}s++;e.slide(s)},x.pause)}},keyPress:function(){var t=this;e(window).bind("keyup.lightGallery",function(e){e.preventDefault();e.stopPropagation();if(e.keyCode===37){t.prevSlide();clearInterval(b)}if(e.keyCode===38&&x.thumbnail===true){if(!m.hasClass("open")){if(t.doCss()&&x.mode==="slide"){h.eq(s).prevAll().removeClass("nextSlide").addClass("prevSlide");h.eq(s).nextAll().removeClass("prevSlide").addClass("nextSlide")}m.addClass("open")}}else if(e.keyCode===39){t.nextSlide();clearInterval(b)}if(e.keyCode===40&&x.thumbnail===true){if(m.hasClass("open")){m.removeClass("open")}}else if(x.escKey===true&&e.keyCode===27){if(x.thumbnail===true&&m.hasClass("open")){m.removeClass("open")}else{t.destroy()}}})},nextSlide:function(){var e=this;s=h.index(h.eq(v));if(s+1<i.length){s++;e.slide(s)}else{if(x.loop){s=0;e.slide(s)}else if(x.mode==="fade"&&x.thumbnail===true&&i.length>1){m.addClass("open")}}x.onSlideNext.call(this)},prevSlide:function(){var e=this;s=h.index(h.eq(v));if(s>0){s--;e.slide(s)}else{if(x.loop){s=i.length-1;e.slide(s)}else if(x.mode==="fade"&&x.thumbnail===true&&i.length>1){m.addClass("open")}}x.onSlidePrev.call(this)},slide:function(t){if(o){if(!c.hasClass("on")){c.addClass("on")}if(this.doCss()&&x.speed!==""){if(!c.hasClass("speed")){c.addClass("speed")}if(S===false){c.css("transition-duration",x.speed+"ms");S=true}}if(this.doCss()&&x.easing!==""){if(!c.hasClass("timing")){c.addClass("timing")}if(E===false){c.css("transition-timing-function",x.easing);E=true}}x.onSlideBefore.call(this)}if(x.mode==="slide"){if(this.doCss()&&!c.hasClass("slide")){c.addClass("slide")}if(!this.doCss()&&!o){c.css({left:-t*100+"%"})}else if(!this.doCss()&&o){c.animate({left:-t*100+"%"},x.speed,x.easing)}}else if(x.mode==="fade"){if(this.doCss()&&!c.hasClass("fadeM")){c.addClass("fadeM")}else if(!this.doCss()&&!c.hasClass("animate")){c.addClass("animate")}if(!this.doCss()&&!o){h.fadeOut(100);h.eq(t).fadeIn(100)}else if(!this.doCss()&&o){h.eq(v).fadeOut(x.speed,x.easing);h.eq(t).fadeIn(x.speed,x.easing)}}if(t+1>=i.length&&x.auto&&x.loop===false){clearInterval(b)}
3186h.eq(v).removeClass("current");h.eq(t).addClass("current");if(this.doCss()&&x.mode==="slide"){if(w===false){e(".prevSlide").removeClass("prevSlide");e(".nextSlide").removeClass("nextSlide");h.eq(t-1).addClass("prevSlide");h.eq(t+1).addClass("nextSlide")}else{h.eq(t).prevAll().removeClass("nextSlide").addClass("prevSlide");h.eq(t).nextAll().removeClass("prevSlide").addClass("nextSlide")}}if(x.thumbnail===true&&i.length>1){g.removeClass("active");g.eq(t).addClass("active")}if(x.controls&&x.hideControlOnEnd&&x.loop===false){if(t===0){p.addClass("disabled")}else if(t===i.length-1){d.addClass("disabled")}else{p.add(d).removeClass("disabled")}}v=t;o===false?x.onOpen.call(this):x.onSlideAfter.call(this);o=true;w=false;if(x.counter){e("#lightGallery_counter_current").text(t+1)}},destroy:function(){x.onBeforeClose.call(this);o=false;E=false;S=false;w=false;clearInterval(b);e(".lightGallery").off("mousedown mouseup");e("body").off("touchstart.lightGallery touchmove.lightGallery touchend.lightGallery");e(window).off("resize.lightGallery keyup.lightGallery");f.addClass("fadeM");setTimeout(function(){l.remove();e("body").removeClass("lightGallery")},500);x.onCloseAfter.call(this)}};T.init();return this}})(jQuery);
3187/*
3188 * Thickbox 3.1 - One Box To Rule Them All.
3189 * By Cody Lindley (http://www.codylindley.com)
3190 * Copyright (c) 2007 cody lindley
3191 * Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php
3192*/
3193
3194if ( typeof tb_pathToImage != 'string' ) {
3195	var tb_pathToImage = thickboxL10n.loadingAnimation;
3196}
3197
3198/*!!!!!!!!!!!!!!!!! edit below this line at your own risk !!!!!!!!!!!!!!!!!!!!!!!*/
3199
3200//on page load call tb_init
3201jQuery(document).ready(function(){
3202	tb_init('a.thickbox, area.thickbox, input.thickbox');//pass where to apply thickbox
3203	imgLoader = new Image();// preload image
3204	imgLoader.src = tb_pathToImage;
3205});
3206
3207/*
3208 * Add thickbox to href & area elements that have a class of .thickbox.
3209 * Remove the loading indicator when content in an iframe has loaded.
3210 */
3211function tb_init(domChunk){
3212	jQuery( 'body' )
3213		.on( 'click', domChunk, tb_click )
3214		.on( 'thickbox:iframe:loaded', function() {
3215			jQuery( '#TB_window' ).removeClass( 'thickbox-loading' );
3216		});
3217}
3218
3219function tb_click(){
3220	var t = this.title || this.name || null;
3221	var a = this.href || this.alt;
3222	var g = this.rel || false;
3223	tb_show(t,a,g);
3224	this.blur();
3225	return false;
3226}
3227
3228function tb_show(caption, url, imageGroup) {//function called when the user clicks on a thickbox link
3229
3230	var $closeBtn;
3231
3232	try {
3233		if (typeof document.body.style.maxHeight === "undefined") {//if IE 6
3234			jQuery("body","html").css({height: "100%", width: "100%"});
3235			jQuery("html").css("overflow","hidden");
3236			if (document.getElementById("TB_HideSelect") === null) {//iframe to hide select elements in ie6
3237				jQuery("body").append("<iframe id='TB_HideSelect'>"+thickboxL10n.noiframes+"</iframe><div id='TB_overlay'></div><div id='TB_window' class='thickbox-loading'></div>");
3238				jQuery("#TB_overlay").on( 'click', tb_remove );
3239			}
3240		}else{//all others
3241			if(document.getElementById("TB_overlay") === null){
3242				jQuery("body").append("<div id='TB_overlay'></div><div id='TB_window' class='thickbox-loading'></div>");
3243				jQuery("#TB_overlay").on( 'click', tb_remove );
3244				jQuery( 'body' ).addClass( 'modal-open' );
3245			}
3246		}
3247
3248		if(tb_detectMacXFF()){
3249			jQuery("#TB_overlay").addClass("TB_overlayMacFFBGHack");//use png overlay so hide flash
3250		}else{
3251			jQuery("#TB_overlay").addClass("TB_overlayBG");//use background and opacity
3252		}
3253
3254		if(caption===null){caption="";}
3255		jQuery("body").append("<div id='TB_load'><img src='"+imgLoader.src+"' width='208' /></div>");//add loader to the page
3256		jQuery('#TB_load').show();//show loader
3257
3258		var baseURL;
3259	   if(url.indexOf("?")!==-1){ //ff there is a query string involved
3260			baseURL = url.substr(0, url.indexOf("?"));
3261	   }else{
3262	   		baseURL = url;
3263	   }
3264
3265	   var urlString = /\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp$|\.webp$|\.avif$/;
3266	   var urlType = baseURL.toLowerCase().match(urlString);
3267
3268		if(urlType == '.jpg' ||
3269			urlType == '.jpeg' ||
3270			urlType == '.png' ||
3271			urlType == '.gif' ||
3272			urlType == '.bmp' ||
3273			urlType == '.webp' ||
3274			urlType == '.avif'
3275		){//code to show images
3276
3277			TB_PrevCaption = "";
3278			TB_PrevURL = "";
3279			TB_PrevHTML = "";
3280			TB_NextCaption = "";
3281			TB_NextURL = "";
3282			TB_NextHTML = "";
3283			TB_imageCount = "";
3284			TB_FoundURL = false;
3285			if(imageGroup){
3286				TB_TempArray = jQuery("a[rel="+imageGroup+"]").get();
3287				for (TB_Counter = 0; ((TB_Counter < TB_TempArray.length) && (TB_NextHTML === "")); TB_Counter++) {
3288					var urlTypeTemp = TB_TempArray[TB_Counter].href.toLowerCase().match(urlString);
3289						if (!(TB_TempArray[TB_Counter].href == url)) {
3290							if (TB_FoundURL) {
3291								TB_NextCaption = TB_TempArray[TB_Counter].title;
3292								TB_NextURL = TB_TempArray[TB_Counter].href;
3293								TB_NextHTML = "<span id='TB_next'>&nbsp;&nbsp;<a href='#'>"+thickboxL10n.next+"</a></span>";
3294							} else {
3295								TB_PrevCaption = TB_TempArray[TB_Counter].title;
3296								TB_PrevURL = TB_TempArray[TB_Counter].href;
3297								TB_PrevHTML = "<span id='TB_prev'>&nbsp;&nbsp;<a href='#'>"+thickboxL10n.prev+"</a></span>";
3298							}
3299						} else {
3300							TB_FoundURL = true;
3301							TB_imageCount = thickboxL10n.image + ' ' + (TB_Counter + 1) + ' ' + thickboxL10n.of + ' ' + (TB_TempArray.length);
3302						}
3303				}
3304			}
3305
3306			imgPreloader = new Image();
3307			imgPreloader.onload = function(){
3308			imgPreloader.onload = null;
3309
3310			// Resizing large images - original by Christian Montoya edited by me.
3311			var pagesize = tb_getPageSize();
3312			var x = pagesize[0] - 150;
3313			var y = pagesize[1] - 150;
3314			var imageWidth = imgPreloader.width;
3315			var imageHeight = imgPreloader.height;
3316			if (imageWidth > x) {
3317				imageHeight = imageHeight * (x / imageWidth);
3318				imageWidth = x;
3319				if (imageHeight > y) {
3320					imageWidth = imageWidth * (y / imageHeight);
3321					imageHeight = y;
3322				}
3323			} else if (imageHeight > y) {
3324				imageWidth = imageWidth * (y / imageHeight);
3325				imageHeight = y;
3326				if (imageWidth > x) {
3327					imageHeight = imageHeight * (x / imageWidth);
3328					imageWidth = x;
3329				}
3330			}
3331			// End Resizing
3332
3333			TB_WIDTH = imageWidth + 30;
3334			TB_HEIGHT = imageHeight + 60;
3335			jQuery("#TB_window").append("<a href='' id='TB_ImageOff'><span class='screen-reader-text'>"+thickboxL10n.close+"</span><img id='TB_Image' src='"+url+"' width='"+imageWidth+"' height='"+imageHeight+"' alt='"+caption+"'/></a>" + "<div id='TB_caption'>"+caption+"<div id='TB_secondLine'>" + TB_imageCount + TB_PrevHTML + TB_NextHTML + "</div></div><div id='TB_closeWindow'><button type='button' id='TB_closeWindowButton'><span class='screen-reader-text'>"+thickboxL10n.close+"</span><span class='tb-close-icon' aria-hidden='true'></span></button></div>");
3336
3337			jQuery("#TB_closeWindowButton").on( 'click', tb_remove );
3338
3339			if (!(TB_PrevHTML === "")) {
3340				function goPrev(){
3341					if(jQuery(document).off("click",goPrev)){jQuery(document).off("click",goPrev);}
3342					jQuery("#TB_window").remove();
3343					jQuery("body").append("<div id='TB_window'></div>");
3344					tb_show(TB_PrevCaption, TB_PrevURL, imageGroup);
3345					return false;
3346				}
3347				jQuery("#TB_prev").on( 'click', goPrev );
3348			}
3349
3350			if (!(TB_NextHTML === "")) {
3351				function goNext(){
3352					jQuery("#TB_window").remove();
3353					jQuery("body").append("<div id='TB_window'></div>");
3354					tb_show(TB_NextCaption, TB_NextURL, imageGroup);
3355					return false;
3356				}
3357				jQuery("#TB_next").on( 'click', goNext );
3358
3359			}
3360
3361			jQuery(document).on('keydown.thickbox', function(e){
3362				if ( e.which == 27 ){ // close
3363					tb_remove();
3364
3365				} else if ( e.which == 190 ){ // display previous image
3366					if(!(TB_NextHTML == "")){
3367						jQuery(document).off('thickbox');
3368						goNext();
3369					}
3370				} else if ( e.which == 188 ){ // display next image
3371					if(!(TB_PrevHTML == "")){
3372						jQuery(document).off('thickbox');
3373						goPrev();
3374					}
3375				}
3376				return false;
3377			});
3378
3379			tb_position();
3380			jQuery("#TB_load").remove();
3381			jQuery("#TB_ImageOff").on( 'click', tb_remove );
3382			jQuery("#TB_window").css({'visibility':'visible'}); //for safari using css instead of show
3383			};
3384
3385			imgPreloader.src = url;
3386		}else{//code to show html
3387
3388			var queryString = url.replace(/^[^\?]+\??/,'');
3389			var params = tb_parseQuery( queryString );
3390
3391			TB_WIDTH = (params['width']*1) + 30 || 630; //defaults to 630 if no parameters were added to URL
3392			TB_HEIGHT = (params['height']*1) + 40 || 440; //defaults to 440 if no parameters were added to URL
3393			ajaxContentW = TB_WIDTH - 30;
3394			ajaxContentH = TB_HEIGHT - 45;
3395
3396			if(url.indexOf('TB_iframe') != -1){// either iframe or ajax window
3397					urlNoQuery = url.split('TB_');
3398					jQuery("#TB_iframeContent").remove();
3399					if(params['modal'] != "true"){//iframe no modal
3400						jQuery("#TB_window").append("<div id='TB_title'><div id='TB_ajaxWindowTitle'>"+caption+"</div><div id='TB_closeAjaxWindow'><button type='button' id='TB_closeWindowButton'><span class='screen-reader-text'>"+thickboxL10n.close+"</span><span class='tb-close-icon' aria-hidden='true'></span></button></div></div><iframe frameborder='0' hspace='0' allowtransparency='true' src='"+urlNoQuery[0]+"' id='TB_iframeContent' name='TB_iframeContent"+Math.round(Math.random()*1000)+"' onload='tb_showIframe()' style='width:"+(ajaxContentW + 29)+"px;height:"+(ajaxContentH + 17)+"px;' >"+thickboxL10n.noiframes+"</iframe>");
3401					}else{//iframe modal
3402					jQuery("#TB_overlay").off();
3403						jQuery("#TB_window").append("<iframe frameborder='0' hspace='0' allowtransparency='true' src='"+urlNoQuery[0]+"' id='TB_iframeContent' name='TB_iframeContent"+Math.round(Math.random()*1000)+"' onload='tb_showIframe()' style='width:"+(ajaxContentW + 29)+"px;height:"+(ajaxContentH + 17)+"px;'>"+thickboxL10n.noiframes+"</iframe>");
3404					}
3405			}else{// not an iframe, ajax
3406					if(jQuery("#TB_window").css("visibility") != "visible"){
3407						if(params['modal'] != "true"){//ajax no modal
3408						jQuery("#TB_window").append("<div id='TB_title'><div id='TB_ajaxWindowTitle'>"+caption+"</div><div id='TB_closeAjaxWindow'><button type='button' id='TB_closeWindowButton'><span class='screen-reader-text'>"+thickboxL10n.close+"</span><span class='tb-close-icon' aria-hidden='true'></span></button></div></div><div id='TB_ajaxContent' style='width:"+ajaxContentW+"px;height:"+ajaxContentH+"px'></div>");
3409						}else{//ajax modal
3410						jQuery("#TB_overlay").off();
3411						jQuery("#TB_window").append("<div id='TB_ajaxContent' class='TB_modal' style='width:"+ajaxContentW+"px;height:"+ajaxContentH+"px;'></div>");
3412						}
3413					}else{//this means the window is already up, we are just loading new content via ajax
3414						jQuery("#TB_ajaxContent")[0].style.width = ajaxContentW +"px";
3415						jQuery("#TB_ajaxContent")[0].style.height = ajaxContentH +"px";
3416						jQuery("#TB_ajaxContent")[0].scrollTop = 0;
3417						jQuery("#TB_ajaxWindowTitle").html(caption);
3418					}
3419			}
3420
3421			jQuery("#TB_closeWindowButton").on( 'click', tb_remove );
3422
3423				if(url.indexOf('TB_inline') != -1){
3424					jQuery("#TB_ajaxContent").append(jQuery('#' + params['inlineId']).children());
3425					jQuery("#TB_window").on('tb_unload', function () {
3426						jQuery('#' + params['inlineId']).append( jQuery("#TB_ajaxContent").children() ); // move elements back when you're finished
3427					});
3428					tb_position();
3429					jQuery("#TB_load").remove();
3430					jQuery("#TB_window").css({'visibility':'visible'});
3431				}else if(url.indexOf('TB_iframe') != -1){
3432					tb_position();
3433					jQuery("#TB_load").remove();
3434					jQuery("#TB_window").css({'visibility':'visible'});
3435				}else{
3436					var load_url = url;
3437					load_url += -1 === url.indexOf('?') ? '?' : '&';
3438					jQuery("#TB_ajaxContent").load(load_url += "random=" + (new Date().getTime()),function(){//to do a post change this load method
3439						tb_position();
3440						jQuery("#TB_load").remove();
3441						tb_init("#TB_ajaxContent a.thickbox");
3442						jQuery("#TB_window").css({'visibility':'visible'});
3443					});
3444				}
3445
3446		}
3447
3448		if(!params['modal']){
3449			jQuery(document).on('keydown.thickbox', function(e){
3450				if ( e.which == 27 ){ // close
3451					tb_remove();
3452					return false;
3453				}
3454			});
3455		}
3456
3457		$closeBtn = jQuery( '#TB_closeWindowButton' );
3458		/*
3459		 * If the native Close button icon is visible, move focus on the button
3460		 * (e.g. in the Network Admin Themes screen).
3461		 * In other admin screens is hidden and replaced by a different icon.
3462		 */
3463		if ( $closeBtn.find( '.tb-close-icon' ).is( ':visible' ) ) {
3464			$closeBtn.trigger( 'focus' );
3465		}
3466
3467	} catch(e) {
3468		//nothing here
3469	}
3470}
3471
3472//helper functions below
3473function tb_showIframe(){
3474	jQuery("#TB_load").remove();
3475	jQuery("#TB_window").css({'visibility':'visible'}).trigger( 'thickbox:iframe:loaded' );
3476}
3477
3478function tb_remove() {
3479 	jQuery("#TB_imageOff").off("click");
3480	jQuery("#TB_closeWindowButton").off("click");
3481	jQuery( '#TB_window' ).fadeOut( 'fast', function() {
3482		jQuery( '#TB_window, #TB_overlay, #TB_HideSelect' ).trigger( 'tb_unload' ).off().remove();
3483		jQuery( 'body' ).trigger( 'thickbox:removed' );
3484	});
3485	jQuery( 'body' ).removeClass( 'modal-open' );
3486	jQuery("#TB_load").remove();
3487	if (typeof document.body.style.maxHeight == "undefined") {//if IE 6
3488		jQuery("body","html").css({height: "auto", width: "auto"});
3489		jQuery("html").css("overflow","");
3490	}
3491	jQuery(document).off('.thickbox');
3492	return false;
3493}
3494
3495function tb_position() {
3496var isIE6 = typeof document.body.style.maxHeight === "undefined";
3497jQuery("#TB_window").css({marginLeft: '-' + parseInt((TB_WIDTH / 2),10) + 'px', width: TB_WIDTH + 'px'});
3498	if ( ! isIE6 ) { // take away IE6
3499		jQuery("#TB_window").css({marginTop: '-' + parseInt((TB_HEIGHT / 2),10) + 'px'});
3500	}
3501}
3502
3503function tb_parseQuery ( query ) {
3504   var Params = {};
3505   if ( ! query ) {return Params;}// return empty object
3506   var Pairs = query.split(/[;&]/);
3507   for ( var i = 0; i < Pairs.length; i++ ) {
3508      var KeyVal = Pairs[i].split('=');
3509      if ( ! KeyVal || KeyVal.length != 2 ) {continue;}
3510      var key = unescape( KeyVal[0] );
3511      var val = unescape( KeyVal[1] );
3512      val = val.replace(/\+/g, ' ');
3513      Params[key] = val;
3514   }
3515   return Params;
3516}
3517
3518function tb_getPageSize(){
3519	var de = document.documentElement;
3520	var w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
3521	var h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight;
3522	arrayPageSize = [w,h];
3523	return arrayPageSize;
3524}
3525
3526function tb_detectMacXFF() {
3527  var userAgent = navigator.userAgent.toLowerCase();
3528  if (userAgent.indexOf('mac') != -1 && userAgent.indexOf('firefox')!=-1) {
3529    return true;
3530  }
3531}
3532;
3533/**
3534 * Galleria - v1.6.1 2019-10-17
3535 * 
3536 *
3537 * Copyright (c) 2010 - 2019 worse is better UG
3538 * Licensed under the MIT License.
3539 */
3540
3541
3542!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(c){return b(a,c)}):"object"==typeof module&&module.exports?module.exports=b(a,require("jquery")):a.Galleria=b(a,a.jQuery)}(window,function(a,b,c,d){var e=a.document,f=b(e),g=b(a),h=b,i=Array.prototype,j=!0,k=3e4,l=!1,m=navigator.userAgent.toLowerCase(),n=a.location.hash.replace(/#\//,""),o="file:"==a.location.protocol?"http:":a.location.protocol,p=Math,q=function(){},r=function(){return!1},s=!(a.screen.width>1279&&1==a.devicePixelRatio||a.screen.width>1e3&&a.innerWidth<.9*a.screen.width),t=function(){var a=3,b=e.createElement("div"),c=b.getElementsByTagName("i");do{b.innerHTML="\x3c!--[if gt IE "+ ++a+"]><i></i><![endif]--\x3e"}while(c[0]);return a>4?a:e.documentMode||d}(),u=function(){return{html:e.documentElement,body:e.body,head:e.getElementsByTagName("head")[0],title:e.title}},v=a.parent!==a.self,w="data ready thumbnail loadstart loadfinish image play pause progress fullscreen_enter fullscreen_exit idle_enter idle_exit rescale lightbox_open lightbox_close lightbox_image",x=function(){var a=[];return b.each(w.split(" "),function(b,c){a.push(c),/_/.test(c)&&a.push(c.replace(/_/g,""))}),a}(),y=function(a){var c;return"object"!=typeof a?a:(b.each(a,function(d,e){/^[a-z]+_/.test(d)&&(c="",b.each(d.split("_"),function(a,b){c+=a>0?b.substr(0,1).toUpperCase()+b.substr(1):b}),a[c]=e,delete a[d])}),a)},z=function(a){return b.inArray(a,x)>-1?c[a.toUpperCase()]:a},A={youtube:{reg:/https?:\/\/(?:[a-zA_Z]{2,3}.)?(?:youtube\.com\/watch\?)((?:[\w\d\-\_\=]+&amp;(?:amp;)?)*v(?:&lt;[A-Z]+&gt;)?=([0-9a-zA-Z\-\_]+))/i,embed:function(){return o+"//www.youtube.com/embed/"+this.id},get_thumb:function(a){return o+"//img.youtube.com/vi/"+this.id+"/default.jpg"},get_image:function(a){return o+"//img.youtube.com/vi/"+this.id+"/maxresdefault.jpg"}},vimeo:{reg:/https?:\/\/(?:www\.)?(vimeo\.com)\/(?:hd#)?([0-9]+)/i,embed:function(){return o+"//player.vimeo.com/video/"+this.id},getUrl:function(){return o+"//vimeo.com/api/v2/video/"+this.id+".json?callback=?"},get_thumb:function(a){return a[0].thumbnail_medium},get_image:function(a){return a[0].thumbnail_large}},dailymotion:{reg:/https?:\/\/(?:www\.)?(dailymotion\.com)\/video\/([^_]+)/,embed:function(){return o+"//www.dailymotion.com/embed/video/"+this.id},getUrl:function(){return"https://api.dailymotion.com/video/"+this.id+"?fields=thumbnail_240_url,thumbnail_720_url&callback=?"},get_thumb:function(a){return a.thumbnail_240_url},get_image:function(a){return a.thumbnail_720_url}},_inst:[]},B=function(c,d){for(var e=0;e<A._inst.length;e++)if(A._inst[e].id===d&&A._inst[e].type==c)return A._inst[e];this.type=c,this.id=d,this.readys=[],A._inst.push(this);var f=this;b.extend(this,A[c]),_videoThumbs=function(a){f.data=a,b.each(f.readys,function(a,b){b(f.data)}),f.readys=[]},this.hasOwnProperty("getUrl")?b.getJSON(this.getUrl(),_videoThumbs):a.setTimeout(_videoThumbs,400),this.getMedia=function(a,b,c){c=c||q;var d=this,e=function(c){b(d["get_"+a](c))};try{d.data?e(d.data):d.readys.push(e)}catch(a){c()}}},C=function(a){var b;for(var c in A)if((b=a&&A[c].reg&&a.match(A[c].reg))&&b.length)return{id:b[2],provider:c};return!1},D={support:function(){var a=u().html;return!v&&(a.requestFullscreen||a.msRequestFullscreen||a.mozRequestFullScreen||a.webkitRequestFullScreen)}(),callback:q,enter:function(a,b,c){this.instance=a,this.callback=b||q,c=c||u().html,c.requestFullscreen?c.requestFullscreen():c.msRequestFullscreen?c.msRequestFullscreen():c.mozRequestFullScreen?c.mozRequestFullScreen():c.webkitRequestFullScreen&&c.webkitRequestFullScreen()},exit:function(a){this.callback=a||q,e.exitFullscreen?e.exitFullscreen():e.msExitFullscreen?e.msExitFullscreen():e.mozCancelFullScreen?e.mozCancelFullScreen():e.webkitCancelFullScreen&&e.webkitCancelFullScreen()},instance:null,listen:function(){if(this.support){var a=function(){if(D.instance){var a=D.instance._fullscreen;e.fullscreen||e.mozFullScreen||e.webkitIsFullScreen||e.msFullscreenElement&&null!==e.msFullscreenElement?a._enter(D.callback):a._exit(D.callback)}};e.addEventListener("fullscreenchange",a,!1),e.addEventListener("MSFullscreenChange",a,!1),e.addEventListener("mozfullscreenchange",a,!1),e.addEventListener("webkitfullscreenchange",a,!1)}}},E=[],F=[],G=!1,H=!1,I=[],J=[],K=function(a){J.push(a),b.each(I,function(b,c){c._options.theme!=a.name&&(c._initialized||c._options.theme)||(c.theme=a,c._init.call(c))})},L=function(){return{clearTimer:function(a){b.each(c.get(),function(){this.clearTimer(a)})},addTimer:function(a){b.each(c.get(),function(){this.addTimer(a)})},array:function(a){return i.slice.call(a,0)},create:function(a,b){b=b||"div";var c=e.createElement(b);return c.className=a,c},removeFromArray:function(a,c){return b.each(a,function(b,d){if(d==c)return a.splice(b,1),!1}),a},getScriptPath:function(a){a=a||b("script:last").attr("src");var c=a.split("/");return 1==c.length?"":(c.pop(),c.join("/")+"/")},animate:function(){var d,f,g,h,i,j,k,l=function(b){var c,d="transition WebkitTransition MozTransition OTransition".split(" ");if(a.opera)return!1;for(c=0;d[c];c++)if(void 0!==b[d[c]])return d[c];return!1}((e.body||e.documentElement).style),m={MozTransition:"transitionend",OTransition:"oTransitionEnd",WebkitTransition:"webkitTransitionEnd",transition:"transitionend"}[l],n={_default:[.25,.1,.25,1],galleria:[.645,.045,.355,1],galleriaIn:[.55,.085,.68,.53],galleriaOut:[.25,.46,.45,.94],ease:[.25,0,.25,1],linear:[.25,.25,.75,.75],"ease-in":[.42,0,1,1],"ease-out":[0,0,.58,1],"ease-in-out":[.42,0,.58,1]},o=function(a,c,d){var e={};d=d||"transition",b.each("webkit moz ms o".split(" "),function(){e["-"+this+"-"+d]=c}),a.css(e)}
3542,p=function(a){o(a,"none","transition"),c.WEBKIT&&c.TOUCH&&(o(a,"translate3d(0,0,0)","transform"),a.data("revert")&&(a.css(a.data("revert")),a.data("revert",null)))};return function(e,r,s){return s=b.extend({duration:400,complete:q,stop:!1},s),e=b(e),s.duration?l?(s.stop&&(e.off(m),p(e)),d=!1,b.each(r,function(a,b){k=e.css(a),L.parseValue(k)!=L.parseValue(b)&&(d=!0),e.css(a,k)}),d?(f=[],g=s.easing in n?n[s.easing]:n._default,h=" "+s.duration+"ms cubic-bezier("+g.join(",")+")",void a.setTimeout(function(a,d,e,g){return function(){a.one(d,function(a){return function(){p(a),s.complete.call(a[0])}}(a)),c.WEBKIT&&c.TOUCH&&(i={},j=[0,0,0],b.each(["left","top"],function(b,c){c in e&&(j[b]=L.parseValue(e[c])-L.parseValue(a.css(c))+"px",i[c]=e[c],delete e[c])}),(j[0]||j[1])&&(a.data("revert",i),f.push("-webkit-transform"+g),o(a,"translate3d("+j.join(",")+")","transform"))),b.each(e,function(a,b){f.push(a+g)}),o(a,f.join(",")),a.css(e)}}(e,m,r,h),2)):void a.setTimeout(function(){s.complete.call(e[0])},s.duration)):void e.animate(r,s):(e.css(r),void s.complete.call(e[0]))}}(),removeAlpha:function(a){if(a instanceof h&&(a=a[0]),t<9&&a){var b=a.style,c=a.currentStyle,d=c&&c.filter||b.filter||"";/alpha/.test(d)&&(b.filter=d.replace(/alpha\([^)]*\)/i,""))}},forceStyles:function(a,c){a=b(a),a.attr("style")&&a.data("styles",a.attr("style")).removeAttr("style"),a.css(c)},revertStyles:function(){b.each(L.array(arguments),function(a,c){c=b(c),c.removeAttr("style"),c.attr("style",""),c.data("styles")&&c.attr("style",c.data("styles")).data("styles",null)})},moveOut:function(a){L.forceStyles(a,{position:"absolute",left:-1e4})},moveIn:function(){L.revertStyles.apply(L,L.array(arguments))},hide:function(a,c,d){d=d||q;var e=b(a);a=e[0],e.data("opacity")||e.data("opacity",e.css("opacity"));var f={opacity:0}
3542;if(c){var g=t<9&&a?function(){L.removeAlpha(a),a.style.visibility="hidden",d.call(a)}:d;L.animate(a,f,{duration:c,complete:g,stop:!0})}else t<9&&a?(L.removeAlpha(a),a.style.visibility="hidden"):e.css(f)},show:function(a,c,d){d=d||q;var e=b(a);a=e[0];var f=parseFloat(e.data("opacity"))||1,g={opacity:f};if(c){t<9&&(e.css("opacity",0),a.style.visibility="visible");var h=t<9&&a?function(){1==g.opacity&&L.removeAlpha(a),d.call(a)}:d;L.animate(a,g,{duration:c,complete:h,stop:!0})}else t<9&&1==g.opacity&&a?(L.removeAlpha(a),a.style.visibility="visible"):e.css(g)},wait:function(d){c._waiters=c._waiters||[],d=b.extend({until:r,success:q,error:function(){c.raise("Could not complete wait function.")},timeout:3e3},d);var e,f,g,h=L.timestamp(),i=function(){return f=L.timestamp(),e=f-h,L.removeFromArray(c._waiters,g),d.until(e)?(d.success(),!1):"number"==typeof d.timeout&&f>=h+d.timeout?(d.error(),!1):void c._waiters.push(g=a.setTimeout(i,10))};c._waiters.push(g=a.setTimeout(i,10))},toggleQuality:function(a,b){7!==t&&8!==t||!a||"IMG"!=a.nodeName.toUpperCase()||(void 0===b&&(b="nearest-neighbor"===a.style.msInterpolationMode),a.style.msInterpolationMode=b?"bicubic":"nearest-neighbor")},insertStyleTag:function(a,c){if(!c||!b("#"+c).length){var d=e.createElement("style");if(c&&(d.id=c),u().head.appendChild(d),d.styleSheet)d.styleSheet.cssText=a;else{var f=e.createTextNode(a);d.appendChild(f)}}},loadScript:function(a,c){var d=!1,e=b("<script>").attr({src:a,async:!0}).get(0);e.onload=e.onreadystatechange=function(){d||this.readyState&&"loaded"!==this.readyState&&"complete"!==this.readyState||(d=!0,e.onload=e.onreadystatechange=null,"function"==typeof c&&c.call(this,this))},u().head.appendChild(e)},parseValue:function(a){if("number"==typeof a)return a;if("string"==typeof a){var b=a.match(/\-?\d|\./g);return b&&b.constructor===Array?1*b.join(""):0}return 0},timestamp:function(){return(new Date).getTime()},loadCSS:function(a,f,g){var h,i;if(b("link[rel=stylesheet]").each(function(){if(new RegExp(a).test(this.href))return h=this,!1}),"function"==typeof f&&(g=f,f=d),g=g||q,h)return g.call(h,h),h;if(i=e.styleSheets.length,b("#"+f).length)b("#"+f).attr("href",a),i--;else{h=b("<link>").attr({rel:"stylesheet",href:a,id:f}).get(0);var j=b('link[rel="stylesheet"], style');if(j.length?j.get(0).parentNode.insertBefore(h,j[0]):u().head.appendChild(h),t&&i>=31)return void c.raise("You have reached the browser stylesheet limit (31)",!0)}if("function"==typeof g){var k=b("<s>").attr("id","galleria-loader").hide().appendTo(u().body);L.wait({until:function(){return k.height()>0},success:function(){k.remove(),g.call(h,h)},error:function(){k.remove(),c.raise("Theme CSS could not load after 20 sec. "+(c.QUIRK?"Your browser is in Quirks Mode, please add a correct doctype.":"Please download the latest theme."),!0)},timeout:5e3})}return h}}}(),M=function(a){return L.insertStyleTag(".galleria-videoicon{width:60px;height:60px;position:absolute;top:50%;left:50%;z-index:1;margin:-30px 0 0 -30px;cursor:pointer;background:#000;background:rgba(0,0,0,.8);border-radius:3px;-webkit-transition:all 150ms}.galleria-videoicon i{width:0px;height:0px;border-style:solid;border-width:10px 0 10px 16px;display:block;border-color:transparent transparent transparent #ffffff;margin:20px 0 0 22px}.galleria-image:hover .galleria-videoicon{background:#000}","galleria-videoicon"),b(L.create("galleria-videoicon")).html("<i></i>").appendTo(a).click(function(){b(this).siblings("img").mouseup()})},N=function(){var a=function(a,c,d,e){var f=this.getOptions("easing"),g=this.getStageWidth(),h={left:g*(a.rewind?-1:1)},i={left:0};d?(h.opacity=0,i.opacity=1):h.opacity=1,b(a.next).css(h),L.animate(a.next,i,{duration:a.speed,complete:function(a){return function(){c(),a.css({left:0})}}(b(a.next).add(a.prev)),queue:!1,easing:f}),e&&(a.rewind=!a.rewind),a.prev&&(h={left:0},i={left:g*(a.rewind?1:-1)},d&&(h.opacity=1,i.opacity=0),b(a.prev).css(h),L.animate(a.prev,i,{duration:a.speed,queue:!1,easing:f,complete:function(){b(this).css("opacity",0)}}))};return{active:!1,init:function(a,b,c){N.effects.hasOwnProperty(a)&&N.effects[a].call(this,b,c)},effects:{fade:function(a,c){b(a.next).css({opacity:0,left:0}),L.animate(a.next,{opacity:1},{duration:a.speed,complete:c}),a.prev&&(b(a.prev).css("opacity",1).show(),L.animate(a.prev,{opacity:0}
3542,{duration:a.speed}))},flash:function(a,c){b(a.next).css({opacity:0,left:0}),a.prev?L.animate(a.prev,{opacity:0},{duration:a.speed/2,complete:function(){L.animate(a.next,{opacity:1},{duration:a.speed,complete:c})}}):L.animate(a.next,{opacity:1},{duration:a.speed,complete:c})},pulse:function(a,c){a.prev&&b(a.prev).hide(),b(a.next).css({opacity:0,left:0}).show(),L.animate(a.next,{opacity:1},{duration:a.speed,complete:c})},slide:function(b,c){a.apply(this,L.array(arguments))},fadeslide:function(b,c){a.apply(this,L.array(arguments).concat([!0]))},doorslide:function(b,c){a.apply(this,L.array(arguments).concat([!1,!0]))}}}}();return D.listen(),b.event.special["click:fast"]={propagate:!0,add:function(c){var d=function(a){if(a.touches&&a.touches.length){var b=a.touches[0];return{x:b.pageX,y:b.pageY}}},e={touched:!1,touchdown:!1,coords:{x:0,y:0},evObj:{}};b(this).data({clickstate:e,timer:0}).on("touchstart.fast",function(c){a.clearTimeout(b(this).data("timer")),b(this).data("clickstate",{touched:!0,touchdown:!0,coords:d(c.originalEvent),evObj:c})}).on("touchmove.fast",function(a){var c=d(a.originalEvent),e=b(this).data("clickstate");Math.max(Math.abs(e.coords.x-c.x),Math.abs(e.coords.y-c.y))>6&&b(this).data("clickstate",b.extend(e,{touchdown:!1}))}).on("touchend.fast",function(d){var f=b(this);f.data("clickstate").touchdown&&c.handler.call(this,d),f.data("timer",a.setTimeout(function(){f.data("clickstate",e)},400))}).on("click.fast",function(a){if(b(this).data("clickstate").touched)return!1;b(this).data("clickstate",e),c.handler.call(this,a)})},remove:function(){b(this).off("touchstart.fast touchmove.fast touchend.fast click.fast")}},g.on("orientationchange",function(){b(this).resize()}),c=function(){var h=this;this._options={},this._playing=!1,this._playtime=5e3,this._active=null,this._queue={length:0},this._data=[],this._dom={},this._thumbnails=[],this._layers=[],this._initialized=!1,this._firstrun=!1,this._stageWidth=0,this._stageHeight=0,this._target=d,this._binds=[],this._id=parseInt(1e4*p.random(),10),b.each("container stage images image-nav image-nav-left image-nav-right info info-text info-title info-description thumbnails thumbnails-list thumbnails-container thumb-nav-left thumb-nav-right loader counter tooltip".split(" "),function(a,b){h._dom[b]=L.create("galleria-"+b)}),b.each("current total".split(" "),function(a,b){h._dom[b]=L.create("galleria-"+b,"span")});var i=this._keyboard={keys:{UP:38,DOWN:40,LEFT:37,RIGHT:39,RETURN:13,ESCAPE:27,BACKSPACE:8,SPACE:32},map:{},bound:!1,press:function(a){var b=a.keyCode||a.which;b in i.map&&"function"==typeof i.map[b]&&i.map[b].call(h,a)},attach:function(a){var b,c;for(b in a)a.hasOwnProperty(b)&&(c=b.toUpperCase(),c in i.keys?i.map[i.keys[c]]=a[b]:i.map[c]=a[b]);i.bound||(i.bound=!0,f.on("keydown",i.press))},detach:function(){i.bound=!1,i.map={},f.off("keydown",i.press)}},j=this._controls={0:d,1:d,active:0,swap:function(){j.active=j.active?0:1},getActive:function(){return h._options.swipe?j.slides[h._active]:j[j.active]},getNext:function(){return h._options.swipe?j.slides[h.getNext(h._active)]:j[1-j.active]},slides:[],frames:[],layers:[]},k=this._carousel={next:h.$("thumb-nav-right"),prev:h.$("thumb-nav-left"),width:0,current:0,max:0,hooks:[],update:function(){var a=0,c=0,d=[0];b.each(h._thumbnails,function(e,f){if(f.ready){a+=f.outerWidth||b(f.container).outerWidth(!0);var g=b(f.container).width();a+=g-p.floor(g),d[e+1]=a,c=p.max(c,f.outerHeight||b(f.container).outerHeight(!0))}}),h.$("thumbnails").css({width:a,height:c}),k.max=a,k.hooks=d,k.width=h.$("thumbnails-list").width(),k.setClasses(),h.$("thumbnails-container").toggleClass("galleria-carousel",a>k.width),k.width=h.$("thumbnails-list").width()},bindControls:function(){var a;k.next.on("click:fast",function(b){if(b.preventDefault(),"auto"===h._options.carouselSteps){for(a=k.current;a<k.hooks.length;a++)if(k.hooks[a]-k.hooks[k.current]>k.width){k.set(a-2);break}}else k.set(k.current+h._options.carouselSteps)}),k.prev.on("click:fast",function(b){if(b.preventDefault(),"auto"===h._options.carouselSteps)for(a=k.current;a>=0;a--){if(k.hooks[k.current]-k.hooks[a]>k.width){k.set(a+2);break}if(0===a){k.set(0);break}}else k.set(k.current-h._options.carouselSteps)})},set:function(a){for(a=p.max(a,0);k.hooks[a-1]+k.width>=k.max&&a>=0;)a--;k.current=a,k.animate()},getLast:function(a){return(a||k.current)-1}
3542,follow:function(a){if(0===a||a===k.hooks.length-2)return void k.set(a);for(var b=k.current;k.hooks[b]-k.hooks[k.current]<k.width&&b<=k.hooks.length;)b++;a-1<k.current?k.set(a-1):a+2>b&&k.set(a-b+k.current+2)},setClasses:function(){k.prev.toggleClass("disabled",!k.current),k.next.toggleClass("disabled",k.hooks[k.current]+k.width>=k.max)},animate:function(a){k.setClasses();var c=-1*k.hooks[k.current];isNaN(c)||(h.$("thumbnails").css("left",function(){return b(this).css("left")}),L.animate(h.get("thumbnails"),{left:c},{duration:h._options.carouselSpeed,easing:h._options.easing,queue:!1}))}},l=this._tooltip={initialized:!1,open:!1,timer:"tooltip"+h._id,swapTimer:"swap"+h._id,init:function(){l.initialized=!0;L.insertStyleTag(".galleria-tooltip{padding:3px 8px;max-width:50%;background:#ffe;color:#000;z-index:3;position:absolute;font-size:11px;line-height:1.3;opacity:0;box-shadow:0 0 2px rgba(0,0,0,.4);-moz-box-shadow:0 0 2px rgba(0,0,0,.4);-webkit-box-shadow:0 0 2px rgba(0,0,0,.4);}","galleria-tooltip"),h.$("tooltip").css({opacity:.8,visibility:"visible",display:"none"})},move:function(a){var b=h.getMousePosition(a).x,c=h.getMousePosition(a).y,d=h.$("tooltip"),e=b,f=c,g=d.outerHeight(!0)+1,i=d.outerWidth(!0),j=g+15,k=h.$("container").width()-i-2,l=h.$("container").height()-g-2;isNaN(e)||isNaN(f)||(e+=10,f-=g+8,e=p.max(0,p.min(k,e)),f=p.max(0,p.min(l,f)),c<j&&(f=j),d.css({left:e,top:f}))},bind:function(a,d){if(!c.TOUCH){l.initialized||l.init();var e=function(){h.$("container").off("mousemove",l.move),h.clearTimer(l.timer),h.$("tooltip").stop().animate({opacity:0}
3542,200,function(){h.$("tooltip").hide(),h.addTimer(l.swapTimer,function(){l.open=!1},1e3)})},f=function(a,c){l.define(a,c),b(a).hover(function(){h.clearTimer(l.swapTimer),h.$("container").off("mousemove",l.move).on("mousemove",l.move).trigger("mousemove"),l.show(a),h.addTimer(l.timer,function(){h.$("tooltip").stop().show().animate({opacity:1}),l.open=!0},l.open?0:500)},e).click(e)};"string"==typeof d?f(a in h._dom?h.get(a):a,d):b.each(a,function(a,b){f(h.get(a),b)})}},show:function(c){c=b(c in h._dom?h.get(c):c);var d=c.data("tt"),e=function(b){a.setTimeout(function(a){return function(){l.move(a)}}(b),10),c.off("mouseup",e)};(d="function"==typeof d?d():d)&&(h.$("tooltip").html(d.replace(/\s/,"&#160;")),c.on("mouseup",e))},define:function(a,c){if("function"!=typeof c){var d=c;c=function(){return d}}a=b(a in h._dom?h.get(a):a).data("tt",c),l.show(a)}},n=this._fullscreen={scrolled:0,crop:d,active:!1,prev:b(),beforeEnter:function(a){a()},beforeExit:function(a){a()},keymap:h._keyboard.map,parseCallback:function(a,c){return N.active?function(){"function"==typeof a&&a.call(h);var d=h._controls.getActive(),e=h._controls.getNext();h._scaleImage(e),h._scaleImage(d),c&&h._options.trueFullscreen&&b(d.container).add(e.container).trigger("transitionend")}:a},enter:function(b){n.beforeEnter(function(){b=n.parseCallback(b,!0),h._options.trueFullscreen&&D.support?(n.active=!0,L.forceStyles(h.get("container"),{width:"100%",height:"100%"}),h.rescale(),c.MAC?c.SAFARI&&/version\/[1-5]/.test(m)?(h.$("stage").css("opacity",0),a.setTimeout(function(){n.scale(),h.$("stage").css("opacity",1)},4)):(h.$("container").css("opacity",0).addClass("fullscreen"),a.setTimeout(function(){n.scale(),h.$("container").css("opacity",1)},50)):h.$("container").addClass("fullscreen"),g.resize(n.scale),D.enter(h,b,h.get("container"))):(n.scrolled=g.scrollTop(),c.TOUCH||a.scrollTo(0,0),n._enter(b))})},_enter:function(f){n.active=!0,v&&(n.iframe=function(){var d,f=e.referrer,g=e.createElement("a"),h=a.location;return g.href=f,g.protocol!=h.protocol||g.hostname!=h.hostname||g.port!=h.port?(c.raise("Parent fullscreen not available. Iframe protocol, domains and ports must match."),!1):(n.pd=a.parent.document,b(n.pd).find("iframe").each(function(){if((this.contentDocument||this.contentWindow.document)===e)return d=this,!1}),d)}()),L.hide(h.getActiveImage()),v&&n.iframe&&(n.iframe.scrolled=b(a.parent).scrollTop(),a.parent.scrollTo(0,0));var i=h.getData(),j=h._options,k=!h._options.trueFullscreen||!D.support,l={height:"100%",overflow:"hidden",margin:0,padding:0};if(k&&(h.$("container").addClass("fullscreen"),n.prev=h.$("container").prev(),n.prev.length||(n.parent=h.$("container").parent()),h.$("container").appendTo("body"),L.forceStyles(h.get("container"),{position:c.TOUCH?"absolute":"fixed",top:0,left:0,width:"100%",height:"100%",zIndex:1e4}),L.forceStyles(u().html,l),L.forceStyles(u().body,l)),v&&n.iframe&&(L.forceStyles(n.pd.documentElement,l),L.forceStyles(n.pd.body,l),L.forceStyles(n.iframe,b.extend(l,{width:"100%",height:"100%",top:0,left:0,position:"fixed",zIndex:1e4,border:"none"}))),n.keymap=b.extend({},h._keyboard.map),h.attachKeyboard({escape:h.exitFullscreen,right:h.next,left:h.prev}),n.crop=j.imageCrop,j.fullscreenCrop!=d&&(j.imageCrop=j.fullscreenCrop),i&&i.big&&i.image!==i.big){var m=new c.Picture,o=m.isCached(i.big),p=h.getIndex(),q=h._thumbnails[p];h.trigger({type:c.LOADSTART,cached:o,rewind:!1,index:p,imageTarget:h.getActiveImage(),thumbTarget:q,galleriaData:i}),m.load(i.big,function(a){h._scaleImage(a,{complete:function(a){h.trigger({type:c.LOADFINISH,cached:o,index:p,rewind:!1,imageTarget:a.image,thumbTarget:q});var d=h._controls.getActive().image;d&&(b(d).width(a.image.width).height(a.image.height).attr("style",b(a.image).attr("style")),a.image.src.srcset&&b(d).attr("srcset",a.image.src.srcset),a.image.src.sizes&&b(d).attr("sizes",a.image.src.sizes),b(d).attr("src",a.image.src))}})});var r=h.getNext(p),s=new c.Picture,t=h.getData(r);s.preload(h.isFullscreen()&&t.big?t.big:t.image)}h.rescale(function(){h.addTimer(!1,function(){k&&L.show(h.getActiveImage()),"function"==typeof f&&f.call(h),h.rescale()},100),h.trigger(c.FULLSCREEN_ENTER)}),k?g.resize(n.scale):L.show(h.getActiveImage())},scale:function(){h.rescale()}
3542,exit:function(a){n.beforeExit(function(){a=n.parseCallback(a),h._options.trueFullscreen&&D.support?D.exit(a):n._exit(a)})},_exit:function(b){n.active=!1;var d=!h._options.trueFullscreen||!D.support,e=h.$("container").removeClass("fullscreen");if(n.parent?n.parent.prepend(e):e.insertAfter(n.prev),d){L.hide(h.getActiveImage()),L.revertStyles(h.get("container"),u().html,u().body),c.TOUCH||a.scrollTo(0,n.scrolled);var f=h._controls.frames[h._controls.active];f&&f.image&&(f.image.src=f.image.src)}v&&n.iframe&&(L.revertStyles(n.pd.documentElement,n.pd.body,n.iframe),n.iframe.scrolled&&a.parent.scrollTo(0,n.iframe.scrolled)),h.detachKeyboard(),h.attachKeyboard(n.keymap),h._options.imageCrop=n.crop;var i=h.getData().big,j=h._controls.getActive().image;!h.getData().iframe&&j&&i&&i==j.src&&a.setTimeout(function(a){return function(){j.src=a}}(h.getData().image),1),h.rescale(function(){h.addTimer(!1,function(){d&&L.show(h.getActiveImage()),"function"==typeof b&&b.call(h),g.trigger("resize")},50),h.trigger(c.FULLSCREEN_EXIT)}),g.off("resize",n.scale)}},o=this._idle={trunk:[],bound:!1,active:!1,add:function(a,d,e,f){if(a&&!c.TOUCH){o.bound||o.addEvent(),a=b(a),"boolean"==typeof e&&(f=e,e={}),e=e||{};var g,h={};for(g in d)d.hasOwnProperty(g)&&(h[g]=a.css(g));a.data("idle",{from:b.extend(h,e),to:d,complete:!0,busy:!1}),f?a.css(d):o.addTimer(),o.trunk.push(a)}},remove:function(a){a=b(a),b.each(o.trunk,function(b,c){c&&c.length&&!c.not(a).length&&(a.css(a.data("idle").from),o.trunk.splice(b,1))}),o.trunk.length||(o.removeEvent(),h.clearTimer(o.timer))},addEvent:function(){o.bound=!0,h.$("container").on("mousemove click",o.showAll),"hover"==h._options.idleMode&&h.$("container").on("mouseleave",o.hide)},removeEvent:function(){o.bound=!1,h.$("container").on("mousemove click",o.showAll),"hover"==h._options.idleMode&&h.$("container").off("mouseleave",o.hide)},addTimer:function(){"hover"!=h._options.idleMode&&h.addTimer("idle",function(){o.hide()},h._options.idleTime)},hide:function(){if(h._options.idleMode&&!1!==h.getIndex()){h.trigger(c.IDLE_ENTER);var a=o.trunk.length;b.each(o.trunk,function(b,c){var d=c.data("idle");d&&(c.data("idle").complete=!1,L.animate(c,d.to,{duration:h._options.idleSpeed,complete:function(){b==a-1&&(o.active=!1)}}))})}},showAll:function(){h.clearTimer("idle"),b.each(o.trunk,function(a,b){o.show(b)})},show:function(a){var d=a.data("idle");o.active&&(d.busy||d.complete)||(d.busy=!0,h.trigger(c.IDLE_EXIT),h.clearTimer("idle"),L.animate(a,d.from,{duration:h._options.idleSpeed/2,complete:function(){o.active=!0,b(a).data("idle").busy=!1,b(a).data("idle").complete=!0}})),o.addTimer()}},q=this._lightbox={width:0,height:0,initialized:!1,active:null,image:null,elems:{},keymap:!1,init:function(){if(!q.initialized){q.initialized=!0;var a={},d=h._options,e="",f="position:absolute;",g="lightbox-",i={overlay:"position:fixed;display:none;opacity:"+d.overlayOpacity+";filter:alpha(opacity="+100*d.overlayOpacity+");top:0;left:0;width:100%;height:100%;background:"+d.overlayBackground+";z-index:99990",box:"position:fixed;display:none;width:400px;height:400px;top:50%;left:50%;margin-top:-200px;margin-left:-200px;z-index:99991",shadow:f+"background:#000;width:100%;height:100%;",content:f+"background-color:#fff;top:10px;left:10px;right:10px;bottom:10px;overflow:hidden",info:f+"bottom:10px;left:10px;right:10px;color:#444;font:11px/13px arial,sans-serif;height:13px",close:f+"top:10px;right:10px;height:20px;width:20px;background:#fff;text-align:center;cursor:pointer;color:#444;font:16px/22px arial,sans-serif;z-index:99999",image:f+"top:10px;left:10px;right:10px;bottom:30px;overflow:hidden;display:block;",prevholder:f+"width:50%;top:0;bottom:40px;cursor:pointer;",nextholder:f+"width:50%;top:0;bottom:40px;right:-1px;cursor:pointer;",prev:f+"top:50%;margin-top:-20px;height:40px;width:30px;background:#fff;left:20px;display:none;text-align:center;color:#000;font:bold 16px/36px arial,sans-serif",next:f+"top:50%;margin-top:-20px;height:40px;width:30px;background:#fff;right:20px;left:auto;display:none;font:bold 16px/36px arial,sans-serif;text-align:center;color:#000",title:"float:left",counter:"float:right;margin-left:8px;"},j={},k="";k=t>7?t<9?"background:#000;filter:alpha(opacity=0);":"background:rgba(0,0,0,0);":"z-index:99999",i.nextholder+=k,i.prevholder+=k,b.each(i,function(a,b){e+=".galleria-"+g+a+"{"+b+"}"}),e+=".galleria-lightbox-box.iframe .galleria-lightbox-prevholder,.galleria-lightbox-box.iframe .galleria-lightbox-nextholder{width:100px;height:100px;top:50%;
3542margin-top:-70px}",L.insertStyleTag(e,"galleria-lightbox"),b.each("overlay box content shadow title info close prevholder prev nextholder next counter image".split(" "),function(b,c){h.addElement("lightbox-"+c),a[c]=q.elems[c]=h.get("lightbox-"+c)}),q.image=new c.Picture,b.each({box:"shadow content close prevholder nextholder",info:"title counter",content:"info image",prevholder:"prev",nextholder:"next"},function(a,c){var d=[];b.each(c.split(" "),function(a,b){d.push(g+b)}),j[g+a]=d}),h.append(j),b(a.image).append(q.image.container),b(u().body).append(a.overlay,a.box),function(a){a.hover(function(){b(this).css("color","#bbb")},function(){b(this).css("color","#444")})}(b(a.close).on("click:fast",q.hide).html("&#215;")),b.each(["Prev","Next"],function(d,e){var f=b(a[e.toLowerCase()]).html(/v/.test(e)?"&#8249;&#160;":"&#160;&#8250;"),g=b(a[e.toLowerCase()+"holder"]);if(g.on("click:fast",function(){q["show"+e]()}),t<8||c.TOUCH)return void f.show();g.hover(function(){f.show()},function(a){f.stop().fadeOut(200)})}),b(a.overlay).on("click:fast",q.hide),c.IPAD&&(h._options.lightboxTransitionSpeed=0)}},rescale:function(a){var d=p.min(g.width()-40,q.width),e=p.min(g.height()-60,q.height),f=p.min(d/q.width,e/q.height),i=p.round(q.width*f)+40,j=p.round(q.height*f)+60,k={width:i,height:j,"margin-top":-1*p.ceil(j/2),"margin-left":-1*p.ceil(i/2)};a?b(q.elems.box).css(k):b(q.elems.box).animate(k,{duration:h._options.lightboxTransitionSpeed,easing:h._options.easing,complete:function(){var a=q.image,d=h._options.lightboxFadeSpeed;h.trigger({type:c.LIGHTBOX_IMAGE,imageTarget:a.image}),b(a.container).show(),b(a.image).animate({opacity:1},d),L.show(q.elems.info,d)}})},hide:function(){q.image.image=null,g.off("resize",q.rescale),b(q.elems.box).hide().find("iframe").remove(),L.hide(q.elems.info),h.detachKeyboard(),h.attachKeyboard(q.keymap),q.keymap=!1,L.hide(q.elems.overlay,200,function(){b(this).hide().css("opacity",h._options.overlayOpacity),h.trigger(c.LIGHTBOX_CLOSE)})},showNext:function(){q.show(h.getNext(q.active))},showPrev:function(){q.show(h.getPrev(q.active))},show:function(d){q.active=d="number"==typeof d?d:h.getIndex()||0,q.initialized||q.init(),h.trigger(c.LIGHTBOX_OPEN),q.keymap||(q.keymap=b.extend({},h._keyboard.map),h.attachKeyboard({escape:q.hide,right:q.showNext,left:q.showPrev})),g.off("resize",q.rescale);var e,f,i,j=h.getData(d),k=h.getDataLength(),l=h.getNext(d);L.hide(q.elems.info);try{for(i=h._options.preload;i>0;i--)f=new c.Picture,e=h.getData(l),f.preload(e.big?e.big:e.image),l=h.getNext(l)}catch(a){}q.image.isIframe=j.iframe&&!j.image,b(q.elems.box).toggleClass("iframe",q.image.isIframe),b(q.image.container).find(".galleria-videoicon").remove(),q.image.load(j.big||j.image||j.iframe,function(c){if(c.isIframe){var e=b(a).width(),f=b(a).height();if(c.video&&h._options.maxVideoSize){var i=p.min(h._options.maxVideoSize/e,h._options.maxVideoSize/f);i<1&&(e*=i,f*=i)}q.width=e,q.height=f}else q.width=c.original.width,q.height=c.original.height;if(b(c.image).css({width:c.isIframe?"100%":"100.1%",height:c.isIframe?"100%":"100.1%",top:0,bottom:0,zIndex:99998,opacity:0,visibility:"visible"}).parent().height("100%"),q.elems.title.innerHTML=j.title||"",q.elems.counter.innerHTML=d+1+" / "+k,g.resize(q.rescale),q.rescale(),j.image&&j.iframe){if(b(q.elems.box).addClass("iframe"),j.video){var l=M(c.container).hide();a.setTimeout(function(){l.fadeIn(200)},200)}b(c.image).css("cursor","pointer").mouseup(function(a,c){return function(d){b(q.image.container).find(".galleria-videoicon").remove(),d.preventDefault(),c.isIframe=!0,c.load(a.iframe+(a.video?"&autoplay=1":""),{width:"100%",height:t<8?b(q.image.container).height():"100%"})}}(j,c))}}),b(q.elems.overlay).show().css("visibility","visible"),b(q.elems.box).show()}},r=this._timer={trunk:{},add:function(b,c,d,e){if(b=b||(new Date).getTime(),e=e||!1,this.clear(b),e){var f=c;c=function(){f(),r.add(b,c,d)}}this.trunk[b]=a.setTimeout(c,d)},clear:function(b){var c,d=function(b){a.clearTimeout(this.trunk[b]),delete this.trunk[b]};if(b&&b in this.trunk)d.call(this,b);else if(void 0===b)for(c in this.trunk)this.trunk.hasOwnProperty(c)&&d.call(this,c)}};return this},c.prototype={constructor:c,init:function(a,e){if(e=y(e),this._original={target:a,options:e,data:null},this._target=this._dom.target=a.nodeName?a:b(a).get(0),this._original.html=this._target.innerHTML,F.push(this),!this._target)return void c.raise("Target not found",!0);if(this._options={autoplay:!1,carousel:!0,carouselFollow:!0,carouselSpeed:400,carouselSteps:"auto",clicknext:!1,dailymotion:{foreground:"%23EEEEEE",highlight:"%235BCEC5",background:"%23222222",logo:0,hideInfos:1},dataConfig:function(a){return{}},dataSelector:"img",dataSort:!1,dataSource:this._target,debug:d,dummy:d,easing:"galleria",extend:function(a){},fullscreenCrop:d,fullscreenDoubleTap:!0,fullscreenTransition:d,height:0,idleMode:!0,idleTime:3e3,idleSpeed:200,imageCrop:!1,imageMargin:0,imagePan:!1,imagePanSmoothness:12,imagePosition:"50%",imageTimeout:d,initialTransition:d,
3542keepSource:!1,layerFollow:!0,lightbox:!1,lightboxFadeSpeed:200,lightboxTransitionSpeed:200,linkSourceImages:!0,maxScaleRatio:d,maxVideoSize:d,minScaleRatio:d,overlayOpacity:.85,overlayBackground:"#0b0b0b",pauseOnInteraction:!0,popupLinks:!1,preload:2,queue:!0,responsive:!0,show:0,showInfo:!0,showCounter:!0,showImagenav:!0,swipe:"auto",theme:null,thumbCrop:!0,thumbEventType:"click:fast",thumbMargin:0,thumbQuality:"auto",thumbDisplayOrder:!0,
3543thumbPosition:"50%",thumbnails:!0,touchTransition:d,transition:"fade",transitionInitial:d,transitionSpeed:400,trueFullscreen:!0,useCanvas:!1,variation:"",videoPoster:!0,vimeo:{title:0,byline:0,portrait:0,color:"aaaaaa"},wait:5e3,width:"auto",youtube:{modestbranding:1,autohide:1,color:"white",hd:1,rel:0,showinfo:0}},this._options.initialTransition=this._options.initialTransition||this._options.transitionInitial,e&&(!1===e.debug&&(j=!1),"number"==typeof e.imageTimeout&&(k=e.imageTimeout),"string"==typeof e.dummy&&(l=e.dummy),"string"==typeof e.theme&&(this._options.theme=e.theme)),b(this._target).children().hide(),c.QUIRK&&c.raise("Your page is in Quirks mode, Galleria may not render correctly. Please validate your HTML and add a correct doctype."),J.length)if(this._options.theme){for(var f=0;f<J.length;f++)if(this._options.theme===J[f].name){this.theme=J[f];break}}else this.theme=J[0];return"object"==typeof this.theme?this._init():I.push(this),this},_init:function(){var f=this,h=this._options;if(this._initialized)return c.raise("Init failed: Gallery instance already initialized."),this;if(this._initialized=!0,!this.theme)return c.raise("Init failed: No theme found.",!0),this;if(b.extend(!0,h,this.theme.defaults,this._original.options,c.configure.options),h.swipe=function(a){return"enforced"==a||!1!==a&&"disabled"!=a&&!!c.TOUCH}(h.swipe),h.swipe&&(h.clicknext=!1,h.imagePan=!1),function(a){if(!("getContext"in a))return void(a=null);H=H||{elem:a,context:a.getContext("2d"),cache:{},length:0}}(e.createElement("canvas")),this.bind(c.DATA,function(){a.screen&&a.screen.width&&Array.prototype.forEach&&this._data.forEach(function(b){var c="devicePixelRatio"in a?a.devicePixelRatio:1;p.max(a.screen.width,a.screen.height)*c<1024&&(b.big=b.image)}),this._original.data=this._data,this.get("total").innerHTML=this.getDataLength();var b=this.$("container");f._options.height<2&&(f._userRatio=f._ratio=f._options.height);var d={width:0,height:0},e=function(){return f.$("stage").height()};L.wait({until:function(){return d=f._getWH(),b.width(d.width).height(d.height),e()&&d.width&&d.height>50},success:function(){f._width=d.width,f._height=d.height,f._ratio=f._ratio||d.height/d.width,c.WEBKIT?a.setTimeout(function(){f._run()},1):f._run()},error:function(){e()?c.raise("Could not extract sufficient width/height of the gallery container. Traced measures: width:"+d.width+"px, height: "+d.height+"px.",!0):c.raise("Could not extract a stage height from the CSS. Traced height: "+e()+"px.",!0)},timeout:"number"==typeof this._options.wait&&this._options.wait})}),this.append({"info-text":["info-title","info-description"],info:["info-text"],"image-nav":["image-nav-right","image-nav-left"],stage:["images","loader","counter","image-nav"],"thumbnails-list":["thumbnails"],"thumbnails-container":["thumb-nav-left","thumbnails-list","thumb-nav-right"],container:["stage","thumbnails-container","info","tooltip"]}),L.hide(this.$("counter").append(this.get("current"),e.createTextNode(" / "),this.get("total"))),this.setCounter("&#8211;"),L.hide(f.get("tooltip")),this.$("container").addClass([c.TOUCH?"touch":"notouch",this._options.variation,"galleria-theme-"+this.theme.name].join(" ")),this._options.swipe||b.each(new Array(2),function(a){var d=new c.Picture;b(d.container).css({position:"absolute",top:0,left:0}).prepend(f._layers[a]=b(L.create("galleria-layer")).css({position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:2})[0]),f.$("images").append(d.container),f._controls[a]=d;var e=new c.Picture;e.isIframe=!0,b(e.container).attr("class","galleria-frame").css({position:"absolute",top:0,left:0,zIndex:4,background:"#000",display:"none"}).appendTo(d.container),f._controls.frames[a]=e}),this.$("images").css({position:"relative",top:0,left:0,width:"100%",height:"100%"}),h.swipe&&(this.$("images").css({position:"absolute",top:0,left:0,width:0,height:"100%"}),this.finger=new c.Finger(this.get("stage"),{onchange:function(a){f.pause().show(a)},oncomplete:function(a){var c=p.max(0,p.min(parseInt(a,10),f.getDataLength()-1)),d=f.getData(c);
3543b(f._thumbnails[c].container).addClass("active").siblings(".active").removeClass("active"),d&&(f.$("images").find(".galleria-frame").css("opacity",0).hide().find("iframe").remove(),f._options.carousel&&f._options.carouselFollow&&f._carousel.follow(c))}}),this.bind(c.RESCALE,function(){this.finger.setup()}),this.$("stage").on("click",function(c){var e=f.getData();if(e){if(e.iframe){f.isPlaying()&&f.pause();var g=f._controls.frames[f._active],h=f._stageWidth,i=f._stageHeight;if(b(g.container).find("iframe").length)return;return b(g.container).css({width:h,height:i,opacity:0}).show().animate({opacity:1},200),void a.setTimeout(function(){g.load(e.iframe+(e.video?"&autoplay=1":""),{width:h,height:i},function(a){f.$("container").addClass("videoplay"),a.scale({width:f._stageWidth,height:f._stageHeight,iframelimit:e.video?f._options.maxVideoSize:d})})},100)}if(e.link)if(f._options.popupLinks){a.open(e.link,"_blank")}else a.location.href=e.link;else;}}),this.bind(c.IMAGE,function(a){f.setCounter(a.index),f.setInfo(a.index);var c=this.getNext(),d=this.getPrev(),e=[d,c];e.push(this.getNext(c),this.getPrev(d),f._controls.slides.length-1);var g=[];b.each(e,function(a,c){-1==b.inArray(c,g)&&g.push(c)}),b.each(g,function(a,c){var d=f.getData(c),e=f._controls.slides[c],g=f.isFullscreen()&&d.big?d.big:d.image||d.iframe;d.iframe&&!d.image&&(e.isIframe=!0),e.ready||f._controls.slides[c].load(g,function(a){a.isIframe||b(a.image).css("visibility","hidden"),f._scaleImage(a,{complete:function(a){a.isIframe||b(a.image).css({opacity:0,visibility:"visible"}).animate({opacity:1},200)}})})})})),this.$("thumbnails, thumbnails-list").css({overflow:"hidden",position:"relative"}),this.$("image-nav-right, image-nav-left").on("click:fast",function(a){h.pauseOnInteraction&&f.pause();var b=/right/.test(this.className)?"next":"prev";f[b]()}).on("click",function(a){a.preventDefault(),(h.clicknext||h.swipe)&&a.stopPropagation()}),b.each(["info","counter","image-nav"],function(a,b){!1===h["show"+b.substr(0,1).toUpperCase()+b.substr(1).replace(/-/,"")]&&L.moveOut(f.get(b.toLowerCase()))}),this.load(),h.keepSource||t||(this._target.innerHTML=""),this.get("errors")&&this.appendChild("target","errors"),this.appendChild("target","container"),h.carousel){var i=0,j=h.show;this.bind(c.THUMBNAIL,function(){this.updateCarousel(),++i==this.getDataLength()&&"number"==typeof j&&j>0&&this._carousel.follow(j)})}return h.responsive&&g.on("resize",function(){f.isFullscreen()||f.resize()}),h.fullscreenDoubleTap&&this.$("stage").on("touchstart",function(){var a,b,c,d,e,g,h=function(a){return a.originalEvent.touches?a.originalEvent.touches[0]:a};return f.$("stage").on("touchmove",function(){a=0}),function(i){if(!/(-left|-right)/.test(i.target.className)){if(g=L.timestamp(),b=h(i).pageX,c=h(i).pageY,i.originalEvent.touches.length<2&&g-a<300&&b-d<20&&c-e<20)return f.toggleFullscreen(),void i.preventDefault();a=g,d=b,e=c}}}()),b.each(c.on.binds,function(a,c){-1==b.inArray(c.hash,f._binds)&&f.bind(c.type,c.callback)}),this},addTimer:function(){return this._timer.add.apply(this._timer,L.array(arguments)),this},clearTimer:function(){return this._timer.clear.apply(this._timer,L.array(arguments)),this},_getWH:function(){var a,c=this.$("container"),d=this.$("target"),e=this,f={};return b.each(["width","height"],function(b,g){e._options[g]&&"number"==typeof e._options[g]?f[g]=e._options[g]:(a=[L.parseValue(c.css(g)),L.parseValue(d.css(g)),c[g](),d[g]()],e["_"+g]||a.splice(a.length,L.parseValue(c.css("min-"+g)),L.parseValue(d.css("min-"+g))),f[g]=p.max.apply(p,a))}),e._userRatio&&(f.height=f.width*e._userRatio),f},_createThumbnails:function(d){this.get("total").innerHTML=this.getDataLength();var f,g,h,i,j=this,k=this._options,l=d?this._data.length-d.length:0,m=l,n=[],o=0,p=t<8?"http://upload.wikimedia.org/wikipedia/commons/c/c0/Blank.gif":"data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw%3D%3D",q=function(){var a=j.$("thumbnails").find(".active");return!!a.length&&a.find("img").attr("src")}(),r="string"==typeof k.thumbnails?k.thumbnails.toLowerCase():null,s=function(a){return e.defaultView&&e.defaultView.getComputedStyle?e.defaultView.getComputedStyle(g.container,null)[a]:i.css(a)},u=function(a){k.pauseOnInteraction&&j.pause();var c=b(a.currentTarget).data("index");j.getIndex()!==c&&j.show(c),a.preventDefault()},v=function(a,d){b(a.container).css("visibility","visible"),j.trigger({type:c.THUMBNAIL,thumbTarget:a.image,index:a.data.order,galleriaData:j.getData(a.data.order)}),"function"==typeof d&&d.call(j,a)},w=function(a,c){a.scale({width:a.data.width,height:a.data.height,crop:k.thumbCrop,margin:k.thumbMargin,canvas:k.useCanvas,position:k.thumbPosition,complete:function(a){var d,e,f=["left","top"],g=["Width","Height"];j.getData(a.index);b.each(g,function(c,g){d=g.toLowerCase(),!0===k.thumbCrop&&k.thumbCrop!==d||(e={},e[d]=a[d],b(a.container).css(e),e={},e[f[c]]=0,b(a.image).css(e)),a["outer"+g]=b(a.container)["outer"+g](!0)}),L.toggleQuality(a.image,!0===k.thumbQuality||"auto"===k.thumbQuality&&a.original.width<3*a.width),k.thumbDisplayOrder&&!a.lazy?b.each(n,function(a,b){if(a===o&&b.ready&&!b.displayed)return o++,b.dis
3543played=!0,void v(b,c)}):v(a,c)}})};for(d||(this._thumbnails=[],this.$("thumbnails").empty());this._data[l];l++)h=this._data[l],f=h.thumb||h.image,!0!==k.thumbnails&&"lazy"!=r||!h.thumb&&!h.image?h.iframe&&null!==r||"empty"===r||"numbers"===r?(g={container:L.create("galleria-image"),image:L.create("img","span"),ready:!0,data:{order:l}},"numbers"===r&&b(g.image).text(l+1),h.iframe&&b(g.image).addClass("iframe"),this.$("thumbnails").append(g.container),a.setTimeout(function(a,d,e){return function(){b(e).append(a),j.trigger({type:c.THUMBNAIL,thumbTarget:a,index:d,galleriaData:j.getData(d)})}}(g.image,l,g.container),50+20*l)):g={container:null,image:null}:(g=new c.Picture(l),g.index=l,g.displayed=!1,g.lazy=!1,g.video=!1,this.$("thumbnails").append(g.container),i=b(g.container),i.css("visibility","hidden"),g.data={width:L.parseValue(s("width")),height:L.parseValue(s("height")),order:l,src:f},!0!==k.thumbCrop?i.css({width:"auto",height:"auto"}):i.css({width:g.data.width,height:g.data.height}),"lazy"==r?(i.addClass("lazy"),g.lazy=!0,g.load(p,{height:g.data.height,width:g.data.width})):g.load(f,w),"all"===k.preload&&g.preload(h.image)),b(g.container).add(k.keepSource&&k.linkSourceImages?h.original:null).data("index",l).on(k.thumbEventType,u).data("thumbload",w),q===f&&b(g.container).addClass("active"),this._thumbnails.push(g);return n=this._thumbnails.slice(m),this},lazyLoad:function(a,c){var d=a.constructor==Array?a:[a],e=this,f=0;return b.each(d,function(a,g){if(!(g>e._thumbnails.length-1)){var h=e._thumbnails[g],i=h.data,j=function(){++f==d.length&&"function"==typeof c&&c.call(e)},k=b(h.container).data("thumbload");k&&(h.video?k.call(e,h,j):h.load(i.src,function(a){k.call(e,a,j)}))}}),this},lazyLoadChunks:function(b,c){var d=this.getDataLength(),e=0,f=0,g=[],h=[],i=this;for(c=c||0;e<d;e++)h.push(e),++f!=b&&e!=d-1||(g.push(h),f=0,h=[]);var j=function(b){var d=g.shift();d&&a.setTimeout(function(){i.lazyLoad(d,function(){j(!0)})},c&&b?c:0)};return j(!1),this},_run:function(){var e=this;e._createThumbnails(),L.wait({timeout:1e4,until:function(){return c.OPERA&&e.$("stage").css("display","inline-block"),e._stageWidth=e.$("stage").width(),e._stageHeight=e.$("stage").height(),e._stageWidth&&e._stageHeight>50},success:function(){if(E.push(e),e._options.swipe){var f=e.$("images").width(e.getDataLength()*e._stageWidth);b.each(new Array(e.getDataLength()),function(a){var d=new c.Picture,g=e.getData(a);b(d.container).css({position:"absolute",top:0,left:e._stageWidth*a}).prepend(e._layers[a]=b(L.create("galleria-layer")).css({position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:2})[0]).appendTo(f),g.video&&M(d.container),e._controls.slides.push(d);var h=new c.Picture;h.isIframe=!0,b(h.container).attr("class","galleria-frame").css({position:"absolute",top:0,left:0,zIndex:4,background:"#000",display:"none"}).appendTo(d.container),e._controls.frames.push(h)}),e.finger.setup()}if(L.show(e.get("counter")),e._options.carousel&&e._carousel.bindControl
3543s(),e._options.autoplay&&(e.pause(),"number"==typeof e._options.autoplay&&(e._playtime=e._options.autoplay),e._playing=!0),e._firstrun)return e._options.autoplay&&e.trigger(c.PLAY),void("number"==typeof e._options.show&&e.show(e._options.show));e._firstrun=!0,c.History&&c.History.change(function(b){isNaN(b)?a.history.go(-1):e.show(b,d,!0)}),e.trigger(c.READY),e.theme.init.call(e,e._options),b.each(c.ready.callbacks,function(a,b){"function"==typeof b&&b.call(e,e._options)}),e._options.extend.call(e,e._options),/^[0-9]{1,4}$/.test(n)&&c.History?e.show(n,d,!0):e._data[e._options.show]&&e.show(e._options.show),e._options.autoplay&&e.trigger(c.PLAY)},error:function(){c.raise("Stage width or height is too small to show the gallery. Traced measures: width:"+e._stageWidth+"px, height: "+e._stageHeight+"px.",!0)}})},load:function(a,d,e){var f=this,g=this._options;return this._data=[],this._thumbnails=[],this.$("thumbnails").empty(),"function"==typeof d&&(e=d,d=null),a=a||g.dataSource,d=d||g.dataSelector,e=e||g.dataConfig,b.isPlainObject(a)&&(a=[a]),b.isArray(a)?this.validate(a)?this._data=a:c.raise("Load failed: JSON Array not valid."):(d+=",.video,.iframe",b(a).find(d).each(function(a,c){c=b(c);var d={},g=c.parent(),h=g.attr("href"),i=g.attr("rel");h&&("IMG"==c[0].nodeName||c.hasClass("video"))&&C(h)?d.video=h:h&&c.hasClass("iframe")?d.iframe=h:d.image=h,i&&(d.big=i),d.imagesrcset=g.data("srcset"),d.imagesizes=g.data("sizes"),d.thumbsizes=c.attr("sizes"),d.thumbsrcset=c.attr("srcset"),b.each("big bigsrcset bigsizes title description link layer image imagesrcset imagesizes".split(" "),function(a,b){c.data(b)&&(d[b]=c.data(b).toString())}),c.data("srcset")&&(d.imagesrcset=c.data("srcset")),c.data("sizes")&&(d.imagesizes=c.data("sizes")),d.big||(d.big=d.image,d.bigsrcset=d.imagesrcset,d.bigsizes=d.imagesizes),f._data.push(b.extend({title:c.attr("title")||"",thumb:c.attr("src"),image:c.attr("src"),big:c.attr("src"),description:c.attr("alt")||"",link:c.attr("longdesc"),original:c.get(0)},d,e(c)))})),"function"==typeof g.dataSort?i.sort.call(this._data,g.dataSort):"random"==g.dataSort&&this._data.sort(function(){return p.round(p.random())-.5}),this.getDataLength()&&this._parseData(function(){this.trigger(c.DATA)}),this},_parseData:function(a){var c,e=this,f=!1,g=function(){var c=!0;b.each(e._data,function(a,b){if(b.loading)return c=!1,!1}),c&&!f&&(f=!0,a.call(e))};return b.each(this._data,function(a,f){if(c=e._data[a],b.each("big image thumb".split(" "),function(a,b){f[b]&&(f[b]=new String(f[b]),f[b].srcset=f[b+"srcset"],f[b].sizes=f[b+"sizes"])}),"thumb"in f==!1&&(c.thumb=f.image),f.big||(c.big=f.image),"video"in f){var h=C(f.video);h&&(c.iframe=new B(h.provider,h.id).embed()+function(){if("object"==typeof e._options[h.provider]){var a=[];return b.each(e._options[h.provider],function(b,c){a.push(b+"="+c)}),"youtube"==h.provider&&(a=["wmode=opaque"].concat(a)),"?"+a.join("&")}return""}(),c.thumb&&c.image||b.each(["thumb","image"],function(a,b){if("image"==b&&!e._options.videoPoster)return void(c.image=d);var f=new B(h.provider,h.id);c[b]||(c.loading=!0,f.getMedia(b,function(a,b){return function(c){a[b]=c,"image"!=b||a.big||(a.big=a.image),delete a.loading,g()}}(c,b)))}))}}),g(),this},destroy:function(){return this.$("target").data("galleria",null),this.$("container").off("galleria"),this.get("target").innerHTML=this._original.html,this.clearTimer(),L.removeFromArray(F,this),L.removeFromArray(E,this),A._inst=[],void 0!==c._waiters&&c._waiters.length&&b.each(c._waiters,function(b,c){c&&a.clearTimeout(c)}),this},splice:function(){var b=this,c=L.array(arguments);return a.setTimeout(function(){i.splice.apply(b._data,c),b._parseData(function(){b._createThumbnails()})},2),b},push:function(){var b=this,c=L.array(arguments);return 1==c.length&&c[0].constructor==Array&&(c=c[0]),a.setTimeout(function(){i.push.apply(b._data,c),b._parseData(function(){b._createThumbnails(c)})},2),b},_getActive:function(){return this._controls.getActive()},validate:function(a){return!0},bind:function(a,b){return a=z(a),this.$("container").on(a,this.proxy(b)),this},unbind:function(a){return a=z(a),this.$("container").off(a),this},trigger:function(a){return a="object"==typeof a?b.extend(a,{scope:this}):{type:z(a),scope:this},this.$("container").trigger(a),this},addIdleState:function(a,b,c,d){return this._idle.add.apply(this._idle,L.array(arguments)),this},removeIdleState:function(a){return this._idle.remove.apply(this._idle,L.array(arguments)),this},enterIdleMode:function(){return this._idle.hide(),this},exitIdleMode:function(){return this._idle.showAll(),this},enterFullscreen:function(a){return this._fullscreen.enter.apply(this,L.array(arguments)),this},exitFullscreen:function(a){return this._fullscreen.exit.apply(this,L.array(arguments)),this},toggleFullscreen:function(a){return this._fullscreen[this.isFullscreen()?"exit":"enter"].apply(this,L.array(arguments)),this},bindTooltip:function(a,b){return this._tooltip.bind.apply(this._tooltip,L.array(arguments)),this},defineTooltip:function(a,b){return this._tooltip.define.apply(this._tooltip,L.array(arguments)),this},refreshTooltip:function(a){return this._tooltip.show.apply(this._tooltip,L.array(arguments)),this},openLightbox:function(){return this._lightbox.show.apply(this._lightbox,L.array(arguments)),this},closeLightbox:function(){return this._lightbox.hide.apply(this._lightbox,L.array(arguments)),this},hasVariation:function(a){return b.inArray(a,this._options.variation.split(/\s+/))>-1},getActiveImage:function(){var a=this._getActive();return a?a.image:d},getActiveThumb:function(){return this._thumbnails[this._active].image||d},getMousePosition:function(a){return{x:a.pageX-this.$("container").offset().left,y:a.pageY-this.$("container").offset().top}}
3543,addPan:function(a){if(!1!==this._options.imageCrop){a=b(a||this.getActiveImage());var c=this,d=a.width()/2,e=a.height()/2,f=parseInt(a.css("left"),10),g=parseInt(a.css("top"),10),h=f||0,i=g||0,j=0,k=0,l=!1,m=L.timestamp(),n=0,o=0,q=function(b,c,d){if(b>0&&(o=p.round(p.max(-1*b,p.min(0,c))),n!==o))if(n=o,8===t)a.parent()["scroll"+d](-1*o);else{var e={};e[d.toLowerCase()]=o,a.css(e)}},r=function(a){L.timestamp()-m<50||(l=!0,d=c.getMousePosition(a).x,e=c.getMousePosition(a).y)},s=function(b){l&&(j=a.width()-c._stageWidth,k=a.height()-c._stageHeight,f=d/c._stageWidth*j*-1,g=e/c._stageHeight*k*-1,h+=(f-h)/c._options.imagePanSmoothness,i+=(g-i)/c._options.imagePanSmoothness,q(k,i,"Top"),q(j,h,"Left"))};return 8===t&&(a.parent().scrollTop(-1*i).scrollLeft(-1*h),a.css({top:0,left:0})),this.$("stage").off("mousemove",r).on("mousemove",r),this.addTimer("pan"+c._id,s,50,!0),this}},proxy:function(a,b){return"function"!=typeof a?q:(b=b||this,function(){return a.apply(b,L.array(arguments))})},getThemeName:function(){return this.theme.name},removePan:function(){return this.$("stage").off("mousemove"),this.clearTimer("pan"+this._id),this},addElement:function(a){var c=this._dom;return b.each(L.array(arguments),function(a,b){c[b]=L.create("galleria-"+b)}),this},attachKeyboard:function(a){return this._keyboard.attach.apply(this._keyboard,L.array(arguments)),this},detachKeyboard:function(){return this._keyboard.detach.apply(this._keyboard,L.array(arguments)),this},appendChild:function(a,b){return this.$(a).append(this.get(b)||b),this},prependChild:function(a,b){return this.$(a).prepend(this.get(b)||b),this},remove:function(a){return this.$(L.array(arguments).join(",")).remove(),this},append:function(a){var b,c;for(b in a)if(a.hasOwnProperty(b))if(a[b].constructor===Array)for(c=0;a[b][c];c++)this.appendChild(b,a[b][c]);else this.appendChild(b,a[b]);return this},_scaleImage:function(a,c){if(a=a||this._controls.getActive()){var d,e=function(a){b(a.container).children(":first").css({top:p.max(0,L.parseValue(a.image.style.top)),left
3543:p.max(0,L.parseValue(a.image.style.left)),width:L.parseValue(a.image.width),height:L.parseValue(a.image.height)})};return c=b.extend({width:this._stageWidth,height:this._stageHeight,crop:this._options.imageCrop,max:this._options.maxScaleRatio,min:this._options.minScaleRatio,margin:this._options.imageMargin,position:this._options.imagePosition,iframelimit:this._options.maxVideoSize},c),this._options.layerFollow&&!0!==this._options.imageCrop?"function"==typeof c.complete?(d=c.complete,c.complete=function(){d.call(a,a),e(a)}):c.complete=e:b(a.container).children(":first").css({top:0,left:0}),a.scale(c),this}},updateCarousel:function(){return this._carousel.update(),this},resize:function(a,c){"function"==typeof a&&(c=a,a=d),a=b.extend({width:0,height:0},a);var e=this,f=this.$("container");return b.each(a,function(b,c){c||(f[b]("auto"),a[b]=e._getWH()[b])}),b.each(a,function(a,b){f[a](b)}),this.rescale(c)},rescale:function(a,e,f){var g=this;return"function"==typeof a&&(f=a,a=d),function(){g._stageWidth=a||g.$("stage").width(),g._stageHeight=e||g.$("stage").height(),g._options.swipe?(b.each(g._controls.slides,function(a,c){g._scaleImage(c),b(c.container).css("left",g._stageWidth*a)}),g.$("images").css("width",g._stageWidth*g.getDataLength())):g._scaleImage(),g._options.carousel&&g.updateCarousel(),g._controls.frames[g._controls.active]&&g._controls.frames[g._controls.active].scale({width:g._stageWidth,height:g._stageHeight,iframelimit:g._options.maxVideoSize}),g.trigger(c.RESCALE),"function"==typeof f&&f.call(g)}.call(g),this},refreshImage:function(){return this._scaleImage(),this._options.imagePan&&this.addPan(),this},_preload:function(){if(this._options.preload){var a,b,d,e=this.getNext();try{for(b=this._options.preload;b>0;b--)a=new c.Picture,d=this.getData(e),a.preload(this.isFullscreen()&&d.big?d.big:d.image),e=this.getNext(e)}catch(a){}}},show:function(d,e,f){var g=this._options.swipe;if(g||!(this._queue.length>3||!1===d||!this._options.queue&&this._queue.stalled)){if(d=p.max(0,p.min(parseInt(d,10),this.getDataLength()-1)),e=void 0!==e?!!e:d<this.getIndex(),!(f=f||!1)&&c.History)return void c.History.set(d.toString());if(this.finger&&d!==this._active&&(this.finger.to=-d*this.finger.width,this.finger.index=d),this._active=d,g){var h=this.getData(d),j=this;if(!h)return;var k=this.isFullscreen()&&h.big?h.big:h.image||h.iframe,l=this._controls.slides[d],m=l.isCached(k),n=this._thumbnails[d],o={cached:m,index:d,rewind:e,imageTarget:l.image,thumbTarget:n.image,galleriaData:h};this.trigger(b.extend(o,{type:c.LOADSTART})),j.$("container").removeClass("videoplay");var q=function(){j._layers[d].innerHTML=j.getData().layer||"",j.trigger(b.extend(o,{type:c.LOADFINISH})),j._playCheck()};j._preload(),a.setTimeout(function(){l.ready&&b(l.image).attr("src")==k?(j.trigger(b.extend(o,{type:c.IMAGE})),q()):(h.iframe&&!h.image&&(l.isIframe=!0),l.load(k,function(a){o.imageTarget=a.image,j._scaleImage(a,q).trigger(b.extend(o,{type:c.IMAGE})),q()}))},100)}else i.push.call(this._queue,{index:d,rewind:e}),this._queue.stalled||this._show();return this}},_show:function(){var e=this,f=this._queue[0],g=this.getData(f.index);if(g){var h=this.isFullscreen()&&g.big?g.big:g.image||g.iframe,j=this._controls.getActive(),k=this._controls.getNext(),l=k.isCached(h),m=this._thumbnails[f.index],n=function(){b(k.image).trigger("mouseup")};e.$("container").toggleClass("iframe",!!g.isIframe).removeClass("videoplay");var o=function(f,g,h,j,k){return function(){var l;N.active=!1,L.toggleQuality(g.image,e._options.imageQuality),e._layers[e._controls.active].innerHTML="",b(h.container).css({zIndex:0,opacity:0}).show(),b(h.container).find("iframe, .galleria-videoicon").remove(),b(e._controls.frames[e._controls.active].container).hide(),b(g.container).css({zIndex:1,left:0,top:0}).show(),e._controls.swap(),e._options.imagePan&&e.addPan(g.image),(f.iframe&&f.image||f.link||e._options.lightbox||e._options.clicknext)&&b(g.image).css({cursor:"pointer"}).on("mouseup",function(g){if(!("number"==typeof g.which&&g.which>1)){if(f.iframe){e.isPlaying()&&e.pause();var h=e._controls.frames[e._controls.active],i=e._stageWidth,j=e._stageHeight;return b(h.container).css({width:i,height:j,opacity:0}
3543).show().animate({opacity:1},200),void a.setTimeout(function(){h.load(f.iframe+(f.video?"&autoplay=1":""),{width:i,height:j},function(a){e.$("container").addClass("videoplay"),a.scale({width:e._stageWidth,height:e._stageHeight,iframelimit:f.video?e._options.maxVideoSize:d})})},100)}return e._options.clicknext&&!c.TOUCH?(e._options.pauseOnInteraction&&e.pause(),void e.next()):f.link?void(e._options.popupLinks?l=a.open(f.link,"_blank"):a.location.href=f.link):void(e._options.lightbox&&e.openLightbox())}}),e._playCheck(),e.trigger({type:c.IMAGE,index:j.index,imageTarget:g.image,thumbTarget:k.image,galleriaData:f}),i.shift.call(e._queue),e._queue.stalled=!1,e._queue.length&&e._show()}}(g,k,j,f,m);this._options.carousel&&this._options.carouselFollow&&this._carousel.follow(f.index),e._preload(),L.show(k.container),k.isIframe=g.iframe&&!g.image,b(e._thumbnails[f.index].container).addClass("active").siblings(".active").removeClass("active"),e.trigger({type:c.LOADSTART,cached:l,index:f.index,rewind:f.rewind,imageTarget:k.image,thumbTarget:m.image,galleriaData:g}),e._queue.stalled=!0,k.load(h,function(a){var h=b(e._layers[1-e._controls.active]).html(g.layer||"").hide();e._scaleImage(a,{complete:function(a){"image"in j&&L.toggleQuality(j.image,!1),L.toggleQuality(a.image,!1),e.removePan(),e.setInfo(f.index),e.setCounter(f.index),g.layer&&(h.show(),(g.iframe&&g.image||g.link||e._options.lightbox||e._options.clicknext)&&h.css("cursor","pointer").off("mouseup").mouseup(n)),g.video&&g.image&&M(a.container);var i=e._options.transition;if(b.each({initial:null===j.image,touch:c.TOUCH,fullscreen:e.isFullscreen()},function(a,b){if(b&&e._options[a+"Transition"]!==d)return i=e._options[a+"Transition"],!1}),i in N.effects==!1)o();else{var k={prev:j.container,next:a.container,rewind:f.rewind,speed:e._options.transitionSpeed||400};N.active=!0,N.init.call(e,i,k,o)}e.trigger({type:c.LOADFINISH,cached:l,index:f.index,rewind:f.rewind,imageTarget:a.image,thumbTarget:e._thumbnails[f.index].image,galleriaData:e.getData(f.index)})}})})}},getNext:function(a){return a="number"==typeof a?a:this.getIndex(),a===this.getDataLength()-1?0:a+1},getPrev:function(a){return a="number"==typeof a?a:this.getIndex(),0===a?this.getDataLength()-1:a-1},next:function(){return this.getDataLength()>1&&this.show(this.getNext(),!1),this},prev:function(){return this.getDataLength()>1&&this.show(this.getPrev(),!0),this},get:function(a){return a in this._dom?this._dom[a]:null},getData:function(a){return a in this._data?this._data[a]:this._data[this._active]},getDataLength:function(){return this._data.length},getIndex:function(){return"number"==typeof this._active&&this._active},getStageHeight:function(){return this._stageHeight},getStageWidth:function(){return this._stageWidth},getOptions:function(a){return void 0===a?this._options:this._options[a]},setOptions:function(a,c){return"object"==typeof a?b.extend(this._options,a):this._options[a]=c,this},play:function(a){return this._playing=!0,this._playtime=a||this._playtime,this._playCheck(),this.trigger(c.PLAY),this},pause:function(){return this._playing=!1,this.trigger(c.PAUSE),this},playToggle:function(a){return this._playing?this.pause():this.play(a)},isPlaying:function(){return this._playing},isFullscreen:function(){return this._fullscreen.active},_playCheck:function(){var a=this,b=0,d=L.timestamp(),e="play"+this._id;if(this._playing){this.clearTimer(e);var f=function(){if((b=L.timestamp()-d)>=a._playtime&&a._playing)return a.clearTimer(e),void a.next();a._playing&&(a.trigger({type:c.PROGRESS,percent:p.ceil(b/a._playtime*100),seconds:p.floor(b/1e3),milliseconds:b}),a.addTimer(e,f,20))};a.addTimer(e,f,20)}},setPlaytime:function(a){return this._playtime=a,this},setIndex:function(a){return this._active=a,this},setCounter:function(a){if("number"==typeof a?a++:void 0===a&&(a=this.getIndex()+1),this.get("current").innerHTML=a,t){var b=this.$("counter"),c=b.css("opacity");1===parseInt(c,10)?L.removeAlpha(b[0]):this.$("counter").css("opacity",c)}return this},setInfo:function(a){var c=this,d=this.getData(a);return b.each(["title","description"],function(a,b){var e=c.$("info-"+b);d[b]?e[d[b].length?"show":"hide"]().html(d[b]):e.empty().hide()}),this},hasInfo:function(a){var b,c="title description".split(" ");for(b=0;c[b];b++)if(this.getData(a)[c[b]])return!0;return!1},jQuery:function(a){var c=this,d=[];b.each(a.split(","),function(a,e){e=b.trim(e),c.get(e)&&d.push(e)});var e=b(c.get(d.shift()));return b.each(d,function(a,b){e=e.add(c.get(b))}),e},$:function(a){return this.jQuery.apply(this,L.array(arguments))}},b.each(x,function(a,b){var d=/_/.test(b)?b.replace(/_/g,""):b;c[b.toUpperCase()]="galleria."+d}),b.extend(c,{IE9:9===t,IE8:8===t,IE7:7===t,IE6:6===t,IE:t,WEBKIT:/webkit/.test(m),CHROME:/chrome/.test(m),SAFARI:/safari/.test(m)&&!/chrome/.test(m),QUIRK:t&&e.compatMode&&"BackCompat"===e.compatMode,MAC:/mac/.test(navigator.platform.toLowerCase()),OPERA:!!a.opera,IPHONE:/iphone/.test(m),IPAD:/ipad/.test(m),ANDROID:/android/.test(m),TOUCH:"ontouchstart"in e&&s}),c.addTheme=function(d){d.name||c.raise("No theme name specified"),(!d.version||parseInt(10*c.version)>parseInt(10*d.version))&&c.raise("This version of Galleria requires "+d.name+" theme version "+parseInt(10*c.version)/10+" or later",!0),"object"!=typeof d.defaults?d.defaults={}:d.defaults=y(d.defaults);var e,f,g=!1;return"string"==typeof d.css?(b("link").each(function(a,b){if(e=new RegExp(d.css),e.test(b.href))return g=!0,K(d),!1}),g||b(function(){var h=0,i=function(){b("script").each(function(b,c){e=new RegExp("galleria\\."+d.name.toLowerCase()+"\\."),f=new RegExp("galleria\\.io\\/theme\\/"+d.name.toLowerCase()+"\\/(\\d*\\.*)?(\\d*\\.*)?(\\d*\\/)?js"),(e.test(c.src
3543)||f.test(c.src))&&(g=c.src.replace(/[^\/]*$/,"")+d.css,a.setTimeout(function(){L.loadCSS(g,"galleria-theme-"+d.name,function(){K(d)})},1))}),g||(h++>5?c.raise("No theme CSS loaded"):a.setTimeout(i,500))};i()})):K(d),d},c.loadTheme=function(d,e){if(!b("script").filter(function(){return b(this).attr("src")==d}).length){var f,g=!1;return b(a).on("load",function(){g||(f=a.setTimeout(function(){g||c.raise("Galleria had problems loading theme at "+d+". Please check theme path or load manually.",!0)},2e4))}),L.loadScript(d,function(){g=!0,a.clearTimeout(f)}),c}},c.get=function(a){return F[a]?F[a]:"number"!=typeof a?F:void c.raise("Gallery index "+a+" not found")},c.configure=function(a,d){var e={};return"string"==typeof a&&d?(e[a]=d,a=e):b.extend(e,a),c.configure.options=e,b.each(c.get(),function(a,b){b.setOptions(e)}),c},c.configure.options={},c.on=function(a,d){if(a){d=d||q;var e=a+d.toString().replace(/\s/g,"")+L.timestamp();return b.each(c.get(),function(b,c){c._binds.push(e),c.bind(a,d)}),c.on.binds.push({type:a,callback:d,hash:e}),c}},c.on.binds=[],c.run=function(a,d){return b.isFunction(d)&&(d={extend:d}),b(a||"#galleria").galleria(d),c},c.addTransition=function(a,b){return N.effects[a]=b,c},c.utils=L,c.log=function(){var c=L.array(arguments);if(!("console"in a&&"log"in a.console))return a.alert(c.join("<br>"));try{return a.console.log.apply(a.console,c)}catch(d){b.each(c,function(){a.console.log(this)})}},c.ready=function(a){return"function"!=typeof a?c:(b.each(E,function(b,c){a.call(c,c._options)}),c.ready.callbacks.push(a),c)},c.ready.callbacks=[],c.raise=function(a,c){var d=c?"Fatal error":"Error",e={color:"#fff",position:"absolute",top:0,left:0,zIndex:1e5},f=function(a){var f='<div style="padding:4px;margin:0 0 2px;background:#'+(c?"811":"222")+';">'+(c?"<strong>"+d+": </strong>":"")+a+"</div>";b.each(F,function(){var a=this.$("errors"),b=this.$("target");a.length||(b.css("position","relative"),a=this.addElement("errors").appendChild("target","errors").$("errors").css(e)),a.append(f)}),
3544F.length||b("<div>").css(b.extend(e,{position:"fixed"})).append(f).appendTo(u().body)};if(j){if(f(a),c)throw new Error(d+": "+a)}else if(c){if(G)return;G=!0,c=!1,f("Gallery could not load.")}},c.version=1.61,c.getLoadedThemes=function(){return b.map(J,function(a){return a.name})},c.requires=function(a,b){return b=b||"You need to upgrade Galleria to version "+a+" to use one or more components.",c.version<a&&c.raise(b,!0),c},c.Picture=function(a){this.id=a||null,this.image=null,this.container=L.create("galleria-image"),b(this.container).css({overflow:"hidden",position:"relative"}),this.original={width:0,height:0},this.ready=!1,this.isIframe=!1},c.Picture.prototype={cache:{},show:function(){L.show(this.image)},hide:function(){L.moveOut(this.image)},clear:function(){this.image=null},isCached:function(a){return!!this.cache[a]},preload:function(a){var c=b(new Image).on("load",function(a,b){return function(){b[a]=a}}(a,this.cache));a.srcset&&c.attr("srcset",a.srcset),a.sizes&&c.attr("sizes",a.sizes),c.attr("src",a)},load:function(d,e,f){if("function"==typeof e&&(f=e,e=null),this.isIframe){var g="if"+(new Date).getTime(),h=this.image=b("<iframe>",{src:d,frameborder:0,id:g,allowfullscreen:!0,css:{visibility:"hidden"}})[0];return e&&b(h).css(e),b(this.container).find("iframe,img").remove(),this.container.appendChild(this.image),b("#"+g).on("load",function(c,d){return function(){a.setTimeout(function(){b(c.image).css("visibility","visible"),"function"==typeof d&&d.call(c,c)},10)}}(this,f)),this.container}this.image=new Image,c.IE8&&b(this.image).css("filter","inherit"),c.IE||c.CHROME||c.SAFARI||b(this.image).css("image-rendering","optimizequality");var i=!1,j=!1,k=b(this.container),m=b(this.image),n=function(){i?l?b(this).attr("src",l):c.raise("Image not found: "+d):(i=!0,a.setTimeout(function(a,b){return function(){a.attr("src",b+(b.indexOf("?")>-1?"&":"?")+L.timestamp())}}(b(this),d),50))},o=function(d,f,g){return function(){var h=function(){b(this).off("load"),d.original=e||{height:this.height,width:this.width},c.HAS3D&&(this.style.MozTransform=this.style.webkitTransform="translate3d(0,
35440,0)"),k.append(this),d.cache[g]=g,"function"==typeof f&&a.setTimeout(function(){f.call(d,d)},1)};this.width&&this.height?h.call(this):function(a){L.wait({until:function(){return a.width&&a.height},success:function(){h.call(a)},error:function(){j?c.raise("Could not extract width/height from image: "+a.src+". Traced measures: width:"+a.width+"px, height: "+a.height+"px."):(b(new Image).on("load",o).attr("src",a.src),j=!0)},timeout:100})}(this)}}(this,f,d);return k.find("iframe,img").remove(),m.css("display","block"),L.hide(this.image),b.each("minWidth minHeight maxWidth maxHeight".split(" "),function(a,b){m.css(b,/min/.test(b)?"0":"none")}),m.on("load",o).on("error",n),d.srcset&&m.attr("srcset",d.srcset),d.sizes&&m.attr("sizes",d.sizes),m.attr("src",d),this.container},scale:function(a){var e=this;if(a=b.extend({width:0,height:0,min:d,max:d,margin:0,complete:q,position:"center",crop:!1,canvas:!1,iframelimit:d},a),this.isIframe){var f,g,h=a.width,i=a.height;if(a.iframelimit){var j=p.min(a.iframelimit/h,a.iframelimit/i);j<1?(f=h*j,g=i*j,b(this.image).css({top:i/2-g/2,left:h/2-f/2,position:"absolute"})):b(this.image).css({top:0,left:0})}b(this.image).width(f||h).height(g||i).removeAttr("width").removeAttr("height"),b(this.container).width(h).height(i),a.complete.call(e,e);try{this.image.contentWindow&&b(this.image.contentWindow).trigger("resize")}catch(a){}return this.container}if(!this.image)return this.container;var k,l,m,n=b(e.container);return L.wait({until:function(){return k=a.width||n.width()||L.parseValue(n.css("width")),l=a.height||n.height()||L.parseValue(n.css("height")),k&&l},success:function(){var c=(k-2*a.margin)/e.original.width,d=(l-2*a.margin)/e.original.height,f=p.min(c,d),g=p.max(c,d),h={true:g,width:c,height:d,false:f,landscape:e.original.width>e.original.height?g:f,portrait:e.original.width<e.original.height?g:f},i=h[a.crop.toString()],j="";a.max&&(i=p.min(a.max,i)),a.min&&(i=p.max(a.min,i)),b.each(["width","height"],function(a,c){b(e.image)[c](e[c]=e.image[c]=p.round(e.original[c]*i))}),b(e.container).width(k).height(l),a.canvas&&H&&(H.elem.width=e.width,H.elem.height=e.height,j=e.image.src+":"+e.width+"x"+e.height,e.image.src=H.cache[j]||function(a){H.context.drawImage(e.image,0,0,e.original.width*i,e.original.height*i);try{return m=H.elem.toDataURL(),H.length+=m.length,H.cache[a]=m,m}catch(a){return e.image.src}}(j));var n={},o={},q=function(a,c,d){var f=0;if(/\%/.test(a)){var g=parseInt(a,10)/100,h=e.image[c]||b(e.image)[c]();f=p.ceil(-1*h*g+d*g)}else f=L.parseValue(a);return f},r={top:{top:0},left:{left:0},right:{left:"100%"},bottom:{top:"100%"}};b.each(a.position.toLowerCase().split(" "),function(a,b){"center"===b&&(b="50%"),n[a?"top":"left"]=b}),b.each(n,function(a,c){r.hasOwnProperty(c)&&b.extend(o,r[c])}),n=n.top?b.extend(n,o):o,n=b.extend({top:"50%",left:"50%"},n),b(e.image).css({position:"absolute",top:q(n.top,"height",l),left:q(n.left,"width",k)}),e.show(),e.ready=!0,a.complete.call(e,e)},error:function(){c.raise("Could not scale image: "+e.image.src)},timeout:1e3}),this}},b.extend(b.easing,{galleria:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b+c:d/2*((b-=2)*b*b+2)+c},galleriaIn:function(a,b,c,d,e){return d*(b/=e)*b+c},galleriaOut:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c}}),c.Finger=function(){var d=(p.abs,c.HAS3D=function(){var a,c,d=e.createElement("p"),f=["webkit","O","ms","Moz",""],g=0,h="transform";for(u().html.insertBefore(d,null);f[g];g++)c=f[g]?f[g]+"Transform":h,void 0!==d.style[c]&&(d.style[c]="translate3d(1px,1px,1px)",a=b(d).css(f[g]?"-"+f[g].toLowerCase()+"-"+h:h));return u().html.removeChild(d),void 0!==a&&a.length>0&&"none"!==a}()),g=function(){var b="RequestAnimationFrame";return a.requestAnimationFrame||a["webkit"+b]||a["moz"+b]||a["o"+b]||a["ms"+b]||function(b){a.setTimeout(b,1e3/60)}}(),h=function(c,e){if(this.config={start:0,duration:500,onchange:function(){},oncomplete:function(){},easing:function(a,b,c,d,e){return-d*((b=b/e-1)*b*b*b-1)+c}},this.easeout=function(a,b,c,d,e){return d*((b=b/e-1)*b*b*b*b+1)+c},c.children.length){var f=this;b.extend(this.config,e),this.elem=c,this.child=c.children[0],this.to=this.pos=0,this.touching=!1,this.start={},this.index=this.config.start,this.anim=0,this.easing=this.config.easing,d||(this.child.style.position="absolute",this.elem.style.position="relative"),b.each(["ontouchstart","ontouchmove","ontouchend","setup"],function(a,b){f[b]=function(a){return function(){a.apply(f,arguments)}}(f[b])}),this.setX=function(){var a=f.child.style;if(!d)return void(a.left=f.pos+"px");a.MozTransform=a.webkitTransform=a.transform="translate3d("+f.pos+"px,0,0)"},b(c).on("touchstart",this.ontouchstart),b(a).on("resize",this.setup),b(a).on("orientationchange",this.setup),this.setup(),function a(){g(a),f.loop.call(f)}()}};return h.prototype={constructor:h,setup:function(){this.width=b(this.elem).width(),this.length=p.ceil(b(this.child).width()/this.width),0!==this.index&&(this.index=p.max(0,p.min(this.index,this.length-1)),this.pos=this.to=-this.width*this.index)},setPosition:function(a){this.pos=a,this.to=a},ontouchstart:function(a){var b=a.originalEvent.touches;this.start={pageX:b[0].pageX,pageY:b[0].pageY,time:+new Date},this.isScrolling=null,this.touching=!0,this.deltaX=0,f.on("touchmove",this.ontouchmove),f.on("touchend",this.ontouchend)},ontouchmove:function(a){var b=a.originalEvent.touches;b&&b.length>1||a.scale&&1!==a.scale||(this.deltaX=b[0].pageX-this.start.pageX,null===this.isScrolling&&(this.isScrolling=!!(this.isScrolling||p.abs(this.deltaX)<p.abs(b[0].pageY-this.start.pageY))),this.isScrolling||(a.preventDefault(),this.deltaX/=!this.index&&this.deltaX>0||this.index==this.length-1&&this.deltaX<0?p.abs(this.deltaX)/this.width+1.8:1,this.to=this.deltaX-this.index*this.width),a.stopPropagation())},ontouchend:function(a){this.touching=!1;var b=+new Date-this.start.time<250&&p.abs(this.deltaX)>40||p.abs(this.deltaX)>this.width/2,c=!this.index&&this.deltaX>0||this.index==this.length-1&&this.deltaX<0;this.isScrolling||this.show(this.index+(b&&!c?this.deltaX<0?1:-1:0)),f.off("touchmove",this.ontouchmove),f.off("touchend",this.ontouchend)},show:function(a){a!=this.index?this.config.onchange.call(this,a):this.to=-a*this.width},moveTo:function(a){a!=this.index&&(this.pos=this.to=-a*this.width,this.index=a)},loop:function(){var a=this.to-this.pos,b=1;if(this.width&&a&&(b=p.max(.5,p.min(1.5,p.abs(a/this.width)))),this.touching||p.abs(a)<=1)this.pos=this.to,a=0,this.anim&&!this.touching&&this.config.oncomplete(this.index),this.anim=0,this.easing=this.config.easing;else{this.anim||(this.anim={start:this.pos,time:+new Date,distance:a,factor:b,destination:this.to});var c=+new Date-this.anim.time,d=this.config.duration*this.anim.factor;if(c>d||this.anim.destination!=this.to)return this.anim=0,void(this.easing=this.easeout);this.pos=this.easing(null,c,this.anim.start,this.anim.distance,d)}this.setX()}},h}(),b.fn.galleria=function(a){var d=this.selector;return b(this).length?this.each(function(){b.data(this,"galleria")&&(b.data(this,"galleria").destroy(),b(this).find("*").hide()),b.data(this,"galleria",(new c).init(this,a))}):(b(function(){b(d).length?b(d).galleria(a):c.utils.wait({until:function(){return b(d).length},success:function(){b(d).galleria(a)},error:function(){c.raise('Init failed: Galleria could not find the element "'+d+'".')},timeout:5e3})}),this)},c});;
3545/*! http://responsiveslides.com v1.54 by @viljamis */
3546(function(c,I,B){c.fn.responsiveSlides=function(l){var a=c.extend({auto:!0,speed:500,timeout:4E3,pager:!1,nav:!1,random:!1,pause:!1,pauseControls:!0,prevText:"Previous",nextText:"Next",maxwidth:"",navContainer:"",manualControls:"",namespace:"rslides",before:c.noop,after:c.noop},l);return this.each(function(){B++;var f=c(this),s,r,t,m,p,q,n=0,e=f.children(),C=e.size(),h=parseFloat(a.speed),D=parseFloat(a.timeout),u=parseFloat(a.maxwidth),g=a.namespace,d=g+B,E=g+"_nav "+d+"_nav",v=g+"_here",j=d+"_on",
3547w=d+"_s",k=c("<ul class='"+g+"_tabs "+d+"_tabs' />"),x={"float":"left",position:"relative",opacity:1,zIndex:2},y={"float":"none",position:"absolute",opacity:0,zIndex:1},F=function(){var b=(document.body||document.documentElement).style,a="transition";if("string"===typeof b[a])return!0;s=["Moz","Webkit","Khtml","O","ms"];var a=a.charAt(0).toUpperCase()+a.substr(1),c;for(c=0;c<s.length;c++)if("string"===typeof b[s[c]+a])return!0;return!1}(),z=function(b){a.before(b);F?(e.removeClass(j).css(y).eq(b).addClass(j).css(x),
3548n=b,setTimeout(function(){a.after(b)},h)):e.stop().fadeOut(h,function(){c(this).removeClass(j).css(y).css("opacity",1)}).eq(b).fadeIn(h,function(){c(this).addClass(j).css(x);a.after(b);n=b})};a.random&&(e.sort(function(){return Math.round(Math.random())-0.5}),f.empty().append(e));e.each(function(a){this.id=w+a});f.addClass(g+" "+d);l&&l.maxwidth&&f.css("max-width",u);e.hide().css(y).eq(0).addClass(j).css(x).show();F&&e.show().css({"-webkit-transition":"opacity "+h+"ms ease-in-out","-moz-transition":"opacity "+
3549h+"ms ease-in-out","-o-transition":"opacity "+h+"ms ease-in-out",transition:"opacity "+h+"ms ease-in-out"});
3549if(1<e.size()){if(D<h+100)return;if(a.pager&&!a.manualControls){var A=[];e.each(function(a){a+=1;A+="<li><a href='#' class='"+w+a+"'>"+a+"</a></li>"});k.append(A);l.navContainer?c(a.navContainer).append(k):f.after(k)}a.manualControls&&(k=c(a.manualControls),k.addClass(g+"_tabs "+d+"_tabs"));(a.pager||a.manualControls)&&k.find("li").each(function(a){c(this).addClass(w+(a+1))});if(a.pager||a.manualControls)q=
3550k.find("a"),r=function(a){q.closest("li").removeClass(v).eq(a).addClass(v)};a.auto&&(t=function(){p=setInterval(function(){e.stop(!0,!0);var b=n+1<C?n+1:0;(a.pager||a.manualControls)&&r(b);z(b)},D)},t());m=function(){a.auto&&(clearInterval(p),t())};a.pause&&f.hover(function(){clearInterval(p)},function(){m()});if(a.pager||a.manualControls)q.bind("click",function(b){b.preventDefault();a.pauseControls||m();b=q.index(this);n===b||c("."+j).queue("fx").length||(r(b),z(b))}).eq(0).closest("li").addClass(v),
3551a.pauseControls&&q.hover(function(){clearInterval(p)},function(){m()});if(a.nav){g="<a href='#' class='"+E+" prev'>"+a.prevText+"</a><a href='#' class='"+E+" next'>"+a.nextText+"</a>";l.navContainer?c(a.navContainer).append(g):f.after(g);var d=c("."+d+"_nav"),G=d.filter(".prev");d.bind("click",function(b){b.preventDefault();b=c("."+j);if(!b.queue("fx").length){var d=e.index(b);b=d-1;d=d+1<C?n+1:0;z(c(this)[0]===G[0]?b:d);if(a.pager||a.manualControls)r(c(this)[0]===G[0]?b:d);a.pauseControls||m()}});
3552a.pauseControls&&d.hover(function(){clearInterval(p)},function(){m()})}}if("undefined"===typeof document.body.style.maxWidth&&l.maxwidth){var H=function(){f.css("width","100%");f.width()>u&&f.css("width",u)};H();c(I).bind("resize",function(){H()})}})}})(jQuery,this,0);
3553;
3554var slickr_flickr_slideshow_timer;
3555var slickr_flickr_slideshow_timer_on = false;
3556
3557jQuery.noConflict();
3558
3559function slickr_flickr_next_slide(obj) {
3560    var j = jQuery(obj);
3561    if (j.children('div').length == 1)  return ;
3562    options = j.parent().data("options");    
3563    if (('autoplay' in options) && (options['autoplay'] == false)) return;   
3564    var $active = j.children('div.active');
3565    if ( $active.length == 0 ) $active = j.children('div:last');
3566    var $next =  $active.next().length ? $active.next() : j.children('div:first');
3567
3568    $active.addClass('last-active');
3569    $next.css({opacity: 0.0})
3570        .addClass('active')
3571        .animate({opacity: 1.0}, options['transition'], function() {
3572            $active.removeClass('active last-active');
3573        });
3574}
3575
3576function slickr_flickr_next_slides() {
3577   jQuery('.slickr-flickr-slideshow').each(function(index){
3578   		s=jQuery(this);
3579        if (! s.hasClass('responsive')) slickr_flickr_next_slide(s) ;
3580   });
3581}
3582
3583function slickr_flickr_set_slideshow_height(slideshow,imgheight,divheight) {
3584    var s = jQuery(slideshow);
3585    s.find('div img').css("max-height",imgheight+"px");
3586    s.css("height", divheight+"px");
3587}    
3588
3589function slickr_flickr_set_slideshow_width(slideshow,width) {
3590    var s = jQuery(slideshow);
3591    s.find('div img').css("max-width",width+"px");
3592    s.css("width",width+"px");
3593} 
3594
3595function slickr_flickr_set_slideshow_click(slideshow,link,target) {
3596    var s = jQuery(slideshow);
3597    if (link=='next') 
3598    	s.unbind('click').click( function() {  slickr_flickr_next_slide(s) ; });
3599	else if (link=='toggle') 
3600		s.unbind('click').click( function() {  slickr_flickr_toggle_slideshows() ; });
3601	else 
3602		if (target == "_self")
3603			s.unbind('click').click( function() {  window.location = link.replace(/\\/g, ''); }); 
3604		else
3605			s.unbind('click').click( function() {  window.open(link.replace(/\\/g, ''),target); }); 		
3606}
3607
3608function slickr_flickr_toggle_slideshows() {
3609   if (slickr_flickr_slideshow_timer_on)
3610       slickr_flickr_stop_slideshows();
3611   else
3612       slickr_flickr_start_slideshows();
3613}
3614
3615function slickr_flickr_stop_slideshows() {
3616    clearTimeout(slickr_flickr_slideshow_timer);
3617    slickr_flickr_slideshow_timer_on = false;
3618}
3619
3620function slickr_flickr_start_slideshows() {
3621    var mindelay = 0;
3622    var mintimeout = 0;
3623    jQuery('.slickr-flickr-slideshow').each(function(index){
3624     var s =jQuery(this);
3625   	 options = s.parent().data('options');
3626   	 if (options) {
3627 	    if (s.hasClass('responsive')) {
3628    		if (('timeout' in options) && (options['timeout'] != '')) {
3629    			timeout = options['timeout'];
3630    		    if ((!(timeout == undefined)) && ((mintimeout == 0) || (timeout < mintimeout))) mintimeout = timeout;
3631    		} 		
3632    	} else {
3633    		if (('link' in options) && (options['link'] != ''))  slickr_flickr_set_slideshow_click(s,options['link'],options['target']);
3634    		if (('width' in options) && (options['width'] != ''))  slickr_flickr_set_slideshow_width(s,options['width']);
3635     		if (('height' in options) && (options['height'] != ''))  {
3636     			imgheight = parseInt(options['height']);
3637     			divheight = imgheight+ (s.hasClass("nocaptions") ? 0 : 30);
3638     			if (s.hasClass("descriptions")) divheight += 50;
3639 	    		slickr_flickr_set_slideshow_height(s,imgheight,divheight);
3640 			}
3641    		if (('delay' in options) && (options['delay'] != '')) {
3642    			delay = options['delay'];
3643    		    if ((!(delay == undefined)) && ((mindelay == 0) || (delay < mindelay))) mindelay = delay;
3644    		} 		 
3645		}
3646	  }
3647    });
3648	if (mindelay > 0) {
3649		slickr_flickr_stop_slideshows();
3650	    slickr_flickr_slideshow_timer = setInterval("slickr_flickr_next_slides()",mindelay);
3651	    slickr_flickr_slideshow_timer_on = true;
3652    }
3653	if (mintimeout > 0) {
3654	  jQuery('.slickr-flickr-slideshow.responsive').each(function(index){
3655    	var s =jQuery(this);
3656   		options = s.parent().data('options');
3657   		if (options) {
3658    		options['timeout'] = mintimeout;
3659			s.find('ul').responsiveSlides(options);
3660		}
3661	  });
3662    }
3663
3664}
3665
3666function slickr_flickr_start() {    
3667    if (jQuery('.slickr-flickr-galleria').length > 0) {
3668    	jQuery(".slickr-flickr-galleria").each(function(index){
3669    	    var $options = jQuery(this).parent().data("options");
3670    	    var lazy = ('thumbnails' in $options) && ($options['thumbnails'] == 'lazy');
3671    	    jQuery(this).galleria($options);
3672			if (lazy) Galleria.ready( function(options) { this.lazyLoadChunks( 10, 200); } );
3673    	});
3674    } 
3675    
3676    jQuery(".slickr-flickr-gallery").find('img').hover( 
3677		function(){ jQuery(this).addClass('hover');},
3678		function(){ jQuery(this).removeClass('hover');}); 	
3679		
3680    jQuery(".slickr-flickr-gallery").each( function (index) {	
3681        $options = jQuery(this).parent().data("options");
3682  		if ($options && ('border' in $options) && ($options['border'] != '')) {
3683  			$id = jQuery(this).parent().attr('id');
3684	 		jQuery('<style type="text/css">#'+$id+' img.hover{ background-color:'+$options['border']+'; }</style>').appendTo('head');
3685 		}
3686 		if (jQuery(this).hasClass('sf-lightbox')) {
3687  			jQuery(this).find('a').each( function (ind) { 
3688  				jQuery(this).click( function(e) { 
3689					e.preventDefault();
3690					e.stopPropagation();
3691 	        		var lg = jQuery(this).closest('.sf-lightbox').parent();
3692 	        		var options = lg.data("options");
3693					options['start'] = ind; 
3694  					lg.lightGallery(options); 
3695  				} );
3696  			});
3697 		}
3698 	});
3699 	 
3700    slickr_flickr_start_slideshows();
3701
3702};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.