<?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>Crysfel&#039;s Blog &#187; JavaScript</title>
	<atom:link href="http://www.crysfel.com/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.crysfel.com</link>
	<description>Blog geek</description>
	<lastBuildDate>Wed, 10 Mar 2010 23:16:42 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Combos dependientes con Ext JS</title>
		<link>http://www.crysfel.com/2008/11/26/combos-dependientes-con-ext-js/</link>
		<comments>http://www.crysfel.com/2008/11/26/combos-dependientes-con-ext-js/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 16:52:37 +0000</pubDate>
		<dc:creator>Crysfel</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.crysfel.com/?p=69</guid>
		<description><![CDATA[El día de hoy pongo el primer screencast o videotutorial en mi blog, lo que explico es como crear unos combos dependientes por medio de Ext Js.
Puedes ver el demo del tutorial aqui o descarga el código fuentes desde aqui.


Éste screencast es el primero de muchos mas, la idea es que de aquí en adelante [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>El día de hoy pongo el primer screencast o videotutorial en mi blog, lo que explico es como crear unos combos dependientes por medio de Ext Js.</p>
<p>Puedes ver el <a href="http://www.crysfel.com/demos/combosDependientes/">demo del tutorial aqui</a> o <a href="http://www.crysfel.com/wp-content/uploads/2008/11/combos.zip">descarga el código fuentes desde aqui</a>.</p>
<p><object width="504" height="380"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=2350142&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=2350142&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="504" height="380"></embed></object></p>
<p><span id="more-74"></span><br />
Éste screencast es el primero de muchos mas, la idea es que de aquí en adelante todos los tutoriales sean en video, creo que es mas sencillo verlo que leerlo, cualquier duda o comentario con respecto al tutorial pueden hacerlo en los comentarios.</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.crysfel.com/2008/11/26/combos-dependientes-con-ext-js/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Introducción a Ext Js</title>
		<link>http://www.crysfel.com/2008/03/24/introduccion-a-ext-js/</link>
		<comments>http://www.crysfel.com/2008/03/24/introduccion-a-ext-js/#comments</comments>
		<pubDate>Mon, 24 Mar 2008 23:25:30 +0000</pubDate>
		<dc:creator>Crysfel</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.crysfel.com/index.php/2008/03/24/introduccion-a-ext-js/</guid>
		<description><![CDATA[En el último proyecto en el cual he trabajado, he utilizado un framework javascript que vale la pena hablar de él en este blog, y se trata de Ext Js, una excelente librería para crear interfaces de usuario, Ext nos facilita mucho el trabajo a los desarrolladores, pues en unas cuantas líneas de javascript podemos [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>En el último proyecto en el cual he trabajado, he utilizado un <a href="http://www.quizzpot.com/">framework javascript</a> que vale la pena hablar de él en este blog, y se trata de Ext Js, una excelente librería para crear interfaces de usuario, Ext nos facilita mucho el trabajo a los desarrolladores, pues en unas cuantas líneas de javascript podemos hacer interfaces realmente buenas.</p>
<p>En este artículo quiero mostrar como hacer mensajes, tablas y ventanas, con esto pretendo dar una introducción a esta fantástica librería y así mostrar la facilidad en el desarrollo de software.</p>
<div style="text-align:center"><img src="http://www.crysfel.com/wp-content/uploads/2008/03/extjs.png" title="Ext Js Introduccion" /></div>
<p><span id="more-63"></span></p>
<p>Primeramente es necesario mencionar que Ext Js originalmente surgió como una extensión de la librería de Yahoo, con esto me refiero a que Ext Js nos da funcionalidad de más alto nivel, el manejo del DOM, AJAX y funcionalidades básicas son hechas por la librería YUI, pues Ext Js se enfoca en componentes o widgets.</p>
<p>Al ser diseñada desde un principio como una extensión montada sobre YUI, ahora es posible utilizarlas con otras librerías como JQuery o  Prototype.  Solo es necesario utilizar el “adapter” adecuado, y Ext JS utilizará la librería que uno necesite o conozca mejor para realizar las operaciones de bajo nivel, como manejo de eventos, consultas al DOM, manejo del CSS y todo lo que es posible hacer con tu librería favorita.</p>
<p>Una vez que tenemos una idea general de lo que se trata Ext Js, el siguiente paso es <a href="http://extjs.com/download">descargar la última versión</a> liberada, para poder continuar con esta introducción.</p>
<p>Una vez descargado, es necesario importar al documento tu librería favorita, el adapter correspondiente y el archivo “Ext-all.js”, estas son las posibles combinaciones que puede hacer, y el orden en que deben estar:</p>
<p>Utilizando Ext en modo Stand-alone, al decir stand alone significa que Ext Js utilizará su propia librería, que se llama Ext base, la cual contiene todo lo necesario para manejo de Dom, Ajax, animaciones, etc.<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
ext-base.js<br />
ext-all.js (o los componentes que necesites)</p>
<p>Utilizando Yahoo! UI (.12+)<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
yui-utilities.js<br />
ext-yui-adapter.js<br />
ext-all.js (o los componentes que necesites)</p>
<p>Utilizando jQuery (1.1+), jQuery es una de las librerías mas populares dentro de los desarrolladores, es por eso que Ext js ha creado un adapter para que podamos utilizar esta librería, los archivos a importar son los siguientes:<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
jquery.js<br />
ext-jquery-adapter.js<br />
ext-all.js (o los componentes que necesites)</p>
<p>Utilizando Prototype (1.5+) / Scriptaculous (1.7+), prototype fué uno de los primeros frameworks javascript, es muy popular y me atreveria a decir que la mas utilizada entre desarrolladores.<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
prototype.js<br />
scriptaculous.js?load=effects  (o cualquier cosa que necesites cargar de scriptaculous)<br />
ext-prototype-adapter.js<br />
ext-all.js (o los componentes que necesites)</p>
<p>En este tutorial se explica en modo “stand-alone”, esto por que mi librería favorita no esta soportada por Ext Js <img src='http://www.crysfel.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  (Mootools, que por cierto, hay un adapter de terceros para la versión Ext 1.1), por lo tanto se incluye al documento “adapter/ext/ext-base.js” y “ext-all.js”, para esto crea un carpeta en tu disco duro (donde quieras), copia los archivos anteriores a esta nueva carpeta, y además copia la carpeta “resources”, pues en esta se encuentran las imágenes y hojas de estilo necesarias para los componentes, además es necesario importar “ext-all.css”, crear el archivo HTML donde se trabajará, una buena practica es separar el HTML del javascript, entonces creamos el archivo “introduccion.js” donde se escribirá todo el javascript de este tutorial, los imports deben quedar así:</p>
<p><code lang="html"><br />
<script type="text/javascript" src="ext-base.js"></script><br />
<script type="text/javascript" src="ext-all.js"></script><br />
<script type="text/javascript" src="introduccion.js"></script></p>
<link rel="stylesheet" type="text/css" href="resources/css/ext-all.css">
</code></p>
<p>En el archive introduccion.js colocar el siguiente código:</p>
<p><code lang="javascript"><br />
Ext.onReady(function() {<br />
	alert("Felicidades!  Has configurado Ext correctamente!");<br />
});<br />
</code></p>
<p>Este mensaje tiene que aparecer si todo esta configurado correctamente, además de que se ejecutara cuando el DOM este listo para ser utilizado.</p>
<p><strong>Mensajes</strong><br />
Lo primero que mostraré es la forma de mandar mensajes al usuario, como alertas, confirmaciones, errores, etc. Lo que se hará ahora es cambiar el archivo introducción.js por lo siguiente:</p>
<p><code lang="javascript"><br />
Ext.onReady(function() {</p>
<p>	Ext.Msg.alert('Bienvenido','Felicidades!  Has configurado Ext correctamente!');</p>
<p>});<br />
</code></p>
<p>Al hacer esto, se esta mandando un alert al usuario, pero con la interfaz de Ext, como puedes ver es algo muy sencillo y se ve muy bien, ahora voy a mostrar un método con más opciones de configuración para mandar mensajes y tener control sobre los botones que ha presionado el usuario.</p>
<p><code lang="javascript"><br />
Ext.onReady(function() {</p>
<p>	Ext.Msg.show({<br />
	   title:'Bienvenido',<br />
	   msg: 'Felicidades!  Has configurado Ext correctamente! ¿estas emocionado?',<br />
	   buttons: Ext.Msg.YESNOCANCEL,<br />
	   fn: procesarResultado,<br />
	   icon: Ext.MessageBox.QUESTION<br />
	});</p>
<p>	function procesarResultado (btn){<br />
		if(btn=='yes'){<br />
			Ext.Msg.alert('Resultado','SI estas emocionado!! Excelente!!');<br />
		}else{<br />
			Ext.Msg.alert('Resultado','NO estas emocionado!! pues nimodos!!');<br />
		}<br />
	}<br />
});<br />
</code></p>
<p>Lo más importante a resaltar es notar la diferencia entre la forma de mostrar el mensaje, en el primer ejemplo es el método alert, recibiendo dos parámetros, siendo que en el segundo ejemplo el método show recibe un solo parámetro, el cual es un objeto con propiedades de configuración.</p>
<p>Otro punto importante es que la propiedad fn permite referenciar la función que manejará los eventos del usuario, cuando de clic en algún botón, la función que se ha especificado aquí será disparada, te recomiendo comiences a jugar un poco cambiando algunas opciones, puede encontrar las opciones permitidas en <a href="http://extjs.com/deploy/dev/docs/">el API de Ext Js</a>.</p>
<p><strong>Grids o Tablas</strong><br />
La tabla o grid, es el componente más popular de este framework, ya que es muy sencillo hacer tablas con capacidades realmente buenas.</p>
<p>Primeramente se necesita la información que va a ser desplegada, contenida en un array por cada renglón que se quiere desplegar, en proyectos reales esta información puede venir de una base de datos o de un webservice, para este ejemplo “hardcode”.</p>
<p><code lang="javascript"><br />
var myData = [<br />
	['Apple',29.89,0.24,0.81,'9/1 12:00am'],<br />
	['Ext',83.81,0.28,0.34,'9/12 12:00am'],<br />
	['Google',71.72,0.02,0.03,'10/1 12:00am'],<br />
	['Microsoft',52.55,0.01,0.02,'7/4 12:00am'],<br />
	['Yahoo!',29.01,0.42,1.47,'5/22 12:00am']<br />
];<br />
</code></p>
<p>El siguiente paso es crear un lector que pueda interpretar esta información, para poder procesarla en la tabla, existen varios tipos de lectores, para este caso se utiliza el de ArrayReader, pues la información anterior es un array, es muy común utilizar el lector de XML cuando usamos Ajax.</p>
<p><code lang="javascript"><br />
var myReader = new Ext.data.ArrayReader({}, [<br />
	{name: 'company'},<br />
	{name: 'price', type: 'float'},<br />
	{name: 'change', type: 'float'},<br />
	{name: 'pctChange', type: 'float'},<br />
	{name: 'lastChange', type: 'date', dateFormat: 'n/j h:ia'}<br />
]);<br />
</code></p>
<p>Como se puede notar, se le ha asignado un nombre a cada columna, al igual que el tipo de dato que esta contiene, en el caso de la fecha se ha creado un formato de despliegue, es importante especificar el tipo de dato, pues al momento de ordenar la tabla, es de vital importancia.</p>
<p>El último paso es crear la tabla, donde se le pasará la información, contenida en el arreglo, y el lector de esta.</p>
<p><code lang="javascript"><br />
var grid = new Ext.grid.GridPanel({<br />
	store: new Ext.data.Store({<br />
		data: myData,<br />
		reader: myReader<br />
	}),<br />
	columns: [<br />
		{header: 'Compañia', width: 120, sortable: true, dataIndex: 'company'},<br />
		{header: 'Precio', width: 90, sortable: true, dataIndex: 'price'},<br />
		{header: 'Cambio', width: 90, sortable: true, dataIndex: 'change'},<br />
		{header: '% Cambio', width: 90, sortable: true, dataIndex: 'pctChange'},<br />
		{header: 'Último cambio', width: 120, sortable: true,<br />
			renderer: Ext.util.Format.dateRenderer('m/d/Y'),<br />
						dataIndex: 'lastChange'}<br />
	],<br />
	viewConfig: {<br />
		forceFit: true<br />
	},<br />
	renderTo: 'grid',<br />
	title: 'Titulo de la tabla',<br />
	width: 500,<br />
	frame: true<br />
});<br />
</code></p>
<p>Con la clase <strong>Ext.grid.GridPanel</strong> se crean las tablas, es necesario darle la información a desplegar, por medio de la propiedad “store”, las columnas que va a contener, donde a cada columna se le especifica su titulo, su tamaño, si será ordenable y lo más importante, el “dataIndex” que es donde se relaciona la columna con la información en el Lector, la opción renderTo, es el ID del elemento donde se quiere colocar la tabla en el documento.</p>
<p>Pues esto es todo lo necesario para crear una tabla, realmente sencillo y como se puede observar, la tabla se ve muy bien.</p>
<p><strong>Ventanas</strong><br />
Para finalizar con este tutorial voy a mostrar como crear ventanas con toda la funcional necesaria.</p>
<p>Crear ventanas es muy sencillo, simplemente se ahce algo como esto:</p>
<p><code lang="javascript"><br />
var win = new Ext.Window({title:'El titulo',width:500,height:250});<br />
win.show();<br />
</code></p>
<p>La clase <strong>Ext.Window</strong> es la responsable de crear una ventana totalmente configurable, en este ejemplo únicamente se le esta especificando las dimensiones y el título, pero también se puede configurar si se quiere que la ventana no se cierre, o que no se pueda redimensionar y muchas otras cosas mas que recomiendo y se vea el api para poder jugar con estas propiedades.</p>
<p>Es importante mencionar que con el método show se muestra la ventana, de lo contrario no se verá nada.</p>
<p><strong>Conclusión</strong><br />
En este tutorial simplemente he mostrado algo de lo que se puede hacer con esta maravillosa librería, realmente que es sencillo y rápido desarrollar aplicaciones complejas.</p>
<p>Espero que esta corta introducción le pueda servir a mas de uno, y si tienen algún comentario o duda la pueden dejar en el formulario inferior de esta misma página, como parte complementaria al tutorial se puede <a href="http://www.crysfel.com/wp-content/uploads/2008/03/introduccion.zip" title="Ext Js Introducción">descargar los archivos</a> de ejemplo.</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.crysfel.com/2008/03/24/introduccion-a-ext-js/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Carrusel de imágenes con Mootools1.2</title>
		<link>http://www.crysfel.com/2008/02/13/carrusel-de-imagenes-con-mootools12/</link>
		<comments>http://www.crysfel.com/2008/02/13/carrusel-de-imagenes-con-mootools12/#comments</comments>
		<pubDate>Wed, 13 Feb 2008 18:26:25 +0000</pubDate>
		<dc:creator>Crysfel</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.crysfel.com/index.php/2008/02/13/carrusel-de-imagenes-con-mootools12/</guid>
		<description><![CDATA[Ya hace rato que salió la nueva versión de mootools (la 1.2beta2), hoy quiero mostrar como escribir una clase con esta nueva versión, es muy similar a la versión anterior, pero algunas cosas cambiaron.
Objetivo
El principal objetivo de este artículo es mostrar algunas buenas prácticas al escribir clases, para que sean reutilizables no solo por el [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>Ya hace rato que salió la nueva versión de <a href="http://mootools.net">mootools (la 1.2beta2)</a>, hoy quiero mostrar como escribir una clase con esta nueva versión, es muy similar a la versión anterior, pero algunas cosas cambiaron.</p>
<p><strong>Objetivo</strong><br />
El principal objetivo de este artículo es mostrar algunas buenas prácticas al escribir clases, para que sean reutilizables no solo por el propio autor, sino también por otros desarrolladores, esto hay que tenerlo en mente siempre que escribimos una clase, la clase que se escribirá hará algo asi (En las feeds no se aprecia el efecto debido a que no se ejecuta el javascript):</p>
<p><script type="text/javascript" src="http://www.crysfel.com/wp-content/uploads/2008/02/carrusel.js" ></script></p>
<div id="carruselTutorial2" style="margin-left:30px;background-image:url(http://www.crysfel.com/ejemplos/carrusel/04.jpg);width:420px;height:294px"></div>
<p><script type="text/javascript">$("carruselTutorial2").setStyle("background-image","none"); new Carrusel("carruselTutorial2",{images:["http://www.crysfel.com/ejemplos/carrusel/04.jpg","http://www.crysfel.com/ejemplos/carrusel/05.jpg","http://www.crysfel.com/ejemplos/carrusel/06.jpg","http://www.crysfel.com/ejemplos/carrusel/07.jpg","http://www.crysfel.com/ejemplos/carrusel/08.jpg","http://www.crysfel.com/ejemplos/carrusel/09.jpg","http://www.crysfel.com/ejemplos/carrusel/10.jpg","http://www.crysfel.com/ejemplos/carrusel/11.jpg","http://www.crysfel.com/ejemplos/carrusel/12.jpg","http://www.crysfel.com/ejemplos/carrusel/13.jpg","http://www.crysfel.com/ejemplos/carrusel/14.jpg","http://www.crysfel.com/ejemplos/carrusel/15.jpg","http://www.crysfel.com/ejemplos/carrusel/16.jpg","http://www.crysfel.com/ejemplos/carrusel/17.jpg","http://www.crysfel.com/ejemplos/carrusel/18.jpg"]});</script></p>
<p>Este carrusel de imágenes (slideshow) es idéntico (a nivel visor) al que ya he <a href="http://www.crysfel.com/index.php/2007/05/02/carrusel-de-imagenes/">mostrado anteriormente</a>, solo que esta vez el código estará mucho mas limpio y mejor diseñado, completamente orientado a objetos y podrá ser muy flexible para ser utilizado por algún otro desarrollador.</p>
<p><span id="more-59"></span></p>
<p>Para comenzar hay que <a href="http://mootools.net/download/tags/1-2b2">descargar la librería de mootools (1.2beta2)</a> e importarla a la página:</p>
<p><code lang="html"><br />
<script type="text/javascript" src="mootools-beta-1.2b2.js"></script><br />
</code></p>
<p><strong>Definir una Clase con Mootools</strong><br />
La clase que hará el trabajo se llamará <strong>Carrusel</strong>, y para declararla vasta con hacer lo siguiente.</p>
<p><code lang="javascript"><br />
var Carrusel = new Class({</p>
<p>});<br />
</code></p>
<p><strong>Agregar soporte para eventos y opciones</strong><br />
Generalmente una clase lleva Opciones, Eventos y un constructor, no son obligatorios, pero para reutilizar y distribuirla a otras personas, es mejor pensar a futuro.</p>
<p><code lang="javascript"><br />
var Carrusel = new Class({<br />
	Implements:[Events, Options], //Implementamos eventos y opciones<br />
	options:{</p>
<p>	},<br />
	initialize:function(el,options){ // el constructor</p>
<p>	}<br />
});<br />
</code></p>
<p>Notar que entre cada propiedad o método se separa mediante una coma simple &#8220;,&#8221;, esto debido al estandar de JSON para javascript.</p>
<p>Para dar soporte de Eventos a la clase hay que implementar la clase Events, al igual que la clase Options si se quiere que la clase sea capas de manejar opciones de una manera sencilla. Este punto en especifico es algo que cambió en esta versión, anteriormente era diferente la manera de implementar clases, ahora esta mucho mas claro y entendible.</p>
<p>Lo siguiente es definir las propiedades (opciones) que la clase tendrá. Tomando en cuenta que es un carrusel de imágenes, tendremos entonces imágenes, sus dimensiones y control sobre el tiempo del efecto de transición y el tiempo a entre cada una.</p>
<p><code lang="javascript"><br />
var Carrusel = new Class({<br />
	Implements:[Events, Options],<br />
	options:{<br />
		images:[],<br />
		width: 420,<br />
		height: 294,<br />
		durationFx:1000,<br />
		durationDelay: 3000 //3 segundos<br />
	},<br />
	initialize:function(el,options){<br />
		this.setOptions(options || {});<br />
	}<br />
});<br />
</code></p>
<p>Es importante notar que el constructor esta recibiendo dos parámetros, un elemento y opciones.</p>
<p>Las opciones funcionan de la siguiente manera, inicialmente se declaran con los valores por default, en este caso images es un arreglo vacío, width vale 420 y así con las demás, en caso de que en el constructor no se le pasen opciones, entonces las opciones por default serán usadas, este comportamiento se logra gracias a la función this.setOptions, que es la encargada de sobrescribir las opciones por default.</p>
<p>Dentro del constructor de la clase se pueden poner llamadas a otras funciones de la misma clase y hacer cualquier otra cosa, en este caso, voy a crear dos propiedades de clase y dos métodos, por ahora.</p>
<p><code lang="javascript"><br />
initialize:function(el,options){<br />
	this.setOptions(options || {});<br />
	this.el = $(el);<br />
	this.id = this.el.get('id');<br />
	this.build();<br />
	this.start();<br />
}<br />
</code></p>
<p>Hasta aquí únicamente he creado la propiedad this.el, que es la que guardará una referencia al elemento que se recibe, la propiedad this.id, es el identificador del elemento, esto lo hago por conveniencia, pues mas adelante se hará uso de este varias veces, el método build es el responsable de crear la estructura del visor de imágenes, ósea el html necesario, el método start es el encargado de iniciar la animación.</p>
<p>A continuación voy a mostrar en pseudos código lo que el método build hará.</p>
<p><code lang="javascript"><br />
build:function(){<br />
	//1.- Crear un div contenedor e inyectarlo dentro del elemento principal.<br />
	//2.- Crear un div para la imagen1 e inyectarlo al contenedor anterior<br />
	//3.- Crear un div para la imagen2 e inyectarlo al contenedor anterior<br />
	//4.- Crear las los efectos sobre los divs que contenedores de las imagenes<br />
	//5.- Iniciar con opacidad al 0%<br />
}<br />
</code></p>
<p>El div del punto uno es necesario, pues es posible que el donde se aloje el carrusel sea otro div posicionado absoluto o flotante, mediante este primer div contenedor nos aseguramos que el carrusel se pueda desplegar correctamente en cualquier lugar.</p>
<p>Una vez claro lo que se hará, codificarlo con mootools es muy sencillo, para crear los divs se utiliza la clase Element, y para los efectos la clase Fx.Tween, el código del método queda de la siguiente manera.</p>
<p><code lang="javascript"><br />
build:function(){<br />
	//1.- Crear un div contenedor e inyectarlo dentro del elemento principal.<br />
	var content = new Element('div',{id:this.id+'_content',styles:{position:'relative',width:this.options.width+'px',height:this.options.height+'px'}}).inject(this.el);<br />
	//2.- Crear un div para la imagen1 e inyectarlo al contenedor anterior<br />
	var img1 = new Element('div',{id:this.id+'_img1',styles:{width:'100%',height:'100%'}}).inject(content);<br />
	//3.- Crear un div para la imagen2 e inyectarlo al contenedor anterior<br />
	var img2 = new Element('div',{id:this.id+'_img2',styles:{position:'absolute',width:this.options.width+'px',height:this.options.height+'px',top:0,left:0}}).inject(content);<br />
	//4.- Crear las los efectos sobre los divs que contenedores de las imagenes<br />
	this.imgFx1 = new Fx.Tween(img1, 'opacity',{<br />
					duration:this.options.durationFx,<br />
					onComplete:function(){<br />
					this.nextImage();<br />
				}.bind(this)<br />
			});<br />
	this.imgFx2 = new Fx.Tween(img2, 'opacity',{duration:this.options.durationFx});<br />
	//5.- Iniciar con opacidad al 0%<br />
	this.imgFx1.set(0);<br />
	this.imgFx2.set(0);<br />
}<br />
</code></p>
<p>Lo mas interesante para comentar, es que en el punto numero cuatro, no solo se creó el efecto sobre la imagen uno, si no que también se agregó un evento, onComplete, este evento se dispara cuando el efecto sobre la imagen uno ha terminado, entonces la única instrucción aquí es cambiar a la siguiente imagen, el cual es otro método de la clase que mas adelante explicaré. Si eres observador al evento onComplete se le agregó también un bind(this) ,esto es de suma importancia, pues con esta instrucción es posible hacer referencia a la misma clase desde el evento, de no agregar esta instrucción el evento no sabría en que contexto buscar el método nextImage().</p>
<p>El siguiente método a implementar es el start, el cual es el encargado de iniciar con la animación. El pseudo código es el siguiente.</p>
<p><code lang="javascript"><br />
start:function(){<br />
	//1.- Revisar si hay imagenes para poder comenzar el carrusel<br />
	//2.- Disparar el evento onStart<br />
	//3.- Solicitar imagen<br />
	//4.- Hacer la trancision inicial<br />
	//5.- Crear un temporizador para ejecutar la transición periodicamente<br />
}<br />
</code></p>
<p>El código de lo anterior es el siguiente.</p>
<p><code lang="javascript"><br />
start:function(){<br />
	//1.- Revisar si hay imagenes para poder comenzar el carrusel<br />
	if(this.options.images.length==0)<br />
		return;<br />
	//2.- Disparar el evento onStart<br />
	this.fireEvent('onStart');<br />
	this.index = -1;<br />
	this.isImg1OnTop = false;<br />
	//3.- Solicitar imagen<br />
	this.nextImage();<br />
	//4.- Hacer la trancision inicial<br />
	this.transition();<br />
	//5.- Crear un temporizador para ejecutar la transición periodicamente<br />
	this.timer = this.transition.periodical(this.options.durationDelay,this);<br />
}<br />
</code></p>
<p>Es importante mencionan lo que sucede en la instrucción numero dos, para disparar el evento es necesario implementar la clase Events, la cual importamos al principio, this.fireEvent permite disparar eventos, en este caso se dispara el evento cuando se inicia la animación, estos eventos son provistos por los programadores que utilicen esta clase en algún futuro o por nosotros mismo, esto es muy útil si queremos reutilizar esta clase, añadiéndole comportamientos extras cuando sucedan los eventos, es por eso que siempre que se escribe una clase se debiera pensar en agregar eventos, personalmente siempre lo hago y me ha resultado de gran ayuda en el futuro.</p>
<p>En el método start  esta haciendo una llamada al método nextImage, este método es el responsable de establecer la imagen al contendor correspondiente, verificando que al término de las imágenes inicie nuevamente desde la imagen número uno, esta función también es invocada cuando termina el efecto de la transición sobre la imagen uno, esto se especifico en la función build, en pseudo código esto es:</p>
<p><code lang="javascript"><br />
nextImage: function(){<br />
	//1.- Se incrementa el contador<br />
	//2.- Se verifica la dimension del arreglo de imagenes, si llego al limite iniciar desde el principio<br />
	//3.- Se verifica si la imagen uno esta actualmente viendose, de esta forma se sabe a donde posicionar la siguietne imagen<br />
}<br />
</code></p>
<p>El código de lo anterior es el siguiente:</p>
<p><code lang="javascript"><br />
nextImage: function(){<br />
	//1.- Se incrementa el contador<br />
	this.index++;<br />
	//2.- Se verifica la dimension del arreglo de imagenes, si llego al limite iniciar desde el principio<br />
	if(this.index>=this.options.images.length)<br />
		this.index = 0;<br />
	//3.- Se verifica si la imagen uno esta actualmente viendose, de esta forma se sabe a donde posicionar la siguietne imagen<br />
	if(this.isImg1OnTop)<br />
		$(this.id+'_img2').setStyle('background-image','url('+this.options.images[this.index]+')');<br />
	else<br />
		$(this.id+'_img1').setStyle('background-image','url('+this.options.images[this.index]+')');<br />
}<br />
</code></p>
<p>El método start también esta llamando a la función transition, la responsabilidad del  método transition es realizar el efecto sobre los contenedores de la imágenes, esto es muy sencillo:</p>
<p><code lang="javascript"><br />
transition:function(){<br />
	this.fireEvent('onTransition');<br />
	this.imgFx1.start(this.isImg1OnTop?0:1);<br />
	this.imgFx2.start(this.isImg1OnTop?1:0);<br />
	this.isImg1OnTop = !this.isImg1OnTop;<br />
}<br />
</code></p>
<p>Lo único que se esta haciendo aquí es disparar el evento onTransition, e iniciando el desvanecido de 0 a 100 por ciento, dependiendo de imagen uno.</p>
<p>Por último se crearán algunos métodos para ser utilizados por otros desarrolladores o por nosotros mismos en otras circunstancias, primeramente un método que detenga al carrusel, otros método para controlar las imágenes, estas pueden provenir de una llamada AJAX o de cualquier otro lugar.</p>
<p><code lang="javascript"><br />
stop:function(){<br />
	this.fireEvent('onStop');<br />
	$clear(this.timer);<br />
}</p>
<p>newImages:function(images){<br />
	this.options.images = images;<br />
},<br />
addImages:function(images){<br />
	this.options.images.merge(images);<br />
},<br />
addImage:function(image){<br />
	this.addImages([image]);<br />
},<br />
deleteImages:function(){<br />
	this.stop();<br />
	this.options.images.empty();<br />
}<br />
</code></p>
<p><strong>Utilizar el carrusel o slideshow</strong><br />
Para utilizar el carrusel hay que crear instancias de esta clase, la forma más básica de su uso es:</p>
<p><code lang="javascript"><br />
//Utilizando las propiedades por default.<br />
var car1 = new Carrusel('carrusel1',{images:['images/12.jpg','images/09.jpg','images/05.jpg']});</p>
<p>//Usando los métodos para agregar imagenes<br />
var car3 = new Carrusel('carrusel3');<br />
car3.addImages(['images/14.jpg','images/11.jpg','images/06.jpg']);<br />
car3.addImage('images/10.jpg');<br />
car3.addImage('images/15.jpg');<br />
car3.start();</p>
<p>//Modificando todas las propiedades<br />
var car4 = new Carrusel('carrusel4',{<br />
			durationDelay:7000,<br />
			durationFx:1500,<br />
			width: 500,<br />
			height: 280,<br />
			images:['images/08.jpg','images/06.jpg','images/13.jpg'],<br />
			onStart:function(){console.debug('comenzando...')},<br />
			onTransition:function(){console.debug('haciendo la transición')}<br />
	});<br />
</code></p>
<p>Hay que recordar que deben existir los elementos en el documento para que funcione correctamente, con esto me refiero a que el HTML debe contener algo como esto para cada instancia del carrusel:</p>
<p><code lang="html"></p>
<div id="carrusel1">
</div>
<p></code></p>
<p>El código completo de la clase <strong>carrusel.js</strong> es el siguiente:</p>
<p><code lang="javascript"><br />
var Carrusel = new Class({<br />
	Implements:[Events, Options],<br />
	options:{<br />
		images:[],<br />
		width: 420,<br />
		height: 294,<br />
		durationFx:1000,<br />
		durationDelay: 3000 //3 segundos<br />
	},<br />
	initialize:function(el,options){<br />
		this.setOptions(options || {});<br />
		this.el = $(el);<br />
		this.id = this.el.get('id');<br />
		this.build();<br />
		this.start();<br />
	},<br />
	build:function(){<br />
		//1.- Crear un div contenedor e inyectarlo dentro del elemento principal.<br />
		var content = new Element('div',{id:this.id+'_content',styles:{position:'relative',width:this.options.width+'px',height:this.options.height+'px'}}).inject(this.el);<br />
		//2.- Crear un div para la imagen1 e inyectarlo al contenedor anterior<br />
		var img1 = new Element('div',{id:this.id+'_img1',styles:{width:'100%',height:'100%'}}).inject(content);<br />
		//3.- Crear un div para la imagen2 e inyectarlo al contenedor anterior<br />
		var img2 = new Element('div',{id:this.id+'_img2',styles:{position:'absolute',width:this.options.width+'px',height:this.options.height+'px',top:0,left:0}}).inject(content);<br />
		//4.- Crear las los efectos sobre los divs que contenedores de las imagenes<br />
		this.imgFx1 = new Fx.Tween(img1, 'opacity',{<br />
						duration:this.options.durationFx,<br />
						onComplete:function(){<br />
						this.nextImage();<br />
					}.bind(this)<br />
				});<br />
		this.imgFx2 = new Fx.Tween(img2, 'opacity',{duration:this.options.durationFx});<br />
		//5.- Iniciar con opacidad al 0%<br />
		this.imgFx1.set(0);<br />
		this.imgFx2.set(0);<br />
	},<br />
	start:function(){<br />
		//1.- Revisar si hay imagenes para poder comenzar el carrusel<br />
		if(this.options.images.length==0)<br />
			return;<br />
		//2.- Disparar el evento onStart<br />
		this.fireEvent('onStart');<br />
		this.index = -1;<br />
		this.isImg1OnTop = false;<br />
		//3.- Solicitar imagen<br />
		this.nextImage();<br />
		//4.- Hacer la trancision inicial<br />
		this.transition();<br />
		//5.- Crear un temporizador para ejecutar la transición periodicamente<br />
		this.timer = this.transition.periodical(this.options.durationDelay,this);<br />
	},<br />
	stop:function(){<br />
		this.fireEvent('onStop');<br />
		$clear(this.timer);<br />
	},<br />
	transition:function(){<br />
		this.fireEvent('onTransition');<br />
		this.imgFx1.start(this.isImg1OnTop?0:1);<br />
		this.imgFx2.start(this.isImg1OnTop?1:0);<br />
		this.isImg1OnTop = !this.isImg1OnTop;<br />
	},<br />
	nextImage: function(){<br />
		//1.- Se incrementa el contador<br />
		this.index++;<br />
		//2.- Se verifica la dimension del arreglo de imagenes, si llego al limite iniciar desde el principio<br />
		if(this.index>=this.options.images.length)<br />
			this.index = 0;<br />
		//3.- Se verifica si la imagen uno esta actualmente viendose, de esta forma se sabe a donde posicionar la siguietne imagen<br />
		if(this.isImg1OnTop)<br />
			$(this.id+'_img2').setStyle('background-image','url('+this.options.images[this.index]+')');<br />
		else<br />
			$(this.id+'_img1').setStyle('background-image','url('+this.options.images[this.index]+')');<br />
	},<br />
	newImages:function(images){<br />
		this.options.images = images;<br />
	},<br />
	addImages:function(images){<br />
		this.options.images.merge(images);<br />
	},<br />
	addImage:function(image){<br />
		this.addImages([image]);<br />
	},<br />
	deleteImages:function(){<br />
		this.stop();<br />
		this.options.images.empty();<br />
	}<br />
});<br />
</code></p>
<p>El código del documento HTML que lo invoca es:</p>
<p><code lang="html"><br />
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"<br />
        "http://www.w3.org/TR/xhtml1/DTD/xhtml-strict.dtd"></p>
<p><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es"><br />
<head><br />
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1;" /></p>
<p><script type="text/javascript" src="mootools-beta-1.2b2.js"></script><br />
<script type="text/javascript" src="carrusel.js"></script><br />
<script type="text/javascript"></p>
<p>window.addEvent('domready', function() {
	var car = new Carrusel('carrusel');
	car.addImages(['images/14.jpg','images/11.jpg','images/06.jpg']);
	car.addImage('images/10.jpg');
	car.addImage('images/15.jpg');
	car.start();
});
</script><br />
</head><br />
<body></p>
<div id="carrusel">
</div>
<p></body><br />
</html><br />
</code></p>
<p><strong>Conclusión</strong><br />
Si lo has notado, para escribir esta clase se han creado varios métodos, cada uno con una responsabilidad especifica, la clase esta muy entendible y fácil de utilizar, esto es lo que se debe tener en cuanta cuando se escriben clases.</p>
<p>Espero que este tutorial sea de utilidad para mas de uno, saludos.</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.crysfel.com/2008/02/13/carrusel-de-imagenes-con-mootools12/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Debugueando con firebug fuera de Firefox</title>
		<link>http://www.crysfel.com/2008/01/29/debugueando-con-firebug-fuera-de-firefox/</link>
		<comments>http://www.crysfel.com/2008/01/29/debugueando-con-firebug-fuera-de-firefox/#comments</comments>
		<pubDate>Tue, 29 Jan 2008 16:56:06 +0000</pubDate>
		<dc:creator>Crysfel</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.crysfel.com/index.php/2008/01/29/debugueando-con-firebug-fuera-de-firefox/</guid>
		<description><![CDATA[La mayoría de nosotros conocemos la extensión para firefox firebug, ya que es muy  útil a la hora de desarrollar aplicaciones web, desafortunadamente solo podemos trabajar con esta extensión dentro de firefox, pero que pasa si queremos debuguear otros exploradores como Internet Explorer, Opera, Safari?.
Gracias a Joe Hewitt, el creador de firebug, que ha [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>La mayoría de nosotros conocemos la extensión para firefox firebug, ya que es muy  útil a la hora de desarrollar aplicaciones web, desafortunadamente solo podemos trabajar con esta extensión dentro de firefox, pero que pasa si queremos debuguear otros exploradores como Internet Explorer, Opera, Safari?.</p>
<p>Gracias a Joe Hewitt, el creador de firebug, que ha puesto esta herramienta disponible para todos los demás exploradores como un archivo javascript, esta versión de firebug es mas ligera y no tiene todo lo que la extensión para firefox, pero es de gran ayuda, simplemente tienes que incluir el archivo javascript en tu página y listo, puedes <a href="http://www.getfirebug.com/lite.html">descargar Firebug Lite desde aquí </a>.</p>
<p>Ahora bien, cuando se esta en la etapa de desarrollo, es recomendable agregar el archivo javascript, pero cuando se sube a producción hay que quitarlo para no desperdiciar ancho de banda, al hacer esto todas las llamadas al objeto console, el encargado de debuguear, marcarán error, para corregir eso simplemente hay que pegar las siguientes líneas de código antes de hacer cualquier llamada al objeto console.</p>
<p><code lang="javascript"><br />
if (!("console" in window) || !("firebug" in console)) {<br />
    var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", "group"<br />
                 , "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];<br />
    window.console = {};<br />
    for (var i = 0; i <names.length; ++i) window.console[names[i]] = function() {};<br />
}<br />
</code></p>
<p>Con esto se crea el objeto console y ya no marcará errores la aplicación.</p>
<p>Saludos.</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.crysfel.com/2008/01/29/debugueando-con-firebug-fuera-de-firefox/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Liberada Mootools1.2b2</title>
		<link>http://www.crysfel.com/2008/01/17/liberada-mootools1-2b2/</link>
		<comments>http://www.crysfel.com/2008/01/17/liberada-mootools1-2b2/#comments</comments>
		<pubDate>Thu, 17 Jan 2008 17:45:11 +0000</pubDate>
		<dc:creator>Crysfel</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.crysfel.com/index.php/2008/01/17/53/</guid>
		<description><![CDATA[Ayer 16 de Enero del 2008, se ha liberado la segunda version beta de Mootools, y según anuncian en su blog, esta parece ser la definitiva, se han solucionado bugs de la versión anterior y se han agregado nuevas características, entre las mas destacadas es sobre el accesso a los elementos.
En la versión anterior el [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>Ayer 16 de Enero del 2008, se ha liberado la segunda version beta de Mootools, y según anuncian en su blog, esta parece ser la definitiva, se han solucionado bugs de la versión anterior y se han agregado nuevas características, entre las mas destacadas es sobre el accesso a los elementos.</p>
<p>En la versión anterior el método <em>set</em>, de la clase Element, solo aceptaba un parámetro, ahora en esta nueva versión es posible pasarle un objeto con todas las opciones que querramos.</p>
<p>Ejemplo: En la versión anterior haciamos algo así para acceder a las propiedades de los elmentos.</p>
<p><code lang="javascript"><br />
$(element).set('href', 'http://moootools.net'); //setter<br />
$(element).get('href'); //getter<br />
</code></p>
<p>En esta nueva versión podemos hacer lo siguiente, claro que lo anterior lo podemos seguir haciendo:</p>
<p><code lang="javascript"><br />
$(element).set({<br />
    href: 'http://www.crysfel.com',<br />
    text: 'Crysfel blog´s',<br />
    morph: {duration: 200, transition: 'quad:out'},<br />
    events: {<br />
        click: function(){<br />
            document.location.href = this.href;<br />
            return false;<br />
        }<br />
    }<br />
});<br />
</code></p>
<p>Como se puede ver, ahora podemos asignarle varios parámetros a la vez, pero hay que notar que también se pueden declarar eventos.</p>
<p>Para mayor información ver el <a href="http://blog.mootools.net/2008/1/16/mootools-1-2-beta-2">blog oficial</a>, también recomiendo descargar esta <a href="http://mootools.net/download/tags/1.2b2">nueva versión</a>.</p>
<p>Saludos y a experimentar!.</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.crysfel.com/2008/01/17/liberada-mootools1-2b2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drag and Drop con mootools</title>
		<link>http://www.crysfel.com/2007/10/31/drag-and-drop-con-mootools/</link>
		<comments>http://www.crysfel.com/2007/10/31/drag-and-drop-con-mootools/#comments</comments>
		<pubDate>Wed, 31 Oct 2007 23:46:20 +0000</pubDate>
		<dc:creator>Crysfel</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.crysfel.com/index.php/2007/10/31/drag-and-drop-con-mootools/</guid>
		<description><![CDATA[El día de hoy quiero mostrar como realizar un Drag and Drop utilizando mootools, el ejemplo será sencillo pero se muestran los eventos necesarios para realizar algo más complejo. El ejemplo siguiente muestra lo que se planea realizar, arrastra la carpeta de la izquierda sobre cualquiera de los botes azules.









var drops = $$("#cubos .drop");
var clon;
$("mover").addEvent("mousedown",function(event){
	event [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>El día de hoy quiero mostrar como realizar un Drag and Drop utilizando mootools, el ejemplo será sencillo pero se muestran los eventos necesarios para realizar algo más complejo. El ejemplo siguiente muestra lo que se planea realizar, arrastra la carpeta de la izquierda sobre cualquiera de los botes azules.</p>
<div id="mover" style="width:64px;height:64px;background-image:url(http://www.crysfel.com/wp-content/uploads/2007/10/folder.png);"></div>
<div id="cubos" style="width:400px;margin:0px 100px">
<div class="drop" style="float:left;margin:3px;width:128px;height:128px;background-image:url(http://www.crysfel.com/wp-content/uploads/2007/10/botebacio.png);"></div>
<div class="drop" style="float:left;margin:3px;width:128px;height:128px;background-image:url(http://www.crysfel.com/wp-content/uploads/2007/10/botebacio.png);"></div>
<div class="drop" style="float:left;margin:3px;width:128px;height:128px;background-image:url(http://www.crysfel.com/wp-content/uploads/2007/10/botebacio.png);"></div>
<div class="drop" style="float:left;margin:3px;width:128px;height:128px;background-image:url(http://www.crysfel.com/wp-content/uploads/2007/10/botebacio.png);"></div>
<div style="clear:both;"></div>
</div>
<p><script type="text/javascript">
var drops = $$("#cubos .drop");
var clon;
$("mover").addEvent("mousedown",function(event){
	event = new Event(event).stop();
	if(!$chk(clon)) clon = this.clone();
	clon.setStyles(this.getCoordinates());
	clon.inject(document.body);
clon.setStyle("z-index",500);
clon.setStyle("opacity",0.7);
	clon.makeDraggable({droppables:drops}).start(event);
	clon.addEvent("emptydrop",function(){
		//if($chk(clon)){ clon.remove(); clon= null;}
	});
});
drops.setStyle("opacity",0.7);
drops.each(function(drop){
	var fx = new Fx.Styles(drop, {duration:300, wait:false});
	drop.addEvent("drop",function(){
		if($chk(clon)){ clon.remove(); clon= null;}
		this.setStyle("background-image","url(http://www.crysfel.com/wp-content/uploads/2007/10/botelleno.png)");
	});
	drop.addEvent("over",function(){
		fx.start({"opacity":1});
	});
	drop.addEvent("leave",function(){
		fx.start({"opacity":0.7});
	});
});
</script></p>
<p>Hacer esto es muy sencillo, antes que nada hay que <a href="http://mootools.net/download">descargar la ultima versión de mootools</a> (mootools-release-1.11.js actualmente), luego de esto la importamos al documento así:</p>
<p><code lang="html"><br />
<script type="text/javascript" src="mootools-release-1.11.js"></script><br />
</code></p>
<p>El siguiente paso es crear el objeto que se arrastrara y los botecitos donde se soltará la carpeta, el HTML quedará de la siguiente manera.</p>
<p><code lang="html"></p>
<div id="mover"></div>
<div id="cubos">
<div class="drop"></div>
<div class="drop"></div>
<div class="drop"></div>
<div class="drop"></div>
</div>
<p></code></p>
<p>Ahora mediante CSS acomodamos al tamaño correcto y le ponemos las imágenes respectivas.</p>
<p><span id="more-41"></span></p>
<p><code lang="css"><br />
#mover{<br />
	width:64px;<br />
	height:64px;<br />
	background-image:url(folder.png);<br />
}<br />
#cubos{<br />
	width:400px;<br />
	margin:100px auto;<br />
}<br />
.drop{<br />
	float:left;<br />
	margin:3px;<br />
	width:128px;<br />
	height:128px;<br />
	background-image:url(boteBacio.png);<br />
}<br />
</code></p>
<p>Una vez lista la interfase, viene lo divertido, pues es hora de programar las acciones y eventos a realizar.</p>
<p>Mootools tiene una forma muy sencilla de realizar el Drag and Drop, simplemente al elemento que se hace “dragable” se le asignan los elementos que serán “dropables” para este elemento mediante un arreglo.</p>
<p>Con esto en mente tomamos todos los elementos que contengan la clase “drop”, para esto simplemente utilizamos la función doble dólar y le pasamos la expresión que necesitamos.</p>
<p><code lang="javascript"><br />
var drops = $$('#cubos .drop');<br />
var clon;<br />
</code></p>
<p>Hasta aquí contamos con un arreglo de elementos, además de que se ha creado una variable llamada clon, la cual no contiene nada por ahora, esta variable clon lo que contendrá es una copia del elemento mover y se le modificará su propiedad de la transparencia, todo esto se realizará cuando se le presiona el Mouse sobre el elemento mover.</p>
<p>El pseudo código es el siguiente:</p>
<p><code lang="javascript"><br />
$('mover').addEvent('mousedown',function(event){<br />
	//detenemos la propagación del evento<br />
	//si no existe una instancia del clon, se copia el elemento mover<br />
	//asignamos las mismas coordenadas al clon del objeto mover<br />
	//agregamos el clon al dom<br />
	//le asignamos una opacidad al clon del 70%<br />
	//hacemos al clon dragable e iniciamos el evento manualmente<br />
	//asignamos el evento emptydrop al clon, el cual se ejecuta cuando<br />
	      //se ha soltado el clon fuera de los elementos dropables, de esta manera<br />
	      //podemos desaparecer al clon cuando se suelta en un lugar no deseado.<br />
}});<br />
</code></p>
<p>Esto en javascript se escribe de la siguiente manera:</p>
<p><code lang="javascript"><br />
$('mover').addEvent('mousedown',function(event){<br />
	event = new Event(event).stop();<br />
	if(!$chk(clon)) clon = this.clone();<br />
	clon.setStyles(this.getCoordinates());<br />
	clon.inject(document.body);<br />
	clon.setStyle('opacity',0.7);<br />
	clon.makeDraggable({droppables:drops}).start(event);<br />
	clon.addEvent('emptydrop',function(){<br />
		if($chk(clon)){ clon.remove(); clon= null;}<br />
	});<br />
});<br />
</code></p>
<p>Lo único importante para comentar, es prestar atención a la función <strong>makeDraggable</strong>, pues esta es la responsable de que los elementos se puedan arrastrar en el documento, además, dentro de las opciones que se le pasan esta la de <strong>droppables</strong>, la cual es el arreglo de elementos en los que puede ser soltado el elemento que estamos arrastrando.</p>
<p>Lo que sigue es programar los eventos para los elementos dropables, los cuales son tres, el <strong>over</strong>, que se ejecuta cuando el elemento que se esta arrastrando esta sobre el elemento en cuestión, el <strong>leave</strong>, que se ejecuta cada vez que el elemento que se esta arrastrando sale del elemento en cuestión, y el mas importante, el <strong>drop</strong> se ejecuta cuando el elemento que se esta arrastrando es soltado sobre el elemento en cuestión.</p>
<p>Con esto en mente codificamos lo siguiente</p>
<p><code lang="javascript"><br />
drops.setStyle('opacity',0.7);<br />
drops.each(function(drop){<br />
	var fx = new Fx.Styles(drop, {duration:300, wait:false});<br />
	drop.addEvent('drop',function(){<br />
		if($chk(clon)){ clon.remove(); clon= null;}<br />
		this.setStyle('background-image','url(boteLleno.png)');<br />
	});<br />
	drop.addEvent('over',function(){<br />
		fx.start({'opacity':1});<br />
	});<br />
	drop.addEvent('leave',function(){<br />
		fx.start({'opacity':0.7});<br />
	});<br />
});<br />
</code></p>
<p>Primero se ponen con opacidad en 70%, luego se itera el arreglo y a cada elemento se le asigna los eventos de los que he hablado anteriormente (drop, over, leave), en los eventos leave y over, únicamente se cambia la opacidad mediante una transición, esto es gracias a la clase Fx.Styles, y en el evento drop se verifica que exista una instancia del clon, de ser así se elimina, luego se cambia la imagen del bote vacío por el bote lleno.</p>
<p>Pues esto es todo, realmente sencillo, espero que todo este claro, a continuación pongo el código completo del ejemplo, simplemente copia y pega.</p>
<p><code lang="html"><br />
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"<br />
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"></p>
<p><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es"><br />
<head><br />
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/></p>
<p><script type="text/javascript" src="mootools-release-1.11.js"></script></p>
<style type="text/css">
html,body{
	text-align:center;
}
#mover{
	width:64px;
	height:64px;
	background-image:url(folder.png);
}
#cubos{
	width:400px;
	margin:100px auto;
}
.drop{
	float:left;
	margin:3px;
	width:128px;
	height:128px;
	background-image:url(boteBacio.png);
}
</style>
<p></head></p>
<p><body></p>
<div id="mover"></div>
<div id="cubos">
<div class="drop"></div>
<div class="drop"></div>
<div class="drop"></div>
<div class="drop"></div>
</div>
<p><script type="text/javascript">
var drops = $$('#cubos .drop');
var clon;</p>
<p>$('mover').addEvent('mousedown',function(event){
	event = new Event(event).stop();
	if(!$chk(clon)) clon = this.clone();
	clon.setStyles(this.getCoordinates());
	clon.inject(document.body);
	clon.setStyle('opacity',0.7);
	clon.makeDraggable({droppables:drops}).start(event);
	clon.addEvent('emptydrop',function(){
		if($chk(clon)){ clon.remove(); clon= null;}
	});
});</p>
<p>drops.setStyle('opacity',0.7);
drops.each(function(drop){
	var fx = new Fx.Styles(drop, {duration:300, wait:false});
	drop.addEvent('drop',function(){
		if($chk(clon)){ clon.remove(); clon= null;}
		this.setStyle('background-image','url(boteLleno.png)');
	});
	drop.addEvent('over',function(){
		fx.start({'opacity':1});
	});
	drop.addEvent('leave',function(){
		fx.start({'opacity':0.7});
	});
});
</script><br />
</body><br />
</html><br />
</code></p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.crysfel.com/2007/10/31/drag-and-drop-con-mootools/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Ordenar una lista (Drag And Drop)</title>
		<link>http://www.crysfel.com/2007/07/12/ordenar-una-lista-drag-and-drop/</link>
		<comments>http://www.crysfel.com/2007/07/12/ordenar-una-lista-drag-and-drop/#comments</comments>
		<pubDate>Thu, 12 Jul 2007 23:32:16 +0000</pubDate>
		<dc:creator>Crysfel</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.crysfel.com/index.php/2007/07/12/ordenar-una-lista-drag-and-drop/</guid>
		<description><![CDATA[El tutorial del día de hoy consta de realizar una lista de imágenes sorteable, en otras palabras, voy a mostrar como poder ordenar una lista de imágenes, con mootools esto es extremadamente sencillo, a continuación se muestra un ejemplo del tutorial terminado.









 var lista2 = new Sortables($("ordenarLista"));
 function getOrdenLista2(){
 	alert(lista2.serialize(function(el){
			return el.id.substring(el.id.indexOf("_")+1)
		})
	);
 }


Que de beneficio tiene [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>El tutorial del día de hoy consta de realizar una lista de imágenes sorteable, en otras palabras, voy a mostrar como poder ordenar una lista de imágenes, con mootools esto es extremadamente sencillo, a continuación se muestra un ejemplo del tutorial terminado.</p>
<div style="margin:0px 50px">
<ul id="ordenarLista">
<li id="id_10"><img src="http://www.crysfel.com/common/ejemplos/ordenarLista/tux1.png" alt="Tux" /></li>
<li id="id_15"><img src="http://www.crysfel.com/common/ejemplos/ordenarLista/tux2.png" alt="Tux" /></li>
<li id="id_18"><img src="http://www.crysfel.com/common/ejemplos/ordenarLista/tux3.png" alt="Tux" /></li>
<li id="id_20"><img src="http://www.crysfel.com/common/ejemplos/ordenarLista/tux4.png" alt="Tux" /></li>
</ul>
<input type="button" onclick="getOrdenLista2()" value="Mostrar orden" style="width:auto" />
<script type="text/javascript">
 var lista2 = new Sortables($("ordenarLista"));
 function getOrdenLista2(){
 	alert(lista2.serialize(function(el){
			return el.id.substring(el.id.indexOf("_")+1)
		})
	);
 }
</script>
</div>
<p>Que de beneficio tiene esto, pues imagínate que tienes en tu base de datos imágenes de productos de una tienda de aparatos electrónicos, y para cada aparato tienes una serie de imágenes, las cuales deben tener un orden, si las fuiste metiendo en orden pues que padre no, pero ¿que sucede si te equivocas? O si quieres que los usuarios mismos puedan elegir el orden en que aparezcan las imágenes, fácil, creas un campo en la tabla de imágenes donde introduzcas el orden de las imágenes, haces un Query trayéndolas ordenadas ascendentemente por medio de ese campo, pero para que los usuarios las ordenes debes ponerles una interfase fácil, pues si les pones una cajita y que ellos mismos introduzcan el numero de orden, para cada imagen, ¡imagínate! Muchos errores se ocasionaría, para estos casos es que es útil esta interfase, y a continuación muestro como hacerla.</p>
<p><span id="more-35"></span></p>
<p>Primero bajamos la <a href="http://mootools.net/download">librería de moootols</a>, donde únicamente seleccionamos en la sección de <strong>plugins</strong>, la clase <strong>Sortables</strong> inmediatamente se seleccionan automáticamente todas sus dependencias, luego descargamos el archivo.</p>
<p>Lo importas a tu documento</p>
<p><code lang="javascript"><br />
<script type="text/javascript" src="mootools.v1.11.js"></script><br />
</code></p>
<p>Ahora lo siguiente es crear la lista de los elementos a ordenar, la cual puede quedar de la siguiente manera.</p>
<p><code lang="html"></p>
<ul id="lista1">
<li>item 1</li>
<li>item 2</li>
<li>item 3</li>
<li>item 4</li>
</ul>
<p></code></p>
<p>Ahora se crea una instancia de la clase Sortable pasándole como parámetro la lista que se quiere ordenar, esto quedaría de la siguiente manera.</p>
<p><code lang="javascript"><br />
var lista1 = new Sortables($('lista1'));<br />
</code></p>
<p>Con esa simple instrucción ya se puede comenzar a ordenar la lista dando clic sobre el elemento y desplazándolo hacia arriba o debajo de la lista.</p>
<p>Ahora, lo siguiente es poder obtener los valores de la lista resultante después de la ordenación, para eso hacemos una función y la invocamos en el lugar donde necesitemos saber dicho dato.</p>
<p><code lang="javascript"><br />
function getOrdenLista1(){</p>
<p> 	alert(lista1.serialize());</p>
<p> }<br />
</code></p>
<p>El método serialize se encarga de regresarnos un arreglo de cómo es que se encuentran ordenados los ítems, en un principio automáticamente enumera los ítems de 0-n, en forma ascendente, al ejecutar este método regresa el estado actual de los índices.</p>
<p>Ahora mostrare otro ejemplo, el de imágenes, y tomando en cuenta el ID proveniente de una base de datos y de esta manera recoger los IDs en el orden que se hallan modificado por el usuario, para esto usaremos la siguiente lista.</p>
<p><code lang="html"></p>
<ul id="lista2">
<li id="id_10"><img src="images/tux1.png" alt="Tux" /></li>
<li id="id_15"><img src="images/tux2.png" alt="Tux" /></li>
<li id="id_18"><img src="images/tux3.png" alt="Tux" /></li>
<li id="id_20"><img src="images/tux4.png" alt="Tux" /></li>
</ul>
<p></code></p>
<p>Si te has dado cuenta le he agregado un ID a cada <strong>&lt;li&gt;</strong> de la lista a ordenar, como valor le he puesto id_n donde n es el id de la imagen en la base de datos, es importante mencionar que es necesario ponerle un prefijo al numero id de la base de datos, esto por que no podemos declarar un ID en XHTML de tipo numérico, forzosamente tiene que ser una palabra, con esto en mente se crea la instancia de la clase Sortable para esta lista.</p>
<p><code lang="javascript"><br />
var lista2 = new Sortables($('lista2'));<br />
</code></p>
<p>El siguiente paso es crear la función que regresara el arreglo de IDs después de cada ordenación que se haga, para esto usaremos el mismo método que se utilizo anteriormente, solo que con una pequeña diferencia.</p>
<p><code lang="javascript"><br />
 function getOrdenLista2(){<br />
 	alert(lista2.serialize(function(el){<br />
			return el.id.substring(el.id.indexOf('_')+1)<br />
		})<br />
	);<br />
 }<br />
</code></p>
<p>La única diferencia es que se le esta pasando como parámetro una función, la cual remplazara a la función default, con esta función nosotros tomamos el ID de cada elemento y le quitamos el prefijo, regresando así solo el ID correspondiente de cada imagen con la base de datos.</p>
<p>Pues si, eso ha sido todo, ¿fácil verdad? Bueno, lo siguiente seria enviar mediante AJAX la lista ordenada al servidor y guardarla en la base de datos, para utilizar AJAX te sugiero leer  <a href="http://www.crysfel.com/index.php/2007/05/08/peticiones-post-con-ajax/">Peticiones Post con Ajax</a> en este mismo blog.</p>
<p>Aquí esta el código completo de este tutorial.</p>
<p><code lang="javascript"><br />
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"<br />
        "http://www.w3.org/TR/xhtml1/DTD/xhtml-strict.dtd"></p>
<p><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es"><br />
<head><br />
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1;" /></p>
<p><script type="text/javascript" src="mootools.v1.11.js"></script><br />
</head><br />
<body></p>
<ul id="lista1">
<li>item 1</li>
<li>item 2</li>
<li>item 3</li>
<li>item 4</li>
</ul>
<ul id="lista2">
<li id="id_10"><img src="images/tux1.png" alt="Tux" /></li>
<li id="id_8"><img src="images/tux2.png" alt="Tux" /></li>
<li id="id_25"><img src="images/tux3.png" alt="Tux" /></li>
<li id="id_13"><img src="images/tux4.png" alt="Tux" /></li>
</ul>
<input type="button" onclick="getOrdenLista2()" value="Inspec" />
<p><script type="text/javascript">
 var lista1 = new Sortables($('lista1'));
 function getOrdenLista1(){
 	alert(lista1.serialize());
 }</p>
<p> var lista2 = new Sortables($('lista2'));
 function getOrdenLista2(){
 	alert(lista2.serialize(function(el){
			return el.id.substring(el.id.indexOf('_')+1)
		})
	);
 }</p>
<p></script><br />
</body><br />
</html><br />
</code></p>
<p>Hasta la próxima!</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.crysfel.com/2007/07/12/ordenar-una-lista-drag-and-drop/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Visor de imagenes</title>
		<link>http://www.crysfel.com/2007/07/11/visor-de-imagenes/</link>
		<comments>http://www.crysfel.com/2007/07/11/visor-de-imagenes/#comments</comments>
		<pubDate>Wed, 11 Jul 2007 20:42:46 +0000</pubDate>
		<dc:creator>Crysfel</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.crysfel.com/index.php/2007/07/11/visor-de-imagenes/</guid>
		<description><![CDATA[El día de hoy quiero mostrar como hacer un visor de imágenes, con esta interfase es suficiente para realizar una galería, claro esta que esto es solo la GUI, el backend dependerá de las necesidades de cada proyecto en especifico.
Para que te des una idea de lo que mostrare en este tutorial, puedes ver el [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>El día de hoy quiero mostrar como hacer un visor de imágenes, con esta interfase es suficiente para realizar una galería, claro esta que esto es solo la GUI, el backend dependerá de las necesidades de cada proyecto en especifico.</p>
<p>Para que te des una idea de lo que mostrare en este tutorial, puedes ver el siguiente ejemplo.<br />
<script type="text/javascript" src="http://www.crysfel.com/common/ejemplos/visor/visor.js"></script><br />
<script type="text/javascript">
var visor = new VisorImagenes();
window.addEvent("domready", function(){
	visor.constructor();
});
</script><br />
<a href="http://www.crysfel.com/common/img/visor/01.jpg" onClick="visor.aparece(this.href,'Foto ganadora en National Geographic 2006'); return false;"><img src="http://www.crysfel.com/common/ejemplos/visor/tns/01.jpg" alt="imagen1" style="border:0px;margin:5px; 0px" /></a><a href="http://www.crysfel.com/common/img/visor/02.jpg" onClick="visor.aparece(this.href,'Sonrrisa sincera'); return false;"><img src="http://www.crysfel.com/common/ejemplos/visor/tns/02.jpg" alt="imagen2" style="border:0px;margin:5px 35px;" /></a><br />
<a href="http://www.crysfel.com/common/img/visor/03.jpg" onClick="visor.aparece(this.href,'Tranquilidad absoluta'); return false;"><img src="http://www.crysfel.com/common/ejemplos/visor/tns/03.jpg" alt="imagen3" style="border:0px;margin:5px;" /></a><a href="http://www.crysfel.com/common/img/visor/04.jpg" onClick="visor.aparece(this.href,'Camino al cielo'); return false;"><img src="http://www.crysfel.com/common/ejemplos/visor/tns/04.jpg" alt="imagen4" style="border:0px;margin:5px 10px;" /></a></p>
<p>¿Interesante no?, realizarlo es muy sencillo, así que para comenzar es necesario descargar la última <a href="http://mootools.net/download">versión de mootools (v1.11)</a> e importarla a tu documento, pues es indispensable para este tutorial.</p>
<p><span id="more-34"></span></p>
<p><code lang="javascript"><br />
<script type="text/javascript" src="mootools.v1.11.js"></script><br />
</code></p>
<p>Ahora bien,  lo primero es crear una clase (VisorImagenes), la cual contiene los métodos y propiedades necesarios para visualizar las imágenes.</p>
<p><code lang="javascript"><br />
function VisorImagenes(){<br />
	this.file;<br />
	this.img;</p>
<p>	//Crear la estructura visual<br />
	this.constructor = function(){}</p>
<p>	//Mostrar el visor<br />
	this.aparece = function(f,t){}</p>
<p>	//Cargar la imagen a mostrar<br />
	this.cargaImagen = function(){}</p>
<p>	//Redimensionar el contenedor de la imagen<br />
	this.redimensionar = function(){}<br />
}<br />
</code></p>
<p>Hasta este punto solo cree la estructura de la clase, esto es una especie de prototipo con el fin de visualizar cada paso de este tutorial, file es la url donde se encuentra la imagen a mostrar, img es una referencia al nodo donde se encuentra la imagen en el documento, y los métodos creo que es suficiente el comentario de estos en el código.</p>
<p>Una vez claros en la construcción de esta aplicación es hora de crear la estructura visual, para esto es necesario crear los elementos y agregárselos al body como hijos,aclaro una vez mas que este método simplemente hace la estructura del visor de imágenes al igual que el CSS necesario, a continuación se muestra el pseudo código del método y mas adelante se codifica.</p>
<p><code lang="javascript"><br />
this.constructor = function(){<br />
	//Crear el nodo principal cvrVisor (
<div>)<br />
	//Crear el nodo  para el fondo obscuro (
<div>)<br />
	//Crear el nodo contenedor de la imagen y el texto (
<div>)<br />
	//Crear el nodo de salida del visor (<a>)<br />
	//Crear el nodo para la imagen (<img>)<br />
	//Crear el nodo para el texto (
<p>)<br />
	//Asignar coordenadas centrales al contenedor de la imagen y texto<br />
	//Hacer las asignaciones de los nodos creados anteriormente<br />
	//Agregar el arbol que creamos anteriormente al body del documento<br />
}<br />
</code></p>
<p>Primeramente hay que crear el elemento principal, asignándole como id cvrVisor, su función es agrupar todos los elementos necesarios, sus dimensiones son todo el ancho de la pantalla y todo el largo también, esto que he comentado se resume en</p>
<p><code lang="javascript"><br />
var panel = new Element('div', {<br />
		'styles': {<br />
		'position': 'absolute',<br />
		'top':'0px',<br />
		'left':'0px',<br />
		'width': '100%',<br />
		'height':  window.getScrollHeight()+'px'<br />
	},<br />
	id:'cvrVisor'<br />
});<br />
</code></p>
<p>La clase <strong>Element</strong> crea un nodo o elemento XHTML y lo pone en memoria, es importante señalar que no esta dentro del DOM todavía, simplemente es un nodo perdido en la memoria, es por eso que hacemos una referencia a este con la variable panel, como primer parámetro en el constructor se pasa el elemento XHTML que quieres crear, en este caso un div, el segundo argumento o parámetro es un objeto con propiedades, en este objeto se le pueden pasar eventos, estilos, el ID que le queramos asignar, entre muchas cosas mas, claro esta que estos parámetros son opcionales, si quieres saber mas al respecto te recomiendo darle un vistazo a la http://docs.mootools.net/Native/Element.js documentación en mootools. Lo unico que hicimos anteriormente fue crear una capa con ID cvrVisor, que ocupa toda la pantalla, este elemento es el padre de todos los elementos que continúan.</p>
<p>Siguiendo con el pseudo código es hora de hacer el fondo de color negro que es del mismo tamaño del elemento anterior, la relación se hará mas adelante, por ahora solo se crea en memoria y se guarda la referencia en la variable fondo, no comentare sobre el CSS aplicado pues este tutorial no es sobre CSS, si tienes conocimientos sobre CSS entenderás el porque de esto, si no pues solo te queda creerme por fe o googlear un poco.</p>
<p><code lang="javascript"><br />
var fondo = new Element('div', {<br />
		'styles': {<br />
		'position': 'relative',<br />
		'width': '100%',<br />
		'height': '100%',<br />
		'background-color': '#000'<br />
	},<br />
	'id':'cvrFondo'<br />
});<br />
</code></p>
<p>Ahora se crea el elemento que contiene la imagen y el texto, inicialmente será de 100&#215;100, color blanco y contendrá como fondo una imagen centrada de el cargador, esto con el fin de mostrar al usuario que la imagen se esta cargando, cuando la imagen aparece el cargador queda oculto.</p>
<p><code lang="javascript"><br />
var cont = new Element('div', {<br />
	'styles': {<br />
		'position': 'absolute',<br />
		'top': '0px',<br />
		'left':  '0px',<br />
		'width': '100px',<br />
		'height':  '100px',<br />
		'background-color': '#fff',<br />
		'padding': '5px',<br />
		'background-image': 'url(cargador.gif)',<br />
		'background-repeat': 'no-repeat',<br />
		'background-position': 'center'<br />
	},<br />
	'id':'cvrContenedor'<br />
});<br />
</code></p>
<p>Es hora de crear el botón de salida, lo interesante aquí es que ahora agregamos un evento, se trata de cuando se de clic sobre el link, este desaparezca lentamente el fondo y el visor, además de que por medio de CSS se ha posicionado sobre toda la pantalla este botón de salida, al final se le agrega el texto ‘salir’.</p>
<p><code lang="javascript"><br />
var salir = new Element('a', {<br />
	'title':'Clic para salir',<br />
	'styles': {<br />
		'display': 'block',<br />
		'width': '99.9%',<br />
		'height':  '99.8%'<br />
	},<br />
	'events': {<br />
		'click': function(){<br />
			new Fx.Style($('cvrFondo'), 'opacity',{duration:500,onComplete:function(){$('cvrVisor').style.display = "none";}}).start(0.7,0);<br />
			return false;<br />
		}<br />
	}<br />
});<br />
salir.setText('Salir');<br />
</code></p>
<p>Se crea la imagen, esto no tiene nada especial, solo comentar que no se le esta poniendo el recurso, pues se le asignara dinamicante dependiendo de la imagen que se quiera mostrar.</p>
<p><code lang="javascript"><br />
var img = new Element('img', {<br />
	'styles': {<br />
		'margin': '0px'<br />
	},<br />
	'id':'cvrImagen'<br />
});<br />
</code></p>
<p>Por ultimo se crea el contenedor del texto, el cual contendrá la descripción de la imagen mostrada.</p>
<p><code lang="javascript"><br />
var p = new Element('p', {<br />
	'styles': {<br />
		'margin': '0px',<br />
		'padding': '0px'<br />
	},<br />
	'id':'cvrDescripcion'<br />
});<br />
</code></p>
<p>Ya tenemos todos los elementos necesarios en memoria, pero no los hemos asignado al DOM, así que los siguientes pasos son relacionar los elementos que se han creado y asignárselos al DOM, en este caso como hijos del body, el código esta comentado para mejor entendimiento.</p>
<p><code lang="javascript"><br />
//Se le asigna 70% de opacidad al fondo y se posiciona en el centro de la pantalla<br />
new Fx.Style(fondo, 'opacity').set(0);<br />
cont.style.top = window.getScrollTop() + window.getHeight()/2 - 50 - 15 +"px";<br />
cont.style.left = window.getWidth()/2 - 50 + "px";</p>
<p>// Se agrega la imagen y el texto al contendor de estos<br />
cont.appendChild(img);<br />
cont.appendChild(p);</p>
<p>//Se le agrega el boton salir al fondo<br />
fondo.appendChild(salir);</p>
<p>//Se agrega el fondo y el contenedor de la imagen y texto al visor<br />
panel.appendChild(fondo);<br />
panel.appendChild(cont);</p>
<p>//Se desaparece el visor, esto da como consecuencia<br />
//que todos sus hijos desaparezcan con el<br />
panel.style.display = 'none';</p>
<p>//Se agrega al DOM, en este caso al body<br />
document.body.appendChild(panel);<br />
</code></p>
<p>Hasta este punto ya esta en el DOM la estructura necesaria para el visor, esta estructura es semejante a esto</p>
<p><code lang="html"></p>
<div id="cvrVisor" style="position: absolute; top: 0px; left: 0px; width: 100%; height: 837px; display: none;">
<div id="cvrFondo" style="position: relative; width: 100%; height: 100%; background-color: rgb(0, 0, 0); visibility: hidden; opacity: 0;">
		<a style="display: block; width: 99.9%; height: 99.8%;" href="#">Salir</a>
	</div>
<div id="cvrContenedor" style="padding: 5px; position: absolute; top: 146px; left: 664px; width: 335px; height: 525px; background-color: rgb(255, 255, 255); background-image: url(cargador.gif); background-repeat: no-repeat; background-position: center;">
		<img id="cvrImagen" title="Imagen" style="visibility: visible;"/></p>
<p id="cvrDescripcion" style="margin: 0px; padding: 0px;">
</p></div>
</div>
<p></code></p>
<p>Se ha logrado lo que se buscaba, pues ay tenemos listo los elementos necesarios, ahora es necesario programar los efectos respectivos, lo que sigue ahora es programar el método aparece, de la clase que definimos anteriormente, este método recibe dos parámetros, la url de la imagen a cargar, y la descripción de la misma, el siguiente es el pseudo código de lo que se codificara.</p>
<p><code lang="javascript"><br />
this.aparece = function(f,t){<br />
	//Se asigna a la variable file la url actual<br />
	//Se pone visible el visor de imágenes<br />
	//Se hace la animación de fade in<br />
	//Se asigna la descripción al elemento<br />
	//Se carga la imagen<br />
}<br />
</code></p>
<p>Esto, codificado, queda de la siguiente manera</p>
<p><code lang="javascript"><br />
this.aparece = function(f,t){<br />
	this.file = f;<br />
	$('cvrVisor').style.display = 'block';<br />
	var f = new Fx.Style('cvrFondo', 'opacity',{duration:500});<br />
	f.set(0);<br />
	f.start(0,0.7);<br />
	$('cvrDescripcion').setText(t);<br />
	this.cargaImagen();<br />
}<br />
</code></p>
<p>Lo único interesante es notar que la le estamos asignando 500 milisegundos a la animación, esta animación se la estamos aplicando al elemento con ID cvrFondo, la opacidad va de 0 a 0.7, esto es el 70% de la opacidad, la función cargaIMagen se describe a continuación.</p>
<p><code lang="javascript"><br />
this.cargaImagen = function(){<br />
	$('cvrImagen').style.visibility = 'hidden';<br />
	img = new Asset.image(this.file, {id: 'cvrImagen', title:'Imagen', onload: this.redimensionar});<br />
}<br />
</code></p>
<p>Lo que se esta haciendo aquí es ocultar la imagen, al hacer esto es posible ver el cargador en el fondo del contenedor, después cargamos la imagen con la clase Asset, la cual mediante el método image indica cuando ha terminado la carga, de esta manera cuando termine la carga se dispara el método redimensionar el cual analizaremos con mas detalle por se un poco mas interesante.</p>
<p><code lang="javascript"><br />
this.redimensionar = function(){<br />
	//Se remplaza la nueva imagen por la anterior<br />
	$('cvrImagen').replaceWith(img);<br />
	//Se oculta para hacer la animacion de redimension<br />
	$('cvrImagen').style.visibility = 'hidden';</p>
<p>	//Se crea la animacion sobre el elemento cvrContenedor,<br />
//al termino se hace visible la imagen<br />
	var efecto = new Fx.Styles('cvrContenedor', {duration: 500,transition: Fx.Transitions.linear,onComplete: function(){$('cvrImagen').style.visibility = 'visible';}});</p>
<p>	//Se inicia la animacion, modificando las siguientes propiedades<br />
	efecto.start({<br />
	    	'width': img.getSize().size.x,<br />
	    	'height': img.getSize().size.y + 25,<br />
	    	'top': window.getScrollTop() + window.getHeight()/2 - img.getSize().size.y/2 - 15,<br />
		'left': window.getWidth()/2 - img.getSize().size.x/2<br />
	});<br />
}<br />
</code></p>
<p>Lo interésate aquí, es que podemos modificar mas de una propiedad de los elementos al mismo tiempo, para eso se utiliza la Styles, a diferencia de la clase Style, esta puede modificar simultáneamente las propiedades que se le definan, en este caso se modificaron cuatro propiedades, el ancho, alto, coordenada en x y coordenada en y, para saber las nuevas posiciones y tamaños, es necesario saber las dimensiones de la nueva imagen, para esto simplemente accedamos mediante img.getSize().size.x para el width, donde img es la referencia al nodo que se ha cargado recientemente, el cual contiene esa información, de la misma manera para el height cambiando únicamente x por y, una vez que se saben las dimensiones de la imagen, se puede calcular fácilmente las coordenadas donde debe quedar centrada, para esto es necesario saber el ancho de la pantalla del usuario, así como el alto, luego unas simples restas de la mitad de todos los datos y listo, el contenedor queda en el centro de la pantalla.</p>
<p>Por ultimo se tiene que crear una instancia de esta clase.</p>
<p><code lang="javascript"><br />
var visor = new VisorImagenes();</p>
<p>window.addEvent('domready', function(){<br />
	visor.constructor();<br />
});<br />
</code></p>
<p>Lo que se esta haciendo aquí, es crear la instancia, y luego agregar un evento, este evento se dispara cuando el DOM esta listo, es decir que ya se puede comenzar a trabajar con el, esto es muy util pues no se tiene que esperar a que se carguen todas las imágenes del sitio para comenzar a trabajar, al momento de dispararse el evento, lo que se hace es ejecutar el metodo constructor de la clase VisorImagenes.</p>
<p>Para mostrar una imagen es necesario poner dentro de un boton o un link una llamada al metodo aparecer, con sus respectivos datos.</p>
<p><code lang="javascript"><br />
<a href="01.jpg" onClick="visor.aparece(this.href,'Foto ganadora en National Geographic 2006'); return false;">imagen 1</a><br />
<a href="02.jpg" onClick="visor.aparece(this.href,'Sonrrisa sincera'); return false;">imagen 2</a><br />
<a href="03.jpg" onClick="visor.aparece(this.href,'Tranquilidad absoluta'); return false;">imagen 3</a><br />
<a href="04.jpg" onClick="visor.aparece(this.href,'Camino al cielo'); return false;">imagen 4</a><br />
</code></p>
<p>Si te has dado cuenta, los links son accesibles aún si el usuario tiene desactivado el javascript, la única diferencia es que nuestro visor de imágenes no funcionara, pero se vera la imagen de todas formas.</p>
<p>A continuación expongo el código completo para que copies y pegues en un documento html <img src='http://www.crysfel.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><code lang="javascript"><br />
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"<br />
        "http://www.w3.org/TR/xhtml1/DTD/xhtml-strict.dtd"></p>
<p><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es"><br />
<head><br />
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1;" /></p>
<p>	<script type="text/javascript" src="mootools.v1.11.js"></script></p>
<style type="text/css">
html,body{
	margin:0px;
	padding:0px;
	align:center;
	height:100%;
	background-color:#ddd;
}
#frame{
	margin:0px auto;
	padding:0px;
	width:800px;
	min-height:100%;
	align:left;
	background-color:#fff;
}</p>
<p>*html frame{
	height:100%;
}</p>
</style>
<p><script type="text/javascript"></p>
<p>var visor = new VisorImagenes();</p>
<p>window.addEvent('domready', function(){
	visor.constructor();
});</p>
<p>function VisorImagenes(){
	this.file;
	this.img;</p>
<p>	this.constructor = function(){
		var panel = new Element('div', {
			'styles': {
				'position': 'absolute',
				'top':'0px',
				'left':'0px',
				'width': '100%',
				'height':  window.getScrollHeight()+'px'
			},
			id:'cvrVisor'
		});</p>
<p>		var fondo = new Element('div', {
			'styles': {
				'position': 'relative',
				'width': '100%',
				'height': '100%',
				'background-color': '#000'
			},
			'id':'cvrFondo'
		});</p>
<p>		var cont = new Element('div', {
			'styles': {
				'position': 'absolute',
				'top': '0px',
				'left':  '0px',
				'width': '100px',
				'height':  '100px',
				'background-color': '#fff',
				'padding': '5px',
				'background-image': 'url(cargador.gif)',
				'background-repeat': 'no-repeat',
				'background-position': 'center'
			},
			'id':'cvrContenedor'
		});
		var salir = new Element('a', {
			'title': 'Click para salir',
			'styles': {
				'display': 'block',
				'width': '99.9%',
				'height':  '99.8%'
			},
			'events': {
				'click': function(){
					new Fx.Style($('cvrFondo'), 'opacity',{duration:500,onComplete:function(){$('cvrVisor').style.display = "none";}}).start(0.7,0);
					return false;
				}
			}
		});
		salir.setText('Salir');
		var img = new Element('img', {
			'styles': {
				'margin': '0px'
			},
			'id':'cvrImagen'
		});</p>
<p>		var p = new Element('p', {
			'styles': {
				'margin': '0px',
				'padding': '0px'
			},
			'id':'cvrDescripcion'
		});
		new Fx.Style(fondo, 'opacity').set(0);</p>
<p>		cont.style.top = window.getScrollTop() + window.getHeight()/2 - 50 - 15 +"px";
		cont.style.left = window.getWidth()/2 - 50 + "px";</p>
<p>		cont.appendChild(img);
		cont.appendChild(p);
		fondo.appendChild(salir);
		panel.appendChild(fondo);
		panel.appendChild(cont);
		panel.style.display = 'none';
		document.body.appendChild(panel);
	}</p>
<p>	this.aparece = function(f,t){
		this.file = f;
		$('cvrVisor').style.display = 'block';
		var f = new Fx.Style('cvrFondo', 'opacity',{duration:500});
		f.set(0);
		f.start(0,0.7);
		$('cvrDescripcion').setText(t);
		this.cargaImagen();
	}</p>
<p>	this.cargaImagen = function(){
		$('cvrImagen').style.visibility = 'hidden';
		img = new Asset.image(this.file, {id: 'cvrImagen', title:'Imagen', onload: this.redimensionar});
	}</p>
<p>	this.redimensionar = function(){
		$('cvrImagen').replaceWith(img);
		$('cvrImagen').style.visibility = 'hidden';</p>
<p>		var efecto = new Fx.Styles('cvrContenedor', {duration: 500,transition: Fx.Transitions.linear,onComplete: function(){$('cvrImagen').style.visibility = 'visible';}});
		efecto.start({
		    	'width': img.getSize().size.x,
		    	'height': img.getSize().size.y + 25,
		    	'top': window.getScrollTop() + window.getHeight()/2 - img.getSize().size.y/2 - 15,
			'left': window.getWidth()/2 - img.getSize().size.x/2
		});
	}</p>
<p>}</p>
<p></script><br />
</head><br />
<body></p>
<div id="frame">
<p>		<a href="01.jpg" onClick="visor.aparece(this.href,'Foto ganadora en National Geographic 2006'); return false;">imagen 1</a><br />
		<a href="02.jpg" onClick="visor.aparece(this.href,'Sonrrisa sincera'); return false;">imagen 2</a><br />
		<a href="03.jpg" onClick="visor.aparece(this.href,'Tranquilidad absoluta'); return false;">imagen 3</a><br />
		<a href="04.jpg" onClick="visor.aparece(this.href,'Camino al cielo'); return false;">imagen 4</a></p>
</div>
<p></body><br />
</html><br />
</code></p>
<p>Pues bien, esto ha sido todo, espero pueda servirte, actualmente planeo realizar un plugin para wordpress y de esta manera poder integrar una galería de imágenes, esto para un proyecto que estoy desarrollando.</p>
<p>Antes de terminar quiero agradecer al <a href="http://flickr.com/photos/ichaka/">chaka</a> por proporcionar las imágenes de muestra <img src='http://www.crysfel.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Hasta la próxima!!</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.crysfel.com/2007/07/11/visor-de-imagenes/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Carrusel de imagenes</title>
		<link>http://www.crysfel.com/2007/05/02/carrusel-de-imagenes/</link>
		<comments>http://www.crysfel.com/2007/05/02/carrusel-de-imagenes/#comments</comments>
		<pubDate>Wed, 02 May 2007 15:09:29 +0000</pubDate>
		<dc:creator>Crysfel</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.crysfel.com/index.php/2007/05/02/carrusel-de-imagenes/</guid>
		<description><![CDATA[Hoy quiero mostrar un poco de lo que se puede hacer con mootools, se trata de un carrusel de imágenes, muy sencillo, puedes ver el ejemplo para que me entiendas mejor.

function Animacion(base,max){
	this.base = base;
	this.cont = 1;
	this.img1 = true;
	this.maximo = max;
	this.inicia = function(){
		(function(){
			//se incrementa el contador
			this.cont++;
			//al llegar al maximo la animacion se inicia
			if(this.cont > this.maximo)
				this.cont = [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>Hoy quiero mostrar un poco de lo que se puede hacer con mootools, se trata de un carrusel de imágenes, muy sencillo, puedes ver el ejemplo para que me entiendas mejor.</p>
<p><script type="text/javascript">
function Animacion(base,max){
	this.base = base;
	this.cont = 1;
	this.img1 = true;
	this.maximo = max;
	this.inicia = function(){
		(function(){
			//se incrementa el contador
			this.cont++;
			//al llegar al maximo la animacion se inicia
			if(this.cont > this.maximo)
				this.cont = 1;
			var im = "img1";
			var prefix = this.cont+".jpg";
			if(this.cont<10)
				prefix = "0"+this.cont+".jpg";
			if(this.img1){
				this.img1 = false;
				im = "img2";
			}else
				this.img1 = true;
			//se asigna la nueva imagen a la capa que no se esta viendo
			$(im).style.backgroundImage = "url("+this.base+"/"+prefix+")";
			//se desaparece la capa con la nueva imagen
			new Fx.Style(im, "opacity").set(0);
			//esta funcion espera un segundo antes de ahcer la transición
			(function(){
				//crea el efecto para las dos capas
				var x = new Fx.Style("img1", "opacity");
				var y = new Fx.Style("img2", "opacity");
				//aparece y desaparece las capas
				if(this.img1){
					x.start(0,1);
					y.start(1,0);
				}else{
					x.start(1,0);
					y.start(0,1);
				}
			 }
			).delay(1000,this);
		 }
		//Este es el temporizador, se ejecutará cada tres segundos
		).periodical(3000,this);
	}
}
</script></p>
<div id="contenedor" style="position:relative;width:100%;">
<div id="img1" style="width:420px;height:294px;background-image:url(http://www.crysfel.com/ejemplos/carrusel/01.jpg);"></div>
<div id="img2" style="position:absolute;top:0px;left:0px;width:420px;height:294px;"></div>
</div>
<p><script type="text/javascript">
var anim = new Animacion("http://www.crysfel.com/ejemplos/carrusel",18);
anim.inicia();
</script></p>
<p>Ahora voy a explicar como es que lo he hecho, veras que es algo muy sencillo. Primero es necesario descargar la última versión de mootools, luego lo importas a tu documento.</p>
<p><strong>UPDATE:</strong><br />
He escrito un tutorial sobre como hacer esto mismo con mootools1.2, ademas explico como escribir una clase correctamente utilizando todo el potencial de mootools, te recomiendo ir a <a href="http://www.crysfel.com/index.php/2008/02/13/carrusel-de-imagenes-con-mootools12/">leer el nuevo tutorial</a>.</p>
<p><span id="more-18"></span></p>
<p>Para importarlo al documento unicamente es necesario hacer esto:<br />
<code lang="html"><br />
<script type="text/javascript" src="mootools.v1.00.js"></script><br />
</code></p>
<p>Acontinuación muestro el XHTML necesario para el carrusel.</p>
<p><code lang="html"></p>
<div id="contenedor">
<div id="img1"></div>
<div id="img2"></div>
</div>
<p></code></p>
<p>Como puedes ver, hay una capa contenedora de dos capas, las capas de adentro son para almacenar temporalmente las imágenes e irlas rotando, estoy utilizando dos, porque cuando se realiza la transición la imagen actual se desvanece, y la imagen siguiente aparece, ambos efectos al mismo tiempo.</p>
<p>Lo siguiente es acomodar estas capas una encima de la otra y darle el tamaño de las imágenes, esto lo hago con CSS.</p>
<p><code lang="css"><br />
#contenedor{<br />
	position:relative;<br />
	width:100%;<br />
}<br />
#img1{<br />
	width:420px;<br />
	height:294px;<br />
	background-image:url('galeria/intro/01.jpg');<br />
}</p>
<p>#img2{<br />
	position:absolute;<br />
	top:0px;<br />
	left:0px;<br />
	width:420px;<br />
	height:294px;<br />
}<br />
</code></p>
<p>Con esto únicamente estoy modificando las posiciones y asignando las imágenes iniciales, si te fijas la capa contenedora la posicione <strong>relativa</strong>, esto lo hice para hacer la capa IMG2 <strong>absoluta</strong>, de esta manera puedo mover la capa img2 a las coordenadas especificas, ósea, ponerla sobre la capa img1. Otro punto importante a destacar aqui, es que si el usuario no tiene habilitado JavaScript, aparecerá simplemente la imagen uno, no habrá efecto, pero podrá ver una imagen.</p>
<p>Lo siguiente es hacer un objeto que le llamaré Animación, este objeto le voy a pasar dos parámetros en el constructor, uno es la url donde están alojadas la imágenes a mostrar, y el otro es el numero máximo de imágenes a desplegar, el directorio de imágenes, debe de contener las imágenes nombradas  numéricamente en orden ascendente, es decir deben llamarse 01.jpg, 02.jpg,03.jpg, etc.</p>
<p>Hasta este punto el código debe estar asi:</p>
<p><code lang="javascript"><br />
function Animacion(base,max){<br />
	this.base = base;<br />
	this.cont = 1;<br />
	this.img1 = true;<br />
	this.maximo = max;<br />
}<br />
</code></p>
<p>Las propiedades del objeto son base, que es el directorio donde se alojan las imágenes, cont, es un contador secuencial, se incrementará a uno por cada ejecución de la transición, img1 es una variable booleana que indica únicamente si el div img1 es el que sale o no, maximo es la variable que contiene el maximo numero de imágenes, al llegar con a este numero, se reinicia.</p>
<p>Ahora sigue hacer una función a la cual llamaré inicia, la cual va a levantar un temporizador que se ejecutará cada tres segundos.</p>
<p><code lang="javascript"><br />
this.inicia = function(){<br />
		(function(){<br />
			//se incrementa el contador<br />
			this.cont++;<br />
			//al llegar al maximo la animacion se inicia<br />
			if(this.cont > this.maximo)<br />
				this.cont = 1;<br />
			var im = 'img1';<br />
			var prefix = this.cont+'.jpg';<br />
			if(this.cont<10)<br />
				prefix = '0'+this.cont+'.jpg';<br />
			if(this.img1){<br />
				this.img1 = false;<br />
				im = 'img2';<br />
			}else<br />
				this.img1 = true;<br />
			//se asigna la nueva imagen a la capa que no se esta viendo<br />
			$(im).style.backgroundImage = 'url('+this.base+'/'+prefix+')';<br />
			//se desaparece la capa con la nueva imagen<br />
			new Fx.Style(im, 'opacity').set(0);</p>
<p>			//esta funcion espera un segundo antes de ahcer la transición<br />
			(function(){<br />
				//crea el efecto para las dos capas<br />
				var x = new Fx.Style('img1', 'opacity');<br />
				var y = new Fx.Style('img2', 'opacity');<br />
				//aparece y desaparece las capas<br />
				if(this.img1){<br />
					x.start(0,1);<br />
					y.start(1,0);<br />
				}else{<br />
					x.start(1,0);<br />
					y.start(0,1);<br />
				}</p>
<p>			 }<br />
			).delay(1000,this);<br />
		 }<br />
		//Este es el temporizador, se ejecutará cada tres segundos<br />
		).periodical(3000,this);<br />
	}<br />
</code></p>
<p>He comentado las partes mas importantes del código, espero esté claro, y si existe alguna duda o comentario puedes dejarlo con toda confianza.</p>
<p>El código completo es el siguiente:</p>
<p><code lang="html"><br />
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"<br />
	"http://www.w3.org/TR/xhtml1/DTD/xhtml-strict.dtd"></p>
<p><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es"><br />
<head><br />
	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1;" /></p>
<p><script type="text/javascript" src="common/javascript/mootools.v1.00.js"></script></p>
<style type="text/css">
#contenedor{
	position:relative;
	width:100%;
}
#img1{
	width:420px;
	height:294px;
	background-image:url('galeria/intro/01.jpg');
}</p>
<p>#img2{
	position:absolute;
	top:0px;
	left:0px;
	width:420px;
	height:294px;
}
</style>
<p><script type="text/javascript"></p>
<p>window.addEvent('domready', function(){
	var anim = new Animacion('galeria/intro',18);
	anim.inicia();
});</p>
<p>function Animacion(base,max){
	this.base = base;
	this.cont = 1;
	this.img1 = true;
	this.maximo = max;
	this.inicia = function(){
		(function(){
			//se incrementa el contador
			this.cont++;
			//al llegar al maximo la animacion se inicia
			if(this.cont > this.maximo)
				this.cont = 1;
			var im = 'img1';
			var prefix = this.cont+'.jpg';
			if(this.cont<10)
				prefix = '0'+this.cont+'.jpg';
			if(this.img1){
				this.img1 = false;
				im = 'img2';
			}else
				this.img1 = true;
			//se asigna la nueva imagen a la capa que no se esta viendo
			$(im).style.backgroundImage = 'url('+this.base+'/'+prefix+')';
			//se desaparece la capa con la nueva imagen
			new Fx.Style(im, 'opacity').set(0);</p>
<p>			//esta funcion espera un segundo antes de ahcer la transición
			(function(){
				//crea el efecto para las dos capas
				var x = new Fx.Style('img1', 'opacity');
				var y = new Fx.Style('img2', 'opacity');
				//aparece y desaparece las capas
				if(this.img1){
					x.start(0,1);
					y.start(1,0);
				}else{
					x.start(1,0);
					y.start(0,1);
				}</p>
<p>			 }
			).delay(1000,this);
		 }
		//Este es el temporizador, se ejecutará cada tres segundos
		).periodical(3000,this);
	}
}
</script><br />
</head><br />
<body></p>
<div id="contenedor">
<div id="img1"></div>
<div id="img2"></div>
</div>
<p></body></p>
<p></html><br />
</code></p>
<p>Hasta la próxima!</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.crysfel.com/2007/05/02/carrusel-de-imagenes/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Presentando Mootools</title>
		<link>http://www.crysfel.com/2007/04/29/presentando-mootools/</link>
		<comments>http://www.crysfel.com/2007/04/29/presentando-mootools/#comments</comments>
		<pubDate>Sun, 29 Apr 2007 20:53:17 +0000</pubDate>
		<dc:creator>Crysfel</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.crysfel.com/index.php/2007/04/29/presentando-mootools/</guid>
		<description><![CDATA[Hoy quiero hablar al respecto de una maravilla, se trata de un framework para JavaScript mootools, el cual incluye una API realmente buena. Quiero dar algunos puntos por los cuales deberías utilizarla.
La función dólar
La función dólar es una de mis favoritas, esta función fue inspirada en el framework de prototype, adaptado a este framework con [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>Hoy quiero hablar al respecto de una maravilla, se trata de un framework para JavaScript <strong>mootools</strong>, el cual incluye una API realmente buena. Quiero dar algunos puntos por los cuales deberías utilizarla.</p>
<p><strong>La función dólar</strong><br />
La función dólar es una de mis favoritas, esta función fue inspirada en el framework de prototype, adaptado a este framework con algunas funcionalidades extras, esta función es excelente para el desarrollo rápido.</p>
<p><strong>Buena compresión</strong><br />
Este punto es lo que hace que me agrade mucho mas esta librería, pues en tan sólo 36 kb, se encuentra toda una API lista para ser utilizada. La compresión está hecha con el famoso <a href="http://dean.edwards.name/packer/">empaquetador</a> de Dean Edwars, aunque también puedes descargar la versión sin compresión, la cual pesa aproximadamente 140 kb, pues además de traer el API viene con documentación integrada.<br />
<span id="more-17"></span><br />
<strong>Orientada a Objetos</strong><br />
En esta librería se encuentran clases para ser utilizadas, esto nos permite hacer cuantos objetos necesitemos, teniendo así una excelente API.</p>
<p><strong>Buena documentación</strong><br />
La documentación la puedes encontrar en <a href="http://docs.mootools.net/">http://docs.mootools.net/</a>, y esta muy completa, con pequeños ejemplos de los métodos, y una muy buena navegación, a diferencia de otros frameworks este si cuenta con una excelente documentación.</p>
<p><strong>La clase FX</strong><br />
Esta es la clase que me llamó más la atención, y es que dentro de esta clase se encuentran métodos para realizar animaciones realmente increíbles, esta clase implementa las ecuaciones de <a href="http://www.robertpenner.com/easing/">Robert Pender</a> si has utilizado flash, sabes a lo que me estoy refiriendo, si no pues voy a poner un ejemplo para que veas lo fácil que es y de lo que estoy ahblando, a continuación el código necesario para hacer una pequeña animación.<br />
El XHTML<br />
[code lang="strict4xhtml"]</p>
<div id="cuadro" style="width:30px;height:30px;background-color:#000;"></div>
<input type="button" onclick="fx.start(10, 200)" value="Animar" />
[/code]</p>
<p>El Javascript<br />
[code lang="javascript"]<br />
var fx = new Fx.Style("cuadro","margin-left",<br />
  {duration:1000,<br />
    transition:Fx.Transitions.bounceOut<br />
  });<br />
[/code]</p>
<p>Y aquí el ejemplo ejecutandose.</p>
<p>
<div id="cuadro" style="width:30px;margin:10px;height:30px;background-color:#000;"></div>
</p>
<input type="button" class="boton" style="margin:10px" onclick="fx.start(10, 200)" value="Animar" />
<p><script type="text/javascript">
var fx = new Fx.Style("cuadro","margin-left",
  {duration:1000,
    transition:Fx.Transitions.bounceOut
  });
</script></p>
<p><strong>Compatibilidad con exploradores</strong><br />
A lo que me refiero, es que este framework funciona correctamente tanto en Internet Explorer como en firefox, safari, konqueror y otros exploradores más, esto es un punto de suma importancia, pues como desarrolladores necesitamos estar seguros de que nuestros sistemas funcionaran de igual manera en todos los exploradores.</p>
<p><strong>Clases para AJAX</strong><br />
El API contiene clases para realizar peticiones AJAX, de una forma muy sencilla, como esta:<br />
[code lang="javascript"]<br />
var myAjax = new Ajax(url, {method: 'get'});<br />
myAjax.request();<br />
[/code]<br />
Esas dos líneas son las necesarias para realizar una petición al servidor, claro está que puedes modificar las opciones por default, como agregar la función que se disparará al recibir la respuesta, o enviar parámetros vía POST, etc.</p>
<p><strong>Conclusión</strong><br />
Con esta maravilla, podemos crear cosas increíbles, ahora la única limitante es tu imaginación, esta librería contiene muchas mas clases que puedes utilizar, te recomiendo revisar la documentación y a disfrutarla!</p>
<p><strong>Referencias</strong><br />
<a href="http://mootools.net/">http://mootools.net/</a></p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.crysfel.com/2007/04/29/presentando-mootools/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
