$.fn.croneditor = function(opts) {
var el = this;
// Write the HTML template to the document
$(el).html(tmpl);
var cronArr = ["*", "*", "*", "*", "*", "*"];
if (typeof opts.value === "string") {
cronArr = opts.value.split(' ');
}
$( ".tabs" ).tabs({
activate: function( event, ui ) {
switch ($(ui.newTab).attr('id')) {
// Seconds
case 'button-second-every':
cronArr[0] = "*";
break;
case 'button-second-n':
cronArr[0] = "*/" + $( "#tabs-second .slider" ).slider("value");
break;
// Minutes
case 'button-minute-every':
cronArr[1] = "*";
break;
case 'button-minute-n':
cronArr[1] = "*/" + $( "#tabs-minute .slider" ).slider("value");
break;
case 'button-minute-each':
cronArr[1] = "*";
// TODO: toggle off selected minutes on load
//$('.tabs-minute-format input[checked="checked"]').click()
$('.tabs-minute-format').html('');
drawEachMinutes();
break;
// Hours
case 'button-hour-every':
cronArr[2] = "*";
break;
case 'button-hour-n':
cronArr[2] = "*/" + $( "#tabs-hour .slider" ).slider("value");
break;
case 'button-hour-each':
cronArr[2] = "*";
$('.tabs-hour-format').html('');
drawEachHours();
break;
// Days
case 'button-day-every':
cronArr[3] = "*";
break;
case 'button-day-each':
cronArr[3] = "*";
$('.tabs-day-format').html('');
drawEachDays();
break;
// Months
case 'button-month-every':
cronArr[4] = "*";
break;
case 'button-month-each':
cronArr[4] = "*";
$('.tabs-month-format').html('');
drawEachMonths();
break;
// Weeks
case 'button-week-every':
cronArr[5] = "*";
break;
case 'button-week-each':
cronArr[5] = "*";
$('.tabs-week-format').html('');
drawEachWeek();
break;
}
drawCron();
}
});
function drawCron () {
var newCron = cronArr.join(' ');
$('#cronString').val(newCron);
// TODO: add back next estimated cron time
/*
var last = new Date();
$('.next').html('');
var job = new cron.CronTime(newCron);
var next = job._getNextDateFrom(new Date());
$('.next').append('' + dateformat(next, "ddd mmm dd yyyy HH:mm:ss") + '
');
*/
/*
setInterval(function(){
drawCron();
}, 500);
*/
/*
$('#cronString').keyup(function(){
cronArr = $('#cronString').val().split(' ');
console.log('updated', cronArr)
});
*/
}
$('#clear').click(function(){
$('#cronString').val('* * * * * *');
cronArr = ["*","*","*","*","*", "*"];
});
$( "#tabs-second .slider" ).slider({
min: 1,
max: 59,
slide: function( event, ui ) {
cronArr[0] = "*/" + ui.value;
$('#tabs-second-n .preview').html('Every ' + ui.value + ' seconds');
drawCron();
}
});
$( "#tabs-minute .slider" ).slider({
min: 1,
max: 59,
slide: function( event, ui ) {
cronArr[1] = "*/" + ui.value;
$('#tabs-minute-n .preview').html('Every ' + ui.value + ' minutes');
drawCron();
}
});
$( "#tabs-hour .slider" ).slider({
min: 1,
max: 23,
slide: function( event, ui ) {
cronArr[2] = "*/" + ui.value;
$('#tabs-hour-n .preview').html('Every ' + ui.value + ' Hours');
drawCron();
}
});
// TOOD: All draw* functions can be combined into a few smaller methods
function drawEachMinutes () {
// minutes
for (var i = 0; i < 60; i++) {
var padded = i;
if(padded.toString().length === 1) {
padded = "0" + padded;
}
$('.tabs-minute-format').append('');
if (i !== 0 && (i+1) % 10 === 0) {
$('.tabs-minute-format').append('
');
}
}
$('.tabs-minute-format input').button();
$('.tabs-minute-format').buttonset();
$('.tabs-minute-format input[type="checkbox"]').click(function(){
var newItem = $(this).attr('id').replace('minute-check', '');
if(cronArr[1] === "*") {
cronArr[1] = $(this).attr('id').replace('minute-check', '');
} else {
// if value already in list, toggle it off
var list = cronArr[1].split(',');
if (list.indexOf(newItem) !== -1) {
list.splice(list.indexOf(newItem), 1);
cronArr[1] = list.join(',');
} else {
// else toggle it on
cronArr[1] = cronArr[1] + "," + newItem;
}
if(cronArr[1] === "") {
cronArr[1] = "*";
}
}
drawCron();
});
}
function drawEachHours () {
// hours
for (var i = 0; i < 24; i++) {
var padded = i;
if(padded.toString().length === 1) {
padded = "0" + padded;
}
$('.tabs-hour-format').append('');
if (i !== 0 && (i+1) % 12 === 0) {
$('.tabs-hour-format').append('
');
}
}
$('.tabs-hour-format input').button();
$('.tabs-hour-format').buttonset();
$('.tabs-hour-format input[type="checkbox"]').click(function(){
var newItem = $(this).attr('id').replace('hour-check', '');
if(cronArr[2] === "*") {
cronArr[2] = $(this).attr('id').replace('hour-check', '');
} else {
// if value already in list, toggle it off
var list = cronArr[2].split(',');
if (list.indexOf(newItem) !== -1) {
list.splice(list.indexOf(newItem), 1);
cronArr[2] = list.join(',');
} else {
// else toggle it on
cronArr[2] = cronArr[2] + "," + newItem;
}
if(cronArr[2] === "") {
cronArr[2] = "*";
}
}
drawCron();
});
};
function drawEachDays () {
// days
for (var i = 1; i < 32; i++) {
var padded = i;
if(padded.toString().length === 1) {
padded = "0" + padded;
}
$('.tabs-day-format').append('');
if (i !== 0 && (i) % 7 === 0) {
$('.tabs-day-format').append('
');
}
}
$('.tabs-day-format input').button();
$('.tabs-day-format').buttonset();
$('.tabs-day-format input[type="checkbox"]').click(function(){
var newItem = $(this).attr('id').replace('day-check', '');
if(cronArr[3] === "*") {
cronArr[3] = $(this).attr('id').replace('day-check', '');
} else {
// if value already in list, toggle it off
var list = cronArr[3].split(',');
if (list.indexOf(newItem) !== -1) {
list.splice(list.indexOf(newItem), 1);
cronArr[3] = list.join(',');
} else {
// else toggle it on
cronArr[3] = cronArr[3] + "," + newItem;
}
if(cronArr[3] === "") {
cronArr[3] = "*";
}
}
drawCron();
});
};
function drawEachMonths () {
// months
var months = [null, 'Jan', 'Feb', 'March', 'April', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'];
for (var i = 1; i < 13; i++) {
var padded = i;
if(padded.toString().length === 1) {
//padded = "0" + padded;
}
$('.tabs-month-format').append('');
}
$('.tabs-month-format input').button();
$('.tabs-month-format').buttonset();
$('.tabs-month-format input[type="checkbox"]').click(function(){
var newItem = $(this).attr('id').replace('month-check', '');
if(cronArr[4] === "*") {
cronArr[4] = $(this).attr('id').replace('month-check', '');
} else {
// if value already in list, toggle it off
var list = cronArr[4].split(',');
if (list.indexOf(newItem) !== -1) {
list.splice(list.indexOf(newItem), 1);
cronArr[4] = list.join(',');
} else {
// else toggle it on
cronArr[4] = cronArr[4] + "," + newItem;
}
if(cronArr[4] === "") {
cronArr[4] = "*";
}
}
drawCron();
});
};
function drawEachWeek () {
// weeks
var days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
for (var i = 0; i < 7; i++) {
var padded = i;
if(padded.toString().length === 1) {
//padded = "0" + padded;
}
$('.tabs-week-format').append('');
}
$('.tabs-week-format input').button();
$('.tabs-week-format').buttonset();
$('.tabs-week-format input[type="checkbox"]').click(function(){
var newItem = $(this).attr('id').replace('week-check', '');
if(cronArr[5] === "*") {
cronArr[5] = $(this).attr('id').replace('week-check', '');
} else {
// if value already in list, toggle it off
var list = cronArr[5].split(',');
if (list.indexOf(newItem) !== -1) {
list.splice(list.indexOf(newItem), 1);
cronArr[5] = list.join(',');
} else {
// else toggle it on
cronArr[5] = cronArr[5] + "," + newItem;
}
if(cronArr[5] === "") {
cronArr[5] = "*";
}
}
drawCron();
});
};
// TODO: Refactor these methods into smaller methods
drawEachMinutes();
drawEachHours();
drawEachDays();
drawEachMonths();
drawCron();
};
// HTML Template for plugin
var tmpl = '\
\
\
\
Note: If your Cron manager does not support seconds you will need to ignore the first parameter of the generated Cron
\
\
\
\