Blame view

static/admin/js/SelectBox.js 4.12 KB
831eac332   zhuzhenchao   add file
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
106
107
108
109
110
111
112
113
114
  var SelectBox = {
      cache: new Object(),
      init: function(id) {
          var box = document.getElementById(id);
          var node;
          SelectBox.cache[id] = new Array();
          var cache = SelectBox.cache[id];
          for (var i = 0; (node = box.options[i]); i++) {
              cache.push({value: node.value, text: node.text, displayed: 1});
          }
      },
      redisplay: function(id) {
          // Repopulate HTML select box from cache
          var box = document.getElementById(id);
          box.options.length = 0; // clear all options
          for (var i = 0, j = SelectBox.cache[id].length; i < j; i++) {
              var node = SelectBox.cache[id][i];
              if (node.displayed) {
                  var new_option = new Option(node.text, node.value, false, false);
                  // Shows a tooltip when hovering over the option
                  new_option.setAttribute("title", node.text);
                  box.options[box.options.length] = new_option;
              }
          }
      },
      filter: function(id, text) {
          // Redisplay the HTML select box, displaying only the choices containing ALL
          // the words in text. (It's an AND search.)
          var tokens = text.toLowerCase().split(/\s+/);
          var node, token;
          for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
              node.displayed = 1;
              for (var j = 0; (token = tokens[j]); j++) {
                  if (node.text.toLowerCase().indexOf(token) == -1) {
                      node.displayed = 0;
                  }
              }
          }
          SelectBox.redisplay(id);
      },
      delete_from_cache: function(id, value) {
          var node, delete_index = null;
          for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
              if (node.value == value) {
                  delete_index = i;
                  break;
              }
          }
          var j = SelectBox.cache[id].length - 1;
          for (var i = delete_index; i < j; i++) {
              SelectBox.cache[id][i] = SelectBox.cache[id][i+1];
          }
          SelectBox.cache[id].length--;
      },
      add_to_cache: function(id, option) {
          SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1});
      },
      cache_contains: function(id, value) {
          // Check if an item is contained in the cache
          var node;
          for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
              if (node.value == value) {
                  return true;
              }
          }
          return false;
      },
      move: function(from, to) {
          var from_box = document.getElementById(from);
          var to_box = document.getElementById(to);
          var option;
          for (var i = 0; (option = from_box.options[i]); i++) {
              if (option.selected && SelectBox.cache_contains(from, option.value)) {
                  SelectBox.add_to_cache(to, {value: option.value, text: option.text, displayed: 1});
                  SelectBox.delete_from_cache(from, option.value);
              }
          }
          SelectBox.redisplay(from);
          SelectBox.redisplay(to);
      },
      move_all: function(from, to) {
          var from_box = document.getElementById(from);
          var to_box = document.getElementById(to);
          var option;
          for (var i = 0; (option = from_box.options[i]); i++) {
              if (SelectBox.cache_contains(from, option.value)) {
                  SelectBox.add_to_cache(to, {value: option.value, text: option.text, displayed: 1});
                  SelectBox.delete_from_cache(from, option.value);
              }
          }
          SelectBox.redisplay(from);
          SelectBox.redisplay(to);
      },
      sort: function(id) {
          SelectBox.cache[id].sort( function(a, b) {
              a = a.text.toLowerCase();
              b = b.text.toLowerCase();
              try {
                  if (a > b) return 1;
                  if (a < b) return -1;
              }
              catch (e) {
                  // silently fail on IE 'unknown' exception
              }
              return 0;
          } );
      },
      select_all: function(id) {
          var box = document.getElementById(id);
          for (var i = 0; i < box.options.length; i++) {
              box.options[i].selected = 'selected';
          }
      }
  }