<?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>CTAPbIu_MABP&#039;s BLOG &#187; YUI</title>
	<atom:link href="http://mabp.kiev.ua/tag/yui/feed/" rel="self" type="application/rss+xml" />
	<link>http://mabp.kiev.ua</link>
	<description>энтузиазм = 1/опыт © Старый Мавр</description>
	<lastBuildDate>Thu, 26 Jan 2012 10:34:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>-moz-box-shadow &amp; -moz-transform</title>
		<link>http://mabp.kiev.ua/2010/08/17/moz-box-shadow-moz-transform/</link>
		<comments>http://mabp.kiev.ua/2010/08/17/moz-box-shadow-moz-transform/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 12:14:38 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[FireFox]]></category>
		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1235</guid>
		<description><![CDATA[Ребята из YUI сделали песочницу для CSS3. А я поковырял и нашел косяки в FF 3.6/7.x. Смотреть в остальных браузерах не имеет смысла. -moz-box-shadow:50px 50px 50px #FF4500; -moz-transform:rotate(90deg); background:none repeat scroll 0 0 #DDDDDD; height:100px; left:200px; padding:10px; position:absolute; top:100px; width:300px; А вот и баг нашелся]]></description>
			<content:encoded><![CDATA[<p>Ребята из YUI сделали <a href="http://css3.mikeplate.com/">песочницу для CSS3</a>. А я поковырял и нашел косяки в FF 3.6/7.x. Смотреть в остальных браузерах не имеет смысла.</p>
<span id="more-1235"></span>
<div style="position: relative;width:600px;height:400px;">
<div style="-moz-box-shadow:50px 50px 50px #FF4500;-moz-transform:rotate(90deg);background:none repeat scroll 0 0 #DDDDDD;height:100px;left:200px;padding:10px;position:absolute;top:100px;width:300px;"></div>
</div>

<pre><code class="css">
-moz-box-shadow:50px 50px 50px #FF4500;
-moz-transform:rotate(90deg);

background:none repeat scroll 0 0 #DDDDDD;
height:100px;
left:200px;
padding:10px;
position:absolute;
top:100px;
width:300px;
</code></pre>

<p>А вот и <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=536061">баг</a> нашелся</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/08/17/moz-box-shadow-moz-transform/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Возвращаяюсь к началу...</title>
		<link>http://mabp.kiev.ua/2008/03/23/back_to_the_beginning/</link>
		<comments>http://mabp.kiev.ua/2008/03/23/back_to_the_beginning/#comments</comments>
		<pubDate>Sun, 23 Mar 2008 13:32:55 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[Голоса в голове]]></category>
		<category><![CDATA[Разное]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://mabp.localhost/?p=92</guid>
		<description><![CDATA[Это все про старый движок. Я вот что подумал: я отвлекся от темы. На самом деле блог задумывался как описание того «как написать движок сайта на php», собственно на примере самого блога. Так вот движок был написан где-то в январе-феврале 2007 года, за две с небольшим недели. Больше я к движку не прикасался. Связано это [...]]]></description>
			<content:encoded><![CDATA[<table style="background-color:#EDEFF0;width:100%;"><tbody><tr><th><img src="/wp-content/themes/inove/img/warning_red.png"/></th>
<th style="text-align: center;">Это все про старый движок.</th></tr></tbody></table>

<p>Я вот что подумал: я отвлекся от темы. На самом деле блог задумывался как описание того «как написать движок сайта на php», собственно на примере самого блога.</p>
<span id="more-92"></span>
<p>Так вот движок был написан где-то в январе-феврале 2007 года, за две с небольшим недели. Больше я к движку не прикасался. Связано это было не с тем что я закончил его писать и/или остался доволен результатами свое работы, а с тем что у меня закончился отпуск. В то время я работал в <a href="http://www.ssi.com.ua/" rel="nofollow external">Servus Sistems Integration</a> разработчиком пользовательских интерфейсов на <a href="http://mabp.kiev.ua/category/programming/javascript/">JavaScript</a> и к <a href="http://mabp.kiev.ua/category/programming/php/">PHP</a> вернулся только благодаря небольшому проекту от Alfa банка которому нужен был онлайновый калькулятор ипотеки. Этот калькулятор и реализовали на php+oracle. После его написания меня накрыло давнее (с времен работы на <a href="http://www.promsat.com/" rel="nofollow external">promsat</a>) желание написать собственное движло.</p>

<p>Писать было нелегко. С одной стороны опыт программирования и желание работать с другой разработка архитектуры движка, базы данных и создание UI и все сразу. Не знаешь с чего начать, чтоб получить хоть какой-то результат. Наброски классов и интерфейсов наследование и отношения которых все время меняются, заготовки кода подсмотрены в других системах, просто отдельные классы, все это перемешивается в голове создавая иллюзию готового движка, которая в 5 утра, с первыми лучами солнца разбивается о недостаток времени и сообщения дебагера. </p>

<p>Архитектура движка была выбрана фреймворковая то есть основой должно быть генерация страниц (страниц и списков) и раздача прав пользователям. Так например комментарии к страницам выполнены в виде модуля "цепляющегося" к самой странице. </p>

<p>С базой тоже все было не гладко надо было выбирать что использовать nested sets или adjustment lists и я выбрал nested sets. Для этого у человека по имени <a href="http://kuzma.russofile.ru/" rel="nofollow external">Кузьма Феськов</a> была выклянчена свежая (v3.0) версия (которую я так до сих пор нигде не видел) библиотеки <a href="http://php.russofile.ru/ru/authors/sql/nestedsets01/" rel="nofollow external">DbTree</a>, хотя к сожалению не смотря на это она так и не вошла в движок. </p>

<p>Интерфейс сайта я сначала собирался сделать с помощью <a href="http://mabp.kiev.ua/tag/yui/">YUI</a>, как раз примерно в это время появилась библиотека <a href="http://mabp.kiev.ua/tag/extjs/">ExtJS</a> тогда еще yui-ext и я с радостью начал в ней ковыряться, удачно сперев коментарии с блога <a href="http://jackslocum.com/blog/" rel="nofollow external">Jack Slocum'a</a>. Потом уже я отказался от этой идеи из-за убогости моего исполненя и того что автор перекраивал свое творение изо дня в день, а мне не хватало элементарно познания <a href="http://mabp.kiev.ua/category/programming/javascript/">JavaScript</a>, чтобы за ним хоть как-то угнаться. Так вот дизайн я решил взять портированый под <a href="http://neocrome.ru/" rel="nofollow external">Seditio</a> c движка <a href="http://www.joomla.org/" rel="nofollow">Joomla</a>, а точнее спертый с сайта  <a href="http://demo.rockettheme.com/jan06/" rel="nofollow">Rocket Theme</a> моим другом Asmo.</p>

<p>Так вот я решил реанимировать движок и дописать спустя почти год. По памяти поставив apache+php+mysql всего за 40 минут (неутешительный результат), я запустил сайт локально (странно заработал с первого раза, подозреваю грандиозный подвох) и открыв код удивился как это все вообще работает. Сейчас я собираюсь как следует подрихтовать это чудовище на предмет навигации, а также дописать авторизацию и сделать нормальные коментарии.</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2008/03/23/back_to_the_beginning/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>YUI: extention</title>
		<link>http://mabp.kiev.ua/2006/12/11/yui-extention/</link>
		<comments>http://mabp.kiev.ua/2006/12/11/yui-extention/#comments</comments>
		<pubDate>Mon, 11 Dec 2006 13:16:40 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[layout]]></category>
		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1201</guid>
		<description><![CDATA[Автор Jack Locum предлагает верстать с помощью этой либы сайты. на самом деле это очень красиво но совершенно не удобно! сейчас я это докажу Предположим что у нас есть localhost и у него по адресу /yui/ лежит YUI а по адресу /yui-ext/ собственно сама библиотека Тогда создаем простой html код &#60;html&#62; &#60;head&#62; ... &#60;/head&#62; &#60;body&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Автор <a href="http://www.jackslocum.com/blog/index.php" rel="nofollow external">Jack Locum</a> предлагает верстать с помощью этой либы сайты. на самом деле это очень красиво но совершенно не удобно! сейчас я это докажу</p>
<span id="more-1201"></span>
<p>Предположим что у нас есть localhost и у него по адресу /yui/ лежит YUI а по адресу /yui-ext/ собственно сама библиотека</p>

<p>Тогда создаем простой html код</p>

<pre><code class="html">
&lt;html&gt;
&lt;head&gt;
...
&lt;/head&gt;
&lt;body&gt;
...
&lt;/body&gt;
&lt;/html&gt;
</code></pre>


<p>В хедере мы разместим наш скрипт</p>

<pre><code class="html">
&lt;link rel="stylesheet" type="text/css" href="lib/yui-ext/resources/css/yui-ext.css" /&gt;&lt;!-- подключаем стили --&gt;

&lt;script type="text/javascript" src="lib/yui/utilities/utilities.js"&gt;&lt;/script&gt;&lt;!-- yui --&gt;
&lt;script type="text/javascript" src="lib/yui-ext/yui-ext.js"&gt;&lt;/script&gt;&lt;!-- yui-ext --&gt;

&lt;!-- добавляем собстенные стили --&gt;

&lt;style type="text/css"&gt;
	body {font:normal 9pt verdana; margin:0;padding:0;border:0px none;overflow:hidden;}
	.ylayout-panel-north {
	    border:0px none;
	    background-color:#c3daf9;
	}
	#nav {
	}
	#autoTabs, #center1, #center2, #west {
	    padding:10px;
	}
	#north, #south{
	    font:normal 8pt arial, helvetica;
	    padding:4px;
	}
	.ylayout-panel-center p {
	    margin:5px;
	}
	#props-panel .ygrid-col-0{
	}
	#props-panel .ygrid-col-1{
	}
&lt;/style&gt;
</code></pre>

<p>Теперь представим, что мы хотим создать класическую трехполосную ленту, с шапкой и футером. в левой полосе прсто коллонка, по центру две закладки, две, а справа коллонка поделена на три части горизонтально; подвал  по умолчанию отключен</p>

<p>для всего этого мы в body положим основной контейнер</p> 

<pre><code class="html">
&lt;div id ="container"&gt;...&lt;/div&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;а в него по очереди все блоки которые нам понадобятся&lt;/p&gt;
&lt;pre&gt;&lt;code class="html"&gt;
&lt;div id="west" class="ylayout-inactive-content"&gt;west&lt;/div&gt;
&lt;div id="north" class="ylayout-inactive-content"&gt;north&lt;/div&gt;
&lt;div id="autoTabs" class="ylayout-inactive-content"&gt;autoTabs&lt;/div&gt;
&lt;div id="center2" class="ylayout-inactive-content"&gt;center2&lt;/div&gt;
&lt;div id="center1" class="ylayout-inactive-content"&gt;center1&lt;/div&gt;
  
&lt;div id="content1" class="ylayout-inactive-content"&gt;content1&lt;/div&gt;
&lt;div id="content2" class="ylayout-inactive-content"&gt;content2&lt;/div&gt;
&lt;div id="content3" class="ylayout-inactive-content"&gt;content3&lt;/div&gt;
  
&lt;div id="inner1" class="ylayout-inactive-content"&gt;inner1&lt;/div&gt;
&lt;div id="inner2" class="ylayout-inactive-content"&gt;inner2&lt;/div&gt;
&lt;div id="inner3" class="ylayout-inactive-content"&gt;inner3&lt;/div&gt;
&lt;div id="sqldebug" class="ylayout-inactive-content"&gt;sqldebug&lt;/div&gt;
&lt;div id="gpcdebug" class="ylayout-inactive-content"&gt;gpcdebug&lt;/div&gt;
</code></pre>

<p>Теперь приспупаем писать инициализатор</p>

<pre><code class="javascript">
        // определяем функцию которая будет стартовать наш скрипт
	Example = function(){
	        // в теле пусто 
	        return {
	            // зато она возвращает объект с одним свойством init
	            init : function(){
	               // определяем новый layout.
	               // кажждый объект BorderLayout имеет 5 свойств north west east south center
	               var layout = new YAHOO.ext.BorderLayout(document.body, {
	                    hideOnLayout: true,
	                    // говорим что north
	                    north: {
	                        // не resizable
	                        split:false,
	                        // с шириной 100
	                        initialSize: 100,
	                        // без титлбара
	                        titlebar: false
	                    },
	                    // west 
	                    west: {
	                        // resizable
	                        split:true,
	                        // появляется с размером 200
	                        initialSize: 200,
	                        // минимум при растягивании 175 
	                        minSize: 175,
	                        // максимум 400
	                        maxSize: 400,
	                        // с титл баром
	                        titlebar: true,
	                        // с кнопкой закрыть
	                        collapsible: true,
	                        // анимированный 
                            animate: true
	                    },
	                    east: {
	                        split:false,
	                        initialSize: 200,
	                        minSize: 175,
	                        maxSize: 400,
	                        titlebar: true,
	                        collapsible: true,
                            animate: true
	                    },
	                    south: {
	                        split:true,
	                        initialSize: 100,
	                        minSize: 100,
	                        maxSize: 200,
	                        titlebar: true,
	                        collapsible: true,
                            animate: true,
	                    // с скролбаром если надо
                            autoScroll:true
	                    },
	                    center: {
	                        // закладки сверху
	                        tabPosition: 'top',
	                        autoScroll:true
	                    }
	                });
	                // начинаем создавать елементы слоя
	                layout.beginUpdate();
	                // северный (хедер)
	                layout.add('north', new YAHOO.ext.ContentPanel('north', 'North'));
	                // западный с надписью в титлбаре Navigation Panel
			layout.add('west', new YAHOO.ext.ContentPanel('west', {title: 'Navigation Panel'}));
	                // перввая закладка центра
	                layout.add('center', new YAHOO.ext.ContentPanel('center1', {title: 'Main block', closable: false}));
	                // вторая закладка центра
	                layout.add('center', new YAHOO.ext.ContentPanel('center2', {title: 'Center Panel', closable: false}));
	                // по умолчанию открыта первая закладка
	                layout.getRegion('center').showPanel('center1');
	                
	                /*
	                Теперь рилическое отступление по поводу того чем неудобна эта либа
	                нельзя создать 5 блоков друг под другом можно только 3
	                но можно в каждом из трех еще по три и в каждом следующем еще по три
	                */

	                // создаем внутренний слой правого столбца
	                var innerLayout = new YAHOO.ext.BorderLayout('content1', {
	                    // нижняя часть
	                    south: {
	                        //split:true,
	                        initialSize: 100,
	                        collapsible:true,
	                        titlebar: true
	                    },
	                    // центр пуст
	                    center: { }
	                });
	                // создаем нутренний елемент внутреннего елемента 'юг'
	                var southInnerLayout  = new YAHOO.ext.BorderLayout('content2', {
	                    // только центр
	                    center: { }
	                });
	                
	                // добавляем во нутренний елемент внутреннего елемента 'юг' центральный блок
	                /*
	                вот тут былобы неплохо осознавать обектную модель 	                
	                происходящего потому что словами это обьяснять очень сложно
	                */

	                southInnerLayout.add('center', new YAHOO.ext.ContentPanel('inner1', {title:'More Information', closable:true}));

	                // создаем нутренний елемент внутреннего елемента 'центер'
	                var centerInnerLayout  = new YAHOO.ext.BorderLayout('content3', {
	                    south: {
	                        //split:true,
	                        initialSize: 100,
	                        collapsible:true,
	                        titlebar: true
	                    },
	                    center: { }
	                });
	                
	                // добавляем во нутренний елемент внутреннего елемента 'центер' центральный блок
	                centerInnerLayout.add('center', new YAHOO.ext.ContentPanel('inner2', {title:'More Information', closable:true}));
	                // добавляем во нутренний елемент внутреннего елемента 'центер' нижний блок
	                centerInnerLayout.add('south', new YAHOO.ext.ContentPanel('inner3', {title:'More Information', closable:true}));
	                // закрепляем к внутреннему елементу его 'детей' к блоку 'юг'
	                innerLayout.add('south', new YAHOO.ext.NestedLayoutPanel(southInnerLayout, {title:'More Information', closable:true}));
	                // закрепляем к внутреннему елементу его 'детей' к блоку 'центер'
	                innerLayout.add('center', new YAHOO.ext.NestedLayoutPanel(centerInnerLayout, {title:'More Information', closable:true}));

	                // закрепляем за елементов east (оноже левая коллонка) все то что мы токачто насоздавали, заголовок More Information, и кнопка закрыть
	                layout.add('east', new YAHOO.ext.NestedLayoutPanel(innerLayout, {title:'More Information', closable:true}));
	                // вот тут по вашему желанию подвал
	                if (false)
	                {
	                        // первая закладка
	                	layout.add('south', new YAHOO.ext.ContentPanel('sqldebug', {title: 'SQL-Debug', closable: true}));
	                        // и вторая
	                	layout.add('south', new YAHOO.ext.ContentPanel('gpcdebug', {title: 'GPC-Debug', closable: true}));
	                        // показываем вторую
	                	layout.getRegion('south').showPanel('gpcdebug');
	                }
	                // закрепляем елементы слоя
	                layout.endUpdate();
	           }
	     }
	       
	}();// конец функции  Example
       // стартуем Example при полной загрузке страницы 
	YAHOO.ext.EventManager.onDocumentReady(Example.init, Example, true); 
</code></pre>

<p>Теперь еще одна поправка: смотрите (кто сделал конечно) вся левая коллонка отезжает на лево, вся правая - на право.</p>
<p>А в правой коллонке начинаются чудеса. Вехний блок никуда не девается а вот нижнии два, каждый по очереди, отезжает вниз и могут быть закрыты, а вот кульминация, если закрыть средний блок то нижний оставшись без родителя (учим ООП) не сможет быть закрыт не имея ссылки на то откуда его надо удалить!</p>

<p>а и вот еще при скрытии/закрытии блока используется комманда </p>
<pre><code class="javascript">
Example.layout.getRegion('center').hidePanel('center1'); 
</code></pre>
<p>где center и center1 координаты (id) радителей блока, также его можно и показать прилепив функцию на ссылку или кнопку</p>
<pre><code class="javascript">
Example.layout.getRegion('center').showPanel('center1'); 
</code></pre>

<p>PS ну вот и все ребята, пример рабочий можете пробовать, писем, пожеланий, комментов и апллодисментов конечноже не надо!!! </p>
<p>PSS спасибо всем кто читал!!!</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2006/12/11/yui-extention/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>YUI: autocomplete</title>
		<link>http://mabp.kiev.ua/2006/11/28/yui-autocomplete/</link>
		<comments>http://mabp.kiev.ua/2006/11/28/yui-autocomplete/#comments</comments>
		<pubDate>Tue, 28 Nov 2006 14:25:06 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[autocomplete]]></category>
		<category><![CDATA[combobox]]></category>
		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1203</guid>
		<description><![CDATA[Что такое AJAX, наверное, уже знают все. (кто не знает, идет гуглить), А что такое YUI я рассказывал в прошлой статье Итак, автокомплит это технология, по которой данные взятые, например из аджакса (это совершенно не обязательно) предлагаются пользователю для быстрого заполнения полей формы. Например, пользователь пишет в поле "город" несколько букв - "Сан" ему будут [...]]]></description>
			<content:encoded><![CDATA[<p>Что такое AJAX, наверное, уже знают все. (кто не знает, идет гуглить), А что такое YUI я рассказывал в <a href="http://mabp.kiev.ua/2006/11/27/yui-calendar/">прошлой статье</a></p>

<p>Итак, автокомплит это технология, по которой данные взятые, например из аджакса (это совершенно не обязательно) предлагаются пользователю для быстрого заполнения полей формы. Например, пользователь пишет в поле "город" несколько букв - "Сан" ему будут предложены варианты "Санкт-Петербург", "Сан-Франциско" и "Сан Ремо" и пользователь быстро может выбрать мышкой или с клавиатуры то что ему нравится.</p>
<span id="more-1203"></span>
<p>Проблема один - AJAX. Надо писать frontend (javascript) приложение, для клиента основанное на классе JsHttpRequest и backend (например, на php) приложение с запросом к БД</p>

<p>Проблема два нарисовать красивый выпадающий список с навигацией с клавиатуры. Проблема собственно у ослика (как обычно) потому что он не обрабатывает нажатие стрелочек в отличие от всех других браузеров.</p>

<p>Кстати, как и в прошлой статье, я отнюдь не говорю что это либа это панацея всех проблем! например, она очень тяжелая. Но раз я уже начал писать, а вы читать... продолжим</p>

<p>подключаем либу</p>

<pre><code class="html">
&lt;script type="text/javascript" src="lib/yahoo/yahoo/yahoo.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="lib/yahoo/dom/dom.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="lib/yahoo/event/event.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="lib/yahoo/connection/connection.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="lib/yahoo/animation/animation.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="lib/yahoo/autocomplete/autocomplete.js"&gt;&lt;/script&gt;
</code></pre>

<p>и css</p>

<pre><code class="css">
#ysearchmod {position:relative;padding:1em;}
#firstname_root {z-index:3000;} /* for IE z-index of absolute divs inside relative divs issue */
#secondname_root {z-index:2000;} /* for IE z-index of absolute divs inside relative divs issue */
#lastname_root {z-index:1000;} /* for IE z-index of absolute divs inside relative divs issue */
.yui-ac-content {position:absolute;width:100%;border:1px solid #404040;background:#fff;overflow:hidden;z-index:9050;}
.ysearchquery {position:absolute;right:10px;color:#808080;z-index:10;}
.yui-ac-shadow {position:absolute;margin:.3em;width:100%;background:#a0a0a0;z-index:9049;}
ul {padding:5px 0;width:100%;}
li {padding:0 5px;cursor:default;white-space:nowrap;}
li.yui-ac-highlight {background:#a0a0a0;}
li.yui-ac-prehighlight {background:pink;}
</code></pre>

<p>Для тех кто заметил что этот css сильно отличается от предлагаемого YAHOO объясняю - так как они описывают каждый элемент уже при трех полях на ajaxe css станет пухлым и дохлым поэтому я вынес его в JavaScript</p>

<p>И еще на заметку я буду предлагать заполнять ФИО</p>

<p>Последний штрих рисуем HTML</p>

<pre><code class="html">
&lt;div id="firstname_root"&gt;&lt;input type="text" name="firstname" id="firstname" value=""&gt;&lt;div id="firstname_conteiner"&gt;&lt;/div&gt;&lt;div&gt;
&lt;div id="secondname_root"&gt;&lt;input type="text" name="secondname" id="secondname" value=""&gt;&lt;div id="secondname_conteiner"&gt;&lt;div id="firstname_conteiner"&gt;&lt;/div&gt;&lt;div&gt;
&lt;div id="lastname_root"&gt;&lt;input type="text" name="lastname" id="lastname" value=""&gt;&lt;div id="firstname_conteiner"&gt;&lt;div id="lastname_conteiner"&gt;&lt;/div&gt;&lt;div&gt;
</code></pre>

<p>А теперь в тегах &lt;_script&gt;...&lt;_/script&gt; описываем загрузчик, он же frontend приложение</p>

<pre><code class="javascript">
// определяем именное пространство
YAHOO.namespace("AutoComplete");
/*
Грубо говоря если вы определите YAHOO.namespace("XXX");
то следующая строчка будет выглядеть так
YAHOO.XXX = function(input){
*/

// конструктор
YAHOO.AutoComplete = function(input){
var oACDS;
var oAutoComp;
var oDiv = null;

	// CSS, вот сюда то я и вынес все излишнее свойства
	if (oDiv=document.getElementById(input))
	{
		var rDiv = document.getElementById(input+'_root');
		var cDiv = document.getElementById(input+'_conteiner');
		oDiv.style.position = "absolute";
		oDiv.style.width = "100%";
		rDiv.style.height = "2em";
		rDiv.style.position = "relative";
		rDiv.style.margin_bottom = "1.5em";
		rDiv.style.width = "100%";
		cDiv.style.position = "absolute";
		cDiv.style.top = "1.7em";
		cDiv.style.width = "100%";
	}


    // заполняем первый объект oACDS, он у нас отвечает за AJAX
    // адресс backend'a с параметрами
    oACDS = new YAHOO.widget.DS_XHR("/backend.php", ["n", "t"]);
    // вид ответа - простой текст - по одному варианту на строку
    oACDS.responseType = YAHOO.widget.DS_XHR.TYPE_FLAT;
    // кеширование
   oACDS.queryMatchSubset = true;
    // время кеширования 60 сек
    oACDS.maxCacheEntries = 60;

    // этот параметр отвечает за дополнительные параметры в url, который запрашивается
    //тоесть вместо /backend.php данные будут посланы на /backend.php?active=имя_поля
    oACDS.scriptQueryAppend = '&#038;active=' + input;

    //заполняем второй объект отвечающий за autocomplete, ему по большому счету нужно только имя поля в
    //котором должен работать скрипт
    oAutoComp = new YAHOO.widget.AutoComplete(input,input+'_conteiner', oACDS);
    // разделитель (по умолчанию дописывает в конце выбранного варианта ';')
    oAutoComp.delimChar = "";
    // задержка в секундах до отправки запроса
    oAutoComp.queryDelay = 0;
    // минимальная длина строки перед поиском
    oAutoComp.minQueryLength=1;
    // имя класса для выделенного варианта ответа
    oAutoComp.prehighlightClassName = "yui-ac-prehighlight";
    // отключает автокомплит в браузере чтоб он не мешал
    oAutoComp.allowBrowserAutocomplete = false;
    // можно еще поизвращаться с анимацией, но это вы сделаете сами

};
//ну и собственно стартуем скрипт по разу на каждое поле
YAHOO.AutoComplete('firstname')
</code></pre>

Теперь backend надо написать, да?!

<pre><code class="php">
// я полностью писать не буду, просто объясню. Данные из аджакса приходят в кодировке UCS-2BE поэтому 
// ее надо перекодировать в win-1251

// таблица символов
$unicode_to_cp1251_tbl = array(
	0x0402 =&gt; "x80",	0x0403 =&gt; "x81",	0x201A =&gt; "x82",	0x0453 =&gt; "x83",
	0x201E =&gt; "x84",	0x2026 =&gt; "x85",	0x2020 =&gt; "x86",	0x2021 =&gt; "x87",
	0x20AC =&gt; "x88",	0x2030 =&gt; "x89",	0x0409 =&gt; "x8A",	0x2039 =&gt; "x8B",
	0x040A =&gt; "x8C",	0x040C =&gt; "x8D",	0x040B =&gt; "x8E",	0x040F =&gt; "x8F",
	0x0452 =&gt; "x90",	0x2018 =&gt; "x91",	0x2019 =&gt; "x92",	0x201C =&gt; "x93",
	0x201D =&gt; "x94",	0x2022 =&gt; "x95",	0x2013 =&gt; "x96",	0x2014 =&gt; "x97",
	0x2122 =&gt; "x99",	0x0459 =&gt; "x9A",	0x203A =&gt; "x9B",	0x045A =&gt; "x9C",
	0x045C =&gt; "x9D",	0x045B =&gt; "x9E",	0x045F =&gt; "x9F",	0x00A0 =&gt; "xA0",
	0x040E =&gt; "xA1",	0x045E =&gt; "xA2",	0x0408 =&gt; "xA3",	0x00A4 =&gt; "xA4",
	0x0490 =&gt; "xA5",	0x00A6 =&gt; "xA6",	0x00A7 =&gt; "xA7",	0x0401 =&gt; "xA8",
	0x00A9 =&gt; "xA9",	0x0404 =&gt; "xAA",	0x00AB =&gt; "xAB",	0x00AC =&gt; "xAC",
	0x00AD =&gt; "xAD",	0x00AE =&gt; "xAE",	0x0407 =&gt; "xAF",	0x00B0 =&gt; "xB0",
	0x00B1 =&gt; "xB1",	0x0406 =&gt; "xB2",	0x0456 =&gt; "xB3",	0x0491 =&gt; "xB4",
	0x00B5 =&gt; "xB5",	0x00B6 =&gt; "xB6",	0x00B7 =&gt; "xB7",	0x0451 =&gt; "xB8",
	0x2116 =&gt; "xB9",	0x0454 =&gt; "xBA",	0x00BB =&gt; "xBB",	0x0458 =&gt; "xBC",
	0x0405 =&gt; "xBD",	0x0455 =&gt; "xBE",	0x0457 =&gt; "xBF",	0x0410 =&gt; "xC0",
	0x0411 =&gt; "xC1",	0x0412 =&gt; "xC2",	0x0413 =&gt; "xC3",	0x0414 =&gt; "xC4",
	0x0415 =&gt; "xC5",	0x0416 =&gt; "xC6",	0x0417 =&gt; "xC7",	0x0418 =&gt; "xC8",
	0x0419 =&gt; "xC9",	0x041A =&gt; "xCA",	0x041B =&gt; "xCB",	0x041C =&gt; "xCC",
	0x041D =&gt; "xCD",	0x041E =&gt; "xCE",	0x041F =&gt; "xCF",	0x0420 =&gt; "xD0",
	0x0421 =&gt; "xD1",	0x0422 =&gt; "xD2",	0x0423 =&gt; "xD3",	0x0424 =&gt; "xD4",
	0x0425 =&gt; "xD5",	0x0426 =&gt; "xD6",	0x0427 =&gt; "xD7",	0x0428 =&gt; "xD8",
	0x0429 =&gt; "xD9",	0x042A =&gt; "xDA",	0x042B =&gt; "xDB",	0x042C =&gt; "xDC",
	0x042D =&gt; "xDD",	0x042E =&gt; "xDE",	0x042F =&gt; "xDF",	0x0430 =&gt; "xE0",
	0x0431 =&gt; "xE1",	0x0432 =&gt; "xE2",	0x0433 =&gt; "xE3",	0x0434 =&gt; "xE4",
	0x0435 =&gt; "xE5",	0x0436 =&gt; "xE6",	0x0437 =&gt; "xE7",	0x0438 =&gt; "xE8",
	0x0439 =&gt; "xE9",	0x043A =&gt; "xEA",	0x043B =&gt; "xEB",	0x043C =&gt; "xEC",
	0x043D =&gt; "xED",	0x043E =&gt; "xEE",	0x043F =&gt; "xEF",	0x0440 =&gt; "xF0",
	0x0441 =&gt; "xF1",	0x0442 =&gt; "xF2",	0x0443 =&gt; "xF3",	0x0444 =&gt; "xF4",
	0x0445 =&gt; "xF5",	0x0446 =&gt; "xF6",	0x0447 =&gt; "xF7",	0x0448 =&gt; "xF8",
	0x0449 =&gt; "xF9",	0x044A =&gt; "xFA",	0x044B =&gt; "xFB",	0x044C =&gt; "xFC",
	0x044D =&gt; "xFD",	0x044E =&gt; "xFE",	0x044F =&gt; "xFF",
);

// функция поиска по таблице
function utf8_to_cp1251($s) {
	$tbl = $GLOBALS['unicode_to_cp1251_tbl'];
	$uc = 0;
	$bits = 0;
	$r = "";
	for($i = 0, $l = strlen($s); $i &lt; $l; $i++)
	{
		$c = $s{$i};
		$b = ord($c);
		if($b &#038; 0x80) 
		{
			if($b &#038; 0x40)
			{
				if($b &#038; 0x20) 
				{
					$uc = ($b &#038; 0x0F) &lt;&lt; 12;
					$bits = 12;
				} else {
					$uc = ($b &#038; 0x1F) &lt;&lt; 6;
					$bits = 6;
				}
			} else {
				$bits -= 6;
				if($bits)
				{
					$uc |= ($b &#038; 0x3F) &lt;&lt; $bits;
				} else {
					$uc |= $b &#038; 0x3F;
					if($cc = @$tbl[$uc]) 
					{
						$r .= $cc;
					} else {
						$r .= '?';
					}
				}
			}
		} else {
			$r .= $c;
		}
	}
	return $r;
}

// применяем функцию ко всем входящим данным
foreach ($_REQUEST as $key =&gt; $value){
    $_REQUEST[$key] = utf8_to_cp1251($value);
}

// из всех данный нужно только 2
$like = $_REQUEST['query'];
$field = $_REQUEST['active'];

// соединяемся с БД
mysql_connect('localhost','user','pass');
mysql_select_db('namedatabase');

//Ну и собственно спрашиваем есть ли похожие имена
$sql = mysql_query("SELECT ".$field." AS suggestion FROM table_name WHERE ".$field." LIKE '$like%' ORDER BY ".$field."LIMIT 50");

// выводим списком ответ
while($result = mysql_fetch_assoc($sql)){
    echo $result['suggestion']."n";
}
</code></pre>

<p>Вот, пожалуй, и все. Кстати очень тяжелая (много килобайт весит) либа. Subsys от Котерова намного легче и практичнее, но не имеет автокомплита. Попытки втиснуть его туда насильно увенчались успехом только для FF1.5 и Opera8.0 , IE ругался</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2006/11/28/yui-autocomplete/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>YUI: calendar</title>
		<link>http://mabp.kiev.ua/2006/11/27/yui-calendar/</link>
		<comments>http://mabp.kiev.ua/2006/11/27/yui-calendar/#comments</comments>
		<pubDate>Mon, 27 Nov 2006 13:15:14 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[calendar]]></category>
		<category><![CDATA[date]]></category>
		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1202</guid>
		<description><![CDATA[Для тех, кто не знает что такое YUI ссылка на мат. часть Это библиотека классов для разработчиков. В этой статье я хочу поговорить о том, как ее использовать. А точнее как использовать ту ее часть которая выводит DHTML календарик Демо, конечно же, можно глянуть вот тут, но оно далеко не полное... приходится собирать скрипт по [...]]]></description>
			<content:encoded><![CDATA[<p>Для тех, кто не знает что такое YUI ссылка на  <a href="http://developer.yahoo.com/yui/" rel="nofollow external">мат. часть</a></p>

<p>Это библиотека классов для разработчиков. В этой статье я хочу поговорить о том, как ее использовать. А точнее как использовать ту ее часть которая выводит DHTML календарик</p>
<span id="more-1202"></span>
<p>Демо, конечно же, можно глянуть вот тут, но оно далеко не полное... приходится собирать скрипт по частям из разных примеров</p>

<p>Итак вот такой html</p>

<pre><code class="html">
&lt;input type="text" size="15" name="calDate" id="calDate" value="" maxlength="30"  /&gt;
&lt;div id="calContainer"&gt;&lt;/div&gt;
&lt;button type="button" id="calShow"&gt;...&lt;/button&gt;
</code></pre>

<p>и начинаем подключать библиотеки</p>

<pre><code class="html">
&lt;script type="text/javascript" src="yui/yahoo/yahoo.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="yui/dom/dom.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="yui/event/event.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="yui/calendar/calendar.js"&gt;&lt;/script&gt;
</code></pre>

<p>и css без него ничего не выйдет</p>

<pre><code class="html">
&lt;link type="text/css" rel="stylesheet" href="yui/calendar/assets/calendar.css"&gt;
</code></pre>

<p>Потом создаем свой скрипт &lt;_script&gt;...&lt;/_script&gt; Все что я пишу дальше идет именно внутри этого тега</p>

<pre><code class="javascript">
/* 
Задача: нарисовать календарь, который появляется в указанном месте по нажатию на кнопку 
и исчезает после выбора даты, результат выбора попадает в форму в формате YYYY-MM-DD.
Субботу и воскресенье выбирать нельзя, прошедшие дни тоже. 
Ну и я думаю, не стоит заставлять пользователей учить албанский
*/

// создаем новую зону видимости YAHOO.calendar
YAHOO.namespace("calendar");

// создаем загрузчик

function init() {
    // создаем новый объект салендаря с именем cal и загружаем его в div calContainer
    YAHOO.calendar.cal = new YAHOO.widget.Calendar("cal","calContainer", { 
        // средние имена дней (по умолчанию длинные) 
        LOCALE_WEEKDAYS:"medium",
                 // минимальная дата - сегодня
                mindate: new Date(),
                // текущая дата сегодня
                pagedate: new Date() 
        });
	/* 
	массив параметров при создании можно вынести и отдельно как показано ниже но я решил показать оба способа
	*/

	YAHOO.calendar.cal.cfg.setProperty("START_WEEKDAY ",   1); // первый день недели - понедельник а не воскресенье

	// Русифицируем календарь
	YAHOO.calendar.cal.cfg.setProperty("MONTHS_SHORT",   ["янв", "фев", "мар", "апр", "май", "июн", "июл", "авг", "сен", "окт", "ноя", "дек"]); 
	YAHOO.calendar.cal.cfg.setProperty("MONTHS_LONG",    ["январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"]); 
	YAHOO.calendar.cal.cfg.setProperty("WEEKDAYS_MEDIUM",["вск", "пон", "втр", "срд", "чет", "пят", "суб"]); 
	YAHOO.calendar.cal.cfg.setProperty("WEEKDAYS_LONG",  ["воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота", "воскресенье"]); 

	// функция которая получает координаты html элемента
	var getAbsPos = function  (p) {
		var s = { x:0, y:0 };
		while (p.offsetParent)
		{
			s.x += p.offsetLeft;
			s.y += p.offsetTop;
			p = p.offsetParent;
		}
		return s;
	}

	// получаем координаты поля куда надо ввести дату и выводим на его месте календарь, можно выводить под или над ним
	var calCon = document.getElementById("calContainer");
	var calBut = document.getElementById("calDate");
	// функцию getAbsPos я обьясню чуть ниже
	calCon.style.top = getAbsPos(calBut).y + 'px';
	calCon.style.left = getAbsPos(calBut).x + 'px';

	// пишем обработчик события выбора дяты
	var handleSelect function (type,args,obj) {
		var year = date[0][0][0], month = date[0][0][1], day = date[0][0][2];
		
		var txtDate1 = document.getElementById("calDate");
		// формат даты YYYY-MM-DD
		txtDate1.value = year + "-" + month + "-" + day;
		
		// прячем календарь
		var txtCon = document.getElementById("calContainer");
		txtCon.style.display = "none";
	}

	// устанавливаем событие при выборе даты
	YAHOO.calendar.cal.selectEvent.subscribe(handleSelect, YAHOO.calendar.cal, true);
	YAHOO.calendar.cal.render();

	// перехват нажатия кнопки - вызов календаря
	YAHOO.util.Event.addListener("calShow", "click", YAHOO.calendar.cal.show, YAHOO.calendar.cal, true);

	// отключаем субботу и воскресенье
	var myCustomRenderer = function(workingDate, cell) { return YAHOO.widget.Calendar.STOP_RENDER; }
	YAHOO.calendar.cal.addWeekdayRenderer(7, myCustomRenderer);
	YAHOO.calendar.cal.addWeekdayRenderer(1, myCustomRenderer);

	YAHOO.calendar.cal.render();
}

</code></pre>

<p>вот и сказочке конец... а в следующей сказочке будет автокомплит с ajax для продвинутых</p>

<p>PS. вопросы не задавать, почту не писать, google вам поможет.</p>
<p>PSS. меня вот спросили чем эта библиотека лучше чем например <a href="http://www.dynarch.com/projects/calendar/" rel="nofollow external">вот эта</a> - ответ может и не чем, просто она есть!</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2006/11/27/yui-calendar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

