1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
$ = (id) -> document.getElementById id
bgSettings = chrome.extension.getBackgroundPage().Settings
editableFields = [ "scrollStepSize", "excludedUrls", "linkHintCharacters", "linkHintNumbers",
"userDefinedLinkHintCss", "keyMappings", "filterLinkHints", "previousPatterns",
"nextPatterns", "hideHud", "regexFindMode", "searchUrl", "searchEngines"]
canBeEmptyFields = ["excludedUrls", "keyMappings", "userDefinedLinkHintCss", "searchEngines"]
document.addEventListener "DOMContentLoaded", ->
populateOptions()
for field in editableFields
$(field).addEventListener "keyup", onOptionKeyup, false
$(field).addEventListener "change", enableSaveButton, false
$(field).addEventListener "change", onDataLoaded, false
$("advancedOptionsLink").addEventListener "click", toggleAdvancedOptions, false
$("showCommands").addEventListener "click", (->
showHelpDialog chrome.extension.getBackgroundPage().helpDialogHtml(true, true, "Command Listing"), frameId
), false
document.getElementById("restoreSettings").addEventListener "click", restoreToDefaults
document.getElementById("saveOptions").addEventListener "click", saveOptions
window.onbeforeunload = -> "You have unsaved changes to options." unless $("saveOptions").disabled
onOptionKeyup = (event) ->
if (event.target.getAttribute("type") isnt "checkbox" and
event.target.getAttribute("savedValue") isnt event.target.value)
enableSaveButton()
onDataLoaded = ->
hide = (el) -> el.parentNode.parentNode.style.display = "none"
show = (el) -> el.parentNode.parentNode.style.display = "table-row"
if $("filterLinkHints").checked
hide $("linkHintCharacters")
show $("linkHintNumbers")
else
show $("linkHintCharacters")
hide $("linkHintNumbers")
enableSaveButton = ->
$("saveOptions").removeAttribute "disabled"
# Saves options to localStorage.
saveOptions = ->
# If the value is unchanged from the default, delete the preference from localStorage; this gives us
# the freedom to change the defaults in the future.
for fieldName in editableFields
field = $(fieldName)
switch field.getAttribute("type")
when "checkbox"
fieldValue = field.checked
when "number"
fieldValue = parseFloat field.value
else
fieldValue = field.value.trim()
field.value = fieldValue
# If it's empty and not a field that we allow to be empty, restore to the default value
if not fieldValue and canBeEmptyFields.indexOf(fieldName) is -1
bgSettings.clear fieldName
fieldValue = bgSettings.get(fieldName)
else
bgSettings.set fieldName, fieldValue
$(fieldName).value = fieldValue
$(fieldName).setAttribute "savedValue", fieldValue
bgSettings.performPostUpdateHook fieldName, fieldValue
$("saveOptions").disabled = true
# Restores select box state to saved value from localStorage.
populateOptions = ->
for field in editableFields
val = bgSettings.get(field) or ""
setFieldValue $(field), val
onDataLoaded()
restoreToDefaults = ->
return unless confirm "Are you sure you want to return Vimium's settings to their defaults?"
for field in editableFields
val = bgSettings.defaults[field] or ""
setFieldValue $(field), val
onDataLoaded()
enableSaveButton()
setFieldValue = (field, value) ->
unless field.getAttribute("type") is "checkbox"
field.value = value
field.setAttribute "savedValue", value
else
field.checked = value
toggleAdvancedOptions = do (advancedMode=false) -> (event) ->
if advancedMode
$("advancedOptions").style.display = "none"
$("advancedOptionsLink").innerHTML = "Show advanced options…"
else
$("advancedOptions").style.display = "table-row-group"
$("advancedOptionsLink").innerHTML = "Hide advanced options"
advancedMode = !advancedMode
event.preventDefault()
|