Add context menu to list of calls, support archiving and deletion of messages
[infodrom/phone] / phone.js
1 var menu_list = {
2     'title': 'Calls',
3     'items': [{'name': 'Archive', 'callback': menu_list_archive},
4               {'name': 'Delete', 'callback': menu_list_delete},
5               {'name': 'Cancel', 'type': 'hide'}]
6 };
7
8 function page_init()
9 {
10     var frame = document.getElementById('phonecall');
11     frame.src = '';
12     fetch_incoming();
13     fetch_archive();
14 }
15
16 function fetch_incoming_callback(data)
17 {
18     var calls = document.getElementById('incoming_calls');
19     var div = document.getElementById('incoming');
20
21     while (calls.childNodes.length > 0)
22         calls.removeChild(calls.childNodes[0]);
23
24     if (data.incoming.length > 0) {
25         div.style.display = '';
26
27         for (var i=0; i < data.incoming.length; i++) {
28             var elem = document.createElement('li');
29             var text = data.incoming[i].date + ', ';
30             if (data.incoming[i].name == '*** Unknown ***' && data.incoming[i].number != '0')
31                 text += data.incoming[i].number;
32             else
33                 text += data.incoming[i].name;
34             text += ', ' + data.incoming[i].length;
35
36             elem.innerHTML = text;
37             elem.payload = new Array();
38             elem.payload['dir'] = 'incoming';
39             elem.payload['call'] = data.incoming[i].fname;
40             if (data.incoming[i].read == undefined)
41                 elem.className = 'new';
42             elem.onclick = play_message;
43             elem.oncontextmenu = list_context;
44             calls.appendChild(elem);
45         }
46     } else {
47         div.style.display = 'none';
48     }
49 }
50
51 function fetch_incoming()
52 {
53     ajax_request('incoming', '', fetch_incoming_callback);
54 }
55
56 function fetch_archive_callback(data)
57 {
58     var calls = document.getElementById('archive_calls');
59     var div = document.getElementById('archive');
60
61     while (calls.childNodes.length > 0)
62         calls.removeChild(calls.childNodes[0]);
63
64     if (data.archive.length > 0) {
65         div.style.display = '';
66
67         for (var i=0; i < data.archive.length; i++) {
68             var elem = document.createElement('li');
69             var text = data.archive[i].date + ', ';
70             if (data.archive[i].name == '*** Unknown ***' && data.archive[i].number != '0')
71                 text += data.archive[i].number;
72             else
73                 text += data.archive[i].name;
74             text += ', ' + data.archive[i].length;
75
76             elem.innerHTML = text;
77             elem.payload = new Array();
78             elem.payload['dir'] = 'archive';
79             elem.payload['call'] = data.archive[i].fname;
80             elem.onclick = play_message;
81             elem.oncontextmenu = list_context;
82             calls.appendChild(elem);
83         }
84     } else {
85         div.style.display = 'none';
86     }
87 }
88
89 function fetch_archive()
90 {
91     ajax_request('archive', '', fetch_archive_callback);
92 }
93
94 function play_message_callback(data)
95 {
96     var speaker = document.getElementById('callspeaker');
97     var date = document.getElementById('calldate');
98     var note = document.getElementById('callnote');
99
100     var text = data.name;
101     if (data.number != '0') text += ' (' + data.number + ')';
102     speaker.innerHTML = text;
103     date.innerHTML = data.date + ', ' + data.length;
104     note.innerHTML = data.note;
105 }
106
107 function play_message(event)
108 {
109     var frame = document.getElementById('phonecall');
110     var params = 'dir='+event.originalTarget.payload['dir']+'&call='+event.originalTarget.payload['call'];
111     ajax_request('callinfo', params, play_message_callback);
112     frame.src = 'index.php?'+params;
113     event.originalTarget.className = '';
114 }
115
116 function list_context(e)
117 {
118     var menu = document.getElementById('menu_list');
119     if (!menu)
120         menu = menu_create('menu_list', menu_list);
121
122     menu.style.left = e.pageX - 40;
123     menu.style.top = e.pageY - 15;
124     menu.style.display = '';
125     menu.payload = new Array();
126     menu.payload['dir'] = e.target.payload['dir'];
127     menu.payload['call'] = e.target.payload['call'];
128
129     return false;
130 }
131
132 function menu_list_archive_callback(data)
133 {
134     fetch_incoming();
135     fetch_archive();
136 }
137
138 function menu_list_archive(e)
139 {
140     if (e.target.parentNode.payload['dir'] == 'incoming')
141         ajax_request('archive_call', 'call='+e.target.parentNode.payload['call'], menu_list_archive_callback);
142
143     e.target.parentNode.style.display = 'none';
144 }
145
146 function menu_list_delete(e)
147 {
148     var params = 'dir='+e.target.parentNode.payload['dir']+'&call='+e.target.parentNode.payload['call'];
149     ajax_request('delete_call', params, menu_list_archive_callback);
150
151     e.target.parentNode.style.display = 'none';
152 }