// import Divmod.Runtime

// import Nevow.Athena
// import Fadomatic
// import Mantissa

Mantissa.TDB.Controller = Nevow.Athena.Widget.subclass('Mantissa.TDB.Controller');
Mantissa.TDB.Controller.methods(
    function __init__(self, node, hasPrevPage, hasNextPage, curPage, itemsPerPage, items) {
        Mantissa.TDB.Controller.upcall(self, '__init__', node);
        self.tdbElements = {};
        self._setPageState(hasPrevPage, hasNextPage, curPage, itemsPerPage, items);
    },

    function _toggleThrobberVisibility(self) {
        if(!self.node.style.opacity || self.node.style.opacity == '1') {
            self.node.style.opacity = '.3';
        } else {
            self.node.style.opacity = '1';
        }

        try {
            var t = self._getHandyNode('throbber');
        } catch(e) { return };

        if(!t) {
            return;
        }

        if(t.style.visibility == 'hidden') {
            t.style.visibility = 'visible';
        } else {
            t.style.visibility = 'hidden';
        }
    },

    function _setTableContent(self, tableContent) {
        Divmod.Runtime.theRuntime.setNodeContent(self._getHandyNode("tdb-table"),
                                '<div xmlns="http://www.w3.org/1999/xhtml">' + tableContent + '</div>');
    },

    function _getHandyNode(self, classValue) {
        if(!(classValue in self.tdbElements)) {
            self.tdbElements[classValue] = self.nodeByAttribute('class', classValue);
        }
        return self.tdbElements[classValue];
    },

    function _differentPage(self /*, ...*/) {
        self._toggleThrobberVisibility();

        var args = [];
        for (var i = 1; i < arguments.length; ++i) {
            args.push(arguments[i]);
        }

        var d = self.callRemote.apply(self, args);
        d.addCallback(function(result) {
                          var tdbTable = result[0];
                          var tdbState = result[1];
                          self._setTableContent(tdbTable);
                          self._setPageState.apply(self, tdbState);
                      });
        d.addBoth(function(ign) { self._toggleThrobberVisibility() });
        return false;
    },

    function _setPageState(self, hasPrevPage, hasNextPage, curPage, itemsPerPage, items) {
        var cp = self._getHandyNode("tdb-control-panel");
        if(items == 0) {
            cp.style.display = "none";
        } else {
            cp.style.display = "";
        }
        function setValue(eid, value) {
            var e = self._getHandyNode(eid);
            if(e.childNodes.length == 0) {
                e.appendChild(document.createTextNode(value));
            } else {
                e.firstChild.nodeValue = value;
            }
        }

        var offset = (curPage - 1) * itemsPerPage + 1;
        var end = offset + itemsPerPage - 1;
        if(items < end) {
            end = items;
        }
        setValue("tdb-item-start", offset);
        setValue("tdb-item-end", end);
        setValue("tdb-total-items", items);

        function enable(things) {
            for(var i = 0; i < things.length; i++) {
                var thing = things[i];
                self._getHandyNode(thing).style.display = "inline";
                self._getHandyNode(thing + "-disabled").style.display = "none";
            }
        }

        function disable(things) {
            for(var i = 0; i < things.length; i++) {
                var thing = things[i];
                self._getHandyNode(thing + "-disabled").style.display = "inline";
                self._getHandyNode(thing).style.display = "none";
            }
        }

        var prevs = ["prev-page", "first-page"];
        var nexts = ["next-page", "last-page"];

        if (hasPrevPage) {
            enable(prevs);
        } else {
            disable(prevs);
        }
        if (hasNextPage) {
            enable(nexts);
        } else {
            disable(nexts);
        }

    },

    function prevPage(self) {
        return self._differentPage('prevPage');
    },

    function nextPage(self) {
        return self._differentPage('nextPage');
    },

    function firstPage(self) {
        return self._differentPage('firstPage');
    },

    function lastPage(self) {
        return self._differentPage('lastPage');
    },

    function performAction(self, actionID, targetID) {
        self._toggleThrobberVisibility();

        var d = self.callRemote('performAction', actionID, targetID);
        d.addCallback(function(result) {
                          var tdbTable = result[1][0];
                          var tdbState = result[1][1];
                          self._setTableContent(tdbTable);
                          self._setPageState.apply(self, tdbState);
                          self._actionResult(result[0]);
                      });
        d.addBoth(function(ign) { self._toggleThrobberVisibility() });
        return false;
    },

    function clickSort(self, attributeID) {
        return self._differentPage('clickSort', attributeID);
    },

    function _actionResult(self, message) {
        var resultContainer = self._getHandyNode('tdb-action-result');

        if(resultContainer.childNodes.length)
            resultContainer.removeChild(resultContainer.firstChild);

        var span = document.createElement("span");
        span.appendChild(document.createTextNode(message));
        resultContainer.appendChild(span);

        new Fadomatic(span, 2).fadeOut();
    });


syntax highlighted by Code2HTML, v. 0.9.1