def getItems(self):
        context = self.context
        if self._items is not None:
            return self._items
        titles = list()
        self._items = list()

        catalog = getToolByName(context, "portal_catalog")
        path = "/".join(context.getPhysicalPath())
        for brain in catalog(portal_type="dmskeyword", path={"query": path, "depth": 1}):
            obj = brain.getObject()
            normalized = normalizer.normalize(obj.title).lower()
            if normalized in titles:
                continue
            self._items.append((normalized, obj.title, obj.id))
            titles.append(normalized)
            for equiv in obj.equivs or []:
                normalized = normalizer.normalize(equiv).lower()
                if normalized in titles:
                    continue
                self._items.append((normalized, equiv, obj.id))

        def cmp_keyword(x, y):
            return cmp(x[0].lower(), y[0].lower())

        self._items.sort(cmp_keyword)

        return self._items
    def __call__(self):
        self.request.response.setHeader("Content-type", "text/plain")

        query_string = unicode(self.request.form.get("q"), "utf-8")
        query_terms = [normalizer.normalize(x) for x in query_string.split()]

        startswith = []
        intermediate = []
        other = []
        q = query_string.lower()
        for normalized, title, id in self.getItems():
            for term in query_terms:
                if not term in title.lower():
                    break
                else:
                    item = "%s|%s" % (title, id)
                    if title.lower().startswith(q):
                        startswith.append((normalized, item))
                        continue
                    for word in title.split():
                        if word.lower().startswith(q):
                            intermediate.append((normalized, item))
                        continue
                    other.append((normalized, item))

        startswith.sort()
        intermediate.sort()
        other.sort()

        result = list()
        for _list in (startswith, intermediate, other):
            for item in _list:
                result.append(item[1])
                if len(result) > 29:
                    return "\n".join(result)
        return "\n".join(result)