var lastid = '',
ismore = false,
loaded = true,
scrollHeight = 0,
page = 1,
islink = 1,
socket = null,
ping_timer = null,
listLoad = false,
boxElement = null;
$(function() {
if ("WebSocket" in window) {
webSocket(socketUrl);
chatUnlogin();
hiddenCommon();
} else {
console.log("您的浏览器不支持聊天!");
}
$(window).keydown(function (e) {
// Enter发送
if(e.keyCode == 13){
e.preventDefault();
if (socket && socket.readyState == 1) {
send();
} else {
webSocket(socketUrl);
var timer = setInterval(function() {
if (socket && socket.readyState == 1) {
clearInterval(timer);
send();
}
}, 500);
setTimeout(function() {
if (timer) {
clearInterval(timer);
}
}, 10000);
}
}
});
// 发送消息
if ($('#send').length > 0) {
$('#send').click(function() {
if(socket && socket.readyState == 1){
send();
}else{
webSocket(socketUrl);
var timer = setInterval(function(){
if(socket && socket.readyState == 1){
clearInterval(timer);
send();
}
},100);
setTimeout(function(){
if(timer){
clearInterval(timer);
}
},10000);
}
});
}
$("body").click(function(e){
var con = $("#commonly"); // 设置目标区域
var face = $("#face");
if ((!con.is(e.target) && con.has(e.target).length === 0) && (!face.is(e.target) && face.has(e.target).length === 0)) {
commonHide();
}
});
$("#face").click(function(){
face();
});
if($("#chat_content").length > 0){
$("#chat_content").scroll(function(){
var cs = document.getElementById('chat_content').scrollTop;
if(cs == 0 && ismore && loaded){
document.getElementById('chat_content').scrollTop = 21;
loaded = false;
app.cslog(app.$data.logid);
}
})
}
if($("#chatList").length > 0){
boxElement = document.getElementById("chatList");
boxElement.addEventListener('scroll', listScroll);
}
});
function webSocket(socketUrl){
if(islink == 1){
if(ping_timer){
clearInterval(ping_timer);
ping_timer = null;
}
socket = new WebSocket(socketUrl);
socket.onopen = function() {
var ping = {
type: 'ping'
};
ping_timer = setInterval(function() {
if (socket && socket.readyState == 1){
socket.send(JSON.stringify(ping));
}else{
socket.close();
}
}, 30000);
};
socket.onerror = function() {
islink = 2;
socket = null;
if(ping_timer){
clearInterval(ping_timer);
ping_timer = null;
}
};
socket.onclose = function() {
socket = null;
if(ping_timer){
clearInterval(ping_timer);
ping_timer = null;
}
};
//捕捉socket端发来的事件
socket.onmessage = function(event) {
var e = JSON.parse(event.data);
//console.log(e);
switch (e.type) {
//显示收到的消息
case 'getMessage':
getMessage(e.data);
break;
case 'error':
islink = 2;
if(ping_timer){
clearInterval(ping_timer);
ping_timer = null;
}
break;
}
};
}
}
// 未登录用户加载聊天数据
function chatUnlogin(){
$.post("index.php?m=crm_chat&c=getUnloginToken", {
chattype: 'admin',pytoken: pytoken
}, function(res) {
if (res) {
var t = setInterval(function(){
if (socket && socket.readyState == 1){
clearInterval(t);
if(res.data){
var bindData = res.data;
var bind = {
type: 'bind',
data: bindData
}
socket.send(JSON.stringify(bind));
}
if(res.mine){
mine = res.mine;
}
window.localStorage.setItem("islink", "1");
}
},100);
setTimeout(function(){
if(t){
clearInterval(t);
}
},10000);
}
},'json');
}
function hiddenCommon(){
// 检查页面是否后台运行
var yunhdn, yunvsb;
if (typeof document.hidden !== "undefined") {
yunhdn = "hidden";
yunvsb = "visibilitychange";
} else if (typeof document.msHidden !== "undefined") {
yunhdn = "msHidden";
yunvsb = "msvisibilitychange";
} else if (typeof document.webkitHidden !== "undefined") {
yunhdn = "webkitHidden";
yunvsb = "webkitvisibilitychange";
}
document.addEventListener(yunvsb, function(){
// 前台运行后,如socket断开,重新连接
if(!document[yunhdn]){
if (!socket || (socket && socket.readyState != 1)) {
webSocket(socketUrl);
chatUnlogin();
}
}
});
}
// 发送消息
function send() {
var content = document.getElementById('send_content');
if (content.value != '') {
sendMessage(content.value,'char','');
content.value = '';
}
}
function getMessage(msg){
// 后台
if (msg.id && msg.totype == 9 && msg.msgtype != 'read'){
if (typeof toid != 'undefined') {
chatRender(msg);
}else{
if ($('#crm_chat_num').length > 0) {
var msg_new = $('#crm_chat_num');
if (msg_new.text() == '') {
msg_new.text(1);
msg_new.css('display','block');
} else if (parseInt(msg_new.text()) > 0) {
msg_new.text(parseInt(msg_new.text()) + 1);
msg_new.css('display','block');
}
}
}
}
}
function chatRender(msg){
// 渲染消息内容
var newlog = {
chatid: new Date().getTime(),
mine: false,
msgtype: msg.msgtype,
avatar: msg.avatar,
content: rexContent(msg.content)
};
app.$data.logList.push(newlog);
setTimeout(function(){
var scroll = document.getElementById('chat_content').scrollHeight;
chatScrollTo(scroll);
},100);
}
// 发送消息
function sendMessage(content, type, id){
commonHide();
var time = new Date().getTime();
if(socket && socket.readyState == 1){
// 根据消息类型区分保存内容
if (type == 'adminjob') {
content = 'jobid=' + id;
}
var mineData = {
id: mine.id,
mine: true,
ftype: mine.usertype,
avatar: mine.avatar,
username: mine.username,
linkman: mine.linkman,
timestamp: time,
content: content,
msgtype: type,
op: {},
};
var sendData = {
mine: mineData,
to: {
id: toid,
utype: totype
}
};
var message = {
type: 'chatMessage',
data: {
content: sendData
}
};
// 保存聊天记录
if (type != 'change') {
var pdata = {
to: sendData.to.id,
totype: sendData.to.utype,
content: content,
timestamp: sendData.mine.timestamp,
msgtype: sendData.mine.msgtype,
nowid: sendData.mine.id,
nowtype: sendData.mine.ftype,
pytoken: pytoken,
eid: eid,
chated: chated
};
$.post("index.php?m=crm_chat&c=chatLog", pdata, function(res) {
if (res) {
if (res.error == 0) {
chated = 1;
message.data.content.mine.chatid = res.chatid;
socket.send(JSON.stringify(message));
// 渲染消息内容
mineData.content = rexContent(content);
if (type == 'adminjob') {
mineData.job = app.$data.joblist[jobkey];
}
app.$data.logList.push(mineData);
setTimeout(function(){
var scroll = document.getElementById('chat_content').scrollHeight;
chatScrollTo(scroll);
},100);
if(typeof parent.needLoad !== 'undefined'){
parent.needLoad = true;
}
}
}
},'json');
} else {
socket.send(JSON.stringify(message));
// 渲染消息内容
mineData.content = rexContent(content);
app.$data.logList.push(mineData);
setTimeout(function(){
var scroll = document.getElementById('chat_content').scrollHeight;
chatScrollTo(scroll);
},100);
}
}else{
layer.msg('客勤功能加载中', 2, 8);
}
}
// 页面滚动
function chatScrollTo(ypos) {
var clientHeight = document.getElementById('chat_content').clientHeight;
if(ypos > clientHeight){
// 兼容各种浏览器
document.getElementById('chat_content').scrollTop = ypos;
}
}
// 上传图片
function upImage(obj) {
layer.load();
$('#imgform').submit();
var iframe = $('#cs_iframe'),
timer = setInterval(function() {
var res;
try {
res = iframe.contents().find('body').text();
} catch (e) {
layer.closeAll('loading');
clearInterval(timer);
timer = null;
}
if (res) {
layer.closeAll('loading');
clearInterval(timer);
timer = null;
iframe.contents().find('body').html('');
try {
res = JSON.parse(res);
} catch (e) {
res = {};
}
if (res.msg) {
layer.msg(res.msg, 2, 8);
} else {
focusInsert(document.getElementById("send_content"), 'img[' + (res.data.url || '') + ']', true);
send();
}
}
}, 30);
obj.value = '';
}
// 转义内容
function rexContent(content){
content = (content||'').replace(/&(?!#?[a-zA-Z0-9]+;)/g, '&')
.replace(//g, '>').replace(/'/g, ''').replace(/"/g, '"') //XSS
.replace(/face\[([^\s\[\]]+?)\]/g, function(face){ //转义表情
var alt = face.replace(/^face/g, '');
return '';
})
.replace(/img\[([^\s]+?)\]/g, function(img){ //转义图片
return '
';
})
return content;
}
//表情库
function faces(fc){
var alt = {1:'[龇牙]',2:'[调皮]',3:'[流汗]',4:'[偷笑]',5:'[再见]',6:'[敲打]',7:'[擦汗]',8:'[流泪]',9:'[大哭]',10:'[嘘]',11:'[酷]',12:'[抓狂]',13:'[可爱]',14:'[色]',15:'[害羞]',16:'[得意]',17:'[吐]',18:'[微笑]',19:'[怒]',20:'[尴尬]',21:'[惊恐]',22:'[冷汗]',23:'[白眼]',24:'[傲慢]',25:'[难过]',26:'[惊讶]',27:'[疑问]',28:'[么么哒]',29:'[困]',30:'[憨笑]',31:'[撇嘴]',32:'[阴险]',33:'[奋斗]',34:'[发呆]',35:'[左哼哼]',36:'[右哼哼]',74:'[抱抱]',37:'[坏笑]',38:'[鄙视]',39:'[晕]',40:'[可怜]',41:'[饥饿]',42:'[咒骂]',43:'[折磨]',44:'[抠鼻]',45:'[鼓掌]',46:'[糗大了]',47:'[打哈欠]',48:'[快哭了]',49:'[吓]',50:'[闭嘴]',51:'[大兵]',52:'[委屈]',53:'[NO]',54:'[OK]',56:'[弱]',57:'[强]',60:'[握手]',63:'[胜利]',58:'[抱拳]',66:'[凋谢]',99:'[米饭]',108:'[蛋糕]',112:'[西瓜]',70:'[啤酒]',89:'[瓢虫]',62:'[勾引]',82:'[爱你]',69:'[咖啡]',72:'[月亮]',68:'[刀]',55:'[差劲]',59:'[拳头]',65:'[便便]',79:'[炸弹]',107:'[菜刀]',82:'[心碎了]',83:'[爱心]',71:'[太阳]',97:'[礼物]',92:'[皮球]',137:'[骷髅]',123:'[闪电]',80:'[猪头]',67:'[玫瑰]',98:'[篮球]',64:'[乒乓]',101:'[红双喜]',139:'[麻将]',73:'[彩带]',61:'[爱你]',95:'[示爱]',111:'[衰]',109:'[蜡烛]'},arr = {};
$.each(alt, function(index, item){
arr[item] = weburl + '/js/im/emoji_'+ index +'@2x.png';
});
if(fc){
return arr[fc];
}else{
return arr;
}
}
function face(){
if($('#face').hasClass('sendbq_i')){
$('#commonly').removeClass('none');
$('#face').removeClass("sendbq_i");
var content = '',
faceArr = faces();
$.each(faceArr, function(key, item){
content += '