chocolate.js
Version:
High-customizable gallery
1 lines • 14.4 kB
JavaScript
"document"in self&&!("classList"in document.createElement("_"))&&!function(a){"use strict";if("Element"in a){var b="classList",c="prototype",d=a.Element[c],e=Object,f=String[c].trim||function(){return this.replace(/^\s+|\s+$/g,"")},g=Array[c].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1},h=function(a,b){this.name=a,this.code=DOMException[a],this.message=b},i=function(a,b){if(""===b)throw new h("SYNTAX_ERR","An invalid or illegal string was specified");if(/\s/.test(b))throw new h("INVALID_CHARACTER_ERR","String contains an invalid character");return g.call(a,b)},j=function(a){for(var b=f.call(a.getAttribute("class")||""),c=b?b.split(/\s+/):[],d=0,e=c.length;e>d;d++)this.push(c[d]);this._updateClassName=function(){a.setAttribute("class",this.toString())}},k=j[c]=[],l=function(){return new j(this)};if(h[c]=Error[c],k.item=function(a){return this[a]||null},k.contains=function(a){return a+="",-1!==i(this,a)},k.add=function(){var a,b=arguments,c=0,d=b.length,e=!1;do a=b[c]+"",-1===i(this,a)&&(this.push(a),e=!0);while(++c<d);e&&this._updateClassName()},k.remove=function(){var a,b=arguments,c=0,d=b.length,e=!1;do{a=b[c]+"";var f=i(this,a);-1!==f&&(this.splice(f,1),e=!0)}while(++c<d);e&&this._updateClassName()},k.toggle=function(a,b){a+="";var c=this.contains(a),d=c?b!==!0&&"remove":b!==!1&&"add";return d&&this[d](a),!c},k.toString=function(){return this.join(" ")},e.defineProperty){var m={get:l,enumerable:!0,configurable:!0};try{e.defineProperty(d,b,m)}catch(n){-2146823252===n.number&&(m.enumerable=!1,e.defineProperty(d,b,m))}}else e[c].__defineGetter__&&d.__defineGetter__(b,l)}}(self),function(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,$,_,ab,bb,cb,db,eb,fb,gb={thumbnails:!0,history:!0,repeat:!1,actions:{overlay:!1,leftside:"prev",container:"next",rightside:"close"}},hb={"image-hover":'<span class="choco-item-hover" data-pid="{{cid}}"></span>',overlay:'<div class="choco-overlay"><div class="choco-slider"><div class="choco-inline-hack"></div></div><div class="choco-leftside choco-unselect"></div><div class="choco-rightside choco-unselect"></div>{{thumbnails}}</div>',slide:'<div class="choco-slide"><div class="choco-slide-container"><span class="choco-slide-title choco-empty">{{title}}</span><div class="choco-spinner"><img src="http://chocolatejs.ru/dist/default/images/loader.png" width="30" height="30" alt="" class="choco-spinner-cssanimation"><img src="http://chocolatejs.ru/dist/default/images/loader.gif" width="32" height="32" alt="" class="choco-spinner-gifanimation"></div><img class="choco-slide-image" src="" title="{{title}}" alt="{{title}}"></div></div>',thumbnails:'<ul class="choco-thumbnails choco-unselect"></ul><div class="choco-thumbnails-toggle choco-unselect"></div>',"thumbnails-item":'<li class="choco-thumbnail" data-cid="{{cid}}" style="background-image:url(\'{{thumb}}\')"></li>'},ib={}.hasOwnProperty,jb=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};if(!gb||!hb)throw new Error("You don't have defaultOptions or templates variables");i="choco-",k=i+"body",m=i+"error",l=i+"empty",n=i+"hide",o=i+"hover",p=i+"item",q=i+"loading",s=i+"selected",t=i+"show",u=i+"slide-title",r=i+"no-thumbnails",j=i+"animated",A=["next","prev","close"],z={},K=!1,M=!1,L=!!a.addEventListener,P=!0,J=[],S=null,Z=T=y=function(){},W={set:y,get:y},N=function(a,b){var c,d;for(c in b)ib.call(b,c)&&(d=b[c],a[c]=d instanceof Object?N(a[c],d):d);return a},O=function(a,b){return a.replace(/\{\{([^{}]+)\}\}/g,function(a,c){return b.hasOwnProperty(c)&&null!=b[c]?""+b[c]:""})},G=function(a,b){return b?a.querySelector(b):a},f=function(a,b,c,d){var e;e=G(a,d),e&&e.addEventListener(b,c,!1)},w=function(a,b,c,d){var e;return e=G(a,c),e&&e.classList?e.classList[d](b):!1},e=function(a,b,c){return w(a,b,c,"add")},U=function(a,b,c){return w(a,b,c,"remove")},bb=function(a,b,c){return w(a,b,c,"toggle")},I=function(a,b,c){return w(a,b,c,"contains")},B=function(a,b){return a.getAttribute(b)},F=function(b){var c;return c=a.getComputedStyle(b),function(a){return c.getPropertyValue(a)}},X=function(a,b){var c,d,e;e=[];for(c in b)ib.call(b,c)&&(d=b[c],e.push(a.style[_(c)]=d));return e},_=function(a){return a.replace(/-([a-z])/g,function(a){return a[1].toUpperCase()})},R=function(a){return a.offsetWidth},Q=function(a){return a.offsetHeight},g=function(a,b){return a.insertAdjacentHTML("beforeend",b),a.lastElementChild},$=function(a){a.stopPropagation(),a.preventDefault()},ab=function(a){return parseInt(a,10)||0},Y=function(a,b,c){var d;return b>c&&(d=[c,b],b=d[0],c=d[1]),b>a&&(a=b),a>c&&(a=c),a},V=function(a,b,c,d){var e;return e=a/b,a>c&&(a=c,b=c/e),b>d&&(a=d*e,b=d),[ab(a),ab(b)]},C=function(){var c,d,e,f,g;if(!P)return z;if(z={w:a.innerWidth||b.documentElement.clientWidth,h:a.innerHeight||b.documentElement.clientHeight},K){if(e=G(S.slider,"."+i+"slide"),!e)return z;P=!1,f=F(e),d=ab(e.offsetWidth),c=ab(f("height"))-ab(f("padding-top"))-ab(f("padding-bottom")),g=d-ab(f("padding-left"))-ab(f("padding-right")),z.shift=-1*d,z.s={w:g,h:c}}return z},fb=function(){var a,c,d,e,f,g,h,i;if(f=!1,a=!1,c=b.createElement("div"),c.style.transform&&(f="transform"),!f)for(i=["Webkit","Moz","O","ms"],g=0,h=i.length;h>g;g++)if(d=i[g],e=""+d+"Transform",void 0!==c.style[e]){f=e;break}return f?(c.style[f]="translate3d(1px,0,0)",a=F(c)(f),function(b,c){return c=a?"translate3d("+c+"px,0,0)":"translateX("+c+"px)",b.style[f]=c}):y}(),x=function(){var a,c,d,f,g,h,i,j;if(a="cssanimations",d=b.querySelector("html"),I(d,a))return!0;for(h=!1,c=b.createElement("div"),c.style.animationName&&(h=!0),g=["Webkit","Moz","O","ms"],i=0,j=g.length;j>i;i++)if(f=g[i],void 0!==c.style[f+"AnimationName"]){h=!0;break}return h===!0&&e(d,a),h}(),d=function(){function a(a){this.repeat=!!a,this.images={},this.counter=0}return a.prototype.add=function(a){var b,c;return a.orig?(b=this.counter++,c=a.orig.split("/"),a.hashbang=c[c.length-1],a.thumb||(a.thumb=a.orig),this.images[b]=N({cid:b,name:"",thumb:"",hashbang:"",orig:"",w:null,h:null},a),this.images[b]):!1},a.prototype.get=function(a){return this.images[a]},a.prototype.next=function(a){var b;return b=a.cid+1,this.repeat&&!this.images[b]&&(b=0),this.images[b]},a.prototype.prev=function(a){var b;return b=a.cid-1,this.repeat&&0>b&&(b=this.length()-1),this.images[b]},a.prototype.length=function(){return Object.keys(this.images).length},a.prototype.search=function(a){var b,c,d;d=this.images;for(c in d)if(ib.call(d,c)&&(b=d[c],"#"+b.hashbang===a))return b;return!1},a}(),a.sessionStorage&&(W=function(){var b;return b=i+"thumbnails",{set:function(c){a.sessionStorage.setItem(b,+c)},get:function(){return a.sessionStorage.getItem(b)}}}()),a.history&&a.history.pushState&&(D=function(){var b,c,d,e,f;if(c=a.location.hash,!c&&K)return void S.close();if(K&&(d=S.storage.search(c)))return void S.select(d,!1);for(e=0,f=J.length;f>e;e++)if(b=J[e],d=b.storage.search(c))return K&&S.close(),void b.open(d,!1)},"onhashchange"in a&&f(a,"hashchange",function(){D()}),f(b,"DOMContentLoaded",function(){D()}),T=function(b,c){b=b||"",c=c||"",a.history.pushState(null,b,"#"+c)}),v=i+"touch",db=function(){var a;return L?(a=b.createElement("div"),a.setAttribute("ongesturestart","return"),"function"==typeof a.ongesturestart?2:(a.setAttribute("ontouchstart","return"),"function"==typeof a.ontouchstart?1:0)):0}(),eb=function(){var a,c,d,e,f,g;if(a=b.createElement("div"),e="transition",void 0!==a.style[e])return!0;for(e=e.replace(/^./,e[0].toUpperCase()),d=["Webkit","Moz","O","ms"],f=0,g=d.length;g>f;f++)if(c=d[f],void 0!==a.style[c+e])return c.toLowerCase()+e;return!1}(),0!==db&&(M=!0,E=function(a){var b,c,d;return c=F(a),b=/matrix\(([0-9-\.,\s]*)\)/,d=c("transform")||c("-webkit-transform")||c("-ms-transform")||"",d=b.test(d)?b.exec(d)[1].split(",")[4].trim()||0:0,ab(d)},cb=function(){var b;return b=.25*a.innerHeight,function(a,c){return c=Math.abs(c),a.x0-a.x>b||a.x-a.x0<b?Math.ceil(c):Math.floor(c)}}(),H=function(a,b){var c,d,e;for(d=0,e=a.length;e>d;d++)if(c=a[d],c.identifier===b)return c;return!1},h=function(a){return{id:a.identifier,x:a.pageX,y:a.pageY}},Z=function(a){var b,c,d,g,i,k,l,m,n,o,p;return C(),i=!1,g=!1,k=-1,m=1,c={},p=function(b){m=b,X(a.overlay,{opacity:b})},d=function(){U(a.overlay,j),g&&(a.close(),p(1))},n=function(a){var b,d,e;if(1===a.changedTouches.length&&(d=h(a.changedTouches.item(0)))){for(b in d)ib.call(d,b)&&(e=d[b],c[b]=e);return c.x0=c.x,c.y0=c.y}},l=function(b){var d,e,f,j,k;k=h(H(b.changedTouches,c.id)),k&&(f=k.x-c.x||0,c.x=k.x,c.y=k.y,d=Math.abs(c.x0-k.x),e=Math.abs(c.y0-k.y),i=d>e,g=!i,j=E(a.slider),i?(p(1),fb(a.slider,j+f)):p(Math.round(100*(1-e/z.h))/100),$(b))},b=function(b){var f,l;l=h(H(b.changedTouches,c.id)),l&&(l.x0=c.x0,l.y0=c.y0,i&&(e(a.slider,j),-1===k&&(k=a.storage.length()-1),f=E(a.slider),f=cb(l,f/z.w),a.select(Y(f,0,k))),g&&(e(a.overlay,j),.7>m?(p(0),eb===!1&&d()):(p(1),g=!1)),c={})},e(a.overlay,v),f(a.slider,"click",function(a){$(a)}),f(a.slider,"hover",function(a){$(a)}),eb!==!1&&(o=eb===!0?"transitionend":eb+"End"),f(a.slider,o,function(){U(a.slider,j)}),f(a.overlay,o,function(){d()}),f(a.overlay,"touchstart",n),f(a.overlay,"touchmove",l),f(a.overlay,"touchend",b),f(a.overlay,"touchcancel",b),f(a.overlay,"touchleave",b)}),c=function(){function c(a,c){var h,j,k,l,m,n,o,p,q,s,t,u;if(null==c&&(c={}),this.options=N(gb,c),this.storage=new d(this.options.repeat),l=this.options.thumbnails&&hb.thumbnails?hb.thumbnails:"",k=hb.overlay.replace("{{thumbnails}}",l),this.overlay=g(b.body,k),this.slider=G(this.overlay,"."+i+"slider"),Z(this),M)this.options.thumbnails=!1;else{for(j=["leftside","rightside"],this.options.thumbnails&&j.push("thumbnails"),m=0,p=j.length;p>m;m++)h=j[m],this[h]=G(this.overlay,"."+i+h);if(this.options.thumbnails)this.thumbnailsToggle=G(this.overlay,"."+i+"thumbnails-toggle"),f(this.thumbnailsToggle,"click",function(a){return function(){a.toggleThumbnails()}}(this));else for(t=["overlay","leftside","rightside"],n=0,q=t.length;q>n;n++)h=t[n],e(this[h],r);for(u=["overlay","leftside","rightside"],o=0,s=u.length;s>o;o++)h=u[o],x(this,h)}a&&this.add(a),J.push(this)}var h,v,x,y,D,E;return c.prototype.close=function(){return D(S,!1),K=!1,S=null,I(this.overlay,t)&&(U(this.overlay,t),U(b.body,k),this.options.thumbnails&&U(this.current.thumbnail,s),this.current=null,T()),this},c.prototype.open=function(a,c){var d;return K?this:(S=this,K=!0,e(this.overlay,t),e(b.body,k),d=W.get(),null!=d&&this.toggleThumbnails(d),this.updateDimensions(),this.select(a,c),setTimeout(function(){return D(S)},0),this)},c.prototype.select=function(a,b){var c,d,f,g;return null==b&&(b=!0),"number"==typeof a&&(a=this.storage.get(a)),a?(C(),fb(this.slider,z.shift*a.cid),this.overlay.style.background=a.bg?a.bg:"",this.options.thumbnails&&(null!=this.current&&U(this.current.thumbnail,s),f=a.thumbnail,e(f,s),d=z.w/2-f.offsetLeft-R(f)/2,d=Y(d,0,z.w-this.dimensions.thumbWidth),fb(this.thumbnails,d)),b&&T(null!=(g=a.title)?g:a.hashbang,a.hashbang),c=I(a.slide,q),c?v(a,function(b){return function(){return b.updateSides(a)}}(this)):this.updateSides(a),this.current=a,!0):!1},c.prototype.next=function(){return this.select(this.storage.next(this.current)),this},c.prototype.prev=function(){return this.select(this.storage.prev(this.current)),this},c.prototype.add=function(a){var b,c,d,e,f;if(!a||0===a.length)return this;for(e=0,f=a.length;f>e;e++)d=a[e],b=null,c="object"==typeof HTMLElement?d instanceof HTMLElement:"object"==typeof d&&1===d.nodeType&&"string"==typeof d.nodeName,c&&(b=d,d={orig:B(b,"data-src")||B(b.parentNode,"href"),title:B(b,"data-title")||B(b,"title")||B(b,"alt")||B(b.parentNode,"title"),thumb:B(b,"src"),bg:B(b,"data-background")}),h(this,d,b);return this},c.prototype.updateDimensions=function(){var a,b,c;this.options.thumbnails&&(this.dimensions={thumbWidth:R(this.thumbnails)}),c=this.storage.images;for(a in c)b=c[a],E(b)},c.prototype.updateSides=function(a){var b;M||(a.size||(a.size=R(G(a.slide,"."+i+"slide-container"))),b=""+(z.w-a.size)/2+"px",X(this.leftside,{width:b}),X(this.rightside,{width:b}))},c.prototype.toggleThumbnails=function(a){var b,c,d,e,f;if(!M){for(c=["leftside","rightside","overlay","thumbnailsToggle"],null!=a?d="1"===a?"remove":"add":(I(this.thumbnails,n)?(d="remove",a=!0):(d="add",a=!1),W.set(a)),w(this.thumbnails,n,null,d),e=0,f=c.length;f>e;e++)b=c[e],w(this[b],r,null,d);y()}},L&&(h=function(a,c,d){var h,j,k,l;c=a.storage.add(c),c&&(a.options.thumbnails&&(l=O(hb["thumbnails-item"],c),c.thumbnail=g(a.thumbnails,l),f(c.thumbnail,"click",function(){a.select(c)})),l=O(hb.slide,c),c.slide=g(a.slider,l),e(c.slide,q),c.img=G(c.slide,"."+i+"slide-image"),h=a.options.actions.container,jb.call(A,h)>=0&&f(c.slide,"click",function(){a[h]()},"."+i+"slide-container"),d&&(k=function(b,c){$(b),a.open(c)},e(d,p),f(d,"click",function(a){k(a,c.cid)}),M||(j=new Image,f(j,"load",function(){var a;return l=O(hb["image-hover"],c),d.insertAdjacentHTML("afterend",l),a=G(b,'[data-pid="'+c.cid+'"]'),X(a,{width:""+R(d)+"px",height:""+Q(d)+"px","margin-top":"-"+Q(d)+"px"}),f(d,"mouseenter",function(){bb(a,o)}),f(d,"mouseleave",function(){bb(a,o)}),f(a,"click",function(a){k(a,c.cid)})}),j.src=c.thumb)))},v=function(a,b){var c;c=new Image,f(c,"load",function(){var d;a.img.src=this.src,a.w=c.width,a.h=c.height,U(a.slide,q),d=G(a.slide,"."+u),null!=d&&""!==d.innerHTML.trim()&&U(d,l),E(a),b(!0)}),f(c,"error",function(){U(a.slide,q),e(a.slide,m),e(a.thumbnail,m),b(!1)}),c.src=a.orig},x=function(a,b){var c,d;c=a.options.actions[b],jb.call(A,c)<0||(d=a[b].classList[0],f(a[b],"click",function(b){I(b.target,d)&&a[c]()}),"close"===c&&(f(a[b],"mouseenter",function(){bb(a.overlay,o,"."+i+"close")}),f(a[b],"mouseleave",function(){bb(a.overlay,o,"."+i+"close")})))},E=function(a){var b;a.w>0&&a.h>0&&(C(),b=V(a.w,a.h,z.s.w,z.s.h),a.img.width=b[0],a.img.height=b[1])},y=function(){P=!0,K&&(D(S,!1),S.updateDimensions(),S.select(S.current),D(S))},f(a,"resize",y),f(a,"orientationchange",y),D=function(a,b){var c;return null==b&&(b=!0),c=b?"add":"remove",a.options.thumbnails&&w(a.thumbnails,j,null,c),w(a.slider,j,null,c)},M||f(a,"keydown",function(a){if(K&&I(S.overlay,t))switch(a.keyCode){case 27:return S.close();case 37:return S.prev();case 39:return S.next()}})),c}(),a.Chocolate=L?c:y}(window,document);