<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><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/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Davi Ferreira blog!</title>
	
	<link>http://www.daviferreira.com/blog</link>
	<description>Blog sobre desenvolvimento web, design e gambiarras.</description>
	<pubDate>Sat, 13 Dec 2008 05:20:12 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/DaviFerreiraBlog" type="application/rss+xml" /><item>
		<title>Esqueça as funções javascript alert() e confirm()</title>
		<link>http://feeds.feedburner.com/~r/DaviFerreiraBlog/~3/459589093/esqueca-as-funcoes-javascript-alert-e-confirm.html</link>
		<comments>http://www.daviferreira.com/blog/2008/11/20/esqueca-as-funcoes-javascript-alert-e-confirm.html#comments</comments>
		<pubDate>Thu, 20 Nov 2008 15:04:21 +0000</pubDate>
		<dc:creator>Davi Ferreira</dc:creator>
		
		<category><![CDATA[Interfaces]]></category>

		<category><![CDATA[Javascript]]></category>

		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.daviferreira.com/blog/?p=28</guid>
		<description><![CDATA[Uma das coisas que mais me incomoda em sistemas web é a enorme quantidade de alertas do sistema. Confirmações, perguntas, informações — todos utilizando o visual padrão do sistema operacional. É impressionante a quantidade de sistemas que insistem em bombardear o usuário com os famigerados alert() e confirm() do javascript. No entanto, para nossa felicidade, [...]]]></description>
			<content:encoded><![CDATA[<p>Uma das coisas que mais me incomoda em sistemas web é a enorme quantidade de alertas do sistema. Confirmações, perguntas, informações — todos utilizando o visual padrão do sistema operacional. É impressionante a quantidade de sistemas que insistem em bombardear o usuário com os famigerados <em>alert()</em> e <em>confirm()</em> do javascript. No entanto, para nossa felicidade, a evolução do javascript permitiu que estes verdadeiros inimigos da usabilidade fossem substituídos por versões mais elegantes e amigáveis. Conheça uma delas, o plugin <strong>m2brDialog</strong>, para jQuery.</p>
<span id="more-28"></span>
<p>Apesar de neste artigo você conferir um método para substituir as janelas padrões de sistema, gostaria de começar com o seguinte conselho: evite o uso de confirmações. O Windows Vista é a maior prova de que inúmeras perguntas e avisos incomodam — e <em>muito</em> — qualquer usuário. Algumas alternativas incluem avisos de confirmação mais discretos, como o modelo lançado pelo Google, exibido no canto superior da tela, ou perguntas <em>inline</em>, exibidas de forma dinâmica diretamente no miolo do sistema. É claro que, em alguns casos, é necessário impedir que o usuário clique ou execute qualquer funcionalidade antes de confirmar a ação. É aí que entra o m2brDialog.</p>
<p>O objetivo principal deste plugin é substituir completamente o uso de alertas e confirmações padrões. Possui como dependências o framework javascript <a href="http://www.jquery.com">jQuery</a>, além de sua <a href="http://ui.jquery.com">extensão para interfaces</a> caso você queira habilitar a opção de arrastar a janela. O m2brDialog funciona baseado no evento clique e seu visual é totalmente customizável, todo baseado em CSS — o tema padrão utiliza o set de ícones <a href="http://tango.freedesktop.org/Tango_Icon_Gallery">Tango</a>, mas nada impede que você implemente suas próprias imagens.</p>
<p>Caso você precise de uma introdução ao jQuery, leia os primeiros parágrafos de meu <a href="http://www.daviferreira.com/blog/2007/08/12/interface-drag-and-drop-com-jquery.html">artigo sobre uma interface drag and drop utilizando o framework</a>.</p>

<p class="info">Download: <a href="http://code.google.com/p/m2brdialog/downloads/list">m2brDialog</a></p>
<h3>Opções da extensão jQuery m2brDialog()</h3>
<p>Confira o conjunto de opções disponíveis para configurar o alerta exibido:</p>
<table class="propriedades">
	<tr>
    	<td class="opcao">largura</td>
      <td class="descricao">valor inteiro que define a largura do aviso, em pixels</td>
    </tr>
	<tr>
    	<td class="opcao">altura</td>
      <td class="descricao">valor inteiro que define a altura do aviso, em pixels</td>
    </tr>
	<tr>
	  <td class="opcao">tipo</td>
	  <td class="descricao"><em>string</em> indicando o tipo do aviso, estando disponíveis as seguintes opções: alerta, erro, pergunta e info</td>
  </tr>
	<tr>
	  <td class="opcao">titulo</td>
	  <td class="descricao"><em>string</em> a ser exibida no título do aviso</td>
  </tr>
	<tr>
	  <td class="opcao">texto</td>
	  <td class="descricao">conteúdo da mensagem do alerta</td>
  </tr>
	<tr>
	  <td class="opcao">draggable</td>
	  <td class="descricao"><em>true</em> ou <em>false</em> para definir se o usuário pode arrastar e mover o aviso (depende da extensão jQuery UI)</td>
  </tr>
	<tr>
	  <td class="opcao">botoes</td>
	  <td class="descricao"><em>array</em> com o conteúdo, tipo e links dos botões do aviso</td>
  </tr>
	<tr>
	  <td class="opcao">tempoExibicao</td>
	  <td class="descricao">tempo de duração da exibição do alerta, em segundos</td>
  </tr>
	<tr>
	  <td class="opcao">condicao</td>
	  <td class="descricao"><em>array</em> com funções que determinam a condição se o alerta deve ser exibido ou não (saiba mais abaixo)</td>
  </tr>    
</table>
<h3>m2brDialog na pr&aacute;tica</h3>
<p>Faça a chamada para os arquivos javascript do jQuery e do plugin m2brDialog dentro da <em>tag</em> &lt;head&gt; de seu HTML, bem como o link para a folha de estilos.</p>
<p>
  <textarea name="code" class="javascript" rows="10" cols="60">
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;m2br.dialog.css&quot; /&gt;
&lt;script src=&#034;jquery.js&#034;&gt;&lt;/script&gt;
&lt;script src=&#034;jquery.m2brdialog.pack.js&#034;&gt;&lt;/script&gt;
</textarea>
</p>
<p>No exemplo abaixo, buscamos todos os elementos &lt;a&gt; (links) que possuam a classe &quot;link-alerta&quot; e atribuímos um alerta com a mensagem &quot;Teste m2brDialog&quot;:</p>
<textarea name="code" class="javascript" rows="10" cols="60">
$(document).ready(function(){
	$(&#039;a.link-alerta&#039;).m2brDialog({
    	largura		: &#039;300&#039;,
        altura		: &#039;120,
        tipo		: &#039;alerta&#039;,
        titulo		: &#039;TESTE&#039;,
        texto		: &#039;Teste m2brDialog&#039;
    });
});
</textarea>
<p>Agora vamos criar uma janela de confirmação em todos os elementos com a classe &quot;m2brdialog-pergunta&quot;, com os botões confirmar e cancelar. Caso o usuário clique em confirmar, será redirecionado para o link www.daviferreira.com. A janela também terá a propriedade de <em>drag and drop</em>:</p>
<textarea name="code" class="javascript" rows="10" cols="60">
$(document).ready(function(){
    $(&#039;.m2brdialog-pergunta&#039;).m2brDialog({
        tipo: 		&#039;pergunta&#039;,
        titulo:		&#039;Confirme&#039;,
        texto:		&#039;Tem certeza que deseja executar esta opera&ccedil;&atilde;o?&#039;,
        draggable: true,
        botoes: {
            1: {
                label: &#039;confirmar&#039;,
                tipo: &#039;link&#039;,
                endereco: &#039;http://www.daviferreira.com&#039;
            },
            2: {
                label: &#039;cancelar&#039;,
                tipo: &#039;fechar&#039;
            }
        }
    });	
});    
</textarea>
<h3>Funções condicionais</h3>
<p>Em alguns casos, precisaremos de uma condição para exibir ou não o alerta. Por exemplo, em um formulário, exibir a mensagem de alerta apenas se algum campo obrigatório não tiver sido preenchido. É para isto que serve o parâmetro de configuração avançada <strong>condicao</strong>. Esta propriedade recebe um vetor com duas funções. A primeira representa a condição e a segunda a URL de retorno caso esta condição seja verdadeira. Vejamos como funcionaria no exemplo do formulário citado anteriormente:</p>
<p>
  <textarea name="code" class="javascript" rows="10" cols="60">
