[BACK]Return to todo.js CVS log [TXT][DIR] Up to [local] / todotxt / Text-Todo-REST-API / example / htdocs / lib

File: [local] / todotxt / Text-Todo-REST-API / example / htdocs / lib / todo.js (download)

Revision 1.3, Tue Feb 23 05:34:26 2010 UTC (14 years, 4 months ago) by andrew
Branch: MAIN
CVS Tags: HEAD
Changes since 1.2: +69 -70 lines

prettify, run through some jslint, but I don't know that I agree with it all
yet.

"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,
    };
}();