Congratulations!

[Valid RSS] This is a valid RSS feed.

Recommendations

This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

Source: http://michelles-universe.blogspot.com/feeds/posts/default?alt=rss

  1. <?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-5544768027628635238</atom:id><lastBuildDate>Wed, 13 Mar 2024 22:38:50 +0000</lastBuildDate><title>Michelle&#39;s Universe</title><description>This is a personal blog about the important things in my life, from work as a Lotus Notes &amp;amp; Domino Deverloper to family and anything odd that grabs my interest.</description><link>http://michelles-universe.blogspot.com/</link><managingEditor>noreply@blogger.com (Michelle)</managingEditor><generator>Blogger</generator><openSearch:totalResults>47</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-101065045390289050</guid><pubDate>Thu, 21 Jun 2012 12:32:00 +0000</pubDate><atom:updated>2012-06-21T22:38:20.518+10:00</atom:updated><title>Implementing the jQuery DataTables plugin in a &#39;classic&#39; Domino Web application.</title><description>&lt;p&gt;Well, it&#39;s been a really long time since I posted anything here.  I started a new job last year, which has involved working on traditional Notes and Domino web databases in a large company with a very old infrastructure - Note 6.5 and 7 clients, Domino 6.5 through to 8.0.1.  So no recent xPages for me.&lt;/p&gt;
  2.  
  3. &lt;p&gt;But I have been doing a lot of work with jQuery, because the company&#39;s default browser is *still* IE6, and jQuery eases the pain.&lt;/p&gt;
  4.  
  5. &lt;p&gt;We recently started implementing the &lt;a href=&quot;http://datatables.net/&quot;&gt;jQuery DataTables plugin&lt;/a&gt; for handling things like search results, because you can include features for in memory paging, filtering and sorting with very little effort.  It&#39;s quick, cross browser compatible, and can use data already on the page or fetch it via AJAX.&lt;/p&gt;
  6.  
  7. &lt;p&gt;The internal company web application I am working on is fairly typical.  It is an older Domino application which has grown over time, been worked on by many developers and contains a huge variety of code styles and approaches.  There are a number of databases, most of which have their own search page.  These normally have a group of &amp;lt;select&amp;gt; elements used to filter the data.  The user makes their choices then clicks &#39;Search&#39; whereapon the form is reloaded with the search parameters appended to the URL.  The form&#39;s WebQueryOpen agent would use the URL parameters to build and execute the document search, then render the data as table rows inside a rich text field, which was wrapped in pass-thru HTML. JavaScript was then used to parse the HTML  and re-rendered it in a paged table.&lt;/p&gt;
  8.  
  9. &lt;p&gt;There were problems with this approach - firstly it was slow.  The round trip to the sever for a full page reload, the time it took to run the WQO agent and write the HTML into the rich text field, and the time to parse and re-render the table were noticeable. Secondly, it only worked in IE due to the way the script was loaded, and thirdly, more than about 500 results would cause the JavaScript to time out.&lt;/p&gt;
  10.  
  11. &lt;p&gt;As jQuery had already been added to most of the databases, we decided to replace the existing system with DataTables whenever we get the chance.  Firstly, the old JavaScript library needs to be removed and replaced by the DataTables plugin (download the plugin and load the .js file wherever you have your jQuery source and reference it the same way). Then we need to implement DataTables using the current page HTML. To do so you just initialize it like this:&lt;/p&gt;
  12. &lt;pre&gt;&lt;code&gt;$(document).ready( function() {
  13.   $(&#39;#tableId&#39;).dataTable();
  14. });&lt;/code&gt;&lt;/pre&gt;
  15.  
  16. &lt;p&gt;Simple, isn&#39;t it. Of course there was a bit of work to do with styling, but the plugin downloads with a sample stylesheet that gets you well under way. The immediate impact was a significant speed improvement and a much larger result set could be processed before timing out (about a 5 fold increase).&lt;/p&gt;
  17.  
  18. &lt;p&gt;The hardest bit was cleaning up our existing HTML. The plugin is a little unforgiving. The table you target must be properly formed with both &amp;lt;thead&amp;gt;and &amp;lt;tbody&amp;gt elements, the &amp;lt;thead&amp;gt must contain at least one row with &amp;lt;th&amp;gt elements and the &amp;lt;tbody&amp;gt must contain at least one row of&amp;lt;td&amp;gt elements.  The number of th and td elements in the rows must match.&lt;/p&gt;
  19.  
  20. &lt;p&gt;For some of the search pages, that is as far as we went.  However as time and budget permit, we are also replacing the DOM source (generated by page reload + WQO agent) by an Ajax data souce.  The same lotusscript agents can be re-used by simply modifying them to print JSON instead of appending HTML to a field.  The existing parts of the agents which use the URL parameters to generate the search and build the document collection can be retained (including all the tested business logic). The JSON object you need to generate is defined in the &lt;a href=&quot;http://datatables.net/ref&quot;&gt;DataTables API.&lt;/a&gt; and is basically an array of arrays in an object called &lt;b&gt;aaData&lt;/b&gt;. the api documentation has examples. Then we remove the rich text field, create an empty table with the required number of columns using pass-through HTML and hide it with styling, then put the following in the Search button click handler:&lt;/p&gt;
  21.  
  22. &lt;pre&gt;&lt;code&gt;
  23.    var sUrl = ;// create your URL along the lines of
  24.       //http://my server.mydomain.com/path/db.nsf/myAgant?OpenAgent&amp;cat=xyz&amp;p2=abc
  25.     $(&#39;#tableId&#39;).show();
  26.  
  27.     $(&#39;#tableId&#39;).dataTable( {
  28.         &quot;bProcessing&quot;: true,
  29.         &quot;sAjaxSource&quot;: sUrl
  30.      });
  31. &lt;/code&gt;&lt;/pre&gt;
  32.  
  33. &lt;p&gt;As the JSON your agent creates can contain HTML, so one of your columns can be easily configured as a link.  Depending on your data you should also consider testing for and escaping invalid characters before you print your agent output.
  34. Now the search results are loaded without a page refresh, and the overall result is a faster, snappier, more modern search results table.&lt;/p&gt;
  35.  
  36. &lt;p&gt;There are a larger number of properties you can set when initializing the table, including turning on or of the paging and filtering, controlling the sorting, defining callback functions to be called at various stages of the table rendering, adding classes to style the table, hiding columns and more.&lt;/p&gt;
  37.  
  38. &lt;p&gt;Once you get your head around the basics of setting it up it is easy to use and very flexible.  It includes support for the jQueryUI themes and is a great way to add a little &#39;shiny&#39; touch to those apps not yet ready for xPages.&lt;/p&gt;</description><link>http://michelles-universe.blogspot.com/2012/06/implementing-query-datatables-plugin-in.html</link><author>noreply@blogger.com (Michelle)</author><thr:total>8</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-2297235928735733485</guid><pubDate>Fri, 22 Jul 2011 00:10:00 +0000</pubDate><atom:updated>2011-07-22T10:19:13.753+10:00</atom:updated><title>Domino Designer: Open tabs side by side</title><description>Maybe I&#39;m just really slow, but after using DDE for over two years, I only just discovered that you can place design elements (or design views for that matter) side-by side. Very useful on a wide-screen monitor. &lt;br /&gt;&lt;br /&gt;Just drag any open tab to the right-margin of DDE.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgoAyIQrckM_4b2kbfIhkSC37T1IbxQwpJOHg2GkJ-8Bjqwc_vCfFkXuMT4oJI_Uloy-T5XWF8zqXD0Q-2CarmcBFN5nEJcPGQFbdHIbOtiugftmVNkMUDwM169c2oiHvSODBzTpDxOFLv/s1600/Drag_Tab.JPG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 131px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgoAyIQrckM_4b2kbfIhkSC37T1IbxQwpJOHg2GkJ-8Bjqwc_vCfFkXuMT4oJI_Uloy-T5XWF8zqXD0Q-2CarmcBFN5nEJcPGQFbdHIbOtiugftmVNkMUDwM169c2oiHvSODBzTpDxOFLv/s400/Drag_Tab.JPG&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5631963000745991730&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And here you go - the windows side-by side.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGLVtyvEW_TUvn3TFrjV_nrn1CMrCcxZUObnFzqkmFtH6bbKUGWKgG92Q-Mg5mzewM7ST63dH6j_3gbPFVmeBZhglbniS3700BX3SdS_jr72lqo77nuTUemfoD6LQbEoWmV1LJ01crAS3k/s1600/side_by_side.JPG&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhfajT5d1Eyve72Rn4ibtjzBekv-AAtSDcFNuDCrPpFGyTH5pZojeCa1WBegA9IAV9QuNthMWFfv6QR22kqcAPzW3daXFnaNqb0phKmBT9esdvdK4Hp8NtKynBRdbE4RFIybm3WHVNaL8B/s1600/side_by_side.JPG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 114px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhfajT5d1Eyve72Rn4ibtjzBekv-AAtSDcFNuDCrPpFGyTH5pZojeCa1WBegA9IAV9QuNthMWFfv6QR22kqcAPzW3daXFnaNqb0phKmBT9esdvdK4Hp8NtKynBRdbE4RFIybm3WHVNaL8B/s400/side_by_side.JPG&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5631964022540063330&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;</description><link>http://michelles-universe.blogspot.com/2011/07/domino-designer-open-tabs-side-by-side.html</link><author>noreply@blogger.com (Michelle)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgoAyIQrckM_4b2kbfIhkSC37T1IbxQwpJOHg2GkJ-8Bjqwc_vCfFkXuMT4oJI_Uloy-T5XWF8zqXD0Q-2CarmcBFN5nEJcPGQFbdHIbOtiugftmVNkMUDwM169c2oiHvSODBzTpDxOFLv/s72-c/Drag_Tab.JPG" height="72" width="72"/><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-7552956153424368984</guid><pubDate>Mon, 21 Mar 2011 08:42:00 +0000</pubDate><atom:updated>2011-03-21T22:28:09.022+11:00</atom:updated><title>xPages Extension Library for beginners - Part 3: Customising the Application Layout Control</title><description>Firstly, sorry for the delay in getting my next post published - things have been very busy at work and with the family.  &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Customising the colour scheme&lt;/h2&gt;&lt;br /&gt;The appearance of the application layout control, both in terms of colours and placement, is all done through CSS.  I would recommend sticking with the overall layout then tweaking it. Start small - just change some colours to match your corporate palette, and maybe tweak the column widths or fonts as required.&lt;br /&gt;&lt;br /&gt;Firstly, create a style sheet in Notes then attach that style sheet to your custom control which contains the application layout control as a resource.  After that it is just a matter of using Firefox with Firebug or Chrome to identify the styles which apply to the elements you want to change, and creating over-riding definitions in your style-sheet.  Within a short time I changed the default colour scheme to a grey and red one which now looks like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhv7zjfnCxdWoy4YG7TjPGUHdYsAXgf2JnZVamUQNyeWvbT00eIIFCrd3EXrkbQ4Mk1lJiqI7nSGBaiFOKt8G5_7gc94VUgEiRbZ9iM3tHhSrTP41w8V4tWLhKfB0IRQQiho9u-b8FdgXZ_/s1600/21-03-2011+7-55-07+PM.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 149px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhv7zjfnCxdWoy4YG7TjPGUHdYsAXgf2JnZVamUQNyeWvbT00eIIFCrd3EXrkbQ4Mk1lJiqI7nSGBaiFOKt8G5_7gc94VUgEiRbZ9iM3tHhSrTP41w8V4tWLhKfB0IRQQiho9u-b8FdgXZ_/s320/21-03-2011+7-55-07+PM.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5586454504499577938&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Adding elements to the layout properties&lt;/h2&gt;&lt;br /&gt;There are a lot of things you can add to your page through the layout properties.  To set them, open your custom control, expand the outline and select the Application Layout object.  In the properties panel select All Properties then expand Other and Configuration.  &lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimmv2L-tD8pkLIi1C8mQez-0DEWqo7oRlilIerrLOxd8P2QuQNqNLmLK8pm9euzYgzTuoyTjcaS5YrlHvCTRKGQFziszGW5-z6ODxoD-NRaeR3AeKdyuj7oc1sn8mFOfXhpKIEt6TXPqfa/s1600/properties.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 84px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimmv2L-tD8pkLIi1C8mQez-0DEWqo7oRlilIerrLOxd8P2QuQNqNLmLK8pm9euzYgzTuoyTjcaS5YrlHvCTRKGQFziszGW5-z6ODxoD-NRaeR3AeKdyuj7oc1sn8mFOfXhpKIEt6TXPqfa/s320/properties.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5586463267704885490&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There is quite a large range of things you can set in this properties list. In the image below, the various sections that are controlled through the properties are outlined in green and labelled with the appropriate property name (click on the image for a larger view).  The orange rectangles define the page content areas.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgajx4lmBz_pCt5cV0yOKJVdya9ioPY1ZqiiMQQiUppuBjCXxXq0jiwxLuL2qC6XkdLrNKASUw1K-yohrUiFROB7Rm1ILAg07oV1Gc43rrEx5aNAK0c_HXK2o41SS7VMdwgjv2_3YX0yAx7/s1600/layoutSections.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 194px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgajx4lmBz_pCt5cV0yOKJVdya9ioPY1ZqiiMQQiUppuBjCXxXq0jiwxLuL2qC6XkdLrNKASUw1K-yohrUiFROB7Rm1ILAg07oV1Gc43rrEx5aNAK0c_HXK2o41SS7VMdwgjv2_3YX0yAx7/s320/layoutSections.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5586473726018082546&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Logo, Title, Legal Logo and Legal text&lt;/h3&gt;&lt;br /&gt;For the logo, add an image resource to your database, then add the name of this image resource to the productLogo property.  The placeBarName property is a good place to add your application title.  This can be hard-coded or you could compute the value and use @DbTitle(); as the formula, so that your database title is displayed here.  In the image above, you can see my database title (Layout Demo) in the grey place-bar .  The legalLogo and legalText are simple properties which can be set in a similar manner as the productLogo and placeBarTitle   &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Links and Tabs&lt;/h3&gt;&lt;br /&gt;The various link and tabs properties are set differently to the text and image properties.  These are configurable lists.  To add entries, click in the right-column next to the property name, then click the + button. &lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhazpKblBhtYBi94UEVFH7N-4Yo5QcBtzz3xNSSudNRnsAKWwcA5js2vQKIEWm0hx48cRdq74jYj5rj5XVLUNaXIdVlsd8tqTZ6_gtxD2wJ4TPbBrDy13fS8bskeX5r_hJlLioJ0aKzsTG0/s1600/listAdd.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 292px; height: 91px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhazpKblBhtYBi94UEVFH7N-4Yo5QcBtzz3xNSSudNRnsAKWwcA5js2vQKIEWm0hx48cRdq74jYj5rj5XVLUNaXIdVlsd8tqTZ6_gtxD2wJ4TPbBrDy13fS8bskeX5r_hJlLioJ0aKzsTG0/s400/listAdd.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5586475339489043202&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You will need to select the type of &#39;node&#39; you are adding to your list. There are nine different types of nodes and I haven&#39;t used them all yet, but below is a brief description of them.  Each one has it&#39;s own set of properties, and these are different for each type of node. &lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;xe:basicContainerNode -- Allow you to create sub-lists.  I think this could be useful for a side-menu, but I haven&#39;t tried it with any of the layout lists shown above.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;xe:basicLeafNode -- Use this to link to any standard URL.  You can hard-code or compute the href and label properties. This can be used for links to standard Domino forms or pages, or any other general type of link.  For links to another xPage, use the pageTreeNode instead&lt;/li&gt;&lt;br /&gt;&lt;li&gt;xe:beanTreeNode -- Sorry - haven&#39;t investigated this one yet !&lt;/li&gt;&lt;br /&gt;&lt;li&gt;xe:dominoViewEntriesTreeNode -- you can retrieve entries from a view, based on a key or key array, similar to getEntriesByKey method in lotusScript.  You could use this if you had your menu items stored in documents within your database&lt;/li&gt;&lt;br /&gt;&lt;li&gt;xe:dominoViewListTreeNode -- retrieve a list of views or folders. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;xe:loginTreeNode -- haven&#39;t used this one yet either (check out the example database that you downloaded with the extension library - it show the usage of all these list types)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;xe:pageTreeNode -- use this if you want to point to another xPage.  All you need to enter is the page name in its simplest form (e.g. demo.xsp) and the text you want displayed.  There is no need to compute the entire URL - that&#39;s all done for you&lt;/li&gt;&lt;br /&gt;&lt;li&gt;xe:separatorTreeNode -- inserts a separator - vertical or horizontal bar as appropriate&lt;/li&gt;&lt;br /&gt;&lt;li&gt;xe:userTreeNode -- I haven&#39;t tested this one either, but it appears to be a way to insert additional text or images which are not active links&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The properties for each type of node vary.  I found the pageTreeNode and basicLeafNode the most appropriate for the layout control.  Check out the properties of each one to get a better idea of how they operate. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Search Bar&lt;/h3&gt;&lt;br /&gt;The search bar is automatically rendered if your database is full-text indexed.  You need to enter the name of the page to open when the user clicks the search icon into the search bar properties.  The search text will be appended to the page url as a query string parameter.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Hiding and displaying sections&lt;/h3&gt;&lt;br /&gt;The layout contains 5 main components or sections in addition to the content area, laid out vertically. Each section can contain one or more sub-components. By default each section is rendered if it contains something but is hidden if empty.  You can over-ride this behaviour by setting the appropriate layout property.  The properties for the five sections from top to bottom are &lt;i&gt;banner, titleBar, placeBar, footer&lt;/i&gt; and &lt;i&gt;legal&lt;/i&gt;.  Each one takes a value of true or false, or can be computed. &lt;br /&gt;&lt;br /&gt;For sub-components of the main sections you can set the &lt;i&gt;rendered&lt;/i&gt; property to control when an item is displayed.  This is the xPages equivalent of a Hide-when formula.  For example, you could hide some of the tabs  or links based on the current user&#39;s role, computed at run-time&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Design for re-use&lt;/h2&gt;&lt;br /&gt;For a simple application, you should be able to configure the application layout control so that it can be used across most of your application.  Set up the look and feel and the general navigation in just one place, then apply it to each page of your application.   Individual pages can then have their own content in each of the three central panels.  In my next post I&#39;ll look at creating a menu in the left panel using the Page Navigator control.</description><link>http://michelles-universe.blogspot.com/2011/03/xpages-extension-library-for-beginners.html</link><author>noreply@blogger.com (Michelle)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhv7zjfnCxdWoy4YG7TjPGUHdYsAXgf2JnZVamUQNyeWvbT00eIIFCrd3EXrkbQ4Mk1lJiqI7nSGBaiFOKt8G5_7gc94VUgEiRbZ9iM3tHhSrTP41w8V4tWLhKfB0IRQQiho9u-b8FdgXZ_/s72-c/21-03-2011+7-55-07+PM.png" height="72" width="72"/><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-7090265808411589630</guid><pubDate>Sat, 12 Feb 2011 06:41:00 +0000</pubDate><atom:updated>2011-02-12T21:50:53.901+11:00</atom:updated><title>xPages Extension Library for beginners - Part 2: Using the Application Layout Control</title><description>&lt;h2&gt;Starting with the Application Layout control&lt;/h2&gt;&lt;br /&gt;The Application Layout control in the &lt;a href=&quot;http://extlib.openntf.org/&quot;&gt;xPages Extension Library &lt;/a&gt; is a powerful control to allow you to set up web pages which follow the IBM OneUI theme.  This allows for consistent presentation across web applications and it looks pretty good.  Not a bad thing if you are not a Web Designer but rather a back-end developer tasked with creating a reasonable looking web site.  You can see it in action in the various Wikis published by IBM such as the &lt;a href=&quot;http://www-10.lotus.com/ldd/ddwiki.nsf&quot;&gt;Lotus Notes and Domino Application Development wiki&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There is a &lt;a href=&quot;http://www.openntf.org/internal/home.nsf/news.xsp?databaseName=CN=NotesOSS2/O=NotesOSS!!Projects\pmt.nsf&amp;documentId=0294EFC45AB034E9862577AB0022D66E&amp;action=openDocument&quot;&gt;video&lt;/a&gt; on the OpenNTF project page which describes how to use the control.  &lt;br /&gt;&lt;br /&gt;You will need to watch that video - overall it is excellent and I don&#39;t intend to repeat what it says here.  However the video appears to assume that you know a little bit about how extension controls are implemented and what you need to use them.  I found myself pausing, rewind, pausing &amp; replaying that video so many times that I decided to document the additional information I thought was missing.&lt;br /&gt;&lt;br /&gt;Go on - go and watch it ......&lt;br /&gt;&lt;br /&gt;OK - so did you get to about 1 minute in, where the presenter pasted some code into designer then moved on quickly and go &quot;Woah - what was that?  Was it important?  Does my code need to be identical?  Where do I get that code?  What does it do?  Stop, stop, go back &quot;  That was my reaction.&lt;br /&gt;&lt;br /&gt;The code is important - it is key to getting the control working.  We will get to the code later.  First I&#39;ll go through the basic setup of the control.  Follow the video instructions on adding the extension library to your application and setting the oneUI theme. Then drag the Application Layout control onto a blank custom control page in designer.&lt;br /&gt;&lt;br /&gt;Next, set some basic properties on the control as shown in the video.  Set the control configuration to xe:applicationConfiguration as shown, then set some dummy tabs, placebar text, logo, footer etc.  Finally, create a blank xPage, add your custom control and preview it in a browser.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBUdHSOnRC1OnsWayzq-2gk5Z3Vcz-ItT3qSNP9i51vjj881DTynR4T6Lo2bijV2lD1K0zGpCkDVZlr-8Lg7E4XG34JZWr2uzV1oi7DqPMIqN9zyMXqREucZRN_k9d6hYQ6OIMz8oXUKvS/s1600/InitialConfiguration.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 199px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBUdHSOnRC1OnsWayzq-2gk5Z3Vcz-ItT3qSNP9i51vjj881DTynR4T6Lo2bijV2lD1K0zGpCkDVZlr-8Lg7E4XG34JZWr2uzV1oi7DqPMIqN9zyMXqREucZRN_k9d6hYQ6OIMz8oXUKvS/s400/InitialConfiguration.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5572698934730616658&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So far, so good. Next you want to add some content.  This is where the code is important.&lt;br /&gt;&lt;br /&gt;Warning: everything from here on is what I have discovered by trial and error.  If you see any glaring errors, please comment so that others don&#39;t follow down the wrong path.  &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Editable Controls, Facets and callbacks&lt;/h2&gt;&lt;br /&gt;The key to how this and other similar extension library controls work is the editable area control. If you add an editable area onto a custom control then add your custom control to an xPage, you can drag your page content onto the editable area and have it displayed inside the other parts of the custom control. This allows you to reuse a custom control on many pages and add page-specific elements into the control on each page.  &lt;br /&gt;&lt;br /&gt;Behind the editable areas are facets and callbacks. When you add an editable area to a custom control, designer automatically adds the following code to the source view&lt;br /&gt;&lt;style type=&quot;text/css&quot;&gt;&lt;br /&gt;pre.CICodeFormatter{&lt;br /&gt; font-family:arial;&lt;br /&gt; font-size:12px;&lt;br /&gt; border:1px dashed #CCCCCC;&lt;br /&gt; width:99%;&lt;br /&gt; height:auto;&lt;br /&gt; overflow:auto;&lt;br /&gt; background:#f0f0f0;&lt;br /&gt; line-height:20px;&lt;br /&gt; &lt;br /&gt; padding:0px;&lt;br /&gt; color:#000000;&lt;br /&gt; text-align:left;&lt;br /&gt;}&lt;br /&gt;pre.CICodeFormatter code{&lt;br /&gt; color:#000000;&lt;br /&gt; word-wrap:normal;&lt;br /&gt;}&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;pre class=&quot;CICodeFormatter&quot; &gt;&lt;code class=&quot;CICodeFormatter&quot;&gt;      &amp;lt;xp:callback facetName=&quot;facet_1&quot; id=&quot;callback1&quot;&amp;gt;&amp;lt;/xp:callback&amp;gt;&amp;lt;xp:br&amp;gt;&amp;lt;/xp:br&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;A callback is therefore the definition of a target area - it says &#39;put the page specific stuff here&#39;.  When you use the custom control and drop your content (for example a panel) onto it in an xPage, you designer adds the following code like this inside the tags of your custom control:&lt;br /&gt;&lt;style type=&quot;text/css&quot;&gt;&lt;br /&gt;pre.CICodeFormatter{&lt;br /&gt; font-family:arial;&lt;br /&gt; font-size:12px;&lt;br /&gt; border:1px dashed #CCCCCC;&lt;br /&gt; width:99%;&lt;br /&gt; height:auto;&lt;br /&gt; overflow:auto;&lt;br /&gt; background:#f0f0f0;&lt;br /&gt; line-height:20px;&lt;br /&gt; &lt;br /&gt; padding:0px;&lt;br /&gt; color:#000000;&lt;br /&gt; text-align:left;&lt;br /&gt;}&lt;br /&gt;pre.CICodeFormatter code{&lt;br /&gt; color:#000000;&lt;br /&gt; word-wrap:normal;&lt;br /&gt;}&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;pre class=&quot;CICodeFormatter&quot; &gt;&lt;code class=&quot;CICodeFormatter&quot;&gt; &amp;lt;xp:this.facets&amp;gt;  &lt;br /&gt;      &amp;lt;xp:panel xp:key=&quot;facet_1&quot;&amp;gt;My test xPage custom stuff goes here&amp;lt;/xp:panel&amp;gt;  &lt;br /&gt; &amp;lt;/xp:this.facets&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;The facets element could be translated as &#39;here is stuff I want to put into the custom control&#39;.  The panel has an ID which tells it where to place the content - &lt;em&gt;facet_1&lt;/em&gt; was the facetName property of the callback element shown above. &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Finishing of your custom control&lt;/h2&gt;&lt;br /&gt;So back to our application layout control.  Firstly, you need to enter a Design Definition for the control.  This is the first piece of code pasted into the control properties in the demo video.  Rather than trying to enter your own code, I suggest you grab a copy of the code in the demo database that was downloaded with the extension library.  Open the OneUILayout custom control, select the Custom Control in the Outline pane then select the Design Definition tab in the properties pane.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOGZpUDQr-Z0JXUwFvjs5yld815qL_t0svavbyyFQ6-_0a-ha6qmtWXRAf61ZBWYVvL5fS1pY5tdMq_dNvH54iAqDlP_tvtDuYfNXpuxPZrMPI1K7zdpMtovQ9KQzmfgewCCDmrtHt5WMG/s1600/DesignLayoutSource.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 189px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOGZpUDQr-Z0JXUwFvjs5yld815qL_t0svavbyyFQ6-_0a-ha6qmtWXRAf61ZBWYVvL5fS1pY5tdMq_dNvH54iAqDlP_tvtDuYfNXpuxPZrMPI1K7zdpMtovQ9KQzmfgewCCDmrtHt5WMG/s400/DesignLayoutSource.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5572732537031812562&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now paste the code into the same place in your own custom control.&lt;br /&gt;&lt;br /&gt;Lets have a quick look at what you get&lt;br /&gt;&lt;style type=&quot;text/css&quot;&gt;&lt;br /&gt;pre.CICodeFormatter{&lt;br /&gt; font-family:arial;&lt;br /&gt; font-size:12px;&lt;br /&gt; border:1px dashed #CCCCCC;&lt;br /&gt; width:99%;&lt;br /&gt; height:auto;&lt;br /&gt; overflow:auto;&lt;br /&gt; background:#f0f0f0;&lt;br /&gt; line-height:20px;&lt;br /&gt; &lt;br /&gt; padding:0px;&lt;br /&gt; color:#000000;&lt;br /&gt; text-align:left;&lt;br /&gt;}&lt;br /&gt;pre.CICodeFormatter code{&lt;br /&gt; color:#000000;&lt;br /&gt; word-wrap:normal;&lt;br /&gt;}&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;pre class=&quot;CICodeFormatter&quot; &gt;&lt;code class=&quot;CICodeFormatter&quot;&gt; &amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;  &lt;br /&gt; &amp;lt;xp:view xmlns:xp=&quot;http://www.ibm.com/xsp/core&quot;  &lt;br /&gt;  xmlns:xc=&quot;http://www.ibm.com/xsp/custom&quot;&amp;gt;  &lt;br /&gt; &amp;lt;xp:div style=&quot;background-color:#CEE1FC; padding:5px&quot;&amp;gt;  &lt;br /&gt; &amp;lt;table width=&quot;98%&quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;  &lt;br /&gt;  {logo} &amp;amp;#160; {bannerApplicationLinks}  &lt;br /&gt; &amp;lt;/td&amp;gt;&amp;lt;td align=&quot;right&quot;&amp;gt;{bannerUtilityLinks}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;  &lt;br /&gt;  &amp;lt;xp:table style=&quot;width: 98%; background-color:#FFFFFF&quot;&amp;gt;  &lt;br /&gt;   &amp;lt;xp:tr&amp;gt;  &lt;br /&gt;    &amp;lt;xp:td colspan=&quot;3&quot; style=&quot;background-color:#4586D3&quot;&amp;gt;  &lt;br /&gt;     &amp;lt;table width=&quot;100%&quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;  &lt;br /&gt;      &amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;  &lt;br /&gt;       &amp;lt;td style=&quot;background-color:#4372A9;color:#FFFFFF&quot;&amp;gt;  &lt;br /&gt;        {titleBarTabs}&amp;lt;/td&amp;gt;  &lt;br /&gt;       &amp;lt;td style=&quot;background-color:#E4E8EF&quot;&amp;gt;  &lt;br /&gt;        selected&amp;lt;/td&amp;gt;  &lt;br /&gt;      &amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;  &lt;br /&gt;     &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;  &lt;br /&gt;      &amp;lt;div style=&quot;float:right;background:#FFFFFF&quot;&amp;gt;  &lt;br /&gt;         {searchBar}&amp;lt;/div&amp;gt;  &lt;br /&gt;     &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;  &lt;br /&gt;    &amp;lt;/xp:td&amp;gt;  &lt;br /&gt;   &amp;lt;/xp:tr&amp;gt;  &lt;br /&gt;   &amp;lt;xp:tr&amp;gt;  &lt;br /&gt;    &amp;lt;xp:td colspan=&quot;3&quot; style=&quot;background-color:#E4E8EF&quot;&amp;gt;  &lt;br /&gt;     &amp;lt;table width=&quot;100%&quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;h2&amp;gt;{placeBarName}&amp;lt;/h2&amp;gt;&amp;lt;/td&amp;gt;  &lt;br /&gt;      &amp;lt;td&amp;gt;   &lt;br /&gt;        &amp;lt;div style=&quot;float:right;border:thin solid #C0C7CD&quot;&amp;gt;  &lt;br /&gt;         {placeBarActions}&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;  &lt;br /&gt;     &amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;  &lt;br /&gt;    &amp;lt;/xp:td&amp;gt;  &lt;br /&gt;   &amp;lt;/xp:tr&amp;gt;  &lt;br /&gt;   &amp;lt;xp:tr&amp;gt;  &lt;br /&gt;    &amp;lt;xp:td style=&quot;width:123px&quot; valign=&quot;top&quot;&amp;gt;  &lt;br /&gt;     &amp;lt;xp:callback id=&quot;LeftColumn&quot; facetName=&quot;LeftColumn&quot;/&amp;gt;  &lt;br /&gt;    &amp;lt;/xp:td&amp;gt;  &lt;br /&gt;    &amp;lt;xp:td valign=&quot;top&quot;&amp;gt;  &lt;br /&gt;     &amp;lt;xp:callback id=&quot;callback1&quot;/&amp;gt;  &lt;br /&gt; &amp;lt;xp:br/&amp;gt;&amp;lt;xp:br/&amp;gt;&amp;lt;xp:br/&amp;gt;  &lt;br /&gt;    &amp;lt;/xp:td&amp;gt;  &lt;br /&gt;    &amp;lt;xp:td style=&quot;width:123px&quot; valign=&quot;top&quot;&amp;gt;  &lt;br /&gt;     &amp;lt;xp:callback id=&quot;RightColumn&quot; facetName=&quot;RightColumn&quot; /&amp;gt;  &lt;br /&gt;    &amp;lt;/xp:td&amp;gt;  &lt;br /&gt;   &amp;lt;/xp:tr&amp;gt;  &lt;br /&gt;  &amp;lt;/xp:table&amp;gt;  &lt;br /&gt;  &amp;lt;xp:table style=&quot;width: 98%; background-color:#FFFFFF; margin-top:5px&quot;&amp;gt;  &lt;br /&gt;  &amp;lt;xp:tr&amp;gt;&amp;lt;xp:td&amp;gt; {footerLinks}&amp;lt;/xp:td&amp;gt;&amp;lt;/xp:tr&amp;gt;  &lt;br /&gt;  &amp;lt;/xp:table&amp;gt;  &lt;br /&gt;  {legalText}  &lt;br /&gt;  &amp;lt;/xp:div&amp;gt;  &lt;br /&gt; &amp;lt;/xp:view&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;What you have here is a bit of markup which creates a table-based layout similar to the appearance of oneui layout, and three callbacks. The markup controls the appearance of the control &lt;em&gt;inside designer&lt;/em&gt;. It doesn&#39;t have any impact on the final presentation.  (The oneui layout is achieved through css not tables).  This means you can actually add notes to yourself such as &#39;profile photo should go here&#39;.  Then when your use the control in designer you see your extra markup and don&#39;t need to remove it before finishing the page.  The callbacks provide the places for you to drag &amp; drop your content.  Without these you can still add your content into the appropriate place in the source code pane for your page but it won&#39;t show in the design pane. &lt;br /&gt;&lt;br /&gt;Next, you need to define the facets - the targets for your data.  While the visual location of these is defined by the style sheet, you need to set up the linkages that will let the control know where in the final markup to place your content.   To get the facet code, switch to the source pane of the OneUILayout custom control.  These are the key bits of code you need;&lt;br /&gt;&lt;style type=&quot;text/css&quot;&gt;&lt;br /&gt;pre.CICodeFormatter{&lt;br /&gt; font-family:arial;&lt;br /&gt; font-size:12px;&lt;br /&gt; border:1px dashed #CCCCCC;&lt;br /&gt; width:99%;&lt;br /&gt; height:auto;&lt;br /&gt; overflow:auto;&lt;br /&gt; background:#f0f0f0;&lt;br /&gt; line-height:20px;&lt;br /&gt; background-image:URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWPDEqip_ccgUaj8AjW8_3apUw7sQoDKKSWDemUyR6fEl2kJcLFKTR_DI2ElZuZIDSYgYJP_sLCI27AkHl3htB98XeW9dMpS7CEsSKKD_jE7RkozGRIFniUJOSNWkCJTy8Bm0wu-rCqMKq/s320/codebg.gif);&lt;br /&gt; padding:0px;&lt;br /&gt; color:#000000;&lt;br /&gt; text-align:left;&lt;br /&gt;}&lt;br /&gt;pre.CICodeFormatter code{&lt;br /&gt; color:#000000;&lt;br /&gt; word-wrap:normal;&lt;br /&gt;}&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;pre class=&quot;CICodeFormatter&quot; &gt;&lt;code class=&quot;CICodeFormatter&quot;&gt; &amp;lt;xe:this.facets&amp;gt;  &lt;br /&gt;      &amp;lt;xp:callback xp:key=&quot;LeftColumn&quot; facetName=&quot;LeftColumn&quot;  &lt;br /&gt;           id=&quot;callback1&quot;&amp;gt;&amp;lt;/xp:callback&amp;gt;  &lt;br /&gt;      &amp;lt;xp:callback xp:key=&quot;RightColumn&quot; facetName=&quot;RightColumn&quot;  &lt;br /&gt;           id=&quot;callback2&quot;&amp;gt;&amp;lt;/xp:callback&amp;gt;  &lt;br /&gt; &amp;lt;/xe:this.facets&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;and&lt;br /&gt;&lt;style type=&quot;text/css&quot;&gt;&lt;br /&gt;pre.CICodeFormatter{&lt;br /&gt; font-family:arial;&lt;br /&gt; font-size:12px;&lt;br /&gt; border:1px dashed #CCCCCC;&lt;br /&gt; width:99%;&lt;br /&gt; height:auto;&lt;br /&gt; overflow:auto;&lt;br /&gt; background:#f0f0f0;&lt;br /&gt; line-height:20px;&lt;br /&gt; background-image:URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWPDEqip_ccgUaj8AjW8_3apUw7sQoDKKSWDemUyR6fEl2kJcLFKTR_DI2ElZuZIDSYgYJP_sLCI27AkHl3htB98XeW9dMpS7CEsSKKD_jE7RkozGRIFniUJOSNWkCJTy8Bm0wu-rCqMKq/s320/codebg.gif);&lt;br /&gt; padding:0px;&lt;br /&gt; color:#000000;&lt;br /&gt; text-align:left;&lt;br /&gt;}&lt;br /&gt;pre.CICodeFormatter code{&lt;br /&gt; color:#000000;&lt;br /&gt; word-wrap:normal;&lt;br /&gt;}&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;pre class=&quot;CICodeFormatter&quot; &gt;&lt;code class=&quot;CICodeFormatter&quot;&gt; &amp;lt;xp:callback id=&quot;OneUIMainAreaCallback&quot;&amp;gt;&amp;lt;/xp:callback&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;In between is any configuration setting - you can ignore them.  Copy the code and paste it into the same place within your own custom control.&lt;br /&gt;&lt;br /&gt;Save your custom control and return to the xPage that placed your custom control onto.  You can now drag content onto the three editable areas.  Note that you can only put one item in the left and right controls but you can put multiple things inside the main content area.  I suggest you start by putting a panel control in here then all your other content inside the panel.  &lt;br /&gt;&lt;br /&gt;Here is an example of a completed page with some very basic content - a label on the left, an upload control in the middle and an image on the right.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMyc2sXaaBYPe9Wfwa-GdEoWZO18NAtq_xuvJVGJyYnUFUfbvhSSU7FC838iTEMvC0h991EeHLMn36f_w70v2FcObV0XoXGJ_Sml-T3R4ryD7PhwlLwrUduE0Yc8s8j_qNfhWTZFZoMwVk/s1600/WorkingPage.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 223px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMyc2sXaaBYPe9Wfwa-GdEoWZO18NAtq_xuvJVGJyYnUFUfbvhSSU7FC838iTEMvC0h991EeHLMn36f_w70v2FcObV0XoXGJ_Sml-T3R4ryD7PhwlLwrUduE0Yc8s8j_qNfhWTZFZoMwVk/s400/WorkingPage.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5572743343826964418&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Next post:  how to customise the layout</description><link>http://michelles-universe.blogspot.com/2011/02/xpages-extension-library-for-beginners_12.html</link><author>noreply@blogger.com (Michelle)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBUdHSOnRC1OnsWayzq-2gk5Z3Vcz-ItT3qSNP9i51vjj881DTynR4T6Lo2bijV2lD1K0zGpCkDVZlr-8Lg7E4XG34JZWr2uzV1oi7DqPMIqN9zyMXqREucZRN_k9d6hYQ6OIMz8oXUKvS/s72-c/InitialConfiguration.png" height="72" width="72"/><thr:total>7</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-3924710338143505947</guid><pubDate>Sat, 12 Feb 2011 05:49:00 +0000</pubDate><atom:updated>2011-02-12T17:41:39.839+11:00</atom:updated><title>xPages Extension Library for beginners - Part 1: Getting started with my first real-world xPages app</title><description>I have not posted much on this blog lately due to a number of reasons, but one of them is that I haven&#39;t been doing a lot of development lately.  I&#39;ve been doing admin, support, project management, just not a lot of development and very little of it with new things.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Background &lt;/h2&gt;&lt;br /&gt;I have a need to add a simple web front-end to one of our Notes apps - it&#39;s a basic document storage app but we now need to provide a portion of the content to a business partner, and have decided the easiest way to do this is via a web front-end.&lt;br /&gt;&lt;br /&gt;I dedided to try out the new xPages extension library available from &lt;a href=&quot;http://extlib.openntf.org/&quot;&gt;OpenNTF&lt;/a&gt;.  as I wanted to create something that showed off the new capabilities of Notes &amp; Domino.  However I found that it was quite hard to get started with the extension library and decided to share my experience to hopefully help some others get there a little quicker.&lt;br /&gt;&lt;br /&gt;I have not used xPages much yet.  I have done a basic one-day xPages course lead by &lt;a href=&quot;http://www.wissel.net/&quot;&gt;Stephan Wissel&lt;/a&gt; and worked my way through Declan Lynch&#39;s &lt;a href=&quot;http://www.qtzar.com/blogs/qtzar.nsf/Document.xsp?documentId=A97DB47B9BEDB9868525756F005BC3C3&amp;action=openDocument&quot;&gt;Learning xPages&lt;/a&gt; series, but have not tried to use xPages in a &#39;real world&#39; scenario. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The Application&lt;/h2&gt;&lt;br /&gt;The web application needs to present documents which use a single form to the users, with some basic meta-data fields at the top and a Rich Text field.  In Notes, the data is in a single view with 4 levels of categorisation.  I wanted to present this using a variation of the OneUI theme modified to our company colors, and using some styling from a recently deployed Intranet (not built on Domino) that has impressed the business.  So I need to build a view or document list, with searching, and a page to display the document content.  I want to retain the categorisation, but not necessarily in a categorized view.  I want to use the top-level category as a menu on the left, then either use a categorised view with the next levels or use drop-down selections to filter the view.  As at the time of writing this I have not yet decided which way to go and will share my trials and errors along the way.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The xPages Extension Library&lt;/h2&gt;&lt;br /&gt;The xPages Extension Library is available through &lt;a href=&quot;http://openntf.org&quot;&gt;OpenNTF&lt;/a&gt; and provides a number of additional xPages controls to extend core controls and allow you to quickly build consistent web apps that implement the IBM OneUI interface.  &lt;br /&gt;&lt;br /&gt;Once you download the extension library, follow the instructions in the included pdf to install the controls both on Designer and on your server.  I found these instructions clear and easy to follow so I won&#39;t repeat them here.  You can then open the example database to see how various controls can be used.  So far so good.  However once I decided to start building some pages, I scratched my head in confusion.  As an xPages beginner, the process was far more complicated than I thought and took some trial and error to get going with them.  And documentation is scarce. &lt;br /&gt;&lt;br /&gt;I decided that I want to use the Application Layout control and the Domino View control at least, so I&#39;ll explain how to get them working in the posts to follow.  If I get time, I&#39;ll also try to post the resulting application at the end.&lt;br /&gt;&lt;br /&gt;Up until now, I had sort of thought of xPages and Custom Contols as analogous to forms and sub-forms.  This is only sort-of true.  When you start to use the Extension Library you can see the areas how the xPages model is much more powerful.  The custom controls can not only sit within the parent xpage but contain and control content that is within the page.  This is how the Application Layout control works.  You configure it to provide the &#39;look &amp; feel&#39; of your pages then add it to your xPage.  You then specify where within the layout your page content goes.  &lt;br /&gt;&lt;br /&gt;Next post:  How to use the Application Layout Control in detail.</description><link>http://michelles-universe.blogspot.com/2011/02/xpages-extension-library-for-beginners.html</link><author>noreply@blogger.com (Michelle)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-6620932507763210109</guid><pubDate>Fri, 27 Aug 2010 00:28:00 +0000</pubDate><atom:updated>2010-08-27T10:48:26.844+10:00</atom:updated><title>Why Notes 8.5.2 is bad for developer productivity</title><description>I spent some time yesterday turning this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2q0GJSi61pOykmTHySc4ewndLy4PWwmxqmeA3PQNMqviK-StnnDVbQddqwDpMYVQwWnVYeq3pvakVUWkMLR5XntplQxYM0CMRor_XFzSVP0ii1RxRhPTKNxzlE1L0XyHnMJFhP0l3hr82/s1600/ws851.nsf.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 220px; height: 271px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2q0GJSi61pOykmTHySc4ewndLy4PWwmxqmeA3PQNMqviK-StnnDVbQddqwDpMYVQwWnVYeq3pvakVUWkMLR5XntplQxYM0CMRor_XFzSVP0ii1RxRhPTKNxzlE1L0XyHnMJFhP0l3hr82/s400/ws851.nsf.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5509880173670068322&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;into this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxS0NBq2r-bfqRVEmpPzNY2LUSqpINRl5ow4ZYpkE73A_CNqk45Rvy8Y2PTBae39b2-m9s-0f0IIGf2_ub2DspdliIravAN7S4Ks5i-_JeCl4iviTyNSgq3hypcoi8ulbr1goNUQRh-BwJ/s1600/Workspace1.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 217px; height: 267px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxS0NBq2r-bfqRVEmpPzNY2LUSqpINRl5ow4ZYpkE73A_CNqk45Rvy8Y2PTBae39b2-m9s-0f0IIGf2_ub2DspdliIravAN7S4Ks5i-_JeCl4iviTyNSgq3hypcoi8ulbr1goNUQRh-BwJ/s400/Workspace1.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5509880470085159346&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Welcome to the 21st century, workspace !&lt;br /&gt;&lt;br /&gt;Unfortunately I&#39;m the only one who will see the changes (which is why it is a waste of time - for now - and why I haven&#39;t really put all that much effort into it).  We we have almost completed a Notes 8.5.1 roll-out and I doubt I could get approval to immediately roll out 8.5.2. &lt;br /&gt;&lt;br /&gt;Now what was I supposed to be working on?</description><link>http://michelles-universe.blogspot.com/2010/08/why-notes-852-is-bad-for-developer.html</link><author>noreply@blogger.com (Michelle)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2q0GJSi61pOykmTHySc4ewndLy4PWwmxqmeA3PQNMqviK-StnnDVbQddqwDpMYVQwWnVYeq3pvakVUWkMLR5XntplQxYM0CMRor_XFzSVP0ii1RxRhPTKNxzlE1L0XyHnMJFhP0l3hr82/s72-c/ws851.nsf.png" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-9175938207901340332</guid><pubDate>Sun, 29 Nov 2009 22:35:00 +0000</pubDate><atom:updated>2009-11-30T17:38:27.448+11:00</atom:updated><title>How do you change the name of a script library in DDE 8.5.1? [Updated]</title><description>The only way I can find to do it is &#39;in view edit&#39; - that is clicking on the script library name in the list of script libraries so that I can change the name without opening the library.&lt;br /&gt;&lt;br /&gt;I can&#39;t bring up the old-style properties box for a script library any more and the library name is not editable in the eclipse-style properties.&lt;br /&gt;&lt;br /&gt;There is no refactor/rename option on right-click in the &#39;applications&#39; view as there is in package explorer view in eclipse.  Am I missing something or is this the only way?&lt;br /&gt;&lt;br /&gt;[Update]&lt;br /&gt;I got an answer in &lt;a href=&quot;http://na2.elguji.com/iqjam/iqjam.nsf/questions/20091130_How_do_I_change_the_name_of_a_.htm&quot;&gt;IQJam&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can right-click on the element in the applications view - I swear I looked there and didn&#39;t see it before.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT2cxQEFTm70aiPqzpBHxWvtSXt78qo3QnHV08PFLiYeS781PIVrqneJ5KpMZADaNuFUYY6fJ3Gv-kh0fkpvAEsz9pj9NCaUTAIW93sqOHYlU2p6sF45lTP9NMyIZhzaNZ1Pn7RCJ3nm0A/s1600/30-11-2009+5-36-31+PM.gif&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 305px; height: 239px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT2cxQEFTm70aiPqzpBHxWvtSXt78qo3QnHV08PFLiYeS781PIVrqneJ5KpMZADaNuFUYY6fJ3Gv-kh0fkpvAEsz9pj9NCaUTAIW93sqOHYlU2p6sF45lTP9NMyIZhzaNZ1Pn7RCJ3nm0A/s400/30-11-2009+5-36-31+PM.gif&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5409782124305114338&quot; /&gt;&lt;/a&gt;</description><link>http://michelles-universe.blogspot.com/2009/11/how-do-you-change-name-of-script.html</link><author>noreply@blogger.com (Michelle)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT2cxQEFTm70aiPqzpBHxWvtSXt78qo3QnHV08PFLiYeS781PIVrqneJ5KpMZADaNuFUYY6fJ3Gv-kh0fkpvAEsz9pj9NCaUTAIW93sqOHYlU2p6sF45lTP9NMyIZhzaNZ1Pn7RCJ3nm0A/s72-c/30-11-2009+5-36-31+PM.gif" height="72" width="72"/><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-8005624090915837837</guid><pubDate>Sun, 29 Nov 2009 04:09:00 +0000</pubDate><atom:updated>2009-11-29T15:14:30.513+11:00</atom:updated><title>Feeds now redirected to Feedburner</title><description>Hi&lt;br /&gt;&lt;br /&gt;If anyone out there has subscribed to my blog in a reader, please re-direct your reader to &lt;br /&gt;&lt;br /&gt;http://feeds.feedburner.com/MichellesUniverse&lt;br /&gt;&lt;br /&gt;Why?  Just playing really - I&#39;m checking out how Feedburner and Google Analytics work.  &lt;br /&gt;&lt;br /&gt;Thanks</description><link>http://michelles-universe.blogspot.com/2009/11/feeds-now-redirected-to-feedburner.html</link><author>noreply@blogger.com (Michelle)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-4589449958104464987</guid><pubDate>Thu, 26 Nov 2009 11:58:00 +0000</pubDate><atom:updated>2009-11-26T23:30:19.035+11:00</atom:updated><title>Locating Lotusscript errors using DDE 8.5.1</title><description>Although it still feels rough around the edges, I keep finding little things to love about Domino Designer for Eclipse 8.5.1.&lt;br /&gt;&lt;br /&gt;Today I was refactoring some of my script libraries moving code around, renaming libraries, etc.  I forgot that I loaded one of the libriaries directly into two action buttons on a subform.&lt;br /&gt;&lt;br /&gt;In the past I would only have discovered this when I went to load the form, at which time I would see the ever useful error message &quot;Error loading USE or USELSX module&quot;.  The next half hour would usually involve copying the form the removing bits and pieces until I located the offending code.&lt;br /&gt;&lt;br /&gt;But today - when I save the re-named script library a little red x was added to the database outline.  Clicking on the Problems tab listed more information about the error.  Better still, double-clicking the error opened the subform where the issue occurred.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNFok6G-QeMRjVGyuPBrMq-cN06UTtxKIa6PPO3j30klbT7jxe_BRi-kxpTdknAYz7O60lqxmhq3G6xlZ6errsj1tE1-wv-bAfKgTAetDCiwHYdAV9HhtSlRCcG1GiWepc5AVqk7BMejAJ/s1600/DesignerErrors.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 238px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNFok6G-QeMRjVGyuPBrMq-cN06UTtxKIa6PPO3j30klbT7jxe_BRi-kxpTdknAYz7O60lqxmhq3G6xlZ6errsj1tE1-wv-bAfKgTAetDCiwHYdAV9HhtSlRCcG1GiWepc5AVqk7BMejAJ/s400/DesignerErrors.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5408382087078557970&quot; /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;In fact, the subform opened as DXL allowing me to quickly search and find the offending code (the error message included the problem library name), instead of having to hunt around different parts of the sub-form searching for the problem.&lt;br /&gt;&lt;br /&gt;One improvement I would like to see is having the error indicators at all folders in the tree as happens in Eclipse when editing Java (this the kind of the little things that makes DDE feel a little under-developed).  I would also like the confidence to have updated the code in the XML view but I decided not to but to open the default subform editor and fix it there.  After all, if you right-click on any design element and choose &quot;Edit with DXL&quot; you get warned that this could result in loss of information.&lt;br /&gt;&lt;br /&gt;So if you haven&#39;t made the move yet, go download and install 8.5.1 now.  Even if your company is still working in 7 or even 6.5, there are times when being able to examine your code in 8.5.1 is a massive time-saver.</description><link>http://michelles-universe.blogspot.com/2009/11/locating-lotusscript-errors-using-dde.html</link><author>noreply@blogger.com (Michelle)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNFok6G-QeMRjVGyuPBrMq-cN06UTtxKIa6PPO3j30klbT7jxe_BRi-kxpTdknAYz7O60lqxmhq3G6xlZ6errsj1tE1-wv-bAfKgTAetDCiwHYdAV9HhtSlRCcG1GiWepc5AVqk7BMejAJ/s72-c/DesignerErrors.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-1586500520964108826</guid><pubDate>Mon, 07 Sep 2009 05:56:00 +0000</pubDate><atom:updated>2009-09-07T16:08:25.657+10:00</atom:updated><title>Question: Do you run a Notes client or Admin client on your server?</title><description>I have to admit I haven&#39;t been into the Notes forums for quite a while - I had a bit of free time at lunch today and after researching a strange issue I decided to answer a few questions - do my community service.&lt;br /&gt;&lt;br /&gt;In both the 6/7 forum and the 8 forum there were postings about issues running clients on the server.&lt;br /&gt;&lt;br /&gt;Do you do this?  If so, why?&lt;br /&gt;&lt;br /&gt;I haven&#39;t seen any need to install client software of any flavour on the server for years, since the &quot;Full Access Administration&quot; feature was added (when was this? version 6?).&lt;br /&gt;&lt;br /&gt;The Domino Administrator help for version 7 says:&lt;pre&gt;Do not install the Domino Administrator on the same system on which you installed the Domino server. Doing so compromises Domino&#39;s security and impairs server performance.&lt;/pre&gt;If you do install either Notes client or Domino admin client - what are your reasons?  Is this just a hang-over from the Note 4 / 5 days when this was the only way to get around broken ACLs etc?  Or are there things you find you can&#39;t do any other way?</description><link>http://michelles-universe.blogspot.com/2009/09/question-do-you-run-notes-client-or.html</link><author>noreply@blogger.com (Michelle)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-463894057009791939</guid><pubDate>Wed, 25 Feb 2009 13:52:00 +0000</pubDate><atom:updated>2009-02-26T01:41:36.638+11:00</atom:updated><title>Giffly - An on-line Drawing tool</title><description>I had a small project to modify an existing Notes database, adding a new process to an existing workflow application.&lt;br /&gt;&lt;br /&gt;The initial request was worded along the lines of &#39;like form XXX but with the following changes:  (etc)&#39;&lt;br /&gt;&lt;br /&gt;The database is a mature application, and is beginning to suffer from &lt;a href=&quot;http://en.wikipedia.org/wiki/Software_rot&quot;&gt;code rot&lt;/a&gt;.  What appears to have originally been a reasonably clearly structured function has degenerated into over 300 lines of nested if and case statements.  I was struggling to work through the logic and decided I needed to map the existing code before I could change it.&lt;br /&gt;&lt;br /&gt;Although I do have it installed on my laptop, I have an irrational dislike of the industry leading software for creating flow-charts so I went looking for an alternative and found &lt;a href=&quot;http://www.gliffy.com&quot;&gt;Gliffy&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It has a 30 day free trial and I am impressed.  For a quick chart or diagram, this is very easy to use and has all the features I was looking for.&lt;br /&gt;&lt;br /&gt;As an example, this is the flow-chart I created for two functions I examined:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLROsmr4maTLzx8nqKn6lOueuDlOOqarU27jCwIyojVS5IsmArhSSkvgcUzulHeTp4RzL2S8VW9l_lj2_Ujioof_4sromfZTGaXvCFFTbk05EYSe7UPKMJz03SVMaMPjymBbPmyE8rob9S/s1600-h/M.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 164px; height: 400px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLROsmr4maTLzx8nqKn6lOueuDlOOqarU27jCwIyojVS5IsmArhSSkvgcUzulHeTp4RzL2S8VW9l_lj2_Ujioof_4sromfZTGaXvCFFTbk05EYSe7UPKMJz03SVMaMPjymBbPmyE8rob9S/s400/M.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5306737101187810162&quot; /&gt;&lt;/a&gt;&lt;br /&gt;(&lt;a href=&quot;http://www.gliffy.com/publish/1619616/&quot;&gt;Full size image&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;You can export the images as jpg or png.  The limited free version adds the Gliffy logo to images.  The Premium service has single user access from $5 per month but for my purposes the free features are probably enough - when you just occasionally want to put together something for yourself, to clarify your thought processes, etc.&lt;br /&gt;&lt;br /&gt;Now on to some serious refactoring  ...</description><link>http://michelles-universe.blogspot.com/2009/02/giffly-on-line-drawing-tool.html</link><author>noreply@blogger.com (Michelle)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLROsmr4maTLzx8nqKn6lOueuDlOOqarU27jCwIyojVS5IsmArhSSkvgcUzulHeTp4RzL2S8VW9l_lj2_Ujioof_4sromfZTGaXvCFFTbk05EYSe7UPKMJz03SVMaMPjymBbPmyE8rob9S/s72-c/M.jpg" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-8819255895384541945</guid><pubDate>Fri, 13 Feb 2009 12:52:00 +0000</pubDate><atom:updated>2009-02-14T01:46:40.285+11:00</atom:updated><title>Consuming .Net web services in Notes 8.5</title><description>A new challenge this week:  A client wants to consume a web service from an external party.&lt;br /&gt;&lt;br /&gt;So they are using Notes &amp;amp; Domino 7 at the moment, but have an upgrade to 8.5 planned (although timing has not been confirmed yet).&lt;br /&gt;&lt;br /&gt;I have not used &lt;a href=&quot;http://www.nsftools.com/&quot;&gt;Julian Robichaux&#39;s&lt;/a&gt; tool &lt;a href=&quot;http://www.openntf.org/Projects/pmt.nsf/ProjectLookup/Stubby&quot;&gt;Stubby&lt;/a&gt;, but have only ever read good things about it.  My Java is pretty basic but I have written a few small things and used LS2J so I figured this would be achievable in Notes 7.&lt;br /&gt;&lt;br /&gt;However I was excited about the idea of doing it in 8.5 as I had read about the new Web Service Consumer feature.&lt;br /&gt;&lt;br /&gt;So after a meeting with the client, a phone conference with the web service provider and a bit of a discussion with my team, I cracked open my barely touched DDE 8.5.&lt;br /&gt;&lt;br /&gt;After a bit of reading on the net I found &lt;a href=&quot;http://www.wohill.com/design/386/A-web-service-consumer-example.html&quot;&gt;this example&lt;/a&gt;.  It worked first time and couldn&#39;t be easier.&lt;br /&gt;&lt;br /&gt;So I created a new web service consumer, named it and pointed it to the URL of the WSDL of the service I wanted to test.  The WSDL failed to load, and presented the following error:&lt;pre&gt;The request operation failed: Element&lt;br /&gt;{http://www.w3org/2001/XMLSchema}schema is referenced but not defined&lt;/pre&gt;Not a terribly informative message, and nothing I searched for in the error message shed any light on the problem.&lt;br /&gt;&lt;br /&gt;I downloaded the WSDL and opened it in an editor.&lt;br /&gt;&lt;br /&gt;First problem - it was defined using the SOAP 1.2 protocol.  Now this is fine for Notes 8 or 8.5, but it pretty much rules out using Notes 7.&lt;br /&gt;&lt;br /&gt;Now learning to reading a WSDL file for me had previously rated somewhere up there with root canals - every time I looked at one it made my eyes glaze over and I found myself switching to more pressing tasks such as cleaning out my desk draws, filing emails, anything.  But it could be avoided no more.  I looked through the WSDL file and compared it with the one that loaded.  It seemed to contain all the same basic elements, the namespace declaration for schema seemed identical. Message and operations all seemed correctly defined.&lt;br /&gt;&lt;br /&gt;I found a &lt;a href=&quot;http://www.validwsdl.com/&quot;&gt;web page&lt;/a&gt; that allows you to query web services. This site reported that the web service was valid - it returned all the available methods, queried the web service and returned valid results.&lt;br /&gt;&lt;br /&gt;So I reverted to the most basic of debugging techniques - chop out 90% of the WSDL until I could get it to load, and started putting things back a small chunk at a time until I find the offending code.&lt;br /&gt;&lt;br /&gt;The WSDL contained a schema at the top, defining the parameters for the input and output when calling the web service methods.  A typical example is:&lt;pre&gt;&amp;lt;s:element name=&quot;GetDealers&quot;&gt;&lt;br /&gt;  &amp;lt;s:complextype /&gt;&lt;br /&gt;&amp;lt;/s:element&gt;&lt;br /&gt;&amp;lt;s:element name=&quot;GetDealersResponse&quot;&gt;&lt;br /&gt;  &amp;lt;s:complextype&gt;&lt;br /&gt;    &amp;lt;s:sequence&gt;&lt;br /&gt;      &amp;lt;s:element minoccurs=&quot;0&quot; maxoccurs=&quot;1&quot; name=&quot;GetDealersResult&quot;&gt;&lt;br /&gt;        &amp;lt;s:complextype&gt;&lt;br /&gt;          &amp;lt;s:sequence&gt;&lt;br /&gt;            &amp;lt;s:element ref=&quot;s:schema&quot;&gt;&lt;/s:element&gt;&lt;br /&gt;            &amp;lt;s:any /&gt;&lt;br /&gt;          &amp;lt;/s:sequence&gt;&lt;br /&gt;        &amp;lt;/s:complextype&gt;&lt;br /&gt;      &amp;lt;/s:element&gt;&lt;br /&gt;    &amp;lt;/s:sequence&gt;&lt;br /&gt;  &amp;lt;/s:complextype&gt;&lt;br /&gt;&amp;lt;/s:element&gt;&lt;/pre&gt;The problem is the line with ref=&quot;s:schema&quot;.&lt;br /&gt;&lt;br /&gt;Now that I had found the problem line, a web search turned up some useful information.&lt;br /&gt;&lt;br /&gt;The problem is that .Net allows developers to define the return value of a web service to be a DataSet - which basically means the return values will be defined at run time, and a schema will be included in the web service return value.  This schema will be called &#39;schema&#39; and the elements will be prefixed with &#39;s:&#39; .  Unfortunately this is the same naming scheme used within the WSDL itself, but it turns out that this is just a co-incidence (or lazy programming?).  The java libraries used by Notes complain because this schema is undefined when it is attempting to create the stub functions in the web service consumer, so it cannot define the objects returned by the methods.&lt;br /&gt;&lt;br /&gt;From what I managed to find on the web, this is becoming an increasingly popular way for .Net developers to define their web services.  I can see some instances where the returned results may not be known in advance, but I suspect this is a default setting in the IDE, and if the developers never work in the Java world they see no need to explicitly define their data as .Net consumers don&#39;t complain.&lt;br /&gt;&lt;br /&gt;The solution is to remove the offending line, and change the following line to read:&lt;pre&gt;&amp;lt;s:any minoccurs=&quot;2&quot; maxoccurs=&quot;2&quot;&gt;&lt;/pre&gt;This will return an object of type XSD_ANYTYPE, with a public array called &#39;any&#39; which contains two NotesDOMElementNode members.&lt;br /&gt;&lt;br /&gt;So after changing the local copy of WSDL, I was able to import it and create my web consumer.  After that, I just needed to create a test button with the following code:&lt;pre&gt;Option Declare&lt;br /&gt;Use &quot;[web service consumer name]&quot;&lt;br /&gt;&lt;br /&gt;Sub Click(Source As Button)&lt;br /&gt;&lt;br /&gt;  Dim myWebService As New [class name of porttypebase class]&lt;br /&gt;  Dim wsReturnObj As [class name of method return object]&lt;br /&gt;  Dim xsdParam1 As New XSD_STRING&lt;br /&gt;  Dim xsdParam2 As New XSD_STRING&lt;br /&gt;  Dim session As New NotesSession&lt;br /&gt;  Dim ws As New NotesUIWorkspace&lt;br /&gt;  Dim doc As NotesDocument&lt;br /&gt;  Dim dataNode As NotesDOMElementNode&lt;br /&gt;  Dim response As String&lt;br /&gt;  Dim nodeList As NotesDOMNodeList&lt;br /&gt;  Dim targetNode As NotesDOMNode&lt;br /&gt;&lt;br /&gt;  Set doc = ws.CurrentDocument.Document&lt;br /&gt;&lt;br /&gt;  &#39; set the input parameters&lt;br /&gt;  xsdParam1.setValueFromString( doc.Field1(0) )&lt;br /&gt;  xsdParam2.setValueFromString( doc.Field2(0) )&lt;br /&gt;&lt;br /&gt;  &#39; call the web service&lt;br /&gt;  Set wsReturnObj = myWebService.MethodName( xsdParam1, xsdParam2 )&lt;br /&gt;  Set dataNode = wsReturnObj.any(1)&lt;br /&gt;   &#39; any(0) contains the schema if you need it&lt;br /&gt;&lt;br /&gt;  &#39; now we have a familiar object we can process any way we want&lt;br /&gt;  Set nodeList = dataNode.GetElementsByTagName(&quot;elementName&quot;)&lt;br /&gt;  Set targetNode = nodeList.GetItem(1)&lt;br /&gt;  If Not targetNode.IsNull Then&lt;br /&gt;    If Not targetNode.FirstChild.IsNull Then&lt;br /&gt;      response =  targetNode.FirstChild.NodeValue + Chr(10) &lt;br /&gt;    End If&lt;br /&gt;  End If&lt;br /&gt;&lt;br /&gt;  doc.response = response&lt;br /&gt;&lt;br /&gt;End Sub&lt;/pre&gt;Done!</description><link>http://michelles-universe.blogspot.com/2009/02/consuming-net-web-services-in-notes-85.html</link><author>noreply@blogger.com (Michelle)</author><thr:total>10</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-956504163877735914</guid><pubDate>Fri, 21 Nov 2008 09:46:00 +0000</pubDate><atom:updated>2009-02-14T00:17:30.862+11:00</atom:updated><title>Discovering Dojo for Domino: Part 4 - Event Handlers, the DOM and Data Stores</title><description>Work and family have been pretty busy, so this next post has taken a little longer than I expected&lt;br /&gt;&lt;br /&gt;OK, so dijits are pretty and all web 2.0-ish, and the date picker is nice, but there is more to dojo than that.  The whole point of a javascript framework is to simplify common tasks and allow you to extend your application.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Basic event handling&lt;/h3&gt;&lt;br /&gt;Firstly, a common task on a web form:  the user clicks a radio button and some of the fields are hidden or shown, depending on the choice.  No too difficult, but tedious if you want to change the properties on multiple items.  With the dojo.query method, this becomes alot simpler:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 1&lt;/b&gt;&amp;nbsp;&amp;nbsp;Set the event handler for dojo.  Your field HTML Attributes become:&lt;pre&gt;&quot;dojoType=&#39;dijit.form.RadioButton&#39; onclick=&#39;clickRadioButton&#39; &quot;&lt;/pre&gt;Notice that I have assigned a text string to the onclick event, not called a function directly.  This is because dojo provides event handlers which can override and extend the default event handlers.  This is the function which will be called when the event fires.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 2&lt;/b&gt;&amp;nbsp;&amp;nbsp;Load the dijit code in your JS Header&lt;pre&gt;dojo.require(&quot;dijit.form.CheckBox&quot;);&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Step 3&lt;/b&gt;&amp;nbsp;&amp;nbsp;Add a function to your script library to handle the onClick event.  For example:&lt;pre&gt;function clickRadioButton(  ){&lt;br /&gt; if( this.getValue == &#39;Hide&#39; ) {&lt;br /&gt;  dojo.query(&#39;.myClass&#39;).style(&#39;display&#39;, &#39;none&#39; );&lt;br /&gt; } else {&lt;br /&gt;  dojo.query(&#39;.myClass&#39;).style(&#39;display&#39; , &#39;&#39; );&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;i&gt;this&lt;/i&gt; within the function is the dijit object, and has access to all the dijit functions, including &lt;i&gt;getValue&lt;/i&gt;.  This useful function gives you pretty much a value you can test as you would in Notes, so &lt;i&gt;this.getValue&lt;/i&gt; will give you the following:&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th width=&#39;20%&#39;&gt;dijit&lt;/th&gt;&lt;th width=&#39;20%&#39;&gt;Event&lt;/th&gt;&lt;th&gt;Returns&lt;/th&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;TextBox&lt;/td&gt;&lt;td&gt;onChange&lt;/td&gt;&lt;td&gt;Text within the field&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;DateTextBox&lt;/td&gt;&lt;td&gt;onChange&lt;/td&gt;&lt;td&gt;a Javascript date/time object&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;TimeTextBox&lt;/td&gt;&lt;td&gt;onChange&lt;/td&gt;&lt;td&gt;a Javascript date/time object&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;CheckBox&lt;/td&gt;&lt;td&gt;onClick&lt;/td&gt;&lt;td&gt;Checkbox label if being selected, false if being unselected&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;RadioButton&lt;/td&gt;&lt;td&gt;onClick&lt;/td&gt;&lt;td&gt;the label of the selected radio button&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;FilteringSelect&lt;/td&gt;&lt;td&gt;onChange&lt;/td&gt;&lt;td&gt;the alias of the selected option&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Accessing the DOM&lt;/h3&gt;&lt;br /&gt;The &lt;i&gt;dojo.query&lt;/i&gt; function takes any valid CSS3 selector (e.g. &#39;.myClass&#39;, &#39;#myDiv&#39; , &#39;TD&#39; etc) and returns an array of node elements.  You can chain queries to get items nested within others.  Dojo has functions which modify element properties and these can modify all node elements in a collection without the need to iterate over each item in turn. So&lt;pre&gt;dojo.query(&#39;#myDiv&#39;).query(&#39;.myClass2&#39;).style(&#39;display&#39; , &#39;none&#39; );&lt;br /&gt;&lt;/pre&gt;would  get all elements with the class &#39;myClass&#39; inside the div &#39;myDiv&#39; and set they display property to &#39;none&#39;.&lt;br /&gt;&lt;br /&gt;There are a range of functions for getting and setting various node attributes which can be used in this way.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Filtering Selects and Data Stores&lt;/h3&gt;&lt;br /&gt;A Filtering select is a dojo dijit like a combo box.  As discussed in my &lt;a href=&quot;http://michelles-universe.blogspot.com/2008/11/discovering-dojo-for-domino-part-3.html&quot;&gt;previous post&lt;/a&gt;, there are problems with using a filtering select with a Domino dialog lists because they generate incomplete HTML.&lt;br /&gt;&lt;br /&gt;What dojo actually does is parse the DOM and load your select options into an internal data store and point the dijit to that data store.  Examining the dijit object using Firebug, I found that the options are loaded, but they contain a trailing end of line character (\n), which breaks the select in firefox but appends a trailing space in IE.  Neither is pretty.  I wrote the following function to &#39;fix&#39; the data in the data store:&lt;pre&gt;&lt;br /&gt;function fixSelect( dijitID ){&lt;br /&gt; // get the data store used by the select&lt;br /&gt; var thisStore = dijit.byId( dijitID ).store;&lt;br /&gt; &lt;br /&gt; // function to update store items&lt;br /&gt; var itemUpdate = function(listItem){&lt;br /&gt;  if(  listItem.name[0].indexOf( &quot;\n&quot; )  &gt; 0 ){&lt;br /&gt;   listItem.name[0] = listItem.name[0].split( &quot;\n&quot; )[0] ;&lt;br /&gt;  }&lt;br /&gt; };&lt;br /&gt; // function to handle errors&lt;br /&gt; var gotError = function()  {&lt;br /&gt;//  your error handling goes here ;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; // now call the fetch.  &lt;br /&gt; var items = thisStore.fetch( { &lt;br /&gt;                 onItem: itemUpdate, &lt;br /&gt;                 onError: gotError &lt;br /&gt;     });&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This looks a little complicated, because the fetch method is asyncronous.  This means we cannot simply call store.fetch, assign the results to a variable, then iterate over the results. Instead we pass fetch(() the function to call as each item is returned (there are also ways to work on the complete item set).  The first parameter passed to the function is the returned item, which our function can then do something with.  &lt;br /&gt;&lt;br /&gt;The other alternative is to use a text field, define it as a FilteringSelect dijit in the HTML Attributes and point it to a data store you have created yourself.  This is what you will need to do to use AJAX to replace your list choices.  &lt;br /&gt;&lt;br /&gt;Data stores are a powerful construct with what seems like a whole api of their own and I have only just skimmed the surface so far.  I intend to post more when I get my dynamic picklists working (by this I mean AJAX updates of the select choices depending on a choice in another field).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Some more on using DateTextBox&lt;/h3&gt;&lt;br /&gt;The date format used by dojo is yyyy-mm-dd, and dates are stored in the text field (and returned to Domino) are in that format.  You can change the display format or let dojo detect your users locale and use the appropriate format, but you can&#39;t change the format in which the data is submitted.  &lt;br /&gt;&lt;br /&gt;If you want to pre-populate your field with a date (such as @Today) you actually need to split the date and re-format it into the appropriate string first</description><link>http://michelles-universe.blogspot.com/2008/11/discovering-dojo-for-domino-part-4.html</link><author>noreply@blogger.com (Michelle)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-3013768958624035564</guid><pubDate>Mon, 17 Nov 2008 00:28:00 +0000</pubDate><atom:updated>2008-11-21T14:40:02.186+11:00</atom:updated><title>Discovering Dojo for Domino: Part 3 - Dijits for Domino</title><description>The next thrilling episode in my dojo adventures ...&lt;br /&gt;&lt;br /&gt;Firstly, some references:  the three primary references I used are &lt;a href=&quot;http://dojotoolkit.org/book/dojo-book-0-9/part-2-dijit-0&quot;&gt;The Book of Dojo - Part 2&lt;/a&gt; which gives you an overview of dijits and how they work in general, the &lt;a href=&quot;http://dojocampus.org/explorer/&quot;&gt;Dojo Campus - Feature Explorer&lt;/a&gt; which has examples and shows the related code, the dojo &lt;a href=&quot;http://api.dojotoolkit.org/&quot;&gt;API Reference&lt;/a&gt;.  I also found the following part of the dojo campus through Google:  &lt;a href=&quot;http://docs.dojocampus.org/&quot;&gt;http://docs.dojocampus.org&lt;/a&gt;.  I can&#39;t find a link to it on the main DojoCampus page, but it&#39;s very useful.&lt;br /&gt;&lt;br /&gt;To create digits, you can add to your http markup, or you can create components programmatically. &lt;br /&gt;&lt;br /&gt;Example through markup (from Dojo Campus):&lt;br /&gt;&lt;pre&gt;&amp;lt;input id=&quot;q01&quot; type=&quot;text&quot; name=&quot;firstname&quot;&lt;br /&gt;  value=&quot;testing testing&quot;&lt;br /&gt;  style=&quot;width: 100px;&quot;&lt;br /&gt;  dojoType=&quot;dijit.form.TextBox&quot;&lt;br /&gt;  uppercase=&quot;true&quot; /&amp;gt;&lt;/pre&gt;For now, I&#39;m going to leave programatic creation alone.  While this would create the visual elements, I&#39;m not sure they would be saved to disk if you are submitting a standard form to your server (rather than POSTing it to an agent).  I haven&#39;t investigated though and this may be a valid alternative in some circumstances.&lt;br /&gt;&lt;br /&gt;The API reference lists all the methods and parameters.  Methods include standard event handlers (onClick, onChange, etc), and there are a whole lot of parameters, but some of the most useful are things like:  class, style, uppercase and trim.  For example, setting trim=true will have the text box automatically remove leading and trailing white space - no extra coding required.&lt;br /&gt;&lt;br /&gt;As with the core, you simply need to reference the dojo script libraries in your form&#39;s HTML Head Content (see my &lt;a href=&quot;http://michelles-universe.blogspot.com/2008/11/discovering-dojo-for-domino-part-2.html&quot;&gt;previous post&lt;/a&gt;.  You also need to &#39;dojo.require&#39; the appropriate libraries for the widgets in your JS Header (see &lt;a href=&quot;http://michelles-universe.blogspot.com/2008/11/discovering-dojo-for-domino-part-1.html&quot;&gt;Part 1&lt;/a&gt;). &lt;br /&gt;&lt;br /&gt;For widgets, the only extra part is the style sheets.  There are three common themes, the most common of which is the Tundra theme.  These come already installed with 8.5, and are located in [program folder]\Domino\data\domino\js\dojo-1.1.0\dijit\themes. &lt;br /&gt;&lt;br /&gt;You need to reference the themes in your HTML Head Content along with the script libraries, so my 8.5 test form now contains: &lt;pre&gt;&amp;quot;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;href=&amp;quot;/domjs/dojo-1.1.0/dijit/themes/tundra/tundra.css&amp;quot; /&amp;gt;&amp;quot; + &lt;br /&gt;&amp;quot;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;src=&amp;quot;/domjs/dojo-1.1.0/dojo/dojo.js&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;djConfig=&amp;quot;parseOnLoad:true, isDebug:true&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&amp;quot; &lt;/pre&gt;The doc.dojocampus.org site also recommends:&lt;blockquote&gt;It is recommended you include the theme CSS file before dojo.js to avoid any potential latency issues. &lt;/blockquote&gt;If you use the Tundra theme, you also need to include the class in you form&#39;s HTML Body Attributes&lt;pre&gt;&quot;class=&#39;tundra&#39; &quot;&lt;/pre&gt;First, I created a simple text field.  You can add the additional dojo code to either the field properties box (HTML Tab - Other) or the HTML Attributes of the field in the design pane.  Both work.  The properties box is very small and in general the design pane is easier to work with.  The only advantage of the properties box is you don&#39;t have to change code if you paste it in there, whereas with the design pane you need to enter a formula which returns a text string.  This means you may need to escape double quotes with a backslash, or change double quotes to single quotes.&lt;br /&gt;&lt;br /&gt;For the text field, I added the following to the design pane:&lt;pre&gt;&quot;dojoType=&#39;dijit.form.TextBox&#39; uppercase=&#39;true&#39; trim=&#39;true&#39; &quot;&lt;/pre&gt;I added the appropriate &#39;require&#39; statement to the JS Header of the form and I now have a working dijit which automatically converts the text to upper case on exiting the field and trims white space from both ends (and is styed quite nicely too).&lt;br /&gt;&lt;br /&gt;Other basic dijits I&#39;ve tested (check out the &lt;a href=&quot;http://dojocampus.org/explorer/&quot;&gt;Dojo Campus - Feature Explorer&lt;/a&gt; for the relevent require function and html attributes):&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Date picker - just a text field, but can be trimmed or a constraint applied&lt;/li&gt;&lt;li&gt;Time picker - I&#39;m not sure I like this widget much, but again you can apply constraints to define the format&lt;/li&gt;&lt;li&gt;Number Spinner - Allows user to either type a number or click Up/Down to adjust.  Max, Min and number of decimal places can be define.&lt;/li&gt;&lt;li&gt;Combobox - like a standard html combo box but users can enter values not in list.  I had problems with this - see below.&lt;/li&gt;&lt;li&gt;Filtering Select - like a standard combo box but uses &#39;Google Suggests&#39; style interface.  Again this doesn&#39;t work &#39;out of the box&#39; with Domino, unlike most other widgets&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;B&gt;Filtering Select &amp; Combo box&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Neither of these work properly with Domino.  The reason is that Domino (prior to version 8.5) does not generate valid HTML for a &amp;lt;Select&amp;gt; element - it does not close the &amp;lt;Option&amp;gt; tag with &amp;lt;/Option&amp;gt;.  &lt;br /&gt;&lt;br /&gt;The Combobox will work in IE, but not Firefox.  I&#39;m not sure about other browsers.  The Filtering Select will work in IE if you add an alias to your picklist (so that Domino generates a value property for the &amp;lt;Option&amp;gt; tag.  I am working with IE on an intranet for my current project, so I don&#39;t need to worry about the other browsers for now.  For filtering selects that don&#39;t &lt;i&gt;need&lt;/i&gt; an alias I have modified the formula to be something like:&lt;pre&gt;list:=&quot;&quot;:@DbColumn(....)&lt;br /&gt;list + &quot;|&quot; + list&lt;/pre&gt;That way I get the alias, IE is happy and the dijit works, and I get the label returned in my field.  If you need to (and are braver than me), you can apparantly modify the dojo files to handle the bad HTML.  The &lt;a href=&quot;http://dojomino.com/dojomino/blog.nsf/d6plinks/DBOS-7BEMA7&quot;&gt;Dojomino&lt;/a&gt; blog explains how.  This is a good reference site, but currently a bit out of date.  They have announced that they are releasing an update but it hasn&#39;t been posted yet.&lt;br /&gt;&lt;br /&gt;All of the dijits include the ability to validate the field.  Field prompts are styled as a small tool-tip to the right of the field, error messages are displayed as the user leaves the field, and dijits such as the date and time text boxes handle all the heavy lifting around validating the content.  However this is UI level validation only, and does not prevent the form from being submitted with incorrect values.&lt;br /&gt;&lt;br /&gt;My next challenges:&lt;ol&gt;&lt;li&gt;Modifying the options of combo box 2 when the user makes a selection from combo box 1 and &lt;/li&gt;&lt;li&gt;Form level validation&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Stay tuned ..</description><link>http://michelles-universe.blogspot.com/2008/11/discovering-dojo-for-domino-part-3.html</link><author>noreply@blogger.com (Michelle)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-2585940292646287021</guid><pubDate>Sat, 15 Nov 2008 04:18:00 +0000</pubDate><atom:updated>2008-11-15T16:23:14.448+11:00</atom:updated><title>Discovering Dojo for Domino: Part 2- Runing Dojo on Domino 8.5</title><description>Part one of my adventures in dojo can be found &lt;a href=&quot;http://michelles-universe.blogspot.com/2008/11/discovering-dojo-for-domino-part-1.html&quot;&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Next, I tried to run this on my 8.5 Beta 1 Domino server at home.&lt;br /&gt;&lt;br /&gt;First problem: the dojo files are not installed under the /html folder but in a new folder in the file structure /js.  I could not load the javascript file at all.  After searching through the N&amp;D 8.5 Beta forum I found that you can reference this folder using /domjs.&lt;br /&gt;&lt;br /&gt;So my HTML Head Content was changed to &lt;pre&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; &lt;br /&gt;&amp;nbsp;src=&amp;quot;/domjs/dojo-1.1.0/dojo/dojo.js&amp;quot; &lt;br /&gt;&amp;nbsp;djConfig=&amp;quot;parseOnLoad:true, isDebug:true&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&amp;quot;&lt;/pre&gt;&lt;br /&gt;And, of course, the files shipped with Beta 1 are dojo 1.1.0.  Fortunately the Dojo Quick Start Guide also links to the earlier version (not that I could spot any differences!)&lt;br /&gt;&lt;br /&gt;Everything worked OK until I tried to run the example which retrieves text as json. I kept getting a 404 - file not found error. Rather than wasting time trying to find the typo in the file path I created a simple test agent which output the example json text, because agents and views (using ?ReadViewEntries) are the two most common ways of generating json in Domino.&lt;br /&gt;&lt;br /&gt;The only thing I had to do was find out the appropriate mime type for the output. I initially used text/html and everything worked.  Firebug helpfully displayed the following message:&lt;br /&gt;&lt;blockquote&gt;Consider using mimetype:text/json-comment-filtered to avoid&lt;br /&gt;potential security issues with JSON endpoints &lt;br /&gt;(use djConfig.usePlainJson=true to turn off this message)&lt;/blockquote&gt;&lt;br /&gt;So I modified the HTML head content again, removing the debug parameter and replacing it with the suggested json parameter:&lt;br /&gt;&lt;pre&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; &lt;br /&gt;&amp;nbsp;src=&amp;quot;/domjs/dojo-1.1.0/dojo/dojo.js&amp;quot; &lt;br /&gt;&amp;nbsp;djConfig=&amp;quot;parseOnLoad:true, usePlainJson:true&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&amp;quot;&lt;/pre&gt;&lt;br /&gt;and set the content type.  My agent is simply:&lt;br /&gt;&lt;pre&gt;Sub Initialize&lt;br /&gt; &lt;br /&gt; Print &quot;Content-type: text/html&quot;&lt;br /&gt; Print |&lt;br /&gt;    {&lt;br /&gt; foo: &quot;bar&quot;,&lt;br /&gt; name: &quot;SitePen&quot;,&lt;br /&gt; aFunction: function(){&lt;br /&gt;  alert(&quot;internal function run&quot;);     &lt;br /&gt; },&lt;br /&gt; nested: {&lt;br /&gt;     sub: &quot;element&quot;,&lt;br /&gt;     another: &quot;subelement&quot;&lt;br /&gt; }&lt;br /&gt;    }&lt;br /&gt;|&lt;br /&gt;End Sub&lt;/pre&gt;&lt;br /&gt;Sweet!&lt;br /&gt;&lt;br /&gt;Next - on to digits</description><link>http://michelles-universe.blogspot.com/2008/11/discovering-dojo-for-domino-part-2.html</link><author>noreply@blogger.com (Michelle)</author><thr:total>5</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-889449139757815749</guid><pubDate>Thu, 13 Nov 2008 07:31:00 +0000</pubDate><atom:updated>2008-11-15T14:37:15.523+11:00</atom:updated><title>Discovering Dojo for Domino: Part 1- The basics</title><description>&lt;h4&gt;My journey in learning to use Dojo with Notes and Domino web enabled applications.&lt;/h4&gt;&lt;br /&gt;I have recently taken over supporting some Domino applications that use &lt;a href=&quot;http://dojotoolkit.org/&quot;&gt;dojo&lt;/a&gt;, so I thought I had better learn a thing or two about it.  I have never used any of the javascript frameworks, and my javascript knowledge is patchy.  It&#39;s all been learned through &#39;copy and paste&#39; from other peoples work and the web.  Some things I think I know pretty well but there are gaps.&lt;br /&gt;&lt;br /&gt;I&#39;m going to write up my experiences as I go.  So this is not a structured tutorial and may lead off down the wrong path at times.  Feel free to comment on better approaches if you see me doing something wrong.&lt;br /&gt;&lt;br /&gt;So - where to start?  The best place I found is the &lt;a href=&quot;http://sitepen.com/labs/guides/?guide=DojoQuickStart&quot;&gt;Dojo Quick Start Guide&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now I don&#39;t just want to learn dojo, I want to learn dojo for use with Domino.  And if your are a Notes / Domino developer you know that some things work just like in the web examples and some things don&#39;t.&lt;br /&gt;&lt;br /&gt;The first challenge is always, where to put the various code snippets that are shown in the examples.  I started by creating a form and a javascript script library to go with it.  I am going to have a &#39;dojo template&#39; form with the basics in it, and a template javascript library.  Each time I need a new form, I will copy the templates and start from there. In this post I&#39;ll describe how to get to the basic &#39;yeah it works&#39; stage.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;The basics:  Getting the code&lt;/h4&gt;&lt;br /&gt;Well I haven&#39;t actually done this myself.  The environment I am working in has the dojo scripts on the server already (Domino 7.x).  You can download the &lt;a href=&quot;http://dojotoolkit.org/downloads&quot;&gt;source files&lt;/a&gt; and place them on your server, you can put them in your database as a file resource, or you can reference them directly from a &lt;a href=&quot;http://en.wikipedia.org/wiki/Content_Delivery_Network&quot;&gt;CDN&lt;/a&gt; - instructions on the download page.&lt;br /&gt;&lt;br /&gt;Dojo comes in three parts -&lt;br /&gt;&lt;ul&gt;&lt;li&gt;core:  the basics. Event handlers, DOM manipulation, graphics effects&lt;/li&gt;&lt;li&gt;digit: &#39;Great interface widgits&#39;.  This is what I am really after&lt;/li&gt;&lt;li&gt;dojoX: complex widgits, graphing and charting&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I&#39;ll deal with the core first, then move on to digits.  I probably won&#39;t get to dojoX&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;How to add dojo to Domino&lt;/h4&gt;&lt;br /&gt;The Quick Start guide has some simple HTML and scripts you can then play with.  I put the example HTML on the form and marked it up as Pass-thru HTML.  I could have left the script directly on the page as well.  However the point of this excercise is to learn how to use dojo with Domino so I put some of the code in the in a script library and some in the Javascipt Header section of the form.&lt;br /&gt;&lt;br /&gt;The following is included on the tutorial first page:&lt;br /&gt;&lt;blockquote&gt;It&#39;s important to note that you should not set on an onLoad function directly on the  tag when using Dojo. dojo.addOnLoad(someFunc) is prefered over  and window.onload = someFunc;&lt;/blockquote&gt; and provides examples such as the following:&lt;br /&gt;&lt;pre&gt;dojo.require(&quot;dijit.form.Button&quot;);&lt;br /&gt;dojo.require(&quot;dijit.TitlePane&quot;);&lt;br /&gt;dojo.addOnLoad(function(){&lt;br /&gt;  dojo.byId(&quot;testHeading&quot;).innerHTML = &quot;We&#39;re on our way!&quot;;&lt;br /&gt;  console.log(&quot;onLoad fires after require() is done&quot;);&lt;br /&gt;});  &lt;/pre&gt;&lt;br /&gt;I put the dojo &lt;i&gt;require()&lt;/i&gt; and &lt;i&gt;addOnLoad()&lt;/i&gt; functions in the js header (passing a funtion name &lt;i&gt;init()&lt;/i&gt; to the addOnLoad function), created an init() function in my scipt libary and put any example code in the &lt;i&gt;init()&lt;/i&gt; function.  I also created a style sheet and embedded it on the form for the simple styles used in the examples.&lt;br /&gt;&lt;br /&gt;So the break-up went like this:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;HTML Head Content&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;script type=&quot;text/javascript&quot; src=&quot;[relatve file path]/dojo.js&quot;&lt;br&gt; djConfig=&quot;parseOnLoad:true, isDebug:true&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;JS Header&lt;/b&gt;&lt;br /&gt;[Resource: &quot;libJSMyTestForm&quot;]&lt;br /&gt;&lt;pre&gt;dojo.require(&quot;dijit.form.Button&quot;);&lt;br /&gt;  dojo.require(&quot;dijit.TitlePane&quot;);&lt;br /&gt;  dojo.addOnLoad(init)&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Script library libJSMyTestForm&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;function init() {&lt;br /&gt;  dojo.byId(&quot;testHeading&quot;).innerHTML = &quot;We&#39;re on our way!&quot;;&lt;br /&gt;  console.log(&quot;onLoad fires after require() is done&quot;);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;I added the HTML to the form, style to my style sheet, opened the form in a browser &lt;i&gt;et voila&lt;/i&gt; - working dojo!&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Moving on..  just a little&lt;/h4&gt;&lt;br /&gt;I was able to work through the tutorial fairly easily.  It quickly demonstrates getting parts of the DOM and modifying them (throwing in a fade-out here and a slide-left there as well as the standards of replacing innerHTML and classes).  It moves through basic event handling (registering an onClick function for a single element and using &lt;i&gt;dojo.connect&lt;/i&gt; to register the event for multiple elements) to animation effects (slides, fades, etc) and the events that these animations themselves have.  For example animations have &lt;i&gt;beforeBegin&lt;/i&gt; and &lt;onend&gt; events, allowing you to easily chain animations.&lt;br /&gt;&lt;br /&gt;The tutorial then covers basic Ajax - fetching text, posting a form, and fetching json.  By the end of an hour or two, you are flying like a pro:  dynamically changing your form, adding animations, playing with event handlers and Ajax.&lt;br /&gt;&lt;br /&gt;But this is where my javascript knowledge starts to hit it&#39;s boundaries.  The examples are full of code like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;var init = function(){&lt;br /&gt;  var contentNode = dojo.byId(&quot;content&quot;);&lt;br /&gt;  dojo.xhrGet({&lt;br /&gt;    url: &quot;js/sample.txt&quot;,&lt;br /&gt;    handleAs: &quot;text&quot;,&lt;br /&gt;    load: function(data,args){&lt;br /&gt;      // fade out the node we&#39;re modifying&lt;br /&gt;      dojo.fadeOut({&lt;br /&gt;        node: contentNode,&lt;br /&gt;        onEnd: function(){&lt;br /&gt;   // set the data, fade it back in&lt;br /&gt;   contentNode.innerHTML = data;&lt;br /&gt;   dojo.fadeIn({node: contentNode}).play();  &lt;br /&gt;  }&lt;br /&gt;      }).play();&lt;br /&gt;    },&lt;br /&gt;    // if any error occurs, it goes here:&lt;br /&gt;    error: function(error,args){&lt;br /&gt;      console.warn(&quot;error!&quot;,error);&lt;br /&gt;    }&lt;br /&gt;  });&lt;br /&gt;};&lt;br /&gt;dojo.addOnLoad(init);&lt;/pre&gt;&lt;br /&gt;Now I know there are different ways of declaring functions - using the FUNCTION statement, assigning a function to a variable and using the &lt;i&gt;new function()&lt;/i&gt; constructor, and in-line as shown above.&lt;br /&gt;&lt;br /&gt;But why?  And where do you use one instead of the other?  What is the scope of in-line functions like those above?  What if I want to use an existing function in one of my script libraries? simply adding the function name followed by () did not seem to work.  Why? &lt;br /&gt;&lt;br /&gt;So now I think I have to divert from my journey to dojo enlightenment and seek a side-road through Advanced Javascript.&lt;br /&gt;&lt;br /&gt;Can anyone recommend a good reference?&lt;br /&gt;&lt;br /&gt;UPDATE:  fixed the HTML Head Content - I had closed off my &amp;lt;Script&amp;gt; tag in the wrong place.  Sorry for anyone who tried to copy it earlier (note to self: do not manually type code from memory.  Always copy and paste working code!)</description><link>http://michelles-universe.blogspot.com/2008/11/discovering-dojo-for-domino-part-1.html</link><author>noreply@blogger.com (Michelle)</author><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-6866170220050155661</guid><pubDate>Mon, 03 Nov 2008 08:44:00 +0000</pubDate><atom:updated>2008-11-15T03:29:16.495+11:00</atom:updated><title>A New Job - and how to debug javascript in IE</title><description>I&#39;ve been very quiet, because I haven&#39;t spent much time on-line in the last month.&lt;br /&gt;&lt;br /&gt;It&#39;s not so much that I haven&#39;t been using a computer but a new job has meant some other priorities in the initial few weeks.&lt;br /&gt;&lt;br /&gt;My new job is in many ways similar to my last one - Notes &amp; Domino development.  However my new job involves no admin or support work.  While I didn&#39;t mind the admin work which was strategic - involvement in upgrade or roll-out planning, etc, I don&#39;t miss the day-to-day fixing mail routing / reviewing DDM alerts etc.&lt;br /&gt;&lt;br /&gt;Other big advantages of my new job:&lt;br /&gt;1) It&#39;s closer to home, so travel time is 1/2 hr to 1 hr less per day&lt;br /&gt;2) The standard work day is shorter (7.5 hrs instead of 8 ) and &lt;br /&gt;3) I now catch public transport to work so my husband has taken over the school / kindergarten drop-off and pick-up duties.&lt;br /&gt;&lt;br /&gt;All this has meant more time for the family, and less stress on me.  &lt;br /&gt;&lt;br /&gt;My previous employer was strictly a Notes / Domino shop.  The new employer is a larger professional services company, of which the IT consulting group is about 20, with a Notes &amp; Domino team of 2.&lt;br /&gt;&lt;br /&gt;Technically, my first challenge with the new job was learning how to drive Outlook.  Yes, I have gone over to the dark side.  At first, I found it shiny and new, and liked it a lot.  It was quick.  In Notes, I was nearly always running with the latest beta version, and my last laptop had exceeded the &#39;you have tweaked too much please re-build me now&#39; stage that Windows XP seems to reach every 2 years or so.  On a shiny new laptop with nothing else installed Outlook flies by comparison.  And I like changing the color of my calendar entries, little things like that.&lt;br /&gt;&lt;br /&gt;But I really miss my conversation threads.  And Sametime.  My new employer has no live chat services or similar services at all.  And I don&#39;t like the way you have to turn off the reading pane on *every* folder individually.  And the search is pretty ordinary - I don&#39;t think attachments are indexed, but I&#39;m not sure.&lt;br /&gt;&lt;br /&gt;Actually I miss Notes 8 altogether.  The projects I have worked on so far have been general Notes client work for a customer with version 7 and changes to a web app for a customer with 6.5.  &lt;br /&gt;&lt;br /&gt;What is good is that the company has a strong .Net team and I&#39;m hoping for a little cross-polination:  sharing of javascript tools and libraries, standard approaches to UI, things like that.&lt;br /&gt;&lt;br /&gt;Latest technical tip:  I finally found out how to debug properly in IE.  I usually build and debug in Firefox with Firebug, but the web app I was built for IE only, and some of the code was working fine in FF but not IE.  So after much searching I found &lt;a href=&quot;http://www.berniecode.com/blog/2007/03/08/how-to-debug-javascript-with-visual-web-developer-express/&quot;&gt;this page&lt;/a&gt; which explains how to use Visual Web Developer Express (free version) to connect to IE.  It&#39;s a pretty awesome debugger.  One thing I did find using VWD with Domino is it doesn&#39;t automatically recognise javascript libraries referenced from the jsheader on Notes forms.  All you need to do to make it work is add a foward slashes and a script tag at the top of your script library and it then works a charm.&lt;br /&gt;  &lt;pre&gt;//&amp;lt;script&amp;gt;&lt;/pre&gt;</description><link>http://michelles-universe.blogspot.com/2008/11/new-job-and-how-to-debug-javascript-in.html</link><author>noreply@blogger.com (Michelle)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-7963022461275151698</guid><pubDate>Mon, 15 Sep 2008 14:27:00 +0000</pubDate><atom:updated>2008-09-16T00:52:10.299+10:00</atom:updated><title>Shared Actions and Refresh Design</title><description>I had an interesting issue with Shared Actions in Notes Views today.&lt;br /&gt;&lt;br /&gt;I had built a new application (or more accurately a group of features) for a customer, but due to the customer&#39;s requirements I had to retro-fit my new code into and existing .NSF.  The existing code was to be retained, with a front page for the user&#39;s to choose the new features or the existing features (not my choice in implementation, but beyond my control).&lt;br /&gt;&lt;br /&gt;The existing application had over 300 views.  It was not part of my brief to do anything about this.  A template was delivered to the customer with the combinded code.  After testing and implementation the customer discovered that a small sub-set of the old views had the wrong action buttons.&lt;br /&gt;&lt;br /&gt;The customer sent me back a copy of the database, taken from the production database.  What appeared to have happened was this:&lt;br /&gt;&lt;br /&gt;Before the new template was applied:&lt;br /&gt;&lt;br /&gt;Shared Actions (as they appeared in the Actions list)&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Action A&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Action B&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Action C&lt;br /&gt;&lt;br /&gt;View Actions&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Action A (shared action)&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Action B (shared action)&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Action D (standard action)&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Action E (standard action(&lt;br /&gt;&lt;br /&gt;After the changes were applied (the database was set to inherit from the new template, and &#39;Refresh Design&#39; was used to update the database)&lt;br /&gt;&lt;br /&gt;Shared Actions (as they appear in the list&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Action 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Action 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Action 3&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Action A&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Action B&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Action C&lt;br /&gt;&lt;br /&gt;View Actions&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Action 1 (shared action)&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Action 2 (shared action)&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Action D (standard action)&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Action E (standard action(&lt;br /&gt;&lt;br /&gt;So what seems to have happened is that the view points to the action&#39;s offset in the shared actions list, not the action name or some unique identifier.&lt;br /&gt;&lt;br /&gt;A further complication was that fixing the views in the template then refreshing the design did NOT fix the production database.&lt;br /&gt;&lt;br /&gt;The only solution was to fix the views in the template, then delete the views from the production database then copy and paste them back in directly from the template.&lt;br /&gt;&lt;br /&gt;I am not at all comfortable about a solution that involves directly modifying the production database.  I also have no idea why this only affected a small group of views, other than these were the only ones that used the shared action that was previously the first action in the list.</description><link>http://michelles-universe.blogspot.com/2008/09/shared-actions-and-refresh-design.html</link><author>noreply@blogger.com (Michelle)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-3657100716069730540</guid><pubDate>Thu, 04 Sep 2008 12:01:00 +0000</pubDate><atom:updated>2008-09-04T22:21:51.506+10:00</atom:updated><title>Syncing the iPod Touch calendar</title><description>I have an iPod Touch.  I was given this as a Christmas present, and at first I wasn&#39;t sure how much I would use it as I am not a big music fan.  I quickly found myself addicted though - by the apps, video for the kids to watch while travelling, etc.  I still don&#39;t like iTunes very much, and jail-broke the iPod after about 3 months.&lt;br /&gt;&lt;br /&gt;I use Lotus Notes at work and have a Blackberry, and the company runs a BES for Domino.  For the last two years I have just taken full sync for granted.  I have to say I don&#39;t miss the old days of connecting pda / phone to the pc, syncing with the pc, pushing to the server &amp; missing updates to my calendar made by my manager between cycles.  The Blackberry has been a fantastic solution for that.&lt;br /&gt;&lt;br /&gt;However I use Google for personal mail and calendar.  I have been able to sync the mail app on the iPod with Google via WiFi from the start but have not used the Calendar because I couldn&#39;t work out how to get the data transferred.  iTunes only supports syncing the calendar with Outlook on a PC or iCal on the Mac.  I don&#39;t use either of these.&lt;br /&gt;&lt;br /&gt;So today I installed NemusSync on my iPod touch. &lt;a href=&quot;http://www.nemustech.com/iPhone/NemusSync.html&quot;&gt;link&lt;/a&gt;.  This is a third-party app (available through Cydia and Installer.app) which allows you to sync your iPod / iPhone calendar directly with your Google Calendar without the need to pull the data down to your desktop.&lt;br /&gt;&lt;br /&gt;I had trouble at first.  I downloaded the app and set up the Google calendar details.  I hit the sync button and went to my calendar - the calendar opened for a few seconds then closed.  And again.  And Again.&lt;br /&gt;&lt;br /&gt;I went back into the NemusSync settings and cleared all the data from the calendar (no loss, I had not entered anything there).  Back into the calendar app - same result&lt;br /&gt;&lt;br /&gt;Then I cleared all data from NemusSync.  The calendar app would then work correctly.&lt;br /&gt;&lt;br /&gt;I searched but could not find any reason for this.&lt;br /&gt;&lt;br /&gt;So I went back into Nemussync and tried again.  This time, I made only one change at a time then tested the Calendar app.  I set up the link to the calendar.  Tested OK.  Set up import only.  Tested OK.  Synced both ways.  Tested OK.  Set up default calendar.  Tested OK.&lt;br /&gt;&lt;br /&gt;So now it is up and running well.  Full bi-directional sync.  I haven&#39;t tried repeating appointments, or meetings with invitations but for my personal calendar I don&#39;t need those.  &lt;br /&gt;&lt;br /&gt;A nice little utility</description><link>http://michelles-universe.blogspot.com/2008/09/syncing-ipod-touch-calendar.html</link><author>noreply@blogger.com (Michelle)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-7436903249439945706</guid><pubDate>Thu, 04 Sep 2008 11:40:00 +0000</pubDate><atom:updated>2008-09-04T22:01:08.104+10:00</atom:updated><title>A new job is in the wind</title><description>I have found a new job.&lt;br /&gt;&lt;br /&gt;I have been casually looking for a new job for a couple of months now.  I have been in my current job for nearly 10 years, and my employers are wonderful people, but I am finding that the amount of travel and the hours involved are just getting too much for me.&lt;br /&gt;&lt;br /&gt;I live in Melbourne, Australia, quite close to the CBD and have been driving out to the suburbs for work for many years.  And almost all our customers are waaaaaaaay out.&lt;br /&gt;&lt;br /&gt;My new job is in town - just 15 minutes from home by public transport.  It means that my husband will also have to do all the morning drop-off, but as he is semi-retired now this should work out OK.  The work day is slightly shorter - 7.5 hrs instead of 8.  So all up I will gain at least an hour a day.  This may not sound like much but to a busy working mum it currently sound like luxury.&lt;br /&gt;&lt;br /&gt;In addition, my current role has recently involved a much higher proportion of admin support work than ever in the past.  The job used to be about 90/10 between dev and admin but has recently been more like 60/40.  And the admin work has been support / fix type work rather than infrastructure / planning / upgrade projects.  And a lot of the development has been just building something that someone else has spec&#39;ed.&lt;br /&gt;&lt;br /&gt;In contrast the new job is all development.  I will also be in control of my projects from start to finish - requirements, through to implementation.  It is with a very small consulting arm of a mid-sized accounting firm so I will be interested to find out how much interaction my group has with the larger organisation.&lt;br /&gt;&lt;br /&gt;Now the hard part is working out my notice for the current employer.  I am so ready to move on</description><link>http://michelles-universe.blogspot.com/2008/09/new-job-is-in-wind.html</link><author>noreply@blogger.com (Michelle)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-6253981763290020048</guid><pubDate>Sat, 23 Aug 2008 14:31:00 +0000</pubDate><atom:updated>2008-08-24T01:53:04.643+10:00</atom:updated><title>Playing with Domino 8.5 server</title><description>So, a lazy Saturday night in front of the TV, watching the Olympics.  What is a geek girl to do?  Why set up and test a new server of course.&lt;br /&gt;&lt;br /&gt;I&#39;ve been wanting to have a play with X-pages, so tonight I installed a Domino 8.5 server on my laptop.  I had previously had an 8.0.1 server installed for some application testing I did a couple of months ago, so this was an upgrade rather than a full install.&lt;br /&gt;&lt;br /&gt;I am running Windows XP and installed the server directly onto the laptop.  I know I should find out how to use VMWare and set that up, but I really don&#39;t have the time.  Also, as I just want to play a bit, not really test out the server it seems too much effort at the moment.  &lt;br /&gt;&lt;br /&gt;The install went well (although it took an inordinate amount of time I thought).  I did have some trouble getting the HTTP server to load (could not open port 80).  I found I had to disable my AV software temporarily to get the HTTP server to load.  Restarted AV &amp; it all ran happily together.&lt;br /&gt;&lt;br /&gt;Although I did this to play with X-Pages, I got distracted by the new iNotes.  It looks good, seems pretty fast, and a big improvement.  My company is still running 7.0.3 on our edge-facing web server (it is Red-Hat and needs an OS upgrade to go to 8).  So then of course I had to check out the iNotes interface on my iPod touch.&lt;br /&gt;&lt;br /&gt;After fighting with Windows for some time, I managed to get the iPod to connect wirelessly to my PC, and connect to my Domino server.  I think the new interface is nice.  Only mail is implemented for now (no calendar or contacts), but I did test attachments - Word, Excel and PDF files all load and display well. I know this is a feature of Safari, not iNotes but it does mean iNotes Ultralight will be a viable means of accessing corporate data.  If your CEO has an iPhone, does it really matter if access is on-line or stored on the device?  Will he even know the difference?&lt;br /&gt;&lt;br /&gt;Just watched the final of the Women&#39;s basketball.  USA defeated Australia (again).  I thought maybe this time the Opals would succeed.  Silver is still good.</description><link>http://michelles-universe.blogspot.com/2008/08/playing-with-domino-85-server.html</link><author>noreply@blogger.com (Michelle)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-1044907728308471652</guid><pubDate>Wed, 06 Aug 2008 23:24:00 +0000</pubDate><atom:updated>2008-08-07T09:25:28.397+10:00</atom:updated><title>Not sure if this means anything - my Blog requires high-school reading level</title><description>&lt;a href=&quot;http://www.criticsrant.com/bb/reading_level.aspx&quot;&gt;&lt;img style=&quot;border: none;&quot; src=&quot;http://www.criticsrant.com/bb/readinglevel/img/high_school.jpg&quot; alt=&quot;blog readability test&quot; /&gt;&lt;/a&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://www.criticsrant.com&quot;&gt;TV Reviews&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;</description><link>http://michelles-universe.blogspot.com/2008/08/not-sure-if-this-means-anything-my-blog.html</link><author>noreply@blogger.com (Michelle)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-9214472059782387089</guid><pubDate>Sun, 03 Aug 2008 10:46:00 +0000</pubDate><atom:updated>2008-08-03T21:05:07.844+10:00</atom:updated><title>Reactivating this blog</title><description>So..&lt;br /&gt;&lt;br /&gt;Originally I started this blog just to put up a summary of our trip for family and friends. &lt;br /&gt;&lt;br /&gt;I&#39;ve decided to try and make it an on-going thing.&lt;br /&gt;&lt;br /&gt;I am a Lotus Notes developer and admin, so some of the content may be technical, some will be personal, and some just random stuff.&lt;br /&gt;&lt;br /&gt;Today was a very mixed day for me.  I played in a tennis tournament, did very well (made the semi-finals).  But it was also a hellish day as this morning someone vandalized my car in the street: brick-shaped dents in the bonnet, multiple cracks in the windscreen.  All day on the phone trying to arrange repairs.&lt;br /&gt;&lt;br /&gt;On the sort-of technical front, I joined &lt;a href=&quot;http://dominoyesmaybe.blogspot.com/2008/08/chronicles-of-gonad-begining.html&quot;&gt;GONAD&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0Z-MKx-Magi63JJsl7I2pKPhKHTjXIiA_-R42ktLcCl4nXCI6G6-TjPbvf2EYxNYllmxD9EOYKJYMF_QyVZSUU_farTFLVQ6Szp5cEUjFVi5oxFtXirv_9x-EzdDdiIj7npwIkn0euzkW/s1600-h/SP32-20080803-205727.gif&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0Z-MKx-Magi63JJsl7I2pKPhKHTjXIiA_-R42ktLcCl4nXCI6G6-TjPbvf2EYxNYllmxD9EOYKJYMF_QyVZSUU_farTFLVQ6Szp5cEUjFVi5oxFtXirv_9x-EzdDdiIj7npwIkn0euzkW/s400/SP32-20080803-205727.gif&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5230245474961015042&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When I received the email from Rob, with phrases like &#39;Greetings Sister&#39;, gmail chose the following adds:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So now Google thinks I&#39;m a mason.  Am I paranoid, or do we trust Google with way to much personal information about us and our web habits?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUTyZactvXxodH18bBum1buTMOVwWT0-CLpBhfpD7a3fN5JvVR5oFWklz21KqARaxjNr3KtG2oBMT0wEnnY7Yv1_rwhKkyXZ2niMIpTKD9FVQg916JNBC3p6ab_zVGw3rOpzFr9bfs-feN/s1600-h/SP32-20080803-205134.gif&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUTyZactvXxodH18bBum1buTMOVwWT0-CLpBhfpD7a3fN5JvVR5oFWklz21KqARaxjNr3KtG2oBMT0wEnnY7Yv1_rwhKkyXZ2niMIpTKD9FVQg916JNBC3p6ab_zVGw3rOpzFr9bfs-feN/s400/SP32-20080803-205134.gif&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5230245478243379746&quot; /&gt;&lt;/a&gt;</description><link>http://michelles-universe.blogspot.com/2008/08/reactivating-this-blog.html</link><author>noreply@blogger.com (Michelle)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0Z-MKx-Magi63JJsl7I2pKPhKHTjXIiA_-R42ktLcCl4nXCI6G6-TjPbvf2EYxNYllmxD9EOYKJYMF_QyVZSUU_farTFLVQ6Szp5cEUjFVi5oxFtXirv_9x-EzdDdiIj7npwIkn0euzkW/s72-c/SP32-20080803-205727.gif" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-3703973899321398836</guid><pubDate>Fri, 18 Jan 2008 00:25:00 +0000</pubDate><atom:updated>2008-01-19T17:50:48.351+11:00</atom:updated><title>Trip Summary</title><description>&lt;span style=&quot;font-size:85%;font-family:arial;&quot;&gt;&lt;br /&gt;A brief description of our trip can be found in the first post on this blog, &lt;a href=&quot;http://michelles-universe.blogspot.com/2008/01/my-recent-trip-to-china-summary.html&quot;&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On the whole, this trip was fun.  It was challenging to travel in China with no ability to speak Chinese, and to arrange our hotels and transport as we went.  However for the kids, I would could in future break the trip up a little more with additional day activities that allowed for running and climbing.&lt;br /&gt;&lt;br /&gt;The scenery in China everywhere we went was spectacular, and although I found almost all of China grimy, with thick, grey air and dust everywhere, it was much cleaner than on our last trip 14 years ago.  There is very little rubbish in the streets, and most of the public toilets we used were clean.  The Chinese do not seem to seem to care about clearing away rubble from building sites and there is so much demolition and re-building going on that this also contributes to the feeling of chaos.&lt;br /&gt;&lt;br /&gt;We ate in the streets often, and only experienced a couple of mild doses of upset tummies.  General hygiene practices do seem to have improved.&lt;br /&gt;&lt;br /&gt;There were far fewer police and army evident as we traveled around than I remember from last time.&lt;br /&gt;&lt;br /&gt;The people were mostly friendly:  a &#39;thank you&#39; in Chinese makes them happy you have tried their language.  Prices are almost always written or entered onto a calculator.  If you look lost, someone with a little English will often volunteer to help but you do need to be prepared to get by by pantomiming, jesturing, and pointing to phrases in a book.&lt;br /&gt;&lt;br /&gt;Tom was fussed over everywhere.  If the Chinese thought he was under-dressed for the weather they scolded him and me.  They patted his head and gave him food and pinched his cheek.  If he said hello or thank you in Chinese they laughed delightedly.  In general he took everything in his stride.  He happily raced off through crowds without fear and did not treat anything or anywhere as strange or unusual.&lt;br /&gt;&lt;br /&gt;I think Jack appreciated the trip but was disappointed we didn&#39;t manage to pick up many cheap games for him.  He is old enough to appreciate travel in a foreign country, spectacular scenery and new experiences, but young enough to get bored by the constant travel and lack of play time. He is turning out to have an exceptional sense of direction, and whenever we stopped to get our bearings he was always right about which way we should head.&lt;br /&gt;&lt;br /&gt;The next trip - I would just like to add a few &#39;wind-down&#39; days at the end, and maybe a couple in the middle.  We were on the go so much that one day blurred into the next after a while (part of the reason I started this diary).&lt;br /&gt;&lt;br /&gt;I&#39;ve now uploaded my photos to Facebook:  http://www.facebook.com/album.php?aid=12575&amp;id=703192551&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;</description><link>http://michelles-universe.blogspot.com/2008/01/trip-summary.html</link><author>noreply@blogger.com (Michelle)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5544768027628635238.post-3675725363162311933</guid><pubDate>Fri, 18 Jan 2008 00:12:00 +0000</pubDate><atom:updated>2008-01-18T11:23:05.613+11:00</atom:updated><title>Trip Day 22 - Home</title><description>&lt;span style=&quot;font-size:85%;font-family:arial;&quot;&gt;Early start at 5:45 and off to the airport.  &lt;br /&gt;&lt;br /&gt;The free shuttle to the airport express picked up from our hotel so we got on that, rather than struggle with our bags to the MTR. Cathay has baggage check-in at Kowloon Station which makes things easy, especially as we had arrived with 2 pieces of check-in luggage but were leaving with 4, plus our carry on bags.&lt;br /&gt;&lt;br /&gt;With plenty to of time to spare we ate a leisurely breakfast and boarded the plane.  As this flight is during the day, it was far less stressful than the overnight flight at the start of the trip.  The kids behaved well, and we got back into Melbourne around 9:30 pm.&lt;br /&gt;&lt;br /&gt;By the time we got through immigration, baggagge collection, customs and quarantine is was nearly eleven.  John went to pick up the car from the long-term carpark while I waited with the kids in the airport.  It only cost us $99 for the three weeks which was surprising.  This was no more costly than a taxi, and we probably would not have fitted all our luggage in for the return journey.&lt;br /&gt;&lt;/span&gt;</description><link>http://michelles-universe.blogspot.com/2008/01/trip-day-22.html</link><author>noreply@blogger.com (Michelle)</author><thr:total>0</thr:total></item></channel></rss>

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid RSS" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

http://www.feedvalidator.org/check.cgi?url=http%3A//michelles-universe.blogspot.com/feeds/posts/default%3Falt%3Drss

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda