define(["sugar-web/activity/activity","webL10n","sugar-web/datastore","activity/model","activity/view","activity/controller"], function (activity, webL10n, datastore, model, view, controller) { // Manipulate the DOM only when it is ready. requirejs(['domReady!'], function (doc) { var todo; // Initialize the activity. activity.setup(); document.getElementById("new-todo").placeholder = l10n_s.get("new-todo"); var stopButton = document.getElementById("stop-button"); stopButton.addEventListener('click', function (event) { console.log("writing..."); var jsonData = JSON.stringify(todo.model.items); activity.getDatastoreObject().setDataAsText(jsonData); activity.getDatastoreObject().save(function (error) { if (error === null) { console.log("write done."); } else { console.log("write failed."); } }); }); var draggedElement; // save the dragged element globally document.allowDrop = function(ev) { ev.preventDefault(); } document.drag = function(ev) { draggedElement = ev.target; ev.dataTransfer.setData("text/plain", ev.target.id); } document.drop = function(ev) { ev.preventDefault(); var draggedElementLabel = draggedElement.childNodes[0].childNodes[1]; var draggedElementID = parseInt(draggedElement.dataset.id); var droppedOnElementLabel = ev.target; var droppedOnElement = ev.target.parentNode.parentNode; var droppedOnElementID = parseInt(droppedOnElement.dataset.id); // Swap the labels (visual) var tempSaveLabel = droppedOnElementLabel.innerText; droppedOnElementLabel.innerText = draggedElementLabel.innerText; draggedElementLabel.innerText = tempSaveLabel; // Swap the complete and checked boxes (visual) // swap complete attribute var tempSaveCompleteVisual = droppedOnElement.className; droppedOnElement.className = draggedElement.className; draggedElement.className = tempSaveCompleteVisual; // swap check box (visual) if (droppedOnElement.childNodes[0].childNodes[0].hasAttribute("checked")) { if (! draggedElement.childNodes[0].childNodes[0].hasAttribute("checked")) { // swap: uncheck droppedOnElement and check draggedElement droppedOnElement.childNodes[0].childNodes[0].removeAttribute("checked"); draggedElement.childNodes[0].childNodes[0].setAttribute("checked", null); } // else do nothing } else if (draggedElement.childNodes[0].childNodes[0].hasAttribute("checked")) { if (! droppedOnElement.childNodes[0].childNodes[0].hasAttribute("checked")) { // swap: uncheck draggedOnElement and check droppedOnElement draggedElement.childNodes[0].childNodes[0].removeAttribute("checked"); droppedOnElement.childNodes[0].childNodes[0].setAttribute("checked", null); } // else do nothing } // Find the index of the labels in the controler and overwritte the labels and completed elements var draggedElementIndex = todo.controller.model.items.map(function(x) { return x.id; }).indexOf(draggedElementID); var droppedOnElementIndex = todo.controller.model.items.map(function(x) { return x.id; }).indexOf(droppedOnElementID); // swap the labels in the controller todo.controller.model.items[draggedElementIndex].title = draggedElementLabel.innerText; todo.controller.model.items[droppedOnElementIndex].title = droppedOnElementLabel.innerText; // swap the completed elements in the controller var tempSaveCompleteInController = parseInt(todo.controller.model.items[droppedOnElementIndex].completed); todo.controller.model.items[droppedOnElementIndex].completed = todo.controller.model.items[draggedElementIndex].completed; todo.controller.model.items[draggedElementIndex].completed = tempSaveCompleteInController; } // Set up a brand new TODO list function Todo() { this.model = new model.Model(); this.view = new view.View(); this.controller = new controller.Controller(this.model, this.view); } todo = new Todo(); var datastoreObject = activity.getDatastoreObject(); function onLoaded(error, metadata, data) { todo.controller.loadItems(JSON.parse(data)); } datastoreObject.loadAsText(onLoaded); var input = document.getElementById("new-todo"); input.addEventListener('keypress', function (e) { if (e.keyCode === todo.controller.ENTER_KEY) { var success = todo.controller.addItem(e.target.value); if (success) { e.target.value = ''; } } }); var inputButton = document.getElementById("new-todo-button"); inputButton.addEventListener('click', function (e) { var success = todo.controller.addItem(input.value); if (success) { input.value = ''; } }); // Find the model ID of the clicked DOM element function lookupId(target) { var lookup = target; while (lookup.nodeName !== 'LI') { lookup = lookup.parentNode; } return lookup.dataset.id; } var list = document.getElementById("todo-list"); list.addEventListener('click', function (e) { var target = e.target; if (target.className.indexOf('remove') > -1) { todo.controller.removeItem(lookupId(target)); } if (target.className.indexOf('toggle') > -1) { todo.controller.toggleComplete(lookupId(target), target); } }); }); });