init.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. /**
  2. * @description This module is used for bindings.
  3. * @copyright 2014 by Tobias Reich
  4. */
  5. $(document).ready(function() {
  6. /* Event Name */
  7. var event_name = (mobileBrowser()) ? 'touchend' : 'click';
  8. /* Disable ContextMenu */
  9. $(document).bind('contextmenu', function(e) { e.preventDefault() });
  10. /* Multiselect */
  11. $('#content') .on('mousedown', multiselect.show);
  12. $(document) .on('mouseup', multiselect.getSelection);
  13. /* Header */
  14. lychee.header.find('#title').on(event_name, function(e) {
  15. if (!$(this).hasClass('editable')) return false;
  16. if (visible.photo()) photo.setTitle([photo.getID()]);
  17. else contextMenu.albumTitle([album.getID()], e);
  18. });
  19. lychee.header.find('#button_share').on(event_name, function(e) {
  20. if (photo.json.public==1||photo.json.public==2) contextMenu.sharePhoto(photo.getID(), e);
  21. else photo.setPublic(photo.getID(), e);
  22. });
  23. lychee.header.find('#button_share_album').on(event_name, function(e) {
  24. if (album.json.public==1) contextMenu.shareAlbum(album.getID(), e);
  25. else album.setPublic(album.getID(), e);
  26. });
  27. lychee.header.find('#button_signin') .on(event_name, lychee.loginDialog);
  28. lychee.header.find('#button_settings') .on(event_name, contextMenu.settings);
  29. lychee.header.find('#button_info_album') .on(event_name, view.infobox.show);
  30. lychee.header.find('#button_info') .on(event_name, view.infobox.show);
  31. lychee.header.find('.button_add') .on(event_name, contextMenu.add);
  32. lychee.header.find('#button_more') .on(event_name, function(e) { contextMenu.photoMore(photo.getID(), e) });
  33. lychee.header.find('#button_move') .on(event_name, function(e) { contextMenu.move([photo.getID()], e) });
  34. lychee.header.find('#hostedwith') .on(event_name, function() { window.open(lychee.website) });
  35. lychee.header.find('#button_trash_album') .on(event_name, function() { album.delete([album.getID()]) });
  36. lychee.header.find('#button_trash') .on(event_name, function() { photo.delete([photo.getID()]) });
  37. lychee.header.find('#button_archive') .on(event_name, function() { album.getArchive(album.getID()) });
  38. lychee.header.find('#button_star') .on(event_name, function() { photo.setStar([photo.getID()]) });
  39. lychee.header.find('#button_back_home') .on(event_name, function() { lychee.goto('') });
  40. lychee.header.find('#button_back') .on(event_name, function() { lychee.goto(album.getID()) });
  41. /* Search */
  42. lychee.header.find('#search').on('keyup click', function() { search.find($(this).val()) });
  43. /* Clear Search */
  44. lychee.header.find('#clearSearch').on(event_name, function () {
  45. lychee.header.find('#search').focus();
  46. search.reset();
  47. });
  48. /* Infobox */
  49. lychee.infobox.find('.header .close').on(event_name, view.infobox.hide);
  50. /* Image View */
  51. lychee.imageview
  52. .on(event_name, '.arrow_wrapper--previous', photo.previous)
  53. .on(event_name, '.arrow_wrapper--next', photo.next);
  54. /* Infobox */
  55. lychee.infobox
  56. .on(event_name, '#edit_title_album', function() { album.setTitle([album.getID()]) })
  57. .on(event_name, '#edit_description_album', function() { album.setDescription(album.getID()) })
  58. .on(event_name, '#edit_title', function() { photo.setTitle([photo.getID()]) })
  59. .on(event_name, '#edit_description', function() { photo.setDescription(photo.getID()) })
  60. .on(event_name, '#edit_tags', function() { photo.editTags([photo.getID()]) })
  61. .on(event_name, '#tags .tag span', function() { photo.deleteTag(photo.getID(), $(this).data('index')) });
  62. /* Keyboard */
  63. Mousetrap
  64. .bind('left', function() { if (visible.photo()) $('#imageview a#previous').click() })
  65. .bind('right', function() { if (visible.photo()) $('#imageview a#next').click() })
  66. .bind(['u', 'ctrl+u'], function() { $('#upload_files').click() })
  67. .bind(['s', 'ctrl+s', 'f', 'ctrl+f'], function(e) {
  68. if (visible.photo()) {
  69. lychee.header.find('#button_star').click();
  70. } else if (visible.albums()) {
  71. e.preventDefault();
  72. lychee.header.find('#search').focus();
  73. }
  74. })
  75. .bind(['r', 'ctrl+r'], function(e) {
  76. e.preventDefault();
  77. if (visible.album()) album.setTitle(album.getID());
  78. else if (visible.photo()) photo.setTitle([photo.getID()]);
  79. })
  80. .bind(['d', 'ctrl+d'], function(e) {
  81. e.preventDefault();
  82. if (visible.photo()) photo.setDescription(photo.getID());
  83. else if (visible.album()) album.setDescription(album.getID());
  84. })
  85. .bind(['t', 'ctrl+t'], function(e) {
  86. if (visible.photo()) {
  87. e.preventDefault();
  88. photo.editTags([photo.getID()]);
  89. }
  90. })
  91. .bind(['i', 'ctrl+i'], function() {
  92. if (visible.infobox()) view.infobox.hide();
  93. else if (visible.multiselect()) return false;
  94. else if (visible.infoboxbutton()) view.infobox.show();
  95. })
  96. .bind(['command+backspace', 'ctrl+backspace'], function() {
  97. if (visible.photo()&&!visible.message()) photo.delete([photo.getID()]);
  98. else if (visible.album()&&!visible.message()) album.delete([album.getID()]);
  99. })
  100. .bind(['command+a', 'ctrl+a'], function() {
  101. if (visible.album()&&!visible.message()) multiselect.selectAll();
  102. else if (visible.albums()&&!visible.message()) multiselect.selectAll();
  103. });
  104. Mousetrap.bindGlobal('enter', function() {
  105. if ($('.message .button.active').length) $('.message .button.active').addClass('pressed').click()
  106. });
  107. Mousetrap.bindGlobal(['esc', 'command+up'], function(e) {
  108. e.preventDefault();
  109. if (visible.message()&&$('.message .close').length>0) modal.close();
  110. else if (visible.contextMenu()) contextMenu.close();
  111. else if (visible.infobox()) view.infobox.hide();
  112. else if (visible.photo()) lychee.goto(album.getID());
  113. else if (visible.album()) lychee.goto('');
  114. else if (visible.albums()&&$('#search').val().length!==0) search.reset();
  115. });
  116. if (mobileBrowser()) {
  117. $(document)
  118. /* Fullscreen on mobile */
  119. .on('touchend', '#image', function(e) {
  120. if (swipe.obj===null||(swipe.offset>=-5&&swipe.offset<=5)) {
  121. if (visible.controls()) view.header.hide(e, 0);
  122. else view.header.show();
  123. }
  124. })
  125. /* Swipe on mobile */
  126. .swipe().on('swipeStart', function() { if (visible.photo()) swipe.start($('#image')) })
  127. .swipe().on('swipeMove', function(e) { if (visible.photo()) swipe.move(e.swipe) })
  128. .swipe().on('swipeEnd', function(e) { if (visible.photo()) swipe.stop(e.swipe, photo.previous, photo.next) });
  129. }
  130. /* Document */
  131. $(document)
  132. /* Login */
  133. .on('keyup', '#password', function() { if ($(this).val().length>0) $(this).removeClass('error') })
  134. /* Navigation */
  135. .on('click', '.album', function() { lychee.goto($(this).attr('data-id')) })
  136. .on('click', '.photo', function() { lychee.goto(album.getID() + '/' + $(this).attr('data-id')) })
  137. /* Modal */
  138. .on(event_name, '.message .close', modal.close)
  139. .on(event_name, '.message .button:first', function() { if (modal.fns!==null) modal.fns[0](); if (!visible.signin()) modal.close() })
  140. .on(event_name, '.message .button:last', function() { if (modal.fns!==null) modal.fns[1](); if (!visible.signin()) modal.close() })
  141. /* Context Menu */
  142. .on('contextmenu', '.photo', function(e) { contextMenu.photo(photo.getID(), e) })
  143. .on('contextmenu', '.album', function(e) { contextMenu.album(album.getID(), e) })
  144. /* Infobox */
  145. .on(event_name, '#infobox_overlay', view.infobox.hide)
  146. /* Upload */
  147. .on('change', '#upload_files', function() { modal.close(); upload.start.local(this.files) })
  148. .on(event_name, '.upload_message a.close', upload.close)
  149. .on('dragover', function(e) { e.preventDefault(); }, false)
  150. .on('drop', function(e) {
  151. e.stopPropagation();
  152. e.preventDefault();
  153. // Close open overlays or views which are correlating with the upload
  154. if (visible.photo()) lychee.goto(album.getID());
  155. if (visible.contextMenu()) contextMenu.close();
  156. // Detect if dropped item is a file or a link
  157. if (e.originalEvent.dataTransfer.files.length>0) upload.start.local(e.originalEvent.dataTransfer.files);
  158. else if (e.originalEvent.dataTransfer.getData('Text').length>3) upload.start.url(e.originalEvent.dataTransfer.getData('Text'));
  159. return true;
  160. });
  161. /* Init */
  162. lychee.init();
  163. });