aboutsummaryrefslogtreecommitdiffstats
path: root/options/options.coffee
blob: 640b66322121f44e6bad21c53d3a8b5dfbe38c98 (plain)
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
$ = (id) -> document.getElementById id

bgSettings = chrome.extension.getBackgroundPage().Settings

editableFields = [ "scrollStepSize", "excludedUrls", "linkHintCharacters",
  "userDefinedLinkHintCss", "keyMappings", "filterLinkHints", "previousPatterns",
  "nextPatterns", "hideHud", "regexFindMode", "searchUrl"]

canBeEmptyFields = ["excludedUrls", "keyMappings", "userDefinedLinkHintCss"]

postSaveHooks = keyMappings: (value) ->
  commands = chrome.extension.getBackgroundPage().Commands
  commands.clearKeyMappingsAndSetDefaults()
  commands.parseCustomKeyMappings value
  chrome.extension.getBackgroundPage().refreshCompletionKeysAfterMappingSave()

document.addEventListener "DOMContentLoaded", ->
  populateOptions()

  for field in editableFields
    $(field).addEventListener "keyup", onOptionKeyup, false
    $(field).addEventListener "change", enableSaveButton, false
    $(field).addEventListener "change", onDataLoaded, false

  $("advancedOptions").addEventListener "click", openAdvancedOptions, 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 = ->
  $("linkHintCharacters").readOnly = $("filterLinkHints").checked

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)
    if field.getAttribute("type") is "checkbox"
      fieldValue = field.checked
    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
    postSaveHooks[fieldName] fieldValue if postSaveHooks[fieldName]

  $("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 = ->
  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

openAdvancedOptions = (event) ->
  elements = document.getElementsByClassName("advancedOption")
  for element in elements
    element.style.display = (if (element.style.display is "table-row") then "none" else "table-row")
  showOrHideLink = $("advancedOptions")
  if showOrHideLink.innerHTML.match(/^Show/)?
    showOrHideLink.innerHTML = "Hide advanced options…"
  else
    showOrHideLink.innerHTML = "Show advanced options…"
  event.preventDefault()