123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- /*
- * Asterisk -- An open source telephony toolkit.
- *
- * Javascript routines or accessing manager routines over HTTP.
- *
- * Copyright (C) 1999 - 2006, Digium, Inc.
- *
- * Mark Spencer <markster@digium.com>
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * This program is free software, distributed under the terms of
- * the GNU General Public License Version 2. See the LICENSE file
- * at the top of the source tree.
- *
- */
- function Astman() {
- var me = this;
- var channels = new Array;
- var lastselect;
- var selecttarget;
- this.setURL = function(url) {
- this.url = url;
- };
- this.setEventCallback = function(callback) {
- this.eventcallback = callback;
- };
- this.setDebug = function(debug) {
- this.debug = debug;
- };
- this.clickChannel = function(ev) {
- var target = ev.target;
- // XXX This is icky, we statically use astmanEngine to call the callback XXX
- if (me.selecttarget)
- me.restoreTarget(me.selecttarget);
- while(!target.id || !target.id.length)
- target=target.parentNode;
- me.selecttarget = target.id;
- target.className = "chanlistselected";
- me.chancallback(target.id);
- };
- this.restoreTarget = function(targetname) {
- var other;
- target = $(targetname);
- if (!target)
- return;
- if (target.previousSibling) {
- other = target.previousSibling.previousSibling.className;
- } else if (target.nextSibling) {
- other = target.nextSibling.nextSibling.className;
- }
- if (other) {
- if (other == "chanlisteven")
- target.className = "chanlistodd";
- else
- target.className = "chanlisteven";
- } else
- target.className = "chanlistodd";
- };
- this.channelUpdate = function(msg, channame) {
- var fields = new Array("callerid", "calleridname", "context", "extension", "priority", "account", "state", "link", "uniqueid" );
- if (!channame || !channame.length)
- channame = msg.headers['channel'];
- if (!channels[channame])
- channels[channame] = new Array();
- if (msg.headers.event) {
- if (msg.headers.event == "Hangup") {
- delete channels[channame];
- } else if (msg.headers.event == "Link") {
- var chan1 = msg.headers.channel1;
- var chan2 = msg.headers.channel2;
- if (chan1 && channels[chan1])
- channels[chan1].link = chan2;
- if (chan2 && channels[chan2])
- channels[chan2].link = chan1;
- } else if (msg.headers.event == "Unlink") {
- var chan1 = msg.headers.channel1;
- var chan2 = msg.headers.channel2;
- if (chan1 && channels[chan1])
- delete channels[chan1].link;
- if (chan2 && channels[chan2])
- delete channels[chan2].link;
- } else if (msg.headers.event == "Rename") {
- var oldname = msg.headers.oldname;
- var newname = msg.headers.newname;
- if (oldname && channels[oldname]) {
- channels[newname] = channels[oldname];
- delete channels[oldname];
- }
- } else {
- channels[channame]['channel'] = channame;
- for (x=0;x<fields.length;x++) {
- if (msg.headers[fields[x]])
- channels[channame][fields[x]] = msg.headers[fields[x]];
- }
- }
- } else {
- channels[channame]['channel'] = channame;
- for (x=0;x<fields.length;x++) {
- if (msg.headers[fields[x]])
- channels[channame][fields[x]] = msg.headers[fields[x]];
- }
- }
- };
- this.channelClear = function() {
- channels = new Array;
- }
- this.channelInfo = function(channame) {
- return channels[channame];
- };
- this.channelTable = function(callback) {
- var s, x;
- var cclass, count=0;
- var found = 0;
- var foundactive = 0;
- var fieldlist = new Array("channel", "callerid", "calleridname", "context", "extension", "priority");
- me.chancallback = callback;
- s = "<table class='chantable' align='center'>\n";
- s = s + "\t<tr class='labels' id='labels'><td>Channel</td><td>State</td><td>Caller</td><td>Location</td><td>Link</td></tr>";
- count=0;
- for (x in channels) {
- if (channels[x].channel) {
- if (count % 2)
- cclass = "chanlistodd";
- else
- cclass = "chanlisteven";
- if (me.selecttarget && (me.selecttarget == x)) {
- cclass = "chanlistselected";
- foundactive = 1;
- }
- count++;
- s = s + "\t<tr class='" + cclass + "' id='" + channels[x].channel + "' onClick='astmanEngine.clickChannel(event)'>";
- s = s + "<td>" + channels[x].channel + "</td>";
- if (channels[x].state)
- s = s + "<td>" + channels[x].state + "</td>";
- else
- s = s + "<td><i class='light'>unknown</i></td>";
- if (channels[x].calleridname && channels[x].callerid && channels[x].calleridname != "<unknown>") {
- cid = channels[x].calleridname.escapeHTML() + " <" + channels[x].callerid.escapeHTML() + ">";
- } else if (channels[x].calleridname && (channels[x].calleridname != "<unknown>")) {
- cid = channels[x].calleridname.escapeHTML();
- } else if (channels[x].callerid) {
- cid = channels[x].callerid.escapeHTML();
- } else {
- cid = "<i class='light'>Unknown</i>";
- }
- s = s + "<td>" + cid + "</td>";
- if (channels[x].extension) {
- s = s + "<td>" + channels[x].extension + "@" + channels[x].context + ":" + channels[x].priority + "</td>";
- } else {
- s = s + "<td><i class='light'>None</i></td>";
- }
- if (channels[x].link) {
- s = s + "<td>" + channels[x].link + "</td>";
- } else {
- s = s + "<td><i class='light'>None</i></td>";
- }
- s = s + "</tr>\n";
- found++;
- }
- }
- if (!found)
- s += "<tr><td colspan=" + fieldlist.length + "><i class='light'>No active channels</i></td>\n";
- s += "</table>\n";
- if (!foundactive) {
- me.selecttarget = null;
- }
- return s;
- };
- this.parseResponse = function(t, callback) {
- var msgs = new Array();
- var inmsg = 0;
- var msgnum = 0;
- var x,y;
- var s = t.responseText;
- var allheaders = s.split('\r\n');
- if (me.debug)
- me.debug.value = "\n";
- for (x=0;x<allheaders.length;x++) {
- if (allheaders[x].length) {
- var fields = allheaders[x].split(': ');
- if (!inmsg) {
- msgs[msgnum] = new Object();
- msgs[msgnum].headers = new Array();
- msgs[msgnum].names = new Array();
- y=0;
- }
- msgs[msgnum].headers[fields[0].toLowerCase()] = fields[1];
- msgs[msgnum].names[y++] = fields[0].toLowerCase();
- if (me.debug)
- me.debug.value = me.debug.value + "field " + fields[0] + "/" + fields[1] + "\n";
- inmsg=1;
- } else {
- if (inmsg) {
- if (me.debug)
- me.debug.value = me.debug.value + " new message\n";
- inmsg = 0;
- msgnum++;
- }
- }
- }
- if (me.debug) {
- me.debug.value = me.debug.value + "msgnum is " + msgnum + " and array length is " + msgs.length + "\n";
- me.debug.value = me.debug.value + "length is " + msgs.length + "\n";
- var x, y;
- for (x=0;x<msgs.length;x++) {
- for (y=0;y<msgs[x].names.length;y++) {
- me.debug.value = me.debug.value + "msg "+ (x + 1) + "/" + msgs[x].names[y] + "/" + msgs[x].headers[msgs[x].names[y]] + "\n";
- }
- }
- }
- callback(msgs);
- };
- this.managerResponse = function(t) {
- me.parseResponse(t, me.callback);
- };
- this.doEvents = function(msgs) {
- me.eventcallback(msgs);
- };
- this.eventResponse = function(t) {
- me.parseResponse(t, me.doEvents);
- };
- this.sendRequest = function(request, callback) {
- var tmp;
- var opt = {
- method: 'get',
- asynchronous: true,
- onSuccess: this.managerResponse,
- onFailure: function(t) {
- alert("Error: " + t.status + ": " + t.statusText);
- }
- };
- me.callback = callback;
- opt.parameters = request;
- tmp = new Ajax.Request(this.url, opt);
- };
- this.pollEvents = function() {
- var tmp;
- var opt = {
- method: 'get',
- asynchronous: true,
- onSuccess: this.eventResponse,
- onFailure: function(t) {
- alert("Event Error: " + t.status + ": " + t.statusText);
- }
- };
- opt.parameters="action=waitevent";
- tmp = new Ajax.Request(this.url, opt);
- };
- };
- astmanEngine = new Astman();
|