PageSourceSearch

https://cc.baw.com.cn:18344/webchat/resources/chat/script/etalk.js?v=20260925115711

js baw.com.cn collected 2026-09-25 04:07:14 UTC 12,837 bytes, 399 lines download raw bytes

1function Etalk(){
2	//events from consumer
3	this.ON_CONSUMER_ROUTER_COMPLETE = "onConsumerRouterComplete";
4	this.ON_CONSUMER_QUEUE_INFO = "onConsumerQueueInfo";
5	this.ON_CONSUMER_QUEUE_TIMEOUT = "onConsumerQueueTimeout";
6	this.ON_CONSUMER_LOGIN_FAIL = "onConsumerLoginFail";
7	this.ON_CONSUMER_TOOLOONTIME_NO_RESPONSE = "onConsumerTooLongTimeNoResponse";
8	this.ON_CONSUMER_MSG_RECEIVED = "onConsumerMsgReceived";
9	this.ON_CONSUMER_CMD_RECEIVED = "onConsumerCmdReceived";
10	this.ON_CONSUMER_EXIT = "onConsumerExit";
11	
12	//events from Agent
13	this.ON_AGENT_RECEIVE_NEWSESSION = "onAgentReceiveNewsession";
14	this.ON_AGENT_HANGUP = "onAgentHangup";
15	this.ON_AGENT_SEND_MESSAGE = "onAgentSendMessage";
16
17	//events from system
18	this.ON_MSG_TRANSFER = "onMsgTransfer";
19	this.ON_MSG_MEETING = "onMsgMeeting";
20	
21	//events from server
22	this.ON_SERVER_CONNECT = "onServerConnect";
23	this.ON_SERVER_CLOSE = "onServerClose";
24	this.ON_SERVER_NOTCONNECT = "onServerNotconnect";
25	this.ON_SERVER_EMPTYMSG = "onServerEmptymsg";
26	this.ON_SERVER_TOOLONGMSG = "onServerToolongmsg";
27	this.ON_MSG_REMOVEBYADMIN = "onMsgRemovebyadmin";
28	this.ON_MSG_NETWAYCLIENT_CUSTOM = "onMsgNetwayClient";
29	this.ON_MSG_SATISFACTION = "onMsgSatisfaction";
30
31	/**socket对象,用于通讯**/
32	this.socketObj = null;
33	/**websokcet的url地址**/
34	this.websocketurl = "";
35	/**坐席工号**/
36	this.consumerId = "";
37	/**坐席姓名**/
38	this.consumerName = "";
39	/**技能组**/
40	this.groupNo = "";
41	/**客户**/
42	this.consumerPoint = 0;
43	/**渠道类型**/
44	this.channelType = "";
45	/**客户在ecore中的sessionid**/
46	this.sessionId = "";
47	/**客户当前在ecore中的状态,默认初始化状态**/
48	this.status = "inited";
49	/**当前为该客户服务的坐席数量**/
50	this.agentNumber = 0;
51	/**客户访问的session信息**/
52	this.sessionMap = new Object();
53	/**是否已连接坐席**/
54	this.isConnectedAgent = false;
55	
56	/**初始化对象值**/
57	this.initObj = function(consumerId, consumerName, groupNo, consumerPoint, channelType, websocketurl){ 
58		//console.log("consumerId:"+consumerId+",consumerName:"+consumerName+",groupNo:"+groupNo+",consumerPoint:"+consumerPoint+",channelType:"+channelType+",websocketurl:"+websocketurl);
59		this.consumerId = consumerId;
60		this.consumerName = consumerName;
61		this.groupNo = groupNo;
62		this.consumerPoint = consumerPoint;
63		this.channelType = channelType;
64		this.websocketurl = websocketurl;
65		this.socketObj = new WebsocketAdapter(this, websocketurl);
66	};
67	
68	//连接坐席
69	this.connect = function(){
70		if(this.consumerId != ""){
71			obj1={
72				"optType" : "connect",
73				"consumerId" : this.consumerId,
74				"consumerName" : this.consumerName,
75				"groupNo" : this.groupNo,
76				"channelType" : this.channelType,
77				"consumerPoint" : this.consumerPoint
78			};
79			this.sendMsgToServer(JSON.stringify(obj1));
80		}else{
81			alert("客户信息不完整,请联系技术人员,本次连接坐席失败");
82		}
83	};
84	//退出坐席
85	this.disconnect = function(){
86		obj1={
87			"optType": "disconnect",
88			"consumerId" : this.consumerId,
89			"channelType" : this.channelType
90		};
91		this.sendMsgToServer(JSON.stringify(obj1));
92	};
93	//发送客户正在输入的消息(参数:消息内容)
94	this.entering = function(msg){
95		obj1={
96			"optType" : "entering",
97			"consumerId" : this.consumerId,
98			"consumerName" : this.consumerName,
99			"groupNo" : this.groupNo,
100			"channelType" : this.channelType,
101			"content" : msg
102		};
103		this.sendMsgToServer(JSON.stringify(obj1));
104	};
105	//客户发送文本消息(参数:消息内容)
106	this.sendTextMessage = function(msg) {
107		if(this.status == "inqueue" && msg.replace(/(\<br\/?>+)/g,'') == "是"){
108			obj1={
109				"optType" : "continueQueue",
110				"consumerId" : this.consumerId,
111				"channelType" : this.channelType
112			};
113			this.sendMsgToServer(JSON.stringify(obj1));
114		}else if(this.status == "inqueue" && msg.replace(/(\<br\/?>+)/g,'') == "否"){
115			obj1={
116				"optType" : "cancelQueue",
117				"consumerId" : this.consumerId,
118				"channelType" : this.channelType
119			};
120			this.sendMsgToServer(JSON.stringify(obj1));
121		}else{
122			obj1={
123				"optType" : "text",
124				"consumerId" : this.consumerId,
125				"channelType" : this.channelType,
126				"content" : msg
127			};
128			this.sendMsgToServer(JSON.stringify(obj1));
129		}
130	};
131	//客户发送语音消息(参数:媒体ID)
132	this.sendVoiceMessage = function(mediaId) {
133		obj1={
134			"optType" : "voice",
135			"consumerId" : this.consumerId,
136			"channelType" : this.channelType,
137			"media_id" : mediaId
138		};
139		this.sendMsgToServer(JSON.stringify(obj1));
140	};
141	//客户发送视频消息(参数:媒体ID)
142	this.sendVideoMessage = function(mediaId) {
143		obj1={
144			"optType" : "video",
145			"consumerId" : this.consumerId,
146			"channelType" : this.channelType,
147			"media_id" : mediaId
148		};
149		this.sendMsgToServer(JSON.stringify(obj1));
150	};
151	//满意度评价(参数:评分)
152	this.satisfaction = function(evaluation_grade, evaluation_content) {
153		if(this.status == "insession" || this.status == "exit"){
154			obj1={
155				"optType" : "satisfaction",
156				"consumerId" : this.consumerId,
157				"consumerName" : this.consumerName,
158				"groupNo" : this.groupNo,
159				"channelType" : this.channelType,
160				"grade" : evaluation_grade,
161				"custMsg": evaluation_content,
162				"sessionId" : this.sessionId
163			};
164			this.sendMsgToServer(JSON.stringify(obj1));
165		}
166	}
167	//客户发送自定义消息(参数:消息内容)
168	this.sendCustomMessage = function(msg) {
169		obj1={
170			"optType" : "custom",
171			"consumerId" : this.consumerId,
172			"channelType" : this.channelType,
173			"content" : msg
174		};
175		this.sendMsgToServer(JSON.stringify(obj1));
176	};	
177	
178	this.getSocket = function() {
179		return this.socketObj;
180	};
181	
182	this.resetSocket = function() {
183		this.socketObj.close();
184		this.socketObj.open(this.websocketurl);
185	};
186	
187	this.probe = function() {
188		this.getSocket().probe();
189	};
190	
191	this.sendMsgToServer = function(_msg) {
192		this.getSocket().send(_msg);
193	};
194	
195	this.callByObject = function(mapMsg){
196		//console.log('msg:' + mapMsg);
197		var ret = eval('(' + mapMsg + ')');
198		var type = ret.type + "";
199		window.status = '消息:' + mapMsg;
200		switch(type){
201			case '1003':	//排队信息
202				this.status = "inqueue";
203				this.fireEvent(this.ON_CONSUMER_QUEUE_INFO, ret);
204				break;
205			case '1005':   //客户端消息到达
206				this.fireEvent(this.ON_CONSUMER_MSG_RECEIVED, ret);
207				break;
208			case '1010':   //客户端自定义消息到达
209				this.fireEvent(this.ON_CONSUMER_CMD_RECEIVED, ret);
210				break;
211			case '1011':	//排队超时
212				this.fireEvent(this.ON_CONSUMER_QUEUE_TIMEOUT, ret);
213				//AfterDisConnect();
214				break;
215			case '10011':   //客户登陆失败 (当前无在线坐席)
216				this.fireEvent(this.ON_CONSUMER_LOGIN_FAIL, ret);
217				break;
218			case '10021':   //客户退出
219				this.isConnectedAgent=false;
220				this.status = "exit";
221				this.fireEvent(this.ON_CONSUMER_EXIT, ret);
222				break;
223			case '1012':	//路由成功,等待坐席接起
224				this.status = "waitingforanswer";
225				this.fireEvent(this.ON_CONSUMER_ROUTER_COMPLETE, ret);
226				break;
227			case '1024':	//客户太长时间未操作
228				this.isConnectedAgent=false;
229				this.fireEvent(this.ON_CONSUMER_TOOLOONTIME_NO_RESPONSE, ret);
230				break;
231			case '2007':	//坐席发送的消息
232				this.fireEvent(this.ON_AGENT_SEND_MESSAGE, ret);
233				break;	
234			case '20141':	//座席接起新会话成功,此消息既要发送给座席,也要发送客户,客户接到该消息后进入到聊天界面
235				this.isConnectedAgent = true;
236				this.sessionId = ret.sessionId;
237				this.status = "insession";
238				this.agentNumber = this.agentNumber + 1;
239				console.log("当前服务坐席数量:" + this.agentNumber);
240				this.fireEvent(this.ON_AGENT_RECEIVE_NEWSESSION, ret);
241				break;
242			case '2025':
243				this.fireEvent(this.ON_MSG_SATISFACTION, ret);
244				break;
245			case '2027':
246				this.fireEvent(this.ON_MSG_REVOKE_AGENT, ret);
247				break;
248			case '2036' ://建立连接
249				this.fireEvent(this.ON_SERVER_CONNECT, ret);
250		 		break;
251			case '2037'://与服务器断开连接
252				this.isConnectedAgent=false;
253				this.fireEvent(this.ON_SERVER_CLOSE, ret);
254				break;	
255			case '2038'://尚未与服务器建立连接
256				this.fireEvent(this.ON_SERVER_NOTCONNECT, ret);
257				break;
258			case '2039'://消息不能为空
259				this.fireEvent(this.ON_SERVER_EMPTYMSG, ret);
260				break;
261			case '2040'://消息超长(2048)
262				this.fireEvent(this.ON_SERVER_TOOLONGMSG, ret);
263				break;
264			case '5001'://转接成功系统消息
265				this.agentNumber = this.agentNumber + 1;
266				console.log("当前服务坐席数量:" + this.agentNumber);
267				this.fireEvent(this.ON_MSG_TRANSFER, ret);
268				break;
269			case '5002'://座席挂断电话系统消息
270				this.isConnectedAgent=false;
271				this.agentNumber = this.agentNumber - 1;
272				console.log("当前服务坐席数量:" + this.agentNumber);
273				this.fireEvent(this.ON_AGENT_HANGUP, ret);
274				break;	
275			case '5003'://座席三方会议成功系统消息
276				this.agentNumber = this.agentNumber + 1;
277				console.log("当前服务坐席数量:" + this.agentNumber);
278				this.fireEvent(this.ON_MSG_MEETING, ret);
279				break;
280			case '5005'://坐席被管理员踢出系统
281				this.fireEvent(this.ON_MSG_REMOVEBYADMIN, ret);
282				break;
283			case '8888'://netway自定义消息
284				this.fireEvent(this.ON_MSG_NETWAYCLIENT_CUSTOM, ret);
285				break;
286			case '10000'://富文本模板消息
287				//alert("富文本模板消息:"+mapMsg);
288				showRobotMsg('10000','richTextTemplate',ret);
289				break;
290			case '10001'://折叠模板消息
291				//alert("折叠模板消息:"+mapMsg);
292				showRobotMsg('10001','innerfoldTemplate',ret);
293				break;
294			case '10010'://图文模板消息
295				//alert("图文模板消息:"+mapMsg);
296				break;
297			case '10018'://选择模板消息
298				//alert("选择模板消息:"+mapMsg);
299				break;
300			case '10019'://流程模板消息
301				//alert("流程模板消息:"+mapMsg);
302				
303				break;
304			case '10016'://快捷卡片消息
305				//alert("快捷卡片消息:"+mapMsg);
306				showRobotMsg('10016','quickCardTemplate',ret);
307				break;
308			case '10017'://猜你想问消息
309				//alert("猜你想问消息:"+mapMsg);
310				showRobotMsg('10017','guessCardTemplate',ret);
311				break;
312			case '10005'://天气模板消息
313				//alert("气模板消息:"+mapMsg);
314				break;
315			case '10088'://快捷入口消息
316				//alert("快捷入口消息:"+mapMsg);
317				showRobotMsg('10088','quickEntryTemplate',ret);
318				break;
319			case '10099':
320				showRobotMsg('10099','errorTemplate',ret);
321				break;
322			default:
323				alert("有用没用:"+mapMsg);
324				break;
325		}
326	}
327};
328
329Etalk.prototype = new EtalkEvent();
330function EtalkEvent(){
331    this.handlers = {};
332    this.addListener = function(event, handler) {
333    	if(typeof this.handlers[event] == 'undefined'){
334            this.handlers[event] = new Array();
335        }
336        this.handlers[event].push(handler);
337        return this;
338    }
339    this.removeListener = function(event,handler){
340    	if(this.handlers[event] instanceof Array){
341            var handlers = this.handlers[event];
342            for(var i=0,len=handlers.length; i<len; i++){
343                if(handler[i]==handler){
344                    handlers.splice(i,1);
345                    break;
346                }
347            }
348        }
349    	return this;
350    }
351    this.fireEvent = function(event, data){
352        if(this.handlers[event] instanceof Array){
353            var handlers = this.handlers[event];
354            for(var i=0,len=handlers.length; i<len; i++){
355                handlers[i](data);
356            }
357        }
358    }
359};
360
361function WebsocketAdapter(obj, url) {
362	if(!WebSocket){
363		alert('你的浏览器不支持WebSocket');return;
364	}
365	this.conn = new WebSocket(url);
366	this.conn.onopen = function() {
367		this.isOpen = true;
368		obj.callByObject("{type:'2036'}");
369		
370	};
371	this.conn.onmessage = function(msg) {
372//		alert('websocketadapter msg:' + msg);
373		obj.callByObject(msg.data);
374	};
375	this.conn.onclose = function() {
376		this.isOpen = false;
377		obj.callByObject("{type:2037}")
378	};
379	this.conn.onerror = function(){
380//		alert('websocket error');
381	};
382	this.open = function(websocketurl) {
383		console.log("websocketurl:"+ websocketurl);
384		this.conn = new WebSocket(websocketurl);
385	};
386	this.send = function(msg) {
387		if(this.conn.isOpen)
388			this.conn.send(msg);
389		else obj.callByObject("{type:2038}");
390	};
391	this.close = function() {
392		if(this.conn != null) {
393			this.conn.close();
394			this.conn = null;
395		}
396		this.isOpen = false;
397	};
398	
399};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.