<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.alti.info/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Alt-I, des informations alternatives - Informatique, Cultures alternatives et Geekeries saupoudrées d'Ajax. - projet</title>
  <link>http://www.alti.info/</link>
  <description>Alt-I, des informations alternatives. Podcast causant d'informatique généraliste et de cultures alternatives avec un soupçon de XHTML, CSS, AJAX, Javascript, et autres outils web…</description>
  <language>fr</language>
  <pubDate>Wed, 20 Aug 2008 22:54:35 +0200</pubDate>
  <copyright>Creative Commons By-NC-SA</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Menu en colonne en Javascript</title>
    <link>http://www.alti.info/post/2008/02/10/Menu-en-colonne-en-Javascript-MenuCol</link>
    <guid isPermaLink="false">urn:md5:064ed3aabc6d7fb10273d8334fd82cc5</guid>
    <pubDate>Tue, 12 Feb 2008 12:55:00 +0100</pubDate>
    <dc:creator>Hadrien</dc:creator>
        <category>Développement</category>
        <category>accessibilité</category><category>AJAX</category><category>concept</category><category>developpement</category><category>ergonomie</category><category>free</category><category>GPL</category><category>GUI</category><category>JavaScript</category><category>Mac OS X</category><category>open source</category><category>programmation</category><category>projet</category><category>téléchargement</category>    
    <description>&lt;p&gt;&lt;a href=&quot;http://www.nicolas-guilhou.com/&quot; hreflang=&quot;fr&quot;&gt;Xylpho&lt;/a&gt; voulait pour son site, un menu en colonne comme le fait Mac OS X&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.alti.info/images/Scrinchoutes/Menu_Colonne_Mac_OS_X_piti.png&quot; alt=&quot;Menu Colonne Mac OS X&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Ce menu devait être à la fois accessible, référençable et dynamique. Donc, pas de flash&amp;nbsp;! Javascript à la rescousse. Je lui ai donc codé une classe JS qui construit un menu en colonne à partir de listes imbriquées…&lt;/p&gt;    &lt;p&gt;En gros, tout le plan du site est intégré dans la page et structuré avec des ul et des li imbriqués&amp;nbsp;:&lt;/p&gt;

&lt;a href=&quot;http://www.alti.info/post/2008/02/10/#&quot; onclick=&quot;document.getElementById('codeHTML').style.display = 'block'; return false;&quot;&gt;
Voir le code HTML
&lt;/a&gt;
&lt;pre id=&quot;codeHTML&quot; style=&quot;display: none;&quot;&gt;
&amp;lt;ul id=&quot;menuCol&quot;&amp;gt;
	&amp;lt;li&amp;gt;
		2005
		&amp;lt;ul&amp;gt;
			&amp;lt;li&amp;gt;
				July
				&amp;lt;ul&amp;gt;
					&amp;lt;li&amp;gt;
						27
						&amp;lt;ul&amp;gt;
							&amp;lt;li&amp;gt;
								&amp;lt;a href=&quot;http://www.alti.info/post/2008/02/10/?id=4&quot;&amp;gt;
									Joulie Interface
								&amp;lt;/a&amp;gt;
							&amp;lt;/li&amp;gt;
						&amp;lt;/ul&amp;gt;
					&amp;lt;/li&amp;gt;
				&amp;lt;/ul&amp;gt;
			&amp;lt;/li&amp;gt;
			&amp;lt;li&amp;gt;
				September
				&amp;lt;ul&amp;gt;
					&amp;lt;li&amp;gt;
						29
						&amp;lt;ul&amp;gt;
							&amp;lt;li&amp;gt;
								&amp;lt;a href=&quot;http://www.alti.info/post/2008/02/10/?id=11&quot;&amp;gt;
									Version Texte
								&amp;lt;/a&amp;gt;
							&amp;lt;/li&amp;gt;
						&amp;lt;/ul&amp;gt;
					&amp;lt;/li&amp;gt;
				&amp;lt;/ul&amp;gt;
			&amp;lt;/li&amp;gt;
			&amp;lt;li&amp;gt;
				October
				&amp;lt;ul&amp;gt;
					&amp;lt;li&amp;gt;
						29
						&amp;lt;ul&amp;gt;
							&amp;lt;li class=&quot;selected&quot;&amp;gt;
								&amp;lt;a href=&quot;http://www.alti.info/post/2008/02/10/?id=18&quot;&amp;gt;
									Qjelt Octobre en VideoCast
								&amp;lt;/a&amp;gt;
							&amp;lt;/li&amp;gt;
						&amp;lt;/ul&amp;gt;
					&amp;lt;/li&amp;gt;
				&amp;lt;/ul&amp;gt;
			&amp;lt;/li&amp;gt;
			&amp;lt;li&amp;gt;
				November
				&amp;lt;ul&amp;gt;
					&amp;lt;li&amp;gt;
						08
						&amp;lt;ul&amp;gt;
							&amp;lt;li&amp;gt;
								&amp;lt;a href=&quot;http://www.alti.info/post/2008/02/10/?id=19&quot;&amp;gt;
									www.alti.info
								&amp;lt;/a&amp;gt;
							&amp;lt;/li&amp;gt;
						&amp;lt;/ul&amp;gt;
					&amp;lt;/li&amp;gt;
				&amp;lt;/ul&amp;gt;
			&amp;lt;/li&amp;gt;
			&amp;lt;li&amp;gt;
				December
				&amp;lt;ul&amp;gt;
					&amp;lt;li&amp;gt;
						08
						&amp;lt;ul&amp;gt;
							&amp;lt;li&amp;gt;
								&amp;lt;a href=&quot;http://www.alti.info/post/2008/02/10/?id=20&quot;&amp;gt;
									OW Pick !!!
								&amp;lt;/a&amp;gt;
							&amp;lt;/li&amp;gt;
						&amp;lt;/ul&amp;gt;
					&amp;lt;/li&amp;gt;
				&amp;lt;/ul&amp;gt;
			&amp;lt;/li&amp;gt;
		&amp;lt;/ul&amp;gt;
	&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/pre&gt;



