@@ -193,7 +193,10 @@ | |||
"public/css/list.css", | |||
"public/css/tag-it.css", | |||
"public/css/calendar.css", | |||
"public/css/gantt.css" | |||
"public/css/gantt.css", | |||
"public/js/lib/gallery/css/blueimp-gallery.css", | |||
"public/js/lib/gallery/css/blueimp-gallery-indicator.css" | |||
], | |||
"js/list.min.js": [ | |||
"public/js/frappe/ui/listing.html", | |||
@@ -219,6 +222,9 @@ | |||
"public/js/frappe/views/calendar_base.js", | |||
"public/js/frappe/views/calendar.js", | |||
"public/js/frappe/views/ganttview.js", | |||
"public/js/frappe/list/imageview.js", | |||
"public/js/frappe/list/blueimp-gallery.html", | |||
"public/js/frappe/list/image_view_item_row.html", | |||
"public/js/frappe/list/image_view_item_main_head.html" | |||
], | |||
@@ -0,0 +1,9 @@ | |||
<div id="blueimp-gallery" class="blueimp-gallery blueimp-gallery-controls"> | |||
<div class="slides"></div> | |||
<h3 class="title"></h3> | |||
<a class="prev">‹</a> | |||
<a class="next">›</a> | |||
<a class="close">×</a> | |||
<a class="play-pause"></a> | |||
<ol class="indicator"></ol> | |||
</div> |
@@ -0,0 +1,59 @@ | |||
frappe.views.ImageView = Class.extend({ | |||
init: function(opts){ | |||
this.doctype = opts.doctype; | |||
this.docname = opts.docname; | |||
this.container = opts.container; | |||
this.get_images(this.doctype, this.docname); | |||
}, | |||
get_images: function(doctype, docname){ | |||
/* get the list of all the Images associated with doc */ | |||
var me = this; | |||
frappe.call({ | |||
method: "frappe.client.get_list", | |||
args: { | |||
doctype: "File", | |||
fields: [ | |||
"file_name as title", "file_url as href", | |||
"'image/*' as type", "ifnull(thumbnail_url, '') as thumbnail" | |||
], | |||
filters: [ | |||
["File", "attached_to_doctype", "=", this.doctype], | |||
["File", "attached_to_name", "=", this.docname], | |||
["File", "is_folder", "!=", 1] | |||
] | |||
}, | |||
freeze: true, | |||
freeze_message: "Fetching Images ..", | |||
callback: function(r){ | |||
if(!r.message){ | |||
msgprint("No Images found") | |||
} else{ | |||
me.render(r.message); | |||
} | |||
} | |||
}); | |||
}, | |||
render: function(image_list){ | |||
var me = this; | |||
frappe.require(["assets/frappe/js/lib/gallery/js/blueimp-gallery.js", | |||
"assets/frappe/js/lib/gallery/js/blueimp-gallery-indicator.js"], function(){ | |||
var gallery = blueimp.Gallery(image_list, me.get_options()); | |||
}) | |||
}, | |||
get_options: function(){ | |||
/* options for the gallery plugin */ | |||
return { | |||
indicatorContainer: 'ol', | |||
thumbnailIndicators: true, | |||
thumbnailProperty: 'thumbnail', | |||
activeIndicatorClass: 'active', | |||
container: this.container.find(".blueimp-gallery") | |||
} | |||
} | |||
}); |
@@ -315,11 +315,28 @@ frappe.ui.Listing = Class.extend({ | |||
} | |||
} | |||
else{ | |||
while (values.length) { | |||
row = this.add_row(values[0]); | |||
var cols = values.slice(); | |||
while (cols.length) { | |||
row = this.add_row(cols[0]); | |||
$("<div class='row image-view-marker'></div>").appendTo(row) | |||
this.render_image_view_row(row, values.splice(0, 4), this, i); | |||
this.render_image_view_row(row, cols.splice(0, 4), this, i); | |||
} | |||
// remove previous gallery container | |||
this.$w.find(".blueimp-gallery").remove(); | |||
// append gallery div | |||
var gallery = frappe.render_template("blueimp-gallery", {}); | |||
$(gallery).appendTo(this.$w); | |||
var me = this | |||
this.$w.find(".image-field").click(function(event){ | |||
opts = { | |||
doctype: me.doctype, | |||
docname: $(event.target).attr('data-name'), | |||
container: me.$w | |||
}; | |||
new frappe.views.ImageView(opts); | |||
}) | |||
} | |||
}, | |||
update_paging: function(values) { | |||
@@ -0,0 +1,72 @@ | |||
@charset "UTF-8"; | |||
/* | |||
* blueimp Gallery Indicator CSS | |||
* https://github.com/blueimp/Gallery | |||
* | |||
* Copyright 2013, Sebastian Tschan | |||
* https://blueimp.net | |||
* | |||
* Licensed under the MIT license: | |||
* http://www.opensource.org/licenses/MIT | |||
*/ | |||
.blueimp-gallery > .indicator { | |||
position: absolute; | |||
top: auto; | |||
right: 15px; | |||
bottom: 15px; | |||
left: 15px; | |||
margin: 0 40px; | |||
padding: 0; | |||
list-style: none; | |||
text-align: center; | |||
line-height: 10px; | |||
display: none; | |||
} | |||
.blueimp-gallery > .indicator > li { | |||
display: inline-block; | |||
width: 40px; | |||
height: 40px; | |||
margin: 6px 3px 0 3px; | |||
-webkit-box-sizing: content-box; | |||
-moz-box-sizing: content-box; | |||
box-sizing: content-box; | |||
border: 1px solid transparent; | |||
background: #ccc; | |||
background: rgba(255, 255, 255, 0.25) center no-repeat; | |||
border-radius: 5px; | |||
box-shadow: 0 0 2px #000; | |||
opacity: 0.5; | |||
cursor: pointer; | |||
background-size: 40px 40px; | |||
} | |||
.blueimp-gallery > .indicator > li:hover, | |||
.blueimp-gallery > .indicator > .active { | |||
background-color: #fff; | |||
border-color: #fff; | |||
opacity: 1; | |||
} | |||
.blueimp-gallery-controls > .indicator { | |||
display: block; | |||
/* Fix z-index issues (controls behind slide element) on Android: */ | |||
-webkit-transform: translateZ(0); | |||
-moz-transform: translateZ(0); | |||
-ms-transform: translateZ(0); | |||
-o-transform: translateZ(0); | |||
transform: translateZ(0); | |||
} | |||
.blueimp-gallery-single > .indicator { | |||
display: none; | |||
} | |||
.blueimp-gallery > .indicator { | |||
-webkit-user-select: none; | |||
-khtml-user-select: none; | |||
-moz-user-select: none; | |||
-ms-user-select: none; | |||
user-select: none; | |||
} | |||
/* IE7 fixes */ | |||
*+html .blueimp-gallery > .indicator > li { | |||
display: inline; | |||
} |
@@ -0,0 +1,87 @@ | |||
@charset "UTF-8"; | |||
/* | |||
* blueimp Gallery Video Factory CSS | |||
* https://github.com/blueimp/Gallery | |||
* | |||
* Copyright 2013, Sebastian Tschan | |||
* https://blueimp.net | |||
* | |||
* Licensed under the MIT license: | |||
* http://www.opensource.org/licenses/MIT | |||
*/ | |||
.blueimp-gallery > .slides > .slide > .video-content > img { | |||
position: absolute; | |||
top: 0; | |||
right: 0; | |||
bottom: 0; | |||
left: 0; | |||
margin: auto; | |||
width: auto; | |||
height: auto; | |||
max-width: 100%; | |||
max-height: 100%; | |||
/* Prevent artifacts in Mozilla Firefox: */ | |||
-moz-backface-visibility: hidden; | |||
} | |||
.blueimp-gallery > .slides > .slide > .video-content > video { | |||
position: absolute; | |||
top: 0; | |||
left: 0; | |||
width: 100%; | |||
height: 100%; | |||
} | |||
.blueimp-gallery > .slides > .slide > .video-content > iframe { | |||
position: absolute; | |||
top: 100%; | |||
left: 0; | |||
width: 100%; | |||
height: 100%; | |||
border: none; | |||
} | |||
.blueimp-gallery > .slides > .slide > .video-playing > iframe { | |||
top: 0; | |||
} | |||
.blueimp-gallery > .slides > .slide > .video-content > a { | |||
position: absolute; | |||
top: 50%; | |||
right: 0; | |||
left: 0; | |||
margin: -64px auto 0; | |||
width: 128px; | |||
height: 128px; | |||
background: url(../img/video-play.png) center no-repeat; | |||
opacity: 0.8; | |||
cursor: pointer; | |||
} | |||
.blueimp-gallery > .slides > .slide > .video-content > a:hover { | |||
opacity: 1; | |||
} | |||
.blueimp-gallery > .slides > .slide > .video-playing > a, | |||
.blueimp-gallery > .slides > .slide > .video-playing > img { | |||
display: none; | |||
} | |||
.blueimp-gallery > .slides > .slide > .video-content > video { | |||
display: none; | |||
} | |||
.blueimp-gallery > .slides > .slide > .video-playing > video { | |||
display: block; | |||
} | |||
.blueimp-gallery > .slides > .slide > .video-loading > a { | |||
background: url(../img/loading.gif) center no-repeat; | |||
background-size: 64px 64px; | |||
} | |||
/* Replace PNGs with SVGs for capable browsers (excluding IE<9) */ | |||
body:last-child .blueimp-gallery > .slides > .slide > .video-content:not(.video-loading) > a { | |||
background-image: url(../img/video-play.svg); | |||
} | |||
/* IE7 fixes */ | |||
*+html .blueimp-gallery > .slides > .slide > .video-content { | |||
height: 100%; | |||
} | |||
*+html .blueimp-gallery > .slides > .slide > .video-content > a { | |||
left: 50%; | |||
margin-left: -64px; | |||
} |
@@ -0,0 +1,226 @@ | |||
@charset "UTF-8"; | |||
/* | |||
* blueimp Gallery CSS | |||
* https://github.com/blueimp/Gallery | |||
* | |||
* Copyright 2013, Sebastian Tschan | |||
* https://blueimp.net | |||
* | |||
* Licensed under the MIT license: | |||
* http://www.opensource.org/licenses/MIT | |||
*/ | |||
.blueimp-gallery, | |||
.blueimp-gallery > .slides > .slide > .slide-content { | |||
position: absolute; | |||
top: 0; | |||
right: 0; | |||
bottom: 0; | |||
left: 0; | |||
/* Prevent artifacts in Mozilla Firefox: */ | |||
-moz-backface-visibility: hidden; | |||
} | |||
.blueimp-gallery > .slides > .slide > .slide-content { | |||
margin: auto; | |||
width: auto; | |||
height: auto; | |||
max-width: 100%; | |||
max-height: 100%; | |||
opacity: 1; | |||
} | |||
.blueimp-gallery { | |||
position: fixed; | |||
z-index: 999999; | |||
overflow: hidden; | |||
background: #000; | |||
background: rgba(0, 0, 0, 0.9); | |||
opacity: 0; | |||
display: none; | |||
direction: ltr; | |||
-ms-touch-action: none; | |||
touch-action: none; | |||
} | |||
.blueimp-gallery-carousel { | |||
position: relative; | |||
z-index: auto; | |||
margin: 1em auto; | |||
/* Set the carousel width/height ratio to 16/9: */ | |||
padding-bottom: 56.25%; | |||
box-shadow: 0 0 10px #000; | |||
-ms-touch-action: pan-y; | |||
touch-action: pan-y; | |||
} | |||
.blueimp-gallery-display { | |||
display: block; | |||
opacity: 1; | |||
} | |||
.blueimp-gallery > .slides { | |||
position: relative; | |||
height: 100%; | |||
overflow: hidden; | |||
} | |||
.blueimp-gallery-carousel > .slides { | |||
position: absolute; | |||
} | |||
.blueimp-gallery > .slides > .slide { | |||
position: relative; | |||
float: left; | |||
height: 100%; | |||
text-align: center; | |||
-webkit-transition-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1.000); | |||
-moz-transition-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1.000); | |||
-ms-transition-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1.000); | |||
-o-transition-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1.000); | |||
transition-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1.000); | |||
} | |||
.blueimp-gallery, | |||
.blueimp-gallery > .slides > .slide > .slide-content { | |||
-webkit-transition: opacity 0.2s linear; | |||
-moz-transition: opacity 0.2s linear; | |||
-ms-transition: opacity 0.2s linear; | |||
-o-transition: opacity 0.2s linear; | |||
transition: opacity 0.2s linear; | |||
} | |||
.blueimp-gallery > .slides > .slide-loading { | |||
background: url(../img/loading.gif) center no-repeat; | |||
background-size: 64px 64px; | |||
} | |||
.blueimp-gallery > .slides > .slide-loading > .slide-content { | |||
opacity: 0; | |||
} | |||
.blueimp-gallery > .slides > .slide-error { | |||
background: url(../img/error.png) center no-repeat; | |||
} | |||
.blueimp-gallery > .slides > .slide-error > .slide-content { | |||
display: none; | |||
} | |||
.blueimp-gallery > .prev, | |||
.blueimp-gallery > .next { | |||
position: absolute; | |||
top: 50%; | |||
left: 15px; | |||
width: 40px; | |||
height: 40px; | |||
margin-top: -23px; | |||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; | |||
font-size: 60px; | |||
font-weight: 100; | |||
line-height: 30px; | |||
color: #fff; | |||
text-decoration: none; | |||
text-shadow: 0 0 2px #000; | |||
text-align: center; | |||
background: #222; | |||
background: rgba(0, 0, 0, 0.5); | |||
-webkit-box-sizing: content-box; | |||
-moz-box-sizing: content-box; | |||
box-sizing: content-box; | |||
border: 3px solid #fff; | |||
-webkit-border-radius: 23px; | |||
-moz-border-radius: 23px; | |||
border-radius: 23px; | |||
opacity: 0.5; | |||
cursor: pointer; | |||
display: none; | |||
} | |||
.blueimp-gallery > .next { | |||
left: auto; | |||
right: 15px; | |||
} | |||
.blueimp-gallery > .close, | |||
.blueimp-gallery > .title { | |||
position: absolute; | |||
top: 15px; | |||
left: 15px; | |||
margin: 0 40px 0 0; | |||
font-size: 20px; | |||
line-height: 30px; | |||
color: #fff; | |||
text-shadow: 0 0 2px #000; | |||
opacity: 0.8; | |||
display: none; | |||
} | |||
.blueimp-gallery > .close { | |||
padding: 15px; | |||
right: 15px; | |||
left: auto; | |||
margin: -15px; | |||
font-size: 30px; | |||
text-decoration: none; | |||
cursor: pointer; | |||
} | |||
.blueimp-gallery > .play-pause { | |||
position: absolute; | |||
right: 15px; | |||
bottom: 15px; | |||
width: 15px; | |||
height: 15px; | |||
background: url(../img/play-pause.png) 0 0 no-repeat; | |||
cursor: pointer; | |||
opacity: 0.5; | |||
display: none; | |||
} | |||
.blueimp-gallery-playing > .play-pause { | |||
background-position: -15px 0; | |||
} | |||
.blueimp-gallery > .prev:hover, | |||
.blueimp-gallery > .next:hover, | |||
.blueimp-gallery > .close:hover, | |||
.blueimp-gallery > .title:hover, | |||
.blueimp-gallery > .play-pause:hover { | |||
color: #fff; | |||
opacity: 1; | |||
} | |||
.blueimp-gallery-controls > .prev, | |||
.blueimp-gallery-controls > .next, | |||
.blueimp-gallery-controls > .close, | |||
.blueimp-gallery-controls > .title, | |||
.blueimp-gallery-controls > .play-pause { | |||
display: block; | |||
/* Fix z-index issues (controls behind slide element) on Android: */ | |||
-webkit-transform: translateZ(0); | |||
-moz-transform: translateZ(0); | |||
-ms-transform: translateZ(0); | |||
-o-transform: translateZ(0); | |||
transform: translateZ(0); | |||
} | |||
.blueimp-gallery-single > .prev, | |||
.blueimp-gallery-left > .prev, | |||
.blueimp-gallery-single > .next, | |||
.blueimp-gallery-right > .next, | |||
.blueimp-gallery-single > .play-pause { | |||
display: none; | |||
} | |||
.blueimp-gallery > .slides > .slide > .slide-content, | |||
.blueimp-gallery > .prev, | |||
.blueimp-gallery > .next, | |||
.blueimp-gallery > .close, | |||
.blueimp-gallery > .play-pause { | |||
-webkit-user-select: none; | |||
-khtml-user-select: none; | |||
-moz-user-select: none; | |||
-ms-user-select: none; | |||
user-select: none; | |||
} | |||
/* Replace PNGs with SVGs for capable browsers (excluding IE<9) */ | |||
body:last-child .blueimp-gallery > .slides > .slide-error { | |||
background-image: url(../img/error.svg); | |||
} | |||
body:last-child .blueimp-gallery > .play-pause { | |||
width: 20px; | |||
height: 20px; | |||
background-size: 40px 20px; | |||
background-image: url(../img/play-pause.svg); | |||
} | |||
body:last-child .blueimp-gallery-playing > .play-pause { | |||
background-position: -20px 0; | |||
} | |||
/* IE7 fixes */ | |||
*+html .blueimp-gallery > .slides > .slide { | |||
min-height: 300px; | |||
} | |||
*+html .blueimp-gallery > .slides > .slide > .slide-content { | |||
position: relative; | |||
} |
@@ -0,0 +1,3 @@ | |||
@import (inline) 'blueimp-gallery.css'; | |||
@import (inline) 'blueimp-gallery-indicator.css'; | |||
@import (inline) 'blueimp-gallery-video.css'; |
@@ -0,0 +1 @@ | |||
{"version":3,"sources":["blueimp-gallery.css","blueimp-gallery-indicator.css","blueimp-gallery-video.css"],"names":[],"mappings":"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"} |
@@ -0,0 +1,51 @@ | |||
/* | |||
* blueimp Gallery Demo CSS | |||
* https://github.com/blueimp/Gallery | |||
* | |||
* Copyright 2013, Sebastian Tschan | |||
* https://blueimp.net | |||
* | |||
* Licensed under the MIT license: | |||
* http://www.opensource.org/licenses/MIT | |||
*/ | |||
body { | |||
max-width: 750px; | |||
margin: 0 auto; | |||
padding: 1em; | |||
font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, sans-serif; | |||
font-size: 1em; | |||
line-height: 1.4em; | |||
background: #222; | |||
color: #fff; | |||
-webkit-text-size-adjust: 100%; | |||
-ms-text-size-adjust: 100%; | |||
} | |||
a { | |||
color: orange; | |||
text-decoration: none; | |||
} | |||
img { | |||
border: 0; | |||
vertical-align: middle; | |||
} | |||
h1 { | |||
line-height: 1em; | |||
} | |||
h2, | |||
.links { | |||
text-align: center; | |||
} | |||
@media (min-width: 481px) { | |||
.navigation { | |||
list-style: none; | |||
padding: 0; | |||
} | |||
.navigation li { | |||
display: inline-block; | |||
} | |||
.navigation li:not(:first-child):before { | |||
content: '| '; | |||
} | |||
} |
@@ -0,0 +1,5 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="64" height="64"> | |||
<circle cx="32" cy="32" r="25" stroke="red" stroke-width="7" fill="black" fill-opacity="0.2"/> | |||
<rect x="28" y="7" width="8" height="50" fill="red" transform="rotate(45, 32, 32)"/> | |||
</svg> |
@@ -0,0 +1,6 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="30" height="15"> | |||
<polygon points="2,1 2,14 13,7" stroke="black" stroke-width="1" fill="white"/> | |||
<rect x="17" y="2" width="4" height="11" stroke="black" stroke-width="1" fill="white"/> | |||
<rect x="24" y="2" width="4" height="11" stroke="black" stroke-width="1" fill="white"/> | |||
</svg> |
@@ -0,0 +1,5 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="64" height="64"> | |||
<circle cx="32" cy="32" r="25" stroke="white" stroke-width="7" fill="black" fill-opacity="0.2"/> | |||
<polygon points="26,22 26,42 43,32" fill="white"/> | |||
</svg> |
@@ -0,0 +1,89 @@ | |||
/* | |||
* blueimp Gallery Fullscreen JS | |||
* https://github.com/blueimp/Gallery | |||
* | |||
* Copyright 2013, Sebastian Tschan | |||
* https://blueimp.net | |||
* | |||
* Licensed under the MIT license: | |||
* http://www.opensource.org/licenses/MIT | |||
*/ | |||
/* global define, window, document */ | |||
;(function (factory) { | |||
'use strict' | |||
if (typeof define === 'function' && define.amd) { | |||
// Register as an anonymous AMD module: | |||
define([ | |||
'./blueimp-helper', | |||
'./blueimp-gallery' | |||
], factory) | |||
} else { | |||
// Browser globals: | |||
factory( | |||
window.blueimp.helper || window.jQuery, | |||
window.blueimp.Gallery | |||
) | |||
} | |||
}(function ($, Gallery) { | |||
'use strict' | |||
$.extend(Gallery.prototype.options, { | |||
// Defines if the gallery should open in fullscreen mode: | |||
fullScreen: false | |||
}) | |||
var initialize = Gallery.prototype.initialize | |||
var close = Gallery.prototype.close | |||
$.extend(Gallery.prototype, { | |||
getFullScreenElement: function () { | |||
return document.fullscreenElement || | |||
document.webkitFullscreenElement || | |||
document.mozFullScreenElement || | |||
document.msFullscreenElement | |||
}, | |||
requestFullScreen: function (element) { | |||
if (element.requestFullscreen) { | |||
element.requestFullscreen() | |||
} else if (element.webkitRequestFullscreen) { | |||
element.webkitRequestFullscreen() | |||
} else if (element.mozRequestFullScreen) { | |||
element.mozRequestFullScreen() | |||
} else if (element.msRequestFullscreen) { | |||
element.msRequestFullscreen() | |||
} | |||
}, | |||
exitFullScreen: function () { | |||
if (document.exitFullscreen) { | |||
document.exitFullscreen() | |||
} else if (document.webkitCancelFullScreen) { | |||
document.webkitCancelFullScreen() | |||
} else if (document.mozCancelFullScreen) { | |||
document.mozCancelFullScreen() | |||
} else if (document.msExitFullscreen) { | |||
document.msExitFullscreen() | |||
} | |||
}, | |||
initialize: function () { | |||
initialize.call(this) | |||
if (this.options.fullScreen && !this.getFullScreenElement()) { | |||
this.requestFullScreen(this.container[0]) | |||
} | |||
}, | |||
close: function () { | |||
if (this.getFullScreenElement() === this.container[0]) { | |||
this.exitFullScreen() | |||
} | |||
close.call(this) | |||
} | |||
}) | |||
return Gallery | |||
})) |
@@ -0,0 +1,155 @@ | |||
/* | |||
* blueimp Gallery Indicator JS | |||
* https://github.com/blueimp/Gallery | |||
* | |||
* Copyright 2013, Sebastian Tschan | |||
* https://blueimp.net | |||
* | |||
* Licensed under the MIT license: | |||
* http://www.opensource.org/licenses/MIT | |||
*/ | |||
/* global define, window, document */ | |||
;(function (factory) { | |||
'use strict' | |||
if (typeof define === 'function' && define.amd) { | |||
// Register as an anonymous AMD module: | |||
define([ | |||
'./blueimp-helper', | |||
'./blueimp-gallery' | |||
], factory) | |||
} else { | |||
// Browser globals: | |||
factory( | |||
window.blueimp.helper || window.jQuery, | |||
window.blueimp.Gallery | |||
) | |||
} | |||
}(function ($, Gallery) { | |||
'use strict' | |||
$.extend(Gallery.prototype.options, { | |||
// The tag name, Id, element or querySelector of the indicator container: | |||
indicatorContainer: 'ol', | |||
// The class for the active indicator: | |||
activeIndicatorClass: 'active', | |||
// The list object property (or data attribute) with the thumbnail URL, | |||
// used as alternative to a thumbnail child element: | |||
thumbnailProperty: 'thumbnail', | |||
// Defines if the gallery indicators should display a thumbnail: | |||
thumbnailIndicators: true | |||
}) | |||
var initSlides = Gallery.prototype.initSlides | |||
var addSlide = Gallery.prototype.addSlide | |||
var resetSlides = Gallery.prototype.resetSlides | |||
var handleClick = Gallery.prototype.handleClick | |||
var handleSlide = Gallery.prototype.handleSlide | |||
var handleClose = Gallery.prototype.handleClose | |||
$.extend(Gallery.prototype, { | |||
createIndicator: function (obj) { | |||
var indicator = this.indicatorPrototype.cloneNode(false) | |||
var title = this.getItemProperty(obj, this.options.titleProperty) | |||
var thumbnailProperty = this.options.thumbnailProperty | |||
var thumbnailUrl | |||
var thumbnail | |||
if (this.options.thumbnailIndicators) { | |||
if (thumbnailProperty) { | |||
thumbnailUrl = this.getItemProperty(obj, thumbnailProperty) | |||
} | |||
if (thumbnailUrl === undefined) { | |||
thumbnail = obj.getElementsByTagName && $(obj).find('img')[0] | |||
if (thumbnail) { | |||
thumbnailUrl = thumbnail.src | |||
} | |||
} | |||
if (thumbnailUrl) { | |||
indicator.style.backgroundImage = 'url("' + thumbnailUrl + '")' | |||
} | |||
} | |||
if (title) { | |||
indicator.title = title | |||
} | |||
return indicator | |||
}, | |||
addIndicator: function (index) { | |||
if (this.indicatorContainer.length) { | |||
var indicator = this.createIndicator(this.list[index]) | |||
indicator.setAttribute('data-index', index) | |||
this.indicatorContainer[0].appendChild(indicator) | |||
this.indicators.push(indicator) | |||
} | |||
}, | |||
setActiveIndicator: function (index) { | |||
if (this.indicators) { | |||
if (this.activeIndicator) { | |||
this.activeIndicator | |||
.removeClass(this.options.activeIndicatorClass) | |||
} | |||
this.activeIndicator = $(this.indicators[index]) | |||
this.activeIndicator | |||
.addClass(this.options.activeIndicatorClass) | |||
} | |||
}, | |||
initSlides: function (reload) { | |||
if (!reload) { | |||
this.indicatorContainer = this.container.find( | |||
this.options.indicatorContainer | |||
) | |||
if (this.indicatorContainer.length) { | |||
this.indicatorPrototype = document.createElement('li') | |||
this.indicators = this.indicatorContainer[0].children | |||
} | |||
} | |||
initSlides.call(this, reload) | |||
}, | |||
addSlide: function (index) { | |||
addSlide.call(this, index) | |||
this.addIndicator(index) | |||
}, | |||
resetSlides: function () { | |||
resetSlides.call(this) | |||
this.indicatorContainer.empty() | |||
this.indicators = [] | |||
}, | |||
handleClick: function (event) { | |||
var target = event.target || event.srcElement | |||
var parent = target.parentNode | |||
if (parent === this.indicatorContainer[0]) { | |||
// Click on indicator element | |||
this.preventDefault(event) | |||
this.slide(this.getNodeIndex(target)) | |||
} else if (parent.parentNode === this.indicatorContainer[0]) { | |||
// Click on indicator child element | |||
this.preventDefault(event) | |||
this.slide(this.getNodeIndex(parent)) | |||
} else { | |||
return handleClick.call(this, event) | |||
} | |||
}, | |||
handleSlide: function (index) { | |||
handleSlide.call(this, index) | |||
this.setActiveIndicator(index) | |||
}, | |||
handleClose: function () { | |||
if (this.activeIndicator) { | |||
this.activeIndicator | |||
.removeClass(this.options.activeIndicatorClass) | |||
} | |||
handleClose.call(this) | |||
} | |||
}) | |||
return Gallery | |||
})) |
@@ -0,0 +1,170 @@ | |||
/* | |||
* blueimp Gallery Video Factory JS | |||
* https://github.com/blueimp/Gallery | |||
* | |||
* Copyright 2013, Sebastian Tschan | |||
* https://blueimp.net | |||
* | |||
* Licensed under the MIT license: | |||
* http://www.opensource.org/licenses/MIT | |||
*/ | |||
/* global define, window, document */ | |||
;(function (factory) { | |||
'use strict' | |||
if (typeof define === 'function' && define.amd) { | |||
// Register as an anonymous AMD module: | |||
define([ | |||
'./blueimp-helper', | |||
'./blueimp-gallery' | |||
], factory) | |||
} else { | |||
// Browser globals: | |||
factory( | |||
window.blueimp.helper || window.jQuery, | |||
window.blueimp.Gallery | |||
) | |||
} | |||
}(function ($, Gallery) { | |||
'use strict' | |||
$.extend(Gallery.prototype.options, { | |||
// The class for video content elements: | |||
videoContentClass: 'video-content', | |||
// The class for video when it is loading: | |||
videoLoadingClass: 'video-loading', | |||
// The class for video when it is playing: | |||
videoPlayingClass: 'video-playing', | |||
// The list object property (or data attribute) for the video poster URL: | |||
videoPosterProperty: 'poster', | |||
// The list object property (or data attribute) for the video sources array: | |||
videoSourcesProperty: 'sources' | |||
}) | |||
var handleSlide = Gallery.prototype.handleSlide | |||
$.extend(Gallery.prototype, { | |||
handleSlide: function (index) { | |||
handleSlide.call(this, index) | |||
if (this.playingVideo) { | |||
this.playingVideo.pause() | |||
} | |||
}, | |||
videoFactory: function (obj, callback, videoInterface) { | |||
var that = this | |||
var options = this.options | |||
var videoContainerNode = this.elementPrototype.cloneNode(false) | |||
var videoContainer = $(videoContainerNode) | |||
var errorArgs = [{ | |||
type: 'error', | |||
target: videoContainerNode | |||
}] | |||
var video = videoInterface || document.createElement('video') | |||
var url = this.getItemProperty(obj, options.urlProperty) | |||
var type = this.getItemProperty(obj, options.typeProperty) | |||
var title = this.getItemProperty(obj, options.titleProperty) | |||
var posterUrl = this.getItemProperty(obj, options.videoPosterProperty) | |||
var posterImage | |||
var sources = this.getItemProperty( | |||
obj, | |||
options.videoSourcesProperty | |||
) | |||
var source | |||
var playMediaControl | |||
var isLoading | |||
var hasControls | |||
videoContainer.addClass(options.videoContentClass) | |||
if (title) { | |||
videoContainerNode.title = title | |||
} | |||
if (video.canPlayType) { | |||
if (url && type && video.canPlayType(type)) { | |||
video.src = url | |||
} else { | |||
while (sources && sources.length) { | |||
source = sources.shift() | |||
url = this.getItemProperty(source, options.urlProperty) | |||
type = this.getItemProperty(source, options.typeProperty) | |||
if (url && type && video.canPlayType(type)) { | |||
video.src = url | |||
break | |||
} | |||
} | |||
} | |||
} | |||
if (posterUrl) { | |||
video.poster = posterUrl | |||
posterImage = this.imagePrototype.cloneNode(false) | |||
$(posterImage).addClass(options.toggleClass) | |||
posterImage.src = posterUrl | |||
posterImage.draggable = false | |||
videoContainerNode.appendChild(posterImage) | |||
} | |||
playMediaControl = document.createElement('a') | |||
playMediaControl.setAttribute('target', '_blank') | |||
if (!videoInterface) { | |||
playMediaControl.setAttribute('download', title) | |||
} | |||
playMediaControl.href = url | |||
if (video.src) { | |||
video.controls = true | |||
;(videoInterface || $(video)) | |||
.on('error', function () { | |||
that.setTimeout(callback, errorArgs) | |||
}) | |||
.on('pause', function () { | |||
isLoading = false | |||
videoContainer | |||
.removeClass(that.options.videoLoadingClass) | |||
.removeClass(that.options.videoPlayingClass) | |||
if (hasControls) { | |||
that.container.addClass(that.options.controlsClass) | |||
} | |||
delete that.playingVideo | |||
if (that.interval) { | |||
that.play() | |||
} | |||
}) | |||
.on('playing', function () { | |||
isLoading = false | |||
videoContainer | |||
.removeClass(that.options.videoLoadingClass) | |||
.addClass(that.options.videoPlayingClass) | |||
if (that.container.hasClass(that.options.controlsClass)) { | |||
hasControls = true | |||
that.container.removeClass(that.options.controlsClass) | |||
} else { | |||
hasControls = false | |||
} | |||
}) | |||
.on('play', function () { | |||
window.clearTimeout(that.timeout) | |||
isLoading = true | |||
videoContainer.addClass(that.options.videoLoadingClass) | |||
that.playingVideo = video | |||
}) | |||
$(playMediaControl).on('click', function (event) { | |||
that.preventDefault(event) | |||
if (isLoading) { | |||
video.pause() | |||
} else { | |||
video.play() | |||
} | |||
}) | |||
videoContainerNode.appendChild( | |||
(videoInterface && videoInterface.element) || video | |||
) | |||
} | |||
videoContainerNode.appendChild(playMediaControl) | |||
this.setTimeout(callback, [{ | |||
type: 'load', | |||
target: videoContainerNode | |||
}]) | |||
return videoContainerNode | |||
} | |||
}) | |||
return Gallery | |||
})) |
@@ -0,0 +1,213 @@ | |||
/* | |||
* blueimp Gallery Vimeo Video Factory JS | |||
* https://github.com/blueimp/Gallery | |||
* | |||
* Copyright 2013, Sebastian Tschan | |||
* https://blueimp.net | |||
* | |||
* Licensed under the MIT license: | |||
* http://www.opensource.org/licenses/MIT | |||
*/ | |||
/* global define, window, document, $f */ | |||
;(function (factory) { | |||
'use strict' | |||
if (typeof define === 'function' && define.amd) { | |||
// Register as an anonymous AMD module: | |||
define([ | |||
'./blueimp-helper', | |||
'./blueimp-gallery-video' | |||
], factory) | |||
} else { | |||
// Browser globals: | |||
factory( | |||
window.blueimp.helper || window.jQuery, | |||
window.blueimp.Gallery | |||
) | |||
} | |||
}(function ($, Gallery) { | |||
'use strict' | |||
if (!window.postMessage) { | |||
return Gallery | |||
} | |||
$.extend(Gallery.prototype.options, { | |||
// The list object property (or data attribute) with the Vimeo video id: | |||
vimeoVideoIdProperty: 'vimeo', | |||
// The URL for the Vimeo video player, can be extended with custom parameters: | |||
// https://developer.vimeo.com/player/embedding | |||
vimeoPlayerUrl: '//player.vimeo.com/video/VIDEO_ID?api=1&player_id=PLAYER_ID', | |||
// The prefix for the Vimeo video player ID: | |||
vimeoPlayerIdPrefix: 'vimeo-player-', | |||
// Require a click on the native Vimeo player for the initial playback: | |||
vimeoClickToPlay: true | |||
}) | |||
var textFactory = Gallery.prototype.textFactory || | |||
Gallery.prototype.imageFactory | |||
var VimeoPlayer = function (url, videoId, playerId, clickToPlay) { | |||
this.url = url | |||
this.videoId = videoId | |||
this.playerId = playerId | |||
this.clickToPlay = clickToPlay | |||
this.element = document.createElement('div') | |||
this.listeners = {} | |||
} | |||
var counter = 0 | |||
$.extend(VimeoPlayer.prototype, { | |||
canPlayType: function () { | |||
return true | |||
}, | |||
on: function (type, func) { | |||
this.listeners[type] = func | |||
return this | |||
}, | |||
loadAPI: function () { | |||
var that = this | |||
var apiUrl = '//f.vimeocdn.com/js/froogaloop2.min.js' | |||
var scriptTags = document.getElementsByTagName('script') | |||
var i = scriptTags.length | |||
var scriptTag | |||
var called | |||
function callback () { | |||
if (!called && that.playOnReady) { | |||
that.play() | |||
} | |||
called = true | |||
} | |||
while (i) { | |||
i -= 1 | |||
if (scriptTags[i].src === apiUrl) { | |||
scriptTag = scriptTags[i] | |||
break | |||
} | |||
} | |||
if (!scriptTag) { | |||
scriptTag = document.createElement('script') | |||
scriptTag.src = apiUrl | |||
} | |||
$(scriptTag).on('load', callback) | |||
scriptTags[0].parentNode.insertBefore(scriptTag, scriptTags[0]) | |||
// Fix for cached scripts on IE 8: | |||
if (/loaded|complete/.test(scriptTag.readyState)) { | |||
callback() | |||
} | |||
}, | |||
onReady: function () { | |||
var that = this | |||
this.ready = true | |||
this.player.addEvent('play', function () { | |||
that.hasPlayed = true | |||
that.onPlaying() | |||
}) | |||
this.player.addEvent('pause', function () { | |||
that.onPause() | |||
}) | |||
this.player.addEvent('finish', function () { | |||
that.onPause() | |||
}) | |||
if (this.playOnReady) { | |||
this.play() | |||
} | |||
}, | |||
onPlaying: function () { | |||
if (this.playStatus < 2) { | |||
this.listeners.playing() | |||
this.playStatus = 2 | |||
} | |||
}, | |||
onPause: function () { | |||
this.listeners.pause() | |||
delete this.playStatus | |||
}, | |||
insertIframe: function () { | |||
var iframe = document.createElement('iframe') | |||
iframe.src = this.url | |||
.replace('VIDEO_ID', this.videoId) | |||
.replace('PLAYER_ID', this.playerId) | |||
iframe.id = this.playerId | |||
this.element.parentNode.replaceChild(iframe, this.element) | |||
this.element = iframe | |||
}, | |||
play: function () { | |||
var that = this | |||
if (!this.playStatus) { | |||
this.listeners.play() | |||
this.playStatus = 1 | |||
} | |||
if (this.ready) { | |||
if (!this.hasPlayed && (this.clickToPlay || (window.navigator && | |||
/iP(hone|od|ad)/.test(window.navigator.platform)))) { | |||
// Manually trigger the playing callback if clickToPlay | |||
// is enabled and to workaround a limitation in iOS, | |||
// which requires synchronous user interaction to start | |||
// the video playback: | |||
this.onPlaying() | |||
} else { | |||
this.player.api('play') | |||
} | |||
} else { | |||
this.playOnReady = true | |||
if (!window.$f) { | |||
this.loadAPI() | |||
} else if (!this.player) { | |||
this.insertIframe() | |||
this.player = $f(this.element) | |||
this.player.addEvent('ready', function () { | |||
that.onReady() | |||
}) | |||
} | |||
} | |||
}, | |||
pause: function () { | |||
if (this.ready) { | |||
this.player.api('pause') | |||
} else if (this.playStatus) { | |||
delete this.playOnReady | |||
this.listeners.pause() | |||
delete this.playStatus | |||
} | |||
} | |||
}) | |||
$.extend(Gallery.prototype, { | |||
VimeoPlayer: VimeoPlayer, | |||
textFactory: function (obj, callback) { | |||
var options = this.options | |||
var videoId = this.getItemProperty(obj, options.vimeoVideoIdProperty) | |||
if (videoId) { | |||
if (this.getItemProperty(obj, options.urlProperty) === undefined) { | |||
obj[options.urlProperty] = '//vimeo.com/' + videoId | |||
} | |||
counter += 1 | |||
return this.videoFactory( | |||
obj, | |||
callback, | |||
new VimeoPlayer( | |||
options.vimeoPlayerUrl, | |||
videoId, | |||
options.vimeoPlayerIdPrefix + counter, | |||
options.vimeoClickToPlay | |||
) | |||
) | |||
} | |||
return textFactory.call(this, obj, callback) | |||
} | |||
}) | |||
return Gallery | |||
})) |
@@ -0,0 +1,228 @@ | |||
/* | |||
* blueimp Gallery YouTube Video Factory JS | |||
* https://github.com/blueimp/Gallery | |||
* | |||
* Copyright 2013, Sebastian Tschan | |||
* https://blueimp.net | |||
* | |||
* Licensed under the MIT license: | |||
* http://www.opensource.org/licenses/MIT | |||
*/ | |||
/* global define, window, document, YT */ | |||
;(function (factory) { | |||
'use strict' | |||
if (typeof define === 'function' && define.amd) { | |||
// Register as an anonymous AMD module: | |||
define([ | |||
'./blueimp-helper', | |||
'./blueimp-gallery-video' | |||
], factory) | |||
} else { | |||
// Browser globals: | |||
factory( | |||
window.blueimp.helper || window.jQuery, | |||
window.blueimp.Gallery | |||
) | |||
} | |||
}(function ($, Gallery) { | |||
'use strict' | |||
if (!window.postMessage) { | |||
return Gallery | |||
} | |||
$.extend(Gallery.prototype.options, { | |||
// The list object property (or data attribute) with the YouTube video id: | |||
youTubeVideoIdProperty: 'youtube', | |||
// Optional object with parameters passed to the YouTube video player: | |||
// https://developers.google.com/youtube/player_parameters | |||
youTubePlayerVars: { | |||
wmode: 'transparent' | |||
}, | |||
// Require a click on the native YouTube player for the initial playback: | |||
youTubeClickToPlay: true | |||
}) | |||
var textFactory = Gallery.prototype.textFactory || | |||
Gallery.prototype.imageFactory | |||
var YouTubePlayer = function (videoId, playerVars, clickToPlay) { | |||
this.videoId = videoId | |||
this.playerVars = playerVars | |||
this.clickToPlay = clickToPlay | |||
this.element = document.createElement('div') | |||
this.listeners = {} | |||
} | |||
$.extend(YouTubePlayer.prototype, { | |||
canPlayType: function () { | |||
return true | |||
}, | |||
on: function (type, func) { | |||
this.listeners[type] = func | |||
return this | |||
}, | |||
loadAPI: function () { | |||
var that = this | |||
var onYouTubeIframeAPIReady = window.onYouTubeIframeAPIReady | |||
var apiUrl = '//www.youtube.com/iframe_api' | |||
var scriptTags = document.getElementsByTagName('script') | |||
var i = scriptTags.length | |||
var scriptTag | |||
window.onYouTubeIframeAPIReady = function () { | |||
if (onYouTubeIframeAPIReady) { | |||
onYouTubeIframeAPIReady.apply(this) | |||
} | |||
if (that.playOnReady) { | |||
that.play() | |||
} | |||
} | |||
while (i) { | |||
i -= 1 | |||
if (scriptTags[i].src === apiUrl) { | |||
return | |||
} | |||
} | |||
scriptTag = document.createElement('script') | |||
scriptTag.src = apiUrl | |||
scriptTags[0].parentNode.insertBefore(scriptTag, scriptTags[0]) | |||
}, | |||
onReady: function () { | |||
this.ready = true | |||
if (this.playOnReady) { | |||
this.play() | |||
} | |||
}, | |||
onPlaying: function () { | |||
if (this.playStatus < 2) { | |||
this.listeners.playing() | |||
this.playStatus = 2 | |||
} | |||
}, | |||
onPause: function () { | |||
Gallery.prototype.setTimeout.call( | |||
this, | |||
this.checkSeek, | |||
null, | |||
2000 | |||
) | |||
}, | |||
checkSeek: function () { | |||
if (this.stateChange === YT.PlayerState.PAUSED || | |||
this.stateChange === YT.PlayerState.ENDED) { | |||
// check if current state change is actually paused | |||
this.listeners.pause() | |||
delete this.playStatus | |||
} | |||
}, | |||
onStateChange: function (event) { | |||
switch (event.data) { | |||
case YT.PlayerState.PLAYING: | |||
this.hasPlayed = true | |||
this.onPlaying() | |||
break | |||
case YT.PlayerState.PAUSED: | |||
case YT.PlayerState.ENDED: | |||
this.onPause() | |||
break | |||
} | |||
// Save most recent state change to this.stateChange | |||
this.stateChange = event.data | |||
}, | |||
onError: function (event) { | |||
this.listeners.error(event) | |||
}, | |||
play: function () { | |||
var that = this | |||
if (!this.playStatus) { | |||
this.listeners.play() | |||
this.playStatus = 1 | |||
} | |||
if (this.ready) { | |||
if (!this.hasPlayed && (this.clickToPlay || (window.navigator && | |||
/iP(hone|od|ad)/.test(window.navigator.platform)))) { | |||
// Manually trigger the playing callback if clickToPlay | |||
// is enabled and to workaround a limitation in iOS, | |||
// which requires synchronous user interaction to start | |||
// the video playback: | |||
this.onPlaying() | |||
} else { | |||
this.player.playVideo() | |||
} | |||
} else { | |||
this.playOnReady = true | |||
if (!(window.YT && YT.Player)) { | |||
this.loadAPI() | |||
} else if (!this.player) { | |||
this.player = new YT.Player(this.element, { | |||
videoId: this.videoId, | |||
playerVars: this.playerVars, | |||
events: { | |||
onReady: function () { | |||
that.onReady() | |||
}, | |||
onStateChange: function (event) { | |||
that.onStateChange(event) | |||
}, | |||
onError: function (event) { | |||
that.onError(event) | |||
} | |||
} | |||
}) | |||
} | |||
} | |||
}, | |||
pause: function () { | |||
if (this.ready) { | |||
this.player.pauseVideo() | |||
} else if (this.playStatus) { | |||
delete this.playOnReady | |||
this.listeners.pause() | |||
delete this.playStatus | |||
} | |||
} | |||
}) | |||
$.extend(Gallery.prototype, { | |||
YouTubePlayer: YouTubePlayer, | |||
textFactory: function (obj, callback) { | |||
var options = this.options | |||
var videoId = this.getItemProperty(obj, options.youTubeVideoIdProperty) | |||
if (videoId) { | |||
if (this.getItemProperty(obj, options.urlProperty) === undefined) { | |||
obj[options.urlProperty] = '//www.youtube.com/watch?v=' + videoId | |||
} | |||
if (this.getItemProperty(obj, options.videoPosterProperty) === undefined) { | |||
obj[options.videoPosterProperty] = '//img.youtube.com/vi/' + videoId + | |||
'/maxresdefault.jpg' | |||
} | |||
return this.videoFactory( | |||
obj, | |||
callback, | |||
new YouTubePlayer( | |||
videoId, | |||
options.youTubePlayerVars, | |||
options.youTubeClickToPlay | |||
) | |||
) | |||
} | |||
return textFactory.call(this, obj, callback) | |||
} | |||
}) | |||
return Gallery | |||
})) |
@@ -0,0 +1,190 @@ | |||
/* | |||
* blueimp helper JS | |||
* https://github.com/blueimp/Gallery | |||
* | |||
* Copyright 2013, Sebastian Tschan | |||
* https://blueimp.net | |||
* | |||
* Licensed under the MIT license: | |||
* http://www.opensource.org/licenses/MIT | |||
*/ | |||
/* global define, window, document */ | |||
;(function () { | |||
'use strict' | |||
function extend (obj1, obj2) { | |||
var prop | |||
for (prop in obj2) { | |||
if (obj2.hasOwnProperty(prop)) { | |||
obj1[prop] = obj2[prop] | |||
} | |||
} | |||
return obj1 | |||
} | |||
function Helper (query) { | |||
if (!this || this.find !== Helper.prototype.find) { | |||
// Called as function instead of as constructor, | |||
// so we simply return a new instance: | |||
return new Helper(query) | |||
} | |||
this.length = 0 | |||
if (query) { | |||
if (typeof query === 'string') { | |||
query = this.find(query) | |||
} | |||
if (query.nodeType || query === query.window) { | |||
// Single HTML element | |||
this.length = 1 | |||
this[0] = query | |||
} else { | |||
// HTML element collection | |||
var i = query.length | |||
this.length = i | |||
while (i) { | |||
i -= 1 | |||
this[i] = query[i] | |||
} | |||
} | |||
} | |||
} | |||
Helper.extend = extend | |||
Helper.contains = function (container, element) { | |||
do { | |||
element = element.parentNode | |||
if (element === container) { | |||
return true | |||
} | |||
} while (element) | |||
return false | |||
} | |||
Helper.parseJSON = function (string) { | |||
return window.JSON && JSON.parse(string) | |||
} | |||
extend(Helper.prototype, { | |||
find: function (query) { | |||
var container = this[0] || document | |||
if (typeof query === 'string') { | |||
if (container.querySelectorAll) { | |||
query = container.querySelectorAll(query) | |||
} else if (query.charAt(0) === '#') { | |||
query = container.getElementById(query.slice(1)) | |||
} else { | |||
query = container.getElementsByTagName(query) | |||
} | |||
} | |||
return new Helper(query) | |||
}, | |||
hasClass: function (className) { | |||
if (!this[0]) { | |||
return false | |||
} | |||
return new RegExp('(^|\\s+)' + className + | |||
'(\\s+|$)').test(this[0].className) | |||
}, | |||
addClass: function (className) { | |||
var i = this.length | |||
var element | |||
while (i) { | |||
i -= 1 | |||
element = this[i] | |||
if (!element.className) { | |||
element.className = className | |||
return this | |||
} | |||
if (this.hasClass(className)) { | |||
return this | |||
} | |||
element.className += ' ' + className | |||
} | |||
return this | |||
}, | |||
removeClass: function (className) { | |||
var regexp = new RegExp('(^|\\s+)' + className + '(\\s+|$)') | |||
var i = this.length | |||
var element | |||
while (i) { | |||
i -= 1 | |||
element = this[i] | |||
element.className = element.className.replace(regexp, ' ') | |||
} | |||
return this | |||
}, | |||
on: function (eventName, handler) { | |||
var eventNames = eventName.split(/\s+/) | |||
var i | |||
var element | |||
while (eventNames.length) { | |||
eventName = eventNames.shift() | |||
i = this.length | |||
while (i) { | |||
i -= 1 | |||
element = this[i] | |||
if (element.addEventListener) { | |||
element.addEventListener(eventName, handler, false) | |||
} else if (element.attachEvent) { | |||
element.attachEvent('on' + eventName, handler) | |||
} | |||
} | |||
} | |||
return this | |||
}, | |||
off: function (eventName, handler) { | |||
var eventNames = eventName.split(/\s+/) | |||
var i | |||
var element | |||
while (eventNames.length) { | |||
eventName = eventNames.shift() | |||
i = this.length | |||
while (i) { | |||
i -= 1 | |||
element = this[i] | |||
if (element.removeEventListener) { | |||
element.removeEventListener(eventName, handler, false) | |||
} else if (element.detachEvent) { | |||
element.detachEvent('on' + eventName, handler) | |||
} | |||
} | |||
} | |||
return this | |||
}, | |||
empty: function () { | |||
var i = this.length | |||
var element | |||
while (i) { | |||
i -= 1 | |||
element = this[i] | |||
while (element.hasChildNodes()) { | |||
element.removeChild(element.lastChild) | |||
} | |||
} | |||
return this | |||
}, | |||
first: function () { | |||
return new Helper(this[0]) | |||
} | |||
}) | |||
if (typeof define === 'function' && define.amd) { | |||
define(function () { | |||
return Helper | |||
}) | |||
} else { | |||
window.blueimp = window.blueimp || {} | |||
window.blueimp.helper = Helper | |||
} | |||
}()) |
@@ -0,0 +1,96 @@ | |||
/* | |||
* blueimp Gallery Demo JS | |||
* https://github.com/blueimp/Gallery | |||
* | |||
* Copyright 2013, Sebastian Tschan | |||
* https://blueimp.net | |||
* | |||
* Licensed under the MIT license: | |||
* http://www.opensource.org/licenses/MIT | |||
*/ | |||
/* global blueimp, $ */ | |||
$(function () { | |||
'use strict' | |||
// Load demo images from flickr: | |||
$.ajax({ | |||
// Flickr API is SSL only: | |||
// https://code.flickr.net/2014/04/30/flickr-api-going-ssl-only-on-june-27th-2014/ | |||
url: 'https://api.flickr.com/services/rest/', | |||
data: { | |||
format: 'json', | |||
method: 'flickr.interestingness.getList', | |||
api_key: '7617adae70159d09ba78cfec73c13be3' // jshint ignore:line | |||
}, | |||
dataType: 'jsonp', | |||
jsonp: 'jsoncallback' | |||
}).done(function (result) { | |||
var carouselLinks = [] | |||
var linksContainer = $('#links') | |||
var baseUrl | |||
// Add the demo images as links with thumbnails to the page: | |||
$.each(result.photos.photo, function (index, photo) { | |||
baseUrl = 'https://farm' + photo.farm + '.static.flickr.com/' + | |||
photo.server + '/' + photo.id + '_' + photo.secret | |||
$('<a/>') | |||
.append($('<img>').prop('src', baseUrl + '_s.jpg')) | |||
.prop('href', baseUrl + '_b.jpg') | |||
.prop('title', photo.title) | |||
.attr('data-gallery', '') | |||
.appendTo(linksContainer) | |||
carouselLinks.push({ | |||
href: baseUrl + '_c.jpg', | |||
title: photo.title | |||
}) | |||
}) | |||
// Initialize the Gallery as image carousel: | |||
blueimp.Gallery(carouselLinks, { | |||
container: '#blueimp-image-carousel', | |||
carousel: true | |||
}) | |||
}) | |||
// Initialize the Gallery as video carousel: | |||
blueimp.Gallery([ | |||
{ | |||
title: 'Sintel', | |||
href: 'https://archive.org/download/Sintel/sintel-2048-surround_512kb.mp4', | |||
type: 'video/mp4', | |||
poster: 'https://i.imgur.com/MUSw4Zu.jpg' | |||
}, | |||
{ | |||
title: 'Big Buck Bunny', | |||
href: 'https://upload.wikimedia.org/wikipedia/commons/7/75/' + | |||
'Big_Buck_Bunny_Trailer_400p.ogg', | |||
type: 'video/ogg', | |||
poster: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/70/' + | |||
'Big.Buck.Bunny.-.Opening.Screen.png/' + | |||
'800px-Big.Buck.Bunny.-.Opening.Screen.png' | |||
}, | |||
{ | |||
title: 'Elephants Dream', | |||
href: 'https://upload.wikimedia.org/wikipedia/commons/transcoded/8/83/' + | |||
'Elephants_Dream_%28high_quality%29.ogv/' + | |||
'Elephants_Dream_%28high_quality%29.ogv.360p.webm', | |||
type: 'video/webm', | |||
poster: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/90/' + | |||
'Elephants_Dream_s1_proog.jpg/800px-Elephants_Dream_s1_proog.jpg' | |||
}, | |||
{ | |||
title: 'LES TWINS - An Industry Ahead', | |||
type: 'text/html', | |||
youtube: 'zi4CIXpx7Bg' | |||
}, | |||
{ | |||
title: 'KN1GHT - Last Moon', | |||
type: 'text/html', | |||
vimeo: '73686146', | |||
poster: 'https://secure-a.vimeocdn.com/ts/448/835/448835699_960.jpg' | |||
} | |||
], { | |||
container: '#blueimp-video-carousel', | |||
carousel: true | |||
}) | |||
}) |
@@ -0,0 +1,83 @@ | |||
/* | |||
* blueimp Gallery jQuery plugin | |||
* https://github.com/blueimp/Gallery | |||
* | |||
* Copyright 2013, Sebastian Tschan | |||
* https://blueimp.net | |||
* | |||
* Licensed under the MIT license: | |||
* http://www.opensource.org/licenses/MIT | |||
*/ | |||
/* global define, window, document */ | |||
;(function (factory) { | |||
'use strict' | |||
if (typeof define === 'function' && define.amd) { | |||
define([ | |||
'jquery', | |||
'./blueimp-gallery' | |||
], factory) | |||
} else { | |||
factory( | |||
window.jQuery, | |||
window.blueimp.Gallery | |||
) | |||
} | |||
}(function ($, Gallery) { | |||
'use strict' | |||
// Global click handler to open links with data-gallery attribute | |||
// in the Gallery lightbox: | |||
$(document).on('click', '[data-gallery]', function (event) { | |||
// Get the container id from the data-gallery attribute: | |||
var id = $(this).data('gallery') | |||
var widget = $(id) | |||
var container = (widget.length && widget) || | |||
$(Gallery.prototype.options.container) | |||
var callbacks = { | |||
onopen: function () { | |||
container | |||
.data('gallery', this) | |||
.trigger('open') | |||
}, | |||
onopened: function () { | |||
container.trigger('opened') | |||
}, | |||
onslide: function () { | |||
container.trigger('slide', arguments) | |||
}, | |||
onslideend: function () { | |||
container.trigger('slideend', arguments) | |||
}, | |||
onslidecomplete: function () { | |||
container.trigger('slidecomplete', arguments) | |||
}, | |||
onclose: function () { | |||
container.trigger('close') | |||
}, | |||
onclosed: function () { | |||
container | |||
.trigger('closed') | |||
.removeData('gallery') | |||
} | |||
} | |||
var options = $.extend( | |||
// Retrieve custom options from data-attributes | |||
// on the Gallery widget: | |||
container.data(), | |||
{ | |||
container: container[0], | |||
index: this, | |||
event: event | |||
}, | |||
callbacks | |||
) | |||
// Select all links with the same data-gallery attribute: | |||
var links = $('[data-gallery="' + id + '"]') | |||
if (options.filter) { | |||
links = links.filter(options.filter) | |||
} | |||
return new Gallery(links, options) | |||
}) | |||
})) |