// JavaScript Document
$(function(){
if(data.userId == undefined) return;
message.$contacts = $("#message_contacts");
message.$new = $("#message_new");
// ==================== Окно контактов ====================
// кнопка отображения списка контактов
var $toolbar = $('#toolbar');
var $user_toolbar = $('.user_toolbar', $toolbar);
var $btn = $('Открыть список чата').button({
text: false,
icons: {
primary: "ui-icon-comment"
}
});
$btn.easyTooltip();
$user_toolbar.prepend($btn);
$btn.click(function(){
$(this).toggleClass('ui-state-highlight');
if($(this).is('.ui-state-highlight')){
$.cookie('message.contacts_is_show', 1);
message.$contacts.show('fade').mousedown();
}else{
$.cookie('message.contacts_is_show', 0);
message.$contacts.hide('fade');
}
});
if($.cookie('message.contacts_is_show') == 1) $btn.click(); // открыть список контактов, если необходимо
// возможность перемещнения списка контактов
message.$contacts.draggable({containment: "body", cursor: "move", handle: ".title"});
$(".ui-dialog-titlebar-close", message.$contacts).click(function(){
$btn.click();
});
message.$contacts.mousedown(message.winToTop);
message.$contacts.css('z-index', message.zIndex);
// возможность изменения списка контактов
message.$contacts.resizable({
minHeight: 305,
minWidth: 220,
maxWidth: 220
});
$('.search', message.$contacts).keyup(message.filter_contacts);
// обновление списка контактов
setInterval(function(){
message.get_contacts();
}, 1000*60*10)
message.resetPosition();
message.get_contacts(); // получить данные о контактах
// контроль позиции списка контактов
$(window).on('resize.for_message', message.resetPosition);
// ==================== Новые сообщения ====================
// обновление блока новых сообщений
message.loadNew();
setInterval(function(){
message.loadNew();
}, 1000*30)
});
var message = {};
message.onlyOnline = 0;
message.numOpenedChats = 0; // количество открытых чатов
message.zIndex = 100000;
message.resetPosition = function(){
$toolbar = $('#toolbar');
message.$contacts.css('left', '');
message.$contacts.css('right', 20);
message.$contacts.css('top', $toolbar.height() + 20);
}
// поднять окошко с чатом или контактами выше других
message.winToTop = function(){
var $win = $(this);
var curr_zIndex = $win.css('z-index');
var max_zIndex = $win.css('z-index');
$.map($('.message_chat[id!=message_chat_0], #message_contacts'), function(el, index){
zIndex = $(el).css('z-index');
if(zIndex > curr_zIndex) $(el).css('z-index', '-=1');
if(zIndex > max_zIndex) max_zIndex = zIndex;
});
$win.css('z-index', max_zIndex);
}
message.getImgAvatar = function(user){
if(user.id == data.userId) name = "Вы";
else name = user.name;
setTimeout(function(){ $('a.message_avatar').fancybox(); }, 0);
return '';
}
message.getImgStatus = function(user){
var statusImage = '';
var title = '';
if(user.online == 1){
statusImage += 'user_online.png';
title = 'В сети';
}else{
statusImage += 'user_offline.png';
title = 'Не в сети c '+dateInRusFormat(user.lastactive, '.').substr(0, 16);
}
return '';
}
// ==================================== КОНТАКТЫ ====================================
// обновить контакты
message.get_contacts = function(){
var $contacts = $('.contacts', message.$contacts);
$contacts.html(data.imgLoading);
$.post(
'ajax/get.php?module=message&fget=contacts&getFormat=json&onlyOnline='+message.onlyOnline,
function(users){
$contacts.empty();
$.map(users, function(user, index){
$contacts.append(
'
'
);
});
$('img', $contacts).easyTooltip();
$('.search', message.$contacts).keyup();
},
'json'
);
// обновить открытые окна чата
$('.message_chat[id!=message_chat_0]').map(function(){
message.update($(this).data('id'));
});
}
message.filter_contacts = function(){
var searct_str = $(this).val();
var $contacts = $('.contacts', message.$contacts);
if(!searct_str){
$('div.contact', $contacts).show();
return;
}
$.map($('div.contact', $contacts), function(contact, index){
var name = $('.name', contact).text();
var email = $('.email', contact).text();
if(name.toLowerCase().indexOf(searct_str.toLowerCase()) != -1 || email.toLowerCase().indexOf(searct_str.toLowerCase()) != -1)
$(contact).show();
else
$(contact).hide();
});
}
// ==================================== ЧАТ ====================================
message.openChat = function(user_id){
if($('#message_chat_'+user_id).length){
var $windowChat = $('#message_chat_'+user_id);
$windowChat.hide('fade', function(){
$windowChat.show('fade').mousedown(); // отобразить окно и поднять его наверх
// обновление данных чата
message.update(user_id);
});
}else{
message.numOpenedChats++;
var $windowChat = $('#message_chat_0').clone().attr('id', 'message_chat_'+user_id).data('id', user_id);
$windowChat.prependTo('body');
var top = message.$contacts.css('top').replace('px', '')*1 + (Math.ceil(message.numOpenedChats / 2) - 1)*40;
var right = message.$contacts.css('right').replace('px', '')*1 + ((message.numOpenedChats + 1) % 2 + 1)*(message.$contacts.outerWidth() + 10) + ((Math.ceil(message.numOpenedChats / 2)-1) % 2)*20;
$windowChat.css('top', top);
$windowChat.css('right', right);
$windowChat.css('z-index', message.zIndex+message.numOpenedChats);
$windowChat.show('fade');
// перемещение окошка
$windowChat.mousedown(message.winToTop);
$windowChat.draggable({containment: "body", cursor: "move", handle: ".title"});
// закрытие окошка
$(".ui-dialog-titlebar-close", $windowChat).click(function(){
$windowChat.hide('fade');
// отменить быстрое автообновление окошка с чатом
if($windowChat.data('updateTimer') != undefined){
clearInterval($windowChat.data('updateTimer'));
$windowChat.removeData('updateTimer')
}
});
// установка аватара в блоке написания сообщения
$('.write .avatar', $windowChat).html(message.getImgAvatar({id: data.userId, avatar: data.userAvatar}));
// отправка сообщения
$('.write textarea', $windowChat).keydown(function(event){
if(event.keyCode == 13 && event.shiftKey == false){
$(this).attr('readonly', 'readonly');
message.send($(this).val(), user_id);
}
});
// подгрузка истории сообщений
$('.chat', $windowChat).scroll(function(e){
if(e.currentTarget.scrollTop == 0){
message.update(user_id, 0);
e.currentTarget.scrollTop = 1;
}
});
// возможность изменения размеров чата
$windowChat.resizable({
minWidth: 220,
minHeight: 220
});
// обновление данных чата
message.update(user_id);
}
// запустить быстрое автообновление окошка с чатом
if($windowChat.data('updateTimer') == undefined)
$windowChat.data('updateTimer', setInterval(function(){ message.update(user_id)}, 5000));
}
message.send = function(text, user_id){
$.post(
'ajax/edit.php?module=message',
{
text: text,
to: user_id,
oper: 'add',
id: '_empty'
},function(){
$('#message_chat_'+user_id+' .write textarea').val('').removeAttr('readonly');
message.update(user_id);
},
'json'
);
}
// обновление данных чата
message.update = function(user_id, direction){
var $windowChat = $('#message_chat_'+user_id);
var $windowChat_chat = $('.chat', $windowChat);
var firstTime = $windowChat_chat.data('firstTime');
var lastTime = $windowChat_chat.data('lastTime');
if(firstTime == undefined) firstTime = 0;
if(lastTime == undefined) lastTime = 0;
if(direction == undefined) direction = 1; // направление загрузки сообщения (1: от последнего загруженного, 2:от первого загруженного назад (история сообщений))
$.post(
'ajax/get.php?module=message&getFormat=json&direction='+direction+'&lastTime='+lastTime+'&firstTime='+firstTime+'&from='+user_id,
{
rows: 10
},
function(messages){
if(!messages) return;
if(!messages.length) return;
var user = messages.shift();
$('.title', $windowChat).text(user.name);
$('.status', $windowChat).html(message.getImgStatus(user));
$('.status img', $windowChat).easyTooltip();
var new_message = false; // пришло новое сообщение в окно чата
$.map(messages, function(el, index){
// пропустить уже загруженные сообщения
if($('#'+el.id, $windowChat_chat).length){
if(el.readed != 0) $('#'+el.id, $windowChat_chat).removeClass('new');
return;
}
new_message = true;
// дата первого загруженного сообщения
if(firstTime == 0 || new Date(el.time).getTime() < new Date(firstTime).getTime()){
firstTime = el.time;
$windowChat_chat.data('firstTime', el.time);
}
// дата последнего загруженного сообщения
if(new Date(el.time).getTime() > new Date(lastTime).getTime()){
lastTime = el.time;
$windowChat_chat.data('lastTime', el.time);
}
// генерация кода сообщения
var $el = $(
''+
'
'+dateInRusFormat(el.time, '.').substr(0, 16)+'
'+
'
'+message.getImgAvatar((el.from == data.userId)?{id:data.userId, avatar:data.userAvatar}:{id:el.from, avatar:el.avatar, name:el.name})+'
'+
'
'+el.text+'
'+
'
'+
'
');
if(el.readed == 0) $el.mouseenter(function(){
message.setReaded(user_id, el.id);
$el.off('mouseenter');
});
$el.contextmenu({
alias: 'message_contextmenu',
width: 150,
items: [{ text: "Удалить", icon: data.urlIcons16x16+"del.png", action: message.setDeleted }]
});
$el.data({
from: el.from,
to: el.to
});
if(direction == 1) $windowChat_chat.append($el);
else $windowChat_chat.prepend($el);
});
$('img', $windowChat_chat).easyTooltip();
if(new_message && direction == 1) $windowChat_chat.scrollTop(10000); // пролистать чат к последнему сообщению
},
'json'
);
}
// отметить сообщения как прочитанное
message.setReaded = function(user_id, id){
var $windowChat = $('#message_chat_'+user_id);
var $windowChat_chat = $('.chat', $windowChat);
$.post(
'ajax/edit.php?module=message',
{
oper: 'edit',
id: id
},function(res){
if(res.result == 1){
$('#'+id, $windowChat_chat).removeClass('new');
}
},
'json'
);
}
// отметить сообщения как удаленное
message.setDeleted = function(el){
var $el = $(el);
var from = $el.data('from');
var to = $el.data('to');
var id = $el.attr('id');
if(from == data.userId) // идентификатор окна берется из номера получателя сообщения
user_id = to;
else // идентификатор окна берется из номера отправителя сообщения
user_id = from;
var $windowChat = $('#message_chat_'+user_id);
var $windowChat_chat = $('.chat', $windowChat);
$.post(
'ajax/edit.php?module=message',
{
oper: 'del',
id: id
},function(res){
if(res.result == 1){
$('#'+id, $windowChat_chat).remove();
}
},
'json'
);
}
// ==================================== НОВЫЕ СООБЩЕНИЯ ====================================
message.loadNew = function(){
$.post(
'ajax/get.php?module=message&getFormat=json=&from=%&searchSql2={%22readed%22:%220%22}',
function(messages){
if(!messages){
helper.showSystemMess('Вы не авторизованы в системе!
Войти', 0, 30000);
return;
}
var sound_on = true;
if($('.el', message.$new).length) sound_on = false;
message.$new.empty();
if(!messages.length) return;
$.map(messages, function(el, index){
// Пропускать уведомления о новых сообщениях из чатов, которые открыты
if($('#message_chat_'+el.from+':visible').length){
return;
};
$el = $(
''+
'
'+message.getImgAvatar({id:el.from, avatar:el.avatar, name:el.name})+'
'+
'
'+
''+el.name+': '+
''+el.text+''+
'
'+
'
'
);
$el.click(function(){
$(this).hide('slide');
message.openChat(el.from);
message.setReaded(el.from, el.id);
});
message.$new.append($el);
});
if(sound_on && $('.el', message.$new).length){
var sound_incoming = $('#message_sound_incoming')[0];
sound_incoming.play();
}
},
'json'
);
};