/* * Asterisk -- An open source telephony toolkit. * * Javascript routines or accessing manager routines over HTTP. * * Copyright (C) 1999 - 2006, Digium, Inc. * * Mark Spencer * * 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 = "\n"; s = s + "\t"; 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"; s = s + ""; if (channels[x].state) s = s + ""; else s = s + ""; if (channels[x].calleridname && channels[x].callerid && channels[x].calleridname != "") { cid = channels[x].calleridname.escapeHTML() + " <" + channels[x].callerid.escapeHTML() + ">"; } else if (channels[x].calleridname && (channels[x].calleridname != "")) { cid = channels[x].calleridname.escapeHTML(); } else if (channels[x].callerid) { cid = channels[x].callerid.escapeHTML(); } else { cid = "Unknown"; } s = s + ""; if (channels[x].extension) { s = s + ""; } else { s = s + ""; } if (channels[x].link) { s = s + ""; } else { s = s + ""; } s = s + "\n"; found++; } } if (!found) s += "\n"; s += "
ChannelStateCallerLocationLink
" + channels[x].channel + "" + channels[x].state + "unknown" + cid + "" + channels[x].extension + "@" + channels[x].context + ":" + channels[x].priority + "None" + channels[x].link + "None
No active channels
\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();