diff --git a/dist/main.js b/dist/main.js index 6e36b76..b3f4a97 100644 Binary files a/dist/main.js and b/dist/main.js differ diff --git a/src/scripts/modal.js b/src/scripts/modal.js index 6e557f1..eab3af9 100644 --- a/src/scripts/modal.js +++ b/src/scripts/modal.js @@ -3,31 +3,30 @@ * @copyright 2014 by Tobias Reich */ -modal = { +modal = {} - fns: null, +modal.fns = null; - show: function(title, text, buttons, marginTop, closeButton) { - - if (!buttons) { - buttons = [ - ["", function() {}], - ["", function() {}] - ]; - } - - modal.fns = [buttons[0][1], buttons[1][1]]; - $("body").append(build.modal(title, text, buttons, marginTop, closeButton)); - $(".message input:first-child").focus().select(); - - }, - - close: function() { - - modal.fns = null; - $(".message_overlay").removeClass("fadeIn").css("opacity", 0); - setTimeout(function() { $(".message_overlay").remove() }, 300); +modal.show = function(title, text, buttons, marginTop, closeButton) { + if (!buttons) { + buttons = [ + ['', function() {}], + ['', function() {}] + ]; } -}; \ No newline at end of file + modal.fns = [buttons[0][1], buttons[1][1]]; + + $('body').append(build.modal(title, text, buttons, marginTop, closeButton)); + $('.message input:first-child').focus().select(); + +} + +modal.close = function() { + + modal.fns = null; + $('.message_overlay').removeClass('fadeIn').css('opacity', 0); + setTimeout(function() { $('.message_overlay').remove() }, 300); + +} \ No newline at end of file diff --git a/src/scripts/password.js b/src/scripts/password.js index 9ddf15e..7e41343 100644 --- a/src/scripts/password.js +++ b/src/scripts/password.js @@ -3,59 +3,57 @@ * @copyright 2014 by Tobias Reich */ -password = { +password = {} - value: "", +password.value = ''; - get: function(albumID, callback) { +password.get = function(albumID, callback) { - var passwd = $(".message input.text").val(), - params; + var passwd = $('.message input.text').val(), + params; - if (!lychee.publicMode) callback(); - else if (album.json&&album.json.password==false) callback(); - else if (albums.json&&albums.json.content[albumID].password==false) callback(); - else if (!albums.json&&!album.json) { + if (!lychee.publicMode) callback(); + else if (album.json&&album.json.password==false) callback(); + else if (albums.json&&albums.json.content[albumID].password==false) callback(); + else if (!albums.json&&!album.json) { - // Continue without password - album.json = {password: true}; - callback(""); + // Continue without password + album.json = {password: true}; + callback(''); - } else if (passwd==undefined) { + } else if (passwd==undefined) { - // Request password - password.getDialog(albumID, callback); + // Request password + password.getDialog(albumID, callback); - } else { + } else { - // Check password - params = "checkAlbumAccess&albumID=" + albumID + "&password=" + md5(passwd); - lychee.api(params, function(data) { + // Check password + params = 'checkAlbumAccess&albumID=' + albumID + '&password=' + md5(passwd); + lychee.api(params, function(data) { - if (data===true) { - password.value = md5(passwd); - callback(); - } else { - lychee.goto(""); - loadingBar.show("error", "Access denied. Wrong password!"); - } + if (data===true) { + password.value = md5(passwd); + callback(); + } else { + lychee.goto(''); + loadingBar.show('error', 'Access denied. Wrong password!'); + } - }); - - } - - }, - - getDialog: function(albumID, callback) { - - var buttons; - - buttons = [ - ["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); + }); } -}; \ No newline at end of file +} + +password.getDialog = function(albumID, callback) { + + var buttons; + + buttons = [ + ['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); + +} \ No newline at end of file diff --git a/src/scripts/photo.js b/src/scripts/photo.js index c954acf..793ad10 100644 --- a/src/scripts/photo.js +++ b/src/scripts/photo.js @@ -3,619 +3,617 @@ * @copyright 2014 by Tobias Reich */ -photo = { +photo = {} - json: null, - cache: null, +photo.json = null; +photo.cache = null; - getID: function() { +photo.getID = function() { - var id; + var id; - if (photo.json) id = photo.json.id; - else id = $(".photo:hover, .photo.active").attr("data-id"); + if (photo.json) id = photo.json.id; + else id = $('.photo:hover, .photo.active').attr('data-id'); - if (id) return id; - else return false; + if (id) return id; + else return false; - }, +} - load: function(photoID, albumID) { +photo.load = function(photoID, albumID) { - var params, - checkPasswd; + var params, + checkPasswd; - params = "getPhoto&photoID=" + photoID + "&albumID=" + albumID + "&password=" + password.value; - lychee.api(params, function(data) { + params = 'getPhoto&photoID=' + photoID + '&albumID=' + albumID + '&password=' + password.value; + lychee.api(params, function(data) { - if (data==="Warning: Wrong password!") { - checkPasswd = function() { - if (password.value!=="") photo.load(photoID, albumID); - else setTimeout(checkPasswd, 250); - }; - checkPasswd(); - return false; - } - - photo.json = data; - if (!visible.photo()) view.photo.show(); - view.photo.init(); - - lychee.imageview.show(); - setTimeout(function() { - lychee.content.show(); - //photo.preloadNext(photoID, albumID); - }, 300); - - }); - - }, - - // Preload the next photo for better response time - preloadNext: function(photoID) { - - var nextPhoto, - url; - - // Never preload on mobile devices with bare RAM and - // mostly mobile internet - if (mobileBrowser()) return false; - - if (album.json && - album.json.content && - album.json.content[photoID] && - album.json.content[photoID].nextPhoto!="") { - - nextPhoto = album.json.content[photoID].nextPhoto; - url = album.json.content[nextPhoto].url; - - photo.cache = new Image(); - photo.cache.src = url; - photo.cache.onload = function() { photo.cache = null }; - - } - - }, - - parse: function() { - - if (!photo.json.title) photo.json.title = "Untitled"; - - }, - - previous: function(animate) { - - var delay = 0; - - if (photo.getID()!==false&& - album.json&& - album.json.content[photo.getID()]&& - album.json.content[photo.getID()].previousPhoto!=="") { - - if (animate===true) { - - delay = 200; - - $("#image").css({ - WebkitTransform: 'translateX(100%)', - MozTransform: 'translateX(100%)', - transform: 'translateX(100%)', - opacity: 0 - }); - - } - - setTimeout(function() { - if (photo.getID()===false) return false; - lychee.goto(album.getID() + "/" + album.json.content[photo.getID()].previousPhoto) - }, delay); - - } - - }, - - next: function(animate) { - - var delay = 0; - - if (photo.getID()!==false&& - album.json&& - album.json.content[photo.getID()]&& - album.json.content[photo.getID()].nextPhoto!=="") { - - if (animate===true) { - - delay = 200; - - $("#image").css({ - WebkitTransform: 'translateX(-100%)', - MozTransform: 'translateX(-100%)', - transform: 'translateX(-100%)', - opacity: 0 - }); - - } - - setTimeout(function() { - if (photo.getID()===false) return false; - lychee.goto(album.getID() + "/" + album.json.content[photo.getID()].nextPhoto); - }, delay); - - } - - }, - - duplicate: function(photoIDs) { - - var params; - - if (!photoIDs) return false; - if (photoIDs instanceof Array===false) photoIDs = [photoIDs]; - - albums.refresh(); - - params = "duplicatePhoto&photoIDs=" + photoIDs; - lychee.api(params, function(data) { - - if (data!==true) lychee.error(null, params, data); - else album.load(album.getID(), false); - - }); - - }, - - delete: function(photoIDs) { - - var params, - buttons, - photoTitle; - - if (!photoIDs) return false; - 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; - if (photoTitle==="") photoTitle = "Untitled"; - } - - buttons = [ - ["", function() { - - var nextPhoto = "", - previousPhoto = ""; - - photoIDs.forEach(function(id, index, array) { - - // Change reference for the next and previous photo - if (album.json.content[id].nextPhoto!==""||album.json.content[id].previousPhoto!=="") { - - nextPhoto = album.json.content[id].nextPhoto; - previousPhoto = album.json.content[id].previousPhoto; - - album.json.content[previousPhoto].nextPhoto = nextPhoto; - album.json.content[nextPhoto].previousPhoto = previousPhoto; - - } - - album.json.content[id] = null; - view.album.content.delete(id); - - }); - - albums.refresh(); - - // Go to next photo if there is a next photo and - // next photo is not the current one. Show album otherwise. - if (visible.photo()&&nextPhoto!==""&&nextPhoto!==photo.getID()) lychee.goto(album.getID() + "/" + nextPhoto); - else if (!visible.albums()) lychee.goto(album.getID()); - - params = "deletePhoto&photoIDs=" + photoIDs; - lychee.api(params, function(data) { - - if (data!==true) lychee.error(null, params, data); - - }); - - }], - ["", function() {}] - ]; - - if (photoIDs.length===1) { - - buttons[0][0] = "Delete Photo"; - buttons[1][0] = "Keep Photo"; - - modal.show("Delete Photo", "Are you sure you want to delete the photo '" + photoTitle + "'?
This action can't be undone!", buttons); - - } else { - - buttons[0][0] = "Delete Photos"; - buttons[1][0] = "Keep Photos"; - - modal.show("Delete Photos", "Are you sure you want to delete all " + photoIDs.length + " selected photo?
This action can't be undone!", buttons); - - } - - }, - - setTitle: function(photoIDs) { - - var oldTitle = "", - newTitle, - params, - buttons; - - if (!photoIDs) return false; - if (photoIDs instanceof Array===false) photoIDs = [photoIDs]; - - if (photoIDs.length===1) { - // Get old title if only one photo is selected - if (photo.json) oldTitle = photo.json.title; - else if (album.json) oldTitle = album.json.content[photoIDs].title; - oldTitle = oldTitle.replace("'", "'"); - } - - buttons = [ - ["Set Title", function() { - - // Get input - newTitle = $(".message input.text").val(); - - // Remove html from input - newTitle = lychee.removeHTML(newTitle); - - if (visible.photo()) { - photo.json.title = (newTitle==="") ? "Untitled" : newTitle; - view.photo.title(); - } - - photoIDs.forEach(function(id, index, array) { - album.json.content[id].title = newTitle; - view.album.content.title(id); - }); - - params = "setPhotoTitle&photoIDs=" + photoIDs + "&title=" + escape(encodeURI(newTitle)); - lychee.api(params, function(data) { - - if (data!==true) lychee.error(null, params, data); - - }); - - }], - ["Cancel", function() {}] - ]; - - if (photoIDs.length===1) modal.show("Set Title", "Enter a new title for this photo: ", buttons); - else modal.show("Set Titles", "Enter a title for all " + photoIDs.length + " selected photos: ", buttons); - - }, - - setAlbum: function(photoIDs, albumID) { - - var params, - nextPhoto, - previousPhoto; - - if (!photoIDs) return false; - if (visible.photo) lychee.goto(album.getID()); - if (photoIDs instanceof Array===false) photoIDs = [photoIDs]; - - photoIDs.forEach(function(id, index, array) { - - // Change reference for the next and previous photo - if (album.json.content[id].nextPhoto!==""||album.json.content[id].previousPhoto!=="") { - - nextPhoto = album.json.content[id].nextPhoto; - previousPhoto = album.json.content[id].previousPhoto; - - album.json.content[previousPhoto].nextPhoto = nextPhoto; - album.json.content[nextPhoto].previousPhoto = previousPhoto; - - } - - album.json.content[id] = null; - view.album.content.delete(id); - - }); - - albums.refresh(); - - params = "setPhotoAlbum&photoIDs=" + photoIDs + "&albumID=" + albumID; - lychee.api(params, function(data) { - - if (data!==true) lychee.error(null, params, data); - - }); - - }, - - setStar: function(photoIDs) { - - var params; - - if (!photoIDs) return false; - if (visible.photo()) { - photo.json.star = (photo.json.star==0) ? 1 : 0; - view.photo.star(); - } - - photoIDs.forEach(function(id, index, array) { - album.json.content[id].star = (album.json.content[id].star==0) ? 1 : 0; - view.album.content.star(id); - }); - - albums.refresh(); - - params = "setPhotoStar&photoIDs=" + photoIDs; - lychee.api(params, function(data) { - - if (data!==true) lychee.error(null, params, data); - - }); - - }, - - setPublic: function(photoID, e) { - - var params; - - if (photo.json.public==2) { - - modal.show("Public Album", "This photo is located in a public album. To make this photo private or public, edit the visibility of the associated album.", [["Show Album", function() { lychee.goto(photo.json.original_album) }], ["Close", function() {}]]); - return false; - - } - - if (visible.photo()) { - - photo.json.public = (photo.json.public==0) ? 1 : 0; - view.photo.public(); - if (photo.json.public==1) contextMenu.sharePhoto(photoID, e); - - } - - album.json.content[photoID].public = (album.json.content[photoID].public==0) ? 1 : 0; - view.album.content.public(photoID); - - albums.refresh(); - - params = "setPhotoPublic&photoID=" + photoID; - lychee.api(params, function(data) { - - if (data!==true) lychee.error(null, params, data); - - }); - - }, - - setDescription: function(photoID) { - - var oldDescription = photo.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.photo()) { - photo.json.description = description; - view.photo.description(); - } - - params = "setPhotoDescription&photoID=" + photoID + "&description=" + escape(encodeURI(description)); - lychee.api(params, function(data) { - - if (data!==true) lychee.error(null, params, data); - - }); - - }], - ["Cancel", function() {}] - ]; - - modal.show("Set Description", "Enter a description for this photo: ", buttons); - - }, - - editTags: function(photoIDs) { - - var oldTags = "", - tags = "", - buttons; - - if (!photoIDs) return false; - if (photoIDs instanceof Array===false) photoIDs = [photoIDs]; - - // Get tags - if (visible.photo()) oldTags = photo.json.tags; - if (visible.album()&&photoIDs.length===1) oldTags = album.json.content[photoIDs].tags; - if (visible.album()&&photoIDs.length>1) { - var same = true; - photoIDs.forEach(function(id, index, array) { - if(album.json.content[id].tags===album.json.content[photoIDs[0]].tags&&same===true) same = true; - else same = false; - }); - if (same) oldTags = album.json.content[photoIDs[0]].tags; - } - - // Improve tags - oldTags = oldTags.replace(/,/g, ', '); - - buttons = [ - ["Set Tags", function() { - - tags = $(".message input.text").val(); - - photo.setTags(photoIDs, tags); - - }], - ["Cancel", function() {}] - ]; - - if (photoIDs.length===1) modal.show("Set Tags", "Enter your tags for this photo. You can add multiple tags by separating them with a comma: ", buttons); - else modal.show("Set Tags", "Enter your tags for all " + photoIDs.length + " selected photos. Existing tags will be overwritten. You can add multiple tags by separating them with a comma: ", buttons); - - }, - - setTags: function(photoIDs, tags) { - - var params; - - if (!photoIDs) return false; - if (photoIDs instanceof Array===false) photoIDs = [photoIDs]; - - // Parse tags - tags = tags.replace(/(\ ,\ )|(\ ,)|(,\ )|(,{1,}\ {0,})|(,$|^,)/g, ','); - tags = tags.replace(/,$|^,|(\ ){0,}$/g, ''); - - // Remove html from input - tags = lychee.removeHTML(tags); - - if (visible.photo()) { - photo.json.tags = tags; - view.photo.tags(); - } - - photoIDs.forEach(function(id, index, array) { - album.json.content[id].tags = tags; - }); - - params = "setPhotoTags&photoIDs=" + photoIDs + "&tags=" + tags; - lychee.api(params, function(data) { - - if (data!==true) lychee.error(null, params, data); - - }); - - }, - - deleteTag: function(photoID, index) { - - var tags; - - // Remove - tags = photo.json.tags.split(','); - tags.splice(index, 1); - - // Save - photo.json.tags = tags.toString(); - photo.setTags([photoID], photo.json.tags); - - }, - - share: function(photoID, service) { - - var link = "", - url = photo.getViewLink(photoID), - filename = "unknown"; - - 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(photo.json.title); - break; - case 2: - link = "mailto:?subject=" + encodeURI(photo.json.title) + "&body=" + encodeURI(url); - break; - case 3: - lychee.loadDropbox(function() { - filename = photo.json.title + "." + photo.getDirectLink().split('.').pop(); - Dropbox.save(photo.getDirectLink(), filename); - }); - break; - default: - link = ""; - break; - } - - if (link.length>5) location.href = link; - - }, - - getSize: function() { - - // Size can be 'big, medium, small' - // Default is big - // Small is centered in the middle of the screen - var size = "big", - scaled = false, - hasMedium = photo.json.medium!=="", - pixelRatio = window.devicePixelRatio, - view = { - width: $(window).width()-60, - height: $(window).height()-100 + if (data==="Warning: Wrong password!") { + checkPasswd = function() { + if (password.value!=="") photo.load(photoID, albumID); + else setTimeout(checkPasswd, 250); }; - - // Detect if the photo will be shown scaled, - // because the screen size is smaller than the photo - if (photo.json.width>view.width|| - photo.json.width>view.height) scaled = true; - - // Calculate pixel ratio of screen - if (pixelRatio!==undefined&&pixelRatio>1) { - view.width = view.width * pixelRatio; - view.height = view.height * pixelRatio; + checkPasswd(); + return false; } - // Medium available and - // Medium still bigger than screen - if (hasMedium===true&& - (1920>view.width&&1080>view.height)) size = "medium"; + photo.json = data; + if (!visible.photo()) view.photo.show(); + view.photo.init(); - // Photo not scaled - // Photo smaller then screen - if (scaled===false&& - (photo.json.width0) link = location.href.replace(location.hash, "").replace("index.html", url); - else link = location.href.replace(location.hash, "") + url; + // Never preload on mobile devices with bare RAM and + // mostly mobile internet + if (mobileBrowser()) return false; - if (lychee.publicMode) link += "&password=" + password.value; + if (album.json && + album.json.content && + album.json.content[photoID] && + album.json.content[photoID].nextPhoto!="") { - location.href = link; + nextPhoto = album.json.content[photoID].nextPhoto; + url = album.json.content[nextPhoto].url; - }, - - getDirectLink: function() { - - var url = ""; - - if (photo.json&& - photo.json.url&& - photo.json.url!=="") url = photo.json.url; - - return url; - - }, - - 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); + photo.cache = new Image(); + photo.cache.src = url; + photo.cache.onload = function() { photo.cache = null }; } -}; \ No newline at end of file +} + +photo.parse = function() { + + if (!photo.json.title) photo.json.title = "Untitled"; + +} + +photo.previous = function(animate) { + + var delay = 0; + + if (photo.getID()!==false&& + album.json&& + album.json.content[photo.getID()]&& + album.json.content[photo.getID()].previousPhoto!=="") { + + if (animate===true) { + + delay = 200; + + $("#image").css({ + WebkitTransform: 'translateX(100%)', + MozTransform: 'translateX(100%)', + transform: 'translateX(100%)', + opacity: 0 + }); + + } + + setTimeout(function() { + if (photo.getID()===false) return false; + lychee.goto(album.getID() + "/" + album.json.content[photo.getID()].previousPhoto) + }, delay); + + } + +} + +photo.next = function(animate) { + + var delay = 0; + + if (photo.getID()!==false&& + album.json&& + album.json.content[photo.getID()]&& + album.json.content[photo.getID()].nextPhoto!=="") { + + if (animate===true) { + + delay = 200; + + $("#image").css({ + WebkitTransform: 'translateX(-100%)', + MozTransform: 'translateX(-100%)', + transform: 'translateX(-100%)', + opacity: 0 + }); + + } + + setTimeout(function() { + if (photo.getID()===false) return false; + lychee.goto(album.getID() + "/" + album.json.content[photo.getID()].nextPhoto); + }, delay); + + } + +} + +photo.duplicate = function(photoIDs) { + + var params; + + if (!photoIDs) return false; + if (photoIDs instanceof Array===false) photoIDs = [photoIDs]; + + albums.refresh(); + + params = "duplicatePhoto&photoIDs=" + photoIDs; + lychee.api(params, function(data) { + + if (data!==true) lychee.error(null, params, data); + else album.load(album.getID(), false); + + }); + +} + +photo.delete = function(photoIDs) { + + var params, + buttons, + photoTitle; + + if (!photoIDs) return false; + 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; + if (photoTitle==="") photoTitle = "Untitled"; + } + + buttons = [ + ["", function() { + + var nextPhoto = "", + previousPhoto = ""; + + photoIDs.forEach(function(id, index, array) { + + // Change reference for the next and previous photo + if (album.json.content[id].nextPhoto!==""||album.json.content[id].previousPhoto!=="") { + + nextPhoto = album.json.content[id].nextPhoto; + previousPhoto = album.json.content[id].previousPhoto; + + album.json.content[previousPhoto].nextPhoto = nextPhoto; + album.json.content[nextPhoto].previousPhoto = previousPhoto; + + } + + album.json.content[id] = null; + view.album.content.delete(id); + + }); + + albums.refresh(); + + // Go to next photo if there is a next photo and + // next photo is not the current one. Show album otherwise. + if (visible.photo()&&nextPhoto!==""&&nextPhoto!==photo.getID()) lychee.goto(album.getID() + "/" + nextPhoto); + else if (!visible.albums()) lychee.goto(album.getID()); + + params = "deletePhoto&photoIDs=" + photoIDs; + lychee.api(params, function(data) { + + if (data!==true) lychee.error(null, params, data); + + }); + + }], + ["", function() {}] + ]; + + if (photoIDs.length===1) { + + buttons[0][0] = "Delete Photo"; + buttons[1][0] = "Keep Photo"; + + modal.show("Delete Photo", "Are you sure you want to delete the photo '" + photoTitle + "'?
This action can't be undone!", buttons); + + } else { + + buttons[0][0] = "Delete Photos"; + buttons[1][0] = "Keep Photos"; + + modal.show("Delete Photos", "Are you sure you want to delete all " + photoIDs.length + " selected photo?
This action can't be undone!", buttons); + + } + +} + +photo.setTitle = function(photoIDs) { + + var oldTitle = "", + newTitle, + params, + buttons; + + if (!photoIDs) return false; + if (photoIDs instanceof Array===false) photoIDs = [photoIDs]; + + if (photoIDs.length===1) { + // Get old title if only one photo is selected + if (photo.json) oldTitle = photo.json.title; + else if (album.json) oldTitle = album.json.content[photoIDs].title; + oldTitle = oldTitle.replace("'", "'"); + } + + buttons = [ + ["Set Title", function() { + + // Get input + newTitle = $(".message input.text").val(); + + // Remove html from input + newTitle = lychee.removeHTML(newTitle); + + if (visible.photo()) { + photo.json.title = (newTitle==="") ? "Untitled" : newTitle; + view.photo.title(); + } + + photoIDs.forEach(function(id, index, array) { + album.json.content[id].title = newTitle; + view.album.content.title(id); + }); + + params = "setPhotoTitle&photoIDs=" + photoIDs + "&title=" + escape(encodeURI(newTitle)); + lychee.api(params, function(data) { + + if (data!==true) lychee.error(null, params, data); + + }); + + }], + ["Cancel", function() {}] + ]; + + if (photoIDs.length===1) modal.show("Set Title", "Enter a new title for this photo: ", buttons); + else modal.show("Set Titles", "Enter a title for all " + photoIDs.length + " selected photos: ", buttons); + +} + +photo.setAlbum = function(photoIDs, albumID) { + + var params, + nextPhoto, + previousPhoto; + + if (!photoIDs) return false; + if (visible.photo) lychee.goto(album.getID()); + if (photoIDs instanceof Array===false) photoIDs = [photoIDs]; + + photoIDs.forEach(function(id, index, array) { + + // Change reference for the next and previous photo + if (album.json.content[id].nextPhoto!==""||album.json.content[id].previousPhoto!=="") { + + nextPhoto = album.json.content[id].nextPhoto; + previousPhoto = album.json.content[id].previousPhoto; + + album.json.content[previousPhoto].nextPhoto = nextPhoto; + album.json.content[nextPhoto].previousPhoto = previousPhoto; + + } + + album.json.content[id] = null; + view.album.content.delete(id); + + }); + + albums.refresh(); + + params = "setPhotoAlbum&photoIDs=" + photoIDs + "&albumID=" + albumID; + lychee.api(params, function(data) { + + if (data!==true) lychee.error(null, params, data); + + }); + +} + +photo.setStar = function(photoIDs) { + + var params; + + if (!photoIDs) return false; + if (visible.photo()) { + photo.json.star = (photo.json.star==0) ? 1 : 0; + view.photo.star(); + } + + photoIDs.forEach(function(id, index, array) { + album.json.content[id].star = (album.json.content[id].star==0) ? 1 : 0; + view.album.content.star(id); + }); + + albums.refresh(); + + params = "setPhotoStar&photoIDs=" + photoIDs; + lychee.api(params, function(data) { + + if (data!==true) lychee.error(null, params, data); + + }); + +} + +photo.setPublic = function(photoID, e) { + + var params; + + if (photo.json.public==2) { + + modal.show("Public Album", "This photo is located in a public album. To make this photo private or public, edit the visibility of the associated album.", [["Show Album", function() { lychee.goto(photo.json.original_album) }], ["Close", function() {}]]); + return false; + + } + + if (visible.photo()) { + + photo.json.public = (photo.json.public==0) ? 1 : 0; + view.photo.public(); + if (photo.json.public==1) contextMenu.sharePhoto(photoID, e); + + } + + album.json.content[photoID].public = (album.json.content[photoID].public==0) ? 1 : 0; + view.album.content.public(photoID); + + albums.refresh(); + + params = "setPhotoPublic&photoID=" + photoID; + lychee.api(params, function(data) { + + if (data!==true) lychee.error(null, params, data); + + }); + +} + +photo.setDescription = function(photoID) { + + var oldDescription = photo.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.photo()) { + photo.json.description = description; + view.photo.description(); + } + + params = "setPhotoDescription&photoID=" + photoID + "&description=" + escape(encodeURI(description)); + lychee.api(params, function(data) { + + if (data!==true) lychee.error(null, params, data); + + }); + + }], + ["Cancel", function() {}] + ]; + + modal.show("Set Description", "Enter a description for this photo: ", buttons); + +} + +photo.editTags = function(photoIDs) { + + var oldTags = "", + tags = "", + buttons; + + if (!photoIDs) return false; + if (photoIDs instanceof Array===false) photoIDs = [photoIDs]; + + // Get tags + if (visible.photo()) oldTags = photo.json.tags; + if (visible.album()&&photoIDs.length===1) oldTags = album.json.content[photoIDs].tags; + if (visible.album()&&photoIDs.length>1) { + var same = true; + photoIDs.forEach(function(id, index, array) { + if(album.json.content[id].tags===album.json.content[photoIDs[0]].tags&&same===true) same = true; + else same = false; + }); + if (same) oldTags = album.json.content[photoIDs[0]].tags; + } + + // Improve tags + oldTags = oldTags.replace(/,/g, ', '); + + buttons = [ + ["Set Tags", function() { + + tags = $(".message input.text").val(); + + photo.setTags(photoIDs, tags); + + }], + ["Cancel", function() {}] + ]; + + if (photoIDs.length===1) modal.show("Set Tags", "Enter your tags for this photo. You can add multiple tags by separating them with a comma: ", buttons); + else modal.show("Set Tags", "Enter your tags for all " + photoIDs.length + " selected photos. Existing tags will be overwritten. You can add multiple tags by separating them with a comma: ", buttons); + +} + +photo.setTags = function(photoIDs, tags) { + + var params; + + if (!photoIDs) return false; + if (photoIDs instanceof Array===false) photoIDs = [photoIDs]; + + // Parse tags + tags = tags.replace(/(\ ,\ )|(\ ,)|(,\ )|(,{1,}\ {0,})|(,$|^,)/g, ','); + tags = tags.replace(/,$|^,|(\ ){0,}$/g, ''); + + // Remove html from input + tags = lychee.removeHTML(tags); + + if (visible.photo()) { + photo.json.tags = tags; + view.photo.tags(); + } + + photoIDs.forEach(function(id, index, array) { + album.json.content[id].tags = tags; + }); + + params = "setPhotoTags&photoIDs=" + photoIDs + "&tags=" + tags; + lychee.api(params, function(data) { + + if (data!==true) lychee.error(null, params, data); + + }); + +} + +photo.deleteTag = function(photoID, index) { + + var tags; + + // Remove + tags = photo.json.tags.split(','); + tags.splice(index, 1); + + // Save + photo.json.tags = tags.toString(); + photo.setTags([photoID], photo.json.tags); + +} + +photo.share = function(photoID, service) { + + var link = "", + url = photo.getViewLink(photoID), + filename = "unknown"; + + 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(photo.json.title); + break; + case 2: + link = "mailto:?subject=" + encodeURI(photo.json.title) + "&body=" + encodeURI(url); + break; + case 3: + lychee.loadDropbox(function() { + filename = photo.json.title + "." + photo.getDirectLink().split('.').pop(); + Dropbox.save(photo.getDirectLink(), filename); + }); + break; + default: + link = ""; + break; + } + + if (link.length>5) location.href = link; + +} + +photo.getSize = function() { + + // Size can be 'big, medium, small' + // Default is big + // Small is centered in the middle of the screen + var size = "big", + scaled = false, + hasMedium = photo.json.medium!=="", + pixelRatio = window.devicePixelRatio, + view = { + width: $(window).width()-60, + height: $(window).height()-100 + }; + + // Detect if the photo will be shown scaled, + // because the screen size is smaller than the photo + if (photo.json.width>view.width|| + photo.json.width>view.height) scaled = true; + + // Calculate pixel ratio of screen + if (pixelRatio!==undefined&&pixelRatio>1) { + view.width = view.width * pixelRatio; + view.height = view.height * pixelRatio; + } + + // Medium available and + // Medium still bigger than screen + if (hasMedium===true&& + (1920>view.width&&1080>view.height)) size = "medium"; + + // Photo not scaled + // Photo smaller then screen + if (scaled===false&& + (photo.json.width0) 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; + +} + +photo.getDirectLink = function() { + + var url = ""; + + if (photo.json&& + photo.json.url&& + photo.json.url!=="") url = photo.json.url; + + return url; + +} + +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); + +} \ No newline at end of file