// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project // // All Rights Reserved. See copyright.txt for details and a complete list of // authors. Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See // license.txt for details. $Id: $ $(document).ready(function () { var $start = $("#start"), $startPicker = $start.nextAll("input[type=text]"), $end = $("#end"), $endPicker = $end.nextAll("input[type=text]"), $frm_edit_calendar = $('form[id="editcalitem"]'); //add browser timezone to hidden input $("input[name=tzoffset]").val((new Date()).getTimezoneOffset()); $("#allday").change(function () { if ($(this).prop("checked")) { $(".time").css("visibility", "hidden"); $startPicker.datepicker("disableTimepicker").datepicker("refresh"); $endPicker.datepicker("disableTimepicker").datepicker("refresh"); } else { $(".time").css("visibility", "visible"); $startPicker.datepicker("enableTimepicker").datepicker("refresh"); $endPicker.datepicker("enableTimepicker").datepicker("refresh"); } }).change(); setTimeout(function () { $("#allday").change(); }, 100); $("#durationBtn").click(function () { if ($(".duration.time:visible").length) { $(".duration.time").hide(); $(".end").show(); $(this).text(tr("Show duration")); $("#end_or_duration").val("end"); } else { $(".duration.time").show(); $(".end").hide(); $(this).text(tr("Show end time")); $("#end_or_duration").val("duration"); } return false; }); var getEventTimes = function () { var out = {}, start = parseInt($start.val()), end = parseInt($end.val()); if (start) { out.start = new Date(start * 1000); } else { out.start = null; } if (end) { out.end = new Date(end * 1000); } else { out.end = null; } if (start && end) { out.duration = ($("select[name=duration_Hour]").val() * 3600) + ($("select[name=duration_Minute]").val() * 60); // in seconds } return out; }; var fNum = function (num) { var str = "0" + num; return str.substring(str.length - 2); }; $(".duration.time select, #start").change( function () { var times = getEventTimes(); if (times.duration) { times.end = new Date( times.start.getTime() + (times.duration * 1000) ); $end.data("ignoreevent", true); $endPicker .datepicker( "setDate", times.end) .datepicker("refresh"); $end.val(times.end.getTime() / 1000); } $start.val(times.start.getTime() / 1000); }); $end.change(function (event) { var times = getEventTimes(), s = times.start ? times.start.getTime() : null, e = times.end ? times.end.getTime() : null; if ($end.data("ignoreevent")) { $end.removeData("ignoreevent"); return; } if (e && e <= s) { $startPicker .datepicker( "setDate", times.end); //.datepicker("refresh"); $start.val(times.end.getTime() / 1000); s = e; } if (e) { times.duration = (e - s) / 1000; $("select[name=duration_Hour]").val( fNum(Math.floor(times.duration / 3600))) .trigger("change.select2"); $("select[name=duration_Minute]").val( fNum(Math.floor((times.duration % 3600) / 60))) .trigger("change.select2"); } else { $("select[name=duration_Hour]").val(1).trigger("change.select2"); $("select[name=duration_Minute]").val(0).trigger("change.select2"); } }).change(); // set duration on load // recurring events var $recurrentCheckbox = $("#id_recurrent"); $recurrentCheckbox.click(function () { if ($(this).prop("checked")) { $("#recurrenceRules").show(); // set inputs for a new recurring rule var d = new Date(parseInt($start.val() * 1000)); $("select[name=weekday]").val(d.getDay()).trigger( "change.select2"); $("select[name=dayOfMonth]").val(d.getDate()).trigger( "change.select2"); $("select[name=dateOfYear_day]").val(d.getDate()).trigger( "change.select2"); $("select[name=dateOfYear_month]").val(d.getMonth() + 1) .trigger("change.select2"); } else { $("#recurrenceRules").hide(); } }); if (typeof $.validator !== "undefined") { $.validator.classRuleSettings.date = false; } if (typeof CKEDITOR === "object") { CKEDITOR.on("instanceReady", function (event) { // not sure why but the text area doesn't get it's display:none applied when using full calendar event.editor.element.$.hidden = true; }); } var addParticipant = function(participant) { if ($('#participant_roles tr[data-user="'+participant+'"]').length == 0) { role_sel = $('').attr('name', 'save[participant_partstat]['+participant+']') .addClass('form-control') .append('') .append('') .append('') .append(''); $('#participant_roles').append(''+participant+''+partstat_sel[0].outerHTML+''+role_sel[0].outerHTML+''); } } $('#participant_roles').on('click', '.delete-participant', function(e) { e.preventDefault(); var $tr = $(this).closest('tr'); $('select[name="save[participants][]"]').find('option[value="'+$tr.data('user')+'"]').prop("selected", false); $tr.remove(); return false; }); $('select[name="participants[]"]').change(function() { var users = $(this).val(); for (var i = 0, l = users.length; i < l; i++) { addParticipant(users[i]); } var $sel = $(this); $('#participant_roles tr').each(function(idx, tr) { var user = $(tr).data('user'); if (! user) { return; } if ($sel.find("option[value='"+user+"']").length > 0 && users.indexOf(user) === -1) { $(tr).remove(); } }) }); $('input[name="participants"]').on("autocompleteselect", function( event, ui ) { addParticipant(ui.item.value); }); $('#invite_emails').on('click', function() { var email = $('#add_participant_email').val(); if (email) { addParticipant(email); } $('#add_participant_email').val(''); }); if ($start.parents(".modal").length) { // take over form submission $start.form().off("submit").on('submit', function (e) { e.preventDefault(); let $form = $(this), action = $form.attr('action') + "?fullcalendar=y&modal=1", $modal = $form.closest('.modal-dialog'), submitter = $form.data("submitter"); if ($form.data("submitted")) { // just can't stop this form getting submitted twice - something to do with the modal submit buttons handling... return false; } if (submitter === "act") { // "act" is the save button $form.data("submitted", true); } if (typeof CKEDITOR !== "undefined" && typeof CKEDITOR.instances["editwiki"] !== "undefined") { CKEDITOR.instances["editwiki"].updateElement(); } $modal.tikiModal(tr('Saving...')); $form.append($("").val($("[name='" + submitter + "']").val())); $.ajax(action, { type: 'POST', data: $form.serialize(), dataType: "html", success: function (data) { if (submitter === "act") { // "act" is the save button window.needToConfirm=false; location.href = location.href.replace(/#.*$/, ""); } else { $modal.find(".modal-content").html(data); } }, error: function (jqxhr) { $modal.tikiModal(); $(form).showError(jqxhr); }, complete: function () { $modal.tikiModal(); } }); return false; }); } // avoid the "leave page" warning when saving a Calendar item $frm_edit_calendar.submit(function(){ window.needToConfirm = false; }); // reset confirm window.needToConfirm = false; $("input, select, textarea", "#editcalitem").change(function () { window.needToConfirm = true; }); }); /** * Checks recurring dates are valid * * @param day * @param month */ function checkDateOfYear(day, month) { var mName = [ "-", tr("January"), tr("February"), tr("March"), tr("April"), tr("May"), tr("June"), tr("July"), tr("August"), tr("September"), tr("October"), tr("November"), tr("December") ]; var error = false; month = parseInt(month); day = parseInt(day); if (month === 4 || month === 6 || month === 9 || month === 11) { if (day === 31) { error = true; } } if (month === 2) { if (day > 29) { error = true; } } if (error) { $("#errorDateOfYear").text( tr("There's no such date as") + " " + day + " " + tr('of') + " " + mName[month]).show(); } else { $("#errorDateOfYear").text("").hide(); } }