<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CescoBlog</title>
	<atom:link href="http://www.cescopag.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.cescopag.com</link>
	<description>Web-appunti tecnici (e non) per webdesigner e sviluppatori.</description>
	<lastBuildDate>Fri, 24 Dec 2010 08:11:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Buone feste</title>
		<link>http://www.cescopag.com/2010/12/buone-feste/</link>
		<comments>http://www.cescopag.com/2010/12/buone-feste/#comments</comments>
		<pubDate>Fri, 24 Dec 2010 08:11:29 +0000</pubDate>
		<dc:creator>Francesco Paggin</dc:creator>
				<category><![CDATA[bloBBing]]></category>

		<guid isPermaLink="false">http://www.cescopag.com/?p=152</guid>
		<description><![CDATA[Come vi sarete accorti il blog è fermo da qualche mese. Nel frattempo ho avviato l&#8217;attività di freelance ed il tempo da dedicare al blog si è ridotto drasticamente. Sto preparando il nuovo sito personale, più completo e curato, che integrerà questo blog e portfolio dei lavori svolti. Vi do quindi appuntamento tra qualche settimana [...]]]></description>
			<content:encoded><![CDATA[<p>Come vi sarete accorti il blog è fermo da qualche mese. Nel frattempo ho avviato l&#8217;attività di freelance ed il tempo da dedicare al blog si è ridotto drasticamente. Sto preparando il nuovo sito personale, più completo e curato, che integrerà questo blog e portfolio dei lavori svolti. Vi do quindi appuntamento tra qualche settimana per tutti gli aggiornamenti.</p>
<p>Con l&#8217;occasione ringrazio tutte le persone che hanno commentato e che mi hanno espresso i loro pareri positivi sul blog, ed auguro a tutti<br />
<strong>Buon Natale e Felice Anno Nuovo</strong>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cescopag.com/2010/12/buone-feste/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nuovo acquisto &#8211; Canon 450d</title>
		<link>http://www.cescopag.com/2009/11/nuovo-acquisto-canon-450d/</link>
		<comments>http://www.cescopag.com/2009/11/nuovo-acquisto-canon-450d/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 21:51:07 +0000</pubDate>
		<dc:creator>Francesco Paggin</dc:creator>
				<category><![CDATA[bloBBing]]></category>
		<category><![CDATA[450d]]></category>
		<category><![CDATA[canon]]></category>
		<category><![CDATA[fotografia]]></category>
		<category><![CDATA[reflex]]></category>

		<guid isPermaLink="false">http://www.cescopag.com/?p=140</guid>
		<description><![CDATA[Oggi ho ricevuto la ma prima reflex, la collaudatissima Canon 450d con 18-55 IS in kit, la reflex entry-level di Canon per eccellenza.

Per qualche anno ho usato compatte, bridge e affini e mi sembrava il momento di fare il primo passo nel mondo della Fotografia con la F maiuscola.
Dopo mezz&#8217;oretta di utilizzo, eccitato come un [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.cescopag.com/wp-content/uploads/2009/11/canon.jpg" alt="canon" title="canon" width="150" height="150" class="alignright size-full wp-image-141" />Oggi ho ricevuto la ma prima reflex, la collaudatissima <strong>Canon 450d con 18-55 IS in kit</strong>, la reflex entry-level di Canon per eccellenza.
</p>
<p>Per qualche anno ho usato compatte, bridge e affini e mi sembrava il momento di fare il primo passo nel mondo della <strong>Fotografia</strong> con la <strong>F</strong> maiuscola.</p>
<p>Dopo mezz&#8217;oretta di utilizzo, eccitato come un bambino col giocattolino nuovo, ecco le mie impressioni a caldo, in ordine sparso&#8230;</p>
<p><span id="more-140"></span></p>
<ul>
<li><strong>Ergonomia</strong> &#8211; tutti i bottoni che servono al posto giusto, è notevole la quantità di impostazioni che si possono raggiungere con un paio di click. Impagabile la rotellina per regolare i parametri di scatto.</li>
<li><strong>Autofocus</strong> &#8211; un razzo rispetto alle compatte. Veramente impressionante. La gestione dei punti di messa a fuoco poi è molto cool, con quei led rossi nel mirino&#8230;</li>
<li><strong>Profondità di campo</strong> &#8211; che bello vedere uno sfondo sfocato, cose che con la compatta ti sogni!</li>
<li><strong>Sound</strong> &#8211; il ciak &quot;analogico&quot; dello specchio è coinvolgente, specie nella raffica, ci si sente subito un reporter.</li>
<li><strong>Rumore di fondo</strong> &#8211; anche a 1600 ISO è perfettamente accettabile. Finalmente posso far foto in interni senza grossi problemi!</li>
<li><strong>Stabilizzatore</strong> &#8211; Sebbene sia l&#8217;ottica in kit, funziona! E bene&#8230;</li>
<li><strong>EOS Utility</strong> &#8211; Il programma che permette di controllare la fotocamera da computer. Incredibile poter mettere a fuoco zoomando al 100% su un monitor 22&quot; in live view!!</li>
<li><strong>Velocità</strong> &#8211; Pronta alla foto in un nanosecondo, basta premere per metà il pulsante di scatto. Molto più facile cogliere l&#8217;attimo</li>
</ul>
<p>Oltre a ciò ci sono tanti altri piccoli dettagli. La sensazione generale è comunque di aver fatto un gran balzo in avanti. La bridge che avevo prima, seppur sulla carta piena di caratteristiche avanzate &#8211; alcune addirittura superiori, al confronto sembra poco più di un giocattolo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cescopag.com/2009/11/nuovo-acquisto-canon-450d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Maps API: &#8220;Calcola il percorso&#8221; nel nostro sito</title>
		<link>http://www.cescopag.com/2009/11/google-maps-api-calcola-il-percorso-nel-nostro-sito/</link>
		<comments>http://www.cescopag.com/2009/11/google-maps-api-calcola-il-percorso-nel-nostro-sito/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 21:05:40 +0000</pubDate>
		<dc:creator>Francesco Paggin</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[directions]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[maps]]></category>

		<guid isPermaLink="false">http://www.cescopag.com/?p=122</guid>
		<description><![CDATA[
Come molti di voi sapranno Google mette a disposizione per la maggior parte dei propri prodotti una serie di strumenti per sfruttarne le potenzialità nei nostri progetti.
  Google Maps non fa eccezione e ci fornisce tutti gli strumenti (API) per sfruttare le mappe di Google nei nostri siti tramite Javascript.


  Una delle funzionalità [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.cescopag.com/wp-content/uploads/2009/11/maps.jpg" alt="Google Maps Directions" title="Google Maps Directions" width="200" height="167" class="alignright size-full wp-image-130" /></p>
<p>Come molti di voi sapranno Google mette a disposizione per la maggior parte dei propri prodotti una serie di strumenti per sfruttarne le potenzialità nei nostri progetti.<br />
  <strong>Google Maps </strong>non fa eccezione e ci fornisce tutti gli strumenti (<strong>API</strong>) per sfruttare le mappe di Google nei nostri siti tramite Javascript.
</p>
<p>
  Una delle funzionalità più utili è quella di poter <strong>calcolare il percorso </strong>ottimale per raggiungere un determinato luogo, ottenendo tutte le indicazioni sulle svolte e sulle strade da percorrere. Non molti sanno che queste funzionalità sono a disposizione degli sviluppatori per integrarle nei propri progetti, ed è proprio ciò che faremo.
  </p>
<p><a href="http://www.cescopag.com/demos/directions/demo3.html" class="linkdemo" target="_blank">Demo</a></p>
<p><span id="more-122"></span></p>
<p>
  Ipotizziamo di voler integrare nel nostro sito una comoda sezione &#8220;Come raggiungerci&#8221;, dove l&#8217;utente possa inserire la propria posizione ed ottenere il percorso per raggiungerci.
  </p>
<p>
  La nostra pagina quindi sarà composta da un breve form dove l&#8217;utente inserirà la posizione, la mappa dove verrà visualizzato il percorso e l&#8217;area in cui verranno visualizzate le informazioni:</p>
<pre>
&lt;form name="findRoute" action=""&gt;
	&lt;p&gt;
		&lt;label for="partenza"&gt;Da dove parti?&lt;/label&gt;
		&lt;input type="text" name="partenza" /&gt;
	&lt;/p&gt;

	&lt;p&gt;
		&lt;input type="submit" value="Calcola" name="calcola" id="calcola" /&gt;
	&lt;/p&gt;
&lt;/form&gt;

&lt;div id="map"&gt;&lt;/div&gt;
&lt;div id="route"&gt;&lt;/div&gt;
</pre>
<p>Com&#8217;è facile intuire la mappà sarà inserita all&#8217;interno del div <em>map</em>, mentre le indicazioni all&#8217;interno del div <em>route</em>.</p>
<p>  Ma veniamo alla parte Javascript. Per prima cosa è necessario procurarsi una <strong>API Key </strong>dal sito google:
</p>
<p> <a href="http://code.google.com/intl/it-IT/apis/maps/signup.html">http://code.google.com/intl/it-IT/apis/maps/signup.html</a></p>
<p>Una volta ottenuta la chiave possiamo includere il javascript di Google Maps: </p>
<pre>
&lt;script src="http://maps.google.com/maps?file=api&#038;v=2.x&#038;key=CHIAVE" type="text/javascript"&gt;&lt;/script&gt;
</pre>
<p>Dove al posto di <em><strong>CHIAVE</strong></em> ci andrà la API Key fornita da Google.</p>
<p>Procediamo ora con lo script vero e proprio. Innanzitutto inizializziamo una serie di variabili vuote che conterranno gli oggetti di Google Maps che istanzieremo:</p>
<pre>
/* GOOGLE MAPS OBJECTS */
var home;       //Home GLatLng object
var map;        //GMap object
var directions; //Directions object
var marker;     //GMarker object
</pre>
<p>La prima funzione che andremo ad utilizzare sarà la funzione <code>initialize()</code> che come dice il nome preparerà tutto il necessario per far funzionare la mini-applicazione. Questa funzione dovrà essere richiamata al caricamento della pagina, ad esempio all&#8217;interno del tag <em>body</em>:</p>
<pre>
&lt;body onload="initialize()"&gt;
</pre>
<p>Ma veniamo al codice. Per prima cosa recuperiamo gli elementi html che ci servono tramite il metodo <code>document.getElementById</code>:</p>
<pre>
//Get html elements needed:
var mapPanel        = document.getElementById('map');
var directionsPanel = document.getElementById('route');
var submitButton    = document.getElementById('calcola');
</pre>
<p>Subito dopo invece definiamo il nostro punto base, nell&#8217;esempio sarà la nostra ipotetica sede:</p>
<pre>
//Home location:
home = new GLatLng(45.434629,12.337925);
</pre>
<p>Ora che abbiamo il necessario possiamo già istanziare la mappa che verrà visualizzata di default e mostrerà il punto base:</p>
<pre>
//Create a map:
map = new GMap2(mapPanel);
map.setCenter(home, 13);
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
</pre>
<p>Per prima cosa viene creato l&#8217;oggetto <strong>GMap2</strong>, cioè la Google Map, e viene associato al <em>div#map</em> (mapPanel). La mappa viene poi centrata in home, al livello di zoom 13 (qui possiamo procedere a tentativi, più piccolo sarà il numero e più superficie terrestre vedremo). Tramite le altre due righe andiamo ad aggiungere i controlli che ci interessano (in questo caso i controlli standard e quelli per il tipo di visualizzazione &#8211; satellite, mappa, ibrida).</p>
<p>Ora dobbiamo evidenziare il punto base, e lo faremo aggiungendo un <em>marker</em>:</p>
<pre>
//Create marker:
marker = new GMarker(home);
map.addOverlay(marker);
</pre>
<p>Al marker possiamo aggiungere un fumetto descrittivo, contenente ad es. l&#8217;indirizzo, che si apre al click:</p>
<pre>
GEvent.addListener(marker, "click", function() {
    marker.openInfoWindowHtml("&lt;strong&gt;Venezia&lt;/strong&gt;&lt;br /&gt;Piazza San Marco");
});
</pre>
<p>Il comando <code>addListener</code> serve appunto per associare il click sul marker all&#8217;operazione di mostrare un fumetto contenente una stringa html (tramite il comando <code>openInfoWindowHtml</code>).</p>
<p>Come ultimo passaggio preparatorio dobbiamo istanziare l&#8217;oggetto <em>GDirections</em> di Google, che ci servirà per calcolare le rotte:</p>
<pre>
//Create directions module:
directions = new GDirections(map, directionsPanel);
</pre>
<p>Ora che tutto è pronto dobbiamo preoccuparci di cosa fare quando l&#8217;utente premerà sul pulsante &#8220;Calcola&#8221;:</p>
<pre>
submitButton.onclick = function() {
    getRoute();
    return false;
}
</pre>
<p>Definiamo quindi la funzione <code>getRoute()</code>:</p>
<pre>
function getRoute() {
	var userLocation = document.findRoute.partenza.value;
	from = userLocation;
	to  = home;

    directions.load("from: " + from + " to: " + to, {"locale":"it_IT"});
}
</pre>
<p>
Questa non fa altro che leggere la posizione di partenza dal campo compilato dall&#8217;utente e assegnarla alla variabile <em>from</em> e associare il punto base alla variabile <em>to</em>.<br />
La magia avviene infine nell&#8217;ultima riga, dove andremo a calcolare la rotta tramite il metodo load del nostro oggetto <em>GDirections</em>.
</p>
<p>
A questo andremo a passare due parametri: Il primo sarà una stringa contenente le indicazioni nella forma &#8220;from:INDIRIZZO_DI_PARTENZA to:INDIRIZZO_DI_ARRIVO&#8221; (esattamente a come faremmo nella casella di ricerca in maps.google.it). Il secondo parametro invece è un oggetto che ci permette di specificare varie opzioni, in questo caso la lingua italiana.
</p>
<p>
Se andiamo a testare il tutto, dovremmo vedere che, una volta scelto un indirizzo di partenza, automaticamente verrà generato un percorso, visualizzato correttamente nella mappa, e generato il percorso passo-passo con tutte le indicazioni. Semplice no?
</p>
<p><a href="http://www.cescopag.com/demos/directions/demo1.html" class="linkdemo" target="_blank">Demo 1</a></p>
<p>Ora aggiungiamo qualche funzionalità in più. Per prima cosa vogliamo dare la possibiltà di calcolare anche il percorso di ritorno. Aggiungiamo quindi un <em>checkbox</em> con la dicitura &#8220;Calcola percorso di ritorno&#8221;:</p>
<pre>
&lt;h1&gt;Come arrivare&lt;/h1&gt;
&lt;form name="findRoute" action=""&gt;
	&lt;p&gt;
		&lt;label for="partenza"&gt;Da dove parti?&lt;/label&gt;
		&lt;input type="text" name="partenza" /&gt;
	&lt;/p&gt;

	&lt;p&gt;
		&lt;label&gt;&lt;input type="checkbox" name="inverti" value="inverti" /&gt;Calcola percorso di ritorno&lt;/label&gt;
	&lt;/p&gt;

	&lt;p&gt;
		&lt;input type="submit" value="Calcola" name="calcola" id="calcola" /&gt;
	&lt;/p&gt;
&lt;/form&gt;
</pre>
<p>Nel javascript, all&#8217;interno di <em>getRoute</em>, andiamo quindi a gestire il caso in cui si voglia invertire la direzione:</p>
<pre>
function getRoute() {
	var userLocation = document.findRoute.partenza.value;
	var reverse = document.findRoute.inverti.checked;

	if (!reverse) {
		//andata...
		from = userLocation;
		to  = home;
	} else {
		//ritorno...
		from = home;
		to = userLocation;
	}

    directions.load("from: " + from + " to: " + to, {"locale":"it_IT"});
}
</pre>
<p>Viene infatti controllato se la <em>checkbox</em> è selezionata oppure no, e in caso positivo vengono invertite le posizioni di partenza e arrivo.</p>
<p>Se visualizziamo l&#8217;esempio vediamo quindi che selezionando il <em>checkbox</em> le indicazioni saranno invertite, partendo dal punto base fino alla destinazione inserita dall&#8217;utente.</p>
<p><a href="http://www.cescopag.com/demos/directions/demo2.html" class="linkdemo" target="_blank">Demo 2</a></p>
<p> Come ultima personalizzazione andiamo a sostituire l&#8217;icona di default con una scelta ad-hoc. Per farlo ci avvaleremo dell&#8217;ottimo sito: <a href="http://www.powerhut.co.uk/googlemaps/custom_markers.php">http://www.powerhut.co.uk/googlemaps/custom_markers.php</a> Il quale ci permette di caricare immagini in <em>gif</em>, <em>jpeg</em> e <em>png</em> per generare il corrispondente marcatore, completo di immagini e javascript.</p>
<p>  Nel mio caso il risultato fornito è il seguente: </p>
<pre>
var myIcon = new GIcon();
myIcon.image = 'markers/image.png';
myIcon.printImage = 'markers/printImage.gif';
myIcon.mozPrintImage = 'markers/mozPrintImage.gif';
myIcon.iconSize = new GSize(65,190);
myIcon.shadow = 'markers/shadow.png';
myIcon.transparent = 'markers/transparent.png';
myIcon.shadowSize = new GSize(160,190);
myIcon.printShadow = 'markers/printShadow.gif';
myIcon.iconAnchor = new GPoint(33,190);
myIcon.infoWindowAnchor = new GPoint(33,0);
myIcon.imageMap = [4...0]; //omesso per questioni di spazio
</pre>
<p>Per poter utilizzare l&#8217;icona dobbiamo modificare leggermente la riga dove viene creato il marker:</p>
<pre>
//Create marker:
marker = new GMarker(home, {icon:myIcon});
</pre>
<p>Abbiamo infatti aggiunto l&#8217;opzione <em>icon</em> che permette di specificare quale icona utilizzare.</p>
<p>
  Se visualizzamo quest&#8217;ultimo esempio vedremo una simpatica icona al posto del consueto pallino rosso.
</p>
<p><a href="http://www.cescopag.com/demos/directions/demo3.html" class="linkdemo" target="_blank">Demo 3</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.cescopag.com/2009/11/google-maps-api-calcola-il-percorso-nel-nostro-sito/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Sfondi semitrasparenti in CSS</title>
		<link>http://www.cescopag.com/2009/10/sfondi-semitrasparenti-in-css/</link>
		<comments>http://www.cescopag.com/2009/10/sfondi-semitrasparenti-in-css/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 21:03:27 +0000</pubDate>
		<dc:creator>Francesco Paggin</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[background]]></category>
		<category><![CDATA[csss]]></category>
		<category><![CDATA[opacity]]></category>

		<guid isPermaLink="false">http://www.cescopag.com/?p=112</guid>
		<description><![CDATA[Una delle ultime tendenze del web è l&#8217;utilizzo di sfondi semitrasparenti. Per ottenere questo effetto non è sempre necessario ricorrere alle PNG trasparenti ma è possibile anche tramite i fogli di stile.
La proprietà che andremo ad utilizzare è l&#8217;opacità, che è possibile impostare tramite il parametro opacity: 0.5. Il numero, variabile da 0.0 a 1.0, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.cescopag.com/wp-content/uploads/2009/10/semitrasparenza.jpg" alt="Esempio" title="Esempio" width="157" height="160" class="alignright size-full wp-image-137" />Una delle ultime tendenze del web è l&#8217;utilizzo di sfondi semitrasparenti. Per ottenere questo effetto non è sempre necessario ricorrere alle PNG trasparenti ma è possibile anche tramite i fogli di stile.</p>
<p>La proprietà che andremo ad utilizzare è l&#8217;opacità, che è possibile impostare tramite il parametro <code>opacity: 0.5</code>. Il numero, variabile da 0.0 a 1.0, indica il grado di opacità, dove lo zero corrisponde alla trasparenza e l&#8217;uno alla piena visibilità. Per impostare quindi uno sfondo semitrasparente è possibile utilizzare questa proprietà associata ad un colore di fondo. Non possiamo tuttavia utilizzarla direttamente nell&#8217;elemento che vogliamo rendere semitrasparente, perché l&#8217;opacità influisce direttamente anche sul testo, a scapito della leggibilità. Per risolvere il problema sono sufficienti un paio di DIV in più.</p>
<p><a href="http://www.cescopag.com/demos/bgopacity/esempio-2.html" class="linkdemo" target="_blank">Demo</a></p>
<p><span id="more-112"></span></p>
<p>Ipotizziamo di avere un elemento, chiamato &quot;<em>box</em>&quot;:</p>
<pre>&lt;div id=&quot;box&quot;&gt;
   Lorem ipsum dolor sit amet consectetuer...
&lt;/div&gt;</pre>
<p>Per il nostro esempio è necessario aggiungere due div:</p>
<pre>&lt;div id=&quot;box&quot;&gt;
   &lt;div class=&quot;box-bg&quot;&gt;&lt;/div&gt;
   &lt;div class=&quot;box-content&quot;&gt;
      Lorem ipsum dolor sit amet consectetuer...
   &lt;/div&gt;
&lt;/div&gt;</pre>
<p>Come potete intuire dal nome, il primo servirà da sfondo per il secondo. In questo modo possiamo utilizzare l&#8217;opacità solo su quest&#8217;ultimo, senza andare ad intaccare il contenuto.</p>
<p>Passiamo al foglio di stile. Come prima cosa, impostiamo un CSS di base:</p>
<pre>#box {
   width:600px;
}</pre>
<pre>.box-bg {
   background:#000;
   opacity:0.5;
}</pre>
<pre>.box-content {
   padding:10px;
}</pre>
<p>Al <em>box</em> assegnamo soltanto ulna larghezza, mentre al <em>box-content </em>assegnamo un <em>padding </em>di 10px. Allo sfondo invece assegnamo un colore (in questo caso nero) e un&#8217;opacità al 50% (0.5 su scala da 0 a 1).</p>
<p>Ora però dobbiamo dire allo sfondo di posizionarsi sotto al <em>box-content</em> e di assumere le dimensioni grandi quanto l&#8217;intero box. Per farlo ricorriamo ai posizionamenti assoluti e alle dimensioni in percentuale. Ma procediamo con ordine.</p>
<p>Innanzitutto dobbiamo dichiarare <code>position:relative </code>il nostro box, cosicché gli elementi al suo interno si posizionino IN RELAZIONE al div stesso:</p>
<pre>#box {
   width:600px;
   position:relative;
}</pre>
<p>allo sfondo invece dobbiamo dire di posizionarsi indipendentemente sotto al contenuto, perciò dobbiamo dichiararlo <code>position:absolute</code>, mentre per fare in modo che sia grande quanto il box stesso imposto larghezza e altezza al 100%:</p>
<pre>.box-bg {
   background:#000;
   opacity:0.5;
   position:absolute;
   width:100%;
   height:100%;
}</pre>
<p>Ora non resta che posizionare anche il contenuto, semplicemente dichiarandolo <code>position:relative</code>. Gli elementi posizionati infatti &quot;vincono&quot; rispetto a quelli non posizionati e di default vengono visualizzati sopra questi ultimi. In questo modo invece il contenuto sarà sopra allo sfondo:</p>
<pre>.box-content {
   padding:10px;
   position:relative;
}</pre>
<p>Se visualizziamo l&#8217;esempio con un browser moderno (<em>ie7, firefox, safari</em>) vediamo l&#8217;effetto desiderato (ho inserito uno sfondo per contrasto):</p>
<p><a href="http://www.cescopag.com/demos/bgopacity/esempio-1.html" target="_blank" class="linkdemo">Esempio 1</a></p>
<p>Naturalmente il problema sorge con IE. Innanzitutto la proprietà opacity viene ignorata, fortunatamente però esiste una proprietà analoga che fa uso del filtro Alpha di Internet Explorer <code>filter:alpha(opacity:50)</code>. In questo caso l&#8217;opacità viene indicata da 0 a 100.</p>
<p>In secondo luogo in IE6 la proprietà <em>height:100%</em> non viene letta correttamente. Anche in questo caso una feature specifica di IE ci permette di simularne il comportamento. Possiamo infatti utilizzare la funzione <em>expression</em> che permette di eseguire calcoli stile javascript all&#8217;interno del css:</p>
<pre>height:expression(document.getElementById(&quot;box&quot;).offsetHeight);</pre>
<p>Come si può facilmente intuire questa imposta l&#8217;altezza dello sfondo uguale all&#8217;altezza esterna (<em>offsetHeight</em>) del box principale ( <em>document.getELementById(&quot;box&quot;)</em> ).</p>
<p>Il nostro CSS diventa quindi:</p>
<pre>#box {
   width:600px;
   position:relative;
}

.box-bg {
   background:#000;
   opacity:0.5;   filter:alpha(opacity=50);
   position:absolute;
   width:100%;
   height:100%;}

.box-content {
   padding:10px;
   position:relative;
}

* html .box-bg {   height:expression(document.getElementById(&quot;box&quot;).offsetHeight);
}</pre>
<p>il prefisso &quot;<em>* html </em>&quot; serve per far sì che quella proprietà venga utilizzata solo da IE 6, in quanto per i browser più recenti non esiste un elemento qualsiasi (*) padre dell&#8217;elemento <em>html</em>.</p>
<p>Ora quindi possiamo visionare l&#8217;esempio corretto fino a IE 6:</p>
<p><a href="http://www.cescopag.com/demos/bgopacity/esempio-2.html" target="_blank" class="linkdemo">Esempio 2</a></p>
<p>Come ulteriore esempio ho utilizzato un&#8217;immagine al posto del colore, creando quindi un doppio sfondo:</p>
<p><a href="http://www.cescopag.com/demos/bgopacity/esempio-3.html" target="_blank" class="linkdemo">Esempio 3</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.cescopag.com/2009/10/sfondi-semitrasparenti-in-css/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Griglia stampabile</title>
		<link>http://www.cescopag.com/2009/02/griglia-stampabile/</link>
		<comments>http://www.cescopag.com/2009/02/griglia-stampabile/#comments</comments>
		<pubDate>Wed, 18 Feb 2009 18:48:54 +0000</pubDate>
		<dc:creator>Francesco Paggin</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[freeware]]></category>
		<category><![CDATA[griglia]]></category>
		<category><![CDATA[template]]></category>
		<category><![CDATA[utility]]></category>

		<guid isPermaLink="false">http://www.cescopag.com/?p=104</guid>
		<description><![CDATA[I primi strumenti per il web designer sono carta e matita, che permettono di annotare rapidamente le idee senza gettarsi subito su Photoshop. Il foglio bianco però non ci da l&#8217;idea delle dimensioni precise e dell&#8217;aspetto generale all&#8217;interno del browser.
Per questo ho realizzato una semplice cornice da stampare, grande quanto una schermata a 1024&#215;768 e [...]]]></description>
			<content:encoded><![CDATA[<p>I primi strumenti per il web designer sono carta e matita, che permettono di annotare rapidamente le idee senza gettarsi subito su Photoshop. Il foglio bianco però non ci da l&#8217;idea delle dimensioni precise e dell&#8217;aspetto generale all&#8217;interno del browser.<br />
Per questo ho realizzato una semplice cornice da stampare, grande quanto una schermata a 1024&#215;768 e con un&#8217;utile griglia 10&#215;10 pixel. In questo modo è possibile avere un riferimento che ci permette di essere meno approssimativi.<br />
Spero possa tornarvi utile nei colloqui con clienti o nelle riunioni del vostro team!</p>
<p><a href="http://www.cescopag.com/wp-content/uploads/2009/02/base-disegno-interfaccia.jpg"><img src="http://www.cescopag.com/wp-content/uploads/2009/02/base-disegno-interfaccia-150x150.jpg" alt="Cornice browser" title="Cornice browser" width="150" height="150" class="aligncenter size-thumbnail wp-image-103" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.cescopag.com/2009/02/griglia-stampabile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FOWD &#8211; The Experience Layer</title>
		<link>http://www.cescopag.com/2009/01/fowd-the-experience-layer/</link>
		<comments>http://www.cescopag.com/2009/01/fowd-the-experience-layer/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 11:16:54 +0000</pubDate>
		<dc:creator>Francesco Paggin</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[fowd]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[web standards]]></category>

		<guid isPermaLink="false">http://www.cescopag.com/?p=100</guid>
		<description><![CDATA[Guardando i video degli interventi al FOWD di New York ho trovato molto interessante quello di Dan Mall, che esplora il concetto di progressive enhancement in un senso più ampio, aggiungendo ai concetti classici di content, style e behaviour l&#8217;elemento experience, e cioè l&#8217;aspetto più emotivo.
In quest&#8217;ottica infine mostra come Flash possa essere un elemento [...]]]></description>
			<content:encoded><![CDATA[<p>Guardando i video degli interventi al <a href="http://events.carsonified.com/fowd">FOWD</a> di New York ho trovato molto interessante quello di Dan Mall, che esplora il concetto di <em>progressive enhancement</em> in un senso più ampio, aggiungendo ai concetti classici di <em>content</em>, <em>style</em> e <em>behaviour</em> l&#8217;elemento <em>experience</em>, e cioè l&#8217;aspetto più emotivo.</p>
<p>In quest&#8217;ottica infine mostra come Flash possa essere un elemento importante che può contribuire a tutti i livelli di separazione, non solo a quello estetico, mantenendo sempre valido il concetto di <em>progressive enhancement</em>.</p>
<p>
Potete seguire il video all&#8217;indirizzo:<br />
<a href="http://www.viddler.com/explore/carsonified/videos/105/">http://www.viddler.com/explore/carsonified/videos/105/</a><br />
Mentre le slides sono disponibili qui:<br />
<a href="http://www.slideshare.net/danielmall/the-experience-layerfowd-nyc-08-presentation">http://www.slideshare.net/danielmall/the-experience-layerfowd-nyc-08-presentation</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.cescopag.com/2009/01/fowd-the-experience-layer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery zoom plugin</title>
		<link>http://www.cescopag.com/2009/01/jquery-zoom-plugin/</link>
		<comments>http://www.cescopag.com/2009/01/jquery-zoom-plugin/#comments</comments>
		<pubDate>Sun, 11 Jan 2009 14:24:06 +0000</pubDate>
		<dc:creator>Francesco Paggin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery ui]]></category>
		<category><![CDATA[zoom]]></category>

		<guid isPermaLink="false">http://www.cescopag.com/?p=87</guid>
		<description><![CDATA[Visitando il sito Apple Store è possibile vedere all&#8217;opera un interessante funzionalità che permette lo zoom delle foto direttamente nel loro spazio, senza aprire fastidiosi popup.
Grazie a jQuery e la sua estensione jQuery UI è possibile realizzare il medesimo effetto in maniera semplice. In particolare andremo ad utilizzare il plugin &#34;draggable&#34; di jQuery UI.
Demo

L&#8217;idea di [...]]]></description>
			<content:encoded><![CDATA[<p>Visitando il sito Apple Store è possibile vedere all&#8217;opera un interessante funzionalità che permette lo zoom delle foto direttamente nel loro spazio, senza aprire fastidiosi popup.</p>
<p>Grazie a jQuery e la sua estensione jQuery UI è possibile realizzare il medesimo effetto in maniera semplice. In particolare andremo ad utilizzare il plugin &quot;draggable&quot; di jQuery UI.</p>
<p style="text-align:center"><strong><a href="http://www.cescopag.com/demos/zoom/index.html">Demo</a></strong></p>
<p><span id="more-87"></span></p>
<p>L&#8217;idea di base è quella di prevedere un DIV contenente l&#8217;immagine a bassa risoluzione. Al click su questa immagine, questa viene ingrandita fino alle dimensioni dell&#8217;immagine a grande risoluzione e successivamente scambiata con quest&#8217;ultima in modo da simulare uno zoom. Tramite la funzionalità &quot;draggable&quot; renderemo trascinabile  questa immagine, in modo da poter visualizzare tutte le parti dell&#8217;ingrandimento. Il nostro riquadro originale che contiene la foto sarà la &quot;finestra&quot; attraverso cui si vedrà l&#8217;immagine ad alta risoluzione sottostante. Sarà inoltre necessario impostare posizionamenti e limiti di trascinamento per garantire che l&#8217;immagine non esca dal riquadro.<br />
  Ho realizzato una piccola animazione che rappresenta l&#8217;idea:</p>
<p style="text-align:center"><img src="http://www.cescopag.com/wp-content/uploads/2009/01/anim.gif" alt="Animazione Zoom" title="animazione zoom tool" width="300" height="200" class="size-full wp-image-88" /></p>
<p>Il riquadro rosso è l&#8217;area originale dell&#8217;immagine piccola (non rappresentata). L&#8217;immagine grande (la foto che vedete nell&#8217;animazione) potrà essere trascinata in tutte le direzioni e soltanto la parte all&#8217;interno del riquadro rosso sarà visibile, dando l&#8217;impressione di un&#8217;immagine zoomata su cui effettuiamo il panning. Il riquadro grigio invece rappresenta i limiti entro i quali l&#8217;immagine può essere trascinata senza uscire dal riquadro rosso. Vedremo dopo come realizzare tutto ciò.</p>
<p>Ma procediamo con ordine. Per prima cosa realizziamo l&#8217;html necessario. Come abbiamo detto realizziamo un DIV contenente l&#8217;immagine piccola. Per garantire l&#8217;accessibilità anche a chi non ha javascript abilitato, l&#8217;inseriamo all&#8217;interno di un link che punta all&#8217;immagine grande e che ci servirà per identificare il path all&#8217;immagine ad alta risoluzione:</p>
<pre>&lt;div class=&quot;image-zoom&quot;&gt;
&lt;a href=&quot;img1-big.jpg&quot;&gt;
&lt;img src=&quot;img1-small.jpg&quot; alt=&quot;img1&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;</pre>
<p>Ora che l&#8217;html è pronto possiamo procedere con gli opportuni stili css:</p>
<pre>.image-zoom { overflow:hidden; width:300px; height:300px; position:relative }
.image-zoom img { position:absolute; }</pre>
<p>Come potete vedere ho impostato l&#8217;overflow hidden per confinare l&#8217;immagine all&#8217;interno del riquadro quando viene zoomata (come se fosse una finestra) e le dimensioni coincidenti con la dimensione dell&#8217;immagine contenuta. Ho poi aggiunto il posizionamento relative al contenitore e absolute all&#8217;immagine, in modo da poterla muovere liberamente nel nostro div.</p>
<p>Ora che abbiamo tutto pronto possiamo procedere all&#8217;aggiunta del javascript necessario, il tutto grazie a jQuery e jQuery UI. Andiamo quindi a realizzare la struttura base per realizzare un plugin in jQuery:</p>
<pre>(function($){
$.fn.zoom = function(params) {
   var defaults = {
      duration: 200,
      small_width:300,
      small_height:300,
      big_width:1000,
      big_height:1000
   };
   var options = $.extend(defaults, params);
   return this.each(function() {
      //istruzioni del plugin...
   });
}
})(jQuery)</pre>
<p>La prima riga e l&#8217;ultima riga servono soltanto a garantirci di poter utilizzare la scorciatoia &quot;$&quot; al posto di &quot;jQuery&quot;, mentre tramite <code>$.fn.zoom = function(params) { ... }</code> andiamo a realizzare il plugin vero e proprio. La variabile <code>params</code> è l&#8217;insieme di opzioni che possiamo impostare all&#8217;inizializzazione del plugin, mentre <code>defaults</code> sono i valori di default che il plugin andrà ad utilizzare. Infine uniamo il tutto tramite il metodo <code>$.extend</code> nell&#8217;oggetto <code>options</code>, il quale che conterrà i valori di default eventualmente sovrascritti dai parametri passati in <code>params</code>. I parametri di default sono in particolare la durata delle animazioni di zoom-in e zoom-out e le dimensioni dell&#8217;immagine a bassa e alta risoluzione (per semplicità ipotizziamo di avere immagini di dimensioni fisse).<br />
Le istruzioni del plugin invece andranno inserite all&#8217;interno del ciclo <code>return this.each(function() {...});</code>. Tramite <code>each</code> infatti possiamo inizializzare la funzionalità del plugin a più elementi contemporaneamente.</p>
<p>Il motivo per cui ho deciso di realizzare un plugin anziché semplici istruzioni è che permette di avere un codice riutilizzabile facilmente, permette di scrivere codice molto più ordinato e di estenderne le funzionalità senza dover mettere mano a tutto il flusso di lavoro.</p>
<p>Ma vediamo in dettaglio come sarà strutturato il plugin. In generale prevediamo quattro parti: una prima parte dove andremo a preparare tutte le variabili che ci servono, una seconda parte dove manipolare css e html per preparare le funzionalità del plugin, una terza parte dove andremo a gestire gli eventi dell&#8217;utente, richiamando gli opportuni metodi, ed infine un&#8217;ultima parte dove andremo ad implementare le varie funzionalità (zoom in, zoom out, drag etc.).</p>
<h4>Prima parte</h4>
<pre>//caching...
var $container = $(this);
var $link = $container.find('a');
var $image = $link.find('img');

//reading some parameters...
var small_path = $image.attr('src');
var big_path   = $link.attr('href');

//status variables...
var dragging = false;
var zoomed   = false;

//calculate correct positioning...
var a_width  = (options.big_width  - options.small_width)  * 2 + options.small_width;
var a_height = (options.big_height - options.small_height) * 2 + options.small_height;

var a_top  = options.big_height - options.small_height;
var a_left = options.big_width  - options.small_width;</pre>
<p>La prima sezione serve per fare il &quot;caching&quot; degli elementi utilizzati in modo da semplificarne e velocizzarne l&#8217;utilizzo nel resto del plugin. Salviamo poi i path delle immagini a bassa e alta risoluzione che ci serviranno nelle operazioni di zoom-in e zoom-out. Le variabili <code>dragging</code> e <code>zoomed</code>, che impostiamo all&#8217;inizio a <code>false</code>, servono per salvare lo stato corrente delle immagini, in particolare se le stiamo trascinando e se sono zoomate o rimpicciolite. Nell&#8217;ultima sezione infine calcoliamo i posizionamenti e le larghezze che ci serviranno quando andremo a manipolare il css dell&#8217;html.</p>
<h4>Seconda parte</h4>
<pre>$link.css({
    display:'block',
    position:'absolute',
    width: a_width   + 'px',
    height: a_height + 'px',
    top:  '-' + a_top  + 'px',
    left: '-' + a_left + 'px'
});

/* Removing default link behaviour... */
$link.removeAttr('href');

$image.css({
    display:'block',
    position:'absolute',
    width:  options.small_width + 'px',
    height: options.small_height + 'px',
    top: a_top + 'px',
    left: a_left + 'px'
});</pre>
<p>Nella seconda parte andiamo a cambiare i css di link e immagine per predisporre la funzionalità di zoom. In particolare il link diventerà il blocco che conterrà lo spostamento dell&#8217;immagine grande (il rettangolo grigio nell&#8217;animazione). A questo andremo poi a togliere l&#8217;attributo <code>href</code>, in modo da eliminare il comportamento standard del link che interferirebbe con il nostro plugin. L&#8217;immagine infine viene riposizionata all&#8217;interno del tag <code>a</code> in modo da trovarsi in corrispondenza della finestra originale (il rettangolo rosso). Infatti mentre il link è spostato a sinistra e in alto tramite margini negativi, l&#8217;immagine viene spostata degli stessi valori (<code>a_top</code>, <code>a_left</code>) ma verso destra e in basso, in modo da trovarsi nel medesimo punto rispetto alla finestra originale. In questo modo avremo già pronti i posizionamenti assoluti per l&#8217;animazione.</p>
<h4>Terza parte</h4>
<pre>$image.mouseup(function() {
    if (!dragging) {
        if (zoomed) {
	        zoomOut();
        } else {
    	    zoomIn();
        }
    }
});</pre>
<p>L&#8217;unico evento che ci interessa gestire è il rilascio del pulsante del mouse. Utilizzando infatti l&#8217;evento &quot;mouseup&quot; anziché l&#8217;evento &quot;click&quot; possiamo controllare lo stato prima di decidere che operazione compiere. Al rilascio del mouse controllo se sto effettuando il &quot;dragging&quot;. Se non sto trascinando, e quindi è un semplice click, effettuo lo zoom-in o lo zoom-out in base allo stato &quot;zoomed&quot;, richiamando i due metodi <code>zoomOut()</code> e <code>zoomIn()</code>.</p>
<h4>Quarta parte</h4>
<p>Nella quarta parte andremo ad implementare i metodi zoomOut() e zoomIn() richiamati precedentemente, oltre a quelli che si renderanno necessari successivamente:</p>
<pre>function zoomOut() {
    $image.animate({
        width:options.small_width + 'px',
        height:options.small_height + 'px',
        top:  a_top  + 'px',
        left: a_left + 'px'
    }, options.duration, swapWithSmall);
	zoomed = false;
}

function zoomIn() {
    $image.animate({
        width:options.big_width + 'px',
        height:options.big_height + 'px',
        top:  a_top / 2  + 'px',
        left: a_left / 2 + 'px'
    }, options.duration, swapWithBig);
    zoomed = true;
}</pre>
<p></p>
<p>Come vedete ogni metodo va ad animare dimensioni e posizionamenti css secondo i valori calcolati nella prima parte. Alla fine dell&#8217;animazione vengono richiamati i due metodi per scambiare l&#8217;immagine, rispettivamente &quot;swapWithBig&quot; e swapWithSmall&quot;:</p>
<pre>function swapWithBig() {
	$image.attr('src', big_path);
	$image.draggable({
		containment: 'parent',
		start: handleStartDrag,
		stop: handleStopDrag
	});
}

function swapWithSmall() {
	$image.attr('src', small_path);
	$image.draggable('disable');
}

function handleStartDrag() {
	dragging = true;
}

function handleStopDrag() {
	dragging = false;
}</pre>
<p>Questi non fanno altro che cambiare l&#8217;attributo <code>src</code> e ad abilitare (nel caso dello zoom-in) o disabilitare (nel caso dello zoom-out) la funzionalità &quot;draggable&quot; di jQuery UI. Come vedete a draggable vengono impostati alcuni parametri:</p>
<p>containment: serve ad impostare i limiti di trascinamento. Nel nostro caso è impostato a <code>parent</code>, e cioè al tag html che contiene l&#8217;elemento e quindi il tag <code>a</code>  che abbiamo appositamente posizionato e dimensionato proprio per questo scopo.<br />
  start: è la funzione che viene eseguita quando inizia il trascinamento. Nel nostro caso è la funzione <code>handleStartDrag</code> che non fa altro che aggiornare la variabile di stato corrispondente (dragging).<br />
  stop: è la funzione che viene eseguita alla fine del trascinamento e richiama la funzione <code>handleStopDrag</code>, che aggiorna la variabile <code>dragging</code>.</p>
<p>Il plugin ora è completo, non ci resta che richiamarlo nella nostra pagina tramite la sintassi solita di jQuery:</p>
<pre>$(document).ready(function() {
	$('.image-zoom').zoom();
});</pre>
<p>Alcuni metodi possono sembrare superflui, ma ho preferito spezzettare il plugin in più funzioni esplicite, ciascuna con funzionalità ben definite, piuttosto che annidare funzioni su funzioni come jQuery a volte induce a fare. Questo semplifica la lettura del codice e soprattutto le successive manipolazioni e revisioni.</p>
<p>Ecco il codice completo del plugin, mentre <a href="http://www.cescopag.com/demos/zoom/index.html">qui potete vederlo in azione</a>:</p>
<pre>(function($) {
$.fn.zoom = function(params) {
	/*
	Zoom jQuery Plugin
	Copyright: (C) 3009 - Francesco Paggin
	Parameters:
		(int) duration: the duration of the zooming animaton
		(int) small_width, small_height: the dimensions of the small thumbnails
		(int) big_width, big_height: the dimensions of the zoomed images
	*/
	var defaults = {
		duration: 200,
		small_width:300,
		small_height:300,
		big_width:1000,
		big_height:1000
	};
	var options = $.extend(defaults, params);

	return this.each(function() {
		//caching...
		var $container = $(this);
		var $link = $container.find('a');
		var $image = $link.find('img');

		//reading some parameters...
		var small_path = $image.attr('src');
		var big_path   = $link.attr('href');

		//status variables...
		var dragging = false;
		var zoomed   = false;

		//calculate correct positioning...
		var a_width  = (options.big_width  - options.small_width)  * 2 + options.small_width;
		var a_height = (options.big_height - options.small_height) * 2 + options.small_height;

		var a_top  = options.big_height - options.small_height;
		var a_left = options.big_width  - options.small_width;

		/*
			INITIALIZATION...
		*/
		$link.css({
			display:'block',
			position:'absolute',
			width: a_width   + 'px',
			height: a_height + 'px',
			top:  '-' + a_top  + 'px',
			left: '-' + a_left + 'px'
		});

		/* Removing default link behaviour... */
		$link.removeAttr('href');

		$image.css({
			display:'block',
			position:'absolute',
			width:  options.small_width + 'px',
			height: options.small_height + 'px',
			top: a_top + 'px',
			left: a_left + 'px'
		});

		/*
			HANDLE EVENTS...
		*/
		$image.mouseup(function() {
			if (!dragging) {
				if (zoomed) {
					zoomOut();
				} else {
					zoomIn();
				}
			}
		});

		/*
			METHODS...
		*/
		function zoomOut() {
			$image.animate({
				width:options.small_width + 'px',
				height:options.small_height + 'px',
				top:  a_top  + 'px',
				left: a_left + 'px'
			}, options.duration, swapWithSmall);
			zoomed = false;
		}

		function zoomIn() {
			$image.animate({
				width:options.big_width + 'px',
				height:options.big_height + 'px',
				top:  a_top / 2  + 'px',
				left: a_left / 2 + 'px'
			}, options.duration, swapWithBig);
			zoomed = true;
		}

		function swapWithBig() {
			$image.attr('src', big_path);
			$image.draggable({
				containment: 'parent',
				start: handleStartDrag,
				stop: handleStopDrag
			});
		}

		function swapWithSmall() {
			$image.attr('src', small_path);
			$image.draggable('disable');
		}

		function handleStartDrag() {
			dragging = true;
		}

		function handleStopDrag() {
			dragging = false;
		}
	});
}
})(jQuery)</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.cescopag.com/2009/01/jquery-zoom-plugin/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>PNG Fix fai-da-te</title>
		<link>http://www.cescopag.com/2008/12/png-fix-fai-da-te/</link>
		<comments>http://www.cescopag.com/2008/12/png-fix-fai-da-te/#comments</comments>
		<pubDate>Thu, 25 Dec 2008 19:05:59 +0000</pubDate>
		<dc:creator>Francesco Paggin</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[png]]></category>

		<guid isPermaLink="false">http://www.cescopag.com/?p=82</guid>
		<description><![CDATA[Il formato grafico PNG è estremamente interessante. La possibilità offerta dal supporto alle trasparenze è sicuramente la caratteristica più utile. Purtroppo solo gli ultimi browser supportano questa proprietà, e in particolare soltanto a partire da Internet Explorer 7 per quanto riguarda il browser di Microsoft.
Esiste comunque la possibilità di abilitare le trasparenze PNG anche per [...]]]></description>
			<content:encoded><![CDATA[<p>Il formato grafico PNG è estremamente interessante. La possibilità offerta dal supporto alle trasparenze è sicuramente la caratteristica più utile. Purtroppo solo gli ultimi browser supportano questa proprietà, e in particolare soltanto a partire da Internet Explorer 7 per quanto riguarda il browser di Microsoft.</p>
<p>Esiste comunque la possibilità di abilitare le trasparenze PNG anche per Internet Explorer 6 e precedenti attraverso vari plugin basati su javascript. In certe occasioni però l&#8217;effetto potrebbe servirci per solo un&#8217;immagine ed andare ad aggiungere javascript per così poco può essere superfluo.</p>
<p>In realtà tramite CSS e commenti condizionali possiamo intervenire utilizzando le stesse tecniche utilizzate dagli script javascript disponibili. E&#8217; infatti possibile utilizzare i filtri inclusi in IE, in particolare &quot;AlphaImageLoader&quot;, per ottenere il medesimo effetto.</p>
<p><span id="more-82"></span></p>
<p>Ma ipotizziamo di voler utilizzare uno sfondo semitrasparente per l&#8217;header di un sito. Il codice CSS normale, che farà uso del PNG, sarà una cosa del tipo:</p>
<pre>&lt;style type=&quot;text/css&quot;&gt;
#header {
   width:600px;
   height:100px;
   background:url(header.png);
}
&lt;/style&gt;</pre>
<p>Se andiamo a verificare con Internet Explorer 6 vedremmo però, al posto della trasparenza del PNG, uno sgradevole color grigio. La prima cosa da fare quindi è introdurre un commento condizionale per poter intervenire solo per i browser precedenti a IE7:</p>
<pre>&lt;!--[if lte IE 6]&gt;
&lt;style type=&quot;text/css&quot;&gt;
   /* qui ci va l'hack */
&lt;/style&gt;
&lt;![endif]--&gt;</pre>
<p>All&#8217;interno andiamo quindi a modificare lo sfondo dell&#8217;header, rimuovendo l&#8217;immagine:</p>
<pre>&lt;!--[if lte IE 6]&gt;
&lt;style type=&quot;text/css&quot;&gt;
#header {
   background:none;
}
&lt;/style&gt;
&lt;![endif]--&gt;</pre>
<p>Ora possiamo utilizzare il filtro di IE per reintrodurre l&#8217;immagine:</p>
<pre>&lt;!--[if lte IE 6]&gt;
&lt;style type=&quot;text/css&quot;&gt;
#header {
   background:none;
   filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src = 'header.png',  sizingMethod = 'scale');
}
&lt;/style&gt;
&lt;![endif]--&gt;</pre>
<p>Come potete vedere passiamo al filtro due parametri: il primo è il sorgente dell&#8217;immagine, il secondo è il &quot;sizingMethod&quot;, e cioè come l&#8217;immagine viene applicata all&#8217;elemento. Con l&#8217;impostazione &quot;scale&quot; l&#8217;immagine viene stirata fino a raggiungere le dimensioni dell&#8217;elemento a cui è applicata, mentre con &quot;Crop&quot; viene tagliata se supera le dimensioni dell&#8217;elemento.</p>
<p>Rispetto alla gestione normale degli sfondi non abbiamo possibilità di gestire né il posizionamento dello sfondo (background-position) né la sua ripetizione in verticale o orizzontale (background-repeat). Non è quindi possibile avere comportamenti particolarmente avanzati, tuttavia l&#8217;effetto è più che sufficiente per tecniche di image-replacement o per sfondi di elementi dalle dimensioni ben precise.</p>
<p>Come ultima cosa è però necessario ripristinare la corretta funzionalità dei link perché applicando i filtri Internet Explorer va a porre l&#8217;immagine PNG sopra agli elementi interattivi del sito, inibendo quindi la possibilità di clickare. Per sistemare il tutto però è sufficiente aggiungere la proprietà &quot;position:relative&quot; per portare il link sopra lo sfondo e quindi per renderlo nuovamente clickabile. Per farlo modifichiamo il CSS come segue:</p>
<pre>&lt;!--[if lte IE 6]&gt;
&lt;style type=&quot;text/css&quot;&gt;
#header {
   background:none;
   filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src = 'header.png',  sizingMethod = 'scale');
}</pre>
<pre>#header a {
   position:relative;
}
&lt;/style&gt;
&lt;![endif]--&gt;</pre>
<p>Come vedete l&#8217;effetto è semplice da ottenere anche senza l&#8217;ausilio di apposite librerie e nel caso di una o due immagini può essere più comodo gestirle manualmente, risparmiando un po&#8217; di bytes e di pesantezza di caricamento.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cescopag.com/2008/12/png-fix-fai-da-te/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Progetto Step by Step CodeIgniter &#8211; I Controller</title>
		<link>http://www.cescopag.com/2008/11/progetto-step-by-step-codeigniter-i-controller/</link>
		<comments>http://www.cescopag.com/2008/11/progetto-step-by-step-codeigniter-i-controller/#comments</comments>
		<pubDate>Tue, 18 Nov 2008 22:30:34 +0000</pubDate>
		<dc:creator>Francesco Paggin</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programmazione]]></category>

		<guid isPermaLink="false">http://www.cescopag.com/?p=78</guid>
		<description><![CDATA[In questo passaggio del tutorial a CodeIgniter vediamo finalmente l’elemento del framework che si occupa della logica dell’applicazione, e cioè il controller. Come vedremo questo elemento è quello che viene eseguito direttamente dall’utente ed è ciò che mette in comunicazione i dati (e cioè i modelli) con l’output (le viste).
CodeIgniter infatti, tramite la classe Routing, [...]]]></description>
			<content:encoded><![CDATA[<p>In questo passaggio del tutorial a CodeIgniter vediamo finalmente l’elemento del framework che si occupa della logica dell’applicazione, e cioè il controller. Come vedremo questo elemento è quello che viene eseguito direttamente dall’utente ed è ciò che mette in comunicazione i dati (e cioè i modelli) con l’output (le viste).</p>
<p>CodeIgniter infatti, tramite la classe Routing, si occupa di leggere l’URL digitato e indirizzare all’apposito controller il metodo da eseguire. Ad esempio, digitando l’indirizzo <code>http://www.dominio.com/index.php/nome_controller/nome_metodo/</code> CodeIgniter andrà a richiamare il controller <code>nome_controller</code> ed eseguirà il metodo <code>nome_metodo</code>. Se invece viene omesso <code>nome_metodo</code> verrà richiamato il metodo di default chiamato <code>index</code>.</p>
<p><span id="more-78"></span></p>
<p>Dal punto di vista del codice, un controller non è altro che una classe PHP che eredita dalla classe nativa <code>Controller</code>. Pertanto la sintassi base sarà:</p>
<pre>class Mia_classe extends Controller {
    function Mia_classe() { //questo è il costruttore
        parent::Controller(); //richiamo il costruttore della classe “Controller”
    }

    function index() {
        //funzione richiamata di default
    }

    function mia_funzione() {
        //metodo personalizzato
    }
}</pre>
<p>i controller vanno di norma salvati nella cartella <code>/system/application/controllers</code>, mentre il nome del file dovrà coincidere col nome della classe, quindi nell’esempio precedente questo dovrà chiamarsi <code>mia_classe.php</code> &#8211; Notare l’eliminazione delle maiuscole richiesta dal framework.</p>
<p>Tornando alla nostra applicazione, dato che abbiamo tre entità in gioco avremo bisogno di tre file separati. Ciò non è la regola, in quanto i controller vanno intesi più che altro come azioni da compiere. Nel nostro caso però, dato che andremo ad operare ogni volta su un elemento preciso in maniera abbastanza indipendente, ho preferito separarli in tre controller distinti anziché uno unico.</p>
<p>Partiamo dal controller delle tipologie (che sarà analogo a quello degli stati).</p>
<p>Prendendo come spunto il modello qui sopra, il nostro controller per gli stati sarà del tipo:</p>
<pre>class Statuses extends Controller {
    function Statuses() {
        parent::Controller();
        $this->load->model(‘status_model’);
    }

    function index() {
        //funzione richiamata di default
    }
}</pre>
<p>Come vedete nel costruttore <code>Statuses()</code> vado a caricare il modello <code>status_model</code> che mi servirà all’interno del controller.</p>
<p>Ora andiamo a popolare il <code>metodo index()</code> che ci servirà per la lista completa degli stati. Per farlo aggiungiamo: </p>
<pre>$data[‘statuses’] = $this->status_model->get();
$this->load->view(‘list_statuses’, $data);</pre>
<p>La prima riga si occupa di eseguire il metodo get del modello status_model e a salvarne l’output nell’array <code>$data</code>. Nella seconda riga invece andiamo a caricare la vista <code>list_statuses</code> passando i dati da visualizzare. CodeIgniter andrà a cercare la vista list_statuses.php all’interno della cartella <code>/system/application/views</code>. Vedremo in seguito come realizzare la vista, ma per quanto riguarda il Controller abbiamo già ottenuto quello che ci serve.</p>
<p>I prossimi metodi che ci servono sono quelli per interagire col sito. Infatti abbiamo previsto la possibilità di aggiungere, modificare o rimuovere stati direttamente dal sito senza dover accedere al database.</p>
<p>Presupponiamo già di avere un form che invii tramite post i campi necessari (andremo a realizzarlo in una delle viste). Il nostro metodo che chiameremo <code>add()</code> sarà:</p>
<pre>function add() {
    if ($this->input->post(‘submit’) {
        //ho fatto il submit...
        $insert[‘name’] = $this->input->post(‘name’);
        $this->status_model->add($insert);
        return $this->index();
    } else {
        //non ho fatto il submit quindi mostro il form...
        $this->load->view(‘add_status’);
    }
}</pre>
<p>Innanzitutto vedo se ho già fatto il submit o se invece devo mostrare il form per l’inserimento. Nel primo caso leggo i dati tramite <code>$this->input->post('nome')</code> che è il metodo offerto dalla libreria <em>Input</em> di C.I. per leggere i dati in POST, richiamo il metodo <code>add()</code> del modello per seguire l’inserimento. Una volta concluso mostro la lista degli articoli richiamando il metodo di default <code>$this->index()</code></p>
<p>La funzione <code>edit()</code> è molto simile, con la differenza che dovendo modificare un preciso stato dovrò specificarlo tramite id. Per farlo basta passare quest&#8217;ultimo come parametro al nostro metodo. Nel browser ciò è possibile nella forma: <code>http://www.dominio.com/index.php/mio_controller/metodo/parametro1/parametro2/</code> etc&#8230;</p>
<p>Il metodo diventa quindi:</p>
<pre>function edit($id) {
    if ($this->input->post(‘submit’) {
        //ho fatto il submit...
        $insert[‘name’] = $this->input->post(‘name’);
        $this->status_model->edit($insert, $id);
        return $this->index();
    } else {
        //non ho fatto il submit quindi mostro il form...
        $data[‘status’] = $this->status_model->get_single($id);
        $this->load->view(‘add_status’, $data);
    }
}</pre>
<p>Come vedete l’unica differenza rispetto all’inserimento sta che nel metodo <code>edit()</code> del modello devo passare anche l’id dell’elemento da modificare. Devo inoltre pre-popolare il form con i valori già esistenti. Posso farlo tramite il metodo <code>get_single($id)</code> del nostro modello, che ci permette di leggere un singolo stato e passarne i dati alla vista.</p>
<p>L’ultimo metodo è quello destinato alla cancellazione di uno stato, ed è molto semplice:</p>
<pre>function delete($id) {
    $this->status_model->delete($id);
    return $this->index();
}</pre>
<p>Come avrete sicuramente visto non viene effettuato nessun controllo sulla validità dei dati. Questo però sarà facilmente integrabile in un secondo momento tramite ulteriori controlli e la libreria <em>Validation</em> presente in CodeIgniter.</p>
<p>Il controller <code>Types</code> sarà identico a quanto appena visto, con l’unica differenza di nomenclatura tra stati e tipi. Basterà quindi fare copia-incolla dei files e modificare quanto serve.</p>
<p>Anche il controller relativo agli items sarà molto simile, con la differenza che avremo più campi da gestire (non solo il nome) e avremo bisogno di tutti e tre i modelli. Il controller completo è il seguente:</p>
<pre>class Items extends Controller {

    function Items() {
        parent::Controller();
        $this->load->model('item_model');
        $this->load->model('type_model');
        $this->load->model('status_model');
    }

    function index() {
        //lista degli elementi nel database
        $data['items'] = $this->item_model->get();
        $this->load->view('list_items', $data);
    }

    function add() {
        if ($this->input->post('submit')) {
            $insert['name']             = $this->input->post('name');
            $insert['code']             = $this->input->post('code');
            $insert['description']      = $this->input->post('description');
            $insert['position']         = $this->input->post('position');
            $insert['type_id']          = $this->input->post('type_id');
            $insert['status_id']        = $this->input->post('status_id');
            $insert['about_the_status'] = $this->input->post('about_the_status');

            $this->item_model->add($insert);
            return $this->index(); //torno all'indice...
        } else {
            $data['types']    = $this->type_model->get();
            $data['statuses'] = $this->status_model->get();
            $this->load->view('add_item', $data);
        }
    }

    function edit($id) {
        if ($this->input->post('submit')) {
            $insert['name']             = $this->input->post('name');
            $insert['code']             = $this->input->post('code');
            $insert['description']      = $this->input->post('description');
            $insert['position']         = $this->input->post('position');
            $insert['type_id']          = $this->input->post('type_id');
            $insert['status_id']        = $this->input->post('status_id');
            $insert['about_the_status'] = $this->input->post('about_the_status');

            $this->item_model->edit($insert, $id);
            return $this->index(); //torno all'indice...
        } else {
            $data['item']     = $this->item_model->get_single($id);
            $data['types']    = $this->type_model->get();
            $data['statuses'] = $this->status_model->get();
            $this->load->view('edit_item', $data);
        }
    }

    function delete($id) {
        $this->item_model->delete($id);
        return $this->index();
    }
}</pre>
<p>Anche se più lungo, il concetto è il medesimo dei precedenti. Vorrei soffermarmi semplicemente sulle istruzioni</p>
<pre>$data[‘types’] = $this->type_model->get();
$data[‘statuses’] = $this->status_model->get();</pre>
<p>presenti sia nel metodo per l’inserimento che per quello per la cancellazione. In pratica andiamo a prepararci in due array l’elenco degli stati e delle tipologie disponibili nel nostro database. Questo ci serve per realizzare delle comode dropdown nei form per i riferimenti esterni. Quando vedremo in dettaglio le viste capiremo meglio come andremo a utilizzarlo.</p>
<p>Nella prossima puntata vedremo in dettaglio le viste, completando il primo step e potendo far funzionare una prima basilare applicazione. In seguito, come già accennato, vedremo come gestire la validazione dei dati.</p>
<p>Puntate precedenti:</p>
<ol>
<li><a href="http://www.cescopag.com/2008/08/progetto-step-by-step-codeigniter-introduzione/">Introduzione</a></li>
<li><a href="http://www.cescopag.com/2008/08/progetto-step-by-step-codeigniter-il-database/">Il database</a></li>
<li><a href="http://www.cescopag.com/2008/08/progetto-step-by-step-codeigniter-i-modelli/">I modelli</a></li>
<li><a href="http://www.cescopag.com/2008/10/progetto-step-by-step-codeigniter-lapplicazione/">L&#8217;applicazione</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.cescopag.com/2008/11/progetto-step-by-step-codeigniter-i-controller/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Footer sempre in fondo</title>
		<link>http://www.cescopag.com/2008/11/footer-sempre-in-fondo/</link>
		<comments>http://www.cescopag.com/2008/11/footer-sempre-in-fondo/#comments</comments>
		<pubDate>Wed, 05 Nov 2008 20:56:59 +0000</pubDate>
		<dc:creator>Francesco Paggin</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[footer]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[trick]]></category>

		<guid isPermaLink="false">http://www.cescopag.com/2008/11/footer-sempre-in-fondo/</guid>
		<description><![CDATA[Il footer, per definizione, è quell&#8217;elemento che chiude la pagina e si pone alla fine dei contenuti. Quando però il contenuto è più corto dello spazio disponibile  a video &#8211; il viewport &#8211; il footer si &#8220;solleva&#8221; dal bordo inferiore della pagina, lasciando uno spazio più o meno grande al di sotto di esso. [...]]]></description>
			<content:encoded><![CDATA[<p>Il footer, per definizione, è quell&#8217;elemento che chiude la pagina e si pone alla fine dei contenuti. Quando però il contenuto è più corto dello spazio disponibile  a video &#8211; il <em>viewport</em> &#8211; il footer si &#8220;solleva&#8221; dal bordo inferiore della pagina, lasciando uno spazio più o meno grande al di sotto di esso. L&#8217;effetto in certi casi può essere poco gradevole, dando l&#8217;impressione di un layout &#8220;tagliato a metà&#8221;. Potete vedere <a href="http://www.cescopag.com/demos/footer/inizio.html">qui un esempio</a>&#8230;<br />
<span id="more-68"></span><br />
Il footer dovrebbe invece disporsi allineato al bordo inferiore della pagina nel caso citato, mentre dovrebbe posizionarsi in fondo al contenuto, oltre lo scroll, se questo è sufficientemente lungo da riempire tutto il viewport. Per farvi un&#8217;idea date un&#8217;occhiata <a href="http://www.cescopag.com/demos/footer/fine.html" target="_blank">qui</a> e <a href="http://www.cescopag.com/demos/footer/fine_lungo.html" target="_blank">qui</a>.</p>
<p>Una soluzione valida, compatibile con tutti i moderni browser, è quella di utilizzare la proprietà css <span style="font-style: italic;">min-height</span> per imporre l&#8217;altezza minima del contenuto tale da farlo ampliare fino a riempire con il viewport. </p>
<p>Ma procediamo con ordine. Il layout standard potrebbe essere questo:</p>
<pre>&lt;body&gt;
&nbsp;&nbsp;&nbsp; &lt;div id="<span style="font-weight: bold;">container</span>"&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &lt;div id="header"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Header
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &lt;/div&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp; &lt;div id="content"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Content
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &lt;/div&gt;
&nbsp;&nbsp;&nbsp; &lt;/div&gt;
&nbsp;&nbsp;&nbsp; &lt;div id="<span style="font-weight: bold;">footer</span>"&gt;
        Footer
&nbsp;&nbsp;&nbsp; &lt;/div&gt;
&lt;/body&gt;
</pre>
<p>Tramite css impostiamo l&#8217;altezza minima del <span style="font-style: italic;">container</span> al 100% in modo da farlo occupare tutto lo spazio verticale disponibile. L&#8217;altezza viene però calcolata in base a quella degli elementi contenenti il div, quindi dobbiamo impostare al 100% sia il tag <span style="font-style: italic;">body</span> che il tag <span style="font-style: italic;">html</span>:</p>
<pre>html, body {
&nbsp;&nbsp;&nbsp; height:100%;
}

#container {
&nbsp;&nbsp;&nbsp; min-height:100%;
}</pre>
<p>In questo modo però il footer andrà a posizionarsi fuori dall&#8217;area visibile (oltre il 100%, per intendersi): occorre quindi recuperare lo spazio necessario. Per farlo utilizziamo un semplice margine negativo pari all&#8217;altezza voluta del footer (in pixel o em, come preferite): </p>
<pre>html, body {
&nbsp;&nbsp;&nbsp; height:100%;
}

#container {
&nbsp;&nbsp;&nbsp; min-height:100%;
    <span style="font-weight: bold;">margin-bottom:-100px;</span>
}</pre>
<p>Ora però dobbiamo impedire al contenuto di finire sotto al footer che abbiamo portato in primo piano. Aggiungiamo perciò un padding inferiore al content in modo da distanziarlo a sufficienza: è importante quindi che abbia almeno lo stesso valore. Se vogliamo aggiungere un ulteriore spazio basta addizionarlo: (ad es. 110px per un padding inferiore apparente di 10px).</p>
<pre>html, body {
&nbsp;&nbsp;&nbsp; height:100%;
}

#container {
&nbsp;&nbsp;&nbsp; min-height:100%;
    margin-bottom:-<span style="font-weight: bold;">100px</span>;
}

#content {
    <span style="font-weight: bold;">padding-bottom:100px</span>;
}
</pre>
<p>Se provate la pagina con un browser come Firefox o Safari noterete che abbiamo già ottenuto l&#8217;effetto desiderato. La proprietà <span style="font-style: italic;">min-height</span> però non è supportata da Internet Explorer 6. Possiamo risolvere facilmente con il noto l&#8217;hack che utilizza la proprietà <span style="font-style: italic;">!important</span>. Aggiorniamo quindi il css ed abbiamo finito:</p>
<pre>#body {
&nbsp;&nbsp;&nbsp; height:100%;
}

#container {
&nbsp;&nbsp;&nbsp; min-height:100%;<br style="font-weight: bold;" /><span style="font-weight: bold;">    height:auto !important;</span> /*per gli altri browser*/<br style="font-weight: bold;" /><span style="font-weight: bold;">    height:100%;</span> /*per IE 6*/
    margin-bottom:-100px;
}

#content {
    padding-bottom:100px;
}</pre>
<p>Ecco quindi <a href="http://www.cescopag.com/demos/footer/fine.html">l&#8217;esempio finito</a> con <a href="http://www.cescopag.com/demos/footer/fine.html">poco</a> o <a href="http://www.cescopag.com/demos/footer/fine_lungo.html">molto contenuto</a>. Potete in alternativa <a href="http://www.cescopag.com/demos/footer/footer.zip">scaricare lo zip</a> con i sorgenti.<br />
Ho aggiunto qualche altra istruzione per evidenziare header e footer, ma il css di base è lo stesso.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cescopag.com/2008/11/footer-sempre-in-fondo/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