&lt;p&gt;Ensuite, ma classe Javascript va masquer et afficher les bons ul selon les clicks sur les li. Le menu se crée en créant un nouvel objet de la sorte&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
&amp;lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&amp;gt;
//&amp;lt;![CDATA[
	var test = new MenuCol.Menu('menuCol');
	MenuCol.Item.open();
//]]&amp;gt;
&amp;lt;/script&amp;gt;
&lt;/pre&gt;



&lt;p&gt;La statique open() permet d'initialiser le menu sur le li qui contient la classe 'selected' afin de revenir sur le menu correspondant après un chargement de page.&lt;/p&gt;


&lt;p&gt;Tout ceci fonctionne grâce au script MenuCol.js, que je rends disponible sous licence GPLv3. Faites en ce que voulez, mais souvenez vous de citer mon nom.&lt;/p&gt;

&lt;a href=&quot;http://www.alti.info/post/2008/02/10/#&quot; onclick=&quot;document.getElementById('codeJS').style.display = 'block'; return false;&quot;&gt;
Voir le code Javascript
&lt;/a&gt;
&lt;pre id=&quot;codeJS&quot; style=&quot;display: none;&quot;&gt;
// Global object
var MenuCol = {};

/**
 * Flag to stop propagation of event
 * @type Boolean
 */
MenuCol._stopPropagation = false;

/**
 Shortcut to document.getElementById
 * @param {String/Element} id Element or Element's id
 * @returns Element
 */
MenuCol.get = function(id)
{
	var elmt = document.getElementById(id);
	if (elmt)
	{
		return elmt;
	}
	return id;
};

// Objects collection
MenuCols = new Array();

/**
 * Menu class
 * @constructor
 * @param {String/Element} elmt UL menu Element or it's id
 * @author Hadrien Lanneau
 */
MenuCol.Menu = function(elmt)
{
	/**
	 * Element
	 * @type Element
	 */
	this.element = MenuCol.get(elmt);
	
	/**
	 * Items inside Menu
	 * @type Array
	 */
	this.items = new Array();
	
	MenuCols.push(this);
	
	this.init();
}
MenuCol.Menu.prototype =
{
	/**
	 * Initialize
	 */
	init: function()
	{
		// Make Item object with all li children
		var lis = this.element.getElementsByTagName('li');
		for (var i = 0; lis[i]; i++)
		{
			if (lis[i].parentNode == this.element)
			{
				var item = new MenuCol.Item(
					lis[i]
				);
				item.parent = this;
				this.items.push(
					item
				);
			}
		}
	},
	/**
	 * Hide menu
	 */
	hide: function()
	{
		this.element.style.display = 'none';
	},
	/**
	 * Show Menu
	 */
	show: function()
	{
		this.element.style.display = 'block';
	}
};

MenuCol.Items = new Array();
/**
 * MenuCol.Item class
 * @constructor
 * @param {String/Element} elmt UL menu Element or it's id
 * @author Hadrien Lanneau
 */
