// 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 ''+name+''; } 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 ''+title+''; } // ==================================== КОНТАКТЫ ==================================== // обновить контакты 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( '
'+ '
'+message.getImgAvatar(user)+'
'+ '
'+user.name+'
'+ '
'+user.email+'
'+ '
'+message.getImgStatus(user)+'
'+ '
' ); }); $('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' ); };