Browse Source

first init

bob
P.BARRY 10 years ago
commit
30e438aa32
13 changed files with 898 additions and 0 deletions
  1. 30
      .gitignore
  2. 116
      app.js
  3. 93
      bin/www
  4. 23
      package.json
  5. 77
      routes/index.js
  6. 9
      routes/users.js
  7. 63
      tools/tools-gphoto2.js
  8. 153
      tools/tools-photobooth.js
  9. 5
      tools/tools-test.js
  10. 3
      views/error.ejs
  11. 161
      views/index.ejs
  12. 72
      views/index_back.ejs
  13. 93
      views/view.ejs

30
.gitignore

@ -0,0 +1,30 @@
# Logs
logs
*.log
# Runtime data
pids
*.pid
*.seed
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# node-waf configuration
.lock-wscript
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
# Dependency directory
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git-
node_modules
# Debug log from npm
npm-debug.log

116
app.js

@ -0,0 +1,116 @@
var BOB_mod_path = require('path');
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var BOB_cfg_config = BOB_initConfig();
var routes = require('./routes/index')(BOB_cfg_config);
var users = require('./routes/users');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
// uncomment after placing your favicon in /public
//app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', routes);
app.use('/users', users);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
app.setSocketIo = function(pSocketIo) {
BOB_cfg_config.io = pSocketIo;
pSocketIo.on('connection', function(socket){
console.log('New client connected', socket.id);
socket.on('event', function(data){
console.log("event");
});
socket.on('disconnect', function(){
console.log("disconnect");
});
});
}
module.exports = app;
function BOB_initConfig() {
// Config
var cfgConfig = {
background : '#ffffff',
margins : 0.01,
style : 'default',
nbPicture : 4,
cropSize : {
width : 2000,
height : 2500
},
pictNames : [],
layout : [],
booths : {},
paths : {
final : "",
template : "",
prebuilt : "",
original : ""
}
};
// Init PATH
cfgConfig.paths.final = BOB_mod_path.resolve(__dirname, './public/img/final');
cfgConfig.paths.final_ld = BOB_mod_path.resolve(__dirname, './public/img/final_ld');
cfgConfig.paths.prebuilt = BOB_mod_path.resolve(__dirname, './public/img/prebuilt');
cfgConfig.paths.template = BOB_mod_path.resolve(__dirname, './public/img/template');
cfgConfig.paths.original = BOB_mod_path.resolve(__dirname, './public/img/original');
// Init pinctures names
for( var index = 0; index < cfgConfig.nbPicture; index ++ ) {
(function(pId) {
cfgConfig.pictNames.push('pict_'+pId+'.jpg');
})(index);
}
return cfgConfig;
}

93
bin/www

@ -0,0 +1,93 @@
#!/usr/bin/env node
/**
* Module dependencies.
*/
var app = require('../app');
var debug = require('debug')('bobinoscope:server');
var http = require('http');
/**
* Get port from environment and store in Express.
*/
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
/**
* Create HTTP server.
*/
var server = http.createServer(app);
var io = require('socket.io')(server);
app.setSocketIo(io);
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
/**
* Normalize a port into a number, string, or false.
*/
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) {
// named pipe
return val;
}
if (port >= 0) {
// port number
return port;
}
return false;
}
/**
* Event listener for HTTP server "error" event.
*/
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}
/**
* Event listener for HTTP server "listening" event.
*/
function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}

23
package.json

@ -0,0 +1,23 @@
{
"name": "bobinoscope",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {
"async": "~0.9.0",
"body-parser": "~1.12.0",
"cookie-parser": "~1.3.4",
"debug": "~2.1.1",
"ejs": "~2.3.1",
"express": "~4.12.2",
"gamepad": "^1.0.2",
"gm": "~1.17.0",
"gphoto2": "~0.1.7",
"mkdirp": "~0.5.0",
"morgan": "~1.5.1",
"serve-favicon": "~2.2.0",
"socket.io": "~1.3.5"
}
}

77
routes/index.js

