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