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);
}
}
}
);
},
updateEntry = function(list, entry, element) {
if (!entry.id) {
entry.id = 'entry_' + entry.line;
}
var 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 . . .");
new Ajax.Updater('files', base_url, {
method: 'get',
});
},
getTags = function (list) {
$('tags').update("Getting Tags. . .");
var url = base_url + '/' + list + '/tags';
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 ) {
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] ));
}
}
}
}
});
},
getList = function (list) {
$('list').update("Getting List . . .");
new Ajax.Request(base_url + '/' + list + '.json', {
method: 'get',
onSuccess: function (transport) { updateList(list, transport) },
});
};
return {
getList: getList,
getFiles: getFiles,
getTags: getTags,
};
}();