[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.1, Tue Feb 23 03:01:04 2010 UTC (14 years, 4 months ago) by andrew
Branch: MAIN

split out the javascript

var TODO = function () {
    var base_url = '/~andrew/user-bin/todo.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', {
                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,
    };
}();