- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / common / extensions / docs / examples / api / downloads / download_filename_controller / options.js
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 function Rule(data) {
6   var rules = document.getElementById('rules');
7   this.node = document.getElementById('rule-template').cloneNode(true);
8   this.node.id = 'rule' + (Rule.next_id++);
9   this.node.rule = this;
10   rules.appendChild(this.node);
11   this.node.hidden = false;
12
13   if (data) {
14     this.getElement('matcher').value = data.matcher;
15     this.getElement('match-param').value = data.match_param;
16     this.getElement('action').value = data.action;
17     this.getElement('action-js').value = data.action_js;
18     this.getElement('enabled').checked = data.enabled;
19   }
20
21   this.getElement('enabled-label').htmlFor = this.getElement('enabled').id =
22     this.node.id + '-enabled';
23
24   this.render();
25
26   this.getElement('matcher').onchange = storeRules;
27   this.getElement('match-param').onkeyup = storeRules;
28   this.getElement('action').onchange = storeRules;
29   this.getElement('action-js').onkeyup = storeRules;
30   this.getElement('enabled').onchange = storeRules;
31
32   var rule = this;
33   this.getElement('move-up').onclick = function() {
34     var sib = rule.node.previousSibling;
35     rule.node.parentNode.removeChild(rule.node);
36     sib.parentNode.insertBefore(rule.node, sib);
37     storeRules();
38   };
39   this.getElement('move-down').onclick = function() {
40     var parentNode = rule.node.parentNode;
41     var sib = rule.node.nextSibling.nextSibling;
42     parentNode.removeChild(rule.node);
43     if (sib) {
44       parentNode.insertBefore(rule.node, sib);
45     } else {
46       parentNode.appendChild(rule.node);
47     }
48     storeRules();
49   };
50   this.getElement('remove').onclick = function() {
51     rule.node.parentNode.removeChild(rule.node);
52     storeRules();
53   };
54   storeRules();
55 }
56
57 Rule.prototype.getElement = function(name) {
58   return document.querySelector('#' + this.node.id + ' .' + name);
59 }
60
61 Rule.prototype.render = function() {
62   this.getElement('move-up').disabled = !this.node.previousSibling;
63   this.getElement('move-down').disabled = !this.node.nextSibling;
64   this.getElement('action-js').style.display =
65     (this.getElement('action').value == 'js') ? 'block' : 'none';
66 }
67
68 Rule.next_id = 0;
69
70 function loadRules() {
71   var rules = localStorage.rules;
72   try {
73     JSON.parse(rules).forEach(function(rule) {new Rule(rule);});
74   } catch (e) {
75     localStorage.rules = JSON.stringify([]);
76   }
77 }
78
79 function storeRules() {
80   localStorage.rules = JSON.stringify(Array.prototype.slice.apply(
81       document.getElementById('rules').childNodes).map(function(node) {
82     node.rule.render();
83     return {matcher: node.rule.getElement('matcher').value,
84             match_param: node.rule.getElement('match-param').value,
85             action: node.rule.getElement('action').value,
86             action_js: node.rule.getElement('action-js').value,
87             enabled: node.rule.getElement('enabled').checked};
88   }));
89 }
90
91 window.onload = function() {
92   loadRules();
93   document.getElementById('new').onclick = function() {
94     new Rule();
95   };
96 }