@ -0,0 +1,77 @@
var BOB_mod_express = require('express');
var BOB_mod_router = BOB_mod_express.Router();
var BOB_mod_path = require('path');
var BOB_mod_mkdirp = require('mkdirp');
var BOB_tol_gphotos = null;
var BOB_tol_booth = null;
var BOB_cfg_config = null;
var BOB_var_boothInProgress = 0;
var BOB_var_gamepad = require("gamepad");
/* GET home page. */
BOB_mod_router.get('/bobinoscope', function(req, res, next) {
res.render('index', { title: 'Express' });
});
/* GET view page. */
BOB_mod_router.get('/', function(req, res, next) {
res.render('view', {});
});
BOB_mod_router.get('/booth/build/:boothId', function(req, res, next) {
BOB_var_boothInProgress += 1;
BOB_cfg_config.io.emit('boothState');
BOB_tol_booth.buildBooth(req.params.boothId, function(pErr) {
BOB_cfg_config.io.emit('boothState');
BOB_var_boothInProgress -= 1;
res.send(pErr);
});
})
BOB_mod_router.get('/booth/list/:from', function(req, res, next) {
BOB_tol_booth.getBoothList(req.params.from, function(pErr, pList) {
res.json({error: pErr, booths: pList, inProgress : BOB_var_boothInProgress});
})
})
/* GET home page. */
BOB_mod_router.get('/dslr/takepicture/:boothId/:pictId', function(req, res, next) {
// BOB_cfg_config.io.emit('boothState');
BOB_tol_gphotos.takePicture(req.params.boothId, req.params.pictId, function(pErr) {
res.json({ error: pErr, data : null});
})
});
/* GET view page. */
BOB_mod_router.get('/download/final/hd/:pictId', function(req, res, next) {
res.download('public/img/final/'+req.params.pictId);
});
// Initialize the library
BOB_var_gamepad.init()
// List the state of all currently attached devices
for (var i = 0, l = BOB_var_gamepad.numDevices(); i < l; i++) {
console.log(i, BOB_var_gamepad.deviceAtIndex());
}
// Create a game loop and poll for events
setInterval(BOB_var_gamepad.processEvents, 16);
// Scan for new gamepads as a slower rate
setInterval(BOB_var_gamepad.detectDevices, 500);
// Listen for button down events on all gamepads
BOB_var_gamepad.on("down", function (pId, pNum) {
BOB_cfg_config.io.emit('boothClick', {
id : pId,
num : pNum
});
})
module.exports = function(pConfig) {
BOB_cfg_config = pConfig;
BOB_tol_gphotos = require('../tools/tools-gphoto2')(pConfig);
BOB_tol_booth = require('../tools/tools-photobooth')(pConfig);
return BOB_mod_router;
}

9
routes/users.js

@ -0,0 +1,9 @@
var express = require('express');
var router = express.Router();
/* GET users listing. */
router.get('/', function(req, res, next) {
res.send('respond with a resource');
});
module.exports = router;

63
tools/tools-gphoto2.js

@ -0,0 +1,63 @@
var BOB_mod_gphoto2 = require('gphoto2');
var BOB_var_gphoto = new BOB_mod_gphoto2.GPhoto2();
var BOB_mod_fs = require('fs');
var BOB_mod_path = require('path');
var BOB_mod_mkdirp = require('mkdirp');
var BOB_cfg_config = null;
var BOB_var_camera = null;
var BOB_module = {};
function BOB_upCameraReference(pCallback) {
// List cameras / assign list item to variable to use below options
if( BOB_var_camera === null ) {
BOB_var_gphoto.list(function (list) {
if (list.length === 0) {
return pCallback();
} else {
BOB_var_camera = list[0];
console.log(BOB_var_camera.model);
return pCallback();
}
})
} else {
return pCallback();
}
}
BOB_module.getConfig = function(pCallback) {
BOB_var_camera.getConfig(pCallback);
}
BOB_module.takePicture = function(pBoothId, pPictId, pCallback) {
var destPath = BOB_mod_path.join(BOB_cfg_config.paths.original, pBoothId);
var pictPath = BOB_mod_path.join(destPath, BOB_cfg_config.pictNames[pPictId]);
BOB_upCameraReference(function() {
if( BOB_var_camera === null ) {
return pCallback("No camera found");
} else {
BOB_var_camera.takePicture({download: true}, function (pErr, pData) {
// If error occurs
if( pErr ) {
return pCallback(pErr)
// Else write file on ddisk
} else {
BOB_mod_mkdirp(destPath, function() {
BOB_mod_fs.writeFile(pictPath, pData, function(pErr) {
return pCallback(pErr, pictPath)
});
})
}
});
}
})
}
module.exports = function(pConfig) {
BOB_cfg_config = pConfig;
return BOB_module;
}

153
tools/tools-photobooth.js

