PageSourceSearch

https://xn--b1aahbbav3bfjicbhi4kne.xn--p1ai/web/java/custom.js?ver=v165f3572be641f3062d190170730f7486

js xn--b1aahbbav3bfjicbhi4kne.xn--p1ai collected 2026-10-08 00:54:26 UTC 79,684 bytes, 2,603 lines download raw bytes

1$.fn.modal.Constructor.prototype.enforceFocus = function () {
2	modal_this = this
3	$(document).on('focusin.modal', function (e) {
4		if (modal_this.$element[0] !== e.target && !modal_this.$element.has(e.target).length
5			&& !$(e.target.parentNode).hasClass('cke_dialog_ui_input_select')
6			&& !$(e.target.parentNode).hasClass('cke_dialog_ui_input_text')) {
7			modal_this.$element.focus()
8		}
9	})
10};
11var tID = null; // идентификатор таймаута
12var intervals = []; //интервалы
13String.prototype.in_array = function (arr) {
14	for (var i = 0, l = arr.length; i < l; i++) {
15		if (arr[i] == this) { return true; }
16	}
17	return false;
18}
19Array.prototype.remove = function (value) {
20	var idx = this.indexOf(value);
21	if (idx != -1) { return this.splice(idx, 1); }
22	return false;
23}
24
25// получить значение cookie по имени
26function getCookie(name) {
27	var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
28	if (match) return match[2];
29}
30
31//первая буква заглавная, остальные нет
32function cap(input)
33{
34	return input.charAt(0).toUpperCase() + input.slice(1).toLowerCase();
35}
36
37//интервалы
38function class_intervals()
39{
40	intervals.push(setInterval(function () { infowidgets(".zchat", false); }, 60000)); //чат
41
42	intervals.push(setInterval(function () { prompt(); }, 90000)); //статус
43}
44
45
46//красивое оформление
47function class_nice()
48{
49
50		$(".fonts > option").each(
51			function(){
52				$(this).css("font-family",$(this).val());
53			}
54		)
55		//выбор цвета
56		$('.colorpickerField').ColorPicker({
57			onSubmit: function(hsb, hex, rgb, el) {
58				$(el).val("#"+hex);
59				$(el).ColorPickerHide();
60			},
61			onBeforeShow: function () {
62
63				$(this).ColorPickerSetColor(this.value);
64			},
65			onChange: function (hsb, hex, rgb, el) {
66				var textColor;
67				$(el).css('background-color', '#' + hex);
68				if (rgb.g < 140) textColor = '#FFFFFF';
69				else textColor = '#000000';
70				$(el).css('color', textColor);
71				$(el).val("#"+hex);
72			}
73		});
74
75		//автопрокрутка вниз
76		$(".scrolldown").each(
77			function()
78			{
79				$(this).scrollTop($(this).prop('scrollHeight'));
80				//$(this).animate({ scrollTop: $(this).children(":first").height() }, "fast");
81				  return false;
82			}
83		);
84	
85		//модальная картинка
86		$('.fancybox').off().fancybox({
87			prevEffect: 'none',
88			nextEffect: 'none',
89	
90			closeBtn: true,
91			arrows: true,
92			nextClick: true,
93	
94			helpers: {
95				thumbs: {
96					width: 50,
97					height: 50
98				}
99			}
100		});
101	
102		$('.nicescroll').off().niceScroll({mousescrollstep:20,scrollspeed:200,smoothscroll:false});
103
104		var dateformat = $('.calendar,.datepicker').attr("dateformat");
105		$('.calendar,.datepicker').not(".hasdatepicker").addClass("hasdatepicker").datepicker({
106			showButtonPanel: true,
107			dateFormat: dateformat ?  dateformat : 'yy-mm-dd',
108			closeText: 'Закрыть',
109			prevText: 'Пред',
110			nextText: 'След',
111			currentText: 'Сегодня',
112			monthNames: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь',
113				'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],
114			monthNamesShort: ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн',
115				'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'],
116			dayNames: ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'],
117			dayNamesShort: ['вск', 'пнд', 'втр', 'срд', 'чтв', 'птн', 'сбт'],
118			dayNamesMin: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
119			changeMonth: true,
120			changeYear: true,
121			showOtherMonths: true,
122			selectOtherMonths: true,
123			yearRange: "1930:2021"
124		});
125	
126		/*$('.calendar,.datepicker').inputmask(
127			{
128			mask: "99.99.9999",
129			alias: "date",
130			placeholder: "ДД/ММ/ГГГГ",
131			insertMode: false
132			}
133		);*/
134
135		$('.datetimepicker').not(".hasdatetimepicker").addClass("hasdatetimepicker").datetimepicker({
136			step: 5, format: 'Y-m-d H:i:s', lang: 'ru', withoutCopyright: true
137		});
138	
139	
140		$("textarea.cketextarea").not(".hascke").addClass("hascke").each(function () { CKEDITOR.replace($(this).attr("id")) });
141
142		$('.changes-select').not(".hasselectchangehandler").addClass("hasselectchangehandler").on("change blur", function () {
143			var obj = this;
144			var value = $(obj).val();
145			var namefield = $(obj).attr('name');
146			var target = $(obj).attr("target-change");
147			var targetcontainerid = $(obj).attr("target-container");
148			var form = $(this).closest('#imitationform');
149			if (form.length == 0) form = $(this).closest('form');
150			if (form.length == 0) return;
151			var targetcontainer = form.find('#' + targetcontainerid);
152			var div = $(this).closest('div.form-group');
153			var data = {}; data = $('form[name=menuitemform]').serialize();
154			var beforeselect = $(form).find('[this-target=' + target + ']');
155			var events = $._data(beforeselect.get(0), "events");
156			$.ajax({
157				url: form.attr('action'), type: 'POST', data: data,
158				beforeSend: function () { targetcontainer.html(spinner); },
159				success: function (html) {
160					var targetselect = $(html).find('[this-target=' + target + ']');
161					if (typeof events !== "undefined") {
162						if (typeof events["change"] !== "undefined") {
163							events["change"].forEach(function (item, i, arr) {
164								targetselect.change(item.handler)
165							});
166						}
167					}
168					targetcontainer.html(targetselect);
169					targetcontainer.find(targetselect).chosen({ allow_single_deselect: true });
170					targetcontainer.find(targetselect).trigger("change");
171				}
172			});
173		});
174
175		$('.changes-select.autostart').change();
176		$('.inputregexmask').not(".hasinputregexmask").addClass("hasinputregexmask").inputmask('Regex');
177		$('.inputmask').not(".hasinputmask").addClass("hasinputmask").inputmask();
178		$('select.chosen').not(".haschosen").addClass("haschosen").chosen();
179
180		autocomplete();
181		dropZoneInit(); // dz1
182
183		$(".dz2").each(function(){dz(this)}); //dz2
184
185
186}
187
188//события классов
189function class_events() {
190
191		//
192	$("body").on("click", ".fasttest", function(e){
193
194		if ($(this).attr("correct")==1) 
195			$(this).parent().addClass("bg-green");
196		else
197			$(this).parent().addClass("bg-red");
198		});
199
200	//
201	$("body").on("change", ".ajax_file", function(e){
202		ajax_file($(this));
203		});
204
205	//предотвратить обычный submit формы
206	$("body").on("submit", "form.dontsubmit", function(e){
207		e.preventDefault();
208		});
209
210	//оферта
211	$("body").on("submit", "form.ofertable", function(e){
212		show_modal(this,true);
213		e.preventDefault();
214		
215		$("#user_data_REGISTRATION").removeAttr("disabled");
216		});
217
218	$("body").on("focus blur", "input[type=text],input[type=password]", function(e){
219		if ($(this).is(":focus")) {
220			if ($(this).hasClass("scrollto")) SCROLL_TO($(this),$(".bcontent"));
221			$(".mobile-items").hide(); 
222		 } else $(".mobile-items").show();
223	});
224
225	$("body").on("click", ".lookingglass", function(e){
226		e.preventDefault();
227			ajax_asynq(window.location.href+"/",function(){
228				$('.simple_search_result').html(spinner)},
229				function(html){$('.simple_search_result').html(html);
230			},"word="+$(".lookingword").val());
231	});
232
233	$("body").on("keydown", "[name=user_data]", function(e){
234		if (e.keyCode == 13) 
235		{
236			e.preventDefault();
237			$(this).find(".enter").click();
238		}
239	});
240
241	$("body").on("keyup", ".waitenter", function(e){
242		if (e.keyCode == 13) 
243		{
244			$(this).blur();
245			$($(this).attr("submit")).click();
246		}
247	});
248
249	$("body").on("keydown", ".enter", function(e){
250		if (e.keyCode == 13) 
251		{
252			console.log('enter');
253			e.preventDefault();
254			$(this).blur();
255			$(this).click();
256		}
257	});
258
259	$("body").on("keyup", ".noenter", function(e){
260		if (e.keyCode == 13) 
261		{
262			e.preventDefault();
263		}
264	});
265
266	$("body").on("click", "button.loginneeded", function(){
267		curl("/session/referer:123","referer="+window.location.href);
268		confirm_modal3("/login/",false,"Закрыть",function(){});
269	});
270
271	$("body").on("click", "button.regneeded", function(){
272		location.href= `/main/registration/${$(this).attr('participant')}?redirect=${$(this).attr('redirect')}&passport=${$(this).attr('passport')}`;
273	});
274
275	$("body").on("click", "button.basket-button", function(){
276		var _this = this;
277		if (isNaN($(this).attr("passport"))) return;
278		ajax_asynq($(this).attr("link"), function() {
279		},function(data) {
280			var json = JSON.parse(data);
281			if (json.hasOwnProperty("exists")) 
282				serversuccess($(_this).attr("exists"));
283			else{
284				serversuccess($(_this).attr("success"));
285				$('#basket_cost').text(json["cost"]);
286				$('#basket_count').text(json["count"]);
287				if ($(_this).attr("reload")=="1") location.reload();
288			}
289
290		}, $(this).attr("post"));
291	});
292
293	$("body").on("change",".saveable",
294	function(event)
295	{
296		var value=$(this).val();
297		switch($(this).attr("type"))
298		{
299			case "checkbox":
300				value=$(this).prop("checked")?1:0;
301				break;
302			default:
303				value=$(this).val();
304		}
305		ajax_asynq($(this).attr("action"),function(){serversuccess('Сохранение...');},function(){serversuccess('Сохранено');},`idfield=${$(this).attr('idfield')}&${$(this).attr("property")}=${value}`);
306	}
307);
308
309	$("body").on("click",".informable",
310		function(event)
311		{
312				confirm_modal3($(this).attr('link'),"Отправить","Назад",function(){sendForm($('#3453454'));});
313		}
314	);
315
316	$("body").on("click",".hrefable",
317		function(event)
318		{
319			event.preventDefault();
320
321			window.open($(this).attr("_href"),$(this).attr("target"));
322			
323			prompt();
324		}
325	);
326
327	//$("*").not(".hasinputmask").off(); // очистка предыдущих
328
329		//отправка формы
330	$("body").on("click",".submitter",
331		function(e)
332		{
333			if (e.keyCode && e.keyCode != 13) return;
334			sendForm(this);
335		}
336	);
337
338       	//отправка запроса
339	$("body").on("click",".curler",
340		function(e)
341		{
342			var _this = this;
343			var start = $(_this).attr("start");
344			var end = $(_this).attr("end");
345			var error = $(_this).attr("error");
346			var reload = $(_this).attr("reload")=="yes";
347			confirm_modal3($(_this).attr("confirmlink"),"Да","Нет",
348			function(){
349				ajax_asynq($(_this).attr("link"),function(){serversuccess(start)},function(json){
350					var result = JSON.parse(json);	
351					if (result["result"]=="OK"){		
352						serversuccess(end);
353						if (reload) location.reload();
354					}
355					else
356						servererror(error);
357			},$($(_this).attr("for")).serialize())
358			},$($(_this).attr("for")).serialize());
359
360		}
361	);
362
363	//скачать файл
364	$("body").on("click",".downloader",
365		function(e)
366		{
367			event.preventDefault();
368			var _this = this;
369			ajax_asynq($(_this).attr("link"),function(){$($(_this).attr("handler")).hide();},function(response){var json = JSON.parse(response); 
370				$($(_this).attr("handler")).show();$($(_this).attr("handler")).attr('href',json["href"])},$($(_this).attr("for")).serialize());
371
372		}
373	);
374
375	$("body").on("click",".cas", function(){
376		create_and_submit($(this).attr('data')); 
377   });
378
379	//trim
380	$("body").on("blur",".form-control[type=text]",
381		function () {
382			$(this).val($(this).val().trim());
383			$(this).val($(this).val().replace(/[\s\t]+/g," "));
384		}
385	)
386
387	//быстрая проверка regex
388	$("body").on("keyup blur",".fastcheck",
389		function () {
390			var regexp = new RegExp(/.*/i);
391			regexp = $(this).attr("regex") ? new RegExp($(this).attr("regex"), "i") : regexp;
392
393            if (!regexp.exec($(this).val()))
394				{
395                    $(this).popover("enable");
396					$(this).addClass('error');
397					$(this).popover("show");
398				}
399			else
400			{
401                $(this).popover("disable");
402				$(this).removeClass('error');
403				$(this).popover("hide");
404			}
405		}
406	);
407
408	//ъбыстрое исправление имени
409	$("body").on("blur",".autofix[user='user']",
410		function () {
411			$(this).val(cap($(this).val()));
412
413			$(this).val($(this).val().replace(/[ ]+/g," "));
414
415			$(this).val($(this).val().replace(/[-]+/g,"-"));
416
417			if ($(this).val().includes("-"))
418				$(this).val($(this).val().split('-').map(cap).join('-'));
419
420			if ($(this).val().includes(" "))
421				$(this).val($(this).val().split(' ').map(cap).join(' '));
422		}
423	);
424
425	//серверная проверка
426	$("body").on("blur",".serverchk",
427		function () {
428			serverchk(this);
429		}
430	);
431	
432
433	//отменить обязательное поле
434	$("body").on("change",".notreq",
435		function () {
436                        $($(this).attr('ref')).removeClass('error');
437                        $($(this).attr('ref')).popover("hide");
438			if ($(this).prop("checked")) {
439				$($(this).attr('ref')).val("НЕТ");
440				
441                                $($(this).attr('ref')).attr("readonly", "readonly");
442			}
443			else {
444				$($(this).attr('ref')).removeAttr("readonly");
445			}
446//                        $(".fastcheck").blur();
447
448		}
449	);
450	$(".notreq").change();
451
452    //сменить маску ввода
453	$("body").on("change", ".maskchanger", function(e){
454			if (($($(this).attr("action"))).attr("readonly")) return;
455
456			$($(this).attr("action")).val('');
457
458			$masks = {"Username":"(^[A-z0-9_.\-]{1,50}@[A-z0-9_.\-]{1,50}\.(ru|com|net|su|ua|info|org|edu))*$","Phone":"8\\(\\d{3}\\)\\d{3}-\\d{2}-\\d{2}","Fio":"[А-яё\\s-]*"};
459			$($(this).attr("action")).attr("regex","^"+$masks[$(this).val()]+"$");
460			$($(this).attr("action")).attr("data-inputmask-regex",".*");
461			if ($(this).val()=="Phone"){
462				$($(this).attr("action")).attr("data-inputmask-regex",$masks[$(this).val()]);
463			}
464			$($(this).attr("action")).next('.valid').text('').hide();
465			$($(this).attr("action")).inputmask();
466	});
467
468	$("body").on("click",".modaling",function () { show_modal(this, true); });
469
470	$("body").on("click",".uploading:not('.blocked')",function () {
471		$("input[for=#" + $(this).attr("id") + "]").click();
472
473		$("input[for=#" + $(this).attr("id") + "]").not(".mychat").unbind("change").change(
474			function () {
475				ajax_file(this);
476			});
477	}
478	);
479
480	//checkbox
481	$("body").on("click",".checkval",
482	function(event)
483	{
484			if ($(this).is(':checked')) 
485				$(this).val($(this).attr("onval"));
486			else
487				$(this).val($(this).attr("offval"));
488	}
489	);
490
491
492}
493
494//аттрибуты классов
495function class_attrs() {
496	if ($(".dataverificated").val()==1) {
497		$(".toremove").remove();
498		$(".blaver[type=text]").addClass("blocked");
499		$(".blaver[type=text]").attr("readonly", "readonly");
500		$(".blaver[type=text]").attr("title", "Вы подтвердили данные. Редактирование этого поля теперь недоступно.");
501		$(".blaver[type=checkbox]").attr("disabled", "disabled");
502	}
503
504	/*$(".form-group").each(
505		function(){
506				if ($(this).find("[class=hidden]").length>0)
507					$(this).addClass("hidden");
508		}
509		);*/
510
511
512}
513
514function initialization() {
515	console.log("Инициализация плагинов");
516	captcha();
517	entity();
518	json_params();
519	class_events();
520	class_attrs();
521	class_intervals();
522	class_nice();
523	blockmodal(); // блокирующее объявление
524	popup(); // всплывающие окна
525	//prompt();
526	infowidgets(); // вывод виджетов
527
528	$(".autoclick").removeClass("d-n").click();
529
530	
531
532    renew();
533	uploading();
534
535	$('h4.section:empty').hide();
536
537	CKEDITOR.config.allowedContent = true; // отключить фильтрацию тегов
538	CKEDITOR.config.filebrowserUploadUrl = "/admin/cke"
539
540	$(".reloader").each(function(){location.reload();});
541}
542
543//поле загрузки файла
544function uploading($class="") {
545
546	$(".uploading" + $class).each(function () {
547		$(this).after("<input ztype=" + $(this).attr("ztype") + " accept='image/*,application/pdf' class='hidden' dest='"+($(this).attr("prefix") ? $(this).attr("storage"):"")+"/"+$(this).attr("who")+"/loadfiles/attachments?remote=1&prefix="+$(this).attr("prefix")+"' type=file for=#" + $(this).attr("id") + ">");
548		
549		if ($("div[for=#" + $(this).attr("id") + "]").length==0)
550			$(this).closest('form').after("<div class='f-l formfiles' for=#" + $(this).attr("id") + "></div>");
551
552		if ($(this).val() && $(this).val().includes("/"))
553			$("div[for=#" + $(this).attr("id") + "]").html("<a class=fancybox href='"+
554			($(this).val().includes($(this).attr("prefix"))? $(this).attr("storage") + "/web/ext/mime.php?host=local&file="+$(this).attr("prefix"):"")
555			+"/web/upload/attachments/" + 
556			$(this).val().trim().replace($(this).attr("prefix"),"") + 
557			"'><img class=imgerr width=300 height=300 src='"+
558			($(this).val().includes($(this).attr("prefix"))? $(this).attr("storage") + "/web/ext/mime.php?host=local&file="+$(this).attr("prefix"):"")
559			+"/web/upload/attachments/" + 
560			$(this).val().trim().replace($(this).attr("prefix"),"") + 
561			"'></a><i title='Удалить' onclick='$($(this).parent().attr(\"for\")).val(\"\");$(this).parent().html(\"\");' class='toremove cursor-p fa fa-times fa-2x'></i>")
562	}
563	);
564
565	$('.imgerr').unbind("error").error(
566		function () {
567			$(this).attr('src', "/web/graphics/pdf2.png");
568		}
569	);
570}
571
572//поле загрузки файла 
573function uploading_old($class="") {
574
575	$(".uploading" + $class).each(function () {
576		$(this).after("<input ztype=" + $(this).attr("ztype") + " accept='image/*,application/pdf' class='hidden' dest='/"+$(this).attr("who")+"/loadfiles/attachments' type=file for=#" + $(this).attr("id") + ">");
577		
578		if ($("div[for=#" + $(this).attr("id") + "]").length==0)
579			$(this).closest('form').after("<div class='f-l formfiles' for=#" + $(this).attr("id") + "></div>");
580
581		if ($(this).val() && $(this).val().includes("/"))
582			$("div[for=#" + $(this).attr("id") + "]").html("<a class=fancybox href='/web/upload/attachments/" + $(this).val().trim() + "'><img class=imgerr width=300 height=300 src='/web/upload/attachments/" + $(this).val() + "'></a><i title='Удалить' onclick='$($(this).parent().attr(\"for\")).val(\"\");$(this).parent().html(\"\");' class='toremove cursor-p fa fa-times fa-2x'></i>")
583	}
584	);
585
586	$('.imgerr').unbind("error").error(
587		function () {
588			$(this).attr('src', "/web/graphics/pdf2.png");
589		}
590	);
591}
592
593
594//выпадающий список
595function autocomplete() {
596	var selected = false;
597	function split(val) {
598		return val.split(/,\s*/);
599	}
600	function extractLast(term) {
601		return split(term).pop();
602	}
603
604	$(".autocomplete")
605		.on("keydown", function (event) {
606			if (event.keyCode === $.ui.keyCode.TAB &&
607				$(this).autocomplete("instance").menu.active) {
608				event.preventDefault();
609			}
610		})
611		.autocomplete({
612			source: function (request, response) {
613				$.getJSON($(".autocomplete").attr("jsource") + extractLast(request.term), {
614				}, response);
615			},
616			search: function () {
617				selected = false;
618				// custom minLength
619				var term = extractLast(this.value);
620				if (term.length < 2) {
621					return false;
622				}
623			},
624			focus: function () {
625				// prevent value inserted on focus
626				return false;
627			},
628			select: function () {
629				selected = true;
630			}
631		});
632}
633function randtimer(func = function () { }) {
634	setTimeout(function () { func(); randtimer(func) }, (Math.floor(Math.random() * 81 + 20) * 1000));
635}
636function toogleColor(panel) {
637	panel.toggleClass('bg-blue').toggleClass('bg-green');
638	if (panel.hasClass('bg-blue') && panel.hasClass('bg-green'))
639		panel.removeClass('bg-blue');
640}
641
642function setprop(check) // установка свойств
643{
644
645	var data = {};
646	var check = $(check);
647	var link = check.attr("link");
648	var user = check.attr("user");
649	var prop = check.attr("name");
650	var checked = check.prop("checked");
651	var onVal = check.val();
652	var offVal = check.attr("offval");
653	var ajaxLink = link + user;
654	data[prop] = checked ? onVal : offVal;
655	ajax_asynq(
656		ajaxLink,
657		function () { },
658		function (response) { console.log(response) },
659		data
660	);
661}
662
663function disattach(button) {
664	var attach = button.attr('file');
665	if (typeof attach === 'undefined' || !attach) return;
666	if (swap && (swap == attach)) return;
667	button.prev().toggleClass('hidden');
668	button.children().toggleClass(cplus).last().parent().parent().next().toggleClass('br-red');
669	var attachments = $(".attachments").val().split(",");
670
671	var attachcontainer = button.closest('.attachcontainer');
672	var clone = attachcontainer.clone(true, true);
673	if (!attachments.remove(attach)) {
674		attachments.push(attach);
675		attachments.remove("!" + attach)
676		attachcontainer.parent().children('.removed').first().before(clone.removeClass('removed'));
677	}
678	else {
679		attachments.push("!" + attach);
680		attachcontainer.parent().append(clone.addClass('removed'));
681	}
682	attachcontainer.remove();
683	$(".attachments").val(attachments.join(","));
684}
685function swapattachs(attach1 = "", attach2 = "") {
686	if (attach1 == attach2) { return; }
687	var attachments = $(".attachments").val().split(",");
688	var key1 = attachments.indexOf(attach1);
689	var key2 = attachments.indexOf(attach2);
690
691	if (key1 == '-1' || key2 == '-1') { return; }
692	var moveb1 = $('[action=moveattach][file="' + attach1 + '"]').find('i');
693	var moveb2 = $('[action=moveattach][file="' + attach2 + '"]').find('i');
694	if (
695		typeof moveb1.attr('movable') === 'undefined' || typeof moveb2.attr('movable') === 'undefined' ||
696		!moveb1.attr('movable') && !moveb2.attr('movable') || (moveb1.attr('movable') != moveb2.attr('movable'))
697	) { return; }
698	var attachcontainer1 = moveb1.closest('.attachcontainer');
699	var attachcontainer2 = moveb2.closest('.attachcontainer');
700	var clone1 = attachcontainer1.clone(true, true);
701	var clone2 = attachcontainer2.clone(true, true);
702	attachments[key1] = attach2;
703	attachments[key2] = attach1;
704	attachcontainer1.replaceWith(clone2);
705	attachcontainer2.replaceWith(clone1);
706	$(".attachments").val(attachments.join(","));
707}
708function manageattachs(movable = "images") {
709	return $("<div></div>").addClass("btn-group p-a z-i-1 t-r-0")
710		.append(
711			$("<span></span>").attr('action', 'moveattach').attr('attachtype', movable).addClass('btn btn-primary b-t-l-r-0')
712				.click(function () {
713					if (swaptype && (swaptype != $(this).attr('attachtype'))) return false;
714					$('[movable=' + movable + ']').toggleClass('fa-spin');
715					if (swap) { swapattachs(swap, $(this).attr('file')); swap = false; swaptype = undefined; }
716					else { swap = $(this).attr('file'); swaptype = movable; }
717					return false;
718				}).append($('<i></i>').attr('movable', movable).addClass('fa fa-retweet'))
719		)
720		.append(
721			$("<span></span>").attr('action', 'disattach').addClass('btn btn-primary b-r-0')
722				.click(function () { disattach($(this)); return false; })
723				.append($('<i></i>').addClass('fa fa-times'))
724		);
725}
726function crosstoprightelem1() {
727	return $("<span><span>").attr("target", "actions").addClass("fa fa-times f-r m-l-10")
728		.attr("style", "margin-right:-5px")
729		.attr("onclick", "$(this).toggleClass(cplus).parent().toggleClass('br-red');");
730}
731function setflowplayer(idplayer = "") {
732	if (idplayer) {
733		flowplayer(
734			idplayer
735			,
736			{
737				src: "/web/flash/flowplayer-3.2.16.swf",
738				wmode: "opaque"
739
740			},
741			{
742				plugins: { controls: { url: '/web/flash/flowplayer.controls-3.2.15.swf' } },
743				clip:
744				{
745					autoPlay: false,
746					autoBuffering: false,
747					scaling: "fit"
748				}
749			}
750		);
751	}
752}
753function unescapeHtml(safe) {
754	return safe
755		.replace(/&amp;/g, "&")
756		.replace(/&lt;/g, "<")
757		.replace(/&gt;/g, ">")
758		.replace(/&quot;/g, "\"")
759		.replace(/&#039;/g, "'");
760}
761function clear_carousel() {
762	$("#big-modal .carousel-inner").html("");
763}
764function add_body_padding() {
765	/*
766	 * var w1 = self.innerWidth; // Ширина вместе с полосой прокрутки var w2 =
767	 * $('body').width(); // Ширина без полосы прокрутки var ww = w1 - w2; //
768	 * Ширина вместе с полосой прокрутки var sliderWidth =
769	 * $('.slide-panel-carousel').css('width'); // Ширина слайдерной панели //
770	 * Получаем изначальные ширины элементов ( без изменения боди )
771	 * $('.changable-width').each(function(){ var width = $(this).css('width');
772	 * $(this).attr('wid', width); });
773	 * $('body,.navbar-fixed-top').css('padding-right', ww); // Добавляем
774	 * паддинг к боди, чтобы не было скачка // Устанавливаем изначальные ширины
775	 * элементов, чтобы не было скачка $('.changable-width').each(function(){
776	 * $(this).css('width', $(this).attr('wid')); });
777	 * 
778	 * $('.slide-panel,.slide-panel-carousel').css('width', sliderWidth); //
779	 * Убираем скачок ширины слайдерной панели return w2;
780	 */
781}
782function delete_body_padding() {
783	// $('body,.navbar-fixed-top').css('padding-right', 0);
784}
785function formOrder(f) {
786	var form = $(f);
787	var orderData = form.find('input[name=orderData]');
788	var checked = $('input[type=checkbox][target=order]:checked');
789	var amount = checked.length + 1;
790	var dataString = '';
791	var arr = new Array();
792
793	checked.each(function () {
794		arr.push($(this).prev('span').html());
795	});
796	dataString = arr.join('-+-+-+-+-+-+-+-+-');
797
798	orderData.val(dataString);
799
800
801}
802
803//дополнительная проверка email
804function emailValidation() {
805	var mail = $("#user_data_username");
806	if (mail.length && mail.val().includes("gmail.ru")) {
807		mail.closest("form").find("#valid").text('Ошибка. Не найден почтовый сервер gmail.ru. Возможно, Вы имели в виду gmail.com?').show();
808		mail.removeClass('ok').addClass('error');
809		return false;
810	}
811	else {
812		mail.closest("form").find("#valid").text('').hide();
813		mail.removeClass('error').addClass('ok');
814		return true;
815	}
816
817	/*var re2=new RegExp(/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i);
818	var mail = $("input[data-mask=mail]");
819	if( mail.length == 0 ) return true;
820	var submit = mail.closest("form").find("button");
821	var valid = mail.closest("form").find("#valid");
822	if(!mail.val()){
823		valid.text('Поле не должно быть пустым!').show();
824		mail.removeClass('ok').addClass('error');
825	}
826	else{
827		if(!re2.exec(mail.val())){
828			valid.text('Введите, пожалуйста, корректный e-mail').show();
829			mail.removeClass('ok').addClass('error');
830		}else{
831			valid.text('').hide();
832			mail.removeClass('error').addClass('ok');
833			return true;
834		}
835	}
836	return false*/
837}
838
839//проверка индекса на серверв
840function serverchk(_this, warning = false) {
841	if ($(_this).attr("readonly")) return true;
842	var result = true;
843	var valid = $(_this).next(".valid");
844	var checkfailed = $(_this).attr('chkfailed');
845	var checkresult = $($(_this).attr('chkresult'));
846	if (!(new RegExp($(_this).attr("regex"), "i")).exec($(_this).val())) 
847	{
848		valid.text($(_this).attr('invalid')).show();
849		return false; 
850	}
851	ajax_synq($(_this).attr("chkurl"), function () { }, function (data) {
852		//если индекс на найден, то сообщение
853		obj = JSON.parse(data);
854		if (!obj.length) {
855			result = $(_this).hasClass("warning") || false;
856			valid.text(checkfailed).show();
857			checkresult.val('');
858		}
859		else {
860			checkresult.val(obj.join(", "));
861			valid.text('').hide();
862		}
863	}
864		,
865		$("form[name=user_data]").serialize()
866
867	);
868
869	return result;
870}
871
872function serverchk2(_this, warning = false) {
873	var result = true;
874	ajax_synq($(_this).attr("chkurl"), function () { }, function (data) {
875		//если индекс на найден, то сообщение
876		obj = JSON.parse(data);
877		if (!obj.length) {
878			result = false;
879			confirm_modal3("/user/mytwig/fio/", "OK", "Назад", function () {
880				if (compare(".compfirst", ".compsecond")) //если значения совпадают (форма закрывается, в следующий раз не открывается)
881				{
882					$(".zvalid").text("").hide();
883					$(".compfirst").addClass("compared");
884		                        
885                                        $("#user_data_REGISTRATION").click();
886                                        $("#user_data_personaldata").focus();
887                                        SCROLL_TO("#user_data_personaldata");
888                                        $("#user_data_personaldata").blur(function(){console.log('fddddddddddddd');$(this).focus();});
889                    			return true;
890				}
891				$(".zvalid").text("Введённые Вами данные не совпадают с введёнными ранее данными. Проверьте ещё раз.").show(); //(форма не закрывается)
892				return false;
893			}
894			);
895		}
896	}
897		,
898		$("form[name=user_data]").serialize()
899
900	);
901return result;
902}
903
904//сверить значения двух классов
905function compare(class1, class2) {
906	if ($(class1).length != $(class2).length ) return false;
907	for (i = 0; i <= $(class1).length; i++){
908		//if ($($(class1 + ":eq(" + i + ")")).val().trim()=="") return false;
909		if ($($(class1 + ":eq(" + i + ")")).val() != $($(class2 + ":eq(" + i + ")")).val()) return false;
910	}
911	return true;
912}
913
914//валидация каждого поля по регэкспу
915function validate() {
916	event.preventDefault();
917	var result = true;
918
919	var regexp = new RegExp(/.*/i);
920	$("span.valid").text("").hide();
921	$("button.report").hide();
922        $("input.error").removeClass("error");
923	$("input.ok").removeClass("ok");
924
925	//проверка required
926	$("input[required='required']").each(
927		function () {
928		var valid = $(this).parent().find("span.valid");
929			if ($(this).val().trim()=="") {
930				valid.text('Это поле обязательно для заполнения.').show();
931				$(this).removeClass('ok').addClass('error');
932				SCROLL_TO($(document).find(".error").eq(0));
933				result = false;
934			}
935			else
936			{
937				valid.text('').hide();	
938				$(this).removeClass('error').addClass('ok');	
939			}	
940		}
941	);
942
943	$(".validate").not(".error").each(
944		function () {
945			//var valid = $(this).next(".valid");
946                        var valid = $(this).parent().find("span.valid");
947			var report = $(this).next().next(".report");
948			var equal = true;
949			//типы регулярных выражений
950
951			regexp = $(this).attr("regex") ? new RegExp($(this).attr("regex"), "i") : regexp;
952
953			equal = !$($(this).attr("equal1")).val() && !$($(this).attr("equal2")).val() || ($(this).val() == $($(this).attr("equal1")).val() || $(this).val() == $($(this).attr("equal2")).val());
954
955			if (!regexp.exec($(this).val()) || $(this).val().includes("gmail.ru") || !equal) {
956				valid.text($(this).attr('invalid')).show();
957				if (!equal) report.show();
958				$(this).removeClass('ok').addClass('error');
959				SCROLL_TO($(document).find(".error").eq(0));
960				result = false;
961			}
962			else{
963				valid.text('').hide();
964				report.hide();	
965				$(this).removeClass('error').addClass('ok');	
966				}	
967		}
968	);
969
970	// серверная проверка 1 (индекс)
971	$(".validate.serverchk").each(
972		function () {
973			result = result && serverchk($(this));
974		}
975	)
976
977	// серверная проверка 2
978	$(".validate.serverchk2").each(
979		function () {
980			result = result && ($(this).hasClass("compared") || serverchk2($(this)));
981		}
982	)
983
984        $("input[type=text].form-control").not(".error").addClass('ok');
985
986	if (result)
987	{
988		$(".error").removeClass('error').addClass('ok');
989	}
990
991	return result;
992}
993
994//создает форму и делает submit
995function create_and_submit(json) {
996	var form = document.createElement("form");
997	var params = JSON.parse(json);
998	form.setAttribute("method", "post");
999	form.setAttribute("action", params["path"]);
1000	_domain = params["domain"];
1001	//form.setAttribute("target", "_blank");
1002	for (var key in params) {
1003		if (params.hasOwnProperty(key)) {
1004			var hiddenField = document.createElement("input");
1005			hiddenField.setAttribute("type", "hidden");
1006			hiddenField.setAttribute("name", key);
1007			hiddenField.setAttribute("value", params[key]);
1008
1009			form.appendChild(hiddenField);
1010		}
1011	}
1012
1013	document.body.appendChild(form);
1014	form.submit();
1015}
1016
1017// отправляет данные формы
1018function sendForm(elem) {
1019	event.preventDefault();
1020	var form = $(elem).closest("form");
1021	var reset = $(elem).attr("trigger")==="reset"; // сброс формы
1022	var nopopup = $(elem).attr("popup")==="no"; //инфо popup
1023	var startmsg = $(elem).attr("startmsg")===undefined ? "Отправка данных..." : $(elem).attr("startmsg"); //старт
1024	var errormsg = $(elem).attr("errormsg")===undefined ? "Ошибка отправки данных. Попробуйте еще раз." : $(elem).attr("errormsg"); //ошибка
1025	$(".form-button").attr("disabled", true);
1026
1027	ajax_with_form(
1028		form,
1029		function () { if (!nopopup) serversuccess(startmsg,0); },
1030		function (response) {
1031
1032			var json = JSON.parse(response);
1033
1034
1035			if (json.callback) eval(json.callback);
1036			if (!json.response.trim().startsWith('!!!')) {
1037				if (reset) {
1038					$(form).next(".formfiles").html('');
1039					form.trigger('reset');
1040				}
1041				if (!nopopup) serversuccess(json.response);
1042			}
1043			else
1044				servererror(json.response.trim().replace('!!!', ''));
1045
1046			$(".form-button").removeAttr("disabled");
1047
1048		},
1049		function (request, status, error) {
1050			servererror(errormsg);
1051			$(".form-button").removeAttr("disabled");
1052		}
1053	);
1054	return false;
1055}
1056
1057function search(bSubm, out) {
1058
1059	var bSubm = $(bSubm);
1060	var form = bSubm.closest("form");
1061	var searchlink = bSubm.attr("link");
1062	var linksuff = bSubm.attr("linksuff");
1063	var partsLink = searchlink.split("/");
1064	form.find("[target=search]").each(function () {
1065		if ($(this).val()) searchlink += ("/" + $(this).attr("search") + "=" + $(this).val());
1066	});
1067	form.find("[target=choicevalue]").each(function () {
1068		$('[choice-input-id=' + $(this).attr('choice-input') + ']').val($(this).val() ? '/' + $(this).val() : '');
1069	});
1070	form.find("[target=filter]").each(function () {
1071		var filter = $(this).prop('checked'), val = $(this).val();
1072		if (val && filter) searchlink += $(this).val();
1073	});
1074	form.find("[target=hiddenfilter]").each(function () {
1075		if ($(this).val()) searchlink += $(this).val();
1076	});
1077	searchlink = searchlink.replace("enter_by_passport_input", '/' + form.find("[id*=passport_input]").val()); // поиск
1078	// по
1079	// паспорту
1080	ajax_asynq(
1081		searchlink + linksuff,
1082		function () { $("#" + out).html(spinner) },
1083		function (response) { $("#" + out).html(spinner).html(response);infowidgets(); }
1084	);
1085}
1086
1087//спиок загруженных файлов
1088function files_ready(uploaded) {
1089	var attachments = $("input[type=hidden].attachments");
1090	var filename = uploaded.split(".")[0];
1091	var ext = uploaded.split(".")[1];
1092	if (attachments.val()) attachments.val(attachments.val() + ',');
1093	attachments.val(attachments.val() + "~tmp~_" + uploaded);
1094	if (ext.in_array(["jpeg", "jpg", "png", "gif"])) {
1095		if (ext == "png") $(".giftimage").val(filename);
1096		var imgs = $("#attachments_images_edit");
1097		var imgf = imgs.attr("imgf");
1098		$("<div></div>").addClass("p-r attachcontainer").append(manageattachs("images"))
1099			.children().last().children().attr("file", "~tmp~_" + uploaded).last().parent().after("<img>")
1100			.next().addClass("w-100").attr("src", imgf + uploaded)
1101			.parent().appendTo(imgs);
1102	}
1103	else if (ext.in_array(["mp4", "flv", "f4v", "mov", "m4v"])) {
1104		var vds = $("#attachments_videos_edit");
1105		var vdsf = vds.attr("vdsf");
1106		var vurl = vds.attr("vurl");
1107		var rand = '_' + Math.random().toString(36).substr(2, 16);
1108		$("<div></div>").addClass("p-r attachcontainer").append(manageattachs("videos")).children().last()
1109			.children().attr("file", "~tmp~_" + uploaded).last().parent().parent()
1110			.append('<video controls></video>').children().last()
1111			.attr("id", "videotag" + rand).attr("width", "100%").attr("height", "400px")
1112			.append('<source>').children().last().attr("src", vdsf + uploaded)
1113			.attr("onerror", "$(this).parent().replaceWith($(this).next());setflowplayer('flowplayer" + rand + "')")
1114			.parent().append('<div></div>').children().last().attr("href", vurl + uploaded)
1115			.attr("style", "width:100%;height:400px").attr("id", "flowplayer" + rand).parent().parent().appendTo(vds);
1116	}
1117	else {
1118
1119		var fls = $("#attachments_files_edit");
1120		var flsf = fls.attr("flsf");
1121		var spltr = "-_-_-_-_-_-";
1122		var parts = uploaded.split(spltr);
1123		var dwnld = parts[0].replace(/_/g, " ");
1124		var ext = parts[1].split(".")[1];
1125		$('<a target=_blank class="list-group-item p-r attachcontainer p-t-50"></a>')
1126			.append(manageattachs("files")).children().last()
1127			.children().attr("file", "~tmp~_" + uploaded).last().parent().parent()
1128			.append('<span class=badge></span>').attr("href", flsf + parts[1])
1129			.attr("download", dwnld + "." + ext).find("span.badge").html(ext)
1130			.after(dwnld).parent().appendTo(fls);
1131	}
1132}
1133
1134//dz2
1135function dz(dz) {
1136	$(dz).on("dragover",function(){$(this).addClass("ok");});
1137
1138	$(dz).on("dragleave",function(){$(this).removeClass("ok");});
1139
1140	// инициализация плагина jQuery File Upload
1141	$(dz).fileupload({
1142		
1143		// этот элемент будет принимать перетаскиваемые на него файлы
1144		dropZone: $(dz),
1145
1146		// Функция будет вызвана при помещении файла в очередь
1147		add: function (e, data) {
1148			//console.log('');
1149			ajax_file($(`input[for='#${$(dz).attr("id")}']`),data);
1150		},
1151
1152		progress: function (e, data) {
1153
1154					},
1155
1156		fail: function (e, data) {
1157				},
1158		done: function (e, data) {
1159
1160		}
1161
1162
1163
1164	});
1165
1166	$(document).on('drop dragover', function (e) {
1167		e.preventDefault();
1168	});
1169
1170}
1171
1172function dropZoneInit(formId = "multiple_d_d_upload_file", dropZoneId = "drop") {
1173	var ul = $('#' + formId + ' ul');
1174
1175	$('#' + dropZoneId + ' a').click(function () {
1176		// имитация нажатия на поле выбора файла
1177		$(this).parent().find('input').click();
1178	});
1179
1180	// инициализация плагина jQuery File Upload
1181	$('#' + formId).fileupload({
1182
1183		// этот элемент будет принимать перетаскиваемые на него файлы
1184		dropZone: $('#' + dropZoneId),
1185
1186		// Функция будет вызвана при помещении файла в очередь
1187		add: function (e, data) {
1188
1189			var tpl = $('<li class="list-group-item"><input type="text" value="0" data-width="48" data-height="48"' +
1190				' data-fgColor="#0788a5" data-readOnly="1" data-bgColor="#3e4043" /><span class=badge></span><span class="filename fnt3"></span></li>');
1191
1192			// вывод имени и размера файла
1193			tpl.find('span.badge').html(formatFileSize(data.files[0].size));
1194			if (parseInt(data.files[0].size) > 260 * 1024 * 1024) { alert("Размер файла превышает 250 МБ!"); return; }
1195			tpl.find('span.filename').html(data.files[0].name);
1196
1197			data.context = tpl.appendTo(ul);
1198
1199			// инициализация плагина jQuery Knob
1200			tpl.find('input').knob();
1201
1202			// отслеживание нажатия на иконку отмены
1203			tpl.find('span').click(function () {
1204
1205				if (tpl.hasClass('working')) {
1206					jqXHR.abort();
1207				}
1208
1209				tpl.fadeOut(function () {
1210					tpl.remove();
1211				});
1212
1213			});
1214
1215			// Автоматически загружаем файл при добавлении в очередь
1216			var jqXHR = data.submit();
1217		},
1218
1219		progress: function (e, data) {
1220
1221			// Вычисление процента загрузки
1222			var progress = parseInt(data.loaded / data.total * 100, 10);
1223
1224			// обновляем шкалу
1225			data.context.find('input').val(progress).change();
1226
1227			if (progress == 100) {
1228				data.context.removeClass('working');
1229			}
1230		},
1231
1232		fail: function (e, data) {
1233			// что-то пошло не так
1234			data.context.addClass('error');
1235		},
1236		done: function (e, data) {
1237			var uploaded = data.response().result.replace(/[\n\r\s]/g, '');
1238			var li = data.context;
1239			var msg_el = li.find("span.filename");
1240			var msg = "<br><i class='fa fa-spinner fa-spin fa-2x'></i> Подождите, идет конвертация видеофайла...";
1241			var old_text = msg_el.html();
1242			if (uploaded.substr(0, 3) == "err") // конвертация видео
1243				ajax_asynq("/convertvideo/" + uploaded.split("_")[1], function () { msg_el.html(msg_el.html() + msg); },
1244					function (data) { msg_el.html(old_text); li.addClass('ok'); files_ready(data) });
1245			else {
1246				li.addClass('ok')
1247				files_ready(uploaded);
1248			}
1249
1250		}
1251
1252
1253
1254	});
1255
1256	$(document).on('drop dragover', function (e) {
1257		e.preventDefault();
1258	});
1259
1260	// вспомогательная функция, которая форматирует размер файла
1261	function formatFileSize(bytes) {
1262		if (typeof bytes !== 'number') {
1263			return '';
1264		}
1265
1266		if (bytes >= 1000000000) {
1267			return (bytes / 1000000000).toFixed(2) + ' GB';
1268		}
1269
1270		if (bytes >= 1000000) {
1271			return (bytes / 1000000).toFixed(2) + ' MB';
1272		}
1273
1274		return (bytes / 1000).toFixed(2) + ' KB';
1275	}
1276}
1277function fullresetform(form) {
1278	$(form).trigger('reset');
1279	$('.chosen').trigger("chosen:updated");
1280	$(form).find("[type=hidden]").val("");
1281	$(form).find("textarea").each(function () {
1282
1283		var ckeinst = $(this).attr("id");
1284		if (CKEDITOR.instances[ckeinst]) CKEDITOR.instances[ckeinst].setData("");
1285
1286	});
1287	swap = swaptype = false;
1288	$('.fa-spin').removeClass('fa-spin');
1289	$('#attachments_images_edit,#attachments_videos_edit,#attachments_files_edit').html("");
1290}
1291
1292function servererror(request, status, error, time = 6000) { // сообщение если ошибка сервера
1293	if (request.status===0) return;
1294	serversuccess();
1295	var msg = (request.status === undefined ? request : 'Ошибка ' + request.status);
1296	if (time)
1297	$('.servererror').html(msg).slideToggle(
1298		'fast',
1299		'linear',
1300		function () {
1301			setTimeout(
1302				function () {
1303					$('.servererror').slideToggle(
1304						'fast',
1305						'linear',
1306						function () {
1307							$('.servererror').html('').hide();
1308						}
1309					);
1310				},
1311				time
1312			);
1313		}
1314	);
1315
1316
1317}
1318
1319function serversuccess(msg = "", time = 6000) { // вывести сообщение
1320
1321	var after = (time ? // через сколько убрать; 0- навсегда
1322		function () {
1323			$('.serversuccess').slideToggle(
1324				'fast',
1325				'linear',
1326				function () {
1327					$('.serversuccess').html('').hide();
1328				}
1329			);
1330		}
1331		:
1332		function () { }
1333	);
1334
1335	if (tID) { clearTimeout(tID) }; // убрать предудущие сообщения
1336
1337	if (time)
1338		$('.serversuccess').slideUp('fast', 'linear');
1339	else
1340		$('.serversuccess').hide();
1341	if (!msg) return;
1342	if (time)
1343		$('.serversuccess').html(msg).slideToggle(
1344			'fast',
1345			'swing',
1346			function () {
1347				tID = setTimeout(
1348					after,
1349					time
1350				);
1351			}
1352		);
1353	else
1354		$('.serversuccess').html(msg).show();
1355}
1356
1357//отправить файл из инпута
1358function ajax_file(
1359	input,
1360	data = null,
1361	error = function (request, status, error) {
1362		servererror(request, status, error)
1363	}
1364) {
1365	var fd = new FormData;
1366    var _input = input;
1367	var file = data==null ? $(input).prop('files')[0] : data.files[0];
1368
1369	if (file==undefined) { return; }
1370
1371	if (parseInt(file.size) > 100 * 1024 * 1024) { alert("Размер файла превышает 100 МБ!"); return; }
1372
1373	if (!file.type.match("(application\/pdf|image\/jpeg|image\/png)") && !file.type.match($(input).attr("extensions"))) { alert("Неподдерживаемый формат файла!"); return; }
1374
1375	fd.append($(input).attr('name'), file); // добавление данных
1376	
1377	fd.append('param', $(input).attr('param')); // добавление данных
1378
1379	
1380
1381	$.ajax({
1382		url: $(input).attr('dest'),
1383		type: "POST",
1384		data: fd,
1385		cache: false,
1386		processData: false,
1387		contentType: false,
1388		beforeSend: function () { $($(_input).attr('result')).html("Ожидание..."); $($(_input).attr("for")).val('Подождите, файл загружается...'); },
1389		success: function (html) {
1390			$($(_input).attr('result')).html(html);
1391			$(_input).val('');
1392			html = html.split("-_-_-_-_-_-").reverse()[0];
1393			$($( _input).attr("for")).val(html);
1394			$(".zhidden").val(html);
1395			var href = $(_input).attr("ztype")=="simple" ? 
1396			"<div><a target=_blank href='/web/upload/attachments/" + html.trim() + "'>Вложение</a><i onclick='$(this).parent().remove();$(\".zhidden\").val(\"\")' class='fa fa-times fa-1x'></i></div>" :
1397			 "<a class='fancybox ' target=_blank href='"+
1398			(html.includes($($(_input).attr("for")).attr("prefix"))? $($(_input).attr("for")).attr("storage") + "/web/ext/mime.php?host=local&file="+$($(_input).attr("for")).attr("prefix"):"")
1399			+"/web/upload/attachments" + 
1400			html.trim().replace($($(_input).attr("for")).attr("prefix"),"") + 
1401			"'><img class=imgerr width=300 height=300 src='"+
1402			(html.includes($($(_input).attr("for")).attr("prefix"))? $($(_input).attr("for")).attr("storage") + "/web/ext/mime.php?host=local&file="+$($(_input).attr("for")).attr("prefix"):"")
1403			+"/web/upload/attachments/" + 
1404			html.trim().replace($($(_input).attr("for")).attr("prefix"),"") + 
1405			"'></a><i title = 'Удалить' onclick='$($(this).parent().attr(\"for\")).val(\"\");$(this).parent().html(\"\");' class='cursor-p fa fa-times fa-2x'></i>";
1406			$("div[for=" + $(_input).attr("for") + "]").html(href);
1407
1408			$('.imgerr').unbind("error").error(
1409				function () {
1410					$(this).attr('src', "/web/graphics/pdf2.png");
1411				}
1412			);
1413		},
1414		error: error
1415	});
1416}
1417
1418//отправить файл из инпута
1419function ajax_file_old(
1420	input,
1421	data = null,
1422	error = function (request, status, error) {
1423		servererror(request, status, error)
1424	}
1425) {
1426	var fd = new FormData;
1427    var _input = input;
1428	var file = data==null ? $(input).prop('files')[0] : data.files[0];
1429
1430	if (file==undefined) { return; }
1431
1432	if (parseInt(file.size) > 100 * 1024 * 1024) { alert("Размер файла превышает 100 МБ!"); return; }
1433
1434	if (!file.type.match("(application\/pdf|image\/jpeg|image\/png)")) { alert("Неподдерживаемый формат файла!"); return; }
1435
1436	fd.append($(input).attr('name'), file); // добавление данных
1437	
1438	
1439
1440	$.ajax({
1441		url: $(input).attr('dest'),
1442		type: "POST",
1443		data: fd,
1444		cache: false,
1445		processData: false,
1446		contentType: false,
1447		beforeSend: function () { $($(_input).attr("for")).val('Подождите, файл загружается...'); },
1448		success: function (html) {
1449			$( _input).val('');
1450			html = html.split("-_-_-_-_-_-").reverse()[0];
1451			$($( _input).attr("for")).val(html);
1452			$(".zhidden").val(html);
1453			var href = $(_input).attr("ztype")=="simple" ? 
1454			"<div><a target=_blank href='/web/upload/attachments/" + html.trim() + "'>Вложение</a><i onclick='$(this).parent().remove();$(\".zhidden\").val(\"\")' class='fa fa-times fa-1x'></i></div>" :
1455			 "<a class='fancybox ' target=_blank href='/web/upload/attachments/" + html.trim() + "'><img class=imgerr width=300 height=300 src='/web/upload/attachments/" + html.trim() + "'></a><i title = 'Удалить' onclick='$($(this).parent().attr(\"for\")).val(\"\");$(this).parent().html(\"\");' class='cursor-p fa fa-times fa-2x'></i>";
1456			$("div[for=" + $(_input).attr("for") + "]").html(href);
1457
1458			$('.imgerr').unbind("error").error(
1459				function () {
1460					$(this).attr('src', "/web/graphics/pdf2.png");
1461				}
1462			);
1463		},
1464		error: error
1465	});
1466}
1467
1468function ajax_asynq(
1469	script,
1470	start = function () { },
1471	end = function () { },
1472	data = {},
1473	error = function (request, status, error) {
1474		servererror(request, status, error)
1475	}
1476) {
1477	if (script == "nolink") return false;
1478	$.ajax({
1479		url: script,
1480		type: "POST",
1481		data: data,
1482		cache: false,
1483		beforeSend: start,
1484		success: end,
1485		error: error
1486	});
1487}
1488
1489function ajax_asynq_simple(script) {
1490	$.ajax({ url: script, cache: false });
1491}
1492function benefitSubmit(bSubm) {
1493	var data = {};
1494	var bSubm = $(bSubm);
1495	var benefit = bSubm.prev("input[data-type=benefit]");
1496	data["number"] = benefit.val();
1497	ajax_asynq(
1498		'/benefit',
1499		function () { bSubm.next('#valid').removeClass('valid').html(spinner) },
1500		function (response) {
1501			if (response == "00000") {
1502				bSubm.next('#valid').addClass('valid').text('Неверный номер');
1503			}
1504			if (response != "00000" && response != "") {
1505				location.href = response;
1506			}
1507		},
1508		data
1509	);
1510}
1511
1512//проверка логина (используется при регистрации)
1513function checklogin(bSubm) {
1514	event.preventDefault();
1515	var data = {};
1516	var form = $(bSubm).closest("form");
1517	var bSubm = $(bSubm);
1518	var login = form.find("input[data-type=login]");
1519	var answer 	= form.find("#user_data_user_answer").val();
1520	var mask 	= form.find("#user_data_mask").val();
1521	if (!emailValidation()) return false;
1522
1523	/*form.find("[required],[required=ok]").each(function () {
1524		var value = $(this).val();
1525		if (!value) {
1526		
1527		}
1528	});*/
1529
1530	data = $("form[name=user_data]").serialize();
1531
1532	ajax_asynq(
1533		'/chk',
1534		function () { $("#user_data_REGISTRATION").attr("disabled", "disabled"); serversuccess('Подождите, пожалуйста. Идет регистрация...', 0) },
1535		function (response) {
1536			//$(form).find("[type=submit]").click();
1537			login.addClass('ok').removeClass('error');
1538			form.find('#valid').text('').hide();
1539
1540			if (form.find("#user_data_user_answer").length>0)
1541			ajax_asynq('/captcha',null,function(response){bSubm.removeAttr("disabled");
1542			if (response==1) $(form).find("[type=submit]").trigger("click"); else servererror('Неправильно введены символы с картинки!');},"answer="+answer);
1543		else
1544			$(form).find("[type=submit]").trigger("click");
1545		},
1546		data,
1547		function (request, status, error) {
1548			var json = JSON.parse(request.responseText.trim());
1549			var msgs = {"username":"Этот логин уже используется в системе. Введите другой.", "phone":"Этот телефон уже используется в системе.Введите другой."};
1550			
1551			for(var key in msgs)
1552
1553				if (json[key]==1) {
1554					console.log(key);
1555					$(`#user_data_${key}`).removeClass('ok').addClass('error');
1556					$(`#user_data_${key}`).next('.valid').text(msgs[key]).show();
1557				}
1558
1559			
1560			//login.next('.valid').text(msg).show();
1561			$("#user_data_REGISTRATION").removeAttr("disabled");
1562			serversuccess("");
1563		}
1564	);
1565}
1566
1567/*function submitlogin(event, bSubm, admin = 0) // форма логина (с синхронизацией
1568// пароля)
1569{
1570
1571	var data = {};
1572	var form = $(document).find("#login_form");
1573	var bSubm = $(bSubm);
1574	var login = form.find("input[data-type=login]");
1575	$('#username').val($('#username').val().trim());
1576	$('#password').val($('#password').val().trim());
1577	event.preventDefault(); // предотвратить обычный submit
1578	data["username"] = $('#username').val();
1579	if (admin) // админу не надо синхронизировать пароль
1580	{
1581		
1582		$(bSubm).prop("disabled", true);
1583		ajax_asynq('/chk',null,function(){form.find("[type=submit]").click();},$(form).serialize(),		function (request, status, error) {
1584			var msg = (request.responseText.trim() == "checked" ?
1585				'Этот логин уже используется в системе'
1586				:
1587				'Ошибка входа. Попробуйте еще раз.'
1588			)
1589			$(bSubm).prop("disabled", false);
1590			login.removeClass('ok').addClass('error');
1591			login.next('.valid').text(msg).show();
1592
1593			serversuccess("");
1594		});
1595	}
1596	else
1597		ajax_asynq(
1598			'/syncpsw',
1599			function () { serversuccess("Синхронизация данных с портфолио..."); $(bSubm).attr("disabled", "disabled"); },
1600			function () {
1601				serversuccess("");
1602				form.submit();
1603			},
1604			data,
1605			function (request, status, error) {
1606				servererror("Ошибка входа. Попробуйте еще раз.");
1607				$(bSubm).removeAttr("disabled");
1608			}
1609		);
1610}*/
1611
1612
1613function submitlogin(event, bSubm, admin = 0) // форма логина (с синхронизацией
1614// пароля)
1615{
1616	var data = {};
1617	var form = $(document).find("#login_form");
1618	var bSubm = $(bSubm);
1619	var login = form.find("input[data-type=login]");
1620	$('#username').val($('#username').val().trim());
1621	$('#password').val($('#password').val().trim());
1622	event.preventDefault(); // предотвратить обычный submit
1623	data["username"] = $('#username').val();
1624	if (admin) // админу не надо синхронизировать пароль
1625	{
1626		form.find("[type=submit]").click();
1627		$(bSubm).attr("disabled", "disabled");
1628	}
1629	else
1630		ajax_asynq(
1631			'/syncpsw',
1632			function () { serversuccess("Синхронизация данных с портфолио..."); $(bSubm).attr("disabled", "disabled"); },
1633			function () {
1634				serversuccess("");
1635				form.submit();
1636			},
1637			data,
1638			function (request, status, error) {
1639				servererror("Ошибка входа. Попробуйте еще раз.");
1640				$(bSubm).removeAttr("disabled");
1641			}
1642		);
1643}
1644
1645
1646function clickrecoverybutton(bSubm) {
1647	var data = {};
1648	var form = $(bSubm).closest("form");
1649	var bSubm = $(bSubm);
1650	var mail = form.find("input[data-type=login]");
1651	mail.val(mail.val().trim());
1652	data["username"] = mail.val();
1653	if (!emailValidation()) {
1654		if (mail.val()) form.find('#valid').text('Обратитесь к регистрирующему для восстановления пароля').show();
1655		return;
1656	}
1657	mail.removeClass('error').addClass('ok');
1658        form.find('#valid').text('').addClass('d-n');
1659	ajax_asynq(
1660		'/chk',
1661		function () { },
1662		function (response) {
1663			mail.removeClass('ok').addClass('error');
1664			form.find('#valid').text('Такого логина нет в системе').removeClass('d-n');
1665		},
1666		form.serialize(),
1667		function (request, status, error) {
1668			ajax_with_file(
1669				$(bSubm).closest("form").attr("id"),
1670				function () {
1671					$("#updated").hide();
1672					$("#loading").show();
1673				},
1674				function () {
1675					$("#loading").hide();
1676					$("#updated").slideDown();
1677				}
1678			);
1679		}
1680	);
1681}
1682
1683function modalWin(header, _this) {
1684	var elem = $(_this);
1685
1686	var ajaxLink = elem.attr('editlink');
1687
1688	$('#mini-modal .modal-title').html(header)
1689
1690	ajax_asynq(
1691		ajaxLink,
1692		function () {
1693			$('#mini-modal .modal-body').html(spinner);
1694		},
1695		function (html) {
1696			$('#mini-modal .modal-body').html(html);
1697			class_nice();
1698		}
1699	);
1700
1701	elem.addClass('___active_window_caller___');
1702
1703	$('#mini-modal').modal({backdrop: 'static', keyboard: false});
1704	
1705
1706}
1707
1708
1709function sendformfrommodal(
1710	elem,
1711	beginmessage = "Подождите, действие выполняется...",
1712	endmessage = "Выполнено!",
1713	errorcallback = function (request, status, error) {
1714		servererror(request, status, error)
1715	}
1716) {
1717	var form = $(elem).closest("form");
1718	var flag = true;
1719	form.find("[required],[required=ok]").each(function () {
1720		if (flag) {
1721			var input = $(this).closest("div");
1722			var value = $(this).val();
1723			/*
1724			 * if(this.tagName=="SELECT" && $(this).hasClass("chosen")) { input =
1725			 * $("#" + $(this).attr("id") + "_chosen"); }
1726			 */
1727			if (!value) {
1728				flag = false;
1729				input.attr("title", $(this).attr("title"))
1730					.attr("data-placement", $(this).attr("data-placement"))
1731					.focus().tooltip('show');
1732				$(".modal").animate({ scrollTop: input.get(0).offsetTop }, 500);
1733
1734			}
1735
1736		}
1737	});
1738	form.find("[limited=ok]").each(function () {
1739		if (flag) {
1740			if (this.tagName == "TEXTAREA") {
1741				var ckeDiv = $("#cke_" + $(this).attr("id"));
1742				var ckeTop = ckeDiv.get(0).offsetTop;
1743				var ckeStringLength = CKEDITOR.instances[$(this).attr("id")].getData().length;
1744				var limit = $(this).attr('lmt');
1745				var title = $(this).attr('title');
1746				var dataPlacement = $(this).attr('data-placement');
1747				var overlimit = ckeStringLength >= limit;
1748				var blank = $(this).attr('nonblank') == "ok" && ckeStringLength == 0;
1749				if (overlimit || blank) {
1750					flag = false;
1751					ckeDiv.attr("title", title).attr("data-placement", dataPlacement).focus().tooltip('show');
1752					$(".modal").animate({ scrollTop: ckeTop }, 500);
1753
1754				}
1755			}
1756		}
1757	});
1758	if (flag) {
1759		$(form).find("textarea").each(function () {
1760
1761			var ckeinst = $(this).attr("id");
1762			if (CKEDITOR.instances[ckeinst]) CKEDITOR.instances[ckeinst].updateElement();
1763
1764		});
1765		ajax_with_form(
1766			form,
1767			function () {
1768				$("div#onsendmessage").find("#___beginmessage").html(beginmessage);
1769				$("div#onsendmessage").show().next().hide();
1770				$(".postupdate").html(spinner);
1771				$(elem).prop('disabled', true);
1772			},
1773			function (response) {
1774				var firstresponse = response;
1775				var window_caller = $(".___active_window_caller___");
1776				if (window_caller.length == 1) {
1777					if (window_caller.hasClass("add-button-norenew")) {
1778						$("div#onsentmessage").find("#___endmessage").html(endmessage);
1779						$("div#onsentmessage").slideDown().prev().hide();
1780						$(elem).prop('disabled', false); fullresetform(form);
1781						return;
1782					}
1783					var itsEditButton = window_caller.hasClass("edit-button");
1784					var itsAddButton = window_caller.hasClass("add-button");
1785					if (itsEditButton || itsAddButton) {
1786						var renewlink = window_caller.attr("renew");
1787						if (renewlink) {
1788							var editableid = window_caller.attr("editableitem"), editablebodies = false,
1789								editablefullbodies = false;
1790
1791							if (itsEditButton && editableid) {
1792								editablebodies = $(".resoursebody" + editableid);
1793								editablefullbodies = $(".fullresoursebody" + editableid);
1794							}
1795							if (itsEditButton || itsAddButton) {
1796								if (itsAddButton) {
1797									var idadded = firstresponse.replace(/[\n\r\s]/g, '');
1798									var numeric = idadded.match(/\d+/g);
1799									if (numeric) renewlink = renewlink.replace(/(\[ID\])/g, idadded);
1800								}
1801								ajax_asynq(
1802									renewlink,
1803									function () {
1804										if (itsEditButton) console.log("обновление");
1805										else if (itsAddButton) console.log("добавление");
1806										if (itsEditButton) editablebodies.html(spinner);
1807										if (itsEditButton) editablefullbodies.html(spinner);
1808									},
1809									function (response) {
1810										if (itsEditButton) {
1811											var slidehtml = $(response), bodyslide;
1812											slidehtml.find(".edit-button").first().addClass('___active_window_caller___');
1813											bodyslide = slidehtml.find(".resoursebody" + editableid);
1814											editablebodies.replaceWith(bodyslide.clone(true, true));
1815											editablefullbodies.replaceWith(slidehtml);
1816										}
1817										else if (itsAddButton) {
1818											var addtop = window_caller.hasClass("add-top");
1819											var adddown = window_caller.hasClass("add-down");
1820											if (addtop)
1821												added = window_caller.before(response).prev();
1822											else if (adddown)
1823												added = window_caller.after(response).next();
1824											SCROLL_TO(added);
1825										}
1826									},
1827									{},
1828									errorcallback
1829								);
1830							}
1831						}
1832					}
1833				}
1834				$("div#onsentmessage").find("#___endmessage").html(endmessage);
1835				$("div#onsentmessage").slideDown().prev().hide();
1836				$(elem).prop('disabled', false);
1837				if (itsAddButton) fullresetform(form);
1838
1839				$(".postupdate").html("Ответы сохранены"); // для ответов теста
1840			},
1841			{},
1842			errorcallback
1843
1844		);
1845		return;
1846	}
1847}
1848
1849
1850function startSlidingProcess() {
1851	slidingProcess = true;
1852}
1853function stopSlidingProcess() {
1854	slidingProcess = false;
1855}
1856function sliding() {
1857	return slidingProcess;
1858}
1859// Функция подгрузки слайдов. При промотке подгружает слайды, если они есть и
1860// если они ещё не были подгружены
1861function slide(to) {
1862	// alert("Перемотка с подгрузкой слайдов");
1863	$currentIdent = $("#big-modal .carousel-inner div.item.active").attr("slide-identificator");
1864	if (to == "prev") {
1865		// alert("Мотаем назад");
1866		add_right_narrow();
1867		$prevSlidesNum = $("#big-modal .carousel-inner div.item.active[slide-identificator=" + $currentIdent + "]").prev().prev().length;
1868
1869		if (!$prevSlidesNum) {
1870			// alert("Предыдущие слайды не были ещё подгружены. Сейчас проверим,
1871			// имеются ли они вообще");
1872			$prevPrevDivLink = $("div[identificator=" + $currentIdent + "]").prev().prev().attr("more");
1873			if ($prevPrevDivLink) {
1874				// alert("Есть ещё предыдущие слайды, подгружаем их");
1875				$prevPrevDivIdent = $("div[identificator=" + $currentIdent + "]").prev().prev().attr("identificator");
1876				ajax_asynq(
1877					$prevPrevDivLink,
1878					function () {
1879						$("#big-modal .carousel-inner").prepend('<div slide-identificator="' + $prevPrevDivIdent + '" class="item"></div>');
1880					},
1881					function (html) {
1882						$("div[slide-identificator=" + $prevPrevDivIdent + "]").html(html);
1883					}
1884				);
1885
1886			} else {/* alert("Предыдущих слайдов больше нет"); */remove_left_narrow(); }
1887		}// else alert("Предыдущие несколько слайдов уже были подгружены");
1888	}
1889	if (to == "next") {
1890		// alert("Мотаем вперёд");
1891		add_left_narrow();
1892		$nextSlidesNum = $("#big-modal .carousel-inner div.item.active[slide-identificator=" + $currentIdent + "]").next().next().length;
1893		if (!$nextSlidesNum) {
1894			// alert("Следующие слайды не были ещё подгружены. Сейчас проверим,
1895			// имеются ли они вообще");
1896			$nextNextDivLink = $("div[identificator=" + $currentIdent + "]").next().next().attr("more");
1897			if ($nextNextDivLink) {
1898				// alert("Есть ещё следующие слайды, подгружаем их");
1899				$nextNextDivIdent = $("div[identificator=" + $currentIdent + "]").next().next().attr("identificator");
1900				ajax_asynq(
1901					$nextNextDivLink,
1902					function () {
1903						$("#big-modal .carousel-inner").append('<div slide-identificator="' + $nextNextDivIdent + '" class="item"></div>');
1904					},
1905					function (html) {
1906						$("div[slide-identificator=" + $nextNextDivIdent + "]").html(html);
1907					}
1908				);
1909			} else {/* alert("Следующих слайдов больше нет"); */remove_right_narrow(); }
1910		}// else alert("Следующие несколько слайдов уже были подгружены");
1911	}
1912
1913}
1914
1915function confirm_modal(msgtype, btnYes, btnNo, callback) {
1916	msg = definedmsg[msgtype];
1917	bootbox.confirm({
1918		message: msg,
1919		buttons: {
1920			cancel: {
1921				label: btnNo,
1922				className: 'btn-danger pull-right'
1923			},
1924			confirm: {
1925				label: btnYes,
1926				className: 'btn-success pull-left'
1927			}
1928
1929		},
1930		callback: function (result) {
1931			if (result) callback();
1932		}
1933	});
1934
1935}
1936
1937function confirm_modal2(msg, btnYes, btnNo, callback) {
1938	bootbox.confirm({
1939		message: msg,
1940		buttons: {
1941			cancel: {
1942				label: btnNo,
1943				className: 'btn-danger pull-right'
1944			},
1945			confirm: {
1946				label: btnYes,
1947				className: 'btn-success pull-left'
1948			}
1949
1950		},
1951		callback: function (result) {
1952			if (result) callback();
1953		}
1954	});
1955
1956}
1957
1958function confirm_modal3(link, btnYes = "OK", btnNo = "Назад", callback = function () { },data=null) {
1959	bootbox.confirm({
1960		message: curl(link,data),
1961		buttons: {
1962			cancel: {
1963				label: btnNo,
1964				className: 'btn-danger pull-right'
1965			},
1966			confirm: {
1967				label: btnYes,
1968				className: 'btn-success pull-left'
1969			}
1970
1971		},
1972		callback: function (result) {
1973			if (result) { 
1974                              return callback(); }
1975		}
1976	});
1977
1978	if (btnYes ===false) $("[data-bb-handler=confirm]").addClass('d-n');
1979	if (btnNo ===false) $("[data-bb-handler=cancel]").addClass('d-n');
1980
1981}
1982
1983
1984function close_modal(identificator = "undefined") {
1985	$('#big-modal').modal("hide");
1986}
1987
1988
1989function show_modal(elem, one = false, url = "", options = {backdrop: 'static', keyboard: false}) {
1990
1991	elem = one ? $(elem) : $(elem).closest("div.infoblock");
1992
1993	$thisLink = (url ? url : $(elem).attr("more"));
1994	$post = $(elem).attr("post");
1995	$thisIdent = $(elem).attr("identificator");
1996
1997	// загрузить соседние фреймы
1998	$prevLink = (one ? false : $(elem).prev().attr("more"));
1999	$nextLink = (one ? false : $(elem).next().attr("more"));
2000
2001	$prevIdent = $(elem).prev().attr("identificator");
2002	$nextIdent = $(elem).next().attr("identificator");
2003
2004	$("#big-modal .carousel-inner").html("");
2005
2006	$("#big-modal .carousel-inner").attr("more",$thisLink);
2007	// alert("Начинается подгрузка новостей");
2008
2009	if ($thisLink) {
2010		ajax_asynq(
2011			$thisLink,
2012			function () {
2013				$("#big-modal .carousel-inner").html(spinner);
2014				// <i class="fa fa-spinner fa-spin fa-2x"></i>
2015			},
2016			function (html) {
2017				$("#big-modal .carousel-inner").html("");
2018				$("#big-modal .carousel-inner").append('<div slide-identificator="' + $thisIdent + '" class="item active"><div class=animated></div></div>');
2019				$("div[slide-identificator=" + $thisIdent + "] div.animated").html(html);
2020				$("div[slide-identificator=" + $thisIdent + "] div.animated").show(400, 'swing');
2021				if ($prevLink) {
2022					ajax_asynq(
2023						$prevLink,
2024						function () {
2025							$("#big-modal .carousel-inner").prepend('<div slide-identificator="' + $prevIdent + '" class="item"></div>');
2026							add_left_narrow();
2027						},
2028						function (html) {
2029							$("div[slide-identificator=" + $prevIdent + "]").html(html);
2030						}
2031					);
2032				}
2033				if ($nextLink) {
2034					ajax_asynq(
2035						$nextLink,
2036						function () {
2037							$("#big-modal .carousel-inner").append('<div slide-identificator="' + $nextIdent + '" class="item"></div>');
2038							add_right_narrow();
2039						},
2040						function (html) {
2041							$("div[slide-identificator=" + $nextIdent + "]").html(html);
2042						}
2043					);
2044				}
2045				class_nice();
2046                                uploading();
2047			},
2048			$post
2049		);
2050		// alert("Сейчас откроется окно");
2051
2052		if ($thisLink) $('#big-modal').modal(options);
2053
2054
2055		// alert("Окно открылось");
2056
2057	}
2058}
2059
2060function show_modal_slide(elem, id, event) { // вывод конкретного слайда
2061
2062	infoblock = $(elem).closest("div.infoblock");
2063
2064	var oldmore = $(infoblock).attr("more");
2065
2066	$(infoblock).attr("more", "/main/lenta/info/id=" + id + "/");
2067
2068	show_modal(elem, event);
2069
2070	$(infoblock).attr("more", oldmore);
2071}
2072
2073
2074function check_narrows() {
2075	// alert("Проверка стрелок");
2076
2077	if ($("#big-modal div.item:first").hasClass("active")) {
2078		$("a.left-narrow").removeClass("otk_str");
2079	}
2080	else
2081		$("a.left-narrow").addClass("otk_str");
2082	if ($("#big-modal div.item:last").hasClass("active")) {
2083		$("a.right-narrow").removeClass("otk_str");
2084	}
2085	else
2086		$("a.right-narrow").addClass("otk_str");
2087
2088}
2089function add_left_narrow() {
2090	// alert("Добавляем левую стрелку");
2091	$("a.left-narrow").addClass("otk_str");
2092}
2093function add_right_narrow() {
2094	// alert("Добавляем правую стрелку");
2095	$("a.right-narrow").addClass("otk_str");
2096}
2097function remove_left_narrow() {
2098	// alert("Удаляем левую стрелку");
2099	$("a.left-narrow").removeClass("otk_str");
2100}
2101function remove_right_narrow() {
2102	// alert("Удаляем правую стрелку");
2103	$("a.right-narrow").removeClass("otk_str");
2104}
2105
2106
2107function alertObject(obj) {
2108	for (var key in obj) {
2109		alert('key: ' + key + '\n' + 'value: ' + obj[key]);
2110		if (typeof obj[key] === 'object') {
2111			alertObject(obj[key]);
2112		}
2113	}
2114}
2115
2116
2117
2118function ajax_with_message(script, start, end) {
2119	$.ajax({
2120		url: script,
2121		cache: false,
2122		beforeSend: function (html) { $(".plup_msg").html(start); $(".plup_fade,.plup_msg").fadeIn(500); },
2123		success: function (html) { $(".plup_msg").html(end); setTimeout(function () { $(".plup_fade,.plup_msg").fadeOut(1000) }, 2000); }
2124	});
2125}
2126function ajax_with_file(form, start = function () { }, end = function () { }) {
2127	$$f({
2128		formid: form,
2129		url: $("#" + form).attr("action"),
2130		onstart: start,
2131		onsend: end
2132	});
2133
2134}
2135
2136function curl(
2137	script,
2138	data = {}
2139) {
2140	var result = "";
2141	$.ajax({
2142		url: script,
2143		type: "POST",
2144		data: data,
2145		async: false,
2146		cache: false,
2147		beforeSend: function () { },
2148		success: function (html) { result = html; },
2149		error: function (html) { result = ""; }
2150	});
2151
2152	return result;
2153}
2154
2155function ajax_synq(
2156	script,
2157	start = function () { },
2158	end = function () { },
2159	data = {},
2160	error = function (request, status, error) {
2161		servererror(request, status, error)
2162	}
2163) {
2164	$.ajax({
2165		url: script,
2166		type: "POST",
2167		data: data,
2168		async: false,
2169		cache: false,
2170		beforeSend: start,
2171		success: end,
2172		error: error
2173	});
2174
2175	return
2176}
2177
2178function ajax_with_form(form, start = function () { }, end = function () { }, error = function (request, status, error) {
2179	servererror(request, status, error)
2180}) {
2181	$.ajax({
2182		type: "POST",
2183		url: $(form).attr("action"),
2184		cache: false,
2185		data: $(form).serialize(),
2186		beforeSend: start,
2187		success: end,
2188		error: error
2189	});
2190}
2191function ajax_return(script, p1, p2, p3) {
2192	var r;
2193	$.ajax({
2194		async: false,
2195		type: "POST",
2196		url: script,
2197		cache: false,
2198		data: { p1: p1, p2: p2, p3: p3 },
2199		success: function (html) {
2200			r = html;
2201		}
2202	});
2203	return r;
2204}
2205
2206function ajax_return_trim(script, p1, p2) {
2207	var r;
2208	$.ajax({
2209		async: false,
2210		type: "POST",
2211		url: script,
2212		cache: false,
2213		data: { p1: p1, p2: p2 },
2214		success: function (html) {
2215			r = html;
2216			r = r.replace(/[\n\r\s]/g, '');
2217		}
2218	});
2219	return r;
2220}
2221function PHP_END_FUNCTION(script, key, val, func = function () { }) {
2222	var arr = {};
2223	arr[key] = val;
2224	$.ajax({
2225		async: false,
2226		type: "POST",
2227		url: script,
2228		cache: false,
2229		data: arr,
2230		success: func
2231	});
2232}
2233
2234//прокрутка вниз
2235function scrolldown(elem) {
2236	elem.scrollTop(elem.prop('scrollHeight'));
2237}
2238
2239function SCROLL_TO(elem, source = "body,html") {
2240	if (elem.length == 1) {
2241		console.log("Мотаем");
2242		//alert("Мотаем");
2243		//alert('ssss');
2244
2245		var destination = elem.offset().top-41;
2246		//$(elem).get(0).scrollIntoView();
2247		$(source).animate({ scrollTop: destination }, 800);
2248	}
2249}
2250
2251
2252function preview(field, image) {
2253	console.log("n=" + $(field).length);
2254	$(field).change(function () {
2255		var input = $(this)[0];
2256		if (input.files && input.files[0]) {
2257			if (input.files[0].type.match('image.*')) {
2258				var reader = new FileReader();
2259				reader.onload = function (e) { $(image).attr('src', e.target.result); }
2260				reader.readAsDataURL(input.files[0]);
2261			}
2262			else {
2263				console.log('Загружено не изображение');
2264			}
2265
2266		}
2267		else
2268			console.log('Не было загружено файлов либо API не поддерживается');
2269	});
2270}
2271
2272function captcha() // вывод капчи
2273{
2274	ajax_asynq(
2275		"/captcha",
2276		function () { $('.captcha').html(spinner) },
2277		function (src) { $('.captcha').attr("src", src); }
2278	);
2279}
2280
2281function testanswers(key = 0, id = "new", title = "", checked = "", elem = null) // варианты
2282// ответа
2283// для
2284// теста
2285// (добавление
2286// удаление
2287// полей)
2288{
2289	if (elem) {
2290		var val = $(elem).closest(".myAnswer-admin").children("input:hidden").val();
2291		// console.log($(elem).closest(".myAnswer").children(".hid").html());
2292		$(elem).closest(".myAnswer-admin").children("input:hidden").val(-1 * val);
2293		// console.log($(elem).closest(".myAnswer").children(".hid").html());
2294		$(elem).closest(".myAnswer-admin").css("display", "none");
2295
2296	}
2297	else {
2298		if (!key) key = $(".myAnswer-admin").length;
2299
2300		$(".myAnswers-admin").append("<div class=myAnswer-admin><input type=hidden id=id_" + key + " name=id_" + key + " value=" + id + "><input  type=radio " + checked + " value=" + key + " id=correct_" + key + " name=correct><input type=text id=question_" + key + " name=question_" + key + " class='form-control d-i-b v-a-t' value='" + title + "'><a onclick=testanswers(0,0,'','',this) class=btn btn-alert>X</a></div>");
2301	}
2302
2303}
2304
2305function finishtest(division, test) // варианты ответа для теста (добавление
2306// удаление полей)
2307{
2308	var data = ""; // post data
2309	if ($(".finishtest").hasClass("finished")) return 0; // если тест уже
2310	// завершен
2311	$(".myAnswer > input:radio:checked").each(function (key, value) {
2312		data += (data ? "&" : "") + "answer_" + key + "=" + $(this).val();
2313	}
2314	);
2315
2316	ajax_asynq(
2317		"/me/" + division + "tests/" + test + "/check",
2318		function () { $(".finishtest").html(spinner); },
2319		function (data) {
2320			data = JSON.parse(data);
2321			if (isNaN(data["score"]))
2322				$(".finishtest").html("Ошибка завершения теста. Попробуйте еще раз.");
2323			else {
2324				$(".finishtest").html("Ваш результат: " + data["score"] + " б.");
2325				$(".finishtest").addClass("finished");
2326				prompt(true);
2327			}
2328		},
2329		data
2330	);
2331
2332	return 0;
2333
2334}
2335
2336function blockmodal() // блокирующее модальное окно
2337{
2338	/*ajax_asynq("/session/control");
2339
2340	setInterval(function () { ajax_asynq("/session/control") }, 30000);
2341
2342	$(".blockmodal.on").each(function () {
2343		if ($(this).attr("more").trim() == "") return;
2344
2345		countdown("Просмотр сайта будет доступен через {sec} сек.", $(this).attr("time"));
2346
2347		show_modal($(this), true, "", { backdrop: 'static', keyboard: false });
2348		$(".cross-modal-close").hide();
2349		// отключить возможнсть закрытия
2350	}
2351	);*/
2352}
2353
2354function popup() // всплывающее окно
2355{
2356	return;
2357	$(".popup.on").each(function () {
2358		if ($(this).attr("more").trim() == "") return;
2359
2360		show_modal($(this), true);
2361	}
2362	);
2363	//initialization();
2364}
2365
2366function checkstatus()
2367{
2368	return curl("/myservice/reg/getModal/","passport="+$("input.passport").val()).trim();
2369}
2370
2371function prompt($force = false) // всплывающая подсказка
2372{
2373	/*$(".prompt.on").each(function () {
2374		if ($(this).attr("msg").trim() == "") return;
2375		var redirect = $(this).attr("redirect");
2376		var passport = $(this).attr("passport");
2377		confirm_modal2($(this).attr("msg"), "OK", "Назад", function () {ajax_asynq(`/session/modal:${passport}`,null,function(){location.href = redirect;}); });
2378	}
2379	);*/
2380
2381	if (window.location.href.includes('admin')) return;
2382
2383	var passport = $("input.passport").val();
2384
2385	var result = checkstatus();
2386
2387	result = JSON.parse(result);
2388
2389	//
2390
2391	_this = $(".prompt");
2392
2393	//if ($(_this).attr("msg").trim() == "") return;
2394
2395		$(".hintitem").each(
2396			function(){
2397				var status = result[$(this).attr("passport")]["status"];
2398				var redirect = result[$(this).attr("passport")]["redirect"];
2399				var msg = result[$(this).attr("passport")]["msg"];
2400				$(this).html(`<a href='${redirect}'>${msg}</a>`);
2401
2402				if (status && status != $(this).attr("status")){
2403					$(this).attr("status",status); // было ли изменение статуса
2404					confirm_modal2(msg, "OK", "Назад", function () {location.href = redirect;});
2405				}
2406
2407			});
2408		
2409	//initialization();
2410}
2411
2412function entity() // виджеты
2413{
2414	$(".entity").each(function () {
2415		var link = "/json";
2416		var _this = this;
2417		ajax_asynq(
2418			link,
2419			function () { $(_this).html(spinner); },
2420			function (data) {
2421
2422			}
2423		);
2424		"entity=" + $(this).attr("entity") + "&filter=user&field=" + $(this).attr("field"),
2425			function () {
2426				console.log("widget error");
2427			}
2428	}
2429	);
2430}
2431
2432function infowidgets(_class = "", _spinner = true) // виджеты
2433{
2434	//event.preventDefault();
2435	$(`.infowidget${_class}`).each(function () {
2436		var link = $(this).attr("link");
2437		var _this = this;
2438		if (!link.trim().length || ($(this).hasClass("authonly") && !$("input.session").val())) return;
2439		if ($(this).attr("type") && $(this).attr("type")!=$("input.usertype").val()) return;
2440		ajax_asynq(
2441			link,
2442			function () { if (_spinner) $(_this).html(spinner); },
2443			function (html) {
2444				$(_this).html(html.indexOf("notfound") == -1 ? html : "");
2445				class_nice();
2446				//$(".chatmain").focus();
2447				//autoscroll($(".chatmain").eq(0));
2448				//SCROLL_TO($(".chatitem").last(),$(".chatmain"));
2449			},
2450			$(this).attr("post") + "&passport="+$('.passport').val(),
2451			function () {
2452				console.log("widget error");
2453			}
2454		);
2455
2456	}
2457	);
2458}
2459
2460function renew() // обновление элемента
2461{
2462	//event.preventDefault();
2463	$(`.renewable`).each(function () {
2464		var link = $(this).attr("link");
2465		var _this = this;
2466		ajax_asynq(
2467			link,
2468			function () { $(_this).html(spinner); },
2469			function (html) {
2470				$(_this).html(html);
2471			}
2472		);
2473	}
2474	);
2475}
2476
2477function columnsum(elems, attr = "") // сумма элементов
2478{
2479	var total = 0;
2480	$(elems).each(function () {
2481		total += parseInt(attr ? (attr == "value" ? $(this).val() : $(this).attr(attr)) : parseInt($(this).text()));
2482	});
2483	// console.log(total);
2484	return total;
2485
2486}
2487
2488function countdown(msg, time = 30) // таймер элемент
2489{
2490	time = (isNaN(time) ? 30 : time);
2491	msg = msg.replace("{sec}", time);
2492	var tID = setInterval(function () { if (!time) { clearInterval(tID); ajax_asynq("/session/reset"); $('#big-modal').data('bs.modal').options.backdrop = false; $('#big-modal').data('bs.modal').options.keyboard = true; serversuccess(); $(".cross-modal-close").show(); } else { msg = msg.replace(time, time - 1);/*serversuccess(msg,0);*/time--; } }, 1000);
2493}
2494
2495
2496//заполнить html элементы полями из json
2497function json_html(json, _class = ".dbfield") {
2498	//var json = JSON.parse(data);
2499	if (json.length == 0) return false;
2500	$(_class).each(function (key) {
2501		if ($(this).prop("tagName").toLowerCase() == "input")
2502			$(this).val(json[$(this).attr("id")]);
2503		else
2504			$(this).text(json[$(this).attr("id")]);
2505	});
2506
2507	return true;
2508
2509
2510}
2511
2512
2513//параметры отображения
2514function json_params() {
2515
2516	return;
2517	ajax_asynq("/myservice/project/getButtons/", function () { },
2518		function (json) {
2519			json = JSON.parse(json);
2520			//json_html(json, ".parse");
2521			$(".substitute").each(function (key) {
2522				$(this).text(json[$(this).attr("from")].trim() != "" ? json[$(this).attr("from")] : $(this).text());
2523			});
2524
2525			//json_html(json,".parse");
2526		}
2527	);
2528}
2529
2530function save_as_pdf() {
2531
2532	var doc = new jsPDF($("#orientation").val() ? "landscape" : "portrait");
2533	var options = {};
2534	var page = $('.a4').get(0);
2535
2536	doc.addHTML(page, 0, 0, options, function () { doc.save('a4.pdf') });
2537	//doc.text('Hello world!', 10, 10);
2538}
2539
2540function redirect($class="") {
2541
2542	console.log($class);
2543	var url = $('.myredirect'+$class).val();
2544	if (url===undefined) return;
2545	location.href = url;
2546}
2547
2548function mustache(obj,attr)
2549{
2550	return $(obj).attr(attr).replace(/{{([^]+)}}/,function(a, b){
2551    return eval(b).trim();
2552});
2553}
2554
2555//получить аттрибуты
2556function jqattrs($class,$attr,$unique=false)
2557{
2558	var $attr = $attr;
2559	var $result =  $($class).map(function(){
2560		return $(this).attr($attr);
2561	}).get();
2562	return $unique ? jQuery.unique($result) : $result;
2563}
2564
2565
2566//таблица из json
2567function json_table(data,container="body")
2568{
2569        /*var data = '{"aaa":{"xxx":111,"yyy":222,"zzz":333},"bbb":{"xxx":444,"yyy":555,"zzz":666},"ccc":{"xxx":777,"yyy":888,"zzz":999}}';*/
2570        //["field1"=>"value1","field2"=>"value2"];
2571        var json = JSON.parse(data);
2572                var headers = false;
2573				var nodata = $('<div><h4>НЕ НАЙДЕНО</h4></div>');
2574                var table = $('<table>');
2575                var thead = $('<thead>');
2576                var tbody = $('<tbody>');
2577                var total = json.length;
2578				if (total==0)
2579				{
2580					nodata.appendTo(container);
2581					return true;
2582				}
2583        $.each(json,function(index1, value1){
2584
2585                var tr = $('<tr>');
2586                $("<th>"+ index1+"</th>").appendTo(tr);
2587                if (!headers) {$("<th>ВСЕГО: "+total+"</th>").appendTo(thead);}
2588                $.each(value1,function(index2, value2){
2589                  if (!headers) {$("<th>"+ index2+"</th>").appendTo(thead);}
2590                  $("<td>"+ value2+"</td>").appendTo(tr);
2591                });
2592                headers = true;
2593                tr.appendTo(tbody);
2594});
2595
2596                thead.appendTo(table);
2597                tbody.appendTo(table);
2598                table.appendTo(container);
2599        return true;
2600}
2601
2602
2603

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.