Hi Bob,
Thanks for your reply. My site is trick-soft.com/searchable (instant
search in the bottom of header).
Here is the js code which use the sortable.js (changed),

function search_result()
{
        document.getElementById("search-box-div").style.visibility              
=
"visible";
        document.getElementById("search-box-div").style.display                 
=
"block";
        document.getElementById("bodyDiv").style.visibility                     
= "hidden";
        sortableManager.my_d.addCallback(sortableManager.initWithData);

        if ( document.forms['form1'].elements['search_item'].value != '' ) {
                search_item = 
document.forms['form1'].elements['search_item'].value;
        }
        search_item = search_item.toLowerCase();
        //else search_item = 'all';
        //else alert('No keyword is given');


        var domains = [];
        if ( document.forms['form1'].elements['search_ingredients'].checked
== true ) {
                ind = 6;
        } else {
                ind = 1;
        }
        for (var i = 0; i < sortableManager.rows.length; i++) {
                var row = sortableManager.rows[i];
                var domain = {};
                //if ( search_item == 'all' || search_item ==  row[ind] )
                json_item = row[ind].toLowerCase();
                if ( json_item.indexOf(search_item) >= 0 &&
( json_item.indexOf(search_item) == 0 ||
json_item[json_item.indexOf(search_item)-1] == ' ') ) {

                        for (var j = 0; j < sortableManager.cols.length; j++) {

                                if ( j == 1 ) {
                                        domain[sortableManager.cols[j]] = '<a 
href="drink-details.php?
drink_id='+row[0]+'">'+row[j]+'</a>';
                                } else  {
                                        domain[sortableManager.cols[j]] = 
row[j];
                                }
                        }
                        domains.push(domain);
                }
        }
        sortableManager.data.domains = domains;
   var order = sortableManager.sortState[sortableManager.sortkey];
        if (typeof(order) == 'undefined') {
                order = true;
        }
        sortableManager.drawSortedRows(sortableManager.sortkey, order,
false);

        // if anything goes wrong, except for a simple cancellation,
        // then log the error and show the logger
        /*alert(sortableManager.my_d);
        sortableManager.my_d.addErrback(function (err) {
                if (err instanceof CancelledError) {
                        return;
                }
                logError(err);
                logger.debuggingBookmarklet();
        });*/

//      changeLink();
}

function changeLink()
{
        table = getElement('sortable_table');
        this.tbody = table.getElementsByTagName('tbody')[0];
        // every row
        var rows = this.tbody.getElementsByTagName('tr');
        for (var i = 0; i < rows.length; i++) {
                // every cell
                var row = rows[i];
                var cols = row.getElementsByTagName('td');
                var obj = scrapeText(cols[0]);
                obj = obj.replace(/&lt;/g, "<").replace(/&gt;/g, ">");
                cols[0].innerHTML = obj;
        }
}

*************************  End of js code
******************************************************************


here is the sortable.js code,

processMochiTAL = function (dom, data) {
    /***

        A TAL-esque template attribute language processor,
        including content replacement and repeat

    ***/

    // nodeType == 1 is an element, we're leaving
    // text nodes alone.
    if (dom.nodeType != 1) {
        return;
    }
    var attr;
    // duplicate this element for each item in the
    // given list, and then process the duplicated
    // element again (sans mochi:repeat tag)
    attr = getAttribute(dom, "mochi:repeat");
    if (attr) {
        dom.removeAttribute("mochi:repeat");
        var parent = dom.parentNode;
        attr = attr.split(" ");
        var name = attr[0];
        var lst = valueForKeyPath(data, attr[1]);
        if (!lst) {
            return;
        }
        for (var i = 0; i < lst.length; i++) {
            data[name] = lst[i];
            var newDOM = dom.cloneNode(true);
            processMochiTAL(newDOM, data);
            parent.insertBefore(newDOM, dom);
        }
        parent.removeChild(dom);
        return;
    }
    // do content replacement if there's a mochi:content attribute
    // on the element
    attr = getAttribute(dom, "mochi:content");
    if (attr) {
        dom.removeAttribute("mochi:content");
        replaceChildNodes(dom, valueForKeyPath(data, attr));
        return;
    }
    // we make a shallow copy of the current list of child nodes
    // because it *will* change if there's a mochi:repeat in there!
    var nodes = list(dom.childNodes);
    for (var i = 0; i < nodes.length; i++) {
        processMochiTAL(nodes[i], data);
    }
};

