You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

731 lines
27 KiB

6 years ago
$.fn.cron = function(options, setValue) {
var el = this;
if (options === 'value') {
if (setValue !== undefined) {
$(el).find('.cron-input').val(setValue).trigger('change');
} else {
return $(el).find('.cron-input').val();
}
return this;
}
var types = [
'second',
'minute',
'hour',
'day',
'month',
'week'
];
var everyText = [
'Every %s seconds',
'Every %s minutes',
'Every %s hours',
'Every %s days',
'Every %s months'
];
if (typeof systemDictionary !== 'undefined' && !systemDictionary['Every %s seconds']) {
for (var w in jQueryCronWords) {
systemDictionary[w] = jQueryCronWords[w];
}
}
// Write the HTML template to the document
$(el).html(tmpl);
if (typeof translateAll !== 'undefined') translateAll();
var cronArr;
var updateInput = false;
if (options && typeof options.value === 'string') {
if (!options.value) {
$(el).find('.cron-checkbox-seconds').prop('checked', false);
cronArr = null;
} else {
cronArr = options.value.split(' ');
if (cronArr.length === 5) {
$(el).find('.cron-checkbox-seconds').prop('checked', false);
cronArr.unshift('*');
} else {
$(el).find('.cron-checkbox-seconds').prop('checked', true);
}
}
} else {
cronArr = ['*', '*', '*', '*', '*', '*'];
$(el).find('.cron-checkbox-seconds').prop('checked', false);
}
$(el).find('.cron-main-tab').tabs();
$(el).find('.cron-tabs').tabs({
activate: function (event, ui) {
if ($(el).find('.cron-input').is(':focus') || updateInput) return;
cronArr = cronArr || ['*', '*', '*', '*', '*', '*'];
switch ($(ui.newTab).attr('id')) {
// Seconds
case 'cron-button-second-every':
cronArr[0] = '*';
break;
case 'cron-button-second-n':
cronArr[0] = '*/' + $(el).find('.cron-tab-second .cron-slider').slider('value');
break;
case 'cron-button-second-each':
cronArr[0] = '*';
$(el).find('.cron-tabs-second-format').html('');
drawEachSecond();
break;
// Minutes
case 'cron-button-minute-every':
cronArr[1] = '*';
break;
case 'cron-button-minute-n':
cronArr[1] = '*/' + $(el).find('.cron-tab-minute .cron-slider').slider('value');
break;
case 'cron-button-minute-each':
cronArr[1] = '*';
$(el).find('.cron-tabs-minute-format').html('');
drawEachMinute();
break;
// Hours
case 'cron-button-hour-every':
cronArr[2] = '*';
break;
case 'cron-button-hour-n':
cronArr[2] = '*/' + $(el).find('.cron-tab-hour .cron-slider').slider('value');
break;
case 'cron-button-hour-each':
cronArr[2] = '*';
$(el).find('.cron-tabs-hour-format').html('');
drawEachHour();
break;
// Days
case 'cron-button-day-every':
cronArr[3] = '*';
break;
case 'cron-button-day-each':
cronArr[3] = '*';
$(el).find('.cron-tabs-day-format').html('');
drawEachDay();
break;
// Months
case 'cron-button-month-every':
cronArr[4] = '*';
break;
case 'cron-button-month-each':
cronArr[4] = '*';
$(el).find('.cron-tabs-month-format').html('');
drawEachMonth();
break;
// Weeks
case 'cron-button-week-every':
cronArr[5] = '*';
break;
case 'cron-button-week-each':
cronArr[5] = '*';
$(el).find('.cron-tabs-week-format').html('');
drawEachWeekday();
break;
}
drawCron();
}
});
$(el).find('.cron-tab-second .cron-slider').slider({
min: 1,
max: 59,
slide: function (event, ui) {
processSlider(this, ui);
}
});
$(el).find('.cron-tab-minute .cron-slider').slider({
min: 1,
max: 59,
slide: function (event, ui) {
processSlider(this, ui);
}
});
$(el).find('.cron-tab-hour .cron-slider').slider({
min: 1,
max: 23,
slide: function (event, ui) {
processSlider(this, ui);
}
});
$(el).find('.cron-checkbox-seconds').change(function () {
if ($(this).prop('checked')) {
$(el).find('.cron-main-tab').tabs('option', 'disabled', []);
$(el).find('.cron-main-tab').tabs('option', 'active', 0);
} else {
$(el).find('.cron-main-tab').tabs('option', 'disabled', [0]);
if ($(el).find('.cron-main-tab').tabs('option', 'active') === 0) {
$(el).find('.cron-main-tab').tabs('option', 'active', 1);
}
}
drawCron();
});
if (!$(el).find('.cron-checkbox-seconds').prop('checked')) {
$(el).find('.cron-main-tab').tabs('option', 'disabled', [0]);
if ($(el).find('.cron-main-tab').tabs('option', 'active') === 0) {
$(el).find('.cron-main-tab').tabs('option', 'active', 1);
}
}
$(el).find('.cron-input').change(function () {
$(this).focus();
cronArr = text2cron($(this).val());
detectSettings($(this).val());
}).keyup(function () {
$(this).trigger('change');
});
function text2cron(value) {
if (value === undefined) {
value = $(el).find('.cron-input').val();
}
value = value.trim();
if (!value) {
$(el).find('.cron-checkbox-seconds').prop('checked', false);
$(el).find('.cron-main-tab').tabs('option', 'disabled', [0]);
return null;
}
var arr = value.split(' ');
if (arr.length === 5) {
arr.unshift('*');
$(el).find('.cron-checkbox-seconds').prop('checked', false);
$(el).find('.cron-main-tab').tabs('option', 'disabled', [0]);
if ($(el).find('.cron-main-tab').tabs('option', 'active') === 0) {
$(el).find('.cron-main-tab').tabs('option', 'active', 1);
}
} else {
$(el).find('.cron-checkbox-seconds').prop('checked', true);
$(el).find('.cron-main-tab').tabs('option', 'disabled', []);
}
return arr;
}
function cron2text(arr) {
if (!arr) arr = cronArr;
if (!arr) {
return '';
}
arr = JSON.parse(JSON.stringify(arr || ['*', '*', '*', '*', '*', '*']));
if (!$(el).find('.cron-checkbox-seconds').prop('checked')) {
arr.shift();
}
for (var a = 0; a < arr.length; a++) {
if (arr[a] === '*/1') arr[a] = '*';
}
return arr.join(' ');
}
function correctCasus(text, seconds) {
text = text.replace('Каждую(ый) минуту', 'Каждую минуту');
text = text.replace('Каждую(ый) минут(у)', 'Каждую минуту');
text = text.replace('Каждую(ый) час', 'Каждый час');
text = text.replace('Каждую(ый) секунду', 'Каждую секунду');
text = text.replace(/ (\d{1,2}) числа/, ' $1го числа');
text = text.replace(/ (\d{1,2}) в Январе/, ' $1го числа в Январе');
text = text.replace(/ (\d{1,2}) в Феврале/, ' $1го числа в Феврале');
text = text.replace(/ (\d{1,2}) в Марте/, ' $1го числа в Марте');
text = text.replace(/ (\d{1,2}) в Апреле/, ' $1го числа в Апреле');
text = text.replace(/ (\d{1,2}) в Майе/, ' $1го числа в Майе');
text = text.replace(/ (\d{1,2}) в Июне/, ' $1го числа в Июне');
text = text.replace(/ (\d{1,2}) в Июле/, ' $1го числа в Июле');
text = text.replace(/ (\d{1,2}) в Августе/, ' $1го числа в Августе');
text = text.replace(/ (\d{1,2}) в Сентябре/, ' $1го числа в Сентябре');
text = text.replace(/ (\d{1,2}) в Октябре/, ' $1го числа в Октябре');
text = text.replace(/ (\d{1,2}) в Ноябре/, ' $1го числа в Ноябре');
text = text.replace(/ (\d{1,2}) в Декабре/, ' $1го числа в Декабре');
text = text.replace('Каждую(ый) 0 минуту', 'Каждые ноль минут');
text = text.replace(/Каждую\(ый\) ([\d\sи,]+) минуту/, 'Каждую $1 минуту');
text = text.replace(/каждой\(го\) ([\d\sи,]+) минуту/, 'каждой $1 минуты');
text = text.replace('каждой(го) минут(у)', 'каждой минуты');
text = text.replace(' 0 часа(ов)', ' 0 часов');
text = text.replace(' 1 часа(ов)', ' 1 час');
text = text.replace(' 2 часа(ов)', ' 2 часа');
text = text.replace(' 3 часа(ов)', ' 3 часа');
text = text.replace(' 4 часа(ов)', ' 4 часа');
text = text.replace(/ (\d{1,2}) часа\(ов\)/, ' $1 часов');
text = text.replace('Jede(r) Sekunde', 'Jede Sekunde');
text = text.replace(/Jede\(r\) ([\d\sund,]+) Sekunde/, 'Jede $1 Sekunde');
text = text.replace('Jede(r) Minute', 'Jede Minute');
text = text.replace('Jede Minuten', 'Jede Minute');
text = text.replace('Jede Stunde', 'Jede Stunde');
text = text.replace('Jede(r) Stunde', 'Jede Stunde');
text = text.replace(/Jede\(r\) ([\d\sund,]+) Minute/, 'Jede $1 Minute');
text = text.replace('Jede Sekunde in Minuten', 'Jede Sekunde in jeder Minute');
return text
}
function drawCron() {
var newCron = cron2text();
$(el).find('.cron-input').val(newCron);
updateDescription(newCron);
}
function updateDescription(value) {
if (!value) {
$(el).find('.cron-text').html(_('never'));
return;
}
var text = cronToText(value, $(el).find('.cron-checkbox-seconds').prop('checked'), JQUERY_CRON_LOCALE[systemLang]);
text = correctCasus(text, $(el).find('.cron-checkbox-seconds').prop('checked') ? cronArr[0] : null);
$(el).find('.cron-text').html(text);
}
function detectSettings(value) {
updateInput = true;
cronArr = text2cron(value);
for (var c = 0; c < (cronArr ? cronArr.length : 6); c++) {
detect(cronArr, c);
}
updateDescription(value);
updateInput = false;
}
// 5-7,9-11 => 5,6,7,9,10,11
function convertMinusIntoArray(value) {
var parts = value.toString().split(',');
for (var p = 0; p < parts.length; p++) {
var items = parts[p].trim().split('-');
if (items.length > 1) {
parts[p] = [];
for (var i = parseInt(items[0], 10); i <= parseInt(items[1], 10); i++) {
parts[p].push(i);
}
parts[p] = parts[p].join(',');
}
}
var value = parts.join(',');
var values = value.split(',');
values.sort(function (a, b) {
a = parseInt(a, 10);
b = parseInt(b, 10);
return a - b;
});
// remove double entries
for (p = values.length - 1; p >= 0; p--) {
if (values[p] === values[p + 1]) {
values.splice(p + 1, 1);
}
}
return values.join(',');
}
// 5,6,7,9,10,11 => 5-7,9-11
function convertArrayIntoMinus(value) {
value = convertMinusIntoArray(value);
var parts = value.split(',');
var newParts = [];
var start = parts[0];
var end = parts[0];
for (var p = 1; p < parts.length; p++) {
if (parts[p] - 1 !== parseInt(parts[p - 1], 10)) {
if (start === end) {
newParts.push(start)
} else if (end - 1 == start) {
newParts.push(start + ',' + end);
}else {
newParts.push(start + '-' + end);
}
start = parts[p];
end = parts[p];
} else {
end = parts[p];
}
}
if (start === end) {
newParts.push(start)
} else if (end - 1 == start) {
newParts.push(start + ',' + end);
} else {
newParts.push(start + '-' + end);
}
return newParts.join(',');
}
function detect(values, index) {
var $tab = $(el).find('.cron-tab-' + types[index]);
if (!values) {
if ($tab.find('.cron-tabs').tabs('option', 'active') != 0) {
$tab.find('.cron-tabs').tabs('option', 'active', 0);
changed = true;
}
return;
}
values[index] = values[index] || '*';
var changed = true;
if (values[index].indexOf('/') !== -1) {
var parts_ = values[index].split('/');
var value = parseInt(parts_[1], 10) || 1;
if ($tab.find('.cron-slider').slider('value') != value) {
$tab.find('.cron-slider').slider('value', parseInt(parts_[1], 10) || 1);
changed = true;
}
if ($tab.find('.cron-tabs').tabs('option', 'active') != 1) {
$tab.find('.cron-tabs').tabs('option', 'active', 1);
changed = true;
}
$tab.find('.cron-preview-every').html(_(everyText[index], parseInt(parts_[1], 10) || 1));
} else if (values[index].indexOf('*') !== -1) {
if ($tab.find('.cron-tabs').tabs('option', 'active') != 0) {
$tab.find('.cron-tabs').tabs('option', 'active', 0);
changed = true;
}
} else {
var parts = convertMinusIntoArray(values[index]).split(',');
if ($tab.find('.cron-tabs li').length === 3) {
if ($tab.find('.cron-tabs').tabs('option', 'active') != 2) {
$tab.find('.cron-tabs').tabs('option', 'active', 2);
changed = true;
}
} else {
if ($tab.find('.cron-tabs').tabs('option', 'active') != 1) {
$tab.find('.cron-tabs').tabs('option', 'active', 1);
changed = true;
}
}
var selected = false;
$tab.find('.cron-tabs-format input[type="checkbox"]').each(function () {
var index = $(this).data('index').toString();
var value = parts.indexOf(index) !== -1;
if (value != $(this).prop('checked')) {
$(this).prop('checked', parts.indexOf(index) !== -1);
$(this).button('refresh');
changed = true;
}
if (value) selected = true;
});
if (!selected) {
if ($tab.find('.cron-tabs').tabs('option', 'active') != 0) {
$tab.find('.cron-tabs').tabs('option', 'active', 0);
changed = true;
}
}
if (changed) $(el).find('.cron-main-tab').tabs('option', 'active', index);
}
}
function processSlider(elem, ui) {
var arg = $(elem).data('arg');
cronArr[arg] = '*/' + ui.value;
$(el).find('.cron-tab-' + types[arg] + ' .cron-preview-every').html(ui.value === 1 ? _('CRON Every ' + types[arg]) : _('CRON Every') + ' ' + ui.value + ' ' + _('CRON ' + types[arg] + 's'));
drawCron();
}
function processEachChange(elem) {
var newItem = $(elem).data('index').toString();
var arg = $(elem).data('arg');
if (!cronArr) cronArr = ['*', '*', '*', '*', '*', '*'];
if (cronArr[arg] === '*') {
cronArr[arg] = newItem;
} else {
// if value already in list, toggle it off
var list = convertMinusIntoArray(cronArr[arg]).split(',');
if (list.indexOf(newItem) !== -1) {
list.splice(list.indexOf(newItem), 1);
cronArr[arg] = list.join(',');
} else {
// else toggle it on
cronArr[arg] = cronArr[arg] + ',' + newItem;
}
cronArr[arg] = convertArrayIntoMinus(cronArr[arg]);
if(cronArr[arg] === '') cronArr[arg] = '*';
}
drawCron();
}
function padded(val) {
if (typeof val === 'string' && val.length === 1) {
val = '0' + val;
} else if (val < 10) {
val = '0' + val;
} else {
val = val.toString();
}
return val;
}
function draw(type, drawFunc) {
var $format = $(el).find('.cron-tab-' + type + ' .cron-tabs-format');
$format.html(drawFunc());
$format.find('input').button();
$format.buttonset();
$format.find('input[type="checkbox"]').click(function () {
processEachChange(this);
});
}
function drawEachSecond() {
draw('second', function () {
var text = '';
// seconds
for (var i = 0; i < 60; i++) {
text += '<input type="checkbox" id="cron-second-check' + i + '" data-index="' + i + '" data-arg="0"><label for="cron-second-check' + i + '">' + padded(i) + '</label>';
if (i !== 0 && ((i + 1) % 10 === 0)) text += '<br/>';
}
return text;
});
}
function drawEachMinute () {
draw('minute', function () {
var text = '';
// minutes
for (var i = 0; i < 60; i++) {
var padded = i;
if (padded < 10) padded = '0' + padded;
text += '<input type="checkbox" id="cron-minute-check' + i + '" data-index="' + i + '" data-arg="1"><label for="cron-minute-check' + i + '">' + padded + '</label>';
if (i !== 0 && (((i + 1) % 10) === 0)) text += '<br/>';
}
return text;
});
}
function drawEachHour() {
draw('hour', function () {
var text = '';
// hours
for (var i = 0; i < 24; i++) {
var padded = i;
if (padded < 10) padded = '0' + padded;
text += '<input type="checkbox" id="cron-hour-check' + i + '" data-index="' + i + '" data-arg="2"><label for="cron-hour-check' + i + '">' + padded + '</label>';
if (i !== 0 && (((i + 1) % 12) === 0)) text += '<br/>';
}
return text;
});
}
function drawEachDay () {
draw('day', function () {
var text = '';
// days
for (var i = 1; i < 32; i++) {
var padded = i;
if (padded < 10) padded = '0' + padded;
text += '<input type="checkbox" id="cron-day-check' + i + '" data-index="' + i + '" data-arg="3"><label for="cron-day-check' + i + '">' + padded + '</label>';
if (i !== 0 && ((i % 7) === 0)) text += '<br/>';
}
return text;
});
}
function drawEachMonth () {
draw('month', function () {
var text = '';
// months
var months = ['Jan', 'Feb', 'March', 'April', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'];
for (var i = 0; i < months.length; i++) {
text += '<input type="checkbox" id="cron-month-check' + (i + 1) + '" data-index="' + (i + 1) + '" data-arg="4"><label for="cron-month-check' + (i + 1) + '">' + _(months[i]) + '</label>';
}
return text;
});
}
function drawEachWeekday () {
draw('week', function () {
var text = '';
// weeks
var days = [
{id: 1, name: 'Monday'},
{id: 2, name: 'Tuesday'},
{id: 3, name: 'Wednesday'},
{id: 4, name: 'Thursday'},
{id: 5, name: 'Friday'},
{id: 6, name: 'Saturday'},
{id: 0, name: 'Sunday'}
];
for (var i = 0; i < days.length; i++) {
text += '<input type="checkbox" id="cron-week-check' + days[i].id + '" data-index="' + days[i].id + '" data-arg="5"><label for="cron-week-check' + days[i].id + '">' + _(days[i].name) + '</label>';
}
return text;
});
}
drawEachSecond();
drawEachMinute();
drawEachHour();
drawEachDay();
drawEachMonth();
drawEachWeekday();
drawCron();
};
// HTML Template for plugin
var tmpl = '<input type="text" class="cron-input" value="* * * * * *" size="80"/>\
<br/>\
<div class="cron-text"></div><br>\
<div><span class="translate">Use seconds:</span><input type="checkbox" class="cron-checkbox-seconds"></div>\
<div class="cron-main-tab">\
<ul>\
<li><a href="#cron-tabs-second" class="translate">Second</a></li>\
<li><a href="#cron-tabs-minute" class="translate">Minute</a></li>\
<li><a href="#cron-tabs-hour" class="translate">Hour</a></li>\
<li><a href="#cron-tabs-day" class="translate">Day of Month</a></li>\
<li><a href="#cron-tabs-month" class="translate">Month</a></li>\
<li><a href="#cron-tabs-week" class="translate">Day of Week</a></li>\
</ul>\
<div id="cron-tabs-second" class="cron-tab-page cron-tab-second">\
<div class="cron-tabs">\
<ul>\
<li id="cron-button-second-every"><a href="#cron-tabs-second-every" class="translate">CRON Every second</a></li>\
<li id="cron-button-second-n"><a href="#cron-tabs-second-n" class="translate">Every n seconds</a></li>\
<li id="cron-button-second-each"><a href="#cron-tabs-second-each" class="translate">Each selected second</a></li>\
</ul>\
<div id="cron-tabs-second-every" class="cron-preview">\
<div>*</div>\
<div class="translate">CRON Every second</div>\
</div>\
<div id="cron-tabs-second-n">\
<div class="cron-preview-every translate">CRON Every second</div>\
<div class="cron-slider" data-arg="0"></div>\
</div>\
<div id="cron-tabs-second-each" class="cron-preview-n">\
<div class="translate">Each selected second</div><br/>\
<div class="cron-tabs-format"></div>\
</div>\
</div>\
</div>\
<div id="cron-tabs-minute" class="cron-tab-page cron-tab-minute">\
<div class="cron-tabs">\
<ul>\
<li id="cron-button-minute-every"><a href="#cron-tabs-minute-every" class="translate">CRON Every minute</a></li>\
<li id="cron-button-minute-n"><a href="#cron-tabs-minute-n" class="translate">Every n minutes</a></li>\
<li id="cron-button-minute-each"><a href="#cron-tabs-minute-each" class="translate">Each selected minute</a></li>\
</ul>\
<div id="cron-tabs-minute-every" class="cron-preview">\
<div>*</div>\
<div class="translate">CRON Every minute</div>\
</div>\
<div id="cron-tabs-minute-n">\
<div class="cron-preview-every translate">CRON Every minute</div>\
<div class="cron-slider" data-arg="1"></div>\
</div>\
<div id="cron-tabs-minute-each" class="cron-preview-n">\
<div class="translate">Each selected minute</div><br/>\
<div class="cron-tabs-format"></div>\
</div>\
</div>\
</div>\
<div id="cron-tabs-hour" class="cron-tab-page cron-tab-hour">\
<div class="cron-tabs">\
<ul>\
<li id="cron-button-hour-every"><a href="#cron-tabs-hour-every" class="translate">CRON Every hour</a></li>\
<li id="cron-button-hour-n"><a href="#cron-tabs-hour-n" class="translate">Every n hours</a></li>\
<li id="cron-button-hour-each"><a href="#cron-tabs-hour-each" class="translate">Each selected hour</a></li>\
</ul>\
<div id="cron-tabs-hour-every" class="cron-preview">\
<div>*</div>\
<div class="translate">CRON Every hour</div>\
</div>\
<div id="cron-tabs-hour-n">\
<div class="cron-preview-every translate">CRON Every hour</div>\
<div class="cron-slider" data-arg="2"></div>\
</div>\
<div id="cron-tabs-hour-each" class="cron-preview-n">\
<div class="translate">Each selected hour</div><br/>\
<div class="cron-tabs-format"></div>\
</div>\
</div>\
</div>\
<div id="cron-tabs-day" class="cron-tab-page cron-tab-day">\
<div class="cron-tabs">\
<ul>\
<li id="cron-button-day-every"><a href="#cron-tabs-day-every" class="translate">CRON Every day</a></li>\
<li id="cron-button-day-each"><a href="#cron-tabs-day-each" class="translate">Each selected day</a></li>\
</ul>\
<div id="cron-tabs-day-every" class="cron-preview">\
<div>*</div>\
<div class="translate">CRON Every day</div>\
</div>\
<div id="cron-tabs-day-each" class="cron-preview-n">\
<div class="translate">Each selected day</div><br/>\
<div class="cron-tabs-format"></div>\
</div>\
</div>\
</div>\
<div id="cron-tabs-month" class="cron-tab-page cron-tab-month">\
<div class="cron-tabs">\
<ul>\
<li id="cron-button-month-every"><a href="#cron-tabs-month-every" class="translate">CRON Every month</a></li>\
<li id="cron-button-month-each"><a href="#cron-tabs-month-each" class="translate">Each selected month</a></li>\
</ul>\
<div id="cron-tabs-month-every" class="cron-preview">\
<div>*</div>\
<div class="translate">CRON Every month</div>\
</div>\
<div id="cron-tabs-month-each" class="cron-preview-n">\
<div class="translate">Each selected month</div><br/>\
<div class="cron-tabs-format"></div>\
</div>\
</div>\
</div>\
<div id="cron-tabs-week" class="cron-tab-page cron-tab-week">\
<div class="cron-tabs">\
<ul>\
<li id="cron-button-week-every"><a href="#cron-tabs-week-every" class="translate">CRON Every week day</a></li>\
<li id="cron-button-week-each"><a href="#cron-tabs-week-each" class="translate">Each selected week day</a></li>\
</ul>\
<div id="cron-tabs-week-every" class="cron-preview">\
<div>*</div>\
<div class="translate">CRON Every week day</div>\
</div>\
<div id="cron-tabs-week-each" class="cron-preview-n">\
<div class="translate">Each selected week day</div><br/>\
<div class="cron-tabs-format"></div>\
</div>\
</div>\
</div>\
</div>';