Loading ...
Sorry, an error occurred while loading the content.

Re: how to make leaf nodes with TreeView.setDynamicLoad()

Expand Messages
  • ggederer
    It ain t pretty; but, here you go:
    Message 1 of 10 , Feb 14, 2006
    • 0 Attachment
      It ain't pretty; but, here you go:


      <link rel="stylesheet" type="text/css"
      href="<c:url
      value='/scripts/yahooui/treeview/examples/css/folders/tree.css'/>">

      <script type="text/javascript"
      src="<c:url
      value='/scripts/yahooui/treeview/build/YAHOO.js'/>"></script>
      <script type="text/javascript"
      src="<c:url
      value='/scripts/yahooui/treeview/build/treeview.js'/>"></script>

      <!-- Connection Manager source file -->
      <script src="<c:url
      value='/scripts/yahooui/connection/build/connection.js'/>"></script>

      <script type="text/javascript">
      var tree;
      function treeInit() {
      tree = new YAHOO.widget.TreeView("treeDiv1");
      tree.setDynamicLoad(loadDataForNode);

      var root = tree.getRoot();

      var myobj = { label: "mylabel1", id:"myid1" };
      var tmpNode = new YAHOO.widget.TextNode(myobj, root, false);

      myobj = { label: "mylabel2", id:"myid2" } ;
      var tmpNode2 = new YAHOO.widget.TextNode(myobj, tmpNode, false);

      myobj = { label: "mylabel3", id:"myid3" } ;
      var tmpNode3 = new YAHOO.widget.TextNode(myobj, tmpNode, false);

      tree.draw();
      }

      function loadDataForNode(node, onCompleteCallback)
      {
      var id = node.data.id;

      // -- code to get your data, possibly using Connect --
      var responseSuccess = function(o)
      {
      var path;
      var dirs;
      var files;
      //alert('responseSuccess: ' + o.responseXML);
      var xmlDoc = o.responseXML;
      path =
      xmlDoc.getElementsByTagName('path')[0].getAttribute('value');
      //alert(path);
      files = xmlDoc.getElementsByTagName('file');
      dirs = xmlDoc.getElementsByTagName('dir');
      for(var i = 0;i < dirs.length;i++)
      {
      var dirData = dirs[i];
      var name = dirData.getAttribute('name');
      var empty = dirData.getAttribute('empty');

      var myobj = { label: name, id: name + '_id' };
      //alert(node.data.id);

      var tmpNode = new YAHOO.widget.TextNode(myobj, node, false);
      tree.draw();
      }
      }
      var responseFailure = function(o){ alert('responseFailure: ' +
      o.statusText); }
      var callback =
      {
      success:responseSuccess,
      failure:responseFailure,
      };
      var cObj = YAHOO.util.Connect.asyncRequest('POST','<c:url
      value="/fileManager.html"/>',callback,'action=list&path='+id);

      // Be sure to notify the TreeView component when the data load
      is complete
      onCompleteCallback();
      }
      </script>



      --- In ydn-javascript@yahoogroups.com, Scott Walter
      <tx_scottwalter@...> wrote:
      >
      > Can u share an example?
      >
      >
      ----------------------------------------------------------------------------------------------------
      > What's an Intel chip doing in a Mac? A whole lor more that it's ever
      done in a PC.
      >
      > My Digital Life - http://scottwalter.com/blog
      > Pro:Blog - http://scottwalter.com/problog
      >
      > ----- Original Message ----
      > From: ggederer <ggederer@...>
      > To: ydn-javascript@yahoogroups.com
      > Sent: Tuesday, February 14, 2006 4:35:08 PM
      > Subject: [ydn-javascript] how to make leaf nodes with
      TreeView.setDynamicLoad()
      >
      > Hi,
      >
      > I have got a dynamically loding tree working; but, all of the
      > dynamically loaded nodes are expandable. How do I indicate that a
      > dynamically loaded node has no children?
      >
      > Great library!
      >
      > Cheers,
      >
      > Greg
      >
      >
      >
      >
      >
      >
      > SPONSORED LINKS
      > C programming
      language Computer programming
      languages Java programming
      language
      The c programming language
      C programming language
      Concept of programming language

      > YAHOO! GROUPS LINKS
      >
      > Visit your group "ydn-_javascript" on the web.
      > To unsubscribe from this group, send an email to:
      > ydn-_javascript-unsubscribe@yahoogroups.com
      > Your use of Yahoo! Groups is subject to the Yahoo! Terms of
      Service.
      >
    • Eric Miraglia
      Greg, There s no way currently to indicate that a specific child has no children of its own. This is something we see a need for, but we don t have it yet.
      Message 2 of 10 , Feb 14, 2006
      • 0 Attachment
        Greg,

        There's no way currently to indicate that a specific child has no
        children of its own. This is something we see a need for, but we
        don't have it yet.

        One workaround for this is to use the setDynamicLoad method at the
        node level rather than at the tree level. Invoke that method for all
        nodes that either have or might have children; for those you know
        won't have children, just skip that step.

        That will result in the behavior you're looking for, I think.

        Regards,
        Eric


        On Feb 14, 2006, at 2:35 PM, ggederer wrote:

        > Hi,
        >
        > I have got a dynamically loding tree working; but, all of the
        > dynamically loaded nodes are expandable. How do I indicate that a
        > dynamically loaded node has no children?
        >
        > Great library!
        >
        > Cheers,
        >
        > Greg
        >
        >
        >
        >
        >
        >
        >
        > Yahoo! Groups Links
        >
        >
        >
        >
        >
        >
        >
      • ggederer
        Eric, Thanks for the response. The workaround you suggest is pretty good except that empty nodes that can have children (like empty folders in a file browser)
        Message 3 of 10 , Feb 14, 2006
        • 0 Attachment
          Eric,

          Thanks for the response. The workaround you suggest is pretty good
          except that empty nodes that can have children (like empty folders in
          a file browser) render as if they, in fact, had children (little plus
          sign next to the folder.)

          Just glancing at the sources, it looks like it would be fairly easy to
          implement something like setCanHaveChildren(). Is this the approach
          you are considering? I may just do this or something similar for my
          own needs. If I do, I would be happy to send you the diffs.

          I like your library.

          Cheers,

          Greg

          --- In ydn-javascript@yahoogroups.com, Eric Miraglia <miraglia@...> wrote:
          >
          > Greg,
          >
          > There's no way currently to indicate that a specific child has no
          > children of its own. This is something we see a need for, but we
          > don't have it yet.
          >
          > One workaround for this is to use the setDynamicLoad method at the
          > node level rather than at the tree level. Invoke that method for all
          > nodes that either have or might have children; for those you know
          > won't have children, just skip that step.
          >
          > That will result in the behavior you're looking for, I think.
          >
          > Regards,
          > Eric
          >
          >
          > On Feb 14, 2006, at 2:35 PM, ggederer wrote:
          >
          > > Hi,
          > >
          > > I have got a dynamically loding tree working; but, all of the
          > > dynamically loaded nodes are expandable. How do I indicate that a
          > > dynamically loaded node has no children?
          > >
          > > Great library!
          > >
          > > Cheers,
          > >
          > > Greg
          > >
          > >
          > >
          > >
          > >
          > >
          > >
          > > Yahoo! Groups Links
          > >
          > >
          > >
          > >
          > >
          > >
          > >
          >
        • Eric Miraglia
          Greg, A TextNode with no children, one on which you haven t invoked setDynamicLoad, won t display the [+]. Once a TextNode is set to load dynamically, the
          Message 4 of 10 , Feb 14, 2006
          • 0 Attachment
            Greg,

            A TextNode with no children, one on which you haven't invoked setDynamicLoad, won't display the [+].  Once a TextNode is set to load dynamically, the expand icon does persist (even when the node turns out to be childless).  This was actually an interaction design decision -- this solution either tested better or seemed more intuitive to the designers.

            It appears that you can change the behavior pretty easily by subclassing whichever node class you're using and then overriding the getStyle method in that subclass.  Look at the getStyle method in Node.js for a baseline; start with that method:

               getStyle: function() {
                    if (this.isLoading) {
                        this.logger.debug("returning the loading icon");
                        return "ygtvloading";
                    } else {
                        // location top or bottom, middle nodes also get the top style
                        var loc = (this.nextSibling) ? "t" : "l";

                        // type p=plus(expand), m=minus(collapase), n=none(no children)
                        var type = "n";
                        if (this.hasChildren(true) || this.isDynamic()) {
                            type = (this.expanded) ? "m" : "p";
                        }

                        this.logger.debug("ygtv" + loc + type);
                        return "ygtv" + loc + type;
                    }
                }

            Check out the line that reads  if (this.hasChildren(true) || this.isDynamic()) {; remove the conditional on this.isDynamic(), so that it evaluates only based on hasChildren().  That should get you the result you're looking for, if I understand your needs correctly.

            Good luck...let us know how it goes.

            Eric




            On Feb 14, 2006, at 4:48 PM, ggederer wrote:

            Eric,

            Thanks for the response.  The workaround you suggest is pretty good
            except that empty nodes that can have children (like empty folders in
            a file browser) render as if they, in fact, had children (little plus
            sign next to the folder.)

            Just glancing at the sources, it looks like it would be fairly easy to
            implement something like setCanHaveChildren().  Is this the approach
            you are considering?  I may just do this or something similar for my
            own needs.  If I do, I would be happy to send you the diffs.

            I like your library.

            Cheers,

            Greg

            --- In ydn-javascript@yahoogroups.com, Eric Miraglia <miraglia@...> wrote:

            Greg,

            There's no way currently to indicate that a specific child has no  
            children of its own.  This is something we see a need for, but we  
            don't have it yet.

            One workaround for this is to use the setDynamicLoad method at the  
            node level rather than at the tree level.  Invoke that method for all  
            nodes that either have or might have children; for those you know  
            won't have children, just skip that step.

            That will result in the behavior you're looking for, I think.

            Regards,
            Eric


            On Feb 14, 2006, at 2:35 PM, ggederer wrote:

            Hi,

            I have got a dynamically loding tree working; but, all of the
            dynamically loaded nodes are expandable. How do I indicate that a
            dynamically loaded node has no children?

            Great library!

            Cheers,

            Greg







            Yahoo! Groups Links














            Yahoo! Groups Links

            <*> To visit your group on the web, go to:

            <*> To unsubscribe from this group, send an email to:

            <*> Your use of Yahoo! Groups is subject to:






          • coryrauch
            Hi, I have exactly the same issue with dynamic loading tree that displays [+] when there is no children. I was not able to get the desired affect by altering
            Message 5 of 10 , Feb 15, 2006
            • 0 Attachment
              Hi,

              I have exactly the same issue with dynamic loading tree that displays
              [+] when there is no children. I was not able to get the desired
              affect by altering node.js, taking this.isDynamic(), out of the
              equation of getStyle. It seems also that the hasChildren function also
              takes in to consideration if the tree is dynamic and alot of function
              base there behavior on that function. So I tried the other method
              suggested of doing a dynamic load at the node level and that works
              very well. I figured I would share a code example. The only thing with
              this is you have to code in additional logic on you backend code to
              determine when to allow expanding or not. Example below:

              // Set up the tree
              var tree;
              tree = new YAHOO.widget.TreeView("treecontainer");
              var root = tree.getRoot();

              // Start adding nodes
              var treeOptions = new Array();

              // Our first node will be expandable
              var data = { id: "node1", label: "One" }
              data = new YAHOO.widget.TextNode(data, root, false);

              /* Since its expandable we add the DynamicLoad handler on. This
              *function should work just as a tree dynamic load handler.
              */
              data.setDynamicLoad(treeLoadData);
              treeOptions.push(data);

              // Our second node is not expandable
              var data = { id: "node2", label: "Two" }
              data = new YAHOO.widget.TextNode(data, root, false);
              // No dynamic load handler added.
              treeOptions.push(data);
              tree.draw();

              Hopefully this helps. This is a great widget, and thank Yahoo for
              providing it.

              Best Regards,

              Cory Rauch
              cory@...
              www.sysbotz.com

              --- In ydn-javascript@yahoogroups.com, Eric Miraglia <miraglia@...> wrote:
              >
              > Greg,
              >
              > A TextNode with no children, one on which you haven't invoked
              > setDynamicLoad, won't display the [+]. Once a TextNode is set to
              > load dynamically, the expand icon does persist (even when the node
              > turns out to be childless). This was actually an interaction design
              > decision -- this solution either tested better or seemed more
              > intuitive to the designers.
              >
              > It appears that you can change the behavior pretty easily by
              > subclassing whichever node class you're using and then overriding the
              > getStyle method in that subclass. Look at the getStyle method in
              > Node.js for a baseline; start with that method:
              >
              > getStyle: function() {
              > if (this.isLoading) {
              > this.logger.debug("returning the loading icon");
              > return "ygtvloading";
              > } else {
              > // location top or bottom, middle nodes also get the top
              > style
              > var loc = (this.nextSibling) ? "t" : "l";
              >
              > // type p=plus(expand), m=minus(collapase), n=none(no
              > children)
              > var type = "n";
              > if (this.hasChildren(true) || this.isDynamic()) {
              > type = (this.expanded) ? "m" : "p";
              > }
              >
              > this.logger.debug("ygtv" + loc + type);
              > return "ygtv" + loc + type;
              > }
              > }
              >
              > Check out the line that reads if (this.hasChildren(true) ||
              > this.isDynamic()) {; remove the conditional on this.isDynamic(), so
              > that it evaluates only based on hasChildren(). That should get you
              > the result you're looking for, if I understand your needs correctly.
              >
              > Good luck...let us know how it goes.
              >
              > Eric
              >
              >
              >
              >
              > On Feb 14, 2006, at 4:48 PM, ggederer wrote:
              >
              > > Eric,
              > >
              > > Thanks for the response. The workaround you suggest is pretty good
              > > except that empty nodes that can have children (like empty folders in
              > > a file browser) render as if they, in fact, had children (little plus
              > > sign next to the folder.)
              > >
              > > Just glancing at the sources, it looks like it would be fairly easy to
              > > implement something like setCanHaveChildren(). Is this the approach
              > > you are considering? I may just do this or something similar for my
              > > own needs. If I do, I would be happy to send you the diffs.
              > >
              > > I like your library.
              > >
              > > Cheers,
              > >
              > > Greg
              > >
              > > --- In ydn-javascript@yahoogroups.com, Eric Miraglia <miraglia@>
              > > wrote:
              > >>
              > >> Greg,
              > >>
              > >> There's no way currently to indicate that a specific child has no
              > >> children of its own. This is something we see a need for, but we
              > >> don't have it yet.
              > >>
              > >> One workaround for this is to use the setDynamicLoad method at the
              > >> node level rather than at the tree level. Invoke that method for all
              > >> nodes that either have or might have children; for those you know
              > >> won't have children, just skip that step.
              > >>
              > >> That will result in the behavior you're looking for, I think.
              > >>
              > >> Regards,
              > >> Eric
              > >>
              > >>
              > >> On Feb 14, 2006, at 2:35 PM, ggederer wrote:
              > >>
              > >>> Hi,
              > >>>
              > >>> I have got a dynamically loding tree working; but, all of the
              > >>> dynamically loaded nodes are expandable. How do I indicate that a
              > >>> dynamically loaded node has no children?
              > >>>
              > >>> Great library!
              > >>>
              > >>> Cheers,
              > >>>
              > >>> Greg
              > >>>
              > >>>
              > >>>
              > >>>
              > >>>
              > >>>
              > >>>
              > >>> Yahoo! Groups Links
              > >>>
              > >>>
              > >>>
              > >>>
              > >>>
              > >>>
              > >>>
              > >>
              > >
              > >
              > >
              > >
              > >
              > >
              > > Yahoo! Groups Links
              > >
              > >
              > >
              > >
              > >
              > >
              > >
              > >
              >
            • ggederer
              Hi Cory, Thanks for the response. I think this is going to be a great community. After looking at Eric s suggestion, I ve decided that what I really need is a
              Message 6 of 10 , Feb 15, 2006
              • 0 Attachment
                Hi Cory,

                Thanks for the response.  I think this is going to be a great community.

                After looking at Eric's suggestion, I've decided that what I really need is a specialized RemoteFileNode type with an isDirectory() method and a hasRemoteChildren() method.  Looking at Node.getStyle() . . .

                    /**
                     * Returns the css style name for the toggle
                     *
                     * @return {string} the css class for this node's toggle
                     */
                    getStyle: function() {
                        if (this.isLoading) {
                            this.logger.debug("returning the loading icon");
                            return "ygtvloading";
                        } else {
                            // location top or bottom, middle nodes also get the top style
                            var loc = (this.nextSibling) ? "t" : "l";

                            // type p=plus(expand), m=minus(collapase), n=none(no children)
                            var type = "n";
                            if (this.hasChildren(true) || this.isDynamic()) {
                                type = (this.expanded) ? "m" : "p";
                            }

                            this.logger.debug("ygtv" + loc + type);
                            return "ygtv" + loc + type;
                        }
                    },


                I see that my only choices are a parent that has children (which may either be expanded or collapsed), or a leaf node.  What I need is a parent node that doesn't have children, but can have children; and a parent node that has children, even though they're not loaded from the server yet.

                In order to achieve this, I'll have to create couple of new tokens (in addition to "p", "m" and "n", above), and I'll have to produce some code to interpret the new tokens (not sure where I do that yet.)

                I think this approach makes sense, and that a remote asset browser is a common enough use case to warrant this work.  Comments?

                Cheers,

                Greg

                --- In ydn-javascript@yahoogroups.com, "coryrauch" <coryrauch@...> wrote:
                >
                > Hi,
                >
                > I have exactly the same issue with dynamic loading tree that displays
                > [+] when there is no children. I was not able to get the desired
                > affect by altering node.js, taking this.isDynamic(), out of the
                > equation of getStyle. It seems also that the hasChildren function also
                > takes in to consideration if the tree is dynamic and alot of function
                > base there behavior on that function. So I tried the other method
                > suggested of doing a dynamic load at the node level and that works
                > very well. I figured I would share a code example. The only thing with
                > this is you have to code in additional logic on you backend code to
                > determine when to allow expanding or not. Example below:
                >
                > // Set up the tree
                > var tree;
                > tree = new YAHOO.widget.TreeView("treecontainer");
                > var root = tree.getRoot();
                >
                > // Start adding nodes
                > var treeOptions = new Array();
                >
                > // Our first node will be expandable
                > var data = { id: "node1", label: "One" }
                > data = new YAHOO.widget.TextNode(data, root, false);
                >
                > /* Since its expandable we add the DynamicLoad handler on. This
                > *function should work just as a tree dynamic load handler.
                > */
                > data.setDynamicLoad(treeLoadData);
                > treeOptions.push(data);
                >
                > // Our second node is not expandable
                > var data = { id: "node2", label: "Two" }
                > data = new YAHOO.widget.TextNode(data, root, false);
                > // No dynamic load handler added.
                > treeOptions.push(data);
                > tree.draw();
                >
                > Hopefully this helps. This is a great widget, and thank Yahoo for
                > providing it.
                >
                > Best Regards,
                >
                > Cory Rauch
                > cory@...
                > www.sysbotz.com
                >
                > --- In ydn-javascript@yahoogroups.com, Eric Miraglia miraglia@ wrote:
                > >
                > > Greg,
                > >
                > > A TextNode with no children, one on which you haven't invoked
                > > setDynamicLoad, won't display the [+]. Once a TextNode is set to
                > > load dynamically, the expand icon does persist (even when the node
                > > turns out to be childless). This was actually an interaction design
                > > decision -- this solution either tested better or seemed more
                > > intuitive to the designers.
                > >
                > > It appears that you can change the behavior pretty easily by
                > > subclassing whichever node class you're using and then overriding the
                > > getStyle method in that subclass. Look at the getStyle method in
                > > Node.js for a baseline; start with that method:
                > >
                > > getStyle: function() {
                > > if (this.isLoading) {
                > > this.logger.debug("returning the loading icon");
                > > return "ygtvloading";
                > > } else {
                > > // location top or bottom, middle nodes also get the top
                > > style
                > > var loc = (this.nextSibling) ? "t" : "l";
                > >
                > > // type p=plus(expand), m=minus(collapase), n=none(no
                > > children)
                > > var type = "n";
                > > if (this.hasChildren(true) || this.isDynamic()) {
                > > type = (this.expanded) ? "m" : "p";
                > > }
                > >
                > > this.logger.debug("ygtv" + loc + type);
                > > return "ygtv" + loc + type;
                > > }
                > > }
                > >
                > > Check out the line that reads if (this.hasChildren(true) ||
                > > this.isDynamic()) {; remove the conditional on this.isDynamic(), so
                > > that it evaluates only based on hasChildren(). That should get you
                > > the result you're looking for, if I understand your needs correctly.
                > >
                > > Good luck...let us know how it goes.
                > >
                > > Eric
                > >
                > >
                > >
                > >
                > > On Feb 14, 2006, at 4:48 PM, ggederer wrote:
                > >
                > > > Eric,
                > > >
                > > > Thanks for the response. The workaround you suggest is pretty good
                > > > except that empty nodes that can have children (like empty folders in
                > > > a file browser) render as if they, in fact, had children (little plus
                > > > sign next to the folder.)
                > > >
                > > > Just glancing at the sources, it looks like it would be fairly easy to
                > > > implement something like setCanHaveChildren(). Is this the approach
                > > > you are considering? I may just do this or something similar for my
                > > > own needs. If I do, I would be happy to send you the diffs.
                > > >
                > > > I like your library.
                > > >
                > > > Cheers,
                > > >
                > > > Greg
                > > >
                > > > --- In ydn-javascript@yahoogroups.com, Eric Miraglia <miraglia@>
                > > > wrote:
                > > >>
                > > >> Greg,
                > > >>
                > > >> There's no way currently to indicate that a specific child has no
                > > >> children of its own. This is something we see a need for, but we
                > > >> don't have it yet.
                > > >>
                > > >> One workaround for this is to use the setDynamicLoad method at the
                > > >> node level rather than at the tree level. Invoke that method for all
                > > >> nodes that either have or might have children; for those you know
                > > >> won't have children, just skip that step.
                > > >>
                > > >> That will result in the behavior you're looking for, I think.
                > > >>
                > > >> Regards,
                > > >> Eric
                > > >>
                > > >>
                > > >> On Feb 14, 2006, at 2:35 PM, ggederer wrote:
                > > >>
                > > >>> Hi,
                > > >>>
                > > >>> I have got a dynamically loding tree working; but, all of the
                > > >>> dynamically loaded nodes are expandable. How do I indicate that a
                > > >>> dynamically loaded node has no children?
                > > >>>
                > > >>> Great library!
                > > >>>
                > > >>> Cheers,
                > > >>>
                > > >>> Greg
                > > >>>
                > > >>>
                > > >>>
                > > >>>
                > > >>>
                > > >>>
                > > >>>
                > > >>> Yahoo! Groups Links
                > > >>>
                > > >>>
                > > >>>
                > > >>>
                > > >>>
                > > >>>
                > > >>>
                > > >>
                > > >
                > > >
                > > >
                > > >
                > > >
                > > >
                > > > Yahoo! Groups Links
                > > >
                > > >
                > > >
                > > >
                > > >
                > > >
                > > >
                > > >
                > >
                >
              • mpechner
                Set dynamic load on each treenode that should expand instead of the tree. The treenodes without the dynamic load method set will be leafs.
                Message 7 of 10 , Feb 15, 2006
                • 0 Attachment
                  Set dynamic load on each treenode that should expand instead of the tree.

                  The treenodes without the dynamic load method set will be leafs.

                  --- In ydn-javascript@yahoogroups.com, "ggederer" <ggederer@...> wrote:
                  >
                  > Hi,
                  >
                  > I have got a dynamically loding tree working; but, all of the
                  > dynamically loaded nodes are expandable. How do I indicate that a
                  > dynamically loaded node has no children?
                  >
                  > Great library!
                  >
                  > Cheers,
                  >
                  > Gre
                • Chun
                  Greg, I had the same problem a week ago. But I soon replied to my original post with a solution. (http://groups.yahoo.com/group/ydn-javascript/message/837) If
                  Message 8 of 10 , Apr 10 1:45 PM
                  • 0 Attachment
                    Greg,

                    I had the same problem a week ago. But I soon replied to my original
                    post with a solution.
                    (http://groups.yahoo.com/group/ydn-javascript/message/837) If you set
                    the whole tree to be dynamically loaded, you won't be able to turn it
                    off on any of its nodes. Instead, you don't set it on the top level,
                    but only set it on nodes that are expandable.

                    Chun
                    p.s. Thanks to David who also replied to my post with a similar solution.

                    --- In ydn-javascript@yahoogroups.com, "ggederer" <ggederer@...> wrote:
                    >
                    > Hi,
                    >
                    > I have got a dynamically loding tree working; but, all of the
                    > dynamically loaded nodes are expandable. How do I indicate that a
                    > dynamically loaded node has no children?
                    >
                    > Great library!
                    >
                    > Cheers,
                    >
                    > Greg
                    >
                  Your message has been successfully submitted and would be delivered to recipients shortly.