| 
									
										
										
										
											2006-04-01 08:49:54 +00:00
										 |  |  | /* | 
					
						
							|  |  |  |  * 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; | 
					
						
							| 
									
										
										
										
											2006-04-03 01:48:59 +00:00
										 |  |  | 		var foundactive = 0; | 
					
						
							| 
									
										
										
										
											2006-04-01 08:49:54 +00:00
										 |  |  | 		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"; | 
					
						
							| 
									
										
										
										
											2006-04-03 01:48:59 +00:00
										 |  |  | 				if (me.selecttarget && (me.selecttarget == x)) { | 
					
						
							| 
									
										
										
										
											2006-04-01 08:49:54 +00:00
										 |  |  | 					cclass = "chanlistselected"; | 
					
						
							| 
									
										
										
										
											2006-04-03 01:48:59 +00:00
										 |  |  | 					foundactive = 1; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2006-04-01 08:49:54 +00:00
										 |  |  | 				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"; | 
					
						
							| 
									
										
										
										
											2006-04-03 01:48:59 +00:00
										 |  |  | 		if (!foundactive) { | 
					
						
							|  |  |  | 			me.selecttarget = null; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2006-04-01 08:49:54 +00:00
										 |  |  | 		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); | 
					
						
							| 
									
										
										
										
											2009-05-05 19:57:49 +00:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2006-04-01 08:49:54 +00:00
										 |  |  | 		}; | 
					
						
							|  |  |  | 		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); | 
					
						
							| 
									
										
										
										
											2009-05-05 19:57:49 +00:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2006-04-01 08:49:54 +00:00
										 |  |  | 		}; | 
					
						
							|  |  |  | 		opt.parameters="action=waitevent"; | 
					
						
							|  |  |  | 		tmp = new Ajax.Request(this.url, opt); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | astmanEngine = new Astman(); |