| 
									
										
										
										
											2017-08-29 22:25:58 -04:00
										 |  |  | const tags = { | 
					
						
							| 
									
										
										
										
											2017-06-11 16:04:07 -04:00
										 |  |  |     1: "<b>", | 
					
						
							|  |  |  |     2: "</b>", | 
					
						
							|  |  |  |     3: "<i>", | 
					
						
							|  |  |  |     4: "</i>", | 
					
						
							|  |  |  |     5: "<u>", | 
					
						
							|  |  |  |     6: "</u>", | 
					
						
							|  |  |  |     9: "<s>", | 
					
						
							|  |  |  |     10: "</s>" | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 21:04:04 -04:00
										 |  |  | let noteChangeDisabled = false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-16 20:41:41 -04:00
										 |  |  | let isNoteChanged = false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 16:04:07 -04:00
										 |  |  | function noteChanged() { | 
					
						
							| 
									
										
										
										
											2017-06-11 21:04:04 -04:00
										 |  |  |     if (noteChangeDisabled) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-16 20:41:41 -04:00
										 |  |  |     isNoteChanged = true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function saveNoteIfChanged(callback) { | 
					
						
							|  |  |  |     if (!isNoteChanged) { | 
					
						
							|  |  |  |         if (callback) { | 
					
						
							|  |  |  |             callback(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 16:04:07 -04:00
										 |  |  |     let note = globalNote; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let contents = $('#noteDetail').summernote('code'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-21 20:34:17 -04:00
										 |  |  |     html2notecase(contents, note); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 16:04:07 -04:00
										 |  |  |     let title = $('#noteTitle').val(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $("#tree").fancytree('getNodeByKey', note.detail.note_id).setTitle(title); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     note.detail.note_title = title; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-27 10:30:32 -04:00
										 |  |  |     globalNoteNames[note.detail.note_id] = title; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 16:04:07 -04:00
										 |  |  |     $.ajax({ | 
					
						
							| 
									
										
										
										
											2017-08-23 21:43:02 -04:00
										 |  |  |         url: baseUrl + 'notes/' + note.detail.note_id, | 
					
						
							| 
									
										
										
										
											2017-06-11 16:04:07 -04:00
										 |  |  |         type: 'PUT', | 
					
						
							|  |  |  |         data: JSON.stringify(note), | 
					
						
							|  |  |  |         contentType: "application/json", | 
					
						
							| 
									
										
										
										
											2017-08-23 21:43:02 -04:00
										 |  |  |         success: function() { | 
					
						
							| 
									
										
										
										
											2017-08-16 20:41:41 -04:00
										 |  |  |             isNoteChanged = false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 16:04:07 -04:00
										 |  |  |             message("Saved!"); | 
					
						
							| 
									
										
										
										
											2017-08-16 20:41:41 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if (callback) { | 
					
						
							|  |  |  |                 callback(); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2017-08-13 21:42:10 -04:00
										 |  |  |         }, | 
					
						
							| 
									
										
										
										
											2017-08-23 21:43:02 -04:00
										 |  |  |         error: function() { | 
					
						
							| 
									
										
										
										
											2017-08-13 21:42:10 -04:00
										 |  |  |             error("Error saving the note!"); | 
					
						
							| 
									
										
										
										
											2017-06-11 16:04:07 -04:00
										 |  |  |         } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-16 20:41:41 -04:00
										 |  |  | setInterval(saveNoteIfChanged, 5000); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 16:04:07 -04:00
										 |  |  | $(document).ready(function() { | 
					
						
							|  |  |  |     $("#noteTitle").on('input', function() { | 
					
						
							|  |  |  |         noteChanged(); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $('#noteDetail').summernote({ | 
					
						
							|  |  |  |         airMode: true, | 
					
						
							| 
									
										
										
										
											2017-06-11 21:04:04 -04:00
										 |  |  |         height: 300, | 
					
						
							| 
									
										
										
										
											2017-06-11 16:04:07 -04:00
										 |  |  |         callbacks: { | 
					
						
							|  |  |  |             onChange: noteChanged | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2017-08-25 19:30:26 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // so that tab jumps from note title (which has tabindex 1)
 | 
					
						
							|  |  |  |     $(".note-editable").attr("tabindex", 2); | 
					
						
							| 
									
										
										
										
											2017-06-11 16:04:07 -04:00
										 |  |  | }); | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  | var globalNote; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 21:04:04 -04:00
										 |  |  | function createNewTopLevelNote() { | 
					
						
							|  |  |  |     let rootNode = $("#tree").fancytree("getRootNode"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     createNote(rootNode, "root", "into"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-13 22:36:56 -04:00
										 |  |  | let newNoteCreated = false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 16:04:07 -04:00
										 |  |  | function createNote(node, parentKey, target) { | 
					
						
							|  |  |  |     let newNoteName = "new note"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $.ajax({ | 
					
						
							|  |  |  |         url: baseUrl + 'notes/' + parentKey + '/children' , | 
					
						
							|  |  |  |         type: 'POST', | 
					
						
							|  |  |  |         data: JSON.stringify({ | 
					
						
							|  |  |  |             note_title: newNoteName, | 
					
						
							|  |  |  |             target: target, | 
					
						
							|  |  |  |             target_note_id: node.key | 
					
						
							|  |  |  |         }), | 
					
						
							|  |  |  |         contentType: "application/json", | 
					
						
							|  |  |  |         success: function(result) { | 
					
						
							|  |  |  |             let newNode = { | 
					
						
							|  |  |  |                 "title": newNoteName, | 
					
						
							|  |  |  |                 "key": result.note_id, | 
					
						
							|  |  |  |                 "note_id": result.note_id | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-27 10:30:32 -04:00
										 |  |  |             globalNoteNames[result.note_id] = newNoteName; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-13 22:36:56 -04:00
										 |  |  |             newNoteCreated = true; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-21 21:31:23 -04:00
										 |  |  |             if (target === 'after') { | 
					
						
							| 
									
										
										
										
											2017-06-11 16:04:07 -04:00
										 |  |  |                 node.appendSibling(newNode).setActive(true); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else { | 
					
						
							|  |  |  |                 node.addChildren(newNode).setActive(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 node.folder = true; | 
					
						
							|  |  |  |                 node.renderTitle(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             message("Created!"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-22 22:40:54 -04:00
										 |  |  | recentNotes = []; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 16:04:07 -04:00
										 |  |  | function loadNote(noteId) { | 
					
						
							|  |  |  |     $.get(baseUrl + 'notes/' + noteId).then(function(note) { | 
					
						
							|  |  |  |         globalNote = note; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $("#noteTitle").val(note.detail.note_title); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-13 22:36:56 -04:00
										 |  |  |         if (newNoteCreated) { | 
					
						
							|  |  |  |             newNoteCreated = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $("#noteTitle").focus().select(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 16:04:07 -04:00
										 |  |  |         let noteText = notecase2html(note); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 21:04:04 -04:00
										 |  |  |         noteChangeDisabled = true; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-28 21:41:04 -04:00
										 |  |  |         // Clear contents and remove all stored history. This is to prevent undo from going across notes
 | 
					
						
							|  |  |  |         $('#noteDetail').summernote('reset'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 16:04:07 -04:00
										 |  |  |         $('#noteDetail').summernote('code', noteText); | 
					
						
							| 
									
										
										
										
											2017-06-11 21:04:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-22 21:32:03 -04:00
										 |  |  |         document.location.hash = noteId; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-15 22:32:30 -04:00
										 |  |  |         $(window).resize(); // to trigger resizing of editor
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-27 10:30:32 -04:00
										 |  |  |         addRecentNote(noteId, note.detail.note_id); | 
					
						
							| 
									
										
										
										
											2017-08-22 22:40:54 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 21:04:04 -04:00
										 |  |  |         noteChangeDisabled = false; | 
					
						
							| 
									
										
										
										
											2017-06-11 16:04:07 -04:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2017-08-21 20:34:17 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-27 10:30:32 -04:00
										 |  |  | function addRecentNote(noteTreeId, noteContentId) { | 
					
						
							| 
									
										
										
										
											2017-08-23 19:57:44 -04:00
										 |  |  |     const origDate = new Date(); | 
					
						
							| 
									
										
										
										
											2017-08-22 22:40:54 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-23 19:57:44 -04:00
										 |  |  |     setTimeout(function() { | 
					
						
							|  |  |  |         // we include the note into recent list only if the user stayed on the note at least 5 seconds
 | 
					
						
							| 
									
										
										
										
											2017-08-23 23:42:26 -04:00
										 |  |  |         if (noteTreeId === globalNote.detail.note_id || noteContentId === globalNote.detail.note_id) { | 
					
						
							| 
									
										
										
										
											2017-08-23 19:57:44 -04:00
										 |  |  |             // if it's already there, remove the note
 | 
					
						
							| 
									
										
										
										
											2017-08-27 14:39:26 -04:00
										 |  |  |             c = recentNotes.filter(note => note !== noteTreeId); | 
					
						
							| 
									
										
										
										
											2017-08-23 19:57:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-27 14:39:26 -04:00
										 |  |  |             //console.log("added after " + (new Date().getTime() - origDate.getTime()));
 | 
					
						
							| 
									
										
										
										
											2017-08-23 19:57:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-27 10:30:32 -04:00
										 |  |  |             recentNotes.unshift(noteTreeId); | 
					
						
							| 
									
										
										
										
											2017-08-23 19:57:44 -04:00
										 |  |  |         } | 
					
						
							|  |  |  |     }, 1500); | 
					
						
							| 
									
										
										
										
											2017-08-22 22:40:54 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-21 20:34:17 -04:00
										 |  |  | function encryptNote() { | 
					
						
							|  |  |  |     let password = prompt("Enter password for encryption"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     console.log(password); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // 12 takes about 400 ms on my computer to compute
 | 
					
						
							|  |  |  |     let salt = dcodeIO.bcrypt.genSaltSync(12); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let hashedPassword = dcodeIO.bcrypt.hashSync(password, salt); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let hashedPasswordSha = sha256(hashedPassword).substr(0, 32); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     console.log(hashedPassword); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let note = globalNote; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let contents = $('#noteDetail').summernote('code'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     html2notecase(contents, note); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let noteJson = JSON.stringify(note); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     console.log('json: ' + noteJson); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let hashedPasswordBytes = aesjs.utils.hex.toBytes(hashedPasswordSha); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let noteBytes = aesjs.utils.utf8.toBytes(noteJson); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let aesCtr = new aesjs.ModeOfOperation.ctr(hashedPasswordBytes, new aesjs.Counter(5)); | 
					
						
							|  |  |  |     let encryptedBytes = aesCtr.encrypt(noteBytes); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // To print or store the binary data, you may convert it to hex
 | 
					
						
							|  |  |  |     let encryptedHex = aesjs.utils.hex.fromBytes(encryptedBytes); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     console.log("encrypted: " + encryptedBytes); | 
					
						
							| 
									
										
										
										
											2017-06-11 16:04:07 -04:00
										 |  |  | } |