asterisk/static-http/astman.js
Sean Bright 549740d440 Merged revisions 192524 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
  r192524 | seanbright | 2009-05-05 15:56:11 -0400 (Tue, 05 May 2009) | 11 lines
  
  Fix Javascript error when using astman.js in Internet Explorer.
  
  Internet Explorer (tested with 7.0) does not like trailing commas on constructs
  like object initializers, so get rid of them to avoid some errors.
  
  (closes issue #15026)
  Reported by: rajnishgiri
  Patches:
        bug15026.patch uploaded by seanbright (license 71)
  Tested by: seanbright
........


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@192525 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2009-05-05 19:57:49 +00:00

263 lines
7.7 KiB
JavaScript

/*
* 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() + " &lt;" + channels[x].callerid.escapeHTML() + "&gt;";
} 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();