tag:blogger.com,1999:blog-68646292008-03-08T11:12:39.168-03:00IncreaseFrancesco Barresihttp://www.blogger.com/profile/07396417056716676216noreply@blogger.comBlogger4125tag:blogger.com,1999:blog-6864629.post-1142918831265065382006-03-21T00:53:00.000-04:002006-03-22T22:32:14.650-04:00Imagen de fondo en las filas de una tablaColocar una imagen de fondo en la fila de una tabla es una tarea engorrosa porque todos (Firefox 1.5, Internet Explorer 6 y Opera 8.2) los navegadores se comportan de diferente forma.<br />A continuación se expondrá el problema y una solución.<br /><br /><span style="font-weight: bold;">Problemática</span><br /><span style="font-weight: bold;"><br /></span>Para analizar el comportamiento de los tres navegadores se usará un simple archivo HTML con una tabla compuesta por una cabecera (thead) y un cuerpo (tbody). En la fila de la cabecera se pone una imagen de fondo, según la especificación CSS2 (REC-CSS2-19980512:http://www.w3.org/TR/REC-CSS2/cover.html), usando la propiedad 'background-image', como se muestra en el siguiente código:<br /><pre><br /><span style="font-size:85%;"><span style="font-family:courier new;">&lt;html></span><br /><span style="font-family:courier new;"> &lt;body></span><br /><span style="font-family:courier new;"> &lt;h1>Imagen de fondo en filas de tablas&lt;/h1></span><br /><span style="font-family:courier new;"> &lt;table width="150px" cellpadding="0" cellspacing="0" border="0"></span><br /><span style="font-family:courier new;"> &lt;thead></span><br /><span style="font-family:courier new;"> &lt;tr style="background-image: url(background.gif);"></span><br /><span style="font-family:courier new;"> &lt;th>Firefox&lt;/th></span><br /><span style="font-family:courier new;"> &lt;th>Internet Explorer&lt;/th></span></span><span style="font-size:85%;"><br /><span style="font-family:courier new;"> &lt;th>Opera&lt;/th></span><br /><span style="font-family:courier new;"> &lt;/tr></span><br /><span style="font-family:courier new;"> &lt;/thead></span><br /><span style="font-family:courier new;"> &lt;tbody></span><br /><span style="font-family:courier new;"> &lt;tr></span><br /><span style="font-family:courier new;"> &lt;td>Mozilla fundation&lt;/td></span><br /><span style="font-family:courier new;"> &lt;td>Microsoft Corporation&lt;/td></span><br /><span style="font-family:courier new;"> &lt;td>Opera Software&lt;/td></span></span><span style="font-size:85%;"><br /><span style="font-family:courier new;"> &lt;/tr></span><br /><span style="font-family:courier new;"> &lt;/tbody></span><br /><span style="font-family:courier new;"> &lt;/table></span><br /><span style="font-family:courier new;">&lt;/body></span><br /><span style="font-family:courier new;">&lt;/html></span></span></pre><br /><span style="font-weight: bold;">Comportamiento esperado<br /><br /></span>La especificación CSS2 dice claramente que las propiedades de fondo no deben ser heredadas:<br /><br /><blockquote>Background properties are not inherited, but the parent box's background will shine through by default because of the initial 'transparent' value on 'background-color'.</blockquote><br />Al especificar una imagen de fondo en la fila se espera que esta se vea en su totalidad a través de las celdas, siempre y cuando estas no especifiquen ningun color de fondo.<br />El resultado esperado es el siguiente:<br /><div style="text-align: center;"><img src="http://static.flickr.com/56/116224767_315549b8b8_o.jpg" style="margin: 5px;" /><br /><br /></div><span style="font-weight: bold;">Comportamiento real<br /></span><br />Estos pantallazos muestran el comportamiento de cada nevegador.<br /><div style="text-align: center;"><img src="http://static.flickr.com/46/116231973_fc8e021a8a_o.jpg" style="margin: 5px;" title="Firefox 1.5" /><br /></div><div style="text-align: center;"><img src="http://static.flickr.com/46/116231974_39971ae453_o.jpg" style="margin: 5px;" title="Internet Explorer 6" /><br /></div><div style="text-align: center;"><img src="http://static.flickr.com/55/116231975_be31b87e20_o.jpg" style="margin: 5px;" title="Opera 8.2" /><br /></div><br />Firefox es el único que entrega el resultado esperado, mostrando la imagen en todo el fondo de la fila. Internet Explorer y Opera muestran un comportamiento similiar, en que cada celda hereda la imagen de fondo de la fila, por lo que se obtiene ese efecto de repetición de la imagen en cada celda en vez de una sola imagen de fondo en la fila.<br />Además del caso de estudio se realizaron más pruebas con distintas combinaciones de estilos y ubicaciones de estos.<br /><br />Ejemplo:<br /><pre><span style="font-size:85%;"><span style="font-family:courier new;">[...]</span><br /><span style="font-family:courier new;">&lt;thead></span><br /><span style="font-family:courier new;">&lt;tr style="bakcground-image: url(background.gif);"></span><br /><span style="font-family:courier new;"> &lt;th>Firefox&lt;/th><br />&lt;!-- aqui se agrega la propiedad 'background-position' a una celda --><br /></span><span style="font-family:courier new;"> &lt;th style="background-position: 50% 0%;">Internet Explorer&lt;/th></span><br /><span style="font-family:courier new;"> &lt;th>Opera&lt;/th></span><br /><span style="font-family:courier new;">&lt;/tr></span><br /><span style="font-family:courier new;">&lt;/thead></span><br /><span style="font-family:courier new;">[...]</span></span><br /></pre><div style="text-align: center;"><img src="http://static.flickr.com/46/116231973_fc8e021a8a_o.jpg" style="margin: 5px;" title="Firefox 1.5" /><br /></div>Firefox no se muestra fectado por la aplicación de 'background-position' en una celda, lo que confirma que efectivamente las celdas no heredan el fondo de la fila.<br /><div style="text-align: center;"><img src="http://static.flickr.com/55/116402996_ab4fdacdae_o.jpg" style="margin: 5px;" title="Internet Explorer 6" /><br /></div> En Internet Explorer cada celda hereda el atributo 'background-image', esto se confirmó al aplicar un 'background-position' a la celda, que resultó en un desplazamiento de la imagen en la celda.<br /><div style="text-align: center;"><img src="http://static.flickr.com/55/116231975_be31b87e20_o.jpg" style="margin: 5px;" title="Opera 8.2" /><br /></div> Opera por su parte se comporta de otra forma, si bien parece que las celdas heredan la imagen de fondo, esto es solo un efecto visual e internamente las celdas no tienen imagen de fondo. Esto se verificó aplicando 'background-image' a las celda sin obtener algún efecto.<br /><br />Por lo tanto Internet Explorer 6 y Opera 8.2 no se están comportando de acuerdo a la especificación CSS2.<br /><br /><span style="font-weight: bold;">Solución (workaround)<br /><br /></span>La solución debe ser simple, no intrusiva, sin necesidad de despedazar la imagen y no debe tener efectos secundarios en Firefox. Dependiendo de la compatibilidad entre navegadores que se quiera, existen dos posibles soluciones:<br /><br /><span style="font-style: italic;">Compatibilidad con Firefox e Internet Explorer.<br /><br /></span>Dado que en Internet Explorer las celdas heredan el atributo 'background-image' de la fila, para lograr una imagen continuada en el fondo, basta con especificar adecuadamente el atributo 'background-image' en cada celda de la fila.<br />'background-image' acepta distintos formatos, aquí solo se usarán dos de ellos: &lt;porcentaje> &lt;porcentaje> y &lt;distancia> &lt;distancia>; el uso de uno u otro formato depende principalmente de la imagen de fondo.<br />Para una imagen sin trama o formas, el formato porcentual es más que suficiente, pero para una imagen con tramas o textos que deben aparecer en ubicaciones especificas de la fila es necesario el uso del formato &lt;distancia> &lt;distancia> para obtener un posicionamiento preciso.<br /><br />Formato &lt;porcentual><br /><pre><span style="font-size:85%;"><span style="font-family:courier new;">[...]</span><br /><span style="font-family:courier new;">&lt;thead></span><br /><span style="font-family:courier new;">&lt;tr style="bakcground-image: url(background.gif);"></span><br /><span style="font-family:courier new;"> &lt;th style="background-position: 0% 0%;">Firefox&lt;/th></span><br /><span style="font-family:courier new;"> &lt;th style="background-position: 50% 0%;">Internet Explorer&lt;/th></span><br /><span style="font-family:courier new;"> &lt;th style="background-position: 100% 0%;">Opera&lt;/th></span><br /><span style="font-family:courier new;"> &lt;/tr></span><br /><span style="font-family:courier new;">&lt;/thead></span><br /><span style="font-family:courier new;">[...]</span></span><br /></pre>Formato &lt;distancia><br /><pre><span style="font-size:85%;"><span style="font-family:courier new;">[...]</span><br /><span style="font-family:courier new;">&lt;thead></span><br /><span style="font-family:courier new;">&lt;tr style="bakcground-image: url(background.gif);"></span><br /><span style="font-family:courier new;"> &lt;th style="background-position: 0px px;">Firefox&lt;/th></span><br /><span style="font-family:courier new;"> &lt;th style="background-position: -50px 0px;">Internet Explorer&lt;/th></span><br /><span style="font-family:courier new;"> &lt;th style="background-position: -100px 0px;">Opera&lt;/th></span><br /><span style="font-family:courier new;">&lt;/tr></span><br /><span style="font-family:courier new;">&lt;/thead></span><br /><span style="font-family:courier new;">[...]</span></span><br /></pre><div style="text-align: center;"><img src="http://static.flickr.com/54/116407328_1f576e87db_o.jpg" style="margin: 5px;" title="Solución para FF e IE" /><br /></div><br /><span style="font-style: italic;">Compatibilidad con Firefox, Internet Explorer y Opera.<br /><br /></span>Para que funcione en Opera es necesario especificar la imagen de fondo en cada celda además de especificar 'background-position'. Esto porque en Opera las celdas no heredan el atributo 'background-image' por lo que 'background-position' por si solo no tendría algún efecto. Esta solución tambien funciona en Internet Explorer y Firefox.<br /><br />Formato &lt;porcentual><br /><pre><span style="font-size:85%;"><span style="font-family:courier new;">[...]</span><br /><span style="font-family:courier new;">&lt;thead></span><br /><span style="font-family:courier new;">&lt;tr>&lt;-- aquí se quitó la propiedad 'background-image' de la fila--></span><br /><span style="font-family:courier new;"> &lt;th style="bakcground-image: url(background.gif); background-position: 0% 0%;">Firefox&lt;/th></span><br /><span style="font-family:courier new;"> &lt;th style="bakcground-image: url(background.gif); background-position: 50% 0%;">Internet Explorer&lt;/th></span><br /><span style="font-family:courier new;"> &lt;th style="bakcground-image: url(background.gif); background-position: 100% 0%;">Opera&lt;/th></span><br /><span style="font-family:courier new;">&lt;/tr></span><br /><span style="font-family:courier new;">&lt;/thead></span><br /><span style="font-family:courier new;">[...]</span></span><br /></pre>Formato &lt;distancia><br /><pre><span style="font-size:85%;"><span style="font-family:courier new;">[...]</span><br /><span style="font-family:courier new;">&lt;thead></span><br /><span style="font-family:courier new;"> &lt;tr></span></span><span style="font-size:85%;"><span style="font-family:courier new;">&lt;-- aquí se quitó la propiedad 'background-image' de la fila--></span></span><span style="font-size:85%;"><br /><span style="font-family:courier new;"> &lt;th style="bakcground-image: url(background.gif); background-position: 0px px;">Firefox&lt;/th></span><br /><span style="font-family:courier new;"> &lt;th style="bakcground-image: url(background.gif); background-position: -50px 0px;">Internet Explorer&lt;/th></span><br /><span style="font-family:courier new;"> &lt;th style="bakcground-image: url(background.gif); background-position: -100px 0px;">Opera&lt;/th></span><br /><span style="font-family:courier new;"> &lt;/tr></span><br /><span style="font-family:courier new;">&lt;/thead></span><br /><span style="font-family:courier new;">[...]</span></span><br /></pre><div style="text-align: center;"><img src="http://static.flickr.com/36/116406397_20a50da08d_o.jpg" style="margin: 5px;" title="Solución para FF, IE y Opera" /><br /></div><br />Ambas soluciones no usan nada fuera de HTML y CSS; son simples, no se necesita seccionar ninguna imagen y funcionan correctamente en Firefox.<br />Pero son un poco intrusivas porque agregan bastante código que es incomodo de mantener y si además en una página se tienen muchas tablas con distintas imagenes de fondo o tablas generadas dinámicamente, se vuelve un poco engorroso configurar apropiadamente los parametros en cada celda.<br />Por esto escribí una función en javascript que se encarga de configurar todo lo necesario para que la imagen de fondo aparezca correctamente en los tres navegadores.<br /><pre><br /><span style="font-size:85%;"><span style="font-family:courier new;"><span style="font-weight: bold; color: rgb(51, 51, 153);">function</span> <span style="color: rgb(102, 0, 204);">setTableRowBackgroundImagePosition</span>(table){</span><br /><span style="font-family:courier new;"><span style="color: rgb(51, 51, 153);"> var</span> all_tablesRows;</span><br /><span style="font-family:courier new;"><span style="color: rgb(51, 51, 153);"> if</span> (table) all_tablesRows = table.<span style="color: rgb(102, 0, 204);">getElementsByTagName</span><span style="color: rgb(102, 0, 204);">(</span><span style="color: rgb(204, 51, 204);">"tr"</span>);</span><br /><span style="font-family:courier new;"><span style="color: rgb(51, 51, 153);"> else</span> all_tablesRows = document.<span style="color: rgb(102, 0, 204);">getElementsByTagName</span>(<span style="color: rgb(204, 51, 204);">"tr"</span>);</span><br /><br /><span style="font-family:courier new;"><span style="color: rgb(51, 51, 153);"> for</span> (<span style="color: rgb(51, 51, 153);">var</span> i = <span style="color: rgb(255, 102, 102);">0</span>; i &lt; all_tablesRows.length; i++){</span><br /><span style="font-family:courier new;"> <span style="color: rgb(0, 0, 153);">if</span>(all_tablesRows[i].style.backgroundImage == <span style="color: rgb(204, 51, 204);">''</span>) continue;<span style="color: rgb(255, 153, 0);">//No background-image here, go on.</span></span><br /><span style="font-family:courier new;"> <span style="color: rgb(0, 0, 153);">var</span> cells = all_tablesRows[i].cells;</span><br /><span style="font-family:courier new;"> <span style="color: rgb(0, 0, 153);">var</span> previousWidth = <span style="color: rgb(255, 102, 102);">0</span>;</span><br /><span style="font-family:courier new;"> for (<span style="color: rgb(0, 0, 153);">var</span> j = <span style="color: rgb(255, 102, 102);">0</span>; j &lt; cells.length - <span style="color: rgb(255, 102, 102);">1</span> ; j++){<span style="color: rgb(255, 153, 0);">//The last cell is processed after the for.</span></span><br /><span style="font-family:courier new;"> cells[j].style.backgroundPosition = <span style="color: rgb(204, 51, 204);">'-'</span> + previousWidth.<span style="color: rgb(102, 0, 204);">toString</span>() + <span style="color: rgb(204, 51, 204);">"px 0px"</span>;</span><br /><span style="font-family:courier new;"> <span style="color: rgb(0, 0, 153);">if</span>(navigator.userAgent.<span style="color: rgb(102, 0, 204);">indexOf</span>(<span style="color: rgb(204, 51, 204);">"Opera"</span>)!=-<span style="color: rgb(255, 102, 102);">1</span>){<span style="color: rgb(255, 153, 0);">//mmm...Opera</span></span><br /><span style="font-family:courier new;"> cells[j].style.backgroundImage = all_tablesRows[i].style.backgroundImage;</span><br /><span style="font-family:courier new;"> }</span><br /><span style="font-family:courier new;"> previousWidth += cells[j].clientWidth;</span><br /><span style="font-family:courier new;"> }</span><br /><span style="font-family:courier new;"> cells[cells.length-<span style="color: rgb(255, 102, 102);">1</span>].style.backgroundImage = all_tablesRows[i].style.backgroundImage;</span><br /><span style="font-family:courier new;"> cells[cells.length-<span style="color: rgb(255, 102, 102);">1</span>].style.backgroundPosition = <span style="color: rgb(204, 51, 204);">"100% 0%"</span>;</span><br /><span style="font-family:courier new;"> }</span><br /><span style="font-family:courier new;">}</span></span><br /></pre>Su uso es muy sencillo, solamente se debe escribir la tabla de forma correcta indicando la imagen de fondo solo en la fila (tr) y luego con una llamada a la función todo queda configurado. La función revisa todas las filas de todas las tablas presentes en el documento y en las que se haya indicado una imagen arreglará las celdas configurando la propiedad 'background-position' y en caso de estar en Opera también la propiedad 'background-image'.<br />La función tambien da la posibilidad de especificar que tabla se quiere arreglar, para evitar pasar por todas las tablas del documento.<br /><br />En concreto, se debe escribir la tabla:<br /><pre><span style="font-size:85%;"><span style="font-family:courier new;">&lt;table width="150px" cellpadding="0" cellspacing="0" border="0"></span><br /><span style="font-family:courier new;"> &lt;thead></span><br /><span style="font-family:courier new;"> &lt;tr style="background-image: url(background.gif);"></span><br /><span style="font-family:courier new;"> &lt;th>Firefox&lt;/th></span><br /><span style="font-family:courier new;"> &lt;th>Internet Explorer&lt;/th></span><br /><span style="font-family:courier new;"> &lt;th>Opera&lt;/th></span><br /><span style="font-family:courier new;"> &lt;/tr></span><br /><span style="font-family:courier new;"> &lt;/thead></span><br /><span style="font-family:courier new;"> &lt;tbody></span><br /><span style="font-family:courier new;"> &lt;tr></span><br /><span style="font-family:courier new;"> &lt;td>Mozilla fundation&lt;/td></span><br /><span style="font-family:courier new;"> &lt;td>Microsoft Corporation&lt;/td></span><br /><span style="font-family:courier new;"> &lt;td>Opera Software&lt;/td></span><br /><span style="font-family:courier new;"> &lt;/tr></span><br /><span style="font-family:courier new;"> &lt;/tbody></span><br /><span style="font-family:courier new;">&lt;/table></span></span><br /></pre>Y luego llamar la función, ya sea desde window.onload o como parte de otra función que genera una tabla.<br />El uso de la función tiene además la ventaja que si el diseño de la imagen no tiene directa correspondecia al tamaño de la tabla, se puede hacer una imagen larga como el máximo ancho de la tabla y si ella resulta más corta se verá bien de todas formas, porque la última celda siempre se configura de modo que muestre el extremo derecho de la imagen.Francesco Barresihttp://www.blogger.com/profile/07396417056716676216noreply@blogger.comtag:blogger.com,1999:blog-6864629.post-1141535360308444502006-03-05T01:19:00.000-03:002006-07-06T23:13:39.486-04:00GoogleTalk Status<span style="font-family:georgia;"><span style="color: rgb(153, 51, 0);"><span style="font-weight: bold;">Actualización:</span> Este material está obsoleto porque la nueva versión de Google Desktop permite obtener la posicón del mouse, lo cual puede usarse para detectar la inactividad del usuario.</span><br /><br />Este es el caso: Me encanta Google Desktop Sidebar 3 y realizé un plugin para mi y mis compañeros de trabajo, el cual muestra información actualizada constantemente. El problema está en que mi PC está encendido 24/7 y no tiene ningun sentido que el plugin esté descargando datos desde internet para mostrarmelos si yo me fui a almorzar o estoy durmiendo. Entonces seria bueno que el plugin pueda de alguna forma determinar cuando no estoy utilizando el PC y en esos momentos no descargue la información acutalizada ahorrando así ancho de banda, consumo de la linea y procesamiento del servidor. Obviamente en mi </span><span style="font-family:georgia;">Google Desktop Sidebar tengo GoogleTalk conectado y él sí sabe cuando no estoy en el PC, entonces una idea seria preguntarle a él, pero hay un pequeño problema que explico a continuación:</span><br /><span style="font-family:georgia;"><br />La API de la Sidebar expone, entre otras, la variable global <span style="font-family:courier new;">googleTalk</span> la cual permite que el plugin se comunique con nuestros 'amigos' que también tengan instalada la Sidebar y el plugin en cuestion. <span style="font-family:courier new;">googleTalk</span> tiene la propiedad <span style="font-family:courier new;">friends</span> que es un arreglo de objectos <span style="font-family:courier new;">Friend</span>, con ella podemos saber el estado (online/idle/busy) de nuestros amigos.<br />Nota: <span style="font-family:courier new;">friends</span> solo expone nuestros amigos que están online, los que estan offline no aparecerán en el arreglo.<br /><br />El problema está en que si bien podemos saber el status de nuestros amigos, no hay forma de saber nuestro propio status, entonces se me ocurrio lo más obvio: Si no podemos saberlo pero nuestros amigos sí, preguntemoselo a ellos!<br /><br /><span style="font-weight: bold;font-size:130%;" >Como funciona</span><br /><br /><span style="font-weight: bold;">La idea es simple</span>, le pregunta periodicamente a mis amigos indicados en <span style="font-family:courier new;">options.GetValue('<span style="color: rgb(0, 153, 0);">googleTalkStatus_friends</span>')</span> siempre y cuando <span style="font-family:courier new;">options.GetValue('<span style="color: rgb(0, 153, 0);">check_my_status</span>') == 'true'</span>. Luego, cuando mi estado cambia llama <span style="font-family:courier new;">googleTalkStatus.<span style="color: rgb(153, 51, 153);">onChangeStatus</span></span>.<br /><br />Entonces, para que funcione, el plugin se debe encargar de alguna manera que el usuario especifique cuales de sus amigos tienen el plugin instalado; esto parecerá una molestia pero me vi forzado a incluirlo para evitar que cada medio minuto a mis amigos les apareciera una ventana preguntando si quieren entrar a la página de plugins de Google Desktop Sidebar porque no tienen instalado el plugin que estoy usando. </span><span style="font-family:georgia;"><span style="font-family:courier new;">googleTalkStatus_friends</span> debe ser la representación literal de un arreglo con los nombres de los amigos selecionados, ej: </span><span style="font-family:georgia;"><span style="font-family:courier new;">googleTalkStatus_friends = ['Juan Perez', 'Kaiser Soza']</span>.</span><br /><span style="font-family:georgia;"><br /></span><span style="font-family:georgia;"><span style="font-size:130%;"><span style="font-weight: bold;">Como se usa<br /><br /></span></span><span style="font-weight: bold;">googleTalkStatus</span> tiene cuatro propiedades posiblemente utiles para el plugin y tan solo dos metodos. Hay otras propiedades y metodos pero son de uso interno y no son de mucha utilidad para el plugin.<br /><br /><span style="font-weight: bold; font-style: italic;">Propiedades:</span><br /><span style="color: rgb(0, 0, 0); font-weight: bold;">googleTalkStatus</span>.<span style="font-style: italic; color: rgb(153, 51, 153);">status</span>: indica mi estado de GoogleTalk, estos pueden ser: 'firstCheck', 'unknown', 'stopped' y 0, 1, 2 para Online, Idle y Busy respectivamente. firstCheck es el estado que existe entre la llamada a <span style="font-family:courier new;">googleTalkStatus.<span style="color: rgb(153, 51, 153);">start()</span></span> y la primera respuesta de mis amigos. Unknown es cuando googleTalkStatus no puede determinar mi estado. Stopped es el estado que existe despues de la llamada a <span style="font-family:courier new;">googleTalkStatus.<span style="color: rgb(153, 51, 153);">stop()</span></span>.<br /><br /><span style="font-weight: bold;">googleTalkStatus</span>.<span style="font-style: italic; color: rgb(153, 51, 153);">delay</span>: indica en milisegundos cada cuanto tiempo se debe consultar por mi estado a mis amigos.<br /><br /><span style="font-weight: bold;">googleTalkStatus</span>.<span style="font-style: italic; color: rgb(153, 51, 153);">onReceiveTalkData</span>: esta es importante, se debe usar en vez de <span style="font-family:courier new;">googleTalk.onReceiveTalkData</span> para que todo funcione bien. Será llamada incluso despues de haber detenido googleTalkStatus, así que no hay problema si se desactiva googleTalkStatus porque las comunicaciones propias del plugin continuarán a funcionar.<br /><span style="font-weight: bold;">googleTalkStatus</span>.<span style="font-style: italic; color: rgb(153, 51, 153);">onStatusChange</span>: esta es un handler a la función que se debe llamar cada vez que <span style="font-family:courier new;">googleTalkStatus.<span style="color: rgb(153, 51, 153);">status</span></span> cambia.<br /><br /><span style="font-weight: bold; font-style: italic;">Metodos:</span><br /><span style="font-weight: bold;">googleTalkStatus</span>.<span style="font-style: italic; color: rgb(153, 51, 153);">start()</span>: Inicializa googleTalkStatus, para que empieze a preguntar por mi estado. Esta función devuelve <span style="font-family:courier new;">gddNoFriendsWithPlugin</span> cuando no se han indicado los amigos a los cuales se les puede preguntar, es decir, <span style="font-family:courier new;">options.GetValue('<span style="color: rgb(0, 153, 0);">googleTalkStatus_friends</span>') == ""</span>. Devuelve <span style="font-family:courier new;">gddNoFriendsWithSideBar</span> si ninguno de los amigos tiene Sidebar.<br /><span style="font-weight: bold;">googleTalkStatus</span>.<span style="color: rgb(153, 51, 153); font-style: italic;">stop()</span>: Detiene googleTalkStatus, lo que no impide que mis amigos me pregunten por sus estados.<br /><br /><span style="font-weight: bold; font-style: italic;">Ejemplo:</span><br /><br /><span style="font-size:85%;"><span style="font-family:courier new;">if (options.GetValue('check_my_status') == 'true') {</span><br /><span style="font-family:courier new;"> googleTalkStatus.onStatusChange = function(){utils.alert(googleTalkStatus.status)};</span><br /><span style="font-family:courier new;"> googleTalkStatus.onReceiveTalkData = function(friend, data){utils.alert(data)};</span><br /><span style="font-family:courier new;"> googleTalkStatus.start();</span><br /><span style="font-family:courier new;">}</span></span><br /><br /></span><span style="font-family:georgia;">Para deterner googleTalkStatus se debe llamar </span><span style="font-family:georgia;"><span style="font-family:courier new;">googleTalkStatus.stop()</span>.<br /><br /></span><span style="font-family:georgia;">Y eso seria todo, lo demás depende de cada plugin, que cosa hará en <span style="font-family:courier new;">googleTalkStatus.onStatusChange</span> es especifico de cada plugin y no tiene ninguna relación con googleTalkStatus.<br /></span><span style="font-family:georgia;"><br /></span><span style="font-family:georgia;">Para más detalle basta echar una mirada al codigo. Debo admitir que no está muy bien escrito pero lo llevo usando una semana y me ha funcionado bien.<br /><br /><span style="font-weight: bold; font-style: italic;">Descargas:<br /></span><br />Solo el js: <a href="http://www.filelodge.com/files/room15/383451/googleTalkStatus.js">googleTalkStatus.js</a><br />Un plugin de ejemplo que usa googleTalkStatus para decirte tu estado de GoogleTalk, obviamente para probarlo necesitas instalarlo en almenos dos PC con dos usuarios distintos de GoogleTalk.<br /><a href="http://www.filelodge.com/files/room15/383451/GoogleTalkStatus.msi">GoogleTalkStatus.msi</a><br /><a href="http://www.filelodge.com/files/room15/383451/googleTalkStatus_source.zip">GoogleTalkStatus_source.zip</a><br /></span>Francesco Barresihttp://www.blogger.com/profile/07396417056716676216noreply@blogger.comtag:blogger.com,1999:blog-6864629.post-1118771298919169092005-06-14T13:13:00.000-04:002005-06-14T13:51:15.866-04:00Ajax no es solo un detergenteEn estos días he descubierto el termino AJAX que significa <span style="font-style: italic;">Advanced Javascript And XML</span> o también <span style=""><span style="font-style: italic;">Asynchronous Javascript And XML</span>. A mi gusto el segundo es más apropiado a lo que Ajax se refiere, pe<span style="font-size:100%;">ro eso es solo un detalle.<br />Los usos de Ajax son de lo más variados, pero aqui listo algunos:<br /></span></span> <ul> <li><span style="font-size:100%;">Validación de formularios en tiempo real.</span></li><li><span style="font-size:100%;">Autocompletado de controles HTML.</span></li><li><span style="font-size:100%;">Controles UI sofisticados.</span></li><li><span style="font-size:100%;">Refrescos de conjuntos limitados de datos.</span></li><li><span style="font-size:100%;">Notificaciones y polling del servidor.</span></li> </ul> <span style="font-size:100%;">El termino Ajax apareció en un <a href="http://www.adaptivepath.com/publications/essays/archives/000385.php">paper</a> publicado por Adaptive Path y luego se hizo famoso por todos lados, la aplicación que todos nombran como el mejor ejemplo de esta tecnologia es Gmail, el cuál adoro (Si alguien quiere una cuenta en gmail, basta con que me deje un comentario...tengo un monton y no se a quien pasarselas :) ).</span><br /><span style="">Ajax en realidad es una técnica que se viene usando desde el lejano 1997 con una serie de 'trucos' bastante engorrosos antes de que apareciera XMLHttpRequest en todos lo navegadores. En terminos MUY grotescos Ajax es el uso del objeto XMLHttpRequest para comunicarse con el servidor y obtener información (datos) o postear datos al servidor sin necesitadad de recargar la página que el usuario está viendo y así lograr una experiencia mucho más agradable al usuario. Lo que se obtiene es una página web que se comporta como cualquier aplicación de escritorio.<br /><br />No me voy a largar en detalles sobre esto, ¿Para que duplicar contenidos?. En vez aqui pongo una lista de links para quien quiera conocer esta "tecnologia" o quien simplemente siente curiosidad por este termino que nos recuerda un detergente para la ropa :)<br /></span> <ul> <li><a href="http://es.wikipedia.org/wiki/AJAX">Ajax en wikipedia</a></li> <li><a href="http://www.adaptivepath.com/publications/essays/archives/000385.php">Ajax: A new approach to web applications by Adaptive Path</a></li><li><a href="http://www.ajaxmatters.com/">Ajax matters</a></li> <li><a href="http://www.google.cl/search?q=ajax">Google: Ajax</a></li> </ul>Al principio dije <span style="font-style: italic;">He descubierto el termino Ajax</span>, porque en realidad yo ya lo usaba en mySite sin saber la cantidad de discución que generó.Francesco Barresihttp://www.blogger.com/profile/07396417056716676216noreply@blogger.comtag:blogger.com,1999:blog-6864629.post-1108579616519679112005-02-16T15:46:00.000-03:002005-02-16T15:46:56.520-03:00Cuan grande es Mozilla."Mozilla is built on a very big source code base and is far larger than most Open Source projects. It is <strong>30 times</strong> larger than the <strong>Apache Web Server</strong>, <strong>20 times</strong> larger than the <strong>Java 1.0 JDK/JRE</strong> sources, <strong>5 times</strong> bigger than the standard <strong>Perl</strong> distribution, <strong>twice</strong> as big as the <strong>Linux kernel</strong> source, and nearly as large as the whole GNOME 2.0 desktop source—even when 150 standard GNOME applications are included." <br /><em>Fragmento extraido del libro "Rapid Application Development with Mozilla" de Nigel McFarlane.</em> <br /> <br />Sabia que mozilla era grande, pero nunca imagine que fuera tan grande.Francesco Barresihttp://www.blogger.com/profile/07396417056716676216noreply@blogger.com