') {
try{
var xmlDoc = xmlParser.parseFromString(xmlString,'text/xml');
var xmlSettings = xmlDoc.getElementsByTagName('setting');
for (var i = 0; i < xmlSettings.length; i++) {
settings[xmlSettings[i].getAttribute('name').trim()] = xmlSettings[i].textContent.trim();
}
}
catch (err) {
alertModal(SC.res['Extension.EditAppConfig.InvalidAppConfigXML'] + '\n\n' + err);
settings = {};
}
}
}
var masks = defaults.DEFAULTS.SCBitmaskDefaults;
var usingCustomDefaults = false;
if (extensionContext.settingValues.AppConfigDefaultsCode !== ''){
var newDefaults = {};
try {
if (extensionContext.settingValues.AppConfigDefaultsCode.startsWith('{') && extensionContext.settingValues.AppConfigDefaultsCode.endsWith('}'))
newDefaults = JSON.parse(extensionContext.settingValues.AppConfigDefaultsCode);
else
newDefaults = JSON.parse(atob(extensionContext.settingValues.AppConfigDefaultsCode));
} catch (err) {
alertModal(SC.res['Extension.EditAppConfig.InvalidDefaultsCode'] + '\n\n' + err);
}; // This semicolon is NOT un-necessary... Javascript Try/Catch won't run the catch code in some browsers without it.
for (var key in newDefaults) {
if (key=='DEFAULTS') continue;
defaults[key] = newDefaults[key];
}
if ('DEFAULTS' in newDefaults) {
for (var mask in newDefaults.DEFAULTS.SCBitmaskDefaults) {
masks[mask] = newDefaults.DEFAULTS.SCBitmaskDefaults[mask];
}
}
if (Object.keys(newDefaults).length)
usingCustomDefaults = true;
}
var enableAdvancedBitmaskEditor = extensionContext.settingValues.UseEasyBitmaskEditor == 'true';
var enableCommandsSelector = extensionContext.settingValues.UseCommandsSelector == 'true';
var instructions = SC.res['Extension.EditAppConfig.DialogInstructions'] + (usingCustomDefaults ? '\n' + SC.res['Extension.EditAppConfig.CustomDefaultsInstructionNote'] : '');
SC.dialog.showModalButtonDialog(
'EditAppConfigSettings',
SC.res['Extension.EditAppConfig.DialogTitle'],
SC.res['Extension.EditAppConfig.DialogButtonText'],
'Default',
function (container) {
SC.ui.addElement(container, 'P', instructions);
var AppConfigLinksContainer = SC.ui.addElement(container, 'ul',{});
var AppConfigHelpLink = SC.ui.createElement('A',{href:SC.res['Extension.EditAppConfig.AppConfigSettingsLinkHref'],target:'_blank', _innerText:SC.res['Extension.EditAppConfig.AppConfigSettingsLinkText']});
var AppConfigMacHelpLink = SC.ui.createElement('A',{href:SC.res['Extension.EditAppConfig.AppConfigSettingsLinkHrefForMac'],target:'_blank', _innerText:SC.res['Extension.EditAppConfig.AppConfigSettingsLinkTextMacLinux']});
var AppConfigDownloadLink = SC.ui.createElement('A',{download:'app.config',href:dataUri,_innerText:SC.res['Extension.EditAppConfig.AppConfigLinkText']});
SC.ui.setDisabled(AppConfigDownloadLink,AppConfigContents === null);
var AppConfigDeleteLink = SC.command.queryAndCreateCommandButtons('resetbutton_' + extensionId);
var AppConfigRestoreLink = SC.command.queryAndCreateCommandButtons('restorebutton_' + extensionId);
SC.ui.addElement(AppConfigLinksContainer,'li',AppConfigDownloadLink);
SC.ui.addElement(AppConfigLinksContainer,'li',AppConfigHelpLink);
if (checkVersion("6.1",serverVersion)) // Mac settings only available on 6.1, so only show the help link on 6.1+
SC.ui.addElement(AppConfigLinksContainer,'li',AppConfigMacHelpLink);
SC.ui.addElement(AppConfigLinksContainer,'li',AppConfigDeleteLink);
SC.ui.addElement(AppConfigLinksContainer,'li',AppConfigRestoreLink);
var AppConfigTablesContainer = SC.ui.addElement(container, 'div',{className:'AppConfigTablesContainer'});
var flagsTable = SC.ui.createElement('TABLE',{id:'AppConfigFlags',className:'AppConfigFlagsTable'});
var flagsTableHead = SC.ui.addElement(flagsTable,'THEAD',{});
var flagsHeaderRow = SC.ui.addElement(flagsTableHead,'tr', {});
SC.ui.addElement(flagsHeaderRow,'th',{_innerText:SC.res['Extension.EditAppConfig.FlagColumnTitle']});
var flagsTableBody = SC.ui.addElement(flagsTable,'TBODY',{});
var settingsTable = SC.ui.createElement('TABLE',{id:'AppConfigSettings',className:'AppConfigSettingsTable'});
var settingsTableHead = SC.ui.addElement(settingsTable,'THEAD',{});
var settingsHeaderRow = SC.ui.addElement(settingsTableHead,'tr', {});
SC.ui.addElement(settingsHeaderRow,'th',{_innerText:SC.res['Extension.EditAppConfig.KeyColumnTitle']});
SC.ui.addElement(settingsHeaderRow,'th',{_innerText:SC.res['Extension.EditAppConfig.ValueColumnTitle']});
var settingsTableBody = SC.ui.addElement(settingsTable,'TBODY',{});
var bitmasksTable = SC.ui.createElement('TABLE',{id:'AppConfigBitmasks',className:'AppConfigBitmasksTable'});
var bitmasksTableHead = SC.ui.addElement(bitmasksTable,'THEAD',{});
var bitmasksHeaderRow = SC.ui.addElement(bitmasksTableHead,'tr', {});
SC.ui.addElement(bitmasksHeaderRow,'th',{_innerText:SC.res['Extension.EditAppConfig.BitmaskColumnTitle']});
var bitmasksTableBody = SC.ui.addElement(bitmasksTable,'TBODY',{});
SC.ui.addElement(AppConfigTablesContainer,'div',flagsTable);
SC.ui.addElement(AppConfigTablesContainer,'div',settingsTable);
SC.ui.addElement(AppConfigTablesContainer,'div',bitmasksTable);
var settingNum = 0;
for (var key in defaults) {
if (key == 'DEFAULTS' || !checkVersion(defaults[key].ver,serverVersion)) { continue; }
if (defaults[key].removed && checkVersion(defaults[key].removed,serverVersion)) { continue; }
var keyDV = getValueSetForMaxVersion(defaults[key].dv,serverVersion);
var keyValue = (key in settings && !eventArgs.loadDefaults) ? settings[key] : keyDV;
var keyType = defaults[key].type;
var keyValueEditor = '';
var valueTip = SC.util.formatString(SC.res['Extension.EditAppConfig.CurrentValueString'],keyValue) + '\n' + SC.util.formatString(SC.res['Extension.EditAppConfig.DefaultValueString'],keyDV);
var keySide = defaults[key].side;
var keySideText = '';
switch(keySide){
case 'Guest':
keySideText = SC.util.formatString(SC.res['Extension.EditAppConfig.AppliesTo.Format'],
SC.res['Extension.EditAppConfig.AppliesTo.GuestText']) + '\n';
break;
case 'Host':
keySideText = SC.util.formatString(SC.res['Extension.EditAppConfig.AppliesTo.Format'],
SC.res['Extension.EditAppConfig.AppliesTo.HostText']) + '\n';
break;
case 'Host and Guest':
keySideText = SC.util.formatString(SC.res['Extension.EditAppConfig.AppliesTo.Format'],
SC.res['Extension.EditAppConfig.AppliesTo.BothText']) + '\n';
break;
}
var keyTip = defaults[key].tip + '\n' + keySideText + valueTip;
var row = SC.ui.createElement('tr', {id:key + 'Row'});
switch (keyType) {
case 'flag':
SC.ui.addContent(flagsTableBody,row);
break;
case 'bitmask':
SC.ui.addContent(bitmasksTableBody,row);
break;
default:
SC.ui.addContent(settingsTableBody,row);
break;
}
settingNum++;
switch (keyType) {
case 'flag':
keyValueEditor = SC.ui.createElement('INPUT',{type:'checkbox',id:key,keyType:'flag',title:valueTip});
if (keyValue == 'true')
keyValueEditor.checked = true;
var flagLabel = SC.ui.createElement('LABEL',{_innerText:key,title:keyTip});
if (keyDV == 'true') {
flagLabel.style.fontWeight = 'bold';
}
SC.ui.addElement(row,'td',keyValueEditor,' ',flagLabel);
break;
case 'commands':
if (enableCommandsSelector) {
keyValueEditor = SC.ui.createElement('SELECT',{id:key,keyType:'commands',className:'appConfigCommandsSelect',multiple:'true',title:valueTip,size:'10'});
for (var each in defaults[key].commands){
if (!checkVersion(defaults[key].commands[each].ver,serverVersion)) { continue; }
if (defaults[key].commands[each].removed && checkVersion(defaults[key].commands[each].removed,serverVersion)) { continue; }
var commandOption = SC.ui.createElement('OPTION',{value:each,text:each,title:defaults[key].commands[each].tip});
commandOption.onmousedown = clickToSelect;
commandOption.onmousemove = disableMouseMoveUnselect;
if (keyValue.match(new RegExp('(?:^|,)'+each+'(?:,|$)'))) {
commandOption.selected = true;
}
if (keyDV.match(new RegExp('(?:^|,)'+each+'(?:,|$)'))) {
commandOption.style.fontWeight = 'bold';
}
keyValueEditor.add(commandOption);
}
} else {
keyValueEditor = SC.ui.createElement('INPUT',{id:key,keyType:'commands',type:'text',value:keyValue,_innerText:keyValue,title:valueTip});
}
SC.ui.addElement(row,'td', SC.ui.createElement('LABEL',{_innerText:key,title:keyTip}));
var ele = SC.ui.addElement(row,'td',keyValueEditor);
ele.order = settingNum;
break;
case 'directory':
keyValueEditor = SC.ui.createElement('INPUT',{id:key,keyType:'directory',className:'appConfigDirectoryInput',type:'text',value:keyValue,_innerText:keyValue,title:valueTip});
SC.ui.addElement(row,'td', SC.ui.createElement('LABEL',{_innerText:key,title:keyTip}));
var ele = SC.ui.addElement(row,'td',keyValueEditor);
ele.order = settingNum;
break;
case 'bitmask':
if (enableAdvancedBitmaskEditor) {
keyValueEditor = SC.ui.createElement('ul',{id:key,keyType:'bitmask',value:keyValue, className:'appConfigBitmaskValue',title:valueTip});
for (var mask in masks){
if (!checkVersion(masks[mask].ver,serverVersion)) { continue; }
if (masks[mask].removed && checkVersion(masks[mask].removed,serverVersion)) { continue; }
var varCheck = SC.ui.createElement('INPUT',{type:'checkbox',id:key + mask,mask:mask,initChecked:false,keyType:'bitmask',className:'appConfigBitmaskValue',title:masks[mask].tip});
var bitMaskChecked = false;
if (checkLongBitmask(keyValue,masks[mask].mask)){
varCheck.checked = true;
varCheck.initChecked = true;
bitMaskChecked = true;
}
var bitmaskLabel = SC.ui.createElement('LABEL',{_innerText:mask,className:'appConfigBitmaskValue',title:masks[mask].tip});
if (checkLongBitmask(keyDV,masks[mask].mask)){
bitmaskLabel.style.fontWeight = 'bold';
}
SC.ui.addElement(keyValueEditor,'li',varCheck,bitmaskLabel);
}
SC.ui.addElement(row,'td', SC.ui.createElement('LABEL',{_innerText:key,title:keyTip,className:'appConfigBitmaskLabel'}),keyValueEditor);
} else {
keyValueEditor = SC.ui.createElement('INPUT',{id:key,keyType:'bitmask',type:'text',value:keyValue,_innerText:keyValue,title:valueTip});
SC.ui.addElement(row,'td', SC.ui.createElement('LABEL',{_innerText:key,title:keyTip}), SC.ui.createElement('BR',{}), keyValueEditor);
}
break;
case 'selection':
keyValueEditor = SC.ui.createElement('SELECT',{id:key,keyType:'selection',title:valueTip});
var maxOptVer = '0';
for (var oset in defaults[key].options){
if (checkVersion(oset,serverVersion) && checkVersion(maxOptVer,oset)) {
maxOptVer = oset;
}
}
if (maxOptVer == '0') { continue; }
for (var opt in defaults[key].options[maxOptVer]){
var selectionOption = SC.ui.createElement('OPTION',{id:key+'-'+opt,value:defaults[key].options[maxOptVer][opt],text:opt});
if (selectionOption.id == key + '-' + keyValue){
selectionOption.selected = true;
}
keyValueEditor.add(selectionOption);
}
SC.ui.addElement(row,'td', SC.ui.createElement('LABEL',{_innerText:key,title:keyTip}));
var ele = SC.ui.addElement(row,'td',keyValueEditor);
ele.order = settingNum;
break;
case 'number':
keyValueEditor = SC.ui.createElement('INPUT',{id:key,keyType:'number',type:'number',value:keyValue,_innerText:keyValue,title:valueTip});
for (var cset in defaults[key].constraints) {
if (!checkVersion(cset,serverVersion)) { continue; }
for (var constraint in defaults[key].constraints[cset]) {
keyValueEditor[constraint] = defaults[key].constraints[cset][constraint];
}
}
SC.ui.addElement(row,'td', SC.ui.createElement('LABEL',{_innerText:key,title:keyTip}));
var ele = SC.ui.addElement(row,'td',keyValueEditor);
ele.order = settingNum;
break;
case 'string':
default:
keyValueEditor = SC.ui.createElement('INPUT',{id:key,keyType:'text',type:'text',value:keyValue,_innerText:keyValue,title:valueTip});
SC.ui.addElement(row,'td', SC.ui.createElement('LABEL',{_innerText:key,title:keyTip}));
var ele = SC.ui.addElement(row,'td',keyValueEditor);
ele.order = settingNum;
}
if (keyType != 'flag') {
keyValueEditor.className += keyValueEditor.className ? ' AppConfigKeyValueEditor' : 'AppConfigKeyValueEditor';
}
}
},
function (eventArgs) {
if (eventArgs.commandName == 'resetcommand_' + extensionId){
SC.event.dispatchEvent('','executecommand',{commandName:'command_' + extensionId,loadDefaults:true});
return;
}
if (eventArgs.commandName == 'restorecommand_' + extensionId){
SC.event.dispatchEvent('','executecommand',{commandName:'command_' + extensionId});
return;
}
var jsObj = {};
var bitmaskRegex = new RegExp(/(^0x[0-7]{16}$)/);
var scBitmaskMaxValidValue = getValueSetForMaxVersion(defaults.ControlPanelIDs.dv,serverVersion);
var invalidSettings = false;
var invalidSettingList = [];
var nonstandardSettings = false;
var nonstandardSettingList = [];
for (var key in defaults){
if (key == 'DEFAULTS' || $(key) === null || !checkVersion(defaults[key].ver,serverVersion)) { continue; }
var newValue = $(key).value;
var defaultValue = getValueSetForMaxVersion(defaults[key].dv,serverVersion);;
var oldValue = (key in settings) ? settings[key] : defaultValue;
var saveValue = oldValue;
var keyType = $(key).keyType;
switch (keyType){
case 'flag':
if ($(key).checked) {
saveValue = 'true';
} else {
saveValue = 'false';
}
if (saveValue == defaultValue)
continue;
break;
case 'commands':
if (enableCommandsSelector) {
saveValue = '';
for (var i = 0; i < $(key).length; i++) {
if ($(key).options[i].selected) {
if (saveValue !== ''){
saveValue = saveValue + ',';
}
saveValue = saveValue + $(key).options[i].value;
}
}
} else {
saveValue = newValue.replace(/[^\w\s]/gi, ',').replace(/\s/gi,'');
}
break;
case 'bitmask':
if (enableAdvancedBitmaskEditor) { // 'checkboxes' or 'true'
var keyCheckboxCollection = $(key).getElementsByTagName('INPUT');
for (var x=0; x