chat.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
  1. js.apiurl = function(m,a,cans){
  2. var url='api.php?m='+m+'&a='+a+'&adminid='+adminid+'';
  3. url+='&cfrom=reim';
  4. if(!cans)cans={};
  5. for(var i in cans)url+='&'+i+'='+cans[i]+'';
  6. return url;
  7. }
  8. js.ajax = function(m,a,d,funs, mod,checs, erfs, glx){
  9. if(js.ajaxbool && !js.ajaxwurbo)return;
  10. clearTimeout(js.ajax_time);
  11. var url = js.apiurl(m,a);
  12. js.ajaxbool = true;
  13. if(!mod)mod='mode';
  14. if(typeof(erfs)!='function')erfs=function(){};
  15. if(typeof(funs)!='function')funs=function(){};
  16. if(!checs)checs=function(){};
  17. var bs = checs(d);
  18. if(typeof(bs)=='string'&&bs!=''){
  19. js.msg('msg', bs);
  20. return;
  21. }
  22. if(typeof(bs)=='object')d=js.apply(d,bs);
  23. var tsnr = '努力处理中...';
  24. if(mod=='wait')js.msg(mod, tsnr);
  25. function errsoers(ts){
  26. js.setmsg(ts);
  27. js.msg('msg',ts);
  28. js.ajaxbool = false;
  29. erfs(ts);
  30. }
  31. var type=(!d)?'get':'post';if(glx)type=glx;
  32. var ajaxcan={
  33. type:type,dataType:'json',data:d,url:url,
  34. success:function(ret){
  35. js.ajaxbool=false;
  36. clearTimeout(js.ajax_time);
  37. if(ret.code!=200){
  38. errsoers(ret.msg);
  39. }else{
  40. js.setmsg('');
  41. js.msg('none');
  42. funs(ret.data);
  43. }
  44. },
  45. error:function(e){
  46. errsoers('内部出错:'+e.responseText+'');
  47. }
  48. };
  49. $.ajax(ajaxcan);
  50. js.ajax_time = setTimeout(function(){
  51. if(js.ajaxbool){
  52. errsoers('Error:请求超时?');
  53. }
  54. }, 1000*30);
  55. }
  56. js.downshow=function(id){
  57. this.location('?id='+id+'&a=down');
  58. }
  59. var im={
  60. minid:999999999,
  61. init:function(){
  62. strformat.emotspath='web/';
  63. this.type = receinfor.type;
  64. this.gid = receinfor.gid;
  65. this.showobj = $('#showview');
  66. this.inputobj = $('#contentss');
  67. this.loaddata();
  68. $('a[tools]').click(function(e){
  69. im.toolsclick(this,e);
  70. return false;
  71. });
  72. this.inputobj.focus();
  73. $('body').keydown(im.onkeydown);
  74. this.showobj.mousewheel(function(e){
  75. im.mousewheel(e.deltaY);
  76. });
  77. this.resethie();
  78. $(window).resize(function(){
  79. im.resethie();
  80. });
  81. this.charcontobj = $.rockmenu({
  82. data:[],
  83. itemsclick:function(d){
  84. im.clickmenuss(d);
  85. }
  86. });
  87. this.initupfile();
  88. document.ondragover=function(e){e.preventDefault();};
  89. document.ondrop=function(e){e.preventDefault();};
  90. document.addEventListener('drop', function(e) {
  91. var files = e.dataTransfer;
  92. im.filedrop(files);
  93. }, false);
  94. },
  95. resethie:function(){
  96. var h = winHb()-40-30-80-40;
  97. this.showobj.css('height',''+h+'px');
  98. },
  99. submitinput:function(){
  100. try{im.sendcont();}catch(e){}
  101. return false;
  102. },
  103. mousewheel:function(lx){
  104. //向上
  105. if(lx==1){
  106. var t = this.showobj.scrollTop();
  107. if(t==0&&get('loadmored')&&!js.ajaxbool)this.loadmoreda(get('loadmored'));
  108. }
  109. },
  110. onkeydown:function(e){
  111. var code = e.keyCode;
  112. if(code==27){im.close();return false;}
  113. if(e.altKey){
  114. if(code == 67){im.close();return false;}
  115. if(code == 83){im.sendcont();return false;}
  116. }
  117. if(e.ctrlKey){
  118. if(code == 13){im.sendcont();return false;}
  119. }
  120. return true;
  121. },
  122. toolsclick:function(o1,evt){
  123. var o = $(o1);
  124. var lx= o.attr('tools');
  125. if(lx=='send')this.sendcont();
  126. if(lx=='emts')this.getemts(o);
  127. if(lx=='clear')this.clearping();
  128. if(lx=='crop')im.cropScreen(false);
  129. if(lx=='close')this.close();
  130. if(lx=='file')this.sendfile(true);
  131. if(lx=='change')this.changesend(o);
  132. if(lx=='cropput')js.msg('msg','请使用快捷键Ctrl+V');
  133. },
  134. close:function(){
  135. window.close();
  136. },
  137. clearping:function(){
  138. this.showobj.html('');
  139. },
  140. getheight:function(ss){
  141. var hei = 50;if(!ss)ss=0;
  142. if(get('header_title'))hei+=50;
  143. return $(window).height()-hei+ss;
  144. },
  145. //判断是否可以发消息
  146. sendbool:function(){
  147. var bo = true;
  148. if(receinfor.type=='group' && receinfor.innei==0)bo=false;
  149. if(!bo)js.msg('msg','你不在此会话中,不允许发送');
  150. return bo;
  151. },
  152. loaddata:function(o1, iref){
  153. if(this.boolload)return;
  154. var iref = (!iref)?false:true;
  155. var minid= 0;
  156. if(iref)minid=this.minid;
  157. if(o1)$(o1).html('<img src="images/loadings.gif" height="14" width="15" align="absmiddle"> 加载中...');
  158. this.boolload = true;
  159. this.isshangla = false;
  160. js.ajax('reim','getrecord',{type:this.type,gid:this.gid,minid:minid,lastdt:''},function(ret){
  161. if(o1)$(o1).html('');
  162. im.boolload = false;
  163. im.loaddatashow(ret, iref);
  164. },'none', false,false,'get');
  165. },
  166. readinforshow:function(){
  167. //setTimeout('im.readinforshows()',1000*10);
  168. },
  169. readinforshows:function(){
  170. var minid=this.minid;
  171. js.ajax('reim','getrecord',{type:this.type,gid:this.gid,minid:0,lastdt:this.lastdt},function(ret){
  172. im.loaddatashow(ret, false, true);
  173. im.readinforshow();
  174. },'none', false,false,'get');
  175. },
  176. showdata:{},
  177. loaddatashow:function(ret,isbf, isls){
  178. var a = ret.rows;
  179. this.lastdt = ret.nowdt;
  180. $('#showviewload').remove();
  181. var i,len = a.length,cont,lex,nas,fase,nr,d,na=[],rnd,sid;
  182. $('#loadmored').remove();
  183. if(isbf){
  184. if(len>0)this.showobj.prepend('<div class="showblanks">---------↑以上是新加载---------</div>');
  185. na = a;
  186. }else{
  187. for(i= len-1; i>=0; i--)na.push(a[i]);
  188. }
  189. for(i= 0; i<len; i++){
  190. d = na[i];
  191. sid = parseFloat(d.id);
  192. lex = 'right';
  193. nas = '我';
  194. fase= adminface;
  195. if(d.sendid!=adminid){
  196. lex='left';
  197. nas= d.sendname;
  198. fase= d.face;
  199. }
  200. this.showdata[sid]=d;
  201. nr = this.contshozt(d.filers);
  202. if(nr=='')nr= jm.base64decode(d.cont);
  203. rnd = 'mess_'+sid+'';
  204. cont= strformat.showqp(lex,nas,d.optdt,nr ,'', fase, rnd);
  205. if(!isbf){
  206. this.addcont(cont, isbf);
  207. }else{
  208. this.showobj.prepend(cont);
  209. }
  210. $('#qipaocont_'+rnd+'').contextmenu(function(e){
  211. im.contright(this,e);
  212. return false;
  213. });
  214. if(sid<this.minid)this.minid=sid;
  215. }
  216. if(len>0 && !isls){
  217. var s = '<div id="histordiv" class="showblanks" >';
  218. if(ret.wdtotal==0){
  219. s+='---------↑以上是历史记录---------';
  220. if(len>=5){
  221. this.showobj.prepend('<div id="loadmored" class="showblanks" ><a href="javascript:;" onclick="im.loadmoreda(this)">点击加载更多...</a></div>');
  222. this.isshangla = true;
  223. }
  224. }else{
  225. s+='---↑以上是历史,还有未读信息'+ret.wdtotal+'条,<a href="javascript:;" onclick="im.loaddata(this)">点击加载</a>---';
  226. }
  227. s+='</div>';
  228. if(!isbf)this.addcont(s);
  229. if(isbf)this._addclickf();
  230. }
  231. },
  232. contright:function(o1,e){
  233. var o=$(o1),rnd=o.attr('rand');
  234. this.randmess = rnd;//,{name:'转发...',lx:4}
  235. var ids=rnd.replace('mess_',''),da=this.showdata[ids];
  236. this.rightdata = da;
  237. var d=[{name:'复制',lx:0},{name:'删除',lx:1},{name:'刷新',lx:5}];
  238. if(this.type=='group')d.push({name:'@TA',lx:3});
  239. //if(da.sendid==adminid)d.push({name:'撤回',lx:6});
  240. this.charcontobj.setData(d);
  241. this.charcontobj.showAt(e.clientX,e.clientY,130);
  242. },
  243. clickmenuss:function(d){
  244. var lx=d.lx;
  245. var ids=this.randmess.replace('mess_','');
  246. if(lx==0){
  247. var cont = $('#qipaocont_'+this.randmess+'').text();
  248. if(cont)this.addinput(cont);
  249. }
  250. if(lx==1){
  251. $('#ltcont_'+this.randmess+'').remove();
  252. if(ids)js.ajax('reim','clearrecord',{type:this.type,gid:this.gid,ids:ids},false,'none');
  253. }
  254. if(lx==2){
  255. js.confirm('确定要清除1个月前的记录吗?',function(lx){
  256. if(lx=='yes')im.clearjilss(30);
  257. });
  258. }
  259. if(lx==3){
  260. var cont = $('#ltname_'+this.randmess+'').text();
  261. if(cont)this.addinput('@'+cont);
  262. }
  263. if(lx==4){
  264. js.changeuser(false,'usercheck','转发给...', {
  265. onselect:function(sna,sid){
  266. if(!sid)return;
  267. im.zhuangfa(sid, ids);
  268. }
  269. });
  270. }
  271. if(lx==5){
  272. location.reload();
  273. }
  274. if(lx==6){
  275. $('#qipaocont_'+this.randmess+'').html('撤回消息');
  276. }
  277. },
  278. //转发
  279. zhuangfa:function(touid, ids){
  280. },
  281. clearjilss:function(d){
  282. js.ajax('reim','clearrecord',{type:this.type,gid:this.gid,day:d},function(s){
  283. js.msg('success','清除成功');
  284. });
  285. },
  286. loadmoreda:function(o1){
  287. this.loaddata(o1, true);
  288. },
  289. addcont:function(cont, isbf){
  290. var o = this.showobj;
  291. if(cont){if(isbf){o.prepend(cont);}else{o.append(cont);}}
  292. clearTimeout(this.scrolltime);
  293. this.scrolltime = setTimeout(function(){
  294. im.showobj.animate({scrollTop:get('showview').scrollHeight},100);
  295. im._addclickf();
  296. }, 50);
  297. },
  298. _addclickf:function(){
  299. var o = this.showobj.find('img[fid]');
  300. o.unbind('click');
  301. o.click(function(){
  302. im.clickimg(this);
  303. });
  304. },
  305. clickimg:function(o1){
  306. var o=$(o1);
  307. var fid=o.attr('fid');
  308. var src = o1.src.replace('_s.','.');
  309. $.imgview({url:src,ismobile:false});
  310. },
  311. contshozt:function(d){
  312. return strformat.contshozt(d,'web/');
  313. },
  314. sendcont : function(ssnr){
  315. if(js.ajaxbool || !this.sendbool())return;
  316. js.msg('none');
  317. var o = this.inputobj;
  318. var nr = strformat.sendinstr(o.val());
  319. nr = nr.replace(/</gi,'&lt;').replace(/>/gi,'&gt;').replace(/\n/gi,'<br>');
  320. if(ssnr)nr=ssnr;
  321. if(isempt(nr))return false;
  322. var conss = jm.base64encode(nr);
  323. if(conss.length>500){
  324. js.msg('msg','发送内容太多了');
  325. return;
  326. }
  327. var nuid= js.now('time'),optdt = js.serverdt();
  328. if(optdt==this.nowoptdt){
  329. js.msg('msg','消息发太快了');
  330. return;
  331. }
  332. this.nowoptdt = optdt;
  333. var cont= strformat.showqp('right','我',optdt, nr, nuid, adminface);
  334. this.addcont(cont);
  335. o.val('').focus();
  336. this.sendconts(conss, nuid, optdt, 0);
  337. return false;
  338. },
  339. sendconts:function(conss, nuid, optdt, fid){
  340. try{opener.reim.addhistory(this.type,this.gid,0,conss,optdt,adminname);}catch(e){}
  341. var d = {cont:conss,gid:this.gid,type:this.type,nuid:nuid,optdt:optdt,fileid:fid};
  342. js.ajax('reim','sendinfor',d,function(ret){
  343. im.sendsuccess(ret,nuid);
  344. },'none',false,function(){
  345. im.senderror(nuid);
  346. });
  347. },
  348. senderror:function(nuid){
  349. js.ajaxbool = false;
  350. get(nuid).src='images/error.png';
  351. get(nuid).title='发送失败';
  352. },
  353. sendsuccess:function(d,nuid){
  354. this.bool = false;
  355. if(!d.id){
  356. this.senderror(nuid);
  357. return;
  358. }
  359. $('#'+d.nuid+'').remove();
  360. var bo = false;
  361. d.messid=d.id;
  362. d.face = adminface;
  363. if(this.type=='group')d.gface=receinfor.face;
  364. var bo = serversend(d);
  365. //if(!bo)js.msg('msg','信息不能及时推送,但已保存到服务器');
  366. },
  367. addinput:function(s){
  368. var val = this.inputobj.val()+s;
  369. this.inputobj.val(val).focus();
  370. },
  371. initupfile:function(){
  372. if(typeof(uploadobj)=='undefined')uploadobj = $.rockupload({
  373. inputfile:'allfileinput',
  374. initpdbool:false,
  375. updir:'reimchat',
  376. onchange:function(f){
  377. im.sendfileshow(f);
  378. },
  379. onprogress:function(f,per,evt){
  380. strformat.upprogresss(per,im._sssnuid);
  381. },
  382. onsuccess:function(f,str,o1){
  383. im.sendfileok(f,str);
  384. },
  385. onerror:function(str){
  386. js.msg('msg', str);
  387. im.senderror(im.upfilearr.nuid);
  388. }
  389. });
  390. strformat.upobj = uploadobj;
  391. },
  392. sendfile:function(bo){
  393. if(!this.sendbool())return;
  394. if(bo)uploadobj.click();
  395. },
  396. filedrop:function(fobj){
  397. if(!this.sendbool())return;
  398. uploadobj.change(fobj);
  399. },
  400. //上传的文件预览显示
  401. sendfileshow:function(f, snr){
  402. if(!f)f={};
  403. f.face = adminface;
  404. var fa = strformat.showupfile(f, snr);
  405. var cont= fa.cont;
  406. this._sssnuid = fa.nuid;
  407. this._sssoptdt = fa.optdt;
  408. this.upfilearr = fa;
  409. this.addcont(cont);
  410. },
  411. sendfileok:function(f,str){
  412. var a=js.decode(str);
  413. if(!a.id){
  414. this.senderror(this._sssnuid);
  415. strformat.uperror(this._sssnuid);
  416. js.msg('msg', str);
  417. return;
  418. }
  419. var contss = strformat.upsuccess(a, this._sssnuid);
  420. this.sendconts(jm.base64encode(contss), this._sssnuid, this._sssoptdt, a.id);
  421. },
  422. fileyulan:function(pn,fid){
  423. var url = '?m=public&a=fileviewer&id='+fid+'';
  424. parent.js.open(url, 700, 500);
  425. },
  426. getemts:function(o){
  427. if(!get('aemtsdiv')){
  428. var s = '<div id="aemtsdiv" style="width:400px;height:200px;overflow-y:auto;border:1px #cccccc solid;background:white;box-shadow:0px 0px 5px rgba(0,0,0,0.3);left:3px;top:5px;position:absolute;display:none;z-index:6">';
  429. s+='<div style="padding:5px">';
  430. s+=this.getemtsbq('qq',0, 96, 11, 24);
  431. s+='</div>';
  432. s+='</div>';
  433. $('body').append(s);
  434. js.addbody('emts','hide','aemtsdiv');
  435. }
  436. var o1 = $('#aemtsdiv');
  437. o1.toggle();
  438. var off = o.offset();
  439. o1.css('top',''+(off.top-205)+'px');
  440. },
  441. getemtsbq:function(wj, oi1,oi2, fzd, dx){
  442. var i,oi=0,j1 = js.float(100/fzd);
  443. var s = '<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>';
  444. for(i=oi1; i<=oi2; i++){
  445. oi++;
  446. s+='<td width="'+j1+'%" title="'+strformat.emotsarr[i+1]+'" align="center"><img onclick="im.backemts(\''+strformat.emotsarr[i+1]+'\')" src="web/images/im/emots/'+wj+'/'+i+'.gif" width="'+dx+'" height="'+dx+'"></td>';
  447. if(oi % fzd==0)s+='</tr><tr>';
  448. }
  449. s+='</tr></table>';
  450. return s;
  451. },
  452. backemts:function(s){
  453. this.addinput(s);
  454. $('#aemtsdiv').hide();
  455. },
  456. getpath:function(){
  457. if(!this.pathobj)this.pathobj = require('path');
  458. var oatg = this.pathobj.dirname(process.execPath);
  459. oatg = oatg.replace(/\\/g, '/');
  460. return oatg;
  461. },
  462. //截屏
  463. cropScreen:function(lx){
  464. if(nwjsgui){
  465. var oatg = this.getpath();
  466. nw.Shell.openItem(''+oatg+'/images/reimcaptScreen.exe');
  467. }else{
  468. js.msg('msg','无法截屏,请使用REIM客户端/第三方快捷键,<a href="http://www.rockoa.com/view_client.html" target="_blank">[去下载]</a>');
  469. return;
  470. }
  471. },
  472. readclip:function(evt){
  473. var clipboardData = evt.clipboardData;
  474. if(!clipboardData)return;
  475. for(var i=0; i<clipboardData.items.length; i++){
  476. var item = clipboardData.items[i];
  477. if(item.kind=='file'&&item.type.match(/^image\//i)){
  478. var blob = item.getAsFile(),reader = new FileReader();
  479. reader.onload=function(){
  480. var cont=this.result;
  481. im.sendfileshow(false, cont);
  482. }
  483. reader.readAsDataURL(blob);
  484. }
  485. }
  486. },
  487. upbase64:function(nuid,nus){
  488. var o = get('jietuimg_'+nuid+'');
  489. this.sendfile(false);
  490. uploadobj.sendbase64(o.src);
  491. },
  492. //显示用户
  493. showuser:function(){
  494. var s = '<div id="showuserlist" style="height:160px;overflow:auto;padding:5px 10px"><div align="center" style="padding:10px;"><img src="images/mloading.gif" align="absmiddle">&nbsp;加载人员...</div></div>';
  495. js.tanbody('syscogshow','会话上人员',350,100,{html:s});
  496. js.ajax('reim','getgroupuser',{type:this.type,gid:this.gid},function(ret){
  497. im.showusershow(ret.uarr);
  498. },'none', false,false,'get');
  499. },
  500. showusershow:function(a){
  501. var i,len=a.length,s='',oi=0;
  502. s+='<table width="100%"><tr>';
  503. for(i=0;i<len;i++){
  504. oi++;
  505. s+='<td width="20%"><div style="padding:5px" align="center"><div><img style="height:40px;width:40px;border-radius:50%" onclick="$.imgview({url:this.src})" src="'+a[i].face+'"></div><div style="color:#888888">'+a[i].name+'</div></div></td>';
  506. if(oi%4==0)s+='</tr><tr>';
  507. }
  508. s+='</tr></table>';
  509. $('#showuserlist').html(s);
  510. },
  511. //邀请
  512. yaoqing:function(){
  513. if(this.type!='group')return;
  514. js.changeuser(false,'usercheck','邀请人到会话中', {
  515. onselect:function(sna,sid){
  516. if(!sid)return;
  517. im.yaoqings(sid);
  518. }
  519. });
  520. },
  521. yaoqings:function(sid){
  522. js.msg('wait','邀请中...');
  523. js.ajax('reim','yaoqinguid',{val:sid,gid:this.gid},function(da){
  524. if(da.indexOf('success')==0){
  525. var uids = da.replace('success','');
  526. js.alert('邀请成功','',function(){
  527. location.reload();
  528. });
  529. //if(uids != '')
  530. }else{
  531. js.msg('msg',da);
  532. }
  533. });
  534. },
  535. //退出会话
  536. exitgroup:function(){
  537. if(this.type!='group')return;
  538. js.confirm('确定要退出会话吗?',function(lx){
  539. if(lx=='yes'){
  540. im.exitgroups();
  541. }
  542. });
  543. },
  544. exitgroups:function(){
  545. js.msg('wait','退出中...');
  546. js.ajax('reim','exitgroup',{gid:this.gid}, function(da){
  547. js.alert('成功退出会话','',function(){
  548. try{opener.reim.exitgroup(im.gid)}catch(e){}
  549. im.close();
  550. });
  551. });
  552. }
  553. }
  554. strformat.clickfile=function(fid,lx){
  555. js.fileopt(fid,lx);
  556. }