mediatheque
This commit is contained in:
Executable
+67
@@ -0,0 +1,67 @@
|
||||
var flexibleContentField = (function (w, d, $, undefined) {
|
||||
|
||||
'use strict';
|
||||
|
||||
var s = {
|
||||
selectors: {
|
||||
theRepeater: '.form-statut',
|
||||
theSelect: '.field-selection__select'
|
||||
}
|
||||
},
|
||||
els = {},
|
||||
init = function () {
|
||||
// console.log("hello !");
|
||||
// $(this).on('change', checkTarget);
|
||||
|
||||
// define elements
|
||||
els.theRepeater = $(s.selectors.theRepeater);
|
||||
els.theSelect = $(s.selectors.theSelect);
|
||||
|
||||
// no elements
|
||||
if (!els.theRepeater.length) { return; }
|
||||
els.theSelect.each(function() {
|
||||
let c = $(this).attr("checked");
|
||||
if(c){
|
||||
// console.log(this);
|
||||
hideShow(this);
|
||||
|
||||
}
|
||||
});
|
||||
els.theSelect.each(function() {
|
||||
$(this).on('mouseup', function(){
|
||||
hideShow(this);
|
||||
});
|
||||
});
|
||||
|
||||
},
|
||||
checkTarget = function(event) {
|
||||
// console.log($(this).attr("value"));
|
||||
},
|
||||
hideShow = function (elem) {
|
||||
els.theRepeater.each(function() {
|
||||
// $(this).parents().eq(2).hide();
|
||||
});
|
||||
let v = $(elem).attr("value");
|
||||
// $("."+v).parents().eq(2).show();
|
||||
|
||||
}
|
||||
|
||||
return {
|
||||
init: init
|
||||
};
|
||||
|
||||
}(window, window.document, window.jQuery));
|
||||
//
|
||||
// // theCall - on window loaded
|
||||
(function (w, d, undefined) {
|
||||
|
||||
"use strict";
|
||||
|
||||
// .parentElement.nodeName;
|
||||
var raf = requestAnimationFrame || mozRequestAnimationFrame || webkitRequestAnimationFrame || msRequestAnimationFrame,
|
||||
init = function () { w.flexibleContentField.init(); };
|
||||
|
||||
// when all is loaded
|
||||
raf ? raf(function () { w.setTimeout(init, 500); }) : w.addEventListener('load', init);
|
||||
|
||||
}(window, window.document));
|
||||
Executable
+2
File diff suppressed because one or more lines are too long
Executable
+1
File diff suppressed because one or more lines are too long
Executable
+513
@@ -0,0 +1,513 @@
|
||||
|
||||
function displayDataviz(data){
|
||||
console.log(data);
|
||||
let lane_array = [];
|
||||
let now = Date.now();
|
||||
|
||||
let earlier = now;
|
||||
|
||||
// ICI CACLCULER UNE HAUTEUR TOTAL EN FONCTION DU NOMBRE D'ACTIVISTE PAR LIGNE
|
||||
//height of items 10
|
||||
let item_height = 15;
|
||||
//object pour la hauteur
|
||||
// juste un array que je prendrai dans l'ordre des line
|
||||
const lineHeight_array = [];
|
||||
|
||||
|
||||
data.forEach(function(e){
|
||||
lane_array.push(e)
|
||||
if(e.start < earlier){
|
||||
earlier = e.start;
|
||||
}
|
||||
|
||||
});
|
||||
let items_array = [];
|
||||
data.forEach(function(e){
|
||||
e.activist.forEach(function(d){
|
||||
items_array.push(d);
|
||||
if(d.start < earlier){
|
||||
earlier = d.start;
|
||||
}
|
||||
});
|
||||
if (e.activist.length*item_height > 50) {
|
||||
lineHeight_array.push(e.activist.length*item_height);
|
||||
}else{
|
||||
lineHeight_array.push(50);
|
||||
}
|
||||
});
|
||||
var lanes = lane_array,
|
||||
laneLength = lanes.length,
|
||||
items = items_array;
|
||||
|
||||
var t1 = new Date(earlier);
|
||||
var t2 = new Date(now);
|
||||
|
||||
|
||||
var timeBegin = earlier,
|
||||
timeEnd = now ;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//
|
||||
let pw = $(".post_content").width();
|
||||
var m = [20, 15, 15, 120], //top right bottom left
|
||||
w = pw - m[1] - m[3],
|
||||
h = sumArray(lineHeight_array) + (sumArray(lineHeight_array)/10) + 180,
|
||||
miniHeight = sumArray(lineHeight_array)/10 + 80,
|
||||
mainHeight = h - miniHeight - 40;
|
||||
|
||||
//scales
|
||||
var x = d3.scaleLinear()
|
||||
.domain([timeBegin, timeEnd])
|
||||
.range([0, w]);
|
||||
var revert_x = d3.scaleLinear()
|
||||
.domain([0, w])
|
||||
.range([timeBegin, timeEnd]);
|
||||
var x1 = d3.scaleLinear()
|
||||
.range([0, w]);
|
||||
var y1 = d3.scaleLinear()
|
||||
.domain([0, laneLength])
|
||||
.range([0, mainHeight]);
|
||||
var y2 = d3.scaleLinear()
|
||||
.domain([0, laneLength])
|
||||
.range([0, miniHeight]);
|
||||
|
||||
var chart = d3.select("#datavis")
|
||||
.append("svg")
|
||||
.attr("width", w + m[1] + m[3])
|
||||
.attr("height", h + m[0] + m[2])
|
||||
/*.attr("viewBox", '0 0 '+(h + m[0] + m[2])+' '+(w + m[1] + m[3])+'')*/
|
||||
.attr("class", "chart");
|
||||
|
||||
chart.append("defs").append("clipPath")
|
||||
.attr("id", "clip")
|
||||
.append("rect")
|
||||
.attr("width", w)
|
||||
.attr("height", mainHeight);
|
||||
|
||||
var main = chart.append("g")
|
||||
.attr("transform", "translate(" + m[3] + "," + m[0] + ")")
|
||||
.attr("width", w)
|
||||
.attr("height", mainHeight)
|
||||
.attr("class", "main");
|
||||
|
||||
|
||||
var mini = chart.append("g")
|
||||
.attr("transform", "translate(" + m[3] + "," + (mainHeight + m[0]+ 20) + ")")
|
||||
.attr("width", w-100)
|
||||
.attr("height", miniHeight)
|
||||
.attr("class", "mini");
|
||||
|
||||
//main lanes and texts
|
||||
|
||||
main.append("g").selectAll(".laneText")
|
||||
.data(lanes)
|
||||
.enter().append("text")
|
||||
.text(function(d) {return d.title;})
|
||||
.attr("x", -m[1])
|
||||
.attr("y", function(d, i) { if(d.lane == 0){ return lineHeight_array[i]/2}else{ return lineHeight_array[i]+sumArray(lineHeight_array, i-1)-lineHeight_array[i]/2};})
|
||||
.attr("dy", ".5ex")
|
||||
.attr("text-anchor", "end")
|
||||
.attr("class", "laneText");
|
||||
|
||||
main.append("g").selectAll(".laneLines")
|
||||
.data(lanes)
|
||||
.enter().append("line")
|
||||
.attr("x1", m[1])
|
||||
.attr("y1", function(d,i) { if(d.lane == 0){ return lineHeight_array[i]}else{ return lineHeight_array[i]+sumArray(lineHeight_array, i-1)};})
|
||||
.attr("x2", w)
|
||||
.attr("y2", function(d,i) {if(d.lane == 0){return lineHeight_array[i]}else{return lineHeight_array[i]+sumArray(lineHeight_array, i-1)};})
|
||||
.attr("stroke", "black")
|
||||
|
||||
|
||||
const xaxis = d3.scaleLinear()
|
||||
.domain([timeBegin, timeEnd])
|
||||
.range([0, w]);
|
||||
|
||||
mini.append("g")
|
||||
.attr("transform", "translate(0," + miniHeight + ")")
|
||||
.call(d3.axisBottom(xaxis).ticks(t2.getFullYear()-t1.getFullYear()).tickFormat(d3.timeFormat('%Y')))
|
||||
.selectAll("text")
|
||||
/*.attr("transform", "translate(-10,10)rotate(-45)")*/
|
||||
.style("text-anchor", "center")
|
||||
.style("font-size", 20)
|
||||
.style("fill", "black");
|
||||
|
||||
|
||||
|
||||
// coalition
|
||||
// adapt in display
|
||||
/*var coa = main.append("g").selectAll("rect")
|
||||
.data(lanes)
|
||||
.enter().append("rect")
|
||||
.attr("class", "coalition")
|
||||
.attr("x", function(d) {var date = new Date(d.start); return x(d.start);})
|
||||
.attr("y", function(d) {return y1(d.lane) + 10;})
|
||||
.attr("height", function(d) {return .8 * y1(1);})
|
||||
.attr("width", function(d) { return x(d.end) - x(d.start);})
|
||||
.attr("pos", function(d) {return d.lane });*/
|
||||
|
||||
|
||||
//mini lanes and texts
|
||||
mini.append("g").selectAll(".laneLines")
|
||||
.data(items)
|
||||
.enter().append("line")
|
||||
.attr("x1", m[1])
|
||||
.attr("y1", function(d) {return y2(d.lane);})
|
||||
.attr("x2", w)
|
||||
.attr("y2", function(d) {return y2(d.lane);})
|
||||
.attr("stroke", "lightgray");
|
||||
|
||||
mini.append("g").selectAll(".laneText")
|
||||
.data(lanes)
|
||||
.enter().append("text")
|
||||
.text(function(d) {return d.title;})
|
||||
.attr("x", -m[1])
|
||||
.attr("y", function(d, i) {return y2(i + .5);})
|
||||
.attr("dy", ".5ex")
|
||||
.attr("text-anchor", "end")
|
||||
.attr("class", "laneText");
|
||||
|
||||
var itemCoa = main.append("g").attr("clip-path", "url(#clip)");
|
||||
var itemCircles = main.append("g")
|
||||
.attr("clip-path", "url(#clip)");
|
||||
var itemRects = main.append("g")
|
||||
.attr("clip-path", "url(#clip)");
|
||||
|
||||
var axisMain = main.append("g")
|
||||
.attr("clip-path", "url(#clip)");
|
||||
|
||||
coa = mini.append("g").selectAll("rect")
|
||||
.data(lanes)
|
||||
.enter().append("rect")
|
||||
.attr("class", "coalition")
|
||||
.attr("x", function(d) { return x(d.start);})
|
||||
.attr("y", function(d) {return y2(d.lane) + 2;})
|
||||
.attr("height", function(d) {return .8 * y2(1);})
|
||||
.attr("width", function(d) { return x(d.end) - x(d.start);})
|
||||
.attr("pos", function(d) {return d.lane });
|
||||
|
||||
//mini item rects
|
||||
mini.append("g").selectAll("miniItems")
|
||||
.data(items)
|
||||
.enter().append("rect")
|
||||
.attr("class", function(d) {return "markers";})
|
||||
.attr("x", function(d) {return x(d.start);})
|
||||
/*.attr("y", function(d, i) {let l1 = d.lane+1; let increments = (y2(l1)-y2(d.lane)) / (lanes[d.lane].activist.length)*i; return y2(d.lane)+increments;})*/
|
||||
.attr("y", function(d){ let idx = lanes[d.lane].activist.indexOf(d); let increments = y2(1) / (lanes[d.lane].activist.length)*idx; return y2(d.lane)+(increments) })
|
||||
.attr("width", function(d) {return x(d.end) - x(d.start);})
|
||||
.attr("height", 1);
|
||||
|
||||
mini.append("g").selectAll("miniCircle")
|
||||
.data(items)
|
||||
.enter().append("circle")
|
||||
.attr("class", function(d) {return "markers";})
|
||||
.attr("cx", function(d) {return x(d.start);})
|
||||
/*.attr("y", function(d, i) {let l1 = d.lane+1; let increments = (y2(l1)-y2(d.lane)) / (lanes[d.lane].activist.length)*i; return y2(d.lane)+increments;})*/
|
||||
.attr("cy", function(d){ let idx = lanes[d.lane].activist.indexOf(d); let increments = y2(1) / (lanes[d.lane].activist.length)*idx; return y2(d.lane)+(increments) })
|
||||
.attr("r", 1);
|
||||
|
||||
|
||||
|
||||
//mini labels
|
||||
/*mini.append("g").selectAll(".miniLabels")
|
||||
.data(items)
|
||||
.enter().append("text")
|
||||
.text(function(d) {return d.id;})
|
||||
.attr("x", function(d) {return x(d.start);})
|
||||
.attr("y", function(d, i) { let l1 = d.lane+1; let increments = (y2(l1)-y2(d.lane)) / (lanes[d.lane].activist.length)*i; return y2(d.lane)+increments;})
|
||||
.attr("dy", ".5ex");
|
||||
*/
|
||||
|
||||
// data interaction
|
||||
$("body").on("mouseover", ".label_info", function(){
|
||||
let id = $(this).data("id");
|
||||
let elem = $("body").find('.miniItem[data-id="'+id+'"]');
|
||||
let c = $("body").find('.miniCircle[data-id="'+id+'"]');
|
||||
let y = parseFloat(elem.attr("y"))-10;
|
||||
elem.css({
|
||||
"y" :y,
|
||||
"height": "25px",
|
||||
"fill": 'black'
|
||||
});
|
||||
/*c.css({
|
||||
"r" : "13px",
|
||||
"fill": 'black'
|
||||
});*/
|
||||
$(this).css({
|
||||
"font" : "15px sans-serif",
|
||||
"fill": '#e94d1a'
|
||||
});
|
||||
});
|
||||
|
||||
$("body").on("mouseleave", ".label_info", function(){
|
||||
let id = $(this).data("id");
|
||||
let elem = $("body").find('.miniItem[data-id="'+id+'"]');
|
||||
let c = $("body").find('.miniCircle[data-id="'+id+'"]');
|
||||
let y = parseFloat(elem.attr("y"));
|
||||
elem.css({
|
||||
"y" :y,
|
||||
"height" : "10px",
|
||||
"fill": '#e94d1a'
|
||||
});
|
||||
/*c.css({
|
||||
"r" : "5px",
|
||||
"fill": '#e94d1a'
|
||||
});*/
|
||||
$(this).css({
|
||||
"font" : "10px sans-serif",
|
||||
"fill": 'black'
|
||||
})
|
||||
});
|
||||
|
||||
$("body").on("mouseover", ".miniItem", function(){
|
||||
let id = $(this).data("id");
|
||||
let elem = $("body").find('.label_info[data-id="'+id+'"]');
|
||||
let c = $("body").find('.miniCircle[data-id="'+id+'"]');
|
||||
let y = parseFloat($(this).attr("y"))-10;
|
||||
elem.css({
|
||||
"font" : "15px sans-serif",
|
||||
"fill": '#e94d1a'
|
||||
});
|
||||
/*c.css({
|
||||
"r" : "13px",
|
||||
"fill": 'black'
|
||||
});*/
|
||||
$(this).css({
|
||||
"y" :y,
|
||||
"height": "25px",
|
||||
"fill": 'black'
|
||||
});
|
||||
});
|
||||
|
||||
$("body").on("mouseleave", ".miniItem", function(){
|
||||
let id = $(this).data("id");
|
||||
let elem = $("body").find('.label_info[data-id="'+id+'"]');
|
||||
let c = $("body").find('.miniCircle[data-id="'+id+'"]');
|
||||
let y = parseFloat($(this).attr("y"));
|
||||
elem.css({
|
||||
"font" : "10px sans-serif",
|
||||
"fill": 'black'
|
||||
});
|
||||
/*c.css({
|
||||
"r" : "5px",
|
||||
"fill": '#e94d1a'
|
||||
});*/
|
||||
$(this).css({
|
||||
"y" :y,
|
||||
"height" : "10px",
|
||||
"fill": '#e94d1a'
|
||||
})
|
||||
});
|
||||
|
||||
// brush function
|
||||
/*const brush = d3.brushX().on('brush', handleBrush);
|
||||
|
||||
|
||||
initBrush();*/
|
||||
// mini.select(".brush")
|
||||
// .call(brush.extent([[0, 0], [w, miniHeight]]));
|
||||
// Selecting SVG element
|
||||
/*mini.call(d3.brush().move, [[0, 0], [w, miniHeight]])*/
|
||||
/*function initBrush() {
|
||||
mini.append("g")
|
||||
.attr("class", "brush")
|
||||
.call(brush.extent([[0, 0], [w, miniHeight]]));
|
||||
|
||||
}*/
|
||||
// brush old
|
||||
var brush = d3.brushX()
|
||||
.on("brush", handleBrush)
|
||||
|
||||
mini.append("g")
|
||||
.attr("class", "brush")
|
||||
.call(brush.extent([[0, 0], [w, miniHeight]]));
|
||||
|
||||
handleBrush();
|
||||
|
||||
function handleBrush() {
|
||||
|
||||
var minExtent = d3.brushSelection(this) == null ? 0 : d3.brushSelection(this)[0] ;
|
||||
var maxExtent = d3.brushSelection(this) == null ? w : d3.brushSelection(this)[1] ;
|
||||
|
||||
|
||||
var rects, points, labels,
|
||||
visItems = items.filter(function(d) {return x(d.start) < maxExtent && x(d.end) > minExtent;});
|
||||
|
||||
vislanes = lanes.filter(function(d) {return x(d.start) < maxExtent && x(d.end) > minExtent;});
|
||||
|
||||
var checkable = [];
|
||||
visItems.forEach(function(e){ checkable.push(e.id)});
|
||||
vislanes.forEach(function(e){
|
||||
e.activist.forEach(function(d){
|
||||
|
||||
if(checkable.includes(d.id) == false){
|
||||
//console.log(d.id);
|
||||
const index = e.activist.indexOf(d);
|
||||
if (index == -1) {
|
||||
e.activist.splice(index, 1);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* */
|
||||
|
||||
x1.domain([revert_x(minExtent), revert_x(maxExtent)]);
|
||||
|
||||
//update main item rects
|
||||
rects = itemRects.selectAll("rect")
|
||||
.data(visItems, function(d) { return d.id; })
|
||||
.attr("x", function(d) {return x1(d.start);})
|
||||
.attr("width", function(d) {return x1(d.end) - x1(d.start);});
|
||||
|
||||
rects.enter().append("rect")
|
||||
.attr("class", function(d) {return "miniItem";})
|
||||
.attr('data-id',function(d,i) {return i+'-'+d.lane+'_'+d.id;} )
|
||||
.attr('data-ref',function(d,i) {return d.pos+'_'+d.id.replace(/\s/g, '');} )
|
||||
.attr("x", function(d) {return x1(d.start);})
|
||||
.attr("y", function(d) {
|
||||
let idx = lanes[d.lane].activist.indexOf(d);
|
||||
let increments = ( lineHeight_array[d.lane]-15) / (lanes[d.lane].activist.length)*idx;
|
||||
|
||||
|
||||
return sumArray(lineHeight_array, d.lane, true)+(increments)+7
|
||||
|
||||
})
|
||||
.attr("width", function(d) {return x1(d.end) - x1(d.start);})
|
||||
.attr("height", function(d) {return 10;});
|
||||
|
||||
|
||||
rects.exit().remove();
|
||||
|
||||
//axis
|
||||
const bigAxis = d3.scaleLinear()
|
||||
.domain([revert_x(minExtent), revert_x(maxExtent)])
|
||||
.range([0, w]);
|
||||
|
||||
let t2 =new Date(revert_x(maxExtent));
|
||||
let t1 =new Date(revert_x(minExtent));
|
||||
axisMain.attr("transform", "translate(0," + (mainHeight - 50) +")")
|
||||
.call(d3.axisBottom(bigAxis).ticks(t2.getFullYear()-t1.getFullYear()).tickFormat(d3.timeFormat('%Y')))
|
||||
.selectAll("text")
|
||||
/*.attr("transform", "translate(-10,10)rotate(-45)")*/
|
||||
.style("text-anchor", "center")
|
||||
.style("font-size", 20)
|
||||
.style("fill", "black");
|
||||
|
||||
axisMain.exit().remove();
|
||||
|
||||
|
||||
//update the item labels
|
||||
labels = itemRects.selectAll("text")
|
||||
.data(visItems, function (d) { return d.id; })
|
||||
.attr("x", function(d) {return x1(Math.max(d.start, revert_x(minExtent) + 2))+10;});
|
||||
|
||||
labels.enter().append("text")
|
||||
.text(function(d) {return d.id;})
|
||||
.attr('class', 'label_info')
|
||||
.attr('data-id',function(d,i) {return i+'-'+d.lane+'_'+d.id;} )
|
||||
.attr('data-ref',function(d,i) {return d.pos+'_'+d.id.replace(/\s/g, '');} )
|
||||
.attr("x", function(d) {return x1(Math.max(d.start, revert_x(minExtent)));})
|
||||
.attr("y", function(d) {
|
||||
let idx = lanes[d.lane].activist.indexOf(d);
|
||||
let increments = (lineHeight_array[d.lane]-15) / (lanes[d.lane].activist.length)*idx;
|
||||
|
||||
return sumArray(lineHeight_array, d.lane, true)+(increments)+15
|
||||
|
||||
})
|
||||
.attr("text-anchor", "start");
|
||||
|
||||
labels.exit().remove();
|
||||
//circles
|
||||
ccs = itemCircles.selectAll("circle")
|
||||
.data(visItems, function(d) { return d.id; })
|
||||
.attr("cx", function(d) {return x1(Math.max(d.start, revert_x(minExtent)));});
|
||||
/*.attr("width", function(d) {return x1(d.end) - x1(d.start);});*/
|
||||
|
||||
ccs.enter().append("circle")
|
||||
.attr("class", function(d) {return "miniCircle";})
|
||||
.attr('data-id',function(d,i) {return i+'-'+d.lane+'_'+d.id;} )
|
||||
.attr("cx", function(d) {return x1(Math.max(d.start, revert_x(minExtent)))-7;})
|
||||
.attr("cy", function(d) {
|
||||
let idx = lanes[d.lane].activist.indexOf(d);
|
||||
let increments = (( lineHeight_array[d.lane] -15 ) / (lanes[d.lane].activist.length))*idx;
|
||||
|
||||
|
||||
return sumArray(lineHeight_array, d.lane, true)+(increments)+12
|
||||
|
||||
})
|
||||
.attr("r", function(d,i) {
|
||||
let id = i+'-'+d.lane+'_'+d.id;
|
||||
let itemw = $("body").find('.miniItem[data-id="'+id+'"]').attr("width");
|
||||
let lbw = $("body").find('.label_info[data-id="'+id+'"]')[0].getBoundingClientRect().width;
|
||||
|
||||
if (lbw > itemw && itemw < 8 ) {
|
||||
return 5;
|
||||
}else{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
ccs.exit().remove();
|
||||
//redraw coa lane
|
||||
coa = itemCoa.selectAll("rect")
|
||||
.data(lanes)
|
||||
.attr("x", function(d) {return x1(d.start);})
|
||||
.attr("width", function(d) {return x1(d.end) - x1(d.start);});
|
||||
|
||||
coa.enter().append("rect")
|
||||
.attr("class", "coalition")
|
||||
.attr("x", function(d) {return x1(d.start);})
|
||||
.attr("y", function(d, i ) {return sumArray(lineHeight_array, i, true)+5;})
|
||||
.attr("height", function(d, i) {return lineHeight_array[i]-10;})
|
||||
.attr("width", function(d) {return x1(d.end) - x1(d.start);})
|
||||
.attr("pos", function(d) {return d.lane });
|
||||
|
||||
coa.exit().remove();
|
||||
|
||||
labelcoa = itemCoa.selectAll("text")
|
||||
.data(lanes)
|
||||
.attr("x", function(d) {return x1(Math.max(d.start, revert_x(minExtent)))+20;});
|
||||
|
||||
|
||||
labelcoa.enter().append("text")
|
||||
.text(function(d) {return d.coa_name})
|
||||
.attr('class', 'coa_name')
|
||||
.attr('fill','white')
|
||||
.attr("y", function(d, i ) {return sumArray(lineHeight_array, i, true)+lineHeight_array[i]/2+10;})
|
||||
|
||||
|
||||
labelcoa.exit().remove();
|
||||
|
||||
}
|
||||
|
||||
function sumArray(array, to, strict){
|
||||
let s = 0;
|
||||
if (to == null) {
|
||||
array.forEach(function(e){
|
||||
s = s+e;
|
||||
});
|
||||
}else{
|
||||
if (strict == false || strict == null) {
|
||||
for (var i = 0; i <= to; i++) {
|
||||
s = s+array[i];
|
||||
}
|
||||
}else{
|
||||
for (var i = 0; i < to; i++) {
|
||||
s = s+array[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
}
|
||||
Executable
+2
File diff suppressed because one or more lines are too long
Executable
+10371
File diff suppressed because it is too large
Load Diff
Executable
+554
@@ -0,0 +1,554 @@
|
||||
/*!
|
||||
* Lightbox v2.11.3
|
||||
* by Lokesh Dhakar
|
||||
*
|
||||
* More info:
|
||||
* http://lokeshdhakar.com/projects/lightbox2/
|
||||
*
|
||||
* Copyright Lokesh Dhakar
|
||||
* Released under the MIT license
|
||||
* https://github.com/lokesh/lightbox2/blob/master/LICENSE
|
||||
*
|
||||
* @preserve
|
||||
*/
|
||||
|
||||
// Uses Node, AMD or browser globals to create a module.
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as an anonymous module.
|
||||
define(['jquery'], factory);
|
||||
} else if (typeof exports === 'object') {
|
||||
// Node. Does not work with strict CommonJS, but
|
||||
// only CommonJS-like environments that support module.exports,
|
||||
// like Node.
|
||||
module.exports = factory(require('jquery'));
|
||||
} else {
|
||||
// Browser globals (root is window)
|
||||
root.lightbox = factory(root.jQuery);
|
||||
}
|
||||
}(this, function ($) {
|
||||
|
||||
function Lightbox(options) {
|
||||
this.album = [];
|
||||
this.currentImageIndex = void 0;
|
||||
this.init();
|
||||
|
||||
// options
|
||||
this.options = $.extend({}, this.constructor.defaults);
|
||||
this.option(options);
|
||||
}
|
||||
|
||||
// Descriptions of all options available on the demo site:
|
||||
// http://lokeshdhakar.com/projects/lightbox2/index.html#options
|
||||
Lightbox.defaults = {
|
||||
albumLabel: 'Image %1 of %2',
|
||||
alwaysShowNavOnTouchDevices: false,
|
||||
fadeDuration: 600,
|
||||
fitImagesInViewport: true,
|
||||
imageFadeDuration: 600,
|
||||
// maxWidth: 800,
|
||||
// maxHeight: 600,
|
||||
positionFromTop: 50,
|
||||
resizeDuration: 700,
|
||||
showImageNumberLabel: true,
|
||||
wrapAround: false,
|
||||
disableScrolling: false,
|
||||
/*
|
||||
Sanitize Title
|
||||
If the caption data is trusted, for example you are hardcoding it in, then leave this to false.
|
||||
This will free you to add html tags, such as links, in the caption.
|
||||
|
||||
If the caption data is user submitted or from some other untrusted source, then set this to true
|
||||
to prevent xss and other injection attacks.
|
||||
*/
|
||||
sanitizeTitle: false
|
||||
};
|
||||
|
||||
Lightbox.prototype.option = function(options) {
|
||||
$.extend(this.options, options);
|
||||
};
|
||||
|
||||
Lightbox.prototype.imageCountLabel = function(currentImageNum, totalImages) {
|
||||
return this.options.albumLabel.replace(/%1/g, currentImageNum).replace(/%2/g, totalImages);
|
||||
};
|
||||
|
||||
Lightbox.prototype.init = function() {
|
||||
var self = this;
|
||||
// Both enable and build methods require the body tag to be in the DOM.
|
||||
$(document).ready(function() {
|
||||
self.enable();
|
||||
self.build();
|
||||
});
|
||||
};
|
||||
|
||||
// Loop through anchors and areamaps looking for either data-lightbox attributes or rel attributes
|
||||
// that contain 'lightbox'. When these are clicked, start lightbox.
|
||||
Lightbox.prototype.enable = function() {
|
||||
var self = this;
|
||||
$('body').on('click', 'a[rel^=lightbox], area[rel^=lightbox], a[data-lightbox], area[data-lightbox]', function(event) {
|
||||
self.start($(event.currentTarget));
|
||||
return false;
|
||||
});
|
||||
};
|
||||
|
||||
// Build html for the lightbox and the overlay.
|
||||
// Attach event handlers to the new DOM elements. click click click
|
||||
Lightbox.prototype.build = function() {
|
||||
if ($('#lightbox').length > 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
var self = this;
|
||||
|
||||
// The two root notes generated, #lightboxOverlay and #lightbox are given
|
||||
// tabindex attrs so they are focusable. We attach our keyboard event
|
||||
// listeners to these two elements, and not the document. Clicking anywhere
|
||||
// while Lightbox is opened will keep the focus on or inside one of these
|
||||
// two elements.
|
||||
//
|
||||
// We do this so we can prevent propogation of the Esc keypress when
|
||||
// Lightbox is open. This prevents it from intefering with other components
|
||||
// on the page below.
|
||||
//
|
||||
// Github issue: https://github.com/lokesh/lightbox2/issues/663
|
||||
$('<div id="lightboxOverlay" tabindex="-1" class="lightboxOverlay"></div><div id="lightbox" tabindex="-1" class="lightbox"><div class="lb-outerContainer"><div class="lb-container"><img class="lb-image" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" alt=""/><div class="lb-nav"><a class="lb-prev" aria-label="Previous image" href="" ></a><a class="lb-next" aria-label="Next image" href="" ></a></div><div class="lb-loader"><a class="lb-cancel"></a></div></div></div><div class="lb-dataContainer"><div class="lb-data"><div class="lb-details"><span class="lb-caption"></span><span class="lb-number"></span></div><div class="lb-closeContainer"><a class="lb-close"></a></div></div></div></div>').appendTo($('body'));
|
||||
|
||||
// Cache jQuery objects
|
||||
this.$lightbox = $('#lightbox');
|
||||
this.$overlay = $('#lightboxOverlay');
|
||||
this.$outerContainer = this.$lightbox.find('.lb-outerContainer');
|
||||
this.$container = this.$lightbox.find('.lb-container');
|
||||
this.$image = this.$lightbox.find('.lb-image');
|
||||
this.$nav = this.$lightbox.find('.lb-nav');
|
||||
|
||||
// Store css values for future lookup
|
||||
this.containerPadding = {
|
||||
top: parseInt(this.$container.css('padding-top'), 10),
|
||||
right: parseInt(this.$container.css('padding-right'), 10),
|
||||
bottom: parseInt(this.$container.css('padding-bottom'), 10),
|
||||
left: parseInt(this.$container.css('padding-left'), 10)
|
||||
};
|
||||
|
||||
this.imageBorderWidth = {
|
||||
top: parseInt(this.$image.css('border-top-width'), 10),
|
||||
right: parseInt(this.$image.css('border-right-width'), 10),
|
||||
bottom: parseInt(this.$image.css('border-bottom-width'), 10),
|
||||
left: parseInt(this.$image.css('border-left-width'), 10)
|
||||
};
|
||||
|
||||
// Attach event handlers to the newly minted DOM elements
|
||||
this.$overlay.hide().on('click', function() {
|
||||
self.end();
|
||||
return false;
|
||||
});
|
||||
|
||||
this.$lightbox.hide().on('click', function(event) {
|
||||
if ($(event.target).attr('id') === 'lightbox') {
|
||||
self.end();
|
||||
}
|
||||
});
|
||||
|
||||
this.$outerContainer.on('click', function(event) {
|
||||
if ($(event.target).attr('id') === 'lightbox') {
|
||||
self.end();
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
this.$lightbox.find('.lb-prev').on('click', function() {
|
||||
if (self.currentImageIndex === 0) {
|
||||
self.changeImage(self.album.length - 1);
|
||||
} else {
|
||||
self.changeImage(self.currentImageIndex - 1);
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
this.$lightbox.find('.lb-next').on('click', function() {
|
||||
if (self.currentImageIndex === self.album.length - 1) {
|
||||
self.changeImage(0);
|
||||
} else {
|
||||
self.changeImage(self.currentImageIndex + 1);
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
/*
|
||||
Show context menu for image on right-click
|
||||
|
||||
There is a div containing the navigation that spans the entire image and lives above of it. If
|
||||
you right-click, you are right clicking this div and not the image. This prevents users from
|
||||
saving the image or using other context menu actions with the image.
|
||||
|
||||
To fix this, when we detect the right mouse button is pressed down, but not yet clicked, we
|
||||
set pointer-events to none on the nav div. This is so that the upcoming right-click event on
|
||||
the next mouseup will bubble down to the image. Once the right-click/contextmenu event occurs
|
||||
we set the pointer events back to auto for the nav div so it can capture hover and left-click
|
||||
events as usual.
|
||||
*/
|
||||
this.$nav.on('mousedown', function(event) {
|
||||
if (event.which === 3) {
|
||||
self.$nav.css('pointer-events', 'none');
|
||||
|
||||
self.$lightbox.one('contextmenu', function() {
|
||||
setTimeout(function() {
|
||||
this.$nav.css('pointer-events', 'auto');
|
||||
}.bind(self), 0);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
this.$lightbox.find('.lb-loader, .lb-close').on('click', function() {
|
||||
self.end();
|
||||
return false;
|
||||
});
|
||||
};
|
||||
|
||||
// Show overlay and lightbox. If the image is part of a set, add siblings to album array.
|
||||
Lightbox.prototype.start = function($link) {
|
||||
var self = this;
|
||||
var $window = $(window);
|
||||
|
||||
$window.on('resize', $.proxy(this.sizeOverlay, this));
|
||||
|
||||
this.sizeOverlay();
|
||||
|
||||
this.album = [];
|
||||
var imageNumber = 0;
|
||||
|
||||
function addToAlbum($link) {
|
||||
self.album.push({
|
||||
alt: $link.attr('data-alt'),
|
||||
link: $link.attr('href'),
|
||||
title: $link.attr('data-title') || $link.attr('title')
|
||||
});
|
||||
}
|
||||
|
||||
// Support both data-lightbox attribute and rel attribute implementations
|
||||
var dataLightboxValue = $link.attr('data-lightbox');
|
||||
var $links;
|
||||
|
||||
if (dataLightboxValue) {
|
||||
$links = $($link.prop('tagName') + '[data-lightbox="' + dataLightboxValue + '"]');
|
||||
for (var i = 0; i < $links.length; i = ++i) {
|
||||
addToAlbum($($links[i]));
|
||||
if ($links[i] === $link[0]) {
|
||||
imageNumber = i;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if ($link.attr('rel') === 'lightbox') {
|
||||
// If image is not part of a set
|
||||
addToAlbum($link);
|
||||
} else {
|
||||
// If image is part of a set
|
||||
$links = $($link.prop('tagName') + '[rel="' + $link.attr('rel') + '"]');
|
||||
for (var j = 0; j < $links.length; j = ++j) {
|
||||
addToAlbum($($links[j]));
|
||||
if ($links[j] === $link[0]) {
|
||||
imageNumber = j;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Position Lightbox
|
||||
var top = $window.scrollTop() + this.options.positionFromTop;
|
||||
var left = $window.scrollLeft();
|
||||
this.$lightbox.css({
|
||||
top: top + 'px',
|
||||
left: left + 'px'
|
||||
}).fadeIn(this.options.fadeDuration);
|
||||
|
||||
// Disable scrolling of the page while open
|
||||
if (this.options.disableScrolling) {
|
||||
$('body').addClass('lb-disable-scrolling');
|
||||
}
|
||||
|
||||
this.changeImage(imageNumber);
|
||||
};
|
||||
|
||||
// Hide most UI elements in preparation for the animated resizing of the lightbox.
|
||||
Lightbox.prototype.changeImage = function(imageNumber) {
|
||||
var self = this;
|
||||
var filename = this.album[imageNumber].link;
|
||||
var filetype = filename.split('.').slice(-1)[0];
|
||||
var $image = this.$lightbox.find('.lb-image');
|
||||
|
||||
// Disable keyboard nav during transitions
|
||||
this.disableKeyboardNav();
|
||||
|
||||
// Show loading state
|
||||
this.$overlay.fadeIn(this.options.fadeDuration);
|
||||
$('.lb-loader').fadeIn('slow');
|
||||
this.$lightbox.find('.lb-image, .lb-nav, .lb-prev, .lb-next, .lb-dataContainer, .lb-numbers, .lb-caption').hide();
|
||||
this.$outerContainer.addClass('animating');
|
||||
|
||||
// When image to show is preloaded, we send the width and height to sizeContainer()
|
||||
var preloader = new Image();
|
||||
preloader.onload = function() {
|
||||
var $preloader;
|
||||
var imageHeight;
|
||||
var imageWidth;
|
||||
var maxImageHeight;
|
||||
var maxImageWidth;
|
||||
var windowHeight;
|
||||
var windowWidth;
|
||||
|
||||
$image.attr({
|
||||
'alt': self.album[imageNumber].alt,
|
||||
'src': filename
|
||||
});
|
||||
|
||||
$preloader = $(preloader);
|
||||
|
||||
$image.width(preloader.width);
|
||||
$image.height(preloader.height);
|
||||
windowWidth = $(window).width();
|
||||
windowHeight = $(window).height();
|
||||
|
||||
// Calculate the max image dimensions for the current viewport.
|
||||
// Take into account the border around the image and an additional 10px gutter on each side.
|
||||
maxImageWidth = windowWidth - self.containerPadding.left - self.containerPadding.right - self.imageBorderWidth.left - self.imageBorderWidth.right - 20;
|
||||
maxImageHeight = windowHeight - self.containerPadding.top - self.containerPadding.bottom - self.imageBorderWidth.top - self.imageBorderWidth.bottom - self.options.positionFromTop - 70;
|
||||
|
||||
/*
|
||||
Since many SVGs have small intrinsic dimensions, but they support scaling
|
||||
up without quality loss because of their vector format, max out their
|
||||
size.
|
||||
*/
|
||||
if (filetype === 'svg') {
|
||||
$image.width(maxImageWidth);
|
||||
$image.height(maxImageHeight);
|
||||
}
|
||||
|
||||
// Fit image inside the viewport.
|
||||
if (self.options.fitImagesInViewport) {
|
||||
|
||||
// Check if image size is larger then maxWidth|maxHeight in settings
|
||||
if (self.options.maxWidth && self.options.maxWidth < maxImageWidth) {
|
||||
maxImageWidth = self.options.maxWidth;
|
||||
}
|
||||
if (self.options.maxHeight && self.options.maxHeight < maxImageHeight) {
|
||||
maxImageHeight = self.options.maxHeight;
|
||||
}
|
||||
|
||||
} else {
|
||||
maxImageWidth = self.options.maxWidth || preloader.width || maxImageWidth;
|
||||
maxImageHeight = self.options.maxHeight || preloader.height || maxImageHeight;
|
||||
}
|
||||
|
||||
// Is the current image's width or height is greater than the maxImageWidth or maxImageHeight
|
||||
// option than we need to size down while maintaining the aspect ratio.
|
||||
if ((preloader.width > maxImageWidth) || (preloader.height > maxImageHeight)) {
|
||||
if ((preloader.width / maxImageWidth) > (preloader.height / maxImageHeight)) {
|
||||
imageWidth = maxImageWidth;
|
||||
imageHeight = parseInt(preloader.height / (preloader.width / imageWidth), 10);
|
||||
$image.width(imageWidth);
|
||||
$image.height(imageHeight);
|
||||
} else {
|
||||
imageHeight = maxImageHeight;
|
||||
imageWidth = parseInt(preloader.width / (preloader.height / imageHeight), 10);
|
||||
$image.width(imageWidth);
|
||||
$image.height(imageHeight);
|
||||
}
|
||||
}
|
||||
self.sizeContainer($image.width(), $image.height());
|
||||
};
|
||||
|
||||
// Preload image before showing
|
||||
preloader.src = this.album[imageNumber].link;
|
||||
this.currentImageIndex = imageNumber;
|
||||
};
|
||||
|
||||
// Stretch overlay to fit the viewport
|
||||
Lightbox.prototype.sizeOverlay = function() {
|
||||
var self = this;
|
||||
/*
|
||||
We use a setTimeout 0 to pause JS execution and let the rendering catch-up.
|
||||
Why do this? If the `disableScrolling` option is set to true, a class is added to the body
|
||||
tag that disables scrolling and hides the scrollbar. We want to make sure the scrollbar is
|
||||
hidden before we measure the document width, as the presence of the scrollbar will affect the
|
||||
number.
|
||||
*/
|
||||
setTimeout(function() {
|
||||
self.$overlay
|
||||
.width($(document).width())
|
||||
.height($(document).height());
|
||||
|
||||
}, 0);
|
||||
};
|
||||
|
||||
// Animate the size of the lightbox to fit the image we are showing
|
||||
// This method also shows the the image.
|
||||
Lightbox.prototype.sizeContainer = function(imageWidth, imageHeight) {
|
||||
var self = this;
|
||||
|
||||
var oldWidth = this.$outerContainer.outerWidth();
|
||||
var oldHeight = this.$outerContainer.outerHeight();
|
||||
var newWidth = imageWidth + this.containerPadding.left + this.containerPadding.right + this.imageBorderWidth.left + this.imageBorderWidth.right;
|
||||
var newHeight = imageHeight + this.containerPadding.top + this.containerPadding.bottom + this.imageBorderWidth.top + this.imageBorderWidth.bottom;
|
||||
|
||||
function postResize() {
|
||||
self.$lightbox.find('.lb-dataContainer').width(newWidth);
|
||||
self.$lightbox.find('.lb-prevLink').height(newHeight);
|
||||
self.$lightbox.find('.lb-nextLink').height(newHeight);
|
||||
|
||||
// Set focus on one of the two root nodes so keyboard events are captured.
|
||||
self.$overlay.focus();
|
||||
|
||||
self.showImage();
|
||||
}
|
||||
|
||||
if (oldWidth !== newWidth || oldHeight !== newHeight) {
|
||||
this.$outerContainer.animate({
|
||||
width: newWidth,
|
||||
height: newHeight
|
||||
}, this.options.resizeDuration, 'swing', function() {
|
||||
postResize();
|
||||
});
|
||||
} else {
|
||||
postResize();
|
||||
}
|
||||
};
|
||||
|
||||
// Display the image and its details and begin preload neighboring images.
|
||||
Lightbox.prototype.showImage = function() {
|
||||
this.$lightbox.find('.lb-loader').stop(true).hide();
|
||||
this.$lightbox.find('.lb-image').fadeIn(this.options.imageFadeDuration);
|
||||
|
||||
this.updateNav();
|
||||
this.updateDetails();
|
||||
this.preloadNeighboringImages();
|
||||
this.enableKeyboardNav();
|
||||
};
|
||||
|
||||
// Display previous and next navigation if appropriate.
|
||||
Lightbox.prototype.updateNav = function() {
|
||||
// Check to see if the browser supports touch events. If so, we take the conservative approach
|
||||
// and assume that mouse hover events are not supported and always show prev/next navigation
|
||||
// arrows in image sets.
|
||||
var alwaysShowNav = false;
|
||||
try {
|
||||
document.createEvent('TouchEvent');
|
||||
alwaysShowNav = (this.options.alwaysShowNavOnTouchDevices) ? true : false;
|
||||
} catch (e) {}
|
||||
|
||||
this.$lightbox.find('.lb-nav').show();
|
||||
|
||||
if (this.album.length > 1) {
|
||||
if (this.options.wrapAround) {
|
||||
if (alwaysShowNav) {
|
||||
this.$lightbox.find('.lb-prev, .lb-next').css('opacity', '1');
|
||||
}
|
||||
this.$lightbox.find('.lb-prev, .lb-next').show();
|
||||
} else {
|
||||
if (this.currentImageIndex > 0) {
|
||||
this.$lightbox.find('.lb-prev').show();
|
||||
if (alwaysShowNav) {
|
||||
this.$lightbox.find('.lb-prev').css('opacity', '1');
|
||||
}
|
||||
}
|
||||
if (this.currentImageIndex < this.album.length - 1) {
|
||||
this.$lightbox.find('.lb-next').show();
|
||||
if (alwaysShowNav) {
|
||||
this.$lightbox.find('.lb-next').css('opacity', '1');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Display caption, image number, and closing button.
|
||||
Lightbox.prototype.updateDetails = function() {
|
||||
var self = this;
|
||||
|
||||
// Enable anchor clicks in the injected caption html.
|
||||
// Thanks Nate Wright for the fix. @https://github.com/NateWr
|
||||
if (typeof this.album[this.currentImageIndex].title !== 'undefined' &&
|
||||
this.album[this.currentImageIndex].title !== '') {
|
||||
var $caption = this.$lightbox.find('.lb-caption');
|
||||
if (this.options.sanitizeTitle) {
|
||||
$caption.text(this.album[this.currentImageIndex].title);
|
||||
} else {
|
||||
$caption.html(this.album[this.currentImageIndex].title);
|
||||
}
|
||||
$caption.fadeIn('fast');
|
||||
}
|
||||
|
||||
if (this.album.length > 1 && this.options.showImageNumberLabel) {
|
||||
var labelText = this.imageCountLabel(this.currentImageIndex + 1, this.album.length);
|
||||
this.$lightbox.find('.lb-number').text(labelText).fadeIn('fast');
|
||||
} else {
|
||||
this.$lightbox.find('.lb-number').hide();
|
||||
}
|
||||
|
||||
this.$outerContainer.removeClass('animating');
|
||||
|
||||
this.$lightbox.find('.lb-dataContainer').fadeIn(this.options.resizeDuration, function() {
|
||||
return self.sizeOverlay();
|
||||
});
|
||||
};
|
||||
|
||||
// Preload previous and next images in set.
|
||||
Lightbox.prototype.preloadNeighboringImages = function() {
|
||||
if (this.album.length > this.currentImageIndex + 1) {
|
||||
var preloadNext = new Image();
|
||||
preloadNext.src = this.album[this.currentImageIndex + 1].link;
|
||||
}
|
||||
if (this.currentImageIndex > 0) {
|
||||
var preloadPrev = new Image();
|
||||
preloadPrev.src = this.album[this.currentImageIndex - 1].link;
|
||||
}
|
||||
};
|
||||
|
||||
Lightbox.prototype.enableKeyboardNav = function() {
|
||||
this.$lightbox.on('keyup.keyboard', $.proxy(this.keyboardAction, this));
|
||||
this.$overlay.on('keyup.keyboard', $.proxy(this.keyboardAction, this));
|
||||
};
|
||||
|
||||
Lightbox.prototype.disableKeyboardNav = function() {
|
||||
this.$lightbox.off('.keyboard');
|
||||
this.$overlay.off('.keyboard');
|
||||
};
|
||||
|
||||
Lightbox.prototype.keyboardAction = function(event) {
|
||||
var KEYCODE_ESC = 27;
|
||||
var KEYCODE_LEFTARROW = 37;
|
||||
var KEYCODE_RIGHTARROW = 39;
|
||||
|
||||
var keycode = event.keyCode;
|
||||
if (keycode === KEYCODE_ESC) {
|
||||
// Prevent bubbling so as to not affect other components on the page.
|
||||
event.stopPropagation();
|
||||
this.end();
|
||||
} else if (keycode === KEYCODE_LEFTARROW) {
|
||||
if (this.currentImageIndex !== 0) {
|
||||
this.changeImage(this.currentImageIndex - 1);
|
||||
} else if (this.options.wrapAround && this.album.length > 1) {
|
||||
this.changeImage(this.album.length - 1);
|
||||
}
|
||||
} else if (keycode === KEYCODE_RIGHTARROW) {
|
||||
if (this.currentImageIndex !== this.album.length - 1) {
|
||||
this.changeImage(this.currentImageIndex + 1);
|
||||
} else if (this.options.wrapAround && this.album.length > 1) {
|
||||
this.changeImage(0);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Closing time. :-(
|
||||
Lightbox.prototype.end = function() {
|
||||
this.disableKeyboardNav();
|
||||
$(window).off('resize', this.sizeOverlay);
|
||||
this.$lightbox.fadeOut(this.options.fadeDuration);
|
||||
this.$overlay.fadeOut(this.options.fadeDuration);
|
||||
|
||||
if (this.options.disableScrolling) {
|
||||
$('body').removeClass('lb-disable-scrolling');
|
||||
}
|
||||
};
|
||||
|
||||
return new Lightbox();
|
||||
}));
|
||||
Reference in New Issue
Block a user