$.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 += ''; if (i !== 0 && ((i + 1) % 10 === 0)) text += '
'; } 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 += ''; if (i !== 0 && (((i + 1) % 10) === 0)) text += '
'; } 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 += ''; if (i !== 0 && (((i + 1) % 12) === 0)) text += '
'; } 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 += ''; if (i !== 0 && ((i % 7) === 0)) text += '
'; } 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 += ''; } 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 += ''; } return text; }); } drawEachSecond(); drawEachMinute(); drawEachHour(); drawEachDay(); drawEachMonth(); drawEachWeekday(); drawCron(); }; // HTML Template for plugin var tmpl = '\
\

\
Use seconds:
\
\ \
\
\ \
\
*
\
CRON Every second
\
\
\
CRON Every second
\
\
\
\
Each selected second

\
\
\
\
\
\
\ \
\
*
\
CRON Every minute
\
\
\
CRON Every minute
\
\
\
\
Each selected minute

\
\
\
\
\
\
\ \
\
*
\
CRON Every hour
\
\
\
CRON Every hour
\
\
\
\
Each selected hour

\
\
\
\
\
\
\ \
\
*
\
CRON Every day
\
\
\
Each selected day

\
\
\
\
\
\
\ \
\
*
\
CRON Every month
\
\
\
Each selected month

\
\
\
\
\
\
\ \
\
*
\
CRON Every week day
\
\
\
Each selected week day

\
\
\
\
\
';