"use strict"; var TODO = function () { var base_url = '/~andrew/user-bin/todo-rest.cgi', editors = {}, makeEntryEditor = function (list, entry) { var url = base_url + '/' + list + '/entry/' + entry.line, id = entry.id; if (!id) { id = 'entry_' + entry.line; } if (editors[id]) { editors[id].dispose(); delete editors[id]; } editors[id] = new Ajax.InPlaceEditor(id, url + '.json', { ajaxOptions: { method: 'put' }, cols: 80, rows: 1, callback: function (form, value) { entry.oldText = entry.text; entry.text = value; return entry; }, onComplete: function (transport, element) { if (transport && transport.responseJSON) { updateEntry(list, transport.responseJSON, element); } } }); }, getList = function (list) { $('list').update("Getting List . . ."); var request = new Ajax.Request(base_url + '/' + list + '.json', { method: 'get', onSuccess: function (transport) { updateList(list, transport); }, }); }, updateEntry = function (list, entry, element) { if (!entry.id) { entry.id = 'entry_' + entry.line; } var k, liId = 'li_' + entry.id; if (parseInt(entry.line) !== $(liId).value) { for (k in editors) { if (editors.hasOwnProperty(k)) { editors[k].dispose(); delete editors[k]; } } return getList(list); } $(liId).update( new Element('span', { id: entry.id }).update(entry.text)).insert({ top: new Element('input', { type: 'checkbox', id: 'do_' + entry.line, checked: entry.done, disabled: true, }) }); makeEntryEditor(list, entry); }, updateList = function (list, transport) { var i, todo = transport.responseJSON, element = new Element('ol'), entryElement; $("list").update(element); for (i = 0; i <= todo.length; i++) { todo[i].id = 'entry_' + todo[i].line; entryElement = new Element('li', { id: 'li_' + todo[i].id, value: todo[i].line }); element.insert(entryElement); updateEntry(list, todo[i], entryElement); } }, getFiles = function () { $('files').update("Getting Files . . ."); var request = new Ajax.Updater('files', base_url, { method: 'get' }); }, getTags = function (list) { $('tags').update("Getting Tags. . ."); var url = base_url + '/' + list + '/tags'; var request = new Ajax.Request(url + '.json', { method: 'get', onSuccess: function (transport) { var k, data = transport.responseJSON, element = new Element('ul'); $("tags").update(element); for (k in data) { if (data.hasOwnProperty(k)) { element.insert( new Element('li', { id: 'tag_' + k, }).update(k + ": " + data[k])); getTag(list, k); } } }, }); }, getTag = function (list, tag) { var request = new Ajax.Request(base_url + '/' + list + '/tags/' + tag + '.json', { method: 'get', onSuccess: function (transport) { if (transport && transport.responseJSON) { var i, myTags = transport.responseJSON, element = new Element('ul'); if (myTags.length) { $('tag_' + tag).insert(element); for (i = 0; i < myTags.length; i++) { element.insert(new Element('li'). update(myTags[i])); } } } } }); }; return { getList: getList, getFiles: getFiles, getTags: getTags, }; }();