<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><!-- generator="wordpress/2.1.2" --><rss 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/" version="2.0">

<channel>
	<title>GUJS - Grupo de Usuários Javascript</title>
	<link>http://gujs.com.br/blog</link>
	<description>O Maior Site Javascript do Brasil</description>
	<pubDate>Tue, 23 Jun 2009 21:56:37 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.1.2</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Gujs" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Ajax cross-domain com JSONP</title>
		<link>http://gujs.com.br/blog/2007/09/ajax-cross-domain-com-jsonp/</link>
		<comments>http://gujs.com.br/blog/2007/09/ajax-cross-domain-com-jsonp/#comments</comments>
		<pubDate>Fri, 21 Sep 2007 17:44:53 +0000</pubDate>
		<dc:creator>Matheus Zeuch</dc:creator>
		
		<category><![CDATA[Ajax]]></category>

		<category><![CDATA[Tutoriais Avançados]]></category>

		<category><![CDATA[Técnicas]]></category>

		<guid isPermaLink="false">http://gujs.com.br/blog/2007/09/ajax-cross-domain-com-jsonp/</guid>
		<description><![CDATA[  ]]></description>
			<content:encoded />
			<wfw:commentRss>http://gujs.com.br/blog/2007/09/ajax-cross-domain-com-jsonp/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Compactação JavaScript</title>
		<link>http://gujs.com.br/blog/2007/04/compactacao-javascript/</link>
		<comments>http://gujs.com.br/blog/2007/04/compactacao-javascript/#comments</comments>
		<pubDate>Mon, 30 Apr 2007 03:40:11 +0000</pubDate>
		<dc:creator>Rafael Quines</dc:creator>
		
		<category><![CDATA[Frameworks e APIs]]></category>

		<category><![CDATA[Tutoriais Básicos]]></category>

		<category><![CDATA[Técnicas]]></category>

		<guid isPermaLink="false">http://gujs.com.br/blog/2007/04/compactacao-javascript/</guid>
		<description><![CDATA[  Compactação javascript consiste na otimização de código, a fim de diminuir ao máximo o tamanho dos arquivos que o browser deverá fazer o download na hora que um usuário acessa um determinado site. Além de deixar uma página muito mais leve e rápida, os arquivos compactados ocuparão menos espaço no servidor também. Como JavaScript [...] ]]></description>
			<content:encoded><![CDATA[<p> Compactação javascript consiste na otimização de código, a fim de diminuir ao máximo o tamanho dos arquivos que o browser deverá fazer o download na hora que um usuário acessa um determinado site. Além de deixar uma página muito mais leve e rápida, os arquivos compactados ocuparão menos espaço no servidor também. Como JavaScript é uma linguagem interpretada, o que os compactadores fazem é aplicar técnicas específicas como nome de variáveis com poucos caracteres, tirar espaços desnecessários, comentários, etc.</p>
<p>Um método simples de compactação é feito com o <a href="http://www.crockford.com/javascript/jsmin.html">JSMIN</a>. O que ele faz é simplesmente tirar comentários e espaços em branco desnecessários. Segue uma demonstração da compactação feita pelo JSMIN:</p>
<pre class="prettyprint">
&lt;script type="text/javascript"&gt;
//TAMANHO: 932 bytes

// The -is- object is used to identify the browser.  Every browser edition
// identifies itself, but there is no standard way of doing it, and some of
// the identification is deceptive. This is because the authors of web
// browsers are liars. For example, Microsoft's IE browsers claim to be
// Mozilla 4. Netscape 6 claims to be version 5.

var is = {
    ie:      navigator.appName == 'Microsoft Internet Explorer',
    java:    navigator.javaEnabled(),
    ns:      navigator.appName == 'Netscape',
    ua:      navigator.userAgent.toLowerCase(),
    version: parseFloat(navigator.appVersion.substr(21)) ||
             parseFloat(navigator.appVersion),
    win:     navigator.platform == 'Win32'
}
is.mac = is.ua.indexOf('mac') >= 0;
if (is.ua.indexOf('opera') >= 0) {
    is.ie = is.ns = false;
    is.opera = true;
}
if (is.ua.indexOf('gecko') >= 0) {
    is.ie = is.ns = false;
    is.gecko = true;
}
&lt;/script&gt;
</pre>
<p>ficaria:</p>
<pre class="prettyprint">
&lt;script type="text/javascript"&gt;
// TAMANHO: 440 bytes
var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'}
is.mac=is.ua.indexOf('mac')>=0;if(is.ua.indexOf('opera')>=0){is.ie=is.ns=false;is.opera=true;}
if(is.ua.indexOf('gecko')>=0){is.ie=is.ns=false;is.gecko=true;}
&lt;/script&gt;
</pre>
<p>Como podem ver, apenas uma lógica simples já diminuiu em pouco mais de 50%. Esse é objetivo do JSMIN. Mas ainda existe uma outra maneira de compactar mais ainda seu código.</p>
<p>Essa <a href="http://joliclic.free.fr/php/javascript-packer/en/index.php">outra técnica</a> consiste em pegar as palavras usadas repetidas, como &#8220;function&#8221;, &#8220;var&#8221;, &#8220;alert&#8221;, e usar em seu lugar, uma variável de nome pequeno, como a, b, c. Depois, é feito um eval desse resultado que, via expressão regulares, irão substituir os a, b, c por seus nomes originais como &#8220;function&#8221;, &#8220;var&#8221;, &#8220;alert&#8221;, etc. Para pequenos códigos, essa técnina não faz muita diferença, mas para grandes códigos é muito mais eficiente. O mesmo código do exemplo anterior compactado ficaria:</p>
<pre class="prettyprint">
&lt;script type="text/javascript"&gt;
eval(function(p,a,c,k,e,d){while(c--){if(k[c]){p=p.replace(new RegExp('\b'+c.toString(a)+'\b','g'),k[c])}}return p}('j 1={5:2.7=='m k i',g:2.h(),6:2.7=='l',3:2.u.s(),t:9(2.b.r(q))||9(2.b),n:2.o=='p'}1.a=1.3.4('a')>=0;d(1.3.4('c')>=0){1.5=1.6=e;1.c=8}d(1.3.4('f')>=0){1.5=1.6=e;1.f=8}',31,31,'|is|navigator|ua|indexOf|ie|ns|appName|true|parseFloat|mac|appVersion|opera|if|false|gecko|java|javaEnabled|Explorer|var|Internet|Netscape|Microsoft|win|platform|Win32|21|substr|toLowerCase|version|userAgent'.split('|')))
&lt;/script&gt;
</pre>
<p>Neste caso ficou com 529 bytes. Mas experimente pegar grandes arquivos e passar essa compactação. Uso o framework <a href="http://gujs.com.br/blog/2007/04/mootools-otimo-framework-javascript/">MooTools</a> e baixei uma versão compactada, e outra normal. A versão normal tem 140kb, já a compactada ficou com 49kb. Muita diferença neh. Só não esqueça de ao usar essas compactações javascript, sempre guarde a versão original do arquivo, pois muitas vezes o código fica ilegível. Não é a toa que os compactadores são chamados também de ofuscadores.</p>
]]></content:encoded>
			<wfw:commentRss>http://gujs.com.br/blog/2007/04/compactacao-javascript/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MooTools - Ótimo framework JavaScript</title>
		<link>http://gujs.com.br/blog/2007/04/mootools-otimo-framework-javascript/</link>
		<comments>http://gujs.com.br/blog/2007/04/mootools-otimo-framework-javascript/#comments</comments>
		<pubDate>Mon, 30 Apr 2007 03:06:01 +0000</pubDate>
		<dc:creator>Rafael Quines</dc:creator>
		
		<category><![CDATA[Orientação à Objetos]]></category>

		<category><![CDATA[Frameworks e APIs]]></category>

		<category><![CDATA[Ajax]]></category>

		<category><![CDATA[Cross-browser]]></category>

		<guid isPermaLink="false">http://gujs.com.br/blog/2007/04/mootools-otimo-framework-javascript/</guid>
		<description><![CDATA[  MooTools é um framework javascript orientado a objetos. É muito fácil de usar e totalmente extensível, sendo simples para você criar suas classes usando recursos desse Frameworks. Baseado em Prototype, esse framework cria e sobrescreve métodos de objetos javascript já existentes, facilitando muito o seu uso. 
Segue uma maneira muito simples de fazer uma [...] ]]></description>
			<content:encoded><![CDATA[<p> <a href="http://www.mootools.net">MooTools</a> é um framework javascript orientado a objetos. É muito fácil de usar e totalmente extensível, sendo simples para você criar suas classes usando recursos desse Frameworks. Baseado em Prototype, esse framework cria e sobrescreve métodos de objetos javascript já existentes, facilitando muito o seu uso. </p>
<p>Segue uma maneira muito simples de fazer uma requisição ajax usando o mootools:</p>
<pre class="prettyprint">
&lt;script src="mootools.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
    var url = "./inc/ajax_processa.php";
    var params = {operacao: 'excluiUsuario', idUsuario: '50'};
    /*
    o postBody pode receber tanto uma querystring
    ("operacao=excluiUsuario&#038;idUsuario=50"), um objeto,
    como no exemplo, ou então um elemento form
    */
    var myAjax = new Ajax(url, {method: 'post', postBody: params}).request();
&lt;/script&gt;
</pre>
<p>Além de Ajax, o MooTools tem muitos outros recursos. Por exemplo, para quem já precisou pegar o tamanho da janela, sabe que é um problema para ser cross-browser, usando document.documentElement.clientWidth ou document.body.clientWidth. Você não teria esse problema. Apenas dar o include no arquivo do mootools, e o objeto window terá dois novos métodos: getWidth() e getHeight(). Muito interessante neh.</p>
<p>Algumas funções auxiliares também foram adicionados nos objetos javascript, como o método &#8220;trim()&#8221; em todas as strings, métodos de conversão de QueryString para Objeto JSON e vice-versa. Arrays ganharam novos métodos como forEach, extend, associate, remove. Elementos ganharam também getParent(), getTag(), getValue(), injectBefore(), injectAfter(), e muito mais.</p>
<p>Ainda não explorei tanto, mas uma coisa que dá pra notar é que o framework se propõe a facilitar ainda mais o dia-a-dia com JavaScript. Por favor, gostaria que comentassem a opinião dos leitores sobre o Mootools. Para quem não conhece, vale a pena pelo menos dar uma olhada.</p>
]]></content:encoded>
			<wfw:commentRss>http://gujs.com.br/blog/2007/04/mootools-otimo-framework-javascript/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Contagem regressiva</title>
		<link>http://gujs.com.br/blog/2007/04/contagem-regressiva/</link>
		<comments>http://gujs.com.br/blog/2007/04/contagem-regressiva/#comments</comments>
		<pubDate>Thu, 19 Apr 2007 00:02:43 +0000</pubDate>
		<dc:creator>Matheus Zeuch</dc:creator>
		
		<category><![CDATA[Downloads e Exemplos]]></category>

		<category><![CDATA[Cross-browser]]></category>

		<category><![CDATA[Tutoriais Intermediários]]></category>

		<guid isPermaLink="false">http://gujs.com.br/blog/2007/04/contagem-regressiva/</guid>
		<description><![CDATA[  Hoje vamos aprender a fazer um contador regressivo simples para uma data e hora futura. Nosso contador deve mostrar o resultado em um formato texto, numa tag span, para que seu estilo possa ser configurado. O resultado é interessante.
O código abaixo é a parte principal do nosso contador. Observe que utilizei variáveis para setar [...] ]]></description>
			<content:encoded><![CDATA[<p> Hoje vamos aprender a fazer um contador regressivo simples para uma data e hora futura. Nosso contador deve mostrar o resultado em um formato texto, numa tag span, para que seu estilo possa ser configurado. O resultado é interessante.</p>
<p>O código abaixo é a parte principal do nosso contador. Observe que utilizei variáveis para setar qual a data e hora futura. A vantagem disso é que essas variáveis podem ser atualizadas por uma outra função javascript, fazendo com que o nosso contador possa ser atualizado em tempo real (veremos isso em funcionamento no exemplo prático).</p>
<pre class="prettyprint">
var YY = 2007;
var MM = 12;
var DD = 31;
var HH = 23;
var MI = 59;
var SS = 59; 

function atualizaContador() {
  var hoje = new Date();
  var futuro = new Date(YY,MM-1,DD,HH,MI,SS); 

  var ss = parseInt((futuro - hoje) / 1000);
  var mm = parseInt(ss / 60);
  var hh = parseInt(mm / 60);
  var dd = parseInt(hh / 24); 

  ss = ss - (mm * 60);
  mm = mm - (hh * 60);
  hh = hh - (dd * 24); 

  var faltam = '';
  faltam += (dd &amp;&amp; dd &gt; 1) ? dd+' dias, ' : (dd==1 ? '1 dia, ' : '');
  faltam += (toString(hh).length) ? hh+' hr, ' : '';
  faltam += (toString(mm).length) ? mm+' min e ' : '';
  faltam += ss+' seg'; 

  if (dd+hh+mm+ss &gt; 0) {
    document.getElementById('contador').innerHTML = faltam;
    setTimeout(atualizaContador,1000);
  } else {
    document.getElementById('contador').innerHTML = 'CHEGOU!!!!';
    setTimeout(atualizaContador,1000);
  }
}</pre>
<p>A função <code>atualizaContador()</code> foi escrita de maneira que possa ser alterada facilmente. Você pode, por exemplo, alterar o código para que retorne o contador em vez de exibí-lo.</p>
<p>Abaixo está o código html que utilizei para demonstrar o funcionamento. Fiz com que o evento <code>onchange</code> dos campos atualizem as variáveis da data futura.</p>
<pre class="prettyprint">
&lt;body onload="atualizaContador()"&gt;
&lt;input size="1" onchange="DD=this.value" style="text-align: center" /&gt; /
&lt;input size="1" onchange="MM=this.value" style="text-align: center" /&gt; /
&lt;input size="4" onchange="YY=this.value" style="text-align: center" /&gt; às
&lt;input size="1" onchange="HH=this.value" style="text-align: center" /&gt; :
&lt;input size="1" onchange="MI=this.value" style="text-align: center" /&gt; :
&lt;input size="1" onchange="SS=this.value" style="text-align: center" /&gt;
&lt;br /&gt;
Faltam &lt;span id="contador"&gt;&lt;/span&gt;
&lt;/body&gt;</pre>
<p>Você pode ver um exemplo em funcionamento deste código aqui. Ou se preferir, pode baixar o código para estudar melhor.</p>
<p><a href="http://gujs.com.br/demo/contagem-regressiva"><strong>Exemplo</strong></a> | <a href="http://gujs.com.br/blog/wp-content/uploads/2007/04/contagem-regressiva.zip"><strong>Download</strong></a></p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://gujs.com.br/blog/2007/04/contagem-regressiva/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Barra de rolagem dinâmica com Ajax</title>
		<link>http://gujs.com.br/blog/2007/04/barra-de-rolagem-dinamica-com-ajax/</link>
		<comments>http://gujs.com.br/blog/2007/04/barra-de-rolagem-dinamica-com-ajax/#comments</comments>
		<pubDate>Thu, 12 Apr 2007 00:00:21 +0000</pubDate>
		<dc:creator>Matheus Zeuch</dc:creator>
		
		<category><![CDATA[Downloads e Exemplos]]></category>

		<category><![CDATA[DOM]]></category>

		<category><![CDATA[Ajax]]></category>

		<category><![CDATA[Tutoriais Avançados]]></category>

		<guid isPermaLink="false">http://gujs.com.br/blog/2007/04/barra-de-rolagem-dinamica-com-ajax/</guid>
		<description><![CDATA[  Um recurso muito interessante do Google Reader é a área onde são listados os posts dos feeds que você assina. Quando os posts são carregados, apenas alguns aparecem na tela, e conforme você vai rolando aquela página para baixo, os demais posts vão aparecendo pouco a pouco. Isso é uma forma de navegação pouco [...] ]]></description>
			<content:encoded><![CDATA[<p> Um recurso muito interessante do Google Reader é a área onde são listados os posts dos feeds que você assina. Quando os posts são carregados, apenas alguns aparecem na tela, e conforme você vai rolando aquela página para baixo, os demais posts vão aparecendo pouco a pouco. Isso é uma forma de navegação pouco utilizada na web, mas muito útil em alguns casos.</p>
<p>Além da vantagem de não precisar carregar mais itens que o necessário, o usuário também não perde de vista os posts que já estavam carregados quando os novos são exibidos. Este é um problema que acontece naquele conhecido modelo de paginação com os links das páginas e os de próxima página e página anterior.</p>
<p>O objetivo é carregar somente o número de mensagens que preencha o espaço na tela do usuário e, caso o usuário baixe até o final a barra de rolagem, o sistema carregue novas mensagens, mantendo na tela as anteriores. </p>
<p>No <a href="http://gujs.com.br/demo/scroll-ajax">exemplo deste artigo</a>, você pode ver na prática como funciona este modelo de paginação. Se preferir, <a href="http://gujs.com.br/blog/wp-content/uploads/2007/04/scroll-ajax.zip">baixe os códigos fontes</a> para fazer seus estudos e alterações.</p>
<p><strong>Como funciona?</strong> </p>
<p>Não vou me aprofundar explicando a utilização da classe Ajax utilizada no projeto, deixo isso para um futuro post. No momento, veremos as funções essenciais do exemplo, e a primeira delas é a função <code><strong>addLine()</strong></code>, que insere (via DOM) uma nova linha no div dos itens.</p>
<p>A função recebe como parâmetro um objeto contendo os atributos id e text e monta a linha que será inserida logo em seguida. Note que a função também controla a variável global <code>id</code> que será passada como parâmetro em todas as requisições dos notos itens. No nosso caso, apenas para que cada mensagem tenha um número maior que a anterior.</p>
<p>As funções <code><strong>paginationComplete()</strong></code> e <code><strong>pagination()</strong></code> são as responsáveis por fazer as requisições das próximas mensagens.</p>
<p>A função <code><strong>onScroll()</strong></code> verifica se a barra de rolagem está no rodapé da página. Se estiver, executa a função <code>pagination()</code>, que como vimos, fará a requisição das novas mensagens.</p>
<p>A função <code><strong>init()</strong></code> é quem chama pela primeira vez a função <code>pagination()</code>. Ela também atribui aos eventos <code>window.onscroll</code> e <code>window.onresize</code>, para que no sistema faça requisições sempre que ainda tiver espaço para novas mensagens.</p>
<p><strong>Onde utilizar o método?</strong></p>
<p>Utilizei este método (e estes mesmos códigos) em um sistema de monitoramento de mensagens, onde o usuário abria a tela de via as últimas mensagens, e conforme ia baixando a tela as mensagens antigas eram carregadas (até que não houvessem mais mensagens antigas no banco). Outro sistema de refresh fazia as requisições das novas mensagens, que eram exibidas no topo. Com isso consegui um bom sistema de monitoramento em tempo real de mensagens, e que ao mesmo tempo era prático para visualizar mensagens antigas.</p>
<p>Você pode usar sua imaginação para utilizar estes códigos em seus projetos. Acho que é um bom exemplo de se usar em sistemas de mensagens, leitor de e-mails, agregador de feeds rss, e em qualquer lugar onde o método convencional de paginação não é a melhor opção.</p>
<p><strong>Considerações finais</strong></p>
<p>Testei o exemplo no Firefox e no IE 7, portanto, se você encontrar algum erro por favor me avise que eu corrijo.</p>
<p>Se tiver dúvidas ou quiser fazer algum comentário sobre o artigo e o exemplo, sinta-se à vontade para utilizar o formulário de comentários abaixo ou então <a href="http://gujs.com.br/forum/viewtopic.php?p=502" title="Acompanhe a discussão no Fórum">acompanhar a discussão no fórum</a>.</p>
<p>Divirta-se!</p>
<p><a href="http://gujs.com.br/demo/scroll-ajax" title="Veja o exemplo"><strong>Exemplo</strong></a> | <a href="http://gujs.com.br/blog/wp-content/uploads/2007/04/scroll-ajax.zip" title="Faça o download dos arquivos"><strong>Download</strong></a></p>
]]></content:encoded>
			<wfw:commentRss>http://gujs.com.br/blog/2007/04/barra-de-rolagem-dinamica-com-ajax/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Movendo itens entre list boxs</title>
		<link>http://gujs.com.br/blog/2007/04/movendo-itens-entre-list-boxs/</link>
		<comments>http://gujs.com.br/blog/2007/04/movendo-itens-entre-list-boxs/#comments</comments>
		<pubDate>Tue, 10 Apr 2007 02:40:53 +0000</pubDate>
		<dc:creator>Rafael Quines</dc:creator>
		
		<category><![CDATA[DOM]]></category>

		<category><![CDATA[Cross-browser]]></category>

		<category><![CDATA[Tutoriais Básicos]]></category>

		<guid isPermaLink="false">http://gujs.com.br/blog/2007/04/movendo-itens-entre-list-boxs/</guid>
		<description><![CDATA[  Hoje em dia, este é um recurso muito usado em formulários em geral. Permite que sejam selecionados vários itens para um relatório, por exemplo. Normalmente se tem um listbox com os ítens disponíveis, e outro, inicialmente vazio, ficam os itens selecionados na primeira list.
Um bom exemplo seria em um cadastro de vendedor, o usuário [...] ]]></description>
			<content:encoded><![CDATA[<p> Hoje em dia, este é um recurso muito usado em formulários em geral. Permite que sejam selecionados vários itens para um relatório, por exemplo. Normalmente se tem um listbox com os ítens disponíveis, e outro, inicialmente vazio, ficam os itens selecionados na primeira list.</p>
<p>Um bom exemplo seria em um cadastro de vendedor, o usuário deve selecionar as cidades que aquele vendedor atua. Numa list, aparece todas as cidades cadastradas. Na outra, só as seleiconadas para aquele vendedor.</p>
<p>Em primeiro lugar, teremos 2 lists: listOrigem e a listDestino.</p>
<pre class="prettyprint">
&lt;select name="listOrigem" id="listOrigem" MULTIPLE size="10"&gt;
&lt;option value="1"&gt;Porto Alegre&lt;/option&gt;
&lt;option value="2"&gt;São Paulo&lt;/option&gt;
&lt;option value="3"&gt;Rio de Janeiro&lt;/option&gt;
&lt;option value="4"&gt;Natal&lt;/option&gt;
&lt;option value="5"&gt;Fortaleza&lt;/option&gt;
&lt;/select&gt;

&lt;select name="listDestino" id="listDestino" MULTIPLE size="10"&gt;
&lt;/select&gt;
</pre>
<p>e quatro simples funções, facilmente adaptáveis para o uso em outras situações:</p>
<pre class="prettyprint">
//1. Para passar todos os ítens da list de origem para a de destino:

function allLeft2Right() {
  var listOri = document.getElementById("listOrigem")
  var listDest = document.getElementById("listDestino");
  for(var i = 0; i < listOri.length; i++) {
    var opcao = listOri.options[i];
    var novaOpcao = new Option(opcao.text, listDest.length);
    novaOpcao.value = opcao.value;
    listOri.remove(i);
    try {
      listDest.add(novaOpcao,null);
    } catch (e) {
      listDest.add(novaOpcao);
    }
    i--;
  }
}

//2. função para passar todos os ítens do destino para a origem:

function allRight2Left() {
  var listOri = document.getElementById("listOrigem")
  var listDest = document.getElementById("listDestino");
  for(var i = 0; i < listDest.length; i++) {
    var opcao = listDest.options[i];
    var novaOpcao = new Option(opcao.text, listOri.length);
    novaOpcao.value = opcao.value;
    listDest.remove(i);
    try {
      listOri.add(novaOpcao,null);
    } catch (e) {
      listOri.add(novaOpcao);
    }
    i--;
  }
}

//3. Função para apenas os ítens selecionados da origem para o destino:

function left2Right() {
  var listOri = document.getElementById("listOrigem")
  var listDest = document.getElementById("listDestino");
  for(var i = 0; i < listOri.length; i++) {
    var opcao = listOri.options[i];
    if(opcao.selected) {
      var novaOpcao = new Option(opcao.text, listDest.length);
      novaOpcao.value = opcao.value;
      listOri.remove(i);
      try {
        listDest.add(novaOpcao,null); //Firefox
      } catch(e) {
        listDest.add(novaOpcao); //IE
      }
      i--;
    }
  }
}

//4. e por último, para passar os ítens marcados do destino para a origem

function right2Left() {
  var listOri = document.getElementById("listOrigem")
  var listDest = document.getElementById("listDestino");
  for(var i = 0; i < listDest.length; i++) {
    var opcao = listDest.options[i];
    if(opcao.selected) {
      var novaOpcao = new Option(opcao.text, listOri.length);
      novaOpcao.value = opcao.value;
      listDest.remove(i);
      try {
        listOri.add(novaOpcao,null);
      } catch (e) {
        listOri.add(novaOpcao);
      }
      i--;
    }
  }
}
</pre>
<p>Exemplo funcionando:</p>
<table>
<tr>
<td>
<select name="listOrigem" id="listOrigem" MULTIPLE size="10">
<option value="1">Porto Alegre</option><br />
<option value="2">São Paulo</option><br />
<option value="3">Rio de Janeiro</option><br />
<option value="4">Natal</option><br />
<option value="5">Fortaleza</option><br />
</select>
</td>
<td>
<input type="button" value="&gt;" onclick="left2Right();"/><br/><br/></p>
<input type="button" value="&gt;&gt;" onclick="allLeft2Right()"/><br/><br/></p>
<input type="button" value="&lt;&lt;" onclick="allRight2Left()"/><br/><br/></p>
<input type="button" value="&lt;" onclick="right2Left();"/><br/><br/>
</td>
<td>
<select name="listDestino" id="listDestino" MULTIPLE size="10">
</select>
</td>
</tr>
</table>
<script type="text/javascript">
function allLeft2Right() {
  var listOri = document.getElementById("listOrigem")
  var listDest = document.getElementById("listDestino");
  for(var i = 0; i < listOri.length; i++) {
    var opcao = listOri.options[i];
    var novaOpcao = new Option(opcao.text, listDest.length);
    novaOpcao.value = opcao.value;
    listOri.remove(i);
    try {
      listDest.add(novaOpcao,null);
    } catch (e) {
      listDest.add(novaOpcao);
    }
    i--;
  }
}
//2. função para passar todos os ítens do destino para a origem:
function allRight2Left() {
  var listOri = document.getElementById("listOrigem")
  var listDest = document.getElementById("listDestino");
  for(var i = 0; i < listDest.length; i++) {
    var opcao = listDest.options[i];
    var novaOpcao = new Option(opcao.text, listOri.length);
    novaOpcao.value = opcao.value;
    listDest.remove(i);
    try {
      listOri.add(novaOpcao,null);
    } catch (e) {
      listOri.add(novaOpcao);
    }
    i--;
  }
}
//3. Função para apenas os ítens selecionados da origem para o destino:
function left2Right() {
  var listOri = document.getElementById("listOrigem")
  var listDest = document.getElementById("listDestino");
  for(var i = 0; i < listOri.length; i++) {
    var opcao = listOri.options[i];
    if(opcao.selected) {
      var novaOpcao = new Option(opcao.text, listDest.length);
      novaOpcao.value = opcao.value;
      listOri.remove(i);
      try {
        listDest.add(novaOpcao,null); //Firefox
      } catch(e) {
        listDest.add(novaOpcao); //IE
      }
      i--;
    }
  }
}
//4. e por último, para passar os ítens marcados do destino para a origem
function right2Left() {
  var listOri = document.getElementById("listOrigem")
  var listDest = document.getElementById("listDestino");
  for(var i = 0; i < listDest.length; i++) {
    var opcao = listDest.options[i];
    if(opcao.selected) {
      var novaOpcao = new Option(opcao.text, listOri.length);
      novaOpcao.value = opcao.value;
      listDest.remove(i);
      try {
        listOri.add(novaOpcao,null);
      } catch (e) {
        listOri.add(novaOpcao);
      }
      i--;
    }
  }
}
</script>
<p>Agora é só vc adaptar. Se preferir que no OnDblClick no combo de origem passar para o destino, é só colocar no OnDblClick do listOrigem a chamada ao left2Right. Poderia criar dois botões também para passar todos os ítens de um campo para o outro.</p>
<p>Bom, espero ter ajudado. Muitas vezes já procurei um artigo como esse, com exemplos na WEB, porém não encontrei. Então fica aqui minha contribuição.</p>
]]></content:encoded>
			<wfw:commentRss>http://gujs.com.br/blog/2007/04/movendo-itens-entre-list-boxs/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ordenando um array numérico</title>
		<link>http://gujs.com.br/blog/2007/03/ordenando-um-array-numerico/</link>
		<comments>http://gujs.com.br/blog/2007/03/ordenando-um-array-numerico/#comments</comments>
		<pubDate>Thu, 29 Mar 2007 15:01:31 +0000</pubDate>
		<dc:creator>Matheus Zeuch</dc:creator>
		
		<category><![CDATA[Cross-browser]]></category>

		<category><![CDATA[Tutoriais Básicos]]></category>

		<guid isPermaLink="false">http://gujs.com.br/blog/2007/03/ordenando-um-array-numerico/</guid>
		<description><![CDATA[  Um pequeno impecílho, na hora de ordenar um vetor número em javascript, pode deixar o programador com um pouco de dor de cabeça. O método sort() do objeto Array utiliza um algoritmo de ordenação de caracteres para ordenar os itens do array, ou seja, quando você quer ordenar um array de números, ele coloca [...] ]]></description>
			<content:encoded><![CDATA[<p> Um pequeno impecílho, na hora de ordenar um vetor número em javascript, pode deixar o programador com um pouco de dor de cabeça. O método <code>sort()</code> do objeto <code>Array</code> utiliza um algoritmo de ordenação de caracteres para ordenar os itens do array, ou seja, quando você quer ordenar um array de números, ele coloca o 10 antes do 2, por exemplo. Veja como resolver isto.</p>
<pre class="prettyprint">[4,7,2,10,35,67,3,2].sort(function(){return arguments[0] - arguments[1];});</pre>
<p>Note que estamos passando um parâmetro para o método <code>sort()</code>. Esse parâmetro é a função que vamos utilizar para determinar se qual dos dois itens é maior. Se não passarmos esse parâmetro para o <code>sort</code>, ele vai considerar que os itens do array são caracteres.</p>
<p>Você também pode criar um novo método para o objeto <code>Array</code>, o que lhe permite usar este novo método em qualquer array. Para isso, vamos usar o conceito de <code>prototype</code> do javascript. Veja como ficou nosso novo método para ordenar vetores numéricos:</p>
<pre class="prettyprint">Array.prototype.sortnum = function() {
  return this.sort(function(){return arguments[0] - arguments[1];});
}</pre>
<p>Para finalizar, preparei um exemplo para vocês demonstrando os resultados da ordenação normal e da utilizando nosso novo método <code>sortnum</code>.</p>
<p><strong><a href="http://gujs.com.br/demo/ordenando-array-numerico/">Exemplo</a></strong> | <strong><a href="http://gujs.com.br/blog/wp-content/uploads/2007/03/ordenando-array-numerico.zip">Download</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://gujs.com.br/blog/2007/03/ordenando-um-array-numerico/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Tutorial básico sobre Ajax</title>
		<link>http://gujs.com.br/blog/2007/03/tutorial-basico-sobre-ajax/</link>
		<comments>http://gujs.com.br/blog/2007/03/tutorial-basico-sobre-ajax/#comments</comments>
		<pubDate>Tue, 27 Mar 2007 11:34:51 +0000</pubDate>
		<dc:creator>Eduardo Bohrer</dc:creator>
		
		<category><![CDATA[Diversos]]></category>

		<category><![CDATA[Ajax]]></category>

		<category><![CDATA[Cross-browser]]></category>

		<category><![CDATA[Tutoriais Básicos]]></category>

		<guid isPermaLink="false">http://gujs.com.br/blog/2007/03/tutorial-basico-sobre-ajax/</guid>
		<description><![CDATA[  Asynchronous Javascript and XML, mais conhecido como AJAX.
O que é Ajax?
Ajax foi criado com o principio de ser uma maneira rápida e otimizada de podermos fazer requisições WEB, sendo esta totalmente transparente ao usuário.
Sabemos que todo o tipo de acesso a dados de um servidor de sites na internet, roda encima de requisições WEB(Requisições [...] ]]></description>
			<content:encoded><![CDATA[<p> <em><strong>Asynchronous Javascript and XML</strong>, mais conhecido como <strong>AJAX</strong>.</em></p>
<p><strong>O que é Ajax?</strong><br />
Ajax foi criado com o principio de ser uma maneira rápida e otimizada de podermos fazer requisições WEB, sendo esta totalmente transparente ao usuário.</p>
<p>Sabemos que todo o tipo de acesso a dados de um servidor de sites na internet, roda encima de requisições WEB(Requisições via Protocolo HTTP ao servidor de destino), e por resposta o servidor também com o mesmo protocolo retorna os dados solicitados, tais como HTML&#8217;s.</p>
<p>Este processo normalmente não é notado na visão do usuário, mas é isso que acontece quando digitamos em nosso navegador de internet um endereço da WEB.O ajax por sua vez também roda encima desta lógica.</p>
<p><strong>Mas e afinal, para que usamos o Ajax?</strong></p>
<p>Hoje esta tecnologia é utilizada para uma infinidade de processos, mas o que precisamos saber não é o que fazer com ele, mas sim saber como ele trabalha para podermos adequar tal tecnologia em nosso dia-a-dia.<br />
Um Exemplo Básico da utilização de ajax, é um refresh de página, sem que o usuário necessite faze-lo.</p>
<p>O programador que cria a página, programa uma requisição ajax, para que busque novos dados no servidor em um limite de tempo, e então também por javascript, altera a visualização do usuário, talvez inserindo linhas em uma tabela ou algo do gênero, assim dando um aspecto de atualização automática.</p>
<p><strong>Como Utilizar?</strong></p>
<p>Hoje, o ajax é suportado pelos principais browsers disponíveis no mercado, e utilizados pela comunidade WEB.</p>
<p>Para isso utilizados objetos javascript, que rodam encima do browser do usuário e transitam dados por estas requisições.</p>
<p>Assim sendo, podemos fazer interações com processos de servidor, sem que seja necessário por exemplo recarregar a página do usuário, ou mesmo se quer visualize tal iteração.</p>
<p><em>Vejamos um exemplo básico.</em></p>
<pre class="prettyprint">
//variavel ajax
var ajax = null;

//função que faz a requisição ajax
function requisicaoAjax(){
    //utilizado para requisições no browser Internet Explorer
    if (window.ActiveXObject) ajax = new ActiveXObject('Microsoft.XMLHTTP');
    //utilizado como o padrão javascript para requisições AJAX.
    else if (window.XMLHttpRequest) ajax = new XMLHttpRequest();
    //se a variável ajax for nula, logo o browser não suporta tal tecnologia
    if(ajax != null){
      //abre a requisição ajax, passando o método de acesso, a url solicitada e o parâmetro sobre sincronia
      ajax.open('GET','http://gujs.com.br/',false);
      //seta a funcao que sera chamada quando o ajax for retornado
      ajax.onreadystatechange = statusAjax;
      //inicia o tranporte
      ajax.send(null);
    }
}

//função que trata o retorno ajax
function statusAjax(){
  //caso o status do ajax esteja ok, então chama a função retornoAjax enviando o retorno da requisição como parâmetro
  if(ajax.readyState == 4 &amp;&amp; ajax.status == 200){
    retornoAjax(ajax.responseText);
  }
}

//função que é chamada quando o ajax for retornado
function retornoAjax(response){
  //dá um alerta no texto de retorno
  alert(response);
}
requisicaoAjax();</pre>
<p>1º) Criamos um objeto para o transporte do ajax;</p>
<p>2º) Setamos ao objeto as diretivas da solicitação como a url a ser solicitado e o método. O terceiro parâmetro é se deve ser assíncrono ou não, no caso estamos passando false, para o javascript aguardar o retorno da requisição.</p>
<p>3º) Indicamos qual será a função que ira fazer o tratamento de estados da requisição. (O status da requisição é retornado pelo browser para tratamento a cada vez que este status muda).<br />
Você pode ver a listagem completa de status aqui: <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html">http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html</a></p>
<p>Quando dizemos</p>
<pre class="prettyprint">
ajax.onreadystatechange = statusAjax;</pre>
<p>Estamos indicando que toda a vez que este ajax mudar de status, ele deve chamar esta função.</p>
<p>No nosso caso, o único status interessante é o status de requisição ok.</p>
<p>Se a requisição retornar um status ok, então a partir daí trabalharemos em nosso refresh, como dito acima, onde trataríamos os dados retornados e aplicaríamos na visualização do usuário;</p>
<p>Uma coisa que devemos considerar e que por sua vez é de grande importância, é que não podemos fazer requisições Ajax a outro domínio diferente ao que o site atual roda.<br />
Por exemplo:<br />
Sendo que minha página exemplo_ajax.htm estivesse dentro de http://www.gujs.com.br/, só poderei fazer requisições ajax para arquivos que fiquem dentro de http://www.gujs.com.br/.</p>
<p>Este exemplo é bem simples, mas apenas para podermos ter uma noção de como funciona uma requisição ajax.</p>
<p>Existem hoje, várias bibliotecas javascript para formalizar tais requisições, bibliotecas que fazem o controle de estados inválidos da requisição, ou mesmo que facilitam o transporte de requisições via método POST.</p>
<p>O intuito deste artigo é simplesmente desmistificar este fênomeno chamado ajax.</p>
<p>Fique a vontade para deixarem comentários, ou entrar em contato ok?</p>
<p>Até a próxima pessoal;</p>
]]></content:encoded>
			<wfw:commentRss>http://gujs.com.br/blog/2007/03/tutorial-basico-sobre-ajax/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ordenando listas com Javascript</title>
		<link>http://gujs.com.br/blog/2007/03/ordenando-listas-com-javascript/</link>
		<comments>http://gujs.com.br/blog/2007/03/ordenando-listas-com-javascript/#comments</comments>
		<pubDate>Mon, 26 Mar 2007 18:26:01 +0000</pubDate>
		<dc:creator>Matheus Zeuch</dc:creator>
		
		<category><![CDATA[Downloads e Exemplos]]></category>

		<category><![CDATA[Orientação à Objetos]]></category>

		<category><![CDATA[DOM]]></category>

		<category><![CDATA[Cross-browser]]></category>

		<category><![CDATA[Tutoriais Avançados]]></category>

		<guid isPermaLink="false">http://gujs.com.br/blog/2007/03/ordenando-listas-com-javascript/</guid>
		<description><![CDATA[  A classe SortableList é um pequeno exemplo de utilização de métodos DOM sendo utilizados para facilitar a ordenação de itens de uma lista.
Para utilizar a classe, basta importar o arquivo js e instanciar um objeto que estará associado à sua lista. Feito isso você pode criar seus próprios links para manipular os eventos de [...] ]]></description>
			<content:encoded><![CDATA[<p> A classe <code>SortableList</code> é um pequeno exemplo de utilização de métodos DOM sendo utilizados para facilitar a ordenação de itens de uma lista.</p>
<p>Para utilizar a classe, basta importar o arquivo js e instanciar um objeto que estará associado à sua lista. Feito isso você pode criar seus próprios links para manipular os eventos de ordenação da lista (mover para cima ou para baixo). Veja o exemplo abaixo:</p>
<pre class="prettyprint">var bozo;

function init() { bozo = new SortableList($('list')); } //&lt;ul id="list"&gt;

window.onload = init;</pre>
<p>Ao instanciar o <code>SortableList</code> você também pode definir duas opções interessantes:</p>
<ul>
<li><strong>A primeira é o &#8220;rotate&#8221;</strong>, que define se os itens vão girar ou não (<code>true</code> ou <code>false</code>), ou seja, se o primeiro da lista vai para baixo quando o usuário clicar para cima, e vice-versa, quando o último item se torna o primeira ao clicar para baixo.</li>
<li><strong>E a segunda é o onComplete</strong>, onde você pode setar uma função que será executada toda vez que a lista for reordenada. Nesta função você pode, por exemplo, fazer uma requisição Ajax que salvará a ordenação no seu banco de dados, onde você pode, para isso, acessar o atributo &#8220;<code>list</code>&#8220;, que contém a lista ordenada.</li>
</ul>
<p><strong><a href="http://gujs.com.br/demo/sortable-list/">Exemplo</a></strong> | <strong><a href="http://gujs.com.br/blog/wp-content/uploads/2007/03/sortable-list.zip">Download</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://gujs.com.br/blog/2007/03/ordenando-listas-com-javascript/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Fórum do GUJS crescendo a cada dia</title>
		<link>http://gujs.com.br/blog/2007/03/forum-do-gujs-crescendo-a-cada-dia/</link>
		<comments>http://gujs.com.br/blog/2007/03/forum-do-gujs-crescendo-a-cada-dia/#comments</comments>
		<pubDate>Fri, 23 Mar 2007 18:54:34 +0000</pubDate>
		<dc:creator>Matheus Zeuch</dc:creator>
		
		<category><![CDATA[Notícias]]></category>

		<guid isPermaLink="false">http://gujs.com.br/blog/2007/03/forum-do-gujs-crescendo-a-cada-dia/</guid>
		<description><![CDATA[ O GUJS é um projeto novo, lançado a menos de um mês. A idéia é se tornar, com o tempo, um portal referência de javascript no Brasil. Aqui você encontrará notícias e artigos (de básicos à avançados) sobre a tecnologia. Por enquanto o blog ainda está pequeno, mas o fórum está crescendo a cada dia. [...] ]]></description>
			<content:encoded><![CDATA[<p>O GUJS é um projeto novo, lançado a menos de um mês. A idéia é se tornar, com o tempo, um portal referência de javascript no Brasil. Aqui você encontrará notícias e artigos (de básicos à avançados) sobre a tecnologia. Por enquanto o blog ainda está pequeno, mas o <a href="http://gujs.com.br/forum/">fórum está crescendo a cada dia</a>. Nós, da equipe do GUJS, solicitamos a todos que puderem colaborar com a comunidade a se cadastrarem no Fórum e começarem a postar e responder os tópicos.</p>
<p>O GUJS é um projeto independente, e por isso a sua ajuda é fundamental para que o site cresça. <a href="http://gujs.com.br/forum/"><strong>Visite o fórum e participe!</strong></a></p>
]]></content:encoded>
			<wfw:commentRss>http://gujs.com.br/blog/2007/03/forum-do-gujs-crescendo-a-cada-dia/feed/</wfw:commentRss>
		</item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 11.368 seconds --><!-- Cached page served by WP-Cache -->
