<?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; Javascript</title>
	<atom:link href="http://ulizko.com/categories/development/javascript/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>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>И еще про синтаксис 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>А как вам такой синтакс?</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>
		<item>
		<title>Релиз</title>
		<link>http://ulizko.com/posts/185</link>
		<comments>http://ulizko.com/posts/185#comments</comments>
		<pubDate>Tue, 09 Dec 2008 00:20:58 +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/posts/185</guid>
		<description><![CDATA[Вчера с утра релизнулись. Ну, в смысле, альфа-релиз выставили в&#160;нет.
Это было нечто&#8201;&#8211;&#8201;месяц ночных бдений, программирования, программирования,&#160;программирования.
Эти выходные вообще практически не спали&#8201;&#8211;&#8201;сидели и&#160;дотачивали.
В итоге получилась конфетка. Лучший проект (по крайней мере, с технической стороны) нашей компании на данный момент. Особенно мне нравится система поиска&#160;товаров.
Горжусь нашей командой и&#160;собой.
Весь день спал как убитый и (по заверениям очевидцев)&#160;улыбался.
P.S. Сегодня [...]]]></description>
			<content:encoded><![CDATA[<p>Вчера с утра <a href="http://next.mageric.net/">релизнулись</a>. Ну, в смысле, альфа-релиз выставили в&nbsp;нет.</p>
<p>Это было нечто&thinsp;&#8211;&thinsp;месяц ночных бдений, программирования, программирования,&nbsp;программирования.</p>
<p>Эти выходные вообще практически не спали&thinsp;&#8211;&thinsp;сидели и&nbsp;дотачивали.</p>
<p>В итоге получилась конфетка. Лучший проект (по крайней мере, с технической стороны) нашей <a href="http://alanpoint.ru">компании</a> на данный момент. Особенно мне нравится система поиска&nbsp;товаров.</p>
<p>Горжусь нашей командой и&nbsp;собой.</p>
<p>Весь день спал как убитый и (по заверениям очевидцев)&nbsp;улыбался.</p>
<p>P.S. Сегодня объяснял одному новичку в js, как делать анимацию. Написал образовательный мини-скрипт. Возможно, кому-нибудь пригодится&thinsp;&#8211;&thinsp;весь код подробно задокументирован. Демо <a href="http://jsbin.com/igapi">тут</a>, анимация срабатывает при наведении курсора на логотип, код в удобном виде можно посмотреть тут:&nbsp;<a href="http://jsbin.com/igapi/edit">http://jsbin.com/igapi/edit</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ulizko.com/posts/185/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>widget своими руками</title>
		<link>http://ulizko.com/posts/173</link>
		<comments>http://ulizko.com/posts/173#comments</comments>
		<pubDate>Tue, 02 Dec 2008 09:04:06 +0000</pubDate>
		<dc:creator>Александр Улизько</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[widget]]></category>
		<category><![CDATA[виджет]]></category>
		<category><![CDATA[обучение]]></category>

		<guid isPermaLink="false">http://ulizko.com/?p=173</guid>
		<description><![CDATA[Привет.
Наверное, многие из вас пользовались стандартными javascript-виджетами, написанными как безвестными мудаками разработчиками, так и маститыми профессионалами. Есть великолепные коллекции виджетов, поставляемых в качестве плагинов к известным фреймворкам (вроде jQuery, Prototype JS, YUI), так и целые фреймворки, акцентирующие свое внимание на создании виджетов, вроде Ext JS или&#160;qooXdoo.
Но что, если вы не хотите использовать достаточно объемный фреймворк [...]]]></description>
			<content:encoded><![CDATA[<p>Привет.</p>
<p>Наверное, многие из вас пользовались стандартными javascript-виджетами, написанными как безвестными <span style="text-decoration: line-through;">мудаками</span> разработчиками, так и маститыми профессионалами. Есть великолепные коллекции виджетов, поставляемых в качестве плагинов к известным фреймворкам (вроде <a href="http://jquery.com">jQuery</a>, <a href="http://prototypejs.org">Prototype JS</a>, <a href="http://developer.yahoo.com/yui/">YUI</a>), так и целые фреймворки, акцентирующие свое внимание на создании виджетов, вроде <a href="http://extjs.com/">Ext JS</a> или&nbsp;<a href="http://qooxdoo.org/">qooXdoo</a>.</p>
<p>Но что, если вы не хотите использовать достаточно объемный фреймворк для создания простого диалогового окна, или хотите разобраться в том, как создаются такие виджеты, или даже разрабатываете собственный&nbsp;фреймворк?</p>
<p>Об этом и пойдет речь в сегодняшнем посте&thinsp;&#8211;&thinsp;как сделать простейшее диалоговое окно и alert средствами чистого javascript, без применения каких-либо&nbsp;фреймворков.</p>
<p><span id="more-173"></span></p>
<p><strong>Disclaimer</strong>: должен предупредить, что код, представленный далее&thinsp;&#8211;&thinsp;только пример реализации, он предназначен только для того, чтобы показать путь, но это не конечный результат. Конечно, вы можете использовать получившийся виджет в своем проекте, но знайте&thinsp;&#8211;&thinsp;можно сделать гораздо лучше, в общем, есть пространство для самовыражения и наворачивания. Кроме того, я старался описывать каждый шаг, что будет полезно новичку, но, без сомнения, будет раздражать профессионала. Впрочем, если ты профессионал, то тебе вряд ли чем-либо поможет данная&nbsp;статья.</p>
<p>Прежде всего, нам понадобится небольшая коллекция методов, облегчающих нашу работу&thinsp;&#8211;&thinsp;это, прежде всего, навешивание и удаление обработчиков событий на DOM-элементы, остальные совершенно необязательны, и просто являются хелперами, уменьшающими объем кода и увеличивающими его&nbsp;понятность:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// Для этого проекта мы будем использовать одну переменную с глобальной областью видимости &quot;DEMO&quot;.</span>
<span style="color: #006600; font-style: italic;">// Для чего нужно использовать как можно меньше переменных с глобальной областью видимости?</span>
<span style="color: #006600; font-style: italic;">// По двум причинам:</span>
<span style="color: #006600; font-style: italic;">// 1. Вы можете быть уверенным, что весь ваш код надежно упрятан в безопасное место, и другой разработчик, подключив</span>
<span style="color: #006600; font-style: italic;">//      свой модуль (или свою библиотеку), не сломает вашу функцию или объект, и ваш код (и его) будет работать именно так,</span>
<span style="color: #006600; font-style: italic;">//      как вы ожидаете. Программирование - непростая штука, так зачем находить себе проблемы там, где их можно избежать?</span>
<span style="color: #006600; font-style: italic;">// 2. Объекты, являющиеся свойствами глобального объекта (в клиентском javascript'е - объекта window) иначе обрабатываются</span>
<span style="color: #006600; font-style: italic;">//      сборщиком мусора, и живут дольше, а значит, если вы для каждую мелкую функцию или временную переменную будете</span>
<span style="color: #006600; font-style: italic;">//      создавать в глобальной области видимости, использование памяти будет неоптимальным, что само по себе плохо. А если</span>
<span style="color: #006600; font-style: italic;">//      вы плохо распоряжаетесь памятью, то, по мере роста функционала, ваш проект очень скоро начнет тормозить.</span>
<span style="color: #006600; font-style: italic;">// Лично для меня любая из этих причин является достаточно веским аргументом для того,</span>
<span style="color: #006600; font-style: italic;">// чтобы упаковывать весь свой код в одну переменную с глобальной областью видимости.</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> DEMO <span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;undefined&quot;</span> <span style="color: #339933;">||</span> <span style="color: #339933;">!</span>DEMO<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> DEMO <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;
<span style="color: #006600; font-style: italic;">// Lang - это утилита, содержащая удобные методы для работы с языком.</span>
<span style="color: #006600; font-style: italic;">// На самом деле, это просто синтаксический сахар - то есть, можно обойтись и без них,</span>
<span style="color: #006600; font-style: italic;">// но с ними приходится меньше печатать, да и код становится более человекопонятным.</span>
<span style="color: #006600; font-style: italic;">//</span>
<span style="color: #006600; font-style: italic;">// Обратите внимание, что перед тем, как создать объект Lang в объекте DEMO, я проверяю, не создан ли он уже</span>
<span style="color: #006600; font-style: italic;">// в рамках этой демонстрации это не является необходимым, но в случае, если ваш код будет использовать человек,</span>
<span style="color: #006600; font-style: italic;">// не слишком хорошо понимающий, что он делает (скажем, просто подключает ваш виджет к своему блогу),</span>
<span style="color: #006600; font-style: italic;">// он может и два и три раза подключить несколько ваших виджетов, имеющих те же самые объекты как свою часть - а без</span>
<span style="color: #006600; font-style: italic;">// этой проверки объект DEMO.Lang несколько раз перезапишется, причем, это будет совершенно лишняя операция.</span>
DEMO.<span style="color: #660066;">Lang</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">typeof</span> DEMO.<span style="color: #660066;">Lang</span> <span style="color: #339933;">!=</span> <span style="color: #3366CC;">'undefined'</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> DEMO.<span style="color: #660066;">Lang</span> <span style="color: #339933;">?</span> DEMO.<span style="color: #660066;">Lang</span> <span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
    isUndefined <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;">'undefined'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    isString <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;">'string'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">// DOM - это ряд функций, облегчающих работу с DOM. В рамках примера мне достаточно только двух - навешивание и удаление</span>
<span style="color: #006600; font-style: italic;">// обработчиков событий, метод get вспомогательный и без него можно обойтись.</span>
DEMO.<span style="color: #660066;">DOM</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">typeof</span> DEMO.<span style="color: #660066;">DOM</span> <span style="color: #339933;">!=</span> <span style="color: #3366CC;">'undefined'</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> DEMO.<span style="color: #660066;">DOM</span> <span style="color: #339933;">?</span> DEMO.<span style="color: #660066;">DOM</span> <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;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</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>
&nbsp;
    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: #006600; font-style: italic;">// если el не dom-элемент, а строка, тогда пробуем найти dom-элемент с id, равным этой строке</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>DEMO.<span style="color: #660066;">Lang</span>.<span style="color: #660066;">isString</span><span style="color: #009900;">&#40;</span>el<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> el <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">get</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>
&nbsp;
        <span style="color: #006600; font-style: italic;">// проверка наличия необходимой функциональности в браузере перед использованием функции называется</span>
        <span style="color: #006600; font-style: italic;">// feature-testing.</span>
        <span style="color: #006600; font-style: italic;">// Подробнее об этом принципе можно прочитать, здесь: http://www.unix.com.ua/orelly/webprog/jscript/ch20_01.htm</span>
        <span style="color: #006600; font-style: italic;">// а конкретно об этом кусочке кода здесь: http://fastcoder.org/articles/?aid=17</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>el.<span style="color: #660066;">addEventListener</span><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: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>el.<span style="color: #660066;">attachEvent</span><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: #000066; font-weight: bold;">else</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: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
    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>DEMO.<span style="color: #660066;">Lang</span>.<span style="color: #660066;">isString</span><span style="color: #009900;">&#40;</span>el<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> el <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">get</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>
&nbsp;
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>el.<span style="color: #660066;">removeEventListener</span><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: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>el.<span style="color: #660066;">detachEvent</span><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: #000066; font-weight: bold;">else</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: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Чтобы не раздувать листинг, я не включил в него еще две функции&thinsp;&#8211;&thinsp;<a href="http://www.crockford.com/javascript/memory/leak.html">purge</a> и setInnerHTML, по ссылке вы можете найти их описание и принцип действия. Также вы можете найти их в исходниках&nbsp;примера.</p>
<p>Ну и теперь перейдем к тому, ради чего все затевалось&thinsp;&#8211;&thinsp;к созданию непосредственно диалогового&nbsp;окна.</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> DEMO <span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;undefined&quot;</span> <span style="color: #339933;">||</span> <span style="color: #339933;">!</span>DEMO<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> DEMO <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;
<span style="color: #006600; font-style: italic;">// Обратите внимание - объект строится по так называемому &quot;модульному&quot; паттерну, предложенному YAHOO!</span>
<span style="color: #006600; font-style: italic;">// подробнее: http://ajaxian.com/archives/a-javascript-module-pattern</span>
DEMO.<span style="color: #660066;">Dialog</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">typeof</span> DEMO.<span style="color: #660066;">Dialog</span> <span style="color: #339933;">!=</span> <span style="color: #3366CC;">'undefined'</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> DEMO.<span style="color: #660066;">Dialog</span> <span style="color: #339933;">?</span> DEMO.<span style="color: #660066;">Dialog</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;">// &quot;private&quot;-свойства</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// создаем контейнер диалога и запоминаем его.</span>
    <span style="color: #003366; font-weight: bold;">var</span> dialog <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>
&nbsp;
    dialog.<span style="color: #660066;">className</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'dialog'</span><span style="color: #339933;">;</span>
    document.<span style="color: #660066;">body</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Главная функция. На вход может приходить как строка (в этом случае она становится текстом окна)</span>
    <span style="color: #006600; font-style: italic;">// так и объек со свойствами:</span>
    <span style="color: #006600; font-style: italic;">// body {String} - текст окна</span>
    <span style="color: #006600; font-style: italic;">// buttons {Array} - массив кнопок, при этом каждая кнопка - объект вида:</span>
    <span style="color: #006600; font-style: italic;">//   id : {String} - id кнопки</span>
    <span style="color: #006600; font-style: italic;">//   text : {String} - текст кнопки</span>
    <span style="color: #006600; font-style: italic;">//   callback : {Function | Object} - либо функция (в этом случае она будет повешена на click по кнопке), либо объект вида:</span>
    <span style="color: #006600; font-style: italic;">//     fn : {Function} непосредственно функция</span>
    <span style="color: #006600; font-style: italic;">//     type : {String} тип события, на которое будет навешена функция.</span>
    <span style="color: #003366; font-weight: bold;">var</span> render <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: #003366; font-weight: bold;">var</span> html<span style="color: #339933;">,</span> i<span style="color: #339933;">,</span> length <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;">buttons</span> <span style="color: #339933;">===</span> <span style="color: #3366CC;">'undefined'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> <span style="color: #CC0000;">0</span> <span style="color: #339933;">:</span> o.<span style="color: #660066;">buttons</span>.<span style="color: #660066;">length</span><span style="color: #339933;">,</span>
            button<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #006600; font-style: italic;">// текст диалогового окна</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> o <span style="color: #339933;">===</span> <span style="color: #3366CC;">'string'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            html <span style="color: #339933;">=</span> <span style="color: #3366CC;">'
&nbsp;
'</span> <span style="color: #339933;">+</span> o <span style="color: #339933;">+</span> <span style="color: #3366CC;">'
&nbsp;
'</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>
            html <span style="color: #339933;">=</span> <span style="color: #3366CC;">'
&nbsp;
'</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>o.<span style="color: #660066;">body</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> o.<span style="color: #660066;">body</span> <span style="color: #339933;">:</span> o<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'
&nbsp;
'</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> length<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            button <span style="color: #339933;">=</span> o.<span style="color: #660066;">buttons</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            html <span style="color: #339933;">+=</span> <span style="color: #3366CC;">'&lt;a id=&quot;'</span> <span style="color: #339933;">+</span> button.<span style="color: #660066;">id</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&quot; href=&quot;#&quot;&gt;'</span> <span style="color: #339933;">+</span> button.<span style="color: #660066;">text</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&lt;/a&gt;'</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #006600; font-style: italic;">// нам не нужно беспокоиться об утечках памяти, Дуглас Крокфорд побеспокоился за нас</span>
        DEMO.<span style="color: #660066;">DOM</span>.<span style="color: #660066;">setInnerHTML</span><span style="color: #009900;">&#40;</span>dialog<span style="color: #339933;">,</span> html<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        activateListeners<span style="color: #009900;">&#40;</span>o.<span style="color: #660066;">buttons</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;">// навешиваем обработчики событий на кнопки. Если кнопок нет - ничего не делаем.</span>
    <span style="color: #003366; font-weight: bold;">var</span> activateListeners <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>buttons<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> i<span style="color: #339933;">,</span> length<span style="color: #339933;">,</span> button<span style="color: #339933;">,</span> isUndefined <span style="color: #339933;">=</span> DEMO.<span style="color: #660066;">Lang</span>.<span style="color: #660066;">isUndefined</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>DEMO.<span style="color: #660066;">Lang</span>.<span style="color: #660066;">isUndefined</span><span style="color: #009900;">&#40;</span>buttons<span style="color: #009900;">&#41;</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: #339933;">;</span> <span style="color: #009900;">&#125;</span>
        length <span style="color: #339933;">=</span> buttons.<span style="color: #660066;">length</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> length<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            button <span style="color: #339933;">=</span> buttons<span style="color: #009900;">&#91;</span>i<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><span style="color: #339933;">!</span>isUndefined<span style="color: #009900;">&#40;</span>button.<span style="color: #660066;">callback</span>.<span style="color: #660066;">type</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: #339933;">!</span>isUndefined<span style="color: #009900;">&#40;</span>button.<span style="color: #660066;">callback</span>.<span style="color: #660066;">fn</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                DEMO.<span style="color: #660066;">DOM</span>.<span style="color: #660066;">addListener</span><span style="color: #009900;">&#40;</span>button.<span style="color: #660066;">id</span><span style="color: #339933;">,</span> button.<span style="color: #660066;">callback</span>.<span style="color: #660066;">type</span><span style="color: #339933;">,</span> button.<span style="color: #660066;">callback</span>.<span style="color: #660066;">fn</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>
                DEMO.<span style="color: #660066;">DOM</span>.<span style="color: #660066;">addListener</span><span style="color: #009900;">&#40;</span>button.<span style="color: #660066;">id</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> button.<span style="color: #660066;">callback</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
        cached_buttons <span style="color: #339933;">=</span> buttons<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>
        <span style="color: #006600; font-style: italic;">// публичный функции</span>
        <span style="color: #006600; font-style: italic;">// показываем диалогове диалоговое окно</span>
        show <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>
            render<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>
        <span style="color: #006600; font-style: italic;">// прячем диалоговое окно</span>
        hide <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>
            dialog.<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: #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></pre></div></div>

<p>Теперь у нас есть объект DEMO.Dialog, у которого есть два public метода&thinsp;&#8211;&thinsp;show и hide. При этом объект достаточно гибкий и может отрисовать как диалоговое окно, так и&nbsp;оповещение.</p>
<p>Если мы хотим вызвать показать диалоговое окно, то мы добавим две&nbsp;кнопки:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">    DEMO.<span style="color: #660066;">Dialog</span>.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    body <span style="color: #339933;">:</span> <span style="color: #3366CC;">'Хотите кофе?'</span><span style="color: #339933;">,</span>
    buttons <span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
        <span style="color: #009900;">&#123;</span>
            id <span style="color: #339933;">:</span> <span style="color: #3366CC;">'cancel'</span><span style="color: #339933;">,</span>
            text <span style="color: #339933;">:</span> <span style="color: #3366CC;">'Не'</span><span style="color: #339933;">,</span>
            callback <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> DEMO.<span style="color: #660066;">Dialog</span>.<span style="color: #660066;">hide</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><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#123;</span>
            id <span style="color: #339933;">:</span> <span style="color: #3366CC;">'accept'</span><span style="color: #339933;">,</span>
            text <span style="color: #339933;">:</span> <span style="color: #3366CC;">'Да!'</span><span style="color: #339933;">,</span>
            callback <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>
                DEMO.<span style="color: #660066;">Dialog</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                document.<span style="color: #660066;">body</span>.<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><span style="color: #3366CC;">'Я тоже :)'</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: #009900;">&#125;</span>
    <span style="color: #009900;">&#93;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Если мы хотим оповестить пользователя о чем-то, то достаточно одной кнопки&nbsp;&laquo;Закрыть&raquo;:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">DEMO.<span style="color: #660066;">Dialog</span>.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    body <span style="color: #339933;">:</span> <span style="color: #3366CC;">'Э... кхм... ваше кофе сбежало!'</span><span style="color: #339933;">,</span>
    buttons <span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
        <span style="color: #009900;">&#123;</span>
            id <span style="color: #339933;">:</span> <span style="color: #3366CC;">'accept'</span><span style="color: #339933;">,</span>
            text <span style="color: #339933;">:</span> <span style="color: #3366CC;">'Куда?! o_O'</span><span style="color: #339933;">,</span>
            callback <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> DEMO.<span style="color: #660066;">Dialog</span>.<span style="color: #660066;">hide</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>
    <span style="color: #009900;">&#93;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Думаю, css-код, используемый для примера, не&nbsp;важен.</p>
<p><a href="http://ulizko.com/demo/dialog/">Демонстрация</a>.</p>
<p><a href="http://ulizko.com/wp-content/uploads/2008/12/example.zip">Исходный код в&nbsp;архиве</a>.</p>
<p>Вес javascript кода после&nbsp;склейки:</p>
<ul>
<li>не сжатый: 6.4&nbsp;KB</li>
<li>сжатый с помощью YUI Compressor&#8217;а: 2.2&nbsp;KB</li>
<li>сжатый с помощью YUI Compressor&#8217;а и gzip-а: 931&nbsp;B</li>
</ul>
<p>Разумеется, это лишь пример, в реальном проекте нужно было добавить&nbsp;следующее:</p>
<ul>
<li>кнопку &laquo;закрыть&raquo;, чтобы которая скрывает&nbsp;окно</li>
<li>обработка события resize объекта window&thinsp;&#8211;&thinsp;чтобы располагать диалоговое окно всегда по&nbsp;центру</li>
<li>динамическое создание id у кнопок и самого диалогового окна, и запоминание конкретных instance&#8217;ов этих&nbsp;объектов</li>
<li>передачу контекста, т.е. this вместе с обработчиком, навешиваемым на&nbsp;кнопку</li>
<li>дополняйте&nbsp;:)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://ulizko.com/posts/173/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Мэт Шнайдер</title>
		<link>http://ulizko.com/posts/143</link>
		<comments>http://ulizko.com/posts/143#comments</comments>
		<pubDate>Tue, 25 Nov 2008 10:48:58 +0000</pubDate>
		<dc:creator>Александр Улизько</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[guru]]></category>
		<category><![CDATA[интересный человек]]></category>

		<guid isPermaLink="false">http://ulizko.com/?p=143</guid>
		<description><![CDATA[С удивлением заметил, что в рунете (да и вообще в нете) мало ссылок на Мэта Шнайдера (Matt Snider), человека, мнение которого лично мне кажется очень авторитетным в области веб-дева вообще и javascript&#8217;а в частности. В общем, рекомендую:&#160;http://mattsnider.com/
]]></description>
			<content:encoded><![CDATA[<p>С удивлением заметил, что в рунете (да и вообще в нете) мало ссылок на Мэта Шнайдера (Matt Snider), человека, мнение которого лично мне кажется очень авторитетным в области веб-дева вообще и javascript&#8217;а в частности. В общем, рекомендую:&nbsp;<a href="http://mattsnider.com/">http://mattsnider.com/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ulizko.com/posts/143/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Back-button problem</title>
		<link>http://ulizko.com/posts/135</link>
		<comments>http://ulizko.com/posts/135#comments</comments>
		<pubDate>Mon, 24 Nov 2008 05:16:57 +0000</pubDate>
		<dc:creator>Александр Улизько</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[back-button problem]]></category>
		<category><![CDATA[browser history]]></category>
		<category><![CDATA[module]]></category>

		<guid isPermaLink="false">http://ulizko.com/?p=135</guid>
		<description><![CDATA[При создании RIA возникает целый пласт различных проблем.
Самая, пожалуй, известная проблема&#8201;&#8211;&#8201;проблема &#171;кнопки назад&#187; (это я так перевел &#171;back-button problem&#187; в меру своих лингвистических&#160;способностей).
Хочу поделиться своим вариантом ее&#160;решения:
Сам принцип работы очень простой&#8201;&#8211;&#8201;есть объект, который занимается подгрузкой нужного контента в главный контейнер, назовем его PageFlow, у него есть общедоступный (если кто не понял, это я все еще [...]]]></description>
			<content:encoded><![CDATA[<p>При создании RIA возникает целый пласт различных проблем.<br />
Самая, пожалуй, известная проблема&thinsp;&#8211;&thinsp;проблема &laquo;кнопки назад&raquo; (это я так перевел &laquo;back-button problem&raquo; в меру своих лингвистических&nbsp;способностей).</p>
<p>Хочу поделиться своим вариантом ее&nbsp;решения:</p>
<p>Сам принцип работы очень простой&thinsp;&#8211;&thinsp;есть объект, который занимается подгрузкой нужного контента в главный контейнер, назовем его <code>PageFlow</code>, у него есть общедоступный (если кто не понял, это я все еще упражняюсь в литературном переводе&thinsp;&#8211;&thinsp;как еще перевести public?!) метод <code>loadPage</code>, который выбирает, какой именно контент подгрузить, основываясь на параметре <code>pageName</code>. Есть также объект <code>History</code>, который отрабатывает первым на странице, и на основе части anchor URL-а вызывает <code>loadPage</code> метод, передавая ему location.hash. Также этот объект <code>History</code> запоминает переходы пользователя по anchor (я все о своем&thinsp;&#8211;&thinsp;якорь? нет?). Получается красивая схема&thinsp;&#8211;&thinsp;пользователь, кликнув на ссылку, скажем,  с id&#8217;ом товара, вызывает объект <code>History</code>, который, в свою очередь, вызывает объект <code>PageFlow</code>, который уже подгружает нужный контент в страницу. При этом, если пользователь кликнет по кнопке &laquo;назад&raquo; или &laquo;вперед&raquo;, все работает, как и ожидает этот самый&nbsp;пользователь.</p>
<p>Прежде, чем я начную хуячить кодом, условимся: мы используем <a href="http://jquery.com">jQuery</a> в качестве фреймворка и разрабатываем магазин, у которого есть список всех товаров (anchor &#8216;all&#8217;) и странички с подробным описанием товара (anchor &#8216;id&#8217;).&nbsp;Погнали:</p>
<p><span id="more-135"></span></p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">/**
 * History managment, for ajax-based pages
 * @class History
 * @constructor
 */</span>
History <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: #003366; font-weight: bold;">var</span>
    <span style="color: #006600; font-style: italic;">/**
     * @property currentHash
     * @private
     */</span>
    currentHash<span style="color: #339933;">,</span>
    <span style="color: #006600; font-style: italic;">/**
     * @property _callback
     * @private
     */</span>
    _callback<span style="color: #339933;">,</span>
&nbsp;
    historyBackStack<span style="color: #339933;">,</span>
&nbsp;
    historyForwardStack<span style="color: #339933;">,</span>
&nbsp;
    isFirst<span style="color: #339933;">,</span>
&nbsp;
    dontCheck<span style="color: #339933;">,</span>
&nbsp;
    check <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: #003366; font-weight: bold;">var</span> i<span style="color: #339933;">,</span> hash<span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>$.<span style="color: #660066;">browser</span>.<span style="color: #660066;">msie</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #006600; font-style: italic;">// On IE, check for location.hash of iframe</span>
            <span style="color: #003366; font-weight: bold;">var</span> ihistory <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#APHistory&quot;</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: #003366; font-weight: bold;">var</span> iframe <span style="color: #339933;">=</span> ihistory.<span style="color: #660066;">contentDocument</span> <span style="color: #339933;">||</span> ihistory.<span style="color: #660066;">contentWindow</span>.<span style="color: #660066;">document</span><span style="color: #339933;">;</span>
            hash <span style="color: #339933;">=</span> iframe.<span style="color: #660066;">location</span>.<span style="color: #660066;">hash</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>hash <span style="color: #339933;">!=</span> currentHash<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
                location.<span style="color: #660066;">hash</span> <span style="color: #339933;">=</span> hash<span style="color: #339933;">;</span>
                currentHash <span style="color: #339933;">=</span> hash<span style="color: #339933;">;</span>
                _callback<span style="color: #009900;">&#40;</span>hash.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/^#/</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #009900;">&#125;</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>$.<span style="color: #660066;">browser</span>.<span style="color: #660066;">safari</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>dontCheck<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #003366; font-weight: bold;">var</span> historyDelta <span style="color: #339933;">=</span> history.<span style="color: #660066;">length</span> <span style="color: #339933;">-</span> historyBackStack.<span style="color: #660066;">length</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>historyDelta<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #006600; font-style: italic;">// back or forward button has been pushed</span>
                    isFirst <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
                    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>historyDelta <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #006600; font-style: italic;">// back button has been pushed</span>
                        <span style="color: #006600; font-style: italic;">// move items to forward stack</span>
                        <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> Math.<span style="color: #660066;">abs</span><span style="color: #009900;">&#40;</span>historyDelta<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                            historyForwardStack.<span style="color: #660066;">unshift</span><span style="color: #009900;">&#40;</span>historyBackStack.<span style="color: #660066;">pop</span><span style="color: #009900;">&#40;</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: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span> <span style="color: #006600; font-style: italic;">// forward button has been pushed</span>
                        <span style="color: #006600; font-style: italic;">// move items to back stack</span>
                        <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> historyDelta<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                            historyBackStack.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>historyForwardStack.<span style="color: #660066;">shift</span><span style="color: #009900;">&#40;</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: #009900;">&#125;</span>
                    <span style="color: #003366; font-weight: bold;">var</span> cachedHash <span style="color: #339933;">=</span> historyBackStack<span style="color: #009900;">&#91;</span>historyBackStack.<span style="color: #660066;">length</span> <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: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>cachedHash <span style="color: #339933;">!=</span> undefined<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        currentHash <span style="color: #339933;">=</span> location.<span style="color: #660066;">hash</span><span style="color: #339933;">;</span>
                        _callback<span style="color: #009900;">&#40;</span>cachedHash<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</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>historyBackStack<span style="color: #009900;">&#91;</span>historyBackStack.<span style="color: #660066;">length</span> <span style="color: #339933;">-</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> undefined <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> <span style="color: #339933;">!</span>isFirst<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    <span style="color: #006600; font-style: italic;">// back button has been pushed to beginning and URL already pointed to hash (e.g. a bookmark)</span>
                    <span style="color: #006600; font-style: italic;">// document.URL doesn't change in Safari</span>
                    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">URL</span>.<span style="color: #660066;">indexOf</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;=</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        _callback<span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">URL</span>.<span style="color: #660066;">split</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</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>
                        _callback<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span>
                    isFirst <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</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: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #006600; font-style: italic;">// otherwise, check for location.hash</span>
            hash <span style="color: #339933;">=</span> location.<span style="color: #660066;">hash</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>hash <span style="color: #339933;">!=</span> currentHash<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                currentHash <span style="color: #339933;">=</span> hash<span style="color: #339933;">;</span>
                _callback<span style="color: #009900;">&#40;</span>hash.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/^#/</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">''</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: #009900;">&#125;</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>callback<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            _callback <span style="color: #339933;">=</span> callback<span style="color: #339933;">;</span>
            currentHash <span style="color: #339933;">=</span> location.<span style="color: #660066;">hash</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>$.<span style="color: #660066;">browser</span>.<span style="color: #660066;">msie</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #006600; font-style: italic;">// To stop the callback firing twice during initilization if no hash present</span>
                <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>currentHash <span style="color: #339933;">==</span> <span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    currentHash <span style="color: #339933;">=</span> <span style="color: #3366CC;">'#'</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
&nbsp;
                <span style="color: #006600; font-style: italic;">// add hidden iframe for IE</span>
                $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;body&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">prepend</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #003366; font-weight: bold;">var</span> iframe <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#APHistory&quot;</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: #660066;">contentWindow</span>.<span style="color: #660066;">document</span><span style="color: #339933;">;</span>
                iframe.<span style="color: #000066;">open</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                iframe.<span style="color: #000066;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                iframe.<span style="color: #660066;">location</span>.<span style="color: #660066;">hash</span> <span style="color: #339933;">=</span> currentHash<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>$.<span style="color: #660066;">browser</span>.<span style="color: #660066;">safari</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #006600; font-style: italic;">// etablish back/forward stacks</span>
&nbsp;
                historyBackStack <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                historyBackStack.<span style="color: #660066;">length</span> <span style="color: #339933;">=</span> history.<span style="color: #660066;">length</span><span style="color: #339933;">;</span>
                historyForwardStack <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                isFirst <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
                dontCheck <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>
            _callback<span style="color: #009900;">&#40;</span>currentHash.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/^#/</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            setInterval<span style="color: #009900;">&#40;</span>check<span style="color: #339933;">,</span> <span style="color: #CC0000;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
        add <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>hash<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #006600; font-style: italic;">// This makes the looping function do something</span>
            historyBackStack.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>hash<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            historyForwardStack.<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: #006600; font-style: italic;">// clear forwardStack (true click occured)</span>
            isFirst <span style="color: #339933;">=</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>
&nbsp;
        <span style="color: #006600; font-style: italic;">/**
         *
         * @param hash {String} desiring hash without first #
         */</span>
        load<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>hash<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #003366; font-weight: bold;">var</span> newhash<span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>$.<span style="color: #660066;">browser</span>.<span style="color: #660066;">safari</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                newhash <span style="color: #339933;">=</span> hash<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>
                newhash <span style="color: #339933;">=</span> <span style="color: #3366CC;">'#'</span> <span style="color: #339933;">+</span> hash<span style="color: #339933;">;</span>
                location.<span style="color: #660066;">hash</span> <span style="color: #339933;">=</span> newhash<span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            currentHash <span style="color: #339933;">=</span> newhash<span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>$.<span style="color: #660066;">browser</span>.<span style="color: #660066;">msie</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #003366; font-weight: bold;">var</span> ihistory <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#APHistory&quot;</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: #006600; font-style: italic;">// TODO: need contentDocument?</span>
                <span style="color: #003366; font-weight: bold;">var</span> iframe <span style="color: #339933;">=</span> ihistory.<span style="color: #660066;">contentWindow</span>.<span style="color: #660066;">document</span><span style="color: #339933;">;</span>
                iframe.<span style="color: #000066;">open</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                iframe.<span style="color: #000066;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                iframe.<span style="color: #660066;">location</span>.<span style="color: #660066;">hash</span> <span style="color: #339933;">=</span> newhash<span style="color: #339933;">;</span>
                _callback<span style="color: #009900;">&#40;</span>hash<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: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>$.<span style="color: #660066;">browser</span>.<span style="color: #660066;">safari</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                dontCheck <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
                <span style="color: #006600; font-style: italic;">// Manually keep track of the history values for Safari</span>
                <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">add</span><span style="color: #009900;">&#40;</span>hash<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #006600; font-style: italic;">// Wait a while before allowing checking so that Safari has time to update the &quot;history&quot; object</span>
                <span style="color: #006600; font-style: italic;">// correctly (otherwise the check loop would detect a false change in hash).</span>
                <span style="color: #003366; font-weight: bold;">var</span> fn <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>AP.<span style="color: #660066;">History</span>.<span style="color: #660066;">setCheck</span><span style="color: #009900;">&#40;</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>
&nbsp;
                window.<span style="color: #660066;">setTimeout</span><span style="color: #009900;">&#40;</span>fn<span style="color: #339933;">,</span> <span style="color: #CC0000;">200</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                _callback<span style="color: #009900;">&#40;</span>hash<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #006600; font-style: italic;">// N.B. &quot;location.hash=&quot; must be the last line of code for Safari as execution stops afterwards.</span>
                <span style="color: #006600; font-style: italic;">//      By explicitly using the &quot;location.hash&quot; command (instead of using a variable set to &quot;location.hash&quot;) the</span>
                <span style="color: #006600; font-style: italic;">//      URL in the browser and the &quot;history&quot; object are both updated correctly.</span>
                location.<span style="color: #660066;">hash</span> <span style="color: #339933;">=</span> newhash<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>
              _callback<span style="color: #009900;">&#40;</span>hash<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
        <span style="color: #006600; font-style: italic;">/**
         * Set need we check, or not.
         * @param check {Boolean}
         * @protected
         */</span>
        setCheck <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>check<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            dontCheck <span style="color: #339933;">=</span> check<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
        <span style="color: #006600; font-style: italic;">/**
         * @method getCurrentHash
         * @return {String}
         */</span>
        getCurrentHash <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> currentHash<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <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></pre></div></div>

<p><code>PageFlow</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">/**
 * Page Flow controller - load hash-specific data, show appropriate container and all that
 * @Class PageFlow
 */</span>
<span style="color: #003366; font-weight: bold;">var</span> PageFlow <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;">/**
     * show whole list of goods
     * @method loadListOfGoods
     * @private
     */</span>
    loadListOfGoods <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: #009900;">&#40;</span><span style="color: #3366CC;">'#goodsItemDetails'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">css</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'display'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'none'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#listOfGoodsWorkArea'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">css</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'display'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'block'</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;">/**
     * show detailed goods item view
     * @method loadGoodsItemDetails
     * @private
     */</span>
    loadGoodsItemDetails <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>id<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> <span style="color: #000066; font-weight: bold;">item</span> <span style="color: #339933;">=</span> M.<span style="color: #660066;">ListOfGoods</span>.<span style="color: #660066;">getGoodsItemById</span><span style="color: #009900;">&#40;</span>id<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">pluralizedProfit</span>.<span style="color: #660066;">length</span> <span style="color: #339933;">==</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">pluralizedProfit</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">pluralizedPrice</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #006600; font-style: italic;">// fill container with appropriate data</span>
        M.<span style="color: #660066;">Renderer</span>.<span style="color: #660066;">renderGoodsItemDetails</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span><span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #006600; font-style: italic;">// show goodsItemDetails</span>
        $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#goodsItemDetails'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">css</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'display'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'block'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#listOfGoodsWorkArea'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">css</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'display'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'none'</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: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #006600; font-style: italic;">/**
         * decide what page to load
         * @method loadPage
         * @param pageName {String|Number} location.hash with stripped `#` sign
         * @public
         */</span>
        loadPage <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>pageName<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>L.<span style="color: #660066;">isUndefined</span><span style="color: #009900;">&#40;</span>pageName<span style="color: #009900;">&#41;</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>M.<span style="color: #660066;">ClientURI</span>.<span style="color: #660066;">isMainPage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    loadListOfGoods<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>
            <span style="color: #006600; font-style: italic;">// if pageName is number</span>
            <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>L.<span style="color: #660066;">isNumber</span><span style="color: #009900;">&#40;</span>pageName<span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> pageName.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/\d+/</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: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #006600; font-style: italic;">// need to load goods item details page with provided id</span>
                loadGoodsItemDetails<span style="color: #009900;">&#40;</span>pageName<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>
                <span style="color: #000066; font-weight: bold;">switch</span> <span style="color: #009900;">&#40;</span>pageName<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    <span style="color: #000066; font-weight: bold;">case</span> <span style="color: #3366CC;">'all'</span><span style="color: #339933;">:</span>
                        loadListOfGoods<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #000066; font-weight: bold;">break</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: #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></pre></div></div>

<p>Ну а дальше все&nbsp;просто:</p>
<p>При загрузке страницы инициализируем объект History, в качестве callback передаем ему метод loadPage объекта PageFlow, а на все ссылки с <code>rel == history</code> навешиваем обработчик, который вместо перехода на якорь будет вызывать метод load объекта&nbsp;History:</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: #009900;">&#40;</span><span style="color: #3366CC;">'a @rel=[history]'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><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>
        History.<span style="color: #660066;">load</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">href</span>.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/^.*#/</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</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>
&nbsp;
    History.<span style="color: #660066;">initialize</span><span style="color: #009900;">&#40;</span>PageFlow.<span style="color: #660066;">loadPage</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></pre></div></div>

<p>Все файлы в заархивированном виде: <a href="http://ulizko.com/wp-content/uploads/2008/11/backbutton.zip">BackButton&nbsp;Archive</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ulizko.com/posts/135/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
