<?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; calendar</title>
	<atom:link href="http://mabp.kiev.ua/tag/calendar/feed/" rel="self" type="application/rss+xml" />
	<link>http://mabp.kiev.ua</link>
	<description>энтузиазм = 1/опыт © Старый Мавр</description>
	<lastBuildDate>Sat, 12 May 2012 07:40:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>jQuery UI: Customized datepicker</title>
		<link>http://mabp.kiev.ua/2009/08/11/jquery-ui-customized-datepicker/</link>
		<comments>http://mabp.kiev.ua/2009/08/11/jquery-ui-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;& 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> 

]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/08/11/jquery-ui-customized-datepicker/feed/</wfw:commentRss>
		<slash:comments>20</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 type="text/javascript" src="/content/js/jquery-ui-datepicker.js"></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>


<pre><code class="js">
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 
		})
	);
});
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2008/12/29/jquery-ui-datepicker/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>YUI: calendar</title>
		<link>http://mabp.kiev.ua/2006/11/27/yui-calendar/</link>
		<comments>http://mabp.kiev.ua/2006/11/27/yui-calendar/#comments</comments>
		<pubDate>Mon, 27 Nov 2006 13:15:14 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[calendar]]></category>
		<category><![CDATA[date]]></category>
		<category><![CDATA[YUI]]></category>

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

