function WindowSize()
{ this.w = 0; this.h = 0; return this.update();}
WindowSize.prototype.update = function()
{ var d = document; this.w = (window.innerWidth) ? window.innerWidth
: (d.documentElement && d.documentElement.clientWidth) ? d.documentElement.clientWidth
: d.body.clientWidth; this.h = (window.innerHeight) ? window.innerHeight
: (d.documentElement && d.documentElement.clientHeight) ? d.documentElement.clientHeight
: d.body.clientHeight; return this;}; function PageSize()
{ this.win = new WindowSize(); this.w = 0; this.h = 0; return this.update();}
PageSize.prototype.update = function()
{ var d = document; this.w = (window.innerWidth && window.scrollMaxX) ? window.innerWidth + window.scrollMaxX
: (d.body.scrollWidth > d.body.offsetWidth) ? d.body.scrollWidth
: d.body.offsetWidt; this.h = (window.innerHeight && window.scrollMaxY) ? window.innerHeight + window.scrollMaxY
: (d.body.scrollHeight > d.body.offsetHeight) ? d.body.scrollHeight
: d.body.offsetHeight; this.win.update(); if (this.w < this.win.w) this.w = this.win.w; if (this.h < this.win.h) this.h = this.win.h; return this;}; function PagePos()
{ this.x = 0; this.y = 0; return this.update();}
PagePos.prototype.update = function()
{ var d = document; this.x = (window.pageXOffset) ? window.pageXOffset
: (d.documentElement && d.documentElement.scrollLeft) ? d.documentElement.scrollLeft
: (d.body) ? d.body.scrollLeft
: 0; this.y = (window.pageYOffset) ? window.pageYOffset
: (d.documentElement && d.documentElement.scrollTop) ? d.documentElement.scrollTop
: (d.body) ? d.body.scrollTop
: 0; return this;}; function LightBox(option)
{ var self = this; self._imgs = new Array(); self._sets = new Array(); self._wrap = null; self._box = null; self._img = null; self._open = -1; self._page = new PageSize(); self._pos = new PagePos(); self._zoomimg = null; self._expandable = false; self._expanded = false; self._funcs = {'move':null,'up':null,'drag':null,'wheel':null,'dbl':null}; self._level = 1; self._curpos = {x:0,y:0}; self._imgpos = {x:0,y:0}; self._minpos = {x:0,y:0}; self._expand = option.expandimg; self._shrink = option.shrinkimg; self._resizable = option.resizable; self._timer = null; self._indicator = null; self._overall = null; self._openedset = null; self._prev = null; self._next = null; self._hiding = []; self._first = false; return self._init(option);}
LightBox.prototype = { _init : function(option)
{ var self = this; var d = document; if (!d.getElementsByTagName) return; if (Browser.isMacIE) return self; var links = d.getElementsByTagName("a"); for (var i=0;i<links.length;i++)
{ var anchor = links[i]; var num = self._imgs.length; var rel = String(anchor.getAttribute("rel")).toLowerCase(); if (!anchor.getAttribute("href") || !rel.match('lightbox')) continue; self._imgs[num] = { src:anchor.getAttribute("href"), w:-1, h:-1, title:'', cls:anchor.className, set:rel
}; if (anchor.getAttribute("title"))
self._imgs[num].title = anchor.getAttribute("title"); else if ( anchor.firstChild
&& anchor.firstChild.getAttribute
&& anchor.firstChild.getAttribute("title"))
self._imgs[num].title = anchor.firstChild.getAttribute("title"); anchor.onclick = self._genOpener(num); if (rel != 'lightbox')
{ if (!self._sets[rel]) self._sets[rel] = new Array(); self._sets[rel].push(num);}
}
var body = d.getElementsByTagName("body")[0]; self._wrap = self._createWrapOn(body,option.loadingimg); self._box = self._createBoxOn(body,option); self._img = self._box.firstChild; self._zoomimg = d.getElementById('actionImage'); return self;}, _genOpener : function(num)
{ var self = this; return function() { self._show(num); return false;}
}, _createWrapOn : function(obj,imagePath)
{ var self = this; if (!obj) return null; var wrap = document.createElement('div'); obj.appendChild(wrap); wrap.id = 'overlay'; wrap.style.display = 'none'; wrap.style.position = 'fixed'; wrap.style.top = '0px'; wrap.style.left = '0px'; wrap.style.zIndex = '50'; wrap.style.width = '100%'; wrap.style.height = '100%'; if (Browser.isWinIE) wrap.style.position = 'absolute'; Event.register(wrap,"click",function(evt) { self._close(evt);}); var imag = new Image; imag.onload = function() { var spin = document.createElement('img'); wrap.appendChild(spin); spin.id = 'loadingImage'; spin.src = imag.src; spin.style.position = 'relative'; self._set_cursor(spin); Event.register(spin,'click',function(evt) { self._close(evt);}); imag.onload = function(){};}; if (imagePath != '') imag.src = imagePath; return wrap;}, _createBoxOn : function(obj,option)
{ var self = this; if (!obj) return null; var box = document.createElement('div'); obj.appendChild(box); box.id = 'lightbox'; box.style.display = 'none'; box.style.position = 'absolute'; box.style.zIndex = '60'; var img = document.createElement('img'); box.appendChild(img); img.id = 'lightboxImage'; self._set_cursor(img); Event.register(img,'mouseover',function() { self._show_action();}); Event.register(img,'mouseout',function() { self._hide_action();}); Event.register(img,'click',function(evt) { self._close(evt);}); if (option.previmg)
{ var prevLink = document.createElement('img'); box.appendChild(prevLink); prevLink.id = 'prevLink'; prevLink.style.display = 'none'; prevLink.style.position = 'absolute'; prevLink.style.left = '9px'; prevLink.style.zIndex = '70'; prevLink.src = option.previmg; self._prev = prevLink; Event.register(prevLink,'mouseover',function() { self._show_action();}); Event.register(prevLink,'click',function() { self._show_next(-1);});}
if (option.nextimg)
{ var nextLink = document.createElement('img'); box.appendChild(nextLink); nextLink.id = 'nextLink'; nextLink.style.display = 'none'; nextLink.style.position = 'absolute'; nextLink.style.right = '9px'; nextLink.style.zIndex = '70'; nextLink.src = option.nextimg; self._next = nextLink; Event.register(nextLink,'mouseover',function() { self._show_action();}); Event.register(nextLink,'click',function() { self._show_next(+1);});}
var zoom = document.createElement('img'); box.appendChild(zoom); zoom.id = 'actionImage'; zoom.style.display = 'none'; zoom.style.position = 'absolute'; zoom.style.top = '15px'; zoom.style.left = '15px'; zoom.style.zIndex = '70'; self._set_cursor(zoom); zoom.src = self._expand; Event.register(zoom,'mouseover',function() { self._show_action();}); Event.register(zoom,'click', function() { self._zoom();}); Event.register(window,'resize',function() { self._set_size(true);}); if (option.closeimg)
{ var btn = document.createElement('img'); box.appendChild(btn); btn.id = 'closeButton'; btn.style.display = 'inline'; btn.style.position = 'absolute'; btn.style.right = '9px'; btn.style.top = '10px'; btn.style.zIndex = '80'; btn.src = option.closeimg; self._set_cursor(btn); Event.register(btn,'click',function(evt) { self._close(evt);});}
var caption = document.createElement('span'); box.appendChild(caption); caption.id = 'lightboxCaption'; caption.style.display = 'none'; caption.style.position = 'absolute'; caption.style.zIndex = '80'; if (!option.effectpos)
option.effectpos = {x:0,y:0}; else
{ if (option.effectpos.x == '') option.effectpos.x = 0; if (option.effectpos.y == '') option.effectpos.y = 0;}
var effect = new Image; effect.onload = function()
{ var effectImg = document.createElement('img'); box.appendChild(effectImg); effectImg.id = 'effectImage'; effectImg.src = effect.src; if (option.effectclass) effectImg.className = option.effectclass; effectImg.style.position = 'absolute'; effectImg.style.display = 'none'; effectImg.style.left = [option.effectpos.x,'px'].join('');; effectImg.style.top = [option.effectpos.y,'px'].join(''); effectImg.style.zIndex = '90'; self._set_cursor(effectImg); Event.register(effectImg,'click',function() { effectImg.style.display = 'none';});}; if (option.effectimg != '') effect.src = option.effectimg; if (self._resizable)
{ var overall = document.createElement('div'); obj.appendChild(overall); overall.id = 'lightboxOverallView'; overall.style.display = 'none'; overall.style.position = 'absolute'; overall.style.zIndex = '70'; self._overall = overall; var indicator = document.createElement('div'); obj.appendChild(indicator); indicator.id = 'lightboxIndicator'; indicator.style.display = 'none'; indicator.style.position = 'absolute'; indicator.style.zIndex = '80'; self._indicator = indicator;}
return box;}, _set_photo_size : function()
{ var self = this; if (self._open == -1) return; var targ = { w:self._page.win.w - 30, h:self._page.win.h - 30 }; var zoom = { x:15, y:15 }; var navi = { p:9, n:9, y:0 }; if (!self._expanded)
{ var orig = { w:self._imgs[self._open].w, h:self._imgs[self._open].h }; var ratio = 1.0; if ((orig.w >= targ.w || orig.h >= targ.h) && orig.h && orig.w)
ratio = ((targ.w / orig.w) < (targ.h / orig.h)) ? targ.w / orig.w : targ.h / orig.h; self._img.width = Math.floor(orig.w * ratio); self._img.height = Math.floor(orig.h * ratio); self._expandable = (ratio < 1.0) ? true : false; if (self._resizable) self._expandable = true; if (Browser.isWinIE) self._box.style.display = "block"; self._imgpos.x = self._pos.x + (targ.w - self._img.width) / 2; self._imgpos.y = self._pos.y + (targ.h - self._img.height) / 2; navi.y = Math.floor(self._img.height / 2) - 10; self._show_caption(true); self._show_overall(false);}
else
{ var width = parseInt(self._imgs[self._open].w * self._level); var height = parseInt(self._imgs[self._open].h * self._level); self._minpos.x = self._pos.x + targ.w - width; self._minpos.y = self._pos.y + targ.h - height; if (width <= targ.w)
self._imgpos.x = self._pos.x + (targ.w - width) / 2; else
{ if (self._imgpos.x > self._pos.x) self._imgpos.x = self._pos.x; else if (self._imgpos.x < self._minpos.x) self._imgpos.x = self._minpos.x; zoom.x = 15 + self._pos.x - self._imgpos.x; navi.p = self._pos.x - self._imgpos.x - 5; navi.n = width - self._page.win.w + self._imgpos.x + 25; if (Browser.isWinIE) navi.n -= 10;}
if (height <= targ.h)
{ self._imgpos.y = self._pos.y + (targ.h - height) / 2; navi.y = Math.floor(self._img.height / 2) - 10;}
else
{ if (self._imgpos.y > self._pos.y) self._imgpos.y = self._pos.y; else if (self._imgpos.y < self._minpos.y) self._imgpos.y = self._minpos.y; zoom.y = 15 + self._pos.y - self._imgpos.y; navi.y = Math.floor(targ.h / 2) - 10 + self._pos.y - self._imgpos.y;}
self._img.width = width; self._img.height = height; self._show_caption(false); self._show_overall(true);}
self._box.style.left = [self._imgpos.x,'px'].join(''); self._box.style.top = [self._imgpos.y,'px'].join(''); self._zoomimg.style.left = [zoom.x,'px'].join(''); self._zoomimg.style.top = [zoom.y,'px'].join(''); self._wrap.style.left = self._pos.x; if (self._prev && self._next)
{ self._prev.style.left = [navi.p,'px'].join(''); self._next.style.right = [navi.n,'px'].join(''); self._prev.style.top = self._next.style.top = [navi.y,'px'].join('');}
}, _show_overall : function(visible)
{ var self = this; if (self._overall == null) return; if (visible)
{ if (self._open == -1) return; var base = 100; var outer = { w:0, h:0, x:0, y:0 }; var inner = { w:0, h:0, x:0, y:0 }; var orig = { w:self._img.width , h:self._img.height }; var targ = { w:self._page.win.w - 30, h:self._page.win.h - 30 }; var max = orig.w; if (max < orig.h) max = orig.h; if (max < targ.w) max = targ.w; if (max < targ.h) max = targ.h; if (max < 1) return; outer.w = parseInt(orig.w / max * base); outer.h = parseInt(orig.h / max * base); inner.w = parseInt(targ.w / max * base); inner.h = parseInt(targ.h / max * base); outer.x = self._pos.x + targ.w - base - 20; outer.y = self._pos.y + targ.h - base - 20; inner.x = outer.x - parseInt((self._imgpos.x - self._pos.x) / max * base); inner.y = outer.y - parseInt((self._imgpos.y - self._pos.y) / max * base); self._overall.style.left = [outer.x,'px'].join(''); self._overall.style.top = [outer.y,'px'].join(''); self._overall.style.width = [outer.w,'px'].join(''); self._overall.style.height = [outer.h,'px'].join(''); self._indicator.style.left = [inner.x,'px'].join(''); self._indicator.style.top = [inner.y,'px'].join(''); self._indicator.style.width = [inner.w,'px'].join(''); self._indicator.style.height = [inner.h,'px'].join(''); self._overall.style.display = 'block'
self._indicator.style.display = 'block';}
else
{ self._overall.style.display = 'none'; self._indicator.style.display = 'none';}
}, _set_size : function(onResize)
{ var self = this; if (self._open == -1) return; self._page.update(); self._pos.update(); var spin = self._wrap.firstChild; if (spin)
{ var top = (self._page.win.h - spin.height) / 2; if (self._wrap.style.position == 'absolute') top += self._pos.y; spin.style.top = [top,'px'].join(''); spin.style.left = [(self._page.win.w - spin.width - 30) / 2,'px'].join('');}
if (Browser.isWinIE)
{ self._wrap.style.width = [self._page.win.w,'px'].join(''); self._wrap.style.height = [self._page.win.h,'px'].join(''); self._wrap.style.top = [self._pos.y,'px'].join('');}
if (onResize) self._set_photo_size();}, _set_cursor : function(obj)
{ var self = this; if (Browser.isWinIE && !Browser.isNewIE) return; obj.style.cursor = 'pointer';}, _current_setindex : function()
{ var self = this; if (!self._openedset) return -1; var list = self._sets[self._openedset]; for (var i=0,n=list.length;i<n;i++)
{ if (list[i] == self._open) return i;}
return -1;}, _get_setlength : function()
{ var self = this; if (!self._openedset) return -1; return self._sets[self._openedset].length;}, _show_action : function()
{ var self = this; if (self._open == -1 || !self._expandable) return; if (!self._zoomimg) return; self._zoomimg.src = (self._expanded) ? self._shrink : self._expand; self._zoomimg.style.display = 'inline'; var check = self._current_setindex(); if (check > -1)
{ if (check > 0) self._prev.style.display = 'inline'; if (check < self._get_setlength() - 1) self._next.style.display = 'inline';}
}, _hide_action : function()
{ var self = this; if (self._zoomimg) self._zoomimg.style.display = 'none'; if (self._open > -1 && self._expanded) self._dragstop(null); if (self._prev) self._prev.style.display = 'none'; if (self._next) self._next.style.display = 'none';}, _zoom : function()
{ var self = this; var closeBtn = document.getElementById('closeButton'); if (self._expanded)
{ self._reset_func(); self._expanded = false; if (closeBtn) closeBtn.style.display = 'inline';}
else if (self._open > -1)
{ self._level = 1; self._imgpos.x = self._pos.x; self._imgpos.y = self._pos.y; self._expanded = true; self._funcs.drag = function(evt) { self._dragstart(evt) }; self._funcs.dbl = function(evt) { self._close(null) }; if (self._resizable)
{ self._funcs.wheel = function(evt) { self._onwheel(evt) }; Event.register(self._box,'mousewheel',self._funcs.wheel);}
Event.register(self._img,'mousedown',self._funcs.drag); Event.register(self._img,'dblclick',self._funcs.dbl); if (closeBtn) closeBtn.style.display = 'none';}
self._set_photo_size(); self._show_action();}, _reset_func : function()
{ var self = this; if (self._funcs.wheel != null) Event.deregister(self._box,'mousewheel',self._funcs.wheel); if (self._funcs.move != null) Event.deregister(self._img,'mousemove',self._funcs.move); if (self._funcs.up != null) Event.deregister(self._img,'mouseup',self._funcs.up); if (self._funcs.drag != null) Event.deregister(self._img,'mousedown',self._funcs.drag); if (self._funcs.dbl != null) Event.deregister(self._img,'dblclick',self._funcs.dbl); self._funcs = {'move':null,'up':null,'drag':null,'wheel':null,'dbl':null};}, _onwheel : function(evt)
{ var self = this; var delta = 0; evt = Event.getEvent(evt); if (evt.wheelDelta) delta = event.wheelDelta/-120; else if (evt.detail) delta = evt.detail/3; if (Browser.isOpera) delta = - delta; var step = (self._level < 1) ? 0.1
: (self._level < 2) ? 0.25
: (self._level < 4) ? 0.5
: 1; self._level = (delta > 0) ? self._level + step : self._level - step; if (self._level > 8) self._level = 8; else if (self._level < 0.5) self._level = 0.5; self._set_photo_size(); return Event.stop(evt);}, _dragstart : function(evt)
{ var self = this; evt = Event.getEvent(evt); self._curpos.x = evt.screenX; self._curpos.y = evt.screenY; self._funcs.move = function(evnt) { self._dragging(evnt);}; self._funcs.up = function(evnt) { self._dragstop(evnt);}; Event.register(self._img,'mousemove',self._funcs.move); Event.register(self._img,'mouseup',self._funcs.up); return Event.stop(evt);}, _dragging : function(evt)
{ var self = this; evt = Event.getEvent(evt); self._imgpos.x += evt.screenX - self._curpos.x; self._imgpos.y += evt.screenY - self._curpos.y; self._curpos.x = evt.screenX; self._curpos.y = evt.screenY; self._set_photo_size(); return Event.stop(evt);}, _dragstop : function(evt)
{ var self = this; evt = Event.getEvent(evt); if (self._funcs.move != null) Event.deregister(self._img,'mousemove',self._funcs.move); if (self._funcs.up != null) Event.deregister(self._img,'mouseup',self._funcs.up); self._funcs.move = null; self._funcs.up = null; self._set_photo_size(); return (evt) ? Event.stop(evt) : false;}, _show_caption : function(enable)
{ var self = this; var caption = document.getElementById('lightboxCaption'); if (!caption) return; if (caption.innerHTML.length == 0 || !enable)
{ caption.style.display = 'none';}
else
{ caption.style.top = [self._img.height + 10,'px'].join(''); caption.style.left = '0px'; caption.style.width = [self._img.width + 20,'px'].join(''); caption.style.display = 'block';}
}, _toggle_wrap : function(flag)
{ var self = this; self._wrap.style.display = flag ? "block" : "none"; if (self._hiding.length == 0 && !self._first)
{ var tags = ['select','embed','object']; for (var i=0,n=tags.length;i<n;i++)
{ var elem = document.getElementsByTagName(tags[i]); for (var j=0,m=elem.length;j<m;j++)
{ var check = elem[j].style.visibility; if (!check)
{ if (elem[j].currentStyle)
check = elem[j].currentStyle['visibility']; else if (document.defaultView)
check = document.defaultView.getComputedStyle(elem[j],'').getPropertyValue('visibility');}
if (check == 'hidden') continue; self._hiding.push(elem[j]);}
}
self._first = true;}
for (var i=0,n=self._hiding.length;i<n;i++)
self._hiding[i].style.visibility = flag ? "hidden" : "visible";}, _show : function(num)
{ var self = this; var imag = new Image; if (num < 0 || num >= self._imgs.length) return; var loading = document.getElementById('loadingImage'); var caption = document.getElementById('lightboxCaption'); var effect = document.getElementById('effectImage'); self._open = num; self._set_size(false); self._toggle_wrap(true); if (loading) loading.style.display = 'inline'; imag.onload = function() { if (self._imgs[self._open].w == -1)
{ self._imgs[self._open].w = imag.width; self._imgs[self._open].h = imag.height;}
if (effect)
{ effect.style.display = (!effect.className || self._imgs[self._open].cls == effect.className)
? 'block' : 'none';}
if (caption)
try { caption.innerHTML = self._imgs[self._open].title;} catch(e) {}
self._set_photo_size(); self._hide_action(); self._box.style.display = "block"; self._img.src = imag.src; self._img.setAttribute('title',self._imgs[self._open].title); self._timer = window.setInterval( function() { self._set_size(true) } , 100); if (loading) loading.style.display = 'none'; if (self._imgs[self._open].set != 'lightbox')
{ var set = self._imgs[self._open].set; if (self._sets[set].length > 1) self._openedset = set; if (!self._prev || !self._next) self._openedset = null;}
}; self._expandable = false; self._expanded = false; imag.src = self._imgs[self._open].src;}, _close_box : function()
{ var self = this; self._open = -1; self._openedset = null; self._hide_action(); self._hide_action(); self._reset_func(); self._show_overall(false); self._box.style.display = "none"; if (self._timer != null)
{ window.clearInterval(self._timer); self._timer = null;}
}, _show_next : function(direction)
{ var self = this; if (!self._openedset) return self._close(null); var index = self._current_setindex() + direction; var targ = self._sets[self._openedset][index]; self._close_box(); self._show(targ);}, _close : function(evt)
{ var self = this; if (evt != null)
{ evt = Event.getEvent(evt); var targ = evt.target || evt.srcElement; if (targ && targ.getAttribute('id') == 'lightboxImage' && self._expanded) return;}
self._close_box(); self._toggle_wrap(false);}
}; Event.register(window,"load",function() { var lightbox = new LightBox({ loadingimg:'http://soltys.biz/textpattern/js/loading.gif', expandimg:'http://soltys.biz/textpattern/js/expand.gif', shrinkimg:'http://soltys.biz/textpattern/js/shrink.gif', previmg:'http://soltys.biz/textpattern/js/prev.gif', nextimg:'http://soltys.biz/textpattern/js/next.gif', effectimg:'http://soltys.biz/textpattern/js/zzoop.gif', effectpos:{x:-40,y:-20}, effectclass:'http://soltys.biz/textpattern/js/effectable', closeimg:'http://soltys.biz/textpattern/js/close.gif', resizable:true
});}); 