<?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; jqueryUI</title>
	<atom:link href="http://mabp.kiev.ua/tag/jquery-ui/feed/" rel="self" type="application/rss+xml" />
	<link>http://mabp.kiev.ua</link>
	<description>Не вижу проблем, кроме лени! &#169; Старый Мавр</description>
	<lastBuildDate>Fri, 10 Sep 2010 00:35:02 +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>jQuery UI: Customized datepicker</title>
		<link>http://mabp.kiev.ua/2009/08/11/customized-datepicker/</link>
		<comments>http://mabp.kiev.ua/2009/08/11/customized-datepicker/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 19:49:35 +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[jqueryUI]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1104</guid>
		<description><![CDATA[Написать этот код меня подтолкнул комментарий, но идея сделать такую плюшку была давно.
Смысл простой до нельзя - надо на стандартном календаре выделять определенные дни. Стандартными средствами этого естественно сделать нельзя. Хачить ui.datepicker.js тоже нельзя, при этом желательно еще передавать список дней прямо в конструктор календаря. Нужно выкрутится, ну в общем как всегда.


Начинаем кое-как обживаемся в [...]]]></description>
			<content:encoded><![CDATA[<p>Написать этот код меня подтолкнул <a href="http://mabp.kiev.ua/2008/12/29/jquery-ui-datepicker/#comment-990">комментарий</a>, но идея сделать такую плюшку была давно.</p>
<p>Смысл простой до нельзя - надо на стандартном календаре выделять определенные дни. Стандартными средствами этого естественно сделать нельзя. Хачить ui.datepicker.js тоже нельзя, при этом желательно еще передавать список дней прямо в конструктор календаря. Нужно выкрутится, ну в общем как всегда.</p>
<span id="more-1104">
</span>
<p>Начинаем кое-как обживаемся в тех узких рамках в которые себя загнали - используем замыкания и делегацию и прочие малоиспользуемых плюшки типа функции apply и регулярных выражений.</p>
<pre>
<code class="javascript">

(function($) {


	/**
	 * autor: CTAPbIu_MABP
	 * email: ctapbiumabp@gmail.com
	 * site: http://mabp.kiev.ua/2009/08/11/customized-datepicker/
	 * license: MIT &#038; GPL
	 * last update: 11.08.2009
	 * version: 1.0
	 */


	// сохраняем старые функции
	var old_datepicker =  $.fn.datepicker;
	var old_generateHTML = $.datepicker._generateHTML;


	// и делигируем их новым
	$.datepicker._generateHTML = function(inst) {
		// получаем календарь ввиде raw-html
		var _generateHTML = old_generateHTML.apply(this, arguments),
		// выгребаем даты для этого календаря
		dates = inst.settings.hightlight.values;
		titles = inst.settings.hightlight.titles;


		// и начинаем расскрашивать
		for (var i in dates){
			if (dates[i].getFullYear() == inst.drawYear &#038;&#038; dates[i].getMonth() == inst.drawMonth){
				_generateHTML = _generateHTML.replace(
				// магия регулярок
				new RegExp('&lt;a class="([^"]+)" href="#"&gt;' + dates[i].getDate() + '&lt;/a&gt;','i'),
				function(link, classes){
					// еще больше магии
					return link.replace(classes, classes + ' ui-state-custom' + 
						(titles[i] ? '" title="'+ titles[i] : ''));
				});
			}
		}
		return _generateHTML;
	};


	// делегируем конструктор
	$.fn.datepicker = function(options){
		// новые опции преобразовываем к объекту
		options.hightlight = $.extend(
			{format:$.datepicker._defaults.dateFormat, values:[], titles:[], settings:{}},
			options.hightlight
		);


		// сразу превращаем даты в объекты типа Date для того чтобы сохранить 
		options.hightlight.values = $.map(options.hightlight.values, function(value){
			return $.datepicker.parseDate(options.hightlight.format, value, options.hightlight.settings);
		});


		return old_datepicker.apply(this, [options]);
	};
})(jQuery);

</code>
</pre>
<p>Сначала очень долго думал как же для каждого инстанса календаря сделать свою функцию generateHTML с замкнутыми датами, но потом обнаружил что разработчики тоже сильно не парились и все совали в $.data и я тоже решил этим воспользоваться. Как никак уже готовое решение и переиспользование кода.</p>
<p>Пока писал, обнаружил еще одно забавное недокументированую (кажется) функцию, оказывается есть отдельный CSS класс для выходных, к которому нет реализации. Вот я ее в пример и добавил.</p>
<script src="/content/source/jquery.calendar.js">
</script>
<style>

.ui-datepicker-week-end .ui-state-default{
       border: 1px solid #ffa1a1;
}
.ui-state-custom {
       border: 1px solid #f0f !important;
}

</style>
<script>

jQuery().ready(function($){
$("#datepicker").datepicker({
	firstDay: 1 , 
	hightlight : {
		format:"dd/mm/yy",
		values:["1/08/2009","5/08/2009","15/08/2009"],
		titles:["Рас","Два","Три"],
		settings:{}
	}
});
})

</script>
<div id="datepicker">
</div>
<p>Используется это все вот так.</p>
<pre>
<code class="css">

.ui-datepicker-week-end .ui-state-default{
       border: 1px solid #ffa1a1;
}
.ui-state-custom {
       border: 1px solid #f0f !important;
}

</code>
</pre>
<pre>
<code class="javascript">

$("#datepicker").datepicker({
	firstDay: 1 , 
	hightlight : {
		format:"dd/mm/yy",
		values:["1/08/2009","5/08/2009","15/08/2009"],
		titles:["Рас","Два","Три"],
		settings:{}
	}
});

</code>
</pre>
<p>Проще не бывает, а скачать можно <a href="http://mabp.kiev.ua/content/source/jquery.calendar.js">тут</a>
</p>
<br />
]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/08/11/customized-datepicker/feed/</wfw:commentRss>
		<slash:comments>20</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>jQuery 1.3.2 + jQueryUI 1.7.1</title>
		<link>http://mabp.kiev.ua/2009/03/20/jquery-132-jqueryui-171/</link>
		<comments>http://mabp.kiev.ua/2009/03/20/jquery-132-jqueryui-171/#comments</comments>
		<pubDate>Fri, 20 Mar 2009 18:48:52 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Новости]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Разное]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jqueryUI]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=906</guid>
		<description><![CDATA[Вчера вышла новая версия jQueryUI 1.7.1 и я подумал что это хороший повод обновить сайт. Заодно поставил себе jQuery 1.3.2 вместо 1.3.1 и проверил на работоспособность все статьи. Больше всего я переживал что не будут работать DatePicker и Modal Dialog и Progress Bar и их придется равнять напильником, но все обошлось :).



Как я и обещал [...]]]></description>
			<content:encoded><![CDATA[<p>Вчера вышла новая версия <a href="http://blog.jqueryui.com/2009/03/jquery-ui-171/" rel="nofollow external">jQueryUI 1.7.1</a> и я подумал что это хороший повод обновить сайт. Заодно поставил себе jQuery 1.3.2 вместо 1.3.1 и проверил на работоспособность все статьи. Больше всего я переживал что не будут работать <a href="http://mabp.kiev.ua/2008/12/29/jquery-ui-datepicker/">DatePicker</a> и <a href="http://mabp.kiev.ua/2009/01/28/modal-dialog-and-progress-bar/">Modal Dialog и Progress Bar</a> и их придется равнять напильником, но все обошлось :).<br />
<div style="text-align:center">
<img src="/content/img/jquery.png" alt="jquery"/>
</div>
<p>Как я и обещал я держу все статьи на сайте свежими и актуальными!</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/03/20/jquery-132-jqueryui-171/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>jQuery UI: Modal Dialog и Progress Bar</title>
		<link>http://mabp.kiev.ua/2009/01/28/jquery-ui-modal-dialog-and-progress-bar/</link>
		<comments>http://mabp.kiev.ua/2009/01/28/jquery-ui-modal-dialog-and-progress-bar/#comments</comments>
		<pubDate>Wed, 28 Jan 2009 19:55:02 +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[jqueryUI]]></category>
		<category><![CDATA[Modal Dialog]]></category>
		<category><![CDATA[progress bar]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=578</guid>
		<description><![CDATA[Сегодня будет вторая статья из цикла о jQueryUI. На самом деле я не хочу вам рассказывать про Modal Dialog и Progress Bar, просто потому что я готовил эту статью с чувством что меня наебали. Наебали тем что оба эти виджета абсолютны не пригодны к реальному использованию, и если Modal Dialog еще как-то можно простить отсутствие [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня будет вторая статья из цикла о <a href="http://mabp.kiev.ua/tag/jquery-ui/">jQueryUI</a>. На самом деле я не хочу вам рассказывать про Modal Dialog и Progress Bar, просто потому что я готовил эту статью с чувством что меня наебали. Наебали тем что оба эти виджета абсолютны не пригодны к реальному использованию, и если Modal Dialog еще как-то можно простить отсутствие у него свойства closeable, то отсутствие каких либо свойств кроме заполненности у ползунка простить нельзя.</p>
<span id="more-578">
</span>
<p>Итак приступим к трепанации. Делаем ползунок на модальном не закрывающемся окошке с отображением процентов. Первый хак касается именно незакрываеймости окошка, поскольку параметрами убрать кнопку "Х" никак нельзя, начинаем стучать в бубен.</p>
<script type="text/javascript" src="/content/examples/jquery-ui-modal-dialog-and-progress-bar.js">
</script>
<style>

.ui-progressbar-indicator{
	line-height:30px;
	position:absolute;
	text-indent:-15px;
	left:50%;
}
/* Перекрываем CSS сайта */
.ui-dialog-buttonpane{
	margin:0;
	padding:0;
}

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

// создаем новый див
var dialog = $("&lt;div/&gt;")
	// и делаем из него диалог с параметрами
	.dialog({modal:true,title:"Заголовок",resizable:false,
		// делаем недоступной остальные элементы страницы
		overlay:{backgroundColor:'#000',opacity: 0.5,
		// одну кнопку все же добавим чтоб можно было все это безобразие закрыть
		buttons:{OK:function(){$(this).dialog('destroy').remove();}}
	})
	.parent()
	// вот он крестик :)
	.find(".ui-dialog-titlebar-close")
	.hide();

</code>
</pre>
<input type="button" id="example1" value="Позырить результат"/>
<p>Родительский элемент приходиться брать потому что текущий указывает на тот див из которого мы построили Modal Dialog, а находиться он в самом центра этого самого Modal Dialog'a, чтобы текст этого дива сразу стал сообщением. В принципе удобно, но у нас тут немного другой случай.</p>
<p>Второй хак - это прикручивание индикатора с цифрами, положим его в верхний слой относительно полоски, для этого немного пошаманим с <a href="http://mabp.kiev.ua/category/programming/css/">CSS</a>. </p>
<pre>
<code class="css">

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

</code>
</pre>
<pre>
<code class="javascript">

// это будет цифровой индикатор
var indicator = $("&lt;div/&gt;")
	.addClass("ui-progressbar-indicator")
	.text("50%")
	.appendTo(dialog),
// а это - ползунок
progressbar = $("&lt;div/&gt;")
	.progressbar({value:50})
	.appendTo(dialog);

</code>
</pre>
<input type="button" id="example2" value="Позырить результат"/>
<p>Ну вот почти все готово, осталось собрать это все вместе и присоединить к какому то медленному процессу, индикацию которого мы будем показывать. К сожалению самый лакомый процесс загрузки файла мы не можем показать поэтому поставим обновление индикатора просто на таймер, по 10% каждые пол секунды. Когда процесс достигнет 100% модальное окошко просто исчезнет и страницей снова можно будет пользоваться :)</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;Modal Dialog + Progress Bar&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),
	// и ползунком
	progressbar = $("&lt;div/&gt;")
		.progressbar({value:0,change:function(event,ui){indicator.text(counter+"%")}})
		.appendTo(dialog),
	// имитируем длительный процесс
	interval = setInterval(function () {
		// инкреминтируем счетчик
		counter+=10;
		// двигаем ползунок
		progressbar.progressbar("value",counter);
		// и если достигли конца
		if (counter == 100) {
			// убираем цикл
			clearInterval(interval);
			// но ждем еще пол секунды перед тем
			setTimeout(function(){
				// как разрушить индикатор, диалог и ползунок
				progressbar.progressbar("destroy");
				dialog.dialog("destroy").remove();
			},500);


		}
	}, 500);
});
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;/body&gt;
&lt;/html&gt;

</code>
</pre>
<input type="button" id="example3" value="Позырить результат"/>
<p>PS: Как выяснилось при подготовке статьи метод "destroy" не до конца разрушает созданый "на лету" div и после него надо еще вызывать метод "remove", чтобы не засорять html.</p>
<br />
]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/01/28/jquery-ui-modal-dialog-and-progress-bar/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>jQuery UI: DatePicker</title>
		<link>http://mabp.kiev.ua/2008/12/29/jquery-ui-datepicker/</link>
		<comments>http://mabp.kiev.ua/2008/12/29/jquery-ui-datepicker/#comments</comments>
		<pubDate>Mon, 29 Dec 2008 21:12:01 +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[calendar]]></category>
		<category><![CDATA[date]]></category>
		<category><![CDATA[jqueryUI]]></category>

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


