<?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-3498590604919157056</id><updated>2011-12-23T09:48:04.254+01:00</updated><category term='while'/><category term='linux'/><category term='debug'/><category term='mootools'/><category term='loop'/><category term='javascript'/><category term='google maps'/><category term='mysql'/><category term='wallpaper'/><category term='php'/><category term='fluxbox'/><category term='gentoo'/><category term='howto'/><category term='Ext'/><category term='programming'/><category term='developement'/><category term='shadows'/><category term='firefox'/><category term='addons'/><category term='datepicker'/><category term='fpdf'/><category term='sabayon'/><category term='canvas'/><category term='vim'/><category term='cron'/><category term='smf'/><category term='recursion'/><title type='text'>abidibo@blogspot-abidiBlog:~$ posts</title><subtitle type='html'>This blog embraces totally the foundamentals of the Open Source Spirit and Soul. Hence all material founded here is &lt;b&gt;free&lt;/b&gt; and the user may read, copy, manipulate, reproduce it all, without limitations of any kind, &lt;b&gt;no copyright allowed here!&lt;/b&gt;&lt;br&gt;
Nevertheless the author will appreciate if the user will cite him, when using his scripts, as a recognition of his work.&lt;br&gt;
Knowledge is the prime right of umanity and has to be protected and shared with every possible means.
abidibo.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://abidibo.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://abidibo.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>abidibo</name><uri>http://www.blogger.com/profile/02962158400296290483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3498590604919157056.post-6408115796814467399</id><published>2011-03-22T18:39:00.001+01:00</published><updated>2011-03-22T18:40:56.845+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='datepicker'/><category scheme='http://www.blogger.com/atom/ns#' term='mootools'/><title type='text'>Mootools 1.3 DatePicker class</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-BDvcrU5aenY/TYjbdlg0EcI/AAAAAAAAAHE/YxG8F6fS8EM/s1600/datepicker.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-BDvcrU5aenY/TYjbdlg0EcI/AAAAAAAAAHE/YxG8F6fS8EM/s1600/datepicker.png" /&gt;&lt;/a&gt;&lt;/div&gt;I think that &lt;b&gt;DatePicker&lt;/b&gt; mootools class by &lt;a href="http://www.monkeyphysics.com/mootools/script/2/datepicker"&gt;monkeyphysics&lt;/a&gt; is fantastic. It is fast, well written, it has a nice layout and some awesome options like the &lt;b&gt;inputOutputFormat&lt;/b&gt; one. Recently I upgrade to mootools 1.3 without compatibility in a project of a php framework which uses this class.&lt;br /&gt;So I need to make DatePicker class working with the new release of my favourite js framework.&lt;br /&gt;During the upgrade work I found and fixed a bug in the date selection when selecting a day of the previous/next year in january/december months view.&lt;br /&gt;Moreover I added the z-index management so that the calendar is always shown above all document elements.&lt;br /&gt;Maybe more improvemets will come in the next future.&lt;br /&gt;My project is a fork of the original one and hosted on my &lt;a href="https://github.com/abidibo/mootools-datepicker"&gt;github repository&lt;/a&gt;. &lt;br /&gt;From command line you may simply clone my project&lt;br /&gt;&lt;div class="code"&gt;git clone git://github.com/abidibo/mootools-datepicker.git&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3498590604919157056-6408115796814467399?l=abidibo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abidibo.blogspot.com/feeds/6408115796814467399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3498590604919157056&amp;postID=6408115796814467399' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/6408115796814467399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/6408115796814467399'/><link rel='alternate' type='text/html' href='http://abidibo.blogspot.com/2011/03/mootools-13-datepicker-class.html' title='Mootools 1.3 DatePicker class'/><author><name>abidibo</name><uri>http://www.blogger.com/profile/02962158400296290483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh3.googleusercontent.com/-BDvcrU5aenY/TYjbdlg0EcI/AAAAAAAAAHE/YxG8F6fS8EM/s72-c/datepicker.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3498590604919157056.post-3110729576894298514</id><published>2011-03-21T09:05:00.003+01:00</published><updated>2011-03-22T18:40:15.932+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='addons'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='debug'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>XDebugButton. Php XDebug with Vim.</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-bJpFvJ0O2W0/TYcup2fWVDI/AAAAAAAAAG8/O7_uVyCTzl0/s1600/vim_xdebug.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="https://lh5.googleusercontent.com/-bJpFvJ0O2W0/TYcup2fWVDI/AAAAAAAAAG8/O7_uVyCTzl0/s200/vim_xdebug.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Vim is fucking awesome. Vim is fucking extensible.&lt;br /&gt;You may find a lot of plugins transforming it in a perfect IDE for you programming language.&lt;br /&gt;One of the best plugin for php programmers is &lt;b&gt;xdebug&lt;/b&gt;, which runs a debug session right into vim.&lt;br /&gt;On the web you may find many articles, explaining how-to install it and make it working (it involves some configurations in vim, php.ini), &lt;a href="http://tech.blog.box.net/2007/06/20/how-to-debug-php-with-vim-and-xdebug-on-linux/"&gt;here&lt;/a&gt; is the one I read.&lt;br /&gt;Once you have installed it and made it working, you'll know that to activate the connection between vim and the server you have to recharge the web page passing a get variable: XDEBUG_SESSION_START=1&lt;br /&gt;Now here comes my work, very easy indeed, but was my first firefox addon developement.&lt;br /&gt;I wrote a firefox extension that appends automatically the paramether at &amp;nbsp;the url, checking for the right symbol to insert (&amp;amp; or ?).&lt;br /&gt;You may find my addon source, with the instructions on how-to install it on my github account &lt;a href="https://github.com/abidibo/XDebug-Button---Firefox-Add-on"&gt;here&lt;/a&gt;.&lt;br /&gt;From command line you may simply clone my project (install git first)&lt;br /&gt;&lt;div class="code"&gt;git clone git://github.com/abidibo/XDebug-Button---Firefox-Add-on.git&lt;/div&gt;If you find errors or bugs please write to &lt;a href="mailto:abidibo@gmail.com"&gt;abidibo@gmail.com&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3498590604919157056-3110729576894298514?l=abidibo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abidibo.blogspot.com/feeds/3110729576894298514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3498590604919157056&amp;postID=3110729576894298514' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/3110729576894298514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/3110729576894298514'/><link rel='alternate' type='text/html' href='http://abidibo.blogspot.com/2011/03/xdebugbutton-php-xdebug-with-vim.html' title='XDebugButton. Php XDebug with Vim.'/><author><name>abidibo</name><uri>http://www.blogger.com/profile/02962158400296290483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-bJpFvJ0O2W0/TYcup2fWVDI/AAAAAAAAAG8/O7_uVyCTzl0/s72-c/vim_xdebug.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3498590604919157056.post-1410441016511585181</id><published>2011-03-04T12:51:00.004+01:00</published><updated>2011-03-21T12:01:48.126+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smf'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Add total time logged in infos to SMF message posters</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-xiDn_WIG16I/TYcv-w6GntI/AAAAAAAAAHA/PHz5jlT0W2M/s1600/smsite_logo.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="55" src="https://lh5.googleusercontent.com/-xiDn_WIG16I/TYcv-w6GntI/AAAAAAAAAHA/PHz5jlT0W2M/s200/smsite_logo.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Well,&lt;br /&gt;some hours ago I had the need to show the &lt;b&gt;total time logged in info&lt;/b&gt; in the poster message area below the number of posts published by the member.&lt;br /&gt;The forum platform is &lt;a href="http://www.simplemachines.org/"&gt;SMF&lt;/a&gt;, I 've just started working with it so I can't give a professional opinion about it.&lt;br /&gt;Now what we have to do to achieve our goal is what follows.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Edit the &lt;b&gt;/Sources/Load.php&lt;/b&gt; file.&lt;br /&gt;goto line &lt;span style="color: red;"&gt;838&lt;/span&gt; (inside the loadMemberData method) and add to the fields selected by the query the one we want: &lt;b&gt;mem.totalTimeLoggedIn&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Well, now the information we want is selected from db.&lt;/li&gt;&lt;li&gt;Goto line &lt;span style="color: red;"&gt;1006&lt;/span&gt; (inside loadMemberContext method). Here the member context variable to be passed to the template is prepared. We have to add our informations to the array returned by this method, so add the following key=&amp;gt;value pair to the $memberContext[$user]&amp;nbsp; array:&lt;br /&gt;&lt;div class="code"&gt;'total_time_logged_in' =&amp;gt; array(&lt;br /&gt;'days' =&amp;gt; floor($profile['totalTimeLoggedIn'] / 86400),&lt;br /&gt;'hours' =&amp;gt; floor(($profile['totalTimeLoggedIn'] % 86400) / 3600),&lt;br /&gt;'minutes' =&amp;gt; floor(($profile['totalTimeLoggedIn'] % 3600) / 60)&lt;br /&gt;)&lt;/div&gt;&lt;/li&gt;&lt;li&gt;Well done, now our information is present in the context member variable passed to the template we have to edit. Notice that we have divided the amount of time in days, hours and minutes.&lt;/li&gt;&lt;li&gt;Now we have to show this information in the right place, that is the right template, which is &lt;b&gt;/Themes/default/Display.template.php&lt;/b&gt;, or the one corresponding to your used theme if present in the theme folder. Open the file and goto line &lt;span style="color: red;"&gt;316&lt;/span&gt;. At this line are printed the informations about the number of posts written by the message poster, so below that we insert our code:&lt;br /&gt;&lt;div class="code"&gt;// Show how many posts they have made.&lt;br /&gt;echo '&lt;br /&gt;', $txt[26], ': ', $message['member']['posts'], '&lt;br /&gt;&lt;br /&gt;';&lt;br /&gt;// Show total time online.&lt;br /&gt;if (!empty($message['member']['total_time_logged_in'])) {&lt;br /&gt;echo '&lt;br /&gt;', $txt['totalTimeLogged1'];&lt;br /&gt;&lt;br /&gt;// If days is just zero, don't bother to show it.&lt;br /&gt;if ($message['member']['total_time_logged_in']['days'] &amp;gt; 0)&lt;br /&gt;echo $message['member']['total_time_logged_in']['days'], $txt['totalTimeLogged5'];&lt;br /&gt;&lt;br /&gt;// Same with hours - only show it if it's above zero.&lt;br /&gt;if ($message['member']['total_time_logged_in']['hours'] &amp;gt; 0)&lt;br /&gt;echo $message['member']['total_time_logged_in']['hours'], $txt['totalTimeLogged6'];&lt;br /&gt;&lt;br /&gt;// But, let's always show minutes - Time wasted here: 0 minutes ;).&lt;br /&gt;echo $message['member']['total_time_logged_in']['minutes'], $txt['totalTimeLogged7'], '&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;';&lt;br /&gt;}&lt;br /&gt;else echo '&amp;lt;br /&amp;gt;'; &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;Ok, only some considerations:&lt;br /&gt;I displayed the count of time in this form;&lt;br /&gt;xd xh xm&lt;br /&gt;you can show it as&lt;br /&gt;x days x hours and x minutes&lt;br /&gt;or in the form you want, you only have to edit the language locate files of the languages you're interedsted in and set the text you prefer, you may define new strings and so on. Brutally you may also print the string you want directly into the template without using the locate system.&lt;br /&gt;Hasta la proxima siempre.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3498590604919157056-1410441016511585181?l=abidibo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abidibo.blogspot.com/feeds/1410441016511585181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3498590604919157056&amp;postID=1410441016511585181' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/1410441016511585181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/1410441016511585181'/><link rel='alternate' type='text/html' href='http://abidibo.blogspot.com/2011/03/add-total-time-logged-in-infos-to-smf.html' title='Add total time logged in infos to SMF message posters'/><author><name>abidibo</name><uri>http://www.blogger.com/profile/02962158400296290483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-xiDn_WIG16I/TYcv-w6GntI/AAAAAAAAAHA/PHz5jlT0W2M/s72-c/smsite_logo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3498590604919157056.post-575930157992980919</id><published>2010-11-30T16:50:00.005+01:00</published><updated>2010-12-03T14:45:33.568+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gentoo'/><category scheme='http://www.blogger.com/atom/ns#' term='sabayon'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='fluxbox'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='wallpaper'/><category scheme='http://www.blogger.com/atom/ns#' term='cron'/><title type='text'>HowTo randomly change fluxbox wallpaper every n minutes</title><content type='html'>Some weeks ago' I've discovered this fantastic WM (Windows Manager), thanks to &lt;b&gt;Gentoo/Sabayon&lt;/b&gt; + &lt;b&gt;GNOME&lt;/b&gt; dbus sessions problems with my Imac. I desired so much to learn something about portage and the gentoo world that I accepted going on without gnome. Fortunatelly.&lt;br /&gt;&lt;a href="http://www.fluxbox.org/"&gt;Fluxbox&lt;/a&gt; is a very light and high configurable WM for X server, super super fast and with all such things one need to work fine (alt-tab to move around opened windows, a nice bar showing opened applications and so on). It doesn't have icons by default, but has an amazing menu totally and easily configurable showing up when clicking on the desktop.&lt;br /&gt;Here I want to show how is possible to set a &lt;b&gt;cronjob&lt;/b&gt; task that changes randomly the desktop wallpaper every 5 minutes.&lt;br /&gt;&lt;b&gt;FIRST: install feh&lt;/b&gt;&lt;br /&gt;&lt;a href="http://linuxbrit.co.uk/software/feh/"&gt;feh&lt;/a&gt; is a fast,  lightweight image viewer, supporting many image formats that we'll use to show the wallpaper. So&lt;br /&gt;&lt;div class="code"&gt;$sudo emerge feh&lt;/div&gt;&lt;b&gt;SECOND: try it out&lt;/b&gt;&lt;br /&gt;Open the &lt;b&gt;~/.fulxbox/menu&lt;/b&gt; file and add some wallpaper voices, like&lt;br /&gt;&lt;div class="code"&gt;[submenu] (Wallpaper)&lt;br /&gt;[exec] (tamars) {fbsetbg -f /home/abidibo/Wallpapers/sabayon_t.png}&lt;br /&gt;[exec] (minus_tamars) {fbsetbg -f /home/abidibo/Wallpapers/sabayon.png}&lt;br /&gt;[exec] (matrix) {fbsetbg -f /home/abidibo/Wallpapers/sabayon_matrix.jpg}&lt;br /&gt;[exec] (winzoz) {fbsetbg -f /home/abidibo/Wallpapers/winzoz.jpg}&lt;br /&gt;[exec] (toilet) {fbsetbg -f /home/abidibo/Wallpapers/toilet.jpg}&lt;br /&gt;[exec] (linuxVSwin) {fbsetbg -f /home/abidibo/Wallpapers/linuxvswin.jpg}&lt;br /&gt;[end]&lt;/div&gt;&lt;b&gt;fbsetbg&lt;/b&gt; is a wrapper that searches for a image viewer in order to set the fulxbox background (in our case it'll use feh, but other programs may be used).&lt;br /&gt;Now clicking on the desktop and selecting a wallpaper voice from the menu should change our fluxbox wallpaper, if not maybe there were some problems during the installation of feh, try solving them and continue. &lt;br /&gt;&lt;b&gt;THIRD: make a script that changes the background randomly&lt;/b&gt;&lt;br /&gt;So put all the desired images inside a folder and then copy this code in a file that we'll call chgWallpaper.sh&lt;br /&gt;&lt;div class="code"&gt;#!/bin/bash&lt;br /&gt;export DISPLAY=:0.0&lt;br /&gt;fbsetbg -f /home/abidibo/Wallpapers/$(ls ~/Wallpapers | sort -R | tail -1)&lt;/div&gt;Why we export the DISPLAY variable? Well, we always have to remember that the processes started by cron have no (or almost no) normal environment setup, and our script require this variable. So from terminal as normal user run&lt;br /&gt;&lt;div class="code"&gt;echo $DISPLAY&lt;/div&gt;take the result and put it in place of :0.0&lt;br /&gt;The second line of the script launches fbsetbg passing it one (tail -1) file randomly (sort -R) taken from the ~/Wallpapers directory (ls).&lt;br /&gt;&lt;b&gt;FOURTH: schedule the script with crontab&lt;/b&gt;&lt;br /&gt;Now we have to schedule this script. My system has vixie-cron, many others uses crond, it's the same. We want to schedule the script as normal user (abidibo in my case), so &lt;br /&gt;&lt;div class="code"&gt;$sudo crontab -u abidibo -e&lt;/div&gt;This commands opens your favourite editor, now we have to insert the job:&lt;br /&gt;&lt;div class="code"&gt;*/5 * * * * /bin/bash /home/abidibo/Scripts/chgWallpaper.sh&lt;/div&gt;This way the script is run every 5 minutes. Now we save the file and exit and the new crontab is installed. We wait 5 minutes and our desktop background should change, if not go on reading.&lt;br /&gt;&lt;b&gt;TROUBLESHOOTING&lt;/b&gt;&lt;br /&gt;If this doesn't work may be it happens something like what happened to me.&lt;br /&gt;Read your system log file, in my case&lt;br /&gt;&lt;div class="code"&gt;$sudo vim /var/log/messages&lt;/div&gt;and search for cron messages.&lt;br /&gt;If you notice somithing like&lt;br /&gt;&lt;div class="code"&gt;Nov 30 14:35:01 localhost cron[7500]: (abidibo) CMD (bash /home/abidibo/Scripts/chgWallpaper.sh)&lt;br /&gt;Nov 30 13:35:01 localhost postfix/postdrop[7511]: warning: unable to look up public/pickup: No such file or directory&lt;/div&gt;Then you're welcome. Here we have a postfix problem, the pickup FIFO (files used by different processes to communicate) file is not present in your system, we have to create it, run&lt;br /&gt;&lt;div class="code"&gt;$sudo mkfifo /var/spool/postfix/public/pickup&lt;br /&gt;$sudo /etc/init.d/postfix restart &lt;/div&gt;And that should be fix it. &lt;br /&gt;Now if it still doesn't work and your system log says something like &lt;br /&gt;&lt;div class="code"&gt;Nov 30 14:44:00 localhost postfix/local[7846]: fatal: open database /etc/mail/aliases.db: No such file or directory&lt;/div&gt;you're welcome! It means you don't have that file. So you need to create it running the command&lt;br /&gt;&lt;div class="code"&gt;$sudo newaliases&lt;br /&gt;$sudo /etc/init.d/postfix restart&lt;/div&gt;Now cron may comunicate with you and send you emails that you may read by&lt;br /&gt;&lt;div class="code"&gt;$vim /var/mail/USERNAME&lt;br /&gt;&lt;/div&gt;In my case cron was happy to say me such thing&lt;br /&gt;&lt;div class="code"&gt;From abidibo@abidibo-sabayon.localdomain&amp;nbsp; Tue Nov 30 15:29:01 2010&lt;br /&gt;Return-Path: &amp;lt;abidibo@abidibo-sabayon.localdomain&amp;gt;&lt;br /&gt;X-Original-To: abidibo&lt;br /&gt;Delivered-To: abidibo@abidibo-sabayon.localdomain&lt;br /&gt;Received: by abidibo-sabayon.localdomain (Postfix, from userid 1000)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; id 999DDD9E654; Tue, 30 Nov 2010 15:29:01 +0100 (CET)&lt;br /&gt;From: root@abidibo-sabayon.localdomain (Cron Daemon)&lt;br /&gt;To: abidibo@abidibo-sabayon.localdomain&lt;br /&gt;Subject: Cron &amp;lt;abidibo@abidibo-sabayon&amp;gt; /bin/bash /home/abidibo/Scripts/chgWallpaper.sh&lt;br /&gt;X-Cron-Env: &amp;lt;SHELL=/bin/sh&amp;gt;&lt;br /&gt;X-Cron-Env: &amp;lt;HOME=/home/abidibo&amp;gt;&lt;br /&gt;X-Cron-Env: &amp;lt;PATH=/usr/bin:/bin&amp;gt;&lt;br /&gt;X-Cron-Env: &amp;lt;LOGNAME=abidibo&amp;gt;&lt;br /&gt;X-Cron-Env: &amp;lt;USER=abidibo&amp;gt;&lt;br /&gt;Message-Id: &amp;lt;20101130142901.999DDD9E654@abidibo-sabayon.localdomain&amp;gt;&lt;br /&gt;Date: Tue, 30 Nov 2010 15:29:01 +0100 (CET)&lt;br /&gt;&lt;br /&gt;Error: Can't open display:&lt;/div&gt;That led me to add&amp;nbsp; the "export DISPLAY=:0.0" line in my script (thing that you've already done).&lt;br /&gt;That's all. Hasta la proxima siempre!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3498590604919157056-575930157992980919?l=abidibo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abidibo.blogspot.com/feeds/575930157992980919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3498590604919157056&amp;postID=575930157992980919' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/575930157992980919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/575930157992980919'/><link rel='alternate' type='text/html' href='http://abidibo.blogspot.com/2010/11/howto-randomly-change-fluxbox-wallpaper.html' title='HowTo randomly change fluxbox wallpaper every n minutes'/><author><name>abidibo</name><uri>http://www.blogger.com/profile/02962158400296290483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3498590604919157056.post-3187376642697831014</id><published>2010-10-28T17:12:00.001+02:00</published><updated>2010-10-28T17:18:22.777+02:00</updated><title type='text'>Load local XML through AJAX request problems in IE</title><content type='html'>Have you got a simple html-js-xml project (doesn't need a server) that works locally on firefox but not in IE? You're welcome!&lt;br /&gt;&lt;b&gt;Understanding the problem&lt;/b&gt;&lt;br /&gt;Let's see my example... I had an html document which only charges an external javascript which has the due to &lt;b&gt;load an xml file&lt;/b&gt; representing a flowchart and simulate a navigation through the tree, with conditional steps and forwards steps.&lt;br /&gt;Even if I'm a mootools lover, for this project I used jQuery because the mootools core 1.2.x xml loader doesn't work for IE in any case.&lt;br /&gt;So I used jQuery ajax method to load the xml this way:&lt;br /&gt;&lt;div class="code"&gt;var xml = $.ajax({&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; async: false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; type:"GET",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; context: this,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; url: chart_path,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dataType:"xml"&lt;br /&gt;}).responseXML;&lt;/div&gt;Now, I thought at my xml variable as a DOM object over which use all the traversing methods implemented by jQuery. That was true... in some cases.&lt;br /&gt;&lt;b&gt;The scenario&lt;/b&gt;&lt;br /&gt;- Application hosted on a server&lt;br /&gt;&amp;nbsp; works if visited with any browser and any OS&lt;br /&gt;- Application hosted on my local server running on Ubuntu 9.04&lt;br /&gt;&amp;nbsp; works if visited with any browser and any OS&lt;br /&gt;- Application hosted on a PC with Windows XP not under a server&lt;br /&gt;&amp;nbsp; works with firefox but not with IE&lt;br /&gt;OH MY GOD&lt;br /&gt;&lt;b&gt;The answer&lt;/b&gt;&lt;br /&gt;So at the end I gained the solution. The problem is that I was trying to get the responseXML from the ajax object, but without a server "telling" the browser that yes, that content is really an XML. Moreover (OH OH) IE is not so intelligent as to understand this things without help.&lt;br /&gt;&lt;b&gt;The solution&lt;/b&gt;&lt;br /&gt;So what may we do? Simple. We get not the responseXML but the responseText and then load it using the loadXML method of the ActiveXObject. What follow is my example code&lt;br /&gt;&lt;div class="code"&gt;var xmltext = $.ajax({&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; async: false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; type:"GET",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; context: this,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; url: chart_path,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dataType:"xml"&lt;br /&gt;}).responseText;&lt;br /&gt;&lt;br /&gt;if($.browser.msie) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xml = new ActiveXObject("Microsoft.XMLDOM");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xml.loadXML(xmltext); &lt;br /&gt;}&lt;br /&gt;else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; parser = new DOMParser();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xml = parser.parseFromString(xmltext, "text/xml");&lt;br /&gt;}&lt;/div&gt;Now my xml variable is ready and contains the desired XML object.&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3498590604919157056-3187376642697831014?l=abidibo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abidibo.blogspot.com/feeds/3187376642697831014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3498590604919157056&amp;postID=3187376642697831014' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/3187376642697831014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/3187376642697831014'/><link rel='alternate' type='text/html' href='http://abidibo.blogspot.com/2010/10/load-local-xml-through-ajax-request.html' title='Load local XML through AJAX request problems in IE'/><author><name>abidibo</name><uri>http://www.blogger.com/profile/02962158400296290483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3498590604919157056.post-2763043698814974545</id><published>2010-07-28T17:06:00.003+02:00</published><updated>2010-12-03T14:46:12.764+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='while'/><category scheme='http://www.blogger.com/atom/ns#' term='recursion'/><category scheme='http://www.blogger.com/atom/ns#' term='loop'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>HowTo navigate through a tree without recursive methods (while loop instead)</title><content type='html'>-Hi,&lt;br /&gt;today I was simply writing a local template in order to render a menu following the &lt;a href="http://en.wikipedia.org/wiki/Model%E2%80%93View%E2%80%93Controller"&gt;MVC pattern&lt;/a&gt;.&lt;br /&gt;Now my local template system does not use a meta-language, but loops, if statements and so on are written directly in php, because I don't have enough time to write an interpreter.&lt;br /&gt;So really I can use all php functionalities in my templates including recursive functions. But it's not the way I want to follow, moreover maybe some day I'll find the time to write my interpreter and then will be very easy to "convert" if statements and cycles, not so easy if not impossible to convert recursive functions.&lt;br /&gt;Well, so the problem was the following:&lt;br /&gt;I have a n-dimensional menu tree, and have to generate the classical html code for such a menu, that is something like:&lt;br /&gt;&lt;div class="code"&gt;&amp;lt;ul id="nav"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;Voice1&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;Voice2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ul&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;Voice21&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;Voice22&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ul&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;Voice3&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;/div&gt;So let's see HOW TO get this without recursion. The code is well commented, here it goes:&lt;br /&gt;&lt;div class="code"&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;&amp;nbsp;* Menu tree is represented by an n-dimensional array. &lt;br /&gt;&amp;nbsp;* Array keys are the labels and array values are either a link&lt;br /&gt;&amp;nbsp;* or a submenu (another array)&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;$voices["Home"] = array("Home1" =&amp;gt; array("Home11"=&amp;gt;"#"), "Home2"=&amp;gt;array("Home21"=&amp;gt;"#")); &lt;br /&gt;$voices["News"] = array("News1" =&amp;gt; "#", "News2"=&amp;gt;array("News21"=&amp;gt;"#")); &lt;br /&gt;$voices[_("About")] = array("About1"=&amp;gt;array("About11"=&amp;gt;array("About111"=&amp;gt;"#", "About112"=&amp;gt;"#")), "About2"=&amp;gt;"#");&lt;br /&gt;$voices[_("Services")] = '#';&lt;br /&gt;$voices[_("Faq")] = '#';&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;&amp;nbsp;*&amp;nbsp; INIT SOME VARIABLES&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;// control the exit from the loop &lt;br /&gt;$continue = true;&lt;br /&gt;// this variables stores the branch currently analized&lt;br /&gt;$parsed = $voices; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;// stores all the branches parsered, because the tree is navigated following a branch&lt;br /&gt;// until the foil. So when returning on top levels the navigation must continue on&lt;br /&gt;// branches interrupted earlier.&lt;br /&gt;$tree = array();&lt;br /&gt;// stores the last key of the current branch array&lt;br /&gt;$last = null;&lt;br /&gt;&lt;br /&gt;echo "&amp;lt;ul id=\"nav\"&amp;gt;\n";&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;&amp;nbsp;*&amp;nbsp; THE MAIN LOOP&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;while($continue === true) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// if the value of the current element parsered is an array than has a submenu&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(is_array(current($parsed))) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// echo the current voice and open a new submenu (ul)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;echo "&amp;lt;li&amp;gt;&amp;lt;a href=\"#\"&amp;gt;".key($parsed)."&amp;lt;/a&amp;gt;\n&amp;lt;ul&amp;gt;\n";&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// we're going to begin navigate the branch -&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// we store the branch we're leaving in the tree array&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$tree[] = $parsed;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// the branch to analyze is now the submenu&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$parsed = current($parsed);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// get the last key of the new branch&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;end($parsed);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$last = key($parsed);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// reset the array pointer&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;reset($parsed);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// else if the value of the current element is not an array (but a link) &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// and not false (i.e. after calling next on the last element of an array)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;elseif(current($parsed)!==false) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// echo the current voice&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;echo "&amp;lt;li&amp;gt;&amp;lt;a href=\"".current($parsed)."\"&amp;gt;".key($parsed)."&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;\n";&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// if the voice printed is the last of its branch &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// than close the submenu and get the last branch stored in the&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// varable tree (the parent branch) as the one to follow parsering&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(key($parsed)==$last) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;echo "&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;\n";&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$parsed = array_pop($tree);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// move the pointer to the next element&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;next($parsed);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// else the value of the current element is false -&amp;gt; we have already passed the last element&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// then we close the submenu and get the parent branch as the current one, passing to the next element&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;else {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;echo "&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;";&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$parsed = array_pop($tree);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;next($parsed);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// if we are navigating the first tree level and have passed through all them -&amp;gt; exit&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(count($tree)==0 &amp;amp;&amp;amp; current($parsed)==false) $continue = false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;echo "&amp;lt;/ul&amp;gt;\n";&lt;br /&gt;?&amp;gt;&lt;/div&gt;Hasta la proxima!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3498590604919157056-2763043698814974545?l=abidibo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abidibo.blogspot.com/feeds/2763043698814974545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3498590604919157056&amp;postID=2763043698814974545' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/2763043698814974545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/2763043698814974545'/><link rel='alternate' type='text/html' href='http://abidibo.blogspot.com/2010/07/how-to-navigate-through-tree-without.html' title='HowTo navigate through a tree without recursive methods (while loop instead)'/><author><name>abidibo</name><uri>http://www.blogger.com/profile/02962158400296290483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3498590604919157056.post-1207321392694153112</id><published>2010-07-09T15:06:00.004+02:00</published><updated>2010-07-09T15:12:39.926+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='developement'/><title type='text'>Get MySQL table data structure with PHP</title><content type='html'>Hi, today I'll show how to retrieve informations about a MySQL table through php in order for example to create a php class making editable a table in an automatic way (that is: stupid class, i give you a name of a table and YOU have to create its backend for me). This work is done very well by the python framework &lt;a href="http://www.djangoproject.com/"&gt;Django&lt;/a&gt; for example.&lt;br /&gt;Now, there are several ways to do so, I'll use the interrogation of the &lt;b&gt;information_schema&lt;/b&gt; db.&lt;br /&gt;Well, let's see the code. I post here a simple function, clearly the informations that may be retrieved are more than these.&lt;br /&gt;&lt;div class="code"&gt;function getTableStructure($dbname, $table) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $structure = array();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $fields = array();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $query = "SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '$dbname' AND TABLE_NAME = '$table'";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $res = mysql_query($query);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while($row = mysql_fetch_array($res)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $fields[$row['COLUMN_NAME']] = array(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "order"=&amp;gt;$row['ORDINAL_POSITION'],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "default"=&amp;gt;$row['COLUMN_DEFAULT'],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "null"=&amp;gt;$row['IS_NULLABLE'],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "type"=&amp;gt;$row['DATA_TYPE'],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "max_length"=&amp;gt;$row['CHARACTER_MAXIMUM_LENGTH'],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "key"=&amp;gt;$row['COLUMN_KEY'],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "extra"=&amp;gt;$row['EXTRA']&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if($row['COLUMN_KEY']=='PRI') $structure['primary_key'] = $row['COLUMN_NAME'];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $structure['fields'] = $fields;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return $structure;&lt;br /&gt;&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;The important informations to do an auto-generation-form class are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;default&lt;/b&gt;: the default value (we may insert it as a default value in the input field of the form)&lt;/li&gt;&lt;li&gt;&lt;b&gt;null&lt;/b&gt;: we may use it to decide whether a field must be compulsory or not&lt;/li&gt;&lt;li&gt;&lt;b&gt;type&lt;/b&gt;: the must important: which form element we'll use? It depends on data type and ...&lt;/li&gt;&lt;li&gt;&lt;b&gt;max_length&lt;/b&gt;: the maximum number of characters acceopted for the field&lt;/li&gt;&lt;li&gt;&lt;b&gt;key&lt;/b&gt;: we may want to check for uniques keys etc...&lt;/li&gt;&lt;li&gt;&lt;b&gt;extra&lt;/b&gt;: i think it's useful to know if a field is auto_increment because we may not make it editable&lt;/li&gt;&lt;/ul&gt;That's all falks, hasta la proxima!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3498590604919157056-1207321392694153112?l=abidibo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abidibo.blogspot.com/feeds/1207321392694153112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3498590604919157056&amp;postID=1207321392694153112' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/1207321392694153112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/1207321392694153112'/><link rel='alternate' type='text/html' href='http://abidibo.blogspot.com/2010/07/get-mysql-table-data-structure-with-php.html' title='Get MySQL table data structure with PHP'/><author><name>abidibo</name><uri>http://www.blogger.com/profile/02962158400296290483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3498590604919157056.post-4806152420252576436</id><published>2010-04-01T17:14:00.014+02:00</published><updated>2010-04-04T00:30:03.440+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='mootools'/><title type='text'>A mootools based horizontal scrollable list</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_c72zFjtq5Z8/S7S0thd97eI/AAAAAAAAAGg/pxv0EoCw5xA/s1600/hlist.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="224" src="http://2.bp.blogspot.com/_c72zFjtq5Z8/S7S0thd97eI/AAAAAAAAAGg/pxv0EoCw5xA/s320/hlist.png" width="320" /&gt;&lt;/a&gt;Hi,&lt;br /&gt;today I write about a nice javascript class that creates a typical horizontal scrollable list starting from an html unordered list. The final result is like many others in the web. The LI elements of a list are used to create the items of this scrollable list. The number of items visible at a time is a paramether, and if is greater than the maximum possible one, is reduced in order to get the items to stay in their space. The controller are two arrow buttons on the left and right of the slide. They have three states: ON, OFF and OVER controlled through javascript and personalizable by css. The width of the entire object and of the single item are needed, the height of the single item is not necessary because is calculated by javascript (through an iteration along all items), but clearly for a good result all items would rather have the same height.&lt;br /&gt;Let's see the details now.&lt;br /&gt;&lt;div style="clear: both;"&gt;&lt;/div&gt;Imagine we have an unordered list where the LI elements are images set as css background of a DIV, for example:&lt;br /&gt;&lt;div class="code"&gt;&amp;lt;ul id="hlistVideo"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div title="Durata: 00:00:10" style="background-color:#fff;background-image:url('upload/img/images.jpg'); background-position:center center;background-repeat:no-repeat; width:130px;height:100px;margin:10px;cursor:pointer;" /&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div title="Durata: 00:02:29" class="tooltip" style="background-color:#fff;background-image:url('upload/img/wildThings.png'); background-position:center center;background-repeat:no-repeat; width:130px;height:100px;margin:10px;cursor:pointer;" /&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div title="Durata: 00:02:18" class="tooltip" style="background-color:#fff;background-image:url('upload/img/trucker.png'); background-position:center center;background-repeat:no-repeat; width:130px;height:100px;margin:10px;cursor:pointer;" /&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;/div&gt;Now, we want to transform it in a classical scrollable horizontal list, like the one represented in the image (the same one).&lt;br /&gt;Well, here comes my mootools based javascript class which coupled with some css realizes it. First the code, then the usage&lt;br /&gt;&lt;div class="code"&gt;/*&lt;br /&gt;&amp;nbsp;* hScrollingList class written by abidibo, 01/04/2010&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;* hScrollingList method: constructor&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp; Syntax&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var myInstance = new hScrollingList(list, vpItems, scrollableWidth, itemWidth, [options]);&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp; Arguments &lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1. list - (string|Object) The UL element or its id attribute to be transformed&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. vpItems - (int) The number of element showed in a viewport (the viewport changes (scrolls) when clicking on the arrows)&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3. scrollableWidth - (int) The width in px of the scrollable object&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4. itemWidth - (int) The width in px of a list element&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp; &amp;nbsp;5. options - (object, optional) The options object.&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp; Options&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp; &amp;nbsp;- id (string: default to null) The id of the object&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ........ maybe many more options in the future.........&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;var hScrollingList = new Class({&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Implements: [Options],&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;options: {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;id: null&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// maybe more options in the future here&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;initialize: function(list, vpItems, scrollableWidth, itemWidth, options) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($defined(options)) this.setOptions(options);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.list = $type(list)=='element'? list:$(list);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.listElements = this.list.getChildren('li');&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.setWidths(scrollableWidth, itemWidth);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.vpItems = vpItems;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.setSlide();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.setStyles();&amp;nbsp; // vpItems property may change!&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.setWrapper();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.vps = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.tots = Math.ceil(this.listElements.length/this.vpItems);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.updateCtrl();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.tr = new Fx.Tween(this.slide, {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'duration': 1000,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'transition': 'quad:out',&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'onComplete' : function() {this.busy=false}.bind(this)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;});&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;setWidths: function(tw, iw) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.width = tw;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.ctrlWidth = 24;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.cWidth = this.width - 2*this.ctrlWidth;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.iWidth = iw;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;setSlide: function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var clear = new Element('div', {'styles':{'clear':'both'}});&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.slide = new Element('div', {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'styles': {'position':'relative', 'width':'10000em', 'background-color':'#ccc'}&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;});&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.slide.inject(this.list, 'before');&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.slide.grab(this.list);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;clear.inject(this.slide, 'bottom');&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;setWrapper: function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.wrapper = new Element('div', {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'styles':{'width': this.width}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;});&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var ctrlHeight = this.listElements[0].getCoordinates().height;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;for(var i=1; i&amp;lt;this.listElements.length; i++) &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(this.listElements[i].getCoordinates().height &amp;gt; ctrlHeight) &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ctrlHeight = this.listElements[i].getCoordinates().height;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.leftCtrl = new Element('div', {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'styles': {'float': 'left', 'width': this.ctrlWidth+'px', 'height':ctrlHeight+'px'}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;})&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.rightCtrl = new Element('div', {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'styles': {'float': 'right', 'width': this.ctrlWidth+'px', 'height':ctrlHeight+'px'}&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;})&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.itemContainer = new Element('div', {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'styles': {'float': 'left', 'width': this.cWidth+'px', 'overflow':'hidden'}&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;})&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.wrapper.adopt(this.leftCtrl, this.itemContainer, this.rightCtrl);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.wrapper.inject(this.slide, 'before');&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.itemContainer.adopt(this.slide);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;setStyles: function () {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.list.setStyles({'margin': '0', 'padding': '0', 'list-style-type':'none', 'list-style-position':'outside'});&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var esw = this.vpItems*this.iWidth;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;while(esw&amp;gt;this.cWidth) esw = --this.vpItems*this.iWidth;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var margin = (this.cWidth - esw)/2;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;for(var i=0; i&amp;lt;this.listElements.length; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var item = this.listElements[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var r = i%this.vpItems;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;item.setStyles({&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'float':'left',&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'width': this.iWidth+'px',&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'margin-left': !i ? margin+'px' : r ? '0px' : 2*margin+'px'&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;})&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;scroll: function(d) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(this.busy) return false;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.busy = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(d=='right') &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.tr.start('left', '-'+(this.cWidth*this.vps++)+'px');&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;else if(d=='left') &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.tr.start('left', '-'+(this.cWidth*(--this.vps-1))+'px');&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.updateCtrl();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;updateCtrl: function() {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var lclass = this.vps == 1 ? 'leftCtrlOff':'leftCtrl';&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var rclass = this.vps == this.tots ? 'rightCtrlOff':'rightCtrl';&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.leftCtrl.setProperty('class', lclass);&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.rightCtrl.setProperty('class', rclass);&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(this.vps==1) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.leftCtrl.removeEvents('mouseover');&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.leftCtrl.removeEvents('mouseout');&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.leftCtrl.removeEvents('click');&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.le = false;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;else if(!this.le) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.leftCtrl.addEvent('mouseover', function() {this.setProperty('class', 'leftCtrlOver')});&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.leftCtrl.addEvent('mouseout', function() {this.setProperty('class', 'leftCtrl')});&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.leftCtrl.addEvent('click', this.scroll.bind(this, 'left'));&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.le = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(this.vps == this.tots) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.rightCtrl.removeEvents('mouseover');&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.rightCtrl.removeEvents('mouseout');&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.rightCtrl.removeEvents('click');&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.re = false;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;else if(!this.re) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.rightCtrl.addEvent('mouseover', function() {this.setProperty('class', 'rightCtrlOver')});&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.rightCtrl.addEvent('mouseout', function() {this.setProperty('class', 'rightCtrl')});&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.rightCtrl.addEvent('click', this.scroll.bind(this, 'right'));&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.re = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;});&lt;/div&gt;Now the css styles used in my example (if you wanna try this code remember to make your own arrows images)&lt;br /&gt;&lt;div class="code"&gt;div.leftCtrl {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;background: #b8b7b7 url('../img/arrowSX.png') no-repeat center center;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;cursor:pointer;&lt;br /&gt;}&lt;br /&gt;div.rightCtrl {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;background: #b8b7b7 url('../img/arrowDX.png') no-repeat center center;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;cursor:pointer;&lt;br /&gt;}&lt;br /&gt;div.leftCtrlOver {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;background: #929191 url('../img/arrowSX.png') no-repeat center center;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;cursor:pointer;&lt;br /&gt;}&lt;br /&gt;div.rightCtrlOver {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;background: #929191 url('../img/arrowDX.png') no-repeat center center;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;cursor:pointer;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;div.leftCtrlOff {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;background: #b8b7b7 url('../img/arrowSX.png') no-repeat center center;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;opacity: 0.8;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;filter: alpha(opacity = 80);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;div.rightCtrlOff {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;background: #b8b7b7 url('../img/arrowDX.png') no-repeat center center;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;opacity: 0.8;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;filter: alpha(opacity = 80);&lt;br /&gt;}&lt;/div&gt;Basically these css styles contains the three states of the two buttons: button ON, button OFF, and button OVER.&lt;br /&gt;Now let's see how to use this class, very simple:&lt;br /&gt;&lt;div class="code"&gt;&amp;lt;script&amp;gt;var hList = new hScrollingList('hlistVideo', 5, 600, 150)&amp;lt;/script&amp;gt;&lt;/div&gt;So simply we instanciate the class &lt;b&gt;hScrollingList&lt;/b&gt;, passing the paramethers:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;'hlistVideo': the id of the unordered list (we may pass even the DOM Object)&lt;/li&gt;&lt;li&gt;5: the number of items 'for page', that is the number of elements in the viewport for each scrolling action&lt;/li&gt;&lt;li&gt;600: the total width of the object&lt;/li&gt;&lt;li&gt;150: the width of a single item (a LI element)&lt;/li&gt;&lt;/ul&gt;Observe that the class is able to auto-reduce the number of items 'for page', because it tries to put them in the space&amp;nbsp; allowed, and if thay can't stay correctly in the space their number is reduced by one untill they will.&lt;br /&gt;So you only have to take this code, personalize the arrows images, the three states of the buttons through css and obtain your own personalized horizontal scrollable list.&lt;br /&gt;For info or problems write at &lt;a href="mailto:abidibo@gmail.com"&gt;abidibo@gmail.com&lt;/a&gt;&lt;br /&gt;Bye!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3498590604919157056-4806152420252576436?l=abidibo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abidibo.blogspot.com/feeds/4806152420252576436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3498590604919157056&amp;postID=4806152420252576436' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/4806152420252576436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/4806152420252576436'/><link rel='alternate' type='text/html' href='http://abidibo.blogspot.com/2010/04/mootools-based-horizontal-scrollable.html' title='A mootools based horizontal scrollable list'/><author><name>abidibo</name><uri>http://www.blogger.com/profile/02962158400296290483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_c72zFjtq5Z8/S7S0thd97eI/AAAAAAAAAGg/pxv0EoCw5xA/s72-c/hlist.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3498590604919157056.post-1190530303092255841</id><published>2009-11-26T17:27:00.008+01:00</published><updated>2009-11-27T15:53:29.125+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='mootools'/><category scheme='http://www.blogger.com/atom/ns#' term='google maps'/><title type='text'>An address to point (lat,lng) google maps converting class with mootools</title><content type='html'>Hi,&lt;br /&gt;today I'll post here the code of a class useful to obtain a conversion of a string address into geographical coordinates latitude and longitude. &lt;br /&gt;Maybe sometimes you have to represent some points (i.e. hotels) on a map, dinamically, that is getting datas from a database. That means that you need to insert the hotel geographical coordinates in the database, as it's surely better to make the conversion before inserting data in the DB than on the fly when showing the map, that because the conversion can take a bit of time, or even fail.&lt;br /&gt;So the situation I considered is the following one: we have a form with some fields like address, cap and city, and two fields hidden or readonly that contains the latitude and longitude values. The action of this form inserts this values in the DB, so these latitude and longitude are the same that will be used to generate the map in the public view (soon another post about that).&lt;br /&gt;So the html part of the form could be something like&lt;br /&gt;&lt;div class="code"&gt;&amp;lt;input type="text" name="address" id="address" /&amp;gt;&lt;br /&gt;&amp;lt;input type="text" name="city" id="city" /&amp;gt;&lt;br /&gt;&amp;lt;input type="text" name="cap" id="cap" /&amp;gt;&lt;br /&gt;&amp;lt;input type="button" value="convert" onclick="[see more over]" /&amp;gt; &lt;br /&gt;&amp;lt;input type="text" name="lat" id="lat" readonly="readonly" /&amp;gt;&lt;br /&gt;&amp;lt;input type="text" name="lng" id="lng" readonly="readonly" /&amp;gt;&lt;br /&gt;&lt;/div&gt;Now the goal was to write a javascript class that shows a map with a marker in the position associated to the address already inserted in the form (that is make the conversion), make the marker draggable and&amp;nbsp; insert the latitude and longitude values into the 'lat' and 'lng' input fields, so that when submitting the form they could be written in the database.&lt;br /&gt;So here goes my javascript class that clearly requires mootools, I omit here mootools inclusion.&lt;br /&gt;&lt;div class="code"&gt;/*&lt;br /&gt;&amp;nbsp;* Class AddressToPointConverter, requires mootools v&amp;gt;=1.2&lt;br /&gt;&amp;nbsp;* Written by abidibo, 26/11/2009&lt;br /&gt;&amp;nbsp;* Copyright: what fuck is copyright?! &lt;br /&gt;&amp;nbsp;* &lt;br /&gt;&amp;nbsp;* Converts an address in geographical coordinates (lat,lng) using &lt;br /&gt;&amp;nbsp;* the googlemaps geocoder, and inserts these values in form fields&lt;br /&gt;&amp;nbsp;* defined in the constructor&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;var AddressToPointConverter = new Class({&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Implements: [Options],&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;options: {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;canvasPosition: 'over', // over | inside&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;canvasW: '400px',&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;canvasH: '300px',&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;zoom: '13',&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;noResZoom: '5',&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;dftLat: '45',&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;dftLng: '7'&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;initialize: function(element, latField, lngField, address, options) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($defined(options)) this.setOptions(options);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.checkOptions();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.element = $type(element)=='element'? element:$(element);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.latField = $type(latField)=='element'? latField:$(latField);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.lngField = $type(lngField)=='element'? lngField:$(lngField);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.address = address;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;checkOptions: function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(this.options.canvasPosition == 'over') {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var rexp = /[0-9]+px/;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(!rexp.test(this.options.canvasW)) this.options.canvasW = '400px';&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(!rexp.test(this.options.canvasH)) this.options.canvasW = '300px';&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;showMap: function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.renderContainer();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.renderCanvas();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.canvasContainer.setStyle('width', (this.canvas.getCoordinates().width)+'px');&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.renderCtrl();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.renderMap();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;renderContainer: function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.canvasContainer = new Element('div', {'id':'map_canvas_container'});&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.canvasContainer.setStyles({&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'padding': '1px',&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'background-color': '#000',&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'border': '1px solid #000'&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;})&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(this.options.canvasPosition == 'inside') {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.canvasContainer.inject(this.element);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;else { // over&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var elementCoord = this.element.getCoordinates();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.canvasContainer.setStyles({&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'position': 'absolute',&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'top': elementCoord.top+'px',&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'left':elementCoord.left+'px'&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;})&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.canvasContainer.inject(document.body);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;document.body.addEvent('mousedown', this.checkDisposeContainer.bind(this));&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;renderCanvas: function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.canvas = new Element('div', {'id':'map_canvas'});&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.canvas.setStyles({&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'width': this.options.canvasW,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'height': this.options.canvasH&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;})&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.canvas.inject(this.canvasContainer, 'top');&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;renderCtrl: function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var divCtrl = new Element('div').setStyles({'background-color': '#ccc', 'padding': '2px 0px', 'text-align': 'center'});&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var convertButton = new Element('input', {'type':'button', 'value':'convert'});&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;convertButton.setStyles({'cursor': 'pointer', 'border': '1px solid #999', 'margin-top': '2px'});&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;divCtrl.inject(this.canvasContainer, 'bottom');&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;convertButton.inject(divCtrl, 'top');&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;convertButton.addEvent('click', function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.latField.value = this.point.lat(); &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.lngField.value = this.point.lng(); &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.canvasContainer.dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}.bind(this));&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;checkDisposeContainer: function(evt) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(evt.page.x&amp;lt;this.canvasContainer.getCoordinates().left || &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; evt.page.x&amp;gt;this.canvasContainer.getCoordinates().right || &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; evt.page.y&amp;lt;this.canvasContainer.getCoordinates().top || &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; evt.page.y&amp;gt;this.canvasContainer.getCoordinates().bottom) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.canvasContainer.dispose();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;for(var prop in this) this[prop] = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;document.body.removeEvent('mousedown', this.checkDisposeContainer);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;renderMap: function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var mapOptions = {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;zoom: this.options.zoom.toInt(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;mapTypeId: google.maps.MapTypeId.ROADMAP&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var map = new google.maps.Map(this.canvas, mapOptions);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var point;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var geocoder = new google.maps.Geocoder();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;geocoder.geocode({'address':this.address}, function(results, status) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(status == google.maps.GeocoderStatus.OK) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.point = results[0].geometry.location;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.insertMarker(map);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;else {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;alert("Geocode was not successfull for the following reason: "+status);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.point = new google.maps.LatLng(this.options.dftLat, this.options.dftLng);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;map.setZoom(this.options.noResZoom.toInt());&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.insertMarker(map);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}.bind(this))&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;insertMarker: function(map) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;map.setCenter(this.point);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var marker = new google.maps.Marker({&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;map: map, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;position: this.point,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;draggable: true,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;title: this.point.lat()+' - '+this.point.lng()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;});&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;google.maps.event.addListener(marker, 'mouseup', function() {this.point = marker.getPosition();}.bind(this))&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;})&lt;br /&gt;&lt;/div&gt;Some annotations:&lt;br /&gt;HOW TO CONSTRUCT IT &lt;br /&gt;&lt;div class="code"&gt;var myConverter = new AddressToPointConverter(element, latField, lngField, address, options);&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;element: the DOM element or its id of the referer, the element from which we inject the map into the document, taking care of some options explained below.&lt;/li&gt;&lt;li&gt;latField: the DOM element or its id of the input field we want to write the latitude to&lt;/li&gt;&lt;li&gt;lngField: the DOM element or its id of the input field we want to write the longitude to&lt;/li&gt;&lt;li&gt;address: (string) the address to convert&lt;/li&gt;&lt;li&gt;options: some options in the form {'opt1':'val1', 'opt2':'val2'...}&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;OPTIONS&lt;br /&gt;&lt;ul&gt;&lt;li&gt;(string) canvasPosition : inside | over,&amp;nbsp; default over. Is the position of the map object we create. inside: the map container is inserted into the element defined in the constructor. over: the map container is positioned absolutely, its top left corner in the same position as the top left corner of element&lt;/li&gt;&lt;li&gt;(string) canvasW: default '400px'. The style width of the map (i.e. 400px, 100%) . The % values are allowed only for canvasPosition='inside'.&lt;/li&gt;&lt;li&gt; (string) canvasH: default '300px'. The style height of the map.&lt;/li&gt;&lt;li&gt;(int) zoom: default '13'. The zoom value when a result is found&lt;/li&gt;&lt;li&gt;(int) noResZoom: default '7'. The zoom when no result is found (with the conversion)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;(float) dftLat: default: '45'. The default latitude of the center of the map when no result is found&lt;/li&gt;&lt;li&gt;(float) dftLng: default '7'. The default longitude of the center of the map when no result is found&lt;/li&gt;&lt;/ul&gt;The conversion may give a result or not. If not the map is centered in a point defined by (dftLat, dftLng) and with zoom = noResZoom.&lt;br /&gt;In this case but even if the conversion is not exactly what we expect, we may drag the marker in order to positioning it in the desired position. Than click on the button convert and the computed point will be the point represented by the marker new position.&lt;br /&gt;&lt;br /&gt;That was the class code, let's we see now an example about its usage, always considering our form written above&lt;br /&gt;&lt;div class="code"&gt;&amp;lt;input type="text" name="address" id="address" /&amp;gt;&lt;br /&gt;&amp;lt;input type="text" name="city" id="city" /&amp;gt;&lt;br /&gt;&amp;lt;input type="text" name="cap" id="cap" /&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;function convert() {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var addressConverter = new AddressToPointConverter('converter', 'lat', 'lng', $('address').value+','+$('cap').value+' '+$('city').value, {'canvasPosition':'over', 'canvasW':'600px', 'canvasH':'400px'});&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;addressConverter.showMap();&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;input type="button" value="convert" onclick="Asset.javascript('http://maps.google.com/maps/api/js?sensor=true&amp;amp;callback=convert')"&amp;gt; &lt;br /&gt;&amp;lt;input type="text" name="lat" id="lat" readonly="readonly" /&amp;gt;&lt;br /&gt;&amp;lt;input type="text" name="lng" id="lng" readonly="readonly" /&amp;gt;&lt;br /&gt;&lt;/div&gt;The map is generated when clicking the "convert" button, first the google library is charged, passing a reference to our function as callback. In our function convert() the object is constructed and the method showMap is invocated. The map is shown. To dispose it it's enough to click outside the map object.&lt;br /&gt;That's all for now, soon a class to show a map with many markers and info windows.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3498590604919157056-1190530303092255841?l=abidibo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abidibo.blogspot.com/feeds/1190530303092255841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3498590604919157056&amp;postID=1190530303092255841' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/1190530303092255841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/1190530303092255841'/><link rel='alternate' type='text/html' href='http://abidibo.blogspot.com/2009/11/address-to-point-latlng-google-maps.html' title='An address to point (lat,lng) google maps converting class with mootools'/><author><name>abidibo</name><uri>http://www.blogger.com/profile/02962158400296290483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3498590604919157056.post-9210886616598933116</id><published>2009-10-08T17:21:00.021+02:00</published><updated>2009-11-26T20:59:07.763+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='fpdf'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Tables using FPDF Library</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_c72zFjtq5Z8/Ss4Hljtn8WI/AAAAAAAAAGY/w_Z5CxPXC3M/s1600-h/docket.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 0em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_c72zFjtq5Z8/Ss4Hljtn8WI/AAAAAAAAAGY/w_Z5CxPXC3M/s320/docket.png" /&gt;&lt;/a&gt;Hi!&lt;br /&gt;This time we'll speak about the exportation of tables in pdf format. I needed a way to print some dockets regarding persons data. This dockets have to be printed using special paper, that is that paper which already have the dockets ready and cut. So the goal of my work was to found a way to generate a table with perfectly equal cells of a given width and height. These cells must contain some text, which is not fixed, but may contain different informations:&lt;br /&gt;Surname - name, Company (optional), Address (may stay on 2 lines), CAP City.&lt;br /&gt;Why didn't I use html and the javascript print function to make it work? Clear, because I was glad to study something new and because printing to a pdf file is a more professional way to solve this problem.&lt;br /&gt;One difficulty was represented by the variability of the text, so I assumed that each cell could have a maximum of 5 lines:&lt;br /&gt;- surname and name&lt;br /&gt;- company (optional)&lt;br /&gt;- address 1 line&lt;br /&gt;- address 2 line (if needed)&lt;br /&gt;- cap and city&lt;br /&gt;So there can be dockets containing text between 3 an 5 lines.&lt;br /&gt;I decided to use the fpdf library which is free of course. You may download it from &lt;a href="http://www.fpdf.org/en/download.php"&gt;here&lt;/a&gt; (I used the last version 1.6).&lt;br /&gt;Now this library has many useful functions but I extended it in order to get my desired table.&lt;br /&gt;So here is my class and below how to instanciate and use it. Good reading.&lt;br /&gt;&lt;div class="code"&gt;&amp;lt;?php&lt;br /&gt;/*&lt;br /&gt;&amp;nbsp;* CLASS TblFPDF&lt;br /&gt;&amp;nbsp;* 08/09/2009&lt;br /&gt;&amp;nbsp;* written by abidibo &amp;lt;abidibo@gmail.com&amp;gt;&lt;br /&gt;&amp;nbsp;* Copyright: FUCK COPYRIGHT, NO LICENCE TAKE THIS CODE AND DO WHAT YOU WANT&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;* Description&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; This class allows to create a pdf table made by cells all of the same dimensions&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (width and height) and containing some text. This text must follow some rules, as&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this class was written in order to print some dockets, and dockets hava a fixed&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; structure. More informations later.&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;* Parameters of __construct function&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (int) $nRows : number or rows for document page&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (int) $nCols : number of columns&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (float) $cellWidth : width of every single cell in mm&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (float) $cellHeight : height of every single cell in mm&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (mix) $cellBorder : cell border property&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 -&amp;gt; no border&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 -&amp;gt; border&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string containing one ore more characters:&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; L -&amp;gt; left border&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; T -&amp;gt; top border&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; R -&amp;gt; right border&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; B -&amp;gt; bottom border&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;* Parameters of render function&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (array) $textArray : an array where each element represent the string&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; to insert in a cell. Break lines represented by \n&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (int) $cellLines : the maximum number of lines inside a cell.&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; The $textArray[$i] text foreach $i has to stay inside the cell, that is has to have&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a maximum of ($cellLines-1) break lines or less if the text between two&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break lines is so long that can't stay in a single line of width $cellWidth.&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; That's a very important condition!&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;&lt;br /&gt;// include fpdf library and set the constant it used to charge font folder&lt;br /&gt;// font folder is given with the library&lt;br /&gt;define('FPDF_FONTPATH',dirname(__FILE__).'/font/');&lt;br /&gt;require('fpdf.php');&lt;br /&gt;&lt;br /&gt;class TblFPDF extends FPDF {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function __construct($nRows, $nCols, $cellWidth, $cellHeight, $cellBorder) {&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parent::__construct();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;_nrows = $nRows;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // rows for page&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;_ncols = $nCols;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // columns&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;_cellw = $cellWidth;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;_cellh = $cellHeight;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;_cellb = $cellBorder;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public function render($textArray, $cellLines) {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $count = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reset($textArray);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $totCell = count($textArray);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $totPages = ceil($totCell/($this-&amp;gt;_nrows*$this-&amp;gt;_ncols));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for($p=0;$p&amp;lt;$totPages;$p++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;AddPage();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for($r=0;$r&amp;lt;$this-&amp;gt;_nrows;$r++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for($c=0;$c&amp;lt;$this-&amp;gt;_ncols;$c++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if($count&amp;gt;=$totCell) break;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // all cells has been already printed&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;setXY($c*$this-&amp;gt;_cellw, $r*$this-&amp;gt;_cellh);&amp;nbsp;&amp;nbsp;&amp;nbsp; // set x and y position of the top left corner of the new cell&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;renderCell(current($textArray), $cellLines);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; next($textArray);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $count++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private function renderCell($text, $cellLines) {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $totLines = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $text_lines = explode("\n", $text);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for($i=0;$i&amp;lt;count($text_lines);$i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $totLines++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if($this-&amp;gt;getStringWidth($text_lines[$i])&amp;gt;=$this-&amp;gt;_cellw-2.6) $totLines++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if($totLines&amp;lt;$cellLines) $text .= "\n";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for($i=0;$i&amp;lt;($cellLines-$totLines);$i++) $text .= "\n";&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;MultiCell($this-&amp;gt;_cellw, ($this-&amp;gt;_cellh/$cellLines), $text, $this-&amp;gt;_cellb, "L");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;So this was the class I used. It's well commented, but let's see how to use it&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;require_once(class.TblFPDF.php);&lt;br /&gt;&lt;br /&gt;$textArray = array(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0=&amp;gt;"Name Surname\nCompany\nAddress\nCAP City",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1=&amp;gt;"Gino Pinotto\nTalisker spa\n5th 23/q\n10384 New York"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;br /&gt;$pdfDoc = new TblFPDF(8,3,70,37,1);&lt;br /&gt;$pdfDoc-&amp;gt;render($textArray);&lt;br /&gt;$pdfDoc-&amp;gt;Output();&lt;br /&gt;exit();&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;In this example the output will be a pdf document with two dockets drawned starting from the point (0,0) of the page, containing the informations included in $textArray. If many text elements are given the full page will have 8 rows for 3 columns, each cell will have a width of 7 cm and an height of 3.7 cm, with a black border. The text inside the cell must occupy not more than 5 lines, that's the only recomendation.&lt;br /&gt;Hope is useful.&lt;br /&gt;Bye!&lt;br /&gt;PS. Yesterday Italy's top court stripped Mr. Berlusconi of his legal immnuity (I gloat for this), hoping justice may be done I'll have a great party!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3498590604919157056-9210886616598933116?l=abidibo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abidibo.blogspot.com/feeds/9210886616598933116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3498590604919157056&amp;postID=9210886616598933116' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/9210886616598933116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/9210886616598933116'/><link rel='alternate' type='text/html' href='http://abidibo.blogspot.com/2009/10/tables-using-fpdf-library.html' title='Tables using FPDF Library'/><author><name>abidibo</name><uri>http://www.blogger.com/profile/02962158400296290483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_c72zFjtq5Z8/Ss4Hljtn8WI/AAAAAAAAAGY/w_Z5CxPXC3M/s72-c/docket.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3498590604919157056.post-3784467505437652513</id><published>2009-09-10T12:30:00.025+02:00</published><updated>2009-11-26T20:59:49.320+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='shadows'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='mootools'/><category scheme='http://www.blogger.com/atom/ns#' term='canvas'/><title type='text'>MoocanvasShadow reviewed - shadows for everyone</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_c72zFjtq5Z8/SqjQBuUTxzI/AAAAAAAAAGA/M9XeZdAk5KA/s1600-h/alpchsshot.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_c72zFjtq5Z8/SqjQBuUTxzI/AAAAAAAAAGA/M9XeZdAk5KA/s320/alpchsshot.jpg" /&gt;&lt;/a&gt;Hi all,&lt;br /&gt;well, this time I'd like to write about a nice class implemented using &lt;a href="http://www.mootools.net/"&gt;mootools libraries&lt;/a&gt; used to paint shadows around blocks. His name is mooCanvasShadow, written by &lt;a href="http://code.google.com/u/stolwijk.arian/" style="white-space: nowrap;"&gt;Arian Stolwijk&lt;/a&gt;, and &lt;a href="http://code.google.com/p/moocanvasshadow/"&gt;here&lt;/a&gt; the link to the project. This class uses the &lt;a href="http://ibolmo.com/2009/04/12/moocanvas-moved-and-updated/"&gt;mooCanvas class&lt;/a&gt; of ibolmo's.&lt;br /&gt;When I used this class for some projects I encountered some difficulties and some strange behavioures, so I tried to reniew this class which was shared under the MIT license. There was a problem when applying a shadow to a container div which was centered in the page when resizing the browser window. The problem was that while resizing the browser window the container centered is moved in order to keep the centered position, but the canvas area painted in order to get the shadow was static and positioned absolute relative to the body, so couldn't follow the container in motion. The solution is to paint the canvas area relative to the container we want to apply shadows to (changes made to the method &lt;b&gt;createCanvasDiv&lt;/b&gt;). This way if it moves than the canvas follows it.&lt;br /&gt;Another adjustment was made in a regular expression matching colors, it didn't consider not capital letters and so always put the default color if you write colors codes this way: #ffffff (like me).&lt;br /&gt;Above the major things, now the code:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;//AbiCanvasShadow, Mootools Canvas Dropshadow Abidibo extended &lt;br /&gt;/* &lt;br /&gt;Script: CanvasShadow.js &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Contains the Canvas class. &lt;br /&gt;Dependencies: &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;MooTools, &amp;lt;http: mootools.net=""&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Element, and its dependencies &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Element.Dimensions &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;MooCanvas, &amp;lt;http: ibolmo.com="" moocanvas="" projects=""&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Canvas, &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Paths &lt;br /&gt;Author: &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Arian Stolwijk, &amp;lt;http: www.aryweb.nl=""&amp;gt; &lt;br /&gt;Adjusted by &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Abidibo, &amp;lt;http: abidibo.otto.to.it=""&amp;gt; &lt;br /&gt;License: &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;MIT License, &amp;lt;http: en.wikipedia.org="" mit_license="" wiki=""&amp;gt; &lt;br /&gt;*/ &lt;br /&gt;&lt;br /&gt;var AbiCanvasShadow = new Class({ &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;/** &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * This function creates a new canvas element of MooCanvas &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * The elements will be placed at the right position, so the &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * canvas element is right behind the to-shadow element &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * @param {Object} shadowDiv this div will get a shadow &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * @param {Object} options the options: &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;size: The size of the shadow &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;radius: the radius of the shadow corners &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;opacity: The opacity of the shadow &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;color: The shadow color, this should be like #FF9900, &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;or an array with the rgb colors [255,0,255] &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;overwrite: if the canvas element already exists, &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;it wil dispose that element and create a new one &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; */&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;initialize: function(shadowDiv,options){&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Set shadow div &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.shadowDiv = shadowDiv; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Get the coordinates of the element &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.position = shadowDiv.getCoordinates(); &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Set some options &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.size = options.size; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var radius = options.radius; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var opacity = options.opacity; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($(shadowDiv.get('id')) == false){ &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.giveId(shadowDiv); &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Dispose the already existing element, if needed &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if ($type(options.overwrite) == 'boolean' &amp;amp;amp;&amp;amp;amp; options.overwrite == true) { &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if ($type($(shadowDiv.get('id') + '_mooShadow')) == 'element') { &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$(shadowDiv.get('id') + '_mooShadow').dispose(); &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Create a new Canvas object, of MooCanvas &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.canvas = new Canvas({ &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'width': this.position.width + (this.size * 2), &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'height': this.position.height + (this.size * 2), &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'id': shadowDiv.get('id')+'_mooShadow' &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}); &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Create a div and put the canvas element in it to set it at the right position &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.createCanvasDiv(); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Create the context &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var ctx = this.canvas.getContext("2d"); &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Create the shadow color &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(options.color.test(/#[0-9A-Za-z]{6}|[0-9A-Za-z]{3}/)){ &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;options.color = options.color.hexToRgb(true); &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if($type(options.color) == 'array' &amp;amp;amp;&amp;amp;amp; $type(options.color[2]) != 'undefined'){ &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var color = options.color[0]+','+options.color[1]+','+options.color[2];&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}else{ &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;var color = '0,0,0'; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Create the retangles/ the actual shadow &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (var i = this.size; i &amp;amp;gt;= 0; i--) { &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.roundedRect(ctx, &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;i, &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;i, &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;(this.position.width-(i*2)+2*this.size), &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;(this.position.height-(2*i)+2*this.size), &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;radius &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;); &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ctx.fillStyle = "rgba("+color+", "+opacity/(this.size-i)+")"; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ctx.fill(); &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;/** &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * This function creates a div where the canvas element is in inserted &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * This element will position behind the to-shadow div &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; */ &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;createCanvasDiv: function(){ &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;this.canvasDiv = new Element('div',{ &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;styles:{ &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'width': this.position.width+(this.size*2), &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'height': this.position.height+(this.size*2), &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'z-index': -1, &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'position': 'absolute', &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'left': '-'+this.size+'px', &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'top':&amp;nbsp; '-'+this.size+'px' &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}).adopt(this.canvas).inject(this.shadowDiv); &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;/** &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * This method creates a rounded rectangle &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * @param {Object} ctx the canvas context &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * @param {Object} x the upper left x-axis position &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * @param {Object} y the upper left y-axis positoin &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * @param {Object} width the retangle width &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * @param {Object} height the retangle height &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * @param {Object} radius the corner radius &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; */ &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;roundedRect: function (ctx,x,y,width,height,radius){ &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ctx.beginPath(); &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ctx.moveTo(x,y+radius); &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ctx.lineTo(x,y+height-radius); &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ctx.quadraticCurveTo(x,y+height,x+radius,y+height); &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ctx.lineTo(x+width-radius,y+height); &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ctx.quadraticCurveTo(x+width,y+height,x+width,y+height-radius); &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ctx.lineTo(x+width,y+radius); &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ctx.quadraticCurveTo(x+width,y,x+width-radius,y); &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ctx.lineTo(x+radius,y); &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ctx.quadraticCurveTo(x,y,x,y+radius); &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;/** &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * This method set an random ID to an element &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * @param {Object} div &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; */ &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;giveId: function(div){ &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;div.set('id',$rand()+'_mooShadow'); &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;}); &lt;br /&gt;&lt;br /&gt;/** &lt;br /&gt;&amp;nbsp;* &lt;br /&gt;&amp;nbsp;* @param {Object} options: the same options as the mooCanvasShadow() class &lt;br /&gt;&amp;nbsp;*/ &lt;br /&gt;Element.implement({ &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;AbiCanvasShadow: function (options){ &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;new AbiCanvasShadow(this,options);&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return this; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;} &lt;br /&gt;});&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;and how to use it:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;window.addEvent('domready',function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 'mainContainer' is the ID of the element&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('mainContainer').AbiCanvasShadow({&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; opacity: 0.2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size: 14,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; radius: 10,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; color: '#333333'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;}.delay(800));&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The html structure must be this way:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&amp;lt;div id="mainContainer"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;lt;div id="container"&amp;gt; &amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; your site, your content&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;that because of... guess it?&amp;nbsp;&amp;nbsp; IE. Si señores, another self behaviour for IE7 and IE6 and I don't know if IE8 too. Whit these horrible browsers using only one container causes the below canvas area to affect the background of the element even if a color was setted. So some points:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Use two container and apply the effect to the outer&lt;/li&gt;&lt;li&gt;Very important: &lt;b&gt;set the position property of mainContainer as relative&lt;/b&gt;, that because the canvas is positioned absolute relative to it &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Set the width of 'mainContainer' equal to the width of 'container'&lt;/li&gt;&lt;li&gt;Set a background color for 'container'&lt;/li&gt;&lt;li&gt;Pay attention if using padding or margins, that is properties affecting the position of the element&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;Last thing. You may see that I've setted a delay of 800 ms to the function called at the event domready. This value may be 0 or higher, it depends. It is useful because with FF there's a different behaviour in applyng css styles when recharging a page or get it through a link. When recharging a page the css seems to be applied a bit later, that causes for example that an horizontal menu may be displayed for a while in his "&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;" form (vertically), and after rendered in horizontal, saving space. But if the coordinates of the element are taken in the instant the menu is higher then the canvas is painted with these values. After the menu becomes horizontal, saves vertical space and then the dimension of the element and his shadows are different. Using this delay this problem is prevented.&amp;nbsp;Another way could be to call the function not at the event 'domready' but at the event onload, that is:&lt;br /&gt;&lt;div class="code"&gt;window.onload = function ()...&lt;br /&gt;&lt;/div&gt;but in this case the interval between the appearence of the element and its shadow is grater, especially if the element contains iframe or heavy elements.&lt;br /&gt;That's all guys, hasta la proxima!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3498590604919157056-3784467505437652513?l=abidibo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abidibo.blogspot.com/feeds/3784467505437652513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3498590604919157056&amp;postID=3784467505437652513' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/3784467505437652513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/3784467505437652513'/><link rel='alternate' type='text/html' href='http://abidibo.blogspot.com/2009/09/moocanvasshadow-reviewed-shadows-for.html' title='MoocanvasShadow reviewed - shadows for everyone'/><author><name>abidibo</name><uri>http://www.blogger.com/profile/02962158400296290483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_c72zFjtq5Z8/SqjQBuUTxzI/AAAAAAAAAGA/M9XeZdAk5KA/s72-c/alpchsshot.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3498590604919157056.post-3825112181685000449</id><published>2009-09-02T12:43:00.018+02:00</published><updated>2009-11-26T21:00:14.039+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Ext'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Ext.Window max height</title><content type='html'>&lt;a href="http://extjs.com/"&gt;Ext&lt;/a&gt; is an amazing javascript library. It let you do things humans can never imagine. It's enough to have a look at the &lt;a href="http://www.extjs.com/deploy/dev/examples/samples.html"&gt;samples page&lt;/a&gt; to understand what I'm saying. Moreover ext provides a complete UI structure that let you have beautiful windows, forms, tables... with no work, that is, ext provides the css and images necessary to the UI.&lt;br /&gt;I discovered ext not so early, that's why really I don't use it as my favourite library (which still is &lt;a href="http://www.mootools.net/"&gt;mootools&lt;/a&gt;) but only to do extraordinary things.&lt;br /&gt;In my last works I come to a problem. I wanted to open windows (like normal desktop windows) when opening a product details in a catalogue. All works properly, but what happens if details content is extremly long? Clearly the height of the window follow it.&lt;br /&gt;That's a problem I think, because ext.window class doesn't support any configuration paramether or method to set a max-height attribute! That is your window will follow the height of his content with no way to stop that.&lt;br /&gt;Here clearly is helpful to find a way to pass by this lackage and set a max Height attribute, that is what I've done for my work and here I post my code.&lt;br /&gt;&lt;br /&gt;Here is my class which extends Ext.Window&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;Ext.productWindow = Ext.extend(Ext.Window, {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; homefile: 'index.php',&amp;nbsp; // not important for you&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; maxHeight: 9999,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; open: function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // not important for you, is an ajax call that makes an icon appear in the bottom bar of the application&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sendPost('index.php?pt[catalogue-viewedItems]', 'id='+this.prdID, 'viewedItems');&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.show();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; minimize: function(window) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.hide();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listeners: {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; close: function(window)&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // not important for you, is an ajax call that make disappear the icon in the bottom bar&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sendPost('index.php?pt[catalogue-removeProduct]', 'id='+this.prdID, 'scriptPaper', '', true); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // that's the method&amp;nbsp; I use: if the height passed is greater than the maxHeight property &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // than the window is resized by the setHeight function.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setMaxHeight: function(h) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(h&amp;gt;this.maxHeight) this.setHeight(this.maxHeight); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; })&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;That was the class implementation, now I use a function to construct a window object, here it is:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;function newWindow(homefile, id) {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var url = homefile+'?pt[catalogue-viewProductDataAjax]&amp;amp;id='+id;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; win[id] = new Ext.productWindow({&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; homefile: homefile,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; prdID: id,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; width:800,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; maxHeight:500,&amp;nbsp; // here I set the maxHeight value for this instance of productWindow&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y:50,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; id: 'prdWindow'+id,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; autoScroll:true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; autoLoad:{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // when loading the windo content....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // first: I load the response to the request represented by url&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; url:url,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // second: after charging contents, I call the method setMaxHeight passing it the height of the contents of the window, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // then this method sets the height of the window to the maxHeight property(500)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // if the contents hight is greater, let the height as it is if minor&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; callback: function(el) {prd_window.setMaxHeight(el.getHeight());}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; title:'productCard',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; collapsible:true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; minimizable:true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resizable:true&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return win[id];&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Finally to create a window:&lt;br /&gt;&lt;div class="code"&gt;prd_window = newWindow(homefile, id);&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;This way you have your maxHeight setable window. Only some more things:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * the product window is constructed and associated to an array element, that because you may have more windows open at once.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * for the same reason before creating a new window there is a check (that i've omitted here) to control if the window represented by its id already exists, if yes than only is showed, otherwise it's created.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3498590604919157056-3825112181685000449?l=abidibo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abidibo.blogspot.com/feeds/3825112181685000449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3498590604919157056&amp;postID=3825112181685000449' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/3825112181685000449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/3825112181685000449'/><link rel='alternate' type='text/html' href='http://abidibo.blogspot.com/2009/09/ext-windows-height-resize.html' title='Ext.Window max height'/><author><name>abidibo</name><uri>http://www.blogger.com/profile/02962158400296290483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3498590604919157056.post-3813305399945982114</id><published>2009-09-02T10:50:00.000+02:00</published><updated>2009-09-02T10:50:22.435+02:00</updated><title type='text'>The really first (I hope)</title><content type='html'>Well, hi all!&lt;br /&gt;Starting from now Abidiblog changes a lot his purposals, his language, and many other things...&lt;br /&gt;All previous posts (all in italian language) may be founded here:&lt;br /&gt;&lt;a href="http://abidibo.otto.to.it/"&gt;http://abidibo.otto.to.it&lt;/a&gt;&lt;br /&gt;under the abidiblog section.&lt;br /&gt;Now what happens? Simply I began studying more deeply some php concepts, some js libraries and so on, and I think time has come to share some informations to a larger public, and in a more professional way.&lt;br /&gt;So I decided to re-start my blog, not using my site and CMS to save time in writing articles and to center the entire stuff on Informatic, excluding all other things like maps, personal informations, services, news, calendars and many other things you may always find at the previous address. For the same reason I decided to write in English, so my first posts and not only the firsts' will be full of errors because my english was a bit supressed by spanish, but that may be even a good way to refresh it properly.&lt;br /&gt;Here all the explaination, from the next posts only usefull (I hope) stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3498590604919157056-3813305399945982114?l=abidibo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abidibo.blogspot.com/feeds/3813305399945982114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3498590604919157056&amp;postID=3813305399945982114' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/3813305399945982114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3498590604919157056/posts/default/3813305399945982114'/><link rel='alternate' type='text/html' href='http://abidibo.blogspot.com/2009/09/really-first-i-hope.html' title='The really first (I hope)'/><author><name>abidibo</name><uri>http://www.blogger.com/profile/02962158400296290483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
