diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-04-01 08:49:54 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-04-01 08:49:54 +0000 |
commit | 7014c0e5dd398d127b2027d9cd23198dfb0fd239 (patch) | |
tree | 7d74fc1d9c8da4425d180dec71f1e3dbe9b29d7e /static-http/astman.js | |
parent | 365090435aee1c9fa51fa27c49a085ec5c39b94e (diff) |
Flesh out the remainder of the manager + http changes and create a sample application to partially
demonstrate the capability of manager over http.
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@16850 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'static-http/astman.js')
-rw-r--r-- | static-http/astman.js | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/static-http/astman.js b/static-http/astman.js new file mode 100644 index 000000000..1a6927263 --- /dev/null +++ b/static-http/astman.js @@ -0,0 +1,256 @@ +/* + * 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 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"; + 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"; + 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(); |