<?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>Александр Улизько &#187; Программирование</title>
	<atom:link href="http://ulizko.com/categories/development/feed" rel="self" type="application/rss+xml" />
	<link>http://ulizko.com</link>
	<description></description>
	<lastBuildDate>Wed, 24 Feb 2010 14:25:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Strip firebug console api calls</title>
		<link>http://ulizko.com/posts/371</link>
		<comments>http://ulizko.com/posts/371#comments</comments>
		<pubDate>Mon, 05 Oct 2009 18:57:35 +0000</pubDate>
		<dc:creator>Александр Улизько</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[deploy]]></category>
		<category><![CDATA[firebug]]></category>
		<category><![CDATA[yui builder]]></category>

		<guid isPermaLink="false">http://ulizko.com/posts/371</guid>
		<description><![CDATA[На днях надо было сходить показать представителю заказчика, как пользоваться одной свежевстроенной в проект фичей.
За полчаса до выхода подготовил новый билд,&#160;протестировал.
По приезду оказалось, что у заказчика фича не работает. Неприятно получилось, в&#160;общем.
Но радость ваша, мои дорогие читатели, была бы не полной, если бы я не сообщил вам, что там случилось и что я по этому [...]]]></description>
			<content:encoded><![CDATA[<p>На днях надо было сходить показать представителю заказчика, как пользоваться одной свежевстроенной в проект фичей.<br />
За полчаса до выхода подготовил новый билд,&nbsp;протестировал.</p>
<p>По приезду оказалось, что у заказчика фича не работает. Неприятно получилось, в&nbsp;общем.</p>
<p>Но радость ваша, мои дорогие читатели, была бы не полной, если бы я не сообщил вам, что там случилось и что я по этому поводу&nbsp;предпринял.</p>
<p><span id="more-371"></span></p>
<p>Оказалось, что я забыл удалить в функции-обработчике события вызов firebug&#8217;овской консоли (<code>console.log</code>… и т.п.) Со мной вообще часто бывает такое, что я то какой-то символ, случайно ткнув на клавиатуру, допишу, то, наоборот, удалю&thinsp;&#8211;&thinsp;короче, использование редакторов без подсветки синтакса и (желательно) анализа структуры кода мне&nbsp;противопоказаны.</p>
<p>Так как я использую apache ant для развертывания приложения на боевой сервер, я дописал маленький скриптик, который уберет все вызовы <code lang="javascript">console.log(/* something */)</code> или <code lang="javascript">console.dir(/* something */)</code> из вашего&nbsp;кода.</p>
<p>Собственно, вот&nbsp;он:</p>
<p><script src="http://gist.github.com/202343.js"></script></p>
<p>Использовать так: создать xml-файл с удобным вам именем (например, boom.xml) и скопипастить в него этот код. Разумеется, стоит поправить значение переменной js, которая указывает на папку с еще не сжатыми js-скриптами. После этого запускаем адскую машину такой командой (для&nbsp;*nix):</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">ant stripFirebugConsoleCalls <span style="color: #660033;">-buildfile</span> <span style="color: #000000; font-weight: bold;">/</span>path<span style="color: #000000; font-weight: bold;">/</span>to<span style="color: #000000; font-weight: bold;">/</span>boom.xml</pre></div></div>

<p>Вот и все. Засим я откланиваюсь до следующего ЧП или конца&nbsp;проекта.</p>
]]></content:encoded>
			<wfw:commentRss>http://ulizko.com/posts/371/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Невпопад</title>
		<link>http://ulizko.com/posts/360</link>
		<comments>http://ulizko.com/posts/360#comments</comments>
		<pubDate>Fri, 15 May 2009 20:28:57 +0000</pubDate>
		<dc:creator>Александр Улизько</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[ништяки]]></category>
		<category><![CDATA[фяп]]></category>

		<guid isPermaLink="false">http://ulizko.com/?p=360</guid>
		<description><![CDATA[Хочу в отпуск. Так хочу, что меня все&#160;раздражает.
GC в ruby в сто раз примитивнее того, что используется в jvm.&#160;Ц-ц-ц.
И еще меня начинает раздражать &#171;мусорность&#187; javascript. Я имею ввиду, что, в целом, многие ништяки из ФЯП можно реализовать  и в javascript, но на java-подобный синтакс такие штуки не очень хорошо&#160;ложатся:

Чрезвычайно избыточный и непонятный с непривычки [...]]]></description>
			<content:encoded><![CDATA[<p>Хочу в отпуск. Так хочу, что меня все&nbsp;раздражает.</p>
<p>GC в ruby в сто раз примитивнее того, что используется в jvm.&nbsp;Ц-ц-ц.</p>
<p>И еще меня начинает раздражать &laquo;мусорность&raquo; javascript. Я имею ввиду, что, в целом, многие ништяки из ФЯП можно реализовать  и в javascript, но на java-подобный синтакс такие штуки не очень хорошо&nbsp;ложатся:</p>
<p><script src="http://gist.github.com/112417.js"></script></p>
<p>Чрезвычайно избыточный и непонятный с непривычки код, особенно в сравнении с аналогичным в ruby или&nbsp;python. </p>
]]></content:encoded>
			<wfw:commentRss>http://ulizko.com/posts/360/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>manual written if</title>
		<link>http://ulizko.com/posts/346</link>
		<comments>http://ulizko.com/posts/346#comments</comments>
		<pubDate>Sun, 15 Mar 2009 13:04:49 +0000</pubDate>
		<dc:creator>Александр Улизько</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[code fun]]></category>

		<guid isPermaLink="false">http://ulizko.com/?p=346</guid>
		<description><![CDATA[Как многие из&#160;вас в&#160;курсе, на&#160;днях на&#160;хабре промелькнул топик &#171;Как я&#160;гонял на&#160;клаве&#187;, от&#160;хабраюзера jahson. Примечателен этот топик вовсе не&#160;своим скриптом, а&#160;тем, что дал старт достаточно неприятной сваре, в&#160;ходе которой владелец и&#160;автор &#171;Клавогонок&#187;, известный на&#160;хабре как artch, повел себя, на&#160;мой взгляд, не&#160;вполне адекватно. Это не&#160;говоря уж&#160;о&#160;том, что решать такие вопросы принято в&#160;личке, не&#160;привлекая общественное мнение (которое, к&#160;слову, [...]]]></description>
			<content:encoded><![CDATA[<p>Как многие из&nbsp;вас в&nbsp;курсе, на&nbsp;днях на&nbsp;хабре промелькнул топик &laquo;<a href="http://habrahabr.ru/blogs/i_am_clever/54210/">Как я&nbsp;гонял на&nbsp;клаве</a>&raquo;, от&nbsp;хабраюзера <a href="http://jahson.habrahabr.ru/">jahson</a>. Примечателен этот топик вовсе не&nbsp;своим скриптом, а&nbsp;тем, что дал старт достаточно неприятной сваре, в&nbsp;ходе которой владелец и&nbsp;автор &laquo;<a href="http://klavogonki.ru/">Клавогонок</a>&raquo;, известный на&nbsp;хабре как <a href="http://artch.habrahabr.ru/">artch</a>, повел себя, на&nbsp;мой взгляд, не&nbsp;вполне адекватно. Это не&nbsp;говоря уж&nbsp;о&nbsp;том, что решать такие вопросы принято в&nbsp;личке, не&nbsp;привлекая общественное мнение (которое, к&nbsp;слову, катком прошлось по&nbsp;карме&nbsp;artch).</p>
<p>По&nbsp;мере того, как я&nbsp;читал обсуждение, мне все больше становилось жаль jahson&#8217;a,&nbsp;по&nbsp;мере сил отбивавшегося от&nbsp;нападок автора и&nbsp;присных. И&nbsp;в&nbsp;процессе этого сочуствования решил я&nbsp;поднять jahson&#8217;у&nbsp;карму, зайдя в&nbsp;его личку. Где увидел не&nbsp;только то,&nbsp;что он&nbsp;не&nbsp;особо нуждается в&nbsp;помощи, но&nbsp;и&nbsp;то,&nbsp;что он&nbsp;член &laquo;Российского крыла Web Standards&nbsp;Group&raquo;.</p>
<p>Тут надо сделать отступление&thinsp;&#8212;&thinsp;я,&nbsp;вообще говоря, не&nbsp;знал о&nbsp;существовании такой организации, точнее, о&nbsp;существовании ее&nbsp;российского крыла, и&nbsp;немедленно заинтересовался. Набрав в&nbsp;гугле известное сочетание слов, я&nbsp;попал на&nbsp;страничку &laquo;<a href="http://web-standards.ru/">Веб-стандарты&thinsp;&mdash;&thinsp;WSG-Россия</a>&raquo;. Интересно, можно&nbsp;ли еще попасть в&nbsp;ряды, или лавочка уже прикрыта? Судя по&nbsp;тому, что последние встречи проводились в&nbsp;2007&nbsp;году, то&nbsp;уже нет, но,&nbsp;если кто-то владеет более актуальной информацией, призываю его&nbsp;поделиться.</p>
<p>Внизу главной странички есть калейдоскоп ссылок под названием &laquo;список контактных лиц&raquo;, и,&nbsp;если пройти по&nbsp;ним, то&nbsp;выяснится, что за&nbsp;ними скрываются очень знакомые и&nbsp;авторитетные люди и&nbsp;ресурсы. Люди, в&nbsp;той или иной степени определяющие сегодняшний облик рунета. Например, по&nbsp;тому&nbsp;же webmascon лично я&nbsp;учился&nbsp;верстке.</p>
<p>Отдельно хотелось&nbsp;бы упомянуть Дмитрия Барановского, который, к&nbsp;слову, присутствует и&nbsp;на&nbsp;хабре под псевдонимом&#8230; <a href="http://DmitryBaranovskiy.habrahabr.ru/">DmitryBaranovskiy</a> (сюрприз!) и,&nbsp;по&nbsp;совместительству, является разработчиком <a href="http://raphaeljs.com/">Rapha&#235;l&thinsp;&mdash;&thinsp;JavaScript&nbsp;Library</a>.</p>
<p>Читая его <a href="http://dmitry.baranovskiy.com/">блог</a>, я&nbsp;наткнулся на&nbsp;его пост &laquo;<a href="http://dmitry.baranovskiy.com/post/40514291">JavaScript Without &#8222;if&#8220;</a>&raquo;, и&nbsp;вспомнил, что у&nbsp;меня валяется в&nbsp;загашниках очень похожая&nbsp;штука:</p>
<p><script src="http://gist.github.com/79403.js"></script></p>
<p>Думаю, как это работает, очевидно, поэтому я&nbsp;хочу заострить внимание на&nbsp;другом: такая конструкция, по&nbsp;идее, должна работать достаточно быстро, так как доступ к&nbsp;свойствам объекта в&nbsp;javascript очень быстр. Правда, в&nbsp;таком случае мы&nbsp;платим памятью за&nbsp;скорость. И&nbsp;действительно, тесты в&nbsp;safari показывают, что этот код лишь чуть-чуть медленнее классической конструкции if&#8230; else. Про остальные браузеры ничего не&nbsp;могу сказать, так как всесторонним тестированием не&nbsp;занимался&thinsp;&#8212;&thinsp;да&nbsp;и&nbsp;не&nbsp;стоит оно того, это&nbsp;же чисто proof&nbsp;of&nbsp;concept.</p>
<p>В&nbsp;общем, как обычно, гибкость javascript достойна всяческих похвал. Если в&nbsp;этом языке чего-то не&nbsp;хватает, то&nbsp;это что-то легко может быть дописано&nbsp;руками.</p>
]]></content:encoded>
			<wfw:commentRss>http://ulizko.com/posts/346/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Букмарклеты</title>
		<link>http://ulizko.com/posts/334</link>
		<comments>http://ulizko.com/posts/334#comments</comments>
		<pubDate>Mon, 16 Feb 2009 12:17:08 +0000</pubDate>
		<dc:creator>Александр Улизько</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[букмарклеты]]></category>
		<category><![CDATA[пример]]></category>
		<category><![CDATA[фриланс]]></category>

		<guid isPermaLink="false">http://ulizko.com/?p=334</guid>
		<description><![CDATA[Всем привет, сегодня речь пойдет про использование букмарклета, или закладки для&#160;браузера. 
Кто не&#160;знает, это такая штука, которую можно добавить в&#160;закладки (да,&#160;я&#160;сегодня дебютирую в&#160;роли Капитана Очевидность :) и,&#160;при нажатии на&#160;нее, произвести какой-нибудь&#160;эффект. 
Примером может служить герой сегодняшней заметки, который расположен по&#160;адресу http://ulizko. com/demo/allthat/. Инструкция&#160;по&#160;применению: 

Перетащите ссылку &#171;link&#187; на&#160;панель закладок или щелкните по&#160;ней правой кнопкой мыши и&#160;выберите [...]]]></description>
			<content:encoded><![CDATA[<p>Всем привет, сегодня речь пойдет про использование букмарклета, или закладки для&nbsp;браузера. </p>
<p>Кто не&nbsp;знает, это такая штука, которую можно добавить в&nbsp;закладки (да,&nbsp;я&nbsp;сегодня дебютирую в&nbsp;роли Капитана Очевидность :) и,&nbsp;при нажатии на&nbsp;нее, произвести какой-нибудь&nbsp;эффект. </p>
<p>Примером может служить герой сегодняшней заметки, который расположен по&nbsp;адресу <a href="http://ulizko.com/demo/allthat/">http://ulizko. com/demo/allthat/</a>. Инструкция&nbsp;по&nbsp;применению: </p>
<ol>
<li>Перетащите ссылку &laquo;link&raquo; на&nbsp;панель закладок или щелкните по&nbsp;ней правой кнопкой мыши и&nbsp;выберите пункт меню &laquo;добавить&nbsp;в&nbsp;избранное&raquo;. </li>
<li>Зайдите на&nbsp;какой-нибудь сайт, вроде <a href="http://twitter.com">http://twitter. com</a>, и&nbsp;нажмите на&nbsp;эту закладку (ну&nbsp;или&nbsp;на&nbsp;избранное). </li>
</ol>
<p>Появится окошко, в&nbsp;которое можно ввести данные. Вообще, предполагается, что это будет интерфейс добавления желаний в&nbsp;вишлисты (предварительно созданные на&nbsp;каком-то сайте), настроить триггеры оповещений, и&nbsp;прочее. Есть даже какая-то валидация начального уровня. И&nbsp;налажен обмен данными с&nbsp;сервером&thinsp;&#8212;&thinsp;то&nbsp;есть, на&nbsp;любом домене к&nbsp;вам приходит список ваших вишлистов, а&nbsp;ваше новое желание с&nbsp;любого домена долетит на&nbsp;крыльях любви к&nbsp;вишлисту и&nbsp;уютно устроится в&nbsp;его объятьях<sup><a href="#footnotes_wtf">1</a></sup>. </p>
<p>Но. Мы&nbsp;сегодня не&nbsp;об&nbsp;этом, а&nbsp;о&nbsp;том, как делать такие штуки&nbsp;в&nbsp;принципе. </p>
<p><span id="more-334"></span></p>
<p>Прежде чем перейти непосредственно к&nbsp;разбору кода, хотелось&nbsp;бы ответить на&nbsp;вопрос (который мне никто не&nbsp;задавал :), а именно, &quot;Какие возможности дает букмарклет?&quot;. Правильный ответ&thinsp;&#8212;&thinsp;любые. Так как мы&nbsp;получаем возможность подгрузить любой скрипт, мы&nbsp;можем сделать с&nbsp;клиентской страничкой все, что угодно. Например&thinsp;&#8212;&thinsp;сделать &laquo;выносной&raquo; виджет, в&nbsp;котором на&nbsp;любой страничке можно будет добавить запись в&nbsp;блокнот или таскменджер. Или вообще сделать весь таскменеджер выносным. Что тоже важно, они будут работать практически везде&thinsp;&#8212;&thinsp;это не&nbsp;плагины к&nbsp;firefox&#8217;у&nbsp;и&nbsp;не виджеты к&nbsp;opera. Букмарклетам не&nbsp;важно (ну,&nbsp;почти :), какая у&nbsp;вас ОС&nbsp;или браузер. В&nbsp;общем, есть простор для&nbsp;фантазии.</p>
<p>Итак, как&nbsp;же делать эти самые&nbsp;букмарклеты? </p>
<p>Очень просто: надо создать на&nbsp;страничке элемент anchor с&nbsp;атрибутом href, содержащим javascript-код. Если перевести на&nbsp;русский, то&nbsp;надо сделать вот такую ссылку, адрес которой, по&nbsp;большому счету, и&nbsp;будет&nbsp;букмарклетом:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>a href<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;javascript:alert('I am bookmarklet'); void 0;&quot;</span><span style="color: #339933;">&gt;</span>Bookmarklet<span style="color: #339933;">&lt;/</span>a<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Демо:</p>
<p><a href="javascript:alert('I am bookmarklet'); void 0;">Демо вышеописанного&nbsp;кода</a>.</p>
<p>Для того, чтобы javascript код в&nbsp;адресе ссылки заработал, надо добавит перед ним слово <code>javascript:</code>. По&nbsp;умному это называется &laquo;указание псевдопротокола javascript&raquo;. Еще одна важная деталь&thinsp;&#8212;&thinsp;если ваш код вернет какое-то значение, то&nbsp;браузер воспримет его в&nbsp;качестве адреса, по&nbsp;которому нужно перейти, и&nbsp;уйдет с&nbsp;текущей страницы. Чтобы избежать этого, не&nbsp;возвращайте значения, то&nbsp;есть допишите в&nbsp;конец скрипта <code>void 0;</code>, либо оберните весь код в&nbsp;анонимную функцию, невозвращающую значения&thinsp;&#8212;&thinsp;<code>(function(){... ваш код мог&nbsp;бы быть&nbsp;здесь...})()</code>.</p>
<p>В любом случае, все эти вопросы подробно рассмотрены у&nbsp;Ильи Кантора в&nbsp;его заметке <a href="http://javascript.ru/unsorted/bookmarklet">Букмарклеты и&nbsp;правила их&nbsp;написания</a>, к&nbsp;которой я&nbsp;вас и&nbsp;отсылаю&nbsp;за&nbsp;подробностями. </p>
<p>Единственную вещь, которую нам еще нужно знать&thinsp;&#8212;&thinsp;это то,&nbsp;что все браузеры ограничивают максимальную длину кода букмарклета. И,&nbsp;подобно тому, как скорость каравана равна скорости самого медленного верблюда, так и&nbsp;максимальный размер кроссбраузерного букмарклета равен ограничению, наложенному IE&nbsp;6&nbsp;SP2, то&nbsp;есть,&nbsp;488&nbsp;символам. </p>
<p>Таким образом, вряд&nbsp;ли мы&nbsp;сможем закодить какую-то комплексную логику в&nbsp;неполных пятистах символах, так что чаще всего букмарклеты просто создают новый тэг script, в&nbsp;который уже сгружают код&nbsp;приложения. </p>
<p>Так поступил и&nbsp;я.&nbsp;Вот код моего букмарклета в&nbsp;человекоадаптированном&nbsp;виде:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">// создаем новую внутреннюю переменную a (лучше в данном случае использовать короткие идентификаторы)</span>
    <span style="color: #006600; font-style: italic;">// и сразу же добавляем свой объект в глобальный объект window, и записываем в него данные, которые уникальны</span>
    <span style="color: #006600; font-style: italic;">// для каждого пользователя (ведь они сгенерированы сервером для пользователя перед тем, как он добавил этот букмарклет к себе)</span>
    <span style="color: #003366; font-weight: bold;">var</span> a <span style="color: #339933;">=</span> window.<span style="color: #660066;">allThat</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> 
        userId <span style="color: #339933;">:</span> <span style="color: #3366CC;">'123345456'</span><span style="color: #339933;">,</span>
        server <span style="color: #339933;">:</span> <span style="color: #3366CC;">'http://mysite.com/'</span><span style="color: #339933;">,</span>
        script <span style="color: #339933;">:</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'script'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #006600; font-style: italic;">// создадим и запомним тэг скрипт, </span>
        <span style="color: #006600; font-style: italic;">// который сгрузит нам код нашего приложения - мы его потом удалим, если пользователь нажмет кнопку &quot;закрыть&quot;</span>
        css <span style="color: #339933;">:</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'link'</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    <span style="color: #009966; font-style: italic;">/* динамически создаем элементы: */</span>
    h <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'head'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    a.<span style="color: #660066;">css</span>.<span style="color: #660066;">rel</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'stylesheet'</span><span style="color: #339933;">;</span>
    a.<span style="color: #660066;">css</span>.<span style="color: #660066;">href</span> <span style="color: #339933;">=</span> a.<span style="color: #660066;">server</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'css/bookmarklet.2.css'</span><span style="color: #339933;">;</span>
    h.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>a.<span style="color: #660066;">css</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    a.<span style="color: #660066;">script</span>.<span style="color: #660066;">src</span> <span style="color: #339933;">=</span> a.<span style="color: #660066;">server</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'js/bookmarklet.7.js'</span><span style="color: #339933;">;</span>
    h.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>a.<span style="color: #660066;">script</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    h<span style="color: #339933;">=</span><span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Потом подгружается непосредственно код самого окошка. Думаю, он&nbsp;может представлять некий интерес сам по&nbsp;себе, так что и&nbsp;его я&nbsp;сюда запощу (все комментарии идут на&nbsp;английском, так как заказчик&nbsp;американец):</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">    <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> Dom <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
            get <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>el<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
                <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span>el <span style="color: #339933;">&amp;&amp;</span> el.<span style="color: #660066;">nodeType</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> el <span style="color: #339933;">:</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span>el<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            addListener <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>el<span style="color: #339933;">,</span> type<span style="color: #339933;">,</span> fn<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
                    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">body</span>.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
                        <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>el<span style="color: #339933;">,</span> type<span style="color: #339933;">,</span> fn<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
                            el.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span>type<span style="color: #339933;">,</span> fn<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
                        <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> 
                    <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">body</span>.<span style="color: #660066;">attachEvent</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
                        <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>el<span style="color: #339933;">,</span> type<span style="color: #339933;">,</span> fn<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
                            el.<span style="color: #660066;">attachEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'on'</span> <span style="color: #339933;">+</span> type<span style="color: #339933;">,</span> fn<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
                        <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> 
                    <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span> 
                        <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>el<span style="color: #339933;">,</span> type<span style="color: #339933;">,</span> fn<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
                            el<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'on'</span> <span style="color: #339933;">+</span> type<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> fn<span style="color: #339933;">;</span> 
                        <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> 
                    <span style="color: #009900;">&#125;</span> 
                <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
            removeListener <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>el<span style="color: #339933;">,</span> type<span style="color: #339933;">,</span> fn<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
                    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">body</span>.<span style="color: #660066;">removeEventListener</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> 
                        <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>el<span style="color: #339933;">,</span> type<span style="color: #339933;">,</span> fn<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
                            el.<span style="color: #660066;">removeEventListener</span><span style="color: #009900;">&#40;</span>type<span style="color: #339933;">,</span> fn<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
                        <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> 
                    <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">body</span>.<span style="color: #660066;">detachEvent</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
                        <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>el<span style="color: #339933;">,</span> type<span style="color: #339933;">,</span> fn<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
                            el.<span style="color: #660066;">detachEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'on'</span> <span style="color: #339933;">+</span> type<span style="color: #339933;">,</span> fn<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
                        <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> 
                    <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span> 
                        <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>el<span style="color: #339933;">,</span> type<span style="color: #339933;">,</span> fn<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
                            el<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'on'</span> <span style="color: #339933;">+</span> type<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> 
                        <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> 
                    <span style="color: #009900;">&#125;</span> 
                <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
            hide <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>el<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                el.<span style="color: #660066;">style</span>.<span style="color: #660066;">display</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'none'</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            show <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>el<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                el.<span style="color: #660066;">style</span>.<span style="color: #660066;">display</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
        allThat <span style="color: #339933;">=</span> window.<span style="color: #660066;">allThat</span><span style="color: #339933;">;</span>
&nbsp;
        allThat.<span style="color: #660066;">Bookmarklet</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #006600; font-style: italic;">// where to send user data and where from take wishlists list</span>
            <span style="color: #003366; font-weight: bold;">var</span> wishlistsLocation <span style="color: #339933;">=</span> allThat.<span style="color: #660066;">server</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'wishlists/'</span><span style="color: #339933;">,</span>
            sendTo <span style="color: #339933;">=</span> allThat.<span style="color: #660066;">server</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'wishes/'</span><span style="color: #339933;">,</span>
&nbsp;
            <span style="color: #006600; font-style: italic;">// bookmarklet window html code</span>
            innerHTML <span style="color: #339933;">=</span> <span style="color: #3366CC;">'&lt;div id=&quot;allthat-wish&quot;&gt;&lt;div class=&quot;allthat-saving&quot; id=&quot;allthat-throbber&quot;&gt;saving...&lt;/div&gt;&lt;div id=&quot;allthat-logo&quot;&gt;&lt;span&gt;AllThat&lt;/span&gt;&lt;/div&gt;&lt;button title=&quot;close&quot; id=&quot;allthat-close&quot;&gt;&lt;span&gt;close&lt;/span&gt;&lt;/button&gt;&lt;h1&gt;&lt;span&gt;Add To Wishlist&lt;/span&gt;&lt;/h1&gt;&lt;form action=&quot;&quot;&gt;&lt;div class=&quot;allthat-field&quot;&gt;&lt;label for=&quot;allthat-product&quot;&gt;Product Name:&lt;/label&gt;&lt;br /&gt;&lt;input type=&quot;text&quot; name=&quot;product&quot; value=&quot;(Ex: Black iPhone Adapter)&quot; class=&quot;allthat-sample-value&quot; id=&quot;allthat-product&quot; /&gt;&lt;/div&gt;	&lt;div class=&quot;allthat-field&quot;&gt;&lt;label for=&quot;allthat-wishlist&quot;&gt;Add to List:&lt;/label&gt;&lt;br /&gt;&lt;select name=&quot;wishlist&quot; id=&quot;allthat-wishlist&quot;&gt;&lt;/select&gt;&lt;/div&gt;&lt;fieldset id=&quot;allthat-low-price&quot;&gt;	&lt;h2&gt;Low Price Alerts!&lt;/h2&gt;			&lt;div class=&quot;allthat-field&quot; id=&quot;allthat-range&quot;&gt;&lt;label for=&quot;allthat-minprice&quot;&gt;How much would you like to pay?&lt;/label&gt;&lt;br /&gt;&lt;input type=&quot;text&quot; name=&quot;minprice&quot; value=&quot;(min)&quot; class=&quot;allthat-sample-value&quot; id=&quot;allthat-minprice&quot; /&gt;to&lt;input type=&quot;text&quot; name=&quot;maxprice&quot; value=&quot;(max)&quot; class=&quot;allthat-sample-value&quot; id=&quot;allthat-maxprice&quot; /&gt;&lt;/div&gt;&lt;h3&gt;Alert me via:&lt;/h3&gt;&lt;fieldset id=&quot;allthat-alerts&quot;&gt;&lt;input type=&quot;checkbox&quot; name=&quot;email&quot; id=&quot;allthat-email&quot; /&gt;&lt;label for=&quot;allthat-email&quot; id=&quot;allthat-email-label&quot;&gt;Email&lt;/label&gt;&lt;br /&gt;&lt;input type=&quot;checkbox&quot; name=&quot;sms&quot; id=&quot;allthat-sms&quot; /&gt;&lt;label for=&quot;allthat-sms&quot; id=&quot;allthat-sms-label&quot;&gt;SMS&lt;/label&gt;&lt;br /&gt;&lt;input type=&quot;checkbox&quot; name=&quot;twitter&quot; id=&quot;allthat-twitter&quot; /&gt;&lt;label for=&quot;allthat-twitter&quot; id=&quot;allthat-twitter-label&quot;&gt;Twitter&lt;/label&gt;&lt;br /&gt;&lt;select name=&quot;frequency&quot; id=&quot;allthat-frequency&quot;&gt;&lt;option value=&quot;0&quot; selected=&quot;selected&quot;&gt;-- Alert Frequency --&lt;/option&gt;&lt;option value=&quot;1&quot;&gt;Daily&lt;/option&gt;&lt;option value=&quot;7&quot;&gt;Weekly&lt;/option&gt;&lt;option value=&quot;30&quot;&gt;Monthly&lt;/option&gt;&lt;/select&gt;&lt;/fieldset&gt;&lt;/fieldset&gt;&lt;button title=&quot;Add&quot; id=&quot;allthat-add&quot;&gt;&lt;span&gt;Add&lt;/span&gt;&lt;/button&gt;&lt;/form&gt;&lt;div id=&quot;allthat-errors&quot; style=&quot;color:red;&quot;/&gt;&lt;/div&gt;'</span><span style="color: #339933;">,</span>
&nbsp;
            <span style="color: #006600; font-style: italic;">// dom elements:</span>
            container <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'div'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
            errorDiv<span style="color: #339933;">,</span>
            alertFrequencyDropdown<span style="color: #339933;">,</span>
            wishlistsDropdown<span style="color: #339933;">,</span>
            wishlistsWrapper<span style="color: #339933;">,</span>
            savingThrobber<span style="color: #339933;">,</span>
            closeButton<span style="color: #339933;">,</span>
            titleInput<span style="color: #339933;">,</span>
            minPriceInput<span style="color: #339933;">,</span>
            maxPriceInput<span style="color: #339933;">,</span>
            sendButton<span style="color: #339933;">,</span>
            alerts <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            scripts <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
&nbsp;
            <span style="color: #006600; font-style: italic;">// input default values:</span>
            titleDefaultValue <span style="color: #339933;">=</span> <span style="color: #3366CC;">'(Ex: Black iPhone Adapter)'</span><span style="color: #339933;">,</span>
            minPriceDefaultValue <span style="color: #339933;">=</span> <span style="color: #3366CC;">'(min)'</span><span style="color: #339933;">,</span>
            maxPriceDefaultValue <span style="color: #339933;">=</span> <span style="color: #3366CC;">'(max)'</span><span style="color: #339933;">,</span>
&nbsp;
            <span style="color: #006600; font-style: italic;">// errors array - used for validation</span>
            errors <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
            errorMessages <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
                titleEmpty <span style="color: #339933;">:</span> <span style="color: #3366CC;">'Please enter product name'</span><span style="color: #339933;">,</span>
                wishlistNotSelected <span style="color: #339933;">:</span> <span style="color: #3366CC;">'Please chose list'</span><span style="color: #339933;">,</span>
                frequencyNonSelected <span style="color: #339933;">:</span> <span style="color: #3366CC;">'Please chose alert frequency'</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #006600; font-style: italic;">// append bookmarklet window html to the target page</span>
            <span style="color: #003366; font-weight: bold;">function</span> createTemplate <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                container.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> innerHTML<span style="color: #339933;">;</span>
                document.<span style="color: #660066;">body</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>container<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
            <span style="color: #006600; font-style: italic;">// initialize javascript references to the Dom elements</span>
            <span style="color: #003366; font-weight: bold;">function</span> initializeDomElementsReferences <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                errorDiv <span style="color: #339933;">=</span> Dom.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'allthat-errors'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                alertFrequencyDropdown <span style="color: #339933;">=</span> Dom.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'allthat-frequency'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                wishlistsDropdown <span style="color: #339933;">=</span> Dom.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'allthat-wishlist'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                wishlistsWrapper <span style="color: #339933;">=</span> wishlistsDropdown.<span style="color: #660066;">parentNode</span><span style="color: #339933;">;</span>
                savingThrobber <span style="color: #339933;">=</span> Dom.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'allthat-throbber'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                closeButton <span style="color: #339933;">=</span> Dom.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'allthat-close'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                titleInput <span style="color: #339933;">=</span> Dom.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'allthat-product'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                minPriceInput <span style="color: #339933;">=</span> Dom.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'allthat-minprice'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                maxPriceInput <span style="color: #339933;">=</span> Dom.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'allthat-maxprice'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                sendButton <span style="color: #339933;">=</span> Dom.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'allthat-add'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                alerts.<span style="color: #660066;">email</span> <span style="color: #339933;">=</span> Dom.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'allthat-email'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                alerts.<span style="color: #660066;">sms</span> <span style="color: #339933;">=</span> Dom.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'allthat-sms'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                alerts.<span style="color: #660066;">twitter</span> <span style="color: #339933;">=</span> Dom.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'allthat-twitter'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
            <span style="color: #006600; font-style: italic;">// disable wishlist dropdown before server response with wishlists array doesn't arrive</span>
            <span style="color: #003366; font-weight: bold;">function</span> initializeGUI <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                wishlistsDropdown.<span style="color: #660066;">disabled</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'disabled'</span><span style="color: #339933;">;</span>
                wishlistsDropdown.<span style="color: #660066;">style</span>.<span style="color: #660066;">width</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'90%'</span><span style="color: #339933;">;</span>
                wishlistsWrapper <span style="color: #339933;">=</span> wishlistsDropdown.<span style="color: #660066;">parentNode</span><span style="color: #339933;">;</span>
                wishlistsWrapper.<span style="color: #660066;">style</span>.<span style="color: #660066;">background</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'transparent url('</span> <span style="color: #339933;">+</span> allThat.<span style="color: #660066;">server</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'images/bookmarklet/ajax-loader-blue.gif) no-repeat right'</span><span style="color: #339933;">;</span>
                Dom.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span>savingThrobber<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
            <span style="color: #006600; font-style: italic;">// bind event listeners to the controls</span>
            <span style="color: #003366; font-weight: bold;">function</span> attachListeners <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                Dom.<span style="color: #660066;">addListener</span><span style="color: #009900;">&#40;</span>closeButton<span style="color: #339933;">,</span> <span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> destroy<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                Dom.<span style="color: #660066;">addListener</span><span style="color: #009900;">&#40;</span>titleInput<span style="color: #339933;">,</span> <span style="color: #3366CC;">'focus'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>titleInput.<span style="color: #660066;">value</span> <span style="color: #339933;">==</span> titleDefaultValue<span style="color: #009900;">&#41;</span> activateInput<span style="color: #009900;">&#40;</span>titleInput<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                Dom.<span style="color: #660066;">addListener</span><span style="color: #009900;">&#40;</span>minPriceInput<span style="color: #339933;">,</span> <span style="color: #3366CC;">'focus'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>minPriceInput.<span style="color: #660066;">value</span> <span style="color: #339933;">==</span> minPriceDefaultValue<span style="color: #009900;">&#41;</span> activateInput<span style="color: #009900;">&#40;</span>minPriceInput<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                Dom.<span style="color: #660066;">addListener</span><span style="color: #009900;">&#40;</span>maxPriceInput<span style="color: #339933;">,</span> <span style="color: #3366CC;">'focus'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>maxPriceInput.<span style="color: #660066;">value</span> <span style="color: #339933;">==</span> maxPriceDefaultValue<span style="color: #009900;">&#41;</span> activateInput<span style="color: #009900;">&#40;</span>maxPriceInput<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                Dom.<span style="color: #660066;">addListener</span><span style="color: #009900;">&#40;</span>sendButton<span style="color: #339933;">,</span> <span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> e <span style="color: #339933;">=</span> e <span style="color: #339933;">||</span> window.<span style="color: #660066;">event</span><span style="color: #339933;">;</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>e.<span style="color: #660066;">preventDefault</span><span style="color: #009900;">&#41;</span> e.<span style="color: #660066;">preventDefault</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> addItemToList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #006600; font-style: italic;">// validators</span>
            <span style="color: #003366; font-weight: bold;">function</span> validateItemTitlePresence <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #003366; font-weight: bold;">var</span> t <span style="color: #339933;">=</span> titleInput.<span style="color: #660066;">value</span><span style="color: #339933;">;</span>
                <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>t.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/^s+|s+$/</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">length</span> <span style="color: #339933;">==</span> <span style="color: #CC0000;">0</span> <span style="color: #339933;">||</span> t <span style="color: #339933;">==</span> titleDefaultValue<span style="color: #009900;">&#41;</span> errors.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>errorMessages.<span style="color: #660066;">titleEmpty</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #003366; font-weight: bold;">function</span> validateWishlistPresence <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> wishlistsDropdown.<span style="color: #660066;">value</span> <span style="color: #339933;">===</span> <span style="color: #3366CC;">'undefined'</span><span style="color: #009900;">&#41;</span> errors.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>errorMessages.<span style="color: #660066;">wishlistNotSelected</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #003366; font-weight: bold;">function</span> validateFrequencyPresence <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> <span style="color: #000066;">alert</span> <span style="color: #000066; font-weight: bold;">in</span> alerts<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
                    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>alerts<span style="color: #009900;">&#91;</span><span style="color: #000066;">alert</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">checked</span> <span style="color: #339933;">&amp;&amp;</span> alertFrequencyDropdown.<span style="color: #660066;">value</span> <span style="color: #339933;">==</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        errors.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>errorMessages.<span style="color: #660066;">frequencyNonSelected</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
                        <span style="color: #000066; font-weight: bold;">return</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #003366; font-weight: bold;">function</span> validate <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                errors.<span style="color: #660066;">length</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
                validateItemTitlePresence<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                validateWishlistPresence<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                validateFrequencyPresence<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000066; font-weight: bold;">return</span> errors.<span style="color: #660066;">length</span> <span style="color: #339933;">==</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #003366; font-weight: bold;">function</span> displayErrors <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #003366; font-weight: bold;">var</span> output <span style="color: #339933;">=</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">,</span> error<span style="color: #339933;">,</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
                <span style="color: #000066; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>error <span style="color: #339933;">=</span> errors<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    output <span style="color: #339933;">+=</span> error <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&lt;br/&gt;'</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
&nbsp;
                errorDiv.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> output<span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #006600; font-style: italic;">// this function called if user clicks on the 'send' button</span>
            <span style="color: #006600; font-style: italic;">// so that we need to validate data, and, if it's all ok,</span>
            <span style="color: #006600; font-style: italic;">// send request to server. Also, we show throbber and setup callback which would stop it</span>
            <span style="color: #003366; font-weight: bold;">function</span> addItemToList <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>validate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    sendItemOnServer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                displayErrors<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #006600; font-style: italic;">// serialize data into string, show loader and call sendRequest method</span>
            <span style="color: #003366; font-weight: bold;">function</span> sendItemOnServer <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #003366; font-weight: bold;">var</span> data <span style="color: #339933;">=</span> <span style="color: #3366CC;">'title='</span> <span style="color: #339933;">+</span> encodeURIComponent<span style="color: #009900;">&#40;</span>titleInput.<span style="color: #660066;">value</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&amp;wishlist='</span> <span style="color: #339933;">+</span> wishlistsDropdown.<span style="color: #660066;">value</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #003366; font-weight: bold;">var</span> temp <span style="color: #339933;">=</span> minPriceInput.<span style="color: #660066;">value</span><span style="color: #339933;">;</span>
                data <span style="color: #339933;">+=</span> <span style="color: #009900;">&#40;</span>temp <span style="color: #339933;">==</span> <span style="color: #3366CC;">''</span> <span style="color: #339933;">||</span> temp <span style="color: #339933;">==</span> minPriceDefaultValue<span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> <span style="color: #3366CC;">''</span> <span style="color: #339933;">:</span> <span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&amp;minPrice='</span> <span style="color: #339933;">+</span> temp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                temp <span style="color: #339933;">=</span> maxPriceInput.<span style="color: #660066;">value</span><span style="color: #339933;">;</span>
                data <span style="color: #339933;">+=</span> <span style="color: #009900;">&#40;</span>temp <span style="color: #339933;">==</span> <span style="color: #3366CC;">''</span> <span style="color: #339933;">||</span> temp <span style="color: #339933;">==</span> maxPriceDefaultValue<span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> <span style="color: #3366CC;">''</span> <span style="color: #339933;">:</span> <span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&amp;maxPrice='</span> <span style="color: #339933;">+</span> temp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                data <span style="color: #339933;">+=</span> <span style="color: #3366CC;">'&amp;alerts=['</span><span style="color: #339933;">;</span>
                <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> <span style="color: #000066;">alert</span> <span style="color: #000066; font-weight: bold;">in</span> alerts<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
                    <span style="color: #003366; font-weight: bold;">var</span> a <span style="color: #339933;">=</span> alerts<span style="color: #009900;">&#91;</span><span style="color: #000066;">alert</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>a.<span style="color: #660066;">checked</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        data <span style="color: #339933;">+=</span> a.<span style="color: #000066;">name</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span>
                <span style="color: #009900;">&#125;</span>
                data <span style="color: #339933;">+=</span> <span style="color: #3366CC;">']'</span><span style="color: #339933;">;</span>
                data <span style="color: #339933;">+=</span> <span style="color: #3366CC;">'&amp;alertFrequency='</span> <span style="color: #339933;">+</span> alertFrequencyDropdown.<span style="color: #660066;">value</span><span style="color: #339933;">;</span>
&nbsp;
                showLoader<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                sendRequest<span style="color: #009900;">&#40;</span>sendTo<span style="color: #339933;">,</span> data<span style="color: #339933;">,</span> <span style="color: #3366CC;">'itemAdded'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #006600; font-style: italic;">// clear inputs</span>
            <span style="color: #003366; font-weight: bold;">function</span> clearFields <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                hideLoader<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                activateInput <span style="color: #009900;">&#40;</span>titleInput<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                activateInput <span style="color: #009900;">&#40;</span>minPriceInput<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                activateInput <span style="color: #009900;">&#40;</span>maxPriceInput<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> <span style="color: #000066;">alert</span> <span style="color: #000066; font-weight: bold;">in</span> alerts<span style="color: #009900;">&#41;</span> alerts<span style="color: #009900;">&#91;</span><span style="color: #000066;">alert</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">checked</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #006600; font-style: italic;">// misc - remove default value and make font color black</span>
            <span style="color: #003366; font-weight: bold;">function</span> activateInput <span style="color: #009900;">&#40;</span>el<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                el.<span style="color: #660066;">className</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">;</span>
                el.<span style="color: #660066;">value</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #006600; font-style: italic;">// feed wishlists dropdown with data and enable it</span>
            <span style="color: #003366; font-weight: bold;">function</span> activateWhishlistsDropdown <span style="color: #009900;">&#40;</span>response<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #003366; font-weight: bold;">var</span> w <span style="color: #339933;">=</span> response.<span style="color: #660066;">wishlists</span><span style="color: #339933;">,</span> 
                    i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> 
                    wishlist<span style="color: #339933;">,</span> 
                    opt<span style="color: #339933;">;</span>
                <span style="color: #000066; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span>wishlist <span style="color: #339933;">=</span> w<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    opt <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;option&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    				opt.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">createTextNode</span><span style="color: #009900;">&#40;</span>wishlist.<span style="color: #660066;">title</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    				opt.<span style="color: #660066;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;value&quot;</span><span style="color: #339933;">,</span> wishlist.<span style="color: #660066;">id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    				wishlistsDropdown.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>opt<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                wishlistsDropdown.<span style="color: #660066;">disabled</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
                wishlistsDropdown.<span style="color: #660066;">style</span>.<span style="color: #660066;">width</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'100%'</span><span style="color: #339933;">;</span>
                wishlistsWrapper.<span style="color: #660066;">style</span>.<span style="color: #660066;">background</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #006600; font-style: italic;">// remove every track of bookmarklet from the page</span>
            <span style="color: #003366; font-weight: bold;">function</span> destroy <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                removeEventListeners<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                removeDOMReferences<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                container.<span style="color: #660066;">parentNode</span>.<span style="color: #660066;">removeChild</span><span style="color: #009900;">&#40;</span>container<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                container <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
                allThat.<span style="color: #660066;">css</span>.<span style="color: #660066;">parentNode</span>.<span style="color: #660066;">removeChild</span><span style="color: #009900;">&#40;</span>allThat.<span style="color: #660066;">css</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                allThat.<span style="color: #660066;">script</span>.<span style="color: #660066;">parentNode</span>.<span style="color: #660066;">removeChild</span><span style="color: #009900;">&#40;</span>allThat.<span style="color: #660066;">script</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                allThat <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
            <span style="color: #006600; font-style: italic;">// to prevent memory leaks on ie6 - remove all js to dom references</span>
            <span style="color: #003366; font-weight: bold;">function</span> removeDOMReferences <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                errorDiv <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
                alertFrequencyDropdown <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
                wishlistsDropdown <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
                wishlistsWrapper <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
                savingThrobber <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
                closeButton <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
                titleInput <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
                minPriceInput <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
                maxPriceInput <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
                sendButton <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
                alerts.<span style="color: #660066;">email</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
                alerts.<span style="color: #660066;">sms</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
                alerts.<span style="color: #660066;">twitter</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
                <span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> scripts.<span style="color: #660066;">length</span> <span style="color: #339933;">-</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> script<span style="color: #339933;">,</span> head <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'head'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                <span style="color: #000066; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>script <span style="color: #339933;">=</span> scripts<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">--</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    head.<span style="color: #660066;">removeChild</span><span style="color: #009900;">&#40;</span>script<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    script <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
                    scripts<span style="color: #009900;">&#91;</span>i <span style="color: #339933;">+</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                scripts.<span style="color: #660066;">length</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
            <span style="color: #006600; font-style: italic;">// to prevent memory leaks - remove all event listeners</span>
            <span style="color: #003366; font-weight: bold;">function</span> removeEventListeners <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                Dom.<span style="color: #660066;">removeListener</span><span style="color: #009900;">&#40;</span>closeButton<span style="color: #339933;">,</span> <span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> destroy<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                Dom.<span style="color: #660066;">removeListener</span><span style="color: #009900;">&#40;</span>titleInput<span style="color: #339933;">,</span> <span style="color: #3366CC;">'focus'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>titleInput.<span style="color: #660066;">value</span> <span style="color: #339933;">==</span> titleDefaultValue<span style="color: #009900;">&#41;</span> activateInput<span style="color: #009900;">&#40;</span>titleInput<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                Dom.<span style="color: #660066;">removeListener</span><span style="color: #009900;">&#40;</span>minPriceInput<span style="color: #339933;">,</span> <span style="color: #3366CC;">'focus'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>minPriceInput.<span style="color: #660066;">value</span> <span style="color: #339933;">==</span> minPriceDefaultValue<span style="color: #009900;">&#41;</span> activateInput<span style="color: #009900;">&#40;</span>minPriceInput<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                Dom.<span style="color: #660066;">removeListener</span><span style="color: #009900;">&#40;</span>maxPriceInput<span style="color: #339933;">,</span> <span style="color: #3366CC;">'focus'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>maxPriceInput.<span style="color: #660066;">value</span> <span style="color: #339933;">==</span> maxPriceDefaultValue<span style="color: #009900;">&#41;</span> activateInput<span style="color: #009900;">&#40;</span>maxPriceInput<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                Dom.<span style="color: #660066;">removeListener</span><span style="color: #009900;">&#40;</span>sendButton<span style="color: #339933;">,</span> <span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> e <span style="color: #339933;">=</span> e <span style="color: #339933;">||</span> window.<span style="color: #660066;">event</span><span style="color: #339933;">;</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>e.<span style="color: #660066;">preventDefault</span><span style="color: #009900;">&#41;</span> e.<span style="color: #660066;">preventDefault</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> addItemToList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #006600; font-style: italic;">// create dynamic script element and remove it immediately after it load</span>
            <span style="color: #003366; font-weight: bold;">function</span> sendRequest <span style="color: #009900;">&#40;</span>url<span style="color: #339933;">,</span> data<span style="color: #339933;">,</span> callback<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #003366; font-weight: bold;">var</span> head <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'head'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
                    script <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'script'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                    noCacheIE <span style="color: #339933;">=</span> <span style="color: #3366CC;">'&amp;noCacheIE='</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                    fullUrl <span style="color: #339933;">=</span> url <span style="color: #339933;">+</span> <span style="color: #3366CC;">'?callback='</span> <span style="color: #339933;">+</span> encodeURIComponent<span style="color: #009900;">&#40;</span>callback<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&amp;userId='</span> <span style="color: #339933;">+</span> allThat.<span style="color: #660066;">userId</span><span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> <span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&amp;'</span> <span style="color: #339933;">+</span> data<span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> noCacheIE<span style="color: #339933;">;</span>
&nbsp;
                script.<span style="color: #660066;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'type'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'text/javascript'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                script.<span style="color: #660066;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'src'</span><span style="color: #339933;">,</span> fullUrl<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                script.<span style="color: #660066;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'charset'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'utf-8'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                head.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>script<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                scripts.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>script<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                head <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #006600; font-style: italic;">// misc - hide send button and show saving throbber instead</span>
            <span style="color: #003366; font-weight: bold;">function</span> showLoader <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                Dom.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span>savingThrobber<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                Dom.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span>sendButton<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
            <span style="color: #006600; font-style: italic;">// misc - hide saving throbber and show send button instead</span>
            <span style="color: #003366; font-weight: bold;">function</span> hideLoader <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                Dom.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span>savingThrobber<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                Dom.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span>sendButton<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#123;</span>
                initialize <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    createTemplate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    initializeDomElementsReferences<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    initializeGUI<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    attachListeners<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    sendRequest<span style="color: #009900;">&#40;</span>wishlistsLocation<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'loadWishlists'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
                destroy <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    destroy<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
                loadWishlists <span style="color: #339933;">:</span> activateWhishlistsDropdown<span style="color: #339933;">,</span>
&nbsp;
                itemAdded <span style="color: #339933;">:</span> clearFields
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #006600; font-style: italic;">// to prevent memory leaks, remove all js &lt;-&gt; dom references, including dom elements references and event listeners</span>
        Dom.<span style="color: #660066;">addListener</span><span style="color: #009900;">&#40;</span>window<span style="color: #339933;">,</span> <span style="color: #3366CC;">'unload'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>allThat<span style="color: #009900;">&#41;</span> allThat.<span style="color: #660066;">Bookmarklet</span>.<span style="color: #660066;">destroy</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            Dom.<span style="color: #660066;">removeListener</span><span style="color: #009900;">&#40;</span>window<span style="color: #339933;">,</span> <span style="color: #3366CC;">'unload'</span><span style="color: #339933;">,</span> arguments.<span style="color: #660066;">callee</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
        allThat.<span style="color: #660066;">Bookmarklet</span>.<span style="color: #660066;">initialize</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// show bookmarklet - this is visual start of the application</span>
&nbsp;
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><strong>Примечания</strong>:</p>
<ul class="footnotes">
<li id="footnotes_wtf">Вообще скрипт выполнен мной на заказ в рамках моей фрилансерской деятельности, так что не удивляйтесь идее, логотипам и&nbsp;дизайну. </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://ulizko.com/posts/334/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Перевод нормальных слов в код</title>
		<link>http://ulizko.com/posts/329</link>
		<comments>http://ulizko.com/posts/329#comments</comments>
		<pubDate>Fri, 06 Feb 2009 17:24:47 +0000</pubDate>
		<dc:creator>Александр Улизько</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[юмор]]></category>

		<guid isPermaLink="false">http://ulizko.com/?p=329</guid>
		<description><![CDATA[Так, сегодня пришло в голову, решил записать. Не то, чтобы это очень уж смешная штука была, но забавная. Особенно в конце плодотворного рабочего дня&#160;:)

for &#40;var mate in addressBook&#41; &#123; 
    if &#40;mate.blacklisted&#41; &#123; // Ко всем неприятным знакомым:
        if &#40;calculateDistance&#40;Home.getInstance&#40;&#41;.getLatitude&#40;&#41;, 
     [...]]]></description>
			<content:encoded><![CDATA[<p>Так, сегодня пришло в голову, решил записать. Не то, чтобы это очень уж смешная штука была, но забавная. Особенно в конце плодотворного рабочего дня&nbsp;:)</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> mate <span style="color: #000066; font-weight: bold;">in</span> addressBook<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>mate.<span style="color: #660066;">blacklisted</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #006600; font-style: italic;">// Ко всем неприятным знакомым:</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>calculateDistance<span style="color: #009900;">&#40;</span><span style="color: #000066;">Home</span>.<span style="color: #660066;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">getLatitude</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> 
          mate.<span style="color: #660066;">getLatitude</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">100</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #006600; font-style: italic;">// будете проходить мимо -</span>
            <span style="color: #000066; font-weight: bold;">continue</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// проходите</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://ulizko.com/posts/329/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>И еще про синтаксис JavaScript</title>
		<link>http://ulizko.com/posts/323</link>
		<comments>http://ulizko.com/posts/323#comments</comments>
		<pubDate>Fri, 06 Feb 2009 16:20:19 +0000</pubDate>
		<dc:creator>Александр Улизько</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://ulizko.com/?p=323</guid>
		<description><![CDATA[Кто о чем, а вшивый о бане я о синтаксе в&#160;javascript.
Дело в том, что часто внутри функции нужно проверить, переданы ли правильные параметры и переданы ли вообще. Ну и вот один из самых коротких способов это сделать. Ничего фантастического тут нет, старый и проверенный способ. Кто может что сказать о достоинствах и недостатках этого&#160;метода?

function destroyTheWorld [...]]]></description>
			<content:encoded><![CDATA[<p>Кто о чем, а <span style="text-decoration: line-through;">вшивый о бане</span> я о синтаксе в&nbsp;javascript.</p>
<p>Дело в том, что часто внутри функции нужно проверить, переданы ли правильные параметры и переданы ли вообще. Ну и вот один из самых коротких способов это сделать. Ничего фантастического тут нет, старый и проверенный способ. Кто может что сказать о достоинствах и недостатках этого&nbsp;метода?</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> destroyTheWorld <span style="color: #009900;">&#40;</span>when<span style="color: #339933;">,</span> byWhom<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>when<span style="color: #339933;">||!</span>byWhom<span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">'fuck off'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Если кто не знает, оператор логического отрицания <code>!</code> в JavaScript вернет <code>true</code> если ему передан <code>false</code>, <code>''</code> (пустая строка), <code>0</code>, <code>null</code>, <code>undefined</code>. Во всех остальных случаях оператор логического отрицания вернет false. На всякий случай,&nbsp;проиллюстрирую:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">    <span style="color: #339933;">!</span><span style="color: #CC0000;">0</span> <span style="color: #339933;">===</span> <span style="color: #339933;">!</span><span style="color: #3366CC;">''</span> <span style="color: #339933;">===</span> <span style="color: #339933;">!</span><span style="color: #003366; font-weight: bold;">null</span> <span style="color: #339933;">===</span> <span style="color: #339933;">!</span>undefined <span style="color: #339933;">===</span> <span style="color: #339933;">!</span><span style="color: #003366; font-weight: bold;">false</span> <span style="color: #339933;">===</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span></pre></div></div>

<p>Таким образом, если мы не передали никакого объекта или передали <code>null</code>, то функция завершит свою работу и вернет в качестве результата нехорошее&nbsp;слово. </p>
<p>Внимательные люди могут спросить&thinsp;&#8211;&thinsp;а что, если передать <code>true</code>? Функция завершит работу при вполне валидном параметре?<br />
Я могу на это ответить примерно так: если вы передаете в функцию булевую переменную, то почти наверняка эта переменная&thinsp;&#8211;&thinsp;рычаг, т.е. в зависимости от нее меняется поведение функции. И обработка аргументов, таким образом, будет вестить несколько другая. Скажем,&nbsp;такая:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> shouldWeDestroyTheWorld <span style="color: #009900;">&#40;</span>acceptance<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>acceptance<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        World.<span style="color: #660066;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">destroy</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
        World.<span style="color: #660066;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">armageddon</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'stopped'</span><span style="color: #339933;">;</span>
        World.<span style="color: #660066;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">destructionTimer</span>.<span style="color: #000066;">stop</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>И если вы опустите этот аргумент, то по эффекту это будет равнозначно передачи&nbsp;<code>false</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://ulizko.com/posts/323/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>jQuery 1.3.1 вышел</title>
		<link>http://ulizko.com/posts/241</link>
		<comments>http://ulizko.com/posts/241#comments</comments>
		<pubDate>Thu, 22 Jan 2009 07:09:41 +0000</pubDate>
		<dc:creator>Александр Улизько</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[packed vs. minified]]></category>
		<category><![CDATA[packer]]></category>

		<guid isPermaLink="false">http://ulizko.com/posts/241</guid>
		<description><![CDATA[Сабж. Не прошло и года, как они догадались, что в итоге packer замедляет общую скорость работы JS на клиенте. Причем, замедление происходит в двух&#160;местах:

Распаковка скрипта. Да, eval медленная штука, а eval таких объемов данных&#8201;&#8211;&#8201;очень медленная штука. В итоге получается, что &#171;полезный&#187; код начинает работать позже, чем если бы он был minified, даже с учетом того, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.jquery.com/2009/01/21/jquery-131-released/">Сабж</a>. Не прошло и года, как они догадались, что в итоге <a href="http://dean.edwards.name/packer/">packer</a> замедляет общую скорость работы JS на клиенте. Причем, замедление происходит в двух&nbsp;местах:</p>
<ul>
<li>Распаковка скрипта. Да, eval медленная штука, а eval таких объемов данных&thinsp;&#8211;&thinsp;очень медленная штука. В итоге получается, что &laquo;полезный&raquo; код начинает работать позже, чем если бы он был minified, даже с учетом того, что уpackованный скрипт загружается&nbsp;быстрее.</li>
<li>После того, как была такая нагрузка на движок JS, и было занято столько памяти под распаковку, некоторое время движок не сможет работать в полную скорость&thinsp;&#8211;&thinsp;пока не отработает сборщик мусора, да и некоторое количество памяти все равно будет занято под изначальный код скрипта. И в итоге и работать скрипт будет медленнее, если браузер получит его упакованным в&nbsp;packer. </li>
</ul>
<p>О таких &laquo;мелочах&raquo;, что уpackованный скрипт в разы труднее дебажить, и упоминать не&nbsp;будем. </p>
<p>Короче, хорошо, что ребята перешли на использование моего любимого <a href="http://developer.yahoo.com/yui/compressor/">YUI Compressor</a>&#8216;a. Вообще, мне полагается сейчас скакать до потолка с криками &laquo;А я ведь говорил, я знал, я ЗНАЛ!&raquo;. Но, так как письменных свидетельств того, что я уже неоднократно негативно высказывался об упаковке JS packer&#8217;ом не осталось (кроме как в асечных логах), то придется скромно промолчать&nbsp;:)</p>
]]></content:encoded>
			<wfw:commentRss>http://ulizko.com/posts/241/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Fireunit Screencast</title>
		<link>http://ulizko.com/posts/210</link>
		<comments>http://ulizko.com/posts/210#comments</comments>
		<pubDate>Thu, 18 Dec 2008 15:50:09 +0000</pubDate>
		<dc:creator>Александр Улизько</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[firebug]]></category>
		<category><![CDATA[fireunit]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://ulizko.com/posts/210</guid>
		<description><![CDATA[Сегодня, после прочтения поста Джон Резига, решил записать по горячим следам первый в своей жизни (это я к тому, что сильно ругать не стоит, а конструктивная критика приветствуется :)&#160;скринкаст.
Волновался, натурально, как мальчик, впервые снимающий с девочки лифчик, чуть до заикания дело не дошло. Что есть очень, очень плохо. Надо будет попробвать еще писать скринкасты, или [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня, после прочтения <a href="http://ejohn.org/blog/fireunit/">поста Джон Резига</a>, решил записать по горячим следам первый в своей жизни (это я к тому, что сильно ругать не стоит, а конструктивная критика приветствуется :)&nbsp;скринкаст.</p>
<p>Волновался, натурально, как мальчик, впервые снимающий с девочки лифчик, чуть до заикания дело не дошло. Что есть очень, очень плохо. Надо будет попробвать еще писать скринкасты, или подкасты, чтобы не робеть перед собственным ноутбуком со включенным&nbsp;микрофоном.</p>
<p>Видео получилось со второй попытки, продолжительность&thinsp;&#8211;&thinsp;18 минут, звук писался через встроенный макбуковский микрофон. Писалось все в программе&nbsp;<a href="http://www.telestream.net/screen-flow/overview.htm">ScreenFlow</a>.</p>
<p>Собственно, вот видео с&nbsp;viddler&#8217;a:</p>
<p><object width="400" height="250"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=2565495&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=2565495&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="250"></embed></object><br /><a href="http://vimeo.com/2565495">Fireunit Screencast</a> from <a href="http://vimeo.com/user1053824">Alexander Ulizko</a> on&nbsp;<a href="http://vimeo.com">Vimeo</a>.</p>
<p>Хотя лучше смотреть на самом vimeo в HD качестве, лучше видно шрифт:&nbsp;http://vimeo.com/2565495</p>
<p>Файлы тестов, полученные в результате съемки можно посмотреть в действии <a href="http://ulizko.com/demo/fireunit/">здесь</a> (firefox 3+, firebug 1.2+, fireunit&nbsp;0.9).</p>
<p>Калейдоскоп&nbsp;ссылок:</p>
<ul>
<li><a href="http://fireunit.org">Официальный сайт&nbsp;fireunit</a></li>
<li><a href="http://ejohn.org/blog/fireunit/">Анонс в блоге Джона &nbsp;езига</a></li>
<li><a href="http://www.softwareishard.com/blog/firebug/fireunit-testing-in-the-firebug-world/">Анонс в блоге Яна Одварко (надеюсь, я правильно транскрибировал его имя&nbsp;:)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://ulizko.com/posts/210/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>А как вам такой синтакс?</title>
		<link>http://ulizko.com/posts/209</link>
		<comments>http://ulizko.com/posts/209#comments</comments>
		<pubDate>Thu, 18 Dec 2008 05:17:47 +0000</pubDate>
		<dc:creator>Александр Улизько</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[each]]></category>
		<category><![CDATA[object-detection]]></category>
		<category><![CDATA[кроссбраузерность]]></category>
		<category><![CDATA[тернарный оператор]]></category>

		<guid isPermaLink="false">http://ulizko.com/posts/209</guid>
		<description><![CDATA[Все знают, что пользоваться browser-detection&#8201;&#8211;&#8201;неправильно. Подозреваю, эти же все знают, что правильно пользоваться так называемым object-detection. Если вы еще не входите в число этих &#171;всех&#187;, сходите к Peter-Paul Koch&#8217;y, он подробно расписал, чем одно хуже&#160;другого.
Предположим, мы пишем класс ArrayUtilites, который удачно сочетает в себе разные вкусняшки для работы с массивами. И мы хотим, чтобы у [...]]]></description>
			<content:encoded><![CDATA[<p>Все знают, что пользоваться browser-detection&thinsp;&#8211;&thinsp;неправильно. Подозреваю, эти же все знают, что правильно пользоваться так называемым object-detection. Если вы еще не входите в число этих &laquo;всех&raquo;, сходите к <a href="http://quirksmode.org/js/support.html">Peter-Paul Koch&#8217;y</a>, он подробно расписал, чем одно хуже&nbsp;другого.</p>
<p>Предположим, мы пишем класс ArrayUtilites, который удачно сочетает в себе разные вкусняшки для работы с массивами. И мы хотим, чтобы у нас был кроссбраузерный метод <code>each</code>. Мой вариант написания, сам алгоритм взят с&nbsp;<a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/forEach#Compatibility">MDC:forEach#compability</a>:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> ArrayUtilites <span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;undefined&quot;</span> <span style="color: #339933;">||</span> <span style="color: #339933;">!</span>ArrayUtilites<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> ArrayUtilites <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
ArrayUtilites.<span style="color: #660066;">each</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>Array.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">forEach</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span>
    <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> f<span style="color: #339933;">,</span> o<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        Array.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">forEach</span>.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> f<span style="color: #339933;">,</span> o <span style="color: #339933;">||</span> A<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">return</span> ArrayUtilites<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #339933;">:</span>
    <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> f<span style="color: #339933;">,</span> o<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> it<span style="color: #339933;">;</span> it <span style="color: #339933;">=</span> a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> i<span style="color: #339933;">=</span>i<span style="color: #339933;">+</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            f.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span>o <span style="color: #339933;">||</span> A<span style="color: #339933;">,</span> it<span style="color: #339933;">,</span> i<span style="color: #339933;">,</span> a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066; font-weight: bold;">return</span> ArrayUtilites<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Как уважаемые любители JavaScript воспринимают такой синтакс для feature-detection? А именно, использование тернарного оператора (<code>a ? b : c</code>) вместо условной конструкции (<code>if&nbsp;else</code>)?</p>
]]></content:encoded>
			<wfw:commentRss>http://ulizko.com/posts/209/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>YUI.Lang is buggy?</title>
		<link>http://ulizko.com/posts/203</link>
		<comments>http://ulizko.com/posts/203#comments</comments>
		<pubDate>Sat, 13 Dec 2008 00:39:34 +0000</pubDate>
		<dc:creator>Александр Улизько</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[instanceOf]]></category>
		<category><![CDATA[isBoolean]]></category>
		<category><![CDATA[isFinite]]></category>
		<category><![CDATA[isNumber]]></category>
		<category><![CDATA[Lang]]></category>
		<category><![CDATA[typeof]]></category>
		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://ulizko.com/posts/203</guid>
		<description><![CDATA[Сижу я, значит, никого не трогаю, починяю примус пишу один модуль, и тут выясняется неприятное: оказывается, в YUI 3.0.0.pr2, модуле Lang методы isNumber и isBoolean того. Не этого. В смысле,&#160;бажные:

    alert&#40;YUI.Lang.isNumber&#40;new Number&#40;1&#41;&#41;&#41;; // false
    alert&#40;YUI.Lang.isBoolean&#40;new Boolean&#40;true&#41;&#41;&#41; // false

Неприятно.

Лезу в код, и&#160;вижу:

// для простоты восприятия я выкинул все лишнее, относящееся [...]]]></description>
			<content:encoded><![CDATA[<p>Сижу я, значит, никого не трогаю, <span style="text-decoration: line-through;">починяю примус</span> пишу один модуль, и тут выясняется неприятное: оказывается, в <a href="http://developer.yahoo.com/yui/3/">YUI 3.0.0.pr2</a>, модуле <a href="http://developer.yahoo.com/yui/3/yui/">Lang</a> методы <a href="http://developer.yahoo.com/yui/3/api/Lang.html#method_isNumber">isNumber</a> и <a href="http://developer.yahoo.com/yui/3/api/Lang.html#method_isBoolean">isBoolean</a> того. Не этого. В смысле,&nbsp;бажные:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">    <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>YUI.<span style="color: #660066;">Lang</span>.<span style="color: #660066;">isNumber</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">new</span> Number<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// false</span>
    <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>YUI.<span style="color: #660066;">Lang</span>.<span style="color: #660066;">isBoolean</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">new</span> Boolean<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// false</span></pre></div></div>

<p>Неприятно.</p>
<p><span id="more-203"></span></p>
<p>Лезу в код, и&nbsp;вижу:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// для простоты восприятия я выкинул все лишнее, относящееся только к YUI</span>
isBoolean <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">typeof</span> o <span style="color: #339933;">===</span> <span style="color: #3366CC;">'boolean'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
isNumber <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">typeof</span> o <span style="color: #339933;">===</span> <span style="color: #3366CC;">'number'</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> isFinite<span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Придется править&nbsp;ручками.</p>
<p>Как известно, typeof объекта Boolean возвращает <code>'object'</code>. Лезу в <a href="http://www.w3schools.com/jsref/jsref_obj_boolean.asp">Boolean Reference</a>, что на w3schools, и вижу, что у Boolean есть метод, который мне поможет&thinsp;&#8211;&thinsp;valueOf. Правлю isBoolean на что-то&nbsp;вроде:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">isBoolean <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> o <span style="color: #339933;">===</span> <span style="color: #3366CC;">'boolean'</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#40;</span>o <span style="color: #339933;">!==</span> <span style="color: #003366; font-weight: bold;">null</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> <span style="color: #000066; font-weight: bold;">typeof</span> o <span style="color: #339933;">===</span> <span style="color: #3366CC;">'object'</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> o.<span style="color: #660066;">valueOf</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #3366CC;">'boolean'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Тесты прогоняются на ура. Идем дальше. Смотрим в <a href="http://www.w3schools.com/jsref/jsref_obj_number.asp">Number Reference</a>, и по накатанной правлю и&nbsp;<code>isNumber</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">isNumber <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> o <span style="color: #339933;">===</span> <span style="color: #3366CC;">'number'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#40;</span>o <span style="color: #339933;">!==</span> <span style="color: #003366; font-weight: bold;">null</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> <span style="color: #000066; font-weight: bold;">typeof</span> o <span style="color: #339933;">===</span> <span style="color: #3366CC;">'object'</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> o.<span style="color: #660066;">valueOf</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #3366CC;">'number'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> isFinite<span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Казалось бы, все круто? Не&nbsp;совсем.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>isNumber<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// return true;</span></pre></div></div>

<p>Хм. Ну, давайте еще добавлю проверку на то, что это не&nbsp;Date.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">isNumber <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> o <span style="color: #339933;">===</span> <span style="color: #3366CC;">'number'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#40;</span>o <span style="color: #339933;">!==</span> <span style="color: #003366; font-weight: bold;">null</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> <span style="color: #000066; font-weight: bold;">typeof</span> o <span style="color: #339933;">===</span> <span style="color: #3366CC;">'object'</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> <span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>o <span style="color: #000066; font-weight: bold;">instanceof</span> Date<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> o.<span style="color: #660066;">valueOf</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #3366CC;">'number'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> isFinite<span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Теперь все работает нормально, но какой монстрик-то жуткий получается. Ладно, в идиота я наигрался, пора и голову&nbsp;включить:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">isBoolean <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">typeof</span> o <span style="color: #339933;">===</span> <span style="color: #3366CC;">'boolean'</span> <span style="color: #339933;">||</span> o <span style="color: #000066; font-weight: bold;">instanceof</span> Boolean<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
isNumber <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> o <span style="color: #339933;">===</span> NUMBER <span style="color: #339933;">||</span> o <span style="color: #000066; font-weight: bold;">instanceof</span> Number<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> isFinite<span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Вуаля. Пойду на форум YUI рапортовать о баге. Всем спасибо за&nbsp;внимание.</p>
]]></content:encoded>
			<wfw:commentRss>http://ulizko.com/posts/203/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