mouseOverFunc = function () {
    addElementClass(this, "over");
};

mouseOutFunc = function () {
    removeElementClass(this, "over");
};

ignoreEvent = function (ev) {
    if (ev && ev.preventDefault) {
        ev.preventDefault();
        ev.stopPropagation();
    } else if (typeof(event) != 'undefined') {
        event.cancelBubble = false;
        event.returnValue = false;
    }
};

SortTransforms = {
    "str": operator.identity,
    "istr": function (s) { return s.toLowerCase(); },
    "num1": function (s) { return parseInt(s); },
    "isoDate": isoDate
};

getAttribute = function (dom, key) {
    try {
        return dom.getAttribute(key);
    } catch (e) {
        return null;
    }
};

datatableFromXMLRequest = function (req) {
    /***

        This effectively converts domains.xml to the
        same form as domains.json

    ***/
    var xml = req.responseXML;
    var nodes =
xml.getElementsByTagName("column");alert(map(scrapeText, nodes));
    var rval = {"columns": map(scrapeText, nodes)};
    var rows = [];
    nodes = xml.getElementsByTagName("row")
    for (var i = 0; i < nodes.length; i++) {
        var cells = nodes[i].getElementsByTagName("cell");
        rows.push(map(scrapeText, cells));
    }
    rval.rows = rows;
    return rval;
};

loadFromDataAnchor = function (ev) {
    ignoreEvent(ev);
    var format = this.getAttribute("mochi:dataformat");
    var href = this.href;
    sortableManager.loadFromURL(format, href);
};

valueForKeyPath = function (data, keyPath) {
    var chunks = keyPath.split(".");
    while (chunks.length && data) {
        data = data[chunks.shift()];
    }
    return data;
};


SortableManager = function () {
    this.thead = null;
    this.thead_proto = null;
    this.tbody = null;
    this.deferred = null;
    this.columns = [];
    this.rows = [];
    this.templates = [];
    this.sortState = {};
    bindMethods(this);
};