@ -0,0 +1,153 @@
var BOB_mod_gm = require('gm').subClass({ imageMagick: true });
var BOB_mod_async = require('async');
var BOB_mod_path = require('path');
var BOB_mod_fs = require('fs');
var BOB_mod_mkdirp = require('mkdirp');
var BOB_cfg_config = null;
var BOB_module = {};
BOB_module.getBoothList = function(pFrom, pCallback) {
BOB_mod_fs.readdir(BOB_cfg_config.paths.final, function(pErr, pBoothList) {
var boothList = pBoothList.sort();
boothList = boothList.splice(boothList.indexOf(pFrom) + 1);
pCallback(pErr, boothList);
})
}
BOB_module.buildBooth = function(pBoothId, pCallback) {
var index = 0;
var funcResizeArray = [];
BOB_mod_mkdirp.sync(BOB_mod_path.join(BOB_cfg_config.paths.prebuilt, pBoothId));
BOB_cfg_config.pictNames.forEach(function(pPictName) {
funcResizeArray.push(function(pCb) {
var srcPict = BOB_mod_path.join(BOB_cfg_config.paths.original, pBoothId, pPictName);
var dstPict = BOB_mod_path.join(BOB_cfg_config.paths.prebuilt, pBoothId, pPictName);
console.log("Resizing "+dstPict);
BOB_mod_gm(srcPict)
.autoOrient()
.gravity('Center')
.resize(BOB_cfg_config.cropSize.width, BOB_cfg_config.cropSize.height, "^")
.crop(BOB_cfg_config.cropSize.width, BOB_cfg_config.cropSize.height)
// .modulate(100, 0)
// .contrast(+2)
.write(dstPict, function(pErr) {
pCb()
})
})
})
BOB_mod_async.parallel(
funcResizeArray,
function(pErr, pData) {
console.log("Building booth")
switch(BOB_cfg_config.style) {
default :
BOB_generateBooth(pBoothId, 'default', pCallback);
}
}
)
}
function BOB_generateBooth(pBoothId, pType, pCallback) {
var prebuiltPath = BOB_mod_path.join(BOB_cfg_config.paths.prebuilt, pBoothId);
var finalPict = BOB_mod_path.join(BOB_cfg_config.paths.final, pBoothId+".jpg");
var finalLdPict = BOB_mod_path.join(BOB_cfg_config.paths.final_ld, pBoothId+".jpg");
var outPict = BOB_mod_gm(BOB_cfg_config.booths[pType].template);
var printedDate = new Date(parseInt(pBoothId));
outPict.fill(BOB_cfg_config.background);
outPict.drawRectangle(0, 0, BOB_cfg_config.booths[pType].resolution.width, BOB_cfg_config.booths[pType].resolution.height);
BOB_cfg_config.pictNames.forEach(function(pPictName, pIndex) {
var cmdDraw = 'image Over';
cmdDraw += ' '+BOB_cfg_config.booths[pType].layout[pIndex].x;
cmdDraw += ','+BOB_cfg_config.booths[pType].layout[pIndex].y;
cmdDraw += ' '+BOB_cfg_config.booths[pType].layout[pIndex].width;
cmdDraw += ','+BOB_cfg_config.booths[pType].layout[pIndex].height;
cmdDraw += ' '+BOB_mod_path.join(prebuiltPath, pPictName);
console.log(cmdDraw);
outPict.draw(cmdDraw);
})
outPict.fill("#000000");
outPict.pointSize(40);
outPict.draw('text 1900,3850 "'+printedDate.toUTCString()+'"');
outPict.write(finalPict, function (pErr) {
BOB_mod_gm(finalPict)
.resize(600, null)
.write(finalLdPict, function(pErr) {
pCallback(pErr);
})
});
}
module.exports = function(pConfig) {
BOB_cfg_config = pConfig;
BOB_updateConfig();
return BOB_module;
}
function BOB_updateConfig() {
BOB_mod_fs.readdir(BOB_cfg_config.paths.template, function(pErr, pFiles) {
if( pErr ) {
console.log(pErr);
} else {
BOB_mod_async.map(pFiles,
function(pFile, pCb) {
// Get name of template
var boothName = pFile.split('.')[0];
// Init layouts object for the template
BOB_cfg_config.booths[boothName] = {
name : boothName,
template : BOB_mod_path.join(BOB_cfg_config.paths.template, pFile),
resolution : { width : 0, height : 0 },
layout : []
};
// Get reslution of current template
BOB_mod_gm(BOB_cfg_config.booths[boothName].template).size(function(pErr, pValue){
if( pErr ) {
console.log(pErr);
} else {
BOB_cfg_config.booths[boothName].resolution = pValue;
BOB_generatePictLayout(boothName);
}
pCb();
})
},
function(pErr) {
})
}
})
}
function BOB_generatePictLayout(pBoothName) {
var index = 0;
var marginX = 50;
var marginY = 50;
var pictWidth = ( BOB_cfg_config.booths[pBoothName].resolution.width - 3 * marginX ) / 2;
var pictHeight = parseInt(pictWidth * BOB_cfg_config.cropSize.height / BOB_cfg_config.cropSize.width);
BOB_cfg_config.pictNames.forEach(function(pPictName, pIndex) {
BOB_cfg_config.booths[pBoothName].layout.push({
x : marginX + (marginX + pictWidth) * ( pIndex % 2 ),
y : marginY + (marginY + pictHeight) * parseInt( pIndex / 2 ),
width : pictWidth,
height : pictHeight
})
})
console.log("INIT DONE");
}

