1
0
mirror of https://github.com/wbbaddons/Tims-Chat.git synced 2024-11-01 14:20:07 +00:00
Tims-Chat/file/js/be.bastelstu.WCF.Chat.coffee

558 lines
17 KiB
CoffeeScript
Raw Normal View History

2011-12-19 14:46:40 +00:00
###
# be.bastelstu.WCF.Chat
2011-12-26 19:02:23 +00:00
#
# @author Tim Düsterhus
2012-01-28 16:50:33 +00:00
# @copyright 2010-2012 Tim Düsterhus
2011-12-26 19:02:23 +00:00
# @license Creative Commons Attribution-NonCommercial-ShareAlike <http://creativecommons.org/licenses/by-nc-sa/3.0/legalcode>
# @package be.bastelstu.wcf.chat
2011-12-19 14:46:40 +00:00
###
2012-04-27 13:42:44 +00:00
window.console ?=
log: () ->,
warn: () ->,
error: () ->
2012-04-27 13:42:44 +00:00
(($, window, windowConsole) ->
window.be ?= {}
be.bastelstu ?= {}
be.bastelstu.WCF ?= {}
2012-04-27 13:42:44 +00:00
console =
log: (message) ->
windowConsole.log '[be.bastelstu.WCF.Chat] '+message
warn: (message) ->
windowConsole.warn '[be.bastelstu.WCF.Chat] '+message
error: (message) ->
windowConsole.error '[be.bastelstu.WCF.Chat] '+message
be.bastelstu.WCF.Chat =
# Tims Chat stops loading when this reaches zero
# TODO: We need an explosion animation
shields: 3
# Are we currently loading messages?
loading: false
2012-01-28 15:09:24 +00:00
# Templates
titleTemplate: null
messageTemplate: null
2012-01-28 15:09:24 +00:00
# Notifications
2011-12-26 21:16:37 +00:00
newMessageCount: null
2012-01-28 13:08:51 +00:00
isActive: true
2012-01-28 15:09:24 +00:00
# Autocompleter
2012-01-28 13:08:51 +00:00
autocompleteOffset: 0
autocompleteValue: null
2012-01-28 15:09:24 +00:00
# Autoscroll
oldScrollTop: null
2012-01-28 15:09:24 +00:00
# Events
2012-01-12 19:04:28 +00:00
events:
newMessage: $.Callbacks()
userMenu: $.Callbacks()
2012-04-27 13:42:44 +00:00
# socket.io
socket: null
pe:
getMessages: null
refreshRoomList: null
fish: null
2011-12-26 15:03:16 +00:00
init: () ->
2012-04-27 13:42:44 +00:00
console.log 'Initializing'
2011-12-24 16:47:07 +00:00
@bindEvents()
@events.newMessage.add $.proxy @notify, @
@pe.refreshRoomList = new WCF.PeriodicalExecuter $.proxy(@refreshRoomList, @), 60e3
@pe.getMessages = new WCF.PeriodicalExecuter $.proxy(@getMessages, @), @config.reloadTime * 1e3
@refreshRoomList()
@getMessages()
2012-04-27 13:42:44 +00:00
@initPush()
2011-12-26 19:02:23 +00:00
2012-04-27 13:42:44 +00:00
console.log 'Finished initializing - Shields at 104 percent'
2011-12-19 14:52:00 +00:00
###
2012-01-28 13:08:51 +00:00
# Autocompletes a username
###
autocomplete: (firstChars, offset = @autocompleteOffset) ->
users = []
2012-01-28 14:57:33 +00:00
# Search all matching users
2012-02-05 16:21:43 +00:00
for user in $ '.timsChatUser'
2012-03-07 22:04:19 +00:00
username = $(user).data 'username'
2012-01-28 13:08:51 +00:00
if username.indexOf(firstChars) is 0
users.push username
2012-01-28 14:57:33 +00:00
# None found -> return firstChars
# otherwise return the user at the current offset
2012-04-30 19:23:57 +00:00
return if users.length is 0 then firstChars else users[offset % users.length] + ', '
2012-01-28 13:08:51 +00:00
###
2011-12-19 14:52:00 +00:00
# Binds all the events needed for Tims Chat.
###
bindEvents: () ->
# Mark window as focused
2011-12-26 21:16:37 +00:00
$(window).focus $.proxy () ->
2012-02-05 16:21:43 +00:00
document.title = @titleTemplate.fetch
title: $('#timsChatRoomList .activeMenuItem a').text()
2011-12-26 21:16:37 +00:00
@newMessageCount = 0
@isActive = true
, @
2011-12-26 21:16:37 +00:00
# Mark window as blurred
2011-12-26 21:16:37 +00:00
$(window).blur $.proxy () ->
@isActive = false
, @
2011-12-26 21:16:37 +00:00
# Unload the chat
window.onbeforeunload = $.proxy () ->
@unload()
return undefined
, @
2012-01-28 14:57:33 +00:00
# Insert a smiley
2012-02-18 16:42:15 +00:00
$('.jsSmiley').click $.proxy (event) ->
2011-12-24 16:47:07 +00:00
@insertText ' ' + $(event.target).attr('alt') + ' '
, @
2011-12-26 19:02:23 +00:00
2012-01-28 14:57:33 +00:00
# Switch sidebar tab
2012-02-05 16:21:43 +00:00
$('.timsChatSidebarTabs li').click $.proxy (event) ->
event.preventDefault()
2011-12-24 16:47:07 +00:00
@toggleSidebarContents $ event.target
, @
2011-12-26 19:02:23 +00:00
2012-01-28 14:57:33 +00:00
# Submit Handler
2012-02-05 16:21:43 +00:00
$('#timsChatForm').submit $.proxy (event) ->
event.preventDefault()
2011-12-24 16:47:07 +00:00
@submit $ event.target
, @
2012-01-28 14:57:33 +00:00
# Autocompleter
2012-02-05 16:21:43 +00:00
$('#timsChatInput').keydown $.proxy (event) ->
# tab key
2012-01-28 13:08:51 +00:00
if event.keyCode is 9
event.preventDefault()
if @autocompleteValue is null
2012-02-05 16:21:43 +00:00
@autocompleteValue = $('#timsChatInput').val()
2012-01-28 13:08:51 +00:00
firstChars = @autocompleteValue.substring(@autocompleteValue.lastIndexOf(' ')+1)
2012-04-27 13:42:44 +00:00
console.log 'Autocompleting "' + firstChars + '"'
2012-01-28 13:08:51 +00:00
return if firstChars.length is 0
2012-01-28 14:57:33 +00:00
# Insert name and increment offset
2012-04-30 19:23:57 +00:00
$('#timsChatInput').val(@autocompleteValue.substring(0, @autocompleteValue.lastIndexOf(' ') + 1) + @autocomplete(firstChars))
2012-01-28 13:08:51 +00:00
@autocompleteOffset++
else
@autocompleteOffset = 0
@autocompleteValue = null
, @
2012-01-28 14:57:33 +00:00
# Refreshes the roomlist
2012-02-05 16:21:43 +00:00
$('#timsChatRoomList button').click $.proxy(@refreshRoomList, @)
2012-01-28 14:57:33 +00:00
# Clears the stream
2012-02-05 16:21:43 +00:00
$('#timsChatClear').click (event) ->
event.preventDefault()
$('.timsChatMessage').remove()
@oldScrollTop = null
$('.timsChatMessageContainer').scrollTop $('.timsChatMessageContainer ul').height()
$('#timsChatInput').focus()
2012-01-28 14:57:33 +00:00
# Toggle Buttons
2012-02-05 16:21:43 +00:00
$('.timsChatToggle').click (event) ->
element = $ @
icon = element.find 'img'
2011-12-24 16:48:08 +00:00
if element.data('status') is 1
element.data 'status', 0
icon.attr 'src', icon.attr('src').replace /enabled(\d?).([a-z]{3})$/, 'disabled$1.$2'
element.attr 'title', element.data 'enableMessage'
else
element.data 'status', 1
icon.attr 'src', icon.attr('src').replace /disabled(\d?).([a-z]{3})$/, 'enabled$1.$2'
element.attr 'title', element.data 'disableMessage'
2012-06-13 16:13:54 +00:00
# Enable fullscreen-mode on #main
$('#timsChatFullscreen').click (event) ->
if $(this).data 'status'
main = $('#main')[0]
if typeof main.requestFullscreen isnt 'undefined'
main.requestFullscreen()
else if typeof main.mozRequestFullScreen isnt 'undefined'
main.mozRequestFullScreen()
else if typeof main.webkitRequestFullScreen isnt 'undefined'
main.webkitRequestFullScreen()
else
if typeof document.exitFullscreen isnt 'undefined'
document.exitFullscreen()
else if typeof document.mozCancelFullScreen isnt 'undefined'
document.mozCancelFullScreen()
else if typeof document.webkitCancelFullScreen isnt 'undefined'
document.webkitCancelFullScreen()
2012-01-28 14:57:33 +00:00
# Immediatly scroll down when activating autoscroll
2012-02-05 16:21:43 +00:00
$('#timsChatAutoscroll').click (event) ->
2012-05-24 18:36:58 +00:00
$(this).removeClass 'active'
if $(this).data 'status'
2012-02-05 16:21:43 +00:00
$('.timsChatMessageContainer').scrollTop $('.timsChatMessageContainer ul').height()
@oldScrollTop = $('.timsChatMessageContainer').scrollTop()
2012-01-28 20:48:06 +00:00
2012-01-28 14:57:33 +00:00
# Desktop Notifications
2012-01-28 15:09:24 +00:00
unless typeof window.webkitNotifications is 'undefined'
2012-02-05 16:21:43 +00:00
$('#timsChatNotify').click (event) ->
window.webkitNotifications.requestPermission() if $(this).data 'status'
2012-01-21 17:43:58 +00:00
2011-12-19 14:52:00 +00:00
###
# Changes the chat-room.
#
# @param jQuery-object target
###
changeRoom: (target) ->
window.history.replaceState {}, '', target.attr('href')
$.ajax target.attr('href'),
dataType: 'json'
data:
ajax: 1
type: 'POST'
success: $.proxy((data, textStatus, jqXHR) ->
2011-12-24 16:47:07 +00:00
@loading = false
target.parent().removeClass 'ajaxLoad'
2012-01-28 14:57:33 +00:00
# Mark as active
2012-02-05 16:21:43 +00:00
$('.activeMenuItem .timsChatRoom').parent().removeClass 'activeMenuItem'
target.parent().addClass 'activeMenuItem'
2011-12-26 19:02:23 +00:00
2012-01-28 14:57:33 +00:00
# Set new topic
2011-12-24 16:48:08 +00:00
if data.topic is ''
2012-02-05 19:36:11 +00:00
return if $('#timsChatTopic').text().trim() is ''
2012-02-05 19:36:11 +00:00
$('#timsChatTopic').wcfBlindOut 'vertical', () ->
$(@).text ''
else
2012-02-05 19:36:11 +00:00
$('#timsChatTopic').text data.topic
2012-02-05 19:46:52 +00:00
$('#timsChatTopic').wcfBlindIn() if $('#timsChatTopic').text().trim() isnt '' and $('#timsChatTopic').is(':hidden')
2012-03-07 22:04:19 +00:00
$('.timsChatMessage').addClass 'unloaded', 800
2012-02-05 16:21:43 +00:00
@handleMessages data.messages
document.title = @titleTemplate.fetch data
, @)
error: () ->
2012-01-28 14:57:33 +00:00
# Reload the page to change the room the old fashion-way
# inclusive the error-message :)
window.location.reload true
beforeSend: $.proxy(() ->
return false if target.parent().hasClass('ajaxLoad') or target.parent().hasClass 'activeMenuItem'
2011-12-24 16:47:07 +00:00
@loading = true
target.parent().addClass 'ajaxLoad'
, @)
2011-12-19 14:52:00 +00:00
###
2011-12-24 16:28:36 +00:00
# Frees the fish
###
freeTheFish: () ->
return if $.wcfIsset 'fish'
2012-04-27 13:42:44 +00:00
console.warn 'Freeing the fish'
2012-01-28 14:57:33 +00:00
fish = $ '<div id="fish">' + WCF.String.escapeHTML('><((((\u00B0>') + '</div>'
2011-12-24 16:28:36 +00:00
fish.css
position: 'absolute'
top: '150px'
left: '400px'
color: 'black'
textShadow: '1px 1px white'
zIndex: 9999
fish.appendTo $ 'body'
@pe.fish = new WCF.PeriodicalExecuter(() ->
2012-01-28 15:09:24 +00:00
left = Math.random() * 100 - 50
top = Math.random() * 100 - 50
fish = $ '#fish'
2011-12-24 16:28:36 +00:00
left *= -1 unless fish.width() < (fish.position().left + left) < ($(document).width() - fish.width())
top *= -1 unless fish.height() < (fish.position().top + top) < ($(document).height() - fish.height())
2011-12-24 16:28:36 +00:00
fish.text '><((((\u00B0>' if left > 0
fish.text '<\u00B0))))><' if left < 0
2011-12-24 16:28:36 +00:00
fish.animate
top: '+=' + top
2011-12-24 16:28:36 +00:00
left: '+=' + left
, 1e3
2012-03-07 22:04:19 +00:00
, 1.5e3)
2011-12-24 16:28:36 +00:00
###
2011-12-19 14:52:00 +00:00
# Loads new messages.
###
getMessages: () ->
2011-12-26 16:01:24 +00:00
$.ajax 'index.php/Chat/Message/',
dataType: 'json'
type: 'POST'
success: $.proxy((data, textStatus, jqXHR) ->
@loading = false
@handleMessages(data.messages)
2012-01-12 19:04:28 +00:00
@handleUsers(data.users)
, @)
error: $.proxy((jqXHR, textStatus, errorThrown) ->
2012-04-27 13:42:44 +00:00
console.error 'Battle Station hit - shields at ' + (--@shields / 3 * 104) + ' percent'
if @shields is 0
@pe.refreshRoomList.stop()
@pe.getMessages.stop()
@freeTheFish()
2012-04-27 13:42:44 +00:00
console.error 'We got destroyed, but could free our friend the fish before he was killed as well. Have a nice life in freedom!'
alert 'herp i cannot load messages'
, @)
beforeSend: $.proxy(() ->
return false if @loading
@loading = true
, @)
2011-12-19 14:52:00 +00:00
###
# Inserts the new messages.
#
# @param array<object> messages
###
handleMessages: (messages) ->
2012-01-28 14:57:33 +00:00
# Disable scrolling automagically when user manually scrolled
unless @oldScrollTop is null
2012-02-05 16:21:43 +00:00
if $('.timsChatMessageContainer').scrollTop() < @oldScrollTop
2012-03-18 19:05:05 +00:00
if $('#timsChatAutoscroll').data('status') is 1
2012-02-05 16:21:43 +00:00
$('#timsChatAutoscroll').click()
2012-05-24 18:36:58 +00:00
$('#timsChatAutoscroll').addClass 'active'
$('#timsChatAutoscroll').parent().fadeOut('slow').fadeIn 'slow'
2012-01-28 14:57:33 +00:00
# Insert the messages
for message in messages
2012-03-07 22:04:19 +00:00
continue if $.wcfIsset 'timsChatMessage' + message.messageID # Prevent problems with race condition
2011-12-27 16:07:12 +00:00
@events.newMessage.fire message
2011-12-24 16:47:07 +00:00
output = @messageTemplate.fetch message
li = $ '<li></li>'
li.attr 'id', 'timsChatMessage'+message.messageID
2012-02-05 16:21:43 +00:00
li.addClass 'timsChatMessage timsChatMessage'+message.type
2011-12-24 16:48:08 +00:00
li.addClass 'ownMessage' if message.sender is WCF.User.userID
li.append output
li.appendTo $ '.timsChatMessageContainer > ul'
2012-01-28 14:57:33 +00:00
# Autoscroll down
2012-02-05 16:21:43 +00:00
if $('#timsChatAutoscroll').data('status') is 1
$('.timsChatMessageContainer').scrollTop $('.timsChatMessageContainer ul').height()
@oldScrollTop = $('.timsChatMessageContainer').scrollTop()
2012-01-28 14:57:33 +00:00
###
# Builds the userlist.
#
# @param array<object> users
###
2012-01-12 19:04:28 +00:00
handleUsers: (users) ->
foundUsers = { }
2012-01-12 19:04:28 +00:00
for user in users
2012-02-05 16:21:43 +00:00
id = 'timsChatUser-'+user.userID
2012-03-07 22:04:19 +00:00
element = $ '#'+id
2012-01-28 14:57:33 +00:00
# Move the user to the correct position
2012-01-12 19:04:28 +00:00
if element[0]
2012-04-27 13:42:44 +00:00
console.log 'Moving User: "' + user.username + '"'
2012-01-12 19:04:28 +00:00
element = element.detach()
2012-03-22 17:45:36 +00:00
if user.awayStatus?
element.addClass 'timsChatAway'
element.attr 'title', user.awayStatus
else
element.removeClass 'timsChatAway'
element.removeAttr 'title'
element.data 'tooltip', ''
2012-02-05 16:21:43 +00:00
$('#timsChatUserList').append element
2012-01-28 14:57:33 +00:00
# Insert the user
2012-01-12 19:04:28 +00:00
else
2012-04-27 13:42:44 +00:00
console.log 'Inserting User: "' + user.username + '"'
2012-01-12 19:04:28 +00:00
li = $ '<li></li>'
li.attr 'id', id
2012-02-05 16:21:43 +00:00
li.addClass 'timsChatUser'
2012-03-22 17:45:36 +00:00
li.addClass 'jsTooltip'
if user.awayStatus?
li.addClass 'timsChatAway'
li.attr 'title', user.awayStatus
2012-01-28 13:08:51 +00:00
li.data 'username', user.username
2012-01-12 19:04:28 +00:00
a = $ '<a href="javascript:;">'+user.username+'</a>'
a.click $.proxy (event) ->
event.preventDefault()
@toggleUserMenu $ event.target
, @
2012-01-12 19:04:28 +00:00
li.append a
menu = $ '<ul></ul>'
2012-02-05 16:21:43 +00:00
menu.addClass 'timsChatUserMenu'
menu.append $ '<li><a href="javascript:;">' + WCF.Language.get('wcf.chat.query') + '</a></li>'
menu.append $ '<li><a href="javascript:;">' + WCF.Language.get('wcf.chat.kick') + '</a></li>'
menu.append $ '<li><a href="javascript:;">' + WCF.Language.get('wcf.chat.ban') + '</a></li>'
2012-04-19 15:49:54 +00:00
menu.append $ '<li><a href="index.php/User/' + user.userID + '-' + encodeURI(user.username) + '/">' + WCF.Language.get('wcf.chat.profile') + '</a></li>'
2012-01-12 19:04:28 +00:00
@events.userMenu.fire user, menu
li.append menu
2012-02-05 16:21:43 +00:00
li.appendTo $ '#timsChatUserList'
2012-01-12 19:04:28 +00:00
foundUsers[id] = true
# Remove users that were not found
2012-02-05 16:21:43 +00:00
$('.timsChatUser').each () ->
if typeof foundUsers[$(@).attr('id')] is 'undefined'
2012-04-27 13:42:44 +00:00
console.log 'Removing User: "' + $(@).data('username') + '"'
$(@).remove();
2012-01-12 19:04:28 +00:00
2012-04-15 11:00:16 +00:00
$('#toggleUsers .badge').text(users.length);
2011-12-19 14:52:00 +00:00
###
2012-04-27 13:42:44 +00:00
# Initializes Server-Push
###
initPush: () ->
if typeof window.io isnt 'undefined'
console.log 'Initializing socket.io'
@socket = io.connect @config.socketIOPath
@socket.on 'connect', $.proxy((data) ->
console.log 'Connected on socket.io'
@pe.getMessages.stop()
, @)
@socket.on 'disconnect', $.proxy((data) ->
console.log 'Losing connection to socket.io'
@pe.getMessages = new WCF.PeriodicalExecuter $.proxy(@getMessages, @), @config.reloadTime * 1e3
, @)
@socket.on 'newMessage', $.proxy((data) ->
@getMessages()
, @)
###
2011-12-19 14:52:00 +00:00
# Inserts text into our input.
#
# @param string text
# @param object options
###
insertText: (text, options) ->
options = $.extend
append: true
submit: false
, options or {}
2012-02-05 16:21:43 +00:00
text = $('#timsChatInput').val() + text if options.append
$('#timsChatInput').val(text)
$('#timsChatInput').keyup()
if (options.submit)
2012-02-05 16:21:43 +00:00
$('#timsChatForm').submit()
else
2012-02-05 16:21:43 +00:00
$('#timsChatInput').focus()
2011-12-19 14:52:00 +00:00
###
2012-01-21 17:43:58 +00:00
# Sends a notification about a message.
#
# @param object message
###
notify: (message) ->
2012-03-25 12:56:16 +00:00
return if @isActive or $('#timsChatNotify').data('status') is 0
2012-01-21 17:43:58 +00:00
@newMessageCount++
2012-02-05 16:21:43 +00:00
document.title = '(' + @newMessageCount + ') ' + @titleTemplate.fetch
title: $('#timsChatRoomList .activeMenuItem a').text()
2012-01-21 17:43:58 +00:00
2012-01-28 14:57:33 +00:00
# Desktop Notifications
2012-01-21 17:43:58 +00:00
if typeof window.webkitNotifications isnt 'undefined'
if window.webkitNotifications.checkPermission() is 0
2012-03-07 22:04:19 +00:00
title = WCF.Language.get 'wcf.chat.newMessages'
icon = WCF.Icon.get 'be.bastelstu.wcf.chat.chat'
2012-05-24 18:32:43 +00:00
content = message.username + message.separator + (if message.separator is ' ' then '' else ' ') + message.message
2012-02-05 16:21:43 +00:00
notification = window.webkitNotifications.createNotification icon, title, content
2012-01-21 17:43:58 +00:00
notification.show()
setTimeout(() ->
notification.cancel()
2012-01-29 14:23:21 +00:00
, 5e3)
2012-01-21 17:43:58 +00:00
###
2011-12-19 14:52:00 +00:00
# Refreshes the room-list.
###
refreshRoomList: () ->
2012-04-27 13:42:44 +00:00
console.log 'Refreshing the roomlist'
$('#toggleRooms a').addClass 'ajaxLoad'
$.ajax $('#toggleRooms a').data('refreshUrl'),
dataType: 'json'
type: 'POST'
success: $.proxy((data, textStatus, jqXHR) ->
2012-02-05 16:21:43 +00:00
$('#timsChatRoomList li').remove()
$('#toggleRooms a').removeClass 'ajaxLoad'
2012-04-15 11:00:16 +00:00
$('#toggleRooms .badge').text data.length
2012-01-07 15:45:14 +00:00
for room in data
li = $ '<li></li>'
li.addClass 'activeMenuItem' if room.active
2012-02-05 16:21:43 +00:00
$('<a href="' + room.link + '">' + room.title + '</a>').addClass('timsChatRoom').appendTo li
$('#timsChatRoomList ul').append li
2012-02-05 16:21:43 +00:00
$('.timsChatRoom').click $.proxy (event) ->
2011-12-24 16:48:08 +00:00
return if typeof window.history.replaceState is 'undefined'
event.preventDefault()
2011-12-24 16:47:07 +00:00
@changeRoom $ event.target
, @
2012-04-27 13:42:44 +00:00
console.log 'Found ' + data.length + ' rooms'
, @)
2011-12-19 14:52:00 +00:00
###
# Handles submitting of messages.
#
# @param jQuery-object target
###
submit: (target) ->
2012-01-28 14:57:33 +00:00
# Break if input contains only whitespace
2012-02-05 16:21:43 +00:00
return false if $('#timsChatInput').val().trim().length is 0
2012-01-28 14:57:33 +00:00
# Finally free the fish
2012-02-05 16:21:43 +00:00
@freeTheFish() if $('#timsChatInput').val().trim().toLowerCase() is '/free the fish'
2011-12-24 16:28:36 +00:00
text = $('#timsChatInput').val()
$('#timsChatInput').val('').focus().keyup()
2012-02-05 16:21:43 +00:00
$.ajax $('#timsChatForm').attr('action'),
data:
text: text
2012-03-07 22:04:19 +00:00
smilies: $('#timsChatSmilies').data 'status'
type: 'POST',
beforeSend: (jqXHR) ->
2012-02-05 16:21:43 +00:00
$('#timsChatInput').addClass 'ajaxLoad'
success: $.proxy((data, textStatus, jqXHR) ->
2011-12-24 16:47:07 +00:00
@getMessages()
, @)
complete: () ->
2012-02-05 16:21:43 +00:00
$('#timsChatInput').removeClass 'ajaxLoad'
2011-12-19 14:52:00 +00:00
###
# Toggles between user- and room-list.
#
# @param jQuery-object target
###
toggleSidebarContents: (target) ->
return if target.parents('li').hasClass 'active'
2012-03-11 17:19:11 +00:00
if target.parents('li').attr('id') is 'toggleUsers'
$('#toggleUsers').addClass 'active'
$('#toggleRooms').removeClass 'active'
2012-02-05 16:21:43 +00:00
$('#timsChatRoomList').hide()
$('#timsChatUserList').show()
2012-03-11 17:19:11 +00:00
else if target.parents('li').attr('id') is 'toggleRooms'
$('#toggleRooms').addClass 'active'
$('#toggleUsers').removeClass 'active'
2012-02-05 16:21:43 +00:00
$('#timsChatUserList').hide()
$('#timsChatRoomList').show()
2011-12-19 14:52:00 +00:00
###
# Toggles the user-menu.
#
# @param jQuery-object target
###
toggleUserMenu: (target) ->
2012-01-12 19:04:28 +00:00
li = target.parent()
2012-01-12 19:04:28 +00:00
if li.hasClass 'activeMenuItem'
2012-02-05 16:21:43 +00:00
li.find('.timsChatUserMenu').wcfBlindOut 'vertical', () ->
2012-01-12 19:04:28 +00:00
li.removeClass 'activeMenuItem'
else
2012-01-12 19:04:28 +00:00
li.addClass 'activeMenuItem'
2012-02-05 16:21:43 +00:00
li.find('.timsChatUserMenu').wcfBlindIn 'vertical'
###
# Unloads the chat.
###
unload: () ->
$.ajax @config.unloadURL,
type: 'POST'
async: false
2012-04-27 13:42:44 +00:00
)(jQuery, @, console)