var user = 0; var selectedMessage = 0; var selectedItem = null; var coreUrl = "https://cmsc106.net/mail/"; var activeMessage = 0; var activeRecipients = []; function receiveUser(data) { user = data.userid; loadHandles(); document.getElementById('login_div').style.display='none'; document.getElementById('main_div').style.display=''; } function doLogin() { var url = coreUrl + "user?user="+document.getElementById('user_field').value+"&password="+document.getElementById('password_field').value; document.getElementById('login_error').textContent = ''; fetch(url).then(function(response) { if (!response.ok) { throw new Error("HTTP error: " + response.status); } return response.json(); }).then(receiveUser) .catch(function(error) { document.getElementById('login_error').textContent = 'Login failed. Please check your user name and password.'; }); } function doCreateAccount() { var url = coreUrl + "user"; var account = {name: document.getElementById('user_field').value, password: document.getElementById('password_field').value}; var toSend = JSON.stringify(account); document.getElementById('login_error').textContent = ''; fetch(url, { method: 'POST', body: toSend, headers: {'Content-Type':'application/json'} }).then(function(response) { if (!response.ok) { throw new Error("HTTP error: " + response.status); } return response.json(); }).then(receiveUser) .catch(function(error) { document.getElementById('login_error').textContent = 'Could not create account. Please try again.'; }); } function setSelection() { if(selectedItem) selectedItem.classList.remove('active'); selectedItem = this; this.classList.add('active'); selectedMessage = this.getAttribute('data-message'); } function receiveHandles(data) { var handlesList = document.getElementById('handles'); handlesList.replaceChildren(); var handle; for(handle of data) { var newEntry = document.createElement('li'); newEntry.setAttribute('class','list-group-item'); newEntry.textContent = handle.sender + ":" + handle.subject; newEntry.setAttribute('data-message',handle.messageId); newEntry.addEventListener('click', setSelection); handlesList.appendChild(newEntry); } } function loadHandles() { var url = coreUrl + "handles?receiver="+user; fetch(url).then(function(response){return response.json();}).then(receiveHandles); } function formatSentDate(timestamp) { var datePart = timestamp.split(/[T ]/)[0]; var parts = datePart.split('-'); var months = ['January','February','March','April','May','June', 'July','August','September','October','November','December']; return months[parseInt(parts[1],10) - 1] + " " + parseInt(parts[2],10) + ", " + parts[0]; } function receiveMessage(data) { document.getElementById('main_div').style.display='none'; document.getElementById('sender_area').textContent = data.sender; document.getElementById('sent_area').textContent = formatSentDate(data.sent); document.getElementById('body_area').value = data.body; document.getElementById('read_div').style.display=''; } function doRead() { var url = coreUrl + "message/"+selectedMessage; fetch(url).then(function(response){return response.json();}).then(receiveMessage); } function doCompose() { document.getElementById('main_div').style.display='none'; document.getElementById('content_area').value = ''; document.getElementById('subject_field').value = ''; document.getElementById('recipients_field').value = ''; document.getElementById('compose_div').style.display=''; } function closeRead() { document.getElementById('read_div').style.display='none'; loadHandles(); document.getElementById('main_div').style.display=''; } function deleteMessage() { var url = coreUrl + "recipient/"+user+"/message/" + selectedMessage; fetch(url, {method:'DELETE'}).then(closeRead); } function sendOneRecipient(data) { if(activeRecipients.length > 0) { var recipient = activeRecipients[0]; activeRecipients.splice(0,1); var url = coreUrl + "recipient"; var recipientObj = {message:activeMessage, recipient:recipient}; var toSend = JSON.stringify(recipientObj); fetch(url, { method: 'POST', body: toSend, headers: {'Content-Type':'application/json'} }).then(sendOneRecipient); } else closeCompose(); } function sendRecipients(data) { activeMessage = data.messageId; activeRecipients = document.getElementById('recipients_field').value.split(','); sendOneRecipient(); } function sendMessage() { var url = coreUrl + "message"; var message = {subject:document.getElementById('subject_field').value, body:document.getElementById('content_area').value, sender:user}; var toSend = JSON.stringify(message); fetch(url, { method: 'POST', body: toSend, headers: {'Content-Type':'application/json'} }).then(function(response){return response.json();}).then(sendRecipients); } function closeCompose() { document.getElementById('compose_div').style.display='none'; loadHandles(); document.getElementById('main_div').style.display=''; } function setup() { document.getElementById('main_div').style.display='none'; document.getElementById('read_div').style.display='none'; document.getElementById('compose_div').style.display='none'; document.getElementById('login_button').addEventListener('click',doLogin); document.getElementById('new_account_button').addEventListener('click',doCreateAccount); document.getElementById('read_button').addEventListener('click',doRead); document.getElementById('compose_button').addEventListener('click',doCompose); document.getElementById('close_button').addEventListener('click',closeRead); document.getElementById('delete_button').addEventListener('click',deleteMessage); document.getElementById('send_button').addEventListener('click',sendMessage); document.getElementById('cancel_button').addEventListener('click',closeCompose); } window.addEventListener('load',setup,false)