TLWebSocketAgent.js 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473
  1. /*
  2. IIFE 立即执行函数表达式
  3. 函数体写完之后立刻执行,传入的参数是js的内置变量window
  4. 这个函数相当于给window添加了一个类TLWSA
  5. */
  6. //作为命名空间的匿名函数
  7. (function(w)
  8. {
  9. //唯一公开的类 每一个页面内只能有该类的一个实例
  10. w.TLWSA=TLWSA;
  11. //TongLiWebSocketAgent class
  12. function TLWSA()
  13. {
  14. }
  15. //wbsocketagnt类的方法
  16. TLWSA.prototype.initTLWSA=_initTLWSA;
  17. TLWSA.prototype.tlaOpen=_tlaOpen;
  18. TLWSA.prototype.tlaOpenSlaveServer=_tlaOpenSlaveServer;
  19. TLWSA.prototype.tlaClose=_tlaClose; //本方法没有响应事件 认为一定成功
  20. TLWSA.prototype.tlaLogin=_tlaLogin;
  21. TLWSA.prototype.tlaLogoff=_tlaLogoff;
  22. TLWSA.prototype.tlaAcw=_tlaAcw;
  23. TLWSA.prototype.tlaWca=_tlaWca;
  24. TLWSA.prototype.tlaMute=_tlaMute;
  25. TLWSA.prototype.tlaUnmute=_tlaUnmute;
  26. TLWSA.prototype.tlaSetphonenumber=_tlaSetphonenumber;
  27. TLWSA.prototype.tlaCallagc=_tlaCallagc;
  28. TLWSA.prototype.tlaCallout=_tlaCallout;
  29. TLWSA.prototype.tlaCancelcall=_tlaCancelcall;
  30. TLWSA.prototype.tlaTransfertoagc=_tlaTransfertoagc;
  31. TLWSA.prototype.tlaTransferout=_tlaTransferout;
  32. TLWSA.prototype.tlaCanceltransfer=_tlaCanceltransfer;
  33. TLWSA.prototype.tlaBlindtransfertoagc=_tlaBlindtransfertoagc;
  34. TLWSA.prototype.tlaBlindtransferout=_tlaBlindtransferout;
  35. TLWSA.prototype.tlaTransfertoivr=_tlaTransfertoivr;
  36. TLWSA.prototype.tlaTransfertoivrandwait=_tlaTransfertoivrandwait;
  37. TLWSA.prototype.tlaStartlisten=_tlaStartlisten;
  38. TLWSA.prototype.tlaStoplisten=_tlaStoplisten;
  39. TLWSA.prototype.tlaKillworkid=_tlaKillworkid;
  40. TLWSA.prototype.tlaForceonhook=_tlaForceonhook;
  41. TLWSA.prototype.tlaIntrude=_tlaIntrude;
  42. TLWSA.prototype.tlaGetcall=_tlaGetcall;
  43. TLWSA.prototype.tlaForceacw=_tlaForceacw;
  44. TLWSA.prototype.tlaForcewca=_tlaForcewca;
  45. TLWSA.prototype.tlaAnswercall=_tlaAnswercall;
  46. TLWSA.prototype.tlaOnhook=_tlaOnhook;
  47. TLWSA.prototype.tlaHoldcall=_tlaHoldcall;
  48. TLWSA.prototype.tlaSwapcall=_tlaSwapcall;
  49. TLWSA.prototype.tlaActivatecall=_tlaActivatecall;
  50. TLWSA.prototype.tlaUnhold=_tlaUnhold;
  51. TLWSA.prototype.tlaLoginotheragent=_tlaLoginotheragent;
  52. TLWSA.prototype.tlaSendmessagetoagent=_tlaSendmessagetoagent;
  53. TLWSA.prototype.tlaKillbyline=_tlaKillbyline;
  54. TLWSA.prototype.tlaAnswerqueue=_tlaAnswerqueue;
  55. TLWSA.prototype.tlaOnhookline=_tlaOnhookline;
  56. TLWSA.prototype.tlaGetagentcount=_tlaGetagentcount;
  57. TLWSA.prototype.tlaGetagentwid=_tlaGetagentwid;
  58. TLWSA.prototype.tlaGetagentstate=_tlaGetagentstate;
  59. TLWSA.prototype.tlaGetacdlength=_tlaGetacdlength;
  60. TLWSA.prototype.tlaGettrknumber=_tlaGettrknumber;
  61. TLWSA.prototype.tlaGetlicenseinfo=_tlaGetlicenseinfo
  62. TLWSA.prototype.tlaSubscribestateinfo=_tlaSubscribestateinfo
  63. TLWSA.prototype.tlaConsulttransferout=_tlaConsulttransferout
  64. TLWSA.prototype.tlaConsulttransfertoagc=_tlaConsulttransfertoagc
  65. TLWSA.prototype.tlaCompleteconsulttransfer=_tlaCompleteconsulttransfer
  66. TLWSA.prototype.tlaGetnodestate=_tlaGetnodestate
  67. TLWSA.prototype.tlaTransfernode=_tlaTransfernode
  68. TLWSA.prototype.tlaConferencestart=_tlaConferencestart //启动会议
  69. TLWSA.prototype.tlaConferenceappendmember=_tlaConferenceappendmember //添加会议成员
  70. TLWSA.prototype.tlaConferencequery=_tlaConferencequery //会议状态查询
  71. TLWSA.prototype.tlaConferencedismiss=_tlaConferencedismiss //解散会议
  72. TLWSA.prototype.tlaConferencekickout=_tlaConferencekickout //解散会议
  73. TLWSA.prototype.tlaConferencechangememberstate=_tlaConferencechangememberstate //解散会议
  74. //公开的事件 绑在类上 静态 所以每一个页面只能有一个类实例
  75. //1 调用方法的应答
  76. TLWSA.onOpenreturn=null; //连接到服务器的结果事件
  77. TLWSA.onOpenslaveserverreturn=null; //连接到双机热备系统的备用服务器的结果事件
  78. TLWSA.onLoginreturn=null;
  79. TLWSA.onLogoffreturn=null;
  80. TLWSA.onAcwreturn=null;
  81. TLWSA.onWcareturn=null;
  82. TLWSA.onMutereturn=null;
  83. TLWSA.onUnmutereturn=null;
  84. TLWSA.onSetphonenumberreturn=null;
  85. TLWSA.onCallreturn=null; //调用外呼方法之后,返回该事件 如果错误码为0,仅仅表示开始外呼了,不代表呼叫接通或者呼叫失败
  86. TLWSA.onCancelcallreturn=null;
  87. TLWSA.onTransferreturn=null;//调用转移方法之后,返回该事件 如果错误码为0,仅仅表示开始转移,不代表转移目标已经接听或已经拒绝
  88. TLWSA.onCanceltransferreturn=null;
  89. TLWSA.onBlindtransferreturn=null;
  90. TLWSA.onConsulttransferreturn=null;
  91. TLWSA.onCompleteconsulttransferreturn=null;
  92. TLWSA.onTransfertoivrreturn=null;
  93. TLWSA.onTransfertoivrandwaitreturn=null;
  94. TLWSA.onStartlistenreturn=null;
  95. TLWSA.onStoplistenreturn=null;
  96. TLWSA.onKillreturn=null;
  97. TLWSA.onForceonhookreturn=null;
  98. TLWSA.onIntrudereturn=null;
  99. TLWSA.onGetcallreturn=null;
  100. TLWSA.onAnswercallreturn=null;
  101. TLWSA.onOnhookreturn=null;
  102. TLWSA.onHoldcallreturn=null;
  103. TLWSA.onSwapcallreturn=null;
  104. TLWSA.onActivatecallreturn=null;
  105. TLWSA.onUnholdcallreturn=null;
  106. TLWSA.onLoginotheragentreturn=null;
  107. TLWSA.onSendmessagetoagentreturn=null;
  108. TLWSA.onAnswerqueuereturn=null;
  109. TLWSA.onSubscribestateinforeturn=null;
  110. TLWSA.onGetnodestatereturn=null;
  111. TLWSA.onTransfernodereturn=null;
  112. TLWSA.onConferencestartreturn=null;
  113. TLWSA.onConferenceappendmemberreturn=null;
  114. TLWSA.onConferencequeryreturn=null;
  115. TLWSA.onConferencedismissreturn=null;
  116. TLWSA.onConferencekickoutreturn=null;
  117. TLWSA.onConferencechangememberstatereturn=null;
  118. //2 主动事件
  119. TLWSA.onCallin=null;
  120. TLWSA.onCallend=null;
  121. TLWSA.onAcw=null;
  122. TLWSA.onWca=null;
  123. TLWSA.onLogoff=null;
  124. TLWSA.onCallresult=null;
  125. TLWSA.onTransferresult=null;
  126. TLWSA.onBlindtransferresult=null;
  127. TLWSA.onAnswer=null;
  128. TLWSA.onClosed=null;
  129. TLWSA.onSlaveserverclosed=null; //与备用服务器的连接断开
  130. TLWSA.onHoldcallreleased=null;
  131. TLWSA.onKeepcallreleased=null;
  132. TLWSA.onCalleealerting=null;
  133. TLWSA.onQueue=null;
  134. TLWSA.onQuitqueue=null;
  135. TLWSA.onRecvmsg=null;
  136. TLWSA.onHookstate=null;
  137. TLWSA.onHardwarefail=null;
  138. TLWSA.onMisscall=null;
  139. TLWSA.onConsulttransfercalleeanswer=null;
  140. TLWSA.onStatechange=null;
  141. TLWSA.onMyStatechange=null;
  142. TLWSA.onConferencememberstate=null; //会议成员状态变化 1呼出接通进入会议 2呼出失败 3挂机退出会议
  143. //双机热备相关
  144. TLWSA.onSlaveserverfail=null; //备用服务器失联
  145. TLWSA.onSwitchtoslaveserver=null; //主服务器失联,已切换到备用服务器
  146. //临时调试用 公开这个日志记录函数
  147. w.log=_log;
  148. //下面的变量和函数用户不使用也不必关心
  149. //枚举状态
  150. var WSAState={
  151. Waiting:1,
  152. Idle:2
  153. };
  154. var Funs = {
  155. none: 0,
  156. login: 1,
  157. acw: 2,
  158. wca: 3,
  159. logoff: 4,
  160. call: 5,
  161. callin_notify: 6,
  162. transfer: 8,
  163. listen: 9,
  164. stoplisten: 10,
  165. answer: 11,
  166. onhook: 13,
  167. stoptransfer: 14,
  168. cancelcall: 15,
  169. callend: 16,
  170. transfertoivr: 17,
  171. queue: 18,
  172. holdcallend: 22,
  173. hold: 25,
  174. unhold: 26,
  175. cut: 29,
  176. setphonenumber: 31,
  177. getcall: 32,
  178. intrude: 33,
  179. callresult: 34,
  180. transferresult: 35,
  181. kill: 36,
  182. swap: 40,
  183. activate: 41,
  184. mute: 42,
  185. unmute: 43,
  186. stateinfo: 44,
  187. transfertoivrandwait: 45,
  188. keepcallend: 46,
  189. quitqueue: 47,
  190. answerqueue: 48,
  191. forcedacw: 49,
  192. forcedwca: 50,
  193. licenseinfo: 53,
  194. subscribe:54,
  195. mystateinfo:55,
  196. sendmessage: 56,
  197. receivemessage: 57,
  198. hardwarefail: 58,
  199. hookstate: 59,
  200. blindtransfer: 61,
  201. loginotheragent: 62,
  202. misscall: 71,
  203. stateinfo2: 72,
  204. slaveserverfail:73,
  205. switchtoslaveserver:74,
  206. calleealerting: 75,
  207. getnodestate:82,
  208. transfernode:83,
  209. consulttransfer:91,
  210. completeconsulttransfer:92,
  211. consulttransfercalleeanswer:93, //咨询转移目标坐席或外线应答
  212. //坐席发起多方会议相关请求 开始会议 添加会议成员 会议状态查询 解散会议
  213. conferencestart:94, //参数1个 字符串 会议名称。同一个坐席不可发起多个同名会议;不同的坐席可以发起相同名称的会议
  214. conferenceappendmember:95, //参数4个 被叫电话号码,是否有发言权
  215. conferencequery:96, //无参数 返回本坐席发起的所有会议及会议内部成员的状态
  216. conferencedismiss:97, //解散会议 参数1个 会议名称
  217. conferencememberstate:98, // 会议成员状态变化通知 1呼叫成功,进入会议 2呼叫失败 3退出会议(挂机)
  218. conferencekickout:99, //踢出会议成员
  219. conferencechangememberstate:100001, //改变会议成员发言权
  220. };
  221. //私有变量声明开始
  222. var wsClient=null;
  223. var wsClientSlave=null; //用于连接热备系统的备用服务器的websocket
  224. var connected=false;
  225. var connectedSlave=false; //与热备系统的备用服务器的连接状态标识
  226. var tickHeartpac = null;//心跳
  227. //服务端推送来的状态信息
  228. var allAgcStatejson={};
  229. //服务端程序的授权信息
  230. var LicenseJson={'validdate':'0000-00-00','lines':'0','cardno':''};
  231. var heartPacket={};
  232. var logined=false;
  233. var fsmState=WSAState.Idle; //状态机 idle / wait
  234. var fsmWaitingwho=Funs.none; //如果正在等待服务端的返回 等待的功能码是多少
  235. //私有变量声明结束
  236. //函数
  237. //初始化全局变量
  238. function _initTLWSA()
  239. {
  240. if(wsClient !=null && connected)
  241. wsClient.close();
  242. if(wsClientSlave !=null && connectedSlave)
  243. wsClientSlave.close();
  244. wsClient=null;
  245. wsClientSlave=null;
  246. connected=false;
  247. connectedSlave=false;
  248. tickHeartpac = null;//心跳
  249. allAgcStatejson={};
  250. heartPacket={};
  251. heartPacket.fun=0;
  252. logined=false;
  253. fsmState=WSAState.Idle; //状态机 free / wait
  254. fsmWaitingwho=Funs.none; //状态机子状态 空闲 waitlogin waitlogoff waitacw waitwca waitcall waittransfer wait...
  255. }
  256. //连接到服务器
  257. function _tlaOpen ( serveIP)
  258. {
  259. if(connected)
  260. {
  261. _log("已经连接到服务器");
  262. return false;
  263. }
  264. var wsUrl='ws://' + serveIP;
  265. _log(wsUrl);
  266. if ("WebSocket" in w) //IE Chrome
  267. {
  268. wsClient= new WebSocket(wsUrl);
  269. }
  270. else if ("MozWebSocket" in w) //FireFox
  271. {
  272. wsClient = new MozWebSocket(wsUrl);
  273. }
  274. else
  275. {
  276. alert("browser not support WebSocket");
  277. return false;
  278. }
  279. wsClient.onopen = function()
  280. {
  281. connected=true;
  282. _log("连接服务器成功");
  283. _sendauthentication(1);//参数=1 发送到主服务器 2发送到备用服务器 3发送到两个服务器
  284. fsmState=WSAState.Idle;
  285. clearInterval(tickHeartpac);
  286. tickHeartpac = setInterval(function () {
  287. _send2server(heartPacket);//定时心跳包
  288. }, 2000);
  289. if(TLWSA.onOpenreturn)
  290. TLWSA.onOpenreturn(0);
  291. }
  292. wsClient.onclose = function()
  293. {
  294. connected=false;
  295. _log("与服务器的连接中断");
  296. if(!connectedSlave)
  297. {
  298. logined=false;
  299. clearInterval(tickHeartpac);
  300. }
  301. if (TLWSA.onClosed)
  302. TLWSA.onClosed();
  303. }
  304. wsClient.onerror = function()
  305. {
  306. connected=false;
  307. if(!connectedSlave)
  308. logined=false;
  309. _log("websocket出错了");
  310. if(TLWSA.onOpenreturn)
  311. TLWSA.onOpenreturn(1);
  312. }
  313. wsClient.onmessage = function(receiveMsg){return _onreceivefromserver(receiveMsg.data);}
  314. return true;
  315. }
  316. //连接到双机热备系统的备用服务器
  317. function _tlaOpenSlaveServer ( slaveServeIP)
  318. {
  319. if(connectedSlave)
  320. {
  321. _log("已经连接到备用服务器");
  322. return false;
  323. }
  324. if(logined) //本方法必须主调用 tlaopen之后,tlalogin成功之前调用,如果已经登录了,就不允许再调用open函数了
  325. {
  326. _log("必须在登录之前调用本函数");
  327. return false;
  328. }
  329. var wsUrl='ws://' + slaveServeIP;
  330. _log(wsUrl);
  331. if ("WebSocket" in w) //IE Chrome
  332. {
  333. wsClientSlave= new WebSocket(wsUrl);
  334. }
  335. else if ("MozWebSocket" in w) //FireFox
  336. {
  337. wsClientSlave = new MozWebSocket(wsUrl);
  338. }
  339. else
  340. {
  341. alert("browser not support WebSocket");
  342. return false;
  343. }
  344. wsClientSlave.onopen = function()
  345. {
  346. connectedSlave=true;
  347. _log("连接备用服务器成功");
  348. _sendauthentication(2);//参数=1 发送到主服务器 2发送到备用服务器 3发送到两个服务器
  349. /* 要求在调用tlaopen成功之后立刻调用这个函数 所以下面的设置状态和定时发送心跳都不需要再次设置了
  350. fsmState=WSAState.Idle;
  351. tickHeartpac = setInterval(function () {
  352. _send2server(heartPacket);//定时心跳包
  353. }, 11000);
  354. */
  355. if(TLWSA.onOpenslaveserverreturn)
  356. TLWSA.onOpenslaveserverreturn(0);
  357. }
  358. wsClientSlave.onclose = function()
  359. {
  360. connectedSlave=false;
  361. _log("与备用服务器的连接中断");
  362. if(!connected) //如果与主服务器的连接也中断了 停止定时任务
  363. {
  364. logined=false;
  365. clearInterval(tickHeartpac);
  366. }
  367. if (TLWSA.onSlaveserverclosed)
  368. TLWSA.onSlaveserverclosed();
  369. }
  370. wsClientSlave.onerror = function()
  371. {
  372. connectedSlave=false;
  373. if(!connected)
  374. {
  375. logined=false;
  376. }
  377. _log("连接备用服务器的websocket出错了");
  378. if(TLWSA.onOpenslaveserverreturn)
  379. TLWSA.onOpenslaveserverreturn(1);
  380. }
  381. wsClientSlave.onmessage = function(receiveMsg){return _onreceivefromslaveserver(receiveMsg.data);}
  382. return true;
  383. }
  384. //断开与服务器的连接
  385. function _tlaClose()
  386. {
  387. if(wsClient!=null)
  388. {
  389. wsClient.onerror=null;
  390. wsClient.onclose=null;
  391. wsClient.close();
  392. }
  393. wsClient=null;
  394. connected=false;
  395. if(wsClientSlave!=null)
  396. {
  397. wsClientSlave.onerror=null;
  398. wsClientSlave.onclose=null;
  399. wsClientSlave.close();
  400. }
  401. wsClientSlave=null;
  402. connectedSlave=false;
  403. logined=false;
  404. _log('socket to server closed');
  405. }
  406. //登录
  407. function _tlaLogin(wid,gid,lineid,phonenumber)
  408. {
  409. if(!connected && !connectedSlave)
  410. {
  411. _log("in _tlaLogin not connected to server yet");
  412. return false;
  413. }
  414. if(logined)
  415. {
  416. _log("already login-ed");
  417. return false;
  418. }
  419. var jso={};
  420. jso.fun=Funs.login;
  421. jso.wid=wid;
  422. jso.gid=gid;
  423. jso.line=lineid;
  424. jso.phonenumber=phonenumber;
  425. _send2server(jso);
  426. fsmState=WSAState.Waiting;
  427. fsmWaitingwho=Funs.login;
  428. //_log('login');
  429. return true;
  430. }
  431. //注销
  432. function _tlaLogoff()
  433. {
  434. var jso={};
  435. jso.fun=Funs.logoff;
  436. return commonRequest(jso);
  437. }
  438. //离席
  439. function _tlaAcw()
  440. {
  441. var jso={};
  442. jso.fun=Funs.acw;
  443. //jso.reason=3;//自定义
  444. return commonRequest(jso);
  445. }
  446. //复席
  447. function _tlaWca()
  448. {
  449. var jso={};
  450. jso.fun=Funs.wca;
  451. return commonRequest(jso);
  452. }
  453. //静音
  454. function _tlaMute()
  455. {
  456. var jso={};
  457. jso.fun=Funs.mute;
  458. return commonRequest(jso);
  459. }
  460. //取消静音
  461. function _tlaUnmute()
  462. {
  463. var jso={};
  464. jso.fun=Funs.unmute;
  465. return commonRequest(jso);
  466. }
  467. //IP坐席在登录后必须向服务器报告自己所使用的ip电话机的号码
  468. function _tlaSetphonenumber(phone)
  469. {
  470. var jso={};
  471. jso.fun = Funs.setphonenumber;
  472. jso.phone=phone;
  473. return commonRequest(jso);
  474. }
  475. //呼叫其他坐席
  476. function _tlaCallagc(calledagcworkid)
  477. {
  478. var jso={};
  479. jso.fun = Funs.call;
  480. jso.mode=1;
  481. jso.callee=calledagcworkid;
  482. return commonRequest(jso);
  483. }
  484. //呼叫外线
  485. function _tlaCallout(calledno,callerno,pbxno)
  486. {
  487. var jso={};
  488. jso.fun = Funs.call;
  489. jso.mode=2;
  490. jso.callee=calledno;
  491. jso.caller=callerno;
  492. jso.co=pbxno;
  493. return commonRequest(jso);
  494. }
  495. //取消正在进行的呼叫(坐席或外线)
  496. function _tlaCancelcall()
  497. {
  498. var jso={};
  499. jso.fun = Funs.cancelcall;
  500. return commonRequest(jso);
  501. }
  502. //把正在进行的通话转移给其他坐席
  503. function _tlaTransfertoagc(destworkid)
  504. {
  505. var jso={};
  506. jso.fun = Funs.transfer;
  507. jso.mode=1;
  508. jso.callee=destworkid;
  509. return commonRequest(jso);
  510. }
  511. //把正在进行的通话转移到外线
  512. function _tlaTransferout(calledno,callerno,pbxno)
  513. {
  514. var jso={};
  515. jso.fun = Funs.transfer;
  516. jso.mode=2;
  517. jso.callee=calledno;
  518. jso.caller=callerno;
  519. jso.co=pbxno;
  520. return commonRequest(jso);
  521. }
  522. function _tlaConsulttransfertoagc(destworkid)
  523. {
  524. var jso={};
  525. jso.fun = Funs.consulttransfer;
  526. jso.mode=1;
  527. jso.callee=destworkid;
  528. return commonRequest(jso);
  529. }
  530. function _tlaConsulttransferout(calledno,callerno,pbxno)
  531. {
  532. var jso={};
  533. jso.fun = Funs.consulttransfer;
  534. jso.mode=2;
  535. jso.callee=calledno;
  536. jso.caller=callerno;
  537. jso.co=pbxno;
  538. return commonRequest(jso);
  539. }
  540. function _tlaCompleteconsulttransfer()
  541. {
  542. var jso={};
  543. jso.fun = Funs.completeconsulttransfer;
  544. return commonRequest(jso);
  545. }
  546. //取消正在进行的转移
  547. function _tlaCanceltransfer()
  548. {
  549. var jso={};
  550. jso.fun = Funs.stoptransfer;
  551. return commonRequest(jso);
  552. }
  553. //盲转到其他坐席 不等待目标坐席应答即认为转移完成
  554. function _tlaBlindtransfertoagc(destworkid)
  555. {
  556. var jso={};
  557. jso.fun = Funs.blindtransfer;
  558. jso.mode=1;
  559. jso.callee=destworkid;
  560. return commonRequest(jso);
  561. }
  562. //盲转到外线
  563. function _tlaBlindtransferout(calledno,callerno,pbxno)
  564. {
  565. var jso={};
  566. jso.fun = Funs.blindtransfer;
  567. jso.mode=2;
  568. jso.callee=calledno;
  569. jso.caller=callerno;
  570. jso.co=pbxno;
  571. return commonRequest(jso);
  572. }
  573. //转移到ivr
  574. function _tlaTransfertoivr(scriptfile,parameter)
  575. {
  576. var jso={};
  577. jso.fun = Funs.transfertoivr;
  578. jso.file=scriptfile;
  579. jso.data=parameter;
  580. return commonRequest(jso);
  581. }
  582. //转移到ivr并等待
  583. function _tlaTransfertoivrandwait(scriptfile,parameter)
  584. {
  585. var jso={};
  586. jso.fun = Funs.transfertoivrandwait;
  587. jso.file=scriptfile;
  588. jso.data=parameter;
  589. return commonRequest(jso);
  590. }
  591. //监听
  592. function _tlaStartlisten(destwid)
  593. {
  594. var jso={};
  595. jso.fun=Funs.listen;
  596. jso.wid=destwid;
  597. return commonRequest(jso);
  598. }
  599. //停止监听
  600. function _tlaStoplisten()
  601. {
  602. var jso={};
  603. jso.fun=Funs.stoplisten;
  604. return commonRequest(jso);
  605. }
  606. //强制注销工号 本函数不要求必须先登录,所以不能用commonrequest函数,只能把发送请求的代码和改变等待状态的代码写作函数体里
  607. function _tlaKillworkid(destwid)
  608. {
  609. if(!connected)
  610. {
  611. _log("not connected to server yet");
  612. return false;
  613. }
  614. var jso={};
  615. jso.fun = Funs.kill;
  616. jso.mode=2;
  617. jso.dest=destwid;
  618. _send2server(jso);
  619. fsmState=WSAState.Waiting;
  620. fsmWaitingwho = Funs.kill;
  621. //_log('强制注销工号 ' + destwid);
  622. return true;
  623. }
  624. //强拆
  625. function _tlaForceonhook(destwid)
  626. {
  627. var jso={};
  628. jso.fun = Funs.cut;
  629. jso.wid=destwid;
  630. return commonRequest(jso);
  631. }
  632. //强插
  633. function _tlaIntrude(destwid)
  634. {
  635. var jso={};
  636. jso.fun = Funs.intrude;
  637. jso.wid=destwid;
  638. return commonRequest(jso);
  639. }
  640. //代接 工号为-1表示代接正在振铃的任意坐席
  641. function _tlaGetcall(destwid)
  642. {
  643. var jso={};
  644. jso.fun = Funs.getcall;
  645. jso.wid=destwid;
  646. return commonRequest(jso);
  647. }
  648. //强制离席
  649. function _tlaForceacw(destwid)
  650. {
  651. var jso={};
  652. jso.fun = Funs.kill;
  653. jso.mode=3;
  654. jso.dest=destwid;
  655. return commonRequest(jso);
  656. }
  657. //强制就绪
  658. function _tlaForcewca(destwid)
  659. {
  660. var jso={};
  661. jso.fun = Funs.kill;
  662. jso.mode=4;
  663. jso.dest=destwid;
  664. return commonRequest(jso);
  665. }
  666. //应答
  667. function _tlaAnswercall()
  668. {
  669. var jso={};
  670. jso.fun = Funs.answer;
  671. return commonRequest(jso);
  672. }
  673. //挂机
  674. function _tlaOnhook()
  675. {
  676. var jso={};
  677. jso.fun = Funs.onhook;
  678. return commonRequest(jso);
  679. }
  680. //保持
  681. function _tlaHoldcall()
  682. {
  683. var jso={};
  684. jso.fun = Funs.hold;
  685. return commonRequest(jso);
  686. }
  687. //切换呼叫 在保持了一个呼叫后,开始了新的呼叫,在新呼叫与被保持的呼叫之间切换
  688. function _tlaSwapcall()
  689. {
  690. var jso={};
  691. jso.fun = Funs.swap;
  692. return commonRequest(jso);
  693. }
  694. //激活保持的通话 在保持一个呼叫后,发起新的呼叫,新呼叫建立后,可以激活被保持的通话,与新建立的通话形成3方通话
  695. function _tlaActivatecall()
  696. {
  697. var jso={};
  698. jso.fun = Funs.activate;
  699. return commonRequest(jso);
  700. }
  701. //取回保持的通话 要求当前必须处于空闲状态
  702. function _tlaUnhold()
  703. {
  704. var jso={};
  705. jso.fun = Funs.unhold;
  706. return commonRequest(jso);
  707. }
  708. //登录一个坐席(不是自己登录 是替别人登录) 参数:工号,组号,电话线线号(IP坐席填-1),电话号码(非IP坐席填空字符串)
  709. function _tlaLoginotheragent(owid,ogid,olid,ophone)
  710. {
  711. var jso={};
  712. jso.fun = Funs.loginotheragent;
  713. jso.line=olid;
  714. jso.wid=owid;
  715. jso.gid=ogid;
  716. jso.phone=ophone;
  717. return commonRequest(jso);
  718. }
  719. //坐席之间发送消息(类似qq聊天)
  720. function _tlaSendmessagetoagent(mode,destworkidorgroupid,smessage)
  721. {
  722. var jso={};
  723. jso.fun = Funs.sendmessage;
  724. jso.mode=mode;
  725. jso.dest=destworkidorgroupid;
  726. jso.msg=smessage;
  727. return commonRequest(jso);
  728. }
  729. //根据电话线号注销坐席 如果自己登录的时候失败,可能是自己使用的电话线被占用了,可以把占用自己电话线的坐席强制踢出去
  730. //本函数不要求坐席处于登录状态 所以不能调用commonrequest
  731. function _tlaKillbyline(destlineno)
  732. {
  733. if(!connected)
  734. {
  735. _log("not connected to server yet");
  736. return false;
  737. }
  738. var jso={};
  739. jso.fun = Funs.kill;
  740. jso.mode=1;
  741. jso.dest=destlineno;
  742. _send2server(jso);
  743. fsmState=WSAState.Waiting;
  744. fsmWaitingwho = Funs.kill;
  745. //_log('注销线号为 '+destlineno+' 的坐席');
  746. return true;
  747. }
  748. //在有外线进入队列排队的时候,坐席可以收到排队通知,通知里面有外线的呼叫流水号(唯一标识) 可以指定接听这个排队的外线,参数是呼叫流水号
  749. function _tlaAnswerqueue(callcrs)
  750. {
  751. var jso={};
  752. jso.fun = Funs.answerqueue;
  753. jso.crs=callcrs;
  754. return commonRequest(jso);
  755. }
  756. //挂断外线
  757. function _tlaOnhookline(destline)
  758. {
  759. var jso={};
  760. jso.fun = Funs.kill;
  761. jso.mode=5;
  762. jso.dest=destline;
  763. return commonRequest(jso);
  764. }
  765. function _tlaGetagentcount()
  766. {
  767. try
  768. {
  769. return allAgcStatejson.p.length/2;
  770. }
  771. catch(e)
  772. {
  773. return 0;
  774. }
  775. }
  776. function _tlaGetagentwid(index)
  777. {
  778. var agcount=_tlaGetagentcount();
  779. if(index>=0 && index<agcount)
  780. return allAgcStatejson.p[index*2];
  781. return '';
  782. }
  783. function _tlaGetagentstate(index)
  784. {
  785. var agcount=_tlaGetagentcount();
  786. if(index>=0 && index<agcount)
  787. return allAgcStatejson.p[index*2+1];
  788. return 0;
  789. }
  790. function _tlaGetacdlength()
  791. {
  792. try
  793. {
  794. return allAgcStatejson.acdlen;
  795. }
  796. catch(e)
  797. {
  798. return 0;
  799. }
  800. }
  801. function _tlaGettrknumber()
  802. {
  803. try
  804. {
  805. return allAgcStatejson.trkno;
  806. }
  807. catch(e)
  808. {
  809. return 0;
  810. }
  811. }
  812. //查询服务端的授权信息
  813. function _tlaGetlicenseinfo()
  814. {
  815. return LicenseJson;
  816. }
  817. //为了降低网络流量压力 cit服务端默认是不向座席端推送状态变化消息的,
  818. //如果希望收到状态变化消息 必须调用下面的方法订阅
  819. function _tlaSubscribestateinfo(level)
  820. {
  821. var jso={};
  822. jso.fun = Funs.subscribe;
  823. jso.level=level;
  824. return commonRequest(jso);
  825. }
  826. function _tlaGetnodestate(nodeid,type)
  827. {
  828. var jso={};
  829. jso.fun = Funs.getnodestate;
  830. jso.nodeid=nodeid;
  831. jso.type=type;
  832. return commonRequest(jso);
  833. }
  834. function _tlaTransfernode(nodeid,wid,co,data)
  835. {
  836. var jso={};
  837. jso.fun = Funs.transfernode;
  838. jso.nodeid=nodeid;
  839. jso.wid=wid;
  840. jso.co=co;
  841. jso.data=data;
  842. return commonRequest(jso);
  843. }
  844. function _tlaConferencestart()
  845. {
  846. var jso={};
  847. jso.fun = Funs.conferencestart;
  848. return commonRequest(jso);
  849. }
  850. //membertype=1 添加坐席成员 called是坐席工号 caller被忽略
  851. //membertype=2 添加外线成员
  852. function _tlaConferenceappendmember(conferenceid,membertype,called,caller,canspeak)
  853. {
  854. var jso={};
  855. jso.fun = Funs.conferenceappendmember;
  856. jso.conferenceid=conferenceid;
  857. jso.membertype=membertype;
  858. jso.called=called;
  859. jso.caller=caller;
  860. jso.canspeak=canspeak;
  861. return commonRequest(jso);
  862. }
  863. function _tlaConferencequery(confid)
  864. {
  865. var jso={};
  866. jso.fun = Funs.conferencequery;
  867. jso.conferenceid=confid;
  868. return commonRequest(jso);
  869. }
  870. function _tlaConferencedismiss(conferenceid)
  871. {
  872. var jso={};
  873. jso.fun = Funs.conferencedismiss;
  874. jso.conferenceid=conferenceid;
  875. return commonRequest(jso);
  876. }
  877. //membertype=1 踢出坐席成员 called是坐席工号
  878. //membertype=2 踢出外线成员
  879. function _tlaConferencekickout(conferenceid,membertype,called)
  880. {
  881. var jso={};
  882. jso.fun = Funs.conferencekickout;
  883. jso.conferenceid=conferenceid;
  884. jso.membertype=membertype;
  885. jso.called=called;
  886. return commonRequest(jso);
  887. }
  888. //membertype=1 改变坐席成员 called是坐席工号
  889. //membertype=2 改变外线成员
  890. function _tlaConferencechangememberstate(conferenceid,membertype,called,newstate)
  891. {
  892. var jso={};
  893. jso.fun = Funs.conferencechangememberstate;
  894. jso.conferenceid=conferenceid;
  895. jso.membertype=membertype;
  896. jso.called=called;
  897. jso.newstate=newstate;
  898. return commonRequest(jso);
  899. }
  900. //在连接到服务器后 必须发送校验密码 通过后才能继续通信 否则服务端会忽略客户端发送的任何信息
  901. //参数=1 发送到主服务器 =2 发送到备用服务器 =3发送到两个服务器
  902. function _sendauthentication(towhichserver)
  903. {
  904. var jobj={};
  905. jobj.fun=999;
  906. jobj.authcode=authCode;
  907. _send2server(jobj,towhichserver);
  908. }
  909. //向服务器发送请求的通用代码抽出来做一个函数 调用者给一个json对象赋值,然后调用本函数
  910. //本函数负责判断是否已经登录,向服务器发送请求包,并修改当前状态为等待,以及等待哪个功能码的返回
  911. function commonRequest(jso)
  912. {
  913. if(!logined)
  914. {
  915. _log("not logined yet");
  916. return false;
  917. }
  918. _send2server(jso);
  919. fsmState=WSAState.Waiting;
  920. fsmWaitingwho = jso.fun;
  921. return true;
  922. }
  923. //通过websocket向服务器发送包 默认向主服务器和备用服务器都发送
  924. //参数towhichserver=1 发送到主服务器 =2 发送到备用服务器 =3发送到两个服务器
  925. //如果指定了只发送给备用服务器(例如在连接备用服务器的时候向备用服务器发送校验包,就不需要向主服务器发送)
  926. function _send2server(jsobject,towhichserver=3)
  927. {
  928. if(towhichserver==1 || towhichserver==3)
  929. {
  930. if(wsClient!=null && connected)
  931. {
  932. var msg=JSON.stringify(jsobject);
  933. if(jsobject!=heartPacket)
  934. _log('发送到服务端 '+msg);
  935. wsClient.send(msg);
  936. }
  937. }
  938. if(towhichserver==2 || towhichserver==3)
  939. {
  940. if(wsClientSlave!=null && connectedSlave)
  941. {
  942. var msg=JSON.stringify(jsobject);
  943. if(jsobject!=heartPacket)
  944. _log('发送到备用服务器 '+msg);
  945. wsClientSlave.send(msg);
  946. }
  947. }
  948. }
  949. //添加日志到日志窗口
  950. function _log(logmsg)
  951. {
  952. //console.log("socket>>>log", logmsg);
  953. //return;
  954. var logwindow=document.getElementById("logwindow");
  955. if(logwindow!=null)
  956. {
  957. if(logwindow.value.length>5000)
  958. logwindow.value="";
  959. logwindow.value=logwindow.value+(new Date()).toLocaleString()+" "+logmsg+"\n";
  960. }
  961. }
  962. //当收到来自备用服务器的包
  963. function _onreceivefromslaveserver(data)
  964. {
  965. _onreceivefromserver(data);
  966. }
  967. //当websocket收到服务器发来的socket包
  968. function _onreceivefromserver(data)
  969. {
  970. var jso=JSON.parse(data);
  971. if(jso==null)
  972. {
  973. _log("recv invalid packet="+data);
  974. return false;
  975. }
  976. if(jso.r!=null)
  977. jso=jso.r;
  978. if(typeof jso.fun == 'string')
  979. jso.fun=parseInt(jso.fun);
  980. //_log('recv from server: '+JSON.stringify(jso));
  981. switch(jso.fun)
  982. {
  983. case Funs.login:
  984. if(jso.err==0)
  985. logined=true;
  986. if(TLWSA.onLoginreturn!=null)
  987. TLWSA.onLoginreturn(jso.err);
  988. fsmState = WSAState.Idle;
  989. break;
  990. case Funs.acw:
  991. if(fsmState == WSAState.Waiting && fsmWaitingwho==jso.fun)
  992. { if(TLWSA.onAcwreturn!=null)
  993. TLWSA.onAcwreturn(jso.err);
  994. fsmState = WSAState.Idle;
  995. }
  996. else
  997. {
  998. if(TLWSA.onAcw!=null)
  999. TLWSA.onAcw(0);
  1000. }
  1001. break;
  1002. case Funs.wca:
  1003. if(fsmState == WSAState.Waiting && fsmWaitingwho==jso.fun)
  1004. {
  1005. if(TLWSA.onWcareturn!=null)
  1006. TLWSA.onWcareturn(jso.err);
  1007. fsmState = WSAState.Idle;
  1008. }
  1009. else
  1010. {
  1011. if(TLWSA.onWca)
  1012. TLWSA.onWca(0);
  1013. }
  1014. break;
  1015. case Funs.mute:
  1016. if(fsmState == WSAState.Waiting && fsmWaitingwho==jso.fun)
  1017. { if(TLWSA.onMutereturn!=null)
  1018. TLWSA.onMutereturn(jso.err);
  1019. fsmState = WSAState.Idle;
  1020. }
  1021. break;
  1022. case Funs.unmute:
  1023. if(fsmState == WSAState.Waiting && fsmWaitingwho==jso.fun)
  1024. {
  1025. if(TLWSA.onUnmutereturn!=null)
  1026. TLWSA.onUnmutereturn(jso.err);
  1027. fsmState = WSAState.Idle;
  1028. }
  1029. break;
  1030. case Funs.logoff:
  1031. if(jso.err==0)
  1032. logined=false;
  1033. if(fsmState == WSAState.Waiting && fsmWaitingwho==jso.fun)
  1034. {
  1035. if(TLWSA.onLogoffreturn!=null)
  1036. TLWSA.onLogoffreturn(jso.err);
  1037. fsmState = WSAState.Idle;
  1038. }
  1039. else
  1040. {
  1041. if(TLWSA.onLogoff!=null)
  1042. TLWSA.onLogoff(0);
  1043. }
  1044. break;
  1045. case Funs.call:
  1046. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1047. if (TLWSA.onCallreturn != null)
  1048. TLWSA.onCallreturn(jso.err);
  1049. fsmState = WSAState.Idle;
  1050. }
  1051. break;
  1052. case Funs.callin_notify:
  1053. if(TLWSA.onCallin)
  1054. TLWSA.onCallin(jso);
  1055. break;
  1056. case Funs.transfer:
  1057. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1058. if (TLWSA.onTransferreturn != null)
  1059. TLWSA.onTransferreturn(jso.err);
  1060. fsmState = WSAState.Idle;
  1061. }
  1062. break;
  1063. case Funs.listen:
  1064. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1065. if (TLWSA.onStartlistenreturn != null)
  1066. TLWSA.onStartlistenreturn(jso.err);
  1067. fsmState = WSAState.Idle;
  1068. }
  1069. break;
  1070. case Funs.stoplisten:
  1071. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1072. if (TLWSA.onStoplistenreturn != null)
  1073. TLWSA.onStoplistenreturn(jso.err);
  1074. fsmState = WSAState.Idle;
  1075. }
  1076. break;
  1077. case Funs.answer:
  1078. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1079. if (TLWSA.onAnswercallreturn != null)
  1080. TLWSA.onAnswercallreturn(jso.err);
  1081. fsmState = WSAState.Idle;
  1082. }
  1083. else {
  1084. if (TLWSA.onAnswer != null)
  1085. TLWSA.onAnswer(0);
  1086. }
  1087. break;
  1088. case Funs.onhook:
  1089. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1090. if (TLWSA.onOnhookreturn != null)
  1091. TLWSA.onOnhookreturn(jso.err);
  1092. fsmState = WSAState.Idle;
  1093. }
  1094. else {
  1095. if (TLWSA.onCallend != null)
  1096. TLWSA.onCallend(jso);
  1097. }
  1098. break;
  1099. case Funs.stoptransfer:
  1100. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1101. if (TLWSA.onCanceltransferreturn != null)
  1102. TLWSA.onCanceltransferreturn(jso.err);
  1103. fsmState = WSAState.Idle;
  1104. }
  1105. break;
  1106. case Funs.consulttransfer:
  1107. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1108. if (TLWSA.onConsulttransferreturn != null)
  1109. TLWSA.onConsulttransferreturn(jso.err);
  1110. fsmState = WSAState.Idle;
  1111. }
  1112. break;
  1113. case Funs.completeconsulttransfer:
  1114. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1115. if (TLWSA.onCompleteconsulttransferreturn != null)
  1116. TLWSA.onCompleteconsulttransferreturn(jso.err);
  1117. fsmState = WSAState.Idle;
  1118. }
  1119. break;
  1120. case Funs.cancelcall:
  1121. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1122. if (TLWSA.onCancelcallreturn != null)
  1123. TLWSA.onCancelcallreturn(jso.err);
  1124. fsmState = WSAState.Idle;
  1125. }
  1126. break;
  1127. case Funs.callend:
  1128. if(TLWSA.onCallend)
  1129. TLWSA.onCallend(jso);
  1130. break;
  1131. case Funs.transfertoivr:
  1132. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1133. if (TLWSA.onTransfertoivrreturn != null)
  1134. TLWSA.onTransfertoivrreturn(jso.err);
  1135. fsmState = WSAState.Idle;
  1136. }
  1137. break;
  1138. case Funs.queue:
  1139. if (TLWSA.onQueue != null)
  1140. TLWSA.onQueue(jso.crs, jso.caller, jso.callee, jso.data);
  1141. break;
  1142. case Funs.holdcallend:
  1143. if (TLWSA.onHoldcallreleased != null)
  1144. TLWSA.onHoldcallreleased(0);
  1145. break;
  1146. case Funs.hold:
  1147. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1148. if (TLWSA.onHoldcallreturn != null)
  1149. TLWSA.onHoldcallreturn(jso.err);
  1150. fsmState = WSAState.Idle;
  1151. }
  1152. break;
  1153. case Funs.unhold:
  1154. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1155. if (TLWSA.onUnholdcallreturn != null)
  1156. TLWSA.onUnholdcallreturn(jso.err);
  1157. fsmState = WSAState.Idle;
  1158. }
  1159. break;
  1160. case Funs.cut:
  1161. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1162. if (TLWSA.onForceonhookreturn != null)
  1163. TLWSA.onForceonhookreturn(jso.err);
  1164. fsmState = WSAState.Idle;
  1165. }
  1166. break;
  1167. case Funs.setphonenumber:
  1168. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1169. if (TLWSA.onSetphonenumberreturn != null)
  1170. TLWSA.onSetphonenumberreturn(jso.err);
  1171. fsmState = WSAState.Idle;
  1172. }
  1173. break;
  1174. case Funs.getcall:
  1175. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1176. if (TLWSA.onGetcallreturn != null)
  1177. TLWSA.onGetcallreturn(jso.err,jso.caller,jso.callee,jso.data,jso.crs);
  1178. fsmState = WSAState.Idle;
  1179. }
  1180. break;
  1181. case Funs.intrude:
  1182. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1183. if (TLWSA.onIntrudereturn != null)
  1184. TLWSA.onIntrudereturn(jso.err);
  1185. fsmState = WSAState.Idle;
  1186. }
  1187. break;
  1188. case Funs.callresult:
  1189. if (TLWSA.onCallresult != null)
  1190. TLWSA.onCallresult(jso);
  1191. break;
  1192. case Funs.transferresult:
  1193. if (TLWSA.onTransferresult != null)
  1194. TLWSA.onTransferresult(jso.err);
  1195. break;
  1196. case Funs.consulttransfercalleeanswer:
  1197. if (TLWSA.onConsulttransfercalleeanswer != null)
  1198. TLWSA.onConsulttransfercalleeanswer(jso.crs);
  1199. break;
  1200. case Funs.kill:
  1201. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1202. if (TLWSA.onKillreturn != null)
  1203. TLWSA.onKillreturn(jso.err);
  1204. fsmState = WSAState.Idle;
  1205. }
  1206. break;
  1207. case Funs.swap:
  1208. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1209. if (TLWSA.onSwapcallreturn != null)
  1210. TLWSA.onSwapcallreturn(jso.err);
  1211. fsmState = WSAState.Idle;
  1212. }
  1213. break;
  1214. case Funs.activate:
  1215. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1216. if (TLWSA.onActivatecallreturn != null)
  1217. TLWSA.onActivatecallreturn(jso.err);
  1218. fsmState = WSAState.Idle;
  1219. }
  1220. break;
  1221. case Funs.stateinfo:
  1222. allAgcStatejson = jso;
  1223. if(TLWSA.onStatechange!=null)
  1224. {
  1225. TLWSA.onStatechange();
  1226. }
  1227. break;
  1228. case Funs.mystateinfo:
  1229. if(TLWSA.onMyStatechange!=null)
  1230. {
  1231. TLWSA.onMyStatechange(jso);
  1232. }
  1233. break;
  1234. case Funs.transfertoivrandwait:
  1235. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1236. if (TLWSA.onTransfertoivrreturn != null)
  1237. TLWSA.onTransfertoivrreturn(jso.err);
  1238. fsmState = WSAState.Idle;
  1239. }
  1240. break;
  1241. case Funs.keepcallend:
  1242. if (TLWSA.onKeepcallreleased != null)
  1243. TLWSA.onKeepcallreleased(0);
  1244. break;
  1245. case Funs.quitqueue:
  1246. if (TLWSA.onQuitqueue != null)
  1247. TLWSA.onQuitqueue(jso.crs);
  1248. break;
  1249. case Funs.answerqueue:
  1250. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1251. if (TLWSA.onAnswerqueuereturn != null)
  1252. TLWSA.onAnswerqueuereturn(jso.err);
  1253. fsmState = WSAState.Idle;
  1254. }
  1255. break;
  1256. case Funs.forcedacw:
  1257. if (TLWSA.onAcw != null)
  1258. TLWSA.onAcw(0);
  1259. break;
  1260. case Funs.forcedwca:
  1261. if (TLWSA.onWca != null)
  1262. TLWSA.onWca(0);
  1263. break;
  1264. case Funs.licenseinfo:
  1265. LicenseJson = jso;
  1266. break;
  1267. case Funs.sendmessage:
  1268. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1269. if (TLWSA.onSendmessagetoagentreturn != null)
  1270. TLWSA.onSendmessagetoagentreturn(jso.err);
  1271. fsmState = WSAState.Idle;
  1272. }
  1273. break;
  1274. case Funs.receivemessage:
  1275. if (TLWSA.onRecvmsg != null)
  1276. TLWSA.onRecvmsg(jso.msg,jso.from);
  1277. break;
  1278. case Funs.hardwarefail:
  1279. if (TLWSA.onHardwarefail != null)
  1280. TLWSA.onHardwarefail(0);
  1281. break;
  1282. case Funs.hookstate:
  1283. if (TLWSA.onHookstate != null)
  1284. TLWSA.onHookstate(jso);
  1285. break;
  1286. case Funs.blindtransfer:
  1287. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1288. if (TLWSA.onBlindtransferreturn != null)
  1289. TLWSA.onBlindtransferreturn(jso.err);
  1290. fsmState = WSAState.Idle;
  1291. }
  1292. break;
  1293. case Funs.getnodestate:
  1294. if(fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1295. if(TLWSA.onGetnodestatereturn !=null)
  1296. TLWSA.onGetnodestatereturn(jso);
  1297. fsmState = WSAState.Idle;
  1298. }
  1299. break;
  1300. case Funs.transfernode:
  1301. if(fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1302. if(TLWSA.onTransfernodereturn !=null)
  1303. TLWSA.onTransfernodereturn(jso);
  1304. fsmState = WSAState.Idle;
  1305. }
  1306. break;
  1307. case Funs.loginotheragent:
  1308. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1309. if (TLWSA.onLoginotheragentreturn != null)
  1310. TLWSA.onLoginotheragentreturn(jso.err);
  1311. fsmState = WSAState.Idle;
  1312. }
  1313. break;
  1314. case Funs.misscall:
  1315. if (TLWSA.onMisscall != null)
  1316. TLWSA.onMisscall(0);
  1317. break;
  1318. case Funs.stateinfo2:
  1319. break;
  1320. case Funs.slaveserverfail:
  1321. if(TLWSA.onSlaveserverfail!=null)
  1322. TLWSA.onSlaveserverfail(jso.err);
  1323. break;
  1324. case Funs.switchtoslaveserver:
  1325. if(TLWSA.onSwitchtoslaveserver!=null)
  1326. TLWSA.onSwitchtoslaveserver(jso.err);
  1327. break;
  1328. case Funs.calleealerting:
  1329. if (TLWSA.onCalleealerting != null)
  1330. TLWSA.onCalleealerting(0);
  1331. break;
  1332. case Funs.subscribe:
  1333. if (fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1334. if (TLWSA.onSubscribestateinforeturn != null)
  1335. TLWSA.onSubscribestateinforeturn(jso.err);
  1336. fsmState = WSAState.Idle;
  1337. }
  1338. break;
  1339. case Funs.conferencestart:
  1340. if(fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1341. if(TLWSA.onConferencestartreturn !=null)
  1342. TLWSA.onConferencestartreturn(jso);
  1343. fsmState = WSAState.Idle;
  1344. }
  1345. break;
  1346. case Funs.conferenceappendmember:
  1347. if(fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1348. if(TLWSA.onConferenceappendmemberreturn !=null)
  1349. TLWSA.onConferenceappendmemberreturn(jso);
  1350. fsmState = WSAState.Idle;
  1351. }
  1352. break;
  1353. case Funs.conferencequery:
  1354. if(fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1355. if(TLWSA.onConferencequeryreturn !=null)
  1356. TLWSA.onConferencequeryreturn(jso);
  1357. fsmState = WSAState.Idle;
  1358. }
  1359. break;
  1360. case Funs.conferencedismiss:
  1361. if(fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1362. if(TLWSA.onConferencedismissreturn !=null)
  1363. TLWSA.onConferencedismissreturn(jso);
  1364. fsmState = WSAState.Idle;
  1365. }
  1366. break;
  1367. case Funs.conferencekickout:
  1368. if(fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1369. if(TLWSA.onConferencekickoutreturn !=null)
  1370. TLWSA.onConferencekickoutreturn(jso);
  1371. fsmState = WSAState.Idle;
  1372. }
  1373. break;
  1374. case Funs.conferencechangememberstate:
  1375. if(fsmState == WSAState.Waiting && fsmWaitingwho == jso.fun) {
  1376. if(TLWSA.onConferencechangememberstatereturn !=null)
  1377. TLWSA.onConferencechangememberstatereturn(jso);
  1378. fsmState = WSAState.Idle;
  1379. }
  1380. break;
  1381. case Funs.conferencememberstate:
  1382. if(TLWSA.onConferencememberstate !=null)
  1383. TLWSA.onConferencememberstate(jso);
  1384. break;
  1385. }
  1386. }
  1387. }(window));