Guest User

Dialer.js

a guest
Apr 15th, 2017
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 74.51 KB | None | 0 0
  1. var loggedin=0;
  2.  
  3. var sTransferNumber;
  4. var oRingTone, oRingbackTone;
  5. var oSipStack, oSipSessionRegister, oSipSessionCall, oSipSessionTransferCall;
  6. var videoRemote, videoLocal, audioRemote;
  7. var bFullScreen = false;
  8. var oNotifICall;
  9. var bDisableVideo = false;
  10. var viewLocalScreencast; // <video> (webrtc) or <div> (webrtc4all)
  11. var oConfigCall;
  12. var oReadyStateTimer;
  13.  
  14. var divVideo, divCallOptions;
  15. var hangupgrowl=0;
  16. var answergrowl=0;
  17. var txtDisplayName, txtPrivateIdentity, txtPublicIdentity, txtRealm;
  18. var txtPhoneNumber;
  19. var btnCall, btnHangUp;
  20. var txtRegStatus, txtCallStatus;
  21. var btnRegister, btnUnRegister;
  22. var btnFullScreen, btnHoldResume, btnTransfer, btnKeyPad;
  23.  
  24.  
  25. var kstychDialer={};
  26. kstychDialer['mDialerState']='Paused';
  27. kstychDialer['mDialerSubState']='NotReady';
  28. kstychDialer['mDialerCampaign']='';
  29. kstychDialer['mdispodata']='';
  30. kstychDialer['mDialNextStatus']='New';
  31. kstychDialer['mmanualallow']='No';
  32. kstychDialer['pendingDataSize']=0;
  33. kstychDialer['phone']=kstychAppObject['user']['sipid'];
  34. kstychDialer['connection']={'number':'1000'+kstychAppObject['user']['sipid'],'connected':0,'mic':1,'speaker':1,'channel':'','holdext':''};
  35. kstychDialer["keeplocalconf"]=kstychAppObject['config']['kDialer_keeplocalconf'];
  36. kstychDialer['RedialLast']='';
  37.  
  38. var kstychCall={};
  39. kstychCall['mCallState']='Wait'; //states : ,Wait,Call,Dispo,Close
  40. kstychCall['ts_Wait']=getNowTS();
  41. kstychCall['ts_Call']=0;
  42. kstychCall['ts_Talk']=0;
  43. kstychCall['ts_Dispo']=0;
  44. kstychCall['ts_Close']=0;
  45. kstychCall['callnumber']='';
  46. kstychCall['connections']={};
  47. kstychCall['callid']='';
  48. kstychCall['crmid']='';
  49. kstychCall['campaignid']='';
  50. kstychCall['listid']='';
  51. kstychCall['mdial_CallACK']=0;
  52. kstychCall['mcalldata']='';
  53. kstychCall['userstatus']='';
  54. kstychCall['usersubstatus']='';
  55. kstychCall['usercallback']='';
  56. kstychCall['userremarks']='';
  57. kstychCall['userdata']={};
  58. kstychCall['previewcrmid']='';
  59. kstychCall['callWrapupTime']=300;
  60. kstychCall['prograssiveDelay']=120;
  61. kstychCall['ts_now']=0;
  62.  
  63. kstychCall['bttc_day']='';
  64. kstychCall['bttc_hrs']='';
  65. kstychCall['serv_vs_prod']='';
  66. kstychCall['resolution']='';
  67. kstychCall['satisfy']='';
  68. kstychCall['final_call_assess']='';
  69.  
  70. function kGetDData(obj,key)
  71. {
  72. if(obj=="D")
  73. {
  74. if(kstychDialer[key])return kstychDialer[key];
  75. }
  76. if(obj=="C")
  77. {
  78. if(kstychCall[key])return kstychCall[key];
  79. }
  80. return false;
  81. }
  82. function kSetDData(obj,key,val)
  83. {
  84. if(obj=="D")
  85. {
  86. kstychDialer[key]=val;
  87. }
  88. if(obj=="C")
  89. {
  90. kstychCall[key]=val;
  91. }
  92.  
  93. //TODO update backend user session (userlog)
  94. return false;
  95. }
  96.  
  97. function getNowTS()
  98. {
  99. return Math.floor(Date.now());
  100. }
  101.  
  102. function kcallNewConnection(number)
  103. {
  104. var clines=kGetDData('C','connections');
  105. if(!clines[number])
  106. {
  107. clines[number]={};
  108. clines[number]['connected']=0;
  109. clines[number]['channel']='';
  110. clines[number]['callid']='';
  111. clines[number]['ts_Call']=0;
  112. clines[number]['ts_Talk']=0;
  113. clines[number]['ts_Dispo']=0;
  114. clines[number]['speaker']=1;
  115. clines[number]['mic']=1;
  116. clines[number]['holdext']='';
  117. kSetDData('C','connections',clines);
  118. }
  119. }
  120. function kcallSetConnection(number,key,val)
  121. {
  122. kcallNewConnection(number);
  123. var clines=kGetDData('C','connections');
  124. clines[number][key]=val;
  125. kSetDData('C','connections',clines);
  126. }
  127. function kcallGetConnection(number,key)
  128. {
  129. kcallNewConnection(number);
  130. var clines=kGetDData('C','connections');
  131. return clines[number][key];
  132. }
  133. function kcallHasConnection(number)
  134. {
  135. var clines=kGetDData('C','connections');
  136. if(!clines[number])return false;
  137. return true;
  138. }
  139.  
  140. function dialerQuickOpen(varid,num,state,substate,autorun)
  141. {
  142. if(kstychCall['mCallState']=="Wait")
  143. {
  144. var oldpreviewid=kstychCall['previewcrmid'];
  145. kstychCall['previewcrmid']='';
  146. kstychCall['callnumber']='';
  147. kstychCall['crmid']='';
  148.  
  149. if(varid!=''&&varid>0)
  150. {
  151. if(num!=''&&num!='0')
  152. {
  153. kstychCall['callnumber']=num;
  154. $("#manualdialnumber_txt").val(num);
  155. }
  156.  
  157. if(oldpreviewid!=varid||state!=kstychDialer['mDialerState'])
  158. {
  159. kstychCall['previewcrmid']=varid;//progressiveDelay set to 1 //TODO
  160. updateDialerState("dialer","mDialerState",state,"mDialerSubState",substate);
  161. }
  162. else
  163. {
  164. kstychCall['previewcrmid']=varid;
  165. updateDialerState();
  166. }
  167. kDialerModel();
  168. }
  169. else
  170. {
  171. if(num!='')
  172. {
  173. $("#manualdialnumber_txt").val(num);
  174. updateDialerState("dialer","mDialerState","Manual");
  175. kDialerModel();
  176. if(autorun==1)setTimeout(function(){$("#manualdial_btn").click()},350);
  177. }
  178. }
  179. }
  180. else
  181. {
  182. simpleNotification('error','topRight',"Already on call!");
  183. }
  184. }
  185. function dialerAddAlt(i,varid)
  186. {
  187. var phone=$("#dialer_altphone"+i).val();
  188. var desc=$("#dialer_altphone_lbl_"+i).val();
  189.  
  190. if(!/^\d{10}$/.test(phone)&&!/^\d{11}$/.test(phone))
  191. {
  192. simpleNotification('error','topRight',"Please enter 10 or 11 neumeric digits only");
  193. return;
  194. }
  195. if(desc=="")
  196. {
  197. simpleNotification('error','topRight',"Please enter number description");
  198. return;
  199. }
  200.  
  201. if(phone!="")
  202. {
  203. var data="varid="+varid;
  204. data+="&keys=altphone"+i+",altphone_lbl_"+i;
  205. data+="&altphone"+i+"="+phone;
  206. data+="&altphone_lbl_"+i+"="+desc;
  207.  
  208. doAjax('record?action=addkey',data,'dialersearchresults', 'ajax_manualdial','singlefail','POST', function(retstr){
  209. $("#dialersearchresults").html('<div id=divworking></div><div style="clear:both"></div>');
  210. showRecruit(varid);
  211. });
  212. }
  213.  
  214. }
  215. function dialerDelAlt(i,varid)
  216. {
  217. doAjax('record?action=delaltphone&i='+i+'&varid='+varid,'','dialersearchresults', 'ajax_manualdial','singlefail','POST', function(retstr){
  218. $("#dialersearchresults").html('<div id=divworking></div><div style="clear:both"></div>');
  219. showRecruit(varid);
  220. });
  221. }
  222.  
  223. function kDialerSpy(sipid,fun)
  224. {
  225. var datastr="kstychCall="+JSON.stringify(kstychCall);
  226. datastr+="&kstychDialer="+JSON.stringify(kstychDialer);
  227.  
  228. datastr+="&sipid="+sipid;
  229. datastr+="&mode="+fun;
  230.  
  231. try{sipHangUp();}catch(e){console.log(e);}
  232. doAjax('dialer?action=spychannel',datastr,'__fake__div__', 'ajax_spydial','singlefail','POST', function(retstr){
  233.  
  234. });
  235. }
  236. function kCallAction(num,action)
  237. {
  238. //action : MuteSpeaker,UnMuteSpeaker,MuteMic,UnMuteMic,Hangup,Hold,UnHold
  239. if(num=="u")
  240. {
  241. if(action=="MuteMic")kstychDialer['connection']['mic']=sipToggleMute();
  242. if(action=="UnMuteMic")kstychDialer['connection']['mic']=sipToggleMute();
  243. if(action=="MuteSpeaker");
  244. if(action=="UnMuteSpeaker");
  245. if(action=="Hangup");
  246. //if(action=="Hold");
  247. //if(action=="UnHold");
  248. }
  249. else
  250. {
  251. if(num=="c")num=kstychCall['callnumber'];
  252. var channel=kcallGetConnection(num,'channel');
  253. if(channel!='')
  254. {
  255. if(action=="MuteMic")kcallSetConnection(num,'mic',0);
  256. if(action=="UnMuteMic")kcallSetConnection(num,'mic',1);
  257. if(action=="MuteSpeaker")kcallSetConnection(num,'speaker',0);
  258. if(action=="UnMuteSpeaker")kcallSetConnection(num,'speaker',1);
  259. if(action=="Hangup");
  260. //if(action=="Hold")kcallSetConnection(num,'holdext');
  261. //if(action=="UnHold")kcallSetConnection(num,'holdext');
  262.  
  263. doAjax('dialer?action=kCallAction&actiontype='+action+'&conf='+kstychDialer['connection']['number']+'&channel='+channel,'','__fake__div__', 'ajax_confdial','singlefail','POST', function(retstr){
  264.  
  265. });
  266. }
  267. else simpleNotification('error','topRight',"No Channel for ["+num+"]");
  268. }
  269.  
  270. updateDialerState();
  271. }
  272.  
  273. function dialerDispNumberClick()
  274. {
  275. var lastnumber=$("#spandialer_num").html();
  276.  
  277. if(kstychCall['mCallState']=="Dispo")
  278. {
  279. saveCloseDialerCall("REDIAL");
  280. }
  281. }
  282. function dialerAddConfCall()
  283. {
  284. var confnumber=$("#dialerConfNumberTxt").val();
  285. if(confnumber==''||confnumber.length<2)
  286. {
  287. simpleNotification('error','topRight',"Empty Number");
  288. return;
  289. }
  290.  
  291. if(!kcallHasConnection(kstychCall['callnumber'])||kstychCall['ts_Dispo']>1)
  292. {
  293. simpleNotification('error','topRight',"No call to conference");
  294. return;
  295. }
  296.  
  297. var datastr="kstychCall="+JSON.stringify(kstychCall);
  298. datastr+="&kstychDialer="+JSON.stringify(kstychDialer);
  299.  
  300. kcallNewConnection(confnumber);
  301. doAjax('dialer?action=addconfcall&confnumber='+confnumber,datastr,'__fake__div__', 'ajax_confdial','singlefail','POST', function(retstr){
  302. if(retstr.responseText.indexOf('Error')<0)
  303. {
  304. kcallSetConnection(confnumber,'callid',retstr.responseText);
  305. kcallSetConnection(confnumber,'ts_Call',getNowTS());
  306.  
  307. updateDialerState();
  308. }
  309. else
  310. {
  311. simpleNotification('error','topRight',retstr.responseText);
  312. }
  313. });
  314. }
  315.  
  316. function incomingCall(calllog,crmid,number)
  317. {
  318. $("#dialersearchresults").html('<div id=divworking></div><div style="clear:both"></div>');
  319.  
  320. kcallSetConnection(number,'callid',calllog);
  321. kcallSetConnection(number,'connected',1);
  322.  
  323. kSetDData('C','callid',calllog);
  324. kSetDData('C','crmid',crmid);
  325.  
  326. if(crmid>0)showRecruit(crmid);
  327. else
  328. {
  329. createSearchRecordDiv('dialersearchresults');
  330. }
  331.  
  332. kSetDData('C','mCallState','Call');
  333. kSetDData('C','ts_Call',getNowTS());
  334. kSetDData('C','ts_Talk',getNowTS());
  335.  
  336. kstychCall["callnumber"]=number;
  337.  
  338. updateDialerState();
  339. kDialerModel();
  340. }
  341.  
  342. function dialerUIUpdate(var1,var2,var3)
  343. {
  344. var3parts=var3.split("~");
  345. var3parts[2]=atob(var3parts[2]);
  346. if(var1=="dialstart")
  347. {
  348. if(var2=="c")
  349. {
  350. if(var3parts[1]&&var3parts[1]!="")
  351. {
  352. kcallSetConnection(var3parts[1],'connected',1);
  353. kcallSetConnection(var3parts[1],'channel',var3parts[2]);
  354. kcallSetConnection(var3parts[1],'ts_Call',getNowTS());
  355. if(var3parts[1]==kstychCall['callnumber'])kSetDData('C','ts_Call',getNowTS());
  356.  
  357. updateDialerState();
  358. }
  359. }
  360. else if(var2=="u")
  361. {
  362. var dialerConnection=kGetDData("D","connection");
  363. dialerConnection['channel']=var3parts[2];
  364. kSetDData("D","connection",dialerConnection);
  365. }
  366. }
  367.  
  368. if(var1=="dialend")
  369. {
  370. if(var2=="c")
  371. {
  372. if(var3parts[1]&&var3parts[1]!="")
  373. {
  374. kcallSetConnection(var3parts[1],'connected',1);
  375. kcallSetConnection(var3parts[1],'channel',var3parts[2]);
  376. kcallSetConnection(var3parts[1],'ts_Talk',getNowTS());
  377. if(var3parts[1]==kstychCall['callnumber'])kSetDData('C','ts_Talk',getNowTS());
  378.  
  379. updateDialerState();
  380. }
  381. }
  382. }
  383.  
  384. if(var1=="hangup")
  385. {
  386. if(var2=="c")
  387. {
  388. if(var3parts[1]&&var3parts[1]!="")
  389. {
  390. kcallSetConnection(var3parts[1],'connected',0);
  391. if(kcallGetConnection(var3parts[1],'ts_Call')==0)kcallSetConnection(var3parts[1],'ts_Call',getNowTS());
  392. if(kcallGetConnection(var3parts[1],'ts_Talk')==0)kcallSetConnection(var3parts[1],'ts_Talk',getNowTS());
  393. kcallSetConnection(var3parts[1],'ts_Dispo',getNowTS());
  394.  
  395. if(var3parts[1]==kstychCall['callnumber'])
  396. {
  397. if(kstychCall['ts_Call']==0)kSetDData('C','ts_Call',getNowTS());
  398. if(kstychCall['ts_Talk']==0)kSetDData('C','ts_Talk',getNowTS());
  399.  
  400. kSetDData('C','ts_Dispo',getNowTS());
  401. hangupCall();
  402. }
  403.  
  404. updateDialerState();
  405. }
  406. }
  407. }
  408. }
  409.  
  410. function incomingPopupAlert(var1,var2,var3)
  411. {
  412. //var incomingnotify=growlSNotify(var1,var2,"top-right");
  413. //setTimeout(function(){$.gritter.remove(incomingnotify, {fade: true,speed: 'slow'});incomingnotify=0;},1500);
  414.  
  415. $.titleAlert(var1+" "+var2, {
  416. requireBlur:true,
  417. stopOnFocus:true,
  418. duration:1500,
  419. interval:500
  420. });
  421.  
  422. kDesktopNotification("",var1,var2,1500);
  423. }
  424.  
  425. function outgoingCall()
  426. {
  427. $("#dialersearchresults").html("");
  428. kSetDData('C','callnumber',$("#manualdialnumber_txt").val());
  429.  
  430. var datastr="kstychCall="+JSON.stringify(kstychCall);
  431. datastr+="&kstychDialer="+JSON.stringify(kstychDialer);
  432.  
  433. var client = $('#tcampaign_select').val();
  434.  
  435. if(kstychDialer['mDialerState']=="Manual")
  436. {
  437. if(kstychCall['callnumber']!="")
  438. {
  439. doAjax('dialer?action=newcall&client='+client,datastr,'dialersearchresults', 'ajax_manualdial','singlefail','POST', function(retstr){
  440. if(kstychCall['crmid']!="")
  441. {
  442. kSetDData('C','mCallState','Call');
  443. kSetDData('C','ts_Call',getNowTS());
  444.  
  445. if(kstychCall['crmid']==0)
  446. {
  447. createSearchRecordDiv('dialersearchresults');
  448. }
  449. updateDialerState();
  450. }
  451. else
  452. {
  453. kSetDData('C','previewcrmid','');
  454. updateDialerState("dialer","mDialerState","Manual");
  455. }
  456. });
  457. }
  458. else
  459. {
  460. simpleNotification('error','topRight',"Empty Number");
  461. }
  462. }
  463. if(kstychDialer['mDialerState']=="DialNext")
  464. {
  465. doAjax('dialer?action=newcall&client='+client,datastr,'dialersearchresults', 'ajax_manualdial','singlefail','POST', function(retstr){
  466. if(kstychCall['crmid']!="")
  467. {
  468. kSetDData('C','mCallState','Call');
  469. kSetDData('C','ts_Call',getNowTS());
  470.  
  471. updateDialerState();
  472. }
  473. else
  474. {
  475. simpleNotification('error','topRight',"Failed to Dial Next ["+kstychDialer['mDialNextStatus']+"] Record");
  476.  
  477. kSetDData('C','previewcrmid','');
  478. updateDialerState("dialer","mDialerState","DialNext");
  479. }
  480. });
  481. }
  482. if(kstychDialer['mDialerState']=="Progressive")
  483. {
  484. doAjax('dialer?action=newcall&client='+client,datastr,'dialersearchresults', 'ajax_manualdial','singlefail','POST', function(retstr){
  485. if(kstychCall['crmid']!="")
  486. {
  487. kSetDData('C','mCallState','Call');
  488. kSetDData('C','ts_Call',getNowTS());
  489.  
  490. updateDialerState();
  491. }
  492. else
  493. {
  494. simpleNotification('error','topRight',"Failed to Dial Next ["+kstychDialer['mDialNextStatus']+"] Record");
  495. //Cleanup?
  496.  
  497. kSetDData('C','previewcrmid','');
  498. updateDialerState("dialer","mDialerState","DialNext");
  499. }
  500. });
  501. }
  502.  
  503.  
  504. //check if current state is valid to make a call
  505. //prepare ajax parameters
  506. //call dialer controller to submit request
  507. //check return values for success
  508. //update dialer and call objects
  509. }
  510. function hangupCall()
  511. {
  512. /* Commented BY AmolG on 15 Feb 2017 */
  513. //kstychCall['ts_now']=getNowTS();
  514.  
  515. var datastr="kstychCall="+JSON.stringify(kstychCall);
  516. datastr+="&kstychDialer="+JSON.stringify(kstychDialer);
  517. doAjax('dialer?action=hangupall',datastr,'', 'ajax_manualdial','singlefail','POST',
  518. function(retstr){
  519.  
  520. if(retstr.responseText.indexOf('Error')<0)
  521. {
  522. kSetDData('C','mCallState',"Dispo");
  523. kSetDData('C','ts_Dispo',getNowTS());
  524.  
  525. if(kstychDialer["keeplocalconf"]==0)
  526. {
  527. try{sipHangUp();}catch(e){console.log(e);}
  528. var dialerConnection=kGetDData("D","connection");
  529. dialerConnection['connected']=0;
  530. dialerConnection['channel']='';
  531. updateDialerState("dialer","connection",dialerConnection);
  532. }
  533. else updateDialerState();
  534. }
  535. else
  536. {
  537. simpleNotification('error','topRight',retstr.responseText);
  538. updateDialerState();
  539. }
  540. });
  541. }
  542. function saveCloseDialerCall(flag)
  543. {
  544. kstychCall['userstatus']=$('#dialer_userstatus').val();
  545. kstychCall['usersubstatus']=$('#dialer_usersubstatus').val();
  546. kstychCall['usercallback']=$('#dialer_usercallback').val();
  547. kstychCall['userremarks']=$('#dialer_userremarks').val();
  548. kstychCall['userflag']=$('#dialer_flag').val();
  549.  
  550. /* Commented BY AmolG on 15 Feb 2017 */
  551. /*kstychCall['priority']=$('#priority').val();
  552.  
  553. kstychCall['bttc_day']=$('#bttc_day').val();
  554. kstychCall['bttc_hrs']=$('#bttc_hrs').val();
  555. kstychCall['serv_vs_prod']=$('#serv_vs_prod').val();
  556. kstychCall['resolution']=$('#resolution').val();
  557. kstychCall['satisfy']=$('#satisfy').val();
  558. kstychCall['final_call_assess']=$('#final_call_assess').val();*/
  559.  
  560. if(typeof customerDispofields != 'undefined')kstychCall['userdata']=customerDispofields;
  561.  
  562. if(flag=="AUTOWRAPUP")
  563. {
  564. kstychCall['userstatus']="AUTOWRAPUP";
  565. kstychCall['usersubstatus']="AUTOWRAPUP";
  566. $('#dialer_usercallback').val("");
  567. kstychCall['usercallback']="";
  568. kstychCall['userremarks']="";
  569. kstychCall['userflag']="";
  570. }
  571. else if(flag=="REDIAL")
  572. {
  573. kstychCall['userstatus']="REDIAL";
  574. kstychCall['usersubstatus']="REDIAL";
  575. $('#dialer_usercallback').val("");
  576. kstychCall['usercallback']="";
  577. kstychCall['userremarks']="";
  578. kstychCall['userflag']="";
  579.  
  580. kstychDialer['RedialLast']='Yes';
  581. }
  582. else if(!$('#dialer_userstatus').length)
  583. {
  584. kstychCall['userstatus']="NORECORD";
  585. kstychCall['usersubstatus']="NORECORD";
  586. kstychCall['usercallback']="";
  587. kstychCall['userremarks']="";
  588. kstychCall['userflag']="";
  589.  
  590. $('#dialer_usercallback').val("");
  591. }
  592. else
  593. {
  594.  
  595.  
  596. if(kstychCall['userstatus']==""||kstychCall['usersubstatus']=="")
  597. {
  598. simpleNotification('error','topRight',"Please Select Disposition and Subdisposition");
  599. return;
  600. }
  601.  
  602. //For $ dropdown Condition - Changes done By Manish on 27-10-16
  603. /*if(kstychCall['userstatus']=="Contacted - FollowUp - Specific" || kstychCall['userstatus']=="Contacted - Follow-Up - Generic")
  604. {
  605. if(kstychCall['final_call_assess']==""&&kstychCall['serv_vs_prod']==""&&kstychCall['resolution']==""&&kstychCall['satisfy']=="")
  606. {
  607. simpleNotification('Error','topRight',"Please Select ALL(Service vs Product and Resolution and Satisfaction and Final_call_Assessment)");
  608. return;
  609. }
  610. }*/
  611.  
  612. if(kstychCall['userstatus'].toLowerCase().indexOf("followup")>-1||kstychCall['userstatus'].toLowerCase().indexOf("callback")>-1)
  613. {
  614. if($('#dialer_usercallback').val()=="")
  615. {
  616. simpleNotification('error','topRight',"Please select Callback date within one month in future");
  617. return;
  618. }
  619. }
  620. else
  621. {
  622. if($('#dialer_usercallback').val()!="")
  623. {
  624. simpleNotification('error','topRight',"You Cannot input Callback date time in this Disposition");
  625. return;
  626. }
  627. }
  628.  
  629.  
  630. var date1 = new Date();
  631. var date2 = new Date($('#dialer_usercallback').val());
  632. var diff = date2.getTime() - date1.getTime();
  633. if(diff<0||diff>30*24*60*60*1000)
  634. {
  635. simpleNotification('error','topRight',"Please select Callback date within one month in future");
  636. return;
  637. }
  638. var hours = date2.getHours();
  639. var mins = date2.getMinutes();
  640. var fullhour=hours+(mins/60);
  641. if(fullhour<9||fullhour>19)
  642. {
  643. simpleNotification('error','topRight',"Please select Callback Time date within 9AM and 7PM");
  644. return;
  645. }
  646.  
  647. }
  648.  
  649. if($("#recruitsavedata").length)$("#recruitsavedata").click();//TODO hold div in reset, or any error will be lost
  650.  
  651. var datastr="kstychCall="+JSON.stringify(kstychCall);
  652. datastr+="&kstychDialer="+JSON.stringify(kstychDialer);
  653. doAjax('dialer?action=closecall',datastr,'', 'ajax_manualdial','singlefail','POST',
  654. function(retstr){
  655. kSetDData('C','mCallState',"Close");
  656. kSetDData('C','ts_Close',getNowTS());
  657. updateDialerState("action","reset","");
  658. });
  659.  
  660. //Dialog box after Save & Close-Taking from KFormLib.php
  661. $finalCallAssess = $('#final_call_assess').val();
  662.  
  663. if($finalCallAssess == 'Very Good Call With Customer')
  664. {
  665. /*$.gritter.add({
  666. title: 'type',
  667. text: 'text',
  668. class_name: 'gritter-b-center'
  669. });*/
  670. $('#goodCall').dialog({
  671. modal: true,
  672. position: ['center'],
  673. resizable: false,
  674. closeOnEscape: false,
  675. open: function(event, ui){
  676. $(".ui.dialog-titlebar-close", ui.dialog | ui).hide();
  677. setTimeout(function(){$('#goodCall').dialog('close');},5000);
  678. }
  679. });
  680.  
  681. //setTimeout(function(){$('#goodCall').dialog('close');},5000);
  682. }
  683.  
  684. if($finalCallAssess == 'Ok Call')
  685. {
  686. $('#okCall').dialog({
  687. open: function(event, ui){
  688. $(this).css({'max-height':500, 'overflow-y':'auto'});
  689. },
  690. modal: true,
  691. position: ['center'],
  692. resizable: false,
  693. closeOnEscape: false});
  694.  
  695. setTimeout(function(){$('#okCall').dialog('close');},5000);
  696. }
  697.  
  698. if($finalCallAssess == 'Not Interested Customer')
  699. {
  700. $('#notInterest').dialog({
  701. open: function(event, ui){
  702. $(this).css({'max-height':500, 'overflow-y':'auto'});
  703. },
  704. modal: true,
  705. position: ['center'],
  706. resizable: false,
  707. closeOnEscape: false});
  708.  
  709. setTimeout(function(){$('#notInterest').dialog('close');},5000);
  710. }
  711.  
  712. if($finalCallAssess == 'Iritated Customer')
  713. {
  714. $('#iritCust').dialog({
  715. open: function(event, ui){
  716. $(this).css({'max-height':500, 'overflow-y':'auto'});
  717. },
  718. modal: true,
  719. position: ['center'],
  720. resizable: false,
  721. closeOnEscape: false});
  722.  
  723. setTimeout(function(){$('#iritCust').dialog('close');},5000);
  724. }
  725.  
  726. if($finalCallAssess == 'Angry')
  727. {
  728. $('#angry').dialog({
  729. open: function(event, ui){
  730. $(this).css({'max-height':500, 'overflow-y':'auto'});
  731. },
  732. modal: true,
  733. position: ['center'],
  734. resizable: false,
  735. closeOnEscape: false});
  736.  
  737. setTimeout(function(){$('#angry').dialog('close');},5000);
  738. }
  739. }
  740.  
  741. function showWrapUp()
  742. {
  743. kstychCall['userstatus']="Paused";
  744. kstychCall['usersubstatus']="WRAPUP";
  745. $('#dialer_usercallback').val("");
  746. kstychCall['usercallback']="";
  747. kstychCall['userremarks']="";
  748. kstychCall['userflag']="";
  749.  
  750. var datastr="kstychCall="+JSON.stringify(kstychCall);
  751. datastr+="&kstychDialer="+JSON.stringify(kstychDialer);
  752. doAjax('dialer?action=wrapup',datastr,'', 'ajax_manualdial','singlefail','POST',
  753. function(retstr){
  754. dialerTimersUpdate();
  755. });
  756. }
  757.  
  758. function resetDialer()
  759. {
  760. if(kstychDialer['RedialLast']=="Yes")
  761. {
  762. kstychDialer['RedialLast']='';
  763.  
  764. kSetDData('C','mCallState',"Wait");
  765. kSetDData('C','ts_Wait',getNowTS());
  766. kSetDData('C','ts_Call',0);
  767. kSetDData('C','ts_Talk',0);
  768. kSetDData('C','ts_Dispo',0);
  769. kSetDData('C','ts_Close',0);
  770.  
  771. updateDialerState("action","dialnext");
  772.  
  773. return;
  774. }
  775.  
  776.  
  777. var dialerResetForceState=kstychDialer['mDialerState'];
  778. var dialerResetForceSubState=kstychDialer['mDialerSubState'];
  779.  
  780. dialerResetForceState="Progressive";//Hardcoded TODO change to config
  781. dialerResetForceSubState="";
  782.  
  783. if(kstychCall['userstatus']=="AUTOWRAPUP")
  784. {
  785. dialerResetForceState="Paused";
  786. dialerResetForceSubState="AUTOWRAPUP";
  787. }
  788.  
  789. /* Commented BY AmolG on 15 Feb 2017 */
  790. if(kstychCall['userstatus']=="WRAPUP")
  791. {
  792. dialerResetForceState="Paused";
  793. dialerResetForceSubState="WRAPUP";
  794. }
  795.  
  796. //TODO check hangup any connections?
  797.  
  798. $("#dialersearchresults").html("");//CANNOT clear this until we have a solution of error handling in save form
  799. $("#manualdialnumber_txt").val("");
  800.  
  801. resetCallArray();
  802.  
  803. $("#dialersearchbox").html("");
  804. $(".dialer_conf_divs").remove();
  805.  
  806. updateDialerState("dialer","mDialerState",dialerResetForceState,"mDialerSubState",dialerResetForceSubState);
  807.  
  808. }
  809. function resetCallArray()
  810. {
  811. kSetDData('C','mCallState',"Wait");
  812. kSetDData('C','ts_Wait',getNowTS());
  813. kSetDData('C','ts_Call',0);
  814. kSetDData('C','ts_Talk',0);
  815. kSetDData('C','ts_Dispo',0);
  816. kSetDData('C','ts_Close',0);
  817. kSetDData('C','callnumber',"");
  818. kSetDData('C','connections',{});
  819. kSetDData('C','callid',"");
  820. kSetDData('C','crmid',"");
  821. kSetDData('C','campaignid',"");
  822. kSetDData('C','listid',"");
  823. kSetDData('C','mdial_CallACK',"");
  824. kSetDData('C','mcalldata',"");
  825.  
  826. kSetDData('C','userstatus',"");
  827. kSetDData('C','usersubstatus',"");
  828. kSetDData('C','usercallback',"");
  829. kSetDData('C','userremarks',"");
  830. kSetDData('C','userflag',"");
  831. kSetDData('C','bttc_day',"");
  832. kSetDData('C','bttc_hrs',"");
  833. kSetDData('C','serv_vs_prod',"");
  834. kSetDData('C','resolution',"");
  835. kSetDData('C','satisfy',"");
  836. kSetDData('C','final_call_assess',"");
  837. kSetDData('C','userdata',{});
  838. if(typeof customerDispofields != 'undefined')customerDispofields={};
  839.  
  840. kSetDData('C','previewcrmid',"");
  841. kSetDData('C','callWrapupTime',300);
  842. kSetDData('C','prograssiveDelay',120);
  843. }
  844.  
  845. function updateDialerState(objstr,key,val,key2,val2)
  846. {
  847. if(objstr=="dialer")
  848. {
  849. kSetDData("D",key,val);
  850. kSetDData("D",key2,val2);
  851. if(key=='mDialerState')
  852. {
  853. if(!key2||key2=="")kSetDData("D","mDialerSubState","");
  854.  
  855. if(val=="Paused")
  856. {
  857. resetCallArray();
  858. }
  859.  
  860. $("#dialersearchresults").html("");
  861. kSetDData('C','ts_Wait',getNowTS());//TODO reset here?
  862.  
  863. var datastr="kstychCall="+JSON.stringify(kstychCall);
  864. datastr+="&kstychDialer="+JSON.stringify(kstychDialer);
  865. var client = $('#tcampaign_select').val();
  866.  
  867. doAjax('dialer?action=dialerstate&client='+client,datastr,'', 'ajax_manualdial','singlefail','POST',
  868. function(retstr){
  869.  
  870. if(val=="Progressive"||(kstychCall['previewcrmid']!=""&&kstychCall['previewcrmid']>0))
  871. {
  872. doAjax('dialer?action=previewnext&client='+client,datastr,'dialersearchresults', 'ajax_manualdial2','singlefail','POST',
  873. function(retstr){
  874. if(kstychCall['previewcrmid']!="")
  875. {
  876. updateDialerState();
  877. }
  878. else
  879. {
  880. resetCallArray();
  881. simpleNotification('error','topRight',"Failed to Dial Next Record");
  882. updateDialerState("dialer","mDialerState","DialNext");
  883. }
  884. });
  885.  
  886. }
  887.  
  888. updateDialerState();
  889. });
  890. }
  891. }
  892. if(objstr=="call")
  893. {
  894. kSetDData('C',key,val);
  895. kSetDData("C",key2,val2);
  896. }
  897.  
  898. if(objstr=="action")
  899. {
  900. if(key=="dialnext")
  901. {
  902. outgoingCall();
  903. }
  904. if(key=="hangupall")
  905. {
  906. hangupCall();
  907. }
  908. if(key=="saveclose")
  909. {
  910. saveCloseDialerCall();
  911. }
  912. if(key=="reset")
  913. {
  914. resetDialer();
  915. }
  916. }
  917.  
  918. updateDialerUI();
  919. //////////////////////////////////////////////////////////////
  920. if(objstr=="")return;
  921.  
  922. //$("#kTopBarExtra").parent().addClass("open");
  923.  
  924. //run this function on every state change?
  925. //take dialer and call objects and send to controller for update
  926. }
  927. function updateDialerUI()
  928. {
  929. $("#spandialer_num").html(kstychCall["callnumber"]);
  930.  
  931. /* Commented BY AmolG on 15 Feb 2017 */
  932. //Adding default value in Text Box on Manual Call - By Manish
  933. $("#mobile").val(kstychCall["callnumber"]);
  934. //$("#status").val('New');
  935. $("#mainNumber").val(kstychCall["callnumber"]);
  936.  
  937. if(kstychCall["callnumber"]!="")$("#dialertimes2").show();
  938. else $("#dialertimes2").hide();
  939.  
  940. if($("#dialerManualAllowLI").length)kSetDData("D",'mmanualallow','Yes');
  941.  
  942. //////////////////////////////////////////////////////////////
  943. var statestr="<i class='fa fa-phone'></i> : "+kstychDialer['mDialerState'];
  944. if(kstychDialer['mDialerState']=="Paused")statestr="<i class='fa fa-pause'></i> : "+kstychDialer['mDialerSubState'];
  945. if(kstychDialer['mDialerState']=="Ready")statestr="<i class='fa fa-phone'></i> : "+kstychDialer['mDialerSubState'];
  946.  
  947. /* Commented BY AmolG on 15 Feb 2017 */
  948. /*if(kstychDialer['mDialerState']=="Ready")
  949. {
  950. //Incoming to Auto Dial - By Manish on 10-07-17
  951. if(kstychDialer['mDialerSubState']=='Incoming')
  952. kstychDialer['mDialerSubState']="AutoDial";
  953.  
  954. statestr="<i class='fa fa-phone'></i> : "+kstychDialer['mDialerSubState'];
  955. }*/
  956. $("#dialerstate_btn").html(statestr);
  957.  
  958.  
  959. if(kstychDialer['mDialerState']=="Paused")
  960. {
  961. $("#dialerstate_div").width("150px");
  962. $("#manualdial_btn").hide();$("#manualdialnumber_txt").hide();
  963. $("#dialerstate_btn").parent().removeClass("rounded-left");
  964. $("#dialerstate_btn").parent().removeClass("btn-info").addClass("btn-primary");
  965. }
  966. else if(kstychDialer['mDialerState']=="Ready")
  967. {
  968. $("#dialerstate_div").width("150px");
  969. $("#manualdial_btn").show();$("#manualdialnumber_txt").hide();
  970. $("#dialerstate_btn").parent().addClass("rounded-left");
  971. $("#dialerstate_btn").parent().removeClass("btn-primary").addClass("btn-info");
  972. }
  973. else if(kstychDialer['mDialerState']=="Manual")
  974. {
  975. $("#dialerstate_div").width("350px");
  976. $("#manualdial_btn").show();$("#manualdialnumber_txt").show();
  977. $("#dialerstate_btn").parent().addClass("rounded-left");
  978. $("#dialerstate_btn").parent().removeClass("btn-primary").addClass("btn-info");
  979. }
  980. else if(kstychDialer['mDialerState']=="DialNext")
  981. {
  982. $("#dialerstate_div").width("150px");
  983. $("#manualdial_btn").show();$("#manualdialnumber_txt").hide();
  984. $("#dialerstate_btn").parent().addClass("rounded-left");
  985. $("#dialerstate_btn").parent().removeClass("btn-primary").addClass("btn-info");
  986. }
  987. else if(kstychDialer['mDialerState']=="Progressive")
  988. {
  989. $("#dialerstate_div").width("150px");
  990. $("#manualdial_btn").show();$("#manualdialnumber_txt").hide();
  991. $("#dialerstate_btn").parent().removeClass("rounded-left");
  992. $("#dialerstate_btn").parent().removeClass("btn-primary").addClass("btn-info");
  993. }
  994. //////////////////////////////////////////////////////////////
  995.  
  996. //////////////////////////////////////////////////////////////
  997. var uStateArr=[];
  998. uStateArr['conficon_u_a']='btn-primary';uStateArr['conficon_u_i']='fa-chain-broken';
  999. if(kstychDialer['connection']['connected']==1)
  1000. {
  1001. uStateArr['conficon_u_a']='btn-success';uStateArr['conficon_u_i']='fa-chain';
  1002. }
  1003. uStateArr['mic']='UnMuteMic';uStateArr['micicon']='fa-microphone-slash';
  1004. if(kstychDialer['connection']['mic']==1)
  1005. {
  1006. uStateArr['mic']='MuteMic';uStateArr['micicon']='fa-microphone';
  1007. }
  1008.  
  1009. var calluhtml="<a data-toggle='dropdown' href='#' class='btn btn-stroke "+uStateArr['conficon_u_a']+" btn-circle dropdown-toggle' onmouseout='$(this).blur()' id=conficon_u_a><i class='fa "+uStateArr['conficon_u_i']+"' id=conficon_u_i></i> </a>";
  1010. calluhtml+="<ul class='dropdown-menu'>";
  1011. calluhtml+="<li data-toggle='tooltip' data-title='My Channel' data-placement='left' data-tcontainer='body'><a href='#' onclick='return false;'><i class='fa fa-info'></i></a></li>";
  1012. //calluhtml+="<li data-toggle='tooltip' data-title='MuteSpeaker' data-placement='left' data-tcontainer='body'><a href='#' onclick='kCallAction(\"u\",\"MuteSpeaker\");return false;'><i class='fa fa-volume-off'></i></a></li>";
  1013. calluhtml+="<li data-toggle='tooltip' data-title='"+uStateArr['mic']+"' data-placement='left' data-tcontainer='body'><a href='#' onclick='kCallAction(\"u\",\""+uStateArr['mic']+"\");return false;'><i class='fa "+uStateArr['micicon']+"'></i></a></li>";
  1014. //calluhtml+="<li data-toggle='tooltip' data-title='Hangup' data-placement='left' data-tcontainer='body'><a href='#' onclick='kCallAction(\"u\",\"Hangup\");return false;'><i class='fa fa-times-circle'></i></a></li>";
  1015. //calluhtml+="<li data-toggle='tooltip' data-title='Hold' data-placement='left' data-tcontainer='body'><a href='#' onclick='kCallAction(\"u\",\"Hold\");return false;'><i class='fa fa-pause'></i></a></li>";
  1016. calluhtml+="</ul>";
  1017. $("#connections_div_u").html(calluhtml);
  1018.  
  1019. $(".dialer_conf_divs").remove();
  1020. var confhtml='';
  1021. for(var key in kstychCall['connections'])
  1022. {
  1023. if(kstychCall['connections'].hasOwnProperty(key))
  1024. {
  1025. if(key==kstychCall['callnumber'])
  1026. {
  1027. var cStateArr=[];
  1028. cStateArr['conficon_c0_a']='btn-primary';cStateArr['conficon_c0_i']='fa-chain-broken';
  1029. if(kstychCall['connections'][key]['connected']==1)
  1030. {
  1031. cStateArr['conficon_c0_a']='btn-success';cStateArr['conficon_c0_i']='fa-chain';
  1032. }
  1033. cStateArr['mic']='UnMuteMic';cStateArr['micicon']='fa-microphone-slash';
  1034. if(kstychCall['connections'][key]['mic']==1)
  1035. {
  1036. cStateArr['mic']='MuteMic';cStateArr['micicon']='fa-microphone';
  1037. }
  1038. cStateArr['speaker']='UnMuteSpeaker';cStateArr['speakericon']='fa-volume-off';
  1039. if(kstychCall['connections'][key]['speaker']==1)
  1040. {
  1041. cStateArr['speaker']='MuteSpeaker';cStateArr['speakericon']='fa-volume-up';
  1042. }
  1043. cStateArr['holdext']='UnHold';cStateArr['holdexticon']='fa-play';
  1044. if(kstychCall['connections'][key]['holdext']=='')
  1045. {
  1046. cStateArr['holdext']='Hold';cStateArr['holdexticon']='fa-pause';
  1047. }
  1048.  
  1049. var callchtml="<a data-toggle='dropdown' href='#' class='btn btn-stroke "+cStateArr['conficon_c0_a']+" btn-circle dropdown-toggle' onmouseout='$(this).blur()' id=conficon_c0_a><i class='fa "+cStateArr['conficon_c0_i']+"' id=conficon_c0_i></i> </a>";
  1050. callchtml+="<ul class='dropdown-menu'>";
  1051. callchtml+="<li data-toggle='tooltip' data-title='"+key+"' data-placement='left' data-tcontainer='body'><a href='#' onclick='return false;'><i class='fa fa-info'></i></a></li>";
  1052. callchtml+="<li data-toggle='tooltip' data-title='"+cStateArr['speaker']+"' data-placement='left' data-tcontainer='body'><a href='#' onclick='kCallAction(\"c\",\""+cStateArr['speaker']+"\");return false;'><i class='fa "+cStateArr['speakericon']+"'></i></a></li>";
  1053. callchtml+="<li data-toggle='tooltip' data-title='"+cStateArr['mic']+"' data-placement='left' data-tcontainer='body'><a href='#' onclick='kCallAction(\"c\",\""+cStateArr['mic']+"\");return false;'><i class='fa "+cStateArr['micicon']+"'></i></a></li>";
  1054. callchtml+="<li data-toggle='tooltip' data-title='Hangup' data-placement='left' data-tcontainer='body'><a href='#' onclick='kCallAction(\"c\",\"Hangup\");return false;'><i class='fa fa-times-circle'></i></a></li>";
  1055. //callchtml+="<li data-toggle='tooltip' data-title='"+cStateArr['holdext']+"' data-placement='left' data-tcontainer='body'><a href='#' onclick='kCallAction(\"c\",\""+cStateArr['holdext']+"\");return false;'><i class='fa "+cStateArr['holdexticon']+"'></i></a></li></ul>";
  1056. $("#connections_div_c").html(callchtml);
  1057. }
  1058. else
  1059. {
  1060. var tStateArr=[];
  1061. tStateArr['conficon_t_a']='btn-primary';tStateArr['conficon_t_i']='fa-chain-broken';
  1062. if(kstychCall['connections'][key]['connected']==1)
  1063. {
  1064. tStateArr['conficon_t_a']='btn-success';tStateArr['conficon_t_i']='fa-chain';
  1065. }
  1066. tStateArr['mic']='UnMuteMic';tStateArr['micicon']='fa-microphone-slash';
  1067. if(kstychCall['connections'][key]['mic']==1)
  1068. {
  1069. tStateArr['mic']='MuteMic';tStateArr['micicon']='fa-microphone';
  1070. }
  1071. tStateArr['speaker']='UnMuteSpeaker';tStateArr['speakericon']='fa-volume-off';
  1072. if(kstychCall['connections'][key]['speaker']==1)
  1073. {
  1074. tStateArr['speaker']='MuteSpeaker';tStateArr['speakericon']='fa-volume-up';
  1075. }
  1076. tStateArr['holdext']='UnHold';tStateArr['holdexticon']='fa-play';
  1077. if(kstychCall['connections'][key]['holdext']=='')
  1078. {
  1079. tStateArr['holdext']='Hold';tStateArr['holdexticon']='fa-pause';
  1080. }
  1081.  
  1082. confhtml+="<div class='dropdown dropdown-icons dialer_conf_divs' confphonenumber='"+key+"' >";
  1083. confhtml+="<a data-toggle='dropdown' href='#' class='btn btn-stroke "+tStateArr['conficon_t_a']+" btn-circle dropdown-toggle' onmouseout='$(this).blur()'><i class='fa "+tStateArr['conficon_t_i']+"'></i> </a>";
  1084. confhtml+="<ul class='dropdown-menu'>";
  1085. confhtml+="<li data-toggle='tooltip' data-title='"+key+"' data-placement='left' data-tcontainer='body'><a href='#' onclick='return false;'><i class='fa fa-info'></i></a></li>";
  1086. confhtml+="<li data-toggle='tooltip' data-title='"+tStateArr['speaker']+"' data-placement='left' data-tcontainer='body'><a href='#' onclick='kCallAction(\""+key+"\",\""+tStateArr['speaker']+"\");return false;'><i class='fa "+tStateArr['speakericon']+"'></i></a></li>";
  1087. confhtml+="<li data-toggle='tooltip' data-title='"+tStateArr['mic']+"' data-placement='left' data-tcontainer='body'><a href='#' onclick='kCallAction(\""+key+"\",\""+tStateArr['mic']+"\");return false;'><i class='fa "+tStateArr['micicon']+"'></i></a></li>";
  1088. confhtml+="<li data-toggle='tooltip' data-title='Hangup' data-placement='left' data-tcontainer='body'><a href='#' onclick='kCallAction(\""+key+"\",\"Hangup\");return false;'><i class='fa fa-times-circle'></i></a></li>";
  1089. //confhtml+="<li data-toggle='tooltip' data-title='"+tStateArr['holdext']+"' data-placement='left' data-tcontainer='body'><a href='#' onclick='kCallAction(\""+key+"\",\""+tStateArr['holdext']+"\");return false;'><i class='fa "+tStateArr['holdexticon']+"'></i></a></li>";
  1090. confhtml+="</ul></div>";
  1091. }
  1092. }
  1093. }
  1094. $(confhtml).insertAfter("#connections_div_c");
  1095. //////////////////////////////////////////////////////////////
  1096.  
  1097. //////////////////////////////////////////////////////////////
  1098. if(kstychCall['mCallState']=="Wait")
  1099. {
  1100. $("#dialerstate_btn").parent().attr("disabled",false);
  1101. if(kstychDialer['mmanualallow']=='Yes')$("#manualdialnumber_txt").attr("disabled",false);
  1102. else $("#manualdialnumber_txt").attr("disabled",true);
  1103.  
  1104. $("#manualdial_btn").attr("disabled",false);
  1105. $("#manualdial_btn").attr("dialaction","dialnext");
  1106. $("#manualdial_btn").html("<i class='fa fa-play text-default'></i>");
  1107.  
  1108. if(kstychDialer['mDialerState']=="Ready")
  1109. {
  1110. var readyDelay=Math.ceil((getNowTS()-kstychCall['ts_Wait'])/1000);
  1111.  
  1112. $("#manualdial_btn").attr("disabled",true);
  1113. $("#manualdial_btn").attr("dialaction","");
  1114. $("#manualdial_btn").html("Waiting");// : "+readyDelay);
  1115.  
  1116. }
  1117. }
  1118. if(kstychCall['mCallState']=="Call")
  1119. {
  1120. $("#dialerstate_btn").parent().attr("disabled",true);
  1121. $("#manualdialnumber_txt").attr("disabled",true);
  1122.  
  1123. $("#manualdial_btn").attr("disabled",false);
  1124. $("#manualdial_btn").attr("dialaction","hangupall");
  1125. $("#manualdial_btn").html("<i class='fa fa-times text-primary'></i> Hangup");
  1126. }
  1127. if(kstychCall['mCallState']=="Dispo")
  1128. {
  1129. $("#dialerstate_btn").parent().attr("disabled",true);
  1130. $("#manualdialnumber_txt").attr("disabled",true);
  1131.  
  1132. $("#manualdial_btn").attr("disabled",false);
  1133. $("#manualdial_btn").attr("dialaction","saveclose");
  1134. $("#manualdial_btn").html("<i class='fa fa-save text-success'></i> Save &amp; Close");
  1135. }
  1136. if(kstychCall['mCallState']=="Close")
  1137. {
  1138. $("#dialerstate_btn").parent().attr("disabled",true);
  1139. $("#manualdialnumber_txt").attr("disabled",true);
  1140.  
  1141. $("#manualdial_btn").attr("disabled",true);
  1142. $("#manualdial_btn").attr("dialaction","");
  1143. $("#manualdial_btn").html("<i class='fa fa-pause text-default'></i>");
  1144. }
  1145. //////////////////////////////////////////////////////////////
  1146. }
  1147.  
  1148. function dialerTimersUpdate()
  1149. {
  1150. var dispD="0";var dispT="0";var dispC="0";var dispW="0";
  1151.  
  1152. if(kstychCall['ts_Dispo']>1)
  1153. {
  1154. if(Math.ceil(((kstychCall['ts_Dispo']-kstychCall['ts_Talk'])/1000))<3)
  1155. {
  1156. kstychCall['callWrapupTime']=90;
  1157. if(typeof dispoClassArray!='undefined' && typeof dispoClassArray['NA'] != 'undefined')
  1158. {
  1159. if($('#dialer_userstatus').val()=="")
  1160. {
  1161. $('#dialer_userstatus').val(dispoClassArray['NA']);
  1162. $('#dialer_userstatus').change();
  1163. }
  1164. }
  1165. }
  1166.  
  1167. var thiswraptime=Math.ceil(kstychCall['callWrapupTime']-((getNowTS()-kstychCall['ts_Dispo'])/1000));
  1168.  
  1169. if(thiswraptime<=0)
  1170. {
  1171. saveCloseDialerCall('AUTOWRAPUP');
  1172. }
  1173.  
  1174. /*if(thiswraptime==90 || thiswraptime==300)
  1175. {
  1176. showWrapUp();
  1177. }*/
  1178.  
  1179. dispD="Wrapup : "+thiswraptime;
  1180. $("#spandialer_ts").html(dispD);
  1181. $("#dialertimes1").removeClass("btn-default").addClass("btn-primary");
  1182. }
  1183. else if(kstychCall['ts_Talk']>1)
  1184. {
  1185. dispT="Talk : "+Math.ceil(((getNowTS()-kstychCall['ts_Talk'])/1000));
  1186. $("#spandialer_ts").html(dispT);
  1187. $("#dialertimes1").removeClass("btn-primary").addClass("btn-default");
  1188. }
  1189. else if(kstychCall['ts_Call']>1)
  1190. {
  1191. dispC="Call : "+Math.ceil(((getNowTS()-kstychCall['ts_Call'])/1000));
  1192. $("#spandialer_ts").html(dispC);
  1193. $("#dialertimes1").removeClass("btn-primary").addClass("btn-default");
  1194. }
  1195. else if(kstychCall['ts_Wait']>1)
  1196. {
  1197. dispW="Wait : "+Math.ceil(((getNowTS()-kstychCall['ts_Wait'])/1000));
  1198. $("#spandialer_ts").html(dispW);
  1199. $("#dialertimes1").removeClass("btn-primary").addClass("btn-default");
  1200. }
  1201.  
  1202.  
  1203. if(kstychCall['mCallState']=="Wait")
  1204. {
  1205. if(kstychDialer['mDialerState']=="Progressive")
  1206. {
  1207. var progressiveDelay=Math.ceil(kstychCall['prograssiveDelay']-((getNowTS()-kstychCall['ts_Wait'])/1000));
  1208.  
  1209. if(progressiveDelay<0)progressiveDelay=0;
  1210.  
  1211. $("#manualdial_btn").attr("disabled",false);
  1212. $("#manualdial_btn").attr("dialaction","dialnext");
  1213. $("#manualdial_btn").html("<i class='fa fa-play text-default'></i> "+progressiveDelay);
  1214.  
  1215. if(progressiveDelay<=0)$("#manualdial_btn").click();
  1216. }
  1217. }
  1218.  
  1219. setTimeout(dialerTimersUpdate,1000);
  1220. }
  1221.  
  1222. function kDialerConnected()
  1223. {
  1224. updateDialerState();
  1225. dialerTimersUpdate();
  1226. $("#dialerQuickControlDiv").show();
  1227. }
  1228. function kDialerInit()
  1229. {
  1230. if(kstychAppObject['user']['id']!=0)
  1231. {
  1232. //simpleNotification("warning","topRight","Trying to Enable Voice Services");
  1233.  
  1234. txtDisplayName = kstychAppObject['user']['sipid'];
  1235. txtPrivateIdentity = kstychAppObject['user']['sipid'];
  1236. txtPublicIdentity = "sip:"+kstychAppObject['user']['sipid']+"@"+kstychAppObject['user']['sipserver'];
  1237. txtRealm = kstychAppObject['user']['sipserver'];
  1238.  
  1239. //txtPhoneNumber=document.getElementById("txtphno");
  1240. txtPhoneNumber = '1000'+kstychAppObject['user']['sipid'];
  1241.  
  1242. btnCall = false;
  1243. btnHangUp = true;
  1244.  
  1245. btnFullScreen = false;
  1246. audioRemote = document.getElementById("audio_remote");
  1247. videoLocal = document.getElementById("video_local");
  1248. videoRemote = document.getElementById("video_remote");
  1249.  
  1250. SIPml.setDebugLevel(kstychAppObject['config']['appdebug']==0 ? "error" : "info");
  1251.  
  1252.  
  1253. //expert stuff //siddharth
  1254. cbVideoDisable = true;
  1255. if(window.location.protocol == 'https:')txtWebsocketServerUrl = "wss://"+kstychAppObject['user']['sipssldomain']+":8089/ws";
  1256. else txtWebsocketServerUrl = "ws://"+txtRealm+":8088/ws";
  1257. txtSIPOutboundProxyUrl = "";//txtSIPOutboundProxyUrl="udp://"+txtRealm+":5060";
  1258.  
  1259. var preInit = function() {
  1260. // set default webrtc type (before initialization)
  1261. var s_webrtc_type = null;//getPVal("wt");
  1262. var s_fps = null;//getPVal("fps");
  1263. var s_mvs = null;//getPVal("mvs"); // maxVideoSize
  1264. var s_mbwu = null;//getPVal("mbwu"); // maxBandwidthUp (kbps)
  1265. var s_mbwd = null;//getPVal("mbwd"); // maxBandwidthUp (kbps)
  1266. var s_za = null;//getPVal("za"); // ZeroArtifacts
  1267. var s_ndb = null;//getPVal("ndb"); // NativeDebug
  1268.  
  1269. if (s_webrtc_type) SIPml.setWebRtcType(s_webrtc_type);
  1270.  
  1271. // initialize SIPML5
  1272. SIPml.init(postInit);
  1273.  
  1274. // set other options after initialization
  1275. if (s_fps) SIPml.setFps(parseFloat(s_fps));
  1276. if (s_mvs) SIPml.setMaxVideoSize(s_mvs);
  1277. if (s_mbwu) SIPml.setMaxBandwidthUp(parseFloat(s_mbwu));
  1278. if (s_mbwd) SIPml.setMaxBandwidthDown(parseFloat(s_mbwd));
  1279. if (s_za) SIPml.setZeroArtifacts(s_za === "true");
  1280. if (s_ndb == "true") SIPml.startNativeDebug();
  1281.  
  1282. //var rinningApps = SIPml.getRunningApps();
  1283. //var _rinningApps = Base64.decode(rinningApps);
  1284. //tsk_utils_log_info(_rinningApps);
  1285. }
  1286.  
  1287. oReadyStateTimer = setInterval(function () {
  1288. if (document.readyState === "complete") {
  1289. clearInterval(oReadyStateTimer);
  1290. // initialize SIPML5
  1291. preInit();
  1292. }
  1293. },
  1294. 500);
  1295. }
  1296. }
  1297. window.onload = function ()
  1298. {
  1299. kDialerInit();
  1300. };
  1301.  
  1302. function postInit()
  1303. {
  1304. // check for WebRTC support
  1305. if (!SIPml.isWebRtcSupported())
  1306. {
  1307. // is it chrome?
  1308. if (SIPml.getNavigatorFriendlyName() == 'chrome')
  1309. {
  1310. document.location="msie?oldchrome";
  1311. return;
  1312. }
  1313. if (SIPml.getNavigatorFriendlyName() == 'ie'||SIPml.getNavigatorFriendlyName() == 'netscape')
  1314. {
  1315. document.location="msie";
  1316. return;
  1317. }
  1318. // checks for WebSocket support
  1319. if (!SIPml.isWebSocketSupported() && !SIPml.isWebRtc4AllSupported())
  1320. {
  1321. document.location="msie?nowebsockets";
  1322. return;
  1323. }
  1324. }
  1325.  
  1326. if (!SIPml.isWebRtc4AllSupported() && !SIPml.isWebRtcSupported())
  1327. {
  1328. document.location="msie?notsupported";
  1329. return;
  1330. }
  1331.  
  1332. oConfigCall = {
  1333. audio_remote: audioRemote,
  1334. video_local: videoLocal,
  1335. video_remote: videoRemote,
  1336. screencast_window_id: 0x00000000, // entire desktop
  1337. bandwidth: { audio:undefined, video:undefined },
  1338. video_size: { minWidth:undefined, minHeight:undefined, maxWidth:undefined, maxHeight:undefined },
  1339. events_listener: { events: '*', listener: onSipEventSession },
  1340. sip_caps: [
  1341. { name: '+g.oma.sip-im' },
  1342. { name: 'language', value: '\"en,fr\"' }
  1343. ]
  1344. };
  1345. sipRegister();
  1346. //simpleNotification("warning","topRight","Requesting Voice Permissions");
  1347. //navigator.getUserMedia = (navigator.getUserMedia ||navigator.webkitGetUserMedia ||navigator.mozGetUserMedia || navigator.msGetUserMedia);
  1348. //navigator.getUserMedia({video: false, audio: true},function(localMediaStream) {},function(err) {simpleNotification("error","topRight","Your Browser doesnot support Voice. Some functions will not work.");});
  1349.  
  1350. }
  1351.  
  1352.  
  1353. // sends SIP REGISTER request to login
  1354. function sipRegister() {
  1355. // catch exception for IE (DOM not ready)
  1356. try
  1357. {
  1358. if (!txtRealm || !txtPrivateIdentity || !txtPublicIdentity) {
  1359. txtRegStatus = '<b>Please fill madatory fields (*)</b>';
  1360. simpleNotification("error","topRight",txtRegStatus);
  1361. return;
  1362. }
  1363. var o_impu = tsip_uri.prototype.Parse(txtPublicIdentity);
  1364. if (!o_impu || !o_impu.s_user_name || !o_impu.s_host) {
  1365. txtRegStatus = "<b>[" + txtPublicIdentity + "] is not a valid Public identity</b>";
  1366. simpleNotification("error","topRight",txtRegStatus);
  1367. return;
  1368. }
  1369.  
  1370. // enable notifications if not already done
  1371. if (window.webkitNotifications && window.webkitNotifications.checkPermission() != 0) {
  1372. window.webkitNotifications.requestPermission();
  1373. }
  1374.  
  1375. var iceServers=[{ url: 'stun:'+kstychAppObject['user']['sipserver']+':3478'}, { url:'turn:'+kstychAppObject['user']['sipserver'], credential:'1234',username: 'kstych'}];
  1376. if(kstychAppObject['config']['use-ice']=='no')iceServers=[{ url: 'stun:127.0.0.1:3478'}];
  1377.  
  1378. // create SIP stack
  1379. oSipStack = new SIPml.Stack({
  1380. realm: txtRealm,
  1381. impi: txtPrivateIdentity,
  1382. impu: txtPublicIdentity,
  1383. password: kstychAppObject['user']['sipauth'],
  1384. display_name: txtDisplayName,
  1385. websocket_proxy_url: txtWebsocketServerUrl,
  1386. outbound_proxy_url: txtSIPOutboundProxyUrl,
  1387. ice_servers: iceServers,
  1388. enable_rtcweb_breaker: false,
  1389. events_listener: { events: '*', listener: onSipEventStack },
  1390. enable_early_ims: true, // Must be true unless you're using a real IMS network
  1391. enable_media_stream_cache: false,
  1392. bandwidth: null, // could be redefined a session-level
  1393. video_size: null, // could be redefined a session-level
  1394. sip_headers: [
  1395. { name: 'User-Agent', value: 'IM-client/Kstych' },
  1396. { name: 'Organization', value: 'Kstych Pvt Ltd' }
  1397. ]
  1398. }
  1399. );
  1400.  
  1401. if (oSipStack.start() != 0) {
  1402. txtRegStatus = '<b>Failed to start the SIP stack</b>';
  1403. simpleNotification("error","topRight",txtRegStatus);
  1404. }
  1405. else {loggedin=1;return;}
  1406. }
  1407. catch (e) {
  1408. txtRegStatus = "<b>2:" + e + "</b>";
  1409. simpleNotification("error","topRight",txtRegStatus);
  1410. }
  1411. }
  1412.  
  1413. // sends SIP REGISTER (expires=0) to logout
  1414. function sipUnRegister(type)
  1415. {
  1416. if (oSipStack) {
  1417. try{sipHangUp();}catch(e){console.log(e);}
  1418. oSipStack.stop(); // shutdown all sessions
  1419. }
  1420.  
  1421. if(!type)
  1422. {
  1423. /* simpleNotification("warning","topRight","Retrying in 10 sec...");*/
  1424. $("#phonetopbar").hide();
  1425. setTimeout(sipRegister,10*1000); //Uncomment this line to resolve firefox logout issue. Commnted by YASHWANT on 10032017
  1426. // document.location='/logout'; //Comment this line to resolve firefox logout issue. Commnted by YASHWANT on 10032017
  1427. }
  1428. else loggedin=0;
  1429. }
  1430.  
  1431. // makes a call (SIP INVITE)
  1432. function sipCall(s_type,destination) {
  1433. if(oSipStack)
  1434. {
  1435. if (oSipSessionCall) {
  1436. txtCallStatus = '<i>Already in a Call...</i>';
  1437. simpleNotification("warning","topRight",txtCallStatus);
  1438. }
  1439. else {
  1440. if (!tsk_string_is_null_or_empty(destination)) {
  1441.  
  1442. if(s_type == 'call-screenshare') {
  1443. if(!SIPml.isScreenShareSupported()) {
  1444. alert('Screen sharing not supported. Are you using chrome 26+?');
  1445. return;
  1446. }
  1447. if (!location.protocol.match('https')){
  1448. if (confirm("Screen sharing requires https://. Do you want to be redirected?")) {
  1449. sipUnRegister();
  1450. window.location = 'msie?httpsneeded';
  1451. }
  1452. return;
  1453. }
  1454. }
  1455. btnCall = true;
  1456. btnHangUp = false;
  1457.  
  1458.  
  1459. // create call session
  1460. oSipSessionCall = oSipStack.newSession(s_type, oConfigCall);
  1461. // make call
  1462. if (oSipSessionCall.call(destination) != 0) {
  1463. oSipSessionCall = null;
  1464. txtCallStatus = 'Failed to make call';
  1465. simpleNotification("error","topRight",txtCallStatus);
  1466. btnCall = false;
  1467. btnHangUp = true;
  1468. return;
  1469. }
  1470. }
  1471. }
  1472. }
  1473. }
  1474. function sipAnswer()
  1475. {
  1476. if(oSipStack){
  1477. if (oSipSessionCall) {
  1478. txtCallStatus = '<i>Connecting...</i>';
  1479. //simpleNotification("warning","topRight",txtCallStatus);
  1480. oSipSessionCall.accept(oConfigCall);
  1481. }
  1482. }
  1483. if(answergrowl)$.gritter.remove(answergrowl, {fade: true,speed: 'slow'});
  1484. }
  1485.  
  1486. // Share entire desktop aor application using BFCP or WebRTC native implementation
  1487. function sipShareScreen() {
  1488. if (SIPml.getWebRtcType() === 'w4a') {
  1489. // Sharing using BFCP -> requires an active session
  1490. if (!oSipSessionCall) {
  1491. txtCallStatus = '<i>No active session</i>';
  1492. return;
  1493. }
  1494. if (oSipSessionCall.bfcpSharing) {
  1495. if (oSipSessionCall.stopBfcpShare(oConfigCall) != 0) {
  1496. txtCallStatus = 'Failed to stop BFCP share';
  1497. }
  1498. else {
  1499. oSipSessionCall.bfcpSharing = false;
  1500. }
  1501. }
  1502. else {
  1503. oConfigCall.screencast_window_id = 0x00000000;
  1504. if (oSipSessionCall.startBfcpShare(oConfigCall) != 0) {
  1505. txtCallStatus = 'Failed to start BFCP share';
  1506. }
  1507. else {
  1508. oSipSessionCall.bfcpSharing = true;
  1509. }
  1510. }
  1511. }
  1512. else {
  1513. sipCall('call-screenshare',txtPhoneNumber);
  1514. }
  1515. }
  1516.  
  1517.  
  1518.  
  1519. // transfers the call
  1520. function sipTransfer(s_destination) {
  1521. if (oSipSessionCall) {
  1522. if (!tsk_string_is_null_or_empty(s_destination)) {
  1523. btnTransfer.disabled = true;
  1524. if (oSipSessionCall.transfer(s_destination) != 0) {
  1525. txtCallStatus = '<i>Call transfer failed</i>';
  1526. btnTransfer.disabled = false;
  1527. return;
  1528. }
  1529. txtCallStatus = '<i>Transfering the call...</i>';
  1530. }
  1531. }
  1532. }
  1533.  
  1534. // holds or resumes the call
  1535. function sipToggleHoldResume() {
  1536. if (oSipSessionCall) {
  1537. var i_ret;
  1538. btnHoldResume.disabled = true;
  1539. txtCallStatus = oSipSessionCall.bHeld ? '<i>Resuming the call...</i>' : '<i>Holding the call...</i>';
  1540. i_ret = oSipSessionCall.bHeld ? oSipSessionCall.resume() : oSipSessionCall.hold();
  1541. if (i_ret != 0) {
  1542. txtCallStatus = '<i>Hold / Resume failed</i>';
  1543. btnHoldResume.disabled = false;
  1544. return;
  1545. }
  1546. }
  1547. }
  1548.  
  1549. // Mute or Unmute the call
  1550. function sipToggleMute() {
  1551. if (oSipSessionCall) {
  1552. var i_ret;
  1553. var bMute = !oSipSessionCall.bMute;
  1554. txtCallStatus = bMute ? '<i>Mute the call...</i>' : '<i>Unmute the call...</i>';
  1555. i_ret = oSipSessionCall.mute('audio'/*could be 'video'*/, bMute);
  1556. if (i_ret != 0) {
  1557. simpleNotification('error','topRight',"Mute / Unmute failed");
  1558. return;
  1559. }
  1560. oSipSessionCall.bMute = bMute;
  1561. var btnMute = bMute ? "Mute" : "Unmute";
  1562. simpleNotification('success','topRight',"You are now ["+btnMute+"]");
  1563.  
  1564. return bMute ? 0 : 1;
  1565. }
  1566. return 1;
  1567. }
  1568.  
  1569. // terminates the call (SIP BYE or CANCEL)
  1570. function sipHangUp() {
  1571. try
  1572. {
  1573. stopRingbackTone();
  1574. stopRingTone();
  1575.  
  1576. if (oSipSessionCall) {
  1577. txtCallStatus = '<i>Terminating the call...</i>';
  1578. oSipSessionCall.hangup({events_listener: { events: '*', listener: onSipEventSession }});
  1579. //simpleNotification("warning","topRight","Call Terminated.");
  1580. }
  1581. //$("#phonetopbar").hide();
  1582. }
  1583. catch(e){console.log(e);}
  1584.  
  1585. if(hangupgrowl)$.gritter.remove(hangupgrowl, {fade: true,speed: 'slow'});
  1586. if(answergrowl)$.gritter.remove(answergrowl, {fade: true,speed: 'slow'});
  1587. }
  1588.  
  1589. function sipSendDTMF(c){
  1590. if(oSipSessionCall && c){
  1591. if(oSipSessionCall.dtmf(c) == 0){
  1592. try { dtmfTone.play(); } catch(e){ }
  1593. }
  1594. }
  1595. }
  1596.  
  1597. function startRingTone() {
  1598. try { ringtone.play(); }
  1599. catch (e) { }
  1600. }
  1601.  
  1602. function stopRingTone() {
  1603. try { ringtone.pause(); }
  1604. catch (e) { }
  1605. }
  1606.  
  1607. function startRingbackTone() {
  1608. try { ringbacktone.play(); }
  1609. catch (e) { }
  1610. }
  1611.  
  1612. function stopRingbackTone() {
  1613. try { ringbacktone.pause(); }
  1614. catch (e) { }
  1615. }
  1616.  
  1617. function toggleFullScreen() {
  1618. if (videoRemote.webkitSupportsFullscreen) {
  1619. fullScreen(!videoRemote.webkitDisplayingFullscreen);
  1620. }
  1621. else {
  1622. fullScreen(!bFullScreen);
  1623. }
  1624. }
  1625.  
  1626. function fullScreen(b_fs) {
  1627. return false;//TODO
  1628. bFullScreen = b_fs;
  1629. if (tsk_utils_have_webrtc4native() && bFullScreen && videoRemote.webkitSupportsFullscreen) {
  1630. if (bFullScreen) {
  1631. videoRemote.webkitEnterFullScreen();
  1632. }
  1633. else {
  1634. videoRemote.webkitExitFullscreen();
  1635. }
  1636. }
  1637. else {
  1638. if (tsk_utils_have_webrtc4npapi()) {
  1639. try { if(window.__o_display_remote) window.__o_display_remote.setFullScreen(b_fs); }
  1640. catch (e) { /*divVideo.setAttribute("class", b_fs ? "full-screen" : "normal-screen");*/ }
  1641. }
  1642. else {
  1643. //divVideo.setAttribute("class", b_fs ? "full-screen" : "normal-screen");
  1644. }
  1645. }
  1646. }
  1647.  
  1648. function showNotifICall(s_number) {
  1649. return false;//TODO
  1650. // permission already asked when we registered
  1651. if (window.webkitNotifications && window.webkitNotifications.checkPermission() == 0) {
  1652. if (oNotifICall) {
  1653. oNotifICall.cancel();
  1654. }
  1655. oNotifICall = window.webkitNotifications.createNotification('images/sipml-34x39.png', 'Incaming call', 'Incoming call from ' + s_number);
  1656. oNotifICall.onclose = function () { oNotifICall = null; };
  1657. oNotifICall.show();
  1658. }
  1659. }
  1660.  
  1661.  
  1662. function uiOnConnectionEvent(b_connected, b_connecting) {
  1663. // should be enum: connecting, connected, terminating, terminated
  1664. //TODO
  1665. btnRegister = b_connected || b_connecting;
  1666. btnUnRegister = !b_connected && !b_connecting;
  1667. btnCall = !(b_connected && tsk_utils_have_webrtc() && tsk_utils_have_stream());
  1668. btnHangUp = !oSipSessionCall;
  1669. }
  1670.  
  1671. function uiVideoDisplayEvent(b_local, b_added) {
  1672. return false;//TODO
  1673. var o_elt_video = b_local ? videoLocal : videoRemote;
  1674.  
  1675. if (b_added) {
  1676. if (SIPml.isWebRtc4AllSupported()) {
  1677. if (b_local) {
  1678. if (WebRtc4all_GetDisplayLocal()) WebRtc4all_GetDisplayLocal().style.visibility = "visible";
  1679. if (WebRtc4all_GetDisplayLocalScreencast()) WebRtc4all_GetDisplayLocalScreencast().style.visibility = "visible";
  1680. //videoLocal.style.visibility = "visible";
  1681. //viewLocalScreencast.style.visibility = "visible";
  1682. //if (WebRtc4all_GetDisplayLocal()) WebRtc4all_GetDisplayLocal().hidden = false;
  1683. //if (WebRtc4all_GetDisplayLocalScreencast()) WebRtc4all_GetDisplayLocalScreencast().hidden = false;
  1684. }
  1685. else {
  1686. if (WebRtc4all_GetDisplayRemote()) WebRtc4all_GetDisplayRemote().style.visibility = "visible";
  1687. //videoRemote.style.visibility = "visible";
  1688. //if (WebRtc4all_GetDisplayRemote()) WebRtc4all_GetDisplayRemote().hidden = false;
  1689. }
  1690. }
  1691. else {
  1692. o_elt_video.style.opacity = 1;
  1693. }
  1694. uiVideoDisplayShowHide(true);
  1695. }
  1696. else {
  1697. if (SIPml.isWebRtc4AllSupported()) {
  1698. if (b_local) {
  1699. if (WebRtc4all_GetDisplayLocal()) WebRtc4all_GetDisplayLocal().style.visibility = "hidden";
  1700. if (WebRtc4all_GetDisplayLocalScreencast()) WebRtc4all_GetDisplayLocalScreencast().style.visibility = "hidden";
  1701. //videoLocal.style.visibility = "hidden";
  1702. //viewLocalScreencast.style.visibility = "hidden";
  1703. //if (WebRtc4all_GetDisplayLocal()) WebRtc4all_GetDisplayLocal().hidden = true;
  1704. //if (WebRtc4all_GetDisplayLocalScreencast()) WebRtc4all_GetDisplayLocalScreencast().hidden = true;
  1705. }
  1706. else {
  1707. if (WebRtc4all_GetDisplayRemote()) WebRtc4all_GetDisplayRemote().style.visibility = "hidden";
  1708. //videoRemote.style.visibility = "hidden";
  1709. //if (WebRtc4all_GetDisplayRemote()) WebRtc4all_GetDisplayRemote().hidden = true;
  1710. }
  1711. }
  1712. else{
  1713. o_elt_video.style.opacity = 0;
  1714. }
  1715. fullScreen(false);
  1716. }
  1717. }
  1718.  
  1719. function uiVideoDisplayShowHide(b_show) {
  1720. //TODO
  1721. if (b_show) {
  1722.  
  1723. }
  1724. else {
  1725.  
  1726. }
  1727. btnFullScreen.disabled = !b_show;
  1728. }
  1729.  
  1730. function uiCallTerminated(s_description){
  1731.  
  1732. btnCall = false;
  1733. btnHangUp = true;
  1734.  
  1735. oSipSessionCall = null;
  1736.  
  1737. stopRingbackTone();
  1738. stopRingTone();
  1739.  
  1740. txtCallStatus = "<i>" + s_description + "</i>";
  1741. uiVideoDisplayShowHide(false);
  1742. //divCallOptions.style.opacity = 0;
  1743.  
  1744. if (oNotifICall) {
  1745. oNotifICall.cancel();
  1746. oNotifICall = null;
  1747. }
  1748.  
  1749. uiVideoDisplayEvent(true, false);
  1750. uiVideoDisplayEvent(false, false);
  1751.  
  1752. setTimeout(function () { if (!oSipSessionCall) txtCallStatus = ''; }, 2500);
  1753.  
  1754. if(hangupgrowl)$.gritter.remove(hangupgrowl, {fade: true,speed: 'slow'});
  1755. }
  1756.  
  1757. // Callback function for SIP Stacks
  1758. function onSipEventStack(e /*SIPml.Stack.Event*/) {
  1759. tsk_utils_log_info('==stack event = ' + e.type);
  1760. switch (e.type) {
  1761. case 'started':
  1762. {
  1763. // catch exception for IE (DOM not ready)
  1764. try {
  1765. // LogIn (REGISTER) as soon as the stack finish starting
  1766. oSipSessionRegister = this.newSession('register', {
  1767. expires: 200,
  1768. events_listener: { events: '*', listener: onSipEventSession },
  1769. sip_caps: [
  1770. { name: '+g.oma.sip-im', value: null },
  1771. { name: '+audio', value: null },
  1772. { name: 'language', value: '\"en,fr\"' }
  1773. ]
  1774. });
  1775. oSipSessionRegister.register();
  1776. }
  1777. catch (e) {
  1778. txtRegStatus = txtRegStatus = "<b>1:" + e + "</b>";
  1779. simpleNotification("success","topRight",txtRegStatus);
  1780. btnRegister = false;
  1781. }
  1782. break;
  1783. }
  1784. case 'stopping': case 'stopped': case 'failed_to_start': case 'failed_to_stop':
  1785. {
  1786. var bFailure = (e.type == 'failed_to_start') || (e.type == 'failed_to_stop');
  1787. oSipStack = null;
  1788. oSipSessionRegister = null;
  1789. oSipSessionCall = null;
  1790.  
  1791. uiOnConnectionEvent(false, false);
  1792.  
  1793. stopRingbackTone();
  1794. stopRingTone();
  1795.  
  1796. uiVideoDisplayShowHide(false);
  1797. //divCallOptions.style.opacity = 0;
  1798.  
  1799. txtCallStatus = '';
  1800. if(loggedin)
  1801. {
  1802. txtRegStatus = bFailure ? "<i>Disconnected: <b>" + e.description + "</b></i>" : "<i>Disconnected</i>";
  1803. //simpleNotification("warning","topRight",txtRegStatus+", Retrying in 10 sec...");
  1804. //setTimeout(sipRegister,10*1000);//TODO dont retry too many times, idleapp instead
  1805. //document.location='/logout'; //Comment this line to resolve firefox logout issue. Commnted by YASHWANT on 10032017
  1806. }
  1807. else
  1808. {
  1809. //if(e.type=='stopped')doLogout(1); //Comment this line to resolve firefox logout issue. Commnted by YASHWANT on 10032017
  1810. }
  1811. break;
  1812. }
  1813.  
  1814. case 'i_new_call':
  1815. {
  1816. if (oSipSessionCall) {
  1817. // do not accept the incoming call if we're already 'in call'
  1818. e.newSession.hangup(); // comment this line for multi-line support
  1819. }
  1820. else {
  1821. oSipSessionCall = e.newSession;
  1822.  
  1823. btnCall = 'Answer';
  1824. btnHangUp = 'Reject';
  1825. btnCall = false;
  1826. btnHangUp = false;
  1827.  
  1828. var sRemoteNumber = (oSipSessionCall.getRemoteFriendlyName() || 'unknown');
  1829.  
  1830. if(sRemoteNumber=='1000'+kstychAppObject['user']['sipid'])
  1831. {
  1832. //auto answer if own conf
  1833. var dialerConnection=kGetDData("D","connection");
  1834. dialerConnection['connected']=1;
  1835. updateDialerState("dialer","connection",dialerConnection);
  1836. sipAnswer();
  1837. }
  1838. else
  1839. {
  1840. startRingTone();
  1841. txtCallStatus = "<i><a href=# onclick='sipAnswer();return false;'>Incoming call Click Here To Answer</a></i> from [<b>" + sRemoteNumber + "</b>]";
  1842. //showNotifICall(sRemoteNumber);
  1843. answergrowl=growlSNotify("Incoming Call",txtCallStatus,"top-right");
  1844. hangupgrowl=growlSNotify("Incoming Call","<a href=# onclick='sipHangUp();return false;' style='color:white'>Click here to hangup</a>","top-right");
  1845. }
  1846. //showNotifICall(sRemoteNumber);
  1847. }
  1848. break;
  1849. }
  1850.  
  1851. case 'm_permission_requested':
  1852. {
  1853. //document.getElementById('divNavbarInner').setAttribute('class', 'navbar-inner-red');
  1854. break;
  1855. }
  1856. case 'm_permission_accepted':
  1857. case 'm_permission_refused':
  1858. {
  1859. //document.getElementById('divNavbarInner').setAttribute('class', 'navbar-inner');
  1860. if(e.type == 'm_permission_refused'){
  1861. uiCallTerminated('Media stream permission denied');
  1862. }
  1863. break;
  1864. }
  1865.  
  1866. case 'starting': default: break;
  1867. }
  1868. };
  1869.  
  1870. // Callback function for SIP sessions (INVITE, REGISTER, MESSAGE...)
  1871. function onSipEventSession(e /* SIPml.Session.Event */) {
  1872. tsk_utils_log_info('==session event = ' + e.type);
  1873.  
  1874. switch (e.type) {
  1875. case 'connecting': case 'connected':
  1876. {
  1877. var bConnected = (e.type == 'connected');
  1878. if (e.session == oSipSessionRegister) {
  1879. uiOnConnectionEvent(bConnected, !bConnected);
  1880. txtRegStatus = "<i>" + e.description + "</i>";
  1881. if(bConnected){/*simpleNotification("success","topRight","Connected");*//*$("#phonetopbar").show();*/kDialerConnected();}
  1882. }
  1883. else if (e.session == oSipSessionCall) {
  1884. btnHangUp = 'HangUp';
  1885. btnCall = true;
  1886. btnHangUp = false;
  1887. btnTransfer = false;
  1888.  
  1889. if (bConnected) {
  1890. stopRingbackTone();
  1891. stopRingTone();
  1892.  
  1893. if (oNotifICall) {
  1894. oNotifICall.cancel();
  1895. oNotifICall = null;
  1896. }
  1897. }
  1898.  
  1899. txtCallStatus = "<i>" + e.description + "</i>";
  1900. //simpleNotification("success","topRight",txtCallStatus);
  1901. //divCallOptions.style.opacity = bConnected ? 1 : 0;
  1902.  
  1903. if (SIPml.isWebRtc4AllSupported()) { // IE don't provide stream callback
  1904. uiVideoDisplayEvent(true, true);
  1905. uiVideoDisplayEvent(false, true);
  1906. }
  1907. }
  1908. break;
  1909. } // 'connecting' | 'connected'
  1910. case 'terminating': case 'terminated':
  1911. {
  1912. if (e.session == oSipSessionRegister) {
  1913. uiOnConnectionEvent(false, false);
  1914.  
  1915. oSipSessionCall = null;
  1916. oSipSessionRegister = null;
  1917.  
  1918. txtRegStatus = "<i>" + e.description + "</i>";
  1919. //simpleNotification("warning","topRight",txtRegStatus);
  1920. }
  1921. else if (e.session == oSipSessionCall) {
  1922. uiCallTerminated(e.description);
  1923. }
  1924. break;
  1925. } // 'terminating' | 'terminated'
  1926.  
  1927. case 'm_stream_video_local_added':
  1928. {
  1929. if (e.session == oSipSessionCall) {
  1930. uiVideoDisplayEvent(true, true);
  1931. }
  1932. break;
  1933. }
  1934. case 'm_stream_video_local_removed':
  1935. {
  1936. if (e.session == oSipSessionCall) {
  1937. uiVideoDisplayEvent(true, false);
  1938. }
  1939. break;
  1940. }
  1941. case 'm_stream_video_remote_added':
  1942. {
  1943. if (e.session == oSipSessionCall) {
  1944. uiVideoDisplayEvent(false, true);
  1945. }
  1946. break;
  1947. }
  1948. case 'm_stream_video_remote_removed':
  1949. {
  1950. if (e.session == oSipSessionCall) {
  1951. uiVideoDisplayEvent(false, false);
  1952. }
  1953. break;
  1954. }
  1955.  
  1956. case 'm_stream_audio_local_added':
  1957. case 'm_stream_audio_local_removed':
  1958. case 'm_stream_audio_remote_added':
  1959. case 'm_stream_audio_remote_removed':
  1960. {
  1961. break;
  1962. }
  1963.  
  1964. case 'i_ect_new_call':
  1965. {
  1966. oSipSessionTransferCall = e.session;
  1967. break;
  1968. }
  1969.  
  1970. case 'i_ao_request':
  1971. {
  1972. if(e.session == oSipSessionCall){
  1973. var iSipResponseCode = e.getSipResponseCode();
  1974. if (iSipResponseCode == 180 || iSipResponseCode == 183) {
  1975. startRingbackTone();
  1976. txtCallStatus = '<i>Remote ringing...</i>';
  1977. //simpleNotification("warning","topRight",txtCallStatus);
  1978. }
  1979. }
  1980. break;
  1981. }
  1982.  
  1983. case 'm_early_media':
  1984. {
  1985. if(e.session == oSipSessionCall){
  1986. stopRingbackTone();
  1987. stopRingTone();
  1988. txtCallStatus = '<i>Early media started</i>';
  1989. //simpleNotification("warning","topRight",txtCallStatus);
  1990. }
  1991. break;
  1992. }
  1993.  
  1994. case 'm_local_hold_ok':
  1995. {
  1996. if(e.session == oSipSessionCall){
  1997. if (oSipSessionCall.bTransfering) {
  1998. oSipSessionCall.bTransfering = false;
  1999. // this.AVSession.TransferCall(this.transferUri);
  2000. }
  2001. btnHoldResume = false;
  2002. txtCallStatus = '<i>Call placed on hold</i>';
  2003. oSipSessionCall.bHeld = true;
  2004. //simpleNotification("success","topRight",txtCallStatus);
  2005. }
  2006. break;
  2007. }
  2008. case 'm_local_hold_nok':
  2009. {
  2010. if(e.session == oSipSessionCall){
  2011. oSipSessionCall.bTransfering = false;
  2012. btnHoldResume = false;
  2013. txtCallStatus = '<i>Failed to place remote party on hold</i>';
  2014. //simpleNotification("error","topRight",txtCallStatus);
  2015. }
  2016. break;
  2017. }
  2018. case 'm_local_resume_ok':
  2019. {
  2020. if(e.session == oSipSessionCall){
  2021. oSipSessionCall.bTransfering = false;
  2022. btnHoldResume = false;
  2023. txtCallStatus = '<i>Call taken off hold</i>';
  2024. oSipSessionCall.bHeld = false;
  2025. //simpleNotification("warning","topRight",txtCallStatus);
  2026.  
  2027. if (SIPml.isWebRtc4AllSupported()) { // IE don't provide stream callback yet
  2028. uiVideoDisplayEvent(true, true);
  2029. uiVideoDisplayEvent(false, true);
  2030. }
  2031. }
  2032. break;
  2033. }
  2034. case 'm_local_resume_nok':
  2035. {
  2036. if(e.session == oSipSessionCall){
  2037. oSipSessionCall.bTransfering = false;
  2038. btnHoldResume = false;
  2039. txtCallStatus = '<i>Failed to unhold call</i>';
  2040. //simpleNotification("error","topRight",txtCallStatus);
  2041. }
  2042. break;
  2043. }
  2044. case 'm_remote_hold':
  2045. {
  2046. if(e.session == oSipSessionCall){
  2047. txtCallStatus = '<i>Placed on hold by remote party</i>';
  2048. //simpleNotification("warning","topRight",txtCallStatus);
  2049. }
  2050. break;
  2051. }
  2052. case 'm_remote_resume':
  2053. {
  2054. if(e.session == oSipSessionCall){
  2055. txtCallStatus = '<i>Taken off hold by remote party</i>';
  2056. //simpleNotification("warning","topRight",txtCallStatus);
  2057. }
  2058. break;
  2059. }
  2060. case 'm_bfcp_info':
  2061. {
  2062. if(e.session == oSipSessionCall){
  2063. txtCallStatus.innerHTML = 'BFCP Info: <i>'+ e.description +'</i>';
  2064. }
  2065. break;
  2066. }
  2067. case 'o_ect_trying':
  2068. {
  2069. if(e.session == oSipSessionCall){
  2070. txtCallStatus = '<i>Call transfer in progress...</i>';
  2071. //simpleNotification("warning","topRight",txtCallStatus);
  2072. }
  2073. break;
  2074. }
  2075. case 'o_ect_accepted':
  2076. {
  2077. if(e.session == oSipSessionCall){
  2078. txtCallStatus = '<i>Call transfer accepted</i>';
  2079. //simpleNotification("success","topRight",txtCallStatus);
  2080. }
  2081. break;
  2082. }
  2083. case 'o_ect_completed':
  2084. case 'i_ect_completed':
  2085. {
  2086. if(e.session == oSipSessionCall){
  2087. txtCallStatus = '<i>Call transfer completed</i>';
  2088. //simpleNotification("success","topRight",txtCallStatus);
  2089. btnTransfer = false;
  2090. if (oSipSessionTransferCall) {
  2091. oSipSessionCall = oSipSessionTransferCall;
  2092. }
  2093. oSipSessionTransferCall = null;
  2094. }
  2095. break;
  2096. }
  2097. case 'o_ect_failed':
  2098. case 'i_ect_failed':
  2099. {
  2100. if(e.session == oSipSessionCall){
  2101. txtCallStatus = '<i>Call transfer failed</i>';
  2102. //simpleNotification("error","topRight",txtCallStatus);
  2103. btnTransfer = false;
  2104. }
  2105. break;
  2106. }
  2107. case 'o_ect_notify':
  2108. case 'i_ect_notify':
  2109. {
  2110. if(e.session == oSipSessionCall){
  2111. txtCallStatus = "<i>Call Transfer: <b>" + e.getSipResponseCode() + " " + e.description + "</b></i>";
  2112. //simpleNotification("success","topRight",txtCallStatus);
  2113. if (e.getSipResponseCode() >= 300) {
  2114. if (oSipSessionCall.bHeld) {
  2115. oSipSessionCall.resume();
  2116. }
  2117. btnTransfer = false;
  2118. }
  2119. }
  2120. break;
  2121. }
  2122. case 'i_ect_requested':
  2123. {
  2124. if(e.session == oSipSessionCall){
  2125. var s_message = "Do you accept call transfer to [" + e.getTransferDestinationFriendlyName() + "]?";//FIXME
  2126. if (confirm(s_message)) {
  2127. txtCallStatus = "<i>Call transfer in progress...</i>";
  2128. //simpleNotification("warning","topRight",txtCallStatus);
  2129. oSipSessionCall.acceptTransfer();
  2130. break;
  2131. }
  2132. oSipSessionCall.rejectTransfer();
  2133. }
  2134. break;
  2135. }
  2136.  
  2137. }
  2138. }
  2139.  
  2140.  
  2141. function dialerSipMsg(omsg)
  2142. {
  2143. try
  2144. {
  2145. if(omsg.ao_headers[6].s_name=='kstych-data')
  2146. {
  2147. var vparts=omsg.ao_headers[6].s_value.split("|");
  2148.  
  2149. vparts[1]=atob(vparts[1]);
  2150. vparts[2]=atob(vparts[2]);
  2151.  
  2152. if(vparts[0]=="chat")incomingChat(vparts[1],vparts[2],vparts[3]);
  2153. else if(vparts[0]=="presence")incomingPresense(vparts[1],vparts[2],vparts[3]);
  2154. else if(vparts[0]=="wallreload")incomingwallReload(vparts[1],vparts[2],vparts[3]);
  2155. else if(vparts[0]=="liveconf")incomingLiveconf(vparts[1],vparts[2],vparts[3]);
  2156. else if(vparts[0]=="notify")incomingNotification(vparts[1],vparts[2],vparts[3]);
  2157. else if(vparts[0]=="popupalert")incomingPopupAlert(vparts[1],vparts[2],vparts[3]);
  2158.  
  2159. else if(vparts[0]=="incomingCall")incomingCall(vparts[1],vparts[2],vparts[3]);
  2160. else if(vparts[0]=="dialerUI")dialerUIUpdate(vparts[1],vparts[2],vparts[3]);
  2161.  
  2162. else if(vparts[0]=="adminCommand")adminCommand(vparts[1],vparts[2],vparts[3]);
  2163. }
  2164. //if(omsg.ao_headers.)
  2165. //window.console.log(omsg.ao_headers[6]);
  2166. }
  2167. catch(e){}
  2168. }
Add Comment
Please, Sign In to add comment