nanogallery2
Version:
modern photo / video gallery and lightbox
276 lines (220 loc) • 9.8 kB
JavaScript
/**!
* @preserve nanogallery2 - NANOPHOTOSPROVIDER2 data provider
* Homepage: http://nanogallery2.nanostudio.org
* Sources: https://github.com/nanostudio-org/nanogallery2
*
* License: GPLv3 and commercial licence
*
*/
// ########################################################
// ##### nanogallery2 - module NANOPHOTOSPROVIDER2 #####
// ########################################################
(function (factory) {
"use strict";
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery', 'nanogallery2'], factory);
} else if (typeof exports === 'object' && typeof require === 'function') {
// Browserify
factory(require(['jquery', 'nanogallery2']));
} else {
// Browser globals
factory(jQuery);
}
}(function ($) {
// ;(function ($) {
jQuery.nanogallery2.data_nano_photos_provider2 = function (instance, fnName){
var G = instance; // current nanogallery2 instance
/** @function AlbumGetContent */
var AlbumGetContent = function(albumID, fnToCall, fnParam1, fnParam2) {
var albumIdx = NGY2Item.GetIdx(G, albumID);
// title is identical to ID (only for albums)
if( instance.I[albumIdx].title == '' ) {
instance.I[albumIdx].title = JsonConvertCharset(albumID);
}
// Build the URL
var url = G.O.dataProvider + '?albumID='+albumID; // which album
// all thumbnails sizes (for responsive display)
url += '&hxs=' + G.tn.settings.getH(G.GOM.curNavLevel, 'xs');
url += '&wxs=' + G.tn.settings.getW(G.GOM.curNavLevel, 'xs');
url += '&hsm=' + G.tn.settings.getH(G.GOM.curNavLevel, 'sm');
url += '&wsm=' + G.tn.settings.getW(G.GOM.curNavLevel, 'sm');
url += '&hme=' + G.tn.settings.getH(G.GOM.curNavLevel, 'me');
url += '&wme=' + G.tn.settings.getW(G.GOM.curNavLevel, 'me');
url += '&hla=' + G.tn.settings.getH(G.GOM.curNavLevel, 'la');
url += '&wla=' + G.tn.settings.getW(G.GOM.curNavLevel, 'la');
url += '&hxl=' + G.tn.settings.getH(G.GOM.curNavLevel, 'xl');
url += '&wxl=' + G.tn.settings.getW(G.GOM.curNavLevel, 'xl');
// url += '&wxs=' + G.tn.settings.width[G.GOM.curNavLevel].xs;
// url += '&hxs=' + G.tn.settings.height[G.GOM.curNavLevel].xs;
// url += '&wsm=' + G.tn.settings.width[G.GOM.curNavLevel].sm;
// url += '&hsm=' + G.tn.settings.height[G.GOM.curNavLevel].sm;
// url += '&wme=' + G.tn.settings.width[G.GOM.curNavLevel].me;
// url += '&hme=' + G.tn.settings.height[G.GOM.curNavLevel].me;
// url += '&wla=' + G.tn.settings.width[G.GOM.curNavLevel].la;
// url += '&hla=' + G.tn.settings.height[G.GOM.curNavLevel].la;
// url += '&wxl=' + G.tn.settings.width[G.GOM.curNavLevel].xl;
// url += '&hxl=' + G.tn.settings.height[G.GOM.curNavLevel].xl;
PreloaderDisplay( true );
jQuery.ajaxSetup({ cache: false });
jQuery.support.cors = true;
try {
var tId = setTimeout( function() {
// workaround to handle JSONP (cross-domain) errors
PreloaderDisplay(false);
NanoAlert(G, 'Could not retrieve nanoPhotosProvider2 data (timeout).');
}, 60000 );
if( G.O.debugMode ) { console.log('nanoPhotosProvider2 URL: ' + url); }
jQuery.getJSON(url, function(data, status, xhr) {
clearTimeout( tId );
PreloaderDisplay( false );
JsonParseData(albumIdx, data);
if( data.nano_status == 'ok' ) {
AlbumPostProcess( albumID );
if( fnToCall !== null && fnToCall !== undefined) {
fnToCall( fnParam1, fnParam2, null );
}
}
else {
NanoAlert(G, 'Could not retrieve nanoPhotosProvider2 data. Error: ' + data.nano_status + ' - ' + data.nano_message);
}
})
.fail( function(jqxhr, textStatus, error) {
clearTimeout( tId );
PreloaderDisplay( false );
var k=''
for(var key in jqxhr) {
k+= key + '=' + jqxhr[key] +'<br>';
}
var err = textStatus + ', ' + error + ' ' + k + '<br><br>URL:'+url;
NanoAlert(G, 'Could not retrieve nanoPhotosProvider2 data. Error: ' + err);
});
}
catch(e) {
NanoAlert(G, 'Could not retrieve nanoPhotosProvider2 data. Error: ' + e);
}
}
function JsonConvertCharset( str ) {
return decodeURIComponent(str);
// Pb %C3%A9 --> %E9
// in UTF-8: \u00e9=\xe9 (e9 = hex value)
// switch( G.O.dataCharset.toUpperCase() ) {
// case 'UTF-8': // Apache Windows
// return decodeURI(str); // do not use decodeURIComponent (would convert slash also)
// break;
// case 'Latin': // Apache Linux
// default :
// return escape(str);
// break;
// }
}
function JsonParseData(albumIdx, data) {
if( G.O.debugMode ) {
console.log('nanoPhotosProvider2 parse data:');
console.dir(data);
}
var foundAlbumID = false;
var nb = 0;
// loop each item
jQuery.each( data.album_content, function( i, item ){
// base URL where the images are stored
var baseURL = G.O.dataProvider.substring(0, G.O.dataProvider.indexOf('nano_photos_provider2.php'));
// image URL
var src = baseURL + JsonConvertCharset( item.src );
// item title
var title = item.title;
// item description ( '_' are replaced with ' ' )
var description = item.description.split('_').join(' ');
// item kind ('album' or 'image')
var kind = 'image';
if( item.kind !== undefined && item.kind.length > 0 ) {
kind = item.kind;
}
// item ID
var ID=item.ID;
var filterAlbum = false;
if( kind == 'album' ) {
// check if album name is filtered
if( !FilterAlbumName(title, ID) ) { filterAlbum = true; }
// on gallery initialization : if an album is defined, do not display sub-albums (not supported)
if( G.O.album != '' || G.O.photoset != '' ) { filterAlbum = true; }
}
// if( kind == 'image' || (kind == 'album' && FilterAlbumName(title, ID)) ) {
if( kind == 'image' || !filterAlbum ) {
var albumID = 0;
if( item.albumID !== undefined ) {
albumID = item.albumID;
foundAlbumID = true;
}
var tags = (item.tags === undefined) ? '' : item.tags;
var newItem = NGY2Item.New( G, title.split('_').join(' ') , description, ID, albumID, kind, tags );
newItem.setMediaURL( src, 'img');
// dominant colorS as a gif
if( item.dcGIF !== undefined ) {
newItem.imageDominantColors = 'data:image/gif;base64,' + item.dcGIF;
}
// dominant color as hex rgb value
if( item.dc !== undefined && item.dc !== '' ) {
newItem.imageDominantColor = item.dc;
}
if( kind == 'album' ) {
// number of items in album
newItem.numberItems = item.cnt;
}
else {
// image size
newItem.imageWidth = item.imgWidth;
newItem.imageHeight = item.imgHeight;
}
// item download URL
if( item.originalURL != '' ) {
newItem.downloadURL = baseURL+JsonConvertCharset(item.originalURL);
}
// retrieve responsive thumbnails urls and sizes
var cnl = G.GOM.curNavLevel; // current navigation level ('L1' or 'LN');
var l=['xs', 'sm', 'me', 'la', 'xl'];
for( var n = 0; n < l.length; n++ ) {
newItem.thumbs.url[cnl][l[n]] = baseURL + JsonConvertCharset(item.t_url[n]);
newItem.thumbs.width[cnl][l[n]] = parseInt(item.t_width[n]);
newItem.thumbs.height[cnl][l[n]] = parseInt(item.t_height[n]);
}
// post-process callback
var fu = G.O.fnProcessData;
if( fu !== null ) {
typeof fu == 'function' ? fu(newItem, G.O.dataProvider, data) : window[fu](newItem, G.O.dataProvider, data);
}
}
});
G.I[albumIdx].contentIsLoaded = true; // album's content is ready
}
// -----------
// Initialize
function Init() {
}
// shortcuts to NGY2Tools functions (with context)
var PreloaderDisplay = NGY2Tools.PreloaderDisplay.bind(G);
// var NanoAlert = NGY2Tools.NanoAlert.bind(G);
var NanoAlert = NGY2Tools.NanoAlert;
// var GetImageTitleFromURL = NGY2Tools.GetImageTitleFromURL.bind(G);
var FilterAlbumName = NGY2Tools.FilterAlbumName.bind(G);
var AlbumPostProcess = NGY2Tools.AlbumPostProcess.bind(G);
switch( fnName ){
case 'GetHiddenAlbums':
break;
case 'AlbumGetContent':
var albumID = arguments[2],
callback = arguments[3],
cbParam1 = arguments[4],
cbParam2 = arguments[5];
AlbumGetContent(albumID, callback, cbParam1, cbParam2);
break;
case 'Init':
Init();
break;
case '':
break;
}
};
// END NANOPHOTOSPROVIDER DATA SOURCE FOR NANOGALLERY2
// }( jQuery ));
}));