PageSourceSearch

https://voenchast.ru/local/templates/voenchast/js/tcal/tcal.js?166624702411829

js voenchast.ru collected 2026-10-09 22:39:23 UTC 11,829 bytes, 364 lines download raw bytes

1// Tigra Calendar v5.2 (11/20/2011)
2// http://www.softcomplex.com/products/tigra_calendar/
3// License: Public Domain... You're welcome.
4
5// default settins - this structure can be moved in separate file in multilangual applications
6var A_TCALCONF = {
7	'cssprefix'  : 'tcal',
8	'months'     : ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],
9	'weekdays'   : ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс'],
10	'longwdays'  : ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
11	'yearscroll' : true, // show year scroller
12	'weekstart'  : 0, // first day of week: 0-Su or 1-Mo
13	'prevyear'   : 'Предыдущий год',
14	'nextyear'   : 'Следующий год',
15	'prevmonth'  : 'Предыдущий месяц',
16	'nextmonth'  : 'Следующий месяц',
17	'format'     : 'd.m.Y' // 'd-m-Y', Y-m-d', 'l, F jS Y'
18};
19
20var A_TCALTOKENS = [
21	 // A full numeric representation of a year, 4 digits
22	{'t': 'Y', 'r': '19\\d{2}|20\\d{2}', 'p': function (d_date, n_value) { d_date.setFullYear(Number(n_value)); return d_date; }, 'g': function (d_date) { var n_year = d_date.getFullYear(); return n_year; }},
23	 // Numeric representation of a month, with leading zeros
24	{'t': 'm', 'r': '0?[1-9]|1[0-2]', 'p': function (d_date, n_value) { d_date.setMonth(Number(n_value) - 1); return d_date; }, 'g': function (d_date) { var n_month = d_date.getMonth() + 1; return (n_month < 10 ? '0' : '') + n_month }},
25	 // A full textual representation of a month, such as January or March
26	{'t': 'F', 'r': A_TCALCONF.months.join('|'), 'p': function (d_date, s_value) { for (var m = 0; m < 12; m++) if (A_TCALCONF.months[m] == s_value) { d_date.setMonth(m); return d_date; }}, 'g': function (d_date) { return A_TCALCONF.months[d_date.getMonth()]; }},
27	 // Day of the month, 2 digits with leading zeros
28	{'t': 'd', 'r': '0?[1-9]|[12][0-9]|3[01]', 'p': function (d_date, n_value) { d_date.setDate(Number(n_value)); if (d_date.getDate() != n_value) d_date.setDate(0); return d_date }, 'g': function (d_date) { var n_date = d_date.getDate(); return (n_date < 10 ? '0' : '') + n_date; }},
29	// Day of the month without leading zeros
30	{'t': 'j', 'r': '0?[1-9]|[12][0-9]|3[01]', 'p': function (d_date, n_value) { d_date.setDate(Number(n_value)); if (d_date.getDate() != n_value) d_date.setDate(0); return d_date }, 'g': function (d_date) { var n_date = d_date.getDate(); return n_date; }},
31	 // A full textual representation of the day of the week
32	{'t': 'l', 'r': A_TCALCONF.longwdays.join('|'), 'p': function (d_date, s_value) { return d_date }, 'g': function (d_date) { return A_TCALCONF.longwdays[d_date.getDay()]; }},
33	// English ordinal suffix for the day of the month, 2 characters
34	{'t': 'S', 'r': 'st|nd|rd|th', 'p': function (d_date, s_value) { return d_date }, 'g': function (d_date) { n_date = d_date.getDate(); if (n_date % 10 == 1 && n_date != 11) return 'st'; if (n_date % 10 == 2 && n_date != 12) return 'nd'; if (n_date % 10 == 3 && n_date != 13) return 'rd'; return 'th'; }}
35	
36];
37
38function f_tcalGetHTML (d_date) {
39
40	var e_input = f_tcalGetInputs(true);
41	if (!e_input) return;
42
43	var s_pfx = A_TCALCONF.cssprefix,
44		s_format = A_TCALCONF.format;
45
46	// today from config or client date
47	var d_today = f_tcalParseDate(A_TCALCONF.today, A_TCALCONF.format);
48	if (!d_today)
49		d_today = f_tcalResetTime(new Date());
50
51	// selected date from input or config or today 
52	var d_selected = f_tcalParseDate(e_input.value, s_format);
53	if (!d_selected)
54		d_selected = f_tcalParseDate(A_TCALCONF.selected, A_TCALCONF.format);
55	if (!d_selected)
56		d_selected = new Date(d_today);
57	
58	// show calendar for passed or selected date
59	d_date = d_date ? f_tcalResetTime(d_date) : new Date(d_selected);
60
61	var d_firstDay = new Date(d_date);
62	d_firstDay.setDate(1);
63	d_firstDay.setDate(1 - (7 + d_firstDay.getDay() - A_TCALCONF.weekstart) % 7);
64
65	var a_class, s_html = '<table id="' + s_pfx + 'Controls"><tbody><tr><td class="title2">'
66	+ A_TCALCONF.months[d_date.getMonth()] + ' ' + d_date.getFullYear()
67		+ (A_TCALCONF.yearscroll ? '<span class="niz_22"  onclick="f_niz_22()"></span></td>' : '')
68		+ '<td class="n2" id="' + s_pfx + 'PrevMonth"' + f_tcalRelDate(d_date, -1) + ' title="' + A_TCALCONF.prevmonth + '"><span></span></td><td><img src="/images/calc22.png" /></td>'
69		
70		+ '<td class="n3" id="' + s_pfx + 'NextMonth"' + f_tcalRelDate(d_date, 1) + ' title="' + A_TCALCONF.nextmonth + '"><span></span></td>'
71		+ (A_TCALCONF.yearscroll ? '' : '')
72		+ '</tr></tbody></table><table id="' + s_pfx + 'Grid"><tbody><tr>';
73
74	// print weekdays titles
75	for (var i = 0; i < 7; i++)
76		s_html += '<th class="nh">' + A_TCALCONF.weekdays[(A_TCALCONF.weekstart + i) % 7] + '</th>';
77	s_html += '</tr>' ;
78
79	// print calendar table
80	var n_date, n_month, d_current = new Date(d_firstDay);
81	while (d_current.getMonth() == d_date.getMonth() ||
82		d_current.getMonth() == d_firstDay.getMonth()) {
83
84		s_html +='<tr>';
85		for (var n_wday = 0; n_wday < 7; n_wday++) {
86
87			a_class = [];
88			n_date  = d_current.getDate();
89			n_month = d_current.getMonth();
90
91			if (d_current.getMonth() != d_date.getMonth())
92				a_class[a_class.length] = s_pfx + 'OtherMonth';
93			if (d_current.getDay() == 0 || d_current.getDay() == 6)
94				a_class[a_class.length] = s_pfx + 'Weekend';
95			if (d_current.valueOf() == d_today.valueOf())
96				a_class[a_class.length] = s_pfx + 'Today';
97			if (d_current.valueOf() == d_selected.valueOf())
98				a_class[a_class.length] = s_pfx + 'Selected';
99
100			s_html += '<td' + f_tcalRelDate(d_current) + (a_class.length ? ' class="' + a_class.join(' ') + '">' : '>') + n_date + '</td>';
101			d_current.setDate(++n_date);
102		}
103		s_html +='</tr>';
104	}
105	s_html +='</tbody></table>';
106
107	return s_html;
108}
109
110function f_tcalRelDate (d_date, d_diff, s_units) {
111
112	var s_units = (s_units == 'y' ? 'FullYear' : 'Month');
113	var d_result = new Date(d_date);
114	if (d_diff) {
115		d_result['set' + s_units](d_date['get' + s_units]() + d_diff);
116		if (d_result.getDate() != d_date.getDate())
117			d_result.setDate(0);
118	}
119	return ' onclick="f_tcalUpdate(' + d_result.valueOf() + (d_diff ? ',1' : '') + ')"';
120}
121
122function f_tcalResetTime (d_date) {
123	d_date.setMilliseconds(0);
124	d_date.setSeconds(0);
125	d_date.setMinutes(0);
126	d_date.setHours(12);
127	return d_date;
128}
129
130// closes calendar and returns all inputs to default state
131function f_tcalCancel () {
132	
133	var s_pfx = A_TCALCONF.cssprefix;
134	var e_cal = document.getElementById(s_pfx);
135	if (e_cal)
136		e_cal.style.visibility = '';
137	var a_inputs = f_tcalGetInputs();
138	for (var n = 0; n < a_inputs.length; n++)
139		f_tcalRemoveClass(a_inputs[n], s_pfx + 'Active');
140}
141
142function f_tcalUpdate (n_date, b_keepOpen) {
143
144	var e_input = f_tcalGetInputs(true);
145	if (!e_input) return;
146	
147	d_date = new Date(n_date);
148	var s_pfx = A_TCALCONF.cssprefix;
149
150	if (b_keepOpen) {
151		var e_cal = document.getElementById(s_pfx);
152		if (!e_cal || e_cal.style.visibility != 'visible') return;
153		e_cal.innerHTML = f_tcalGetHTML(d_date, e_input);
154	}
155	else {
156		e_input.value = f_tcalGenerateDate(d_date, A_TCALCONF.format);
157		f_tcalCancel();
158	}
159}
160function f_niz_22 () {
161	$('#tcalNextMonth').click();
162}
163
164
165
166
167
168
169function f_tcalOnClick () {
170
171	// see if already opened
172	var s_pfx = A_TCALCONF.cssprefix;
173	var s_activeClass = s_pfx + 'Active';
174	var b_close = f_tcalHasClass(this, s_activeClass);
175
176	// close all clalendars
177	f_tcalCancel();
178	if (b_close) return;
179
180	// get position of input
181	f_tcalAddClass(this, s_activeClass);
182	
183	var n_left = f_getPosition (this, 'Left'),
184		n_top  = f_getPosition (this, 'Top') + this.offsetHeight;
185
186	var e_cal = document.getElementById(s_pfx);
187	if (!e_cal) {
188		e_cal = document.createElement('div');
189		e_cal.onselectstart = function () { return false };
190		e_cal.id = s_pfx;
191		document.getElementsByTagName("body").item(0).appendChild(e_cal);
192	}
193	e_cal.innerHTML = f_tcalGetHTML(null);
194	e_cal.style.top = n_top + 'px';
195	e_cal.style.left = (n_left + this.offsetWidth - e_cal.offsetWidth) + 'px';
196	e_cal.style.visibility = 'visible';
197}
198
199function f_tcalParseDate (s_date, s_format) {
200
201	if (!s_date) return;
202
203	var s_char, s_regexp = '^', a_tokens = {}, a_options, n_token = 0;
204	for (var n = 0; n < s_format.length; n++) {
205		s_char = s_format.charAt(n);
206		if (A_TCALTOKENS_IDX[s_char]) {
207			a_tokens[s_char] = ++n_token;
208			s_regexp += '(' + A_TCALTOKENS_IDX[s_char]['r'] + ')';
209		}
210		else if (s_char == ' ')
211			s_regexp += '\\s';
212		else
213			s_regexp += (s_char.match(/[\w\d]/) ? '' : '\\') + s_char;
214	}
215	var r_date = new RegExp(s_regexp + '$');
216	if (!s_date.match(r_date)) return;
217	
218	var s_val, d_date = f_tcalResetTime(new Date());
219	d_date.setDate(1);
220
221	for (n = 0; n < A_TCALTOKENS.length; n++) {
222		s_char = A_TCALTOKENS[n]['t'];
223		if (!a_tokens[s_char])
224			continue;
225		s_val = RegExp['$' + a_tokens[s_char]];
226		d_date = A_TCALTOKENS[n]['p'](d_date, s_val);
227	}
228	
229	return d_date;
230}
231
232function f_tcalGenerateDate (d_date, s_format) {
233	
234	var s_char, s_date = '';
235	for (var n = 0; n < s_format.length; n++) {
236		s_char = s_format.charAt(n);
237		s_date += A_TCALTOKENS_IDX[s_char] ? A_TCALTOKENS_IDX[s_char]['g'](d_date) : s_char;
238	}
239	return s_date;
240}
241
242function f_tcalGetInputs (b_active) {
243
244	var a_inputs = document.getElementsByTagName('input'),
245		e_input, s_rel, a_result = [];
246
247	for (n = 0; n < a_inputs.length; n++) {
248
249		e_input = a_inputs[n];
250		if (!e_input.type || e_input.type != 'text')
251			continue;
252
253		if (!f_tcalHasClass(e_input, 'tcal'))
254			continue;
255
256		if (b_active && f_tcalHasClass(e_input, A_TCALCONF.cssprefix + 'Active'))
257			return e_input;
258
259		a_result[a_result.length] = e_input;
260	}
261	return b_active ? null : a_result;
262}
263
264function f_tcalHasClass (e_elem, s_class) {
265	var s_classes = e_elem.className;
266	if (!s_classes)
267		return false;
268	var a_classes = s_classes.split(' ');
269	for (var n = 0; n < a_classes.length; n++)
270		if (a_classes[n] == s_class)
271			return true;
272	return false;
273}
274
275function f_tcalAddClass (e_elem, s_class) {
276	if (f_tcalHasClass (e_elem, s_class))
277		return;
278
279	var s_classes = e_elem.className;
280	e_elem.className = (s_classes ? s_classes + ' ' : '') + s_class;
281}
282
283function f_tcalRemoveClass (e_elem, s_class) {
284	var s_classes = e_elem.className;
285	if (!s_classes || s_classes.indexOf(s_class) == -1)
286		return false;
287
288	var a_classes = s_classes.split(' '),
289		a_newClasses = [];
290
291	for (var n = 0; n < a_classes.length; n++) {
292		if (a_classes[n] == s_class)
293			continue;
294		a_newClasses[a_newClasses.length] = a_classes[n];
295	}
296	e_elem.className = a_newClasses.join(' ');
297	return true;
298}
299
300function f_getPosition (e_elemRef, s_coord) {
301	var n_pos = 0, n_offset,
302		e_elem = e_elemRef;
303
304	while (e_elem) {
305		n_offset = e_elem["offset" + s_coord];
306		n_pos += n_offset;
307		e_elem = e_elem.offsetParent;
308	}
309
310	e_elem = e_elemRef;
311	while (e_elem != document.body) {
312		n_offset = e_elem["scroll" + s_coord];
313		if (n_offset && e_elem.style.overflow == 'scroll')
314			n_pos -= n_offset;
315		e_elem = e_elem.parentNode;
316	}
317	return n_pos;
318}
319
320function f_tcalInit () {
321	
322	if (!document.getElementsByTagName)
323		return;
324
325	var e_input, a_inputs = f_tcalGetInputs();
326	for (var n = 0; n < a_inputs.length; n++) {
327		e_input = a_inputs[n];
328		e_input.onclick = f_tcalOnClick;
329		f_tcalAddClass(e_input, A_TCALCONF.cssprefix + 'Input');
330	}
331	
332	window.A_TCALTOKENS_IDX = {};
333	for (n = 0; n < A_TCALTOKENS.length; n++)
334		A_TCALTOKENS_IDX[A_TCALTOKENS[n]['t']] = A_TCALTOKENS[n];
335}
336
337function f_tcalAddOnload (f_func) {
338	if (document.addEventListener) {
339		window.addEventListener('load', f_func, false);
340	}
341	else if (window.attachEvent) {
342		window.attachEvent('onload', f_func);
343	}
344	else {
345		var f_onLoad = window.onload;
346		if (typeof window.onload != 'function') {
347			window.onload = f_func;
348		}
349		else {
350			window.onload = function() {
351				f_onLoad();
352				f_func();
353			}
354		}
355	}
356}
357
358
359
360
361
362f_tcalAddOnload (f_tcalInit);
363
364

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.