mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-11-03 20:38:59 +00:00 
			
		
		
		
	git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@17009 65c4cc65-6c06-0410-ace0-fbb531ad65f3
		
			
				
	
	
		
			263 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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() + " <" + 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();
 |