MenuCol.Item = function(elmt)
{
	/**
	 * Element
	 * @type Element
	 */
	this.element = MenuCol.get(elmt);
	
	/**
	 * Submenu
	 * @type MenuCol.Menu
	 */
	this.submenu = null;
	
	MenuCol.Items.push(this);
	
	this.init();
}
MenuCol.Item.prototype =
{
	/**
	 * Initialize
	 */
	init: function()
	{
		// Make Menu object with all UL children
		var uls = this.element.getElementsByTagName('ul');
		for (var i = 0; uls[i]; i++)
		{
			if (uls[i].parentNode == this.element)
			{
				this.submenu = new MenuCol.Menu(
					uls[i]
				);
				this.submenu.parent = this;
				this.submenu.hide();
			}
		}
		
		// Add on click Event on element
		this.element.parent = this;
		this.element.onclick = this.onclick;
	},
	/**
	 * onclick event
	 */
	onclick: function()
	{
		// Exec only on first fire
		if (!MenuCol._stopPropagation)
		{
			// If item hasn't submenu, we don't do anything
			if (!this.parent.submenu)
			{
				return true;
			}
			
			// Hiding all sub menus of same level
			for (var i = 0; this.parent.parent.items[i]; i++)
			{
				if (this.parent.parent.items[i].submenu)
				{
					this.parent.parent.items[i].submenu.hide();
					this.parent.parent.items[i].activate(
						true,
						true
					);
				}
			}
			
			// …and their children
			for (i = 0; this.parent.submenu.items[i]; i++)
			{
				this.parent.submenu.items[i].activate(true);
				if (this.parent.submenu.items[i].submenu)
				{
					this.parent.submenu.items[i].submenu.hide();
				}
			}
			
			// Show corresponding sub menu
			this.parent.submenu.show();
			
			// And its parents
			var parent = this.parent ?
				this.parent :
				null;
			while (parent)
			{
				parent.parent.show();
				parent.activate(
					false,
					false
				);
				parent = parent.parent ?
					parent.parent.parent :
					null;
			}
			
			// Activate item
			this.parent.activate(
				false,
				true
			);
			
			// Prevents event propagation on parent's elements
			MenuCol._stopPropagation = true;
			setTimeout(
				function()
				{
					MenuCol._stopPropagation = false;
				},
				20
			)
		}
	},
	/**
	 * activate element
	 * @param {Boolean} oupa True to deactivate
	 */
	activate: function(oupa, submenu)
	{
		// Activate item
		if (!oupa)
		{
			this.element.className = 'selected';
		}
		else
		{
			this.element.className = '';
		}
		// Activate submenu
		if (submenu)
		{
			if (!oupa)
			{
				this.submenu.element.className = 'selected';
			}
			else
			{
				this.parent.element.className = '';
			}
		}
	}
};

/**
 * Open menu on activated li. Will open on li with 'selected' class
 */
MenuCol.Item.open = function()
{
	for (var i = 0; MenuCol.Items[i]; i++)
	{
		if (MenuCol.Items[i].element.className == 'selected')
		{
			if (MenuCol.Items[i].submenu)
			{
				MenuCol.Items[i].element.onclick();
				
			}
			else
			{
				MenuCol.Items[i].parent.parent.element.onclick();
				MenuCol.Items[i].activate();
			}
		}
	}
}
&lt;/pre&gt;


&lt;pre&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Voici un exemple du résultat qui &lt;a href=&quot;http://www.hadrien.eu/Works/menuCol/&quot; hreflang=&quot;fr&quot;&gt;affiche les archives de ce blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.hadrien.eu/telechargements.html#cadre_content&quot; hreflang=&quot;en&quot;&gt;Télécharger le script&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://www.alti.info/post/2008/02/10/Menu-en-colonne-en-Javascript-MenuCol#comment-form</comments>
      <wfw:comment>http://www.alti.info/post/2008/02/10/Menu-en-colonne-en-Javascript-MenuCol#comment-form</wfw:comment>
      <wfw:commentRss>http://www.alti.info/feed/rss2/comments/238</wfw:commentRss>
      </item>
    
  <item>
    <title>Hadrien.eu V2</title>
    <link>http://www.alti.info/post/2007/07/21/Hadrien-eu-V2-ajax-yui</link>
    <guid isPermaLink="false">urn:md5:8f13f3baf449ded5595d74a1a6f2e84c</guid>
    <pubDate>Sat, 21 Jul 2007 19:21:00 +0200</pubDate>
    <dc:creator>Hadrien</dc:creator>
        <category>Général</category>
        <category>accessibilité</category><category>AJAX</category><category>Alsacréations</category><category>developpement</category><category>innovation</category><category>JavaScript</category><category>perso</category><category>projet</category><category>web2.0</category>    
    <description>    &lt;p&gt;Je viens de mettre en ligne &lt;strong&gt;&lt;a href=&quot;http://www.hadrien.eu/&quot; hreflang=&quot;fr&quot;&gt;la version 2 de ma home page&amp;nbsp;: Hadrien.eu&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;!&lt;/p&gt;