<form name="frm-newsletter" id="frm-newsletter" method="post" action="">
    <label for="email">Seu e-mail</label>
    <input type="text" name="email" id="email" size="60" />
    <input type="button" id="btn-newsletter" value="OK" />
</form>

<script type="text/javascript">
$(document).ready(function(){
    $('#btn-newsletter').m2brDialog({
        tipo			: 'erro',
        titulo			: 'Erro!',
        texto			: 'Por favor, preencha o campo e-mail',
        condicao		: {
            origem		: function() { 
							return ($('#email').val() ? true : false); 
			},
            retorno		: function() { return true; }
        }
    });
});
</script>
</textarea>
</p>
<p>Note que na opção de configuração <strong>condicao</strong> são passados dois valores: <strong>origem</strong> e <strong>retorno</strong>. Na origem estamos validando o campo de id email, verificando se ele foi preenchido. Caso retorne <em>true</em>, ou seja, caso ele esteja preenchido, o alerta é ignorado e o script executa a função retorno — no nosso exemplo um simples <em>return true;</em>. O alerta de erro apenas será exibido caso o campo esteja vazio.</p>
<p class="info">Demo: <a href="/blog/exemplos/m2brdialog/index.html">veja o m2brDialog em ação!</a></p>
<h3>Pra finalizar, uma gambiarra</h3>
<p>Nem sempre o alerta será exibido a partir de um clique em algum link ou botão. Uma função AJAX, por exemplo, pode retornar um alerta. Neste caso, utilizamos o código abaixo:</p>
<textarea name="code" class="javascript" rows="10" cols="60">
var alertaPadrao = function(titulo, msg, tipo, altura, largura) {
		$(&#039;body&#039;).append(&#039;<a href="#" id="alerta-padrao"></a>&#039;);
		$(&#039;#alerta-padrao&#039;).m2brDialog({
				draggable: true,
				texto: msg,
				tipo: tipo,
				titulo: titulo,
				altura: altura,
				largura: largura,
				botoes: {
					1: {
						label: &#039;Fechar&#039;,
						tipo: &#039;fechar&#039;
					}
				}									   
		});
		$(&#039;#alerta-padrao&#039;)
			.click()
			.remove();
};
</textarea>
<p>Sim, uma tremenda de uma gambiarra! O que este código faz é criar um elemento &lt;a&gt;, simular seu clique e depois destruí-lo. Vamos supor que sua função retorna um aviso de operação concluída. Seria só chamar o nosso alertaPadrao desse jeito:</p>

  <p>
    <textarea name="code" class="javascript" rows="10" cols="60">
<script type="text/javascript">
$(document).ready(function(){
	alertaPadrao('Informa&ccedil;&atilde;o:', 'Opera&ccedil;&atilde;o conclu&iacute;da com sucesso.', 'info', 110, 250);
});
</script>
  </textarea>
    
  </p>




  <p>E aí, curtiu? Em caso de dúvidas ou sugestões, <a href="#comments">envie um comentário utilizando o formulário abaixo</a>. Até a próxima!</p>


<h3>Atualizações [26/11/2008]</h3>
<p>Código-fonte e arquivo CSS do script atualizados com correções enviadas pelo leitor <strong>Rômulo</strong>, envolvendo bugs nas versões 6 e 7 do Internet Explorer. Valeu, Rômulo! <img src='http://www.daviferreira.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>


<h3>Atualizações [08/12/2008]</h3>
<p>A rapaziada levantou a bola nos coment&aacute;rios sobre como passar um c&oacute;digo din&acirc;mico para nossa janela de confirma&ccedil;&atilde;o, para o caso de uma listagem com exclus&atilde;o, por exemplo.</p>
<p>No c&oacute;digo a seguir voc&ecirc; confere como atingir este objetivo utilizando o m&eacute;todo each() nativo do jQuery. O primeiro passo é criar o HTML da tabela. Note que no atributo id do &lt;a&gt; estou passando o c&oacute;digo de nossos registros.</p>
<textarea name="code" class="html">	
&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; id=&quot;resultado&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;C&amp;oacute;digo&lt;/th&gt;
&lt;th&gt;Nome&lt;/th&gt;
&lt;th&gt;A&amp;ccedil;&amp;atilde;o&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr id=&quot;linha-1&quot;&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Davi Ferreira&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;#&quot; class=&quot;item-excluir&quot; id=&quot;1&quot;&gt;&lt;img src=&quot;excluir.png&quot; width=&quot;24&quot; height=&quot;24&quot; alt=&quot;excluir registro 1&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;linha-2&quot; class=&quot;alt&quot;&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;R&amp;ocirc;mulo&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;#&quot; class=&quot;item-excluir&quot; id=&quot;2&quot;&gt;&lt;img src=&quot;excluir.png&quot; width=&quot;24&quot; height=&quot;24&quot; alt=&quot;excluir registro 2&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;linha-3&quot;&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Bruno&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;#&quot; class=&quot;item-excluir&quot; id=&quot;3&quot;&gt;&lt;img src=&quot;excluir.png&quot; width=&quot;24&quot; height=&quot;24&quot; alt=&quot;excluir registro 3&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;linha-4&quot; class=&quot;alt&quot;&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Jo&amp;atilde;o Francisco&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;#&quot; class=&quot;item-excluir&quot; id=&quot;4&quot;&gt;&lt;img src=&quot;excluir.png&quot; width=&quot;24&quot; height=&quot;24&quot; alt=&quot;excluir registro 4&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</textarea>
<p>Agora, atrav&eacute;s da chamada .each() varremos todos os elementos da tabela de resultado com a classe <em>item-excluir</em> e atribu&iacute;mos nossa m2brDialog passando o c&oacute;digo dos registros no <em>Sim</em> do bot&atilde;o.</p>
<textarea name="code" class="javascript">
$(document).ready(function(){
    $(&#039;table#resultado a.item-excluir&#039;).each(function(){
        var codigo = $(this).attr(&#039;id&#039;);
        $(this).m2brDialog({
            tipo: 		&#039;pergunta&#039;,
            titulo:		&#039;Confirme&#039;,
            texto:		&#039;Tem certeza que deseja excluir o registro ID&#039;+
                                &#039;<span style="color:#ffff00">&#039;+codigo+&#039;</span>?&#039;,
            draggable: true,
            botoes: {
                1: {
                    label		: &#039;sim&#039;,
                    tipo		: &#039;link&#039;,
                    endereco	: &#039;excluir.php?codigo=&#039;+codigo
                },
                2: {
                    label		: &#039;n&atilde;o&#039;,
                    tipo		: &#039;fechar&#039;
                }
            }
        });	
    });		
});
</textarea>
<p class="info"><a href="/blog/exemplos/m2brdialog/exemplo2.html">Clique aqui para conferir este exemplo.</a></p><img src="http://feeds.feedburner.com/~r/DaviFerreiraBlog/~4/459589093" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.daviferreira.com/blog/2008/11/20/esqueca-as-funcoes-javascript-alert-e-confirm.html/feed</wfw:commentRss>
		<feedburner:origLink>http://www.daviferreira.com/blog/2008/11/20/esqueca-as-funcoes-javascript-alert-e-confirm.html</feedburner:origLink></item>
		<item>
		<title>Manipulando e redimensionando imagens com PHP</title>
		<link>http://feeds.feedburner.com/~r/DaviFerreiraBlog/~3/153257794/classe-imagem-php.html</link>
		<comments>http://www.daviferreira.com/blog/2007/09/07/classe-imagem-php.html#comments</comments>
		<pubDate>Fri, 07 Sep 2007 02:52:27 +0000</pubDate>
		<dc:creator>Davi Ferreira</dc:creator>
		
		<category><![CDATA[Classes]]></category>

		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.daviferreira.com/blog/2007/09/07/classe-imagem-php.html</guid>
		<description><![CDATA[Quem nunca precisou desenvolver uma galeria de imagens? Ou at&#233; mesmo um simples m&#243;dulo para destaques de um site, com o redimensionamento autom&#225;tico de fotos para a capa? Manipula&#231;&#227;o de imagens &#233; uma das tarefas mais comuns em sistemas web e pode vir a ser uma tarefa chata caso toda vez voc&#234; tenha que reinventar [...]]]></description>
			<content:encoded><![CDATA[<p>Quem nunca precisou desenvolver uma galeria de imagens? Ou at&eacute; mesmo um simples m&oacute;dulo para destaques de um site, com o redimensionamento autom&aacute;tico de fotos para a capa? Manipula&ccedil;&atilde;o de imagens &eacute; uma das tarefas mais comuns em sistemas web e pode vir a ser uma tarefa chata caso toda vez voc&ecirc; tenha que reinventar a roda e reescrever dezenas de linha de c&oacute;digo para adequar a manipula&ccedil;&atilde;o aos desejos do cliente. </p>
<span id="more-16"></span>
<p>Neste <em>post</em> apresento uma classe desenvolvida na ag&ecirc;ncia web <a href="http://www.m2brnet.com">M2BRNET</a> em parceria com o camarada <a href="http://www.prsolucoes.com">Paulo Coutinho</a>, exclusivamente para o tratamento e manipula&ccedil;&atilde;o de imagens utilizando PHP e sua extens&atilde;o GD.</p>
<p>A classe, apelidada de <em>m2brimagem</em>, ainda est&aacute; em seu est&aacute;gio inicial, mas j&aacute; possui m&eacute;todos para redimensionamento e convers&atilde;o de formatos, entre outros. Algumas fun&ccedil;&otilde;es foram reaproveitadas e todos os devidos cr&eacute;ditos acompanham o arquivo fonte.</p>


<h3>Pré-requisitos</h3>

<p>Para utilizar a classe, será necessário o download de sua última versão no link abaixo além de um servidor com php instalado com suporte à biblioteca GD.</p>

<p class="info"><a href="http://code.google.com/p/m2brimagem/downloads/list">m2brimagem.class.php</a></p>


<h3>Exemplo 1</h3>

<p>Agora vamos ao que interessa! Neste primeiro exemplo realizaremos um redimensionamento simples, mantendo a proporção da imagem com a op&ccedil;&atilde;o <em>crop</em>.</p>

<p><b>teste.php</b></p>

<textarea name="code" class="php">
&lt;?php
include(&#039;m2brimagem.class.php&#039;);
$oImg = new m2brimagem(&#039;1.jpg&#039;);
$valida = $oImg->valida();
if ($valida == &#039;OK&#039;) {
	$oImg->redimensiona(200,200,&#039;crop&#039;);
    $oImg->grava();
} else {
	die($valida);
}
exit;
?&gt;
</textarea>

<p>O primeiro passo &eacute; instanciar o objeto da classe imagem, carregando no construtor a imagem que será manipulada:</p>

<textarea name="code" class="php" rows="10" cols="60">
include(&#039;m2brimagem.class.php&#039;);
$oImg = new m2brimagem(&#039;1.jpg&#039;);
</textarea>

<p>Logo na sequência validamos a imagem através do método <em>valida</em>. Caso o resultado seja &#039;OK&#039;, executamos os métodos para redimensionamento e geramos a nova imagem com saída no navegador. Se a imagem não existir, ou simplesmente não for um arquivo de imagem, o script retornará a mensagem de erro.</p>

<textarea name="code" class="php" rows="10" cols="60">
$valida = $oImg->valida();
if ($valida == &#039;OK&#039;) {
	$oImg->redimensiona(400,200);
    $oImg->grava();
} else {
	die($valida);
}
</textarea>

<p class="info"><a href="/blog/exemplos/imagem/teste.php">Clique aqui e veja o arquivo teste.php em ação!</a></p>

<h3>Exemplo 2</h3>

<p>Vamos agora dar uma leve incrementada em nosso arquivo teste.php, fazendo com que ele passe a receber via parâmetros as novas dimensões da imagem e o nome do arquivo, permitindo assim o redimensionamento <em>on the fly</em>:</p>

<textarea name="code" class="php" rows="10" cols="60">
&lt;?php
include(&#039;m2brimagem.class.php&#039;);
$arquivo	= $_GET['arquivo'];
$largura	= $_GET['largura'];
$altura		= $_GET['altura'];
$oImg = new m2brimagem($arquivo);
$valida = $oImg->valida();
if ($valida == &#039;OK&#039;) {
	$oImg->redimensiona($largura,$altura,&#039;crop&#039;);
    $oImg->grava();
} else {
	die($valida);
}
exit;
?>
</textarea>

<p>A imagem abaixo está sendo redimensionada em tempo real utilizando o exemplo anterior (<a href="/blog/exemplos/imagem/2.jpg">confira aqui</a> a imagem original).</p>

<textarea name="code" class="xhtml" rows="10" cols="60">
<img src="exemplo2.php?arquivo=2.jpg&#038;largura=200&#038;altura=200" />
</textarea>

<p><img src="/blog/exemplos/imagem/exemplo2.php?arquivo=2.jpg&#038;largura=200&#038;altura=200" alt="redimensionamento em tempo real" width="200" height="200" /></p>

<h3>Exemplo 3</h3>

<p>E que tal varrer todo um diret&oacute;rio, criar thumbnails e ao mesmo tempo manter as imagens originais? Alguém aí falou em galeria de imagens?</p>

<textarea name="code" class="php" rows="10" cols="60">
&lt;?php
// include da classe m2brimagem
include(&#039;m2brimagem.class.php&#039;);
// instancia objeto m2brimagem
$oImg = new m2brimagem();
// define diretórios
$diretorio = &#039;galeria/&#039;;
$dir_thumbs = $diretorio.&#039;thumbs/&#039;;
// varre diretório com as imagens originais
$arquivos = scandir($diretorio);
// lista arquivos do diretório
// e pega somente os de extensão jpg ou jpeg
foreach($arquivos as $arquivo) {
	if(eregi(&#034;.+.[jJ][pP][eE]?[gG]$&#034;, $arquivo)) {
		// &#034;carrega&#034; arquivo
		$oImg->carrega($diretorio.$arquivo);
		$valida = $oImg->valida();
		if ($valida == &#039;OK&#039;) {
			// redimensiona
			$oImg->redimensiona(80,80,&#039;crop&#039;);
			// salva no diretório das miniaturas
			$oImg->grava($dir_thumbs.$arquivo,true);
			echo &#034;Miniatura criada para &#034; 
            	. $diretorio.$arquivo 
                . &#034;<hr />&#034;;
		} else {
			echo &#034;Erro ao criar miniatura para &#034; 
            	. $diretorio.$arquivo 
                . &#034;: &#034; . $valida . &#034;<hr />&#034;;
		}
	}
}
exit;
?>
</textarea>

<p>Voilá! No exemplo acima, o script varre o subdiretório <em>galeria</em>, procura por arquivos do tipo JPG e cria suas miniaturas dentro de <em>galeria/thumbs/</em>.</p>

<h3>Exemplos rápidos</h3>
<p>Confira alguns outros métodos da classe m2brimagem em ação:</p>

	<h4>Marca d&#039;água</h4>
    
    <textarea name="code" class="php" rows="10" cols="60">
    // arquivo, x, y, alfa
    $oImg->marca(&#039;marca.png&#039;,40,10,NULL);
    </textarea>
    
    <p><img src="/blog/exemplos/imagem/marca.php?arquivo=2.jpg&#038;largura=200&#038;altura=200" alt="marca d'água" width="200" height="200" /></p>
    

    <h4>Flip</h4>
    
    <textarea name="code" class="php" rows="10" cols="60">
    $oImg->flip(&#039;h');
    </textarea>
    
     <p><img src="/blog/exemplos/imagem/flip.php?arquivo=2.jpg&#038;largura=200&#038;altura=200" alt="flip horizontal" width="200" height="200" /></p>
    
   
   
    <h4>Texto / legenda</h4>
     <textarea name="code" class="php" rows="10" cols="60">
    $rgb = array(255,255,255);
    // texto da legenda, tamanho do texto, x, y, cor (array rgb),
    // truetype (true ou false), nome da fonte
    $oImg->legenda(&#039;teste legenda&#039;,'11&#039;,&#039;20&#039;,&#039;20&#039;,$rgb,false,NULL);
    </textarea>
    
    <p><img src="/blog/exemplos/imagem/texto.php?arquivo=2.jpg&#038;largura=200&#038;altura=200" alt="legenda em texto" width="200" height="200" /></p>
    


<p>Como citei no início deste <em>post</em>, a classe ainda está em um estágio inicial do desenvolvimento. Diversas melhorias já estão na nossa lista. Para participar e acompanhar o desenvolvimento, enviar comentários, dúvidas e correções, acesse a <a href="http://code.google.com/p/m2brimagem/">p&aacute;gina do projeto no Google Code</a>.</p>



<h3>Atualiza&ccedil;&otilde;es [26/11/2008]</h3>

<p>O leitor <strong>Giolvani</strong> enviou uma implementa&ccedil;&atilde;o de um m&eacute;todo para adicionar marcas d&#039;dágua com posicionamento fixo. Segue o exemplo de uso:</p>

<textarea name="code" class="php" rows="10" cols="60">
$oImg->marcaFixa(&#039;marca2.png&#039;,'baixo_direita&#039;);
</textarea>

<p><img src="/blog/exemplos/imagem/marcafixa.php?arquivo=2.jpg&#038;largura=200&#038;altura=200&#038;tipo=baixo_direita" alt="marca d'água" width="200" height="200" /></p>

<p class="info"><a href="/blog/exemplos/imagem/marcas.php">Clique aqui para conferir todos os posicionamentos dispon&iacute;veis.</a></p>

<p>Já nosso amigo <a href="#comment-5572">CACA-[COBRA]</a> identificou um bug no método de marcas d&#039;água. O parâmetro alfa não estava funcionando corretamente. Na verdade, trata-se de uma limitação da biblioteca GD. Para utilizar transparência na marca d&#039;água, é necessário usar a função <em>imagecopymerge</em> ao invés da <em>imagecopy</em>. O problema é que ela não preserva a transparência original do PNG.</p>
<p>A correção que fiz foi a seguinte: caso você passe um valor para alfa, a classe utilizará a <em>imagecopymerge</em> para criar a marca, gerando uma trasparêcia global para a imagem, mas perdendo o fundo (ou qualquer outra parte) transparente da imagem de marca original. Caso opte por preservar esta transparência original, basta passar o valor de alfa como nulo.</p>
<p>Para entender melhor, <a href="/blog/exemplos/imagem/imagecopy.php">veja este exemplo.</a></p>
<p>Finalizando, também foram corrigidos alguns bugs, incluindo um que afetava a qualidade de imanges JPEG quando a saída era direta no navegador. O método resize (redimensionamento sem especificar <em>crop</em> ou <em>fill</em>) também foi alterado: agora seu redimensionamento não preserva a proporção, distorcendo a imagem se necessário - para manter a proporção passe somente a altura ou largura.</p><img src="http://feeds.feedburner.com/~r/DaviFerreiraBlog/~4/153257794" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.daviferreira.com/blog/2007/09/07/classe-imagem-php.html/feed</wfw:commentRss>
		<feedburner:origLink>http://www.daviferreira.com/blog/2007/09/07/classe-imagem-php.html</feedburner:origLink></item>
		<item>
		<title>Interface drag and drop com jQuery</title>
		<link>http://feeds.feedburner.com/~r/DaviFerreiraBlog/~3/143263452/interface-drag-and-drop-com-jquery.html</link>
		<comments>http://www.daviferreira.com/blog/2007/08/12/interface-drag-and-drop-com-jquery.html#comments</comments>
		<pubDate>Sun, 12 Aug 2007 04:47:14 +0000</pubDate>
		<dc:creator>Davi Ferreira</dc:creator>
		
		<category><![CDATA[Design]]></category>

		<category><![CDATA[Interfaces]]></category>

		<category><![CDATA[Javascript]]></category>

		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.daviferreira.com/blog/?p=11</guid>
		<description><![CDATA[Customiza&#231;&#227;o &#233; um dos principais conceitos da web 2.0 &#8212; deixar o usu&#225;rio participar ativamente em seu website, seja com conte&#250;do ou com um visual personalizado. Neste artigo voc&#234; confere como montar uma interface drag and drop (arrastar &#38; soltar) utilizando a biblioteca javascript jQuery, permitindo ao usu&#225;rio montar uma p&#225;gina a seu gosto, escolhendo [...]]]></description>
			<content:encoded><![CDATA[<p>Customiza&ccedil;&atilde;o &eacute; um dos principais conceitos da web 2.0 &mdash; deixar o usu&aacute;rio participar ativamente em seu website, seja com conte&uacute;do ou com um visual personalizado. Neste artigo voc&ecirc; confere como montar uma interface <em>drag and drop</em> (arrastar &amp; soltar) utilizando a biblioteca javascript jQuery, permitindo ao usu&aacute;rio montar uma p&aacute;gina a seu gosto, escolhendo a disposi&ccedil;&atilde;o dos boxes de conte&uacute;do dispon&iacute;veis no site.</p>
<span id="more-11"></span>
<p>Este tutorial é voltado para quem domina HTML e CSS e tem, pelo menos, uma relativa noção de javascript.</p>
<h3>jQuery</h3>
<p>Antes de come&ccedil;ar, vamos falar um pouco da <a href="http://jquery.com">jQuery</a>. Trata-se de um framework que visa facilitar a programa&ccedil;&atilde;o em javascript, tornando o c&oacute;digo mais simples, flex&iacute;vel e infinitamente mais elegante. Al&eacute;m de ser bem leve, a jQuery conta ainda com uma comunidade bastante ativa e uma vasta gama de plugins (seu ponto forte).</p>
<p>Veja a seguir um exemplo de c&oacute;digo escrito em javascript convencional e uma vers&atilde;o do mesmo c&oacute;digo com jQuery.</p>
<p><strong>javascript:</strong></p>
<textarea name="code" class="javascript" rows="10" cols="60">
document.getElementById(box).style.backgroundColor = &#039;#ff0000&#039;;
</textarea>
<p><strong>jQuery</strong></p>
<textarea name="code" class="javascript" rows="10" cols="60">
$(&#039;#box&#039;).css(&#039;backgroundColor&#039;, &#039;#ff0000&#039;);
</textarea>
<p>Notaram a diferen&ccedil;a? Vamos entender o c&oacute;digo jQuery, por partes:</p>
<p><strong>$(&#039;#box&#039;)</strong> &mdash; o s&iacute;mbolo do d&oacute;lar, seguido por par&ecirc;nteses, &eacute; o construtor da jQuery. Gra&ccedil;as a ele voc&ecirc; n&atilde;o precisa mais perder tempo digitando <strong>document.getElementById</strong> toda vez que precisar capturar um objeto HTML pelo id. O seletor <strong>$(&#039;#box&#039;)</strong> representa o elemento HTML de id box. Alguns outros exemplos de seletores s&atilde;o:</p>
<ul class="navegacao">
  <li><strong>$(&#039;a')</strong> &mdash; pega todos os elementos &lt;a&gt; do documento html;</li>
  <li><strong>$(&#039;div.caixa&#039;)</strong> &mdash; pega todos os elementos div que possuem a classe caixa;</li>
  <li><strong>$(&#039;a[@title]&#039;)</strong> &mdash; todos os elementos &lt;a&gt; que possuem o atributo <em>title</em> declarado;</li>
  <li><strong>$(&#039;input[@type=checkbox]&#039;)</strong> &mdash; todos os inputs do tipo checkbox.</li>
</ul>
<p><strong>.css()</strong> &mdash; a propriedade .css funciona para exibir ou atribuir um valor CSS de um elemento HTML. No exemplo acima, atribuímos a cor &#034;#ff0000&#034; à propriedade <em>background-color</em> do nosso elemento de id box. Para exibir a propriedade ao invés de atribuir um valor, basta omitir o segundo parâmetro, por exemplo:</p>
<textarea name="code" class="javascript" rows="10" cols="60">
$(&#039;#box&#039;).css(&#039;backgroundColor&#039;)
</textarea>
<p>Confira algumas outras propriedades dos seletores jQuery:</p>
<ul class="navegacao">
  <li><strong>.attr()</strong> &mdash; retorna/manipula os atributos de um elemento, como title, src, rel, href etc.;</li>
  <li><strong>.val()</strong> &mdash; retorna/manipula o campo <em>value</em> de elementos input;</li>
  <li><strong>.html()</strong> &mdash; semelhante à propriedade <strong>innerHTML</strong> do javascript convencional;</li>
  <li><strong>.text()</strong> &mdash; retorna somente o texto, sem as tags HTML, de um elemento.</li>
</ul>
<p>É claro que isso não cobre quase nada do que a jQuery tem a oferecer. Para conferir a lista completa de seletores, comandos, propriedades e métodos visite o wiki do projeto em <a href="http://docs.jquery.com">docs.jquery.com</a>.</p>
<h3>Arquivos necess&aacute;rios</h3>
<p>A interface <em>drag an drop</em> que iremos desenvolver aqui utiliza os plugins de interface dispon&iacute;veis <a href="http://interface.eyecon.ro/">neste link</a> e nosso c&oacute;digo ser&aacute; baseado no m&oacute;dulo <a href="http://interface.eyecon.ro/docs/sort">Sortables</a>.</p>
<p>O primeiro passo &eacute; declarar os arquivos javascript no &lt;head&gt; de nosso documento HTML.</p>
<textarea name="code" class="xhtml" rows="10" cols="60">
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="interface.js"></script>
</textarea>
<p><strong>Observa&ccedil;&atilde;o:</strong> neste exemplo, estamos utilizando uma vers&atilde;o completa do arquivo interface.js, com todos os seus m&oacute;dulos, mas nada impede (e eu at&eacute; recomendo) que voc&ecirc; utilize no seu projeto final uma vers&atilde;o compactada apenas com os m&oacute;dulos necess&aacute;rios. Voc&ecirc; pode conferir a lista de depend&ecirc;ncias do Sortables acessando <a href="http://interface.eyecon.ro/dependencies">este link</a>.</p>
<p><strong>Downloads:</strong></p>
<ul class="navegacao">
  <li><a href="/blog/exemplos/draganddrop/jquery.js">jquery.js</a></li>
  <li><a href="/blog/exemplos/draganddrop/interface.js">interface.js</a></li>
</ul>
<p>&nbsp;</p>
<h3>Elementos da interface</h3>
<p>Agora vejamos o que &eacute; necess&aacute;rio, esquecendo um pouco a parte de javascript, para a constru&ccedil;&atilde;o de uma interface drag and drop. Que elementos vamos utilizar?</p>
<ul class="navegacao">
  <li>No m&iacute;nimo uma &aacute;rea para soltar os elementos arrastados;</li>
  <li>Alguns elementos que ser&atilde;o arrastados e soltos nas &aacute;reas dispon&iacute;veis no site;</li>
  <li>Uma &aacute;rea tempor&aacute;ria de ajuda, para indicar onde o elemento que est&aacute; sendo arrastado pode ser solto;</li>
  <li>Todo elemento arrast&aacute;vel deve possuir um <em>handle</em>, ou seja, alguma &aacute;rea dentro do pr&oacute;prio elemento onde o usu&aacute;rio ir&aacute; clicar para arrast&aacute;-lo.</li>
</ul>
<p>Sendo assim, definiremos as seguintes classes CSS para identificar os elementos de nossa interface:</p>
<ul class="navegacao">
  <li>recebeDrag</li>
  <li>itemDrag</li>
  <li>dragAjuda</li>
</ul>
<p>No caso do <em>handle</em> n&atilde;o utilizaremos uma classe, mas sim um elemento espec&iacute;fico: a tag &lt;h2&gt;.
</p><p>Todos os elementos com a classe <em>recebeDrag</em> servir&atilde;o de base para os elementos arrast&aacute;veis. Estes, por sua vez, vir&atilde;o acompanhados da classe <em>itemDrag</em>. O elemento de ajuda (<strong>dragAjuda</strong>) n&atilde;o precisa ser declarado no documento HTML &mdash; o plugin de interface da jQuery se encarrega de fazer isso, apenas o CSS precisa ser criado. Todo <em>itemDrag</em> deve ainda possuir um elemento <strong>H2</strong> para arrast&aacute;-lo. Nossa estrutura ficou assim:</p>
<p><img src="/blog/img/artigos/dragandrop.gif" width="400" height="242" alt="Elementos da interface drag and drop" /></p>
<p>E o CSS:</p>
<textarea name="code" class="css" rows="10" cols="60">
div.recebeDrag {
	min-height: 50px;
}
div.itemDrag {
	margin: 7px;
	border: 1px solid #ccc;
	padding: 7px;
}
div.itemDrag h2 {
	cursor: move;
	background-color: #ff3300;
	color: #fff;
	padding: 3px;
}
.dragAjuda {
	border: 3px dashed #0066cc;
	width: auto !important;
}
</textarea>
<p>Monte um documento HTML com o CSS acima e inclua quantas áreas e ítens quiser para efetuarmos nosso teste.</p>
<h3>document.ready</h3>
<p>Com nosso HTML pronto, agora resta apenas instanciar o elemento Sortable da jQuery. Ao invés de utilizar o bom e velho onload no body, vamos adotar uma abordagem mais elegante e garantida, já que espera todo o DOM ser carregado antes de ser executada. Ao final de nosso HTML, antes de fecharmos o &lt;body&gt;, utilizaremos o seguinte código javascript:</p>
<textarea name="code" class="javascript" rows="10" cols="60">
$(document).ready(
	function () {
		$(&#039;div.recebeDrag&#039;).Sortable(
			{
				accept			: &#039;itemDrag&#039;,
				helperclass		: &#039;dragAjuda&#039;,
				activeclass 	: &#039;dragAtivo&#039;,
				hoverclass 		: &#039;dragHover&#039;,
				opacity			: 0.7,
				handle			: &#039;h2&#039;,
				onChange 		: function()
				{	    			 
					serialEsq = $.SortSerialize(&#039;drop-esquerda&#039;);
					serialDir = $.SortSerialize(&#039;drop-direita&#039;);
				},
				onStart : function()
				{
					$.iAutoscroller.start(this, $(&#039;body&#039;));
				},
				onStop : function()
				{
					$.iAutoscroller.stop();
				}
			}
		);
	}
);
  </textarea>
<p>O comando/seletor $(document).ready funciona, de certa forma, como o &lt;body onload&gt;. Estamos solicitando que, ao carregar o documento, os elementos div com a classe recebeDrag sejam inicializados como objetos Sortables. Logo em seguida declaramos os parâmetros aceitos na nossa interface <em>drag and drop</em>, bem como as ações a serem executadas quando o elemento é mudado de lugar, quando tem início a ação de arrastar e quanto termina esta mesma ação.</p>
<p>O bloco dos parâmetros é bem simples. Primeiro, utilizando o parâmetro <strong>accept</strong>, definimos que os divs com a classe recebeDrag aceitarão apenas elementos com a classe itemDrag arrastados dentro deles. Os quatro parâmetros seguintes são referentes às classes e estilos CSS. <strong>helperclass</strong> define a classe do elemento que demarca áreas em que os divs itemDrag podem ser soltos. <strong>hoverclass</strong> e <strong>activeclass</strong> são as classes de estado <strong>active</strong> e <strong>hover</strong> para o elemento recebeDrag. Já o parâmetro <strong>opacity</strong> define o nível de transparência de um elemento, podendo variar de 0 a 1.</p>
<p><strong>handle</strong>, conforme explicado anteriormente, define o elemento HTML que servirá como &#034;link&#034; para arrastar os divs itemDrag.</p>
<p>E, por fim, as ações:</p>
<ul class="navegacao">
  <li><strong>onChange</strong> &mdash; qualquer função declarada neste parâmetro será executada quando um elemento for arrastado e solto, e sua posição inicial for alterada. É ideal para executar comandos AJAX para gravar a posição em banco de dados ou arquivo, ou simplesmente setar um cookie ou uma variável de sessão. No nosso exemplo estamos apenas executando a função nativa <strong>$.SortSerialize</strong>, que retorna as posições de cada elemento do recebeDrag, sem gravar nada.</li>
  <li><strong>onStart</strong> &mdash; é executada quando tem início o movimento de arrastar o div. Em nossa interface estamos executando o plugin de autoscroll da jQuery, para que o movimento de arrastar e soltar não fique limitado a área visível do navegador.</li>
  <li><strong>onStop</strong> &mdash; executada quando o movimento de arrastar é interrompido.</li>
</ul>
<p>&nbsp;</p>
<h3>Interface em a&ccedil;&atilde;o</h3>
<p><a id="p12" href="/blog/exemplos/draganddrop/exemplo1.html">Clique aqui</a> para conferir um exemplo bem simples da nossa interface <em>drag and drop</em>. O CSS e o javascript foram todos declarados no arquivo, basta exibir o código-fonte para entender melhor o funcionamento do nosso exemplo.</p>
<p>Para visualizar a versão final deste teste, visite o site <a href="http://beta.democracia.com.br">beta do Democracia</a>.</p>
<p>&nbsp;</p>
<h3>Sugest&otilde;es de funcionalidades</h3>
<ul class="navegacao">
  <li>Opção para fechar e minimizar as janelas arrastáveis;</li>
  <li>Possibilidade para adicionar ou remover boxes de conteúdo da interface.</li>
</ul>
<p>&nbsp;</p>
<h3>Refer&ecirc;ncias</h3>
<ul class="navegacao">
  <li><a href="http://jquery.com">jQuery - site oficial</a></li>
  <li><a href="http://interface.eyecon.ro">jQuery Interface Elements</a></li>
  <li><a href="http://www.learningjquery.com/">Learning jQuery</a></li>
  <li><a href="http://jquerybrasil.com/">jQuery Brasil</a></li>
</ul>
<p>&nbsp;</p>
<h3>Atualiza&ccedil;&atilde;o [06/12/2008]</h3>

<p>Muita gente me pergunta sobre isso, ent&atilde;o a&iacute; vai um exemplo utilizando cookies para salvar o posicionamento e ordena&ccedil;&atilde;o definidos pelo usu&aacute;rio.</p>
<p class="info"><a href="/blog/exemplos/draganddrop/exemplo2.html">Exemplo com cookies</a></p>
<p>Os cookies est&atilde;o sendo gerenciados diretamente via javascript, atrav&eacute;s do plugin jCookie: <a href="http://plugins.jquery.com/project/cookie">http://plugins.jquery.com/project/cookie</a>.</p>
<p>Confira o que mudou no c&oacute;digo. Na propriedade <em>onchange</em> do elemento sortable adicionamos o m&eacute;todo $.cookie() para criar um cookie relacionado à cada coluna:</p>
<textarea name="code" class="javascript">
onChange 		: function()
{	    			 
	serialEsq = $.SortSerialize(&#039;drop-esquerda&#039;);
	serialDir = $.SortSerialize(&#039;drop-direita&#039;);
	// salva cookie com posicionamento
	$.cookie(&#039;coluna1&#039;, serialEsq.hash, {expires: 7});
	$.cookie(&#039;coluna2&#039;, serialDir.hash, {expires: 7});
}
</textarea>

<p>E, ap&oacute;s carregar o documento, verificamos se o cookie existe e definimos o posicionamento dos boxes nas colunas:</p>

<textarea name="code" class="javascript">
$(document).ready(
	function () {
		if ($.cookie(&#039;coluna1&#039;) != null) {
			// formata string do cookie
			var coluna1 = $.cookie(&#039;coluna1&#039;).replace(/drop-esquerda\[\]=/g, &#034;);
			var coluna1 = coluna1.split(&#039;&#038;');
			var div_id = &#034;;
			for (var x = 0; x < = coluna1.length; x++) {
				div_id = coluna1[x];
				$('#drop-esquerda').append($('#'+div_id)); 
			}
		}
		if ($.cookie('coluna2') != null) {
			// formata string do cookie
			var coluna2 = $.cookie('coluna2').replace(/drop-direita\[\]=/g, '');
			var coluna2 = coluna2.split('&#038;');
			var div_id = '';
			for (var x = 0; x <= coluna2.length; x++) {
				div_id = coluna2[x];
				$('#drop-direita').append($('#'+div_id)); 
			}
		}
	}
);
</textarea>
<p>Simples, n&atilde;o? <img src='http://www.daviferreira.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p></textarea><img src="http://feeds.feedburner.com/~r/DaviFerreiraBlog/~4/143263452" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.daviferreira.com/blog/2007/08/12/interface-drag-and-drop-com-jquery.html/feed</wfw:commentRss>
		<feedburner:origLink>http://www.daviferreira.com/blog/2007/08/12/interface-drag-and-drop-com-jquery.html</feedburner:origLink></item>
		<item>
		<title>Formulários sem tabelas</title>
		<link>http://feeds.feedburner.com/~r/DaviFerreiraBlog/~3/148486744/formularios-css.html</link>
		<comments>http://www.daviferreira.com/blog/2007/05/29/formularios-css.html#comments</comments>
		<pubDate>Tue, 29 May 2007 19:31:32 +0000</pubDate>
		<dc:creator>Davi Ferreira</dc:creator>
		
		<category><![CDATA[CSS]]></category>

		<category><![CDATA[Web Standards]]></category>

		<guid isPermaLink="false">http://127.0.0.1/webfolio/blog/?p=4</guid>
		<description><![CDATA[				Se você é um cara antenado, já deve saber que não é correto utilizar tabelas para layouts de páginas HTML. Tabelas devem ser usadas apenas para seu propósito original: tabulação de dados. Para todo o restante, como alinhamento de textos, imagens e qualquer outro elemento em uma página, existem as folhas de estilo.

Aprenda a montar [...]]]></description>
			<content:encoded><![CDATA[				<p>Se você é um cara antenado, já deve saber que não é correto utilizar tabelas para layouts de páginas HTML. Tabelas devem ser usadas apenas para seu propósito original: tabulação de dados. Para todo o restante, como alinhamento de textos, imagens e qualquer outro elemento em uma página, existem as folhas de estilo.</p>

<p>Aprenda a montar corretamente um formulário web utilizando CSS, evitando o uso de tabelas para o alinhamento de textos e campos.</p>
<span id="more-4"></span>
<p>Vamos começar falando de tags HTML esquecidas na grande maioria dos formulários encontrados na web, são elas: <em>fieldset</em>, <em>legend</em> e <em>label</em>. Observe o form abaixo:</p>

<div class="codigo_exemplo">
<table>
<tr>
<td colspan="2">Login:</td>
</tr>
<tr>
<td colspan="2"><hr /></td>
</tr>
<tr>
<td>Usuário:</td>
<td><input type="text" name="usuario"/></td>
</tr>
<tr>
<td>Senha:</td>
<td><input type="password" name="senha"/></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="enviar"/></td>
</tr>
</table>
</div>

<textarea name="code" class="xhtml" rows="10" cols="60">
<form>
<table>
  <tr>
    <td colspan="2">Login:</td>
  </tr>
  <tr>
    <td colspan="2"><hr /></td>
  </tr>
  <tr>
    <td>Usuário:</td>
    <td><input type="text" name="usuario"/></td>
  </tr>
  <tr>
    <td>Senha:</td>
    <td><input type="password" name="senha"/></td>
  </tr>
  <tr>
    <td colspan="2"><input type="submit" value="enviar"/></td>
  </tr>
</table>
</form>
</textarea>

<p>Agora vejamos o mesmo formulário utilizando as tags nativas do HTML para forms, eliminando o uso da tabela:</p>

<div class="codigo_exemplo">
<form method="post" action="" onsubmit="javascript:return false;">
  <fieldset>
  <legend>Login:</legend>
  <label for="usuario">Usuário:</label>
  <input type="text" name="usuario" id="usuario"/><br />
  <label for="senha">Senha:</label>
  <input type="password" id="senha" name="senha"/><br />
  </fieldset>
  <input type="submit" value="enviar"/>
</form>
</div>

<textarea name="code" class="xhtml" rows="10" cols="60">
<form>
  <fieldset>
  <legend>Login:</legend>
  <label for="usuario">Usuário:</label>
  <input type="text" name="usuario" id="usuario"/><br />
  <label for="senha">Senha:</label>
  <input type="password" id="senha" name="senha"/><br />
  </fieldset>
  <input type="submit" value="enviar"/>
</form>
</textarea>

<p>A tag <em>label</em> vem acompanhada do parâmetro &#034;for&#034; (para) contendo o &#034;id&#034; do campo a que se refere (precisa ser o &#034;id&#034; e não o &#034;name&#034;). Note que alguns tipos de <em>input</em> já vem com uma <em>label</em> embutida, como os botões. Neste caso você declara a <em>label</em> no parâmetro <em>value</em>, diretamente na tag.</p>

<p><em>Fieldset</em> indica um grupo de campos associados a um mesmo tema. No nosse exemplo, o <em>fieldset</em> login possui os campos usuário e senha. Finalizando, <em>legend</em> está para <em>fieldset</em> como <em>label</em> está para <em>input</em>, ou seja, é um rótulo do conjunto de campos.</p>

<p>O código ficou bem mais simples, mas ainda falta alinhar o texto com os campos, como no formulário com tabelas. Nada que um pouco de CSS não resolva:</p>

<textarea name="code" class="css" rows="10" cols="60">
label,  input {
	display: block;
	float: left;
}

label {	
	text-align: right;
	width: 35px;
	padding-right: 20px;
	padding-bottom: 10px;
}

fieldset {
	border: solid 1px #000;
}

br {
	clear: left;
}
</textarea>

<style type="text/css">
.form_exemplo label,  .form_exemplo input {
	display: block;
	float: left;
}

.form_exemplo label {
	text-align: right;
	width: 35px;
	padding-right: 20px;
	padding-bottom: 10px;
}

.form_exemplo fieldset {
	border: solid 1px #000;
	padding: 10px;
}

.form_exemplo br {
	clear: left;
}
</style>

<div class="codigo_exemplo form_exemplo">
<form method="post" action="" onsubmit="javascript:return false;">
  <fieldset>
  <legend>Login:</legend>
  <label for="usuario">Usuário:</label>
  <input type="text" name="usuario" id="usuario"/><br />
  <label for="senha">Senha:</label>
  <input type="password" id="senha" name="senha"/><input type="submit" value="enviar"/>
  </fieldset>
</form>
</div>

<p>Observe as possibilidades de formatação com a utilização de CSS e das tags <em>fieldset</em>, <em>legend</em> e <em>label</em>. O formulário fica muito mais organizado e pode ter uma apresentação muito mais agradável, basta caprichar nas bordas e espaçamentos. Hora de conferir um pouco mais sobre algumas das propriedades CSS utilizadas neste exemplo:</p>

<blockquote>
<p><b>display: block -</b> Como o próprio nome sugere, exibe o elemento como um bloco, permitindo maior flexibilidade na hora de alinhá-lo com outros elementos na página.</p>
<p><b>float: left -</b> A propriedade <em>float</em> move um elemento para a esquerda ou direita de seu elemento “pai”. Por exemplo, um elemento com a propriedade <em>float:left</em> é interpretado como um bloco e é sempre alinhado à esquerda (até encontrar um outro elemento com <em>float</em> ou <em>clear</em>). Caso você esteja iniciando agora na montagem de páginas com CSS, fique ligado nesta propriedade, pois ela será muito utilizada para criação de colunas, posicionamento de imagens etc.</p>
<p><b>clear: left -</b> No nosso caso, a tag <em>br</em> com a propriedade <em>clear: left</em> impede com que elementos com <em>float: left</em> sejam alinhados à sua esquerda. Funciona, basicamente, como o início de uma nova linha no que se refere a elementos flutuantes.</p>
</blockquote>

<p>Legal, não? <a href="http://www.formassembly.com/form-garden.php">Neste link</a> você encontra alguns exemplos avançados de formulários CSS. Espero que tenham gostado e até a próxima!</p>
<img src="http://feeds.feedburner.com/~r/DaviFerreiraBlog/~4/148486744" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.daviferreira.com/blog/2007/05/29/formularios-css.html/feed</wfw:commentRss>
		<feedburner:origLink>http://www.daviferreira.com/blog/2007/05/29/formularios-css.html</feedburner:origLink></item>
		<item>
		<title>Definindo cores para seu layout</title>
		<link>http://feeds.feedburner.com/~r/DaviFerreiraBlog/~3/148486745/definindo-cores-para-seu-lay-out.html</link>
		<comments>http://www.daviferreira.com/blog/2007/05/26/definindo-cores-para-seu-lay-out.html#comments</comments>
		<pubDate>Sun, 27 May 2007 01:58:16 +0000</pubDate>
		<dc:creator>Davi Ferreira</dc:creator>
		
		<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://127.0.0.1/webfolio/blog/?p=3</guid>
		<description><![CDATA[				Neste artigo mostrarei algumas dicas para escolher melhor as cores de seu próximo website. Além de alguns exemplos, você confere também ferramentas disponívies online, como o Kuler da Adobe, para a escolha e composição de tonalidades.

A escolha de cores para um site web representa metade de um design. Escolher as cores certas pode tomar boa [...]]]></description>
			<content:encoded><![CDATA[				<p>Neste artigo mostrarei algumas dicas para escolher melhor as cores de seu próximo website. Além de alguns exemplos, você confere também ferramentas disponívies online, como o Kuler da Adobe, para a escolha e composição de tonalidades.</p>
<span id="more-3"></span>
<p>A escolha de cores para um site web representa metade de um design. Escolher as cores certas pode tomar boa parte do seu tempo na concepção e criação de um projeto. O primeiro passo é analisar o foco da empresa ou produto. Por exemplo, caso seja o site de um restaurante italiano as cores vermelhas/quentes surgem em primeiro plano. O segundo passo é agradar o cliente. Nem sempre a combinação de tonalidades escolhida por você irá cair no gosto do cliente e você poderá acabar com cores completamente diferentes da escolha inicial. Frases como &#034;mas eu gosto daquele amarelo vibrante!&#034; tornam o trabalho de um webdesigner bastante divertido! </p>

<p>Abaixo algumas das tonalidades utilizadas por mim em alguns projetos, incluindo este blog (primeira opção):</p>

<p class="centro"><img src="/blog/img/artigos/cores.gif" width="300" height="332" alt="exemplos - tonalidades" /></p>

<p>Ao escolher as tonalidades para um projeto, opte pelo menor número de cores possíveis e trabalhe em cima da logomarca da empresa/produto. Também tenha em mente a idéia de cores contrastantes, para facilitar a leitura e destacar elementos em um layout. Por exemplo, em uma palheta de três cores, uma deve estar em contraste com as outras duas. Ou seja, a palheta deve possuir uma cor suave e duas cores escuras; ou uma cor suave, uma média e uma escura.</p>

<h3>Ferramentas online</h3>

<p>Para facilitar a sua vida, diversas ferramentas estão disponíveis na web para a seleção de tonalidades (confira a lista de links mais abaixo). Uma delas é o <a href="http://kuler.adobe.com/" title="Adobe Kuler">Kuler</a>, da poderosa Adobe. Desenvolvido em tecnologia Flash, o projeto funciona como uma espécia de comunidade, onde é possível compartilhar palhetas de cores e votar nas suas tonalidades preferidas. Além disso, caso você possua a suíte de aplicativos da Adobe, pode exportar suas tonalidades no formato .ASE (Adobe Swatch Exchange).</p>

<p>Confira outros links:</p>

<ul class="navegacao">
	<li><a href="http://www.colorcombos.com/" title="Color Combos">Color Combos</a></li>
	<li><a href="http://wellstyled.com/tools/colorscheme2/index-en.html" title="Color schemes generator 2">Color schemes generator 2</a></li>
	<li><a href="http://www.colorschemer.com/online.html" title="Color schemer online v2">Color schemer online v2</a></li>
	<li><a href="http://hlrnet.com/colormatch/" title="Color Match Remix">Color Match Remix</a></li>
	<li><a href="http://www.behr.com/behrx/workbook/" title="ColorSmart">ColorSmart</a></li>
	<li><a href="http://www.defencemechanism.com/color/" title="ColorToy 2">ColorToy 2</a></li>
</ul>

<div class="clear"></div>

<h3>Fotos</h3>

<p>Uma outra técnica legal para criar um tema de cores é utilizar uma foto como base. Utilizando o Photoshop, você pode adquirir facilmente uma palheta de cores utilizando o filtro mosaico em uma imagem. Confira um exemplo:</p>

<p class="centro"><img src="/blog/img/artigos/cor2.jpg" width="400" height="162" alt="tonalidades de uma foto" /></p>

<p>No final das contas, o que vale mais do que qualquer coisa é a sua intuição na hora de escolher o tema de cores para um website. Portanto, use sua criatividade e lembre-se: <em>keep it simple</em>!</p>
<img src="http://feeds.feedburner.com/~r/DaviFerreiraBlog/~4/148486745" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.daviferreira.com/blog/2007/05/26/definindo-cores-para-seu-lay-out.html/feed</wfw:commentRss>
		<feedburner:origLink>http://www.daviferreira.com/blog/2007/05/26/definindo-cores-para-seu-lay-out.html</feedburner:origLink></item>
	</channel>
</rss>
