-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhawk_chat.min.js
More file actions
2 lines (1 loc) · 13.3 KB
/
Copy pathhawk_chat.min.js
File metadata and controls
2 lines (1 loc) · 13.3 KB
1
2
(function(c){var d={online:[],offline:[]};var a={init:function(e){if(!HAWK_API){var h=this;setTimeout(function(){h.init(e)},500);return}if(HAWK_API.initialized){return}b=c.extend(b,e);if(!b.inMessageFormat){throw"Empty message format"}if(b.userId===null||b.userId===undefined){throw"User id not set"}b.container=c(this);var g=b.container;var f=b.chatBody;g.html(f).data("hawk_chat",b);HAWK_API.bind_handler("message",a.onMessage);HAWK_API.bind_handler("initialized",a.onInit);HAWK_API.bind_handler("get_by_group",a.showUsers);HAWK_API.bind_handler("get_group_by_simple_user",a.showGroups);HAWK_API.bind_handler("remove_from_groups",function(){HAWK_API.get_groups_by_user()});c(b.textInputSelector,g).keyup(a.send);a.initTab();a.registerUser();if(!b.useTabs){c(b.tabsContainerSelector).hide()}if(!b.inline){if(g.draggable){c("#chat").draggable({scroll:false,handle:b.chatHeaderSelector})}else{console.error("Для перемещаемого чата необходимо наличие jquery ui draggable")}}if(!b.useUserList){c(b.leftPanelSelector).hide()}c(b.titleSelector).html(b.title);[{selector:b.tabsWrapperSelector,axis:"x"},{selector:b.onlineWrapperSelector,axis:"xy"},{selector:b.offlineWrapperSelector,axis:"xy"}].forEach(a.applyStyleToScroll)},initTab:function(){b.container.find(b.tabForCopySelector).click(a.changeTab);if(b.groupName){a.addTab.call(b.container,b.groupName,true,true)}if((typeof b.openWithUser)==="object"&&b.openWithUser.length){b.openWithUser.forEach(function(e){a.addTab.call(b.container,e,false)})}},registerUser:function(){c.post(b.serverSideUrl,{user_id:b.userId,group_id:((b.groupName)?[b.groupName]:null),action:"register_user"},function(e){e=JSON.parse(e);if(!e.error){HAWK_API.init({user_id:b.userId,url:b.serverUrl})}})},onMessage:function(j,l){if(l.from===b.userId||l.event!="hawk.chat_message"){return}var f=l.to_group||l.from;var i=c('[data-hawk-panel_id="'+f+'_panel"]');if(!i.size()){b.container.hawkChat("addTab",f);i=c('[data-hawk-panel_id="'+f+'_panel"]');if(!l.to_group&&b.onNewPrivate==="function"){b.onNewPrivate.call(b.container,l.from)}}if(!i.is(":visible")){var m=i.data().hawkPanel_id;var g=b.container.find(b.containertabSelector+'[data-href="'+m+'"] '+b.countNewMessageSelector);var h=0|g.text().replace("+","");g.text("+"+ ++h)}var k=a.compileMessageString(l);if(typeof b.onInMessage==="function"){k=b.onInMessage.call(b.container,l,k);if(k===-1){k=a.compileMessageString(l)}}if(!l.to_group&&b.onPrivateMessage==="function"){k=b.onPrivateMessage.call(b.container,l,k)}if(k!==false){if(i.find(".mCSB_container").size()){i=i.find(".mCSB_container")}i.append(k);if(typeof b.container.mCustomScrollbar!=="undefined"){i.parent().parent().mCustomScrollbar("scrollTo","bottom")}}},compileMessageString:function(g){var e=b.inMessageFormat.match(/\{[\w]+\}/g);if(e===null){throw"Invalid message format"}var f=b.inMessageFormat;if(typeof g.text==="object"){e.map(function(h){return h.replace(/\{|\}/g,"")}).forEach(function(h){if(g.text.hasOwnProperty(h)){var i=new RegExp("\\{"+h+"\\}","g");f=f.replace(i,g.text[h])}})}else{f=g.text}return f},onInit:function(){if(typeof b.onInit==="function"){b.onInit.call(b.container)}HAWK_API.get_groups_by_user();setInterval(function(){HAWK_API.get_groups_by_user()},30000);c(b.textInputSelector,b.container).removeAttr("disabled");a.addGroup()},showUsers:function(f,g){if(g.result&&typeof g.result==="object"){HAWK_API.print_debug(g);c(b.onlineWrapperSelector+" "+b.usersContainerSelector+","+b.offlineWrapperSelector+" "+b.usersContainerSelector).empty();if(typeof b.onUserUpdate==="function"){b.onUserUpdate.call(b.container,g.result)}d.online=[];d.offline=[];g.result.forEach(function(e){for(var h in e){e[h].users.forEach(function(k){var i=b.onlineWrapperSelector+" "+b.usersContainerSelector;var j=b.onlineUserClass;if(!k.online&&k.user!=HAWK_API.get_user_id()){i=b.offlineWrapperSelector+" "+b.usersContainerSelector;j=b.offlineUserClass}else{if(k.user===HAWK_API.get_user_id()){j=b.currentUserClass}}i=c(i);if(!i.find('[data-hawk-id="'+k.user+'"]').size()){var l=b.userFormat.replace(/\{login\}|\{id\}/g,k.user);l=c(l);l.addClass(j);if(k.online&&b.useTabs){l.click(a.createPrivate)}i.append(l)}if(k.online){d.online.push(k.user)}else{d.offline.push(k.user)}})}})}},showGroups:function(g,h){c(b.groupsWrapperSelector+" "+b.usersContainerSelector).empty();var f=[];h.result.forEach(function(j){var e=b.groupsWrapperSelector+" "+b.usersContainerSelector;var i=b.groupFormat.replace(/\{login\}|\{id\}/g,j.name);i=c(i);i.not("img").click(function(k){a.addTab.call(b.container,j.name,true)});i.find(b.exitGroupButtonSelector).click(a.exitFromGroup);c(e).append(i);f.push(j.name)});HAWK_API.get_users_by_group(f)},exitFromGroup:function(g){g.stopPropagation();var f=c(this).data().hawkId;if(f){HAWK_API.remove_user_from_group([f])}},addGroup:function(){c(b.createGroupButtonSelector).click(function(){c(b.onlineWrapperSelector+" "+b.usersContainerSelector+" "+b.userToGroupAddSelector).show();c(b.createGroupButtonSelector).hide();c(b.groupActionsWrapperSelector).show()});c(b.groupActionsWrapperSelector+" "+b.addGroupButtonSelector).click(function(){var f=c(b.onlineWrapperSelector+" "+b.usersContainerSelector+" "+b.userToGroupAddSelector+":checked");if(!f.size()){alert("Для создания группы необходимо выбрать пользователей")}else{var e=prompt('Придумайте название группы \r\n(допускаются символы латинского алфавита и "_"):');if(e&&e.trim()!==""&&HAWK_API.check_user_id(e)){HAWK_API.add_user_to_group([e]);f.each(function(){HAWK_API.add_user_to_group([e],this.value)})}setTimeout(function(){HAWK_API.get_groups_by_user()},1000);c(b.createGroupButtonSelector).show();c(b.groupActionsWrapperSelector).hide();c(b.onlineWrapperSelector+" "+b.usersContainerSelector+" "+b.userToGroupAddSelector).hide()}});c(b.groupActionsWrapperSelector+" "+b.exitGroupButtonSelector).click(function(){c(b.onlineWrapperSelector+" "+b.usersContainerSelector+" "+b.userToGroupAddSelector).hide();c(b.createGroupButtonSelector).show();c(b.groupActionsWrapperSelector).hide()})},getUsers:function(){return d},send:function(k){if(k.keyCode===13){var m=c(this);var h=new Date().toLocaleString("ru",{year:"numeric",month:"2-digit",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"});var l=b.outMessageFormat.replace("{time}",h).replace("{from_login}",b.userId.substr(0,10)).replace("{message}",m.val());var i=c(l);i.addClass("chat-message-curent-user");var j=b.container.find(b.messagePanelSelector+".active");if(j.find(".mCSB_container").size()){j=j.find(".mCSB_container")}j.append(l);if(typeof b.container.mCustomScrollbar!=="undefined"){j.parent().parent().mCustomScrollbar("scrollTo","bottom")}var g=b.container.find(b.tabSelector+".active");var n=g.attr("data-href").replace("_panel","");if(g.data().isGroup){n={group:[n]}}else{n={user:n}}var f={to:n,text:{time:h,from_login:b.userId,message:m.val()},event:"hawk.chat_message"};if(typeof b.onOutMessage==="function"){b.onOutMessage.call(b.container,f)}HAWK_API.send_message(f);m.val("")}},createPrivate:function(f){var g=c(this).data().hawkId;if(!g||f.target.nodeName==="INPUT"||f.target.nodeName==="IMG"){f.stopPropagation()}else{if(g!=b.userId){b.container.hawkChat("addTab",g)}}},addTab:function(k,j,g){var f=b.container;var h=f.find(b.tabsContainerSelector);j=j||false;g=g||false;var i=h.find('[data-href="'+k+'_panel"]');if(i.size()){i.click();return}i=h.find(b.tabForCopySelector).clone(true);i.removeClass("main").addClass("active").attr("data-href",k+"_panel").attr("data-isMain",g).attr("title",k).attr("data-is-group",j).css("display","block").find(b.tabNameSelector).html(k.substr(0,10));h.find(b.tabSelector).removeClass("active");h.find(b.tabForCopySelector).parent().append(i);f.find(b.messagePanelSelector).removeClass("active").hide();var e=f.find('[data-hawk-panel_id="chat_main_panel"]').clone(true);e.attr("data-hawk-panel_id",k+"_panel").addClass("active").show();f.find(b.textPanelSelector).before(e);a.applyStyleToScroll({selector:e,axis:"y"});i.find(b.closeTabSelector).click(a.closeTab);c(b.textInputSelector).show()},changeTab:function(){var h=c(this);var g=h.data().href;var e=h.parents(b.bodySelector);var f=e.find(b.tabSelector+".active");e.find(b.messagePanelSelector).removeClass("active").hide();e.find('[data-hawk-panel_id="'+g+'"]').addClass("active").show();e.find(b.tabSelector).removeClass("active");h.addClass("active");h.find(b.countNewMessageSelector).empty();if(b.onChangeTab==="function"){b.onChangeTab.call(b.container,f,h)}},closeTab:function(){var f=c(this);var e=f.parent();c('[data-hawk-panel_id="'+e.data().href+'"]').remove();e.remove();c(b.tabsContainerSelector,b.container).find(b.tabSelector+":last").not(b.tabForCopySelector).click();if(!b.container.find(b.messagePanelSelector+":visible").size()){c(b.textInputSelector).hide()}},applyStyleToScroll:function(e){var f=null;if(!b.customScroll){f=a.stylizationScroll}else{if(typeof b.customScroll==="function"){f=b.customScroll}}if(f){f(e)}},stylizationScroll:function(f){if(typeof b.container.mCustomScrollbar!=="undefined"){var e=b.container;c(f.selector,e).mCustomScrollbar({axis:f.axis,scrollButtons:{enable:true},theme:"dark-thin",scrollInertia:200,autoHideScrollbar:true,autoExpandScrollbar:true,advanced:{autoExpandHorizontalScroll:true}})}},getDefaultHtml:function(){return'<div class="chat-container"> <div id="" class="chat-header"> <div class="chat-title">Post Hawk Chat</div> <div class="chat-logo"></div> </div> <div class="chat-body"> <div class="chat-left-panel"> <div class="chat-separator"> <span>Группы</span> <span id="create_new_group"> <div class="add-hawk-group"></div> </span> <span id="actions_new_group"> <div class="add-hawk-group-confirm"></div> <div class="add-hawk-group-dismiss"></div> </span> </div> <div class="chat-groups-u" id="chat_groups_u"><table class="chat-users"></table></div> <div class="chat-separator"><span>В сети</span></div> <div class="chat-online-u" id="chat_online_u"><table class="chat-users"></table></div> <div class="chat-separator"><span>Не в сети</span></div> <div class="chat-offline-u" id="chat_offline_u"><table class="chat-users"></table></div> </div> <div class="chat-right-panel"> <div class="chat-tabs"> <ul> <li style="display: none;" data-href="chat_main_panel" class="chat-tab main"> <span class="chat-tab-name"></span> <span class="chat-tab-count-new"></span> <span class="chat-close-tab">x</span> </li> </ul> </div> <div style="display: none;" data-hawk-panel_id="chat_main_panel" class="chat-mesasge-panel"></div> <div class="chat-text-panel"> <input disabled="disabled" id="chat_send_message" placeholder="Введите сообщение" class="chat-text-input" type="text"> </div> </div> </div> </div>'},getDefaultInMessageFormat:function(){return'<div class="chat-row" title="{time}"> <span class="chat-row-login">{from_login}</span>: <span class="chat-row-message">{message}</span> </div>'},getDefaultUserFormat:function(){return'<tr data-hawk-id="{id}"> <td><input value="{login}" class="hawk-new-users-group" style="display: none;" type="checkbox" class="add_to_hawk_group"></td> <td>{login}</td> </tr>'},getDefaultGroupFormat:function(){return'<tr data-hawk-id="{id}"><td>{login}</td><td><div data-hawk-id="{id}" class="add-hawk-group-dismiss"></div></td></tr>'},setTitleMainTab:function(e){var f=c(this).data("hawk_chat");c(this).find(f.tabSelector).eq(0).find(f.tabNameSelector).html(e)}};var b={chatBody:a.getDefaultHtml(),userId:null,groupName:"default_group",serverUrl:"wss://post-hawk.com:2222",inMessageFormat:a.getDefaultInMessageFormat(),outMessageFormat:a.getDefaultInMessageFormat(),userFormat:a.getDefaultUserFormat(),groupFormat:a.getDefaultGroupFormat(),serverSideUrl:"/chat.php",onlineUserClass:"chat-online",offlineUserClass:"chat-offline",currentUserClass:"chat-current",tabForCopySelector:".chat-tab.main",tabsContainerSelector:".chat-tabs ul",tabsWrapperSelector:".chat-tabs",tabSelector:".chat-tab",tabNameSelector:".chat-tab-name",messagePanelSelector:".chat-mesasge-panel",textPanelSelector:".chat-text-panel",bodySelector:".chat-body",countNewMessageSelector:".chat-tab-count-new",chatHeaderSelector:".chat-header",inline:true,useTabs:true,useUserList:true,leftPanelSelector:".chat-left-panel",title:"Post Hawk Chat",titleSelector:".chat-title",openWithUser:[],closeTabSelector:".chat-close-tab",textInputSelector:"#chat_send_message",onlineWrapperSelector:"#chat_online_u",groupsWrapperSelector:"#chat_groups_u",offlineWrapperSelector:"#chat_offline_u",usersContainerSelector:"table.chat-users",exitGroupButtonSelector:".add-hawk-group-dismiss",addGroupButtonSelector:".add-hawk-group-confirm",userToGroupAddSelector:".hawk-new-users-group",createGroupButtonSelector:"#create_new_group",groupActionsWrapperSelector:"#actions_new_group",onInit:function(){},onInMessage:function(f,e){return e},onOutMessage:function(e){},onPrivateMessage:function(f,e){return e},onNewPrivate:function(e){},onUserUpdate:function(e){return e},onChangeTab:function(e,f){},customScroll:false};c.fn.hawkChat=function(e){if(a[e]){return a[e].apply(this,Array.prototype.slice.call(arguments,1))}else{if(typeof e==="object"||!e){return a.init.apply(this,arguments)}else{c.error("Метод с именем "+e+" не существует для jQuery.hawkChat")}}}})(jQuery);