&lt;p&gt;Même si le contenu est pas forcément très intéressant (CV, screenshots de créations web, etc), le site reste à voir de par sa conception. &lt;strong&gt;Réalisé en Ajax à l'aide de &lt;a href=&quot;http://developer.yahoo.com/yui/&quot; hreflang=&quot;en&quot;&gt;YUI&lt;/a&gt;&lt;/strong&gt;, ce site est digne d'une animation flash avec l'accessibilité en plus. &lt;a href=&quot;http://www.hadrien.eu&quot; hreflang=&quot;fr&quot;&gt;Je vous invite à y jeter un œil&lt;/a&gt; &lt;img src=&quot;/themes/Alt-I/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.hadrien.eu&quot; hreflang=&quot;fr&quot;&gt;Hadrien.eu V2&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;EDIT&amp;nbsp;: Hadrien.eu a été sélectionné pour participer au &lt;a href=&quot;http://www.alti.info/post/2007/06/06/LEte-des-cascades-stylees-alsacreations-concours\fr&quot;&gt;Concours Cascading Style Summer Refresh 2007&lt;/a&gt; \o/ Je vous préviendrais pour venir voter en masse pour lui &lt;img src=&quot;/themes/Alt-I/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.alti.info/post/2007/07/21/Hadrien-eu-V2-ajax-yui#comment-form</comments>
      <wfw:comment>http://www.alti.info/post/2007/07/21/Hadrien-eu-V2-ajax-yui#comment-form</wfw:comment>
      <wfw:commentRss>http://www.alti.info/feed/rss2/comments/141</wfw:commentRss>
      </item>
    
  <item>
    <title>Ça fuse !!!</title>
    <link>http://www.alti.info/post/2007/01/26/78-ca-fuse</link>
    <guid isPermaLink="false">urn:md5:2f7c363092f6e92b255a51b2b9980f59</guid>
    <pubDate>Fri, 26 Jan 2007 17:19:22 +0000</pubDate>
    <dc:creator>Hadrien</dc:creator>
        <category>Général</category>
        <category>developpement</category><category>Google</category><category>libre</category><category>projet</category><category>SSH</category><category>TextMate</category>    
    <description>    &lt;img src=&quot;http://www.alti.info/images/Image 2.png&quot; alt=&quot;&quot; style=&quot;float: left;margin: 10px;&quot; height=&quot;110&quot; /&gt;&lt;p&gt;
