<?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; CSS</title>
	<atom:link href="http://mabp.kiev.ua/category/programming/css/feed/" rel="self" type="application/rss+xml" />
	<link>http://mabp.kiev.ua</link>
	<description>Не вижу проблем, кроме лени! &#169; Старый Мавр</description>
	<lastBuildDate>Tue, 07 Sep 2010 20:05:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<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/2010/03/05/simofor/</link>
		<comments>http://mabp.kiev.ua/2010/03/05/simofor/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 16:05:49 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[animation]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1220</guid>
		<description><![CDATA[Давно лежит в черновиках, и вот надумал опубликовать. Небольшой пример работы с анимацией на jquery


Все очень просто: при ошибке, например, загрузки данных с сервера вылазит маленькое окошечко с сообщением о том что произошла ошибка. Примерно так как на Хабре. Сообщение держиться 5 секунд после чего исчезает. Если на него не навести мышку, если навести то [...]]]></description>
			<content:encoded><![CDATA[<p>Давно лежит в черновиках, и вот надумал опубликовать. Небольшой пример работы с анимацией на jquery</p>
<span id="more-1220">
</span>
<p>Все очень просто: при ошибке, например, загрузки данных с сервера вылазит маленькое окошечко с сообщением о том что произошла ошибка. Примерно так как на Хабре. Сообщение держиться 5 секунд после чего исчезает. Если на него не навести мышку, если навести то снова появляеться даже если уже наполовину исчезло. Если на него кликнуть то будет держаться пока не кликнеш еще раз. Если сообщения два второе становиться под первое. К сожелению изза дизайна сайта тут положение высчитываеться вврху экрана и если проскролить чуток то оно чуть сползет, поэтому лучше всего смотриться в абсолютным позиционированием контента. Такое позиционирование есть если для создания сраницы исользовался <a href="http://mabp.kiev.ua/2009/12/10/ui-layout/">UI.Layout</a>, так что нужно откорректировать top и left.</p>
<pre>
<code class="javascript">

	function showMessage(text, error){
		var clicked = false;
		var self = $("&lt;div/&gt;",{
			css:{
				width : "200px",
				height : "60px",
				background : error ? "#ED6060" : "#60ED60",
				position : "relative",
				zIndex : 10,
				textAlign : "center",
				lineHeight : "60px",
				display : "none",
			},
			text : text,
			click : function(){
				clicked = !clicked;
			},
			mouseover : function(){
				self.stop(true, true).fadeIn("slow");
			},
			mouseout : function(){
			if (!clicked){
				self.stop(true, true).fadeOut("slow").queue(function(){
					self.remove();
				});
 			}
		}})
		.appendTo("body")
		.fadeIn("slow")
		.delay(5000)
		.fadeOut("slow")
		.queue(function(){
			self.remove();
		});
	}

</code>
</pre>
<p>Ну и на последок как водиться примерчик.</p>
<input type="text" name="message" value=""/>
<input type="checkbox" name="error" value=""/>
<select name="effect">
<option value="0">fadeIn/fadeOut</option>
<option value="1">slideDown/slideUp</option>
<option value="2">show/hide</option>
</select>
<select name="speed">
<option value="600">slow</option>
<option value="400">normal</option>
<option value="200">fast</option>
<option value="0">zero</option>
</select>
<input type="button" name="show" value="Click me!"/>
<script type="text/javascript">

jQuery(document).ready(function($){
	function showMessage(text, error){
		var effect = $("[name=effect]").val(),
		speed = parseInt($("[name=speed]").val()),
		clicked = false,
		self = $("<div/>",{
			css:{
				width : "200px",
				height : "60px",
				background : error ? "#ED6060" : "#60ED60",
				position : "relative",
				top: document.documentElement.scrollTop,
				left: 0,
				zIndex : 10,
				textAlign : "center",
				lineHeight : "60px",
				display : "none",
			},
			text : text,
			click : function(){
				clicked = !clicked;
			},
			mouseover : function(){
				self.stop(true, true).fadeIn("slow");
			},
			mouseout : function(){
			if (!clicked){
				self.stop(true, true).fadeOut("slow").queue(function(){
					self.remove();
				});
 			}
		}})
		.appendTo("#qwerty")
		[['fadeIn','slideDown','show'][effect]](speed)
		.delay(5000)
		[['fadeOut','slideUp','hide'][effect]](speed)
		.queue(function(){
			self.remove();
		});
	}
	$("<div/>",{
		id : "qwerty",
		css:{
			position : "absolute",
			top: 0,
			left: 0
		}
	}).appendTo("body");
	$("[name=show]").click(function(){
		showMessage($("[name=message]").val(),$("[name=error]").attr("checked"));
	});
});

</script> ]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/03/05/simofor/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>jQuery UI ThemeRoller Developer Tool</title>
		<link>http://mabp.kiev.ua/2009/12/11/jquery-ui-themeroller-developer-tool/</link>
		<comments>http://mabp.kiev.ua/2009/12/11/jquery-ui-themeroller-developer-tool/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 00:16:32 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[bookmarklet]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1157</guid>
		<description><![CDATA[Еще одна небольшая статья на сегодня... Я тут ради нее даже обновил шкурку wordpress'a и jQueryUI



Сегодня днем, когда качал новую тему для jQueryUI, заметил каку-то рекламку, меня она немного насторожила, я присмотрелся, и не зря мне предложили enlarge your penis size naturally only for 20$. Там было написано "Bring ThemeRoller into any page: Get the [...]]]></description>
			<content:encoded><![CDATA[<p>Еще одна небольшая статья на сегодня... Я тут ради нее даже обновил шкурку <a href="http://mabp.kiev.ua/tag/wordpress/">wordpress'a</a> и <a href="http://mabp.kiev.ua/tag/jquery-ui/">jQueryUI</a>
</p>
<span id="more-1157">
</span>
<p>Сегодня днем, когда качал новую тему для jQueryUI, заметил каку-то рекламку, меня она немного насторожила, я присмотрелся, и не зря <del>мне предложили enlarge your penis size naturally only for 20$</del>. Там было написано "Bring ThemeRoller into any page: <a href="http://jqueryui.com/themeroller/developertool/" rel="nofollow external">Get the ThemeRoller Firefox Bookmarklet!</a>", и что вы себе думаете это работает <del>всего за 20$ я увеличил свой член на 4 сантиметра</del>, но только в FireFox'e. После добавления в закладки и запуска, эта штука создает небольшой поп-апчик, в котором можно менять настройки текущей темы или даже саму тему.</p>
<p>Результат можно посмотреть прямо на этой странице, добавьте <a href="javascript:(function(){if(!/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)){alert('Sorry,due%20to%20security%20restrictions,%20this%20tool%20only%20works%20in%20Firefox');return%20false;};if(window.jquitr){jquitr.addThemeRoller();}else{jquitr={};jquitr.s=document.createElement('script');jquitr.s.src='http://jqueryui.com/themeroller/developertool/developertool.js.php';document.getElementsByTagName('head')[0].appendChild(jquitr.s);}})();" rel="nofollow">этот линк</a> в закладки и запустите, а вот календарик для просмотра эффекта</p>
<script type="text/javascript">

jQuery(document).ready(function($){
	$("#datepicker").datepicker();
});

</script>
<style>

#datepicker table,
#datepicker table tr td,
#datepicker table tr th {
border:none;
padding:1px;
}
.ui-datepicker{
margin:auto;
}

</style>
<div id="datepicker">
</div>
<p>Но меня как всегда волнует вопрос "как это работает?". Начинаем препарировать:</p>
<pre>
<code class="javascript">

(function() {
    if (!/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)) {
        alert('Sorry, due to security restrictions, this tool only works in Firefox');
        return false;
    }
    ;
    if (window.jquitr) {
        jquitr.addThemeRoller();
    } else {
        jquitr = {};
        jquitr.s = document.createElement('script');
        jquitr.s.src = 'http://jqueryui.com/themeroller/developertool/developertool.js.php';
        document.getElementsByTagName('head')[0].appendChild(jquitr.s);
    }
})();

</code>
</pre>
<p>Сам линк простой как три копейки: если фаерфокс то создает на странице новый скрипт. Какой?</p>
<pre>
<code class="javascript">

if(!window.jquitr){jquitr = {};}
jquitr.trString = '';
jquitr.s1 =document.createElement('script');
jquitr.s2 =document.createElement('script');
jquitr.s1.setAttribute('src','http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js');
jquitr.s2.setAttribute('src','http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.1/jquery-ui.min.js');
document.getElementsByTagName('head')[0].appendChild(jquitr.s1);
document.getElementsByTagName('head')[0].appendChild(jquitr.s2);
//once jq and ui are loaded...
jquitr.s1.onload = function(){
	jquitr.s2.onload = function(){
		jquitr.addThemeRoller();
	}
}
//add dev tool to page
jquitr.addThemeRoller = function(){
	if(jQuery('#inline_themeroller').size() &gt; 0){
		jQuery('#inline_themeroller').fadeIn();
	}
	else {
		jQuery('&lt;div id="inline_themeroller" style="display: none; position: fixed; background: #111; top: 25px; right: 25px; padding: 22px 0 15px 4px;width: 245px;height:400px; -webkit-border-radius: 6px; -moz-border-radius: 6px; z-index: 9999999;"&gt;'+
			'&lt;a href="#" class="closeTR" style="font-family: Verdana, sans-serif; font-size: 10px; display: block; position: absolute; right: 0; top: 2px; text-align: right; background: url(http://jqueryui.com/themeroller/developertool/icon_bookmarklet_close.gif) 0 2px no-repeat; width: 16px;height: 16px; color: #fff; text-decoration: none;" title="Close ThemeRoller"&gt;&lt;/a&gt;'+
			'&lt;iframe name="trApp" src="http://jqueryui.com/themeroller/developertool/appinterface.php" style="background: transparent; overflow: auto; width: 240px;height:100%;border: 0;" frameborder="0" &gt;&lt;/iframe&gt;'+
			'&lt;/div&gt;')
			.appendTo('body')
			.draggable({
				start: function(){
					jQuery('&lt;div id="div_cover" /&gt;').appendTo('#inline_themeroller').css({width: jQuery(this).width(), height: jQuery(this).height(), position: 'absolute', top: 0, left:0});
				},
				stop: function(){
					jQuery('#div_cover').remove();
				},
				opacity: 0.6,
				cursor: 'move'
			})
			.resizable({
				start: function(){
					jQuery(this).find('iframe').hide();
				},
				stop: function(){
					jQuery(this).find('iframe').show();
				},
				handles: 's'
			})
			.find('a.closeTR').click(function(){
				jquitr.closeThemeRoller();
			})
			.end()
			.find('.ui-resizable-s').css({
				background: 'url(http://jqueryui.com/themeroller/developertool/icon_bookmarklet_dragger.gif) 50% 50% no-repeat',
				border: 'none',
				height: '14px',
				dipslay: 'block',
				cursor: 'resize-s',
				bottom: '-3px'
			})
			.end()
			.css('cursor', 'move')
			.fadeIn();
		}
		jquitr.reloadCSS();		
}
//close dev tool
jquitr.closeThemeRoller = function(){
	jQuery('#inline_themeroller').fadeOut();
};
//get current url hash
jquitr.getHash = function(){
	var currSrc = window.location.hash;
	if(currSrc.indexOf('#') &gt; -1){currSrc = currSrc.split('#')[1];}
	return currSrc;
};
//recursive reload call
jquitr.reloadCSS = function(){
	var currSrc = jquitr.getHash();
	if(jquitr.trString != currSrc &#038;&#038; currSrc != ''){
		jquitr.trString = currSrc;
		var cssLink = '&lt;link href="http://jqueryui.com/themeroller/css/parseTheme.css.php?'+ currSrc +'" type="text/css" rel="Stylesheet" /&gt;';
		//works for both 1.6 final and early rc's
		if( jQuery("link[href*=parseTheme.css.php], link[href=ui.theme.css]").size() &gt; 0){
			jQuery("link[href*=parseTheme.css.php]:last, link[href=ui.theme.css]:last").eq(0).after(cssLink);
		}
		else {
			jQuery("head").append(cssLink);
		}
		if( jQuery("link[href*=parseTheme.css.php]").size() &gt; 3){
			jQuery("link[href*=parseTheme.css.php]:first").remove();
		}
	}
	setTimeout(jquitr.reloadCSS, 1000);
}

</code>
</pre>
<p>В двух словах он загружает jQuery и jQueryUI (нах они, ведь и так есть, наверное). Большая половина кода загружает <a href="http://jqueryui.com/themeroller/developertool/appinterface.php" rel="nofollow external">iframe</a> с красивенькими табами и еще одной копией jQuery и jQueryUI (фак, их уже три!!!), так же она управляет самим поп-апом (ресайз, драг, анимация). Удивляет то что iframe имеет расширение .php , хотя может это для маскировки.</p>
<p>Теперь вернемся к скрипту, оставшаяся меньшая половина делает магию. Как вы знаете iframe не имеет доступа к странице, то есть напрямую ей управлять не может, он имеет доступ только к window.location.hash, это та часть URL которая называется якорь (anchor). Так вот когда я в iframe выбираю тему или меняю какой-то параметр текущей, он записывает в урл моего сайта нечто вроде</p>
<pre>

#ffDefault=Segoe+UI%2C+Arial%2C+sans-serif&#038;fwDefault=bold&#038;fsDefault=1.1em&#038;cornerRadius=6px&#038;bgColorHeader=333333&#038;bgTextureHeader=12_gloss_wave.png&#038;bgImgOpacityHeader=25&#038;borderColorHeader=333333&#038;fcHeader=ffffff&#038;iconColorHeader=ffffff&#038;bgColorContent=000000&#038;bgTextureContent=05_inset_soft.png&#038;bgImgOpacityContent=25&#038;borderColorContent=666666&#038;fcContent=ffffff&#038;iconColorContent=cccccc&#038;bgColorDefault=555555&#038;bgTextureDefault=02_glass.png&#038;bgImgOpacityDefault=20&#038;borderColorDefault=666666&#038;fcDefault=eeeeee&#038;iconColorDefault=cccccc&#038;bgColorHover=0078a3&#038;bgTextureHover=02_glass.png&#038;bgImgOpacityHover=40&#038;borderColorHover=59b4d4&#038;fcHover=ffffff&#038;iconColorHover=ffffff&#038;bgColorActive=f58400&#038;bgTextureActive=05_inset_soft.png&#038;bgImgOpacityActive=30&#038;borderColorActive=ffaf0f&#038;fcActive=ffffff&#038;iconColorActive=222222&#038;bgColorHighlight=eeeeee&#038;bgTextureHighlight=03_highlight_soft.png&#038;bgImgOpacityHighlight=80&#038;borderColorHighlight=cccccc&#038;fcHighlight=2e7db2&#038;iconColorHighlight=4b8e0b&#038;bgColorError=ffc73d&#038;bgTextureError=02_glass.png&#038;bgImgOpacityError=40&#038;borderColorError=ffb73d&#038;fcError=111111&#038;iconColorError=a83300&#038;bgColorOverlay=5c5c5c&#038;bgTextureOverlay=01_flat.png&#038;bgImgOpacityOverlay=50&#038;opacityOverlay=80&#038;bgColorShadow=cccccc&#038;bgTextureShadow=01_flat.png&#038;bgImgOpacityShadow=30&#038;opacityShadow=60&#038;thicknessShadow=7px&#038;offsetTopShadow=-7px&#038;offsetLeftShadow=-7px&#038;cornerRadiusShadow=8px

</pre>
<p>Тут уже его мониторит скрипт который по setTimeout каждую секунду проверяет не изменился ли window.location.hash и если да, то передает всю эту строку <a href="http://jqueryui.com/themeroller/css/parseTheme.css.php" rel="nofollow external">другому скрипту</a>, который знает как из этой каши сделать новую тему.</p>
<p>Новая тема добавляется в header страницы перекрывая прошлую. Единственное маленькое НО, если вы как я вставляли CSS файлы в средину страницы, непосредственно перед их использованием, то это нихера работать не будет. Надо чтобы старые файлы находились выше по коду чем новые. Именно поэтому мне сегодня пришлось поправить десяток статей и обновить шкурку вордпресса, так что если найдете какие-нибудь баги, не стесняйтесь пишите в каменты.</p>
<p>Непонятным осталось только одно - зачем эта штука хранить 3 последние загруженные темы ?! Что-то я не заметил механизма отката изменений...</p> ]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/12/11/jquery-ui-themeroller-developer-tool/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UI.Layout</title>
		<link>http://mabp.kiev.ua/2009/12/10/ui-layout/</link>
		<comments>http://mabp.kiev.ua/2009/12/10/ui-layout/#comments</comments>
		<pubDate>Thu, 10 Dec 2009 21:43:40 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[layout]]></category>
		<category><![CDATA[UI plugin]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1152</guid>
		<description><![CDATA[Обычно я так называю статьи в которых выкладываю собственные плагины, но сегодня не тот случай. Я буду рассказывать о плагине который написали Fabrizio Balliano и Kevin Dalman



Когда-то давно, когда только вышла первая бэтка YUI-Ext которая сейчас переросла в огромный фреймворк Ext JS, я увидел насколько красивыми могут быть лайауты ;) (кто знает как красиво перевести [...]]]></description>
			<content:encoded><![CDATA[<p>Обычно я так называю статьи в которых выкладываю собственные плагины, но сегодня не тот случай. Я буду рассказывать о плагине который написали <a href="http://fabrizioballiano.net/" rel="nofollow external">Fabrizio Balliano</a> и <a href="http://allpro.net/" rel="nofollow external">Kevin Dalman</a>
</p>
<span id="more-1152">
</span>
<p>Когда-то давно, когда только вышла первая бэтка YUI-Ext которая сейчас переросла в огромный фреймворк <a href="http://www.extjs.com/" rel="nofollow external">Ext JS</a>, я увидел насколько красивыми могут быть лайауты ;) (кто знает как красиво перевести это слово, согласно контексту, милости прошу в каменты).  Я скачал эту бэтку, сырую как подвал, открыл исходники блога Jack'a Slocum'a, потому что документации еще не было и наваял небольшой сайтик который НЕ стал моим блогом, как задумывалось, но перевернул мое отношение к javascript'y.</p>
<p>Работая в Инкоме, я хотел вернутся к этой красоте и простоте, но этот фреймворк идеально подходит для создания бизнес приложений с нуля и никаким боком не касался моего тогдашнего проекта - Киевстара. Раз выпало потрогать свежую версию Ext JS 2.3, когда к нам пришел проект от ГАИшников на создание веб-морды для базы данных угона. Куски того что получилось можно наблюдать <a href="http://mabp.kiev.ua/2009/06/12/cascading-comboboxes-on-gwt-extgwt-extjs-and-mysql/">тут</a> и <a href="http://mabp.kiev.ua/2009/04/12/gwt-extjs-connecting-to-mysql/">тут</a>
</p>
<p>А недавно я столкнулся с одним очень интересным дополнением к <a href="http://mabp.kiev.ua/tag/jquery-ui/">jQuery UI</a> и как вы поняли это был <a href="http://layout.jquery-dev.net/" rel="nofollow external">jQuery UI.Layout Plug-in</a>, который позволяет делать лайауты похожие на Ext JS. Конечно в силу молодости UI.Layout глючная и не много функциональная, но подает большие надежды. Под "не многофункциональностью" я понимаю отсутствие всяких всяких красивых плюшечек (табиков, кнопочек, менюшечек, панелек) как в Ext JS. Хотя это ведб не лайауты, а виджеты, правильно? UI.Layout интегрирована с табами  (их даже можно сортировать) и аккордеоном из jQuery UI, а также есть пример создания кнопок для открывания (стрелочка) и удерживания (кнопка) блока. Это уже хорошо :)</p>
<p>Вот пример плагина на стандартных настройках, без какого либа дополнительного CSS, больше примеров вы сможете посмотреть на сайте плагина.</p>
<style type="text/css">

.ui-layout-pane { /* all 'panes' */ 
	background:	#FFF; 
	border:		1px solid #BBB; 
	padding:	10px; 
	overflow:	auto;
} 
.ui-layout-resizer { /* all 'resizer-bars' */ 
	background: #DDD; 
} 
.ui-layout-toggler { /* all 'toggler-buttons' */ 
	background: #AAA; 
} 

</style>
<script type="text/javascript" src="/content/source/jquery.layout-1.3.0.rc29.4.js">
</script>
<script type="text/javascript">

jQuery(document).ready(function($) {
	myLayout = $("#myLayout").layout({ applyDefaultStyles: true });
});

</script>
<div id="myLayout" style="width:500px;height:300px;margin:auto;">
<div class="ui-layout-center">
<b>Center pane</b>
</div>
<div class="ui-layout-north">North pane</div>
<div class="ui-layout-west">West pane</div>
<div class="ui-layout-south">South pane</div>
<div class="ui-layout-east">East pane</div>
</div>
<p>
<strong>Updated 17.08.10</strong>
</p>
<p>К сожалению все потуги авторов зарелизить версию 1.3 тщетны :( Плагин сейчас находиться в версии 1.3RC29.4. Но не смотря на это плагин очень приятен в использовании. Он поддерживает возможность создавать неограниченного количество вложенных лайаутов, на каждую анимацию есть по два call-back'a в начале и в конце события, в следующей версии будет I18N, зачатки которой уже есть сейчас, 78 настроек (включая call-back) для каждого блока, возможность сохранения состояния в куках и многое другое.</p>
<p>В общем как вы поняли я сейчас плотно работаю с этим плагином и несколькими другими, так что вполне вероятно ожидать от меня новостей с этой кухни.</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/12/10/ui-layout/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>jQuery scroll plugin</title>
		<link>http://mabp.kiev.ua/2009/07/03/jquery-scroll-plugin/</link>
		<comments>http://mabp.kiev.ua/2009/07/03/jquery-scroll-plugin/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 13:17:14 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[UI plugin]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1081</guid>
		<description><![CDATA[Нашел в понедельник плагин для mootools который заменяет обычную полосу прокрутки. Очень понравилась идея, и очень не понравилась реализация, ОЧЕНЬ много кода у чувака вышло на какой-то скроллинг. У меня был махонький опыт работы со скроллингом в плагине автокомплит и я решил переписать все с нуля на jQuery.
Идея была хорошая, реализация - гавно. Сидел писал... [...]]]></description>
			<content:encoded><![CDATA[<p>Нашел в понедельник <a href="http://greengeckodesign.com/projects/mooscroll/examples/example1/" rel="nofollow external">плагин</a> для mootools который заменяет обычную полосу прокрутки. Очень понравилась идея, и очень не понравилась реализация, ОЧЕНЬ много кода у чувака вышло на какой-то скроллинг. У меня был махонький опыт работы со скроллингом в плагине <a href="http://mabp.kiev.ua/2008/04/08/autocomplete/">автокомплит</a> и я решил переписать все с нуля на <a href="http://mabp.kiev.ua/tag/jquery/">jQuery</a>.</p>
<p>Идея была хорошая, реализация - гавно. Сидел писал... Разруливал грабли.</p>
<span id="more-1081">
</span>
<p>Началось все с чертовой верстки, ее как обычно не понял <a href="http://mabp.kiev.ua/tag/ie/">IE</a>, но там особых проблем не возникло, кое-что через скрипт поправил.</p>
<p>Первой неприятной граблей было отсутствие в <a href="http://mabp.kiev.ua/tag/jquery/">jQuery</a> поддержки колесика мишки, но плагин на этот случай нашелся очень быстро. Обожаю <a href="http://mabp.kiev.ua/tag/jquery/">jQuery</a> за огромное количество плагинов! И не смотря на то что плагин небольшой это уже давало лишний код и лишнюю зависимость для моего плагина. Не айс :(</p>
<p>Второй граблей стал ползунок, на него надо было натянуть drag. Тоесть перетаскивание, писать самому этот гемор я не решился, мне не настолько не хуй делать. Откуда взять драг? Правильно из <a href="http://mabp.kiev.ua/tag/jquery-ui/">jQuery UI</a>. Примастырил я его довольно легко, благо там все просто. Оказалось еще два дополнительных файла (core и draggable) и килобайты лишнего кода. Мне это очень не понравилось, но ничего поделать я не мог.</p>
<p>Этот же ползунок надо было перемещать под мышку при клике на полоску прокрутки. Как мудак, почти целый день втыкал в формулу зависимости высоты ползунка от длинны текста, координат ползунка на полосе прокрутки и пытался сместить его на половину его высоты вверх чтобы он попадал на мышку центром. Потом только понял что то координата ползунка не зависит от длины полоски и ничего смещать не надо, она зависит от места куда кликнули. Как тока понял все быстро срослось. О чем я написал <a href="http://mabp.kiev.ua/2009/07/02/maximum-minimum/">прошлую заметку</a>
</p>
<p>Ок, ползунок стал куда ему требовалось теперь надо было из скрипта активировать событие drag. Поначалу даже не знал с чего начать, пробовал вызывать события mousedown и mousemove по очереди, потом вызвать их оба сразу, никаких результатов. Полез в код UI разбираться. От туда как-то вытащил событие "mousedown.draggable", попытался его вызвать через trigger, получил ошибку о зациклившейся рекурсии. Долго ругался. Гуглил. Узнал что так можно было делать еще в версии 1.5.3, а теперь это перекрыли. Авторы советуют использовать <a href="http://jqueryjs.googlecode.com/svn/trunk/plugins/simulate/jquery.simulate.js" rel="nofollow external">плагин симуляции пользователя</a>. Долго ругался на дополнительный код, хотел из него что-то удалить, плюнул, поставил. Ура! Заработало. Потом уже во время написания статьи и проверки в <a href="http://mabp.kiev.ua/tag/ie/">IE</a> и других браузерах оказалось что работает этот чудо-плагин тока в <a href="http://mabp.kiev.ua/tag/firefox/">FireFox'e</a>. Н у и хуй с ним, всеравно в оригинальном плагине так не работало.</p>
<p>Пока гуглил решение проблемы с drag'ом нашел <a href="http://plugins.jquery.com/project/drag" rel="nofollow external">плагин</a> который реализовывает этот же функционал и вроде как гибче в настройках. Поставил, легче не стало, зато кода вроде уменьшилось и не надо использовать весь UI. В общем оставил в коде закомментированным кусок для подключения плагина. кто хочет может ебаться.</p>
<p>Так я похоже уже всех замариновал пиздежом не по теме. Выкладываю рабочий пример. Цацкайтесь.</p>
<div class="scroll" style="width:500px;">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut id eros eget dui tincidunt aliquam. Nulla mollis, erat suscipit pellentesque bibendum, nulla risus ultrices tellus, laoreet lobortis libero urna sit amet sem. Nunc placerat augue in felis condimentum fringilla. Mauris in sapien quis dolor sagittis pretium sit amet quis ante. Suspendisse elit arcu, pellentesque eget suscipit et, pharetra sit amet massa. Integer ut tortor sed tortor accumsan venenatis quis a ipsum. Aliquam erat volutpat. Mauris varius tincidunt tortor, sed feugiat enim lobortis eu. Aenean vitae metus augue, vel auctor mi. Cras sapien augue, interdum dignissim eleifend vel, porttitor eget ante. Cras feugiat varius ante, vel tincidunt quam congue ac. Aenean id purus nec diam sodales dignissim sit amet id turpis. Curabitur dignissim tincidunt euismod. Fusce euismod iaculis placerat. Donec consectetur ultrices semper. Pellentesque tellus ipsum, ultricies at fermentum sit amet, volutpat sit amet libero. Curabitur id lacus ipsum. Aliquam vulputate, est in mattis porttitor, lectus ante blandit turpis, vitae luctus felis purus vel libero.</p>
<p>Nulla velit augue, rutrum eu egestas rhoncus, aliquam at ante. Ut in dolor non orci malesuada commodo vitae non sem. Vestibulum quis neque ut massa tempus aliquet. Sed congue est sed arcu molestie consequat. Aenean eget dapibus lorem. Suspendisse tempor sem sit amet urna fermentum nec aliquam massa aliquet. Curabitur quis risus non est tincidunt congue id in neque. Nulla vel lorem ipsum. Nullam laoreet odio id nibh molestie sagittis eu ut ipsum. Donec ut risus vitae ante gravida lacinia. Integer quis enim massa. Donec ligula arcu, facilisis eget scelerisque et, dapibus non turpis. Maecenas quis orci tortor, sit amet porttitor leo.</p>
<p>Donec ullamcorper nisl dapibus mi semper non congue nunc luctus. Curabitur vitae erat neque, sed tincidunt arcu. Donec sodales rhoncus lectus et condimentum. Etiam dignissim odio a diam luctus congue. Nam vel tortor odio. Ut eu rutrum nibh. Pellentesque urna velit, laoreet quis semper eget, tempus non urna. Nam commodo turpis eget diam suscipit eget pulvinar diam auctor. Maecenas eu velit facilisis velit convallis vehicula vel sed nibh. Vivamus at ultricies justo. Ut eleifend libero eget leo varius sed aliquam turpis semper. Praesent dui sem, suscipit vel convallis et, pretium at dolor. Maecenas mollis pharetra metus, tempus luctus lacus tristique sit amet. Donec scelerisque ultrices varius.</p>
</div>
<p>Будет настроение буду доделывать... Уберу чертов плагин симуляции, всеравно не пашет... Потом там есть бага, когда сначала кликнул на полосу прокрутки, а потом на стрелку вверх, ползунок чуть вниз зъезжает. Посмотрим может не лень будет.</p>
<p>
<strong>Добавлено 04.06.09 в 2 ночи.</strong> После 2 часов дебага обнаружил что плагин симуляции пользователя корректно работает только если виджет расположен на первом экране, то есть сама страницы с виждетом не проскроллена. После чего все воспоминания про плагин были выкинуты из кода. Застрелите меня.</p>
<p>
<strong>Добавлено 05.06.09 в 12 ночи.</strong> Наконец-то доделал. Теперь скроллинг полностью имитирует поведение виндового скроллинга. И его можно применять не только к отдельному элементу но и ко всей странице.</p>
<pre>
<code class="javascript">

    jQuery().ready(function($) {
      $().jscroll(); // document
    });

</code>
</pre>
<p>Размер моего плагина (не сжатым) 6 424 байт, а размер оригинального 23 076. При этом размер всех подключаемых js файлов (сжатых) у jquery 91 725, а у mootools 96 157 байт.</p>
<p>
<strong>Добавлено 06.06.09 в 20:00.</strong> Добавлена поддержка IE 7 &#038; 8. В IE 6 неправильно возвращается свойство scrollHeight, поэтому скроллинг глючит.</p>
<p>Скачать сие чудо с примерами работы можно отсюда <a href="http://mabp.kiev.ua/content/source/jscroll/jscroll-3.zip">DOWNLOAD LINK</p>
<script src="/content/source/jscroll/jquery.mousewheel.js">
</script>
<script src="/content/source/jscroll/jquery.jscroll.js">
</script>
<link   href="/content/source/jscroll/jscroll.css"  type="text/css" rel="stylesheet">
<script type="text/javascript">

jQuery().ready(function($) {
	$(".scroll").jscroll({axis : {y:true,x:true}});
});

</script>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/07/03/jquery-scroll-plugin/feed/</wfw:commentRss>
		<slash:comments>76</slash:comments>
		</item>
		<item>
		<title>jQuery UI: Progress Bar with custom event</title>
		<link>http://mabp.kiev.ua/2009/03/26/jquery-ui-progress-bar-with-custom-event/</link>
		<comments>http://mabp.kiev.ua/2009/03/26/jquery-ui-progress-bar-with-custom-event/#comments</comments>
		<pubDate>Thu, 26 Mar 2009 14:29:21 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[animation]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jqueryUI]]></category>
		<category><![CDATA[progress bar]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=928</guid>
		<description><![CDATA[Начитался Брэндона Аарона и решил создать небольшое практическое пособие для начинающих по пользовательским событиям (custom events). Напомню что пользовательские события это такие же события как onclick только запускает их не браузер а сам jQuery. Такими событиями являются, например, события "mouseenter", "mouseleave", "ready" и целый набор ajax'овых событий.

jQuery также дает возможность создавать пользовательские события, чем я [...]]]></description>
			<content:encoded><![CDATA[<p>Начитался <a href="http://brandonaaron.net/blog/2009/03/26/special-events" rel="nofollow external">Брэндона Аарона</a> и решил создать небольшое практическое пособие для начинающих по пользовательским событиям (custom events). Напомню что пользовательские события это такие же события как onclick только запускает их не браузер а сам <a href="http://mabp.kiev.ua/tag/jquery/" title="jQuery">jQuery</a>. Такими событиями являются, например, события "mouseenter", "mouseleave", "ready" и целый набор <a href="http://docs.jquery.com/Ajax_Events" rel="nofollow external">ajax'овых событий</a>.<br />
<p>
<a href="http://mabp.kiev.ua/tag/jquery/" title="jQuery">jQuery</a> также дает возможность создавать пользовательские события, чем я и воспользуюсь, создав собственное событие с помощью которого буду обновлять ползунок из <a href="http://mabp.kiev.ua/2009/01/28/modal-dialog-and-progress-bar/">Modal Dialog и Progress Bar</a>. Практическая польза от этого скрипта нулевая, но для демонстрации самое то что доктор прописал. На самом деле весь код описанный в событии можно перенести в стандартный callback 'change'. Итак задача: обновлять ползунок при помощи пользовательского события, при срабатывании события ползунок увеличивается и меняет цвет.</p>
<span id="more-928">
</span>
<script type="text/javascript">

jQuery().ready(function($){
	$("#example").click(function(){
		var counter = 0, 
		dialog = $("<div/>").dialog({modal:true,title:"Заголовок",overlay:{backgroundColor:'#000',opacity: 0.5}})
			.parent().find(".ui-dialog-titlebar-close").hide().end().end(),
		indicator = $("<div/>").addClass("ui-progressbar-indicator").text("0").appendTo(dialog),
		progressbar = $("<div/>").bind("myEvent", this, function(event,data){
				var c = data.counter,
				seed = Math.round(255*c/100),
				green = seed.toString(16),
				green = green.length == 1 ? "0"+green : green,
				red = (255 - seed).toString(16),
				red = red.length == 1 ? "0"+red : red;
				indicator.text(c+"%");
				$(this).progressbar("value",counter);
				$("div",this).css({background:"#"+red+green+"00"});
			})
			.progressbar({value:0})
			.appendTo(dialog),
		interval = setInterval(function () {
			counter+=1;
			progressbar.trigger("myEvent",{counter:counter});
			if (counter == 100) {
				clearInterval(interval);
				setTimeout(function(){
					progressbar.progressbar("destroy");
					dialog.dialog("destroy").remove();
					indicator.remove();
				},50);
			}
		}, 50);
	});
});

</script>
<style>

.ui-progressbar-indicator{
	line-height:30px;
	position:absolute;
	text-indent:-15px;
	left:50%;
}

</style>
<pre>
<code class="html">

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
&lt;head&gt;
&lt;title&gt;Progress Bar with custom event&lt;/title&gt;
&lt;script src="jquery-1.3.2.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.core.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.resizable.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.draggable.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.dialog.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.progressbar.js" type="text/javascript"&gt;&lt;/script&gt;


&lt;link href="themes/smoothness/ui.core.css" type="text/css" rel="stylesheet" /&gt;
&lt;link href="themes/smoothness/ui.theme.css" type="text/css" rel="stylesheet" /&gt;
&lt;link href="themes/smoothness/ui.resizable.css" type="text/css" rel="stylesheet" /&gt;
&lt;link href="themes/smoothness/ui.dialog.css" type="text/css" rel="stylesheet" /&gt;
&lt;link href="themes/smoothness/ui.progressbar.css" type="text/css" rel="stylesheet" /&gt;


&lt;style&gt;
.ui-progressbar-indicator{
	line-height:40px;
	position:absolute;
	text-indent:-20px;
	left:50%;
}
&lt;/style&gt;


&lt;script type="text/javascript"&gt;
jQuery().ready(function($){


	var counter = 0, 
	dialog = $("&lt;div/&gt;")
		.dialog({modal:true,title:"Заголовок",overlay:{backgroundColor:'#000',opacity: 0.5}})
		.parent().find(".ui-dialog-titlebar-close").hide().end().end(),
	indicator = $("&lt;div/&gt;").addClass("ui-progressbar-indicator").text("0").appendTo(dialog),
	// создаю пользовательское событие myEvent
	// вторым параметром можно передавать null потому что он не используеться в примере
	// но я предпочитаю передавать this, тут this является контекстом функцией переданой параметром в jQuery().ready
	// тоесть window, но если этот объект не window то это единственный способ получить к нему доступ.
	// пример такого использования можно посмотреть в плагине autocomplete
	progressbar = $("&lt;div/&gt;").bind("myEvent", this, function(event,data){
			// event.data хранит данные переданые при создании события
			// тоесть event.data == window
			// data хранит данные переданые при срабатывании события 
			// тоесть data == {counter:counter}
			var 	c = data.counter,
				// процет цвета который заполняет ползунок
				seed = Math.round(255*c/100),
				// в HEX
				green = seed.toString(16),
				// форматируем до двух знаков
				green = green.length == 1 ? "0"+green : green,
				// процент цвета который покидает ползунок
				red = (255 - seed).toString(16),
				// его тоже форматируем
				red = red.length == 1 ? "0"+red : red;
			// увеличиваез значение индикатора
			indicator.text(c+"%");
			// удлиняем ползунок
			$(this).progressbar("value",counter);
			// закрашиваем ползунок новым цветом
			$("div",this).css({background:"#"+red+green+"00"});
		})
		.progressbar({value:0})
		.appendTo(dialog),
	// имитируем длительный процесс
	interval = setInterval(function () {
		counter+=1;
		progressbar.trigger("myEvent",{counter:counter});
		if (counter == 100) {
			clearInterval(interval);
			setTimeout(function(){
				progressbar.progressbar("destroy");
				dialog.dialog("destroy");
				indicator.remove();
			},50);
		}
	}, 50);
});
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;


&lt;/body&gt;
&lt;/html&gt;

</code>
</pre>
<input type="button" id="example" value="Позырить результат"/>
<br />
<p>Более подробные комментарии можно посмотреть в <a href="http://mabp.kiev.ua/2009/01/28/modal-dialog-and-progress-bar/">Modal Dialog и Progress Bar</a>
</p>
<br />]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/03/26/jquery-ui-progress-bar-with-custom-event/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>jQuery UI: Google Gears local store setup</title>
		<link>http://mabp.kiev.ua/2009/03/25/jquery-ui-and-googlegears-local-store-setup/</link>
		<comments>http://mabp.kiev.ua/2009/03/25/jquery-ui-and-googlegears-local-store-setup/#comments</comments>
		<pubDate>Wed, 25 Mar 2009 13:31:31 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[animation]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jqueryUI]]></category>
		<category><![CDATA[Modal Dialog]]></category>
		<category><![CDATA[progress bar]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=926</guid>
		<description><![CDATA[В одной из прошлых статей я рассказывал как совместить Modal Dialog и Progress Bar, теперь пришло время рассказать как это можно использовать. Есть такая штука как Google Gears это интернет акселератор предназначенный по большому счету для продуктов самого Google, таких как почта, календарь, ридер и т.д. Но Google предоставляет возможность устанавливать акселератор и на сторонние [...]]]></description>
			<content:encoded><![CDATA[<p>В одной из прошлых статей я рассказывал как совместить <a href="http://mabp.kiev.ua/2009/01/28/modal-dialog-and-progress-bar/">Modal Dialog и Progress Bar</a>, теперь пришло время рассказать как это можно использовать. Есть такая штука как <a href="http://mabp.kiev.ua/tag/google-gears/">Google Gears</a> это интернет акселератор предназначенный по большому счету для продуктов самого Google, таких как почта, календарь, ридер и т.д. Но Google предоставляет возможность устанавливать акселератор и на сторонние сайты, чем я сейчас и займусь. Самым простым видом акселерации является загрузка в кеш статических файлов, то есть картинок, скриптов и css стилей, хотя теоретически можно загружать и все остальное включая html самой страницы. Я покажу как сделать анимацию загрузки файлов в хранилище <a href="http://mabp.kiev.ua/tag/google-gears/">Google Gears</a>.</p>
<span id="more-926">
</span>
<p>Итак начну с начала, мне понадобиться <a href="http://code.google.com/intl/ru/apis/gears/gears_init.js" rel="nofollow external">скрипт</a> который инициализирует <a href="http://mabp.kiev.ua/tag/google-gears/">Google Gears</a>, он написан самим Google и является единственным официальным способом запустить <a href="http://mabp.kiev.ua/tag/google-gears/">Google Gears</a>, и <a href="http://mabp.kiev.ua/tag/jquery-ui/">jQuery UI</a> для создания модального диалога из прошлой статьи. Скрипт создаёт фабрику объектов с которой я буду работать дальше, хотя там и так подробно описано в комментариях. Дальше логика такая - нужно создать новый "склад" и передать все отобранные для кеширования файлы, обновляя после каждого файла ползунок загрузки. Поехали:</p>
<pre>
<code class="html">

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
&lt;head&gt;
&lt;title&gt;GoogleGears local store setup&lt;/title&gt;
&lt;script src="jquery-1.3.2.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.core.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.resizable.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.draggable.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.dialog.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="ui/ui.progressbar.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="http://code.google.com/intl/ru/apis/gears/gears_init.js" type="text/javascript"&gt;&lt;/script&gt;


&lt;link href="themes/smoothness/ui.core.css" type="text/css" rel="stylesheet" /&gt;
&lt;link href="themes/smoothness/ui.theme.css" type="text/css" rel="stylesheet" /&gt;
&lt;link href="themes/smoothness/ui.resizable.css" type="text/css" rel="stylesheet" /&gt;
&lt;link href="themes/smoothness/ui.dialog.css" type="text/css" rel="stylesheet" /&gt;
&lt;link href="themes/smoothness/ui.progressbar.css" type="text/css" rel="stylesheet" /&gt;
&lt;style&gt;
.ui-progressbar-indicator{
	line-height:40px;
	position:absolute;
	text-indent:-20px;
	left:50%;
}
&lt;/style&gt;
&lt;script type="text/javascript"&gt;
if(!window.console)
	console = {info:function(){}};


jQuery().ready(function($){
	// определяю все с чем буду работать
	var 
	localServer, // сервер
	localStore, // хранилище
	counter = 0, // итератор файлов
	percent = 0, // текущий процент
	store = "myStore", // имя хранилища
	filesToCapture = [  ], // список файлов


	// диалог 
	dialog = $("&lt;div/&gt;")
		// с параметрами но на этот раз без кнопки
		.dialog({modal:true,title:"Заголовок",overlay:{backgroundColor:'#000',opacity: 0.5}})
		// и без крестика
		.parent().find(".ui-dialog-titlebar-close").hide().end().end(),


	// с цифровым индикатором
	indicator = $("&lt;div/&gt;").addClass("ui-progressbar-indicator").text("0")
		.appendTo(dialog),


	// и ползунком
	progressbar = $("&lt;div/&gt;")
		// обновляю значение индикатора
		.progressbar({value:0,change:function(event,ui){indicator.text(percent+"%")}})
		.appendTo(dialog);


	try {
		// пробую создать локальный сервер
		localServer = google.gears.factory.create('beta.localserver');
		window.console.info('Ready!');
		// в нем локальное хранилище
		localServer.createStore(store);
		window.console.info('Created the store');
	} catch (e) {
		// при неудаче - выходим
		window.console.info(e.message);
		return;
	}


	// открываем хранилище
	localStore = localServer.openStore(store);
	// передаем в него список файлов
	localStore.capture(filesToCapture, function (url, success, captureId) {
		counter++;
		// считаем текущий процент
		percent = Math.round(counter/filesToCapture.length*100);
		// обновляем ползунок
		progressbar.progressbar("value",percent)
		// если все файлы закешированы чистим ненужное
		if (counter == filesToCapture.length) {
			progressbar.progressbar("destroy"); 
			dialog.dialog("destroy");
			indicator.remove();
		}
		// на всякий случай пишу все в лог
		window.console.info(url + ' captured ' + (success ? 'succeeded' : 'failed'));
	});
});


&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;/body&gt;
&lt;/html&gt;

</code>
</pre>
<p>Примера к сожалению не будет потому что даже если у когото из вас и установлен <a href="http://mabp.kiev.ua/tag/google-gears/">Google Gears</a>, то у меня нечего особо кешировать, можете посмотреть как выглядит анимация в статье <a href="http://mabp.kiev.ua/2009/01/28/modal-dialog-and-progress-bar/">Modal Dialog и Progress Bar</a>
</p>
<p>Конечно же интереснее было бы использовать ManagedResourceStore с манифестом, это дает возможность иметь сразу например несколько цветовых схем сайта, но тогда бы не получилось анимировать процесс загрузки.</p>
<br />
]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/03/25/jquery-ui-and-googlegears-local-store-setup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IE мертв. Да здравствует IE!!!</title>
		<link>http://mabp.kiev.ua/2009/03/21/ie-is-dead-long-live-the-ie/</link>
		<comments>http://mabp.kiev.ua/2009/03/21/ie-is-dead-long-live-the-ie/#comments</comments>
		<pubDate>Sat, 21 Mar 2009 15:05:50 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[IE]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=912</guid>
		<description><![CDATA[Все бы уже с радостью похоронили IE6, но сдается мне что не с нашим счастьем. Ведь MicroSoft досих пор тянут за собой мертвый груз IE5.5 засовывая в проекты типа SharePoint вот такие замечательные куски кода.





function DeferCall() {
	if (arguments.length == 0) {
		return null;
	}
	var args = arguments;
	var fn = null;
	if (browseris.ie5up &#124;&#124; browseris.nav6up) {
		eval("if (typeof(" + args[0] [...]]]></description>
			<content:encoded><![CDATA[<p>Все бы уже с радостью похоронили <a href="http://mabp.kiev.ua/tag/ie/">IE6</a>, но сдается мне что не с нашим счастьем. Ведь <a href="http://mabp.kiev.ua/tag/microsoft/">MicroSoft</a> досих пор тянут за собой мертвый груз <a href="http://mabp.kiev.ua/tag/ie/">IE5.5</a> засовывая в проекты типа SharePoint вот такие замечательные куски кода.</p>
<span id="more-912">
</span>
<pre>
<code class="javascript">

function DeferCall() {
	if (arguments.length == 0) {
		return null;
	}
	var args = arguments;
	var fn = null;
	if (browseris.ie5up || browseris.nav6up) {
		eval("if (typeof(" + args[0] + ")=='function') { fn=" + args[0] + "; }");
	}
	if (fn == null) { return null; }
	if (args.length == 1) {
	 return fn();
	} else if (args.length == 2) {
		return fn(args[1]);
	} else if (args.length == 3) {
		return fn(args[1], args[2]);
	} else if (args.length == 4) {
		return fn(args[1], args[2], args[3]);
	} else if (args.length == 5) {
		return fn(args[1], args[2], args[3], args[4]);
	} else if (args.length == 6) {
		return fn(args[1], args[2], args[3], args[4], args[5]);
	} else if (args.length == 7) {
		return fn(args[1], args[2], args[3], args[4], args[5], args[6]);
	} else if (args.length == 8) {
		return fn(args[1], args[2], args[3], args[4], args[5], args[6], args[7]);
	} else if (args.length == 9) {
		return fn(args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]);
	} else if (args.length == 10) {
		return fn(args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9]);
	} else {
		var L_TooManyDefers_Text = "Too many arguments passed to DeferCall"
		alert(L_TooManyDefers_Text);
	}
	return null;
}

</code>
</pre>
<p>А все потому что <a href="http://mabp.kiev.ua/tag/ie/">IE5.5</a> не поддерживает метод Function.apply .</p>
<p>Хотя <a href="http://mabp.kiev.ua/tag/ie/">IE6</a> достал уже всех, вот например Apple сделал себе такую  <a href="http://www.mac.com/1/browser_req.html" rel="nofollow external">страничку</a>, на которой предлагает скачать что-нибудь по современние. Выглядит красиво даже в <a href="http://mabp.kiev.ua/tag/ie/">IE6</a>, но если посмотреть код то там все перехачено вдоль и поперек.</p>
<p>Вот эта страничка меня натолкнула на мысль сверстать похожий "надгробничек" дляя своих целей, используя все то, что использовали разработчики Apple, только без хаков. Смотрите сами что из этого <a href="http://mabp.kiev.ua/content/source/noie/ie.html" rel="nofollow">получилось</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/03/21/ie-is-dead-long-live-the-ie/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Тестирование производительности селекторов jQuery</title>
		<link>http://mabp.kiev.ua/2009/02/21/testing-productivity-jquery-selectors/</link>
		<comments>http://mabp.kiev.ua/2009/02/21/testing-productivity-jquery-selectors/#comments</comments>
		<pubDate>Sat, 21 Feb 2009 15:11:59 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[perfomance]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=785</guid>
		<description><![CDATA[Всем известно что jQuery может все. Но далеко не всем известно что jQuery это может несколькими способами. Вот именно об этом я и хочу сегодня поговорить, а заодно проверить какой способ быстрее. Подвергну тестам вышедшую сегодня в свет jQuery 1.3.2, вставленную в страницу результатов Google, общий вес html файла чуть более чем 25кб, все возможные [...]]]></description>
			<content:encoded><![CDATA[<p>Всем известно что <a href="http://mabp.kiev.ua/tag/jquery/">jQuery</a> может все. Но далеко не всем известно что <a href="http://mabp.kiev.ua/tag/jquery/">jQuery</a> это может несколькими способами. Вот именно об этом я и хочу сегодня поговорить, а заодно проверить какой способ быстрее. Подвергну тестам вышедшую сегодня в свет <a href="http://mabp.kiev.ua/tag/jquery/">jQuery 1.3.2</a>, вставленную в страницу результатов Google, общий вес html файла чуть более чем 25кб, все возможные тэги в наличии. Еще хотелось бы акцентировать внимание на том что я не буду использовать псевдо-селектор :not() , так как смысловой нагрузки он не несет, хотя дает еще один способ выбрать элемент.</p>
<span id="more-785">
</span>
<p>Первым я протестирую контекст, проверять буду вот таким скриптом</p>
<pre>
<code class="javascript">

var start = new Date();
for(var i=0;i&lt;1000;i++)
	$....
var stop = new Date();
console.log(stop-start)

</code>
</pre>
<p>Я не будем добавлять ничего нового к коду Google, а только попробуем собрать коллекцию li.</p>
<style>

.myTbl td {border:1px solid #CCCCCC;}

</style>
<table class="myTbl">
<tr>
<td>$("li", document)</td>
<td>120</td>
</tr>
<tr>
<td>$("li", "ol")</td>
<td>220</td>
</tr>
</table>
<p>Вывод из первого эксперимента - сам по себе контекст это еще один поиск по DOM дереву, поэтому задавать контекст стоит только если второй запрос ограничит первый на столько что сэкономленное время будет больше чем время второго запроса, такого эффекта можно добиться например указав id родителя (не обязательного прямого) в контексте.</p>
<p>Второй пример покажет как лучше всего получить всех прямых потомков.</p>
<table class="myTbl">
<tr>
<td>$("ol>*")</td>
<td>1800+</td>
</tr>
<tr>
<td>$("ol>li")</td>
<td>215</td>
</tr>
<tr>
<td>$("ol").children("li")</td>
<td>330</td>
</tr>
</table>
<p>Не используйте звездочку - это не оправдано в 99.9% случаев (а в этом примере * возвращает еще и затесавшийся случайно элемент link) и не стоит без особой надобности использовать метод children - он тормозит.</p>
<p>В третьем примере я протестирую получение первого прямого потомка.</p>
<table class="myTbl">
<tr>
<td>$("ol>li:first")</td>
<td>375</td>
</tr>
<tr>
<td>$("ol>li:eq(0)")</td>
<td>380</td>
</tr>
<tr>
<td>$("ol>li").eq(0)</td>
<td>240</td>
</tr>
<tr>
<td>$("ol:first-child")</td>
<td>140</td>
</tr>
<tr>
<td>$("ol:nth-child(1)")</td>
<td>165</td>
</tr>
<tr>
<td>$("ol").children("li")</td>
<td>330</td>
</tr>
<tr>
<td>$("ol").find(":first-child")</td>
<td>1500+</td>
</tr>
<tr>
<td>$("ol").find(":nth-child(1)")</td>
<td>2600+</td>
</tr>
</table>
<p>Не могу найти разумного объяснения почему так тормозит find, но наверное на это есть какие-то причины. А еще интересна разница в использовании eq(0) как селектора и как метода - дольше в полтора раза.</p>
<p>Думаю стоит отвлечся от потомков и протестировать атрибуты. Вытащим input у которых type=radio</p>
<table class="myTbl">
<tr>
<td>$(":radio")</td>
<td>1500+</td>
</tr>
<tr>
<td>$("[type=radio]")</td>
<td>2400+</td>
</tr>
<tr>
<td>$("input:radio")</td>
<td>200</td>
</tr>
<tr>
<td>$("input[type=radio]")</td>
<td>240</td>
</tr>
<tr>
<td>$("input").filter("[type=radio]")</td>
<td>320</td>
</tr>
</table>
<p>Похоже фильтром тоже не стоит злоупотреблять, а псевдо-селекторы придуманы не только для удобства в написании</p>
<p>Ну и конечно надо доколупаться до классов а то было бы не честно</p>
<table class="myTbl">
<tr>
<td>$("[class^=gac]")<br />
<td>2700+<br />
</tr>
<tr>
<td>$(".gac_a, .gac_c, .gac_d, .gac_e, .gac_m")<br />
<td>1200+<br />
</tr>
<tr>
<td>$(".gac_a").add(".gac_c").add(".gac_d").add(".gac_e").add(".gac_m")<br />
<td>1100+</td>
</tr>
</table>
<p>Магия...</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/02/21/testing-productivity-jquery-selectors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ускоряем вставку в DOM дерево</title>
		<link>http://mabp.kiev.ua/2009/02/19/speed-up-dom-injection/</link>
		<comments>http://mabp.kiev.ua/2009/02/19/speed-up-dom-injection/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 21:31:33 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[perfomance]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=745</guid>
		<description><![CDATA[После написания прошлой статьи в котором рассказывал, как можно ускорить селекторы, объясняя внутреннее устройство jQuery, я решил написать еще один пост, в котором хочу объяснить как и почему можно ускорить вставку в DOM дерево. Я хочу углубиться в теорию того как jQuery обрабатывает переданный ей фрагмент html разметки на примере создания простого дива.


Пример первый - [...]]]></description>
			<content:encoded><![CDATA[<p>После написания <a href="http://mabp.kiev.ua/2009/02/07/speed-up-jquery-selectors/">прошлой статьи</a> в котором рассказывал, как можно ускорить селекторы, объясняя внутреннее устройство <a href="http://mabp.kiev.ua/tag/jquery/">jQuery</a>, я решил написать еще один пост, в котором хочу объяснить как и почему можно ускорить вставку в DOM дерево. Я хочу углубиться в теорию того как <a href="http://mabp.kiev.ua/tag/jquery/">jQuery</a> обрабатывает переданный ей фрагмент html разметки на примере создания простого дива.</p>
<span id="more-745">
</span>
<p>Пример первый - простой, я пробую создать пустой див. В обычном <a href="http://mabp.kiev.ua/tag/javascript/">JavaScript</a> это выглядело бы как одна строка</p>
<pre>
<code class="javascript">

document.createElement("div");

</code>
</pre>
<p>но сначала нужно убедиться что мы хотим создать именно пустой див</p>
<pre>
<code class="javascript">

// вызываем jQuery с селектором (а точнее с фрагментом html кода), без контекста
$("&lt;div/&gt;");

</code>
</pre>
<p>дальше идет общая часть для обоих примеров, мы получаем наш текст в переменную string и пытаемся определить что же получили</p>
<pre>
<code class="javascript">

// проверяем что мы получили html а не селектор
var html = /^[^&lt;]*(&lt;(.|\s)+&#038;gt)[^&gt;]*$|^#([\w-]+)$/.exec(string)
if(html &#038;&#038; (html[1] || !context)){
	// это для красоты
	html = html[1];
	// проверяем что наш html просто один тэг
	var tag = /^&lt;(\w+)\s*\/?&gt;$/.exec(html);
	if(tag[0])
		// создаем и возвращаем новый элемент
		return document.createElement(tag[0]);
}

</code>
</pre>
<p>Было бы крайне интересно, если бы можно было передавать еще и контекст в котором нужно создать элемент, тогда можно было бы не писать .appendTo(), но к сожалению это слишком сложно и накладывает кучу ограничений.</p>
<p>Второй пример - сложный, нам не просто надо создать див но надо добавить к нему свойство style и текст</p>
<pre>
<code class="javascript">

// вызываем jQuery
$("&lt;div style='position:absolute;'&gt;text&lt;/div&gt;");

</code>
</pre>
<p>Вторая проверка из прошлого фрагмента кода не пройдена и мы должны уточнить, что же надо создать, попутно создаем вспомогательный див который будет служить нам оберткой</p>
<pre>
<code class="javascript">

var div = context.createElement("div");

</code>
</pre>
<p>Приводим html к виду xhtml, это значит что если бы у нас была строка<br/>
<br />
&lt;div style='position:absolute;'/&gt;<br/>
<br />
то она превратилась бы в <br/>
<br />
&lt;div style='position:absolute;'&gt;&lt;/div&gt;<br/>
<br />
это не относиться к перечисленым тэгам</p>
<pre>
<code class="javascript">

html = html.replace(/(&lt;(\w+)[^&gt;]*?)\/&gt;/g, function(all, front, tag){
	return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
		all :
		front + "&gt;&lt;/" + tag + "&gt;";
});

</code>
</pre>
<p>Затем нужно проверить целостность html'a если мы пытаемся создать элементы которые изначально должны быть вложены в другие, то их следует сначала вложить а потом создать.</p>
<pre>
<code class="javascript">

var wrap =
	!tags.indexOf("&lt;opt") &#038;&#038;
	[ 1, "&lt;select multiple='multiple'&gt;", "&lt;/select&gt;" ] ||


	!tags.indexOf("&lt;leg") &#038;&#038;
	[ 1, "&lt;fieldset&gt;", "&lt;/fieldset&gt;" ] ||


	tags.match(/^&lt;(thead|tbody|tfoot|colg|cap)/) &#038;&#038;
	[ 1, "&lt;table&gt;", "&lt;/table&gt;" ] ||


	!tags.indexOf("&lt;tr") &#038;&#038;
	[ 2, "&lt;table&gt;&lt;tbody&gt;", "&lt;/tbody&gt;&lt;/table&gt;" ] ||


	(!tags.indexOf("&lt;td") || !tags.indexOf("&lt;th")) &#038;&#038;
	[ 3, "&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;", "&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;" ] ||


	!tags.indexOf("&lt;col") &#038;&#038;
	[ 2, "&lt;table&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;colgroup&gt;", "&lt;/colgroup&gt;&lt;/table&gt;" ] ||


	// IE не может сериализировать &lt;link&gt; и &lt;script&gt; тэги нормально
	!jQuery.support.htmlSerialize &#038;&#038;
	[ 1, "div&lt;div&gt;", "&lt;/div&gt;" ] ||


	[ 0, "", "" ];


div.innerHTML = wrap[1] + elem + wrap[2];

</code>
</pre>
<p>Ну и естественно обертки нам не нужны, мы их отбрасываем</p>
<pre>
<code class="javascript">

while ( wrap[0]-- )
	div = div.lastChild;

</code>
</pre>
<p>Если у нас было несколько элементов верхнего уровня <br/>
<br />
&lt;div&gt;text1&lt;/div&gt;&lt;div&gt;text2&lt;/div&gt;<br/>
<br />
мы бы это все еще разбили в массив, но так как мы этого не знаем и для однородности отдачи мы все равно это делаем</p>
<pre>
<code class="javascript">

array = Array.prototype.push.apply([], div.lastChild);

</code>
</pre>
<p>Статья изначально предполагалась для объяснения, почему для манипуляций с единичными элементами DOM лучше создавать пустые элементы, а потом методами <a href="http://mabp.kiev.ua/tag/jquery/">jQuery</a>  добавлять им свойства. </p>
<pre>
<code class="javascript">

$("&lt;div/&gt;").text("text")
// лучше чем ?
$("&lt;div&gt;text&lt;/div&gt;")

</code>
</pre>
<p>Но в ходе написания статьи было обнаружены интересные подробности: оказывается первый вариант выполняется, чуть более чем, вдвое дольше второго</p>
<pre>
<code class="javascript">

var start = new Date();
for(var i=0;i<1000;i++)
	$("&lt;div/&gt;").text("text")
var stop = new Date();
alert(stop-start) // 280


var start = new Date();
for(var i=0;i<1000;i++)
	$("&lt;div&gt;text&lt;/div&gt;")
var stop = new Date();
alert(stop-start) // 125

</code>
</pre>
<p>Я очень сильно удивился и посмотрел код метода .text() он попутно успевает вызвать метод .empty(), который очень широким жестом удаляет всех потомков текущей ноды. Теория начала с треском проваливаться, но не все методы используют .empty() и я составил табличку, какой метод, сколько времени выполняеться и картина снова стала меня радовать.</p>
<style>

.myTbl td {border:1px solid #CCCCCC;}

</style>
<table class="myTbl">
<tr>
<td>$("&lt;div&gt;text&lt;/div&gt;")</td>
<td>125</td>
</tr>
<tr>
<td>$("&lt;div/&gt;").text("text")</td>
<td>280</td>
</tr>
<tr>
<td>$("&lt;div/&gt;").html("text")</td>
<td>350</td>
</tr>
<tr>
<td>$("&lt;div attribute='value'/&gt;")</td>
<td>140</td>
</tr>
<tr>
<td>$("&lt;div/&gt;").css({property:value})</td>
<td>100</td>
</tr>
<tr>
<td>$("&lt;div/&gt;").attr({attribute:value})</td>
<td>95</td>
</tr>
<tr>
<td>$("&lt;div/&gt;").addClass("myClass")</td>
<td>75</td>
</tr>
<tr>
<td>$("&lt;input/&gt;").val("myValue")</td>
<td>70</td>
</tr>
</table>
<p>Хочу обратить ваше внимание на то что .css() это частный случай для .attr() поэтому работает чуть дольше, но лучше отображает суть происходящего.</p>
<p>Эксперимент доказал, что если требуеться создавать пустой элемент (по большей части это касаеться дивов), то всетаки лучше параметры передавать потом в методах. Это экономит до 50% времени. </p>
<p>ЗЫ: Я уже знаю что в каментах будут писать о том, что это экономия на спичках, но эта статья из большой и чистой теории и я никого не принуждаю так делать - делайте как удобнее.</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/02/19/speed-up-dom-injection/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
