2015-02-08 02:01:09 -05:00
|
|
|
var FFZ = window.FrankerFaceZ,
|
2015-08-04 01:43:08 -04:00
|
|
|
constants = require("./constants"),
|
2016-03-23 19:28:22 -04:00
|
|
|
utils = require("./utils"),
|
|
|
|
FileSaver = require("./FileSaver"),
|
2015-02-08 02:01:09 -05:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
createElement = document.createElement.bind(document),
|
2015-02-08 02:01:09 -05:00
|
|
|
|
|
|
|
make_ls = function(key) {
|
|
|
|
return "ffz_setting_" + key;
|
2015-02-24 00:33:29 -05:00
|
|
|
},
|
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
toggle_setting = function(swit, key, info) {
|
|
|
|
var val = !(info.get ? (typeof info.get === 'function' ? info.get.call(this) : this.settings.get(info.get)) : this.settings.get(key));
|
|
|
|
if ( typeof info.set === "function" )
|
|
|
|
info.set.call(this, val);
|
|
|
|
else
|
|
|
|
this.settings.set(info.set || key, val);
|
2015-08-04 01:43:08 -04:00
|
|
|
|
|
|
|
swit.classList.toggle('active', val);
|
|
|
|
},
|
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
option_setting = function(select, key, info) {
|
|
|
|
var val = JSON.parse(select.options[select.selectedIndex].value);
|
|
|
|
if ( typeof info.set === "function" )
|
|
|
|
info.set.call(this, val);
|
|
|
|
else
|
|
|
|
this.settings.set(info.set || key, val);
|
|
|
|
};
|
2015-02-08 02:01:09 -05:00
|
|
|
|
|
|
|
|
|
|
|
// --------------------
|
|
|
|
// Initializer
|
|
|
|
// --------------------
|
|
|
|
|
2015-08-04 01:43:08 -04:00
|
|
|
FFZ.settings_info = {
|
|
|
|
advanced_settings: { value: false, visible: false }
|
|
|
|
};
|
|
|
|
|
|
|
|
FFZ.basic_settings = {};
|
2015-02-08 02:01:09 -05:00
|
|
|
|
|
|
|
FFZ.prototype.load_settings = function() {
|
|
|
|
this.log("Loading settings.");
|
|
|
|
|
|
|
|
// Build a settings object.
|
|
|
|
this.settings = {};
|
|
|
|
|
2015-10-24 22:44:00 -04:00
|
|
|
// Helpers
|
|
|
|
this.settings.get = this._setting_get.bind(this);
|
|
|
|
this.settings.set = this._setting_set.bind(this);
|
|
|
|
this.settings.del = this._setting_del.bind(this);
|
|
|
|
this.settings.load = this._setting_load.bind(this);
|
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
var found_settings = false;
|
|
|
|
|
2015-02-08 02:01:09 -05:00
|
|
|
for(var key in FFZ.settings_info) {
|
2015-02-24 00:33:29 -05:00
|
|
|
if ( ! FFZ.settings_info.hasOwnProperty(key) )
|
|
|
|
continue;
|
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
var info = FFZ.settings_info[key],
|
|
|
|
ls_key = info && info.storage_key || make_ls(key);
|
|
|
|
|
|
|
|
found_settings = found_settings || localStorage.hasOwnProperty(key);
|
|
|
|
this._setting_load(key) || found_settings;
|
2015-02-08 02:01:09 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// Listen for Changes
|
2015-02-24 00:33:29 -05:00
|
|
|
window.addEventListener("storage", this._setting_update.bind(this), false);
|
2015-02-08 02:01:09 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-08-04 01:43:08 -04:00
|
|
|
// --------------------
|
|
|
|
// Backup and Restore
|
|
|
|
// --------------------
|
|
|
|
|
2015-10-17 18:05:44 -04:00
|
|
|
FFZ.prototype.reset_settings = function() {
|
|
|
|
if ( ! confirm(this.tr('Are you sure you wish to reset FrankerFaceZ?\n\nThis will force the tab to refresh.')) )
|
|
|
|
return;
|
|
|
|
|
|
|
|
// Clear Settings
|
|
|
|
for(var key in FFZ.settings_info) {
|
|
|
|
if ( ! FFZ.settings_info.hasOwnProperty(key) )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
this.settings.del(key);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Clear Aliases
|
|
|
|
this.aliases = {};
|
|
|
|
localStorage.ffz_aliases = '{}';
|
|
|
|
|
|
|
|
// TODO: Filters
|
|
|
|
|
|
|
|
// Refresh
|
|
|
|
window.location.reload();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
FFZ.prototype._get_settings_object = function() {
|
|
|
|
var data = {
|
2015-08-04 01:43:08 -04:00
|
|
|
version: 1,
|
|
|
|
script_version: FFZ.version_info + '',
|
|
|
|
aliases: this.aliases,
|
2015-10-17 18:05:44 -04:00
|
|
|
filters: this.filters,
|
2015-08-04 01:43:08 -04:00
|
|
|
settings: {}
|
|
|
|
};
|
|
|
|
|
|
|
|
for(var key in FFZ.settings_info) {
|
|
|
|
if ( ! FFZ.settings_info.hasOwnProperty(key) )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
var info = FFZ.settings_info[key],
|
|
|
|
ls_key = info.storage_key || make_ls(key);
|
|
|
|
|
|
|
|
if ( localStorage.hasOwnProperty(ls_key) )
|
|
|
|
data.settings[key] = this.settings[key];
|
|
|
|
}
|
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
return data;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FFZ.prototype.save_settings_file = function() {
|
|
|
|
var data = this._get_settings_object(),
|
|
|
|
blob = new Blob(
|
|
|
|
[JSON.stringify(data, null, 4)], {type: "application/json;charset=utf-8"});
|
|
|
|
|
2015-08-04 01:43:08 -04:00
|
|
|
FileSaver.saveAs(blob, "ffz-settings.json");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FFZ.prototype.load_settings_file = function(file) {
|
|
|
|
if ( typeof file === "string" )
|
|
|
|
this._load_settings_file(file);
|
|
|
|
else {
|
|
|
|
var reader = new FileReader(),
|
|
|
|
f = this;
|
|
|
|
|
|
|
|
reader.onload = function(e) { f._load_settings_file(e.target.result); }
|
|
|
|
reader.readAsText(file);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
FFZ.prototype._load_settings_file = function(data, hide_alert) {
|
|
|
|
if ( typeof data === "string" )
|
|
|
|
try {
|
|
|
|
data = JSON.parse(data);
|
|
|
|
} catch(err) {
|
|
|
|
this.error("Error Loading Settings: " + err);
|
|
|
|
if ( ! hide_alert )
|
|
|
|
alert("There was an error attempting to read the provided settings data.");
|
|
|
|
return [-1,-1,-1];
|
|
|
|
}
|
2015-08-04 01:43:08 -04:00
|
|
|
|
|
|
|
this.log("Loading Settings Data", data);
|
|
|
|
|
2015-10-17 18:05:44 -04:00
|
|
|
var skipped = [], applied = [],
|
|
|
|
aliases = 0;
|
2015-08-04 01:43:08 -04:00
|
|
|
|
|
|
|
if ( data.settings ) {
|
|
|
|
for(var key in data.settings) {
|
|
|
|
if ( ! FFZ.settings_info.hasOwnProperty(key) ) {
|
|
|
|
skipped.push(key);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
var info = FFZ.settings_info[key],
|
|
|
|
val = data.settings[key];
|
|
|
|
|
|
|
|
if ( info.process_value )
|
2016-03-23 19:28:22 -04:00
|
|
|
val = info.process_value.call(this, val);
|
2015-08-04 01:43:08 -04:00
|
|
|
|
|
|
|
if ( val !== this.settings.get(key) )
|
|
|
|
this.settings.set(key, val);
|
|
|
|
|
|
|
|
applied.push(key);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-10-17 18:05:44 -04:00
|
|
|
if ( data.aliases ) {
|
|
|
|
for(var key in data.aliases) {
|
|
|
|
if ( this.aliases[key] === data.aliases[key] )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
this.aliases[key] = data.aliases[key];
|
|
|
|
aliases++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( aliases )
|
|
|
|
localStorage.ffz_aliases = JSON.stringify(this.aliases);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( data.filters ) {
|
|
|
|
// TODO: Load filters!
|
|
|
|
}
|
|
|
|
|
2015-08-04 01:43:08 -04:00
|
|
|
// Do this in a timeout so that any styles have a moment to update.
|
2016-03-23 19:28:22 -04:00
|
|
|
if ( ! hide_alert )
|
|
|
|
setTimeout(function(){
|
|
|
|
alert('Successfully loaded ' + applied.length + ' settings and skipped ' + skipped.length + ' settings. Added ' + aliases + ' user nicknames.');
|
|
|
|
});
|
|
|
|
|
|
|
|
return [applied.length, skipped.length, aliases];
|
2015-08-04 01:43:08 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-02-24 00:33:29 -05:00
|
|
|
// --------------------
|
|
|
|
// Menu Page
|
|
|
|
// --------------------
|
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
var is_android = navigator.userAgent.indexOf('Android') !== -1,
|
|
|
|
settings_renderer = function(settings_data, collapsable, collapsed_key) {
|
|
|
|
return function(view, container) {
|
|
|
|
var f = this,
|
|
|
|
settings = {},
|
|
|
|
categories = [];
|
2015-10-17 18:05:44 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
for(var key in settings_data) {
|
|
|
|
var info = settings_data[key],
|
|
|
|
cat = info.category || "Miscellaneous",
|
|
|
|
cat_store = settings[cat];
|
2015-10-17 18:05:44 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
if ( info.hasOwnProperty('visible') ) {
|
|
|
|
var visible = info.visible;
|
|
|
|
if ( typeof visible === "function" )
|
|
|
|
visible = visible.call(this);
|
2015-10-17 18:05:44 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
if ( ! visible )
|
|
|
|
continue;
|
|
|
|
}
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
if ( is_android && info.no_mobile )
|
|
|
|
continue;
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
if ( ! cat_store ) {
|
|
|
|
categories.push(cat);
|
|
|
|
cat_store = settings[cat] = [];
|
|
|
|
}
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
cat_store.push([key, info]);
|
|
|
|
}
|
2015-02-24 00:33:29 -05:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
categories.sort(function(a,b) {
|
|
|
|
var a = a.toLowerCase(),
|
|
|
|
b = b.toLowerCase();
|
2015-02-24 00:33:29 -05:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
if ( a === "debugging" )
|
|
|
|
a = "zzz" + a;
|
2015-02-24 00:33:29 -05:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
if ( b === "debugging" )
|
|
|
|
b = "zzz" + b;
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
if ( a < b ) return -1;
|
|
|
|
else if ( a > b ) return 1;
|
|
|
|
return 0;
|
|
|
|
});
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
var current_category = (collapsed_key ? this[collapsed_key] : null) || categories[0];
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
for(var ci=0; ci < categories.length; ci++) {
|
|
|
|
var category = categories[ci],
|
|
|
|
cset = settings[category],
|
2015-02-24 00:33:29 -05:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
bttv_skipped = [],
|
|
|
|
added = 0,
|
2015-02-24 00:33:29 -05:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
menu = createElement('div'),
|
|
|
|
heading = createElement('div');
|
2015-08-04 01:43:08 -04:00
|
|
|
|
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
heading.className = 'heading';
|
|
|
|
menu.className = 'chat-menu-content';
|
|
|
|
menu.setAttribute('data-category', category);
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
if ( collapsable ) {
|
|
|
|
menu.classList.add('collapsable');
|
|
|
|
menu.classList.toggle('collapsed', current_category !== category);
|
|
|
|
menu.addEventListener('click', function() {
|
|
|
|
var t = this;
|
|
|
|
if ( ! t.classList.contains('collapsed') )
|
|
|
|
return;
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
jQuery(".chat-menu-content:not(.collapsed)", container).addClass("collapsed");
|
|
|
|
t.classList.remove('collapsed');
|
|
|
|
if ( collapsed_key )
|
|
|
|
f[collapsed_key] = t.getAttribute('data-category');
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
setTimeout(function(){t.scrollIntoViewIfNeeded()});
|
|
|
|
});
|
|
|
|
}
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
heading.innerHTML = category;
|
|
|
|
menu.appendChild(heading);
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
cset.sort(function(a,b) {
|
|
|
|
var a = a[1],
|
|
|
|
b = b[1],
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
at = 2, //a.type === "boolean" ? 1 : 2,
|
|
|
|
bt = 2, //b.type === "boolean" ? 1 : 2,
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
an = a.name.toLowerCase(),
|
|
|
|
bn = b.name.toLowerCase();
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
if ( at < bt ) return -1;
|
|
|
|
else if ( at > bt ) return 1;
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
else if ( an < bn ) return -1;
|
|
|
|
else if ( an > bn ) return 1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
});
|
|
|
|
|
|
|
|
for(var i=0; i < cset.length; i++) {
|
|
|
|
var key = cset[i][0],
|
|
|
|
info = cset[i][1],
|
|
|
|
el = createElement('p'),
|
|
|
|
val = info.get ? (typeof info.get === 'function' ? info.get.call(this) : this.settings.get(info.get)) : this.settings.get(key);
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
el.className = 'clearfix';
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
if ( this.has_bttv && info.no_bttv ) {
|
|
|
|
bttv_skipped.push([info.name, info.help]);
|
|
|
|
continue;
|
|
|
|
} else {
|
|
|
|
if ( info.type === "boolean" ) {
|
|
|
|
var swit = createElement('a'),
|
|
|
|
label = createElement('span');
|
2015-02-24 00:33:29 -05:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
swit.className = 'switch';
|
|
|
|
swit.classList.toggle('active', val);
|
|
|
|
swit.appendChild(createElement('span'))
|
2015-02-24 00:33:29 -05:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
label.className = 'switch-label';
|
|
|
|
label.innerHTML = info.name;
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
el.appendChild(swit);
|
|
|
|
el.appendChild(label);
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
swit.addEventListener('click', toggle_setting.bind(this, swit, key, info))
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
} else if ( info.type === "select" ) {
|
|
|
|
var select = createElement('select'),
|
|
|
|
label = createElement('span');
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
label.className = 'option-label';
|
|
|
|
label.innerHTML = info.name;
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
for(var ok in info.options) {
|
|
|
|
var op = createElement('option');
|
|
|
|
op.value = JSON.stringify(ok);
|
|
|
|
if ( val == ok )
|
|
|
|
op.setAttribute('selected', true);
|
|
|
|
op.innerHTML = info.options[ok];
|
|
|
|
select.appendChild(op);
|
|
|
|
}
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
select.addEventListener('change', option_setting.bind(this, select, key, info));
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
el.appendChild(label);
|
|
|
|
el.appendChild(select);
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
} else if ( typeof info.method === "function" ) {
|
|
|
|
el.classList.add("option");
|
|
|
|
var link = createElement('a');
|
|
|
|
link.innerHTML = info.name;
|
|
|
|
link.href = '#';
|
|
|
|
el.appendChild(link);
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
link.addEventListener('click', info.method.bind(this));
|
|
|
|
|
|
|
|
} else
|
|
|
|
continue;
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
if ( info.help || (this.has_bttv && info.warn_bttv) ) {
|
|
|
|
var help = document.createElement('span');
|
|
|
|
help.className = 'help';
|
|
|
|
help.innerHTML = (this.has_bttv && info.warn_bttv ? '<i>' + info.warn_bttv + (info.help ? '</i><br>' : '</i>') : '') + (info.help || "");
|
|
|
|
el.appendChild(help);
|
|
|
|
}
|
|
|
|
}
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
added++;
|
|
|
|
menu.appendChild(el);
|
|
|
|
}
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
if ( ! added )
|
|
|
|
continue;
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
if ( bttv_skipped.length ) {
|
|
|
|
var el = createElement('p'),
|
|
|
|
label = createElement('span'),
|
|
|
|
help = createElement('span');
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
el.className = 'bttv-incompatibility clearfix disabled';
|
|
|
|
label.className = 'switch-label';
|
|
|
|
label.innerHTML = "Features Incompatible with BetterTTV";
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
help.className = 'help';
|
|
|
|
for(var i=0; i < bttv_skipped.length; i++) {
|
|
|
|
var skipped = bttv_skipped[i];
|
|
|
|
help.innerHTML += (i > 0 ? ', ' : '') + '<b' + (skipped[1] ? ' class="html-tooltip" title="' + utils.quote_attr(skipped[1]) + '"' : '') + '>' + skipped[0] + '</b>';
|
|
|
|
}
|
2015-07-13 21:52:44 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
el.appendChild(label);
|
|
|
|
el.appendChild(help);
|
|
|
|
menu.appendChild(el);
|
2016-05-06 02:23:12 -04:00
|
|
|
//jQuery('.html-tooltip', el).tipsy({html: true, gravity: utils.tooltip_placement(2*constants.TOOLTIP_DISTANCE, 'n')});
|
|
|
|
//jQuery('.ffz-tooltip', el).tipsy({live: true, html: true, title: this.render_tooltip(), gravity: utils.tooltip_placement(2*constants.TOOLTIP_DISTANCE, 'n')});
|
2016-03-23 19:28:22 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
container.appendChild(menu);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
render_basic = settings_renderer(FFZ.basic_settings, false, '_ffz_basic_settings_page'),
|
|
|
|
render_advanced = settings_renderer(FFZ.settings_info, true, '_ffz_settings_page');
|
2015-02-24 00:33:29 -05:00
|
|
|
|
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
FFZ.menu_pages.settings = {
|
|
|
|
name: "Settings",
|
|
|
|
icon: constants.GEAR,
|
|
|
|
sort_order: 99999,
|
|
|
|
wide: true,
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
default_page: function() { return this.settings.advanced_settings ? 'advanced' : 'basic' },
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
pages: {
|
|
|
|
basic: {
|
|
|
|
name: "Basic",
|
|
|
|
sort_order: 1,
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
render: function(view, container) {
|
|
|
|
this.settings.set("advanced_settings", false);
|
|
|
|
return render_basic.call(this, view, container);
|
|
|
|
}
|
|
|
|
},
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
advanced: {
|
|
|
|
name: "Advanced",
|
|
|
|
sort_order: 2,
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
render: function(view, container) {
|
|
|
|
this.settings.set("advanced_settings", true);
|
|
|
|
return render_advanced.call(this, view, container);
|
|
|
|
}
|
|
|
|
},
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
backup: {
|
|
|
|
name: "Backup & Restore",
|
|
|
|
sort_order: 3,
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
render: function(view, container) {
|
|
|
|
var backup_head = createElement('div'),
|
|
|
|
restore_head = createElement('div'),
|
|
|
|
reset_head = createElement('div'),
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
backup_cont = createElement('div'),
|
|
|
|
restore_cont = createElement('div'),
|
|
|
|
reset_cont = createElement('div'),
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
backup_para = createElement('p'),
|
|
|
|
backup_link = createElement('a'),
|
|
|
|
backup_help = createElement('span'),
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
restore_para = createElement('p'),
|
|
|
|
restore_input = createElement('input'),
|
|
|
|
restore_link = createElement('a'),
|
|
|
|
restore_help = createElement('span'),
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
reset_para = createElement('p'),
|
|
|
|
reset_link = createElement('a'),
|
|
|
|
reset_help = createElement('span'),
|
|
|
|
f = this;
|
2015-08-04 01:43:08 -04:00
|
|
|
|
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
backup_cont.className = 'chat-menu-content';
|
|
|
|
backup_head.className = 'heading';
|
|
|
|
backup_head.innerHTML = 'Backup Settings';
|
|
|
|
backup_cont.appendChild(backup_head);
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
backup_para.className = 'clearfix option';
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
backup_link.href = '#';
|
|
|
|
backup_link.innerHTML = 'Save to File';
|
|
|
|
backup_link.addEventListener('click', this.save_settings_file.bind(this));
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
backup_help.className = 'help';
|
|
|
|
backup_help.innerHTML = 'This generates a JSON file containing all of your settings and prompts you to save it.';
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
backup_para.appendChild(backup_link);
|
|
|
|
backup_para.appendChild(backup_help);
|
|
|
|
backup_cont.appendChild(backup_para);
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
restore_cont.className = 'chat-menu-content';
|
|
|
|
restore_head.className = 'heading';
|
|
|
|
restore_head.innerHTML = 'Restore Settings';
|
|
|
|
restore_cont.appendChild(restore_head);
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
restore_para.className = 'clearfix option';
|
2015-02-24 00:33:29 -05:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
restore_input.type = 'file';
|
|
|
|
restore_input.addEventListener('change', function() { f.load_settings_file(this.files[0]); })
|
2015-02-24 00:33:29 -05:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
restore_link.href = '#';
|
|
|
|
restore_link.innerHTML = 'Restore from File';
|
|
|
|
restore_link.addEventListener('click', function(e) { e.preventDefault(); restore_input.click(); });
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
restore_help.className = 'help';
|
|
|
|
restore_help.innerHTML = 'This loads settings from a previously generated JSON file.';
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
restore_para.appendChild(restore_link);
|
|
|
|
restore_para.appendChild(restore_help);
|
|
|
|
restore_cont.appendChild(restore_para);
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
reset_cont.className = 'chat-menu-content';
|
|
|
|
reset_head.className = 'heading';
|
|
|
|
reset_head.innerHTML = this.tr('Reset Settings');
|
|
|
|
reset_cont.appendChild(reset_head);
|
2015-05-17 19:02:57 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
reset_para.className = 'clearfix option';
|
2015-02-24 00:33:29 -05:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
reset_link.href = '#';
|
|
|
|
reset_link.innerHTML = this.tr('Reset FrankerFaceZ');
|
|
|
|
reset_link.addEventListener('click', this.reset_settings.bind(this));
|
2015-02-24 00:33:29 -05:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
reset_help.className = 'help';
|
|
|
|
reset_help.innerHTML = this.tr('This resets all of your FFZ data. That includes chat filters, nicknames for users, and settings.');
|
2015-08-04 01:43:08 -04:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
reset_para.appendChild(reset_link);
|
|
|
|
reset_para.appendChild(reset_help);
|
|
|
|
reset_cont.appendChild(reset_para);
|
2015-02-24 00:33:29 -05:00
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
container.appendChild(backup_cont);
|
|
|
|
container.appendChild(restore_cont);
|
|
|
|
container.appendChild(reset_cont);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
2015-02-24 00:33:29 -05:00
|
|
|
|
|
|
|
|
2015-02-08 02:01:09 -05:00
|
|
|
// --------------------
|
|
|
|
// Tracking Updates
|
|
|
|
// --------------------
|
|
|
|
|
|
|
|
FFZ.prototype._setting_update = function(e) {
|
|
|
|
if ( ! e )
|
|
|
|
e = window.event;
|
|
|
|
|
|
|
|
if ( ! e.key || e.key.substr(0, 12) !== "ffz_setting_" )
|
|
|
|
return;
|
|
|
|
|
|
|
|
var ls_key = e.key,
|
|
|
|
key = ls_key.substr(12),
|
|
|
|
val = undefined,
|
|
|
|
info = FFZ.settings_info[key];
|
|
|
|
|
2015-02-24 00:33:29 -05:00
|
|
|
if ( ! info ) {
|
|
|
|
// Try iterating to find the key.
|
|
|
|
for(key in FFZ.settings_info) {
|
|
|
|
if ( ! FFZ.settings_info.hasOwnProperty(key) )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
info = FFZ.settings_info[key];
|
|
|
|
if ( info.storage_key == ls_key )
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Not us.
|
|
|
|
if ( info.storage_key != ls_key )
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-02-08 02:01:09 -05:00
|
|
|
this.log("Updated Setting: " + key);
|
|
|
|
|
|
|
|
try {
|
|
|
|
val = JSON.parse(e.newValue);
|
|
|
|
} catch(err) {
|
|
|
|
this.log('Error loading new value for "' + key + '": ' + err);
|
|
|
|
val = info.value || undefined;
|
|
|
|
}
|
|
|
|
|
2015-08-14 13:21:57 -04:00
|
|
|
if ( info.process_value )
|
|
|
|
try {
|
2016-03-23 19:28:22 -04:00
|
|
|
val = info.process_value.call(this, val);
|
2015-08-14 13:21:57 -04:00
|
|
|
} catch(err) {
|
|
|
|
this.log('Error processing value for setting "' + key + '": ' + err);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-02-08 02:01:09 -05:00
|
|
|
this.settings[key] = val;
|
|
|
|
if ( info.on_update )
|
|
|
|
try {
|
2016-03-23 19:28:22 -04:00
|
|
|
info.on_update.call(this, val, false);
|
2015-02-08 02:01:09 -05:00
|
|
|
} catch(err) {
|
|
|
|
this.log('Error running updater for setting "' + key + '": ' + err);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// --------------------
|
|
|
|
// Settings Access
|
|
|
|
// --------------------
|
|
|
|
|
2015-10-24 22:44:00 -04:00
|
|
|
FFZ.prototype._setting_load = function(key, default_value) {
|
|
|
|
var info = FFZ.settings_info[key],
|
|
|
|
ls_key = info && info.storage_key || make_ls(key),
|
|
|
|
val = default_value || (info && info.hasOwnProperty("value") ? info.value : undefined);
|
|
|
|
|
|
|
|
if ( localStorage.hasOwnProperty(ls_key) ) {
|
|
|
|
try {
|
|
|
|
val = JSON.parse(localStorage.getItem(ls_key));
|
|
|
|
} catch(err) {
|
|
|
|
this.log('Error loading value for "' + key + '": ' + err);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( info && info.process_value )
|
2016-03-23 19:28:22 -04:00
|
|
|
val = info.process_value.call(this, val);
|
2015-10-24 22:44:00 -04:00
|
|
|
|
|
|
|
this.settings[key] = val;
|
2015-10-27 14:25:13 -04:00
|
|
|
return val;
|
2015-10-24 22:44:00 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-02-08 02:01:09 -05:00
|
|
|
FFZ.prototype._setting_get = function(key) {
|
2015-10-27 14:25:13 -04:00
|
|
|
if ( ! this.settings.hasOwnProperty(key) && FFZ.settings_info[key] )
|
|
|
|
this._setting_load(key);
|
|
|
|
|
2015-02-08 02:01:09 -05:00
|
|
|
return this.settings[key];
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
FFZ.prototype._setting_set = function(key, val, suppress_log) {
|
2015-02-24 00:33:29 -05:00
|
|
|
var info = FFZ.settings_info[key],
|
2015-08-14 13:21:57 -04:00
|
|
|
ls_key = info.storage_key || make_ls(key);
|
|
|
|
|
|
|
|
if ( info.process_value )
|
|
|
|
try {
|
2016-03-23 19:28:22 -04:00
|
|
|
val = info.process_value.call(this, val)
|
2015-08-14 13:21:57 -04:00
|
|
|
} catch(err) {
|
|
|
|
this.log('Error processing value for setting "' + key + '": ' + err);
|
|
|
|
return false;
|
|
|
|
}
|
2015-02-08 02:01:09 -05:00
|
|
|
|
|
|
|
this.settings[key] = val;
|
2015-08-14 13:21:57 -04:00
|
|
|
|
|
|
|
var jval = JSON.stringify(val);
|
2015-02-08 02:01:09 -05:00
|
|
|
localStorage.setItem(ls_key, jval);
|
|
|
|
|
2016-03-23 19:28:22 -04:00
|
|
|
if ( ! suppress_log )
|
|
|
|
this.log('Changed Setting "' + key + '" to: ' + jval);
|
2015-02-08 02:01:09 -05:00
|
|
|
|
|
|
|
if ( info.on_update )
|
|
|
|
try {
|
2016-03-23 19:28:22 -04:00
|
|
|
info.on_update.call(this, val, true);
|
2015-02-08 02:01:09 -05:00
|
|
|
} catch(err) {
|
|
|
|
this.log('Error running updater for setting "' + key + '": ' + err);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FFZ.prototype._setting_del = function(key) {
|
2015-02-24 00:33:29 -05:00
|
|
|
var info = FFZ.settings_info[key],
|
|
|
|
ls_key = info.storage_key || make_ls(key),
|
2015-02-08 02:01:09 -05:00
|
|
|
val = undefined;
|
|
|
|
|
|
|
|
if ( localStorage.hasOwnProperty(ls_key) )
|
|
|
|
localStorage.removeItem(ls_key);
|
|
|
|
|
|
|
|
if ( info )
|
|
|
|
val = this.settings[key] = info.hasOwnProperty("value") ? info.value : undefined;
|
|
|
|
|
2015-10-17 18:05:44 -04:00
|
|
|
this.settings[key] = val;
|
|
|
|
|
2015-02-08 02:01:09 -05:00
|
|
|
if ( info.on_update )
|
|
|
|
try {
|
2016-03-23 19:28:22 -04:00
|
|
|
info.on_update.call(this, val, true);
|
2015-02-08 02:01:09 -05:00
|
|
|
} catch(err) {
|
|
|
|
this.log('Error running updater for setting "' + key + '": ' + err);
|
|
|
|
}
|
|
|
|
}
|