Adjust call list to be scrollable
[infodrom/phone] / phone.js
1 var menu_list = {
2     'title': 'Calls',
3     'items': [{'name': 'Archive', 'callback': menu_list_archive},
4               {'name': 'Edit', 'callback': menu_list_edit},
5               {'name': 'Delete', 'callback': menu_list_delete},
6               {'name': 'Cancel', 'type': 'hide'}]
7 };
8
9 var hover_color = '#c9e5ff';
10
11 function page_init()
12 {
13     var frame = document.getElementById('phonecall');
14     frame.src = '';
15     fetch_incoming();
16     fetch_archive();
17 }
18
19 function reload()
20 {
21     fetch_incoming();
22     fetch_archive();
23 }
24
25 function remove_children(obj)
26 {
27     while (obj.childNodes.length > 0)
28         obj.removeChild(obj.childNodes[0]);
29 }
30
31 function fetch_incoming_callback(data)
32 {
33     var calls = document.getElementById('incoming_calls');
34     var div = document.getElementById('incoming');
35
36     remove_children(calls);
37
38     if (data.incoming.length > 0) {
39         div.style.display = '';
40
41         for (var i=0; i < data.incoming.length; i++) {
42             var elem = document.createElement('li');
43             var text = data.incoming[i].date + ', ';
44             if (data.incoming[i].name == '*** Unknown ***' && data.incoming[i].number != '0')
45                 text += data.incoming[i].number;
46             else
47                 text += data.incoming[i].name;
48             text += ', ' + data.incoming[i].length;
49
50             elem.innerHTML = text;
51             elem.payload = new Array();
52             elem.payload['dir'] = 'incoming';
53             elem.payload['call'] = data.incoming[i].fname;
54             if (data.incoming[i].read == undefined)
55                 elem.className = 'new';
56             if (data.incoming[i].note.length)
57                 elem.title = data.incoming[i].note;
58             elem.onclick = play_message;
59             elem.oncontextmenu = list_context;
60             calls.appendChild(elem);
61         }
62     } else {
63         div.style.display = 'none';
64     }
65 }
66
67 function fetch_incoming()
68 {
69     ajax_request('incoming', '', fetch_incoming_callback);
70 }
71
72 function fetch_archive_callback(data)
73 {
74     var calls = document.getElementById('archive_calls');
75     var div = document.getElementById('archive');
76
77     remove_children(calls);
78
79     if (data.archive.length > 0) {
80         div.style.display = '';
81
82         for (var i=0; i < data.archive.length; i++) {
83             var elem = document.createElement('li');
84             var text = data.archive[i].date + ', ';
85             if (data.archive[i].name == '*** Unknown ***' && data.archive[i].number != '0')
86                 text += data.archive[i].number;
87             else
88                 text += data.archive[i].name;
89             text += ', ' + data.archive[i].length;
90
91             elem.innerHTML = text;
92             elem.payload = new Array();
93             elem.payload['dir'] = 'archive';
94             elem.payload['call'] = data.archive[i].fname;
95             if (data.archive[i].note.length)
96                 elem.title = data.archive[i].note;
97             elem.onclick = play_message;
98             elem.oncontextmenu = list_context;
99             calls.appendChild(elem);
100         }
101     } else {
102         div.style.display = 'none';
103     }
104 }
105
106 function fetch_archive()
107 {
108     ajax_request('archive', '', fetch_archive_callback);
109 }
110
111 function play_message_callback(data)
112 {
113     var speaker = document.getElementById('callspeaker');
114     var date = document.getElementById('calldate');
115     var note = document.getElementById('callnote');
116
117     if (data.dir == 'messages') {
118         date.innerHTML = '&nbsp;';
119         speaker.innerHTML = 'Message ' + data.call;
120         note.innerHTML = '';
121         return;
122     }
123
124     var text = data.name;
125     if (data.number != '0') text += ' (' + data.number + ')';
126     speaker.innerHTML = text;
127     date.innerHTML = data.date + ', ' + data.length;
128     note.innerHTML = data.note;
129 }
130
131 function play_message(event)
132 {
133     var frame = document.getElementById('phonecall');
134     var params = 'dir='+event.originalTarget.payload['dir']+'&call='+event.originalTarget.payload['call'];
135
136     ajax_request('callinfo', params, play_message_callback);
137     frame.src = 'index.php?'+params;
138     event.originalTarget.className = '';
139 }
140
141 function save_callback(data)
142 {
143     field = document.getElementById('edit_status');
144     field.innerHTML = 'Call saved';
145 }
146
147 function save()
148 {
149     var dir = document.getElementById('edit_dir');
150     var call = document.getElementById('edit_call');
151     var name = document.getElementById('edit_name');
152     var note = document.getElementById('edit_note');
153     var params = 'dir=' + dir.value + '&call=' + call.value;
154     params += '&name=' + name.value + '&note=' + note.value;
155
156     ajax_request('save', params, save_callback);
157 }
158
159 function list_context(e)
160 {
161     var target = e.target;
162     target.style.backgroundColor = hover_color;
163
164     var menu = document.getElementById('menu_list');
165     if (!menu)
166         menu = menu_create('menu_list', menu_list);
167
168     menu.style.left = e.pageX - 40;
169     menu.style.top = e.pageY - 15;
170     menu.style.display = '';
171     menu.payload = new Array();
172     menu.payload['dir'] = e.target.payload['dir'];
173     menu.payload['call'] = e.target.payload['call'];
174     menu.payload['row'] = target;
175
176     return false;
177 }
178
179 function menu_list_archive_callback(data)
180 {
181     fetch_incoming();
182     fetch_archive();
183 }
184
185 function menu_list_edit_callback(data)
186 {
187     var fields = ['name','note','dir','call'];
188     var field;
189
190     for (var i=0; i < fields.length; i++) {
191         field = document.getElementById('edit_' + fields[i]);
192         field.value = data[fields[i]];
193     }
194
195     fields = ['name','note'];
196     for (var i=0; i < fields.length; i++) {
197         field = document.getElementById('edit_' + fields[i]);
198         field.innerHTML = data[fields[i]];
199     }
200
201     field = document.getElementById('edit_date');
202     field.innerHTML = data.date + ', ' + data.length;
203     field = document.getElementById('edit_status');
204     field.innerHTML = '';
205 }
206
207 function menu_list_archive(e)
208 {
209     if (e.target.parentNode.payload['dir'] == 'incoming')
210         ajax_request('archive_call', 'call='+e.target.parentNode.payload['call'], menu_list_archive_callback);
211
212     e.target.parentNode.style.display = 'none';
213     e.target.parentNode.payload['row'].style.backgroundColor = '';
214 }
215
216 function menu_list_edit(e)
217 {
218     var params = 'dir='+e.target.parentNode.payload['dir']+'&call='+e.target.parentNode.payload['call'];
219     ajax_request('callinfo', params, menu_list_edit_callback);
220
221     e.target.parentNode.style.display = 'none';
222     e.target.parentNode.payload['row'].style.backgroundColor = '';
223
224     var edit = document.getElementById('container_edit');
225     var config = document.getElementById('container_config');
226
227     edit.style.display = '';
228     config.style.display = 'none';
229 }
230
231 function menu_list_delete(e)
232 {
233     var params = 'dir='+e.target.parentNode.payload['dir']+'&call='+e.target.parentNode.payload['call'];
234     ajax_request('delete_call', params, menu_list_archive_callback);
235
236     e.target.parentNode.style.display = 'none';
237     e.target.parentNode.payload['row'].style.backgroundColor = '';
238 }
239
240 function fetch_messages_callback(data)
241 {
242     var calls = document.getElementById('internal_calls');
243
244     remove_children(calls);
245
246     if (data.messages.length > 0) {
247         for (var i=0; i < data.messages.length; i++) {
248             var elem = document.createElement('li');
249
250             elem.innerHTML = data.messages[i].fname;
251             if (data.messages[i].note)
252                 elem.title = data.messages[i].note;
253             else
254                 elem.title = '';
255             elem.payload = new Array();
256             elem.payload['dir'] = 'messages';
257             elem.payload['call'] = data.messages[i].fname;
258             elem.onclick = play_message;
259             calls.appendChild(elem);
260         }
261     }
262 }
263
264 function toggle_messages()
265 {
266     var edit = document.getElementById('container_edit');
267     var config = document.getElementById('container_config');
268
269     config.style.display = '';
270     edit.style.display = 'none';
271
272     ajax_request('messages', '', fetch_messages_callback);
273 }