1 WCF
.Conversation
={},WCF
.Conversation
.EditorHandler
=Class
.extend({_attributes
:{},_conversations
:{},_permissions
:{},init:function(availableLabels
){this._conversations
={};var self
=this;$(".conversation").each((function(index
,conversation
){var $labelIDs
,$conversation
=$(conversation
),$conversationID
=$conversation
.data("conversationID");self
._conversations
[$conversationID
]||(self
._conversations
[$conversationID
]=$conversation
,$labelIDs
=eval($conversation
.data("labelIDs")),self
._attributes
[$conversationID
]={isClosed
:!!$conversation
.data("isClosed"),labelIDs
:$labelIDs
},self
._permissions
[$conversationID
]={canAddParticipants
:!!$conversation
.data("canAddParticipants"),canCloseConversation
:!!$conversation
.data("canCloseConversation")})}))},getPermission:function(e
,a
){return void 0!==this._permissions
[e
][a
]&&!!this._permissions
[e
][a
]},getValue:function(e
,a
){switch(a
){case"labelIDs":return void 0===this._attributes
[e
].labelIDs
&&(this._attributes
[e
].labelIDs
=[]),this._attributes
[e
].labelIDs
;case"isClosed":return!!this._attributes
[e
].isClosed
}},countAvailableLabels:function(){return this.getAvailableLabels().length
},getAvailableLabels:function(){var e
=[];return WCF
.Dropdown
.getDropdownMenu("conversationLabelFilter").children(".scrollableDropdownMenu").children("li").each((function(a
,t
){var n
,s
=$(t
);if(s
.hasClass("dropdownDivider"))return!1;n
=s
.find("span"),e
.push({cssClassName
:n
.data("cssClassName"),labelID
:n
.data("labelID"),label
:n
.text()})})),e
},update:function(e
,a
,t
){var n
,s
,i
,o
,l
,r
;if(this._conversations
[e
]){switch(n
=this._conversations
[e
],a
){case"close":$('<li><span class="icon icon16 fa-lock jsTooltip jsIconLock" title="'+WCF
.Language
.get("wcf.global.state.closed")+'" /></li>').prependTo(n
.find(".statusIcons")),this._attributes
[e
].isClosed
=1;break;case"labelIDs":if(s
={},WCF
.Dropdown
.getDropdownMenu("conversationLabelFilter").find("li > a > span").each((function(e
,a
){var t
=$(a
);s
[t
.data("labelID")]={cssClassName
:t
.data("cssClassName"),label
:t
.text(),url
:t
.parent().attr("href")}})),i
=n
.find(".columnSubject > .labelList"),t
.length
)for(i
.length
||(i
=$('<ul class="labelList" />').prependTo(n
.find(".columnSubject"))),i
.empty(),o
=0,l
=t
.length
;o
<l
;o
++)r
=s
[t
[o
]],$('<li><a href="'+r
.url
+'" class="badge label'+(r
.cssClassName
?" "+r
.cssClassName
:"")+'">'+WCF
.String
.escapeHTML(r
.label
)+"</a></li>").appendTo(i
);else i
.length
&&i
.remove();break;case"open":n
.find(".statusIcons li").each((function(e
,a
){var t
=$(a
);if(t
.children("span.jsIconLock").length
)return t
.remove(),!1})),this._attributes
[e
].isClosed
=0}WCF
.Clipboard
.reload()}else console
.debug("[WCF.Conversation.EditorHandler] Unknown conversation id '"+e
+"'")}}),WCF
.Conversation
.EditorHandlerConversation
=WCF
.Conversation
.EditorHandler
.extend({_availableLabels
:null,init:function(e
){this._availableLabels
=e
||[],this._super()},getAvailableLabels:function(){return this._availableLabels
},update:function(e
,a
,t
){var n
,s
,i
,o
;if(this._conversations
[e
])switch(n
=$(".contentHeaderTitle > .contentHeaderMetaData"),a
){case"close":$('<li><span class="icon icon16 fa-lock jsIconLock" /> '+WCF
.Language
.get("wcf.global.state.closed")+"</li>").appendTo(n
),this._attributes
[e
].isClosed
=1;break;case"labelIDs":s
=n
.find(".labelList"),t
.length
?(i
=this.getAvailableLabels(),s
.length
||(s
=(s
=$('<li><span class="icon icon16 fa-tags"></span> <ul class="labelList"></ul></li>').prependTo(n
)).children("ul")),o
="",t
.forEach((function(e
){i
.forEach((function(a
){a
.labelID
==e
&&(o
+='<li><span class="label badge'+(a
.cssClassName
?" "+a
.cssClassName
:"")+'">'+a
.label
+"</span></li>")}))})),s
[0].innerHTML
=o
):s
.parent().remove();break;case"open":n
.find(".jsIconLock").parent().remove(),this._attributes
[e
].isClosed
=0}else console
.debug("[WCF.Conversation.EditorHandler] Unknown conversation id '"+e
+"'")}}),WCF
.Conversation
.Clipboard
=Class
.extend({_editorHandler
:null,init:function(e
){this._editorHandler
=e
,WCF
.System
.Event
.addListener("com.woltlab.wcf.clipboard","com.woltlab.wcf.conversation.conversation",function(e
){null===e
.responseData
?this._execute(e
.data
.actionName
,e
.data
.parameters
):this._evaluateResponse(e
.data
.actionName
,e
.responseData
)}.bind(this))},_execute:function(e
,a
){"com.woltlab.wcf.conversation.conversation.assignLabel"===e
&&new WCF
.Conversation
.Label
.Editor(this._editorHandler
,null,a
.objectIDs
)},_evaluateResponse:function(e
,a
){var t
,n
;switch(e
){case"com.woltlab.wcf.conversation.conversation.leave":case"com.woltlab.wcf.conversation.conversation.leavePermanently":case"com.woltlab.wcf.conversation.conversation.markAsRead":case"com.woltlab.wcf.conversation.conversation.restore":window
.location
.reload();break;case"com.woltlab.wcf.conversation.conversation.close":case"com.woltlab.wcf.conversation.conversation.open":for(t
in a
.returnValues
.conversationData
)a
.returnValues
.conversationData
.hasOwnProperty(t
)&&(n
=a
.returnValues
.conversationData
[t
],this._editorHandler
.update(t
,n
.isClosed
?"close":"open",n
))}}}),WCF
.Conversation
.InlineEditor
=WCF
.InlineEditor
.extend({_editorHandler
:null,_environment
:"conversation",_setOptions:function(){this._options
=[{label
:WCF
.Language
.get("wcf.conversation.edit.subject"),optionName
:"editSubject"},{label
:WCF
.Language
.get("wcf.conversation.edit.close"),optionName
:"close"},{label
:WCF
.Language
.get("wcf.conversation.edit.open"),optionName
:"open"},{label
:WCF
.Language
.get("wcf.conversation.edit.assignLabel"),optionName
:"assignLabel"},{optionName
:"divider"},{label
:WCF
.Language
.get("wcf.conversation.edit.addParticipants"),optionName
:"addParticipants"},{label
:WCF
.Language
.get("wcf.conversation.edit.leave"),optionName
:"leave"},{label
:WCF
.Language
.get("wcf.global.button.edit"),optionName
:"edit",isQuickOption
:!0}]},setEditorHandler:function(e
,a
){this._editorHandler
=e
,this._environment
="list"==a
?"list":"conversation"},_getTriggerElement:function(e
){return e
.find(".jsConversationInlineEditor")},_validate:function(e
,a
){var t
=$("#"+e
).data("conversationID");switch(a
){case"addParticipants":return this._editorHandler
.getPermission(t
,"canAddParticipants");case"assignLabel":return!!this._editorHandler
.countAvailableLabels();case"editSubject":return!!this._editorHandler
.getPermission(t
,"canCloseConversation");case"close":case"open":return!!this._editorHandler
.getPermission(t
,"canCloseConversation")&&("close"===a
?!this._editorHandler
.getValue(t
,"isClosed"):this._editorHandler
.getValue(t
,"isClosed"));case"leave":return!0;case"edit":return!!$("#"+e
).data("isDraft")}return!1},_execute:function(e
,a
){if(!this._validate(e
,a
))return!1;switch(a
){case"addParticipants":require(["WoltLabSuite/Core/Conversation/Ui/Participant/Add"],(function(a
){new a(elData(elById(e
),"conversation-id"))}));break;case"assignLabel":new WCF
.Conversation
.Label
.Editor(this._editorHandler
,e
);break;case"editSubject":require(["WoltLabSuite/Core/Conversation/Ui/Subject/Editor"],(function(a
){a
.beginEdit(elData(elById(e
),"conversation-id"))}));break;case"close":case"open":this._updateConversation(e
,a
,{isClosed
:"close"===a
?1:0});break;case"leave":new WCF
.Conversation
.Leave([$("#"+e
).data("conversationID")],this._environment
);break;case"edit":window
.location
=this._getTriggerElement($("#"+e
)).prop("href")}},_updateConversation:function(e
,a
,t
){var n
=this._elements
[e
].data("conversationID");switch(a
){case"close":case"editSubject":case"open":this._updateData
.push({elementID
:e
,optionName
:a
,data
:t
}),this._proxy
.setOption("data",{actionName
:a
,className
:"wcf\\data\\conversation\\ConversationAction",objectIDs
:[n
]}),this._proxy
.sendRequest()}},_updateState:function(){var e
,a
,t
,n
;for(e
=0,a
=this._updateData
.length
;e
<a
;e
++)switch(t
=this._updateData
[e
],n
=this._elements
[t
.elementID
].data("conversationID"),t
.optionName
){case"close":case"editSubject":case"open":this._editorHandler
.update(n
,t
.optionName
,t
.data
)}}}),WCF
.Conversation
.Leave
=Class
.extend({_conversationIDs
:[],_dialog
:null,_environment
:"",_proxy
:null,init:function(e
,a
){this._conversationIDs
=e
,this._dialog
=null,this._environment
=a
,this._proxy
=new WCF
.Action
.Proxy({success
:$.proxy(this._success
,this)}),this._loadDialog()},_loadDialog:function(){this._proxy
.setOption("data",{actionName
:"getLeaveForm",className
:"wcf\\data\\conversation\\ConversationAction",objectIDs
:this._conversationIDs
}),this._proxy
.sendRequest()},_success:function(e
,a
,t
){switch(e
.returnValues
.actionName
){case"getLeaveForm":this._showDialog(e
);break;case"hideConversation":"conversation"===this._environment
?window
.location
=e
.returnValues
.redirectURL
:window
.location
.reload()}},_showDialog:function(e
){null===this._dialog
&&(this._dialog
=$("#leaveDialog"),this._dialog
.length
||(this._dialog
=$('<div id="leaveDialog" />').hide().appendTo(document
.body
))),this._dialog
.html(e
.returnValues
.template
),this._dialog
.wcfDialog({title
:WCF
.Language
.get("wcf.conversation.leave.title")}),this._dialog
.wcfDialog("render"),this._dialog
.find("#hideConversation").click($.proxy(this._click
,this))},_click:function(){var e
=this._dialog
.find("input[type=radio]:checked");1===e
.length
&&(this._proxy
.setOption("data",{actionName
:"hideConversation",className
:"wcf\\data\\conversation\\ConversationAction",objectIDs
:this._conversationIDs
,parameters
:{hideConversation
:e
.val()}}),this._proxy
.sendRequest())}}),WCF
.Conversation
.RemoveParticipant
=WCF
.Action
.Delete
.extend({_conversationID
:0,init:function(e
){this._conversationID
=e
,this._super("wcf\\data\\conversation\\ConversationAction",".jsParticipant")},_sendRequest:function(e
){this.proxy
.setOption("data",{actionName
:"removeParticipant",className
:this._className
,objectIDs
:[this._conversationID
],parameters
:{userID
:$(e
).data("objectID")}}),this.proxy
.sendRequest()},_success:function(e
,a
,t
){var n
,s
,i
=e
.returnValues
.userID
;for(n
in this._containers
)(s
=$("#"+this._containers
[n
])).find(".jsDeleteButton").data("objectID")==i
&&(s
.find(".userLink").addClass("conversationLeft"),s
.find(".jsDeleteButton").remove())}}),WCF
.Conversation
.Label
={},WCF
.Conversation
.Label
.Editor
=Class
.extend({_conversationIDs
:0,_dialog
:null,_editorHandler
:null,_notification
:null,_proxy
:null,init:function(e
,a
,t
){this._conversationIDs
=a
?[$("#"+a
).data("conversationID")]:t
,this._dialog
=null,this._editorHandler
=e
,this._notification
=new WCF
.System
.Notification(WCF
.Language
.get("wcf.global.success.edit")),this._proxy
=new WCF
.Action
.Proxy({success
:$.proxy(this._success
,this)}),this._loadDialog()},_loadDialog:function(){this._proxy
.setOption("data",{actionName
:"getLabelForm",className
:"wcf\\data\\conversation\\label\\ConversationLabelAction",parameters
:{conversationIDs
:this._conversationIDs
}}),this._proxy
.sendRequest()},_success:function(e
,a
,t
){switch(e
.returnValues
.actionName
){case"assignLabel":this._assignLabels(e
);break;case"getLabelForm":this._renderDialog(e
)}},_renderDialog:function(e
){null===this._dialog
&&(this._dialog
=$("#conversationLabelForm"),this._dialog
.length
||(this._dialog
=$('<div id="conversationLabelForm" />').hide().appendTo(document
.body
))),this._dialog
.html(e
.returnValues
.template
),this._dialog
.wcfDialog({title
:WCF
.Language
.get("wcf.conversation.label.assignLabels")}),this._dialog
.wcfDialog("render"),$("#assignLabels").click($.proxy(this._save
,this))},_save:function(){var e
=[];this._dialog
.find("input").each((function(a
,t
){var n
=$(t
);n
.is(":checked")&&e
.push(n
.data("labelID"))})),this._proxy
.setOption("data",{actionName
:"assignLabel",className
:"wcf\\data\\conversation\\label\\ConversationLabelAction",parameters
:{conversationIDs
:this._conversationIDs
,labelIDs
:e
}}),this._proxy
.sendRequest()},_assignLabels:function(e
){for(var a
=0,t
=this._conversationIDs
.length
;a
<t
;a
++)this._editorHandler
.update(this._conversationIDs
[a
],"labelIDs",e
.returnValues
.labelIDs
);this._dialog
.wcfDialog("close"),this._notification
.show()}}),WCF
.Conversation
.Label
.Manager
=Class
.extend({_deletedLabelID
:0,_dialog
:null,_labels
:null,_link
:"",_notification
:"",_proxy
:null,_maxLabels
:0,_labelCount
:0,init:function(e
){this._deletedLabelID
=0,this._maxLabels
=0,this._labelCount
=0,this._link
=e
,this._labels
=WCF
.Dropdown
.getDropdownMenu("conversationLabelFilter").children(".scrollableDropdownMenu"),$("#manageLabel").click($.proxy(this._click
,this)),this._notification
=new WCF
.System
.Notification(WCF
.Language
.get("wcf.conversation.label.management.addLabel.success")),this._proxy
=new WCF
.Action
.Proxy({success
:$.proxy(this._success
,this)})},_click:function(){this._proxy
.setOption("data",{actionName
:"getLabelManagement",className
:"wcf\\data\\conversation\\ConversationAction"}),this._proxy
.sendRequest()},_success:function(e
,a
,t
){if(null===this._dialog
&&(this._dialog
=$('<div id="labelManagement" />').hide().appendTo(document
.body
)),e
.returnValues
&&e
.returnValues
.actionName
)switch(e
.returnValues
.actionName
){case"add":this._insertLabel(e
);break;case"getLabelManagement":this._maxLabels
=parseInt(e
.returnValues
.maxLabels
),this._labelCount
=parseInt(e
.returnValues
.labelCount
),this._dialog
.empty().html(e
.returnValues
.template
),this._dialog
.wcfDialog({title
:WCF
.Language
.get("wcf.conversation.label.management")}),this._dialog
.wcfDialog("render"),this._bindListener()}else if(this._deletedLabelID
){var n
=new RegExp("(\\?|&)labelID="+this._deletedLabelID
);window
.location
=window
.location
.toString().replace(n
,"")}else window
.location
.reload()},_insertLabel:function(e
){var a
=$('<li><a href="'+this._link
+"&labelID="+e
.returnValues
.labelID
+'"><span class="badge label'+(e
.returnValues
.cssClassName
?" "+e
.returnValues
.cssClassName
:"")+'">'+e
.returnValues
.label
+"</span></a></li>");a
.find("a > span").data("labelID",e
.returnValues
.labelID
).data("cssClassName",e
.returnValues
.cssClassName
),this._labels
.append(a
),this._notification
.show(),this._labelCount
++,this._labelCount
>=this._maxLabels
&&$("#conversationLabelManagementForm").hide()},_bindListener:function(){$("#labelName").on("keyup keydown keypress",$.proxy(this._updateLabels
,this)),$.browser
.mozilla
&&$.browser
.touch
&&$("#labelName").on("input",$.proxy(this._updateLabels
,this)),this._labelCount
>=this._maxLabels
&&($("#conversationLabelManagementForm").hide(),this._dialog
.wcfDialog("render")),$("#addLabel").disable().click($.proxy(this._addLabel
,this)),$("#editLabel").disable(),this._dialog
.find(".conversationLabelList a.label").click($.proxy(this._edit
,this))},_edit:function(e
){var a
,t
,n
;this._labelCount
>=this._maxLabels
&&($("#conversationLabelManagementForm").show(),this._dialog
.wcfDialog("render")),a
=$(e
.currentTarget
),t
=WCF
.Language
.get("wcf.conversation.label.management.editLabel").replace(/#labelName#/,WCF
.String
.escapeHTML(a
.text())),$("#conversationLabelManagementForm").data("labelID",a
.data("labelID")).children("legend").html(t
),$("#labelName").val(a
.text()).trigger("keyup"),n
=a
.data("cssClassName"),$("#labelManagementList input").each((function(e
,a
){var t
=$(a
);t
.val()==n
&&t
.attr("checked","checked")})),$("#addLabel").hide(),$("#editLabel").show().click($.proxy(this._editLabel
,this)),$("#deleteLabel").show().click($.proxy(this._deleteLabel
,this))},_editLabel:function(){this._proxy
.setOption("data",{actionName
:"update",className
:"wcf\\data\\conversation\\label\\ConversationLabelAction",objectIDs
:[$("#conversationLabelManagementForm").data("labelID")],parameters
:{data
:{cssClassName
:$("#labelManagementList input:checked").val(),label
:$("#labelName").val()}}}),this._proxy
.sendRequest()},_deleteLabel:function(){var e
=WCF
.Language
.get("wcf.conversation.label.management.deleteLabel.confirmMessage").replace(/#labelName#/,$("#labelName").val());WCF
.System
.Confirmation
.show(e
,$.proxy((function(e
){"confirm"===e
&&(this._proxy
.setOption("data",{actionName
:"delete",className
:"wcf\\data\\conversation\\label\\ConversationLabelAction",objectIDs
:[$("#conversationLabelManagementForm").data("labelID")]}),this._proxy
.sendRequest(),this._deletedLabelID
=$("#conversationLabelManagementForm").data("labelID"))}),this),void 0,void 0,!0)},_updateLabels:function(){var e
=$.trim($("#labelName").val());e
?$("#addLabel, #editLabel").enable():($("#addLabel, #editLabel").disable(),e
=WCF
.Language
.get("wcf.conversation.label.placeholder")),$("#labelManagementList").find("span.label").text(e
)},_addLabel:function(){var e
=$("#labelName").val(),a
=$("#labelManagementList input:checked").val();this._proxy
.setOption("data",{actionName
:"add",className
:"wcf\\data\\conversation\\label\\ConversationLabelAction",parameters
:{data
:{cssClassName
:a
,labelName
:e
}}}),this._proxy
.sendRequest(),this._dialog
.wcfDialog("close")}}),WCF
.Conversation
.Preview
=WCF
.Popover
.extend({_proxy
:null,init:function(){this._super(".conversationLink"),this._proxy
=new WCF
.Action
.Proxy({showLoadingOverlay
:!1}),WCF
.DOMNodeInsertedHandler
.addCallback("WCF.Conversation.Preview",$.proxy(this._initContainers
,this))},_loadContent:function(){var e
,a
,t
=$("#"+this._activeElementID
);this._proxy
.setOption("data",{actionName
:"getMessagePreview",className
:"wcf\\data\\conversation\\ConversationAction",objectIDs
:[t
.data("conversationID")]}),e
=this._activeElementID
,a
=this,this._proxy
.setOption("success",(function(t
,n
,s
){a
._insertContent(e
,t
.returnValues
.template
,!0)})),this._proxy
.sendRequest()}}),WCF
.User
.Panel
.Conversation
=WCF
.User
.Panel
.Abstract
.extend({init:function(e
){e
.enableMarkAsRead
=!0,this._super($("#unreadConversations"),"unreadConversations",e
),WCF
.System
.Event
.addListener("com.woltlab.wcf.conversation.userPanel","reset",function(){this.resetItems(),this.updateBadge(0),this._loadData
=!0}.bind(this)),require(["EventHandler"],function(e
){e
.add("com.woltlab.wcf.UserMenuMobile","more",function(e
){"com.woltlab.wcf.conversation"===e
.identifier
&&this.toggle()}.bind(this))}.bind(this))},_initDropdown:function(){var e
=this._super();return this._options
.canStartConversation
&&$('<li><a href="'+this._options
.newConversationLink
+'" title="'+this._options
.newConversation
+'" class="jsTooltip"><span class="icon icon24 fa-plus" /></a></li>').appendTo(e
.getLinkList()),e
},_load:function(){this._proxy
.setOption("data",{actionName
:"getMixedConversationList",className
:"wcf\\data\\conversation\\ConversationAction"}),this._proxy
.sendRequest()},_markAsRead:function(e
,a
){this._proxy
.setOption("data",{actionName
:"markAsRead",className
:"wcf\\data\\conversation\\ConversationAction",objectIDs
:[a
]}),this._proxy
.sendRequest()},_markAllAsRead:function(e
){this._proxy
.setOption("data",{actionName
:"markAllAsRead",className
:"wcf\\data\\conversation\\ConversationAction"}),this._proxy
.sendRequest()}}),WCF
.Conversation
.MarkAsRead
=Class
.extend({_proxy
:null,init:function(){this._proxy
=new WCF
.Action
.Proxy({success
:$.proxy(this._success
,this)}),$(document
).on("dblclick",".conversationList .new .columnAvatar",$.proxy(this._dblclick
,this))},_dblclick:function(e
){this._proxy
.setOption("data",{actionName
:"markAsRead",className
:"wcf\\data\\conversation\\ConversationAction",objectIDs
:[$(e
.currentTarget
).parents("ol:eq(0)").data("conversationID")]}),this._proxy
.sendRequest()},_success:function(e
,a
,t
){$(".conversationList .new").each((function(a
,t
){var n
=$(t
);WCF
.inArray(n
.data("conversationID"),e
.objectIDs
)&&(n
.removeClass("new"),n
.find(".firstNewPost").parent().remove(),n
.find(".columnAvatar").off("dblclick"))}))}}),WCF
.Conversation
.MarkAllAsRead
=Class
.extend({_proxy
:null,init:function(){this._proxy
=new WCF
.Action
.Proxy({success
:$.proxy(this._success
,this)}),$(".markAllAsReadButton").click($.proxy(this._click
,this))},_click:function(e
){e
.preventDefault(),this._proxy
.setOption("data",{actionName
:"markAllAsRead",className
:"wcf\\data\\conversation\\ConversationAction"}),this._proxy
.sendRequest()},_success:function(e
,a
,t
){WCF
.System
.Event
.fireEvent("com.woltlab.wcf.conversation.userPanel","reset");var n
=$(".conversationList");n
.find(".new").removeClass("new"),n
.find(".columnAvatar").off("dblclick")}}),WCF
.Conversation
.Message
={},WCF
.Conversation
.Message
.InlineEditor
=WCF
.Message
.InlineEditor
.extend({init:function(e
,a
){this._super(e
,!0,a
)},_getClassName:function(){return"wcf\\data\\conversation\\message\\ConversationMessageAction"}}),WCF
.Conversation
.Message
.QuoteHandler
=WCF
.Message
.Quote
.Handler
.extend({init:function(e
){this._super(e
,"wcf\\data\\conversation\\message\\ConversationMessageAction","com.woltlab.wcf.conversation.message",".message",".messageBody",".messageBody > div > div.messageText",!0)}});