diff --git a/e107_plugins/gallery/e_header.php b/e107_plugins/gallery/e_header.php index 9d5eb2974..bdd9ef68e 100644 --- a/e107_plugins/gallery/e_header.php +++ b/e107_plugins/gallery/e_header.php @@ -13,11 +13,15 @@ e107::getJs()->pluginCSS('gallery', 'jslib/lightbox/css/lightbox.css'); e107::getJS()->headerFile("https://ajax.googleapis.com/ajax/libs/prototype/1.7.0.0/prototype.js",1); e107::getJS()->headerFile("https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/scriptaculous.js?load=effects",1); -e107::getJs()->headerPlugin('gallery', 'jslib/carousel-min.js'); +e107::getJs()->headerPlugin('gallery', 'jslib/carousel.js'); e107::getJs()->pluginCSS('gallery', 'gallery_style.css'); e107::getJs()->footerInline(" - new Carousel('carousel-wrapper', $$('#carousel-content .slide'), $$('a.carousel-control', 'a.carousel-jumper')); + new Carousel('carousel-wrapper', $$('#carousel-content .slide'), $$('a.carousel-control', 'a.carousel-jumper' ), + { + auto: true, + circular: true + }); "); diff --git a/e107_plugins/gallery/jslib/carousel-min.js b/e107_plugins/gallery/jslib/carousel-min.js deleted file mode 100644 index d85588e64..000000000 --- a/e107_plugins/gallery/jslib/carousel-min.js +++ /dev/null @@ -1,25 +0,0 @@ -/* -Copyright (c) 2009 Victor Stanciu - http://www.victorstanciu.ro - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. -*/ -eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('1C=19.1a(1D,{1b:7(c,d,e,f){4.o=t;4.h=$(c);4.8=d;4.k=e;4.5=F.G({p:1,1c:t,1d:3,q:1,1e:\'H-1E\',1f:\'H-1F\',I:\'H-1G\',J:\'H-1H\',r:t,v:K,w:\'1g\',S:\'T\'},f||{});6(4.5.w==\'L\'){4.5.r=K}4.8.1I(7(a,b){a.M=b});6(4.k){4.k.N(\'U\',\'V\',4.V.z(4))}6(4.5.v){4.h.U(\'1J\',4.v.1h(4)).U(\'1K\',4.v.1h(4))}6(4.5.1c){4.A()}6(4.5.1i){9 g=4.8.1L($(4.5.1i));6(g>(4.5.q-1)&&4.5.q>1){6(g>4.8.i-(4.5.q+1)){g=4.8.i-4.5.q}}4.l(4.8[g])}},V:7(a){4.B();9 b=a.1M(\'a\');6(!b.W(4.5.I)){6(b.W(4.5.1e)){1N("4."+b.1j+"()")}s 6(b.W(4.5.1f)){4.l(b.1j);6(4.5.J){4.k.N(\'1k\',4.5.J);b.1l(4.5.J)}}}4.X();a.B()},l:7(a){6(4.5.Y&&(Z 4.5.Y==\'7\')){4.5.Y()}4.10=4.m?4.m:4.8[0];4.m=$(a);9 b=4.h.1m();9 c=4.m.1m();6(4.o){4.o.1O()}1n(4.5.w){O\'L\':4.o=11 n.1o(4.h,{1p:1.0,1q:0,p:4.5.p,12:(7(){4.h.C=c[0]-b[0];4.h.D=c[1]-b[1];11 n.1o(4.h,{1p:0,1q:1.0,p:4.5.p,12:(7(){6(4.k){4.P()}6(4.5.u&&(Z 4.5.u==\'7\')){4.5.u()}}).z(4)})}).z(4)});Q;O\'1g\':1r:9 d;1n(4.5.S){O\'1s\':d=n.1t.1s;Q;O\'T\':1r:d=n.1t.T;Q}4.o=11 n.13(4.h,{p:4.5.p,x:(c[0]-b[0]),y:(c[1]-b[1]),S:d,12:(7(){6(4.k){4.P()}6(4.5.u&&(Z 4.5.u==\'7\')){4.5.u()}4.o=t}).z(4)});Q}R t},1u:7(){6(4.m){9 a=4.m.M;9 b=(a==0)?(4.5.r?4.8.i-1:0):a-1}s{9 b=(4.5.r?4.8.i-1:0)}6(b==(4.8.i-1)&&4.5.r&&4.5.w!=\'L\'){4.h.C=(4.8.i-1)*4.8.14().1P();4.h.D=(4.8.i-1)*4.8.14().1Q();b=4.8.i-2}4.l(4.8[b])},15:7(){6(4.m){9 a=4.m.M;9 b=(4.8.i-1==a)?(4.5.r?0:a):a+1}s{9 b=1}6(b==0&&4.5.r&&4.5.w!=\'L\'){4.h.C=0;4.h.D=0;b=1}6(b>4.8.i-(4.5.q+1)){b=4.8.i-4.5.q}4.l(4.8[b])},14:7(){4.l(4.8[0])},1R:7(){4.l(4.8[4.8.i-1])},1S:7(){6(4.10){4.l(4.8[4.10.M])}s{R t}},B:7(){6(4.E){1v(4.E)}},A:7(){4.16()},1T:7(){4.B();4.P()},1U:7(b){6(b){9 c=b.1V||b.1W;6(!c||(!4.8.1X(c)&&!4.8.1Y(7(a){R c.1Z(a)}))){4.A()}}s{4.A()}},16:7(){6(4.E!=20){1v(4.E);4.15()}4.E=21(4.16.z(4),4.5.1d*22)},v:7(a){a.23=K;a.B();9 b=0;6(!a){a=24.25}6(a.1w){b=a.1w/26}s 6(a.1x){b=-a.1x/3}6(!4.o){4.X();6(b>0){4.1u()}s{4.15()}}R 27.28(b)},X:7(){4.k.N(\'1l\',4.5.I)},P:7(){4.k.N(\'1k\',4.5.I)}});n.13=19.1a();F.G(F.G(n.13.1y,n.29.1y),{1b:7(a){4.j=$(a);9 b=F.G({x:0,y:0,1z:\'1A\'},2a[1]||{});4.A(b)},2b:7(){6(4.5.2c&&!4.j.1B){4.j.2d();4.j.1B=K;4.j.2e(4.j.2f)}4.17=4.j.C;4.18=4.j.D;6(4.5.1z==\'1A\'){4.5.x-=4.17;4.5.y-=4.18}},2g:7(a){4.j.C=4.5.x*a+4.17;4.j.D=4.5.y*a+4.18}});',62,141,'||||this|options|if|function|slides|var||||||||scroller|length|element|controls|moveTo|current|Effect|scrolling|duration|visibleSlides|circular|else|false|afterMove|wheel|effect|||bind|start|stop|scrollLeft|scrollTop|timer|Object|extend|carousel|disabledClassName|selectedClassName|true|fade|_index|invoke|case|activateControls|break|return|transition|sinoidal|observe|click|hasClassName|deactivateControls|beforeMove|typeof|previous|new|afterFinish|SmoothScroll|first|next|periodicallyUpdate|originalLeft|originalTop|Class|create|initialize|auto|frequency|controlClassName|jumperClassName|scroll|bindAsEventListener|initial|rel|removeClassName|addClassName|cumulativeOffset|switch|Opacity|from|to|default|spring|Transitions|prev|clearTimeout|wheelDelta|detail|prototype|mode|absolute|_ext|Carousel|Abstract|control|jumper|disabled|selected|each|mousewheel|DOMMouseScroll|indexOf|findElement|eval|cancel|getWidth|getHeight|last|toggle|pause|resume|relatedTarget|toElement|include|any|descendantOf|null|setTimeout|1000|cancelBubble|window|event|120|Math|round|Base|arguments|setup|continuous|cleanWhitespace|appendChild|firstChild|update'.split('|'),0,{})) \ No newline at end of file diff --git a/e107_plugins/gallery/jslib/carousel.js b/e107_plugins/gallery/jslib/carousel.js new file mode 100644 index 000000000..8f46fd4bf --- /dev/null +++ b/e107_plugins/gallery/jslib/carousel.js @@ -0,0 +1,465 @@ +/* +Copyright (c) 2009 Victor Stanciu - http://www.victorstanciu.ro + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +*/ + +Carousel = Class.create(Abstract, { + initialize: function (scroller, slides, controls, options) { + this.scrolling = false; + this.scroller = $(scroller); + this.slides = slides; + this.controls = controls; + + + this.options = Object.extend({ + duration: 1, + auto: false, + frequency: 3, + visibleSlides: 1, + controlClassName: 'carousel-control', + jumperClassName: 'carousel-jumper', + disabledClassName: 'carousel-disabled', + selectedClassName: 'carousel-selected', + circular: false, + wheel: true, + effect: 'scroll', + transition: 'sinoidal' + + }, options || {}); + + + + if (this.options.effect == 'fade') { + this.options.circular = true; + } + + //scroll-circular fix by SecretR @ free-source.net + if (this.options.effect == 'scroll' && this.options.circular && this.slides.length > 1) { + var fixel = Element.clone(this.slides[0], true); + fixel.identify(); + this.slides[this.slides.length] = fixel; + Element.insert(this.slides[0].up(), { + bottom: fixel + }); + } + + this.slides.each(function(slide, index) { + slide._index = index; + }); + + if (this.controls) { + this.controls.invoke('observe', 'click', this.click.bind(this)); + } + + if (this.options.wheel) { + this.scroller.observe('mousewheel', this.wheel.bindAsEventListener(this)).observe('DOMMouseScroll', this.wheel.bindAsEventListener(this));; + } + + if (this.options.auto) { + this.start(); + // this.slides.invoke('observe', 'mouseover', this.pause.bind(this)); + // this.slides.invoke('observe', 'mouseout', this.resume.bind(this)); + } + + if (this.options.initial) { + + var initialIndex = this.slides.indexOf($(this.options.initial)); + + if (initialIndex > (this.options.visibleSlides - 1) && this.options.visibleSlides > 1) { + if (initialIndex > this.slides.length - (this.options.visibleSlides + 1)) { + initialIndex = this.slides.length - this.options.visibleSlides; + } + } + + this.moveTo(this.slides[initialIndex]); + } + + if (this.options.container) { + this.container = $(this.options.container); + this.jumpers = this.container.select('a.'+this.options.jumperClassName); + } else { + this.jumpers = $$('a.'+ this.options.jumperClassName); + } + + //this.current = this.slides[0]; + }, + + click: function (event) { + this.stop(); + + var element = event.findElement('a'); + + if (!element.hasClassName(this.options.disabledClassName)) { + if (element.hasClassName(this.options.controlClassName)) { + eval("this." + element.rel + "()"); + } else if (element.hasClassName(this.options.jumperClassName)) { + this.moveTo(element.rel); + } + } + + this.deactivateControls(); + + event.stop(); + }, + + moveTo: function (element) { + if (this.slides.length > 1) { + if (this.options.selectedClassName && this.jumpers) { + this.jumpers.each(function(jump,b){ + if (jump.hasClassName(this.options.selectedClassName)) { + jump.removeClassName(this.options.selectedClassName); + } + + if (jump.rel == element || jump.rel == element.id ) { + jump.addClassName(this.options.selectedClassName); + } + + }.bind(this)); + } + + if (this.options.beforeMove && (typeof this.options.beforeMove == 'function')) { + this.options.beforeMove(); + } + + this.previous = this.current ? this.current : this.slides[0]; + this.current = $(element); + + var scrollerOffset = this.scroller.cumulativeOffset(); + var elementOffset = this.current.cumulativeOffset(); + + if (this.scrolling) { + this.scrolling.cancel(); + } + + switch (this.options.effect) { + case 'fade': + this.scrolling = new Effect.Opacity(this.scroller, { + from: 1.0, + to: 0, + duration: this.options.duration, + afterFinish: (function () { + this.scroller.scrollLeft = elementOffset[0] - scrollerOffset[0]; + this.scroller.scrollTop = elementOffset[1] - scrollerOffset[1]; + + new Effect.Opacity(this.scroller, { + from: 0, + to: 1.0, + duration: this.options.duration, + afterFinish: (function () { + if (this.controls) { + this.activateControls(); + } + if (this.options.afterMove && (typeof this.options.afterMove == 'function')) { + this.options.afterMove(); + } + }).bind(this) + }); + } + ).bind(this)}); + break; + case 'scroll': + default: + var transition; + switch (this.options.transition) { + case 'spring': + transition = Effect.Transitions.spring; + break; + case 'sinoidal': + default: + transition = Effect.Transitions.sinoidal; + break; + } + + this.scrolling = new Effect.SmoothScroll(this.scroller, { + duration: this.options.duration, + x: (elementOffset[0] - scrollerOffset[0]), + y: (elementOffset[1] - scrollerOffset[1]), + transition: transition, + afterFinish: (function () { + + if (this.controls) { + this.activateControls(); + } + if (this.options.afterMove && (typeof this.options.afterMove == 'function')) { + this.options.afterMove(); + } + this.scrolling = false; + }).bind(this)}); + break; + } + + return false; + } + }, + + prev: function () { + if (this.current) { + var currentIndex = this.current._index; + var prevIndex = (currentIndex == 0) ? (this.options.circular ? this.slides.length - 1 : 0) : currentIndex - 1; + } else { + var prevIndex = (this.options.circular ? this.slides.length - 1 : 0); + } + + if (prevIndex == (this.slides.length - 1) && this.options.circular && this.options.effect != 'fade') { + this.scroller.scrollLeft = (this.slides.length - 1) * this.slides.first().getWidth(); + this.scroller.scrollTop = (this.slides.length - 1) * this.slides.first().getHeight(); + prevIndex = this.slides.length - 2; + } + + this.moveTo(this.slides[prevIndex]); + }, + + next: function () { + if (this.current) { + var currentIndex = this.current._index; + var nextIndex = (this.slides.length - 1 == currentIndex) ? (this.options.circular ? 0 : currentIndex) : currentIndex + 1; + } else { + var nextIndex = 1; + } + + if (nextIndex == 0 && this.options.circular && this.options.effect != 'fade') { + this.scroller.scrollLeft = 0; + this.scroller.scrollTop = 0; + nextIndex = 1; + } + + if (nextIndex > this.slides.length - (this.options.visibleSlides + 1)) { + nextIndex = this.slides.length - this.options.visibleSlides; + } + + this.moveTo(this.slides[nextIndex]); + }, + + first: function () { + this.moveTo(this.slides[0]); + }, + + last: function () { + this.moveTo(this.slides[this.slides.length - 1]); + }, + + toggle: function () { + if (this.previous) { + this.moveTo(this.slides[this.previous._index]); + } else { + return false; + } + }, + + stop: function () { + if (this.timer) { + clearTimeout(this.timer); + } + }, + + start: function () { + this.periodicallyUpdate(); + }, + + pause: function (event) { + this.stop(); + this.activateControls(); + this.scroller.addClassName('test-over') + }, + + resume: function (event) { + if (event) { + var related = event.relatedTarget || event.toElement; + if (!related || (!this.slides.include(related) && !this.slides.any(function (slide) { return related.descendantOf(slide); }))) { + this.start(); + this.scroller.removeClassName('test-over') + } + } else { + this.start(); + } + }, + + periodicallyUpdate: function () { + if (this.timer != null) { + clearTimeout(this.timer); + this.next(); + } + this.timer = setTimeout(this.periodicallyUpdate.bind(this), this.options.frequency * 1000); + }, + + wheel: function (event) { + /* + event.cancelBubble = true; + event.stop(); + + var delta = 0; + if (!event) { + event = window.event; + } + if (event.wheelDelta) { + delta = event.wheelDelta / 120; + } else if (event.detail) { + delta = -event.detail / 3; + } + + if (!this.scrolling) { + this.deactivateControls(); + if (delta > 0) { + this.prev(); + } else { + this.next(); + } + } + + return Math.round(delta); //Safari Round +*/ + }, + deactivateControls: function () { + this.controls.invoke('addClassName', this.options.disabledClassName); + }, + + activateControls: function () { + this.controls.invoke('removeClassName', this.options.disabledClassName); + } +}); + + +Effect.SmoothScroll = Class.create(); +Object.extend(Object.extend(Effect.SmoothScroll.prototype, Effect.Base.prototype), { + initialize: function (element) { + this.element = $(element); + var options = Object.extend({ x: 0, y: 0, mode: 'absolute' } , arguments[1] || {}); + this.start(options); + }, + + setup: function () { + if (this.options.continuous && !this.element._ext) { + this.element.cleanWhitespace(); + this.element._ext = true; + this.element.appendChild(this.element.firstChild); + } + + this.originalLeft = this.element.scrollLeft; + this.originalTop = this.element.scrollTop; + + if (this.options.mode == 'absolute') { + this.options.x -= this.originalLeft; + this.options.y -= this.originalTop; + } + }, + + update: function (position) { + this.element.scrollLeft = this.options.x * position + this.originalLeft; + this.element.scrollTop = this.options.y * position + this.originalTop; + } +}); + +var FSfader = Class.create({ + initialize: function(wrapper,fader,items,options){ + this.wrapper = $(wrapper); + this.fader = $(fader); + this.items = $$(items); + + this.options = Object.extend({ + layout: 'vertical', + itemstyle: 'top', + toShow: 4, + jumperClass: 'jump', + transition: Effect.Transitions.EaseTo + }, arguments[3] || {}); + + this.controls = $$( '#'+wrapper + ' a.'+ this.options.jumperClass); + this.controls.invoke('observe', 'click', this.click.bind(this)); + + this.current = 0; + this.p = new Effect.Parallel([]); + if (!this.options.itemWidth) { this.options.itemWidth = this.items[0].getWidth(); } + + this.space = Math.round((this.fader.getWidth() - this.options.itemWidth*this.options.toShow)/(this.options.toShow+1)); + + var a=0, b=0; + this.arrGroup = new Array; + + this.items.each(function(item,i){ + item.hide(); + + if (a >= this.options.toShow) { + a=0; + b++; + } + + if (typeof this.arrGroup[b] == 'undefined') this.arrGroup[b] = new Array; + this.arrGroup[b].push(item); + a++; + }.bind(this)); + this.showGroup(this.arrGroup[0]); + }, + + showGroup: function(group) { + group.each(function(item,i){ + item.setStyle({"left": (this.options.itemWidth*i + this.space*(i+1)) + "px"}); + }.bind(this)); + new Effect.multiple(group,Effect.Appear,{ speed: 0.1, duration: 0.4}); + + }, + + hideGroup: function(group) { + this.p.cancel(); + group.each(function(item,i){ + var eff = new Effect.Fade(item, {duration: 0.3, from: 1, to: 0, delay: 0.1*i, sync: true}); + this.p.effects.push(eff); + }.bind(this)); + this.p.start({ + afterFinish: function () { + this.showGroup(this.arrGroup[this.toShow]); + this.current=this.toShow; + }.bind(this) + }); + }, + + + next: function() { + if (!this.toShow || this.toShow != this.current+1) { + if (this.current != this.arrGroup.length-1 ) { + this.toShow = this.current + 1; + } else { + this.toShow = 0; + } + this.hideGroup(this.arrGroup[this.current]) + } + }, + + prev: function() { + if (!this.toShow || this.toShow != this.current-1) { + if (this.current != 0 ) { + this.toShow = this.current - 1; + } else { + this.toShow = this.arrGroup.length-1; + } + this.hideGroup(this.arrGroup[this.current]) + } + }, + + click: function (event) { + event.stop(); + var element = event.findElement('a'); + if (!this.running) { + eval("this." + element.rel + "()"); + } + } +});