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

<channel>
	<title>Athlan • Piotr Pelczar • blog programisty &#187; JS/Ajax</title>
	<atom:link href="http://athlan.pl/kategoria/jsajax/feed/" rel="self" type="application/rss+xml" />
	<link>http://athlan.pl</link>
	<description>Napisać kod zrozumiały dla komputera potrafi byle głupek. Dobrzy programiści tworzą kod zrozumiały dla człowieka...</description>
	<lastBuildDate>Sat, 17 Jul 2010 18:54:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>jQuery Animate i Easing</title>
		<link>http://athlan.pl/jquery-animate-i-easing/</link>
		<comments>http://athlan.pl/jquery-animate-i-easing/#comments</comments>
		<pubDate>Sat, 08 May 2010 08:17:41 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[JS/Ajax]]></category>
		<category><![CDATA[Planeta]]></category>
		<category><![CDATA[Publikacje]]></category>
		<category><![CDATA[Solutions]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=457</guid>
		<description><![CDATA[Nie można kwestionować faktu, że jQuery.animate() jest jednym z najbardziej potężnych narzędzi jQuery. Służy on do animowania atrybutów CSS (czyli zmiany ich wartości w czasie od obecnego stanu A do definiowanego stanu B). Najprostszą implementacją jQuery Animate jest podanie zbioru atrybutów CSS, które mają ulec zmianie oraz czasu, w jakim ta zmiana ma nastąpić. Nie będę się [...]]]></description>
			<content:encoded><![CDATA[<p>Nie można kwestionować faktu, że <code><a href="http://api.jquery.com/animate/">jQuery.animate()</a></code> jest jednym z najbardziej potężnych narzędzi <strong>jQuery</strong>. Służy on do animowania <strong>atrybutów CSS</strong> (czyli zmiany ich wartości w czasie od obecnego stanu A do definiowanego stanu B). Najprostszą implementacją <strong>jQuery Animate</strong> jest podanie zbioru atrybutów CSS, które mają ulec zmianie oraz czasu, w jakim ta zmiana ma nastąpić. Nie będę się zagłębiał w najprostsze przykłady użycia, <a rel="nofollow" href="http://api.jquery.com/animate/">są one dostępne w oficjalnej dokumentacji</a> jQuery.</p>
<p>Należy pamiętać, że dzięki jQuery jesteśmy w stanie nie tylko płynnie zmieniać kolory, wielkość czcionki, obramowanie, ale także pozycje elementów, nadając stronie dynamicznego kształtu. Domyślnym sposobem animowania (<em>easing</em>) jest płynne przechodzenie. Istnieje natomiast sposób na zmianę adaptera animowania. Robert Penner &#8211; autor pluginu <a rel="nofollow" href="http://gsgd.co.uk/sandbox/jquery/easing/"><strong>jQuery Easing</strong></a> dostarczył nam niewiarygodnie efektowne i proste w implementacji narzędzie. Na oficjalnej stronie pluginu można znaleźć <a rel="nofollow" href="http://gsgd.co.uk/sandbox/jquery/easing/">wiele przykładów animacji</a>, które dostarcza nam dodatek. Efekty widoczne są zwłaszcza przy animowaniu pozycji i wymiarów obiektu, ale następują także w przypadku zmiany koloru &#8211; czyli są aplikowane do zmiany stanu każdego z atrybutów CSS.</p>
<p>Dziś postaram się pokazać efekty, jakie można uzyskać za pomocą <strong>jQuery Animate</strong> rozszerzonego o <strong>jQuery Interface</strong> oraz <strong>Easing</strong>.</p>
<ul>
<li><a href="http://athlan.pl/code/jQueryAnimateEasing/">Przykład różnego rodzaju easingu</a>.</li>
</ul>
<p>Pierwszym krokiem jest wygenerowanie własnej biblioteki <a href="http://jqueryui.com/download">jQuery Interface</a>. Dzięki generatorowi, jesteśmy w stanie ściągnąć tylko te części Interface, które są nam de facto potrzebne, zmniejszając jednocześnie ilość kodu. Klikamy &#8216;deselect all components&#8217;, a w sekcji <em>Effects</em> wybieramy efekty, których będziemy używać. Mnie w tej chwili interesuje <em>Bounce</em> i <em>Slide</em>. W paczce otrzymamy wersję deweloperską (z wcięciami) oraz <em>minified</em>, gotową do publikacji na serwerze.</p>
<p>Do wykorzystania efektu slideowania a&#8217;la iPhone (elastyczne odbicie od krawędzi ściany ekranu) sprowadza się drobny kawałek kodu, w którym istotnym jest parametr <em>easing</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#example'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">animate</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span> left<span style="color: #339933;">:</span> <span style="color: #CC0000;">500</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span> duration<span style="color: #339933;">:</span> <span style="color: #CC0000;">1000</span><span style="color: #339933;">,</span> easing<span style="color: #339933;">:</span> <span style="color: #3366CC;">'easeOutElastic'</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>Na pewno komuś się przyda.</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/jquery-animate-i-easing/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>JS Gamble game</title>
		<link>http://athlan.pl/js-gamble-game/</link>
		<comments>http://athlan.pl/js-gamble-game/#comments</comments>
		<pubDate>Sat, 16 May 2009 17:49:15 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[JS/Ajax]]></category>
		<category><![CDATA[Private]]></category>
		<category><![CDATA[gamble]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[js]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=309</guid>
		<description><![CDATA[Wspólne wieczory z przyjaciółmi na wycieczce &#8211; to jest to &#8211; chyba każdy doświadczył gry w karty po nocach. Ale co jak na wycieczkę jedzie delegacja &#8220;komputerowców&#8221;, którzy nie biorą ze sobą nic oprócz ubrań, kawy i notebooków? Programista ma jedną przewagę nad innymi ludźmi &#8211; może stworzyć sobie własny wirtualny entertejment, kiedy pod ręką [...]]]></description>
			<content:encoded><![CDATA[<p>Wspólne wieczory z przyjaciółmi na wycieczce &#8211; to jest to &#8211; chyba każdy doświadczył gry w karty po nocach. Ale co jak na wycieczkę jedzie delegacja &#8220;komputerowców&#8221;, którzy nie biorą ze sobą nic oprócz ubrań, kawy i notebooków? Programista ma jedną przewagę nad innymi ludźmi &#8211; może stworzyć sobie własny wirtualny entertejment, kiedy pod ręką brak np&#8230; <strong>grę w kości kości</strong>.</p>
<p>Do szczęścia potrzebny był mi paint, notatnik i znajomość JavaScript. Stworzenie mini-gry <em>kości</em> zajęło niecałe 10 minut i fun na całą noc :-P</p>
<ul>
<li><a href="http://athlan.pl/code/gamble/">Demo gry w kości</a>, czyli to, co udało mi się na szybko wypocić.</li>
</ul>
<p><strong>Zasady gry</strong>:</p>
<p>Chyba każdemu znane, ale przypomnijmy:</p>
<blockquote><p>Kości to gra dla 2-4 osób, w której gracze turlają kostkami, by uzyskać określone układy oczek, za które otrzymuje się punkty. Wbrew pozorom nie jest to gra zależna tylko od szczęścia &#8212; liczy się w niej raczej umiejętność kalkulacji.</p>
<p>W każdej z 13 kolejek każdy z graczy ma do dyspozycji trzy rzuty kostkami. Pierwszy z nich odbywa się zawsze wszystkimi pięcioma kostkami, a w drugim i trzecim, które nie są obowiązkowe, wybrane kostki mogą zostać zatrzymane; rzut odbywa się wtedy tylko niezatrzymanymi.</p></blockquote>
<ul>
<li>Więcej zasad: <a href="http://www.kurnik.pl/kosci/zasady.phtml">http://www.kurnik.pl/kosci/zasady.phtml</a></li>
<li>Zaznaczamy te kości, którymy chcemy losować, mamy 3 rzuty dowolnymi kościami, potem przekazujemy myszkę koledze.</li>
<li>Gdy nie jest zaznaczona żadna kość do losowania, oznacza to, że chcemy losować wszystkimi kośćmi.</li>
</ul>
<p>Have fun ;p</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/js-gamble-game/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>jQuery form post ajax request</title>
		<link>http://athlan.pl/jquery-form-post-ajax-request/</link>
		<comments>http://athlan.pl/jquery-form-post-ajax-request/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 09:48:46 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[JS/Ajax]]></category>
		<category><![CDATA[Publikacje]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[request]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=232</guid>
		<description><![CDATA[Już kiedyś interesowałem się jQuery, ale w związku z podjęciem się nowego, dużego projektu postanowiłem pogłębić swoją wiedzę i pobawić się tą biblioteką. Jako, że klient ma bzika na punkcie przeładowań ajax postanowiłem zaimplementować automatyczne przesyłanie formularzy w tle i wklejanie w &#60;body&#62; response żądania. Od strony PHP sprawa wygląda bardzo prosto &#8211; jeżeli request [...]]]></description>
			<content:encoded><![CDATA[<p>Już kiedyś interesowałem się <strong>jQuery</strong>, ale w związku z podjęciem się nowego, dużego projektu postanowiłem pogłębić swoją wiedzę i pobawić się tą biblioteką.</p>
<p>Jako, że klient ma bzika na punkcie przeładowań <strong>ajax</strong> postanowiłem zaimplementować automatyczne przesyłanie formularzy w tle i wklejanie w <code>&lt;body&gt;</code> response żądania. Od strony PHP sprawa wygląda bardzo prosto &#8211; jeżeli <strong>request</strong> został wysłany przez jQuery, wyświetlamy tylko to, co jest pomiędzy <code>&lt;body&gt;</code> i <code>&lt;/body&gt;</code>. Po wysłaniu requesta, jQuery powinno wkleić wynik do body na naszej stronie.</p>
<p>Przykładu nie będę tłumaczył, bo wydaje mi się trywialny.</p>
<ul>
<li><a href="/code/live/jQueryAjaxPostForm/">Live demo</a></li>
<li><a href="/code/live/jQueryAjaxPostForm/jquery.autoload.js">jquery.autoload</a></li>
<li><a href="/code/jQueryAjaxPostForm">index.php</a></li>
</ul>
<p>Dodatkowe ficzery:</p>
<ul>
<li>disable submita do momentu, aż ajax nie otrzyma odpowiedzi (aby użytkownik nie mógł kliknąć drugi raz),</li>
<li>automatyczne wykrywanie adresu URL, do którego odnosi się formularz (jeżeli nie sprecyzowano atrybutu <code>action</code>, wówczas wysyłamy żądanie do <code>window.location</code>).</li>
</ul>
<p>Aby nasz formularz zaczął przesyłać dane w tle wystarczy dołączyć plik <code>jquery.autoload</code>, a w kodzie napisać:</p>
<pre>$(document).ready(function() {  InitAjaxPost(' ... SUBMIT_ID ... '); });</pre>
<p>Ten sposób nie rozwiązuje przesyłania pól typu <code>file</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/jquery-form-post-ajax-request/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Szkoła hackerów</title>
		<link>http://athlan.pl/szkola-hackerow/</link>
		<comments>http://athlan.pl/szkola-hackerow/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 18:34:40 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[JS/Ajax]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Wykop]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=134</guid>
		<description><![CDATA[Tak się składa, że czasem szperam w kodach źródłowych witryn. Szkoła hackerów &#8211; kurs &#8220;hackingu&#8221;, który się reklamuje po całym Internecie (padła propozycja również dla mojego serwisu lookme.pl) nie dba o swoją aplikację webową. Jeżeli stawiamy walidator do formularza, który ma obsłużyć dane wprowadzone przez użytkownika, musimy: Sprawdzić je po stronie serwera, jeżeli przejdą proces [...]]]></description>
			<content:encoded><![CDATA[<p>Tak się składa, że czasem szperam w kodach źródłowych witryn. Szkoła hackerów &#8211; kurs &#8220;hackingu&#8221;, który się reklamuje po całym Internecie (padła propozycja również dla mojego serwisu lookme.pl) nie dba o swoją aplikację webową.</p>
<p>Jeżeli stawiamy walidator do formularza, który ma obsłużyć dane wprowadzone przez użytkownika, musimy:</p>
<ol>
<li>Sprawdzić je po stronie serwera, jeżeli przejdą proces walidacji, dopiero potem podjąć akcję, w przypadku wystąienia błędów &#8211; wyświetlić je użytkownikowi.</li>
<li>(Ewentualnie) Poinformować o błędzie już po stronie użytkownika bez przeładowania strony ani bez użycia jakiegokolwiek requestu ajax (sprawa kosmetyczna, niekonieczna).</li>
</ol>
<p>Każdy programista powinien powiedzieć, że walidacja po stronie serwera jest najważniejsza, już pomijając tą po stronie użytkownika, bo przecież kod JS można modyfikować, więc może go teoretycznie nie być.</p>
<p><img class="alignright" style="border: 1px solid black; margin-left: 10px; margin-right: 10px; float: right;" src="http://img216.imageshack.us/img216/6100/shss5.jpg" alt="" width="335" height="114" /><a href="http://nt.interia.pl/wiadomosc_dnia/news/jak-zhakowac-szkole-hakerow,949699">Już raz Szkoła Hackerów dała popis</a> &#8211; dziura <a href="http://pl.wikipedia.org/wiki/SQL_injection">SQL Injection</a>. Specjaliści? Nawet na <a href="http://forum.php.pl/Przedszkole_f27.html">forum przedszkole</a> (<a href="http://forum.php.pl/">forum.php.pl</a>) rzadko zdarzają się aż tak amatorskie kody.</p>
<p>Narzędziem firebug sprawdziłem formularz kontaktowy szkoły hackerów. Okazało się, że formularz posiada atrybut onsubmit, który wykonuje funkcję javascript valid(). Za pomocą narzędzia Firebug pozwoliłem sobie ją pominąć, tak, aby formularz zawsze otrzymywał true przy onsubmit (czyli się wykonywał). Okazało się, że dane po stronie serwera nie są sprawdzane. Nie jestem w stanie zdiagnozować, czy mail się wysłał, ale w takim przypadku użytkownik otrzymuje komunikat:</p>
<blockquote><p><span class="style16"><span style="font-size: xx-small;"><strong></strong></span> Twoja wiadomość została wysłana. Odpowiemy tak szybko, jak tylko będzie to możliwe, z reguły w ciągu 24 godzin. Odpowiedź  zostanie przesłana na podany przez Ciebie adres e-mail (). </span></p></blockquote>
<p>Amatorka?</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/szkola-hackerow/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ocenpizze.pl</title>
		<link>http://athlan.pl/ocenpizze/</link>
		<comments>http://athlan.pl/ocenpizze/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 14:29:41 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[JS/Ajax]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Solutions]]></category>
		<category><![CDATA[Wykop]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=126</guid>
		<description><![CDATA[22 lipca oficjalnie wystartował mój nowy projekt: ocenpizze.pl. Każdy użytkownik może m.in.: oceniać pizzerie wg 3 kategorii: wystrój, obsługa oraz jakość podawanego jedzenia wraz z dodaniem osobistego komentarza, wyszukiwać pizzerie w swoim mieście/województwie, uzyskiwać informacje o aktualnie otwartych lokalach w danej lokalizacji w danym czasie (innowacyjny pomysł na polskiej scenie gastronomicznej), proponować nowe lokale. Właściciele [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" style="border: 1px solid black; margin-left: 10px; margin-right: 10px; float: right;" src="http://img168.imageshack.us/img168/786/brooklynstylepizza712way8.jpg" alt="" width="300" height="150" />22 lipca oficjalnie wystartował mój nowy projekt: <a href="http://www.ocenpizze.pl">ocenpizze.pl</a>. Każdy użytkownik może m.in.:</p>
<ul>
<li><a href="http://www.ocenpizze.pl/">oceniać</a> pizzerie wg 3 kategorii: wystrój, obsługa oraz jakość podawanego jedzenia wraz z dodaniem osobistego komentarza,</li>
<li><a href="http://www.ocenpizze.pl/szukaj.html">wyszukiwać</a> pizzerie w swoim mieście/województwie,</li>
<li>uzyskiwać informacje o <a href="http://www.ocenpizze.pl/aktualnie-otwarte.html">aktualnie otwartych lokalach</a> w danej lokalizacji w danym czasie (innowacyjny pomysł na polskiej scenie gastronomicznej),</li>
<li><a href="http://www.ocenpizze.pl/panel/dodaj.html">proponować nowe lokale</a>.</li>
</ul>
<p>Właściciele lokali mogą:</p>
<ul>
<li>uzyskać dostęp do panelu administracyjnego,</li>
<li>uzupełniać godziny otwarcia swojego lokalu,</li>
<li>dodawać fotografie i logo lokalu,</li>
<li>tworzyć prezentację swojej firmy na zasadzie tworzenia zakładek.</li>
</ul>
<p>Serwis po dwudniowej pracy zyskał sympatię wielu użytkowników. Tych, którym podoba się serwis, zapraszam na <a href="http://www.wykop.pl/link/80447/ocen-swoja-pizzerie-szukaj-ktore-lokale-w-twoim-miescie-sa-otwarte">wykop</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/ocenpizze/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Weryfikacja spamu?</title>
		<link>http://athlan.pl/weryfikacja-spamu/</link>
		<comments>http://athlan.pl/weryfikacja-spamu/#comments</comments>
		<pubDate>Sun, 12 Aug 2007 10:36:51 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[JS/Ajax]]></category>
		<category><![CDATA[Solutions]]></category>

		<guid isPermaLink="false">http://athlan.vgroup.pl/weryfikacja-spamu/</guid>
		<description><![CDATA[Dzisiaj chciałbym się zająć ukrywaniem zewnętrznych obrazów. Dlaczego wart się chronić. Wiele spambotów wykorzystuje metodę weryfikacji dostarczenia wiadomości poprzez wyświetlenie obrazu. Jeżeli program kliencki to aplikacja internetowa (chociażby gmail, onet poczta, poczta interii itp) nie będzie najmniejszego problemu weryfikacji obrazu. Jak to działa? Spambot buduje linki: http://spam.com/logo.jpg?m=jakis@email Co mu to daje. Do każdego listu dołączone [...]]]></description>
			<content:encoded><![CDATA[<p>Dzisiaj chciałbym się zająć ukrywaniem zewnętrznych obrazów. Dlaczego wart się chronić. Wiele spambotów wykorzystuje metodę weryfikacji dostarczenia wiadomości poprzez wyświetlenie obrazu. Jeżeli program kliencki to aplikacja internetowa (chociażby gmail, onet poczta, poczta interii itp) nie będzie najmniejszego problemu weryfikacji obrazu. Jak to działa? Spambot buduje linki:</p>
<p><em>http://spam.com/logo.jpg?m=jakis@email</em></p>
<p>Co mu to daje. Do każdego listu dołączone są obrazy, może być to logo, znaczek firmowy bądź też ukryty gif 1&#215;1 pikseli. Wszystko po to, aby użytkownik nie zorientował się, że otwarcie niepożądanej wiadomości jest weryfikowane. Po co weryfikacja? Jeżeli list zostanie otwarty, spambot będzie kontynuował wysyłanie maili, jeżeli nie, zaprzestanie działań, bądź sprawdzi jeszcze kilka maili.</p>
<p>Lekarstwo na ten problem zastosował gmail, ukrywając wyświetlanie grafiki w mailach dla bezpieczeństwa użytkowników. Sprawa przedstawia się bardzo prosto, ale daje oczekiwane rezultaty. Z pomocą przychodzi nam kawałek kodu:</p>
<p><a HREF="http://phpfi.com/255830">http://phpfi.com/255830</a></p>
<p>Jeszcze się z takim przypadkiem nie spotkałem, ale spamboty mogą zacząć weryfikować otwierając dokumenty .js, .css, .js zawarte w nagłówkach.</p>
<p>Kolejną rzeczą, której należy unikać to rezygnacja z subskrycji w podejrzanych mailach. Tak naprawdę może ona zasubskrybować nasz adres poczty elektronicznej, weryfikując rezygnację.</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/weryfikacja-spamu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Preloader obrazów</title>
		<link>http://athlan.pl/preloader-obrazow/</link>
		<comments>http://athlan.pl/preloader-obrazow/#comments</comments>
		<pubDate>Fri, 10 Aug 2007 14:49:01 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JS/Ajax]]></category>
		<category><![CDATA[Solutions]]></category>

		<guid isPermaLink="false">http://athlan.vgroup.pl/preloader-obrazow/</guid>
		<description><![CDATA[Preload obrazów jest bardzo prosty. Nadajemy atrybutowi onload dla tagu img akcje, która miałaby schować maskę nałożoną na obraz po jego załadowaniu. Funkcja javascript: http://phpfi.com/255529 Kawałek styli CSS: http://phpfi.com/255528 Ostatnia rzecz&#8230; kod xhtml: http://phpfi.com/255527 Kod do własnego dostosowania. NOTE: Dla elementów xhtml znajdujących się wewnątrz warstwy z atrybutem overflow = auto, należy: Zmienić w kodzie [...]]]></description>
			<content:encoded><![CDATA[<p>Preload obrazów jest bardzo prosty. Nadajemy atrybutowi <a HREF="http://algorytmy.pl/doc/xhtml/index.php?id=2074">onload</a> dla tagu <a HREF="http://algorytmy.pl/doc/xhtml/index.php?id=1046">img</a> akcje, która miałaby schować maskę nałożoną na obraz po jego załadowaniu.</p>
<ul>
<li>Funkcja javascript: <a HREF="http://phpfi.com/255529">http://phpfi.com/255529</a></li>
<li>Kawałek styli CSS:  <a HREF="http://phpfi.com/255528">http://phpfi.com/255528</a></li>
<li>Ostatnia rzecz&#8230; kod xhtml: <a HREF="http://phpfi.com/255527">http://phpfi.com/255527</a></li>
</ul>
<p>Kod do własnego dostosowania.</p>
<p><strong>NOTE</strong>: Dla elementów xhtml znajdujących się wewnątrz warstwy z atrybutem <a HREF="http://algorytmy.pl/doc/xhtml/index.php?id=3087">overflow</a> = auto, należy:</p>
<ol>
<li>Zmienić w kodzie CSS <a HREF="http://algorytmy.pl/doc/xhtml/index.php?id=3103">pozycję</a> absolute na domyślne: relative oraz nadać tagowi <a HREF="http://algorytmy.pl/doc/xhtml/index.php?id=1046">img</a> <a HREF="http://algorytmy.pl/doc/xhtml/index.php?id=3129">width</a> oraz <a HREF="http://algorytmy.pl/doc/xhtml/index.php?id=3060">height</a> na 0px.</li>
<li>Do kodu javascript: nadać obrazowi odpowiednie rozmiary &#8211; ta akcja zostanie wykonana po schowaniu maski po załadowaniu obrazu.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/preloader-obrazow/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>mintAjax</title>
		<link>http://athlan.pl/mintajax/</link>
		<comments>http://athlan.pl/mintajax/#comments</comments>
		<pubDate>Thu, 01 Mar 2007 22:52:52 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[JS/Ajax]]></category>
		<category><![CDATA[Wykop]]></category>

		<guid isPermaLink="false">http://athlan.vgroup.pl/mintajax/</guid>
		<description><![CDATA[Ostatnio na blogu Zyx&#8217;a wyczytałem notkę o mintAjax. Powstało wiele wersji Ajaxa obsługujących dynamiczne requesty, jednak ten zadziwił mnie najbardziej, w pełnym stopniu pozytywnie. Kolejny dowód na to, co potrafią Polacy. Dla takiego cuda szkoda słów, wystarczy popatrzeć na przykłady zastosowań. Zawartość biblioteki mintAjax: Rozbudowana obsługa zapytań AJAX Odpowiedź jako czysty tekst lub w formacie [...]]]></description>
			<content:encoded><![CDATA[<p>Ostatnio na blogu <a href="http://www.zyxist.com/">Zyx&#8217;a</a> wyczytałem <a href="http://www.zyxist.com/pokaz.php/mintajax">notkę</a> o <a href="http://www.mintajax.pl/">mintAjax</a>. Powstało wiele wersji Ajaxa obsługujących dynamiczne requesty, jednak ten zadziwił mnie najbardziej, w pełnym stopniu pozytywnie. Kolejny dowód na to, co potrafią Polacy. Dla takiego cuda szkoda słów, wystarczy popatrzeć na <a href="http://www.mintajax.pl/?guide">przykłady zastosowań.</a></p>
<p style="text-align: center"><a href="http://www.mintajax.pl/"><img src="http://img405.imageshack.us/img405/690/logojw5.gif" border="0" height="100" width="200" /></a></p>
<blockquote><p>Zawartość biblioteki mintAjax:</p>
<ul>
<li><strong>Rozbudowana obsługa zapytań AJAX</strong></li>
<li> Odpowiedź jako czysty tekst lub w formacie XML bądź JSON</li>
<li>Wznawianie zapytań do serwera</li>
<li> Automatyczne wysyłanie danych z formularzy</li>
<li><strong> Animowane efekty graficzne</strong></li>
<li>Zmiana kolorów obiektu</li>
<li>Zmiana położenia obiektu</li>
<li>Zmiana rozmiarów obiektu</li>
<li>Zmiana przezroczystości obiektu</li>
<li><strong>Drag&#8217;n'Drop</strong></li>
<li>Ustawianie pola ograniczającego dla przeciąganych obiektów</li>
<li>Blokowanie przesuwania w pionie lub pozioimie</li>
<li>Wstawianie przeciąganych obiektów w środku kontenera z rozsuwaniem sąsiednich obiektów</li>
<li>Możliwość ustawienia różnych stylów dla różnych zdarzeń</li>
<li><strong>Kontrolki do obsługi zakładek oraz drzewek</strong></li>
<li>Dynamiczne ładowanie zawartości z serwera jako zwykły tekst lub w formacie XML bądź JSON</li>
<li>Pamięć podręczna zapobiegająca ładowaniu zawartości za każdą zmianą zakładki/elementu</li>
<li>Dynamiczna zmiana adresu bez przeładowania strony</li>
<li>Możliwość ustawienia różnych stylów oraz ikon dla różnych zdarzeń</li>
<li><strong>Kontrolka dynamicznych tabel</strong></li>
<li>Sortowanie tabeli według napisów, liczb i dat</li>
<li>Zaznaczanie pojedyncze/wielokrotne wierszów tabeli</li>
<li>Usuwanie i pobieranie zaznaczonych wierszów</li>
<li>Możliwość ustawienia różnych stylów dla różnych zdarzeń</li>
<li><strong>Pozostałe</strong></li>
<li>Menadżer eventów rozwiązujący problem wskaźnika this w IE</li>
<li>Zestaw funkcji do m.in pobierania położenia obiektu, elementu w podanym punkcie, przezroczystości obiektu, sprawdzenie czy punkt znajduje się wewnątrz obiektu, zamiana koloru HEX na RGB i inne</li>
</ul>
</blockquote>
<p>Cały kod zajmuje jedynie ~40 kb, a możliwości są ogromne, osobiście zastosuje bibliotekę w moich projektach, tym bardziej, że posiada <a href="http://www.mintajax.pl/?manual">doskonałą dokumentację</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/mintajax/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Valentine&#8217;s Day</title>
		<link>http://athlan.pl/valentines-day/</link>
		<comments>http://athlan.pl/valentines-day/#comments</comments>
		<pubDate>Wed, 14 Feb 2007 22:05:36 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[JS/Ajax]]></category>
		<category><![CDATA[Wykop]]></category>

		<guid isPermaLink="false">http://athlan.vgroup.pl/valentines-day/</guid>
		<description><![CDATA[Walentynki &#8211; miły dzień, w którym nawzajem mówimy sobie coś słodkiego. Youtube z tej okazji zrobiło specjalny klip Video, w którym użytkwnicy mogli wypowiedzieć się, co tak naprawdę kochają. Ostatni użytkownik kocha JavaScript :)]]></description>
			<content:encoded><![CDATA[<p>Walentynki &#8211; miły dzień, w którym nawzajem mówimy sobie coś słodkiego. <a HREF="http://youtube.com">Youtube</a> z tej okazji zrobiło specjalny <a HREF="http://youtube.com/watch?v=Z9m0oR49SzI">klip Video</a>, w którym użytkwnicy mogli wypowiedzieć się, co tak naprawdę kochają. Ostatni użytkownik kocha JavaScript :)</p>
<p><object HEIGHT="350" WIDTH="425"><param VALUE="http://www.youtube.com/v/Z9m0oR49SzI" NAME="movie"></param><param VALUE="transparent" NAME="wmode"></param><embed HEIGHT="350" WIDTH="425" wmode="transparent" TYPE="application/x-shockwave-flash" SRC="http://www.youtube.com/v/Z9m0oR49SzI"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/valentines-day/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Select all checkboxes</title>
		<link>http://athlan.pl/select-all-checkboxes/</link>
		<comments>http://athlan.pl/select-all-checkboxes/#comments</comments>
		<pubDate>Thu, 08 Feb 2007 16:33:42 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[JS/Ajax]]></category>
		<category><![CDATA[Solutions]]></category>

		<guid isPermaLink="false">http://athlan.vgroup.pl/select-all-checkboxes/</guid>
		<description><![CDATA[Ostatnio zabrałem się za prywatne wiadomości w jednym z moich prac. Lista wiadomości miała dużo checkboxów, które obsługiwały akcję dla zaznaczonych elementów. Bardzo długo testuje moje aplikacje, gdy zebrało się około 30 testowych prywatnych wiadomości musiałem zaznaczyć wszystkie i wybrać akcję &#8220;usuń&#8221;. Co by było, gdyby projekt wszedł w użycie i ktoś musiałby borykać się [...]]]></description>
			<content:encoded><![CDATA[<p>Ostatnio zabrałem się za prywatne wiadomości w jednym z moich prac. Lista wiadomości miała dużo checkboxów, które obsługiwały akcję dla zaznaczonych elementów. Bardzo długo testuje moje aplikacje, gdy zebrało się około 30 testowych prywatnych wiadomości musiałem zaznaczyć wszystkie i wybrać akcję &#8220;usuń&#8221;. Co by było, gdyby projekt wszedł w użycie i ktoś musiałby borykać się z tym samym problemem? Postanowiłem użyć JavaScript i stworzyć funkcje CheckboxReverse() dla odwrócenia zaznaczenia oraz CheckboxCheck() dla zaznaczenia lub odznaczenia wszystkich elementów. Zapewne bylo to wałkowane wiele razy, w sieci spotkałem wiele gotowców, ale ja pokusiłem napisać się skrypt od podstaw. Dla tych, którzy piszą jak ja ukazał się tan artykuł.</p>
<p><strong>Co powinniśmy wiedzieć?</strong></p>
<p>Przy tworzeniu funkcji CheckboxCheck() powinniśmy wiedzieć, jak przeskanować wszystkie elementy formularza i wybrać checkboxy, po czym ustawić zaznaczenie. Na dostęp do elementów formularza pozwala odniesienie <code>oObject.elements</code>, gdzie <em>oObject</em> to obiekt formularza pobrany za pomocą zidentyfikowaniu po id i deklaracji funkcji <em>GetElementById()</em>, dla <em>document</em>. Jako że atrybut <em>elements</em> jest tablicą, nasza praca na nich nie powinna być trudna, wystarczy stworzyć pętlę. Do tego potrzebna nam jest jeszcze ilość elementów. Aby ją otrzymać musimy wykonać polecenie <code>oObject.elements.length</code> (<em>.lenght</em> &#8211; odpowiednik count() w PHP). Atrybut <em>elements</em> jest taką samą tablicą jak w PHP, dlatego aby odnieść się do trzeciego elementu formularza należy podać <code>oObject.elements[2];</code> . Ok teraz kolejna sprawa&#8230; każdy <code>input</code> jest obiektem, który posiada wiele atrybutów. Nas będą interesowały tylko trzy: <code>type</code> <em>(string)</em>, <code>disabled</code> <em>(bool)</em> oraz <code>checked</code> <em>(bool)</em>. Pierwszy atrybut informuje nas o wartości parametru type=&#8221;" w HTML. Parametry 2 i 3 przyjmują wartości logiczne true/false. Pierwszy informuje o aktywności elementu, gdy false, wówczas elementu nie można zaznaczyć, staje się zaciemniony. Druga wartość informuje nas o tym, czy checkbox jest zaznaczony, czy nie. Aby odwolać się do atrybutu należy wykonać: oObject.elements[numer_elementu].nazwa_atrybutu.<strong>Czas na kod.</strong></p>
<p>[js]function CheckboxReverse(oObject)<br />
{<br />
var iObjectElements = oObject.elements.length;</p>
<p>for (iElement = 0; iElement &lt; iObjectElements; iElement++)<br />
{<br />
if(oObject.elements[iElement].type == &#8220;checkbox&#8221; &amp;&amp; oObject.elements[iElement].disabled == false)<br />
{<br />
if(oObject.elements[iElement].checked == true)<br />
oObject.elements[iElement].checked = false;<br />
else<br />
oObject.elements[iElement].checked = true;<br />
}<br />
}<br />
}</p>
<p>function CheckboxCheck(oObject, bMode)<br />
{<br />
var iObjectElements = oObject.elements.length;<br />
var bMode = (bMode === true) ? true : false;</p>
<p>for (iElement = 0; iElement &lt; iObjectElements; iElement++)<br />
{<br />
if(oObject.elements[iElement].type == &#8220;checkbox&#8221; &#038;&#038; oObject.elements[iElement].disabled == false)<br />
{<br />
oObject.elements[iElement].checked = bMode;<br />
}<br />
}<br />
}[/js]</p>
<p><strong>Użycie:</strong></p>
<p>[html]<a href="javascript:void(0)" onclick="CheckboxReverse(document.getElementById('CheckboxExample'))">reverse selection</a><br />
<a href="javascript:void(0)" onclick="CheckboxCheck(document.getElementById('CheckboxExample'), true)">select all</a><br />
<a href="javascript:void(0)" onclick="CheckboxCheck(document.getElementById('CheckboxExample'), false)">deselect all</a></p>
<form id="CheckboxExample">
<input name="foo" value="bar" type="checkbox" />
<input name="foo" value="bar" type="checkbox" />
<input name="foo" value="bar" checked="checked" type="checkbox" />
<input name="foo" value="bar" type="checkbox" />
<input name="foo" value="bar" checked="checked" type="checkbox" />
<input name="foo" value="bar" disabled="disabled" type="checkbox" />
<input name="foo" value="bar" type="checkbox" />
<input name="foo" value="bar" type="checkbox" />
<input name="foo" value="bar" disabled="disabled" type="checkbox" />
</form>
<p>[/html]</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/select-all-checkboxes/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cookie checker</title>
		<link>http://athlan.pl/cookie-checker/</link>
		<comments>http://athlan.pl/cookie-checker/#comments</comments>
		<pubDate>Mon, 05 Feb 2007 17:01:25 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[JS/Ajax]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Solutions]]></category>

		<guid isPermaLink="false">http://athlan.vgroup.pl/cookie-checker/</guid>
		<description><![CDATA[Dostałem maile i komentarz na blogu odnośnie sprawdzania ciastek usera. Dyskusja wynikła z artykułu „Online counter + cache‿, w którym takowe były wykorzystywane. Jeden z internautów zapytał czy jest możliwe sprawdzenie, czy da się sprawdzić, czy użytkownik ma włączoną obsługę ciastek i podjąć jakieś działania. Inny zaś zapytał, czy jest to do wykonania z poziomu [...]]]></description>
			<content:encoded><![CDATA[<p STYLE="margin-bottom: 0cm">Dostałem maile i komentarz na blogu odnośnie sprawdzania ciastek usera. Dyskusja wynikła z artykułu „Online counter + cache‿, w którym takowe były wykorzystywane. Jeden z internautów zapytał czy jest możliwe sprawdzenie, czy da się sprawdzić, czy użytkownik ma włączoną obsługę ciastek i podjąć jakieś działania. Inny zaś zapytał, czy jest to do wykonania z poziomu JavaScript. Na oba pytania mogę śmiało odpowiedzieć: TAK.</p>
<p STYLE="margin-bottom: 0cm">Logika zachowania skryptu w obu przypadkach (PHP i JS) jest taka sama: wysyłamy użytkownikowi ciastko, a następnie sprawdzamy jego wartość. Jeżeli wartość jest błędna, lub nie istnieje, wówczas możemy wyciągnąć śmiały wniosek, iż takowy cookies nie został prawidłowo przesłany – user ma wyłączone cookies, bądź ich wysyłanie jest błędnie interpretowane.</p>
<p STYLE="margin-bottom: 0cm">Kod ze strony PHP, który ma wbudowaną funkcję setcookie() i odczyt z poziomu tablicy $_COOKIES (<a HREF="http://php.net/setcookie">odnoszę do manuala</a>)</p>
<p STYLE="margin-bottom: 0cm">[php]function CheckUserCookies()<br />
{<br />
setcookie(&#8216;testcookie&#8217;, &#8216;test&#8217;, (time() + 60));</p>
<p>if(isset($_COOKIE['testcookie']))<br />
return true;</p>
<p>return false;<br />
}</p>
<p>if(CheckUserCookies())<br />
echo &#8216;ok, user ma włączone cookies&#8217;;<br />
else<br />
echo &#8216;proszę, włącz swoje cookies!&#8217;;[/php]
</p>
<p STYLE="margin-bottom: 0cm">JS nie ma wygodnej sytuacji, musi w jakiś sposób utworzyć cookies, zostały stworzone funkcje createCookie() oraz readCookie() (skorzystałem z gotowego rozwiązania). Aby ułatwić pracę, funkcja ustawiająca ciastko otrzymała takie same trzy pierwsze parametry, jak jest w przypadku PHP.</p>
<p STYLE="margin-bottom: 0cm">[js]function CheckUserCookies()<br />
{<br />
createCookie(&#8216;testcookie&#8217;, &#8216;test&#8217;, 60);</p>
<p>if(readCookie(&#8216;testcookie&#8217;) == &#8216;test&#8217;)<br />
return true;</p>
<p>return false;<br />
}</p>
<p>function createCookie(name, value, timestamp)<br />
{<br />
if (timestamp)<br />
{<br />
var date = new Date();<br />
date.setTime(date.getTime()+(timestamp));<br />
var expires = &#8220;; expires=&#8221;+date.toGMTString();<br />
}<br />
else var expires = &#8220;&#8221;;<br />
document.cookie = name+&#8221;=&#8221;+value+expires+&#8221;; path=/&#8221;;<br />
}</p>
<p>function readCookie(name)<br />
{<br />
var nameEQ = name + &#8220;=&#8221;;<br />
var ca = document.cookie.split(&#8216;;&#8217;);<br />
for(var i=0;i &lt; ca.length;i++)<br />
{<br />
var c = ca[i];<br />
while (c.charAt(0)==&#8217; &#8216;) c = c.substring(1,c.length);<br />
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);<br />
}<br />
return null;<br />
}</p>
<p>/**<br />
* Usable&#8230;<br />
*/</p>
<p>setTimeout(&#8220;alert(CheckUserCookies())&#8221;, 100);<br />
[/js]</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/cookie-checker/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