Je viens de découvrir &lt;acronym title=&quot;Filesystem in USErpace&quot;&gt;&lt;strong&gt;FUSE&lt;/strong&gt;&lt;/acronym&gt;. &lt;strong&gt;FUSE&lt;/strong&gt; est un Système de fichier virtuel qui permet, à l'aide de plugin, d'ajouter très facilement d'autres systèmes de fichiers à votre système sans toucher à votre kernel. Un portage pour &lt;strong&gt;Mac OS X&lt;/strong&gt; est désormais disponible chez &lt;a href=&quot;http://code.google.com/p/macfuse/&quot; hreflang=&quot;en&quot;&gt;Google Code&lt;/a&gt; et nous permet d'utiliser les systèmes de fichiers &lt;strong&gt;SSHFS&lt;/strong&gt; et &lt;strong&gt;Spotlight FS&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
En pratique, &lt;strong&gt;SSHFS&lt;/strong&gt; permet de monter un dossier &lt;strong&gt;SSH&lt;/strong&gt; dans le finder et de manipuler et éditer les fichiers en toute transparence. Très pratique pour travailler sur un serveur de dev avec &lt;strong&gt;TextMate&lt;/strong&gt;. Toute la hiérarchie m'apparaît comme étant en local. (Faut que je teste le plugin SVN de TextMate :D).&lt;br /&gt;
Le second, &lt;strong&gt;Spotlight FS&lt;/strong&gt;, est censé permettre d'avoir un accès plus complet aux dossiers intelligents de Spotlight. Là où les &quot;smart folder&quot; de Mac OS X ne nous permettent que d'afficher les résultats de la requête, un dosser Spotlight FS affiche les résultats comme étant un vrai dossier contenant de vrais fichiers… en théorie. Chez moi ça a planté. &lt;img src=&quot;/themes/Alt-I/smilies/sad.png&quot; alt=&quot;:(&quot; class=&quot;smiley&quot; /&gt; Peut être dans une prochaine version…
&lt;/p&gt;
&lt;p&gt;
Tiens, d'ailleurs, Ce qui pourrait être énorme, ce serait un &lt;strong&gt;FTP FS&lt;/strong&gt; qui nous permettrait enfin sur Mac d'avoir accès au FTP en écriture dans le Finder !
&lt;/p&gt;</description>
    
    
    
          <comments>http://www.alti.info/post/2007/01/26/78-ca-fuse#comment-form</comments>
      <wfw:comment>http://www.alti.info/post/2007/01/26/78-ca-fuse#comment-form</wfw:comment>
      <wfw:commentRss>http://www.alti.info/feed/rss2/comments/71</wfw:commentRss>
      </item>
    
  <item>
    <title>TextMate et Javascript</title>
    <link>http://www.alti.info/post/2006/09/10/57-textmate-et-javascript</link>
    <guid isPermaLink="false">urn:md5:1dc1fdf0f464b1c26fef1c1e41dbab43</guid>
    <pubDate>Sun, 10 Sep 2006 17:10:17 +0000</pubDate>
    <dc:creator>Hadrien</dc:creator>
        <category>Général</category>
        <category>AJAX</category><category>developpement</category><category>fuckIE</category><category>geek</category><category>JavaScript</category><category>libre</category><category>logiciel</category><category>projet</category><category>web2.0</category>    
    <description>    &lt;p&gt;Hier, j'ai fait quelque chose que je n'avais encore pratiquement jamais fait&amp;nbsp;: j'ai &lt;strong&gt;acheté une licence logicielle&lt;/strong&gt; !!!&lt;/p&gt;


&lt;p&gt;Ce logiciel, c'est &lt;strong&gt;&lt;a href=&quot;http://macromates.com/&quot; hreflang=&quot;en&quot;&gt;TextMate&lt;/a&gt;&lt;/strong&gt;. Superbe éditeur texte avec des fonctions originale et ultra pratiques. Je conseilles à tout les développeurs macusers de l'essayer&amp;nbsp;! En plus, il est pas très cher&amp;nbsp;: 39$ seulement.&lt;/p&gt;


&lt;p&gt;Ce nouvel outil tombe bien car je viens de me lancer dans un &lt;strong&gt;nouveau projet&lt;/strong&gt; afin de mettre en pratique tout ce que j'ai appris en &lt;strong&gt;Javascript Objet&lt;/strong&gt; depuis l'obtention de mon BTS et mon nouvel emploi.&lt;br /&gt;
Ce nouveau projet est une librairie javascript permettant de transformer un formulaire standard en &lt;strong&gt;formulaire web2.0&lt;/strong&gt; très facilement. Écrite en full object, cette librairie sera compatible avec tout les navigateur modernes (et même les vieux... IE...) et sera entièrement personnalisable.&lt;/p&gt;


&lt;p&gt;Et bien sur, tout ceci sera distribué avec une &lt;strong&gt;licence libre&lt;/strong&gt;. Laquelle, je ne sais pas encore. Sûrement une GPL ou une LGPL.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Je lance un appel&amp;nbsp;! J'ai des petits problèmes de compatibilité avec Safari. Celui ci plante de façon très étrange sur certains événements de ma librairie. Je cherche donc quelqu'un de callé en JS Object et qui connait bien les bugs de Safari pour me donner un petit coup de main &lt;img src=&quot;/themes/Alt-I/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt; Contactez moi par IM :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AIM/MSN&amp;nbsp;: hadrienl@mac.com&lt;/li&gt;
&lt;li&gt;Jabber&amp;nbsp;: moi@im.hadrien.eu&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Je posterais une démo quand les travaux auront bien avancé.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.alti.info/post/2006/09/10/57-textmate-et-javascript#comment-form</comments>
      <wfw:comment>http://www.alti.info/post/2006/09/10/57-textmate-et-javascript#comment-form</wfw:comment>
      <wfw:commentRss>http://www.alti.info/feed/rss2/comments/45</wfw:commentRss>
      </item>
    
</channel>
</rss>