Guest User

Untitled

a guest
Sep 19th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 168.37 KB | None | 0 0
  1. var openedAllRec = false;
  2. var recordView = false;
  3. var BLOCK_HEIGHT = 19; // Фиксированный размер блока (30 мин)
  4.  
  5. /**
  6. * Инициализирует события быстрого редактирования в календаре
  7. */
  8. function init_calendar_fast_edit() {
  9. var elems = $('[class^="fast_edit_span_"].not-init, input.sub_edit_link_input.not-init');
  10.  
  11. if (elems.length > 0) {
  12. elems.each(function(i, elem) {
  13. if ($(elem).hasClass('fast_edit_text')) {
  14. addHandler_text(elem);
  15. autosize(elem);
  16. } else if ($(elem).hasClass('fast_edit_span--multi-select')) {
  17. addHandler_mult_select(elem);
  18. } else if ($(elem).hasClass('sub_fast_edit_select--select')) {
  19. addHandler_select(elem);
  20. } else if ($(elem).hasClass('combobox') ||
  21. $(elem).hasClass('sub_edit_link')) {
  22. calendar_combobox($(elem), true);
  23. } else if ($(elem).hasClass('fast_edit_file')) {
  24. addHandler_file(elem);
  25. } else if ($(elem).hasClass('fast_edit_datepicker')) {
  26. addHandler_date(elem);
  27. $(elem).datetimepicker({
  28. showOn:"button",
  29. buttonImage: "images/calbtn.png",
  30. buttonImageOnly: true,
  31. buttonText: lang.Calendar,
  32. showAnim: (('\v'=='v')?"":"show")
  33. });
  34. }
  35.  
  36. });
  37. }
  38.  
  39. $('.not-init').each(function() {
  40. $(this).removeClass('not-init');
  41. });
  42. }
  43.  
  44. // Показать/скрыть календарь сбоку
  45. function viewMiniCalendar() {
  46. if (document.getElementById("mini_calendar_layout").style.display == "none") { // Календарь скрыт - показываем
  47. $("#mini_calendar_layout").animate({width: "show", opacity: "show", marginLeft: "30px"}, 200);
  48. $.cookie("mini_calendar_hide" + calendar.id, null);
  49. document.getElementById("view_calendar_arrow").innerHTML = "◀";
  50. }
  51. else { // Скрываем календарь
  52. $("#mini_calendar_layout").animate({width: "hide", opacity: "hide", marginLeft: "0px"}, 200);
  53. $.cookie("mini_calendar_hide" + calendar.id, 1);
  54. document.getElementById("view_calendar_arrow").innerHTML = "▶";
  55. hideOneEvent();
  56. }
  57. setTimeout("fixCalendarLayout()", 300);
  58. }
  59.  
  60. // Листание календаря сбоку, dir - направление, вперёд-назад от текущей даты
  61. function getMiniCalendar(dir) {
  62. $("#mini_calendar_header").animate({color: '#c0c0c0'}, 200);
  63. $.ajax({
  64. type: "POST",
  65. url: "calendar.php",
  66. data: {
  67. csrf: csrf,
  68. id: calendar.id,
  69. get: 'mini_calendar',
  70. data: {month: calendar.month, year: calendar.year, direction: dir}
  71. },
  72. success: function (msg) {
  73. obj_data = JSON.parse(msg);
  74. if (!obj_data) {
  75. jalert("Incorrect response server!");
  76. return;
  77. }
  78.  
  79. var mini_calendar = obj_data.mini_calendar;
  80. document.getElementById("mini_calendar_header").innerHTML = obj_data.monthname + " " + obj_data.year;
  81. $("#mini_calendar_header").animate({color: '#000000'}, 200);
  82.  
  83. calendar.month = obj_data.month;
  84. calendar.year = obj_data.year;
  85.  
  86. // Построение календаря
  87. var cal_content = "";
  88. for (str_num in mini_calendar) {
  89. cal_content += "<tr";
  90. if (mini_calendar[str_num]['cur_week']) cal_content += " class='m_cur_week'"; // Текущая неделя
  91. cal_content += ">";
  92. for (day_num in mini_calendar[str_num]) {
  93. if (day_num == "cur_week") continue;
  94. cal_content += "<td onclick='jumpToDay(" + mini_calendar[str_num][day_num]['day'] + ", " + mini_calendar[str_num][day_num]['month'] + ", " + mini_calendar[str_num][day_num]['year'] + ")'";
  95. if (mini_calendar[str_num][day_num]['cur'] != "1" || mini_calendar[str_num][day_num]['today'] == "1") {
  96. cal_content += " style='";
  97. if (mini_calendar[str_num][day_num]['cur'] != "1") // День текущего отображаемого месяца
  98. cal_content += "color:#989898;";
  99. if (mini_calendar[str_num][day_num]['today'] == "1")
  100. cal_content += "border: 1px dotted #989898; color: #cd6b69"; // Сегодняшний день
  101. cal_content += "'";
  102. }
  103. cal_content += ">"
  104. if (mini_calendar[str_num][day_num]['event'] == "1")
  105. cal_content += "<b>" + mini_calendar[str_num][day_num]['day'] + "</b>";
  106. else
  107. cal_content += mini_calendar[str_num][day_num]['day'];
  108. cal_content + "</td>";
  109. }
  110. cal_content += "</tr>";
  111. }
  112. $("#mini_calendar_content").animate({opacity: 'hide'}, 200, function () {
  113. $("#mini_calendar_content").html(cal_content);
  114. $("#mini_calendar_content").animate({opacity: 'show'}, 400);
  115. });
  116. }
  117. });
  118. }
  119.  
  120. // Переходы по типам и страницам календаря
  121. /**
  122. * @param {string} type - режим календаря(день, неделя, месяц)
  123. */
  124. function calendar_transition(link, type) {
  125. if (type) {
  126. $.cookie('default_calendar_view', type)
  127. }
  128. if ($(".event_options_block:visible").length > 0) {
  129. $("#fast_search_submit_form").attr("action", link);
  130. fastSearchSubmit();
  131. }
  132. else
  133. location.href = link;
  134. }
  135.  
  136. // Переход ко дню
  137. function jumpToDay(day, month, year) {
  138. calendar_transition("calendar.php?id=" + calendar.id + "&day=" + day + "&month=" + month + "&year=" + year);
  139. }
  140.  
  141. // Показать все записи дня (временно не используется)
  142. function viewAllRecords(day, month, year) {
  143. if (openedAllRec) {
  144. hideAllRecords();
  145. setTimeout("viewAllRecords('" + day + "', " + month + ", " + year + ")", 100);
  146. return;
  147. }
  148. var qWidth;
  149. var qHeight;
  150.  
  151. document.getElementById("q_short_header_" + day + "_" + month + "_" + year).style.display = "none";
  152. document.getElementById("q_full_header_" + day + "_" + month + "_" + year).style.display = "block";
  153.  
  154. qWidth = '300';
  155.  
  156.  
  157. document.getElementById("quadr_" + day + "_" + month + "_" + year).style.width = "300px";
  158. document.getElementById("quadr_" + day + "_" + month + "_" + year).style.position = "absolute";
  159. document.getElementById("quadr_" + day + "_" + month + "_" + year).style.zIndex = 400;
  160. document.getElementById("quadr_" + day + "_" + month + "_" + year).style.border = "1px solid black";
  161. document.getElementById("quadr_" + day + "_" + month + "_" + year).style.background = "#ffffff";
  162.  
  163. $("#hidden_items" + day + "_" + month + "_" + year).animate({height: "show"}, 200);
  164. $("#more_link" + day + "_" + month + "_" + year).animate({height: "hide", opacity: "hide"}, 200);
  165.  
  166. openedAllRec = day + "_" + month + "_" + year;
  167. }
  168.  
  169. // Скрыть все записи дня (временно не используется)
  170. function hideAllRecords() {
  171. if (!openedAllRec) return;
  172. $("#more_link" + openedAllRec).animate({height: "show", opacity: "show"}, 100);
  173. $("#hidden_items" + openedAllRec).animate({height: "hide"}, 100);
  174.  
  175. sourceWidth = $("#cell_" + openedAllRec).width() + "px";
  176. $("#quadr_" + openedAllRec).animate({width: sourceWidth, marginLeft: "0px"}, 100, function () {
  177. document.getElementById("quadr_" + openedAllRec).style.position = "static";
  178. document.getElementById("quadr_" + openedAllRec).style.zIndex = 0;
  179. document.getElementById("quadr_" + openedAllRec).style.border = "none";
  180. document.getElementById("quadr_" + openedAllRec).style.background = "transparent";
  181. document.getElementById("q_short_header_" + openedAllRec).style.display = "block";
  182. document.getElementById("q_full_header_" + openedAllRec).style.display = "none";
  183.  
  184. //$("#cell_" + openedAllRec).find("[id^=calendar_event_line_]").width($("#quadr_" + openedAllRec).width()-4);
  185. openedAllRec = false;
  186. });
  187. }
  188. var my_event_id = calendar.default_event;
  189. // Смена события по умолчанию
  190. function changeDefautEvent(event_id) {
  191. my_event_id = event_id;
  192. if (event_id == calendar.default_event) return; // Клик по текущему событию
  193. calendar.default_event = event_id;
  194. $.cookie("calendar_default_event" + calendar.id, event_id);
  195. $(".calendar_legend_event").removeClass("calendar_legend_default");
  196. $("#calendar_legend_event" + event_id).addClass("calendar_legend_default");
  197. if (calendar.group_field != all_calendar_events[event_id]['group_field'] && calendar.day) // Дневной вид, поле группировки текущего события не равно полю группировки нового события - перестраиваем календарь
  198. window.location.reload();
  199. }
  200.  
  201. // Скрытые события
  202. /**
  203. * @param {string} event_id
  204. * @param {string} hce - hidden calendar event
  205. * @param {boolean} - first init flag
  206. */
  207. var hiddenEvents = new Object;
  208. function viewHideEvents(event_id, type, flag = false) {
  209. if ($.cookie("hce_" + event_id + "_" + type) && !flag) { // Отображаем события
  210. $(".calendar_event_id" + event_id).fadeIn(200);
  211. $("#one_event_legend" + event_id).animate({opacity: 1}, 200);
  212. $.removeCookie("hce_" + event_id + "_" + type);
  213. }
  214. else { // скрываем события
  215. $(".calendar_event_id" + event_id).fadeOut(200);
  216. $("#one_event_legend" + event_id).animate({opacity: 0.3}, 200);
  217. viewSystemHelp(event_id, 0)
  218. $.cookie("hce_" + event_id + "_" + type, true);
  219. }
  220. }
  221.  
  222. function resizeRow() {
  223. var ma = new Array();
  224. var start = new Date();
  225. var rows = $('#big_calendar table tbody')[0].childElementCount;
  226. var table_all_options = [];
  227. var event_condition = '';
  228.  
  229. for (var i = 0; i < Object.keys(all_calendar_events).length; i++) {
  230. table_all_options.push(Object.keys(all_calendar_events)[i]);
  231. event_condition += Object.keys(all_calendar_events)[i];
  232. }
  233. ma[event_condition] = new Array();
  234. for (var i = 0; i < rows; i++) {
  235. ma[event_condition]['row'+i] = new Array();
  236. }
  237.  
  238.  
  239. for (var i = 1; i < rows; i++) {
  240. if (i % 2) {
  241. var el = $('#big_calendar table tbody')[0].children[i].children[1];
  242. } else {
  243. var el = $('#big_calendar table tbody')[0].children[i].children[0];
  244. }
  245.  
  246. for (var j = 0; j < el.children.length ; j++) {
  247. if (el.children[j].getAttribute('is_background') == 0) {
  248. var sortby = parseInt(el.children[j].id.split("_")[el.children[j].id.split("_").length-1]);
  249. var inside_el = el.children[j];
  250. var bg_event = inside_el.getAttribute('is_background') ? false : true;
  251. ma[event_condition]['row'+i].push({
  252. sortby,
  253. id: inside_el.id,
  254. width: '0',
  255. clone: false,
  256. bg: bg_event,
  257. order: j+1,
  258. checked: false
  259. });
  260. if (inside_el.getAttribute('event_length') > 1) {
  261. for (var k = 1; k < inside_el.getAttribute('event_length'); k++) {
  262. ma[event_condition]['row' + (i + k)].push({
  263. sortby,
  264. id: inside_el.id,
  265. width: '0',
  266. clone: true,
  267. bg: bg_event,
  268. order: null,
  269. checked: false
  270. })
  271. }
  272. }
  273. }
  274. }
  275. }
  276.  
  277. // сортируем массив по колизиям
  278.  
  279. var trash = Object.keys(ma[event_condition]);
  280.  
  281. var trashRow = [];
  282. var trashRow2 = [];
  283. for (var i = 1; i < trash.length; i++) {
  284. var prev_row, this_row;
  285.  
  286. prev_row = JSON.parse(JSON.stringify(ma[event_condition][trash[i-1]]));
  287.  
  288. this_row = JSON.parse(JSON.stringify(ma[event_condition][trash[i]]));
  289. trashRow = JSON.parse(JSON.stringify(ma[event_condition][trash[i]]));
  290.  
  291. if (prev_row.length > 0 && this_row.length > 0) {
  292. for (var j = 0; j < this_row.length; j++) {
  293. for (var k = 0; k < prev_row.length; k++) {
  294. if(this_row[j].id === prev_row[k].id) {
  295. prev_row[k].checked = true;
  296. prev_row[k].clone = true;
  297. trashRow[j].checked = true;
  298. }
  299. }
  300. }
  301.  
  302. var s = trashRow.length;
  303. while (s--) {
  304. if (trashRow[s].checked) {
  305. trashRow.splice(s, 1);
  306. }
  307. }
  308. var g = prev_row.length;
  309. while (g--) {
  310. if (!prev_row[g].checked && (trashRow.length !== 0)) {
  311. prev_row[g] = trashRow[0];
  312. prev_row[g].checked = true;
  313. trashRow.shift();
  314. }
  315. }
  316.  
  317. for (var j = 0; j < prev_row.length; j++) {
  318. if (!prev_row[j].checked) {
  319. prev_row.splice(j, 1);
  320. }
  321. }
  322. //если не выпотрошили прошлый ряд, присовываем
  323. while (trashRow.length > 0) {
  324. trashRow[0].checked = true;
  325. prev_row.push(trashRow[0]);
  326. trashRow.shift();
  327. }
  328.  
  329. for (var j = 0; j < prev_row.length; j++) {
  330. if (prev_row[j].checked) {
  331. prev_row[j].checked = false;
  332. }
  333. }
  334.  
  335. ma[event_condition]['row'+i] = prev_row;
  336. }
  337. }
  338.  
  339. var max_elements_in_row = 0;
  340. for (i=0; i< trash.length; i++) {
  341. if (ma[event_condition][trash[i]].length > max_elements_in_row) {
  342. max_elements_in_row = ma[event_condition][trash[i]].length;
  343. }
  344. }
  345.  
  346. var maxTableWidth = parseInt($(window).width() - $("#calendar_pad").width()) - 67 - 74;
  347.  
  348. var elements_width = maxTableWidth/max_elements_in_row;
  349.  
  350. for (var i = 0; i < trash.length; i++) {
  351. for (var j = 0; j < ma[event_condition][trash[i]].length; j++) {
  352. ma[event_condition][trash[i]][j].width = elements_width + 'px';
  353. ma[event_condition][trash[i]][j].margin = elements_width*ma[event_condition][trash[i]][j].order + 'px';
  354. }
  355.  
  356. }
  357.  
  358. var end = new Date();
  359. console.log('max_elements_in_row = ' + max_elements_in_row);
  360. console.log('time = ' + (end - start));
  361.  
  362. return [ma, max_elements_in_row];
  363. }
  364.  
  365. // вытаскиваем уникальные ключи в одномерном массиве
  366. function unique(arr) {
  367. var obj = {};
  368. for (var i = 0; i < arr.length; i++) {
  369. var str = arr[i];
  370. obj[str] = true;
  371. }
  372. return Object.keys(obj);
  373. }
  374. // Показать быстрый поиск события
  375. function toogleOptions(event_id) {
  376. if (document.getElementById("event_opitons" + event_id).style.display == "none") { // Показываем быстрый поиск
  377. $("#event_opitons" + event_id).animate({height: 'show', opacity: 'show'}, 200);
  378. document.getElementById("toogle_event_option" + event_id).innerHTML = "▼";
  379. if (document.getElementById("event_fast_search_submit").style.display == "none") // Показываем кнопку "применить", если она не выведена
  380. $("#event_fast_search_submit").fadeIn(400);
  381. }
  382. else { // Скрываем быстрый поиск
  383. $("#event_opitons" + event_id).animate({height: 'hide', opacity: 'hide'}, 200, function () {
  384. document.getElementById("event_opitons" + event_id).style.display = "none";
  385. if ($("[id^=event_opitons]:visible").length == 0) // Скрываем кнопку "применить", если больше нет отображаемых опций
  386. $("#event_fast_search_submit").fadeOut(200);
  387. });
  388. document.getElementById("toogle_event_option" + event_id).innerHTML = "▶";
  389. }
  390. }
  391.  
  392. // Быстрый поиск
  393. function fastSearchSubmit() {
  394. // Строим форму по полям быстрого поиска
  395. $("#calendar_event_list [id^=fast_edit_span_]").each(function () {
  396. var fieldId = $(this).attr("field_id");
  397. var eventId = str_replace("fast_edit_span_" + fieldId + "_e", "", this.id);
  398. if ($(this).attr("f_value") != undefined) var value = $(this).attr("f_value");
  399. else var value = $(this).val();
  400. document.getElementById("fast_search_submit_form").innerHTML += "<input type='hidden' name='event_fast_search_input[" + eventId + "][" + fieldId + "]' value='" + value + "' />";
  401. });
  402. // Отправляем форму
  403. document.getElementById("fast_search_submit_form").submit();
  404. }
  405.  
  406. // Позиция открытого блока события
  407. function positionEventBlock(event_id, e_object) {
  408. hideOneEvent();
  409. var docWidth = $(document).width();
  410.  
  411. if (e_object.pageX == null && e_object.clientX != null) { // Для IE
  412. var html = document.documentElement
  413. var body = document.body
  414.  
  415. e_object.pageX = e_object.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0) - (html.clientLeft || 0)
  416. e_object.pageY = e_object.clientY + (html && html.scrollTop || body && body.scrollTop || 0) - (html.clientTop || 0)
  417. }
  418.  
  419. // Координаты блока
  420. oLeft = e_object.pageX - 130;
  421. if (oLeft < 20) oLeft = 20;
  422. if (oLeft + 420 > docWidth) oLeft = oLeft - (oLeft + 350 - docWidth)
  423. oTop = e_object.pageY + 10;
  424. document.getElementById("record_card_add" + event_id).style.left = oLeft + "px";
  425. document.getElementById("record_card_add" + event_id).style.top = oTop + "px";
  426.  
  427. $("#record_card_add" + event_id).css({marginTop: "0px", marginLeft: "0px"});
  428.  
  429. // Ширина и высота блока
  430. var curHeight = $("#record_card_add" + event_id).height();
  431. var curWidth = $("#record_card_add" + event_id).width();
  432.  
  433. // Перестраиваем координаты
  434. var newPosX = 0 - intval(curWidth / 5);
  435. var newPosY = -curHeight - 40;
  436. if ((oLeft - newPosX) < 0)
  437. newPosX = 0;
  438.  
  439. newPosXt = newPosX + "px";
  440. newPosYt = newPosY + "px";
  441. $("#record_card_add" + event_id).css({marginTop: newPosYt, marginLeft: newPosXt});
  442.  
  443. // Стрелка блока (изначально внизу)
  444. document.getElementById("event_top_arrow" + event_id).style.display = "none";
  445. document.getElementById("event_bottom_arrow" + event_id).style.display = "block";
  446.  
  447. // Показываем блок
  448. $("#record_card_add" + event_id).animate({opacity: 'show'}, 300);
  449. var curPos = $("#record_card_add" + event_id).offset();
  450. if (curPos.left <= 0) // Смещение влево
  451. $("#record_card_add" + event_id).css({marginLeft: "-10px"});
  452. }
  453.  
  454. // Сдвиг блока от текущего положения
  455. function offsetEventBlock(event_id) {
  456. var newPosY = parseInt($("#record_card_add" + event_id).css("margin-top"));
  457. var curPos = $("#record_card_add" + event_id).offset();
  458. var bHeight = $("#event_view_hidden" + event_id).height();
  459. var diffHeight = bHeight - 70;
  460. // Смещаем высоту,
  461. if (diffHeight > 0) {
  462. newPosY = newPosY - diffHeight;
  463. if ((curPos.top + newPosY) <= 0) { // Перемещаем блок под событие, а не над ним, устанавливаем стрелку сверху
  464. newPosY = 0;
  465. document.getElementById("event_top_arrow" + event_id).style.display = "block";
  466. document.getElementById("event_bottom_arrow" + event_id).style.display = "none";
  467. }
  468.  
  469. newPosYt = newPosY + "px";
  470. bHeight += "px";
  471. $("#event_view_edit_add" + event_id).animate({height: bHeight}, 200, function () {
  472. $(this).css("height", "auto");
  473. });
  474. $("#record_card_add" + event_id).animate({marginTop: newPosYt}, 200);
  475. }
  476. $("#event_view_hidden" + event_id).animate({opacity: 'show', height: 'show'}, 200);
  477. }
  478.  
  479. // Показать в карточке события форму для добавления записей в связанные поля
  480. function add_link_block_show(field_id, event_id) {
  481. var curMargin = parseInt(document.getElementById("record_card_add" + event_id).style.marginTop);
  482. var fullHeight = 0;
  483. if (document.getElementById("add_link_block" + field_id).style.display == "none") {
  484. var firstValue = $("[id^=fast_edit_span_" + field_id + "]").val();
  485. l_field_id = all_fields[field_id]['s_field_id'];
  486. var v_o = document.getElementById("fast_edit_span_" + l_field_id + "_" + field_id + "_0");
  487. if (!v_o)
  488. v_o = document.getElementById("fast_edit_span_" + l_field_id + "_new_0");
  489. if (v_o) {
  490. if (typeof(v_o.value) === 'undefined')
  491. v_o.innerHTML = firstValue;
  492. else
  493. v_o.value = firstValue;
  494. }
  495. $("#add_link_block" + field_id).show();
  496. fullHeight += parseInt($("#add_link_block" + field_id).height());
  497. var newMarginTop = curMargin - fullHeight;
  498. document.getElementById("record_card_add" + event_id).style.marginTop = newMarginTop + "px";
  499. var maxInputWidth = 350 - parseInt($(".textpad_field_name").width());
  500. $(".textpad div, .textpad input, .textpad select .textpad").each(function () {
  501. if (parseInt($(this).width()) > maxInputWidth) $(this).width(maxInputWidth);
  502. });
  503. }
  504. else {
  505. fullHeight += parseInt($("#add_link_block" + field_id).height());
  506. var newMarginTop = curMargin + fullHeight;
  507. document.getElementById("record_card_add" + event_id).style.marginTop = newMarginTop + "px";
  508. $("#add_link_block" + field_id).hide();
  509. }
  510. }
  511.  
  512. var addFieldsList = new Object;
  513. // Сохранить новое значение в поле связи
  514. function add_link_block_save(field_id, event_id) {
  515. var insertObj = new Object;
  516. for (addFieldId in addFieldsList) { // Формируем значения
  517. one_field = addFieldsList[addFieldId];
  518. type_field = one_field.type_field;
  519. v_o = document.getElementById("fast_edit_span_" + addFieldId + "_" + field_id + "_0");
  520. if (!v_o)
  521. v_o = document.getElementById("fast_edit_span_" + addFieldId + "_new_0");
  522. if (!v_o) continue;
  523. if ((type_field == 1) || (type_field == 2) || (type_field == 12) || (type_field == 3) || (type_field == 10) || (type_field == 4) || (type_field == 7) || (type_field == 14)) {
  524. if (typeof(v_o.value) === 'undefined')
  525. insertObj[addFieldId] = v_o.innerHTML;
  526. else {
  527. var sourceValue = v_o.value;
  528.  
  529. if ((type_field == 4 || type_field == 7 || type_field == 14) && one_field.mult_value != "1" && sourceValue == "") {
  530. var reserveValue = $(v_o).next("span").html();
  531. if (reserveValue != "") {
  532. $(v_o).find("option").each(function () {
  533. if ($(this).html() == reserveValue) {
  534. $(this).attr("selected", true);
  535. sourceValue = $(this).attr("value")
  536. $(v_o).val(sourceValue);
  537. }
  538. });
  539. }
  540. }
  541.  
  542.  
  543. insertObj[addFieldId] = sourceValue;
  544. }
  545. }
  546. else if (type_field == 5)
  547. insertObj[addFieldId] = v_o.getAttribute('f_value');
  548.  
  549. if (all_fields[field_id]['s_field_id'] == addFieldId) {
  550. var sFieldVal = insertObj[addFieldId];
  551. if (type_field == 7 || type_field == 14)
  552. sFieldVal = $(v_o).next("span").html();
  553. }
  554. }
  555.  
  556. for (addFieldId in insertObj) {
  557. one_field = addFieldsList[addFieldId];
  558. type_field = one_field.type_field;
  559. if (insertObj[addFieldId] == "" || ((type_field == 1 || type_field == 7 || type_field == 14) && insertObj[addFieldId] == "0")) { // Не заполнены обязательные поля
  560. jalert(lang.Qst_required_alert + " '" + addFieldsList[addFieldId]['name_field'] + "'!");
  561. return;
  562. }
  563. }
  564.  
  565. $.ajax({
  566. type: "POST",
  567. url: "calendar.php",
  568. data: {
  569. csrf: csrf,
  570. id: calendar.id,
  571. put: 'new_link_line',
  572. table_id: all_fields[field_id]['s_table_id'],
  573. data: insertObj
  574. },
  575. success: function (input) {
  576. var data = JSON.parse(input);
  577. if (!data) {
  578. jalert("JSON parse error!");
  579. return;
  580. }
  581. if (data.error) {
  582. jalert(data.error)
  583. return;
  584. }
  585.  
  586. sFieldVal = str_replace("&", "&", sFieldVal);
  587. sFieldVal = str_replace(""", "\"", sFieldVal);
  588. sFieldVal = str_replace("&apos;", "'", sFieldVal);
  589. sFieldVal = str_replace("<", "<", sFieldVal);
  590. sFieldVal = str_replace(">", ">", sFieldVal);
  591.  
  592. $("[id^=fast_edit_span_" + field_id + "]").val(sFieldVal);
  593. $("[id^=fast_edit_span_" + field_id + "]").attr("f_value", data.new_line_id);
  594. $("[id^=fast_edit_span_" + field_id + "]").change();
  595. add_link_block_show(field_id, event_id)
  596. }
  597. });
  598. }
  599.  
  600. // Просмотр события
  601. function viewOneEvent(event_id, line_id, e, str, cell) {
  602. if (document.getElementById("record_card_add" + event_id).style.display != "none") {
  603. hideOneEvent();
  604. return;
  605. }
  606.  
  607. // Выводим блок в позицию и отображаем
  608. positionEventBlock(event_id, e);
  609.  
  610. var eventTableId = all_calendar_events[event_id]['table_id'];
  611. var eventNameTable = all_calendar_events[event_id]['name_table'];
  612. // Ссылка на строку, скрываем кнопку "сохранить"
  613. document.getElementById("go_event_link" + event_id).innerHTML = "<a href='view_line2.php?table=" + eventTableId + "&line=" + line_id + "&back_url=" + back_url + "'>" + lang.Jump_to_record + " &raquo;</a>";
  614. document.getElementById("go_event_link" + event_id).style.display = "block";
  615. document.getElementById("save_event_button" + event_id).style.display = "none";
  616.  
  617. highlightEvent(true, event_id, line_id); // Подсвечиваем событие, как при наведении
  618.  
  619. $.ajax({
  620. type: "POST",
  621. url: "calendar.php",
  622. data: {csrf: csrf, id: calendar.id, get: 'event', data: {event_id: event_id, line_id: line_id}},
  623. success: function (msg) {
  624. resp = JSON.parse(msg);
  625. if (!resp) {
  626. jalert("JSON parse error!");
  627. return;
  628. }
  629.  
  630. var date_fields = "";
  631. var nameDateField = "";
  632. addFieldsList = new Object;
  633.  
  634. // Выводим ответ от сервера в блок события
  635. document.getElementById("event_view_edit_add" + event_id).style.backgroundImage = "none";
  636. if (resp.status == "error")
  637. eventText = "<div style='text-align: center; font-style: oblique; margin: 15px 0px -15px;'>" + resp.value + "</div>";
  638. else if (resp.status == "ok") {
  639. eventText = "<table cellpadding='0' cellspacing='0' border='0' class='textpad' style='margin: 10px 0px'>";
  640. fields = resp.value;
  641. var evalStr = "";
  642. for (orderField in fields) {
  643. one_field = fields[orderField];
  644. fieldId = one_field.field_id;
  645. if ((one_field.type_field == 1 || (one_field.type_field == 3 && one_field.view_html != "1")) && one_field.value.allow_write == "1") fullValue = one_field.value.fast_edit_div + one_field.value.fast_edit_div_close;
  646. else fullValue = one_field.value.fast_edit_div + one_field.value.value + one_field.value.fast_edit_div_close;
  647.  
  648. if (one_field.date_field == "1") { // Дата события
  649. if (one_field.type_value == 1) {
  650. fullValue = fullValue.replace(" datepicker ", " datetimepicker fast_edit_datetime ");
  651. }
  652. date_fields = fullValue + date_fields;
  653. if (nameDateField == "") nameDateField = one_field.name + ": ";
  654. }
  655. else if (one_field.period_field == "1") { // Период события
  656. if (one_field.type_value == 1) {
  657. fullValue = fullValue.replace(" datepicker ", " datetimepicker fast_edit_datetime ");
  658. }
  659. date_fields += " " + lang.since_to + ": " + fullValue
  660. nameDateField = lang.since_from + ": ";
  661. }
  662. else { // Обычное поле
  663. eventText += "<tr><td style='vertical-align: middle; max-width: 200px; overflow: hidden' class='textpad_field_name'><b>" + one_field.name + ": </b></td>";
  664. eventText += "<td style='width: 100%;";
  665.  
  666. if (one_field.add_link_fields != "0")
  667. eventText += " white-space: nowrap;";
  668. else if (!one_field.fast_edit_div)
  669. eventText += " white-space: normal;";
  670. if (one_field.type_value == 1) {
  671. fullValue = fullValue.replace(" datepicker ", " datetimepicker fast_edit_datetime ");
  672. }
  673. eventText += "' id='sub_cell_" + fieldId + "_" + line_id + "'>" + fullValue + "";
  674. if (one_field.add_link_fields != "0") {
  675. eventText += "<img src=\"images/green_plus.png\" style=\"margin-top: 5px;\" class=\"add_link_img\" onclick=\"add_link_block_show(" + fieldId + ", " + event_id + ")\" onmouseover=\"this.src='images/green_plus_active.png'\" onmouseout=\"this.src='images/green_plus.png'\" />";
  676. eventText += "</td></tr>";
  677. eventText += "<tbody id='add_link_block" + fieldId + "' class=\"add_link_block\" style='display: none; border-top: 1px solid #DDDDDD; border-bottom: 1px solid #DDDDDD;'><tr><td colspan='2' style='padding: 5px 0px'></td></tr>";
  678.  
  679. for (addFieldNum in one_field.add_link_fields) {
  680. var oneAddField = one_field['add_link_fields'][addFieldNum];
  681. addFieldId = oneAddField.id
  682. addFieldsList[addFieldId] = oneAddField;
  683. if (oneAddField.type_field == 1 || oneAddField.type_field == 3) fullAddValue = oneAddField.fast_edit_div + oneAddField.fast_edit_div_close;
  684. else fullAddValue = oneAddField.fast_edit_div + oneAddField.def_value + oneAddField.fast_edit_div_close;
  685. eventText += "<tr><td style='vertical-align: middle; max-width: 200px; overflow: hidden' class='textpad_field_name'><b>" + oneAddField.name_field + ": </b></td>";
  686. eventText += "<td style='width: 100%;' id='sub_cell_" + addFieldId + "_" + fieldId + "_0'>" + fullAddValue + "</td></tr>";
  687. while (fullAddValue.indexOf("<script>") >= 0) { // JS, который надо выполнить
  688. firstPos = fullAddValue.indexOf("<script>");
  689. secondPos = fullAddValue.indexOf("<\/script>");
  690. evalStr += fullAddValue.substring(firstPos + 8, secondPos) + "\r\n";
  691. fullAddValue = fullAddValue.substring(secondPos + 9);
  692. }
  693. }
  694.  
  695. eventText += "<tr><td class='add_link_block_bottom'></td>";
  696. eventText += "<td class='add_link_block_bottom'><span onclick='add_link_block_save(" + fieldId + ", " + event_id + ")' class='add_link_block_save'><span class='b_small_begin'></span><span class='b_small'>" + lang.Save + "</span><span class='b_small_end'></span></span></td>";
  697. eventText += "</tr><tr><td colspan='2' style='padding: 5px 0px'></td></tr></tbody>"
  698. }
  699. else
  700. eventText += "</td></tr>";
  701. }
  702. while (fullValue.indexOf("<script>") >= 0) { // JS, который надо выполнить
  703. firstPos = fullValue.indexOf("<script>");
  704. secondPos = fullValue.indexOf("<\/script>");
  705. evalStr += fullValue.substring(firstPos + 8, secondPos) + "\r\n";
  706. fullValue = fullValue.substring(secondPos + 9);
  707. }
  708. }
  709. eventText += "</table>";
  710. }
  711.  
  712. // Добавляем содержание в блок
  713. date_fields = "<div class='event_datefields' id='event_datefields" + event_id + "'>" + nameDateField + date_fields + "</div>";
  714. document.getElementById("event_view_edit_add" + event_id).innerHTML = "<div id='event_view_hidden" + event_id + "' style='display: none'>" + date_fields + eventText + "</div>";
  715.  
  716. $("#event_view_hidden" + event_id + " [part=add_link_field]").attr("part", "");
  717. $("#event_view_hidden" + event_id + " .add_link_block [part='']").attr("part", "add_link_field");
  718.  
  719.  
  720. if (evalStr) { // Выполняем JS, выставляем обработчики
  721. eval(evalStr);
  722. $(".datepicker").datepicker({
  723. showOn: "button",
  724. buttonImage: "images/calbtn.png",
  725. buttonImageOnly: true,
  726. buttonText: lang.Calendar,
  727. showAnim: (('\v' == 'v') ? "" : "show"), // в ie не включаем анимацию, тормозит
  728. });
  729. $(".datetimepicker").datetimepicker({
  730. showOn: "button",
  731. timeFormat: "HH:mm",
  732. buttonImage: "images/calbtn.png",
  733. buttonImageOnly: true,
  734. buttonText: lang.Calendar,
  735. showAnim: (('\v' == 'v') ? "" : "show"), // в ie не включаем анимацию, тормозит
  736. });
  737. }
  738.  
  739. if (resp.can_del == "1") // Если есть права на удаление - выводим ссылку
  740. document.getElementById("go_event_link" + event_id).innerHTML = "<a style='float: left;' href='#' onclick=\"jconfirm('" + lang.del_cal_event_confim + " "" + eventNameTable + "". " + lang.Continue + "?', function() { sub_drop_line(" + eventTableId + ", " + line_id + ") }, function () { }); return false\">" + lang.Delete + "</a>" + document.getElementById("go_event_link" + event_id).innerHTML;
  741.  
  742. offsetEventBlock(event_id) // Сдвигаем блок, т.к. высота поменялась
  743. // Фиксирум поля по ширине
  744. var maxInputWidthSelect = 380 - parseInt($(".textpad_field_name").width());
  745. var maxInputWidth = 350 - parseInt($(".textpad_field_name").width());
  746. $(".event_view_edit .textpad div, .event_view_edit .textpad input").each(function () {
  747. if (parseInt($(this).width()) > maxInputWidth) $(this).width(maxInputWidth);
  748. });
  749. $(".event_view_edit .textpad select").each(function () {
  750. if (parseInt($(this).width()) > maxInputWidthSelect) {
  751. $(this).width(maxInputWidthSelect);
  752. $(this).parent("span").width(maxInputWidthSelect)
  753. $(this).next("span").width(maxInputWidthSelect - 5)
  754. }
  755. var optTextVal = "";
  756. $(this).find("option").each(function () {
  757. if ($(this).attr("selected")) optTextVal = $(this).html();
  758. })
  759. $(this).next("span").html(optTextVal);
  760. // substr_select_span($(this).attr("id"));
  761. });
  762. init_calendar_fast_edit();
  763. }
  764. });
  765.  
  766. recordView = line_id;
  767. }
  768.  
  769. var addedCell = false;
  770. var nextCell = false;
  771.  
  772. function addEvent(date, e, event_id) {
  773. if (event_id == undefined) // Если событие не выбрано, выбираем событие по умолчанию
  774. event_id = calendar.default_event;
  775.  
  776. if (all_calendar_events[event_id]["add_acc"] == "0")
  777. return; // Нет доступа на добавление строк по умолчанию
  778.  
  779. if (document.getElementById("record_card_add" + event_id).style.display != "none") {
  780. hideOneEvent();
  781. return;
  782. }
  783.  
  784. // Скрываем ссылку, отображаем кнопку "сохранить"
  785. document.getElementById("go_event_link" + event_id).style.display = "none";
  786. document.getElementById("save_event_button" + event_id).style.display = "none";
  787.  
  788. saveEventId = event_id;
  789. eventFields = new Object;
  790.  
  791. positionEventBlock(event_id, e); // Позиционируем блок и выводим
  792.  
  793. var defValues = new Object;
  794. if (calendar.day) { // Дата добавления в дневном виде
  795. gr_date = "";
  796. if (date.indexOf("|") >= 0) {
  797. parts_val = date.split("|");
  798. date = parts_val[0];
  799. gr_date = parts_val[1];
  800.  
  801. if (calendar.group_field == all_calendar_events[event_id]['group_field'] && all_calendar_events[event_id]['group_field'] != "0") {
  802. var def_gr_value = js_group_values[gr_date];
  803. if (def_gr_value)
  804. defValues = {field_id: calendar.group_field, value: def_gr_value};
  805. }
  806. }
  807. addedCell = "cell_" + str_replace(":", "_", date) + "_" + gr_date;
  808. }
  809. else if (calendar.week) // В недельном
  810. addedCell = "cell_" + str_replace(" ", "_", str_replace(":", "_", str_replace(".", "_", date)));
  811. else // В месячном
  812. addedCell = "cell_" + str_replace(".", "_", date);
  813.  
  814.  
  815. if (document.getElementById(addedCell)) {
  816. if (calendar.day || calendar.week) {
  817. var cellOffset = $("#" + addedCell).offset();
  818. if (e.pageY > cellOffset.top + 15) {
  819. if (calendar.week) {
  820. var dateValues = date.split(" ");
  821. var datePartsVal = dateValues[1].split(":");
  822. }
  823. else
  824. var datePartsVal = date.split(":");
  825. var cell_height = $('.day_top').outerHeight() - 1;
  826. var diffCell = (Math.ceil((e.pageY - cellOffset.top) / cell_height) - 1);
  827. var halfTime = diffCell % 2;
  828. diffCell = Math.floor(diffCell / 2);
  829. if (datePartsVal[0] == "00") {
  830. var timeDate = parseInt(diffCell);
  831. } else {
  832. var timeDate = parseInt(ltrim(datePartsVal[0], "0")) + parseInt(diffCell);
  833. }
  834.  
  835. if (timeDate < 10) timeDate = "0" + timeDate;
  836. timeDate = timeDate + ":" + halfTime;
  837.  
  838. if (calendar.week) {
  839. addedCell = "cell_" + str_replace(".", "_", dateValues[0]) + "_" + str_replace(":", "_", timeDate);
  840. date = dateValues[0] + " " + timeDate;
  841. }
  842. else {
  843. addedCell = "cell_" + str_replace(":", "_", timeDate) + "_" + gr_date;
  844. date = timeDate;
  845. }
  846. }
  847.  
  848. if (calendar.week) {
  849. var dateValues = date.split(" ");
  850. var datePartsVal = dateValues[1].split(":");
  851. }
  852. else
  853. var datePartsVal = date.split(":");
  854.  
  855. if (datePartsVal[1] == "1") {
  856. var nextHour = parseInt(ltrim(datePartsVal[0], "0")) + 1;
  857. if (nextHour < 10) nextHour = "0" + nextHour;
  858. if (calendar.week)
  859. nextCell = "cell_" + str_replace(".", "_", dateValues[0]) + "_" + nextHour + "_0";
  860. else
  861. nextCell = "cell_" + nextHour + "_0_" + gr_date;
  862. }
  863. else {
  864. if (calendar.week)
  865. nextCell = "cell_" + str_replace(".", "_", dateValues[0]) + "_" + datePartsVal[0] + "_1";
  866. else
  867. nextCell = "cell_" + datePartsVal[0] + "_1_" + gr_date;
  868. }
  869. }
  870.  
  871. if (document.getElementById(addedCell)) // Подсвечиваем ячейку, в которую будет добавлена запись
  872. document.getElementById(addedCell).style.background = "#efefef";
  873.  
  874. if (nextCell)
  875. if (document.getElementById(nextCell))
  876. document.getElementById(nextCell).style.background = "#efefef";
  877. }
  878.  
  879. if (calendar.day && date.indexOf(":") > 0) {
  880. date = str_replace(":0", ":00:00", date);
  881. date = str_replace(":1", ":30:00", date);
  882. date = calendar.day + "." + calendar.month + "." + calendar.year + " " + date;
  883. }
  884. else if (calendar.week && date.indexOf(":") > 0) {
  885. date = str_replace(":0", ":00:00", date);
  886. date = str_replace(":1", ":30:00", date);
  887. }
  888. else
  889. date = date + " {current}";
  890.  
  891. // Получаем список полей
  892. $.ajax({
  893. type: "POST",
  894. url: "calendar.php",
  895. data: {
  896. csrf: csrf,
  897. id: calendar.id,
  898. get: 'add_fields',
  899. data: {event_id: event_id, date: date, def_field: defValues}
  900. },
  901. success: function (msg) {
  902. resp = JSON.parse(msg);
  903. if (!resp) {
  904. jalert("JSON parse error!");
  905. return;
  906. }
  907.  
  908. var date_fields = "";
  909. var nameDateField = "";
  910. addFieldsList = new Object;
  911.  
  912. document.getElementById("event_view_edit_add" + event_id).style.backgroundImage = "none";
  913. // Строим содержание
  914. if (resp.status == "error")
  915. eventText = resp.value;
  916. else if (resp.status == "ok") {
  917. document.getElementById("go_event_link" + event_id).style.display = "none";
  918. document.getElementById("save_event_button" + event_id).style.display = "block";
  919. eventText = "<table cellpadding='0' cellspacing='0' border='0' class='textpad' style='margin: 10px 0px'>";
  920. fields = resp.value;
  921. var evalStr = "";
  922. for (orderField in fields) {
  923. one_field = fields[orderField];
  924. fieldId = one_field.id;
  925. eventFields[fieldId] = new Object;
  926. eventFields[fieldId] = one_field;
  927. if (one_field.type_field == 1 || one_field.type_field == 3) fullValue = one_field.fast_edit_div + one_field.fast_edit_div_close;
  928. else fullValue = one_field.fast_edit_div + one_field.def_value + one_field.fast_edit_div_close;
  929. if (one_field.date_field == "1") { // Поле даты события
  930. if (one_field.type_value == 1) {
  931. fullValue = fullValue.replace(" datepicker ", " datetimepicker fast_edit_datetime ");
  932. }
  933. date_fields = fullValue + date_fields;
  934. if (nameDateField == "") nameDateField = one_field.name_field + ": ";
  935. }
  936. else if (one_field.period_field == "1") { // Поле периода события
  937. if (one_field.type_value == 1) {
  938. fullValue = fullValue.replace(" datepicker ", " datetimepicker fast_edit_datetime ");
  939. }
  940. date_fields += " " + lang.since_to + ": " + fullValue
  941. nameDateField = lang.since_from + ": ";
  942. }
  943. else { // Обычное поле
  944. eventText += "<tr><td style='vertical-align: middle; max-width: 200px; overflow: hidden' class='textpad_field_name'>";
  945. if (eventFields[fieldId]['main'] == "1") eventText += "<span style='color: red'>* </span>";
  946. eventText += "<b>" + one_field.name_field + ": </b></td>";
  947. if (one_field.type_value == 1) {
  948. fullValue = fullValue.replace(" datepicker ", " datetimepicker fast_edit_datetime ");
  949. }
  950. eventText += "<td style='width: 100%;' id='sub_cell_" + fieldId + "_new'>" + fullValue;
  951. if (one_field.add_link_fields != "0") {
  952. eventText += "<img src=\"images/green_plus.png\" style=\"margin-top: 5px;\" class=\"add_link_img\" onclick=\"add_link_block_show(" + fieldId + ", " + event_id + ")\" onmouseover=\"this.src='images/green_plus_active.png'\" onmouseout=\"this.src='images/green_plus.png'\" />";
  953. eventText += "</td></tr>";
  954. eventText += "<tbody id='add_link_block" + fieldId + "' class=\"add_link_block\" style='display: none; border-top: 1px solid #DDDDDD; border-bottom: 1px solid #DDDDDD;'><tr><td colspan='2' style='padding: 5px 0px'></td></tr>";
  955.  
  956. for (addFieldNum in one_field.add_link_fields) {
  957. var oneAddField = one_field['add_link_fields'][addFieldNum];
  958. addFieldId = oneAddField.id
  959. addFieldsList[addFieldId] = oneAddField;
  960. if (oneAddField.type_field == 1 || oneAddField.type_field == 3) fullAddValue = oneAddField.fast_edit_div + oneAddField.fast_edit_div_close;
  961. else fullAddValue = oneAddField.fast_edit_div + oneAddField.def_value + oneAddField.fast_edit_div_close;
  962. eventText += "<tr><td style='vertical-align: middle; max-width: 200px; overflow: hidden' class='textpad_field_name'><b>" + oneAddField.name_field + ": </b></td>";
  963. eventText += "<td style='width: 100%;' id='sub_cell_" + addFieldId + "_" + fieldId + "_0'>" + fullAddValue + "</td></tr>";
  964. while (fullAddValue.indexOf("<script>") >= 0) { // JS, который надо выполнить
  965. firstPos = fullAddValue.indexOf("<script>");
  966. secondPos = fullAddValue.indexOf("<\/script>");
  967. evalStr += fullAddValue.substring(firstPos + 8, secondPos) + "\r\n";
  968. fullAddValue = fullAddValue.substring(secondPos + 9);
  969. }
  970. }
  971.  
  972. eventText += "<tr><td class='add_link_block_bottom'></td>";
  973. eventText += "<td class='add_link_block_bottom'><span onclick='add_link_block_save(" + fieldId + ", " + event_id + ")' class='add_link_block_save'><span class='b_small_begin'></span><span class='b_small'>" + lang.Save + "</span><span class='b_small_end'></span></span></td>";
  974. eventText += "</tr><tr><td colspan='2' style='padding: 5px 0px'></td></tr></tbody>"
  975. }
  976. else
  977. eventText += "</td></tr>";
  978. }
  979.  
  980. while (fullValue.indexOf("<script>") >= 0) { // JS, который надо выполнить
  981. firstPos = fullValue.indexOf("<script>");
  982. secondPos = fullValue.indexOf("<\/script>");
  983. evalStr += fullValue.substring(firstPos + 8, secondPos) + "\r\n";
  984. fullValue = fullValue.substring(secondPos + 9);
  985. }
  986. }
  987. eventText += "</table>";
  988. }
  989.  
  990. // Вставляем содержание
  991. date_fields = "<div class='event_datefields' id='event_datefields" + event_id + "'>" + nameDateField + date_fields + "</div>";
  992. document.getElementById("event_view_edit_add" + event_id).innerHTML = "<div id='event_view_hidden" + event_id + "' style='display: none'>" + date_fields + eventText + "</div>";
  993.  
  994. if (evalStr) { // Выполняем JS, ставим обработчики на поля
  995. eval(evalStr);
  996. $(".datepicker").datepicker({
  997. showOn: "button",
  998. buttonImage: "images/calbtn.png",
  999. buttonImageOnly: true,
  1000. buttonText: lang.Calendar,
  1001. showAnim: (('\v' == 'v') ? "" : "show"), // в ie не включаем анимацию, тормозит
  1002. });
  1003. //теперь уберем баг с непредвиденным автозакрытием календаря
  1004. var span_obj = $(".datetimepicker").parent("span.datepicker_span");
  1005. for (var i = 0; i < span_obj.length; i++) {
  1006. $(span_obj.get(i)).replaceWith(function (e) {
  1007. return span_obj.get(i).innerHTML;
  1008. });
  1009. }
  1010. $(".datetimepicker").datetimepicker({
  1011. showOn: "button",
  1012. timeFormat: "HH:mm",
  1013. buttonImage: "images/calbtn.png",
  1014. buttonImageOnly: true,
  1015. buttonText: lang.Calendar,
  1016. showAnim: (('\v' == 'v') ? "" : "show"), // в ie не включаем анимацию, тормозит
  1017. });
  1018. }
  1019.  
  1020. offsetEventBlock(event_id); // Сдвигаем блок под изменение высоты
  1021. // Фиксирум поля по ширине
  1022. var maxInputWidthSelect = 380 - parseInt($(".textpad_field_name").width());
  1023. var maxInputWidth = 350 - parseInt($(".textpad_field_name").width());
  1024. $(".event_view_edit .textpad div, .event_view_edit .textpad input").each(function () {
  1025. if (parseInt($(this).width()) > maxInputWidth) $(this).width(maxInputWidth);
  1026. });
  1027. $(".event_view_edit .textpad select").each(function () {
  1028. if (parseInt($(this).width()) > maxInputWidthSelect) {
  1029. $(this).width(maxInputWidthSelect);
  1030. $(this).parent("span").width(maxInputWidthSelect)
  1031. $(this).next("span").width(maxInputWidthSelect - 5)
  1032. // substr_select_span($(this).attr("id"));
  1033. }
  1034. });
  1035. $("#record_card_add" + event_id).find($('textarea')).each(function (i, item) {
  1036. autosize(item);
  1037. });
  1038. init_calendar_fast_edit();
  1039. }
  1040. });
  1041. }
  1042.  
  1043. // Добавление новой строки/сохранение текущей
  1044. function saveEvent() {
  1045. //некореектные даты
  1046. if (calendar_error_status == 1)
  1047. jalert('Время начала события больше времени окончания!');
  1048.  
  1049. if (!addedCell) { // Сохранение текущей записи, скрываем кнопку сохранения, показываем ссылки
  1050. $(".save_event_button").fadeOut(200, function () {
  1051. setTimeout("$('.go_event_link').fadeIn(200)", 200);
  1052. })
  1053. if (pageReload) window.location.reload(); // Даты изменились, перестраиваем календарь
  1054. return;
  1055. }
  1056.  
  1057. $(".save_event_button").fadeOut(100);
  1058. var insertObj = new Object;
  1059. var calendar_type;
  1060. for (fieldId in eventFields) { // Формируем значения
  1061. one_field = eventFields[fieldId];
  1062. type_field = one_field.type_field;
  1063. v_o = document.getElementById("fast_edit_span_" + fieldId + "_new_0");
  1064. if (!v_o) continue;
  1065. if ((type_field == 1) || (type_field == 2) || (type_field == 12) || (type_field == 3) || (type_field == 10) || (type_field == 4) || (type_field == 7) || (type_field == 14)) {
  1066. if (typeof(v_o.value) === 'undefined')
  1067. insertObj[fieldId] = v_o.innerHTML;
  1068. else
  1069. insertObj[fieldId] = v_o.value;
  1070. }
  1071. else if (type_field == 5) {
  1072. insertObj[fieldId] = v_o.value;
  1073. }
  1074.  
  1075. }
  1076.  
  1077. var emptyFields = "";
  1078. $(".textpad tr").css("background", "transparent");
  1079. $(".textpad td.textpad_field_name b").css("color", "black");
  1080. for (fieldId in insertObj) {
  1081. if (eventFields[fieldId]['main'] == "1" && !insertObj[fieldId]) { // Не заполнены обязательные поля
  1082. if (emptyFields != "") emptyFields += ", ";
  1083. emptyFields += "'" + eventFields[fieldId]['name_field'] + "'";
  1084. $("#sub_cell_" + fieldId + "_new").parent("tr").css("background", "#FFE0E0");
  1085. $("#sub_cell_" + fieldId + "_new").parent("tr").find("td.textpad_field_name b").css("color", "#FF0000");
  1086. }
  1087. }
  1088. if (emptyFields != "") {
  1089. jalert(lang.not_all_fields);
  1090. $(".save_event_button").fadeIn(200);
  1091. return;
  1092. }
  1093.  
  1094. if (calendar.day)
  1095. calendar_type = "day";
  1096. else if (calendar.week)
  1097. calendar_type = "week";
  1098. else
  1099. calendar_type = "month";
  1100.  
  1101. // Отправляем данные (сейчас при добавлении страница перезагрузится в UpdateData, в дальнейшем вставка происходит на лету)
  1102. $.ajax({
  1103. type: "POST",
  1104. url: "calendar.php",
  1105. data: {
  1106. csrf: csrf,
  1107. id: calendar.id,
  1108. put: 'new_line',
  1109. data: {event_id: saveEventId, calendar_type: calendar_type, values: insertObj}
  1110. },
  1111. success: function (input) {
  1112. var data = JSON.parse(input);
  1113. if (!data) {
  1114. jalert("JSON parse error!");
  1115. $(".save_event_button").fadeIn(300);
  1116. return;
  1117. }
  1118. if (data.error) {
  1119. jalert(data.error)
  1120. $(".save_event_button").fadeIn(300);
  1121. return;
  1122. }
  1123. var new_line = data.new_line;
  1124.  
  1125. var js_event = all_calendar_events[new_line.event_id];
  1126.  
  1127. var newEventData = "<div style='display: none' event_length='" + new_line.length + "' style='margin-top: 0px;border: 1px solid " + js_event.color + "' ";
  1128. newEventData += "class='calendar_event_line calendar_event_line_" + js_event.date_field + "_" + new_line.line_id + "_" + new_line.event_id + "' ";
  1129. newEventData += "id='calendar_event_line_" + js_event.date_field + "_" + new_line.line_id + "_" + new_line.event_id + "_0_0'>";
  1130. newEventData += "<div onclick='viewOneEvent(" + new_line.event_id + ", " + new_line.line_id + ", event, 0, 0); event.cancelBubble = true;' ";
  1131. newEventData += "onmouseover='highlightEvent(true, " + new_line.event_id + ", " + new_line.line_id + ")' onmouseout='highlightEvent(false, " + new_line.event_id + ", " + new_line.line_id + ")' ";
  1132. newEventData += "id='c_event_layout" + js_event.date_field + "_" + new_line.line_id + "_" + new_line.event_id + "_0_0' ";
  1133. newEventData += " class='c_event_layout c_event_layout" + new_line.event_id + "_" + new_line.line_id + "'><span style='display: inline-block; width: 10px; height: 10px; background: " + js_event.color + "; margin: 0px 4px 0px 2px;'></span>" + new_line.mount + "</div></div>";
  1134.  
  1135. document.getElementById("hidden_add_events").innerHTML += newEventData;
  1136.  
  1137. if (js_events == undefined)
  1138. js_events = new Object;
  1139. if (!js_events[new_line.event_id])
  1140. js_events[new_line.event_id] = new Object;
  1141. js_events[new_line.event_id][new_line.line_id] = {
  1142. begin: new_line.begin,
  1143. end: new_line.end,
  1144. offset: 0,
  1145. length: new_line.length
  1146. };
  1147.  
  1148. var resp_arr = data.changes.toString().split("\r\n");
  1149. UpdateData(resp_arr);
  1150. }
  1151. });
  1152. }
  1153.  
  1154. function hideOneEvent() {
  1155. $(".one_event_block").animate({opacity: 'hide'}, 200, function () {
  1156. $(".event_view_edit").html("");
  1157. $(".event_view_edit").css("background-image", "url('images/process.gif')");
  1158. $(".event_view_edit").css("height", "70px");
  1159. });
  1160. $(".c_event_layout").css("background", "");
  1161. if (addedCell)
  1162. if (document.getElementById(addedCell))
  1163. document.getElementById(addedCell).style.background = "";
  1164. if (nextCell)
  1165. if (document.getElementById(nextCell))
  1166. document.getElementById(nextCell).style.background = "";
  1167. addedCell = false;
  1168. nextCell = false;
  1169. recordView = false;
  1170. if (pageReload) window.location.reload();
  1171. }
  1172.  
  1173. // Вывод справки по событию (блок слева)
  1174. var sysHelpInit = false;
  1175. function viewSystemHelp(event_id, action) {
  1176. if (action) {
  1177. if (window.sysHelpInit || hiddenEvents[event_id])
  1178. return;
  1179. else
  1180. sysHelpInit = setTimeout("document.getElementById('system_help_event" + event_id + "').style.display = 'block'", 1000);
  1181. }
  1182. else {
  1183. if (window.sysHelpInit)
  1184. clearTimeout(sysHelpInit);
  1185. sysHelpInit = false;
  1186. document.getElementById("system_help_event" + event_id).style.display = "none";
  1187. }
  1188. }
  1189.  
  1190. // Фиксация таблицы после загрузки
  1191. /**
  1192. * @param {string} hce - hidden calendar event
  1193. */
  1194. $(document).ready(function () {
  1195. fixCalendarLayout();
  1196. setTimeout("$('#calendar_event_list .select_border_btn_hover').css({width: '100px', paddingRight: '50px'})", 500);
  1197. // Скрытые события
  1198. // смотрим тип календаря
  1199. var type = '0';
  1200. if ($.cookie('default_calendar_view')) {
  1201. switch($.cookie('default_calendar_view')) {
  1202. case 'week':
  1203. type = 1;
  1204. break;
  1205. case 'day':
  1206. type = 2;
  1207. break;
  1208. default:
  1209. type = 0;
  1210. }
  1211. }
  1212. // ищем их в куках
  1213. if (hiddenEvents) {
  1214. for (oneEventId in all_calendar_events)
  1215. if ($.cookie("hce_" + oneEventId + "_" + type)) {
  1216. viewHideEvents(oneEventId, type, true);
  1217. }
  1218. }
  1219. calendar_combobox($('.combobox'), false);
  1220. init_calendar_fast_edit();
  1221. if ($.cookie("mini_calendar_hide" + calendar.id) === 'null') {
  1222. $("#mini_calendar_layout").animate({width: "show", opacity: "show", marginLeft: "30px"}, 200);
  1223. document.getElementById("view_calendar_arrow").innerHTML = "◀";
  1224. }else { // Скрываем календарь
  1225. $("#mini_calendar_layout").animate({width: "hide", opacity: "hide", marginLeft: "0px"}, 200);
  1226. document.getElementById("view_calendar_arrow").innerHTML = "▶";
  1227. }
  1228. setTimeout("fixCalendarLayout()", 300);
  1229. });
  1230.  
  1231. $(window).resize(function () {
  1232. if (window.fixInit)
  1233. clearTimeout(fixInit);
  1234. fixInit = setTimeout("fixCalendarLayout()", 200);
  1235. });
  1236.  
  1237. // Фиксация таблицы при загрузке страницы и ресайзе
  1238. function fixCalendarLayout() {
  1239. $("#calendar_layout").width($(window).width() - 34);
  1240. if (document.getElementById("mini_calendar_layout").style.display != "none")
  1241. document.getElementById("calendar_pad").style.width = $("#calendar_pad").width() + "px";
  1242. else
  1243. document.getElementById("calendar_pad").style.width = "0px";
  1244.  
  1245. if (!calendar.day && !calendar.week) { // Месячный вид
  1246. var tableWidth = $(".calendar_month_type").width();
  1247. var tdWidth = parseInt(((tableWidth - 6) / 7) - 2);
  1248. $(".calendar_month_type td").width(tdWidth);
  1249.  
  1250. $(".calendar_event_line").each(function () {
  1251. var eventLength = parseInt($(this).attr("event_length"));
  1252. var isBackground = parseInt($(this).attr("is_background"));
  1253. var borderMargin = 0
  1254. if (isBackground)
  1255. borderMargin = 2
  1256. var addWidth = 0;
  1257. if (eventLength == 1)
  1258. addWidth = 1;
  1259. if (eventLength == 2)
  1260. addWidth = 3;
  1261. if (eventLength == 3)
  1262. addWidth = 7;
  1263. if (eventLength == 4)
  1264. addWidth = 11;
  1265. if (eventLength == 5)
  1266. addWidth = 13;
  1267. if (eventLength == 6)
  1268. addWidth = 17;
  1269. if (eventLength == 7)
  1270. addWidth = 19;
  1271.  
  1272. fullCalWidth = (eventLength * tdWidth) + addWidth + borderMargin;
  1273. $(this).width(fullCalWidth);
  1274. var arrowMargin = fullCalWidth + 1 - isBackground;
  1275. $(this).find(".next_event_arrow").css("margin-left", arrowMargin + "px");
  1276. });
  1277. $(".hidden_items_events").width(tdWidth);
  1278. }
  1279. if (calendar.day) { // Дневной вид
  1280. var maxTableWidth = parseInt($(window).width() - $("#calendar_pad").width()) - 67 - 74;
  1281. var maxTdWidth = parseInt(maxTableWidth / calendar.day_td_count);
  1282. $(".day_top").width(maxTdWidth);
  1283.  
  1284. $(".view_overperiod_events").width(maxTableWidth + 74);
  1285.  
  1286. if (document.getElementById("cur_time_line")) {
  1287. var timeLineWidth = maxTableWidth + 1;
  1288. document.getElementById("cur_time_line").style.width = timeLineWidth + "px";
  1289. var timeHeight = parseInt($(".day_time").height());
  1290.  
  1291. var pOffset = parseInt($("#cur_time_line").attr("offset"));
  1292. var timeLineOffset = parseInt(timeHeight - ((timeHeight / 100) * (100 - pOffset))) - 9;
  1293. if (pOffset > 50) timeLineOffset += 2;
  1294. document.getElementById("cur_time_line").style.marginTop = timeLineOffset + "px";
  1295. }
  1296.  
  1297. var total_background_events = 0;
  1298. $(".calendar_day_type .calendar_event_line").each(function () {
  1299. if ($(this).attr("is_background") == 1) {
  1300. total_background_events++ ;
  1301. }
  1302. });
  1303. var main = resizeRow();
  1304.  
  1305. console.log(main[0]);
  1306. console.log(main[1]);
  1307. for (var i = 0; i < Object.keys(main[0]).length; i++) {
  1308. for (var j = 0; j < Object.keys(main[0][Object.keys(main[0])]).length; j++) {
  1309. var key = Object.keys(main[0][Object.keys(main[0])])[j];
  1310. key = main[0][Object.keys(main[0])][key];
  1311. for (var k = 0; k < key.length; k++) {
  1312. var c = document.getElementById(key[k].id);
  1313. if (!key[k].clone) {
  1314. c.style.width = key[k].width;
  1315. c.style.marginLeft = key[k].margin;
  1316. }
  1317. }
  1318. }
  1319. }
  1320. $(".calendar_day_type .calendar_event_line").each(function () {
  1321. var oneMargin = '';
  1322. var oneHeight = '';
  1323. var element_width = '';
  1324. var eventLength = parseFloat($(this).attr("event_length"));
  1325. var eventOffset = $(this).attr("event_offset");
  1326. var isBackground = $(this).attr("is_background");
  1327. backgroundInLayout = 1;
  1328. if (eventOffset.indexOf("back") < 0)
  1329. backgroundInLayout = 0;
  1330. eventOffset = parseInt(eventOffset);
  1331. if (isBackground == 1) {
  1332. var background_width = maxTableWidth/total_background_events;
  1333. oneHeight = parseInt(eventLength * BLOCK_HEIGHT -2); // 2 - размер бордера, его отнимаем от высоты
  1334. if (navigator.userAgent.search("Firefox") !== -1) {
  1335. oneHeight = parseInt(eventLength * (BLOCK_HEIGHT+0.45) - 1);
  1336. }
  1337. $(this).css({
  1338. width: background_width + "px",
  1339. marginLeft: (eventOffset-1)*background_width + "px",
  1340. height: oneHeight + 'px',
  1341. 'min-height': oneHeight + 'px'
  1342. });
  1343. } else {
  1344.  
  1345. oneHeight = parseInt(eventLength * BLOCK_HEIGHT -2); // 2 - размер бордера, его отнимаем от высоты
  1346. if (navigator.userAgent.search("Firefox") !== -1) {
  1347. oneHeight = parseInt(eventLength * (BLOCK_HEIGHT+0.45) - 1);
  1348. }
  1349.  
  1350. eventOffset = eventOffset - total_background_events;
  1351. if (eventOffset <= 0 ) eventOffset = 1;
  1352.  
  1353. $(this).css({
  1354. height: oneHeight + 'px',
  1355. 'min-height': oneHeight + 'px'
  1356. });
  1357. $(this).find($('.c_event_layout')).css('min-height', oneHeight + 'px');
  1358. $(this).hover(function () {
  1359. $(this).css('height', 'auto');
  1360. }, function () {
  1361. $(this).css('height', oneHeight + 'px');
  1362. });
  1363. }
  1364.  
  1365.  
  1366. });
  1367.  
  1368.  
  1369.  
  1370. var arrowMargin = $(".view_overperiod_events").width();
  1371. $(".view_overperiod_events .calendar_event_line").each(function () {
  1372. if (parseInt($(this).attr("is_background")))
  1373. aMargin = arrowMargin;
  1374. else
  1375. aMargin = arrowMargin - 2;
  1376. $(this).find(".next_event_arrow").css("margin-left", aMargin + "px");
  1377. })
  1378. }
  1379. if (calendar.week) { // Недельный вид
  1380. var tableWidth = $(window).width() - $("#calendar_pad").width() - 140;
  1381. var oneTdWidth = parseInt((tableWidth - 7) / 7);
  1382. $("td.overperiod_cells").width(oneTdWidth);
  1383.  
  1384. $(".view_overperiod_events").width(tableWidth);
  1385.  
  1386. if (oneTdWidth < 100) oneTdWidth = 100;
  1387.  
  1388. if (document.getElementById("cur_time_line")) {
  1389. var timeLineWidth = oneTdWidth;
  1390. document.getElementById("cur_time_line").style.width = timeLineWidth + "px";
  1391. var timeHeight = parseInt($(".week_time").height());
  1392.  
  1393. var pOffset = parseInt($("#cur_time_line").attr("offset"));
  1394. var timeLineOffset = parseInt(timeHeight - ((timeHeight / 100) * (100 - pOffset)));
  1395. document.getElementById("cur_time_line").style.marginTop = timeLineOffset + "px";
  1396. var leftArrowOffset = $("#calendar_pad").width() + 32;
  1397. var topArrowOffset = timeLineOffset - 6;
  1398. $("#cur_time_line_arrow").css({left: leftArrowOffset + "px", marginTop: topArrowOffset + "px"});
  1399. }
  1400.  
  1401. $(".view_overperiod_events .calendar_event_line").each(function () {
  1402. var eventLength = parseInt($(this).attr("event_length"));
  1403. fullCalWidth = parseInt((eventLength * oneTdWidth) + eventLength);
  1404. $(this).width(fullCalWidth);
  1405. var arrowMargin = fullCalWidth;
  1406.  
  1407. $(this).find(".next_event_arrow").css("margin-left", arrowMargin + "px");
  1408. });
  1409.  
  1410. $(".week_top .calendar_event_line, .week_bottom .calendar_event_line").each(function () {
  1411. var isBackground = parseInt($(this).attr("is_background"));
  1412. var eventOffset = parseInt($(this).attr("event_offset"));
  1413. var eventLength = parseFloat($(this).attr("event_length"));
  1414. var eventWidth = parseInt($(this).attr("event_width"));
  1415. var oneHeight = parseInt(eventLength * BLOCK_HEIGHT - 2); // 2 - размер бордера, его отнимаем от высоты
  1416. var widthValue = parseInt(oneTdWidth / (eventWidth + 1));
  1417.  
  1418. var marginValue = widthValue;
  1419. if (widthValue < 100) {
  1420. marginValue = widthValue - parseInt((100 - widthValue) / eventWidth + 2) + eventWidth - 1;
  1421. widthValue = 100;
  1422. }
  1423. var oneMargin = marginValue * (eventOffset - 1);
  1424.  
  1425. if (!isBackground)
  1426. var oneWidth = widthValue - 2;
  1427. else
  1428. var oneWidth = widthValue;
  1429. if (isNaN(eventWidth)) {
  1430. oneWidth = $(this).parent().outerWidth(true);
  1431. }
  1432.  
  1433. $(this).css({
  1434. width: oneWidth + "px",
  1435. marginLeft: oneMargin + "px",
  1436. height: oneHeight + 'px',
  1437. 'min-height': oneHeight + 'px'
  1438. });
  1439. $(this).hover(function () {
  1440. $(this).css('height', 'auto');
  1441. var childHeight = $(this).children()[0];
  1442. if ($(childHeight).css('height') < $(this).css('height')) {
  1443. $(childHeight).css('height', oneHeight + 'px');
  1444. }
  1445.  
  1446. }, function () {
  1447. $(this).css('height', oneHeight + 'px');
  1448. });
  1449. });
  1450.  
  1451. }
  1452. }
  1453.  
  1454. function highlightEvent(set, event_id, line_id) { // Подсветка событий при наведении
  1455. var eventData = all_calendar_events[event_id];
  1456. var backgroundColor = eventData.color;
  1457. var colorR = eventData.color_r;
  1458. var colorG = eventData.color_g;
  1459. var colorB = eventData.color_b;
  1460.  
  1461. if (set) {
  1462. if (calendar.week || calendar.day)
  1463. $(".calendar_offset_" + line_id + "_" + event_id).css("z-index", 400);
  1464.  
  1465. $(".c_event_layout" + event_id + "_" + line_id).css("background-color", "rgba(" + colorR + ", " + colorG + ", " + colorB + ", 0.4)");
  1466. }
  1467. else if (document.getElementById("record_card_add" + event_id).style.display == "none" || recordView != line_id) {
  1468. if (calendar.week || calendar.day) {
  1469. var eOffset = parseInt($(".calendar_offset_" + line_id + "_" + event_id).attr("event_offset"));
  1470. $(".calendar_offset_" + line_id + "_" + event_id).css("z-index", eOffset + 13);
  1471. }
  1472.  
  1473. $(".c_event_layout" + event_id + "_" + line_id).css("background-color", "rgba(" + colorR + ", " + colorG + ", " + colorB + ", 0.2)");
  1474. }
  1475. }
  1476.  
  1477. // Подсветка столбца с маленьким календарём при наведении на стрелку
  1478. function highlightMinicalendar(set) {
  1479. if (set)
  1480. setColor = "#f0f0f0";
  1481. else
  1482. setColor = "transparent";
  1483. document.getElementById("calendar_act_button").style.background = setColor;
  1484. document.getElementById("calendar_pad").style.background = setColor;
  1485. }
  1486.  
  1487.  
  1488. // Показать/скрыть список всех событий на кнопке "Добавить запись"
  1489. var hiddenHandler = function () {
  1490. if ($(event.target).closest("#hidden_add_events").length) return;
  1491. viewAllEvents();
  1492. event.stopPropagation();
  1493. };
  1494.  
  1495. function viewAllEvents() {
  1496. if (document.getElementById("hidden_add_events").style.display == "none") {
  1497. $('#hidden_add_events').animate({width: 'show', height: 'show', opacity: 'show'}, 200);
  1498. $(document).bind("click", hiddenHandler);
  1499. }
  1500. else {
  1501. $('#hidden_add_events').animate({width: 'hide', height: 'hide', opacity: 'hide'}, 200);
  1502. $(document).unbind("click", hiddenHandler);
  1503. }
  1504. }
  1505.  
  1506. // Функция перестроения календаря при изменениях, пока только перезагружает страницу
  1507. function changeOffsets() {
  1508. window.location.reload();
  1509. return;
  1510. var lengthOrder = new Object;
  1511. var maxLength = 0;
  1512. max_offset = 0;
  1513. max_overperiods_offset = 0;
  1514. var busyDates = new Object;
  1515. var busyWeekdays = new Object;
  1516.  
  1517. for (oneEventId in js_events) {
  1518. var oneEvent = js_events[oneEventId];
  1519. for (oneLineId in oneEvent) {
  1520. var oneLine = oneEvent[oneLineId];
  1521. if (oneLine == undefined) continue;
  1522. if (calendar.day && (parseInt(calendar.js_begin) > parseInt(oneLine.begin) || parseInt(calendar.js_end) < parseInt(oneLine.end))) continue;
  1523.  
  1524. var lengthValue = parseInt(oneLine.length);
  1525. if (lengthValue > maxLength)
  1526. maxLength = lengthValue;
  1527. if (!lengthOrder[lengthValue])
  1528. lengthOrder[lengthValue] = new Object;
  1529. if (!lengthOrder[lengthValue][oneEventId])
  1530. lengthOrder[lengthValue][oneEventId] = new Object;
  1531. lengthOrder[lengthValue][oneEventId][oneLineId] = 1;
  1532. }
  1533. }
  1534.  
  1535. for (m = maxLength + 1; m >= 0; m--) {
  1536. var oneData = lengthOrder[m];
  1537. if (!oneData) continue;
  1538. for (oneEventId in oneData) {
  1539. var oneEvent = oneData[oneEventId];
  1540. for (oneLineId in oneEvent) {
  1541. var oneLine = js_events[oneEventId][oneLineId];
  1542. if (calendar.day || calendar.week)
  1543. var startLine = 1;
  1544. else
  1545. var startLine = 0;
  1546.  
  1547. var overperiodOffset = 0;
  1548.  
  1549. var currentOffset = oneLine.offset;
  1550. var addedLine = false;
  1551.  
  1552. while (!addedLine) {
  1553. if (calendar.day || (calendar.week && (oneLine.begin.substr(0, 8) == oneLine.end.substr(0, 8) || oneLine.end == "0"))) {
  1554. var startHour = oneLine.begin.substr(8, 2);
  1555. if (startHour[0] == "0") startHour = startHour[1];
  1556. var startMin = oneLine.begin.substr(10, 2);
  1557. if (startMin < "30") startMin = 0;
  1558. else startMin = 0.5;
  1559. var startTime = parseInt(startHour) + startMin;
  1560.  
  1561. if (oneLine.end == "0")
  1562. var endTime = startTime + 1;
  1563. else {
  1564. var endHour = oneLine.end.substr(8, 2);
  1565. if (endHour[0] == "0") endHour = endHour[1];
  1566. var endMin = oneLine.end.substr(10, 2);
  1567. if (endMin < "30") endMin = 0;
  1568. else endMin = 0.5;
  1569. var endTime = parseInt(endHour) + endMin;
  1570. }
  1571.  
  1572. if (calendar.week) {
  1573. for (pos in week_days)
  1574. if (oneLine.begin.substr(0, 8) == week_days[pos])
  1575. lineWeekDay = pos;
  1576. }
  1577. else
  1578. lineWeekDay = "";
  1579.  
  1580. for (h = startTime; h <= endTime; h = h + 0.5) {
  1581. var busyDate = h + "" + lineWeekDay;
  1582. if (!busyDates[busyDate])
  1583. busyDates[busyDate] = new Object;
  1584. if (!busyDates[busyDate][startLine]) {
  1585. busyDates[busyDate][startLine] = {event_id: oneEventId, line_id: oneLineId};
  1586. addedLine = true;
  1587. }
  1588. else {
  1589. addedLine = false;
  1590. startLine += 1;
  1591.  
  1592. for (oneDateStr in busyDates) {
  1593. var oneDate = busyDates[oneDateStr];
  1594. if (oneDate[startLine])
  1595. if (oneDate[startLine]['event_id'] == oneEventId && oneDate[startLine]['line_id'] == oneLineId)
  1596. busyDates[oneDateStr][startLine] = false;
  1597. }
  1598. break;
  1599. }
  1600. }
  1601. }
  1602. else if (calendar.week && oneLine.begin.substr(0, 8) != oneLine.end.substr(0, 8) && oneLine.end != "0") {
  1603. if (calendar.js_begin > oneLine.begin)
  1604. var startCell = calendar.js_begin.substr(0, 8);
  1605. else
  1606. var startCell = oneLine.begin.substr(0, 8);
  1607.  
  1608. if (calendar.js_end < oneLine.end)
  1609. var endCell = calendar.js_end.substr(0, 8);
  1610. else
  1611. var endCell = oneLine.end.substr(0, 8);
  1612.  
  1613. for (pos in week_days) {
  1614. if (startCell <= week_days[pos] && endCell >= week_days[pos]) {
  1615. if (!busyWeekdays[pos])
  1616. busyWeekdays[pos] = new Object;
  1617. if (!busyWeekdays[pos][overperiodOffset]) {
  1618. busyWeekdays[pos][overperiodOffset] = {event_id: oneEventId, line_id: oneLineId};
  1619. addedLine = true;
  1620. }
  1621. else {
  1622. for (oneWeekStr in busyWeekdays) {
  1623. var oneWeek = busyWeekdays[oneWeekStr];
  1624. if (oneWeek[overperiodOffset])
  1625. if (oneWeek[overperiodOffset]['event_id'] == oneEventId && oneWeek[overperiodOffset]['line_id'] == oneLineId)
  1626. busyWeekdays[oneWeekStr][overperiodOffset] = false;
  1627. }
  1628. overperiodOffset += 1;
  1629. addedLine = false;
  1630. break;
  1631. }
  1632. }
  1633. }
  1634. }
  1635. else {
  1636. for (oneStrId in month_days) {
  1637. var oneStr = month_days[oneStrId];
  1638. for (oneCellId in oneStr) {
  1639. var oneCell = oneStr[oneCellId];
  1640. var busyDate = parseInt(oneCell.str);
  1641. if (parseInt(oneLine.end) == 0) oneLine.end = oneLine.begin;
  1642.  
  1643. if (busyDate >= parseInt(oneLine.begin) && busyDate <= parseInt(oneLine.end)) {
  1644. if (!busyDates[busyDate])
  1645. busyDates[busyDate] = new Object;
  1646.  
  1647. if (!busyDates[busyDate][startLine]) {
  1648. busyDates[busyDate][startLine] = {event_id: oneEventId, line_id: oneLineId};
  1649. addedLine = true;
  1650. }
  1651. else {
  1652. for (oneDateStr in busyDates) {
  1653. var oneDate = busyDates[oneDateStr];
  1654. if (oneDate[startLine])
  1655. if (oneDate[startLine]['event_id'] == oneEventId && oneDate[startLine]['line_id'] == oneLineId)
  1656. busyDates[oneDateStr][startLine] = false;
  1657. }
  1658. addedLine = false;
  1659. startLine += 1
  1660. }
  1661. }
  1662. }
  1663. }
  1664. }
  1665. }
  1666.  
  1667. if (max_offset < parseInt(startLine)) max_offset = parseInt(startLine) - 1;
  1668. if (max_overperiods_offset < parseInt(overperiodOffset)) max_overperiods_offset = parseInt(overperiodOffset);
  1669.  
  1670. $(".overperiods_heights").height((max_overperiods_offset + 1) * 17)
  1671.  
  1672. if (calendar.week && oneLine.begin.substr(0, 8) != oneLine.end.substr(0, 8) && oneLine.end != "0" && parseInt(currentOffset) != parseInt(overperiodOffset)) {
  1673. var date_field = all_calendar_events[oneEventId]['date_field'];
  1674. js_events[oneEventId][oneLineId]['offset'] = overperiodOffset;
  1675.  
  1676. var cOffset = parseInt(overperiodOffset) * 17;
  1677. $(".calendar_event_line_" + date_field + "_" + oneLineId + "_" + oneEventId).css("margin-top", cOffset + "px");
  1678. }
  1679. else if (parseInt(currentOffset) != parseInt(startLine)) {
  1680. if (calendar.week && oneLine.begin.substr(0, 8) != oneLine.end.substr(0, 8) && oneLine.end != "0") continue;
  1681. var date_field = all_calendar_events[oneEventId]['date_field'];
  1682. js_events[oneEventId][oneLineId]['offset'] = startLine;
  1683.  
  1684. if (calendar.day || calendar.week) {
  1685. $(".calendar_event_line_" + date_field + "_" + oneLineId + "_" + oneEventId).attr("event_offset", startLine);
  1686. }
  1687. else {
  1688. var cOffset = parseInt(startLine) * 17;
  1689. $(".calendar_event_line_" + date_field + "_" + oneLineId + "_" + oneEventId).css("margin-top", cOffset + "px");
  1690. }
  1691. }
  1692. }
  1693. }
  1694. }
  1695. }
  1696. ////////////////////////////////////
  1697. ///////////////////////////////////
  1698.  
  1699. // сформировать значение мулти-селекта
  1700. function form_value_multi(field_id, line_id, pos, subtable_id, val) {
  1701. // console.log("save_value_multi: "+"field="+field_id+" line="+line_id+" pos"+pos+" value="+val);
  1702. fast_edit_old = field_id + '|' + line_id + '|' + pos + '|' + val;
  1703. var mult_id = "fast_edit_span_" + field_id + "_" + line_id + "_" + subtable_id + pos;
  1704. var mult_obj = document.getElementById(mult_id);
  1705. var part = mult_obj.getAttribute('part');
  1706. var selWidth = $(mult_obj).width();
  1707.  
  1708. field = all_fields[field_id];
  1709. type_field = field['type_field'];
  1710.  
  1711. // формируем полное значение
  1712. var full_value = "";
  1713. var all_values = {};
  1714. $("#sub_cell_" + field_id + "_" + line_id).find('select[multi_select_group=' + field_id + '_' + line_id + ']').each(function (i) {
  1715. if (this.value && all_values[this.value] == undefined) {
  1716. if (((type_field == 7 || type_field == 11) && this.value != 0) || (type_field == 14 && this.value != ""))
  1717. full_value += "-" + this.value;
  1718. else if (type_field == 4)
  1719. full_value = full_value + this.value + "\r\n";
  1720. }
  1721. // Также составляем список элемент, которые нельзя выбрать
  1722. if (((type_field == 7 || type_field == 11) && this.value != 0) || ((type_field == 14 || type_field == 4) && this.value != ""))
  1723. all_values[this.value] = this.value;
  1724. });
  1725. if (full_value) {
  1726. if (type_field == 4)
  1727. full_value = full_value.substr(0, full_value.length - 2);
  1728. else
  1729. full_value += "-";
  1730. }
  1731.  
  1732.  
  1733. // измеянем количество селектов
  1734. if (((type_field == 4 || type_field == 14) && val == "") || ((type_field == 7 || type_field == 11) && val == 0)) { // выбрано пустое значение
  1735. var t_span = mult_obj.parentNode;
  1736. t_span.parentNode.removeChild(t_span);
  1737. }
  1738. else { // выбрано непустое значение
  1739. if (mult_obj.getAttribute("is_last") == 1) {
  1740. mult_obj.setAttribute("is_last", 0);
  1741. // клонируем текущий элемент
  1742. var obj_tag_name = mult_obj.tagName;
  1743. var new_pos = intval(pos) + 1;
  1744. var new_id = "fast_edit_span_" + field_id + "_" + line_id + "_" + subtable_id + new_pos;
  1745. var newEL = document.createElement(obj_tag_name);
  1746. newEL.id = new_id;
  1747. newEL.className = mult_obj.className;
  1748. newEL.setAttribute("subtable_id", subtable_id);
  1749. $(newEL).removeClass('cust_select');
  1750. // события
  1751. addHandler_mult_select(newEL);
  1752.  
  1753. // атрибуты
  1754. newEL.setAttribute("multi_select_group", field_id + "_" + line_id);
  1755. newEL.setAttribute("style", mult_obj.getAttribute("style"));
  1756. newEL.style.background = '';
  1757. newEL.setAttribute("field_id", field_id);
  1758. newEL.setAttribute("line_id", line_id);
  1759. newEL.setAttribute("pos", new_pos);
  1760. newEL.setAttribute("is_last", 1);
  1761. newEL.setAttribute("tabindex", last_tabindex_fast_edit);
  1762. newEL.setAttribute("part", part);
  1763. $(newEL).html(mult_obj.innerHTML);
  1764. newEL.selectedIndex = -1;
  1765. // вставляем после текущего
  1766. var parent = mult_obj.parentNode;
  1767. parent.appendChild(newEL);
  1768. }
  1769. }
  1770.  
  1771. $("#sub_cell_" + field_id + "_" + line_id).find('select[multi_select_group=' + field_id + '_' + line_id + ']').each(function (t) {
  1772. var select_obj = this;
  1773. var options_count = 0;
  1774. $(this).children().each(function (y) {
  1775. if (this.value != select_obj.value) { // не выбранный елемент
  1776. if (in_array(this.value, all_values)) {
  1777. this.style.display = 'none';
  1778. this.setAttribute('disabled', 'disabled');
  1779. }
  1780. else {
  1781. this.style.display = '';
  1782. this.setAttribute('disabled', '');
  1783. this.removeAttribute('disabled');
  1784. if (((type_field == 4 || type_field == 14) && this.value != '') || ((type_field == 7 || type_field == 11) && this.value != 0)) options_count++;
  1785. }
  1786. }
  1787. else {
  1788. this.style.display = '';
  1789. this.setAttribute('disabled', '');
  1790. this.removeAttribute('disabled');
  1791. if (((type_field == 4 || type_field == 14) && this.value != '') || ((type_field == 7 || type_field == 11) && this.value != 0)) options_count++;
  1792. }
  1793. });
  1794. if (options_count == 0)
  1795. // Не одного видимого элемента, скрываем котрол
  1796. {
  1797. select_obj.parentNode.style.display = 'none';
  1798. select_obj.style.display = 'none';
  1799. }
  1800. else {
  1801. select_obj.parentNode.style.display = 'block';
  1802. select_obj.style.display = '';
  1803. }
  1804. });
  1805.  
  1806. if (document.getElementById('fast_edit_span_' + field_id + '_' + line_id + "_" + subtable_id).value != full_value) { // Если изменилось сохранияем
  1807. $('input[id^=fast_edit_span_' + field_id + '_' + line_id + ']').val(full_value);
  1808. if (part == 'add_link_field') return; // Ничего не сохраняем
  1809. save_value_multi(field_id, line_id, full_value);
  1810. }
  1811. ;
  1812. }
  1813.  
  1814. /// ----------------- Обработчкики событий ----------------
  1815. //
  1816. // Одинарный селект
  1817. //
  1818.  
  1819. function addHandler_select(obj) {
  1820. // Поскольку объект скрыт, ширина равна нулю, проходимся по всему списку значений и находим самое длинное, устанавливаем ширину элемента по нему
  1821. var field_id = obj.getAttribute('field_id');
  1822. if (obj.id.indexOf("fast_edit_span_" + field_id + "_e") >= 0) {
  1823. $(obj).width(150); // В быстром поиске принудительная ширина
  1824. $(obj).removeClass("nwidth");
  1825. // setTimeout("substr_select_span('" + obj.id + "')", 500);
  1826. }
  1827. else {
  1828. var charsCount = 0
  1829. $("#" + obj.id + " option").each(function (element, index) {
  1830. if (charsCount < $(this).html().length)
  1831. charsCount = $(this).html().length;
  1832. });
  1833. $(obj).width((charsCount * 7) + 20);
  1834. }
  1835. addHandler(obj, "onkeypress", onkeypress_select);
  1836. addHandler(obj, "onkeydown", onkeydown_select);
  1837. addHandler(obj, "onmousedown", onmousedown_select);
  1838. addHandler(obj, "onfocus", onfocus_select);
  1839. addHandler(obj, "onchange", onchange_select);
  1840. };
  1841.  
  1842. function onkeypress_select(event) {
  1843. var obj = event.target;
  1844. if (!obj) obj = event.srcElement;
  1845.  
  1846. if ((event.keyCode == 0xA) || (event.keyCode == 0xD)) {
  1847. if (window.event) {
  1848. window.event.cancelBubble = true;
  1849. window.event.returnValue = false;
  1850. }
  1851. else {
  1852. event.stopPropagation();
  1853. event.cancelBubble = true;
  1854. event.returnValue = false;
  1855. }
  1856. obj.blur();
  1857. dont_open_view = 1;
  1858. return false;
  1859. }
  1860. };
  1861.  
  1862. function onkeydown_select(event) {
  1863. var obj = event.target;
  1864. if (!obj) obj = event.srcElement;
  1865. if ((event.keyCode == 0xA) || (event.keyCode == 0xD)) {
  1866. if (window.event) {
  1867. window.event.cancelBubble = true;
  1868. window.event.returnValue = false;
  1869. }
  1870. else {
  1871. event.stopPropagation();
  1872. event.cancelBubble = true;
  1873. event.returnValue = false;
  1874. }
  1875. obj.blur();
  1876. dont_open_view = 1;
  1877. return false;
  1878. }
  1879. };
  1880.  
  1881. function onmousedown_select(event) {
  1882. dont_open_view = 2;
  1883. };
  1884.  
  1885.  
  1886. function onfocus_select(event) {
  1887. var obj = event.target;
  1888. if (!obj) obj = event.srcElement;
  1889. obj.style.background = 'white';
  1890. fast_edit_old = obj.getAttribute('field_id') + '|' + obj.getAttribute('line_id') + '|' + obj.value;
  1891. }
  1892.  
  1893. function onchange_select(event) {
  1894. var obj = event.target;
  1895. if (!obj) obj = event.srcElement;
  1896. var part = obj.getAttribute('part');
  1897. var field_id = obj.getAttribute('field_id');
  1898. /*if (obj.id.indexOf("fast_edit_span_" + field_id + "_e") >= 0)
  1899. setTimeout("substr_select_span('" + obj.id + "')", 200);*/
  1900.  
  1901. if (part == 'add_link_field') return; // Ничего не сохраняем
  1902. if ($(".save_event_button:visible").length == 0) {
  1903. $(".go_event_link").fadeOut(200, function () {
  1904. setTimeout("$('.save_event_button').fadeIn(200)", 200);
  1905. });
  1906. }
  1907. if (fast_edit_old != obj.getAttribute('field_id') + '|' + obj.getAttribute('line_id') + '|' + obj.value) {
  1908. obj.parentNode.style.background = '#fff6ad';
  1909. obj.parentNode.setAttribute('yellow_color', '1');
  1910. save_value(field_id, obj.getAttribute('line_id'), obj.value);
  1911. obj.parentNode.setAttribute('yellow_color', '0');
  1912. parentObj= obj.parentNode;
  1913. $(parentObj).animate({
  1914. backgroundColor: '#fff'
  1915. }, 1000);
  1916. }
  1917. else {
  1918. obj.parentNode.style.background = '';
  1919. obj.parentNode.style.backgroundColor = '';
  1920. }
  1921. }
  1922.  
  1923.  
  1924. //
  1925. // МНОЖЕСТВЕННЫЙ СЕЛЕКТ
  1926. //
  1927. function addHandler_mult_select(obj) {
  1928. // Поскольку объект скрыт, ширина равна нулю, проходимся по всему списку значений и находим самое длинное, устанавливаем ширину элемента по нему
  1929. var field_id = obj.getAttribute('field_id');
  1930. var line_id = obj.getAttribute('line_id');
  1931. if (obj.id.indexOf("fast_edit_span_" + field_id + "_e") >= 0) {
  1932. $(obj).width(150); // В быстром поиске принудительная ширина
  1933. $(obj).removeClass("nwidth");
  1934. }
  1935. else {
  1936. var charsCount = 0
  1937. $("#" + obj.id + " option").each(function (element, index) {
  1938. if (charsCount < $(this).html().length)
  1939. charsCount = $(this).html().length;
  1940. });
  1941. $(obj).width((charsCount * 7) + 20);
  1942. }
  1943.  
  1944. addHandler(obj, "onkeypress", onkeypress_mult_select);
  1945. addHandler(obj, "onkeydown", onkeydown_mult_select);
  1946. addHandler(obj, "onfocus", onfocus_mult_select);
  1947. addHandler(obj, "onchange", onchange_mult_select);
  1948. };
  1949.  
  1950. function onkeypress_mult_select(event) {
  1951. var obj = event.target;
  1952. if (!obj) obj = event.srcElement;
  1953.  
  1954. if ((event.keyCode == 0xA) || (event.keyCode == 0xD)) {
  1955. if (window.event) {
  1956. window.event.cancelBubble = true;
  1957. window.event.returnValue = false;
  1958. }
  1959. else {
  1960. event.stopPropagation();
  1961. event.cancelBubble = true;
  1962. event.returnValue = false;
  1963. }
  1964. obj.blur();
  1965. dont_open_view = 1;
  1966. return false;
  1967. }
  1968. };
  1969.  
  1970. function onkeydown_mult_select(event) {
  1971. var obj = event.target;
  1972. if (!obj) obj = event.srcElement;
  1973. if ((event.keyCode == 0xA) || (event.keyCode == 0xD)) {
  1974. if (window.event) {
  1975. window.event.cancelBubble = true;
  1976. window.event.returnValue = false;
  1977. }
  1978. else {
  1979. event.stopPropagation();
  1980. event.cancelBubble = true;
  1981. event.returnValue = false;
  1982. }
  1983. obj.blur();
  1984. dont_open_view = 1;
  1985. return false;
  1986. }
  1987. };
  1988.  
  1989. function onfocus_mult_select(event) {
  1990. var obj = event.target;
  1991. if (!obj) obj = event.srcElement;
  1992. fast_edit_old = obj.getAttribute('field_id') + '|' + obj.getAttribute('line_id') + '|' + obj.getAttribute('pos') + '|' + obj.value;
  1993. }
  1994.  
  1995. function onchange_mult_select(event) {
  1996. var obj = event.target;
  1997. if (!obj) obj = event.srcElement;
  1998. if (fast_edit_old != obj.getAttribute('field_id') + '|' + obj.getAttribute('line_id') + '|' + obj.getAttribute('pos') + '|' + obj.value) {
  1999. var part = obj.getAttribute('part');
  2000. if (part != 'add_link_field') {
  2001. obj.parentNode.style.background = '#fff6ad';
  2002. obj.parentNode.setAttribute('yellow_color', '1');
  2003. if ($(".save_event_button:visible").size() == 0) {
  2004. $(".go_event_link").fadeOut(200, function () {
  2005. setTimeout("$('.save_event_button').fadeIn(200)", 200);
  2006. });
  2007. }
  2008. }
  2009. form_value_multi(obj.getAttribute('field_id'), obj.getAttribute('line_id'), obj.getAttribute('pos'), 0, obj.value);
  2010. }
  2011. else {
  2012. obj.parentNode.style.background = '';
  2013. obj.parentNode.style.backgroundColor = '';
  2014. }
  2015. }
  2016.  
  2017. //
  2018. // Поле дата
  2019. //
  2020. function addHandler_date(obj) {
  2021. addHandler(obj, "onkeydown", onkeydown_date);
  2022. $(obj).bind("mousedown", onmousedown_date);
  2023. addHandler(obj, "onfocus", onfocus_date);
  2024. addHandler(obj, "onblur", onblur_date);
  2025. $(obj).bind('change', onchange_date); // необходимо для обмена событиями
  2026. };
  2027.  
  2028. function onkeydown_date(event) {
  2029. var obj = event.target;
  2030. if (!obj) obj = event.srcElement;
  2031. var part = obj.getAttribute('part');
  2032. if (part != 'add_link_field') {
  2033. $(".go_event_link").fadeOut(200, function () {
  2034. setTimeout("$('.save_event_button').fadeIn(200)", 200);
  2035. });
  2036. }
  2037. if ((event.keyCode == 0xA) || (event.keyCode == 0xD)) {
  2038. if (window.event) {
  2039. window.event.cancelBubble = true;
  2040. window.event.returnValue = false;
  2041. }
  2042. else {
  2043. event.stopPropagation();
  2044. event.cancelBubble = true;
  2045. event.returnValue = false;
  2046. }
  2047. // Если нажат enter отменяем событие, и сохраняем значение
  2048. this.blur();
  2049. return false;
  2050. }
  2051. }
  2052.  
  2053. function onmousedown_date(event) {
  2054. var obj = event.target;
  2055. if (!obj) obj = event.srcElement;
  2056. dont_open_view = 1;
  2057. }
  2058.  
  2059. function onfocus_date(event) {
  2060. var obj = event.target;
  2061. if (!obj) obj = event.srcElement;
  2062. if (skip_fast_focus) {
  2063. skip_fast_focus = 0;
  2064. return;
  2065. }
  2066. if (fast_edit_old === '') {
  2067. fast_edit_old = obj.getAttribute('field_id') + '|' + obj.getAttribute('line_id') + '|' + obj.value;
  2068. }
  2069. }
  2070.  
  2071. function onblur_date(event) {
  2072. var obj = event.target;
  2073. if (!obj) obj = event.srcElement;
  2074. if (skip_fast_blur) {
  2075. skip_fast_blur = 0;
  2076. return;
  2077. }
  2078. ;
  2079. // $(obj).datepicker('hide');
  2080. }
  2081.  
  2082. function onchange_date(event) {
  2083. var obj = event.target;
  2084. if (!obj) obj = event.srcElement;
  2085. if ($('#ui-datepicker-div').css("overflow") != 'hidden' && $(obj).hasClass("datetimepicker") && $('#ui-datepicker-div').css("display") != 'none') return false; //отключаем быстрое редактирование в режиме календаря c часами и минутами до тех пор, пока открыт сам календарик
  2086. var part = obj.getAttribute('part');
  2087. if (part == 'add_link_field') return; // Ничего не сохраняем
  2088. if (fast_edit_old != obj.getAttribute('field_id') + '|' + obj.getAttribute('line_id') + '|' + this.value) {
  2089. obj.style.background = '#fff6ad';
  2090. $(obj).attr('yellow_color', '1');
  2091. save_value(obj.getAttribute('field_id'), obj.getAttribute('line_id'), obj.value);
  2092. }
  2093. else
  2094. obj.style.background = '';
  2095. obj.blur();
  2096. if ($(".save_event_button:visible").size() == 0) {
  2097. $(".go_event_link").fadeOut(200, function () {
  2098. setTimeout("$('.save_event_button').fadeIn(200)", 200);
  2099. });
  2100. }
  2101. }
  2102.  
  2103. //
  2104. // ПОЛЕ ТЕКСТ
  2105. //
  2106. function addHandler_text(obj, part) {
  2107. //addHandler(obj,"onkeypress", onkeypress_text);
  2108. addHandler(obj, "onkeydown", onkeydown_text);
  2109. //addHandler(obj,"onmousedown", onmousedown_text);
  2110. //addHandler(obj,"onfocus", onfocus_text);
  2111. //addHandler(obj,"onblur", onblur_text);
  2112. addHandler(obj, "onchange", onchange_text);
  2113. addHandler(obj, "onfocus", onfocus_text_new);
  2114. addHandler(obj, "onblur", onblur_text_new);
  2115. };
  2116.  
  2117. function onfocus_text_new(event) {
  2118. var obj = event.target;
  2119.  
  2120. var part = obj.getAttribute('part');
  2121. if (part == 'add_link_field') return; // Ничего не сохраняем
  2122.  
  2123. obj.style.border = '1px dotted #a0a0a0';
  2124. obj.style.background = 'white';
  2125. }
  2126.  
  2127. function onblur_text_new(event) {
  2128. var obj = event.target;
  2129.  
  2130. var part = obj.getAttribute('part');
  2131. if (part == 'add_link_field') return; // Ничего не сохраняем
  2132.  
  2133. obj.style.border = '1px dotted #a0a0a0';
  2134. }
  2135.  
  2136. function onchange_text(event) {
  2137. var obj = event.target;
  2138.  
  2139. var part = obj.getAttribute('part');
  2140. if (part == 'add_link_field') return; // Ничего не сохраняем
  2141.  
  2142. obj.style.border = '1px dotted #a0a0a0';
  2143.  
  2144. if (fast_edit_old != obj.getAttribute('field_id') + '|' + obj.getAttribute('line_id') + '|' + obj.value) {
  2145. obj.style.background = '#fff6ad';
  2146. $(obj).attr('yellow_color', '1');
  2147. save_value(obj.getAttribute('field_id'), obj.getAttribute('line_id'), obj.value);
  2148. }
  2149. else
  2150. obj.style.background = '';
  2151. }
  2152.  
  2153. function onkeypress_text(event) {
  2154. if ((navigator.appVersion.indexOf("MSIE") != -1) || (navigator.userAgent.indexOf("Opera") != -1)) { // тк. они некорректно вставляют перенос строки
  2155. if ((event.keyCode == 0xA) || (event.keyCode == 0xD)) {
  2156. if (window.event) {
  2157. window.event.cancelBubble = true;
  2158. window.event.returnValue = false;
  2159. }
  2160. else {
  2161. event.stopPropagation();
  2162. event.cancelBubble = true;
  2163. event.returnValue = false;
  2164. }
  2165. return false;
  2166. }
  2167. }
  2168. }
  2169.  
  2170. function onkeydown_text(event) {
  2171. var obj = event.target;
  2172. if (!obj) {
  2173. obj = event.srcElement;
  2174. // IE как всегда в ударе, подписываем на событие div а приходит событие о вложенном элементе, получить родительский div через свойства невозможно
  2175. // поэтому если не div то всплываем
  2176. while (obj.tagName != 'DIV') {
  2177. obj = obj.parentNode;
  2178. }
  2179. }
  2180. var part = obj.getAttribute('part');
  2181. if (part != 'add_link_field') {
  2182. $(".go_event_link").fadeOut(200, function () {
  2183. setTimeout("$('.save_event_button').fadeIn(200)", 200);
  2184. });
  2185. }
  2186.  
  2187. return; // Дальнейшая обработка не требуется
  2188.  
  2189. if (event.shiftKey) // Для правильной установки фокуса на span - чтобы появлялся курсор
  2190. {
  2191. var t = obj.previousSibling;
  2192. if (typeof(t.onfocus) !== 'undefined') t.tabIndex = '';
  2193. }
  2194. else {
  2195. var t = obj.previousSibling;
  2196. if (typeof(t.onfocus) !== 'undefined') t.tabIndex = '800';
  2197. }
  2198. if ((event.keyCode == 0xA) || (event.keyCode == 0xD)) {
  2199. if (event.ctrlKey) { // если нажат контрол, полюбому теряем фокус
  2200. obj.blur();
  2201. return false;
  2202. }
  2203. if (obj.getAttribute("mult_value") == 1) {
  2204. if ((navigator.appVersion.indexOf("MSIE") != -1) || (navigator.userAgent.indexOf("Opera") != -1)) { // тк. они некорректно вставляют перенос строки
  2205. // IE и OPERA явно вставляем br
  2206. if (window.event) {
  2207. window.event.cancelBubble = true;
  2208. window.event.returnValue = false;
  2209. }
  2210. else {
  2211. event.stopPropagation();
  2212. event.cancelBubble = true;
  2213. event.returnValue = false;
  2214. }
  2215. insert_next_line(obj);
  2216. return false;
  2217. }
  2218. else {
  2219. return true;
  2220. }
  2221. }
  2222. else {
  2223. obj.blur();
  2224. return false;
  2225. }
  2226. }
  2227. else if (event.keyCode == 32 && navigator.userAgent.indexOf('Chrome')) { // Если текстовое поле не ограничено по ширине, то при вставке стандартного пробела происходит баг с сокращением последнего пробела
  2228. var space_span = document.createTextNode('\u2009');
  2229. insertTextAtCursor(" ", space_span);
  2230. if (window.event) {
  2231. window.event.cancelBubble = true;
  2232. window.event.returnValue = false;
  2233. }
  2234. else {
  2235. event.stopPropagation();
  2236. event.cancelBubble = true;
  2237. event.returnValue = false;
  2238. }
  2239. return false;
  2240. }
  2241. }
  2242.  
  2243. function onmousedown_text(event) {
  2244. var obj = event.currentTarget;
  2245. if (!obj) {
  2246. obj = event.srcElement;
  2247. // IE как всегда в ударе, подписываем на событие div а приходит событие о вложенном элементе, получить родительский div через свойства невозможно
  2248. // поэтому если не div то всплываем
  2249. while (obj.tagName != 'DIV') {
  2250. obj = obj.parentNode;
  2251. }
  2252. }
  2253. if (event.ctrlKey) { // если нажат контрол, то срабатывает как обычная таблица
  2254. }
  2255. else {
  2256. obj.contentEditable = true;
  2257. dont_open_view = 2;
  2258. }
  2259. }
  2260.  
  2261. function onfocus_text(event) {
  2262. var obj = event.target;
  2263. if (!obj) {
  2264. obj = event.srcElement;
  2265. // IE как всегда в ударе, подписываем на событие div а приходит событие о вложенном элементе, получить родительский div через свойства невозможно
  2266. // поэтому если не div то всплываем
  2267. while (obj.tagName != 'DIV') {
  2268. obj = obj.parentNode;
  2269. }
  2270. }
  2271. obj.previousSibling.tabIndex = obj.getAttribute('tabindex');
  2272. obj.style.border = '1px dotted #a0a0a0';
  2273. fast_edit_old = obj.getAttribute('field_id') + '|' + obj.getAttribute('line_id') + '|' + obj.innerHTML;
  2274. }
  2275.  
  2276. function onblur_text(event) {
  2277. var obj = event.target;
  2278. if (!obj) {
  2279. obj = event.srcElement;
  2280. // IE как всегда в ударе, подписываем на событие div а приходит событие о вложенном элементе, получить родительский div через свойства невозможно
  2281. // поэтому если не div то всплываем
  2282. while (obj.tagName != 'DIV') {
  2283. obj = obj.parentNode;
  2284. }
  2285. }
  2286. var part = obj.getAttribute('part');
  2287. obj.previousSibling.tabIndex = obj.getAttribute('tabindex');
  2288. obj.contentEditable = false;
  2289. obj.style.border = '';
  2290. if (part == 'add_link_field') return; // Ничего не сохраняем
  2291. if (fast_edit_old != obj.getAttribute('field_id') + '|' + obj.getAttribute('line_id') + '|' + obj.innerHTML) {
  2292. obj.style.background = '#fff6ad';
  2293. $(obj).attr('yellow_color', '1');
  2294. save_value(obj.getAttribute('field_id'), obj.getAttribute('line_id'), obj.innerHTML);
  2295. }
  2296. else
  2297. obj.style.background = '';
  2298. }
  2299.  
  2300. //
  2301. // ПОЛЕ ФАЙЛ
  2302. //
  2303. function addHandler_file(obj) {
  2304. addHandler(obj, "onmouseover", onmouseover_file);
  2305. addHandler(obj, "onmouseout", onmouseout_file);
  2306. addHandler(obj.nextSibling, "onclick", ondrop_file);
  2307. };
  2308.  
  2309. function onmouseover_file(event) {
  2310. var obj = event.target;
  2311. if (!obj) obj = event.srcElement;
  2312. if (obj.tagName != "A") obj = obj.parentNode; // Разворачиваем вверх, т.к. это изображение
  2313. obj.nextSibling.className = "b_drop";
  2314. var field_id = obj.getAttribute('field_id');
  2315. var line_id = obj.getAttribute('line_id');
  2316. document.getElementById("add_file_url_" + field_id + "_" + line_id).className = "sub_fast_edit_file_url_hover";
  2317. }
  2318.  
  2319. function onmouseout_file(event) {
  2320. var obj = event.target;
  2321. if (!obj) obj = event.srcElement;
  2322. if (obj.tagName != "A") obj = obj.parentNode; // Разворачиваем вверх, т.к. это изображение
  2323. obj.nextSibling.className = "b_drop_hoverpopup";
  2324. var field_id = obj.getAttribute('field_id');
  2325. var line_id = obj.getAttribute('line_id');
  2326. document.getElementById("add_file_url_" + field_id + "_" + line_id).className = "sub_fast_edit_file_url";
  2327. }
  2328.  
  2329. function ondrop_file(event) {
  2330. $(".go_event_link").fadeOut(200, function () {
  2331. setTimeout("$('.save_event_button').fadeIn(200)", 200);
  2332. });
  2333. var obj = event.target;
  2334. if (!obj) obj = event.srcElement;
  2335. var prev = obj.previousSibling; // A href
  2336. var part = obj.getAttribute('part');
  2337. if (part == 'add_link_field') return; // Ничего не сохраняем
  2338. jconfirm(lang.Delete_file + " " + obj.previousSibling.title + " ?",
  2339. function () {
  2340. var field_id = prev.getAttribute('field_id');
  2341. var line_id = prev.getAttribute('line_id');
  2342. var f_name = prev.title;
  2343.  
  2344. prev.style.background = "#fff6ad";
  2345. obj.style.backgroundColor = "#fff6ad";
  2346. obj.style.borderLeft = "7px solid #fff6ad";
  2347. ajax_update.format = 0;
  2348. ajax_update.method = "POST";
  2349. ajax_update.call("sel=drop_file&field=" + field_id + "&line=" + line_id + "&fname=" + encodeURIComponent(f_name) + "&csrf=" + csrf, function (resp) {
  2350. var res_arr = resp.toString().split("|");
  2351. var field_id = res_arr[2];
  2352. var line_id = res_arr[3];
  2353. if (res_arr[0] == "deleted" || res_arr[0] == "message") { // удаляем из списка
  2354. obj.parentNode.parentNode.removeChild(obj.parentNode);
  2355. }
  2356. var resp_arr = str_replace("\n", "\r\n", resp.toString()).split("\r\n");
  2357. UpdateData(resp_arr);
  2358. });
  2359. });
  2360. }
  2361.  
  2362. // Загрузка файла
  2363. var upload_in_progress = 0;
  2364.  
  2365. function check_upload_file(field_id, obj) {
  2366. if (obj.files) {
  2367. var f_pos;
  2368. for (f_pos = 0; f_pos < obj.files.length; f_pos++) {
  2369. var upl_files = obj.files[f_pos];
  2370. name = upl_files.name;
  2371. size = upl_files.size;
  2372. ext_pos = name.lastIndexOf(".");
  2373. ext = name.substr(ext_pos + 1).toLowerCase();
  2374. f_t = all_fields[field_id]['file_types'];
  2375. if (typeof f_t[0] != 'undefined') {
  2376. var i = 0;
  2377. var ext_str = '';
  2378. for (var key in f_t) {
  2379. if (f_t[key] == ext) i++;
  2380. ext_str = ext_str + f_t[key] + ', ';
  2381. }
  2382. if (i == 0) {
  2383. len = ext_str.length;
  2384. ext_str = ext_str.substr(0, len - 2);
  2385. jalert(name + ' ' + lang.wrong_extension + ' ' + ext_str);
  2386. return false;
  2387. }
  2388. }
  2389. if (all_fields[field_id]['max_size'] != 0 && all_fields[field_id]['max_size'] * 1024 < size) {
  2390. jalert(name + ' ' + lang.File_max_size + ' ' + all_fields[field_id]['max_size']);
  2391. return false;
  2392. }
  2393. }
  2394. }
  2395. return true;
  2396. }
  2397.  
  2398.  
  2399. function sub_add_file(field_id, line_id, obj) {
  2400. if (check_upload_file(field_id, obj) === false) return false;
  2401. var value = obj.value;
  2402. var part = obj.getAttribute('part');
  2403. var file_img = obj.getAttribute('file_img');
  2404. var progress_span = "<span class='upload_progress'></span>";
  2405. var bg = "style='background:#fff6ad'";
  2406. if (part == 'add_link_field') {
  2407. progress_span = "";
  2408. bg = "";
  2409. }
  2410. if (obj.files) { // Новый режим многофайловость
  2411. var i;
  2412. for (i = 0; i < obj.files.length; i++) {
  2413. value = obj.files[i].fileName;
  2414. if (typeof(value) == 'undefined') value = obj.files[i].name;
  2415. var new_line;
  2416. if (file_img) new_line = $("<span style='white-space:nowrap;'><a href=\"open_file.php?field=" + field_id + "&line=" + line_id + "&file=" + encodeURIComponent(value) + "&show=1\" onclick='jalert(\"" + lang.file_wasnt_upload + "\");return false;' id='new_file_upload_" + field_id + "_" + line_id + "_" + i + "' " + bg + " file_img=1 title='" + value + "'>" + value + "</a>" + progress_span + "<span><br />");
  2417. else new_line = $("<span style='white-space:nowrap;'><a href=\"open_file.php?field=" + field_id + "&line=" + line_id + "&file=" + encodeURIComponent(value) + "\" onclick='jalert(\"" + lang.file_wasnt_upload + "\");return false;' id='new_file_upload_" + field_id + "_" + line_id + "_" + i + "' " + bg + " title='" + value + "'>" + value + "</a>" + progress_span + "</span> ");
  2418. $(document.getElementById("fast_edit_span_" + field_id + "_" + line_id + "_0")).append(new_line);
  2419. }
  2420. }
  2421. else { // Старый режим
  2422. // Если указан полный путь оставляем только имя файла
  2423. var last_slash = -1;
  2424. var last_slash_p1 = 0;
  2425. var last_slash_p2 = -1;
  2426. while (1) {
  2427. last_slash_p2 = value.indexOf('\\', last_slash_p1);
  2428. if (last_slash_p2 == -1) break;
  2429. last_slash_p1 = last_slash_p2 + 1;
  2430. last_slash = last_slash_p2;
  2431. }
  2432. if (last_slash != -1) {
  2433. value = value.substr(last_slash + 1, 1024 * 1024);
  2434. }
  2435. ;
  2436.  
  2437. var new_line;
  2438. if (file_img) new_line = $("<span style='white-space:nowrap;'><a class=\"href_post\" href=\"open_file.php?field=" + field_id + "&line=" + line_id + "&file=" + encodeURIComponent(value) + "&show=1\" onclick='jalert(\"" + lang.file_wasnt_upload + "\");return false;' id='new_file_upload_" + field_id + "_" + line_id + "_0' " + bg + " file_img=1 title='" + value + "'>" + value + "</a>" + progress_span + "</span><br />");
  2439. else new_line = $("<span style='white-space:nowrap;'><a class=\"href_post\" href=\"open_file.php?field=" + field_id + "&line=" + line_id + "&file=" + encodeURIComponent(value) + "\" onclick='jalert(\"" + lang.file_wasnt_upload + "\");return false;' id='new_file_upload_" + field_id + "_" + line_id + "_0' " + bg + " title='" + value + "'>" + value + "</a>" + progress_span + "</span> ");
  2440. $(document.getElementById("fast_edit_span_" + field_id + "_" + line_id + "_0")).append(new_line);
  2441. }
  2442. if (part == 'add_link_field') return; // Ничего не сохраняем
  2443. upload_in_progress = 1;
  2444. document.getElementById("sbmt_file_" + field_id + "_" + line_id).submit();
  2445. obj.value = "";
  2446.  
  2447. }
  2448.  
  2449. function onupload_file_done(event) {
  2450. $(".go_event_link").fadeOut(200, function () {
  2451. setTimeout("$('.save_event_button').fadeIn(200)", 200);
  2452. });
  2453. var obj = event.target;
  2454. if (!obj) obj = event.srcElement;
  2455. var file_img;
  2456. var fname;
  2457.  
  2458. var resp = obj.contentDocument.body.innerHTML;
  2459. var resp_arr = str_replace("\n", "\r\n", resp.toString()).split("\r\n");
  2460. if (upload_in_progress) {
  2461. upload_in_progress = 0;
  2462. obj.src = "";
  2463. // console.log(resp);
  2464. // Проверка на ограничение размера
  2465. var max_size_text = 'Warning: POST Content-Length of';
  2466. var max_bytes_text = 'bytes exceeds the limit of ';
  2467. var max_size_flag = 0;
  2468. var pos = resp.indexOf(max_size_text);
  2469. if (pos != -1) { // Превышен максиамальный размер файла
  2470. var p2 = resp.indexOf(max_bytes_text, pos);
  2471. var max_size_mb = 'unknown';
  2472. if (p2 != -1) {
  2473. var msz = resp.substr(p2 + max_bytes_text.length, 1024);
  2474. max_size_mb = intval(msz) / 1024 / 1024;
  2475. max_size_mb = intval(max_size_mb) + (intval(max_size_mb * 10) / 10 - intval(max_size_mb)); // Округляем до десятых
  2476. }
  2477. jalert(lang.max_filesize_exceeded + ' ' + max_size_mb + ' ' + lang.megabytes + '.');
  2478. max_size_flag = 1;
  2479. var p2 = resp.indexOf('saved|');
  2480. resp = resp.substr(p2, 1024);
  2481. }
  2482. resp = trim(resp, "\r\n");
  2483. var res_arr = resp.toString().split("|");
  2484. var field_id = res_arr[2];
  2485. var table_id = all_fields[field_id]['table_id'];
  2486. var line_id = res_arr[3];
  2487. var i;
  2488. var n_el;
  2489. var drop_cur_file;
  2490. if (res_arr[0] == "saved" || res_arr[0] == "message") { // файл успешно обработан, убираем индикатор загрузки
  2491. for (i = 0; i < 100000; i++) {
  2492. if (!document.getElementById("new_file_upload_" + field_id + "_" + line_id + "_" + i)) break;
  2493. n_el = document.getElementById("new_file_upload_" + field_id + "_" + line_id + "_" + i);
  2494. fname = n_el.getAttribute('title');
  2495. file_img = n_el.getAttribute('file_img');
  2496. drop_cur_file = 0;
  2497. if (max_size_flag) { // файл не сохранился, убираем его из списка
  2498. drop_cur_file = 1;
  2499. }
  2500. else {
  2501. // проверяем является ли файл дубликатом
  2502. $(n_el.parentNode.parentNode).find("a").each(function () {
  2503. if (this != n_el) {
  2504.  
  2505. if (this.innerHTML == n_el.innerHTML) { // такой файл уже есть, убираем как дубликат
  2506. drop_cur_file = 1;
  2507. }
  2508. }
  2509. })
  2510. }
  2511. if (drop_cur_file) { // удаляем файл из списка
  2512. n_el.parentNode.parentNode.removeChild(n_el.parentNode);
  2513. }
  2514. else {
  2515. // Меняем стиль файла на обычный
  2516. n_el.id = "";
  2517. n_el.style.background = '';
  2518. n_el.setAttribute('field_id', field_id);
  2519. n_el.setAttribute('line_id', line_id);
  2520. if (file_img) {
  2521. n_el.onclick = "image_window=window.open('open_file.php?field=" + field_id + "&line=" + line_id + "&file=" + encodeURIComponent(fname) + "&show=1','','width=,height=,menubar=1,scrollbars=1,resizable=1,status=1');image_window.focus();return false;";
  2522. n_el.innerHTML = "<img src='cache/" + table_id + "_" + field_id + "_" + line_id + "_" + utf2eng(fname) + ".png' class='sub_fast_edit_img'>";
  2523. }
  2524. else
  2525. n_el.onclick = "";
  2526. n_el.nextSibling.className = "b_drop_hoverpopup";
  2527. addHandler_file(n_el);
  2528. }
  2529. }
  2530. UpdateData(resp_arr);
  2531. }
  2532. }
  2533. return;
  2534. };
  2535.  
  2536.  
  2537. //
  2538. // ПОЛЕ СВЯЗЬ
  2539. //
  2540.  
  2541. function calendar_combobox(combobox, add_event) {
  2542. if (combobox.length > 0) {
  2543. combobox.each(function (i, item) {
  2544. var f_id = $(this).attr('field_id');
  2545. var l_id = $(this).attr('line_id');
  2546. var ac_val = $(item).attr('ac_link_val');
  2547. var url;
  2548. if (typeof ac_val !== 'undefined') {
  2549. url = 'select_value.php?field=' + f_id + '&line=' + l_id + '&q=' + ac_val;
  2550. } else {
  2551. url = 'select_value.php?field=' + f_id + '&line=' + l_id;
  2552. }
  2553. autocomplete_ajax_request($(this), url, false);
  2554. var field_id = $(item).attr('field_id');
  2555. var parent_link = $(item).attr('filter_field');
  2556. create_combobox($(item));
  2557. var input = $(this).next().find($('.autocomplete__input'));
  2558. var btn = input.next();
  2559. var autocomplete = $(item).next().find('.autocomplete__input');
  2560. var autocomplete_btn = autocomplete.next();
  2561. install_autocomplete_value($(item));
  2562. install_combobox_val(item);
  2563. var timeout;
  2564.  
  2565. input.on('keyup', function(e) {
  2566. var word = '&q=';
  2567. if (input.val() !== '') {
  2568. word += encodeURIComponent(input.val());
  2569. }
  2570. var url_by_word = 'select_value.php?field=' + f_id + '&line=' + l_id + word;
  2571. if (e.keyCode === 17 || e.keyCode === 18 || e.keyCode === 16 || e.keyCode === 27 || e.keyCode === 40 || e.keyCode === 37 ||
  2572. e.keyCode === 38 || e.keyCode === 39 || e.keyCode === 9 || e.keyCode === 20 || e.keyCode === 13) {
  2573. return;
  2574. }
  2575. clearTimeout(timeout);
  2576. timeout = setTimeout(function() {
  2577. autocomplete_ajax_request($(item), url_by_word, false, true);
  2578. }, 100);
  2579. });
  2580.  
  2581.  
  2582. var onAutocompleteClick = function () {
  2583.  
  2584. };
  2585.  
  2586. if (parent_link && parent_link !== '') {
  2587. onAutocompleteClick = function () {
  2588. var parent_obj = $('[field_id="' + parent_link + '"]');
  2589. var filter_id = $(parent_obj).attr('filter_field');
  2590. var ac_data = {
  2591. table_id: 0,
  2592. filter_id: filter_id,
  2593. field_id: field_id,
  2594. line_id: 'new',
  2595. has_parent: true,
  2596. parent_obj: parent_obj
  2597. };
  2598. autocomplete_ajax_request($(item), url, false, true, 0, parent_obj.val(), ac_data);
  2599. autocomplete_btn.off('click', autocomplete_btn);
  2600. }
  2601. autocomplete.click(onAutocompleteClick);
  2602. autocomplete_btn.click(onAutocompleteClick);
  2603. } else {
  2604. onAutocompleteClick = function () {
  2605. autocomplete_ajax_request($(item), url, false, true, 0);
  2606. autocomplete_btn.off('click', onAutocompleteClick);
  2607. };
  2608. autocomplete.on('click', onAutocompleteClick);
  2609. autocomplete_btn.on('click', onAutocompleteClick);
  2610. }
  2611. });
  2612. }
  2613. }
  2614.  
  2615. function sub_fix_lnk_result(event, data, formatted) {
  2616. this.setAttribute('f_value', data[0]);
  2617. $(this).change();
  2618. }
  2619. /// ================= Обработчкики событий ================
  2620.  
  2621.  
  2622. // сохранить значение
  2623. function save_value(field_id, line_id, val) {
  2624. fast_edit_old = field_id + "|" + line_id + "|" + val;
  2625. var new_val = encodeURIComponent(val);
  2626. ajax_update.format = 0;
  2627. ajax_update.method = "POST";
  2628. ajax_update.call("calendar=" + my_event_id + "&field=" + field_id + "&line=" + line_id + "&value=" + new_val + "&csrf=" + csrf, ComRespSaveSub);
  2629. }
  2630.  
  2631. // сохранить значение мулти-селекта
  2632. function save_value_multi(field_id, line_id, full_value) {
  2633. var new_val = encodeURIComponent(full_value);
  2634. ajax_update.format = 0;
  2635. ajax_update.method = "POST";
  2636. ajax_update.call("calendar=1&field=" + field_id + "&line=" + line_id + "&value=" + new_val + "&csrf=" + csrf, ComRespSaveMultSub);
  2637. };
  2638.  
  2639. function sub_drop_line(table_id, line_id) {
  2640. ajax_update.format = 0;
  2641. ajax_update.method = "POST";
  2642. ajax_update.call("calendar=1&sel=delete_line&table_id=" + table_id + "&line_id=" + line_id + "&csrf=" + csrf, ComRespDropSub);
  2643. };
  2644.  
  2645. function ComRespDropSub(resp) {
  2646. resp = trim(resp, "\r\n")
  2647. var resp_arr = resp.toString().split("\r\n");
  2648. var res_arr = resp_arr[0].toString().split("|");
  2649. var drop_table_id = res_arr[1];
  2650. var drop_line_id = res_arr[2];
  2651. if (res_arr[0] == "cancel_delete") {
  2652. // var v_o=document.getElementById('subtable_'+cur_subtable_id+"_line_"+drop_line_id);
  2653. // v_o.style.background='#ffadad';
  2654. // $(v_o).stop().animate({ backgroundColor: '#FFFFFF' },1500).css('background','');
  2655. jalert(lang.Canceled);
  2656. // Обновляем, если были вычисления
  2657. if (typeof resp_arr != 'undefined') UpdateData(resp_arr);
  2658. }
  2659. if (res_arr[0] == "deleted" || res_arr[0] == "message") {
  2660. window.location.reload(); // Временная функция
  2661. return; // В этом месте необходимо вызывать перестроение календаря
  2662. var v_o = document.getElementById('subtable_' + cur_subtable_id + "_line_" + drop_line_id);
  2663. if ((v_o) && (typeof(v_o.parentNode) !== 'undefined')) // Защита от быстрого двойного щелчка удалить
  2664. v_o.parentNode.removeChild(v_o);
  2665. if ($("#subtable_" + cur_subtable_id + " [id ^= subtable_" + cur_subtable_id + "_line_]").size() == 0 && cur_mode == "view") $(".small_green_save").fadeOut();
  2666. // Обновляем, если были вычисления
  2667. if (typeof resp_arr != 'undefined') UpdateData(resp_arr);
  2668. }
  2669. }
  2670.  
  2671. var pageReload = false;
  2672. // Обновить данные на странице
  2673. function UpdateData(resp_arr) {
  2674. var field;
  2675. var type_field;
  2676. var n_tmp;
  2677. var n;
  2678. var n2;
  2679. var last_select;
  2680. var select_obj;
  2681. var int_val;
  2682. var dspl_val;
  2683. var saved_field;
  2684. var date_fields = new Object;
  2685. var updatedLines = new Object;
  2686. var messagesObj = new Object;
  2687. var messagesNum = new Object;
  2688. var pageReloadIns = false;
  2689. for (keyVar in resp_arr) { // меняем также значения которые изменились в результате вычислений
  2690. res_arr = resp_arr[keyVar].toString().split("|");
  2691. field_id = res_arr[1];
  2692. line_id = res_arr[2];
  2693. new_value_arr = res_arr[3].split(" ");
  2694. new_value = Base64.decode(new_value_arr[0]);
  2695. saved_field = false;
  2696.  
  2697. if (res_arr[0] == "message") {
  2698. var mStatus = field_id;
  2699. var mNum = line_id;
  2700. var mText = new_value
  2701. if (!messagesObj[mStatus]) {
  2702. messagesObj[mStatus] = new Object;
  2703. messagesNum[mStatus] = mNum;
  2704. }
  2705. if (messagesNum[mStatus] < mNum)
  2706. messagesNum[mStatus] = mNum;
  2707. messagesObj[mStatus][mNum] = mText;
  2708. continue;
  2709. }
  2710. if (res_arr[0] == "inserted") {
  2711. inserted_table_id = field_id;
  2712. inserted_line_id = line_id;
  2713. pageReloadIns = true;
  2714. }
  2715. if (res_arr[0] == "saved") { // Приводим действие 'saved' к виду changed
  2716. field_id = res_arr[2];
  2717. line_id = res_arr[3];
  2718. new_value = Base64.decode(res_arr[4]);
  2719. if (res_arr[5])
  2720. link_add_value = Base64.decode(res_arr[5]);
  2721. else
  2722. link_add_value = false;
  2723. res_arr[0] = "changed";
  2724. saved_field = true;
  2725. }
  2726.  
  2727. if (res_arr[0] == "changed") {
  2728. field = all_fields[field_id];
  2729. if (!field) continue;
  2730. view_field = field['view'];
  2731. type_field = field['type_field'];
  2732.  
  2733. if (calendar.day)
  2734. for (oneEventId in all_calendar_events)
  2735. if (all_calendar_events[oneEventId]['group_field'] == field_id)
  2736. pageReload = true;
  2737.  
  2738. if ((type_field == 2 || type_field == 12) && new_value != "") {
  2739. var new_date = new_value.substr(0, 10);
  2740. var dateParts = new_date.split(".");
  2741. var new_time = new_value.substr(11, 5);
  2742. if (new_time)
  2743. var timeParts = new_time.split(":");
  2744. else
  2745. var timeParts = ['00', '00'];
  2746.  
  2747. for (oneEventId in all_calendar_events) {
  2748. oneEvent = all_calendar_events[oneEventId];
  2749. if (field_id != oneEvent.date_field && field_id != oneEvent.period_field) continue;
  2750. if (js_events[oneEventId] == undefined) continue;
  2751. if (js_events[oneEventId][line_id] == undefined) continue;
  2752.  
  2753. pageReload = true;
  2754. /*
  2755. updatedLines[oneEventId] = {};
  2756. updatedLines[oneEventId][line_id] = 1;
  2757.  
  2758. if (calendar.day||calendar.week)
  2759. jsDateValue = dateParts[2]+ "" + dateParts[1] + "" + dateParts[0]+timeParts[0]+timeParts[1];
  2760. else
  2761. jsDateValue = dateParts[2]+ "" + dateParts[1] + "" + dateParts[0];
  2762.  
  2763. if (field_id == oneEvent.date_field)
  2764. js_events[oneEventId][line_id]['begin'] = jsDateValue;
  2765. else
  2766. js_events[oneEventId][line_id]['end'] = jsDateValue;
  2767. */
  2768. }
  2769. }
  2770. v_o = document.getElementById("fast_edit_span_" + field_id + "_" + line_id + "_0");
  2771. if (!v_o) { // Нередактируемое поле
  2772. v_o = document.getElementById("sub_cell_" + field_id + "_" + line_id);
  2773. if (!v_o) continue;
  2774. if (type_field == 5) {
  2775. n_tmp = new_value.split("|");
  2776. int_val = n_tmp[0];
  2777. dspl_val = n_tmp[1];
  2778. if (view_field) {
  2779. v_o.innerHTML = '<a href="view_line2.php?table=' + field['table_id'] + '&line=' + int_val + '&back_url={$base64_current_url}">' + dspl_val + '</a>';
  2780. }
  2781. else {
  2782. v_o.innerHTML = dspl_val;
  2783. }
  2784. $(".mount_cell_" + field_id + "_" + line_id).each(function (indx, element) {
  2785. if (link_add_value)
  2786. mountValue = link_add_value;
  2787. else
  2788. mountValue = dspl_val;
  2789. if (mountValue == "") mounValue = "&nbsp;";
  2790. this.innerHTML = strip_tags(mountValue);
  2791. });
  2792. }
  2793. else {
  2794. if (field['view_html'] == "0")
  2795. v_o.innerHTML = new_value;
  2796. $(".mount_cell_" + field_id + "_" + line_id).each(function (indx, element) {
  2797. mountValue = str_replace("<br>", " ", str_replace("<br/>", " ", str_replace("<br />", " ", new_value)));
  2798. if (mountValue == "") mountValue = "&nbsp;";
  2799. this.innerHTML = strip_tags(mountValue);
  2800. });
  2801. }
  2802. v_o.style.background = '#fff6ad';
  2803. $(v_o).attr('yellow_color', '0').stop().animate({backgroundColor: '#FFFFFF'}, 1500).css('background', '')
  2804. if (type_field == 3) {
  2805. // выполняем Javascript если он вписан и поле - отображать html
  2806. if (field['view_html']) {
  2807. var re = /<script>([\s\S]*?)<\/script>/gi;
  2808. js_result = new_value.match(re);
  2809. if (js_result) {
  2810. var o_str, s_len = String('<script>').length;
  2811. for (keyVar in js_result) {
  2812. if (intval(keyVar) != keyVar) continue; // Фикс для ie, т.к. могут быть не только числа
  2813. o_str = js_result[keyVar];
  2814. o_str = o_str.substr(s_len, o_str.length - s_len * 2 - 1);
  2815. eval(o_str);
  2816. }
  2817. }
  2818. }
  2819. }
  2820. continue;
  2821. }
  2822.  
  2823. // Формируем вывод
  2824. if ((type_field == 1) || (type_field == 2) || (type_field == 12) || (type_field == 3) || (type_field == 10)) { // Число, строка, дата
  2825. if ((type_field == 2) || (type_field == 12)) new_value = new_value.substr(0, 16);
  2826. if (typeof(v_o.value) === 'undefined' && field['view_html'] == "0") {
  2827. v_o.innerHTML = new_value;
  2828. }
  2829. else if (field['view_html'] == "0")
  2830. v_o.value = new_value;
  2831.  
  2832. $(".mount_cell_" + field_id + "_" + line_id).each(function (indx, element) {
  2833. mountValue = str_replace("<br>", " ", str_replace("<br/>", " ", str_replace("<br />", " ", new_value)));
  2834. if (mountValue == "") mountValue = "&nbsp;";
  2835. this.innerHTML = strip_tags(mountValue);
  2836. });
  2837. v_o.style.background = '#fff6ad';
  2838. $(v_o).attr('yellow_color', '0').stop().animate({backgroundColor: '#FFFFFF'}, 1500).css('background', '')
  2839. }
  2840. if (type_field == 7 || type_field == 11 || type_field == 14) { // Пользователь, группа
  2841. if (saved_field) {
  2842. if (field['mult_value'] > 0) {
  2843. real_value = "";
  2844. all_id_values = new_value.split('\r\n');
  2845. vals_count = all_text_values.length;
  2846. for (v = 0; v < vals_count; v++)
  2847. real_value += field['s_list_values'][all_id_values[v]] + " "
  2848.  
  2849. }
  2850. else real_value = field['s_list_values'][new_value];
  2851. }
  2852. else if (field['mult_value'] > 0)
  2853. real_value = str_replace("\r\n", " ", new_value);
  2854. else
  2855. real_value = new_value;
  2856.  
  2857. $(".mount_cell_" + field_id + "_" + line_id).each(function (indx, element) {
  2858. if (real_value == "") real_value = "&nbsp;";
  2859. this.innerHTML = real_value;
  2860. });
  2861.  
  2862. if (saved_field) continue;
  2863. if (field['mult_value'] > 0) {
  2864. all_text_values = new_value.split('\r\n');
  2865. insVal = str_replace("\r\n", " ", new_value);
  2866. $(".mount_cell_" + field_id + "_" + line_id).each(function (indx, element) {
  2867. if (insVal == "") insVal = "&nbsp;"
  2868. this.innerHTML = insVal;
  2869. });
  2870.  
  2871. values_count = all_text_values.length;
  2872. var all_list_count;
  2873. all_values = [];
  2874. n = 0;
  2875.  
  2876. // Формируем значение в скрытом поле
  2877. if (new_value == "") {
  2878. document.getElementById("fast_edit_span_" + field_id + "_" + line_id + "_0").value = "";
  2879. values_count = 0;
  2880. }
  2881. else {
  2882. var hidden_val = "-";
  2883. for (l = 0; l < values_count; l++) {
  2884. all_list_count = 0;
  2885. for (v_id in field['s_list_values']) {
  2886. all_list_count += 1;
  2887. if (all_text_values[l] == field['s_list_values'][v_id]) {
  2888. hidden_val += v_id + "-";
  2889. all_values[l] = v_id;
  2890. }
  2891. }
  2892. }
  2893. document.getElementById("fast_edit_span_" + field_id + "_" + line_id + "_0").value = hidden_val;
  2894. }
  2895.  
  2896. // Устанавливаем значения
  2897. $('select[multi_select_group=' + field_id + '_' + line_id + ']').each(function (i) {
  2898. select_obj = this;
  2899. last_select = select_obj;
  2900. n_tmp = select_obj.nextSibling;
  2901. n_tmp.style.background = '#fff6ad';
  2902. $(n_tmp).attr('yellow_color', '0').stop().animate({backgroundColor: '#FFFFFF'}, 1500).css('background', '')
  2903. if (n < values_count) { // устанавливаем значение
  2904. select_obj.value = all_values[n];
  2905. n_tmp.innerHTML = all_text_values[n];
  2906. select_obj.setAttribute("is_last", 0);
  2907. $(select_obj).children().each(function (y) {
  2908. if (this.value != select_obj.value) { // не выбранный елемент
  2909. if (in_array(this.value, all_values)) {
  2910. this.style.display = 'none';
  2911. this.setAttribute('disabled', 'disabled');
  2912. }
  2913. else {
  2914. this.style.display = '';
  2915. this.setAttribute('disabled', '');
  2916. this.removeAttribute('disabled');
  2917. }
  2918. }
  2919. else {
  2920. this.selected = true;
  2921. this.style.display = '';
  2922. this.setAttribute('disabled', '');
  2923. this.removeAttribute('disabled');
  2924. }
  2925. });
  2926. }
  2927. else if (n == values_count) { // пустое значение в конце
  2928. if (type_field == 14)
  2929. select_obj.value = "";
  2930. else
  2931. select_obj.value = 0;
  2932. n_tmp.innerHTML = "";
  2933. select_obj.setAttribute("is_last", 1);
  2934. $(select_obj).children().each(function (y) {
  2935. if (in_array(this.value, all_values)) {
  2936. this.style.display = 'none';
  2937. this.setAttribute('disabled', 'disabled');
  2938. }
  2939. else {
  2940. this.style.display = '';
  2941. this.setAttribute('disabled', '');
  2942. this.removeAttribute('disabled');
  2943. }
  2944. });
  2945. }
  2946. else { // лишние значения, удаляем
  2947. var t_span = select_obj.parentNode;
  2948. t_span.parentNode.removeChild(t_span);
  2949. }
  2950. n++;
  2951. });
  2952.  
  2953. // если новых элементов больше чем существующих - добавляем
  2954. for (n; n <= values_count; n++) {
  2955. // Создание элемента, на основе копирования последнего
  2956. var obj_tag_name = last_select.tagName;
  2957. var new_id = "fast_edit_span_" + field_id + "_" + line_id + "_" + n + "0";
  2958. var newEL = document.createElement(obj_tag_name);
  2959. newEL.id = new_id;
  2960. newEL.className = "";
  2961. // события
  2962. addHandler_mult_select(newEL);
  2963.  
  2964. // атрибуты
  2965. newEL.setAttribute("multi_select_group", field_id + "_" + line_id);
  2966. newEL.setAttribute("style", last_select.getAttribute("style"));
  2967. newEL.style.background = '';
  2968. newEL.setAttribute("field_id", field_id);
  2969. newEL.setAttribute("line_id", line_id);
  2970. newEL.setAttribute("pos", n);
  2971. newEL.setAttribute("is_last", 1);
  2972. newEL.setAttribute("tabindex", last_tabindex_fast_edit);
  2973. $(newEL).html(last_select.innerHTML);
  2974. newEL.selectedIndex = -1;
  2975.  
  2976. // вставляем после текущего
  2977. var t_span = last_select.parentNode;
  2978. var next_node = t_span.nextSibling;
  2979. //alert(next_node.innerHTML);
  2980. t_span.parentNode.insertBefore(newEL, next_node);
  2981. //console.log(newEL.parentNode);
  2982. $(newEL).attr('add_width', '0');
  2983. form_fast_select_obj(newEL);
  2984.  
  2985. var select_obj = newEL;
  2986. var last_select = select_obj;
  2987. n_tmp = select_obj.nextSibling;
  2988.  
  2989. if (n < values_count) { // устанавливаем значение
  2990. select_obj.value = all_values[n];
  2991. n_tmp.innerHTML = all_text_values[n];
  2992. select_obj.setAttribute("is_last", 0);
  2993. $(select_obj).children().each(function (y) {
  2994. if (this.value != select_obj.value) { // не выбранный елемент
  2995. if (in_array(this.value, all_values)) {
  2996. this.style.display = 'none';
  2997. this.setAttribute('disabled', 'disabled');
  2998. }
  2999. else {
  3000. //this.selected = true;
  3001. this.style.display = '';
  3002. this.setAttribute('disabled', '');
  3003. this.removeAttribute('disabled');
  3004. }
  3005. }
  3006. else {
  3007. this.style.display = '';
  3008. this.setAttribute('disabled', '');
  3009. this.removeAttribute('disabled');
  3010. }
  3011. });
  3012. }
  3013. else if (n == values_count) { // пустое значение в конце
  3014. var options_count = 0;
  3015. if (type_field == 14)
  3016. select_obj.value = "";
  3017. else
  3018. select_obj.value = 0;
  3019. select_obj.setAttribute("is_last", 1);
  3020. $(select_obj).children().each(function (y) {
  3021. if (in_array(this.value, all_values)) {
  3022. this.style.display = 'none';
  3023. this.setAttribute('disabled', 'disabled');
  3024. }
  3025. else {
  3026. this.style.display = '';
  3027. this.setAttribute('disabled', '');
  3028. this.removeAttribute('disabled');
  3029. if ((type_field == 14 && this.value != '') || ((type_field == 7 || type_field == 11) && this.value != 0)) options_count++;
  3030. }
  3031. });
  3032.  
  3033. if (options_count == 0) // Не одного видимого элемента, скрываем котрол
  3034. {
  3035. select_obj.parentNode.style.display = 'none';
  3036. select_obj.style.display = 'none';
  3037. }
  3038. }
  3039. }
  3040. }
  3041. else { // Обычный список
  3042. // Ищем id
  3043. var new_value_id = 0;
  3044. for (v_id in field['s_list_values'])
  3045. if (new_value == field['s_list_values'][v_id]) new_value_id = v_id;
  3046.  
  3047. v_o.value = new_value_id;
  3048. n_tmp = v_o.nextSibling;
  3049. n_tmp.innerHTML = new_value;
  3050. $(n_tmp).attr('yellow_color', '1');
  3051. n_tmp.style.background = '#fff6ad';
  3052. $(n_tmp).attr('yellow_color', '0').stop().animate({backgroundColor: '#FFFFFF'}, 1500).css('background', '')
  3053. // substr_select_span(v_o.id)
  3054. }
  3055. }
  3056. if (type_field == 4) { // Список
  3057. if (field['mult_value'] > 0) { // Мультисписок
  3058. all_values = new_value.split('\r\n');
  3059. insVal = str_replace("\r\n", " ", new_value);
  3060. $(".mount_cell_" + field_id + "_" + line_id).each(function (indx, element) {
  3061. if (insVal == "") insVal = "&nbsp;";
  3062. this.innerHTML = insVal;
  3063. });
  3064. values_count = all_values.length;
  3065. n = 0;
  3066.  
  3067. // Формируем значение в скрытом поле
  3068. if (new_value == "") {
  3069. document.getElementById("fast_edit_span_" + field_id + "_" + line_id + "_0").value = "";
  3070. values_count = 0;
  3071. }
  3072. else
  3073. document.getElementById("fast_edit_span_" + field_id + "_" + line_id + "_0").value = new_value;
  3074.  
  3075. // Устанавливаем значения
  3076. $('select[multi_select_group=' + field_id + '_' + line_id + ']').each(function (i) {
  3077. select_obj = this;
  3078. last_select = select_obj;
  3079. n_tmp = select_obj.nextSibling;
  3080. n_tmp.style.background = '#fff6ad';
  3081. $(n_tmp).attr('yellow_color', '0').stop().animate({backgroundColor: '#FFFFFF'}, 1500).css('background', '')
  3082. if (n < values_count) { // устанавливаем значение
  3083. select_obj.value = all_values[n];
  3084. n_tmp.innerHTML = all_values[n];
  3085. select_obj.setAttribute("is_last", 0);
  3086. $(select_obj).children().each(function (y) {
  3087. if (this.value != select_obj.value) { // не выбранный елемент
  3088. if (in_array(this.value, all_values)) {
  3089. this.style.display = 'none';
  3090. this.setAttribute('disabled', 'disabled');
  3091. }
  3092. else {
  3093. this.style.display = '';
  3094. this.setAttribute('disabled', '');
  3095. this.removeAttribute('disabled');
  3096. }
  3097. }
  3098. else {
  3099. this.style.display = '';
  3100. this.setAttribute('disabled', '');
  3101. this.removeAttribute('disabled');
  3102. }
  3103. });
  3104. }
  3105. else if (n == values_count) { // пустое значение в конце
  3106. select_obj.value = "";
  3107. n_tmp.innerHTML = "";
  3108. select_obj.setAttribute("is_last", 1);
  3109. $(select_obj).children().each(function (y) {
  3110. if (in_array(this.value, all_values)) {
  3111. this.style.display = 'none';
  3112. this.setAttribute('disabled', 'disabled');
  3113. }
  3114. else {
  3115. this.style.display = '';
  3116. this.setAttribute('disabled', '');
  3117. this.removeAttribute('disabled');
  3118. }
  3119. });
  3120. }
  3121. else { // лишние значения, удаляем
  3122. var t_span = select_obj.parentNode;
  3123. t_span.parentNode.removeChild(t_span);
  3124. }
  3125. n++;
  3126. });
  3127.  
  3128. // если новых элементов больше чем существующих - добавляем
  3129. for (n; n <= values_count; n++) {
  3130. // Создание элемента, на основе копирования последнего
  3131. var obj_tag_name = last_select.tagName;
  3132. var new_id = "fast_edit_span_" + field_id + "_" + line_id + "_" + n + "0";
  3133. var newEL = document.createElement(obj_tag_name);
  3134. newEL.id = new_id;
  3135. newEL.className = "";
  3136. // события
  3137. addHandler_mult_select(newEL);
  3138.  
  3139. // атрибуты
  3140. newEL.setAttribute("multi_select_group", field_id + "_" + line_id);
  3141. newEL.setAttribute("style", last_select.getAttribute("style"));
  3142. newEL.style.background = '';
  3143. newEL.setAttribute("field_id", field_id);
  3144. newEL.setAttribute("line_id", line_id);
  3145. newEL.setAttribute("pos", n);
  3146. newEL.setAttribute("is_last", 1);
  3147. newEL.setAttribute("tabindex", last_tabindex_fast_edit);
  3148. $(newEL).html(last_select.innerHTML);
  3149. newEL.selectedIndex = -1;
  3150.  
  3151. // вставляем после текущего
  3152. var t_span = last_select.parentNode;
  3153. var next_node = t_span.nextSibling;
  3154. t_span.parentNode.insertBefore(newEL, next_node);
  3155. //console.log(newEL.parentNode);
  3156. $(newEL).attr('add_width', '0');
  3157. form_fast_select_obj(newEL);
  3158.  
  3159. select_obj = newEL;
  3160. last_select = select_obj;
  3161. n_tmp = select_obj.nextSibling;
  3162.  
  3163. if (n < values_count) { // устанавливаем значение
  3164. select_obj.value = all_values[n];
  3165. n_tmp.innerHTML = all_values[n];
  3166. select_obj.setAttribute("is_last", 0);
  3167. $(select_obj).children().each(function (y) {
  3168. if (this.value != select_obj.value) { // не выбранный елемент
  3169. if (in_array(this.value, all_values)) {
  3170. this.style.display = 'none';
  3171. this.setAttribute('disabled', 'disabled');
  3172. }
  3173. else {
  3174. this.style.display = '';
  3175. this.setAttribute('disabled', '');
  3176. this.removeAttribute('disabled');
  3177. }
  3178. }
  3179. else {
  3180. this.style.display = '';
  3181. this.setAttribute('disabled', '');
  3182. this.removeAttribute('disabled');
  3183. }
  3184. });
  3185. }
  3186. else if (n == values_count) { // пустое значение в конце
  3187. select_obj.value = "";
  3188. n_tmp.innerHTML = "";
  3189. select_obj.setAttribute("is_last", 1);
  3190. var options_count = 0;
  3191. $(select_obj).children().each(function (y) {
  3192. if (in_array(this.value, all_values)) {
  3193. this.style.display = 'none';
  3194. this.setAttribute('disabled', 'disabled');
  3195. }
  3196. else {
  3197. this.style.display = '';
  3198. this.setAttribute('disabled', '');
  3199. this.removeAttribute('disabled');
  3200. if (this.value != '') options_count++;
  3201. }
  3202. });
  3203.  
  3204. if (options_count == 0) // Не одного видимого элемента, скрываем котрол
  3205. {
  3206. select_obj.parentNode.style.display = 'none';
  3207. select_obj.style.display = 'none';
  3208. }
  3209. }
  3210.  
  3211. }
  3212. }
  3213. else { // Обычный список
  3214. v_o.value = new_value;
  3215. n_tmp = v_o.nextSibling;
  3216. n_tmp.innerHTML = new_value;
  3217. n_tmp.style.background = '#fff6ad';
  3218. $(".mount_cell_" + field_id + "_" + line_id).each(function (indx, element) {
  3219. if (new_value == "") new_value = "&nbsp;"
  3220. this.innerHTML = new_value;
  3221. });
  3222. $(n_tmp).attr('yellow_color', '0').stop().animate({backgroundColor: '#FFFFFF'}, 1500).css('background', '')
  3223. // substr_select_span(v_o.id)
  3224. }
  3225. }
  3226. if (type_field == 5) { // Связь
  3227. n_tmp = new_value.split("|");
  3228. int_val = n_tmp[0];
  3229. dspl_val = n_tmp[1];
  3230. v_o.setAttribute('f_value', int_val);
  3231. v_o.value = dspl_val;
  3232. v_o.style.background = '#fff6ad';
  3233. $(v_o).attr('yellow_color', '0').stop().animate({backgroundColor: '#FFFFFF'}, 1500).css('background', '')
  3234. $(".mount_cell_" + field_id + "_" + line_id).each(function (indx, element) {
  3235. if (link_add_value)
  3236. mountValue = link_add_value;
  3237. else
  3238. mountValue = dspl_val;
  3239. if (mountValue == "") mountValue = "&nbsp;"
  3240. this.innerHTML = mountValue;
  3241. });
  3242. }
  3243. }
  3244. }
  3245.  
  3246. var messagesCalc = false;
  3247. for (statusId in messagesObj) {
  3248. messagesCalc = true;
  3249. var oneMsgGroup = messagesObj[statusId];
  3250. var oneStatusText = "";
  3251. for (m = 0; m <= messagesNum[statusId]; m++) {
  3252. if (!oneMsgGroup[m]) continue;
  3253. oneStatusText += oneMsgGroup[m] + "<br />";
  3254. }
  3255. if (oneStatusText != "")
  3256. jalert(oneStatusText);
  3257. }
  3258.  
  3259. if (pageReloadIns) {
  3260. if (messagesCalc)
  3261. $("#jalert button").bind("click", saveHandler);
  3262. else
  3263. window.location.reload();
  3264. }
  3265.  
  3266. var stringChanges = false;
  3267. for (oneEventId in updatedLines) {
  3268. stringChanges = true; // Временная
  3269. break; // заглушка
  3270. oneUpdate = updatedLines[oneEventId];
  3271. for (oneLineId in oneUpdate) {
  3272. var js_line = js_events[oneEventId][oneLineId];
  3273. var js_event = all_calendar_events[oneEventId];
  3274. var eventContent = $(".c_event_layout" + oneEventId + "_" + oneLineId).html();
  3275. $(".calendar_event_line_" + js_event.date_field + "_" + oneLineId + "_" + oneEventId).remove();
  3276. hideOneEvent();
  3277.  
  3278. if ((calendar.js_begin > js_line.begin && calendar.js_begin > js_line.end) || (calendar.js_end < js_line.begin && calendar.js_end < js_line.end)) {
  3279. js_events[oneEventId][oneLineId] = undefined;
  3280. stringChanges = true;
  3281. continue;
  3282. }
  3283.  
  3284. if (calendar.day && (calendar.js_begin > js_line.begin || calendar.js_end < js_line.end)) {
  3285. js_events[oneEventId][oneLineId]['length'] = 0;
  3286.  
  3287. var newEventData = "<div event_length='0' style='margin-top: 0px; border: 1px solid " + js_event.color + "; z-index: 0' ";
  3288. newEventData += "class='calendar_event_line calendar_event_line_" + js_event.date_field + "_" + oneLineId + "_" + oneEventId + " calendar_offset_" + oneLineId + "_" + oneEventId + "' ";
  3289. newEventData += "id='calendar_event_line_" + js_event.date_field + "_" + oneLineId + "_" + oneEventId + "'>";
  3290. newEventData += "<div onclick='viewOneEvent(" + oneEventId + ", " + oneLineId + ", event); event.cancelBubble = true;' ";
  3291. newEventData += "onmouseover='highlightEvent(true, " + oneEventId + ", " + oneLineId + ")' onmouseout='highlightEvent(false, " + oneEventId + ", " + oneLineId + ")' ";
  3292. newEventData += "id='c_event_layout" + oneEventId + "_" + oneLineId + "' class='c_event_layout c_event_layout" + oneEventId + "_" + oneLineId + "' style='z-index: 0'>" + eventContent + "</div></div>";
  3293.  
  3294. $(".view_overperiod_events").append(newEventData);
  3295. stringChanges = true;
  3296. continue;
  3297. }
  3298.  
  3299. if (calendar.week && ((calendar.js_begin > js_line.begin || calendar.js_end < js_line.end) || (js_line.begin.substr(0, 8) != js_line.end.substr(0, 8) && js_line.end != "0"))) {
  3300. if (calendar.js_begin > js_line.begin)
  3301. var startCell = calendar.js_begin.substr(0, 8);
  3302. else
  3303. var startCell = js_line.begin.substr(0, 8);
  3304.  
  3305. if (calendar.js_end < js_line.end)
  3306. var endCell = calendar.js_end.substr(0, 8);
  3307. else
  3308. var endCell = js_line.end.substr(0, 8);
  3309.  
  3310. eLength = 0;
  3311. for (pos in week_days) {
  3312. if (startCell <= week_days[pos] && endCell >= week_days[pos])
  3313. eLength += 1;
  3314. if (startCell == week_days[pos])
  3315. var insertedCell = pos;
  3316. }
  3317.  
  3318. js_events[oneEventId][oneLineId]['length'] = eLength;
  3319. eOffset = parseInt(js_line.offset) * 17;
  3320.  
  3321. var newEventData = "<div event_length='" + eLength + "' style='margin-top: " + eOffset + "px; border: 1px solid " + js_event.color + "' ";
  3322. newEventData += "class='calendar_event_line calendar_event_line_" + js_event.date_field + "_" + oneLineId + "_" + oneEventId + " calendar_offset_" + oneLineId + "_" + oneEventId + "' ";
  3323. newEventData += "id='calendar_event_line_" + js_event.date_field + "_" + oneLineId + "_" + oneEventId + "_0_0'> ";
  3324. newEventData += "<div onclick='viewOneEvent(" + oneEventId + ", " + oneLineId + ", event); event.cancelBubble = true;' ";
  3325. newEventData += "onmouseover='highlightEvent(true, " + oneEventId + ", " + oneLineId + ") 'onmouseout='highlightEvent(false, " + oneEventId + ", " + oneLineId + ")' ";
  3326. newEventData += "id='c_event_layout" + oneEventId + "_" + oneLineId + "_0_0' ";
  3327. newEventData += "class='c_event_layout c_event_layout" + oneEventId + "_" + oneLineId + "'>" + eventContent + "</div></div>";
  3328.  
  3329. $("#week_overperiod" + insertedCell).prepend(newEventData);
  3330. stringChanges = true;
  3331. continue;
  3332. }
  3333.  
  3334. js_events[oneEventId][oneLineId]['length'] = 0;
  3335. var eLength = 0;
  3336.  
  3337. if (calendar.day || calendar.week) {
  3338. var beginTime = js_line.begin.substr(8, 4);
  3339. var insertHour = beginTime.substr(0, 2);
  3340. var insertMin = beginTime.substr(2, 2);
  3341. var startMin = insertMin;
  3342. var startHour = insertHour;
  3343.  
  3344. if (calendar.week) {
  3345. for (pos in week_days) {
  3346. if (js_line.begin.substr(0, 8) == week_days[pos])
  3347. var insertedCol = pos;
  3348. }
  3349. }
  3350. else
  3351. var insertedCol = 0;
  3352.  
  3353. if (insertMin < "30")
  3354. insertMin = 0;
  3355. else
  3356. insertMin = 1;
  3357.  
  3358. if (js_line.end == "0") {
  3359. js_events[oneEventId][oneLineId]['length'] = 1;
  3360. eLength = 1;
  3361. }
  3362. else {
  3363. if (startHour[0] == "0")
  3364. startHour = startHour[1];
  3365. if (startMin[0] == "0")
  3366. startMin = startMin[1];
  3367. var startTime = parseInt(startHour) + (parseInt(startMin) / 60);
  3368.  
  3369. var endHour = js_line.end.substr(8, 2);
  3370. if (endHour[0] == "0")
  3371. endHour = endHour[1];
  3372. var endMin = js_line.end.substr(10, 2);
  3373. if (endMin[0] == "0")
  3374. endMin = endMin[1];
  3375. var endTime = parseInt(endHour) + (parseInt(endMin) / 60);
  3376.  
  3377. eLength = (endTime - startTime) / 0.5;
  3378.  
  3379. if (eLength < 1) eLength = 1;
  3380. js_events[oneEventId][oneLineId]['length'] = eLength;
  3381. }
  3382.  
  3383. var newEventData = "<div event_length='" + eLength + "' event_offset='-1' style='margin-top: 0px; z-index: 13; margin-left: 0px; border: 1px solid " + js_event.color + "' ";
  3384. newEventData += "class='calendar_event_line calendar_event_line_" + js_event.date_field + "_" + oneLineId + "_" + oneEventId + " calendar_offset_" + oneLineId + "_" + oneEventId + "' ";
  3385. newEventData += "id='calendar_event_line_" + js_event.date_field + "_" + oneLineId + "_" + oneEventId + "'> ";
  3386. newEventData += "<div onclick='viewOneEvent(" + oneEventId + ", " + oneLineId + ", event); event.cancelBubble = true;' ";
  3387. newEventData += "onmouseover='highlightEvent(true, " + oneEventId + ", " + oneLineId + ")' onmouseout='highlightEvent(false, " + oneEventId + ", " + oneLineId + ")' ";
  3388. newEventData += "id='c_event_layout" + oneEventId + "_" + oneLineId + "' class='c_event_layout c_event_layout" + oneEventId + "_" + oneLineId + "'>" + eventContent + "</div></div>";
  3389.  
  3390. js_events[oneEventId][oneLineId]['offset'] = -1;
  3391. $("#cell_" + insertHour + "_" + insertMin + "_" + insertedCol).prepend(newEventData);
  3392. stringChanges = true;
  3393. }
  3394.  
  3395. if (calendar.day == "" && calendar.week == "") {
  3396. for (oneStrId in month_days) {
  3397. var oneStr = month_days[oneStrId];
  3398. var beginEventCell = false;
  3399. var endEventSell = 7;
  3400.  
  3401. for (oneCellId in oneStr) {
  3402. var oneCell = oneStr[oneCellId];
  3403. if ((oneCellId == "1" && js_line.begin <= oneCell.str && js_line.end >= oneCell.str) || js_line.begin == oneCell.str) {
  3404. beginEventCell = oneCellId;
  3405. if (js_line.end == "0") {
  3406. endEventSell = oneCellId;
  3407. break;
  3408. }
  3409. }
  3410. if (oneCell.str == js_line.end) endEventSell = oneCellId;
  3411. }
  3412.  
  3413. if (beginEventCell) {
  3414. eOffset = parseInt(js_line.offset) * 17;
  3415. eLength = endEventSell - (beginEventCell - 1);
  3416. js_events[oneEventId][oneLineId]['length'] += eLength;
  3417.  
  3418. var newEventData = "<div event_length='" + eLength + "' style='margin-top: " + eOffset + "px;border: 1px solid " + js_event.color + "' ";
  3419. newEventData += "class='calendar_event_line calendar_event_line_" + js_event.date_field + "_" + oneLineId + "_" + oneEventId + "' ";
  3420. newEventData += "id='calendar_event_line_" + js_event.date_field + "_" + oneLineId + "_" + oneEventId + "_" + oneStrId + "_" + beginEventCell + "'>";
  3421. newEventData += "<div onclick='viewOneEvent(" + oneEventId + ", " + oneLineId + ", event, " + oneStrId + ", " + beginEventCell + "); event.cancelBubble = true;' ";
  3422. newEventData += "onmouseover='highlightEvent(true, " + oneEventId + ", " + oneLineId + ")' onmouseout='highlightEvent(false, " + oneEventId + ", " + oneLineId + ")' ";
  3423. newEventData += "id='c_event_layout" + js_event.date_field + "_" + oneLineId + "_" + oneEventId + "_" + oneStrId + "_" + beginEventCell + "' ";
  3424. newEventData += " class='c_event_layout c_event_layout" + oneEventId + "_" + oneLineId + "'>" + eventContent + "</div></div>";
  3425.  
  3426. $("tr#month_str" + oneStrId + " .month_cell" + beginEventCell + " [id^=quadr]").append(newEventData);
  3427. stringChanges = true;
  3428. }
  3429. }
  3430. }
  3431. }
  3432. }
  3433.  
  3434. if (stringChanges) {
  3435. changeOffsets();
  3436. fixCalendarLayout();
  3437. }
  3438. }
  3439.  
  3440. // Обработка сохранения
  3441. var saveHandler = function () {
  3442. $.ajax({
  3443. type: "POST",
  3444. url: "calendar.php",
  3445. data: {
  3446. csrf: csrf,
  3447. id: calendar.id,
  3448. get: 'check_line',
  3449. data: {line_id: inserted_line_id, table_id: inserted_table_id}
  3450. },
  3451. success: function (input) {
  3452. if (input == "1")
  3453. window.location.reload();
  3454. else {
  3455. $("#jalert button").unbind("click", saveHandler);
  3456. pageReload = false;
  3457. $(".save_event_button").fadeIn(100);
  3458. }
  3459. }
  3460. });
  3461. };
  3462.  
  3463. var calendar_error_status = 0;
  3464. var uniq_error_status = 0;
  3465. // Обработать отклик о сохранении
  3466. function ComRespSaveSub(resp) {
  3467.  
  3468. if (resp == "Invalid access.") {
  3469. jalert("Please press f5 button, for refresh login status.");
  3470. return;
  3471. }
  3472. resp = trim(resp, "\r\n");
  3473. var resp_arr = resp.toString().split("\r\n");
  3474. for (i = 0; i < resp_arr.length; i++) {
  3475. var res_arr = resp_arr[i].toString().split("|");
  3476. var field_id = res_arr[2];
  3477. var line_id = res_arr[3];
  3478. var new_value = Base64.decode(res_arr[4]);
  3479. var v_o;
  3480.  
  3481. if (res_arr[0] == "saved") {
  3482. calendar_error_status = 0;
  3483. uniq_error_status = 0;
  3484. $('[yellow_color=1]').attr('yellow_color', '0').stop().animate({backgroundColor: '#FFFFFF'}, 1500).css('background-color', '');
  3485. // Обновляем остальные поля
  3486. UpdateData(resp_arr);
  3487. }
  3488. else if (resp_arr[0] == 'error') {
  3489. calendar_error_status = 1;
  3490. $('[yellow_color=1]').attr('yellow_color', '0').stop().animate({backgroundColor: '#FFFFFF'}, 1500).css('background-color', '');
  3491. //jalert('Время начала события больше времени окончания!');
  3492. }
  3493. else if (resp_arr.indexOf('error1') != -1) {
  3494. var mm = resp_arr.toString().split("|");
  3495. var my_field = all_fields[mm[1]];
  3496.  
  3497. uniq_error_status = 1;
  3498. $('[yellow_color=1]').attr('yellow_color', '0').stop().animate({backgroundColor: '#FFFFFF'}, 1500).css('background-color', '');
  3499. jalert(lang.fast_field_already_exists_p1 + ' ' + my_field.name_field + ' ' + lang.fast_field_already_exists_p2);
  3500. }
  3501. }
  3502. }
  3503.  
  3504.  
  3505. // Обработать отклик о сохранении мултивыбора
  3506. function ComRespSaveMultSub(resp) {
  3507. var res_arr = resp.toString().split("|");
  3508. var field_id = res_arr[2];
  3509. var line_id = res_arr[3];
  3510. var new_value = Base64.decode(res_arr[4]);
  3511. if (res_arr[0] == "saved" || res_arr[0] == "message") {
  3512. // Обратный отклик не реализован, просто меняем фон на белый
  3513. $('[yellow_color=1]').attr('yellow_color', '0').stop().animate({backgroundColor: '#FFFFFF'}, 1500).css('background', '');
  3514. }
  3515. }
  3516.  
  3517. function insertTextAtCursor(text, t_node) {
  3518. var sel, range, html;
  3519. if (window.getSelection) {
  3520. sel = window.getSelection();
  3521. if (sel.getRangeAt && sel.rangeCount) {
  3522. range = sel.getRangeAt(0);
  3523. range.insertNode(t_node);
  3524. range.setEndAfter(t_node);
  3525. range.setStartAfter(t_node);
  3526. sel.removeAllRanges();
  3527. sel.addRange(range);
  3528. }
  3529. } else if (document.selection && document.selection.createRange) {
  3530. range = document.selection.createRange();
  3531. range.pasteHTML(text);
  3532. range.moveEnd('character', 0);
  3533. range.select();
  3534. }
  3535. }
  3536.  
  3537. // Вставляем стандартный перевод строки
  3538. function insert_next_line(element) {
  3539. insertTextAtCursor("<br>", document.createElement("br"));
  3540. }
  3541.  
  3542. function get_edit_html_value(obj_id) {
  3543. var html = $('#edit_html_value_' + obj_id).html();
  3544. var par_w = $('#edit_html_value_' + obj_id).width();
  3545. $('#edit_html_value_' + obj_id).html('<textarea style="border:0px;min-height:17px; outline:none; background: #fff;padding:0px;width:' + par_w + 'px;">' + html + '</textarea>');
  3546.  
  3547. $('#edit_html_value_' + obj_id + ' textarea:first-child').autosize({
  3548. append: ""
  3549. });
  3550.  
  3551. $('#edit_html_value_' + obj_id + ' textarea:first-child').focus();
  3552. $('#edit_html_value_' + obj_id + ' textarea:first-child').blur(function () {
  3553. // $('#edit_html_value_'+obj_id).css("border", "1px dotted #ffffff");
  3554. save_edit_html_value(obj_id)
  3555. });
  3556. // $('#edit_html_value_'+obj_id).mouseout(function(){
  3557. // $(this).css("border", "1px dotted #a0a0a0");
  3558. // });
  3559. $('#edit_html_value_' + obj_id).attr('onclick', '');
  3560.  
  3561. $(".go_event_link").fadeOut(200, function () {
  3562. setTimeout("$('.save_event_button').fadeIn(200)", 200);
  3563. });
  3564. }
  3565.  
  3566. function save_edit_html_value(obj_id) {
  3567. var html = $('#edit_html_value_' + obj_id + ' textarea:first-child').val();
  3568.  
  3569. $('#edit_html_value_' + obj_id).css('background', '#fff6ad');
  3570. $('#edit_html_value_' + obj_id).attr('yellow_color', '1');
  3571.  
  3572. save_value($('#edit_html_value_' + obj_id).attr('field_id'), $('#edit_html_value_' + obj_id).attr('line_id'), html);
  3573.  
  3574. $('#edit_html_value_' + obj_id).html(html);
  3575. // $('#edit_html_value_'+obj_id).mouseout(function(){
  3576. // $(this).css("border", "1px dotted #ffffff");
  3577. // });
  3578. $('#edit_html_value_' + obj_id).attr('onclick', 'get_edit_html_value("' + obj_id + '")');
  3579. }
  3580.  
  3581. function get_edit_html_input_value(obj_id) {
  3582. var html = $('#edit_html_input_value_' + obj_id).html();
  3583. var par_w = $('#edit_html_input_value_' + obj_id).width();
  3584. $('#edit_html_input_value_' + obj_id).html('<input type="text" value="' + html + '" style="border:0px;min-height:17px; outline:none; background: #fff;padding:0px;width:' + par_w + 'px;"/>');
  3585.  
  3586. $('#edit_html_input_value_' + obj_id + ' input:first-child').focus();
  3587. $('#edit_html_input_value_' + obj_id + ' input:first-child').blur(function () {
  3588. // $('#edit_html_input_value_'+obj_id).css("border", "1px dotted #ffffff");
  3589. save_edit_html_input_value(obj_id)
  3590. });
  3591. // $('#edit_html_input_value_'+obj_id).mouseout(function(){
  3592. // $(this).css("border", "1px dotted #a0a0a0");
  3593. // });
  3594. $('#edit_html_input_value_' + obj_id).attr('onclick', '');
  3595.  
  3596. $(".go_event_link").fadeOut(200, function () {
  3597. setTimeout("$('.save_event_button').fadeIn(200)", 200);
  3598. });
  3599. }
  3600.  
  3601. function save_edit_html_input_value(obj_id) {
  3602. var html = $('#edit_html_input_value_' + obj_id + ' input:first-child').val();
  3603.  
  3604. $('#edit_html_input_value_' + obj_id).css('background', '#fff6ad');
  3605. $('#edit_html_input_value_' + obj_id).attr('yellow_color', '1');
  3606.  
  3607. save_value($('#edit_html_input_value_' + obj_id).attr('field_id'), $('#edit_html_input_value_' + obj_id).attr('line_id'), html);
  3608.  
  3609. $('#edit_html_input_value_' + obj_id).html(html);
  3610. // $('#edit_html_input_value_'+obj_id).mouseout(function(){
  3611. // $(this).css("border", "1px dotted #ffffff");
  3612. // });
  3613. $('#edit_html_input_value_' + obj_id).attr('onclick', 'get_edit_html_input_value("' + obj_id + '")');
  3614. }
Add Comment
Please, Sign In to add comment