Давайте обрисуем наши потребности: нам нужен сдвоенный календарик выбора периода, чтобы дата [...]]]></description>
			<content:encoded><![CDATA[<p>По результатам сегодняшнего труда решил написать небольшую обучаловку, которая я надеюсь станет первой из цикла статей про jQuery UI. Начнем я думаю с того, что констатируем, что все примеры в <a href="http://ui.jquery.com/repository/tags/latest/demos/functional/#ui.datepicker" rel="nofollow external">мануале</a>  немного недостаточны для создания полнофункционального работающего приложения, поэтому нужны такие вот обучаловки.</p>
<span id="more-316">
</span>
<p>Давайте обрисуем наши потребности: нам нужен сдвоенный календарик выбора периода, чтобы дата начала периода не была больше даты конца периода и меньше какой-то границы, соответственно дата конца периода не должна быть меньше даты начала и больше сегодняшней. Для этого я набросал вот такой лаконичный код.</p>
<script>

jQuery().ready(function($){
	$(":input[name='fromDate'], :input[name='toDate']")
		.val($.datepicker.formatDate('dd/mm/yy', new Date()))
		.datepicker($.extend($.datepicker.regional['ru'], { 
			beforeShow: function (input) { 
				return {
					minDate: (input.name == "toDate" 
						? $(":input[name='fromDate']").datepicker("getDate") 
						: $.datepicker.parseDate("dd/mm/yy", "01/01/2009") ), 
					maxDate: (input.name == "fromDate" 
						? $(":input[name='toDate']").datepicker("getDate") 
						: new Date() )
				}; 
			}, 
			dateFormat: "dd/mm/yy", 
			buttonImage: "/content/img/calendar.gif", 
			showOn: "both",
			buttonImageOnly: true 
		})
	);
});

</script>
<div style="text-align:center;">c  <input type="text" name="fromDate" size="12" readonly="readonly"/> по <input type="text" name="toDate" size="12" readonly="readonly"/>
</div>
<br />
<pre>
<code class="html">

&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;Datapicker&lt;/title&gt;
&lt;script src="jquery-1.3.2.js"&gt;&lt;/script&gt;
&lt;script src="ui/i18n/ui.datepicker-ru.js"&gt;&lt;/script&gt;
&lt;script src="ui/ui.datepicker.js"&gt;&lt;/script&gt;
&lt;link href="themes/smoothness/ui.core.css" rel="stylesheet" type="text/css" media="all" /&gt;
&lt;link href="themes/smoothness/ui.theme.css" rel="stylesheet" type="text/css" media="all" /&gt;
&lt;link href="themes/smoothness/ui.datepicker.css" rel="stylesheet" type="text/css" media="all" /&gt;


&lt;script&gt;
jQuery().ready(function($){
	// двум полям ввода
	$(":input[name='fromDate'], :input[name='toDate']")
		// устанавливаем начальное значение (текущую дату)
		.val($.datepicker.formatDate('dd/mm/yy', new Date()))
		// и добавляем календарик, которому в виде опций передаем 
		// русскую локализацию объединенную с массивом настроек
		.datepicker($.extend({}, {
 			// в call-back функции перед показом задаем доступный для выбора период
			beforeShow: function (input) { 
				return {
					// формируем верхнюю границу
					minDate: (input.name == "toDate" 
						// если не выбрана дата на втором календаре
						? $(":input[name='fromDate']").datepicker("getDate")
 						// берем нижнюю границу
						: $.datepicker.parseDate("dd/mm/yy", "01/01/2009") ), 
					// формируем нижнюю границу
					maxDate: (input.name == "fromDate" 
						// если не выбрана дата на первом календаре
						? $(":input[name='toDate']").datepicker("getDate") 
 						// берем сегодняшнюю дату
						: new Date())
				}; 
			}, 
			// задаем формат даты
			dateFormat: "dd/mm/yy", 
			// указываем путь к картинке
			buttonImage: "themes/smoothness/images/calendar.gif", 
			// показываем картинку возле обоих input'ов
			showOn: "both",
			// убираем кнопку из под картинки
			buttonImageOnly: true 
		})
	);
});
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
c  &lt;input type="text" name="fromDate" size="12" readonly="readonly"/&gt;
по &lt;input type="text" name="toDate" size="12" readonly="readonly"/&gt;
&lt;/body&gt;
&lt;/html&gt;

</code>
</pre>
<br />
]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2008/12/29/jquery-ui-datepicker/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>
