/* * Editdialog app code */ EDIT_STATE = null; EDIT_BACKUP = null; $(document).ready(function() { var dirSep = '/'; EDIT_BACKUP = { validate_tab: function(tab) { var tabs = $('#edit-dialog').parent().find('[role=tablist] > li'); tab += ''; if (tab.length > 0 && tab[0] == '#') tab = tab.substr(1); if (parseInt(tab) + '' == tab) { tab = tabs[parseInt(tab)] } else { var tt = tab; tab = null; for(var n in tabs) { var href = $(n).find('a').attr('href'); if (href && href[0] == '#') { href = href.substr(1); } if (tabs[n] == tt || href == tab) { tab = tabs[n]; break; } } } if (tab) { var href = $(tab).find('a').attr('href'); if (href && href[0] == '#') href = href.substr(1); var index; for(index in tabs) if (tab == tabs[index]) break; if (EDIT_BACKUP.validate_form_map[href]) { if (!EDIT_BACKUP.validate_form_map[href](index)) { return false; } } return true; } else { return false; } }, validate_form_map: { 'edit-tab-general': function(tabindex) { if ($('#backup-name').val().trim() == '') { $('#edit-dialog').tabs( "option", "active", tabindex); $('#backup-name').focus(); alert('You must enter a name for the backup'); return false; } if ($('#encryption-method').val() != '') { if ($('#encryption-password').val().trim() == '') { $('#edit-dialog').tabs( "option", "active", tabindex); $('#encryption-password').focus(); alert('You must enter a passphrase'); return false; } if (!EDIT_STATE.passwordShown && $('#repeat-password').hasClass('password-mismatch')) { $('#edit-dialog').tabs( "option", "active", tabindex); $('#repeat-password').focus(); alert('The passwords do not match'); return false; } } return true; }, 'edit-tab-sourcedata': function(tabindex) { if ($('#source-folder-paths').find('.source-folder').length == 0) { $('#edit-dialog').tabs( "option", "active", tabindex); $('#source-folder-paths').focus(); alert('You must select at least one source folder to back up'); return false; } return true; }, 'edit-tab-target': function(tabindex) { if ($('#backup-uri').val().trim() == '') { $('#edit-dialog').tabs( "option", "active", tabindex); $('#backup-uri').focus(); alert('You must enter a connection url for the backup'); return false; } return true; }, 'edit-tab-schedule': function(tabindex) { if ($('#use-scheduled-run').is(':checked')) { var t = Date.parse($('#next-run-date').val() + 'T' + $('#next-run-time').val()); if (isNaN(t)) { $('#edit-dialog').tabs( "option", "active", tabindex); $('#next-run-time').focus(); alert('You must enter a valid time'); return false; } } return true; } }, fill_form_map: { 'encryption-module': 'encryption-method', 'Name': 'backup-name', 'TargetURL': 'backup-uri', 'passphrase': function(dict, key, val, cfgel) { $('#encryption-password').val(val); $('#repeat-password').val(val); }, 'Sources': function(dict, key, val, cfgel) { var sources = val || []; var lookup = {}; if (EDIT_STATE.orig_config && EDIT_STATE.orig_config.DisplayNames) lookup = EDIT_STATE.orig_config.DisplayNames; $('#source-folder-paths').find('.source-folder').remove(); for(var n in sources) { var p = sources[n]; var rp = p; addSourceFolder(rp, lookup[p] || p); } }, 'Tags': function(dict, key, val, cfgel) { var tags = val || []; //$('#backup-labels').val(tags.join(', ')); }, 'Schedule': function(dict, key, val, cfgel) { $('#use-scheduled-run').attr('checked', val != null) $('#use-scheduled-run').trigger('change'); }, 'Repeat': function(dict, key, val, cfgel) { $('#use-scheduled-run').attr('checked', val != ''); $('#use-scheduled-run').change(); if (!$('#use-scheduled-run').is(':checked')) return; var m = (/(\d*)(\w)/mg).exec(val); var mul = null; if (m) { switch(m[2]) { case 'D': mul = 'days'; break; case 'h': mul = 'hours'; break; case 'M': mul = 'months'; break; case 'Y': mul = 'years'; break; case 'W': mul = 'weeks'; break; } } if (!mul) { // Strange stuff, just use it as-is $('#repeat-run-number').val(val + ''); $('#repeat-run-multiplier').val('custom'); } else { $('#repeat-run-number').val(m[1]); $('#repeat-run-multiplier').val(m[2]); } }, 'Time': function(dict, key, val, cfgel) { var parts = val.split(':'); var now = new Date(); var msec = Date.parse(val); if (isNaN(msec)) msec = Date.parse("1970-01-01T" + val); var d = null; if (isNaN(msec)) { d = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 13, 0, 0); $('#next-run-time').val('13:00'); $('#next-run-date').val(now); } else { d = new Date(msec); if (d.getFullYear() <= 1970) { msec += new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0).getTime(); d = new Date(msec); } } var y = d.getFullYear() + ''; var m = (d.getMonth() + 1) + ''; var n = d.getDate() + ''; var h = d.getHours() + ''; var l = d.getMinutes() + ''; var s = d.getSeconds() + ''; if (m.length == 1) m = '0' + m; if (n.length == 1) n = '0' + n; if (h.length == 1) h = '0' + h; if (l.length == 1) l = '0' + l; if (s.length == 1) s = '0' + s; $('#next-run-date').val(y + '-' + m + '-' + n); $('#next-run-time').val(h + ':' + l + ':' + s); }, 'AllowedDays': function(dict, key, val, cfgel) { var d = false; if (val == null || val.length == 0) d = true; var n = { 'mon': d, 'tue': d, 'wed': d, 'thu': d, 'fri': d, 'sat': d, 'sun': d }; for(var i in val) if (n[val[i]] !== undefined) n[val[i]] = true; for(var k in n) { $('#allow-day-' + k).attr('checked', n[k]); } }, 'dblock-size': function(dict, key, val, cfgel) { var m = (/(\d*)(\w*)/mg).exec(val); var mul = null; if (m) { $('#dblock-size-number').val(m[1]); $('#dblock-size-multiplier').val(m[2]); } } }, fill_dict_map: { 'source-folder-path-text': false, 'repeat-password': false, 'dblock-size-multiplier': false, 'repeat-run-multiplier': false, 'next-run-date': false, 'allow-day-mon': false, 'allow-day-tue': false, 'allow-day-wed': false, 'allow-day-thu': false, 'allow-day-fri': false, 'allow-day-sat': false, 'allow-day-sun': function(dict, key, el, cfgel) { if (!$('#use-scheduled-run').is(':checked')) return; if (!dict['Schedule']) dict['Schedule'] = {}; // Collect all days var days = []; var r = ['mon', 'tue', 'wed', 'thu','fri', 'sat', 'sun']; for(var k in r) if ($('#allow-day-' + r[k]).is(':checked')) days.push(r[k]); dict['Schedule']['AllowedDays']= days; }, 'encryption-password': function(dict, key, el, cfgel) { dict['Backup']['Settings']['passphrase'] = $(el).val(); }, 'source-folder-list': function(dict, key, el, cfgel) { var sources = []; $('#source-folder-paths').find('.source-folder').each(function(i,el) { var p = $(el).data('id'); sources.push(p); }); dict['Backup']['Sources'] = sources; }, 'use-scheduled-run': function(dict, key, el, cfgel) { if (!$(el).is(':checked')) { dict['Schedule'] = null; } else if(!dict['Schedule']) { dict['Schedule'] = {}; } }, 'backup-uri': function(dict, key, el, cfgel) { dict['Backup']['TargetURL'] = $(el).val(); }, 'backup-name': function(dict, key, el, cfgel) { dict['Backup']['Name'] = $(el).val(); }, 'backup-labels': function(dict, key, el, cfgel) { // dict['Backup']['Tags'] = $(el).val().split(','); }, 'encryption-method': function(dict, key, el, cfgel) { dict['Backup']['Settings']['encryption-module'] = $(el).val(); if ($(el).val().trim() == '') dict['Backup']['Settings']['--no-encryption'] = true; else delete dict['Backup']['Settings']['--no-encryption']; }, 'next-run-time': function(dict, key, el, cfgel) { if (!$('#use-scheduled-run').is(':checked')) return; if (!dict['Schedule']) dict['Schedule'] = {}; var t = Date.parse($('#next-run-date').val()); if (t != NaN) { var tp = $('#next-run-time').val().split(':'); while(tp.length < 3) tp.push('00'); var d = new Date(t); d = new Date(d.getFullYear(), d.getMonth(), d.getDate(), parseInt(tp[0]), parseInt(tp[1]), parseInt(tp[2])) dict['Schedule']['Time'] = d.toISOString(); } }, 'dblock-size-number': function(dict, key, el, cfgel) { dict['Backup']['Settings']['dblock-size'] = $(el).val() + $('#dblock-size-multiplier').val(); }, 'repeat-run-number': function(dict, key, el, cfgel) { if (!$('#use-scheduled-run').is(':checked')) return; if (!dict['Schedule']) dict['Schedule'] = {}; var m = $('#repeat-run-multiplier').val(); if (m == 'custom') dict['Schedule']['Repeat'] = $(el).val(); else dict['Schedule']['Repeat'] = $(el).val() + m; } } }; $('#backup-name').watermark('Photos 2014'); // $('#backup-labels').watermark('work, docs, s3, movies, other'); $('#backup-uri').watermark('webdavs://user:pass@example.com:995/backup?option=true'); $('#encryption-password').watermark('Long and secret passphrase'); $('#repeat-password').watermark('Long and secret passphrase'); $('#backup-options').watermark('Enter one option pr. line in commandline format, eg. --dblock-size=100MB'); $('#source-folder-path-text').watermark('Enter a path to back up'); $('#source-filters').watermark('One filter per line, e.g. "+*.txt" or "-[.*\\.txt]"'); var updateState = function() { if (EDIT_STATE != null) EDIT_STATE.dataModified = true; }; $('#backup-name').change(updateState); // $('#backup-labels').change(updateState); $('#backup-uri').change(updateState); $('#encryption-password').change(updateState); $('#repeat-password').change(updateState); $('#backup-options').change(updateState); $('#source-filters').change(updateState); function split(val) { return val.split(/,\s*/); } function extractLast(val) { return split(val).pop(); } // $('#backup-labels').autocomplete({ // minLength: 0, // source: function(request, response) { // if (EDIT_STATE != null && EDIT_STATE.tags != null) // response( $.ui.autocomplete.filter(EDIT_STATE.tags, extractLast(request.term))); // }, // focus: function() { // return false; // }, // select: function( event, ui ) { // var terms = split( this.value ); // terms.pop(); //remove current // terms.push(ui.item.value); // terms.push(''); //prepare for new // this.value = terms.join(', '); // return false; // } // }); var updatePasswordIndicator = function() { var strengthMap = { 0: "Useless", 1: "Very weak", 2: "Weak", 3: "Strong", 4: "Very strong" }; $.passwordStrength($('#encryption-password')[0].value, function(r) { var f = $('#backup-password-strength'); if (r == null) { f.text('Strength: Unknown'); r = {score: -1} } else { console.log(r) f.text('Strength: ' + strengthMap[r.score]); } f.removeClass('password-strength-0'); f.removeClass('password-strength-1'); f.removeClass('password-strength-2'); f.removeClass('password-strength-3'); f.removeClass('password-strength-4'); f.removeClass('password-strength-unknown'); if (r.score == 0) f.addClass('password-strength-0'); else if (r.score == 1) f.addClass('password-strength-1'); else if (r.score == 2) f.addClass('password-strength-2'); else if (r.score == 3) f.addClass('password-strength-3'); else if (r.score == 4) f.addClass('password-strength-4'); else f.addClass('password-strength-unknown'); }); if ($('#encryption-password').val() != $('#repeat-password').val()) { $('#repeat-password').addClass('password-mismatch'); //$('#encryption-password').addClass('password-mismatch'); } else { $('#repeat-password').removeClass('password-mismatch'); //$('#encryption-password').removeClass('password-mismatch'); } } $('#encryption-password').change(updatePasswordIndicator); $('#repeat-password').change(updatePasswordIndicator); $('#encryption-password').keyup(updatePasswordIndicator); $('#repeat-password').keyup(updatePasswordIndicator); $('#toggle-show-password').click(function() { $('#encryption-password').togglePassword(); }); $('#encryption-password').on('passwordShown', function () { $('#toggle-show-password').text('Hide') $('#repeat-password').showPassword(); EDIT_STATE.passwordShown = true; //$('#repeat-password').hide(); //$('#repeat-password-label').hide(); }).on('passwordHidden', function () { $('#toggle-show-password').text('Show') $('#repeat-password').hidePassword(); EDIT_STATE.passwordShown = false; //$('#repeat-password').show(); //$('#repeat-password-label').show(); }); $('#generate-password').click(function() { var specials = '!@#$%^&*()_+{}:"<>?[];\',./'; var lowercase = 'abcdefghijklmnopqrstuvwxyz'; var uppercase = lowercase.toUpperCase(); var numbers = '0123456789'; var all = specials + lowercase + uppercase + numbers; function choose(str, n) { var res = ''; for (var i = 0; i < n; i++) { res += str.charAt(Math.floor(Math.random() * str.length)); } return res; }; var pwd = ( choose(specials, 2) + choose(lowercase, 2) + choose(uppercase, 2) + choose(numbers, 2) + choose(all, (Math.random()*5) + 5) ).split(''); for(var i = 0; i < pwd.length; i++) { var pos = parseInt(Math.random() * pwd.length); var t = pwd[i] pwd[i] = pwd[pos]; pwd[pos] = t; } pwd = pwd.join(''); $('#encryption-password')[0].value = pwd; $('#repeat-password')[0].value = pwd; $('#encryption-password').showPassword(); updatePasswordIndicator(); }); $('#backup-uri-label').click(function() { $('#connection-uri-dialog').dialog('open'); }); var dlg_buttons = $('#edit-dialog').parent().find('.ui-dialog-buttonpane').find('.ui-button'); $('#edit-dialog').on( "tabsactivate", function( event, ui ) { var tabs = $('#edit-dialog').parent().find('[role=tablist] > li'); if (ui.newPanel.attr('id') == tabs.first().attr('aria-controls')) dlg_buttons.first().button('option', 'disabled', true); else if (ui.oldPanel.attr('id') == tabs.first().attr('aria-controls')) dlg_buttons.first().button('option', 'disabled', false); if (ui.newPanel.attr('id') == tabs.last().attr('aria-controls')) dlg_buttons.last().button('option', 'label', 'Save'); else if (ui.oldPanel.attr('id') == tabs.last().attr('aria-controls')) dlg_buttons.last().button('option', 'label', 'Next >'); }); $('#edit-dialog').on( "dialogopen", function( event, ui ) { $('#edit-dialog-form').each(function(i, e) { e.reset(); }); $('#source-folder-paths').find('.source-folder').remove(); removeSourceFolder(); EDIT_STATE = { passwordShown: false, dataModified: false, passwordModified: false, newBackup: true }; APP_DATA.getServerConfig(function(serverdata) { dirSep = serverdata.DirectorySeparator; if (serverdata['EncryptionModules'] == null || serverdata['EncryptionModules'].length == 0) { $('#encryption-area').hide(); } else { $('#encryption-area').show(); var drop = $('#encryption-method'); drop.empty(); drop.append($("").attr("value", '').text('No encryption')); var encmodules = serverdata['EncryptionModules']; for (var i = 0; i < encmodules.length; i++) drop.append($("").attr("value", encmodules[i].Key).text(encmodules[i].DisplayName)); } $('#encryption-method').change(); }); APP_DATA.getLabels(function(labels) { EDIT_STATE.tags = labels; }); $('#edit-dialog').tabs('option', 'active', 0); }); $('#encryption-method').change(function() { if ($('#encryption-method').val() == '') $('#encryption-password-area').hide(); else $('#encryption-password-area').show(); }); $('#edit-dialog').on( "dialogbeforeclose", function( event, ui ) { //TODO: Actually set this flag if (EDIT_STATE.dataModified) { if (!confirm('Close without saving?')) return false; } }); var readFormData = function(validateOptions) { var obj = { 'Schedule': {}, 'Backup': { 'Settings': {}, 'Filters': [], 'Sources': [], 'Tags': [] } }; // To protect against data loss, we use the orig config and update it if (EDIT_STATE.orig_config != null) $.extend(true, obj, EDIT_STATE.orig_config); for(var k in obj.Backup.Settings) if (k.substr(0, 2) == '--') delete obj.Backup.Settings[k]; APP_UTIL.read_form($('#edit-dialog-form'), EDIT_BACKUP.fill_dict_map, obj); if (!APP_UTIL.parseOptionStrings($('#backup-options').val(), obj.Backup.Settings, function() { //TODO: Add validation return true; })) { return null; } var filters = $('#source-filters').val(); var filterlist = []; if (filters != '') { var lines = filters.split('\n'); for(var i in lines) { var ld = lines[i].trim(); if (ld == '') continue; if (ld[0] != '-' && ld[0] != '+') { EDIT_URI.validation_error($('#source-filters'), 'Each filter line must start with either a "+" or a "-" character'); return null; } filterlist.push({'Expression': ld.substr(1), 'Include': ld[0] == '+', 'Order': i}); } } obj.Backup.Filters = filterlist; return obj }; dlg_buttons.last().click(function(event, ui) { var tabs = $('#edit-dialog').parent().find('[role=tablist] > li'); if (event.curPage == tabs.size() - 1) { // Saving, validate first for(var n in tabs) { if (!EDIT_BACKUP.validate_tab(n)) { return; } } var obj = readFormData(true); if (obj == null) return; //Fixup, change settings dict into array var set = obj.Backup.Settings; obj.Backup.Settings = []; for(var k in set) obj.Backup.Settings.push({Name: k, Value: set[k]}); if (EDIT_STATE.newBackup) { APP_DATA.locateUriDb(obj.Backup.TargetURL, function(res) { var existing_db = (res.Exists && confirm("An existing local database for the storage has been found.\nRe-using the database will allow the commandline and server instances to work on the same remote storage.\n\n Do you wish to use the existing database?")) ? true : false; APP_DATA.addBackup(obj, function() { EDIT_STATE.dataModified = false; $('#edit-dialog').dialog('close'); }, function(data, succes, status) { alert('Could not save: ' + status); }, { existing_db: existing_db }); }, function(data, succes, status) { alert('Could not save: ' + status); }); } else { APP_DATA.updateBackup(obj, function() { EDIT_STATE.dataModified = false; $('#edit-dialog').dialog('close'); }, function(data, succes, status) { alert('Could not save: ' + status); }); } } }); var removeSourceFolder = function(el) { var container = $('#source-folder-paths'); if (el) container.each(function(i, e) { e.removeChild(el) }); if (container.find('.source-folder').length == 0) { container.addClass('empty'); $('#source-folder-paths-hint').show(); } }; var addSourceFolder = function(path, display) { var container = $('#source-folder-paths'); container.removeClass('empty'); $('#source-folder-paths-hint').hide(); if (path == null || path.trim() == '') return false; var exists = false; container.find('.source-folder').each(function(i,el) { exists |= $(el).data('id') == path; }); if (exists) return false; var div = $('
').addClass('source-folder').text(display).each(function(i, e) { if (path[0] != '%') { e.title = path; }}); var closer = $('
').addClass('source-folder-close-icon'); div.append(closer); closer.click(function() { removeSourceFolder(div[0]); }); container.append(div); $(div).data('id', path); APP_DATA.validatePath(path, function(path, success) { if (success) div.addClass('path-valid'); else div.addClass('path-invalid'); }); return true; }; var browsePath = function() { $.browseForFolder({ title: 'Select folder to back up', callback: function(path, disp) { disp = (disp || path).split(dirSep); addSourceFolder(path, disp[disp.length - 1]); } }); }; $('#source-folder-path-browse').click(browsePath); $('#source-folder-path-add').click(function() { if ($('#source-folder-path-text').val() == '') { browsePath(); } else { var path = $('#source-folder-path-text').val(); var disp = path.split(dirSep); if (addSourceFolder(path, disp[disp.length - 1])) { $('#source-folder-path-text').val(''); $('#source-folder-path-text').trigger('change'); $('#source-folder-path-text').focus(); } } }); $('#source-folder-path-text').keypress(function(e) { if (e.which == 13) $('#source-folder-path-add').click(); else $('#source-folder-path-text').trigger('change'); }); $('#source-folder-path-text').keyup(function(e) { $('#source-folder-path-text').trigger('change'); }); $('#source-folder-path-text').change(function(e, data) { if ($('#source-folder-path-text').val().trim() == '') $('#source-folder-path-add').button('option', 'label', 'Browse'); else $('#source-folder-path-add').button('option', 'label', 'Add'); }); // Register a drop target for folder nodes var inActualMove = false; $('#source-folder-droptarget').jstree({ 'core': { 'check_callback': function(method, item, parent, position) { if (inActualMove) addSourceFolder(item.data('id'), item.data('display')); return !inActualMove; }, }, 'dnd': { copy: false } }); // We need to know if the check callback happens on drop or on drag // but jstree only sends "move_node" var tree = $('#source-folder-droptarget').data('jstree'); tree.tree_move_orig = tree.move_node; tree.move_node = function(obj, par, pos, callback, is_loaded) { try { inActualMove = true; this.tree_move_orig(obj, par, pos, callback, is_loaded); } finally { inActualMove = false; } } $("#edit-dialog").on('setup-dialog', function(e, data) { if (data.Backup && data.Backup.ID && parseInt(data.Backup.ID) > 0) { EDIT_STATE.orig_config = data; EDIT_STATE.newBackup = false; } else { EDIT_STATE.orig_config = null; EDIT_STATE.newBackup = true; } if (data['Schedule'] == null || data['Schedule']['Repeat'] == null || data['Schedule']['Repeat'] == '') APP_UTIL.fill_form($('#edit-dialog-form'), { 'Schedule': null }, EDIT_BACKUP.fill_form_map, 'Schedule'); else APP_UTIL.fill_form($('#edit-dialog-form'), data['Schedule'], EDIT_BACKUP.fill_form_map, 'Schedule'); // Convert from list-form to key/value map var orig = data['Backup'].Settings; var settings = {}; data['Backup'].Settings = settings; for(var n in orig) settings[orig[n].Name] = orig[n].Value; APP_UTIL.fill_form($('#edit-dialog-form'), data['Backup'], EDIT_BACKUP.fill_form_map, d); for(var d in data['Backup']) if (typeof(data['Backup'][d]) == typeof({})) APP_UTIL.fill_form($('#edit-dialog-form'), data['Backup'][d], EDIT_BACKUP.fill_form_map, d); var opttext = ''; for(var k in data['Backup']['Settings']) if (EDIT_BACKUP.fill_form_map[k] === undefined && k.indexOf('--') == 0) opttext += k + '=' + (data['Backup']['Settings'][k] || '') + '\n'; $('#backup-options').val(opttext); var filtertext = ''; for(var k in data['Backup']['Filters']) filtertext += (data['Backup']['Filters'][k].Include ? '+' : '-') + data['Backup']['Filters'][k].Expression + '\n'; $('#source-filters').val(filtertext); EDIT_STATE.dataModified = false; }); $('#backup-options-dialog').dialog({ minWidth: 320, width: $('body').width > 600 ? 320 : 600, minHeight: 480, height: 500, modal: true, autoOpen: false, closeOnEscape: true, buttons: [ { text: 'Close', disabled: false, click: function(event, ui) { $('#backup-options-dialog').dialog('close'); }} ] }); $('#backup-options-link').click(function() { APP_DATA.getServerConfig(function(data) { $('#backup-options-dialog').dialog('open'); var baseOpts = data.Options; var obj = readFormData(false); var compressionModule = ''; var encryptionModule = ''; for (var i in data.Options) if (data.Options[i].Name == 'compression-module') compressionModule = data.Options[i].DefaultValue; else if (data.Options[i].Name == 'encryption-module') encryptionModule = data.Options[i].DefaultValue; if (obj != null && obj.Backup != null && obj.Backup.Settings != null) { if (obj.Backup.Settings['compression-module'] != null && obj.Backup.Settings['compression-module'] != '') compressionModule = obj.Backup.Settings['compression-module']; if (obj.Backup.Settings['encryption-module'] != null && obj.Backup.Settings['encryption-module'] != '') encryptionModule = obj.Backup.Settings['encryption-module']; } for(var n in data.CompressionModules) if (data.CompressionModules[n].Key == compressionModule) { baseOpts = baseOpts.concat(data.CompressionModules[n].Options); break; } for(var n in data.EncryptionModules) if (data.EncryptionModules[n].Key == encryptionModule) { baseOpts = baseOpts.concat(data.EncryptionModules[n].Options); break; } for(var n in data.GenericModules) baseOpts = baseOpts.concat(data.GenericModules[n].Options); $('#backup-options-dialog').trigger('configure', { Options: baseOpts, callback: function(id) { $('#backup-options-dialog').dialog('close'); var txt = $('#backup-options').val().trim(); if (txt.length > 0) txt += '\n'; var defaultvalue = ''; for(var o in data.Options) if (data.Options[o].Name == id) { defaultvalue = data.Options[o].DefaultValue; break; } txt += '--' + id + '=' + defaultvalue; $('#backup-options').val('').val(txt); $('#backup-options').focus(); }}); }, function() { }); }); $('#backup-options-dialog').on('configure', function(e, data) { $('#backup-options-dialog').empty(); var s = data.Options.sort(function(a, b){ if (a == null) return -1; if (b == null) return 1; if (a == null && b == null) return 0; if(a.Name < b.Name) return -1; if(a.Name > b.Name) return 1; return 0; }); //Fill with jQuery template $.tmpl($('#backup-option-template'), s).prependTo($('#backup-options-dialog')); $('#backup-options-dialog').find('.backup-option-link').click(function(e) { data.callback(e.target.id); }); $('#backup-options-dialog').find('.backup-option-long').each(function(i, e) { $(e).html(nl2br($(e).html())); }); }); var setStateModified = function() { if (EDIT_STATE != null) EDIT_STATE.dataModified = true; }; $('#edit-dialog-form').find('input').change(setStateModified); $('#edit-dialog-form').find('select').change(setStateModified); $('#edit-dialog-form').find('textarea').change(setStateModified); $('#use-scheduled-run').change(function() { if ($('#use-scheduled-run').is(':checked')) { $('#use-scheduled-run-details').show(); var dt = new Date(); dt.setHours(dt.getHours() + 1); dt.setMinutes(0); dt.setSeconds(0); if ($('#next-run-time').val() == '') { var h = dt.getHours() + ''; var m = dt.getMinutes() + ''; if (h.length == 1) h = '0' + h; if (m.length == 1) m = '0' + m; $('#next-run-time').val(h + ':' + m); } if ($('#next-run-date').val() == '') { var y = dt.getFullYear(); var d = dt.getDate() + ''; var m = (dt.getMonth() + 1) + ''; if (d.length == 1) d = '0' + d; if (m.length == 1) m = '0' + m; $('#next-run-date').val(y + '-' + m + '-' + d); } if ($('#repeat-run-number').val() == '' || $('#repeat-run-number').val() == undefined) { $('#repeat-run-number').val('1'); $('#repeat-run-multiplier').val('D'); $('#allow-day-mon').attr('checked', true); $('#allow-day-tue').attr('checked', true); $('#allow-day-wed').attr('checked', true); $('#allow-day-thu').attr('checked', true); $('#allow-day-fri').attr('checked', true); $('#allow-day-sat').attr('checked', true); $('#allow-day-sun').attr('checked', true); } } else { $('#use-scheduled-run-details').hide(); } }); });