SortableManager.prototype = {

    "initialize": function () {
        // just rip all mochi-examples out of the DOM
        var examples = getElementsByTagAndClassName(null, "mochi-
example");
        while (examples.length) {
            swapDOM(examples.pop(), null);
        }
        // make a template list
        var templates = getElementsByTagAndClassName(null, "mochi-
template");
        for (var i = 0; i < templates.length; i++) {
            var template = templates[i];
            var proto = template.cloneNode(true);
            removeElementClass(proto, "mochi-template");
            this.templates.push({
                "template": proto,
                "node": template
            });
        }
        // set up the data anchors to do loads
        var anchors = getElementsByTagAndClassName("a", null);
        for (var i = 0; i < anchors.length; i++) {
            var node = anchors[i];
            var format = getAttribute(node, "mochi:dataformat");
            if (format) {
                node.onclick = loadFromDataAnchor;
            }
        }

        // to find sort columns
        this.thead = getElementsByTagAndClassName("thead", null)[0];
        this.thead_proto = this.thead.cloneNode(true);

        this.sortkey = "drink_name";
        this.loadFromURL("json", "./mochikit/domains.json");
    },

    "loadFromURL": function (format, url) {
      log('loadFromURL', format, url);
      var d;
      if (this.deferred) {
            this.deferred.cancel();
      }
                if (format == "xml") {
        var req = getXMLHttpRequest();
         if (req.overrideMimeType) {
                req.overrideMimeType("text/xml");
         }
         req.open("GET", url, true);
         d =
sendXMLHttpRequest(req).addCallback(datatableFromXMLRequest);
                } else if (format == "json") {
        d = loadJSONDoc(url);
        } else {
        throw new TypeError("format " + repr(format) + " not
supported");
      }
      // keep track of the current deferred, so that we can cancel it
      this.deferred = d;
      var self = this;
      // on success or error, remove the current deferred because it
has
      // completed, and pass through the result or error
      d.addBoth(function (res) {
                        self.deferred = null;
                        log('loadFromURL success');
                        return res;
      });
        // on success, tag the result with the format used so we can
display
        // it
      d.addCallback(function (res) {
        res.format = format;
                        return res;
      });
      // call this.initWithData(data) once it's ready
      this.my_d = d;
      return d;
    },

    "initWithData": function (data) {
        /***

            Initialize the SortableManager with a table object

        ***/

        // reformat to [{column:value, ...}, ...] style as the domains
key

        this.rows = data.rows;
        this.cols = data.columns;

        this.data = data;
        // perform a sort and display based upon the previous sort
state,
        // defaulting to an ascending sort if this is the first sort


    },

    "onSortClick": function (name) {
        /***

            Return a sort function for click events

        ***/
        // save ourselves from doing a bind
        var self = this;
        // on click, flip the last sort order of that column and sort
        return function () {
            log('onSortClick', name);
            var order = self.sortState[name];
            if (typeof(order) == 'undefined') {
                // if it's never been sorted by this column, sort
ascending
                order = true;
            } else if (self.sortkey == name) {
                // if this column was sorted most recently, flip the
sort order
                order = !((typeof(order) == 'undefined') ? false :
order);
            }
            self.drawSortedRows(name, order, true);
        };
    },

    "drawSortedRows": function (key, forward, clicked) {
           /***

            Draw the new sorted table body, and modify the column
headers
            if appropriate

        ***/
        log('drawSortedRows', key, forward);

        // save it so we can flip next time
        this.sortState[key] = forward;
        this.sortkey = key;
        var sortstyle;

        // setup the sort columns
        var thead = this.thead_proto.cloneNode(true);
        var cols = thead.getElementsByTagName("th");
        for (var i = 0; i < cols.length; i++) {
            var col = cols[i];
                        var sortinfo = getAttribute(col, 
"mochi:sortcolumn").split(" ");
            var sortkey = sortinfo[0];
            col.onclick = this.onSortClick(sortkey);
            col.onmousedown = ignoreEvent;
            col.onmouseover = mouseOverFunc;
            col.onmouseout = mouseOutFunc;
            // if this is the sorted column
            if (sortkey == key) {
                sortstyle = sortinfo[1];
                // \u2193 is down arrow, \u2191 is up arrow
                // forward sorts mean the rows get bigger going down
                var arrow = (forward ? "\u2193" : "\u2191");
                // add the character to the column header
                col.appendChild(SPAN(null, arrow));
                if (clicked) {
                    col.onmouseover();
                }
            }
        }
        this.thead = swapDOM(this.thead, thead);

        // apply a sort transform to a temporary column named
__sort__,
        // and do the sort based on that column
        if (!sortstyle) {
            sortstyle = "str";
        }
        var sortfunc = SortTransforms[sortstyle];
        if (!sortfunc) {
            throw new TypeError("unsupported sort style " +
repr(sortstyle));
        }
        var domains = this.data.domains;
        for (var i = 0; i < domains.length; i++) {
            var domain = domains[i];
                                domain.__sort__ = sortfunc(domain[key]);
        }

        // perform the sort based on the state given (forward or
reverse)
        var cmp = (forward ? keyComparator : reverseKeyComparator);
        domains.sort(cmp("__sort__"));

        // process every template with the given data
        // and put the processed templates in the DOM
        for (var i = 0; i < this.templates.length; i++) {
                log('template', i, template);
                var template = this.templates[i];
                        var dom = template.template.cloneNode(true);
                        processMochiTAL(dom, this.data);
                        template.node = swapDOM(template.node, dom);
        }
                        changeLink();
    }
};

// create the global SortableManager and initialize it on page load

//////////************************////////////////
var sortableManager = new SortableManager();
addLoadEvent(function() {
        sortableManager.initialize();
});

****************************  End of sortable.js
*******************************************************


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"MochiKit" group.
To post to this group, send email to mochikit@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/mochikit?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to