diff --git a/dist/main.js b/dist/main.js index 1fe7260..31e0f35 100644 Binary files a/dist/main.js and b/dist/main.js differ diff --git a/src/scripts/album.js b/src/scripts/album.js index 490a500..b7cc08a 100644 --- a/src/scripts/album.js +++ b/src/scripts/album.js @@ -3,402 +3,403 @@ * @copyright 2014 by Tobias Reich */ -album = { +album = {} - json: null, +album.json = null; - getID: function() { +album.getID = function() { - var id; + var id; - if (photo.json) id = photo.json.album; - else if (album.json) id = album.json.id; - else id = $(".album:hover, .album.active").attr("data-id"); + if (photo.json) id = photo.json.album; + else if (album.json) id = album.json.id; + else id = $('.album:hover, .album.active').attr('data-id'); - // Search - if (!id) id = $(".album:hover, .album.active").attr("data-id"); - if (!id) id = $(".photo:hover, .photo.active").attr("data-album-id"); + // Search + if (!id) id = $('.album:hover, .album.active').attr('data-id'); + if (!id) id = $('.photo:hover, .photo.active').attr('data-album-id'); - if (id) return id; - else return false; + if (id) return id; + else return false; - }, +} - load: function(albumID, refresh) { +album.load = function(albumID, refresh) { - var startTime, - params, - durationTime, - waitTime; + var startTime, + params, + durationTime, + waitTime; - password.get(albumID, function() { - - if (!refresh) { - loadingBar.show(); - lychee.animate(".album:nth-child(-n+50), .photo:nth-child(-n+50)", "contentZoomOut"); - lychee.animate(".divider", "fadeOut"); - } - - startTime = new Date().getTime(); - - params = "getAlbum&albumID=" + albumID + "&password=" + password.value; - lychee.api(params, function(data) { - - if (data==="Warning: Album private!") { - if (document.location.hash.replace("#", "").split("/")[1]!=undefined) { - // Display photo only - lychee.setMode("view"); - } else { - // Album not public - lychee.content.show(); - lychee.goto(""); - } - return false; - } - - if (data==="Warning: Wrong password!") { - album.load(albumID, refresh); - return false; - } - - album.json = data; - - // Calculate delay - durationTime = (new Date().getTime() - startTime); - if (durationTime>300) waitTime = 0; - else waitTime = 300 - durationTime; - - // Skip delay when refresh is true - // Skip delay when opening a blank Lychee - if (refresh===true) waitTime = 0; - if (!visible.albums()&&!visible.photo()&&!visible.album()) waitTime = 0; - - setTimeout(function() { - - view.album.init(); - - if (!refresh) { - lychee.animate(".album:nth-child(-n+50), .photo:nth-child(-n+50)", "contentZoomIn"); - view.header.mode("album"); - } - - }, waitTime); - - }); - - }); - - }, - - parse: function() { - - if (!album.json.title) album.json.title = "Untitled"; - - }, - - add: function() { - - var title, - params, - buttons, - isNumber = function(n) { return !isNaN(parseFloat(n)) && isFinite(n) }; - - buttons = [ - ["Create Album", function() { - - title = $(".message input.text").val(); - - if (title.length===0) title = "Untitled"; - - modal.close(); - - params = "addAlbum&title=" + escape(encodeURI(title)); - lychee.api(params, function(data) { - - if (data===true) data = 1; // Avoid first album to be true - - if (data!==false&&isNumber(data)) { - albums.refresh(); - lychee.goto(data); - } else { - lychee.error(null, params, data); - } - - }); - - }], - ["Cancel", function() {}] - ]; - - modal.show("New Album", "Enter a title for this album: ", buttons); - - }, - - delete: function(albumIDs) { - - var params, - buttons, - albumTitle; - - if (!albumIDs) return false; - if (albumIDs instanceof Array===false) albumIDs = [albumIDs]; - - buttons = [ - ["", function() { - - params = "deleteAlbum&albumIDs=" + albumIDs; - lychee.api(params, function(data) { - - if (visible.albums()) { - - albumIDs.forEach(function(id) { - albums.json.num--; - view.albums.content.delete(id); - delete albums.json.content[id]; - }); - - } else { - - albums.refresh(); - lychee.goto(""); - - } - - if (data!==true) lychee.error(null, params, data); - - }); - - }], - ["", function() {}] - ]; - - if (albumIDs.toString()==="0") { - - buttons[0][0] = "Clear Unsorted"; - buttons[1][0] = "Keep Unsorted"; - - modal.show("Clear Unsorted", "Are you sure you want to delete all photos from 'Unsorted'?
This action can't be undone!", buttons); - - } else if (albumIDs.length===1) { - - buttons[0][0] = "Delete Album and Photos"; - buttons[1][0] = "Keep Album"; - - // Get title - if (album.json) albumTitle = album.json.title; - else if (albums.json) albumTitle = albums.json.content[albumIDs].title; - - modal.show("Delete Album", "Are you sure you want to delete the album '" + albumTitle + "' and all of the photos it contains? This action can't be undone!", buttons); - - } else { - - buttons[0][0] = "Delete Albums and Photos"; - buttons[1][0] = "Keep Albums"; - - modal.show("Delete Albums", "Are you sure you want to delete all " + albumIDs.length + " selected albums and all of the photos they contain? This action can't be undone!", buttons); + password.get(albumID, function() { + if (!refresh) { + lychee.animate('.album:nth-child(-n+50), .photo:nth-child(-n+50)', 'contentZoomOut'); + lychee.animate('.divider', 'fadeOut'); } - }, - - setTitle: function(albumIDs) { - - var oldTitle = "", - newTitle, - params, - buttons; - - if (!albumIDs) return false; - if (albumIDs instanceof Array===false) albumIDs = [albumIDs]; - - if (albumIDs.length===1) { - // Get old title if only one album is selected - if (album.json) oldTitle = album.json.title; - else if (albums.json) oldTitle = albums.json.content[albumIDs].title; - if (!oldTitle) oldTitle = ""; - oldTitle = oldTitle.replace("'", "'"); - } - - buttons = [ - ["Set Title", function() { - - // Get input - newTitle = $(".message input.text").val(); - - // Remove html from input - newTitle = lychee.removeHTML(newTitle); - - // Set to Untitled when empty - newTitle = (newTitle==="") ? "Untitled" : newTitle; - - if (visible.album()) { - - album.json.title = newTitle; - view.album.title(); - - if (albums.json) { - var id = albumIDs[0]; - albums.json.content[id].title = newTitle; - } - - } else if (visible.albums()) { - - albumIDs.forEach(function(id) { - albums.json.content[id].title = newTitle; - view.albums.content.title(id); - }); - - } - - params = "setAlbumTitle&albumIDs=" + albumIDs + "&title=" + escape(encodeURI(newTitle)); - lychee.api(params, function(data) { - - if (data!==true) lychee.error(null, params, data); - - }); - - }], - ["Cancel", function() {}] - ]; - - if (albumIDs.length===1) modal.show("Set Title", "Enter a new title for this album: ", buttons); - else modal.show("Set Titles", "Enter a title for all " + albumIDs.length + " selected album: ", buttons); - - }, - - setDescription: function(photoID) { - - var oldDescription = album.json.description.replace("'", "'"), - description, - params, - buttons; - - buttons = [ - ["Set Description", function() { - - // Get input - description = $(".message input.text").val(); - - // Remove html from input - description = lychee.removeHTML(description); - - if (visible.album()) { - album.json.description = description; - view.album.description(); - } - - params = "setAlbumDescription&albumID=" + photoID + "&description=" + escape(encodeURI(description)); - lychee.api(params, function(data) { - - if (data!==true) lychee.error(null, params, data); - - }); - - }], - ["Cancel", function() {}] - ]; - - modal.show("Set Description", "Please enter a description for this album: ", buttons); - - }, - - setPublic: function(albumID, e) { - - var params, - password = "", - listed = false, - downloadable = false; - - albums.refresh(); - - if (!visible.message()&&album.json.public==0) { - - modal.show("Share Album", "This album will be shared with the following properties:

Visible

Listed to visitors of your Lychee.

Downloadable

Visitors of your Lychee can download this album.

Password protected

Only accessible with a valid password.

", [["Share Album", function() { album.setPublic(album.getID(), e) }], ["Cancel", function() {}]], -170); - - $(".message .choice input[name='password']").on("change", function() { - - if ($(this).prop('checked')===true) $(".message .choice input.text").show(); - else $(".message .choice input.text").hide(); - - }); - - return true; - - } - - if (visible.message()) { - - if ($(".message .choice input[name='password']:checked").val()==="password") { - password = md5($(".message input.text").val()); - album.json.password = 1; - } else { - password = ""; - album.json.password = 0; - } - - if ($(".message .choice input[name='listed']:checked").val()==="listed") listed = true; - if ($(".message .choice input[name='downloadable']:checked").val()==="downloadable") downloadable = true; - - } - - params = "setAlbumPublic&albumID=" + albumID + "&password=" + password + "&visible=" + listed + "&downloadable=" + downloadable; - - if (visible.album()) { - - album.json.public = (album.json.public==0) ? 1 : 0; - album.json.password = (album.json.public==0) ? 0 : album.json.password; - - view.album.public(); - view.album.password(); - - if (album.json.public==1) contextMenu.shareAlbum(albumID, e); - - } + startTime = new Date().getTime(); + params = 'getAlbum&albumID=' + albumID + '&password=' + password.value; lychee.api(params, function(data) { - if (data!==true) lychee.error(null, params, data); + if (data==='Warning: Album private!') { + if (document.location.hash.replace('#', '').split('/')[1]!=undefined) { + // Display photo only + lychee.setMode('view'); + } else { + // Album not public + lychee.content.show(); + lychee.goto(''); + } + return false; + } + + if (data==='Warning: Wrong password!') { + album.load(albumID, refresh); + return false; + } + + album.json = data; + + // Calculate delay + durationTime = (new Date().getTime() - startTime); + if (durationTime>300) waitTime = 0; + else waitTime = 300 - durationTime; + + // Skip delay when refresh is true + // Skip delay when opening a blank Lychee + if (refresh===true) waitTime = 0; + if (!visible.albums()&&!visible.photo()&&!visible.album()) waitTime = 0; + + setTimeout(function() { + + view.album.init(); + + if (!refresh) { + lychee.animate('.album:nth-child(-n+50), .photo:nth-child(-n+50)', 'contentZoomIn'); + view.header.mode('album'); + } + + }, waitTime); }); - }, + }); - share: function(service) { +} - var link = "", - url = location.href; +album.parse = function() { - switch (service) { - case 0: - link = "https://twitter.com/share?url=" + encodeURI(url); - break; - case 1: - link = "http://www.facebook.com/sharer.php?u=" + encodeURI(url) + "&t=" + encodeURI(album.json.title); - break; - case 2: - link = "mailto:?subject=" + encodeURI(album.json.title) + "&body=" + encodeURI(url); - break; - default: - link = ""; - break; - } + if (!album.json.title) album.json.title = 'Untitled'; - if (link.length>5) location.href = link; +} - }, +album.add = function() { - getArchive: function(albumID) { + var title, + params, + buttons, + isNumber = function(n) { return !isNaN(parseFloat(n)) && isFinite(n) }; - var link, - url = "php/api.php?function=getAlbumArchive&albumID=" + albumID; + buttons = [ + ['Create Album', function() { - if (location.href.indexOf("index.html")>0) link = location.href.replace(location.hash, "").replace("index.html", url); - else link = location.href.replace(location.hash, "") + url; + title = $('.message input.text').val(); - if (lychee.publicMode) link += "&password=" + password.value; + if (title.length===0) title = 'Untitled'; - location.href = link; + modal.close(); + + params = 'addAlbum&title=' + escape(encodeURI(title)); + lychee.api(params, function(data) { + + // Avoid first album to be true + if (data===true) data = 1; + + if (data!==false&&isNumber(data)) { + albums.refresh(); + lychee.goto(data); + } else { + lychee.error(null, params, data); + } + + }); + + }], + ['Cancel', function() {}] + ]; + + modal.show('New Album', "Enter a title for this album: ", buttons); + +} + +album.delete = function(albumIDs) { + + var params, + buttons, + albumTitle; + + if (!albumIDs) return false; + if (albumIDs instanceof Array===false) albumIDs = [albumIDs]; + + buttons = [ + ['', function() { + + params = 'deleteAlbum&albumIDs=' + albumIDs; + lychee.api(params, function(data) { + + if (visible.albums()) { + + albumIDs.forEach(function(id) { + albums.json.num--; + view.albums.content.delete(id); + delete albums.json.content[id]; + }); + + } else { + + albums.refresh(); + lychee.goto(''); + + } + + if (data!==true) lychee.error(null, params, data); + + }); + + }], + ['', function() {}] + ]; + + if (albumIDs.toString()==='0') { + + buttons[0][0] = 'Clear Unsorted'; + buttons[1][0] = 'Keep Unsorted'; + + modal.show('Clear Unsorted', "Are you sure you want to delete all photos from 'Unsorted'?
This action can't be undone!", buttons); + + } else if (albumIDs.length===1) { + + buttons[0][0] = 'Delete Album and Photos'; + buttons[1][0] = 'Keep Album'; + + // Get title + if (album.json) albumTitle = album.json.title; + else if (albums.json) albumTitle = albums.json.content[albumIDs].title; + + modal.show('Delete Album', "Are you sure you want to delete the album '" + albumTitle + "' and all of the photos it contains? This action can't be undone!", buttons); + + } else { + + buttons[0][0] = 'Delete Albums and Photos'; + buttons[1][0] = 'Keep Albums'; + + modal.show('Delete Albums', "Are you sure you want to delete all " + albumIDs.length + " selected albums and all of the photos they contain? This action can't be undone!", buttons); } -}; \ No newline at end of file +} + +album.setTitle = function(albumIDs) { + + var oldTitle = '', + newTitle, + params, + buttons; + + if (!albumIDs) return false; + if (albumIDs instanceof Array===false) albumIDs = [albumIDs]; + + if (albumIDs.length===1) { + + // Get old title if only one album is selected + if (album.json) oldTitle = album.json.title; + else if (albums.json) oldTitle = albums.json.content[albumIDs].title; + + if (!oldTitle) oldTitle = ''; + oldTitle = oldTitle.replace("'", '''); + + } + + buttons = [ + ['Set Title', function() { + + // Get input + newTitle = $('.message input.text').val(); + + // Remove html from input + newTitle = lychee.removeHTML(newTitle); + + // Set to Untitled when empty + newTitle = (newTitle==='') ? 'Untitled' : newTitle; + + if (visible.album()) { + + album.json.title = newTitle; + view.album.title(); + + if (albums.json) { + var id = albumIDs[0]; + albums.json.content[id].title = newTitle; + } + + } else if (visible.albums()) { + + albumIDs.forEach(function(id) { + albums.json.content[id].title = newTitle; + view.albums.content.title(id); + }); + + } + + params = 'setAlbumTitle&albumIDs=' + albumIDs + '&title=' + escape(encodeURI(newTitle)); + lychee.api(params, function(data) { + + if (data!==true) lychee.error(null, params, data); + + }); + + }], + ['Cancel', function() {}] + ]; + + if (albumIDs.length===1) modal.show('Set Title', "Enter a new title for this album: ", buttons); + else modal.show('Set Titles', "Enter a title for all " + albumIDs.length + " selected album: ", buttons); + +} + +album.setDescription = function(photoID) { + + var oldDescription = album.json.description.replace("'", '''), + description, + params, + buttons; + + buttons = [ + ['Set Description', function() { + + // Get input + description = $('.message input.text').val(); + + // Remove html from input + description = lychee.removeHTML(description); + + if (visible.album()) { + album.json.description = description; + view.album.description(); + } + + params = 'setAlbumDescription&albumID=' + photoID + '&description=' + escape(encodeURI(description)); + lychee.api(params, function(data) { + + if (data!==true) lychee.error(null, params, data); + + }); + + }], + ['Cancel', function() {}] + ]; + + modal.show('Set Description', "Please enter a description for this album: ", buttons); + +} + +album.setPublic = function(albumID, e) { + + var params, + password = '', + listed = false, + downloadable = false; + + albums.refresh(); + + if (!visible.message()&&album.json.public==0) { + + modal.show('Share Album', "This album will be shared with the following properties:

Visible

Listed to visitors of your Lychee.

Downloadable

Visitors of your Lychee can download this album.

Password protected

Only accessible with a valid password.

", [['Share Album', function() { album.setPublic(album.getID(), e) }], ['Cancel', function() {}]], -170); + + $('.message .choice input[name="password"]').on('change', function() { + + if ($(this).prop('checked')===true) $('.message .choice input.text').show(); + else $('.message .choice input.text').hide(); + + }); + + return true; + + } + + if (visible.message()) { + + if ($('.message .choice input[name="password"]:checked').val()==='password') { + password = md5($('.message input.text').val()); + album.json.password = 1; + } else { + password = ''; + album.json.password = 0; + } + + if ($('.message .choice input[name="listed"]:checked').val()==='listed') listed = true; + if ($('.message .choice input[name="downloadable"]:checked').val()==='downloadable') downloadable = true; + + } + + params = 'setAlbumPublic&albumID=' + albumID + '&password=' + password + '&visible=' + listed + '&downloadable=' + downloadable; + + if (visible.album()) { + + album.json.public = (album.json.public==0) ? 1 : 0; + album.json.password = (album.json.public==0) ? 0 : album.json.password; + + view.album.public(); + view.album.password(); + + if (album.json.public==1) contextMenu.shareAlbum(albumID, e); + + } + + lychee.api(params, function(data) { + + if (data!==true) lychee.error(null, params, data); + + }); + +} + +album.share = function(service) { + + var link = '', + url = location.href; + + switch (service) { + case 0: + link = 'https://twitter.com/share?url=' + encodeURI(url); + break; + case 1: + link = 'http://www.facebook.com/sharer.php?u=' + encodeURI(url) + '&t=' + encodeURI(album.json.title); + break; + case 2: + link = 'mailto:?subject=' + encodeURI(album.json.title) + '&body=' + encodeURI(url); + break; + default: + link = ''; + break; + } + + if (link.length>5) location.href = link; + +} + +album.getArchive = function(albumID) { + + var link, + url = 'php/api.php?function=getAlbumArchive&albumID=' + albumID; + + if (location.href.indexOf('index.html')>0) link = location.href.replace(location.hash, '').replace('index.html', url); + else link = location.href.replace(location.hash, '') + url; + + if (lychee.publicMode) link += '&password=' + password.value; + + location.href = link; + +} \ No newline at end of file diff --git a/src/scripts/loadingBar.js b/src/scripts/loadingBar.js index fd39da7..a00c50f 100755 --- a/src/scripts/loadingBar.js +++ b/src/scripts/loadingBar.js @@ -3,87 +3,85 @@ * @copyright 2014 by Tobias Reich */ -loadingBar = { +loadingBar = {} - status: null, +loadingBar.status = null; - show: function(status, errorText) { +loadingBar.show = function(status, errorText) { - if (status==='error') { + if (status==='error') { - // Set status - loadingBar.status = 'error'; + // Set status + loadingBar.status = 'error'; - // Parse text - if (errorText) errorText = errorText.replace('
', ''); - if (!errorText) errorText = 'Whoops, it looks like something went wrong. Please reload the site and try again!'; + // Parse text + if (errorText) errorText = errorText.replace('
', ''); + if (!errorText) errorText = 'Whoops, it looks like something went wrong. Please reload the site and try again!'; + + // Move header down + if (visible.controls()) lychee.header.addClass('error'); + + // Modify loading + lychee.loadingBar + .removeClass('loading uploading error') + .addClass(status) + .html('

Error: ' + errorText + '

') + .show() + .css('height', '40px'); + + // Set timeout + clearTimeout(lychee.loadingBar.data('timeout')); + lychee.loadingBar.data('timeout', setTimeout(function() { loadingBar.hide(true) }, 3000)); + + return true; + + } + + if (loadingBar.status===null) { + + // Set status + loadingBar.status = 'loading'; + + // Set timeout + clearTimeout(lychee.loadingBar.data('timeout')); + lychee.loadingBar.data('timeout', setTimeout(function() { // Move header down - if (visible.controls()) lychee.header.addClass('error'); + if (visible.controls()) lychee.header.addClass('loading'); // Modify loading lychee.loadingBar .removeClass('loading uploading error') - .addClass(status) - .html('

Error: ' + errorText + '

') - .show() - .css('height', '40px'); + .addClass('loading') + .show(); - // Set timeout - clearTimeout(lychee.loadingBar.data('timeout')); - lychee.loadingBar.data('timeout', setTimeout(function() { loadingBar.hide(true) }, 3000)); + }, 1000)); - return true; - - } - - if (loadingBar.status===null) { - - // Set status - loadingBar.status = 'loading'; - - // Set timeout - clearTimeout(lychee.loadingBar.data('timeout')); - lychee.loadingBar.data('timeout', setTimeout(function() { - - // Move header down - if (visible.controls()) lychee.header.addClass('loading'); - - // Modify loading - lychee.loadingBar - .removeClass('loading uploading error') - .addClass('loading') - .show(); - - }, 1000)); - - return true; - - } - - }, - - hide: function(force) { - - if ((loadingBar.status!=='error'&&loadingBar.status!==null)||force) { - - // Remove status - loadingBar.status = null; - - // Move header up - if (visible.controls()) lychee.header.removeClass('error loading'); - - // Modify loading - lychee.loadingBar - .html('') - .css('height', '3px'); - - // Set timeout - clearTimeout(lychee.loadingBar.data('timeout')); - setTimeout(function() { lychee.loadingBar.hide() }, 300); - - } + return true; } -}; \ No newline at end of file +} + +loadingBar.hide = function(force) { + + if ((loadingBar.status!=='error'&&loadingBar.status!==null)||force) { + + // Remove status + loadingBar.status = null; + + // Move header up + if (visible.controls()) lychee.header.removeClass('error loading'); + + // Modify loading + lychee.loadingBar + .html('') + .css('height', '3px'); + + // Set timeout + clearTimeout(lychee.loadingBar.data('timeout')); + setTimeout(function() { lychee.loadingBar.hide() }, 300); + + } + +} \ No newline at end of file diff --git a/src/scripts/password.js b/src/scripts/password.js index 7e41343..f3adf7e 100644 --- a/src/scripts/password.js +++ b/src/scripts/password.js @@ -54,6 +54,6 @@ password.getDialog = function(albumID, callback) { ['Enter', function() { password.get(albumID, callback) }], ['Cancel', lychee.goto] ]; - modal.show(' Enter Password', 'This album is protected by a password. Enter the password below to view the photos of this album: ', buttons, -110, false); + modal.show(" Enter Password", "This album is protected by a password. Enter the password below to view the photos of this album: ", buttons, -110, false); } \ No newline at end of file diff --git a/src/scripts/photo.js b/src/scripts/photo.js index e60991c..22bcc3e 100644 --- a/src/scripts/photo.js +++ b/src/scripts/photo.js @@ -174,10 +174,14 @@ photo.delete = function(photoIDs) { if (photoIDs instanceof Array===false) photoIDs = [photoIDs]; if (photoIDs.length===1) { + // Get title if only one photo is selected if (visible.photo()) photoTitle = photo.json.title; else photoTitle = album.json.content[photoIDs].title; + + // Fallback for photos without a title if (photoTitle==='') photoTitle = 'Untitled'; + } buttons = [ @@ -552,7 +556,7 @@ photo.getSize = function() { scaled = false, hasMedium = photo.json.medium!=='', pixelRatio = window.devicePixelRatio, - view = { + view = { width: $(window).width()-60, height: $(window).height()-100 }; @@ -613,7 +617,7 @@ photo.getViewLink = function(photoID) { var url = 'view.php?p=' + photoID; - if (location.href.indexOf('index.html')>0) return location.href.replace('index.html' + location.hash, url); - else return location.href.replace(location.hash, url); + if (location.href.indexOf('index.html')>0) return location.href.replace('index.html' + location.hash, url); + else return location.href.replace(location.hash, url); } \ No newline at end of file