var setup_inbox = function(){ var page = $('.inbox-forum'); if (page.length) { var clearNotifs = $('.clear-messages'); if (clearNotifs.length) { var inbox = new ResponseNotifs(); inbox.decorate(clearNotifs); } } }; var setup_badge_details_toggle = function(){ $('.badge-context-toggle').each(function(idx, elem){ var context_list = $(elem).parent().next('ul'); if (context_list.children().length > 0){ $(elem).addClass('active'); var toggle_display = function(){ if (context_list.css('display') == 'none'){ $('.badge-context-list').hide(); context_list.show(); } else { context_list.hide(); } }; $(elem).click(toggle_display); } }); }; var ResponseNotifs = function() { WrappedElement.call(this); }; inherits(ResponseNotifs, WrappedElement); ResponseNotifs.prototype.clearNewNotifs = function() { var news = $('.new'); $('#ab-responses').fadeOut(); this._element.fadeOut(function() { news.removeClass('new highlight'); }); }; ResponseNotifs.prototype.makeHandler = function() { var me = this; return function() { $.ajax({ type: 'POST', cache: false, dataType: 'json', url: askbot['urls']['clearNewNotifications'], success: function(response_data){ if (response_data['success']) { me.clearNewNotifs(); } } }); }; }; ResponseNotifs.prototype.decorate = function(element) { this._element = element; var btn = element.find('a'); setupButtonEventHandlers(btn, this.makeHandler()); }; /** * the dropdown menu with selection of reasons * to reject posts and a button that starts menu to * manage the list of reasons */ var DeclineAndExplainMenu = function() { WrappedElement.call(this); }; inherits(DeclineAndExplainMenu, WrappedElement); DeclineAndExplainMenu.prototype.setupDeclinePostHandler = function(button) { var me = this; var reasonId = button.data('reasonId'); var controls = this.getControls(); var handler = controls.getModHandler('decline-with-reason', ['posts'], reasonId); setupButtonEventHandlers(button, handler); }; DeclineAndExplainMenu.prototype.addReason = function(id, title) { var li = this.makeElement('li'); var button = this.makeElement('a'); li.append(button); button.html(title); button.data('reasonId', id); button.attr('data-reason-id', id); this._addReasonBtn.parent().before(li); this.setupDeclinePostHandler(button); }; DeclineAndExplainMenu.prototype.removeReason = function(id) { var btn = this._element.find('a[data-reason-id="' + id + '"]'); btn.parent().remove(); }; DeclineAndExplainMenu.prototype.setControls = function(controls) { this._controls = controls; }; DeclineAndExplainMenu.prototype.getControls = function() { return this._controls; }; DeclineAndExplainMenu.prototype.decorate = function(element) { this._element = element; //activate dropdown menu element.dropdown(); var declineBtns = element.find('.decline-with-reason'); var me = this; declineBtns.each(function(idx, elem) { me.setupDeclinePostHandler($(elem)); }); this._reasonList = element.find('ul'); var addReasonBtn = element.find('.manage-reasons'); this._addReasonBtn = addReasonBtn; var manageReasonsDialog = new ManageRejectReasonsDialog(); manageReasonsDialog.decorate($('#manage-reject-reasons-modal')); this._manageReasonsDialog = manageReasonsDialog; manageReasonsDialog.setMenu(this); setupButtonEventHandlers(addReasonBtn, function() { manageReasonsDialog.show(); }); }; /** * Buttons to moderate posts * and the list of edits */ var PostModerationControls = function() { WrappedElement.call(this); }; inherits(PostModerationControls, WrappedElement); /** * displays feedback message */ PostModerationControls.prototype.showMessage = function(message) { this._notification.html(message); this._notification.parent().fadeIn('fast'); }; PostModerationControls.prototype.hideMessage = function() { this._notification.parent().hide(); }; /** * removes entries from the moderation screen */ PostModerationControls.prototype.removeEntries = function(entryIds) { for (var i = 0; i < entryIds.length; i++) { var id = entryIds[i]; var elem = this._element.find('.message[data-message-id="' + id + '"]'); if (elem.length) { elem.fadeOut('fast', function() { elem.remove() }); } } }; PostModerationControls.prototype.setEntryCount = function(count) { this._entryCount.html(count); }; PostModerationControls.prototype.getEntryCount = function() { return this.getCheckBoxes().length; }; PostModerationControls.prototype.getCheckBoxes = function() { return this._element.find('.messages input[type="checkbox"]'); }; PostModerationControls.prototype.getSelectedEditIds = function() { var checkBoxes = this.getCheckBoxes(); var num = checkBoxes.length; var idList = []; for (var i = 0; i < num; i++) { var cb = $(checkBoxes[i]); if (cb.is(':checked')) { var msg = cb.closest('.message-details'); var msgId = msg.data('messageId'); idList.push(msgId); } } return idList; }; /** * action - one of 'decline-with-reason', 'approve', 'block' * items - a list of items ['posts', 'users', 'ips'] * not all combinations of action and items are supported * optReason must be used with 'decline-with-reason' action */ PostModerationControls.prototype.getModHandler = function(action, items, optReason) { var me = this; return function() { var selectedEditIds = me.getSelectedEditIds(); if (selectedEditIds.length == 0) { me.showMessage(gettext('Please select at least one item')); return; } //@todo: implement undo var postData = { 'edit_ids': selectedEditIds,//revision ids 'action': action, 'items': items,//affected items - users, posts, ips 'reason': optReason || 'none' }; $.ajax({ type: 'POST', cache: false, dataType: 'json', data: JSON.stringify(postData), url: askbot['urls']['moderatePostEdits'], success: function(response_data){ if (response_data['success'] == true){ me.removeEntries(response_data['memo_ids']); me.setEntryCount(response_data['memo_count']); } var message = response_data['message'] || ''; if (me.getEntryCount() < 10 && response_data['memo_count'] > 9) { if (message) { message += '. ' } var junk = $('#junk-mod'); if (junk.length == 0) { junk = me.makeElement('div'); junk.attr('id', 'junk-mod'); junk.hide(); $(document).append(junk); } var a = me.makeElement('a'); a.attr('href', window.location.href); a.text(gettext('Load more items.')); junk.append(a); message += a[0].outerHTML; } if (message) { me.showMessage(message); } } }); }; }; PostModerationControls.prototype.getSelectAllHandler = function(selected) { var me = this; return function() { var cb = me.getCheckBoxes(); cb.prop('checked', selected); }; }; PostModerationControls.prototype.decorate = function(element) { this._element = element; this._notification = element.find('.action-status span'); this.hideMessage(); this._entryCount = $('.mod-memo-count'); //approve posts button var button = $('.approve-posts'); setupButtonEventHandlers(button, this.getModHandler('approve', ['posts'])); //approve posts and users button = $('.approve-posts-users'); setupButtonEventHandlers(button, this.getModHandler('approve', ['posts', 'users'])); //decline and explain why var reasonsMenuElem = $('.decline-reasons-menu'); var declineAndExplainMenu = new DeclineAndExplainMenu(); declineAndExplainMenu.setControls(this); declineAndExplainMenu.decorate(reasonsMenuElem); //delete posts and block users button = element.find('.decline-block-users'); setupButtonEventHandlers(button, this.getModHandler('block', ['posts', 'users'])); //delete posts, block users and ips button = element.find('.decline-block-users-ips'); setupButtonEventHandlers(button, this.getModHandler('block', ['posts', 'users', 'ips'])); button = element.find('.sel-all'); setupButtonEventHandlers(button, this.getSelectAllHandler(true)); button = element.find('.sel-none'); setupButtonEventHandlers(button, this.getSelectAllHandler(false)); }; /** * @constructor * manages post/edit reject reasons * in the post moderation view */ var ManageRejectReasonsDialog = function(){ WrappedElement.call(this); this._selected_edit_ids = null; this._selected_reason_id = null; this._state = null;//'select', 'add-new' this._postModerationControls = []; this._selectedEditDataReader = undefined; }; inherits(ManageRejectReasonsDialog, WrappedElement); ManageRejectReasonsDialog.prototype.setMenu = function(menu) { this._reasonsMenu = menu; }; ManageRejectReasonsDialog.prototype.getMenu = function() { return this._reasonsMenu; }; ManageRejectReasonsDialog.prototype.setSelectedEditDataReader = function(func) { this._selectedEditDataReader = func; }; ManageRejectReasonsDialog.prototype.readSelectedEditData = function() { var data = this._selectedEditDataReader(); this.setSelectedEditData(data); return data['id_list'].length > 0; }; ManageRejectReasonsDialog.prototype.setSelectedEditData = function(data){ this._selected_edit_data = data; }; ManageRejectReasonsDialog.prototype.addPostModerationControl = function(control) { this._postModerationControls.push(control); }; ManageRejectReasonsDialog.prototype.setState = function(state){ this._state = state; this.clearErrors(); if (this._element){ this._selector.hide(); this._adder.hide(); if (state === 'select'){ this._selector.show(); } else if (state === 'add-new'){ this._adder.show(); } } }; ManageRejectReasonsDialog.prototype.show = function(){ $(this._element).modal('show'); }; ManageRejectReasonsDialog.prototype.hide = function(){ $(this._element).modal('hide'); }; ManageRejectReasonsDialog.prototype.resetInputs = function(){ if (this._title_input){ this._title_input.reset(); } if (this._details_input){ this._details_input.reset(); } var selected = this._element.find('.selected'); selected.removeClass('selected'); }; ManageRejectReasonsDialog.prototype.clearErrors = function(){ var error = this._element.find('.alert'); error.remove(); }; ManageRejectReasonsDialog.prototype.makeAlertBox = function(errors){ //construct the alert box var alert_box = new AlertBox(); alert_box.setClass('alert-error'); if (typeof errors === "string"){ alert_box.setText(errors); } else if (errors.constructor === [].constructor){ if (errors.length > 1){ alert_box.setContent( '
' + gettext('Looks there are some things to fix:') + '
' ) var list = this.makeElement('ul'); $.each(errors, function(idx, item){ list.append('
  • ' + item + '
  • '); }); alert_box.addContent(list); } else if (errors.length == 1){ alert_box.setContent(errors[0]); } else if (errors.length == 0){ return; } } else if ('html' in errors){ alert_box.setContent(errors); } else { return;//don't know what to do } return alert_box; }; ManageRejectReasonsDialog.prototype.setAdderErrors = function(errors){ //clear previous errors this.clearErrors(); var alert_box = this.makeAlertBox(errors); this._element .find('#reject-edit-modal-add-new .modal-body') .prepend(alert_box.getElement()); }; ManageRejectReasonsDialog.prototype.setSelectorErrors = function(errors){ this.clearErrors(); var alert_box = this.makeAlertBox(errors); this._element .find('#reject-edit-modal-select .modal-body') .prepend(alert_box.getElement()); }; ManageRejectReasonsDialog.prototype.setErrors = function(errors){ this.clearErrors(); var alert_box = this.makeAlertBox(errors); var current_state = this._state; this._element .find('#reject-edit-modal-' + current_state + ' .modal-body') .prepend(alert_box.getElement()); }; ManageRejectReasonsDialog.prototype.addSelectableReason = function(data){ var id = data['reason_id']; var title = data['title']; var details = data['details']; this._select_box.addItem(id, title, details); askbot['data']['postRejectReasons'].push( {id: data['reason_id'], title: data['title']} ); $.each(this._postModerationControls, function(idx, control) { control.addReason(data['reason_id'], data['title']); }); }; ManageRejectReasonsDialog.prototype.startSavingReason = function(callback){ var title_input = this._title_input; var details_input = this._details_input; var errors = []; if (title_input.isBlank()){ errors.push(gettext('Please provide description.')); } if (details_input.isBlank()){ errors.push(gettext('Please provide details.')); } if (errors.length > 0){ this.setAdderErrors(errors); return;//just show errors and quit } var data = { title: title_input.getVal(), details: details_input.getVal() }; var reasonIsNew = true; if (this._selected_reason_id){ data['reason_id'] = this._selected_reason_id; reasonIsNew = false; } var me = this; $.ajax({ type: 'POST', dataType: 'json', cache: false, url: askbot['urls']['save_post_reject_reason'], data: data, success: function(data){ if (data['success']){ //show current reason data and focus on it me.addSelectableReason(data); if (reasonIsNew) { me.getMenu().addReason(data['reason_id'], data['title']); } if (callback){ callback(data); } else { me.setState('select'); } } else { me.setAdderErrors(data['message']); } } }); }; ManageRejectReasonsDialog.prototype.startEditingReason = function(){ var data = this._select_box.getSelectedItemData(); var title = $(data['title']).text(); var details = data['details']; this._title_input.setVal(title); this._details_input.setVal(details); this._selected_reason_id = data['id']; this.setState('add-new'); }; ManageRejectReasonsDialog.prototype.resetSelectedReasonId = function(){ this._selected_reason_id = null; }; ManageRejectReasonsDialog.prototype.getSelectedReasonId = function(){ return this._selected_reason_id; }; ManageRejectReasonsDialog.prototype.startDeletingReason = function(){ var select_box = this._select_box; var data = select_box.getSelectedItemData(); var reason_id = data['id']; var me = this; if (data['id']){ $.ajax({ type: 'POST', dataType: 'json', cache: false, url: askbot['urls']['delete_post_reject_reason'], data: {reason_id: reason_id}, success: function(data){ if (data['success']){ select_box.removeItem(reason_id); me.hideEditButtons(); me.getMenu().removeReason(reason_id); } else { me.setSelectorErrors(data['message']); } } }); } else { me.setSelectorErrors( gettext('A reason must be selected to delete one.') ) } }; ManageRejectReasonsDialog.prototype.hideEditButtons = function() { this._editButton.hide(); this._deleteButton.hide(); }; ManageRejectReasonsDialog.prototype.showEditButtons = function() { this._editButton.show(); this._deleteButton.show(); }; ManageRejectReasonsDialog.prototype.decorate = function(element){ this._element = element; //set default state according to the # of available reasons this._selector = $(element).find('#reject-edit-modal-select'); this._adder = $(element).find('#reject-edit-modal-add-new'); if (this._selector.find('li').length > 0){ this.setState('select'); this.resetInputs(); } else { this.setState('add-new'); this.resetInputs(); } var select_box = new SelectBox(); select_box.decorate($(this._selector.find('.select-box'))); select_box.setSelectHandler(function() { me.showEditButtons() }); this._select_box = select_box; //setup tipped-inputs var reject_title_input = $(this._element).find('input'); var title_input = new TippedInput(); title_input.decorate($(reject_title_input)); this._title_input = title_input; var reject_details_input = $(this._element).find('textarea.reject-reason-details'); var details_input = new TippedInput(); details_input.decorate($(reject_details_input)); this._details_input = details_input; var me = this; setupButtonEventHandlers( element.find('.cancel, .modal-header .close'), function() { me.hide(); me.clearErrors(); me.resetInputs(); me.resetSelectedReasonId(); me.setState('select'); me.hideEditButtons(); } ); setupButtonEventHandlers( $(this._element).find('.save-reason'), function(){ me.startSavingReason() } ); setupButtonEventHandlers( element.find('.add-new-reason'), function(){ me.resetSelectedReasonId(); me.resetInputs(); me.setState('add-new') ; } ); this._editButton = element.find('.edit-this-reason'); setupButtonEventHandlers( this._editButton, function(){ me.startEditingReason(); } ); this._deleteButton = element.find('.delete-this-reason'); setupButtonEventHandlers( this._deleteButton, function(){ me.startDeletingReason(); } ) }; /** * @constructor * allows to follow/unfollow users */ var FollowUser = function(){ WrappedElement.call(this); this._user_id = null; this._user_name = null; }; inherits(FollowUser, WrappedElement); /** * @param {string} user_name */ FollowUser.prototype.setUserName = function(user_name){ this._user_name = user_name; }; FollowUser.prototype.decorate = function(element){ this._element = element; this._user_id = parseInt(element.attr('id').split('-').pop()); this._available_action = element.children().hasClass('follow') ? 'follow':'unfollow'; var me = this; setupButtonEventHandlers(this._element, function(){ me.go() }); }; FollowUser.prototype.go = function(){ if (askbot['data']['userIsAuthenticated'] === false){ var message = gettext('Please signin to follow %(username)s'); var message_data = { signin_url: askbot['urls']['user_signin'] + '?next=' + window.location.href, username: this._user_name } message = interpolate(message, message_data, true); showMessage(this._element, message); return; } var user_id = this._user_id; if (this._available_action === 'follow'){ var url = askbot['urls']['follow_user']; } else { var url = askbot['urls']['unfollow_user']; } var me = this; $.ajax({ type: 'POST', cache: false, dataType: 'json', url: url.replace('{{userId}}', user_id), success: function(){ me.toggleState() } }); }; FollowUser.prototype.toggleState = function(){ if (this._available_action === 'follow'){ this._available_action = 'unfollow'; var unfollow_div = document.createElement('div'); unfollow_div.setAttribute('class', 'unfollow'); var red_div = document.createElement('div'); red_div.setAttribute('class', 'unfollow-red'); //red_div.innerHTML = interpolate(gettext('unfollow %s'), [this._user_name]); red_div.innerHTML = interpolate(gettext('Unfollow')); //var green_div = document.createElement('div'); //green_div.setAttribute('class', 'unfollow-green'); //green_div.innerHTML = interpolate(gettext('following %s'), [this._user_name]); unfollow_div.appendChild(red_div); //unfollow_div.appendChild(green_div); this._element.html(unfollow_div); } else { var follow_div = document.createElement('div'); //follow_div.innerHTML = interpolate(gettext('follow %s'), [this._user_name]); follow_div.innerHTML = interpolate(gettext('Follow')); follow_div.setAttribute('class', 'follow'); this._available_action = 'follow'; this._element.html(follow_div); } }; /** * @constructor * @param {string} name */ var UserGroup = function(name){ WrappedElement.call(this); this._name = name; this._content = null; }; inherits(UserGroup, WrappedElement); UserGroup.prototype.getDeleteHandler = function(){ var group_name = this._name; var me = this; var groups_container = me._groups_container; return function(){ var data = { user_id: askbot['data']['viewUserId'], group_name: group_name, action: 'remove' }; $.ajax({ type: 'POST', dataType: 'json', data: data, cache: false, url: askbot['urls']['edit_group_membership'], success: function(){ groups_container.removeGroup(me); } }); }; }; UserGroup.prototype.setContent = function(content){ this._content = content; }; UserGroup.prototype.getName = function(){ return this._name; }; UserGroup.prototype.setGroupsContainer = function(container){ this._groups_container = container; }; UserGroup.prototype.decorate = function(element){ this._element = element; this._name = $.trim(element.find('a').html()); var deleter = new DeleteIcon(); deleter.setHandler(this.getDeleteHandler()); //deleter.setContent(gettext('Remove')); this._element.find('td:last').append(deleter.getElement()); this._delete_icon = deleter; }; UserGroup.prototype.createDom = function(){ var element = this.makeElement('tr'); element.html(this._content); this._element = element; this.decorate(element); }; UserGroup.prototype.dispose = function(){ this._delete_icon.dispose(); this._element.remove(); }; /** * @constructor */ var GroupsContainer = function(){ WrappedElement.call(this); }; inherits(GroupsContainer, WrappedElement); GroupsContainer.prototype.decorate = function(element){ this._element = element; var groups = []; var group_names = []; var me = this; //collect list of groups $.each(element.find('tr'), function(idx, li){ var group = new UserGroup(); group.setGroupsContainer(me); group.decorate($(li)); groups.push(group); group_names.push(group.getName()); }); this._groups = groups; this._group_names = group_names; }; GroupsContainer.prototype.addGroup = function(group_data){ var group_name = group_data['name']; if ($.inArray(group_name, this._group_names) > -1){ return; } var group = new UserGroup(group_name); group.setContent(group_data['html']); group.setGroupsContainer(this); this._groups.push(group); this._group_names.push(group_name); this._element.append(group.getElement()); }; GroupsContainer.prototype.removeGroup = function(group){ var idx = $.inArray(group, this._groups); if (idx === -1){ return; } this._groups.splice(idx, 1); this._group_names.splice(idx, 1); group.dispose(); }; var GroupAdderWidget = function(){ WrappedElement.call(this); this._state = 'display';//display or edit }; inherits(GroupAdderWidget, WrappedElement); /** * @param {string} state */ GroupAdderWidget.prototype.setState = function(state){ if (state === 'display'){ this._element.html(gettext('add group')); this._input.hide(); this._input.val(''); this._button.hide(); } else if (state === 'edit'){ this._element.html(gettext('cancel')); this._input.show(); this._input.focus(); this._button.show(); } else { return; } this._state = state; }; GroupAdderWidget.prototype.getValue = function(){ return this._input.val(); }; GroupAdderWidget.prototype.addGroup = function(group_data){ this._groups_container.addGroup(group_data); }; GroupAdderWidget.prototype.getAddGroupHandler = function(){ var me = this; return function(){ var group_name = me.getValue(); var data = { group_name: group_name, user_id: askbot['data']['viewUserId'], action: 'add' }; $.ajax({ type: 'POST', dataType: 'json', data: data, cache: false, url: askbot['urls']['edit_group_membership'], success: function(data){ if (data['success'] == true){ me.addGroup(data); me.setState('display'); } else { var message = data['message']; showMessage(me.getElement(), message, 'after'); } } }); }; }; GroupAdderWidget.prototype.setGroupsContainer = function(container){ this._groups_container = container; }; GroupAdderWidget.prototype.toggleState = function(){ if (this._state === 'display'){ this.setState('edit'); } else if (this._state === 'edit'){ this.setState('display'); } }; GroupAdderWidget.prototype.decorate = function(element){ this._element = element; var input = this.makeElement('input'); input.attr('type', 'text'); this._input = input; var groupsAc = new AutoCompleter({ url: askbot['urls']['getGroupsList'], minChars: 1, useCache: false, matchInside: false, maxCacheLength: 100, delay: 10 }); groupsAc.decorate(input); var button = this.makeElement('button'); button.html(gettext('add')); this._button = button; element.before(input); input.after(button); this.setState('display'); setupButtonEventHandlers(button, this.getAddGroupHandler()); var me = this; setupButtonEventHandlers( element, function(){ me.toggleState() } ); }; /** * @constructor * allows editing user groups */ var UserGroupsEditor = function(){ WrappedElement.call(this); }; inherits(UserGroupsEditor, WrappedElement); UserGroupsEditor.prototype.decorate = function(element){ this._element = element; var add_link = element.find('#add-group'); var adder = new GroupAdderWidget(); adder.decorate(add_link); var groups_container = new GroupsContainer(); groups_container.decorate(element.find('#groups-list')); adder.setGroupsContainer(groups_container); //todo - add group deleters }; /** * controls that set up automatic tweeting to the user account */ var Tweeting = function() { WrappedElement.call(this); }; inherits(Tweeting, WrappedElement); Tweeting.prototype.getStartHandler = function() { var url = this._startUrl; return function() { window.location.href = url; }; }; Tweeting.prototype.getMode = function() { return this._modeSelector.val(); }; Tweeting.prototype.getModeSelectorHandler = function() { var me = this; var url = this._changeModeUrl; return function() { $.ajax({ type: 'POST', dataType: 'json', url: url, data: {'mode': me.getMode() }, cache: false }); }; }; Tweeting.prototype.getAccount = function() { return this._accountSelector.val(); }; Tweeting.prototype.getAccountSelectorHandler = function() { var selectAccountUrl = this._changeModeUrl; var startUrl = this._startUrl; var me = this; return function() { var account = me.getAccount(); if (account === 'existing-handle') { $.ajax({ type: 'POST', dataType: 'json', url: selectAccountUrl, data: {'mode': 'share-my-posts' }, cache: false }); } else if (account === 'new-handle') { window.location.href = startUrl; } } }; Tweeting.prototype.decorate = function(element) { this._element = element; this._changeModeUrl = element.data('changeModeUrl'); this._startUrl = element.data('startUrl'); if (element.hasClass('disabled')) { this._startButton = element.find('.start-tweeting'); setupButtonEventHandlers(this._startButton, this.getStartHandler()); } else if (element.hasClass('inactive')) { //decorate choose account selector this._accountSelector = element.find('select'); this._accountSelector.change(this.getAccountSelectorHandler()); } else if (element.hasClass('enabled')) { //decorate choose mode selector this._modeSelector = element.find('select'); this._modeSelector.change(this.getModeSelectorHandler()); } }; var UserQuestionsPaginator = function() { Paginator.call(this); }; inherits(UserQuestionsPaginator, Paginator); UserQuestionsPaginator.prototype.renderPage = function(data) { $('.users-questions').html(data['questions']); $('.timeago').timeago(); }; UserQuestionsPaginator.prototype.getPageDataUrl = function(pageNo) { var userId = askbot['data']['viewUserId']; var pageSize = askbot['data']['userPostsPageSize']; var url = QSutils.patch_query_string('', 'author:' + userId); url = QSutils.patch_query_string(url, 'sort:votes-desc'); url = QSutils.patch_query_string(url, 'page:' + pageNo); url = QSutils.patch_query_string(url, 'page-size:'+ pageSize); return askbot['urls']['questions'] + url; }; var UserAnswersPaginator = function() { Paginator.call(this); }; inherits(UserAnswersPaginator, Paginator); UserAnswersPaginator.prototype.renderPage = function(data) { $('.users-answers').html(data['html']); $('.timeago').timeago(); }; UserAnswersPaginator.prototype.getPageDataUrl = function() { return askbot['urls']['getTopAnswers']; }; UserAnswersPaginator.prototype.getPageDataUrlParams = function(pageNo) { return { user_id: askbot['data']['viewUserId'], page_number: pageNo } }; (function(){ var fbtn = $('.follow-user-toggle'); if (fbtn.length === 1){ var follow_user = new FollowUser(); follow_user.decorate(fbtn); follow_user.setUserName(askbot['data']['viewUserName']); } if (askbot['data']['userId'] !== askbot['data']['viewUserId']) { if (askbot['data']['userIsAdminOrMod']){ var group_editor = new UserGroupsEditor(); group_editor.decorate($('#user-groups')); } else { $('#add-group').remove(); } } else { $('#add-group').remove(); } var tweeting = $('.auto-tweeting'); if (tweeting.length) { var tweetingControl = new Tweeting(); tweetingControl.decorate(tweeting); } var qPager = $('.user-questions-pager'); if (qPager.length) { var qPaginator = new UserQuestionsPaginator(); qPaginator.decorate(qPager); } var aPager = $('.user-answers-pager'); if (aPager.length) { var aPaginator = new UserAnswersPaginator(); aPaginator.decorate(aPager); } })();