<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-29226276</id><updated>2011-04-22T03:04:18.425+02:00</updated><title type='text'>Domino &amp; Web 2.0</title><subtitle type='html'>Intégration de solutions Web 2.0 dans les applications Lotus Notes/Domino.&lt;br/&gt;
&lt;a href="http://webdomino.blogspot.com"&gt;&lt;img src="http://photos1.blogger.com/blogger2/6158/133075702830881/400/gb.gif" border="0" alt="english version" /&gt; English version&lt;/a&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>41</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-29226276.post-8017584677971754193</id><published>2007-04-12T13:09:00.000+02:00</published><updated>2008-11-13T04:58:24.823+01:00</updated><title type='text'>ASTUCE - Avertissement avant de quitter une page Web</title><content type='html'>Il arrive souvent qu'un utilisateur, porté par la fougue de la navigation, clique sur un lien alors qu'il est en train de rédiger un formulaire qu'il n'a pas encore enregistré. Il doit alors tout refaire et se retrouve aigri.&lt;br /&gt;&lt;br /&gt;Sous Lotus Notes, lorsque l'on ferme un formulaire, le client lourd a la prévenance d'avertir l'utilisateur qu'il devrait enregistrer ses données avant de quitter. Il est en fait assez simple de faire la même chose sur le Web.&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;" src="http://2.bp.blogspot.com/_yi4tWEd8Ewk/Rh4aGmHHu7I/AAAAAAAAAB0/Gwh9d3Z5MFs/s400/avertissement.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5052504532568226738" /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#cc6600;"&gt;Détection d'une modification sur le formulaire&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;Avant de l'avertir, mieux vaut vérifier que celà en vaut vraiment la peine. Un moyen simple est de se baser sur un champ qui sera modifié dès qu'un des champs a été modifié en se basant sur l'évènement onChange. Ce champ de controle n'a pas à être visible pour l'utilisateur on peut donc le déclarer en type "hidden" soit :&lt;br /&gt;&lt;pre class="code"&gt;&lt;code&gt;&amp;lt;input type="hidden" name="isChanged" id="isChanged" value="0"&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pour modifier la valeur du champ, on utilisera une fonction Javascript qui pourra être déclarée dans une librairie ou tout simplement dans "l'entête JS" du masque.&lt;br /&gt;Cette fonction pourra être de la forme :&lt;pre class="code"&gt;&lt;code&gt;function formChange(){&lt;br /&gt;  document.forms[0].isChanged.value="1";&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;On peut alors appeler la fonction dans l'évènement onChange de chaque champ que l'on souhaite controler en ajoutant :&lt;pre class="code"&gt;&lt;code&gt;formChange()&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;" src="http://1.bp.blogspot.com/_yi4tWEd8Ewk/Rh4aUWHHu8I/AAAAAAAAAB8/wSFRLHiUqz0/s400/onchange.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5052504768791428034" /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#cc6600;"&gt;Détection que l'utilisateur quitte le formulaire&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;Il faut déclarer le nouvel évènement onBeforeUnload. Pour celà, dans l'entête JS du masque, ajouter :&lt;pre class="code"&gt;&lt;code&gt;window.onbeforeunload = confirmExit;&lt;/code&gt;&lt;/pre&gt;où confirmExit est une fonction Javascript permettant de vérifier s'il faut afficher la boite d'avertissement mais aussi de personnaliser un peu le message.&lt;pre class="code"&gt;&lt;code&gt;function confirmExit() {&lt;br /&gt;  if(document.forms[0].isChanged.value=='1') &lt;br /&gt;    return "Vous avez effectuez des modifications sans les enregistrer.";&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;La première condition permet de vérifier s'il est utile de lui présenter la fenêtre de confirmation en allant vérifier la valeur du champ caché.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-8017584677971754193?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/8017584677971754193/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=8017584677971754193' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/8017584677971754193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/8017584677971754193'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2007/04/astuce-avertissement-avant-de-quitter.html' title='ASTUCE - Avertissement avant de quitter une page Web'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_yi4tWEd8Ewk/Rh4aGmHHu7I/AAAAAAAAAB0/Gwh9d3Z5MFs/s72-c/avertissement.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-8343515075933331812</id><published>2007-03-26T13:08:00.000+02:00</published><updated>2008-11-13T04:58:25.300+01:00</updated><title type='text'>Hors-Sujet - Idée lecture : "Un dimanche avec Garbo"</title><content type='html'>Une fois n'est pas coutume, ceci n'a rien à voir avec Lotus Domino, Ajax ou autres technologies dites "Web 2.0". Juste une simple recommandation de lecture d'un recueil de nouvelles écrit par quelqu'un de très proche.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Un dimanche avec Garbo et autres histoires&lt;/span&gt;&lt;br /&gt;de Olivier Mony&lt;br /&gt;Editions Confluences&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"Hemingway à Chantaco, Cocteau à Arcachon, tournage de Hôtel des Amériques de Téchiné à Biarritz, ce récit fait revivre les personnalités de passage dans le Sud-Ouest : écrivains, aventuriers, stars de cinéma, sur leurs lieux de tournage, sur les plages ou dans les citadelles."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sur &lt;a href="http://www.amazon.fr/Un-dimanche-avec-Garbo-histoires/dp/2914240953/ref=sr_1_1/171-0646769-5857848?ie=UTF8&amp;s=books&amp;amp;qid=1174906808&amp;sr=8-1" onClick="javascript:urchinTracker('/links/amazon_olivier');"&gt;Amazon&lt;/a&gt; ou dans toutes les bonnes librairies.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_yi4tWEd8Ewk/Rgep6z52XpI/AAAAAAAAABo/bgLnEYpmc0I/s1600-h/un-dimanche-avec-garbo.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_yi4tWEd8Ewk/Rgep6z52XpI/AAAAAAAAABo/bgLnEYpmc0I/s400/un-dimanche-avec-garbo.gif" alt="" id="BLOGGER_PHOTO_ID_5046188735322283666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Au passage, un petit clin d'oeil à &lt;a href="http://www.domlike.net/"&gt;Julien &lt;/a&gt;notre célèbre expert Lotus du Sud-Ouest.&lt;br /&gt;&lt;br /&gt;PS : Olivier vient de recevoir le prix Hennessy du journalisme littéraire 2007. (Source : &lt;a href="http://www.tv5.org/TV5Site/info/article-Manifestation_et_prix_litteraires_au_Salon_du_livre.htm?idrub=5&amp;xml=070325132359.dpja3lh6.xml"&gt;TV5.org&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-8343515075933331812?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/8343515075933331812/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=8343515075933331812' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/8343515075933331812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/8343515075933331812'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2007/03/hors-sujet-littraire-ide-lecture-un.html' title='Hors-Sujet - Idée lecture : &quot;Un dimanche avec Garbo&quot;'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_yi4tWEd8Ewk/Rgep6z52XpI/AAAAAAAAABo/bgLnEYpmc0I/s72-c/un-dimanche-avec-garbo.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-5745861249803355741</id><published>2007-03-11T10:53:00.000+01:00</published><updated>2008-11-13T04:58:25.914+01:00</updated><title type='text'>OUTILS - Représentation graphique de données Notes</title><content type='html'>&lt;div&gt;L'une des principales demande de mes utilisateurs est la mise à disposition de graphiques à partir des données contenues dans une base Lotus Notes.&lt;br /&gt;&lt;br /&gt;Il existe aujourd'hui de multiples méthodes permettant de faire celà à travers une applet ou une servlet JAVA, de &lt;a href="http://dominoweb.blogspot.com/2006/06/css-graphiques-barres-horizontales-et.html"&gt;feuilles de style CSS&lt;/a&gt;, en utilisant des API ou tout simplement en exportant les données vers un tableur comme OpenOffice Calc ou Microsoft Excel (voire Lotus 123 pour les nostalgique). Cependant je trouve qu'aucune de ces solutions ne répondent à tous les besoins, à savoir : simplicité, rapidité, maintenabilité, personnalisation.&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5040619540933349410" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_yi4tWEd8Ewk/RfPgxCE5kCI/AAAAAAAAABQ/W_QvRQOWB7I/s400/analytics.gif" border="0" /&gt;&lt;br /&gt;L'interface de Google Analytics (outil de suivi de statistique d'accès Web) présente une interface graphique avec de multiples graphiques de toute sorte que je trouve agréable. Ces graphiques sont générés grace à du Adobe Flash. Après de multiples recherches je pense avoir enfin trouvé LE package Flash gratuit de gestion des graphiques : &lt;a href="http://www.maani.us/xml_charts/"&gt;XML/SWF Chart&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Le graphique est généré à partir de données fournies au format XML et les possibilités de personnalisation sont infinies. 20 type de graphiques sont disponibles, du simple graphique à barre aux graphiques mixtes en passant par les camemberts 3D. L'ensemble des éléments du graphiques sont aramétrables à travers le fichier XML et le rendu est non seulement très propre mais en plus rapide.&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_yi4tWEd8Ewk/RfPhFCE5kDI/AAAAAAAAABY/neist0exi4Q/s400/graph1.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5040619884530733106" /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#cc6600;"&gt;Comment intégrer XML/SWF Chart dans une application Lotus Domino&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="color:#cc6600;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#cc6600;"&gt;Etape 1 : Intégration du package&lt;/span&gt;&lt;br /&gt;Le package comprend plusieurs fichiers SWF.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Télécharger &lt;a href="http://www.maani.us/xml_charts/index.php?menu=Download"&gt;le package&lt;/a&gt; sur le site Web &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Décompresser le package&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Ajouter les fichiers dans les ressources de votre base Notes. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Faire attention de reproduire l'arborescence des fichiers en intégrant le nom du répertoire (exemple, depuis les ressources Notes, renommer arno.swf en charts_library/arno.swf)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color:#cc6600;"&gt;Etape 2 : Préparation de la vue pour afficher les données à représenter&lt;/span&gt;&lt;br /&gt;Dans mon exemple je considère que les données peuvent âtre représentées à travers une vue Notes. On pourra aussi se baser sur des champs calculés si la méthode décrite ne peut répondre aux besoins.&lt;br /&gt;Les données doivent être présentées sous le format XML suivant :&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="code"&gt;&lt;code&gt;&amp;lt;row&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;string&amp;gt;Intitulé de ma colonne&amp;lt;/string&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;number&amp;gt;Valeur 1&amp;lt;number&amp;gt;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&amp;lt;number&amp;gt;Valeur n&amp;lt;number&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/row&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;Ma vue pourra donc avoir la forme suivante :&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;1ère colonne - Intitulé : &amp;lt;row&amp;gt;, Valeur : "&amp;lt;row&amp;gt;"&lt;/li&gt;&lt;br /&gt;&lt;li&gt;2nde colonne - Intitulé : &amp;lt;null/&amp;gt;, Valeur : "&amp;lt;string&amp;gt;" + champ_titre + "&amp;lt;/string&amp;gt;" &lt;/li&gt;&lt;br /&gt;&lt;li&gt;3ème colonne - Intilué : &amp;lt;string&amp;gt;Titre Valeur 1&amp;lt;/string&amp;gt;, Valeur : "&amp;lt;number&amp;gt;" + @text(champ_valeur1) + "&amp;lt;/number&amp;gt;" &lt;/li&gt;&lt;br /&gt;&lt;li&gt;...&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Dernière colonne - Intitulé : &amp;lt;/row&amp;gt;, Valeur : "&amp;lt;/row&amp;gt;"&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;Les données de la vue ne doivent pas être interprétées par le moteur Domino. Il faut donc absolument cocher l'option "Traiter contenucomme du code HTML" depuis l'avent dernier onglet des propriétés de la vue.&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_yi4tWEd8Ewk/RfPhSiE5kEI/AAAAAAAAABg/VU8jxO8es24/s400/vue.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5040620116458967106" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#cc6600;"&gt;Etape 3 : Le masque de vue&lt;/span&gt;&lt;br /&gt;C'est dans le masque associé à la vue que nous allons pouvoir définir toutes les options de représentation du graphique. Pour connaitre toutes ces options je ne peux que recommander de consulter l'&lt;a href="http://www.maani.us/xml_charts/index.php?menu=Reference"&gt;aide&lt;/a&gt; très complète disponible sur le site. Je ne donnerai ici qu'une configuration mimale pour afficher un graphique.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Création d'un masque nommé : $$ViewTemplate for nom_de_ma_vue_précédemment_créée&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Indiquer : &amp;lt;chart&amp;gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Ajouter : &amp;lt;chart_type&amp;gt;&lt;a href="http://www.maani.us/xml_charts/index.php"&gt;type de graphique souhaité&lt;/a&gt;&amp;lt/CHART_TYPE&amp;GT;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Ajouter comme vue intégrée votre vue précédemment créée&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Ajouter à la fin : &amp;lt;/chart&amp;gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Depuis le second onglet des propriétés du masque, indiquer Accès Web\Type de contenu\Autre : text/xml&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color:#cc6600;"&gt;Etape 4 : Intégration du graphique dans une page Web&lt;br /&gt;&lt;/span&gt;Pour ajouter le graphique dans une page, indiquez le code suivant :&lt;br /&gt;&lt;/div&gt;&lt;pre class="code"&gt;&lt;code&gt;&amp;lt;OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"&lt;br /&gt;&lt;br /&gt; codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0"&lt;br /&gt;&lt;br /&gt; WIDTH="400"&lt;br /&gt;&lt;br /&gt; HEIGHT="270"&lt;br /&gt;&lt;br /&gt; id="charts"&lt;br /&gt;&lt;br /&gt; ALIGN=""&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;PARAM NAME=movie VALUE="charts.swf?openfileresource&amp;library_path=charts_library&amp;amp;xml_source=nom_de_ma_vue"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;PARAM NAME=quality VALUE=high&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;PARAM NAME=bgcolor VALUE=#eeeeee&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;EMBED src="charts.swf?openfileresource&amp;library_path=charts_library&amp;amp;xml_source=nom_de_ma_vue?openview"&lt;br /&gt;&lt;br /&gt;       quality=high&lt;br /&gt;&lt;br /&gt;       bgcolor=#eeeeee&lt;br /&gt;&lt;br /&gt;       WIDTH="400"&lt;br /&gt;&lt;br /&gt;       HEIGHT="270"&lt;br /&gt;&lt;br /&gt;       NAME="charts"&lt;br /&gt;&lt;br /&gt;       ALIGN=""&lt;br /&gt;&lt;br /&gt;       swLiveConnect="true"&lt;br /&gt;&lt;br /&gt;       TYPE="application/x-shockwave-flash"&lt;br /&gt;&lt;br /&gt;       PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/EMBED&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/OBJECT&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;&lt;span style="color:#cc6600;"&gt;Conclusions&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;Vous pouvez voir un &lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/chart"&gt;exemple en ligne&lt;/a&gt; ainsi que télécharger une base Notes contenant &lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/DW2-FlashCharts.zip"&gt;un exemple un peu plus complet&lt;/a&gt; (Pour Lotus Notes 7+ pour le moment)&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Il est aussi à noter que le site offre deux autres packages qui semblent interressants ou du moins amusants :&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;XML/SWF Gauge : pour créer des compteur graphiques&lt;/li&gt;&lt;br /&gt;&lt;li&gt;XML/SWF Slideshow : pour créer des animations réactives&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;Je n'ai pas encore eut le temps de tester ces deux applications.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-5745861249803355741?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/5745861249803355741/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=5745861249803355741' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/5745861249803355741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/5745861249803355741'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2007/03/outils-reprsentation-graphique-de.html' title='OUTILS - Représentation graphique de données Notes'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_yi4tWEd8Ewk/RfPgxCE5kCI/AAAAAAAAABQ/W_QvRQOWB7I/s72-c/analytics.gif' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-116180454439113837</id><published>2006-10-25T21:19:00.000+02:00</published><updated>2006-10-25T21:29:04.410+02:00</updated><title type='text'>INFO - Exemple d'une site Web Lotus Domino intégrant Litebox et Smooth SlideShow entre autre</title><content type='html'>Après une longue absence, je vais commencer tranquillement par la présentation d'un site Web hébergé sous Lotus Domino intégrant quelques techniques décrites ici.&lt;br /&gt;&lt;br /&gt;Le  nouveau site d'une entreprise spécialiée dans l'instrumentation de mesure et de surveillance intègre des &lt;a href="http://dominoweb.blogspot.com/2006/09/ajax-mes-photos-de-vacances-avec.html"&gt;Litebox&lt;/a&gt; est un &lt;a href="http://dominoweb.blogspot.com/2006/08/ajax-photos-de-vacances.html"&gt;Smooth Slideshow &lt;/a&gt;présenté sur ce blog :  &lt;a href="http://www.soldatagroup.com"&gt;Site web de Sol Data&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/366/1667/1600/web-soldata.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/366/1667/400/web-soldata.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-116180454439113837?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/116180454439113837/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=116180454439113837' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/116180454439113837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/116180454439113837'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/10/info-exemple-dune-site-web-lotus.html' title='INFO - Exemple d&apos;une site Web Lotus Domino intégrant Litebox et Smooth SlideShow entre autre'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115826389524765652</id><published>2006-09-14T21:28:00.000+02:00</published><updated>2006-09-14T21:58:15.313+02:00</updated><title type='text'>GOOGLE API - Quelques compléments sur Google Maps</title><content type='html'>Je viens de découvrir deux nouvelles fonctions offertes par la version 2 de la l'API de Google Maps, la géolocalisation à partir d'une adresse postale et les boites d'information multi onglets.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;La géolocalisation à partir d'une adresse postale&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;J'avais déjà proposée une solution pour &lt;a href="http://dominoweb.blogspot.com/2006/06/google-api-la-recherche-dinformations.html"&gt;retrouver la position géographique &lt;/a&gt;d'un lieu à partir de son adresse postale dans l'un des premiers messages de ce blog. Les deux éventuels problèmes posés par la méthode décrite était :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;l'obligation de séparer chaque composante de l'adresse (rue, ville et pays)&lt;/li&gt;&lt;li&gt;l'utilisation d'un service sans pérennité assurée&lt;/li&gt;&lt;/ol&gt;Ces deux problèmes sont résolus grace à  &lt;a href="http://www.google.com/apis/maps/documentation/#Geocoding_Examples"&gt;Geocoder&lt;/a&gt; de Google Maps.&lt;br /&gt;&lt;br /&gt;L'une des méthodes les plus simples pour récupérer les coordonnées d'une adresse consiste à envoyer une requète http avec le format suivant :&lt;br /&gt;&lt;pre class="code"&gt;http://maps.google.com/maps/geo?q=adresse+recherchee&amp;output=csv&amp;amp;key=abcdefg&lt;/pre&gt;Où :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;q=&lt;/span&gt; : indiquer l'adresse recherchée au format URL. Exemple : place+concorde+paris+france&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;output=&lt;/span&gt; : format de la réponse. On peut indiquer xml, kml, json ou csv selon le besoin. Le format csv est le plus simple à traiter puisqu'il ne renvoie que quatre nombres séparées par des virgule en résultat.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;key=&lt;/span&gt; : votre clé Google Maps&lt;/li&gt;&lt;/ul&gt;Comme indiqué, le format CSV renvoie une réponse sous forme de quatre nombres correspondant au statut de la réponse (200 si tout va bien), le niveau de zoom, la latitude puis la longitude.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Plusieurs onglets dans la boite d'informations&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;J'avais rapidement présenté comment &lt;a href="http://dominoweb.blogspot.com/2006/06/google-api-lotus-notes-et-google-maps.html"&gt;ajouter une bulle d'information&lt;/a&gt; sur la carte GoogleMaps en utilisant &lt;span style="font-style: italic;"&gt;marker.openInfoWindowHtml(bulle);&lt;/span&gt;.&lt;br /&gt;Pour ajouter une boite de dialogue avec plusieurs onglet il suffit d'utiliser &lt;span style="font-style: italic;"&gt;marker.openInfoWindowTabsHtml(infoTabs);  &lt;/span&gt;en ayant préalablement défini infoTabs comme ceci :&lt;pre class="code"&gt;&lt;code&gt;var infoTabs = [&lt;br /&gt; new GInfoWindowTab("Titre Onglet 1", "Contenu onglet 1"),&lt;br /&gt; new GInfoWindowTab("Titre Onglet 2", "Contenu onglet 2")&lt;br /&gt;];&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115826389524765652?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115826389524765652/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115826389524765652' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115826389524765652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115826389524765652'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/09/google-api-quelques-complments-sur.html' title='GOOGLE API - Quelques compléments sur Google Maps'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115791694856321378</id><published>2006-09-10T20:57:00.000+02:00</published><updated>2006-09-10T21:37:24.296+02:00</updated><title type='text'>AJAX - Mes photos de vacances avec LightBox</title><content type='html'>Comme promis lors de la présentation du "&lt;a href="http://dominoweb.blogspot.com/2006/08/ajax-photos-de-vacances.html"&gt;Smooth Slideshox&lt;/a&gt;",  je vais présenter une seconde librairie Javascript permettant de présenter les photos. La bibliothèque LightBox est de plus en plus utilisé sur le Web. Il a l'immense avantage d'agrandir joliment une photo sans avoir à se soucier de la navigation. La bibliothèque s'appuie sur le couple prototype.js/scriptaculous.&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/lightbox.jpg" alt="" border="0" /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Comment installer LightBox&lt;/span&gt;&lt;br /&gt;L'installation et l'utilisation de la bibliothèque LightBox dans une application Lotus Domino est similaire aux autres librairies déjà présentées sur ce blog :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Télécharger le package sur &lt;a href="http://www.huddletogether.com/projects/lightbox2/"&gt;http://www.huddletogether.com/projects/lightbox2/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Décompresser le fichier ZIP sur le disque dur&lt;/li&gt;&lt;li&gt;Ajouter les fichiers prototype.js, scriptaculous.js, effect.js et lightbox.js et lightbox.css dans les ressources partagées de la base Notes&lt;/li&gt;&lt;li&gt;Ajouter les fichiers close.gif, loading.gif, blank.gif dans les ressources images partagées. On peut aussi ajouter les autres images présentées mais elle ne seront pas nécessaires dans l'exemple décrit.&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Comment utiliser la bibliothèque Lightbox&lt;/span&gt;&lt;br /&gt;Depuis l'élément de structure devant afficher les images LightBox (masque ou page), indiquer comme "Contenu de titre HTML" :&lt;br /&gt;&lt;pre class="code"&gt;&lt;code&gt;"&amp;lt;link rel=\"stylesheet\"&lt;br /&gt;type=\"text/css\" href=\"lightbox.css\"&lt;br /&gt;media=\"screen\" title=\"Normal\" /&amp;gt;&lt;br /&gt;&amp;lt;script src=\"script/prototype.js\" type=\"text/javascript\"&amp;gt;&lt;br /&gt;&amp;lt;/script&amp;gt; &lt;br /&gt;&amp;lt;script src=\"script/scriptaculous.js\" type=\"text/javascript\"&amp;gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src=\"script/lightbox.js\" type=\"text/javascript\"&amp;gt;&lt;br /&gt;&amp;lt;/script&amp;gt;"&lt;/code&gt;&lt;/pre&gt;Ajouter aussi sur l'évènement "OnLoad" :&lt;br /&gt;&lt;pre class="code"&gt;&lt;code&gt;initLightbox();&lt;/code&gt;&lt;/pre&gt;Votre masque ou page est prête.&lt;br /&gt;&lt;br /&gt;Pour déclarer une image ou photo devant utiliser lightbox il faut utiliser la syntaxe suivante :&lt;pre class="code"&gt;&lt;code&gt;&amp;lt;a href="path_de_l_image_agrandie" rel="lightbox" &amp;gt;&lt;br /&gt;&amp;lt;img src="path_de_l_imagette" /&amp;gt;&lt;br /&gt;&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Une mini-galerie photo sous Lotus Domino à télécharger&lt;/span&gt;&lt;br /&gt;Pour l'ocasion j'ai créé une mini galerie photo sous Lotus Notes à télécharger. Ne vous attendez pas à une révolution. Cette application n'a que comme unique but de présenter l'intégration de LightBox dans une base Notes. Par contre, pour faire plaisir à Julien, les 3 photos fournies en exemple sont ... en couleur.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://free.dominoserver.de/it/dominoweb.nsf/dw_ajax_photos.zip" onClick="javascript:urchinTracker('/download/galerie');"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/366/1667/400/lightboxzoo.jpg" alt="" border="0" /&gt;&lt;/a&gt;Télécharger la &lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/dw_ajax_photos.zip" onClick="javascript:urchinTracker('/download/galerie');"&gt;galerie photo Lightbox&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115791694856321378?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115791694856321378/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115791694856321378' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115791694856321378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115791694856321378'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/09/ajax-mes-photos-de-vacances-avec.html' title='AJAX - Mes photos de vacances avec LightBox'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115731685819409269</id><published>2006-09-03T22:10:00.000+02:00</published><updated>2006-09-04T08:02:11.656+02:00</updated><title type='text'>AJAX - Tag Clouds</title><content type='html'>Une fois n'est pas coutume,  je vais profité du travail des autres !  Je cherchais en effet comment mettre en place un nuage de tags dans une application Lotus Notes. Avant de commencer le développement j'ai recherché ce qui existait et j'ai été étonné de trouver rapidement trois approches différentes d'implémenter cette fonctionnalité Web 2.0 avec Lotus Domino. C'est d'autant plus interressant que ces trois méthodes utilisent chacune une approche différente typique de l'évolution du développement des applications Domino pour le Web, formula avec Javascript, LotusScript et LotusScript avec DXL.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Qu'est-ce qu'un nuage de tags ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Un nuage de tags est une représentation sous forme de liste de mots représentés de taille proportionnelle à leur importance. Cette importance est principalement lié au nombre d'occurences du mot.&lt;br /&gt;On retrouve aujourd'hi ces nuages de tags un peu partout sur les applications dites 2.0 comme &lt;a href="http://del.icio.us/tag/"&gt;delicious&lt;/a&gt;, &lt;a href="http://www.flickr.com/photos/tags/"&gt;Flickr&lt;/a&gt; ou encore &lt;a href="http://www.technorati.com/tag/"&gt;Technorati&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Ces nuages de tags sont aussi utilisés dans l'application &lt;a href="http://aixtal.blogspot.com/2006/01/outil-le-nbuloscope.html"&gt;Nébuloscope &lt;/a&gt;de Jean Veronis dont je ne peux que recommandé la lecture du blog &lt;a href="http://aixtal.blogspot.com/"&gt;Technologies du langage&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/cloudtag.gif" alt="" border="0" /&gt;&lt;br /&gt;Cette forme de représentation permet de remplacer la visualisation catégorisée des vues et s'interface très facilement avec les options de restriction des vues intégrées.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Trois approches d'implémentation de la solution&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Comme indiqué en introduction les trois méthodes présentées utilisent chacune une approche originale est montrant bien les approches différentes de développement des application Lotus Domino.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Approche Formula/Javascript&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.ferdychristant.com/fchristant/production/fdm.nsf/archive/DOMM-6SKFQW"&gt;Ferdy Christant&lt;/a&gt; propose de &lt;a href="http://www.ferdychristant.com/fchristant/production/fdm.nsf/archive/DOMM-6SKFQW"&gt;générer un tableau Javascript à partir d'une vue présentée en HTML&lt;/a&gt; et d'un peu de formula. Le Javascript se charge après de représenter le nuage de tags sur le poste client.&lt;br /&gt;Cette approche ressemble énormément à de nombreux exemples que j'ai présenté ici.&lt;br /&gt;&lt;br /&gt;L'avantage d'une telle méthode est d'économiser la charge coté serveur. Seule une vue est appelée.&lt;br /&gt;&lt;br /&gt;Malheureusement cette méthode a aussi ces inconvénients :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Le poste client doit supporter le Javascript. Même si quasimeent tous les navigateurs Web récents supporte le Javascript on peut le désactiver. De plus, même si le javascript peut s'exécuter coté client il faut tout de même faire attention au volume de données à traiter. &lt;/li&gt;&lt;li&gt;Même si celà peut paraitre secondaire, cette méthode retire l'attrait principal du nuage de tag pour le webmestre. En effet, l'un des effets secondaire du nuage de tag est l'indexation des pages web auprès des moteurs de recherche. Les liens d'un nuage pointent non seulement sur des ensembles de pages du site mais en plus porte un nom cohérent, le tag, vers ce lien. Hors dans le cas d'un traitement Javascript, les moteurs de recherche ne voient pas ce nuage.&lt;/li&gt;&lt;li&gt;Enfin, pour ceux qui voudraient encore développer des applications compatibles Web et Client Notes, il n'est pas possible d'utiliser cette méthode sur le client lourd.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Approche traditionnelle via LotusScript&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.notessidan.se/A55B53/blogg.nsf/blogg"&gt;Thomas Adrian&lt;/a&gt; utilise une méthode plus &lt;span style="font-style: italic;"&gt;traditionnelle &lt;/span&gt;en utilisant un &lt;a href="http://www.notessidan.se/A55B53/blogg.nsf/plink/TADN-6RPTKK"&gt;agent LotusScript&lt;/a&gt;. Le nuage de tags est calculé en temps réel par un agent LotusScript se basant sur un &lt;span style="font-style: italic;"&gt;NotesViewNavigator&lt;/span&gt; et renvoie le résultat via des &lt;span style="font-style: italic;"&gt;print&lt;/span&gt;.  Le serveur est donc sollicité à chaque appel du nuage. Par contre, il génère une page Web qui pourra être proprement indexées auprès des moteurs de recherche. Bref les inconvénients de la première méthodes sont les avantages de celle-ci et inversement.&lt;br /&gt;&lt;br /&gt;S'il fallait choisir une solution entre ces deux méthodes je privilégierai la première pour un Intranet avec un parc matériel et logiciel maitrisé, sans indexation auprès des moteurs de recherche et surtout où l'important est la vitesse de réponse du serveur. Par contre, la seconde approche est préférable pour une application à vocation publique.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Approche LotusScript/DXL&lt;/span&gt;&lt;br /&gt;&lt;a href="http://smoki.atblogs.de/index.php?blogId=82"&gt;Christian Mueller&lt;/a&gt; propose une troisième approche pouvant répondre à tous les besoins exprimés en utilisant du &lt;a href="http://smoki.atblogs.de/index.php?op=ViewArticle&amp;articleId=772&amp;amp;blogId=82"&gt;LotusScript avec DXL&lt;/a&gt;. Le calcul du nuage de tag s'appuie exactement sur la même méthode que celle proposée via agent LotusScript par Thomas Adrian. La différence est qu'il n'envoie pas directement le résultat au navigateur Web mais créé un nouveau masque via DXL contenant ce nuage. La mise à jour de ce masque peut alors être recalculé uniquement lorsqu'un document est créé, modifié ou supprimé, bref lorsque le nuage est modifié.&lt;br /&gt;&lt;br /&gt;Donc non seulement le serveur n'est pas sollicité lors de l'appel de cette page, le nuage est présentée sous forme HTML pour les moteurs de recherche mais en plus il est facilement présentable pour les utilisateurs de clients Lotus Notes.&lt;br /&gt;&lt;br /&gt;Serait-ce la solution idéale ? Par rapport aux contraintes exposées précédemment, c'est sans conteste la meilleure solution. Reste le problème d'intégration et de maintenance de l'application. Le nombre de développeurs Lotus Notes utilisant et surtout maitrisant DXL est encore rare (du moins je n'en fait pas encore partie même si je prends des cours réguliers sur le blog de &lt;a href="http://darkmag.net/darkBlog/index.php"&gt;Yogi&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115731685819409269?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115731685819409269/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115731685819409269' title='7 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115731685819409269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115731685819409269'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/09/ajax-tag-clouds.html' title='AJAX - Tag Clouds'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115731421221231120</id><published>2006-09-03T22:03:00.000+02:00</published><updated>2006-09-03T22:10:12.226+02:00</updated><title type='text'>SITE - Version anglaise</title><content type='html'>Le peu d'articles de ces derniers jours n'est pas dût à manque d'inspiration ou pire à un manque de motivation. J'ai profité de la fin du mois d'Août pour mettre en ligne une version allégée de ce &lt;a href="http://webdomino.blogspot.com/"&gt;blog en anglais &lt;/a&gt;et en même temps tester la version Béta de la nouvelle version de Blogger.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115731421221231120?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115731421221231120/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115731421221231120' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115731421221231120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115731421221231120'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/09/site-version-anglaise.html' title='SITE - Version anglaise'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115599371092579631</id><published>2006-08-19T14:54:00.000+02:00</published><updated>2006-08-19T16:40:18.430+02:00</updated><title type='text'>SITE - Modification d'URL pour le fil RSS</title><content type='html'>Le fil RSS de ce blog change d'URL. La nouvelle adresse est : &lt;a href="http://feeds.feedburner.com/DominoWeb20"&gt;http://feeds.feedburner.com/DominoWeb20&lt;/a&gt;. En effet je viens de m'inscrire sur &lt;a href="http://feeds.feedburner.com"&gt;FeedBurner&lt;/a&gt; qui permet non seulement d'assurer une meilleure compatibilité avec les aggrégateurs (au contraire du flux atom précédent) mais aussi pour suivre les statistiques d'accès au site via ce média. Comme vient justement de le faire remarquer Julien sur &lt;a href="http://domlike.net/domlike/dl2.nsf/d6plinks/DOME-6SSAKH"&gt;domlike.net&lt;/a&gt;, la majorité des accès sur un blog se fait à travers les aggrégateurs et non depuis un navigateur Web.&lt;br /&gt;&lt;br /&gt;L'ancien fil atom restera encore actif quelques semaines. N'hésitez pas à laisser un commentaire en cas de problème.&lt;br /&gt;&lt;br /&gt;[mise à jour]J'ai aussi profité de l'occasion pour offrir la possibilité de consulter le flux RSS du site au format PDF et pour Mobile via &lt;a href="http://www.xfruits.com"&gt;xFruits&lt;/a&gt;. Ce site permet de transformer et d'aggréger des flux RSS vers différents formats. De plus, l'interface est simple, fluide et visuellement agréable. Bref, un outil indispensable que je vous recommande.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115599371092579631?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115599371092579631/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115599371092579631' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115599371092579631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115599371092579631'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/08/site-modification-durl-pour-le-fil-rss.html' title='SITE - Modification d&apos;URL pour le fil RSS'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115584750812357245</id><published>2006-08-17T22:18:00.000+02:00</published><updated>2006-08-17T23:12:14.906+02:00</updated><title type='text'>ASTUCE - Garder une session Domino ouverte</title><content type='html'>L'un des problèmes qui m'ennuie le plus avec les application full-web est l'expiration de session. Encore ce matin un utilisateur m'a appelé paniqué car au moment d'enregistrer son article, patiemment rédigé pour un blog interne de l'entreprise, le serveur Domino lui a répondu que la session était expirée.&lt;br /&gt;&lt;br /&gt;En parcourrant l'excellent blog de William Beh "&lt;a href="http://notesweb2.blogspot.com/"&gt;Lotus Notes on Web 2.0&lt;/a&gt;" j'ai enfin trouvé une solution simple et rapide à mettre en place. Il propose tout simplement d'appeler en Ajax un fichier sur serveur périodiquement avec la classe &lt;a href="http://roberthanson.blogspot.com/2005/11/prototypejs-periodicalexecuter.html"&gt;PeriodicalExecuter&lt;/a&gt; de prototype.js. Ceci permet de garder ouverte la session Domino.&lt;br /&gt;&lt;br /&gt;Cette méthode n'est certes pas parfaite d'un point de vue sécurité. L'utilisateur doit absolument fermer son navigateur pour fermer la session. Le coutournement de ce problème sera l'occasion de rédiger un nouvel article.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115584750812357245?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115584750812357245/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115584750812357245' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115584750812357245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115584750812357245'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/08/astuce-garder-une-session-domino.html' title='ASTUCE - Garder une session Domino ouverte'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115577710111569122</id><published>2006-08-17T03:03:00.000+02:00</published><updated>2006-08-17T03:32:35.076+02:00</updated><title type='text'>INFO - Nouvelle version de scriptaculous</title><content type='html'>La version 1.6.2 de scriptaculous vient de sortir. Elle corrige un certains nombre (voire un nombre certains) de bugs divers. La version 1.5.0 rc0 de prototype.js est aussi fournie  dans le nouveau package d'installation que vous pouvez télécharger depuis la page &lt;a style="font-style: italic;" href="http://script.aculo.us/downloads"&gt;downloads&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Pour rappel, la librairie scriptaculous est très régulièrement présenté dans ce blog. Elle est très pratique pour gérer notament le &lt;a href="http://dominoweb.blogspot.com/2006/06/ajax-une-page-web-personnalisable-14.html"&gt;drag &amp; drop&lt;/a&gt; ainsi que l'&lt;a href="http://dominoweb.blogspot.com/2006/06/ajax-autocompletion-avec-scriptaculous.html"&gt;autocomplétion&lt;/a&gt;. Quelques exemples en ligne sont disponibles sur le site annexe &lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/index?openview"&gt;Domino &amp;amp; Web 2.0 : Exemples&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La bibliothèque prototype.js est elle utilisée dans de nombreuses bilbiothèques javascript comme &lt;a href="http://script.aculo.us/"&gt;scriptaculous&lt;/a&gt;, mais aussi &lt;a href="http://openrico.org/rico/home.page"&gt;Rico&lt;/a&gt; ou &lt;a href="http://moofx.mad4milk.net/"&gt;moo.fx&lt;/a&gt; qui ont aussi été présentées ici (&lt;a href="http://dominoweb.blogspot.com/2006/07/ajax-rico-livegrid-pour-reprsenter-les.html"&gt;livegrid &lt;/a&gt;et &lt;a href="http://dominoweb.blogspot.com/2006/07/ajax-rico-accordion-les-vues.html"&gt;accordion&lt;/a&gt; pour Rico, &lt;a href="http://dominoweb.blogspot.com/2006/08/ajax-photos-de-vacances.html"&gt;Smooth Slideshow&lt;/a&gt; pour moo.fx).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115577710111569122?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115577710111569122/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115577710111569122' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115577710111569122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115577710111569122'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/08/info-nouvelle-version-de-scriptaculous.html' title='INFO - Nouvelle version de scriptaculous'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115575510506832910</id><published>2006-08-16T21:05:00.000+02:00</published><updated>2006-08-17T03:33:53.993+02:00</updated><title type='text'>AJAX - Photos de vacances</title><content type='html'>&lt;p&gt;De retour d'un long week-end du 15 Août, il est temps d'exposer les photos souvenir. Le but n'est pas de présenter une application de gestion de photos mais plutôt de présenter deux solutions AJAX que je trouve esthétique et très facilement intégrable avec Lotus Domino. La première solution présentée dans cet article présente les photos sous forme de bandeau avec effet de transition fondu enchainé et la possibilité d'ajouter un titre, une description ainsi qu'un lien.  La seconde solution sera présentée dans le prochain article. Elle permet d'ouvrir les photos depuis des imagettes sous forme de boite de dialogue modale. Cet effet est notamment utilisé sur &lt;a href="http://beta.zooomr.com"&gt;zoomr&lt;/a&gt;. &lt;/p&gt;&lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/slide"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/diapo1.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0); font-weight: bold;"&gt;Smooth Slideshow de Jonathan Schemoul&lt;/span&gt;&lt;br /&gt;&lt;p&gt;La bibliothèque &lt;a href="http://smoothslideshow.jondesign.net/"&gt;JonDesign's Smooth SlideShow&lt;/a&gt; permet de créer rapidement un bandeau avec effet fondu enchainé comme on en trouve déjà beaucoup en Flash. Cette bibliothèque s'appuie sur prototype.js et moo.fx. Le tout pèse 21,6 ko ce qui me semble très raisonnable surtout si l'on utilise ces bibliothèques pour d'autres usages sur le site. Pour comparaison, &lt;a href="http://www.estvideo.com/dew/index/2005/08/15/514-dewslider-20-le-retour-des-diaporamas-en-flash"&gt;dewslider.swf&lt;/a&gt;, un excellent équivalent en flash, pèse 30,4 ko. Cependant, n'y connaissant rien en Flash, je ne me permettrais pas d'avancer d'arguments pour ou contre l'une de ces solutions. Le choix de cette bibliothèque est avant tout motivé par le but principal de ce blog, présenter des solutions AJAX pour Lotus Domino.&lt;/p&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0); font-weight: bold;"&gt;Installation de la bibliothèque&lt;/span&gt; &lt;p&gt;Pour utiliser la bilbiothèque il faut tout d'abord télécharger le package disponible sur la page de présentation de la bibliothèque. Une fois le fichier décompressé, ajouter les fichiers javascript et la feuille de style dans les ressources partagées de la base Lotus Notes. Les fichiers à ajouter sont :&lt;/p&gt; &lt;ul&gt; &lt;li&gt;moo.fx.js  &lt;/li&gt;&lt;li&gt;moo.fx.pack.js  &lt;/li&gt;&lt;li&gt;protoype.lite.js  &lt;/li&gt;&lt;li&gt;showcase.slideshow.js  &lt;/li&gt;&lt;li&gt;timed.slideshow.js  &lt;/li&gt;&lt;li&gt;jd.slideshow.css&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Si l'on utilise déjà prototype.js, inutile d'ajouter prototype.lite.js.&lt;/p&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0); font-weight: bold;"&gt;Utilisation de la biliothèque&lt;/span&gt; &lt;p&gt;Comme décrit dans la documentation, il faut&lt;/p&gt; &lt;ol&gt; &lt;li&gt;déclarer les bibliothèques javascript et la feuille de style  &lt;/li&gt;&lt;li&gt;déclarer les images à présenter  &lt;/li&gt;&lt;li&gt;personnaliser la taille de la zone d'affichage  &lt;/li&gt;&lt;li&gt;définir la zone d'affichage dans la page&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;La déclaration des images à présenter se fait à travers un tableau déclaré en javascript sous la forme :&lt;/p&gt;&lt;pre class="code"&gt;&lt;code&gt;mySlideData[countArticle++] = new Array(&lt;br /&gt;'image1.jpg',&lt;br /&gt;'article1.html',&lt;br /&gt;'Item 1 Title',&lt;br /&gt;'Item 1 Description'&lt;br /&gt;);&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0); font-weight: bold;"&gt;Intégration dans Lotus Notes&lt;/span&gt;&lt;br /&gt;&lt;p&gt;Pour faciliter la mise à jour des photos, je passerais par un masque pour gérer les photos à afficher. Ce masque est défini avec les champs suivants :&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Titre : champ texte libre&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Lien : champ texte libre&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Description : champ texte libre&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Photo : champ texte riche&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Une fois le masque créé, reste à définir une vue "Photos". Pour me faciliter la tache, la vue présentera directement le code Javascript à intégrer dans ma page. La formule de colonne sera :&lt;/p&gt;&lt;pre class="code"&gt;&lt;code&gt;"mySlideData[countArticle++] = new Array('"&lt;br /&gt;+ "0/" + @Text(@DocumentUniqueID) + "/$file/"&lt;br /&gt;+ @subset(@attachmentnames; 1) + "', '"&lt;br /&gt;+ Lien + "', '"&lt;br /&gt;+ Titre + "', '"&lt;br /&gt;+ Description + "');"&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Ne pas oublier de trier la première colonne dans la vue pour pouvoir extraire les données avec @dbColumn.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Pour créer ma page Web, je vais passer par une page Notes mais on peut aussi l'intégrer dans un masque.&lt;/p&gt;&lt;p&gt;Comme&lt;span style="font-style: italic;"&gt; contenu de titre HTML&lt;/span&gt; il faut intégrer les librairies javascript, ajouter un évenement Onload pour lancer le bandeau à l'ouverture de la page puis définir les images à afficher à partir de la vue précédemment créée et enfin définir les options de style pour définir la taille du bandeau, soit :&lt;/p&gt;&lt;pre class="code"&gt;&lt;code&gt;Photos:= @DbColumn("":"";"";"Photos" 1);&lt;br /&gt;@If(@IsError(val); "" ;&lt;br /&gt;"&amp;lt;script src=\"prototype.lite.js\" type=\"text/javascript\"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src=\"moo.fx.js\" type=\"text/javascript\"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src=\"moo.fx.pack.js\" type=\"text/javascript\"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src=\"timed.slideshow.js\" type=\"text/javascript\"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;link rel=\"stylesheet\" href=\"jd.slideshow.css\"&lt;br /&gt;type=\"text/css\" media=\"screen\" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type=\"text/javascript\"&amp;gt;&lt;br /&gt;function addLoadEvent(func) {&lt;br /&gt;var oldonload = window.onload;&lt;br /&gt;if (typeof window.onload != 'function') {&lt;br /&gt;window.onload = func; }&lt;br /&gt;else {&lt;br /&gt;window.onload = function() {&lt;br /&gt;oldonload();&lt;br /&gt;func();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;function startSlideshow() {&lt;br /&gt;initSlideShow($('mySlideshow'), mySlideData);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;countArticle = 0;&lt;br /&gt;var mySlideData = new Array();"&lt;br /&gt;+ @Implode(Photos) +&lt;br /&gt;"addLoadEvent(startSlideshow); &amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;style&amp;gt;&lt;br /&gt;#mySlideshow {&lt;br /&gt;width: 400px !important;&lt;br /&gt;height: 200px !important;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/style&amp;gt;"); &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Il ne reste plus qu'à indiquer dans la page où afficher le bandeau en ajoutant en tant que texte HTML relais :&lt;/p&gt;&lt;pre class="code"&gt;&lt;code&gt;&amp;lt;div id="mySlideshow"&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;C'est fini, voici un exemple de résultat avec quelques &lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/slide"&gt;photos du Golfe du Morbihan&lt;/a&gt;.&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115575510506832910?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115575510506832910/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115575510506832910' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115575510506832910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115575510506832910'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/08/ajax-photos-de-vacances.html' title='AJAX - Photos de vacances'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115507203660700847</id><published>2006-08-08T22:08:00.000+02:00</published><updated>2006-08-08T23:20:36.780+02:00</updated><title type='text'>ASTUCE - CSS dans Notes</title><content type='html'>J'ai découvert très récemment que l'on pouvait appliquer les feuilles CSS sur le client Lotus Notes 6. C'était pourtant écrit dans l'aide, mais je n'avais même pas osé imaginer que celà était possible. Attention, cependant il y a de très fortes limitations. Pour le moment on ne peut appliquer un style CSS qu'à quelques éléments, de plus les classes et style semblent ne pas être gérés sur le client.&lt;br /&gt;&lt;br /&gt;Une application qui peut être éventuellement intéressante est la personnalisation des tableaux créés dans  un champ texte riche.&lt;br /&gt;&lt;br /&gt;Pour appliquer un style à un masque, il faut commencer par créer sa feuille de style dans un fichier texte avec notepad, ou un autre éditeur de texte (j'utilise &lt;a href="http://www.pspad.com/fr/"&gt;PSPad&lt;/a&gt;). La feuille de style pourra par exemple ressembler à :&lt;br /&gt;&lt;pre class="code"&gt;&lt;code&gt;TD {&lt;br /&gt;  border : 1px solid #ddd;&lt;br /&gt;  background : #eee;&lt;br /&gt;  color : #333;&lt;br /&gt;  font-family : tahoma;&lt;br /&gt;  font-size : 12px;&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Une fois le fichier enregistré, il faut l'intégrer dans une base Notes comme ressource "Feuille de style".&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/notes_ressource.png" alt="" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Pour appliquer la feuille de style à un masque :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ouvrir le masque,&lt;/li&gt;&lt;li&gt;Sélectionner dans le menu "Création\Ressource\Insérer ressource"&lt;/li&gt;&lt;li&gt;Sélectionner "Feuille de style" comme type de ressource&lt;/li&gt;&lt;li&gt;Sélectionner le fichier puis cliquer sur OK&lt;br/&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;" src="http://photos1.blogger.com/blogger/366/1667/400/notes_ressource2.0.gif" border="0" alt="" /&gt;&lt;/li&gt;&lt;/ul&gt;Un(e) icone symbolisant la ressource doit apparaitre dans le masque Notes.&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;" src="http://photos1.blogger.com/blogger/366/1667/400/notes_ressource3.gif" border="0" alt="" /&gt;&lt;br /&gt;Il ne reste plus qu'à enregistrer le masque, c'est terminé. Lorsqu'un utilisateur créera un nouveau tableau dans un champ texte riche de ce masque, ce tableau s'affichera avec les options de style définies.&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;" src="http://photos1.blogger.com/blogger/366/1667/400/notes_tableau.png" border="0" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;On peut aussi appliquer un style à la balise IMG pour ajouter automatiquement une bordure autour des images iportées ou collées. La feuille de style pourra alors être :&lt;br /&gt;&lt;pre class="code"&gt;&lt;code&gt;IMG {&lt;br /&gt;  padding : 5px;&lt;br /&gt;  border : 4px solid #373;&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;" src="http://photos1.blogger.com/blogger/366/1667/400/notes_image.gif" border="0" alt="" /&gt;&lt;br /&gt;Les possibilités semblent encore trop limitées pour être vraiment interressantes à exploiter. Il faudrait voir si le support des feuilles CSS évolue avec les prochaines versions de Notes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115507203660700847?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115507203660700847/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115507203660700847' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115507203660700847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115507203660700847'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/08/astuce-css-dans-notes.html' title='ASTUCE - CSS dans Notes'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115497271168605829</id><published>2006-08-07T19:32:00.000+02:00</published><updated>2006-08-07T21:04:12.316+02:00</updated><title type='text'>ASTUCE - Forcer les propriétés de mise en forme du texte d'un champ texte riche sur le Web</title><content type='html'>Rien de plus désagréable qu'un site Web où les fontes de caractères diffèrent d'une page à l'autre. S'il est possible de maitriser une charte graphique pour un site à vocation publique, il est beaucoup plus difficile, voire impossible,  de l'imposer pour les importantes bases documentaires internes. A la décharge des utilisateurs, Lotus Notes préserve les propriétés de texte lors des copier/coller depuis les applications Office ou depuis les pages Web.&lt;br /&gt;&lt;br /&gt;Heureusement, le moteur de conversion Web Domino n'est pas toujours propre. Il utilise toujours les "vieilles" balises HTML et plus particulièrement la balise &amp;lt;font&amp;gt; pour définir la police de caractère et sa taille. Pour maitriser le rendu du champ texte riche sur le Web il suffit donc de redéfinir le style de cette balise. Ainsi on peut par exemple ajouter en entête de la page web :&lt;br /&gt;&lt;pre class="code"&gt;&lt;code&gt;&amp;lt;style&amp;gt;&lt;br /&gt;font {&lt;br /&gt;font-family : tahoma, arial, helvetica, sans-serif;&lt;br /&gt;font-size : 1em;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Quelque soit la fonte utilisée et quelque soit sa taille définie dans Notes, le contenu du champ apparaitra toujours en fonte tahoma taille 1em. L'utilisateur pourra par contre mettre en gras ou souligner les caractères afin d'ajouter un peu d'effets au contenu.&lt;br /&gt;&lt;br /&gt;On peut bien sûr aussi entourer le champ texte riche d'un div avec une classe définie afin de limiter la portée de l'effet à ce champ. On aura alors dans le masque :&lt;br /&gt;&lt;pre class="code"&gt;&lt;code&gt;&amp;lt;div class="mybody"&amp;gt;&lt;br /&gt;Champ texte riche&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;et pour la définition du style :&lt;br /&gt;&lt;pre class="code"&gt;&lt;code&gt;&amp;lt;style&amp;gt;&lt;br /&gt;#mybody font {&lt;br /&gt; font-family : georgia, "Times New Roman", Times, Roman, serif;&lt;br /&gt; font-size : 12px;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115497271168605829?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115497271168605829/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115497271168605829' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115497271168605829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115497271168605829'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/08/astuce-forcer-les-proprits-de-mise-en.html' title='ASTUCE - Forcer les propriétés de mise en forme du texte d&apos;un champ texte riche sur le Web'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115495753938702431</id><published>2006-08-07T14:27:00.000+02:00</published><updated>2006-08-07T21:17:48.693+02:00</updated><title type='text'>GRAPHISME - Amélioration des graphiques Excel</title><content type='html'>C'est l'été, il fait beau et chaud. Je vais donc profiter du mois d'août, non pas pour faire une pause, mais pour aborder des sujets que certains pourront trouver plus futiles. Je commencerai par l'aspect graphique lié au Web 2.0. Chaque décennies voit apparaitre une nouvelle mode graphique : les coins carrés, les coins arrondis, les ombres portées, etc... Avec le Web 2.0 (et aussi Apple) est arrivé l'effet reflet.&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/graph.0.gif" alt="" border="0" /&gt;Le mois d'août étant le mois le moins chargé de l'année, je profite toujours de cette période pour revoir ma documentation et les présentations que je suis amené à diffuser. J'ai donc profiter de l'occasion pour voir comment améliorer le rendu des graphiques générés par Excel. Même si le plus important reste le contenu, l'auditeur est toujours plus attentif si le visuel est agréable.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;ETAPE 1 : Préparation du graphique sous Microsoft Excel (ou Calc avec Open Office)&lt;/span&gt;&lt;br /&gt;Je ne vais pas donner de cours d'Excel étant très limité en ce domaine. Les seules recommandations que je donnerai est de ne pas se soucier des couleurs car elles pourront être modifiée sous Adobe Photoshop, mais faire très attention de supprimer les bordures des graphiques.&lt;br /&gt;Une fois le graphique prêt, supprimer la légende et agrandir le graphique le plus possible selon la mémoire que vous possédez sur votre ordinateur. L'agrandissement du graphique permettra de supprimer l'effet "escalier". Copier le graphique et coller le comme nouvelle image dans votre éditeur graphique. J'utiliserais Adobe Photoshop mais celà doit aussi pouvoir fonctionner avec Paint Shop Pro ou Gimp.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;ETAPE 2 : Préparation du graphique sous l'éditeur graphique&lt;/span&gt;&lt;br /&gt;Je commence par modifier les couleurs de mon graphique. Photoshop m'offre beaucoup plus de possibilités que la palette limitée d'Excel. Je décommande d'appliquer des dégradés sur les graphiques qui allourdissent un peu trop à mon goût.&lt;br /&gt;Pour coloriser mon graphique, j'utilise la "baguette magique" pour sélectionner la zone à colorisée puis le pot de peiture pour appliquer la nouvelle couleur.&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/baguettemagique.gif" alt="" border="0" /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;ETAPE 3 : Préparation de la zone de travail&lt;/span&gt;&lt;br /&gt;Avant de redimensionner l'image, je supprime les zone de blanc en trop autour du graphique en utilisant l'outil de recadrage. Il est maintenant possible de redimensionner l'image à la taille souhaitée. Pour redimensionner l'image sous photoshop il faut sélectionner l'option du menu "Image\Taille de l'image" puis indiquer la largeur et/ou la hauteur souhaitée. J'utilise de nouveau la baguette magique pour sélectionner le fond bland et je le supprime. Il ne doit plus que rester le graphique et éventuellement l'échelle dans le cas de graphiques à barres.&lt;br /&gt;&lt;br /&gt;L'effet de reflet doit être affichée sous le graphique il faut donc agrandir la zone de travail. Sous Photoshop il faut sélectionner l'option du menu "Image\Taille de la zone de travail". Dans la boite de configuration j'indique une hauteur deux fois plus importante que celle proposée et clique sur la case du haut pour lui indiquer d'agrandir la zone vers le bas.&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/zonedetravail.gif" alt="" border="0" /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;ETAPE 4 : Application de l'effet reflet&lt;/span&gt;&lt;br /&gt;Depuis la zone de calque, click droit sur le calque du graphique puis sélectionner l'option "dupliquer calque".&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/dupliquer.gif" alt="" border="0" /&gt;Sélection du nouveau calque créer puis sélectionner dans le menu "Edition\Transformation\Symétrie axe vertical". Déplacer alors le graph retourné sous l'autre graphique.&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/move.gif" alt="" border="0" /&gt;&lt;br /&gt;Sélectionner l'option "masque de fusion" sur le calque du graphique retourné dans la boite de visualisation des calques.&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/fusion.0.gif" alt="" border="0" /&gt;&lt;br /&gt;Sélectionner l'outil de dégradé en spécifiant comme type de dégradé noir vers transparent.&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/366/1667/400/degrade.gif" alt="" border="0" /&gt;&lt;br /&gt;Appliquer le dégradé sur le graphique inversé en partant du milieu de ce graphique vers le haut du graphique.&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/366/1667/400/degradeapplique.gif" alt="" border="0" /&gt;&lt;br /&gt;Vous devriez obtenir un résultat comme celui-ci :&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/366/1667/400/degraderesult.gif" alt="" border="0" /&gt;&lt;br /&gt;Il ne reste plus qu'à règler l'opacité du calque de reflet en le baissant à 15% par exemple puis en appliquant un fond sur un nouveau calque si nécessaire.&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/transparence.gif" alt="" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Cette méthode peut bien sûr s'appliquer à tout type d'image et de texte et pas seulement de graphiques Excel.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115495753938702431?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115495753938702431/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115495753938702431' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115495753938702431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115495753938702431'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/08/graphisme-amlioration-des-graphiques.html' title='GRAPHISME - Amélioration des graphiques Excel'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115366593491662328</id><published>2006-07-26T19:19:00.000+02:00</published><updated>2006-07-26T20:11:35.303+02:00</updated><title type='text'>AJAX - Rico Accordion : Les vues catégorisées</title><content type='html'>Le classe accordion de RICO offre une solution très simple de représentation des vues catégorisées sous forme d'accordéon.&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;" src="http://photos1.blogger.com/blogger/366/1667/400/accordion.gif" border="0" alt="" /&gt;&lt;br /&gt;La structure des données à représenter doit être sous le format suivant :&lt;pre class="code"&gt;&lt;code&gt;&amp;lt;div id="un_identifiant_de_bloc_pour_rico"&amp;gt;&lt;br /&gt;&amp;lt;div&amp;gt;&lt;br /&gt;  &amp;lt;div&amp;gt;Titre de la catégorie&amp;lt;/div&amp;gt;&lt;br /&gt;  &amp;lt;div&amp;gt;Contenu du panneau&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Préparation de la vue Notes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La vue Notes pourra être définie ainsi :&lt;ul&gt;&lt;li&gt;1ère colonne : Catégorisée avec pour formule &lt;pre class="code"&gt;&lt;code&gt;"&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div&amp;gt;&amp;lt;div&amp;gt;" + champ_categorie + "&amp;lt;/div&amp;gt;";&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;colonnes suivantes : &lt;pre class="code"&gt;&lt;code&gt;"&amp;lt;span&amp;gt;" + valeur_affichée + "&amp;lt;/span&amp;gt;"&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;Le &amp;lt;span&amp;gt; permet juste de séparer les valeurs affichées dans cet exemple. On pourra le remplacer par n'importe quelle autre balise.&lt;br /&gt;Il faut aussi cocher "Traiter contenu comme code HTML" depuis le cinquième onglet des propriétés de la vue.&lt;br /&gt;&lt;br /&gt;Préparation du masque de vue&lt;br /&gt;Le masque associée à la vue précédente devra porter le nom $$ViewTemplate For nom_de_la_vue. Même si on peut coder le masque entièrement en HTML en cochant l'option Type de contenu: HTML" depuis le second onglet des propriétés du masque je vais porfiter de l'occasion pour faire sans dans cet exemple.&lt;br /&gt;&lt;br /&gt;Pour commencer il faut inclure les librairies Javascript. Celà se fait normalement entre les balese HEAD de la page HTML. L'équivalent Lotus Notes est la référence "Contenu de titre HTML" présent depuis le panneau présenté sous le masque. Il fautindiquer comme formule : &lt;pre class="code"&gt;&lt;code&gt;{&amp;lt;script src="prototype-1.4.0.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src="rico.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;}&lt;/code&gt;&lt;/pre&gt;Attention au chemin des libraires Javascript.&lt;br /&gt;&lt;br /&gt;Il faut ensuite instancier la casse accordion en lui spécifiant l'ID de l'élément à transformé. Ceci se fait généralement à l'évènement OnLoad de la page. Toujours depuis le panneau de référence présent sous le masque, il faut cliquer sur "OnLoad" et indiquer le code Javascript : &lt;pre class="code"&gt;&lt;code&gt;new Rico.Accordion( $('identifiant_bloc') );&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Enfin, dans le masque, il reste à intégrer la vue en ajoutant la déclaration du bloc accordéon comme ceci :&lt;pre class="code&amp;quot;"&gt;&lt;code&gt;&amp;lt;div id="identifiant_code"&amp;gt;&lt;br /&gt; &amp;lt;div&amp;gt;&amp;lt;div&amp;gt;&lt;br /&gt; &lt;span style="font-style: italic;"&gt;insertion de la vue intégrée ici&lt;/span&gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;Ne pas oublier de déclarer le code HTML insérer comme HTML relais en le sélectionnant puis en cliquant sur l'option du menu Texte\HTML Relais.&lt;br /&gt;&lt;br /&gt;Un &lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/waccordion"&gt;exemple en ligne&lt;/a&gt; permet de visualiser le résultat en présentant les articles de ce blog par thème. De plus vous pourrez trouver d'autres exemples de l'utilisation de cette classe sur le blog Malaisien (mais en anglais) &lt;a href="http://notesweb2.blogspot.com/"&gt;Lotus Notes on Web 2.0&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115366593491662328?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115366593491662328/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115366593491662328' title='5 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115366593491662328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115366593491662328'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/07/ajax-rico-accordion-les-vues.html' title='AJAX - Rico Accordion : Les vues catégorisées'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115356530661734107</id><published>2006-07-22T12:36:00.000+02:00</published><updated>2006-07-24T23:30:32.373+02:00</updated><title type='text'>AJAX - Rico LiveGrid : personnalisation Lotus Notes</title><content type='html'>En utilisant Firebug, on peut constater que Rico envoie une requète AJAX sous le format : data.xml?openview&amp;id=data_grid&amp;amp;page_size=70&amp;offset=149&amp;amp;sort_col=titre1&amp;sort_dir=ASC&amp;amp;_=. Il faut donc modifier le format de cette requète pour qu'elle prenne en compte les paramètres d'URL standard d'appel des vues Notes.&lt;br /&gt;&lt;br /&gt;Pour rappel ces paramètres sont :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Start : pour définir la ligne de départ. C'est l'équivalent du offset. Attention, le offset commence à 0 alors que le Start commence à 1.&lt;/li&gt;&lt;li&gt;Count : nombre de ligne à afficher. C'est l'équivalent du page_size.&lt;/li&gt;&lt;li&gt;ResortDescending=xx ou ResortAscending=xx : pour forcer un tri décroissant ou croissant sur la colonne xx. C'est l'équivalent de &amp;sort_col=titre1&amp;amp;sort_dir=ASC. Attention, Rico prend en compte le titre de la colonne alors que Notes attend le numéro de la colonne.&lt;/li&gt;&lt;/ul&gt;Pour plus d'informations sur le format d'URL de Domino, consulter la page "&lt;a href="http://www-128.ibm.com/developerworks/lotus/library/ls-Domino_URL_cheat_sheet/"&gt;Domino URL cheat sheet&lt;/a&gt;" du site IBM Lotus.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Fonction prototype object.extend&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Les paramètres de l'URL sont codés dans la fonction fetchBuffer de la classe RICO.LiveGrid dans le fichier rico.js. Ne souhaitant pas modifier le fichier rico.js j'ai préféré utiliser la fonction prototype Object.extend.&lt;br /&gt;Object.extend permet de redéfinir la fonction fetchBuffer sans avoir à toucher au fichier rico.js.&lt;br /&gt;Pour utiliser cette fonction avec Rico il faut pour le moment l'appliquer sur une instance de la classe. Ceci devrait être corrigé dans la prochaine version de prototype.&lt;br /&gt;&lt;br /&gt;Dans la pratique celà va donner :&lt;br /&gt;&lt;pre class="code"&gt;&lt;code&gt;var PobreLiveGrid = new Rico.LiveGrid ("data_grid",18, 445,&lt;br /&gt; "data.xml?openview", opts);&lt;br /&gt;Object.extend(PobreLiveGrid, {&lt;br /&gt;...&lt;br /&gt;});&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Personnalisation de RICO.LiveGrid pour Notes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Je copie le code de la fonction définie dans RICO est ne modifie que la définition de QueryString dans le cas d'un appel standard et dans le cas d'un appel avec un tri sur colonne.&lt;br /&gt;&lt;br /&gt;Le code final est :&lt;pre class="code"&gt;&lt;code&gt;Object.extend(PobreLiveGrid, {&lt;br /&gt; /**&lt;br /&gt;   * PobreLiveGrid : fetchBuffer&lt;br /&gt;   * LiveGrid pour IBM Lotus Notes/Domino&lt;br /&gt;   * -----------------------------------------------------------&lt;br /&gt;   * Modification de la création de l'URL d'appel de mise à jour&lt;br /&gt;   * des données de la table pour l'adapter aux URL de contrôle&lt;br /&gt;   * des vues Lotus Notes.&lt;br /&gt;   *&lt;br /&gt;   * page_size &amp;lt;=&amp;gt;  count&lt;br /&gt;   * offset &amp;lt;=&amp;gt;  start&lt;br /&gt;   * sortcol=x&amp;sort_dir=ASC &amp;lt;=&amp;gt; ResortAscending=x&lt;br /&gt;   * sortcol=x&amp;sort_dir=DESC &amp;lt;=&amp;gt;  ResortDescending=x&lt;br /&gt;   *&lt;br /&gt;   * -----------------------------------------------------------&lt;br /&gt;   * Special thanks to Ross Lawley on Rico Forum&lt;br /&gt;   *&lt;br /&gt;   **/&lt;br /&gt; &lt;br /&gt;   fetchBuffer: function(offset) {&lt;br /&gt;     if ( this.buffer.isInRange(offset) &amp;&amp;amp;&lt;br /&gt;            !this.buffer.isNearingLimit(offset)) {&lt;br /&gt;       return;&lt;br /&gt;     }&lt;br /&gt;     if (this.processingRequest) {&lt;br /&gt;       this.unprocessedRequest = new Rico.LiveGridRequest(offset);&lt;br /&gt;       return;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     var bufferStartPos = this.buffer.getFetchOffset(offset);&lt;br /&gt;     this.processingRequest = new Rico.LiveGridRequest(offset);&lt;br /&gt;     this.processingRequest.bufferOffset = bufferStartPos;&lt;br /&gt;     var fetchSize = this.buffer.getFetchSize(offset);&lt;br /&gt;     var partialLoaded = false;&lt;br /&gt;&lt;br /&gt;     var queryString;&lt;br /&gt;     if (this.options.requestParameters)&lt;br /&gt;       queryString = this._createQueryString(this.options.requestParameters, 0);&lt;br /&gt;&lt;br /&gt;     queryString = (queryString == null) ? '' : queryString+'&amp;';&lt;br /&gt;&lt;br /&gt;     queryString  = queryString+'id='+this.tableId+'&amp;Count='+&lt;br /&gt;       fetchSize+'&amp;amp;Start='+(bufferStartPos+1)+'&amp;offset='+bufferStartPos;&lt;br /&gt;&lt;br /&gt;     if (this.sortCol) {&lt;br /&gt;       var sortNotes =&lt;br /&gt;(this.sortDir=="ASC"?"ResortAscending":"ResortDescending");&lt;br /&gt;       queryString = queryString+'&amp;'+sortNotes+'='+escape(this.sortCol);&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     this.ajaxOptions.parameters = queryString;&lt;br /&gt;&lt;br /&gt;     $(ajax_call).innerHTML = queryString;&lt;br /&gt;     ajaxEngine.sendRequest( this.tableId + '_request', this.ajaxOptions);&lt;br /&gt;&lt;br /&gt;     this.timeoutHandler = setTimeout( this.handleTimedOut.bind(this),&lt;br /&gt;this.options.bufferTimeout);&lt;br /&gt;   }&lt;br /&gt; })&lt;/code&gt;&lt;/pre&gt;J'ai gardé la références standard de Rico offset qui sert dans le code. Celà ne pose pas de problème à Lotus Notes qui ignore ce paramètre.&lt;br /&gt;Reste tout de même un problème. Nous souhaitons récupérer le numéro de la colonne à trier et non son nom. Heaureusement LiveGrid offre une option de paraméttrage de la classe très interressante qui non seulement va permettre de règler ce dernier soucis mais en plus permet de restreindre le nombre de colonnes que l'on souhaite triable.&lt;br /&gt;&lt;br /&gt;Il faut modifier la définition de opts comme ceci :&lt;pre class="code"&gt;&lt;code&gt;var opts = {&lt;br /&gt;   prefetchBuffer: false,&lt;br /&gt;   onscroll : updateHeader,&lt;br /&gt;   sortAscendImg: 'sort_asc.gif',&lt;br /&gt;   sortDescendImg: 'sort_desc.gif',&lt;br /&gt;   columns : [["1",true],["3",true],["5",true],["7",true],["9",true]]&lt;br /&gt; };&lt;/code&gt;&lt;/pre&gt;Le paramètre columns : [["valeur de colonne",triable(vrai/faux)]] doit contenir toutes les références aux colonnes affichées. Il renvoi "valeur de colonne" comme identifiant de la colonne au lieu de son nom.&lt;br /&gt;&lt;br /&gt;Il faut faire très attention car les numéros de colonnes affichées sur la page Web ne correspondent pas obligatoirement aux numéro de colonne de la vue Lotus Notes. Ainsi dans l'exemple présenté dans l'article précédent (&lt;a href="http://dominoweb.blogspot.com/2006/07/ajax-rico-livegrid-pour-reprsenter-les.html"&gt;AJAX - Rico LiveGrid pour représenter les vues Lotus Notes&lt;/a&gt;), une colonne sur deux permettait de définir les balises HTML qui sont par la suite interprétées.&lt;br /&gt;Les colonnes contenant les valeurs, sont les colonnes impaires dans ce cas (1, 3, 5, 7, 9). C'est ce qu'il faudra renvoyer à Lotus Notes.&lt;br /&gt;&lt;br /&gt;Pour voir le code complet, je vous invite à lire le code source de l'&lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/livegrid?openpage"&gt;exemple en ligne Rico LiveGrid&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115356530661734107?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115356530661734107/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115356530661734107' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115356530661734107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115356530661734107'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/07/ajax-rico-livegrid-personnalisation.html' title='AJAX - Rico LiveGrid : personnalisation Lotus Notes'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115355772560603905</id><published>2006-07-22T10:31:00.000+02:00</published><updated>2006-07-22T11:36:12.193+02:00</updated><title type='text'>AJAX - Rico LiveGrid pour représenter les vues Lotus Notes</title><content type='html'>Il existe un nombre de plus en plus important de librairies Javascript AJAX. Après avoir beaucoup parlé de Scriptaculous, il est temps d'en présenter de nouvelles. &lt;a href="http://openrico.org/rico/home.page"&gt;RICO&lt;/a&gt;, s'appuie sur prototype.js, comme scriptaculous. Il offre la classe &lt;a href="http://openrico.org/rico/livegrid.page"&gt;LiveGrid&lt;/a&gt; qui m'a particulièrement interressé après avoir découvert le nouveau moteur de recherche de Microsoft, &lt;a href="http://www.live.com/"&gt;live.com&lt;/a&gt;. Sur ce site, la barre de navigation pour accéder aux pages a disparu. Adieu "page suivante" ou "page précédente". Les résultats de la recherche s'affichent dans une longue liste qui se charge selon la position de l'ascenceur. Hors, ce qui me dérange le plus dans la gestion des vues Notes sur le web est justement la gestion de la navigation entre pages. RICO apporterait il la solution ?&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;" src="http://photos1.blogger.com/blogger/366/1667/400/gridlive.gif" border="0" alt="Rico LiveGrid" /&gt;&lt;br /&gt;La classe LiveGrid n'est certes pas encore parfaite, cependant le résultat me semble interressant à suivre. Toutes les vues notes ne sont pas représentables sur ce type d'interface, comme les vues catégorisées. Il est à noter que les vues catégorisées ne sont de toute façon pas vraiment utilisables sur le Web en natif non plus.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Installation de la librairie RICO&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La librairie RICO ne comporte qu'un seul fichier javascript. Il faudra, par contre,&lt;br /&gt;obligatoirement installer aussi la librairie prototype.js.&lt;ol&gt;&lt;li&gt;Télécharger la librairie RICO 1.1.2 sur la &lt;a href="http://openrico.org/rico/downloads.page"&gt; page de téléchargement du site&lt;/a&gt; &lt;/li&gt;&lt;li&gt;Télécharger la librairie prototype 1.4.0 sur le &lt;a href="http://prototype.conio.net/"&gt; site de conio&lt;/a&gt; (sélectionner le lien "Just the .js, please").&lt;/li&gt;&lt;li&gt;Intégrer les deux fichiers dans les ressources de la base Lotus Notes.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;La classe Rico.LiveGrid&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pour utiliser LiveGrid, il va falloir définir une page Web appelant les librairies et initialisant un tableau permettant de représenter la vue. Ce tableau sera constitué de deux parties :&lt;ul&gt;&lt;li&gt;une entête : pour la définition des titres de colonnes&lt;/li&gt;&lt;li&gt;les données : pour bien s'afficher, les premières lignes de données doivent être initialisées dans la page. Par la suite ces données seront directement extraites d'un fichier XML.&lt;/li&gt;&lt;/ul&gt;Par rapport aux autres classes Javascript déjà présentées, l'utilisation de LiveGrid est particulièrement contraignante. J'espère que celà sera amélioré dans la version 2 de la librairie.&lt;br /&gt;Pour représenter une vue Lotus Notes avec LiveGrid, j'utilise donc une page au format HTML et une vue avec un masque associé au format XML. On pourrait aussi passer par un agent pour générer le flux XML mais, comme déjà expliqué, l'utilisation d'une vue permet d'économiser des ressources serveur.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Définition de la vue XML&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Les données transmises à la classe LiveGrid devront avoir le format XML suivant :&lt;br /&gt;&lt;pre class="code"&gt;&lt;code&gt;&amp;lt;ajax-response&amp;gt;&lt;br /&gt;  &amp;lt;response type="object" id="data_grid_updater"&amp;gt;&lt;br /&gt;    &amp;lt;rows update_ui="true"&amp;gt;&lt;br /&gt;      &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Valeur 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Valeur 2...&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;      ...&lt;br /&gt;      &amp;lt;tr&amp;gt;...&amp;lt;/tr&amp;gt;&lt;br /&gt;    &amp;lt;/rows&amp;gt;&lt;br /&gt;  &amp;lt;/response&amp;gt;&lt;br /&gt;&amp;lt;/ajax-response&amp;gt;&lt;/code&gt;&lt;/pre&gt;Pour arriver à une telle représentation j'ai définie ma vue avec les paramètres suivants ;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Nom de la vue : data.xml&lt;/span&gt;&lt;br /&gt;Traiter contenu comme code HTML depuis l'avant-dernier onglet des options de la vue.&lt;ul&gt;&lt;li&gt;Colonne 1 : "&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;"&lt;/li&gt;&lt;li&gt;Colonne 2 : Champ ou formule à représenter dans la grille&lt;/li&gt;&lt;li&gt;Colonne 3 : "&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;"&lt;/li&gt;&lt;li&gt;Colonne 4 : Champ ou formule à représenter dans la grille&lt;/li&gt;&lt;li&gt;...&lt;/li&gt;&lt;li&gt;Colonne n : "&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;"&lt;/li&gt;&lt;/ul&gt;De plus, afin de pouvoir utiliser les options de tri de la vue il faut cocher "Cliquer sur titre de colonne à trier" avec la valeur "Les deux" pour chacune des colonnes représentant des valeurs à afficher.&lt;br /&gt;&lt;br /&gt;Il faut maintenant déclarer un masque de vue associé&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Nom du masque : $$ViewTemplate For data.xml&lt;/span&gt;&lt;br /&gt;Depuis le second onglet des propriétés du masque, cocher "Type de contenu : Autre" et indiquer comme valeur : application/xml&lt;br /&gt;Le contenu du masque est :&lt;br /&gt;&lt;pre class="code"&gt;&lt;code&gt;&amp;lt;ajax-response&amp;gt;&lt;br /&gt;&amp;lt;response type="object" id="data_grid_updater"&amp;gt;&lt;br /&gt;&amp;lt;rows update_ui="true"&amp;gt;&lt;br /&gt;Ajout de la vue intégrée data.xml&lt;br /&gt;&amp;lt;/rows&amp;gt;&lt;br /&gt;&amp;lt;/response&amp;gt;&lt;br /&gt;&amp;lt;/ajax-response&amp;gt;&lt;/code&gt;&lt;/pre&gt;Le nombre de lignes affichées dans la vue intégrée n'a aucune importance. Pour tester votre nouveau fichier XML, ouvrir la vue data.xml depuis un navigateur Web. Le format XML étant très contraigant il est possible que vous ayez un message d'erreur selon le texte affiché. Il n'est pas autorisé, par exemple, d'afficher le caractère '&amp;'. Vous pouvez le supprimer ou le remplacer automatiquement, si nécessaire, à travers la formule de la colonne.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;La page Web&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;J'ai déclarer le contenu de ma page comme étant au format HTML dans les options de la page. De plus, j'ai volontairement supprimé toutes références au style dans le code fourni afin de ne pas l'allourdir. Le contenu de la page doit ressembler à celà : &lt;pre class="code"&gt;&lt;code&gt;&amp;lt;body onload="javascript:bodyOnLoad();"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;table id="data_grid_header" class="fixedTable" &lt;br /&gt;  cellspacing="0" cellpadding="0" style="width:560px"&amp;gt;&lt;br /&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;    &amp;lt;th class="first tableCellHeader"&amp;gt;Titre Colonne 1&amp;lt;/th&amp;gt;&lt;br /&gt;    &amp;lt;th class="tableCellHeader"&amp;gt;Titre Colonne 2&amp;lt;/th&amp;gt;&lt;br /&gt;    &amp;lt;th class="tableCellHeader"&amp;gt;Titre Colonne 3&amp;lt;/th&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div id="viewPort" style="float:left"&amp;gt;&lt;br /&gt;&amp;lt;table id="data_grid" class="fixedTable" &lt;br /&gt;  cellspacing="0" cellpadding="0" style="float:left;width:560px;"&amp;gt;&lt;br /&gt;  &lt;span style="font-style:italic;"&gt;On ajoute ici la vue vue intégrée data.xml&lt;/span&gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;Attention, le nombre de lignes affichées dans la vue intégrée est très important ici. Il faut que ce nombre soit un peu supérieur au nombre de lignes à affichées.&lt;br /&gt;&lt;br /&gt;Il ne reste plus qu'à déclarer l'entête du fichier HTML afin d'initialiser la LiveGrid.&lt;pre class="code"&gt;&lt;code&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Domino &amp; Web 2.0 : Rico LiveGrid&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;script src="prototype.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src="rico.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script language="javascript"&amp;gt;&lt;br /&gt;&lt;br /&gt;function bodyOnLoad(){&lt;br /&gt;  var opts = { &lt;br /&gt;    prefetchBuffer: false, &lt;br /&gt;    onscroll : updateHeader&lt;br /&gt;  };&lt;br /&gt;  new Rico.LiveGrid ("data_grid",18, 445, "data.xml?openview", opts);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function updateHeader( liveGrid, offset ) {&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;/code&gt;&lt;/pre&gt;Les options de déclarations de la LiveGrid sont : &lt;ul&gt;&lt;li&gt;"datagrid" : ID du tableau où seront représenter les valeurs&lt;/li&gt;&lt;li&gt;18 : nombre de lignes à afficher à l'écran&lt;/li&gt;&lt;li&gt;445 : nombre de lignes de la vue. Cette valeur devrait être calculée&lt;/li&gt;&lt;li&gt;"data.xml?openview" : URL du flux XML&lt;/li&gt;&lt;li&gt;opts : options complémentaires. Pour le moment celà ne sert pas&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;La page ainsi définie ne permet pas encore de trier la vue en cliquant sur une colonne ni de gérer le téléchargement des données en tâche de fond. Les paramètres d'appel de la vue XML sont codés dans la librairie rico.js. Hors ces paramètres ne correspondent évidemment pas à la syntaxe d'appel des vues Lotus Notes. Ceci sera corrigé dans le prochain article.&lt;br /&gt;&lt;br /&gt;En attendant, voici &lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/livegrid?openpage"&gt;un exemple complet en ligne&lt;/a&gt;. N'ayant pas pu tester l'application sur toutes les plateformes, merci de laisser un commentaire si vous constatez une incompatibilité.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115355772560603905?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115355772560603905/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115355772560603905' title='8 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115355772560603905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115355772560603905'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/07/ajax-rico-livegrid-pour-reprsenter-les.html' title='AJAX - Rico LiveGrid pour représenter les vues Lotus Notes'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115321485751802824</id><published>2006-07-18T11:27:00.000+02:00</published><updated>2006-07-18T14:03:02.416+02:00</updated><title type='text'>SITE - Le blog en PDF</title><content type='html'>A titre expérimental, j'ai mis à disposition un fichier PDF regroupant tous les articles liés à l'intégration des solutions Google Maps et Google Earth dans Lotus Notes/Domino.&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/acrobatreader.png" alt="" border="0" /&gt;&lt;br /&gt;Pour le moment le fichier est accessible en cliquant sur la rubrique GOOGLE API depuis le panneau de droite. Si je continue l'expérience je verrai à placer les liens de façon plus visible.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Mise à Jour :&lt;br /&gt;Le fichier PDF est maintenant réellement accessible. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115321485751802824?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115321485751802824/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115321485751802824' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115321485751802824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115321485751802824'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/07/site-le-blog-en-pdf.html' title='SITE - Le blog en PDF'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115306421269092720</id><published>2006-07-16T17:36:00.000+02:00</published><updated>2006-08-21T23:37:26.846+02:00</updated><title type='text'>AJAX - Lire un fichier en dehors du domaine</title><content type='html'>Comme précédemment indiqué, les applications AJAX ne peuvent pas accèder aux fichiers en dehors du domaine Internet de la page appelante (il est toutefois à noter que cette limitation ne semble pas toucher Microsoft Internet Explorer). La méthode préconisée pour dépasser cette limite, quelque soit le navigateur Web utilisé, est de passer par un "Cross-Domain Proxy".&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;&lt;b&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Cross-Domain Proxy&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Un "cross-domain proxy" n'est rien de plus qu'une application hébergée dans le domaine , qui va télécharger le fichier extérieur souhaité et le renvoyer vers l'application AJAX. Cette technique est notamment utilisée par &lt;a href="http://www.netvibes.com"&gt;NetVibes&lt;/a&gt;. En ouvrant NetVibes avec l'extension de Firefox &lt;a href="https://addons.mozilla.org/firefox/1843/"&gt;Firebug&lt;/a&gt;, on constate que les fils RSS de la page sont appelés à travers une URL du type : &lt;span style="font-style: italic;"&gt;http://www.netvibes.com/xmlProxy.php?url=http%3A//swww.acme.com/rss.xml&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;L'application PHP xmlProxy.php se contente de récupérer le fichier XML et de la transmettre au navigateur Web. Il ne traite pas d'informations avant expédition. Celà permet de ne pas surcharger le serveur en laissant cette tâche au poste client.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Lotus Domino Cross-Domain Proxy&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Pour faire la même chose avec Lotus Notes j'ai commencé par utiliser la méthode "ALAX" présentée dans l'article "&lt;a href="http://dominoweb.blogspot.com/2006/06/google-api-la-recherche-dinformations_11.html"&gt;La recherche d'informations sur l'Internet depuis un client Lotus Notes&lt;/a&gt;". Malheureusement il semble que la propriété responseText gère mal, voire pas du tout, les charset autres que UTF-8. Les principales sources d'informations françaises étant codées en ISO-8859-1 je ne pouvais utiliser cette méthode.&lt;br /&gt;&lt;br /&gt;J'ai donc décidé d'en profiter pour développer un agent Lotus Notes en Java.&lt;br /&gt;L'agent doit récupérer l'URL cible en argument et renvoyer le contenu de cette URL.&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/cross-domain-proxy.png" alt="cross domain proxy" border="0" /&gt;&lt;br /&gt;Le code source de l'agent est :&lt;br /&gt;&lt;pre class="code"&gt;&lt;code&gt;import lotus.domino.*;&lt;br /&gt;import java.io.*;&lt;br /&gt;import java.net.*;&lt;br /&gt;&lt;br /&gt;public class JavaAgent extends AgentBase {&lt;br /&gt;&lt;br /&gt; public void NotesMain() {&lt;br /&gt;     try {&lt;br /&gt;       Session session = getSession();&lt;br /&gt;       AgentContext agentContext = session.getAgentContext();&lt;br /&gt;&lt;br /&gt;       // Récupération de l'URL passé en argument de l'agent&lt;br /&gt;       Document doc = agentContext.getDocumentContext();&lt;br /&gt;       String newurl = doc.getItemValueString("Path_Info_Decoded");&lt;br /&gt;       newurl = newurl.substring(newurl.indexOf("url=") + 4);&lt;br /&gt;       URL url = new URL (newurl);&lt;br /&gt;   &lt;br /&gt;     // Initialisation du résultat à renvoyer&lt;br /&gt;       String result = "";&lt;br /&gt;   &lt;br /&gt;       // Les informations seront renvoyés vers le navigateur au format XML&lt;br /&gt;       PrintWriter pw = getAgentOutput();      &lt;br /&gt;       pw.println("Content-type: text/xml");&lt;br /&gt;&lt;br /&gt;     // Récupération du contenu de la page cible&lt;br /&gt;      BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));&lt;br /&gt;     String inputLine;&lt;br /&gt;     while ((inputLine = in.readLine()) != null) {&lt;br /&gt;         result += inputLine.toString();&lt;br /&gt;     }&lt;br /&gt; &lt;br /&gt;     // Envoi du résultat vers le navigateur Web&lt;br /&gt;     pw.println(result);&lt;br /&gt;     doc.recycle();&lt;br /&gt;&lt;br /&gt;     } catch(Exception e) {&lt;br /&gt;         e.printStackTrace();&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;Pour appeler l'agent il faut utiliser un URL du type : &lt;span style="font-style: italic;"&gt;http://serverlocal/path/base.nsf/agent?openagent&amp;url=http%3A//sitecible/path/fichier&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Intégration dans l'aggrégateur RSS&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;On peut très facilement intégrer cette fonctionnalité dans &lt;a href="http://dominoweb.blogspot.com/2006/07/ajax-une-page-web-personnalisable-44.html"&gt;l'aggrégateur RSS&lt;/a&gt; précédemment présenté.&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/ajaxcroosdomain.png" alt="ajax rss" border="0" /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Etape 1 : Intégration de l'agent sur une base du domaine Web. L'agent peut être déclaré dans la base elle même ou depuis n'importe quelle autre base du domaine Internet.&lt;/li&gt;&lt;li&gt;Etape 2 : Déclaration des URL d'ouverture de fil. Au lieu d'indiquer directement l'URL de la cible, on la fait précéder de l'URL de l'agent selon le format présenté. On pourra aussi prévoir un développement pour intégrer automatiquement cette syntaxe afin de simplifier la tâche de l'utilisateur.&lt;/li&gt;&lt;/ul&gt;Attention, le javascript d'interprétation des fils RSS présenté ne prend pas en charge le format ATOM pour le moment.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Mise à jour]&lt;/span&gt; Ajout de doc.recycle() suite à la remarque de Yogi, administrateur du &lt;span style="font-style: italic;"&gt;sombre&lt;/span&gt; blog &lt;a href="http://darkmag.net/darkBlog"&gt;DarkBlog&lt;/a&gt; à consulter sans hésitation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115306421269092720?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115306421269092720/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115306421269092720' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115306421269092720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115306421269092720'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/07/ajax-lire-un-fichier-en-dehors-du.html' title='AJAX - Lire un fichier en dehors du domaine'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115270539085434236</id><published>2006-07-12T13:56:00.000+02:00</published><updated>2006-07-12T20:02:04.120+02:00</updated><title type='text'>AJAX - Une page Web personnalisable (4/4) : Un peu d'interactivité</title><content type='html'>Il est temps d'ajouter un peu d'interactivité à cet aggrégateur RSS. L'utilisateur doit pouvoir ajouter un fil RSS, en supprimer, modifier ou mettre à jour le contenu du fil.&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/rss_addnew.png" alt="" border="0" /&gt;&lt;br /&gt;L'ensemble des actions doit être géré sans raffraichissement de la fenêtre afin de préserver l'aspect fluide de l'application. Les actions seront transmises via AJAX (suppression d'un fil ou actualisation) mais aussi à travers une boite de dialogue modale si une valeur doit être saisie (ajout et modification d'un fil RSS).&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;b&gt;Boite de dialogue modale&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Pour la saisie d'information je me suis basé sur la librairie Javascript de &lt;a href="http://www.subimage.com/"&gt;subimage&lt;/a&gt; que l'on peut trouver sur &lt;a href="http://www.subimage.com/sublog/subModal"&gt;cette page&lt;/a&gt;. Cette librairie a l'avantage de fonctionner sur Internet Explorer, Firefox et Opera (Je n'ai pas testé d'autres navigateurs). En plus d'être simple à intégrer dans le code je trouve de résultat visuel esthétique.&lt;br /&gt;Pour utiliser cette librairie il faut télécharger le &lt;a href="http://www.subimage.com/dhtml/subModal/subModal.zip"&gt;package&lt;/a&gt;, le décompresser puis ajouter dans la structure de la base Notes les fichiers &lt;i&gt;commons.js&lt;/i&gt;, &lt;i&gt;maskBG.png&lt;/i&gt;, &lt;i&gt;subModal.js&lt;/i&gt; et &lt;i&gt;loading.html&lt;/i&gt;, la feuille de style &lt;i&gt;subModal.css&lt;/i&gt; et enfin l'image &lt;i&gt;close.gif&lt;/i&gt;. Il est à noter que j'ai considéré &lt;i&gt;maskPG.png&lt;/i&gt; comme un fichier et non une image car Lotus Notes ne supporte pas encore l'intégration des fichiers PNG dans la librairie d'image.&lt;br /&gt;&lt;br /&gt;Pour utiliser cette librairie, il faut d'abord insérer dans l'entête HTML les fichiers javascript ainsi que la feuille de syle :&lt;br /&gt;&lt;pre class="code"&gt;&lt;code&gt;&amp;lt;head&amp;gt;&lt;br /&gt;  &amp;lt;link rel="stylesheet" type="text/css" href="subModal.css" /&amp;gt;&lt;br /&gt;  &amp;lt;script type="text/javascript" src="common.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;  &amp;lt;script type="text/javascript" src="subModal.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Puis, appeler la fonction showPopWin('URL', largeur, hauteur, fonction_javascript). Par exemple pour ouvrir la boite de dialogue depuis un lien :&lt;br /&gt;&lt;pre class="code"&gt;&lt;code&gt;&amp;lt;a href="javascript:showPopWin('RSSFeed?openform&amp;amp;action=add', 600, 400, null); "&amp;gt;&lt;br /&gt;Ajouter un fil RSS&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Pour fermer la boite de dialogue utiliser la fonction window.top.hidePopWin();&lt;br /&gt;Normalement, si l'on utilise cette dernière fonction avec l'argurment &lt;i&gt;true&lt;/i&gt;, la fonction javascript définie dans l'appel de la boite de dialogue s'éxécute.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;b&gt;Supprimer un fil RSS&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Pour supprimer un fil RSS, il faut supprimer le document dans la base puis supprimer l'élément sur la page pour ne pas avoir à raffraichir la fenêtre.&lt;br /&gt;&lt;br /&gt;Pour supprimer l'élément affiché dans la page nous allons utiliser les fonctions DOM. La fonction sera :&lt;br /&gt;&lt;pre class="code"&gt;&lt;code&gt;function deleteDiv(fieldname){&lt;br /&gt;  var obj;&lt;br /&gt;  var old;&lt;br /&gt;  if(obj = document.getElementById('NewOrder')){&lt;br /&gt;    if( old = document.getElementById(fieldname)){&lt;br /&gt;       obj.removeChild(old);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;où 'NewOrder' est l'ID de la div contenant tous les fils RSS et fieldname est l'id du bloc à supprimer dans 'NewOrder' passé en paramètre.&lt;br /&gt;&lt;br /&gt;Pour supprimer le document Notes on peut utiliser l'URL http://serveur/path/base.nsf/vue/clé?deletedocument&lt;br /&gt;Toujours pour ne pas avoir à raffraichir la fenêtre je lance cette url via Ajax. La fonction de suppression sera donc :&lt;br /&gt;&lt;pre class="code"&gt;&lt;code&gt;function deleteEntry(fieldname){&lt;br /&gt;  var myAjax = new Ajax.Request('RSSByFieldname/' + fieldname + '?deletedocument');&lt;br /&gt;  deleteDiv(fieldname)&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;où RSSByFieldname est une vue triée par 'fieldname'.&lt;br /&gt;&lt;br /&gt;Le lien permettant de demander la suppression d'un fil sera insérer dans chacun des blocs d'affichage de fil RSS dans la fonction loadRSS, présentée dans le &lt;a href="http://dominoweb.blogspot.com/2006/07/ajax-une-page-web-personnalisable-34.html"&gt;chapitre 3&lt;/a&gt;, sous la forme :&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&amp;lt;a href="javascript:deleteEntry(\'' + fieldname +'\') "&amp;gt;Supprimer&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;b&gt;Actualisation d'un fil RSS&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Pour actualiser un fil RSS il suffit de rappeler la fonction loadRSS en spécifiant le fieldname à recharger. Le lien sera lui aussi intégré au niveau de chaque bloc d'affichage de fil RSS depuis la fonction LoadRSS :&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&amp;lt;a href="javascript:loadRSS(\'' + url + '\',\'' + fieldname + '\',\''+ nbentrees + '\'); "&amp;gt;Actualiser&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;b&gt;Création et modification d'un fil RSS&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Pour des raisons de simplification du code la fonction d'ajout et de modification d'un fil RSS sera la même. Pour celà il va falloir :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;supprimer le bloc d'affichage du fil RSS s'il existe (dans le cas d'une modification)&lt;/li&gt;&lt;li&gt;créer un nouveau bloc d'affichage du fil RSS sans l'afficher&lt;/li&gt;&lt;li&gt;charger le contenu du fil RSS dans ce bloc&lt;/li&gt;&lt;li&gt;faire apparaitre le bloc&lt;/li&gt;&lt;li&gt;détruire l'objet de gestion du drag &amp;amp;amp; drop qui ne gère pas ce nouveau bloc&lt;/li&gt;&lt;li&gt;reconstruire un nouvel objet de gestion du drag &amp;amp;amp; drop&lt;/li&gt;&lt;/ol&gt;Soit la fonction :&lt;br /&gt;&lt;pre class="code"&gt;&lt;code&gt;function addEntry(url, fieldname, nbentrees){&lt;br /&gt; deleteDiv(fieldname);&lt;br /&gt;&lt;br /&gt; var newDiv = Builder.node('div',&lt;br /&gt;   {id: fieldname, className: 'rss', style: 'display:none;' });&lt;br /&gt; $('NewOrder').appendChild(newDiv);&lt;br /&gt; loadRSS(url, fieldname, nbentrees);&lt;br /&gt; Effect.Appear(newDiv.id);&lt;br /&gt; Sortable.destroy('NewOrder');&lt;br /&gt; Sortable.create('NewOrder',{tag:'div',onUpdate:updateOrder});&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;La fonction Builder.node permet de construire rapidement un nouvel objet DOM. Cette fonction est fournie dans la libraire scriptaculous.&lt;br /&gt;Effect.Appear permet de faire apparaitre le nouveau bloc avec un effet 'd'apparition progressive'. Cette fonction est aussi fournie dans la librairie scriptaculous.&lt;br /&gt;&lt;br /&gt;Il ne reste plus qu'à appeler cette fonction depuis un masque Notes affiché dans une boite de dialogue modale.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Masque de création/modification&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Le masque doit contenir les champs URL (url du fil RSS) et entrees (le nom maximum de lignes à affichier). De plus, il va aussi falloir pouvoir accèder à la valeur du champ fieldname pour le passer en paramètre de la fonction.&lt;br /&gt;&lt;br /&gt;Le problème du champ fieldname est qu'il se base sur l'UniqueID du document Notes. Hors, si celà ne pose pas de problème pour la modification de documents existants, celà est beaucoup plus génant lors de la création d'un document pour ajouter un nouveau fil RSS. L'UniqueID du Document ne sera défini qu'après enregistrement du document. Il doit exister de multiples façons de gérer ce problème.&lt;br /&gt;La solution retenue est de n'appeler la fonction de création du nouveau fil RSS que sur l'évènement &lt;i&gt;unload&lt;/i&gt; et si l'URL et un champ fielldname_tmp ayant pour valeur fieldname étaient renseignées. Je l'avoue c'est un peu tiré par les cheveux...&lt;br /&gt;Le masque est défini ainsi :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;un champ $PublicAccess : texte calculé à la création avec pour formule "1" (celà permet d'autoriser l'accès Public)&lt;/li&gt;&lt;li&gt;un champ URL : texte modifiable&lt;/li&gt;&lt;li&gt;un champ entrees : nombre modifiable&lt;/li&gt;&lt;li&gt;une déclaration HTML de champ field_tmp avec pour valeur le champ &lt;i&gt;fieldname &lt;/i&gt;de type texte calculé avec pour formule &lt;span style="color: rgb(204, 102, 0);"&gt;@If(@IsNewDoc; ""; "liste_" + @Text(@DocumentUniqueID))&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;La déclaration HTML est : &lt;span style="color: rgb(204, 102, 0);"&gt;[&amp;lt;input type="hidden" value="&amp;lt;Champ fieldname&amp;gt;" name="fieldname_tmp"&amp;gt;]&lt;/span&gt;&lt;br /&gt;On peut soit déclarer le contenu entre crochets comme ci-dessus ou déclarer la ligne en HTML relais.&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/rss_addform.png" alt="" border="0" /&gt;&lt;br /&gt;On ajoute trois boutons à ce masque&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Fermer&lt;/b&gt; (masquer si : @IsNewDoc) avec pour formule Web/Javascript :&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;window.top.hidePopWin();&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Enregistrer&lt;/b&gt; avec pour formule :&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;@Command([FileSave]);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;FIELD fieldname := "liste_" + @Text(@DocumentUniqueID);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;@Command([FileSave])&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Annuler&lt;/b&gt; avec pour formule Web/Javascript :&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;document.forms[0].fieldname_tmp.value = "";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;window.top.hidePopWin();&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Et enfin, à l'évènement unLoad du masque :&lt;br /&gt;&lt;pre class="code"&gt;&lt;code&gt;if(document.forms[0].URL.value!='' &amp; document.forms[0].fieldname_tmp.value!=''){&lt;br /&gt; window.top.hidePopWin();&lt;br /&gt; window.top.addEntry(document.forms[0].URL.value,&lt;br /&gt;   document.forms[0].fieldname_tmp.value,document.forms[0].entrees.value);&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;On peut constater que le bouton &lt;i&gt;Annuler&lt;/i&gt; vide le champ fieldname_tmp ce qui permet de ne pas exécuter l'appel à la fonction d'ajout/modification.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Téléchargement et démonstration en ligne&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/dw_ajax_rssreader.zip"&gt;Vous pouvez télécharger une base Notes&lt;/a&gt; permettant de tester toutes les fonctionnalités de cet aggrégateur RSS AJAX. La base contient en plus un module de création de flux RSS afin de pouvoir tester l'application. N'oubliez pas de signer la structure et de définir la LCA.&lt;br /&gt;&lt;br /&gt;Vous pouvez aussi tester en ligne &lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/rss?openview"&gt;ce module en version bridée&lt;/a&gt;, les actions sont visibles mais pas enregistrées dans la base. Si vous recharger la fenêtre vous reviendrez sur l'environnement de base. De plus l'ajout de nouveaux fils RSS est inactif.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115270539085434236?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115270539085434236/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115270539085434236' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115270539085434236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115270539085434236'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/07/ajax-une-page-web-personnalisable-44.html' title='AJAX - Une page Web personnalisable (4/4) : Un peu d&apos;interactivité'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115248782146327210</id><published>2006-07-10T01:03:00.000+02:00</published><updated>2006-07-10T01:41:30.623+02:00</updated><title type='text'>SITE - Nouveau design pour le Blog</title><content type='html'>Je me suis essayé à la personnalisation des modèles de Blogger. Même si c'est à la mode et que c'est très pratique pour la gestion des résolutions écran, je n'aime pas perdre inutilement la place dans des blocs de largeur fixe. Ceci est d'autant plus important lorsque le contenu présenté est volumineux comme ce blog.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Tests de compatibilité&lt;/span&gt;&lt;br /&gt;Il ne devrait pas y avoir de gros problèmes de compatibilités pour les navigateurs, J'ai testé la nouvelle interface sous Microsoft Internet Explorer 6 et 7 Beta 2, ainsi évidemment que sous Firefox 1.5.0.4 et Opera 9.0. BrowserShots ne semblant plus répondre, j'ai aussi rapidement controlé la compatibilité avec Safari sur &lt;a href="http://danvine.com/icapture/"&gt;iCapture&lt;/a&gt; et &lt;a href="http://www.snugtech.com/safaritest/"&gt;Safaritest&lt;/a&gt; ainsi que sous Konqueror, Dillo et Lynx sur le site &lt;a href="http://www.scapture.com/"&gt;Scapture&lt;/a&gt;. Ce dernier montre un résultat quelque peu tronqué.&lt;br /&gt;Si vous rencontrez un problème, n'hésitez pas à poster une remarque en indiquant votre environnement.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Nouvelles fonctionnalités&lt;/span&gt;&lt;br /&gt;Il manque deux fonctionnalités, indispensables à mes yeux, sur Blogger  :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;La recherche&lt;/li&gt;&lt;li&gt;La catégorisation des messages&lt;/li&gt;&lt;/ul&gt;Le simple tri par date peut être suffisant pour présenter des actualités mais il montre très vite ses limites dès que le contenu n'a pas de lien temporel.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;La recherche&lt;/span&gt;&lt;br /&gt;Un module de recherche est maintenant mis à disposition en haut de ce blog. Il s'agit de l'API &lt;a href="http://code.google.com/apis/ajaxsearch/"&gt;Google Ajax Search&lt;/a&gt;. C'est très simple à mettre en place et à personnaliser. De plus, la mise à jour de l'index est quasiment immédiate. Je pense que cette API doit se baser sur les résultats de &lt;a href="http://blogsearch.google.com/"&gt;Google Blog Search&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/366/1667/400/search.gif" alt="" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;La catégorisation des messages&lt;/span&gt;&lt;br /&gt;Sans aller jusqu'à implémenter un nuage de tags, je trouve interressant de pouvoir catégoriser les messages par thème. Pour pallier à ce manque, j'ai développé ce que certains pourraient appeler une "usine à gaz". Cependant, le résultat semble bien fonctionner et pour un effort minimum.&lt;br /&gt;&lt;br /&gt;Un agent LotusScript va récupérer le flux RSS du blog et en extraire le titre ainsi que le premier paragraphe. Il enregistre ces données sur la base Notes d'exemples. La catégorie est automatiquement extraite par rapport au titre. En effet, la sytaxe actuelle des titres de ce blog est &lt;span style="font-style: italic;"&gt;CATEGORIE - Titre&lt;/span&gt;. Il ne reste plus qu'à afficher la liste des catégories sur le blog par une insertion de texte via javascript. Ces catégories pointent vers une vue de la base Notes qui présente les titres et le premier pargraphe des articles d'une catégorie.&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/366/1667/400/shema_categorie.0.png" alt="" border="0" /&gt;&lt;br /&gt;Je reviendrais surement sur l'agent d'extraction qui est un exemple simple de récupération de flux RSS sous Lotus Notes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115248782146327210?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115248782146327210/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115248782146327210' title='5 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115248782146327210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115248782146327210'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/07/site-nouveau-design-pour-le-blog.html' title='SITE - Nouveau design pour le Blog'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115230988183309272</id><published>2006-07-07T23:54:00.000+02:00</published><updated>2006-07-08T00:07:20.910+02:00</updated><title type='text'>SITE - Creative Common et W3C</title><content type='html'>Comme vous aurez peut-être pu le remarquer dans la colonne de droite, les informations fournies sur ce blog et la base de démonstrations sont maintenant sous &lt;a href="http://fr.creativecommons.org/"&gt;contrat Creative Common&lt;/a&gt;. Ceci signifie en fait que vous pouvez officiellement tout faire des informations fournies sur le blog et dans la base de démonstration à la seule et unique condition de citer l'auteur. Ce n'est pas pour flater mon égo mais il semble que le contrat Français impose cette condition.&lt;br /&gt;&lt;br /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/"&gt;&lt;img alt="Creative Commons License" src="http://creativecommons.org/images/public/somerights20.fr.png" border="0" style="margin: 0px auto 10px; display: block; text-align: center;"&gt;&lt;/a&gt;&lt;br /&gt;De plus j'ai totalement redévelopper la base de démonstration. Ce n'est pas très visible mais la page d'accueil a brillament passé les tests XHTML 1.0 et CSS. Qui a dit que les serveurs Domino ne généraient pas de code propre ?&lt;span class="comment"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115230988183309272?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115230988183309272/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115230988183309272' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115230988183309272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115230988183309272'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/07/site-creative-common-et-w3c.html' title='SITE - Creative Common et W3C'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115230805949716772</id><published>2006-07-07T22:06:00.000+02:00</published><updated>2006-07-12T14:29:01.450+02:00</updated><title type='text'>AJAX - Une page Web personnalisable (3/4) : Présentation des fils RSS</title><content type='html'>Maintenant que je peux utiliser le &lt;a href="http://dominoweb.blogspot.com/2006/06/ajax-une-page-web-personnalisable-14.html"&gt;drag &amp; drop&lt;/a&gt; et produire les &lt;a href="http://dominoweb.blogspot.com/2006/07/ajax-une-page-web-personnalisable-24.html"&gt;fils RSS&lt;/a&gt;, reste à assembler les deux avec prototype, scriptaculous et un peu de DOM pour l'interprétation du fichier RSS.&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/rssdragdrop.png" alt="" border="0" /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Traitement sur le serveur ou le client ?&lt;/span&gt;&lt;br /&gt;La récupération et l'interpétation des fichiers RSS peut se faire soit sur le serveur, soit depuis le poste client. La solution exposée ici s'appuiera sur un traitement au niveau du client. Celà permet de ne pas surcharger le serveur mais entraine des contraintes fortes liées à l'AJAX. En effet, l'AJAX ne permet pas de récupérer des fichiers situés en dehors du domaine de la page appelante (sauf avec Microsoft Internet Explorer). Je présenterais surement plus tard une méthode pour pallier à ce problème mais celà déborde du cadre de cet exposé.&lt;br /&gt;&lt;br /&gt;Pour l'occasion j'ai mis à disposition trois fichiers RSS, depuis la &lt;a href="http://free.dominoserver.de/it/dominoweb.nsf"&gt;base de test&lt;/a&gt;, à partir de vues comme décrit sur le chapitre précédent. Le flux RSS du blog se base sur des données enregistrée dans la base de test et non sur les données de BlogSpot, mais là encore je reviendrai sur ce sujet dans un prochain article.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0); font-weight: bold;"&gt;Définir les fichiers RSS à récupérer&lt;/span&gt;&lt;br /&gt;Avant d'afficher les fichiers RSS il va falloir stocker la liste des URLs des fichiers RSS à afficher. Pour celà je m'appuie sur un masque Notes semblable à celui présenté lors de la présentation du Drag &amp; Drop&lt;br /&gt;J'ai besoin de trois champs :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;L'URL du fil RSS : un champ texte libre&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Le nombre d'entrée à présenter : un champ nombre ou texte libre&lt;br /&gt;&lt;/li&gt;&lt;li&gt;La position du flux dans la liste : un champ nombre calculé avec pour formule : 0&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/formrssdragdrop.gif" alt="" border="0" /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Une vue pour présenter ces fils RSS&lt;/span&gt;&lt;br /&gt;La page d'affichage des fils RSS sur le Web sera en fait une vue. Cette vue sera triée à partir du champ position. On ne souhaite pas afficher l'URL du fil mais son contenu. La seconde colonne de la vue va donc présenter un appel à une fonction javascript affichant le contenu du fil en clair soit :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;1ère colonne (trié croissant) : &lt;span style="color: rgb(204, 102, 0);"&gt;position&lt;/span&gt;&lt;/li&gt;&lt;li&gt;2de colonne : &lt;span style="color: rgb(204, 102, 0);"&gt;"&amp;lt;div id=\"liste_" + @Text(@DocumentUniqueID) + "\" class=\"rss\"&amp;gt;&amp;lt;script type=\"text/javascript\"&amp;gt;loadRSS('" + URL + "', 'liste_" + @Text(@DocumentUniqueID) + "', "+entrees+");&amp;lt;/script&amp;gt;&amp;lt;/div&amp;gt;"&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Pour rappel, la définition du &lt;span style="font-style: italic;"&gt;div&lt;/span&gt; contenant l'id du document va servir pour le drag &amp; drop. La fonction &lt;span style="font-style: italic;"&gt;loadRSS&lt;/span&gt; prend trois arguments, l'URL du fil RSS, l'ID du &lt;span style="font-style: italic;"&gt;div&lt;/span&gt; où afficher le résultat et enfin le nombre d'entrée à afficher. La vue doit être définie avec l'option "Traiter contenu comme du code HTML" accessible depuis le troisième onglet des propriétés de la vue.  La déclaration des fonctions ainsi que la gestion du drag &amp; drop seront définis dans le masque associée à cette vue.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Un masque pour présenter la vue&lt;/span&gt;&lt;br /&gt;Le masque doit porter le nom &lt;span style="font-style: italic;"&gt;$$ViewTemplate for MaVueRSS &lt;/span&gt;où &lt;span style="font-style: italic;"&gt;MaVueRSS &lt;/span&gt;est le nom de la vue créée précédemment. Pour de simples raisons de simplification de présentation du code je vais définir ce masque avec l'option &lt;span style="font-style: italic;"&gt;type de contenu : HTML&lt;/span&gt; accessible depuis le second onglet des options du masque.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Gestion du drag &amp; drop&lt;/span&gt;&lt;br /&gt;Comme vue lors du premier article de cet exposé, la gestion du drag &amp;amp; drop avec Scriptaculous est vraiment très simple.&lt;br /&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); font-size: 10px; background-color: rgb(253, 249, 245); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono;"&gt;&lt;pre&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;script src="scriptaculous/lib/prototype.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src="scriptaculous/src/scriptaculous.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div id="NewOrder"&amp;gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;VUE INTEGREE&lt;/span&gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt; Sortable.create('NewOrder', {tag:'div'});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;/pre&gt;&lt;/div&gt;Par rapport au premier article on peut noter l'option {tag:'div'} qui permet de définir que le drag &amp; drop ne s'applique pas à une balise &amp;lt;li&amp;gt; comme par défaut mais à une balise &amp;lt;div&amp;gt; comme défini dans la vue.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Récupération du fil RSS&lt;/span&gt;&lt;br /&gt;L'utilisation de protoype simplifie l'appel AJAX pour récupérer le fil RSS :&lt;br /&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); font-size: 10px; background-color: rgb(253, 249, 245); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono;"&gt;&lt;pre&gt;function loadRSS(url, fieldname, nbentrees)&lt;br /&gt;{&lt;br /&gt;var myAjax = new Ajax.Request (&lt;br /&gt;url,&lt;br /&gt;{&lt;br /&gt; method : 'get',&lt;br /&gt;});&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Interprétation du fil RSS&lt;/span&gt;&lt;br /&gt;La fonction d'interprétation du fil RSS doit être appelée lorsque le fichier a été récupéré, soit à l'évènement onComplete. La fonction reçoit automatiquement en paramètre le résultat de la requète : &lt;span style="font-style: italic;"&gt;originalRequest&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Un fichier RSS est un fichier XML, comme pour &lt;a href="http://dominoweb.blogspot.com/2006/06/google-api-lotus-notes-et-google-maps.html"&gt;Google Maps&lt;/a&gt;. L'avantage de ne pas pouvoir sortir du domaine est que l'on peut maitriser la syntaxe de ce format et ainsi simplifier énormément le code. Un exemple de code Javascript permettant de récupérer les informations à afficher est :&lt;br /&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); font-size: 10px; background-color: rgb(253, 249, 245); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono;"&gt;&lt;pre&gt;function loadRSS(url, fieldname, nbentrees)&lt;br /&gt;{&lt;br /&gt;var myAjax = new Ajax.Request (&lt;br /&gt;url,&lt;br /&gt;{&lt;br /&gt;method : 'get',&lt;br /&gt;onComplete : function(originalRequest){&lt;br /&gt; items = originalRequest.responseXML;&lt;br /&gt; if(parseInt(nbentrees)==0) nbentrees='5';&lt;br /&gt; var items_count =&lt;br /&gt;  (parseInt(nbentrees)&amp;lt;items.getElementsByTagName('item').length)?&lt;br /&gt;   parseInt(nbentrees):items.getElementsByTagName('item').length;&lt;br /&gt;&lt;br /&gt; for(var i=0; i&amp;lt;items_count; i++) {&lt;br /&gt;  root_node = items.getElementsByTagName('item')[i];&lt;br /&gt;  titre =&lt;br /&gt;   root_node.getElementsByTagName('title')[0].firstChild.data;&lt;br /&gt;  lien =&lt;br /&gt;   root_node.getElementsByTagName('link')[0].firstChild.data;&lt;br /&gt;  publication =&lt;br /&gt;   root_node.getElementsByTagName('pubDate')[0].firstChild.data;&lt;br /&gt;  auteur =&lt;br /&gt;   root_node.getElementsByTagName('author')[0].firstChild.data;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;});&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;N'étant pas expert Javascript, j'accepte volontiers tous commentaires pour optimiser ce code.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Affichage du résultat &lt;/span&gt;&lt;br /&gt;Pour afficher le résultat dans le &amp;lt;div&amp;gt; j'utilise l'une des plus indispensables fonctions de prototype à mon goût : $('&lt;span style="font-style: italic;"&gt;id&lt;/span&gt;').&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$('id')&lt;/span&gt; permet tout simplement de récupérer l'élément d'id 'id'. Dans le cas présenter, &lt;span style="font-style: italic;"&gt;'id'&lt;/span&gt; vaut &lt;span style="font-style: italic;"&gt;fieldname&lt;/span&gt;. Pour intégrer du code HTML dans le &lt;span style="font-style: italic;"&gt;div&lt;/span&gt; je vais utiliser &lt;span style="font-style: italic;"&gt;innerHTML&lt;/span&gt;. Le code final de la fonction est donc :&lt;br /&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); font-size: 10px; background-color: rgb(253, 249, 245); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono;"&gt;&lt;pre&gt;function loadRSS(url, fieldname, nbentrees)&lt;br /&gt;{&lt;br /&gt;var myAjax = new Ajax.Request (&lt;br /&gt;url,&lt;br /&gt;{&lt;br /&gt; method : 'get',&lt;br /&gt; onComplete : function(originalRequest){&lt;br /&gt;  items = originalRequest.responseXML;&lt;br /&gt;  if(parseInt(nbentrees)==0) nbentrees='5';&lt;br /&gt;  var  items_count =&lt;br /&gt;  (parseInt(nbentrees)&amp;lt;items.getElementsByTagName('item').length)?&lt;br /&gt;   parseInt(nbentrees):items.getElementsByTagName('item').length;&lt;br /&gt;&lt;br /&gt;  var feed='&amp;lt;h1&amp;gt;' +&lt;br /&gt;   items.getElementsByTagName('title')[0].firstChild.data + '&amp;lt;/h1&amp;gt;';&lt;br /&gt;&lt;br /&gt;  for(var i=0; i&amp;lt;items_count; i++) {&lt;br /&gt;   root_node = items.getElementsByTagName('item')[i];&lt;br /&gt;   titre =&lt;br /&gt;    root_node.getElementsByTagName('title')[0].firstChild.data;&lt;br /&gt;   lien =&lt;br /&gt;    root_node.getElementsByTagName('link')[0].firstChild.data;&lt;br /&gt;   publication =&lt;br /&gt;    root_node.getElementsByTagName('pubDate')[0].firstChild.data;&lt;br /&gt;   auteur =&lt;br /&gt;    root_node.getElementsByTagName('author')[0].firstChild.data;&lt;br /&gt;&lt;br /&gt;   feed += '&amp;lt;h2&amp;gt;&amp;lt;a href='+lien + '&amp;gt;' + titre +&lt;br /&gt;    '&amp;lt;/a&amp;gt;&amp;lt;/h2&amp;gt;&amp;lt;h3&amp;gt;' + auteur + ', ' +&lt;br /&gt;    publication + '&amp;lt;/h3&amp;gt;';&lt;br /&gt;  }&lt;br /&gt; $(fieldname).innerHTML = feed;&lt;br /&gt; }&lt;br /&gt;});&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;En ajoutant quelques lignes de style CSS on arrive au résultat présenté sur la &lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/RSSlight?openview"&gt;base de démonstration&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115230805949716772?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115230805949716772/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115230805949716772' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115230805949716772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115230805949716772'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/07/ajax-une-page-web-personnalisable-34.html' title='AJAX - Une page Web personnalisable (3/4) : Présentation des fils RSS'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115209879473702090</id><published>2006-07-05T13:11:00.000+02:00</published><updated>2006-07-06T11:55:28.636+02:00</updated><title type='text'>AJAX - Autocompletion V3 : Champ multivalué</title><content type='html'>En fouillant un peu dans les options de Autocompleter, j'ai découvert l'option "&lt;span style="font-style: italic;"&gt;tokens&lt;/span&gt;" qui permet de définir un séparateur de valeur. Ceci permet alors de gérer une recherche sur un champ multivalué Lotus Notes.&lt;br /&gt;&lt;br /&gt;Les seules choses à modifier pour gérer la recherche sur un champ multivalué sont :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Déclarer le champs Notes avec l'option "&lt;span style="font-style: italic;"&gt;Autoriser valeurs multiples&lt;/span&gt;"&lt;/li&gt;&lt;li&gt;Dans la vue de recherche, spécifier dans la colonne affichant les noms d'"&lt;span style="font-style: italic;"&gt;Afficher valeurs multiples comme entrées distinctes&lt;/span&gt;"&lt;/li&gt;&lt;li&gt;Modifier le l'appel à Autocompleter en ajoution l'option tokens :&lt;pre&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;new Ajax.Autocompleter("autocomplete", &lt;br/&gt;"autocomplete_choices",&lt;br/&gt;"scriptaculous?createdocument", &lt;span style="font-weight: bold;"&gt;{&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;tokens:','&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;}&lt;/span&gt;);&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;Dans cette configuration j'ai défini la virgule comme séparateur de valeurs. On spécifier d'autres caractères. Pour plus d'informations consulter l'&lt;a href="http://wiki.script.aculo.us/scriptaculous/show/Autocompleter.Base"&gt;aide de script.aculo.us&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/automulti.png" alt="" border="0" /&gt;&lt;br /&gt;Pour tester l'&lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/autocompletewithoutls?openform"&gt;autocompletion sur champ multivalué&lt;/a&gt;, c'est toujours sur la même page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115209879473702090?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115209879473702090/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115209879473702090' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115209879473702090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115209879473702090'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/07/ajax-autocompletion-v3-champ-multivalu.html' title='AJAX - Autocompletion V3 : Champ multivalué'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115197473621455213</id><published>2006-07-04T01:59:00.000+02:00</published><updated>2006-07-06T11:30:16.896+02:00</updated><title type='text'>AJAX - Autocompletion V2 (sans LotusScript)</title><content type='html'>La base Notes d'exemple  en ligne &lt;a href="http://free.dominoserver.de/it/dominoweb.nsf"&gt;Domino &amp; Web 2.0&lt;/a&gt; est hébergée gratuitement chez &lt;a href="http://free.dominoserver.de"&gt;Domino Server&lt;/a&gt;. Malheureusement, la gratuité de ce service a ses limites. L'une des plus importantes est l'impossibilité d'utiliser des agents LotusScript et Java dans les applications. A l'époque de la présentation de l'&lt;a href="http://dominoweb.blogspot.com/2006/06/ajax-autocompletion.html"&gt;autocompletion avec script.aculo.us&lt;/a&gt; je n'avais pas pu mettre d'exemple en ligne utilisant un agent LotusScript.&lt;br /&gt;&lt;br /&gt;C'est chose maintenant corrigé ! J'ai fini par trouver une méthode simple n'utilisant qu'un masque et un peu de Formula. Cette solution est d'autant plus interressante qu'elle demande moins de ressources au serveur et qu'en plus elle demande l'utilisation de ressources Lotus Notes standards mais peu utilisées (champs spéciaux et format d'URL).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Nouvelle méthode utilisée&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Récupération de la valeur envoyée&lt;/span&gt;&lt;br /&gt;La première difficulté à relever est la récupération des arguments de la requète AJAX. Les premiers caractères saisis sont en effet envoyés par défaut sous forme de formulaire encodé. La seule variable CGI permettant de récupérer ces valeurs est "Request_Content" qui ne peut être qu'être exploité dans un agent. L'autre moyen est de tout simplement créer un nouveau document à partir des informations de ce formulaire. Ceci est possible sous Notes en utilisant un masque comportant les champs définis dans ce formulaire est en utilisant une url du type "&lt;span style="font-weight: bold;"&gt;mon_masque?createdocument&lt;/span&gt;" (et non ?openform).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Empêcher l'enregistrement du document de traitement&lt;/span&gt;&lt;br /&gt;Un document sera créé à chaque appel, soit après chaque lettre saisie dans le champ de recherche. Il faut donc éviter d'enregistrer le document dans la base. Pour celà, une solution simple, l'utilisation du champ spécial &lt;span style="font-weight: bold;"&gt;$$SaveOptions&lt;/span&gt; avec la valeur "0".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Autoriser l'accès aux anonymes&lt;/span&gt;&lt;br /&gt;Dans mon cas, je souhaite aussi que tout le monde, même un anonyme puisse rechercher un mot. Il faut donc déclarer le nouveau masque avec un champ &lt;span style="font-weight: bold;"&gt;$PublicAccess&lt;/span&gt; de type calculé à la création avec comme valeur "1" et cocher la case "Accessible aux utilisateurs ayant l'accès public" dans les options de sécurité du masque (dernier onglet des propriétés du masque).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Calculer et renvoyer le résultat à script.aculo.us&lt;/span&gt;&lt;br /&gt;Enfin, on souhaite en retour la liste des mots commençant par les lettres saisies. Pour celà il suffit de calculer et afficher le résultat souhaité dans un champ spécial Notes &lt;span style="font-weight: bold;"&gt;$$Return&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Pour récupérer les documents commençant par les lettres saisies, j'utilise une nouvelle option du @dblookup, "&lt;span style="font-weight: bold;"&gt;[PartialMatch]&lt;/span&gt;". D'après l'aide Lotus Notes, l'utilisation de cette option renvoie une correspondance si la clé correspond aux premiers caractères de la valeur de colonne.&lt;br /&gt;Le résultat doit être sous le format :&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&amp;lt;li&amp;gt;valeur 1&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&amp;lt;li&amp;gt;valeur 2&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;br /&gt;La formule du champ $Return sera donc :&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;val := @DbLookup("":"nocache"; "";"dbsearch"; autocomplete; 1; [PartialMatch] );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;@If(@IsError(val); ""; "&amp;lt;ul&amp;gt;" + @Implode("&amp;lt;li&amp;gt;" + val + "&amp;lt;/li&amp;gt;") + "&amp;lt;/ul&amp;gt;")&lt;/span&gt;&lt;br /&gt;avec &lt;span style="font-style: italic;"&gt;dbsearch&lt;/span&gt;, ma vue de recherche et &lt;span style="font-style: italic;"&gt;autocomplete&lt;/span&gt; le champ contenant les valeurs saisies dans la boite de recherche.&lt;br /&gt;&lt;br /&gt;Voici à quoi ressemble mon masque nommé "scriptaculous" :&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/formautocomplete.png" alt="" border="0" /&gt;Depuis le formulaire d'utilisation de script.aculo.us décrit dans l'article précédent il suffit de modifié l'appel Javascript vers la page de recherche :&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;new Ajax.Autocompleter("autocomplete", "autocomplete_choices",&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;"&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;search?openagent&lt;/span&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;", {});&lt;/span&gt;&lt;br /&gt;devient&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;new Ajax.Autocompleter("autocomplete", "autocomplete_choices",&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;"&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;scriptaculous?createdocument&lt;/span&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;", {});&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;Le résultat de l'&lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/autocompletewithoutls?openform"&gt;implémentation de l'autocomplete de script.aculo.us&lt;/a&gt; maintenant utilisable en ligne.&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/scriptaculous_autocomplete.png" alt="" border="0" /&gt;&lt;br /&gt;Il est possible d'ajouter de nouvelles valeurs dans la base mais n'en abusez pas :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115197473621455213?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115197473621455213/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115197473621455213' title='7 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115197473621455213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115197473621455213'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/07/ajax-autocompletion-v2-sans.html' title='AJAX - Autocompletion V2 (sans LotusScript)'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115191869899745970</id><published>2006-07-03T10:38:00.000+02:00</published><updated>2006-07-06T11:29:49.740+02:00</updated><title type='text'>AJAX - Une page Web personnalisable (2/4) : Fil RSS Notes</title><content type='html'>Afin de mettre à disposition des nouveautés diffusées sur les différentes bases Lotus Notes de l'entreprise je vais utiliser des fils RSS. Celà permettra d'avoir une solution "standard" adaptée pour fes flux internes comme pour les flux externes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Le Format RSS&lt;/span&gt;&lt;br /&gt;Lors de la préparation de cet exposé j'ai ouvert quatre flux RSS que je suis régulièrement et surprise, aucun des quatre n'avait une structure identique ! Entre le format ATOM, RSS 0.91, etc. Il existerait sept format d'après &lt;a href="http://fr.wikipedia.org/wiki/Rich_Site_Summary"&gt;Wikipedia&lt;/a&gt;.&lt;br /&gt;Heureusement la structure générale est commune :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Une entête décrivant le flux&lt;/li&gt;&lt;li&gt;Une entrée par article à présentée&lt;/li&gt;&lt;li&gt;Chaque entrée est décrite par au moins un titre, un lien et une date de publication. Par contre le résumé de l'article n'est pas toujours disponible (voir le flux RSS de ce site par exemple).&lt;/li&gt;&lt;/ul&gt;Pour le flux RSS de mes bases Lotus Notes je vais me baser le format &lt;a href="http://www.stervinou.com/projets/rss/"&gt;RSS2&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Description rapide du format RSS2&lt;/span&gt;&lt;br /&gt;Pour décrire le contenu de mes bases Notes je vais présenter les informations suivantes :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Titre de la base&lt;/li&gt;&lt;li&gt;Lien vers la base&lt;/li&gt;&lt;li&gt;Description de la base&lt;/li&gt;&lt;li&gt;Langue&lt;/li&gt;&lt;li&gt;Titre de chacun des documents diffusés&lt;/li&gt;&lt;li&gt;Date de dernière modification de ces documents&lt;/li&gt;&lt;li&gt;Lien vers ces document&lt;/li&gt;&lt;li&gt;Auteur de ces documents&lt;/li&gt;&lt;/ul&gt;Soit un fichier RSS2 :&lt;br /&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); font-size: 10px; background-color: rgb(253, 249, 245); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono;"&gt;&lt;pre style=""&gt;&amp;lt;rss version="2.0"&amp;gt;&lt;br /&gt;&amp;lt;channel&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;&lt;br /&gt;Nom de la base&lt;br /&gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;link&amp;gt;&lt;br /&gt;Lien vers la base&lt;br /&gt;&amp;lt;/link&amp;gt;&lt;br /&gt;&amp;lt;description&amp;gt;&lt;br /&gt;Description de la base&lt;br /&gt;&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;lt;item&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;&lt;br /&gt;  Titre du document&lt;br /&gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;author&amp;gt;&lt;br /&gt;  Auteur du document&lt;br /&gt;&amp;lt;/author&amp;gt;&lt;br /&gt;&amp;lt;pubDate&amp;gt;&lt;br /&gt;  Dernière date de modification&lt;br /&gt;&amp;lt;/pubDate&amp;gt;&lt;br /&gt;&amp;lt;link&amp;gt;&lt;br /&gt;  Lien vers le document&lt;br /&gt;&amp;lt;/link&amp;gt;&lt;br /&gt;&amp;lt;description&amp;gt;&lt;br /&gt;  Résumé du document&lt;br /&gt;&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;lt;/item&amp;gt;&lt;br /&gt;&amp;lt;item&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/item&amp;gt;&lt;br /&gt;&amp;lt;/channel&amp;gt;&lt;br /&gt;&amp;lt;/rss&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Mettre à disposition un flux RSS dans Lotus Notes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pour générer ce flux depuis une base Lotus Notes, on peut soit s'puyer sur un agent, soit sur une vue (comme pour le &lt;a href="http://dominoweb.blogspot.com/2006/06/lotus-notes-et-google-earth.html"&gt;KML&lt;/a&gt; ou le &lt;a href="http://dominoweb.blogspot.com/2006/06/lotus-notes-et-google-maps.html"&gt;XML de Google Maps&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;L'agent sera du type :&lt;br /&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); font-size: 10px; background-color: rgb(253, 249, 245); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono;"&gt;&lt;pre style=""&gt;dim s as New NotesSession&lt;br /&gt;dim db as NotesDatabase&lt;br /&gt;dim view as NotesView&lt;br /&gt;dim document as NotesDocument&lt;br /&gt;&lt;br /&gt;set db = s .CurrentDatabase&lt;br /&gt;set view = db.GetView("Vue présentant tous les documents à diffuser")&lt;br /&gt;print "Content-Type:text/xml"&lt;br /&gt;print "&amp;lt;rss version="2.0"&amp;gt;"&lt;br /&gt;print "&amp;lt;channel&amp;gt;"&lt;br /&gt;print "&amp;lt;title&amp;gt;" + db.Name + "&amp;lt;/title&amp;gt;"&lt;br /&gt;...&lt;br /&gt;set document = view.GetFirstDocument&lt;br /&gt;While not (document is nothing)&lt;br /&gt;print "&amp;lt;item&amp;gt;"&lt;br /&gt;print "&amp;lt;title&amp;gt;" + document.Subject(0) + "&amp;lt;/title&amp;gt;"&lt;br /&gt;...&lt;br /&gt;print "&amp;lt;/item&amp;gt;"&lt;br /&gt;set document = view.GetNextDocument(document)&lt;br /&gt;Wend&lt;br /&gt;print "&amp;lt;/channel&amp;gt;"&lt;br /&gt;print "&amp;lt;/rss&amp;gt;"&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Attention aux accents et caractères spéciaux. De plus, si l'agent peut parraitre plus "propre", l'utilisation de vues avec masque de vue a l'immense avantage de ne demander quasiment aucune ressources serveur au contraire d'un agent LotusScript.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;RSS, aggrégateurs et authentification&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La méthode d'authentification par session de Lotus Notes ne permet pas l'utilisation d'aggrégateurs standards pour consulter les flux des bases Notes en accès restreint. Jake Howlett,  auteur de l'indispensable site &lt;a href="http://www.codestore.net/store.nsf/"&gt;CodeStore&lt;/a&gt;, propose une &lt;a href="http://www.codestore.net/store.nsf/unid/BLOG-20060317?OpenDocument"&gt;méthode&lt;/a&gt; permettant de contourner ce problème si l'on souhaite absolument garder le mode Session de Lotus Notes (principalement pour le Single Signon).&lt;br /&gt;&lt;br /&gt;L'autre solution est de lire ces flux depuis un aggrégateur RSS Web mis à disposition sur un serveur Notes interne. L'utilisateur s'authentifiant pour accèder à cet aggrégateur, les flux RSS sont alors accessibles sans avoir à s'authentifier de nouveau. La création de ce lecteur RSS sera le but du prochain article...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115191869899745970?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115191869899745970/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115191869899745970' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115191869899745970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115191869899745970'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/07/ajax-une-page-web-personnalisable-24.html' title='AJAX - Une page Web personnalisable (2/4) : Fil RSS Notes'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115126467795257070</id><published>2006-06-25T21:23:00.000+02:00</published><updated>2006-07-06T11:29:17.680+02:00</updated><title type='text'>ASTUCE - Exporter des données Web vers Excel</title><content type='html'>Afin d'exporter facilement des données d'un site Web vers Excel on peut utiliser le format CSV. On trouve notament cette option sur tous les sites de statistiques Web.&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/csv.gif" alt="" border="0" /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Description du format CSV&lt;/span&gt;&lt;br /&gt;Le format CSV est un fichier texte où les valeurs sont séparées spar des virgules ou des points virgule. Chaque ligne est séparée par un retour chariot. Bref, un format très simple. Un exemple de fichier CSV :&lt;br /&gt;&lt;blockquote&gt;Nom;Janvier;Février;Mars&lt;br /&gt;Anatole;12;13;14&lt;br /&gt;Béatrice;7;15;14&lt;br /&gt;Charles;9;12;15&lt;/blockquote&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Intégration dans Lotus Notes pour mise à disposition sur le Web&lt;/span&gt;&lt;br /&gt;On peut s'appuyer sur vue pour générer le fichier CSV à partir des données stockées dans la base Lotus Notes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Création de la vue "statistiques.csv"&lt;/span&gt;&lt;br /&gt;Pour la création de la vue Notes, je crée une colonne ne contenant que ";" pour séparer les valeurs puis une colonne avec la formule @char(13) + @char(10) pour forcer le retour chariot à la fin de chaque ligne. Il ne reste plus qu'à indiquer de "Traiter le contenu comme du code HTML" depuis l'avant dernier onglet des options de vue.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Création du masque "$$ViewTemplate for statistiques.csv"&lt;/span&gt;&lt;br /&gt;On intègre la vue dans un masque nommé $ViewTemplate for &lt;span style="font-style: italic;"&gt;nom de la vue&lt;/span&gt;. On décoche l'option d'affichage des entêtes dans les options de la vue intégrée et on indique que l'on veut l'afficher au format HTML. Si je n'affiche pas l'entête c'est que je ne sais pas &lt;span style="font-style: italic;"&gt;proprement&lt;/span&gt; forcer un retour chariot dans les entêtes.&lt;br /&gt;&lt;br /&gt;On veut que lorsqu'on ouvre la vue, elle ne s'affiche pas dans le navigateur Web mais dans Excel. Pour celà, rien de plus simple, il suffit de changer le MIME-Type de la page. Le MIME-Type permet d'indiquer au navigateur Web le type de contenu téléchargé et donc de l'orienter vers le logiciel à ouvrir pour afficher le contenu. Dans notre cas, le MIME-Type est : text/csv.&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/mimecsv.gif" alt="" border="0" /&gt;Pour modifier le MIME-Type, on ouvre les propriétés du masque, depuis le second onglet on coche "Autre" comme "type de contenu" et on indique text/csv dans le champ de saisie.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/statistiques.csv"&gt;Un exemple&lt;/a&gt; basé sur les données présentées pour l'&lt;a href="http://dominoweb.blogspot.com/2006/06/css-graphiques-barres-horizontales-et.html"&gt;affichage de graphiques grace au CSS&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115126467795257070?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115126467795257070/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115126467795257070' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115126467795257070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115126467795257070'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/06/astuce-exporter-des-donnes-web-vers.html' title='ASTUCE - Exporter des données Web vers Excel'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115109052081339120</id><published>2006-06-23T21:18:00.000+02:00</published><updated>2006-07-06T11:28:59.336+02:00</updated><title type='text'>AJAX - Une page Web personnalisable (1/4)</title><content type='html'>A l'instar des grands portails personnalisable comme &lt;a href="http://www.netvibes.com"&gt;Netvibes&lt;/a&gt;, &lt;a href="http://my.yahoo.com"&gt;Mon Yahoo!&lt;/a&gt; ou&lt;a href="http://www.google.fr/ig?hl=fr"&gt; Google&lt;/a&gt;, le but de ce nouveau thème est de présenter les bases à la création de pages personnalisables par les utilisateurs.&lt;br /&gt;&lt;br /&gt;Les fonctionnalités présentées permettront aux utilisateurs :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;d' organiser la position des blocs d'information&lt;/li&gt;&lt;li&gt;d'intégrer des données de flux RSS externes et internes&lt;/li&gt;&lt;li&gt;d'intégrer d'autres sources d'information&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Le quatrième volet de cette série présentera une application complète.&lt;br /&gt;Pour l'intégration de la bibliothèque script.aculo.us je vous invite à lire l'&lt;a href="http://dominoweb.blogspot.com/2006/06/ajax-autocompletion.html"&gt;article sur la mise en place de l'autocompletion&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;1. Gestion du Drag &amp; Drop pour modifier la position d'éléments&lt;/span&gt;&lt;br /&gt;Sript.aculo.us offre des fonctionnalités DHTML très simple à implémenter. La classe "Sortable" permet de gérer le drag &amp;amp; drop pour modifier la position d'éléments sur la page.&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/dragdrop.gif" alt="" border="0" /&gt;&lt;br /&gt;Soit une liste d'id "NewOrder" : &lt;span style="color: rgb(204, 102, 0);"&gt;&amp;lt;ul id="NewOrder"&amp;gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;br /&gt;Chaque ligne de cette liste va porter un id unique afin de pouvoir l'identifier plus tard :&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&amp;lt;li id="liste_1"&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&amp;lt;li id="liste_2"&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;br /&gt;On peut alors appliquer la classe "Sortable" à cette liste : &lt;span style="color: rgb(204, 102, 0);"&gt;Sortable.create('NewOrder', '');&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ce qui donne au final :&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&amp;lt;script src="scriptaculous/lib/prototype.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt; &amp;lt;script src="scriptaculous/src/scriptaculous.js&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&amp;lt;ul id="NewOrder"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&amp;lt;li id="liste_1"&amp;gt;Un premier élément&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&amp;lt;li id="liste_2"&amp;gt;Un second élément&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Sortable.create('NewOrder', '');&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&amp;lt;/bodyd&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;C'est tout, voir l'&lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/listorder"&gt;exemple en ligne&lt;/a&gt;.&lt;br /&gt;Attention ! La nouvelle position n'est pas enregistrée. Ainsi, si l'on recharge la page on retrouvera la position d'origine des éléments.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0); font-weight: bold;"&gt;2. Enregistrement de la nouvelle position&lt;/span&gt;&lt;br /&gt;Afin de préparer les exposés suivants je vais commencer par modifier la structure de la base en basant la définition des éléments de liste par rapport à une vue. Chaque ligne de la liste sera un document de la vue. Ces documents permettront de définir plus tard le contenu de chaques blocs.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Création d'un masque&lt;/span&gt;&lt;br /&gt;Le masque doit contenir au moins deux éléments :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;un champ "titre" qui sera présenter comme contenu de l'élément de liste&lt;/li&gt;&lt;li&gt;un champ "position" enregistrant la position du document dans la vue&lt;/li&gt;&lt;/ul&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/dragdropform.gif" alt="" border="0" /&gt;&lt;span style="font-weight: bold;"&gt;Création d'un vue&lt;/span&gt;&lt;br /&gt;La vue "liste" va contenir deux colonnes&lt;br /&gt;&lt;ul&gt;&lt;li&gt;1ère colonne, triée par ordre croissant : &lt;span style="color: rgb(204, 102, 0);"&gt;position&lt;/span&gt;&lt;/li&gt;&lt;li&gt;2nde colonne, &lt;span style="color: rgb(204, 102, 0);"&gt;"&amp;lt;li id=\"liste_" + @text(@documentuniqueid) + "\"&amp;gt;" + titre + "&amp;lt;/li&amp;gt;"&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Comme indiqué précédemment, chaque ligne doit porter un numéro unique afin de pouvoir l'identifier. Je me base donc sur l'ID unique du document représenté.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Création d'un masque de personnalisation de vue&lt;/span&gt;&lt;br /&gt;On peut maintenant créer le masque "$viewtemplate for liste". Ce masque sera de type HTML.&lt;br /&gt;&lt;div face="Lucida,Courier,MS Courier New,Prestige,Everson Mono" size="10px" style="border: 1px dotted rgb(204, 102, 0); background-color: rgb(253, 249, 245);"&gt;&lt;pre style=""&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;br /&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&amp;gt;&lt;br /&gt;&amp;lt;script src="scriptaculous/lib/prototype.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src="scriptaculous/src/scriptaculous.js&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;function updateOrder(){&lt;br /&gt; var pars = Sortable.serialize('NewOrder');&lt;br /&gt; var myAjax = new Ajax.Request('updateagent?Openagent',&lt;br /&gt;  {parameters:pars});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;form action="UpdateOrder?CreateDocument" method="post"&amp;gt;&lt;br /&gt;&amp;lt;ul id="NewOrder"&amp;gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Intégration d'une vue intégrée&lt;/span&gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt; Sortable.create('NewOrder', &lt;span style="font-weight: bold;"&gt;{onUpdate:updateOrder}&lt;/span&gt;);&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;On a ajouté une fonction javascript qui va appeler un agent Notes "updateagent" en AJAX et on a déclarer un appel à cette fonction lors de l'évènement "onUpdate", lorsque la liste est modifiée. L'agent sera appelé en lui passant comme paramètre la liste des numéros unique de ligne selon leur nouvel ordre.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Création de l'agent d'enregistrement de la nouvelle position&lt;/span&gt;&lt;br /&gt;L'agent recevant un liste d'id unique de document, il n'a qu'à ouvrir ces documents selon l'ordre de la liste envoyée et de les renuméroter. Avant de modifier le document, on vérifiera qu'il n'est pas déjà bien positionner. Inutile de modifier des documents si celà n'est pas nécessaire.&lt;br /&gt;&lt;br /&gt;Le code de l'agent Lotuscript "updateagent" sera :&lt;br /&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); font-size: 10px; background-color: rgb(253, 249, 245); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono;"&gt;&lt;pre style=""&gt;&lt;span style="font-weight: bold;"&gt;Sub Initialize&lt;/span&gt;&lt;br /&gt;Dim s As New NotesSession&lt;br /&gt;Dim db As NotesDatabase&lt;br /&gt;Dim vw As NotesView&lt;br /&gt;Dim docsort As NotesDocument&lt;br /&gt;Dim doc As NotesDocument&lt;br /&gt;On Error Goto Errhandle&lt;br /&gt;&lt;br /&gt;Set doc = s.DocumentContext&lt;br /&gt;Set db = s.CurrentDatabase&lt;br /&gt;Set vw = db.GetView("liste")&lt;br /&gt;&lt;br /&gt;' Récupération de la liste passée en paramètre&lt;br /&gt;ids = Split( doc.Request_Content(0), "NewOrder[]=")&lt;br /&gt;cpt = 0&lt;br /&gt;&lt;br /&gt;' Pour chacun des ids de la liste, ouvrir le document&lt;br /&gt;Forall k In ids&lt;br /&gt; pos = Instr(k, "&amp;")&lt;br /&gt; If pos&gt;0 Then&lt;br /&gt;  cpt = cpt+1&lt;br /&gt;  unid = Left(k, pos-1)&lt;br /&gt;  Set docsort= db.GetDocumentByUNID(unid)&lt;br /&gt;  If Not (docsort Is Nothing) Then&lt;br /&gt;   ' Si la nouvelle position du document est différente,&lt;br /&gt;   ' la modifier&lt;br /&gt;   If docsort.order(0) &lt;&gt; cpt Then&lt;br /&gt;    docsort.order = cpt&lt;br /&gt;    Call docsort.Save(False, False)&lt;br /&gt;   End If&lt;br /&gt;  End If&lt;br /&gt; End If&lt;br /&gt;End Forall&lt;br /&gt;' Recalcul de la vue&lt;br /&gt;Call vw.Refresh()&lt;br /&gt;Exit Sub&lt;br /&gt;&lt;br /&gt;Errhandle:&lt;br /&gt;Call agentLog.LogAction("Error" &amp;amp; Str(Err) &amp; ": " &amp;amp; Error$)&lt;br /&gt;Exit Sub&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;End Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115109052081339120?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115109052081339120/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115109052081339120' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115109052081339120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115109052081339120'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/06/ajax-une-page-web-personnalisable-14.html' title='AJAX - Une page Web personnalisable (1/4)'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115074989190359242</id><published>2006-06-19T21:49:00.000+02:00</published><updated>2006-07-06T11:28:21.306+02:00</updated><title type='text'>CSS - Graphiques : Barres horizontales et verticales</title><content type='html'>L'une des plus fortes demandes de mes utilisateurs est la représentation sous forme de graphiques des valeurs stockées dans Lotus Notes. Hors, Lotus n'offre aucune fonction. On peut passer par une applet Java, une servlet ou une API mais ces méthodes restent lourdes à implémenter pour des représentations basiques.&lt;br /&gt;&lt;br /&gt;Heureusement,  en lisant un &lt;a href="http://www.standards-schmandards.com/exhibits/barchart/"&gt;article sur la création de graphiques&lt;/a&gt; sous forme de barres horizontales en CSS du blog Standards-shmandards j'ai enfin trouvé une solution simple à mettre en place. L'idée est basique, il suffit de jouer sur la hauteur (ou la largeur) d'une image qui va représenter la barre.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Définition d'une vue pour l'exemple&lt;/span&gt;&lt;br /&gt;Dans cet exemple je partirai d'une vue mais on aurait aussi pu se baser sur des champs multivalués d'une document. Le graphique à barre est très simple, il suffit d'un libellé de colonne (ou de ligne) et d'une valeur associée. La vue utilisée va donc comporté deux colonnes :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;colonne 1 : Libellé de la valeur. Cette colonne doit être triée&lt;/li&gt;&lt;li&gt;colonne 2 : valeur à représenter sous forme de nombre&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/graph_vue.gif" alt="" border="0" /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Définition de la page de représentation du graphique&lt;/span&gt;&lt;br /&gt;Là aussi je vais passer par une page mais on peut aussi envisager d'autres solutions.&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/graph_bar.gif" alt="" border="0" /&gt;Pour une représentation sous forme de barres horizontales la structure générale du code HTML devra ressembler à :&lt;div style="border: 1px dotted rgb(204, 102, 0); background-color: rgb(253, 249, 245); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; font-size: 12px;"&gt;&lt;pre&gt;&amp;lt;table&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;Libellé de la ligne&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;img src="image_barre" height="16"&lt;br /&gt;        width="valeur * ratio" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;avec ratio = largeur_max/Max(valeurs)&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Création d'une nouvelle page&lt;/li&gt;&lt;li&gt;Définir comme option "type de contenu : HTML"&lt;/li&gt;&lt;li&gt;Insérer le code : &amp;lt;body&amp;gt;&amp;lt;table cellspacing="0" cellpadding="0" summary="Statistiques Domino" style="background-image:url(bg_fade.png); background-repeat:repeat-x; background-position:left top; width: 550px;"&amp;gt;&lt;/li&gt;&lt;li&gt;Insérer un texte calculé&lt;/li&gt;&lt;li&gt;Insérer le code : &amp;lt;/table&amp;gt;&amp;lt;/body&amp;gt;&lt;/li&gt;&lt;/ol&gt;Le code du champ calculé sera :&lt;div style="border: 1px dotted rgb(204, 102, 0); background-color: rgb(253, 249, 245); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; font-size: 8px;"&gt;label := @DbColumn("":"";"";"ma_vue_statistique"; 1);&lt;br /&gt;valeur := @DbColumn("":"";"";"ma_vue_statistique"; 2);&lt;br /&gt;largeur_max := 450;&lt;br /&gt;max := @Max(valeur);&lt;br /&gt;ratio := largeur_max/max;&lt;br /&gt;@Implode("&amp;lt;tr&amp;gt;&amp;lt;td class=\"first\" style=\"background : #ffffff;\"&amp;gt;" + label + "&amp;lt;/td&amp;gt;&amp;lt;td class=\"value first\"&amp;gt;&amp;lt;img src=\"bar.png\" alt=\"\" width=\"" + @Text(valeur * ratio) +"\" height=\"16\" /&amp;gt;" + @Text(valeur) + "&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;")&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;On peut alors ajouter en entête de la page la feuille de style proposée, soit :&lt;br /&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); background-color: rgb(253, 249, 245); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; font-size: 8px;"&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Statistiques Domino&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /&amp;gt;&lt;br /&gt;&amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;td.value {&lt;br /&gt; background-image: url(gridline58.gif);&lt;br /&gt; background-repeat: repeat-x;&lt;br /&gt; background-position: left top;&lt;br /&gt; border-left: 1px solid #e5e5e5;&lt;br /&gt; border-right: 1px solid #e5e5e5;&lt;br /&gt; padding:0;&lt;br /&gt; border-bottom: none;&lt;br /&gt; background-color:transparent;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;td.value img {&lt;br /&gt; vertical-align: middle;&lt;br /&gt; margin: 5px 5px 5px 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;td.last {&lt;br /&gt; border-bottom:1px solid #e5e5e5;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;td.first {&lt;br /&gt; border-top:1px solid #e5e5e5;&lt;br /&gt; padding: 4px 6px;&lt;br /&gt; border-bottom:1px solid #e5e5e5;&lt;br /&gt; border-left:1px solid #e5e5e5;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Ne pas oublié d'intégrer les images du fond de &lt;a href="http://www.standards-schmandards.com/exhibits/barchart/gridline58.gif"&gt;grille&lt;/a&gt; et de la &lt;a href="http://www.standards-schmandards.com/exhibits/barchart/bar.png"&gt;barre&lt;/a&gt; dans les ressources de base.&lt;br /&gt;&lt;br /&gt;De façon similaire on peut aussi représenter les valeurs sous forme de graphiques à barres verticales.&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/graph_bar2.gif" alt="" border="0" /&gt;Dans ce cas, le code du champ calculé sera :&lt;div style="border: 1px dotted rgb(204, 102, 0); background-color: rgb(253, 249, 245); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; font-size: 8px;"&gt;label := @DbColumn("":"";"";"statistiques"; 1);&lt;br /&gt;valeur := @DbColumn("":"";"";"statistiques"; 2);&lt;br /&gt;max := @Max(valeur);&lt;br /&gt;img := "brun.gif";&lt;br /&gt;@Implode("&amp;lt;td class=graph_data&amp;gt;&amp;lt;img class=graph src=\"" + img +"\" height=\"" + @Text((valeur/max) * 100) + "\" alt =\""+@Text(valeur)+"\" title =\""+@Text(valeur)+"\"&amp;gt;&amp;lt;/td&amp;gt;") +&lt;br /&gt;"&amp;lt;/tr&amp;gt;&amp;lt;tr class=graph_label&amp;gt;"+&lt;br /&gt;@Implode("&amp;lt;td  class=graph_label&amp;gt;" + label+"&amp;lt;/td&amp;gt;")&lt;/div&gt;&lt;br /&gt;et le style associé pourra être&lt;br /&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); background-color: rgb(253, 249, 245); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; font-size: 8px;"&gt;table.graph {&lt;br /&gt;margin-top : -5px;&lt;br /&gt;border-collapse: collapse;&lt;br /&gt;border:2px solid #C6B396;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;td.graph_data {&lt;br /&gt;padding-top : 10px;&lt;br /&gt;text-align : center;&lt;br /&gt;vertical-align : bottom;&lt;br /&gt;border-bottom:1px solid #C6B396;&lt;br /&gt;border-left:1px dotted #C6B396;&lt;br /&gt;border-right:1px dotted #C6B396;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;td.graph_label {&lt;br /&gt;font-family : tahoma, arial, helvetica, sans-serif;&lt;br /&gt;font-size : 10px;&lt;br /&gt;width : 25px;&lt;br /&gt;text-align : center;&lt;br /&gt;vertical-align : top;&lt;br /&gt;background : #EBE2D5;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;img.graph {&lt;br /&gt;width : 15px;&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Voir &lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/stat"&gt;un exemple de graphique barre&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115074989190359242?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115074989190359242/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115074989190359242' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115074989190359242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115074989190359242'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/06/css-graphiques-barres-horizontales-et.html' title='CSS - Graphiques : Barres horizontales et verticales'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115056189826287763</id><published>2006-06-17T18:18:00.000+02:00</published><updated>2006-07-06T11:27:54.243+02:00</updated><title type='text'>ASTUCE - Options de lancement pour le Web</title><content type='html'>Les options de lancement d'applications d'une base Notes sur le Web sont limitées. Il n'est par exemple pas possible de lancer le premier document d'une vue ou encore de définir les options de lancement par rapport à l'utilisateur.&lt;br /&gt;&lt;br /&gt;Pour ouvrir n'importe quel élément d'une base on peut utiliser ... un navigateur ! En fait, on utilise pas le navigateur mais le masque d'affichage du navigateur nommé $NavigatorTemplate for NomDuNavigateur. Il serait possible d'utiliser aussi une vue mais je trouve que l'utilisation du navigateur permet de différencier proprement les éléments de structure. L'utilisation du navigateur, et à plus forte raison du masque d'affichage du navigateur, étant devenu obsolète on peut se permettre de détourner son utilisation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Méthode&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Création d'un navigateur vide.&lt;/li&gt;&lt;li&gt;Indiquer comme option de lancement de la base pour le Web : Ouvrir le navigateur dans sa propre fenêtre en indiquant le nom du navigateur précédemment créé.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Création d'un masque nommé $$NavigatorTemplate For NomDuNavigateur&lt;/li&gt;&lt;li&gt;Cocher l'option "Type de contenu : HTML" depuis le deuxième onglet des options du masque&lt;/li&gt;&lt;li&gt;Indiquer le code HTML suivant dans le corps du masque :&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="refresh" content="0;url=URL_de_l_élément_à_ouvrir"&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115056189826287763?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115056189826287763/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115056189826287763' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115056189826287763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115056189826287763'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/06/astuce-options-de-lancement-pour-le.html' title='ASTUCE - Options de lancement pour le Web'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115055726660395378</id><published>2006-06-17T15:50:00.000+02:00</published><updated>2006-07-06T11:35:12.566+02:00</updated><title type='text'>AJAX - Autocompletion avec scriptaculous</title><content type='html'>L'une des fonctionnalités natives du client Lotus Notes qui me manque le plus sur le Web est le champ de type "Liste de dialogue" avec l'option "Autoriser valeurs non répertoriées". L'un des moyens de reproduire le comportement de ce type de champ sur le Web est de déclarer deux champs, un de type liste et l'autre de type de texte.&lt;br /&gt;&lt;br /&gt;Grace à AJAX et plus particulièrement la bibliothèque de script &lt;a href="http://script.aculo.us"&gt;script.aculo.us&lt;/a&gt;, il est possible de créer un tel champ.&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/ajax_sample.0.gif" alt="" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Intégration de la librairie script.aculo.us&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;On pourrait déposer les fichiers Javascript directement sur le serveur Domino. Cependant celà pose plusieurs problèmes. En entreprise, les développeurs n'ont pas directement accès aux serveurs. Il est donc complexe de les mettre à disposition et d'assurer les mises à jour. De plus, il faut que ces fichiers soient présents sur tous les serveurs où cette base sera diffusée sur l'environnement Web (serveur de développement, serveur de recettes, serveur de production, serveur en DMZ, etc.). Il est donc préférable d'intégrer ces fichiers dans une base Notes.&lt;ul&gt;&lt;li&gt;Téléchargez le package Javascript su script.aculo.us : &lt;a href="http://script.aculo.us/downloads"&gt;http://script.aculo.us/downloads&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Décompressez les fichiers sur le disque dur&lt;/li&gt;&lt;li&gt;Si vous utilisez une connexion WebDAV, copiez directement le répertoire vers la base depuis l'explorateur&lt;/li&gt;&lt;li&gt;Si vous n'utilisez pas WebDAV, insérez les fichiers un à un dans les ressources partagées de la base en prenant soin de modifier l'intitulé du fichier en y intégrant le nom du répertoire.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/ajax_respartage.gif" alt="" border="0" /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Formulaire de saisie&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Pour cet exemple, le formulaire ne contiendra qu'un champ texte libre. Attention, ce champ devra être défini avec un ID afin de pouvoir être exploité par la méthode d'autocomplétion. Pour déclarer un ID sur un champ de saisie il suffit d'ouvrir ses propriétés et d'indiquer un nom dans le champ ID présent dans le dernier onglet.&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/ajax_id.gif" alt="" border="0" /&gt;&lt;br /&gt;Pour ajouter la fonction d'autocompletion de script.aculo.us, il faut ajouter le code HTML suivant : &lt;div style="border: 1px dotted rgb(204, 102, 0); font-size: 8px; font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; background-color: rgb(253, 249, 245);"&gt;&lt;pre&gt;[&amp;lt;div id="autocomplete_choices" class="autocomplete"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;script language="javascript" charset="UTF-8" &amp;gt;&lt;br /&gt;new Ajax.Autocompleter("autocomplete", "autocomplete_choices",&lt;br /&gt;"search?openagent", {});&lt;br /&gt;&amp;lt;/script&amp;gt;]&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/366/1667/400/ajax_form.gif" alt="" border="0" /&gt;&lt;br /&gt;J'utilise les crochets pour indiquer à Domino de ne pas interpréter le code. C'est l'équivalent du HTML relais.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Arguments de la méthode AutoCompleter&lt;/span&gt;&lt;br /&gt;new Ajax.Autocompleter("ID du nom du Champ Texte", "ID du div affichant le résultat de la recherche", "URL de l'agent à exécuter pour obtenir le résultat à afficher", {});&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Modification de l'entête HTML du formulaire&lt;/span&gt;&lt;br /&gt;Pour utiliser l'objet Ajax il va falloir spécifier en entête que l'on intègre les fichiers de la bibliothèque Javascript. On va aussi en profiter pour définir un style pour afficher les résultats dans le div.&lt;br /&gt;Il faut ajouter le code suivant dans la propriété "Contenu de titre HTML" du masque.&lt;br /&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); font-size: 8px; font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; background-color: rgb(253, 249, 245);"&gt;&lt;pre&gt;"&amp;lt;meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"&amp;gt;&lt;br /&gt;&amp;lt;script src=\"scriptaculous/lib/prototype.js\" type=\"text/javascript\"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src=\"scriptaculous/src/effects.js\" type=\"text/javascript\"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src=\"scriptaculous/src/dragdrop.js\" type=\"text/javascript\"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src=\"scriptaculous/src/controls.js\" type=\"text/javascript\"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;style&amp;gt;&lt;br /&gt;div.autocomplete {&lt;br /&gt;font-size:10px;&lt;br /&gt;font-family : tahoma, arial, helvetica, sans-serif;&lt;br /&gt;width: 350px;&lt;br /&gt;background: #fff;&lt;br /&gt;}&lt;br /&gt;div.autocomplete ul {&lt;br /&gt;border:1px solid #888;&lt;br /&gt;margin:0;&lt;br /&gt;padding:0;&lt;br /&gt;width:100%;&lt;br /&gt;list-style-type:none;&lt;br /&gt;}&lt;br /&gt;div.autocomplete ul li.selected {background-color: #ffb;}&lt;br /&gt;div.autocomplete ul li {&lt;br /&gt;margin:0;&lt;br /&gt;padding:3px;&lt;br /&gt;cursor:pointer;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/style&amp;gt;"&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Agent de recherche&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La méthode AutoCompleter envoi les lettres saisies dans le champ sous form de formulaire encodé (Content-Type: application/x-www-form-urlencoded) avec comme argument &amp;nom_du_champ=texte.&lt;br /&gt;La propriété CGI Request_Content permet de récupérer cet argument. Cependant, d'après la documentation elle ne peut être utilisée qu'à partir d'un agent.&lt;br /&gt;&lt;br /&gt;Cet agent va devoir, récupérer la valeur passée en argument, rechercher tous les mots commençant par ces lettres puis renvoyer le résultat sous le format &lt;pre&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;valeur 1&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;valeur 2&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;...&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Function Parse(url, argument)&lt;/span&gt;&lt;br /&gt;Pour récupérer la valeur passée en argument j'ai préféré m'appuyer sur une fonction bien utile trouvée sur le forum de Lotus.&lt;br /&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); font-size: 8px; font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; background-color: rgb(253, 249, 245);"&gt;&lt;pre&gt;Function Parse( StringToParse As String, ParameterName As String ) As String&lt;br /&gt;Const EqualSign = "="&lt;br /&gt;Const Separator = "&amp;"&lt;br /&gt;Const PlusSign = "+"&lt;br /&gt;Const NotFound = "Not Found"&lt;br /&gt;Dim Found As Long&lt;br /&gt;Dim StartPos As Long&lt;br /&gt;Dim SeparatorPos As Long&lt;br /&gt;Dim ParameterValue As String&lt;br /&gt;Dim lenParameterName As Integer&lt;br /&gt;Dim lenParameter As Integer&lt;br /&gt;Dim InputString As String&lt;br /&gt;Dim lenInput As Long&lt;br /&gt;Dim CharacterCount As Integer&lt;br /&gt;&lt;br /&gt;InputString = StringToParse&lt;br /&gt;lenInput = Len( InputString )&lt;br /&gt;&lt;br /&gt;ParameterName = ParameterName &amp;amp; "="&lt;br /&gt;lenParameterName = Len( ParameterName )&lt;br /&gt;Found = Instr( 1, InputString, ParameterName )&lt;br /&gt;If Found &gt; 0 Then&lt;br /&gt;StartPos = Found + lenParameterName&lt;br /&gt;SeparatorPos = Instr( Found, InputString, Separator )&lt;br /&gt;If SeparatorPos &amp;gt; Found Then&lt;br /&gt;lenParameter = SeparatorPos - StartPos&lt;br /&gt;For CharacterCount = 1 To Len( ParameterValue )&lt;br /&gt;If Mid$( ParameterValue, CharacterCount, 1 ) = _&lt;br /&gt;PlusSign Then Mid$( ParameterValue, CharacterCount, 1 ) = " "&lt;br /&gt;Next&lt;br /&gt;Else ' Is this the last one?&lt;br /&gt;lenParameter = lenInput - StartPos + 1&lt;br /&gt;End If&lt;br /&gt;ParameterValue = Mid$( InputString, StartPos, lenParameter )&lt;br /&gt;StartPos = SeparatorPos + 1 ' Setup for next parameter search&lt;br /&gt;Else&lt;br /&gt;StartPos = 1 ' Didn't find it, so reset StartPos&lt;br /&gt;End If&lt;br /&gt;Parse = ParameterValue&lt;br /&gt;End Function&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Vue de recherche&lt;/span&gt;&lt;br /&gt;Pour rechercher les valeurs, nous allons avoir besoin d'une vue triée par ordre croissant sur le nom du champ défini dans le masque. Afin d'éviter d'avoir deux fois le même mot dans le résultat de recherche, il faut cocher l'option "Générer clés uniques dans l'index" depuis le cinquième onglet des options de la vue.&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/366/1667/400/ajax_vue.gif" alt="" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Code de l'agent "search"&lt;/span&gt;&lt;br /&gt;L'agent va&lt;br /&gt;&lt;ul&gt;&lt;li&gt;récupérer la valeur envoyée par la méthode AutoCompleter, &lt;/li&gt;&lt;li&gt;la décoder (la valeur transmise est encodée au format UTF-8),&lt;/li&gt;&lt;li&gt;rechercher depuis la vue précédemment définie les document dont la valeur du champ commence par cet argument. On utilise l'argument False à la méthode getAllDocumentByKeys.&lt;/li&gt;&lt;li&gt;renvoyer le résultat sous le format imposé par la méthode AutoCompleter&lt;/li&gt;&lt;/ul&gt;Soit :&lt;br /&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); font-size: 8px; font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; background-color: rgb(253, 249, 245);"&gt;&lt;pre&gt;Sub Initialize&lt;br /&gt;Dim s As New NotesSession&lt;br /&gt;Dim doccur As NotesDocument&lt;br /&gt;&lt;br /&gt;Dim db As NotesDatabase&lt;br /&gt;Dim vw As NotesView&lt;br /&gt;Dim dc As NotesDocumentcollection&lt;br /&gt;Dim doc As NotesDocument&lt;br /&gt;Dim valeur As Variant&lt;br /&gt;&lt;br /&gt;Set doccur = s.DocumentContext&lt;br /&gt;req_encoded = parse(doccur.Request_Content(0), "autocomplete")&lt;br /&gt;req = Evaluate(|@urldecode({Domino}; {|+req_encoded +|})|)&lt;br /&gt;&lt;br /&gt;Set db = s.currentdatabase&lt;br /&gt;Set vw = db.GetView("dbsearch")&lt;br /&gt;Set dc = vw.GetAllDocumentsByKey(req(0), False)&lt;br /&gt;Set doc = dc.GetFirstDocument&lt;br /&gt;&lt;br /&gt;Print "Content-Type:text/html;charset=UTF-8"&lt;br /&gt;Print "&amp;lt;ul&amp;gt;"&lt;br /&gt;While Not(doc Is Nothing)&lt;br /&gt;Print "&amp;lt;li&amp;gt;" + doc.autocomplete(0) + "&amp;lt;/li&amp;gt;"&lt;br /&gt;Set doc = dc.GetNextDocument(doc)&lt;br /&gt;Wend&lt;br /&gt;Print "&amp;lt;/ul&amp;gt;"&lt;br /&gt;End Sub&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Le résultat en action :&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/ajax_final.gif" alt="" border="0" /&gt;&lt;br /&gt;Télécharger la base d'exemple : &lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/dw_ajax_autocompletion.zip"&gt;D&amp;amp;W : AJAX - Autocompletion&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115055726660395378?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115055726660395378/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115055726660395378' title='10 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115055726660395378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115055726660395378'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/06/ajax-autocompletion-avec-scriptaculous.html' title='AJAX - Autocompletion avec scriptaculous'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115022795471084042</id><published>2006-06-13T21:03:00.000+02:00</published><updated>2006-07-06T11:22:35.126+02:00</updated><title type='text'>ADMINISTRATION - WebDAV : Web-based Distributed Authoring and Versioning</title><content type='html'>Avec l'arrivée de la version 6 de domino, DNFS a disparu. Ce service complémentaire de Domino, permettant de mapper une base Notes comme lecteur réseau, était pourtant bien pratique même si instable et pas toujours très sécurisé.&lt;br /&gt;&lt;br /&gt;A la place, IBM a fourni WebDAV. Ce protocole permet d'accèder, via l'explorateur Windows, aux fichiers contenus dans les éléments de structure d'une base Notes. Je suis longtemps resté perplexe devant l'intérêt de cette fonctionnalité. Seules les personnes ayant au moins l'accès concepteur peuvent accèder à une base via WebDAV. Celà retire toute possibilité de l'ouvrir aux utilisateurs. J'ai fini par ne plus m'en passé le jour où j'ai souhaité intégrer une bibliothèque Javascript dans Lotus Notes. Au lieu d'intégrer la cinquantaine de fichiers un à un depuis le designer, il suffit de décompresser l'archive de la bibliothèque et de copier/coller depuis le navigateur Notes. L'organisation de fichiers et répertoire est préservé dans Notes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Mise en place de WebDAV&lt;/span&gt;&lt;br /&gt;Il suffit de modifier le document site (ou d'en créer un nouveau) depuis le client d'administration et de cocher l'option WebDAVdans le second onglet. On relance le serveur HTTP et c'est fini !&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/admin_webdav.gif" alt="" border="0" /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Déclaration d'une connexion WebDAV depuis Windows XP&lt;/span&gt;&lt;br /&gt;Comme précédemment indiqué, il faut au moins être déclaré comme concepteur sur la base Notes.&lt;br /&gt;Sous Windows XP :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Ouvrir les Favoris Réseau&lt;/li&gt;&lt;li&gt;Cliquer sur Ajouter un favoris réseau&lt;/li&gt;&lt;li&gt;Comme adresse internet spécifier : http://IPduServeurNotes/RépertoireDepuisData/BaseNotes.nsf$files/&lt;/li&gt;&lt;li&gt;Indiquer un nom de connexion. Par exemple : "Ma connexion vers la base truc.nsf"&lt;/li&gt;&lt;/ol&gt;La nouvelle connexion WebDAV vers la base Notes est terminée.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Utilisation du lecteur WebDAV&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lorsque l'on ouvre cette connexion une boite de demande d'authentification s'ouvre. WebDAV s'appuyant sur le protocole HTTP de Domino il faut indiquer son login et mot de passe Internet déclaré sur le serveur Domino. Il ne reste plus qu'à copier des fichiers ou des répertoires vers ce nouveau lecteur. Ils apparaitront automatique dans la liste des ressources partagées. Il est à noter que les images avec l'extesion JPG, GIF ou BMP seront automatiquement classés dans le dossier "Images" alors que les autres fichiers seront classés dans "Fichier".&lt;br /&gt;&lt;br /&gt;Ceci servira lors des prochains articles sur AJAX où j'utiliserai des bibliothèques Javascript comme &lt;a href="http://openrico.org/"&gt;RICO&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115022795471084042?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115022795471084042/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115022795471084042' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115022795471084042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115022795471084042'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/06/administration-webdav-web-based.html' title='ADMINISTRATION - WebDAV : Web-based Distributed Authoring and Versioning'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115022534548468218</id><published>2006-06-13T20:52:00.000+02:00</published><updated>2006-07-06T11:20:38.606+02:00</updated><title type='text'>GOOGLE API - Une application Notes avec Google Maps</title><content type='html'>Juste un court billet pour présenter un exemple complet d'utilisation de Lotus Notes avec Google Maps :&lt;br /&gt;&lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/googlemaps2"&gt;http://free.dominoserver.de/it/dominoweb.nsf/googlemaps2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cet exemple reprend tous les éléments présentés dans les billets précédents.&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://photos1.blogger.com/blogger/366/1667/400/sample_googlemaps2.jpg" alt="" border="0" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115022534548468218?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115022534548468218/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115022534548468218' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115022534548468218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115022534548468218'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/06/google-api-une-application-notes-avec.html' title='GOOGLE API - Une application Notes avec Google Maps'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-115004615165052754</id><published>2006-06-11T18:47:00.000+02:00</published><updated>2006-07-06T11:33:43.516+02:00</updated><title type='text'>GOOGLE API - La recherche d'informations sur l'Internet depuis un client Lotus Notes (3/3)</title><content type='html'>La recherche d'informations de géolocalisation peut aussi s'effectuer à partir d'un client Lotus Notes.&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/366/1667/400/sample_notesadresse.jpg" alt="" border="0" /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;ALAX : Asynchronous LotusScript And XML&lt;/span&gt;&lt;br /&gt;La recherche d'informations de géolocalisation à partir d'une adresse postale depuis un client Lotus Notes peut aussi bien être pratique pour l'utilisateur que pour l'utilisation à travers un agent.  La méthode utilisée s'appuie sur l'objet XMLHTTP comme pour AJAX présenté dans le billet sur la recherche FullText avec GoogleMaps. LA grande différence est que le développement se fait en Lotus Script et non en Javascript.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Création du masque de saisie&lt;/span&gt;&lt;br /&gt;Comme pour le formulaire de recherche d'adresse Web il faut :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Un champ "rue" de type texte éditable&lt;/li&gt;&lt;li&gt;Un champ "ville" de type texte éditable&lt;/li&gt;&lt;li&gt;Un champ "pays" de type texte éditable&lt;/li&gt;&lt;li&gt;Un bouton "Rechercher"&lt;/li&gt;&lt;li&gt;Un champ "latitude" de type texte éditable&lt;/li&gt;&lt;li&gt;Un champ "longitude" de type texte éditable&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Le principe d'utilisation de ce masque est simple. L'utilisateur saisie l'adresse (rue, ville et pays) puis clique sur le bouton Rechercher. Si l'adresse est trouvée les champs latitude et longitude sont alors automatiquement renseignés. Si l'adresse n'est pas trouvée, on notifie l'utilisateur par une boite de message.&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/366/1667/400/sample_rechftform.gif" alt="" border="0" /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Code du bouton Rechercher&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lorsque l'on clique sur Rechercher, on doit extraire les valeurs des champs d'adresse, les formater en code URL (codage des espaces et des accents), lancer la requète de recherche sur localsearchmaps, extraire le résultat et alors renseigner les champs latitude et longitude.&lt;br /&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); font-size: 8px; font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; background-color: rgb(253, 249, 245);"&gt;&lt;pre&gt;Sub Click(Source As Button)&lt;br /&gt;Dim wk As New NotesUIWorkspace&lt;br /&gt;Dim uidoc As NotesUIDocument&lt;br /&gt;Dim doc As NotesDocument&lt;br /&gt;Dim rue, ville, pays As Variant&lt;br /&gt;&lt;br /&gt;Set uidoc = wk.CurrentDocument&lt;br /&gt;Set doc = uidoc.Document&lt;br /&gt;&lt;br /&gt;' Requète de recherche de longitude/latitude&lt;br /&gt;' -----------------------------------------------------------&lt;br /&gt;' Le texte doit être encodé au format URL pour remplacer les accents&lt;br /&gt;' et les espaces. Le service localsearchmaps n'accepte pas d'avoir une&lt;br /&gt;' rue vide. Si l'utilisateur ne spécifie pas de rue, on renvoie un&lt;br /&gt;' espace "%20"&lt;br /&gt;&lt;br /&gt;rue = Evaluate({@URLEncode("UTF-8";"} + doc.rue(0) + {")})&lt;br /&gt;If rue(0)="" Then rue(0) = "%20"&lt;br /&gt;ville = Evaluate({@URLEncode("UTF-8";"} + doc.ville(0) + {")})&lt;br /&gt;pays = Evaluate({@URLEncode("UTF-8";"} + doc.pays(0) + {")})&lt;br /&gt;request = "http://www.localsearchmaps.com/geo/?street=" + rue(0) + _&lt;br /&gt;"&amp;city=" + ville(0) + "&amp;amp;country=" + pays(0) + "&amp;cb=notes"&lt;br /&gt;&lt;br /&gt;' Envoi et récupération du résultat de requète&lt;br /&gt;' -------------------------------------------------------------&lt;br /&gt;' Ce code ne fonctionne que si l'utilisateur qui clique sur le bouton&lt;br /&gt;' possède Internet Explorer. Si l'utilisateur a un autre navigateur il&lt;br /&gt;' faudra modifier la déclarationde l'objet XMLHTTP&lt;br /&gt;&lt;br /&gt;Set page = CreateObject("Microsoft.XMLHTTP")&lt;br /&gt;Call page.open("GET", request, False)&lt;br /&gt;Call page.send()&lt;br /&gt;&lt;br /&gt;strReturn =page.responseText&lt;br /&gt;&lt;br /&gt;If (Instr(strReturn,"notes")&gt;0) Then&lt;br /&gt;' Extraction de la longitude et la latitude&lt;br /&gt;' ----------------------------------------------------&lt;br /&gt;' Le résultat de la requète est sous la forme :&lt;br /&gt;'    notes(latitude, longitude,'VILLE', 'CODE', 'PAYS');&lt;br /&gt;&lt;br /&gt;search = Mid(strReturn, 7, Instr(strReturn, ",'") -7)&lt;br /&gt;lattitude = Left(search, Instr(search, ",") -1)&lt;br /&gt;longitude = Mid(search, Instr(search, ",") +2)&lt;br /&gt;&lt;br /&gt;Call uidoc.FieldSetText("latitude", lattitude)&lt;br /&gt;Call uidoc.FieldSetText("longitude", longitude)&lt;br /&gt;Else&lt;br /&gt;Messagebox "L'adresse n'a pas été trouvée", 48, "Géolocalisation"&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;Set page = Nothing&lt;br /&gt;End Sub&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-115004615165052754?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/115004615165052754/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=115004615165052754' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115004615165052754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/115004615165052754'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/06/google-api-la-recherche-dinformations_11.html' title='GOOGLE API - La recherche d&apos;informations sur l&apos;Internet depuis un client Lotus Notes (3/3)'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-114993761786432172</id><published>2006-06-10T12:46:00.000+02:00</published><updated>2006-07-06T10:47:06.106+02:00</updated><title type='text'>GOOGLE API - La recherche 'Full Text' Notes avec Google Maps (2/3)</title><content type='html'>Dans l'article précédent nous avons vu comment retrouver une adresse postale sur Google Maps. Ceci permet de retrouver les documents situés aux alentours d'une zone géographique recherchée. Nous allons maintenant voir comment retrouver la position d'un document Notes sur la carte. J'ai élargi le périmètre en intégrant aussi la possibilité de rechercher un document dans la base Notes à partir d'un module de recherche Full Text.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://free.dominoserver.de/it/dominoweb.nsf/googlemapsftsearch"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/366/1667/400/sample_googlemapsft.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;AJAX : (&lt;/span&gt;&lt;i style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Asynchronous JavaScript And XML&lt;/i&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;)&lt;/span&gt;&lt;br /&gt;Nous ne pouvons pas utiliser le module de recherche Full Text Web natif de Lotus Notes à moins d'utiliser des frames ou iframes. En effet, à chaque recherche, le formulaire étant POSTé, il faudrait au mieux recharger toute la page à chaque fois. Je vais donc utilisé la méthode AJAX avec un peu de DHTML pour rechercher les résutats en mode asynchrone et les intégrer dans la page sans avoir à la recharger. Je reviendrai régulièrement sur les fonctionalités d'AJAX. En attendant vous pouvez lire ces deux pages de présentation :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://fr.wikipedia.org/wiki/AJAX"&gt;Wikipedia : AJAX&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.framasoft.net/article3991.html"&gt;Framasoft : Ajax le retour des lessiviers ?&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Personnalisation de la vue de résultat de recherche&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Une fois n'est pas coutume, je vais commencer par la fin. Une fois le résultat de la recherche affiché, il faudra zoomer sur la zone en cliquant sur le lien présenté dans le résultat de la recherche. Je vais donc réutiliser la formule "&lt;span style="font-style: italic;"&gt;mapZoom&lt;/span&gt;" présentée dans l'article précédent. Les liens hypertextes présentés en résultat de recherche devront avoir la forme :&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);font-family:courier new;" &gt;&amp;lt;A HREF="" OnClick="mapZoom(longitude, latitude); return(false);"&amp;gt;monlien&amp;lt;/A&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;On peut donc dès à présent personnaliser la vue de recherche qui présentera les résultats. Cette personnalisation comprend deux étapes :&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Création d'une vue "Search"&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Formule de la première colonne : &lt;span style="color: rgb(204, 102, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(204, 102, 0);font-family:courier new;" &gt;"&amp;lt;A HREF="" OnClick="mapZoom(" + longitude + ", " + latitude + "); return(false);"&amp;gt;" + titre + "&amp;lt;/A&amp;gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(204, 102, 0);font-family:courier new;" &gt;&lt;span style="color: rgb(0, 0, 0);font-family:georgia;" &gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Formule de la seconde colonne :  &lt;span style="color: rgb(204, 102, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(204, 102, 0);font-family:courier new;" &gt;description + "&amp;lt;br /&amp;gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(204, 102, 0);font-family:courier new;" &gt;&lt;span style="color: rgb(0, 0, 0);font-family:georgia;" &gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Cocher l'option de vue : "Traiter contenu comme code HTML".&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Création d'un masque "$$SearchTemplateDefault"&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Insérer un champ nommé : $$ViewBody&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;&lt;br /&gt;Intégration du formulaire de recherche et de la zone d'affichage du résultat&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Nous n'aurons besoin que d'un champ de saisie pour taper les mots clés recherchés, un bouton pour lancer la recherche et d'une zone d'affichage du résultat de recherche, soit :&lt;br /&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); font-size: 8px; font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; background-color: rgb(253, 249, 245);"&gt;&lt;pre&gt;&amp;lt;FORM NAME="form_fts"&amp;gt;&lt;br /&gt;&amp;lt;LABEL&amp;gt;Texte : &amp;lt;/LABEL&amp;gt; &amp;lt;INPUT NAME="req" SIZE=35 /&amp;gt;&lt;br /&gt;&amp;lt;BUTTON VALUE="Rechercher" NAME="Rechercher"&lt;br /&gt;TYPE="button"  onClick="searchNotes()"&amp;gt;&lt;br /&gt;Rechercher&lt;br /&gt;&amp;lt;/BUTTON&amp;gt;&lt;br /&gt;&amp;lt;/FORM&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;DIV id="affres" style="overflow:auto; padding:5px; height:100px;"&amp;gt;&amp;lt;/DIV&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Lancement de la recherche et affichage du résultat grace à AJAX&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Le principe est très simple. On génère une URL pour lancer la recherche sur le serveur Notes, on récupère le récultat et on l'affiche dans le DIV id="affres".&lt;br /&gt;&lt;br /&gt;L'URL de lancement de recherche sera de la forme  :&lt;br /&gt;"&lt;span style="font-family:courier new;"&gt;search?searchview&amp;query=&lt;span style="font-style: italic;"&gt;texte saisie dans le champ req du formulaire&lt;/span&gt;&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); font-size: 8px; font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; background-color: rgb(253, 249, 245);"&gt;&lt;pre&gt;function searchNotes(){&lt;br /&gt;var xmlhttp=false;&lt;br /&gt;/*@cc_on @*/&lt;br /&gt;/*@if (@_jscript_version &gt;= 5)&lt;br /&gt;try {&lt;br /&gt;xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");&lt;br /&gt;} catch (e) {&lt;br /&gt;try {&lt;br /&gt;xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");&lt;br /&gt;} catch (E) {&lt;br /&gt;xmlhttp = false;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;@end @*/&lt;br /&gt;&lt;br /&gt;if (!xmlhttp &amp;&amp;amp; typeof XMLHttpRequest!='undefined') {&lt;br /&gt;try {&lt;br /&gt;xmlhttp = new XMLHttpRequest();&lt;br /&gt;} catch (e) {&lt;br /&gt;xmlhttp=false;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;if (!xmlhttp &amp;&amp;amp; window.createRequest) {&lt;br /&gt;try {&lt;br /&gt;xmlhttp = window.createRequest();&lt;br /&gt;} catch (e) {&lt;br /&gt;xmlhttp=false;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;xmlhttp.open("GET", "search?searchview&amp;query=" +&lt;br /&gt;              escape( document.form_fts.req.value),true);&lt;br /&gt;xmlhttp.onreadystatechange=function() {&lt;br /&gt;if (xmlhttp.readyState==4) {&lt;br /&gt;document.getElementById("affres").innerHTML = xmlhttp.responseText;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;xmlhttp.send(null)&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;La première partie du code est générique pour pouvoir utiliser l'objet xmlhttp qui va récupérer le contenu du résultat de la requète sans l'afficher sur le navigateur.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;document.getElementById("nom id").innerHTML&lt;/span&gt; permet de récupérer, et aussi de modifier, le texte contenu entre les balises définies avec l'ID spécifié sans avoir à recharger la page.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/googlemapsftsearch"&gt;Voir le résultat&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-114993761786432172?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/114993761786432172/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=114993761786432172' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/114993761786432172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/114993761786432172'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/06/google-api-la-recherche-full-text.html' title='GOOGLE API - La recherche &apos;Full Text&apos; Notes avec Google Maps (2/3)'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-114985720575724234</id><published>2006-06-09T13:49:00.000+02:00</published><updated>2006-07-06T10:46:28.803+02:00</updated><title type='text'>GOOGLE API - La recherche d'informations dans Google Maps (1/3)</title><content type='html'>L'API de Google Maps ne fournit pas de fonctions de recherche géographique à partir d'une adresse postale. Si l'on a pas la longitude et la latitude du point à représenter celà peut devenir fastidieux pour l'utilisateur de rechercher ces informations pour chacun des documents.&lt;br /&gt;&lt;br /&gt;De plus, comme indiqué dans mon premier message d'introduction, l'utilisateur de Google Maps et Google Earth va utiliser l'interface principalement dans deux buts :&lt;ul&gt;&lt;li&gt;Trouver les documents situés disponibles un emplacement&lt;/li&gt;&lt;li&gt;Trouver où se situe un document&lt;/li&gt;&lt;/ul&gt;Pour trouver la position d'un document il faut donc offrir la possibilité de zoomer sur la carte en cliquant sur le document. Ceci est possible nativement dans Google Earth, mais pas sur Google Maps.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Se positionner sur Google Maps à partir d'une adresse postale&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://free.dominoserver.de/it/dominoweb.nsf/googlemapssearch"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/366/1667/400/sample_googlemapsadresse.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Pour se positionner sur Google Maps à partir d'une adresse postale, nous allons utiliser le service Web de &lt;a href="http://www.localsearchmaps.com/"&gt;localsearchmap&lt;/a&gt;. Ce seervice renvoie par défaut la syntaxe de zoom sur un point de l'API GoogleMaps en version 1. Malheureusement cette syntaxe n'est plus valide en version 2. Nous allons donc un peut personnaliser l'appel.&lt;br /&gt;&lt;br /&gt;La syntaxe d'utilisation de ce service est :&lt;br /&gt;http://www.localsearchmaps.com/geo/?street=rue&amp;town=ville&lt;br /&gt;   &amp;amp;country=pays&lt;br /&gt;On peut aussi ajouter un argument indiquant le nom de la fonction javascript à appeler pour zoomer sur les coordonnées renvoyées : &amp;cb=maFonctionJavascript&lt;br /&gt;&lt;br /&gt;Par exemple :&lt;br /&gt;&lt;a href="http://www.localsearchmaps.com/geo/?street=rue+des+cosmonautes&amp;amp;town=palaiseau&amp;country=france&amp;amp;cb=mapZoom"&gt;http://www.localsearchmaps.com/geo/&lt;br /&gt;?street=rue+des+cosmonautes&amp;town=palaiseau&lt;br /&gt;&amp;amp;country=france&amp;cb=mapZoom&lt;/a&gt;&lt;br /&gt;renvoie comme résultat : &lt;span style="font-family:courier new;"&gt;mapZoom(46.624, 2.4622);&lt;/span&gt;&lt;br /&gt;&lt;p&gt;Nous allons devoir utiliser la carte pour zoomer dessus, la première chose à faire est donc de déclarer &lt;em&gt;map&lt;/em&gt; comme variable globale dans le code javascript fourni pour afficher la carte Google Maps dans l'article précédent.&lt;/p&gt;&lt;br /&gt;&lt;strong&gt;Création d'un formulaire de recherche&lt;br /&gt;&lt;/strong&gt;Pour permettre à l'utilisateur d'indiquer les coordonnées, il va falloir ajouter un formulaire de recherche permettant de spécifier la rue, la ville et le pays.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); font-size: 8px; font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; background-color: rgb(253, 249, 245);"&gt;&lt;pre&gt;&amp;lt;FORM NAME="form"&amp;gt;&lt;br /&gt;&amp;lt;LABEL&amp;gt;Rue : &amp;lt;/LABEL&amp;gt; &amp;lt;INPUT NAME="rue" SIZE=50 /&amp;gt;&amp;lt;BR /&amp;gt;&lt;br /&gt;&amp;lt;LABEL&amp;gt;Ville : &amp;lt;/LABEL&amp;gt; &amp;lt;INPUT NAME="ville" SIZE=50 /&amp;gt;&amp;lt;BR /&amp;gt;&lt;br /&gt;&amp;lt;LABEL&amp;gt;Pays : &amp;lt;/LABEL&amp;gt; &amp;lt;INPUT NAME="pays" /&amp;gt;&lt;br /&gt;&amp;lt;BUTTON VALUE="Rechercher" NAME="Rechercher" TYPE="button"&lt;br /&gt;  onclick="searchPoint()"&amp;gt;&lt;br /&gt;Rechercher&lt;br /&gt;&amp;lt;/BUTTON&amp;gt;&lt;br /&gt;&amp;lt;/FORM&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Déclaration de la fonction mapZoom(lat,long)&lt;/strong&gt;&lt;br /&gt;Fonction javascript permettent de zoomer sur la carte à partir de sa longitude et sa latitude &lt;/p&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); font-size: 8px; font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; background-color: rgb(253, 249, 245);"&gt;&lt;pre&gt;function mapZoom(lat, long,town,state,country){&lt;br /&gt;var point = new GLatLng( parseFloat(lat), parseFloat(long));&lt;br /&gt;map.setCenter(point,14, G_HYBRID_MAP );&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Déclaration de la fonction searchPoint()&lt;/strong&gt;&lt;br /&gt;Cette fonction va récupérer les informations saisies par l'utilisateur, formater le texte au format URL, lancer le service WEB à partir de ces informations puis lancer la fonction de zoom à partir du résultat.&lt;/p&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); font-size: 8px; font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; background-color: rgb(253, 249, 245);"&gt;&lt;pre&gt;function searchPoint() {&lt;br /&gt;var queries = "?street=" + escape( document.form.rue.value)+&lt;br /&gt;        "&amp;city="+escape( document.form.ville.value)+&lt;br /&gt;        "&amp;amp;country=" + escape( document.form.pays.value);&lt;br /&gt;var s = document.createElement( "script" );&lt;br /&gt;s.src="http://www.localsearchmaps.com/geo/" + queries + "&amp;cb=mapZoom";&lt;br /&gt;s.type = "text/javascript";&lt;br /&gt;document.getElementsByTagName( "head" )[0].appendChild(s);&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Code Source complet de la page&lt;/strong&gt;&lt;br /&gt;N'oubliez pas de remplacer la clé Google Maps.&lt;br /&gt;&lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/googlemapssearch"&gt;Voir le résultat&lt;/a&gt;&lt;/p&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); font-size: 8px; font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; background-color: rgb(253, 249, 245);"&gt;&lt;pre&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"&lt;br /&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="content-type" content="text/html; charset=utf-8"/&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Google Maps JavaScript API Example&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;base href="http://free.dominoserver.de/it/dominoweb.nsf/" target="_self" /&amp;gt;&lt;br /&gt;&amp;lt;script src="http://maps.google.com/maps?file=api&amp;v=2&amp;amp;key=CleGoogleMaps"&lt;br /&gt;type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&lt;br /&gt;//&amp;lt;![CDATA[&lt;br /&gt;var map;&lt;br /&gt;&lt;br /&gt;function load() {&lt;br /&gt;function createMarker(point,title, desc ) {&lt;br /&gt;  var bulle = "&amp;lt;h3&amp;gt;" +  title + "&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;" + desc +"&amp;lt;/p&amp;gt;";&lt;br /&gt;  var marker = new GMarker(point);&lt;br /&gt;   GEvent.addListener(marker, "click", function() {&lt;br /&gt;      map.setCenter(point,14, G_HYBRID_MAP );&lt;br /&gt;    marker.openInfoWindowHtml(bulle);&lt;br /&gt;  });&lt;br /&gt;  return marker;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (GBrowserIsCompatible()) {&lt;br /&gt;map = new GMap2(document.getElementById("map"));&lt;br /&gt;map.addControl(new GLargeMapControl());&lt;br /&gt;map.addControl(new GMapTypeControl());&lt;br /&gt;map.setCenter(new GLatLng(27.994401,13.164063),1, G_HYBRID_MAP );&lt;br /&gt;GDownloadUrl("googlemaps.xml", function(data, responseCode) {&lt;br /&gt;var xml = GXml.parse(data);&lt;br /&gt;var markers = xml.documentElement.getElementsByTagName("marker");&lt;br /&gt;for (var i = 0; i &amp;lt; markers.length; i++) {&lt;br /&gt;var latitude = parseFloat(markers[i].getAttribute("lat"));&lt;br /&gt;var longitude =  parseFloat(markers[i].getAttribute("long"));&lt;br /&gt;var title =  markers[i].getAttribute("title");&lt;br /&gt;var desc =&lt;br /&gt;markers[i].getElementsByTagName("description")[0].firstChild.nodeValue;&lt;br /&gt;var point = new GLatLng(latitude,longitude);&lt;br /&gt;var marker = createMarker(point,title, desc);&lt;br /&gt;map.addOverlay(marker);&lt;br /&gt;}&lt;br /&gt;});&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function mapZoom(lat, long){&lt;br /&gt;var point = new GLatLng( parseFloat(lat), parseFloat(long));&lt;br /&gt;map.setCenter(point,14, G_HYBRID_MAP );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function searchPoint() {&lt;br /&gt;var queries = "?street=" + escape( document.form.rue.value) +&lt;br /&gt;            "&amp;city="+escape( document.form.ville.value) +&lt;br /&gt;            "&amp;amp;country=" + escape( document.form.pays.value);&lt;br /&gt;var s = document.createElement( "script" );&lt;br /&gt;s.src="http://www.localsearchmaps.com/geo/" + queries + "&amp;cb=mapZoom";&lt;br /&gt;s.type = "text/javascript";&lt;br /&gt;document.getElementsByTagName( "head" )[0].appendChild(s);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//]]&amp;gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;style&amp;gt;&lt;br /&gt;LABEL {&lt;br /&gt;DISPLAY: inline ;&lt;br /&gt;FLOAT: left ;&lt;br /&gt;WIDTH: 40px ;&lt;br /&gt;font-size:10px;&lt;br /&gt;font-weight: bold ;&lt;br /&gt;margin-left: 5px ;}&lt;br /&gt;INPUT {&lt;br /&gt;font-family: Arial, Helvetica, sans-serif ;&lt;br /&gt;font-size:10px; }&lt;br /&gt;BUTTON {&lt;br /&gt;font-size : 11px;&lt;br /&gt;border : 1px solid #CCC;&lt;br /&gt;background-color : #EEE;}&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body onload="load()" onunload="GUnload()"&amp;gt;&lt;br /&gt;&amp;lt;div id="map" style="width: 500px; height: 300px"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div&amp;gt;&lt;br /&gt;&amp;lt;form name="form"&amp;gt;&lt;br /&gt;&amp;lt;LABEL&amp;gt;Rue :&amp;lt;/LABEL&amp;gt; &amp;lt;input name="rue" size=50&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;&amp;lt;LABEL&amp;gt;Ville :&amp;lt;/LABEL&amp;gt; &amp;lt;input name="ville" size=50&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;&amp;lt;LABEL&amp;gt;Pays :&amp;lt;/LABEL&amp;gt; &amp;lt;input name="pays"&amp;gt;&lt;br /&gt;&amp;lt;BUTTON VALUE="Rechercher" NAME="Rechercher" TYPE="button"&lt;br /&gt;      onClick="searchPoint()" &amp;gt;&lt;br /&gt;  Rechercher&lt;br /&gt;&amp;lt;/BUTTON&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-114985720575724234?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/114985720575724234/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=114985720575724234' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/114985720575724234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/114985720575724234'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/06/google-api-la-recherche-dinformations.html' title='GOOGLE API - La recherche d&apos;informations dans Google Maps (1/3)'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-114975620977859110</id><published>2006-06-08T09:56:00.000+02:00</published><updated>2006-07-06T10:46:09.963+02:00</updated><title type='text'>GOOGLE API - Quelques limites à l'utilisation de Google Earth et Google Maps avec Lotus Notes</title><content type='html'>&lt;p&gt;Les principales limites de l'utilisation de Google Earth et Google Maps avec Lotus Notes se situent au niveau : &lt;/p&gt;&lt;ul&gt;&lt;li&gt;de la sécurité,&lt;/li&gt;&lt;br /&gt;&lt;li&gt;de l'interface,&lt;/li&gt;&lt;br /&gt;&lt;li&gt;de la volumétrie de données.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Limitations liées à la sécurité&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Google Maps étant défini au niveau d'un élément Notes il est possible de s'authentifier pour accèder à cet élément. Google Maps peut alors accèder au flux XML selon les droits de l'utilisateur. Attention cependant de respecter les termes d'utilisation de l'outil : &lt;a href="http://www.google.com/apis/maps/terms.html"&gt;http://www.google.com/apis/maps/terms.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Google Earth ne peut qu'ouvrir des fichiers KLM dont il a accès sans avoir besoin de s'authentifier. Celà pose donc un problème lorsque la LCA de la base, ou les propriétés de sécurité de la vue ne permettent pas l'accès à &lt;em&gt;Anonymous&lt;/em&gt;. Sur les serveurs qui ne sont pas configuré en mode session, il est toujours possible d'indiquer le login et le mot de passe dans l'URL du flux KLM mais celà n'est évidemment pas recommandé.&lt;/p&gt;&lt;p&gt;Deux solutions permettent de contourner plus ou moins facilement cette limitation.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Authentification sur serveur Lotus Domino en mode Session&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Si le serveur Domino est configuré en mode session, il est possible d'ouvrir un flux KLM non public en s'authentifiant sur le serveur à travers le navigateur Web disponible dans GoogleEarth puis en lui demandant de rafraichir les données de flux. Malheureusement, la procédure est assez lourde.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Position des points publique et accès limité pour le détail&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;La seconde solution consiste à ouvrir l'accès au flux KLM au public mais de limiter l'accès aux détails d'un point. Ainsi, tout le monde pourra voir la position des documents mais seules les personnes autorisées pourront accèder au contenu de ces documents. &lt;/p&gt;&lt;p&gt;Pour limiter l'accès aux documents, on peut ajouter un lien vers celui-ci dans la description du point et activer le navigateur Web de Google Earth. Lorsque l'utilisateur clique sur ce lien la première fois, une fenêtre d'authentification s'ouvre dans le navigateur Web. Une fois authentifié, le document est affiché dans le navigateur Web. &lt;/p&gt;&lt;p&gt;Pour donner un accès public aux documents, on peut créer un agent public générant à la volée le fichier KLM. Ceci permet de ne pas avoir à ouvrir les droits d'accès au niveau des vues et/ou des documents.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Limitations liées à l'interface : la recherche&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Google Earth offre nativement un ensemble d'outils permettant de faciliter la navigation. Au contraire l'API de Google Maps est plus basique. Il n'est par exemple pas possible de rechercher une adresse. &lt;/p&gt;&lt;p&gt;L'interface Google Earth ne peut être personnalisée. Il n'existe pas de module de recherche dans le contenu du fichier KLM. Google Maps étant une page Web, il est possible d'intégrer le module de recherche full-text de Lotus Notes sur la page et ajouter des controles pour naviguer sur la carte à partir du résultat de la recherche. On peut à la rigueur créer une page de recherche full-text accessible à travers le navigateur Web de Google Earth mais je ne connais pas de moyen simple de pouvoir pointer un point sur la mappemonde depuis le navigateur. L'utilisation reste donc très limitée.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Limitations liées à la volumétrie&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Plus le nombre de points à représenter sur la carte est important, plus le temps de traitement et de transfert de données est long, surtout avec Google Maps. J'ai pu testé Google Maps avec plus de 300 points à représenté et le temps de traitement est visible au contraire de Google Earth.&lt;/p&gt;&lt;p&gt;Afin de limiter l'impact, il est possible de séparer en plusieurs flux les données à représenter. L'utilisateur coche alors le type d'informations à représenter et seules ces informations seront traitées. Pour implémenter cetyte solution au niveau Notes on peut utiliser les vues catégorisées et indiquer dans la vue intégrée du masque de vue de n'afficher que la catégorie passée en paramètre de l'URL.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-114975620977859110?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/114975620977859110/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=114975620977859110' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/114975620977859110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/114975620977859110'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/06/google-api-quelques-limites.html' title='GOOGLE API - Quelques limites à l&apos;utilisation de Google Earth et Google Maps avec Lotus Notes'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-114953573368929522</id><published>2006-06-05T21:20:00.000+02:00</published><updated>2006-07-06T10:45:41.586+02:00</updated><title type='text'>GOOGLE API - Lotus Notes et Google Maps</title><content type='html'>Google Maps est un service Web de cartographie accessible en français à l'adresse &lt;a href="http://maps.google.fr"&gt;http://maps.google.fr&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/366/1667/1600/sample_googlemaps.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/366/1667/400/sample_googlemaps.jpg" alt="" border="0" /&gt;&lt;/a&gt;Google fourni une API permettant de personnaliser cette carte. On peut ainsi ajouter ces propres points comme avec Google Earth.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Définition des étapes pour interfacer Lotus Notes et Google Maps&lt;/span&gt;&lt;br /&gt;L'intégration de Google Maps dans Lotus Notes peut se découper en trois étapes :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Obtention d'une clé API Google Maps&lt;/li&gt;&lt;li&gt;Création de la source de données   définissant les points à afficher (position, description)&lt;/li&gt;&lt;li&gt;Création d'une page web affichant la carte Google Maps ainsi que les points&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Etape 1 : Clé API Google Maps&lt;/span&gt;&lt;br /&gt;La clé permettant d'utiliser l'API Google Maps est limitée à une utilisation depuis une URL à définir. Seules les éléments directement accessibles depuis le "répertoire" spécifié dans l'URL permettent d'afficher la carte. Il faut donc faire très attention au choix de l'URL. Heureusement, en cas d'erreur il est toujours possible d'obtenir une nouvelle clé.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Si vous souhaitez définir l'appel à la carte depuis une page ou un agent il faudra spécifier l'URL permettant d'accèder à la base, par exemple http://www.acme.com/sample.nsf/&lt;/li&gt;&lt;li&gt;Par contre si vous souhaitez utiliser la carte depuis un document il ne faudra pas oublier d'ajouter la vue dans l'URL. Pour ne pas être trop limité je vous conseille d'utiliser la vue générique Lotus Notes "0", soit une url du type http://www.acme.com/sample/0/&lt;/li&gt;&lt;/ul&gt;Dans mon exemple, je me baserai sur une page pour déclarer l'appel à la carte Google Maps. J'ai donc déclaré comme URL&lt;span style="font-family:monospace;"&gt; : &lt;/span&gt;http://free.dominoserver.de/it/dominoweb.nsf/&lt;br /&gt;&lt;br /&gt;Pour obtenir une clé, rendez vous sur la page &lt;a href="http://www.google.com/apis/maps/"&gt;http://www.google.com/apis/maps/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Etape 2 : Création de la source de données&lt;/span&gt;&lt;br /&gt;Ayant besoin des mêmes informations que pour l'exemple de Google Earth, je me baserai sur le même masque pour les documents à représenter.&lt;br /&gt;&lt;br /&gt;De plus, le traitement d'extraction des données XML est gérée en javascript dans la page. On peut donc utiliser la même vue que pour Google Earth.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Création d'une vue XML pour Google Maps&lt;/span&gt;&lt;br /&gt;Tous les formats XML peuvent être utilisés pour être interfacés avec Google Maps du moment que l'on puisse extraire la longitude et la titude du point à représenter. Dans cet exemple j'ai choisi comme format :&lt;div style="color: rgb(204, 102, 0); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; font-size: 10px;"&gt;&lt;pre&gt;&amp;lt;markers&amp;gt;&lt;br /&gt;&amp;lt;marker lat="latitude" long="longitude" title="titre"&amp;gt;&lt;br /&gt;&amp;lt;description&amp;gt;&amp;lt;![CDATA[description]]&amp;gt;&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;lt;/marker&amp;gt;&lt;br /&gt;&amp;lt;/markers&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;La formule de colonne de la vue dédiée à Google Maps sera donc :&lt;div style="border: 1px dotted rgb(204, 102, 0); background-color: rgb(253, 249, 245); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; font-size: 8px;"&gt;"&amp;lt;marker lat=\"" + latitude + "\" long=\"" + longitude + "\" title=\"" + titre + "\"&amp;gt;&amp;lt;description&amp;gt;&amp;lt;![CDATA[" + description + "]]&amp;gt;&amp;lt;/description&amp;gt;&amp;lt;/marker&amp;gt;"&lt;/div&gt;Pour rappel, il faut cocher l'option "Traiter contenu comme du code HTML" dans les options de la vue.&lt;br /&gt;&lt;br /&gt;Il faut aussi créer un masque de vue afin de déclarer l'entête et le pied de page du fichier XML.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;On doit nommer le masque "$$ViewTemplate For &amp;lt;nom de la vue Google Maps&amp;gt;". &lt;/li&gt;&lt;li&gt;Le masque doit être déclaré avec un type de contenu Autre:text/xml (depuis le second onglet des options de masque).&lt;/li&gt;&lt;li&gt;Insérer les lignes suivantes : &lt;div style="border: 1px dotted rgb(204, 102, 0); background-color: rgb(253, 249, 245); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; font-size: 8px;"&gt;&amp;lt;?xml version="1.0" encoding="ISO-8859-1" ?&amp;gt;&lt;br /&gt;&amp;lt;markers&amp;gt;&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Ajouter une vue Intégrée en spécifiant comme type d'affichage : A l'aide du code HTML&lt;/li&gt;&lt;li&gt;Insérer la ligne suivante : &lt;div style="border: 1px dotted rgb(204, 102, 0); background-color: rgb(253, 249, 245); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; font-size: 8px;"&gt;&amp;lt;/markers&amp;gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Etape 3 : Création de la page d'affichage de la carte et des points&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Il faut maintenant créer la page web qui permettra d'afficher la carte Google Maps avec les points correspondant à la position des documents. Comme indiqué précédemment, j'utilise une "Page" pour déclarer mon code mais on peut aussi utiliser un agent ou un document.&lt;br /&gt;&lt;br /&gt;Le code minimal pour afficher la carte sans les points :&lt;br /&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); background-color: rgb(253, 249, 245); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; font-size: 8px;"&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"&lt;br /&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="content-type" content="text/html; charset=utf-8"/&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Google Maps JavaScript API Example&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;script src="http://maps.google.com/maps?file=api&amp;v=2&amp;amp;key=MaCleAPIGoogleMaps"&lt;br /&gt;type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;//&amp;lt;![CDATA[&lt;br /&gt;function load() {&lt;br /&gt;if (GBrowserIsCompatible()) {&lt;br /&gt;var map = new GMap2(document.getElementById("map"));&lt;br /&gt;map.addControl(new GLargeMapControl());&lt;br /&gt;map.addControl(new GMapTypeControl());&lt;br /&gt;map.setCenter(new GLatLng(27.994401,13.164063),1, G_HYBRID_MAP );&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;//]]&amp;gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body onload="load()" onunload="GUnload()"&amp;gt;&lt;br /&gt;&amp;lt;div id="map" style="width: 500px; height: 300px"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Il va maintenant falloir ajouter les points sur la carte. On va utiliser la fonction Google &lt;span style="font-style: italic;"&gt;"GDownloadUrl"&lt;/span&gt; pour récupérer les données de la vue XML&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); background-color: rgb(253, 249, 245); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; font-size: 8px;"&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"&lt;br /&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="content-type" content="text/html; charset=utf-8"/&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Google Maps JavaScript API Example&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;script src="http://maps.google.com/maps?file=api&amp;v=2&amp;amp;key=MaCleAPIGoogleMaps"&lt;br /&gt;type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;//&amp;lt;![CDATA[&lt;br /&gt;function load() {&lt;br /&gt;&lt;br /&gt;if (GBrowserIsCompatible()) {&lt;br /&gt;var map = new GMap2(document.getElementById("map"));&lt;br /&gt;map.addControl(new GLargeMapControl());&lt;br /&gt;map.addControl(new GMapTypeControl());&lt;br /&gt;map.setCenter(new GLatLng(27.994401,13.164063),1, G_HYBRID_MAP );&lt;br /&gt;&lt;br /&gt;GDownloadUrl("googlemaps.xml", function(data, responseCode) {&lt;br /&gt;var xml = GXml.parse(data);&lt;br /&gt;var markers = xml.documentElement.getElementsByTagName("marker");&lt;br /&gt;for (var i = 0; i &amp;lt; markers.length; i++) {&lt;br /&gt;  var latitude = parseFloat(markers[i].getAttribute("lat"));&lt;br /&gt;  var longitude =  parseFloat(markers[i].getAttribute("long"));&lt;br /&gt;  var title =  markers[i].getAttribute("title");&lt;br /&gt;  var desc =&lt;br /&gt;   markers[i].getElementsByTagName("description")[0].firstChild.nodeValue;&lt;br /&gt;  var point = new GLatLng(latitude,longitude);&lt;br /&gt;  var marker = new GMarker(point);&lt;br /&gt;  map.addOverlay(marker);&lt;br /&gt;}&lt;br /&gt;});&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;//]]&amp;gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body onload="load()" onunload="GUnload()"&amp;gt;&lt;br /&gt;&amp;lt;div id="map" style="width: 500px; height: 300px"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;On peut remarquer les deux appels différents en javascript pour extraire les données du fichier XML :&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;var latitude = parseFloat(markers[i].&lt;/span&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;getAttribute("lat")&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;); &lt;/span&gt;&lt;br /&gt;Permet d'extraire la valeur d'un attribut de tag XML&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;var desc =  markers[i].&lt;span style="font-weight: bold;"&gt;getElementsByTagName("description")[0]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-weight: bold;"&gt;.firstChild.nodeValue;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Permet d'extraire la donnée déclarée entre deux tags XML.&lt;/li&gt;&lt;/ul&gt;Seuls les points sont afficher. Il ne se passe rien lorsque l'on clique sur ceux-ci. Il va falloir ajouter un évènement sur chacun des points pour zoomer sur la zone et afficher la bulle de description du site.&lt;br /&gt;On va donc déclarer une nouvelle fonction Javascript permettant de gérer la déclaration du point avec ces évènements associés : &lt;div style="border: 1px dotted rgb(204, 102, 0); background-color: rgb(253, 249, 245); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; font-size: 8px;"&gt;&lt;pre&gt;function createMarker(point,title, desc ) {&lt;br /&gt;var bulle = "&amp;lt;h3&amp;gt;" +  title + "&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;" + desc +"&amp;lt;/p&amp;gt;";&lt;br /&gt;var marker = new GMarker(point);&lt;br /&gt;GEvent.addListener(marker, "click", function() {&lt;br /&gt;map.setCenter(point,14, G_HYBRID_MAP );&lt;br /&gt;marker.openInfoWindowHtml(bulle);&lt;br /&gt;});&lt;br /&gt;return marker;&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;On remplace alors l'appel &lt;span style="color: rgb(204, 102, 0);font-family:courier new;" &gt;var marker = new GMarker(point);&lt;/span&gt; par &lt;span style="color: rgb(204, 102, 0);font-family:courier new;" &gt;var marker = createMarker(point,title, desc);&lt;/span&gt;&lt;br /&gt;Un exemple complet est accessible à l'adresse : &lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/googlemaps"&gt;http://free.dominoserver.de/it/dominoweb.nsf/googlemaps&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;L'API Google Maps offre évidemment beaucoup d'autres fonctionnalités que je n'ai pas décrites ici. Je vous invite à aller lire la &lt;a href="http://www.google.com/apis/maps/documentation/"&gt;documentation de l'API&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-114953573368929522?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/114953573368929522/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=114953573368929522' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/114953573368929522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/114953573368929522'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/06/google-api-lotus-notes-et-google-maps.html' title='GOOGLE API - Lotus Notes et Google Maps'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-114950232410869380</id><published>2006-06-05T11:46:00.000+02:00</published><updated>2006-07-06T10:44:25.020+02:00</updated><title type='text'>GOOGLE API - Lotus Notes et Google Earth</title><content type='html'>La visualisation de la position des documents depuis Google Earth est la plus simple à implémenter. Google Earth offre en effet la possibilité d'ajouter des points personnalisés sous forme de fichiers au format KML.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Description rapide du format KML&lt;/span&gt;&lt;br /&gt;Les fichiers KML sont des fichiers XML permettant de décrire les points à afficher sur la mappemonde. Cette description comprend la position mais aussi la description du site.&lt;div style="border: 1px dotted rgb(204, 102, 0); background-color: rgb(253, 249, 245); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; font-size: 8px;"&gt;&amp;lt;kml xmlns="http://earth.google.com/kml/2.0"&amp;gt;&lt;br /&gt;&amp;lt;Placemark&amp;gt;&lt;br /&gt;&lt;span style="margin-left: 20px;"&gt;&amp;lt;description&amp;gt;&amp;lt;![CDATA[&amp;lt;a href="http://www.google.com/"&gt;Google Search!&amp;lt;/a&amp;gt;]]&gt;&amp;lt;/description&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="margin-left: 20px;"&gt;&amp;lt;name&amp;gt;Google Headquarters&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="margin-left: 20px;"&gt;&amp;lt;Lookat&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="margin-left: 40px;"&gt;&amp;lt;longitude&amp;gt;-122.0839&amp;lt;/longitude&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="margin-left: 40px;"&gt;&amp;lt;latitude&amp;gt;37.4219&amp;lt;/latitude&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="margin-left: 40px;"&gt;&amp;lt;range&amp;gt;540.68&amp;lt;/range&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="margin-left: 40px;"&gt;&amp;lt;tilt&amp;gt;0&amp;lt;/tilt&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="margin-left: 40px;"&gt;&amp;lt;heading&amp;gt;3&amp;lt;/heading&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="margin-left: 20px;"&gt;&amp;lt;/Lookat&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="margin-left: 20px;"&gt;&amp;lt;Point&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="margin-left: 40px;"&gt;&amp;lt;coordinates&amp;gt;-122.0839,37.4219,0&amp;lt;/coordinates&amp;gt;&lt;br /&gt;&lt;span style="margin-left: 20px;"&gt;&amp;lt;/Point&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;/Placemark&amp;gt;&lt;br /&gt;&amp;lt;/kml&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Placemark&lt;/span&gt; : description d'un nouveau point&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;description&lt;/span&gt; : description affichée dans l'info bulle. On peut y insérer du code HTML comme dans cet exemple.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;name&lt;/span&gt; : nom du point affiché sur la carte&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Lookat&lt;/span&gt; : définition du point&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;longitude&lt;/span&gt; : longitude du point&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;latitude&lt;/span&gt; : latitude du point&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;range&lt;/span&gt; : hauteur depuis laquelle sera présentée le point lorsque l'on double clique sur celui-ci&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;tilt&lt;/span&gt; : angle sous lequel le point sera présenté&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;heading&lt;/span&gt; : angle par rapport à l'horizon sous lequel le point sera présenté&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;coordinates&lt;/span&gt; : coordonnées du point&lt;/li&gt;&lt;/ul&gt;Si l'on veut indiquer plusieurs points (Placemark), il faut les déclarer sous la balise racine &amp;lt;Document&amp;gt; qui accepte aussi la balise name permettant de nommer le flux dans Google Earth.&lt;br /&gt;&lt;br /&gt;D'autres options peuvent aussi être appliquées comme l'icone représentant le point par exemple. Le but de cet article n'étant pas de présenter toutes les options de Google Earth je vous invite à consulter l'aide  (&lt;a href="http://www.keyhole.com/kml/docs/webhelp/index.htm"&gt;http://www.keyhole.com/kml/docs/webhelp/index.htm&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Intégration dans Lotus Notes à partir d'une simple vue&lt;/span&gt;&lt;br /&gt;Il existe évidemment plusieurs techniques dans Lotus Notes pour mettre à disposition un fichier KML à partir des documents. Je vais présenter celle qui me semble la plus simple et la plus naturelle, la création d'une vue.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;Etape 1 : Le document&lt;/span&gt;&lt;br /&gt;Les éléments indispensables pour présenter un point sont :&lt;ul&gt;&lt;li&gt;un titre&lt;/li&gt;&lt;li&gt;une rapide description&lt;/li&gt;&lt;li&gt;la longitude&lt;/li&gt;&lt;li&gt;la latitude&lt;/li&gt;&lt;/ul&gt;Les autres éléments peuvent être génériques. Ils seront définis dans la vue dans mon exemple.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/366/1667/1600/googleearthform.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/366/1667/320/googleearthform.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;Etape 2 : La vue Notes&lt;/span&gt;&lt;br /&gt;Après création de la nouvelle vue, cocher l'option "Traiter contenu comme code HTML".&lt;br /&gt;Spécifier comme formule de colonne (faire très attention aux majuscules et minuscules des tags XML)&lt;br /&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); background-color: rgb(253, 249, 245); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; font-size: 8px;"&gt;"&amp;lt;Placemark&amp;gt;&lt;br /&gt;&amp;lt;description&amp;gt;&amp;lt;![CDATA[" + description + "]]&amp;gt;&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;" + titre + "&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;lt;Lookat&amp;gt;&lt;br /&gt;&amp;lt;longitude&amp;gt;" + longitude + "&amp;lt;/longitude&amp;gt;&lt;br /&gt;&amp;lt;latitude&amp;gt;" + latitude + "&amp;lt;/latitude&amp;gt;&lt;br /&gt;&amp;lt;range&amp;gt;540.68&amp;lt;/range&amp;gt;&lt;br /&gt;&amp;lt;tilt&amp;gt;0&amp;lt;/tilt&amp;gt;&lt;br /&gt;&amp;lt;heading&amp;gt;3&amp;lt;/heading&amp;gt;&lt;br /&gt;&amp;lt;/Lookat&amp;gt;&lt;br /&gt;&amp;lt;Point&amp;gt;&lt;br /&gt;&amp;lt;coordinates&amp;gt;" + longitude + "," + latitude +"&amp;lt;/coordinates&amp;gt;&lt;br /&gt;&amp;lt;/Point&amp;gt;&lt;br /&gt;&amp;lt;/Placemark&amp;gt;"&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;Etape 3 : le masque de vue&lt;/span&gt;&lt;br /&gt;La vue étant diffusée sur le Web, on va créer un masque de vue permettant d'intégrer l'entête du fichier ainsi que le code caractère pour le support des accents en français.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Création d'un masque nommé : $$ViewTemplate For &amp;lt;nom de la vue Google Earth&amp;gt;&lt;/li&gt;&lt;li&gt;&lt;nom&gt;Cocher l'option "Type de fichier : Autres : Application/vnd.google-earth.kml+xml"&lt;/nom&gt;&lt;/li&gt;&lt;li&gt;&lt;nom&gt;Insérer les lignes d'entête du fichier&lt;/nom&gt;&lt;/li&gt;&lt;div style="border: 1px dotted rgb(204, 102, 0); background-color: rgb(253, 249, 245); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; font-size: 8px;"&gt;&amp;lt;?xml version="1.0" encoding="iso-8859-1" ?&amp;gt;&lt;br /&gt;&amp;lt;kml xmlns="http://earth.google.com/kml/2.0"&amp;gt;&lt;br /&gt;&amp;lt;Document&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;Titre de mon flux Google Earth&amp;lt;/name&amp;gt;&lt;/div&gt;&lt;li&gt;Insérer la vue intégrée (Dans le menu, Création\Elément Intégré\Vue)&lt;/li&gt;&lt;li&gt;Insérer la ligne de fermeture du fichier XML&lt;div style="border: 1px dotted rgb(204, 102, 0); background-color: rgb(253, 249, 245); font-family: Lucida,Courier,MS Courier New,Prestige,Everson Mono; font-size: 8px;"&gt;&amp;lt;/Document&amp;gt;&lt;br /&gt;&amp;lt;/kml&amp;gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/366/1667/1600/googleearthview.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/366/1667/320/googleearthview.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Etape 4 : Intégration dans GoogleEarth&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Le type MIME ayant été défini dans les options du masque de vue, il suffit d'ouvrir la vue depuis un navigateur Web pour que la fenêtre de lancement d'application vous soit proposée. Une fois validé, le nouveau flux est automatiquement intégré dans Google Earth.&lt;br /&gt;&lt;br /&gt;Vous pouvez aussi ajouter le flux KML depuis Google Earth en ouvrant le menu Add\Network Link puis en indiquant l'URL de la vue dans le champ Location.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Limitation des droits d'accès&lt;/span&gt;&lt;br /&gt;Attention, la base Notes doit être au moins accessible en lecture pour "Anonymous". Nous verrons par la suite comment contourner ce problème.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 102, 0);"&gt;Exemple&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Un exemple de fichier KML depuis une base Notes : &lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/googleearth.kml"&gt;http://free.dominoserver.de/it/dominoweb.nsf/googleearth.kml&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Le fichier XML lisible depuis un navigateur Web :&lt;a href="http://free.dominoserver.de/it/dominoweb.nsf/googleearth.xml"&gt; http://free.dominoserver.de/it/dominoweb.nsf/googleearth.xml&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-114950232410869380?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/114950232410869380/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=114950232410869380' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/114950232410869380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/114950232410869380'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/06/google-api-lotus-notes-et-google-earth.html' title='GOOGLE API - Lotus Notes et Google Earth'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29226276.post-114938091604256171</id><published>2006-06-01T19:04:00.000+02:00</published><updated>2006-07-06T10:43:44.596+02:00</updated><title type='text'>GOOGLE API - Google Earth et Google Maps les nouvelles vues de Lotus Notes</title><content type='html'>Grace à GoogleEarth et GoogleMaps il est désormaispossible de présenter facilement les documents, non plus à travers des vues, mais directement sur la planète.&lt;br /&gt;&lt;br /&gt;Le but de ce premier thème est de présenter des méthodes simples pour&lt;br /&gt;&lt;ol&gt;&lt;li&gt;visualiser les documents sous Google Earth&lt;/li&gt;&lt;li&gt;visualiser les documents sous Google Maps&lt;/li&gt;&lt;li&gt;Les limitations de l'utilisation de ces outils&lt;/li&gt;&lt;li&gt;simplifier la recherche de longitude et latitude&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Pourquoi représenter les documents sur une carte ?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;La géolocalisation des documents ne doit évidemment pas être généralisée à tous les types de documents. La première condition est évidemment de pouvoir associer une position géographique à un document. A partir de là, la représentation sur une carte peut avoir deux intérêts :&lt;ul&gt;&lt;li&gt;Connaître la position géographique d'un document&lt;/li&gt;&lt;li&gt;Connaître les documents qui existent sur une position géographique&lt;/li&gt;&lt;/ul&gt;Les deux approches sont totalement différentes. Même si Google Earth et Google Maps peuvent répondre aux deux approches, ils pourront plus ou moins facilement s'adapter nativement au besoin.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Différences entre GoogleEarth et Google Maps&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Google Earth est un logiciel alors que Google Maps est un service utilisable depuis un navigateur Web récent (IE 6.0 et supp, ou Firefox).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Google Earth&lt;/span&gt; demande un minimum au niveau de la configuration du poste client et plus particulièrement au niveau de la carte graphique. Google propose une version complète et non limitée dans le temps que l'on peut télécharger à cette adresse : &lt;a href="http://earth.google.com/download-earth.html"&gt;http://earth.google.com/download-earth.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/366/1667/320/googleearth.png" alt="" border="0" /&gt;&lt;span style="font-style: italic;"&gt;Interface Google Earth&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Google Maps&lt;/span&gt; est accessible en français à l'adresse &lt;a href="http://maps.google.fr"&gt;http://maps.google.fr&lt;/a&gt;. De plus google a mis à disposition une API permettant de personnaliser la carte. C'est cette API qui sera utilisée pour représenter la position des documents Lotus Notes.  Pour plus d'informations sur l'API GoogleMaps vous pouvez consulter le site &lt;a href="http://www.google.com/apis/maps/"&gt;http://www.google.com/apis/maps/&lt;/a&gt;. Mais j'y reviendrai lors de la présentation de l'intégration de cet outil dans Lotus Notes.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/366/1667/320/googlemaps.png" alt="" border="0" /&gt;&lt;span style="font-style: italic;"&gt;Interface Google Maps&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29226276-114938091604256171?l=dominoweb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dominoweb.blogspot.com/feeds/114938091604256171/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29226276&amp;postID=114938091604256171' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/114938091604256171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29226276/posts/default/114938091604256171'/><link rel='alternate' type='text/html' href='http://dominoweb.blogspot.com/2006/06/google-api-google-earth-et-google-maps.html' title='GOOGLE API - Google Earth et Google Maps les nouvelles vues de Lotus Notes'/><author><name>Philippe GAUVIN</name><uri>http://www.blogger.com/profile/12499706055358952821</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/blogger/366/1667/400/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