5
tools/tools-test.js

@ -0,0 +1,5 @@
module.exports = function(pConfig) {
console.log("TOOL TEST", pConfig);
}

3
views/error.ejs

@ -0,0 +1,3 @@
<h1><%= message %></h1>
<h2><%= error.status %></h2>
<pre><%= error.stack %></pre>

161
views/index.ejs

@ -0,0 +1,161 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title><%= title %></title>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
<link rel="stylesheet" href="/css/cover.css"/>
</head>
<body>
<div class="site-wrapper">
<div class="site-wrapper-inner">
<div class="cover-container">
<div class="inner cover" style="height:900px;position:relative">
<div id="idBoothPanel" style="position:absolute;width:100%">
<div style="height:180px">
<div id="idViewTrigger">
<h1 class="cover-heading">Prends ta face !</h1>
</div>
<div id="idViewCountdown" style="font-size:15em; display:none"></div>
</div>
<div style="font-size:8em; height:600px; display:none">
Faites<br/>
<span style="font-size:2em">le chat</span>
</div>
</div>
<div id="idPictPreview" style="position:absolute;display:none;width:100%">
<img src="/img/test.jpgautoOrient.jpg" height="900px">
</div>
</div>
<div class="mastfoot">
<div class="inner">
<p>BW Bros.</p>
</div>
</div>
</div>
</div>
</div>
</body>
<!-- Latest compiled and minified JQuery -->
<script src="//code.jquery.com/jquery-1.11.2.min.js"></script>
<!-- Latest compiled and minified javaScript bootstrap-->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<!-- Getting the Socket.IO Client -->
<script src="https://cdn.socket.io/socket.io-1.3.4.js"></script>
</html>
<style type="text/css">
* {
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
</style>
<script type="text/javascript">
var socket = io('http://192.168.1.18:3000');
socket.on('connect', function() {
console.log("connect")
})
socket.on('boothClick', function(pData) {
BOB_runBooth();
});
BOB_var_context = {
boothOnGoing : false,
initTimer : 3,
onGoingTimer : 0,
boothId : null,
pictureId : 0
}
BOB_var_themes = [
"le chat",
"le cuir moustache",
"le roi",
"le bouffon",
"le moussailon",
"le geek",
"l'amoureux",
]
$(document).ready(function() {
$('#idBtnClick').click(function() {
BOB_runBooth();
})
})
function BOB_runBooth() {
if( BOB_var_context.boothOnGoing === false ) {
var currentDate = new Date();
BOB_var_context.boothOnGoing = true;
BOB_var_context.boothId = currentDate.getTime();
BOB_var_context.pictureId = 0;
BOB_var_context.onGoingTimer = BOB_var_context.initTimer;
$('#idViewTrigger').fadeOut(500, function() {
BOB_countdown();
});
}
}
function BOB_countdown() {
$('#idViewCountdown').fadeIn();
$('#idViewCountdown').html(BOB_var_context.onGoingTimer);
if( BOB_var_context.onGoingTimer > 0 ) {
setTimeout(function() {
BOB_var_context.onGoingTimer -= 1;
BOB_countdown();
}, 1000)
} else {
$('#idViewCountdown').html("Smile :-)");
BOB_takeThe1Pictures();
}
}
function BOB_displayPictPreview(pBoothId, pPictureId, pCallback) {
$('#idViewCountdown').html("");
$('#idPictPreview > img').attr('src', '/img/original/'+pBoothId+'/pict_'+pPictureId+'.jpg');
$('#idBoothPanel').fadeOut(50, function() {
$('#idPictPreview').show();
setTimeout(function() {
$('#idPictPreview').hide();
$('#idBoothPanel').fadeIn(50, function() {
pCallback()
})
}, 2000)
})
}
function BOB_takeThe1Pictures() {
$.get('/dslr/takepicture/'+BOB_var_context.boothId+'/'+BOB_var_context.pictureId, function(pResponse) {
console.log(pResponse);
BOB_displayPictPreview(BOB_var_context.boothId, BOB_var_context.pictureId, function() {
BOB_var_context.pictureId += 1;
if( BOB_var_context.pictureId < 4 ) {
BOB_var_context.onGoingTimer = BOB_var_context.initTimer;
BOB_countdown();
} else {
BOB_var_context.boothOnGoing = false;
$.get('/booth/build/'+BOB_var_context.boothId);
$('#idViewCountdown').fadeOut(500, function() {
$('#idViewTrigger').fadeIn();
});
}
})
})
}
</script>

72
views/index_back.ejs

@ -0,0 +1,72 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title><%= title %></title>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
<link rel="stylesheet" href="/css/cover.css"/>
</head>
<body>
<body>
<div class="site-wrapper">
<div class="site-wrapper-inner">
<div class="cover-container">
<div class="masthead clearfix">
<div class="inner">
<h3 class="masthead-brand">Bobinoscope</h3>
</div>
</div>
<div class="inner cover">
<h1 class="cover-heading">Prends ta face !</h1>
<p class="lead">
<a href="#" class="btn btn-lg btn-default" id="idBtnClick">Clic</a>
</p>
<img id="idDisplayImg" width="640px"/>
</div>
<div class="mastfoot">
<div class="inner">
<p>BW Bros.</p>
</div>
</div>
</div>
</div>
</div>
</body>
<!-- Latest compiled and minified JQuery -->
<script src="//code.jquery.com/jquery-1.11.2.min.js"></script>
<!-- Latest compiled and minified javaScript bootstrap-->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
</html>
<script type="text/javascript">
$(document).ready(function() {
$('#idBtnClick').click(function() {
BOB_takeThe4Pictures();
})
})
function BOB_takeThe4Pictures() {
var currentDate = new Date();
var pictId = 0;
var boothId = currentDate.getTime();
}
function BOB_takeOnePicture(pBoothId, pPictId) {
$.get('/dslr/takepicture', function(pResponse) {
$('#idDisplayImg').attr('src', pResponse.data);
})
}
</script>

93
views/view.ejs

@ -0,0 +1,93 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bobinoscope</title>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="/css/view.css"/>
</head>
<body>
<div id="idMain" style="width:400px; margin: auto">
<div id="idViewLoading">
<img src='/img/common/294.GIF'/>
</div>
<div id="idViewContainer">
</div>
</div>
</body>
<!-- Latest compiled and minified JQuery -->
<script src="//code.jquery.com/jquery-1.11.2.min.js"></script>
<!-- Latest compiled and minified javaScript bootstrap-->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<!-- Getting the Socket.IO Client -->
<script src="https://cdn.socket.io/socket.io-1.3.4.js"></script>
</html>
<script type="text/javascript">
var socket = io('http://192.168.1.18:3000');
socket.on('connect', function() {
console.log("connect")
})
socket.on('boothState', function (data) {
BOB_getBooths();
});
$(document).ready(function() {
BOB_getBooths();
if( $(window).width() < 400 ) {
$('#idMain').css('width' ,'100%');
}
})
var BOB_var_lastBooth = "0";
function BOB_getBooths() {
var boothList = $(".classBoothItem");
var jqBoothContainer = $('#idViewContainer');
$.get('/booth/list/'+BOB_var_lastBooth, function(pResponse) {
if( pResponse.inProgress > 0 ) {
$('#idViewLoading').fadeIn();
} else {
$('#idViewLoading').fadeOut();
}
pResponse.booths.forEach(function(pBoothName) {
var jqImg = $('<img>');
jqImg.css('width', '100%');
jqImg.css('opacity', '0');
jqImg.css('transition', 'opacity 1s');
jqImg.data('booth', pBoothName);
jqImg.attr('src', "/img/final_ld/"+pBoothName);
jqImg.addClass('classBoothItem');
jqImg.on('click', function() {
jqImg.css('opacity', '0.4');
if( confirm("Télécharger ?") ) {
window.open("/download/final/hd/"+pBoothName, "_blank");
}
jqImg.css('opacity', '1');
})
jqImg.on('load', function() {
jqImg.css('opacity', '1');
})
if( pBoothName.localeCompare(BOB_var_lastBooth) > 0 ) {
BOB_var_lastBooth = pBoothName;
}
jqBoothContainer.prepend(jqImg);
})
})
console.log('-----------------');
}
</script>
Loading…
Cancel
Save