https://www.mediawiki.org/wiki/Special:Code/MediaWiki/111962

Revision: 111962
Author:   yonishostak
Date:     2012-02-20 21:05:11 +0000 (Mon, 20 Feb 2012)
Log Message:
-----------
AFTv5: complete overhaul of special page JS, no more spaghetti code, 
restructures around the actions object - this is phase 1, more work to be done 
here

Modified Paths:
--------------
    
trunk/extensions/ArticleFeedbackv5/modules/jquery.articleFeedbackv5/jquery.articleFeedbackv5.special.css
    
trunk/extensions/ArticleFeedbackv5/modules/jquery.articleFeedbackv5/jquery.articleFeedbackv5.special.js

Modified: 
trunk/extensions/ArticleFeedbackv5/modules/jquery.articleFeedbackv5/jquery.articleFeedbackv5.special.css
===================================================================
--- 
trunk/extensions/ArticleFeedbackv5/modules/jquery.articleFeedbackv5/jquery.articleFeedbackv5.special.css
    2012-02-20 20:44:47 UTC (rev 111961)
+++ 
trunk/extensions/ArticleFeedbackv5/modules/jquery.articleFeedbackv5/jquery.articleFeedbackv5.special.css
    2012-02-20 21:05:11 UTC (rev 111962)
@@ -271,7 +271,9 @@
        margin: 0 15px 0 0;
 }
 #articleFeedbackv5-show-feedback .articleFeedbackv5-comment-foot 
.articleFeedbackv5-helpful-link,
-#articleFeedbackv5-show-feedback .articleFeedbackv5-comment-foot 
.articleFeedbackv5-unhelpful-link {
+#articleFeedbackv5-show-feedback .articleFeedbackv5-comment-foot 
.articleFeedbackv5-unhelpful-link,
+#articleFeedbackv5-show-feedback .articleFeedbackv5-comment-foot 
.articleFeedbackv5-reversehelpful-link,
+#articleFeedbackv5-show-feedback .articleFeedbackv5-comment-foot 
.articleFeedbackv5-reverseunhelpful-link {
        display: inline-block;
        height: 22px;
        line-height: 22px;
@@ -294,7 +296,9 @@
 }
 
 #articleFeedbackv5-show-feedback .articleFeedbackv5-comment-foot 
.articleFeedbackv5-helpful-link:hover,
-#articleFeedbackv5-show-feedback .articleFeedbackv5-comment-foot 
.articleFeedbackv5-unhelpful-link:hover {
+#articleFeedbackv5-show-feedback .articleFeedbackv5-comment-foot 
.articleFeedbackv5-unhelpful-link:hover,
+#articleFeedbackv5-show-feedback .articleFeedbackv5-comment-foot 
.articleFeedbackv5-reversehelpful-link:hover,
+#articleFeedbackv5-show-feedback .articleFeedbackv5-comment-foot 
.articleFeedbackv5-reverseunhelpful-link:hover {
        /* @embed */
        background: url(images/bg-button-hov.png) repeat-x;
        cursor: pointer;
@@ -305,7 +309,11 @@
 #articleFeedbackv5-show-feedback .articleFeedbackv5-comment-foot 
.articleFeedbackv5-helpful-link.active,
 #articleFeedbackv5-show-feedback .articleFeedbackv5-comment-foot 
.articleFeedbackv5-unhelpful-link.active,
 #articleFeedbackv5-show-feedback .articleFeedbackv5-comment-foot 
.articleFeedbackv5-helpful-link.active:hover,
-#articleFeedbackv5-show-feedback .articleFeedbackv5-comment-foot 
.articleFeedbackv5-unhelpful-link.active:hover {
+#articleFeedbackv5-show-feedback .articleFeedbackv5-comment-foot 
.articleFeedbackv5-unhelpful-link.active:hover,
+#articleFeedbackv5-show-feedback .articleFeedbackv5-comment-foot 
.articleFeedbackv5-reversehelpful-link.active,
+#articleFeedbackv5-show-feedback .articleFeedbackv5-comment-foot 
.articleFeedbackv5-reverseunhelpful-link.active,
+#articleFeedbackv5-show-feedback .articleFeedbackv5-comment-foot 
.articleFeedbackv5-reversehelpful-link.active:hover,
+#articleFeedbackv5-show-feedback .articleFeedbackv5-comment-foot 
.articleFeedbackv5-reverseunhelpful-link.active:hover {
        /* @embed */
        background: url(images/bg-button.png) repeat-x;
        color: #fff;

Modified: 
trunk/extensions/ArticleFeedbackv5/modules/jquery.articleFeedbackv5/jquery.articleFeedbackv5.special.js
===================================================================
--- 
trunk/extensions/ArticleFeedbackv5/modules/jquery.articleFeedbackv5/jquery.articleFeedbackv5.special.js
     2012-02-20 20:44:47 UTC (rev 111961)
+++ 
trunk/extensions/ArticleFeedbackv5/modules/jquery.articleFeedbackv5/jquery.articleFeedbackv5.special.js
     2012-02-20 21:05:11 UTC (rev 111962)
@@ -97,37 +97,7 @@
                                <a class="articlefeedbackv5-flyover-help" 
id="articlefeedbackv5-noteflyover-help" href="#"></a>\
                        </div>\
                </form>';
-                               
-       /**
-        * Formatted and localized flyover panel HTMLs. These are initialized 
once on page setup.
-        *
-        * @var object
-        */
-       $.articleFeedbackv5special.notePanelHtml = {
-               'hide': undefined,
-               'show': undefined,
-               'requestoversight': undefined,
-               'unrequestoversight': undefined,
-               'oversight': undefined,
-               'declineoversight': undefined,
-               'unoversight': undefined
-       };
-                               
-       /**
-        * Activity log flyover panel HTML
-        * 
-        * @var string
-        */
-       $.articleFeedbackv5special.logPanelHtml = '\
-               <div>\
-                       <div class="articlefeedbackv5-flyover-header">\
-                               <h3 
id="articlefeedbackv5-noteflyover-caption">Activity log</h3>\
-                               <a 
id="articlefeedbackv5-noteflyover-helpbutton" href="#"></a>\
-                               <a id="articlefeedbackv5-noteflyover-close" 
href="#"></a>\
-                       </div>\
-                       <div id="articlefeedbackv5-activity-log"></div>\
-               </div>';
-
+       
        // }}}
        // {{{ Init methods
 
@@ -158,20 +128,6 @@
                $.articleFeedbackv5special.activityCookieName += 
$.articleFeedbackv5special.page;
                $.articleFeedbackv5special.loadActivity();
 
-               // initialize flyover panels for actions        
-               $.articleFeedbackv5special.initFlyoverPanels();
-               
-               // Initial load
-               $.articleFeedbackv5special.loadFeedback( true );
-       };
-
-       // }}}
-       // {{{ initFlyoverPanels
-       
-       /**
-        * Initialize the action note flyover panels
-        */
-       $.articleFeedbackv5special.initFlyoverPanels = function() {
                // set tipsy defaults, once
                $.fn.tipsy.defaults = {
                        delayIn: 0,                             // delay before 
showing tooltip (ms)
@@ -187,20 +143,26 @@
                        trigger: 'manual'               // how tooltip is 
triggered - hover | focus | manual
                };
                
-               // i18n, create specific panels from template
+               // i18n, create action-specific tipsy panels from template
                var container = $( '<div></div>' );
                container.html( 
$.articleFeedbackv5special.notePanelHtmlTemplate );
-               for( var action in $.articleFeedbackv5special.notePanelHtml ) {
-                       container.find( 
'#articlefeedbackv5-noteflyover-caption' ).html( mw.msg( 
'articlefeedbackv5-noteflyover-' + action + '-caption' ) );
-                       container.find( '#articlefeedbackv5-noteflyover-label' 
).html( mw.msg( 'articlefeedbackv5-noteflyover-' + action + '-label' ) );
-                       container.find( '#articlefeedbackv5-noteflyover-submit' 
).html( mw.msg( 'articlefeedbackv5-noteflyover-' + action + '-submit' ) );
-                       container.find( '#articlefeedbackv5-noteflyover-submit' 
).attr( 'rel', action );
-                       container.find( '#articlefeedbackv5-noteflyover-help' 
).html( mw.msg( 'articlefeedbackv5-noteflyover-' + action + '-help' ) );
-                       container.find( '#articlefeedbackv5-noteflyover-help' 
).attr( 'href', mw.msg( 'articlefeedbackv5-noteflyover-' + action + 
'-help-link' ) );
-                       $.articleFeedbackv5special.notePanelHtml[action] = 
container.html();
+               for( var action in $.articleFeedbackv5special.actions ) {
+                       if( $.articleFeedbackv5special.actions[action].hasTipsy 
&& (undefined == $.articleFeedbackv5special.actions[action].tipsyHtml) ) {
+                               container.find( 
'#articlefeedbackv5-noteflyover-caption' ).html( mw.msg( 
'articlefeedbackv5-noteflyover-' + action + '-caption' ) );
+                               container.find( 
'#articlefeedbackv5-noteflyover-label' ).html( mw.msg( 
'articlefeedbackv5-noteflyover-' + action + '-label' ) );
+                               container.find( 
'#articlefeedbackv5-noteflyover-submit' ).html( mw.msg( 
'articlefeedbackv5-noteflyover-' + action + '-submit' ) );
+                               // will add an 'action' attribute to the link
+                               container.find( 
'#articlefeedbackv5-noteflyover-submit' ).attr( 'action', action );
+                               container.find( 
'#articlefeedbackv5-noteflyover-help' ).html( mw.msg( 
'articlefeedbackv5-noteflyover-' + action + '-help' ) );
+                               container.find( 
'#articlefeedbackv5-noteflyover-help' ).attr( 'href', mw.msg( 
'articlefeedbackv5-noteflyover-' + action + '-help-link' ) );
+                               
$.articleFeedbackv5special.actions[action].tipsyHtml = container.html();
+                       }
                }
-       }
-       
+               
+               // Initial load
+               $.articleFeedbackv5special.loadFeedback( true );
+       };
+
        // }}}
        // {{{ setBinds
 
@@ -258,145 +220,34 @@
                        return false;
                } );
 
-               // Helpful and unhelpful
-               $.each( ['helpful', 'unhelpful' ], function ( index, value ) { 
-                       $( '.articleFeedbackv5-' + value + '-link' ).live( 
'click', function( e ) {
-                               e.preventDefault();
-                               var $l = $( e.target );
-                               if ( $l.closest( '.articleFeedbackv5-feedback' 
).data( 'hidden' )
-                                       || $l.closest( 
'.articleFeedbackv5-feedback' ).data( 'deleted' ) ) {
-                                       return false;
-                               }
-                               var id = $l.closest( 
'.articleFeedbackv5-feedback' ).attr( 'rel' );
-                               var activity = 
$.articleFeedbackv5special.getActivity( id );
-                               if ( activity[value] ) {
-                                       
$.articleFeedbackv5special.flagFeedback( id, value, -1 );
-                               } else if ( 'helpful' == value && 
activity.unhelpful ) {
-                                       // Allow multiple simultaneous ajax 
requests in this case.
-                                       
$.articleFeedbackv5special.listControls.allowMultiple = true;
-                                       
$.articleFeedbackv5special.flagFeedback( id, 'unhelpful', -1 );
-                                       
$.articleFeedbackv5special.flagFeedback( id, 'helpful', 1 );
-                                       
$.articleFeedbackv5special.listControls.allowMultiple = false;
-                               } else if ( 'unhelpful' == value && 
activity.helpful ) {
-                                       // Allow multiple simultaneous ajax 
requests in this case.
-                                       
$.articleFeedbackv5special.listControls.allowMultiple = true;
-                                       
$.articleFeedbackv5special.flagFeedback( id, 'helpful', -1 );
-                                       
$.articleFeedbackv5special.flagFeedback( id, 'unhelpful', 1 );
-                                       
$.articleFeedbackv5special.listControls.allowMultiple = false;
-                               } else {
-                                       
$.articleFeedbackv5special.flagFeedback( id, value, 1 );
-                               }
-                       } )
-               } );
-
-               // Flag/Unflag as abuse
-               $( '.articleFeedbackv5-abuse-link' ).live( 'click', function( e 
) {
-                       e.preventDefault();
-                       var $l = $( e.target );
-                       if ( $l.closest( '.articleFeedbackv5-feedback' ).data( 
'hidden' )
-                               || $l.closest( '.articleFeedbackv5-feedback' 
).data( 'deleted' ) ) {
-                               return false;
-                       }
-                       var id = $l.closest( '.articleFeedbackv5-feedback' 
).attr( 'rel' );
-                       var activity = $.articleFeedbackv5special.getActivity( 
id );
-                       if ( activity.abuse ) {
-                               $.articleFeedbackv5special.flagFeedback( id, 
'abuse', -1 );
-                       } else {
-                               $.articleFeedbackv5special.flagFeedback( id, 
'abuse', 1 );
-                       }
-               } );
-
-               // Prepare an array of actions to bind
-               var actions = ['activity'];
-               for( var action in $.articleFeedbackv5special.notePanelHtml ) { 
actions.push(action); }
-               // Bind tipsies
-               for( var index in actions ) {
-                       var action = actions[index];
-                       $( '.articleFeedbackv5-' + action + '-link' ).live( 
'click', function( e ) {
-                               e.preventDefault();
-                               var $l = $( e.target );
-                               // are we hiding the current tipsy?
-                               if( $l.attr( 'id' ) == 
$.articleFeedbackv5special.currentPanelHostId ) {
-                                       $l.tipsy( 'hide' );
-                                       
$.articleFeedbackv5special.currentPanelHostId = undefined;
-                               } else {
-                                       // no, we're displaying another one
-                                       if( undefined != 
$.articleFeedbackv5special.currentPanelHostId ) {
-                                               $( '#' + 
$.articleFeedbackv5special.currentPanelHostId ).tipsy( 'hide' );
-                                       }
-                                       $l.tipsy( 'show' );
-                                       
$.articleFeedbackv5special.currentPanelHostId= $l.attr( 'id' );
-                                       // load activity if it is an activity 
log
-                                       if( -1 != $l.attr( 'id' ).indexOf( 
'articleFeedbackv5-activity-link-' ) ) {
-                                               
$.articleFeedbackv5special.loadActivityLog( $l.closest( 
'.articleFeedbackv5-feedback' ).attr( 'rel' ) );
-                                       }
-                               }
-                       } );
+               // Bind actions
+               for( var action in $.articleFeedbackv5special.actions ) {
+                       $( '.articleFeedbackv5-' + action + '-link' ).live( 
'click', $.articleFeedbackv5special.actions[action].click );
                }
                
-               // Bind submit actions on flyover panels
+               // Bind submit actions on flyover panels (flag actions)
                $( '#articlefeedbackv5-noteflyover-submit' ).live( 'click', 
function( e ) {
                        e.preventDefault();
-                       var $l = $( '#' + 
$.articleFeedbackv5special.currentPanelHostId );
-                       var action = $( e.target ).attr( 'rel' );
-                       var id = $l.closest( '.articleFeedbackv5-feedback' 
).attr( 'rel' );
-                       var activity = $.articleFeedbackv5special.getActivity( 
id );
-                       var note = $( '#articlefeedbackv5-noteflyover-note' 
).attr( 'value' );
-                       switch( action ) {
-                               case 'hide':
-                                       
$.articleFeedbackv5special.flagFeedback( id, 'hide', 1, note );
-                                       break;
-                               case 'show':
-                                       
$.articleFeedbackv5special.flagFeedback( id, 'hide', -1, note );
-                                       break;
-                               case 'oversight':
-                                       
$.articleFeedbackv5special.flagFeedback( id, 'delete', 1, note );
-                                       break;
-                               case 'unoversight':
-                                       
$.articleFeedbackv5special.flagFeedback( id, 'delete', -1, note );
-                                       break;
-                               case 'declineoversight':
-                                       
$.articleFeedbackv5special.flagFeedback( id, 'resetoversight', 1, note );
-                                       break;
-                               case 'requestoversight':
-                                       
$.articleFeedbackv5special.flagFeedback( id, 'oversight', 1, note );
-                                       break;
-                               case 'unrequestoversight':
-                                       
$.articleFeedbackv5special.flagFeedback( id, 'oversight', -1, note );
-                                       break;
-                       }
+                       $.articleFeedbackv5special.flagFeedback(
+                               $( '#' + 
$.articleFeedbackv5special.currentPanelHostId ).closest( 
'.articleFeedbackv5-feedback' ).attr( 'rel' ),
+                               $( e.target ).attr( 'action' ),
+                               $( '#articlefeedbackv5-noteflyover-note' 
).attr( 'value' ) );
+                       
                        // hide tipsy
-                       $l.tipsy( 'hide' );
+                       $( '#' + $.articleFeedbackv5special.currentPanelHostId 
).tipsy( 'hide' );
                        $.articleFeedbackv5special.currentPanelHostId = 
undefined;
                } );
                
-               // flyover panel close button
+               // bind flyover panel close button
                $( '#articlefeedbackv5-noteflyover-close' ).live( 'click', 
function( e ) {
                        e.preventDefault();
-                       var $l = $( '#' + 
$.articleFeedbackv5special.currentPanelHostId );
-                       $l.tipsy( 'hide' );
+                       $( '#' + $.articleFeedbackv5special.currentPanelHostId 
).tipsy( 'hide' );
                        $.articleFeedbackv5special.currentPanelHostId = 
undefined;
                } );
                
-               // Delete/Undelete this post
-               /*$( '.articleFeedbackv5-delete-link' ).live( 'click', 
function( e ) {
-                       e.preventDefault();
-                       var $l = $( e.target );
-                       var id = $l.closest( '.articleFeedbackv5-feedback' 
).attr( 'rel' );
-                       var activity = $.articleFeedbackv5special.getActivity( 
id );
-                       if ( activity.delete 
-                         || $( e.target ).text() == 
mw.msg('articlefeedbackv5-form-undelete') 
-                       ) {
-                               $.articleFeedbackv5special.flagFeedback( id, 
'delete', -1 );
-                       } else {
-                               $.articleFeedbackv5special.flagFeedback( id, 
'delete', 1 );
-                       }
-               } );*/
        }
-
        // }}}
        // {{{ bindPanels
-       
        /**
         * Bind panels to controls - that cannot be 'live' events due to 
jQuery.typsy
         * limitations. This function should be invoked after feedback posts 
are loaded,
@@ -408,53 +259,52 @@
        $.articleFeedbackv5special.bindPanels = function( id ) {
                // single post or entire list?          
                var $selector = !id ? $( '#articleFeedbackv5-show-feedback' ) : 
$( '.articleFeedbackv5-feedback[rel="' + id + '"]' );
-
-               // hide/show action
-               $selector.find( 
'.articleFeedbackv5-hide-link,.articleFeedbackv5-show-link' ).tipsy( {
-                       title: function() {
-                               var activity = 
$.articleFeedbackv5special.getActivity( id );
-                               return ( activity.hide || this.text == mw.msg( 
'articlefeedbackv5-form-unhide' ) ) ?
-                                       
$.articleFeedbackv5special.notePanelHtml['show'] : 
$.articleFeedbackv5special.notePanelHtml['hide'];
-                       }
-               } );
-
-               // oversight/unoversight action
-               $selector.find( 
'.articleFeedbackv5-oversight-link,.articleFeedbackv5-unoversight-link' 
).tipsy( {
-                       title: function() {
-                               var activity = 
$.articleFeedbackv5special.getActivity( id );
-                               return ( activity.delete || this.text == 
mw.msg('articlefeedbackv5-form-undelete') ) ?
-                                       
$.articleFeedbackv5special.notePanelHtml['unoversight'] : 
$.articleFeedbackv5special.notePanelHtml['oversight'];
-                       }
-               } );
-                               
-               // request/unrequest oversight action
-               $selector.find( 
'.articleFeedbackv5-requestoversight-link,.articleFeedbackv5-unrequestoversight-link'
 ).tipsy( {
-                       title: function() {
-                               var activity = 
$.articleFeedbackv5special.getActivity( id );
-                               return ( activity.oversight || this.text == 
mw.msg('articlefeedbackv5-form-unoversight') ) ?
-                                       
$.articleFeedbackv5special.notePanelHtml['unrequestoversight'] : 
$.articleFeedbackv5special.notePanelHtml['requestoversight'];
-                       }
-               } );
                
-               // decline oversight action
-               $selector.find( '.articleFeedbackv5-declineoversight-link' 
).tipsy( {
-                       title: function() {
-                               return 
$.articleFeedbackv5special.notePanelHtml['declineoversight'];
-                       }
-               } );
-               
-               // view activity action
-               $selector.find( '.articleFeedbackv5-activity-link' ).tipsy( {
-                       title: function() {
-                               return $.articleFeedbackv5special.logPanelHtml;
-                       }
-               } );
+               for( var action in $.articleFeedbackv5special.actions ) {
+                       $selector.find( '.articleFeedbackv5-' + action + 
'-link' )
+                               .attr( 'action', action )
+                               .tipsy( {
+                                       title: function() {
+                                               return 
$.articleFeedbackv5special.actions[$( this ).attr( 'action' )].tipsyHtml;
+                                       }
+                               } );
+               }
        }
+       // }}}
        
        // }}}
+       // {{{ Utility methods
        
+       // {{{ toggleTipsy
+       /**
+        * Toggles tipsy display for an action link
+        *
+        * @param e event
+        * @returns true if showing tipsy, false if hiding
+        */
+       $.articleFeedbackv5special.toggleTipsy = function( e ) {
+               e.preventDefault();
+               var $l = $( e.target );
+               // are we hiding the current tipsy?
+               if( $l.attr( 'id' ) == 
$.articleFeedbackv5special.currentPanelHostId ) {
+                       $l.tipsy( 'hide' );
+                       $.articleFeedbackv5special.currentPanelHostId = 
undefined;
+                       return false;
+               } else {
+                       // no, we're displaying another one
+                       if( undefined != 
$.articleFeedbackv5special.currentPanelHostId ) {
+                               $( '#' + 
$.articleFeedbackv5special.currentPanelHostId ).tipsy( 'hide' );
+                       }
+                       $l.tipsy( 'show' );
+                       $.articleFeedbackv5special.currentPanelHostId = 
$l.attr( 'id' );
+                       return true;
+                       // load activity if it is an activity log
+                       if( -1 != $l.attr( 'id' ).indexOf( 
'articleFeedbackv5-activity-link-' ) ) {
+                               $.articleFeedbackv5special.loadActivityLog( 
$l.closest( '.articleFeedbackv5-feedback' ).attr( 'rel' ) );
+                       }
+               }
+       }
        // }}}
-       // {{{ Utility methods
 
        // {{{ toggleComment
        $.articleFeedbackv5special.toggleComment = function( id ) { 
@@ -659,7 +509,6 @@
 
        // }}}
        // {{{ unmarkDeleted
-
        /**
         * Utility method: Unmarks as deleted a feedback row
         *
@@ -670,10 +519,20 @@
                        .data( 'deleted', false );
                $row.find( '.articleFeedbackv5-feedback-deleted-marker' 
).remove();
        };
-
        // }}}
        
+       // {{{ setActivityFlag
+       $.articleFeedbackv5special.setActivityFlag = function( id, flag, value 
) {
+               // no activity for this post yet, create default structure
+               if ( !( id in $.articleFeedbackv5special.activity ) ) {
+                       $.articleFeedbackv5special.activity[id] = { 'helpful': 
false, 'unhelpful': false, 'abuse': false, 'hide': false, 'delete': false };
+               }
+               $.articleFeedbackv5special.activity[id][flag] = value;
+               $.articleFeedbackv5special.storeActivity();
+       }
        // }}}
+       
+       // }}}
        // {{{ Process methods
 
        // {{{ flagFeedback
@@ -681,16 +540,16 @@
        /**
         * Sends the request to mark a response
         *
-        * @param id   int    the feedback id
-        * @param type string the type of mark (valid values: hide, abuse, 
delete, helpful, unhelpful)
-        * @param dir  int    the direction of the mark (-1 = tick down; 1 = 
tick up)
-        * @param note string note for action (default empty)
+        * @param id            int                     the feedback id
+        * @param action        string          action to execute
+        * @param note          string          note for action (default empty)
         */
-       $.articleFeedbackv5special.flagFeedback = function ( id, type, dir, 
note ) {
+       $.articleFeedbackv5special.flagFeedback = function ( id, action, note ) 
{
                // default parameters
                note = typeof note !== undefined ? note : '';
                
                if( $.articleFeedbackv5special.listControls.disabled ) {
+                       console.log('disabled');
                        return false;
                }
                
@@ -712,8 +571,8 @@
                        'data'    : {
                                'pageid'    : $.articleFeedbackv5special.page,
                                'feedbackid': id,
-                               'flagtype'  : type,
-                               'direction' : dir > 0 ? 'increase' : 'decrease',
+                               'flagtype'  : 
$.articleFeedbackv5special.actions[action].apiFlagType,
+                               'direction' : 
$.articleFeedbackv5special.actions[action].apiFlagDir > 0 ? 'increase' : 
'decrease',
                                'note'          : note,
                                'format'    : 'json',
                                'action'    : 'articlefeedbackv5-flag-feedback'
@@ -723,90 +582,17 @@
                                if ( 'articlefeedbackv5-flag-feedback' in data 
) {
                                        if ( 'result' in 
data['articlefeedbackv5-flag-feedback'] ) {
                                                if ( 
data['articlefeedbackv5-flag-feedback'].result == 'Success' ) {
-                                                       var $l = $( 
'#articleFeedbackv5-' + type + '-link-' + id );
-                                                       var $post = $l.closest( 
'.articleFeedbackv5-feedback' );
-                                                       // Helpful or unhelpful
-                                                       if ( 'helpful' in 
data['articlefeedbackv5-flag-feedback'] ) {
-                                                               $( 
'#articleFeedbackv5-helpful-votes-' + id ).text( 
data['articlefeedbackv5-flag-feedback'].helpful );
+                                                       // invoke the 
registered onSuccess callback for the executed action
+                                                       if( undefined != 
$.articleFeedbackv5special.actions[action].onSuccess ) {
+                                                               
$.articleFeedbackv5special.actions[action].onSuccess( id, data );
                                                        }
-                                                       if ( 'helpful' == type 
|| 'unhelpful' == type ) {
-                                                               if ( dir > 0 ) {
-                                                                       
$l.addClass( 'helpful-active' );
-                                                               } else {
-                                                                       
$l.removeClass( 'helpful-active' );
-                                                               }
-                                                       // Abusive
-                                                       } else if ( 'abuse' == 
type ) {
-                                                               if ( dir > 0 ) {
-                                                                       if( 
mw.config.get( 'afCanEdit' ) == 1 ) {
-                                                                               
$l.text( mw.msg( 'articlefeedbackv5-abuse-saved', 
data['articlefeedbackv5-flag-feedback'].abuse_count ) );
-                                                                       } else {
-                                                                               
$l.text( mw.msg( 'articlefeedbackv5-abuse-saved-masked', 
data['articlefeedbackv5-flag-feedback'].abuse_count ) );
-                                                                       }
-                                                               } else {
-                                                                       if( 
mw.config.get( 'afCanEdit' ) == 1 ) {
-                                                                               
$l.text( mw.msg( 'articlefeedbackv5-form-abuse', 
data['articlefeedbackv5-flag-feedback'].abuse_count ) );
-                                                                       } else {
-                                                                               
$l.text( mw.msg( 'articlefeedbackv5-form-abuse-masked', 
data['articlefeedbackv5-flag-feedback'].abuse_count ) );
-                                                                       }
-                                                               }
-                                                               $l.attr( 'rel', 
data['articlefeedbackv5-flag-feedback'].abuse_count );
-                                                               if ( 
data['articlefeedbackv5-flag-feedback'].abusive ) {
-                                                                       
$l.addClass( 'abusive' );
-                                                               } else {
-                                                                       
$l.removeClass( 'abusive' );
-                                                               }
-                                                               if ( 
data['articlefeedbackv5-flag-feedback']['abuse-hidden'] ) {
-                                                                       
$.articleFeedbackv5special.markHidden( $l.closest( 
'.articleFeedbackv5-feedback' ) );
-                                                               }
-                                                       // Hide/show
-                                                       } else if ( 'hide' == 
type ) {
-                                                               if ( dir > 0 ) {
-                                                                       var $l 
= $( '#articleFeedbackv5-hide-link-' + id );
-                                                                       
$l.attr( 'id', 'articleFeedbackv5-show-link-' + id );
-                                                                       
$l.text( mw.msg( 'articlefeedbackv5-form-unhide' ) );
-                                                                       
$.articleFeedbackv5special.markHidden( $l.closest( 
'.articleFeedbackv5-feedback' ) );
-                                                               } else {
-                                                                       var $l 
= $( '#articleFeedbackv5-show-link-' + id );
-                                                                       
$l.attr( 'id', 'articleFeedbackv5-hide-link-' + id );
-                                                                       
$l.text( mw.msg( 'articlefeedbackv5-form-hide' ) );
-                                                                       
$.articleFeedbackv5special.unmarkHidden( $l.closest( 
'.articleFeedbackv5-feedback' ));
-                                                               }
-                                                       // oversight/unoversight
-                                                       } else if ( 'delete' == 
type ) {
-                                                               if ( dir > 0 ) {
-                                                                       var $l 
= $( '#articleFeedbackv5-oversight-link-' + id );
-                                                                       
$l.attr( 'id', 'articleFeedbackv5-unoversight-link-' + id );
-                                                                       
$l.text( mw.msg( 'articlefeedbackv5-form-undelete' ) );
-                                                                       
$.articleFeedbackv5special.markDeleted( $l.closest( 
'.articleFeedbackv5-feedback' ) );
-                                                               } else {
-                                                                       var $l 
= $( '#articleFeedbackv5-unoversight-link-' + id );
-                                                                       
$l.attr( 'id', 'articleFeedbackv5-oversight-link-' + id );
-                                                                       
$l.text( mw.msg( 'articlefeedbackv5-form-delete' ) );
-                                                                       
$.articleFeedbackv5special.unmarkDeleted( $l.closest( 
'.articleFeedbackv5-feedback' ) );
-                                                               }
-                                                       // decline oversight
-                                                       } else if( 
'resetoversight' == type ) {
-                                                               $( 
'#articleFeedbackv5-resetoversight-link-' + id ).remove();
-                                                       // request/unrequest 
oversight
-                                                       } else if( 'oversight' 
== type ) {
-                                                               if( dir > 0 ) {
-                                                                       var $l 
= $( '#articleFeedbackv5-requestoversight-link-' + id );
-                                                                       
$l.attr( 'id', 'articleFeedbackv5-unrequestoversight-link-' + id );
-                                                                       
$l.text( mw.msg( 'articlefeedbackv5-form-unoversight' ) );
-                                                               } else {
-                                                                       var $l 
= $( '#articleFeedbackv5-unrequestoversight-link-' + id );
-                                                                       
$l.attr( 'id', 'articleFeedbackv5-requestoversight-link-' + id );
-                                                                       
$l.text( mw.msg( 'articlefeedbackv5-form-oversight' ) );
-                                                               }
-                                                       }
-                                                       // Save activity
-                                                       if ( !( id in 
$.articleFeedbackv5special.activity ) ) {
-                                                               
$.articleFeedbackv5special.activity[id] = { helpful: false, unhelpful: false, 
abuse: false, hide: false, delete: false };
-                                                       }
-                                                       
$.articleFeedbackv5special.activity[id][type] = dir > 0 ? true : false;
-                                                       
$.articleFeedbackv5special.storeActivity();
+                                                       
+                                                       // Re-enable ajax 
flagging.
+                                                       
$.articleFeedbackv5special.listControls.disabled = false;
+                                                       
+                                                       // re-bind panels 
(tipsies)
                                                        
$.articleFeedbackv5special.bindPanels( id );
+                                                       return true;
                                                } else if ( 
data['articlefeedbackv5-flag-feedback'].result == 'Error' ) {
                                                        mw.log( mw.msg( 
data['articlefeedbackv5-flag-feedback'].reason ) );
                                                }
@@ -828,7 +614,6 @@
        // {{{ loadActivityLog
                
        $.articleFeedbackv5special.loadActivityLog = function( id ) {
-               console.log('loadActivityLog');
                $.ajax( {
                        'url':          $.articleFeedbackv5special.apiUrl,
                        'type':         'GET',
@@ -841,11 +626,10 @@
                                'continue':                     0
                        },
                        'success': function( data ) {
-                               
console.log(data['articlefeedbackv5-view-activity'].activity);
                                $( '#articlefeedbackv5-activity-log' ).html( 
data['articlefeedbackv5-view-activity'].activity );
                        },
                        'error': function( data ) {
-                               console.log('error');
+                               $( '#articlefeedbackv5-activity-log' ).html( 
mw.msg( 'articleFeedbackv5-view-activity-error' ) );
                        }
                } );
                
@@ -894,10 +678,18 @@
                                                if ( id in 
$.articleFeedbackv5special.activity ) {
                                                        var activity = 
$.articleFeedbackv5special.getActivity( id );
                                                        if ( activity.helpful ) 
{
-                                                               $( this ).find( 
'#articleFeedbackv5-helpful-link-' + id ).addClass( 'helpful-active' );
+                                                               $( this ).find( 
'#articleFeedbackv5-helpful-link-' + id )
+                                                                       
.addClass( 'helpful-active' )
+                                                                       
.removeClass( 'articleFeedbackv5-helpful-link' )
+                                                                       
.addClass( 'articleFeedbackv5-reversehelpful-link' )
+                                                                       .attr( 
'id', 'articleFeedbackv5-reversehelpful-link-' + id );
                                                        }
                                                        if ( activity.unhelpful 
) {
-                                                               $( this ).find( 
'#articleFeedbackv5-unhelpful-link-' + id ).addClass( 'helpful-active' );
+                                                               $( this ).find( 
'#articleFeedbackv5-unhelpful-link-' + id )
+                                                                       
.addClass( 'helpful-active' )
+                                                                       
.removeClass( 'articleFeedbackv5-unhelpful-link' )
+                                                                       
.addClass( 'articleFeedbackv5-reverseunhelpful-link' )
+                                                                       .attr( 
'id', 'articleFeedbackv5-reverseunhelpful-link-' + id );
                                                        }
                                                        if ( activity.abuse ) {
                                                                var $l = $( 
this ).find( '#articleFeedbackv5-abuse-link-' + id );
@@ -906,6 +698,9 @@
                                                                } else {
                                                                        
$l.text( mw.msg( 'articlefeedbackv5-abuse-saved-masked', $l.attr( 'rel' ) ) );
                                                                }
+                                                               $l.attr( 'id', 
'articleFeedbackv5-unabuse-link-' + id )
+                                                                       
.removeClass( 'articleFeedbackv5-abuse-link' )
+                                                                       
.addClass( 'articleFeedbackv5-unabuse-link' ); 
                                                        }
                                                }
                                                if ( $( this ).hasClass( 
'articleFeedbackv5-feedback-hidden' ) ) {
@@ -951,7 +746,6 @@
 
        // }}}
        // {{{ storeActivity
-
        /**
         * Stores the user activity to the cookie
         */
@@ -963,9 +757,356 @@
                        { 'expires': 365, 'path': '/' }
                );
        }
+       // }}}
+       // {{{ canBeFlagged
+       /**
+        * Returns true if the post can be flagged
+        */
+       $.articleFeedbackv5special.canBeFlagged = function( $post ) {
+               return !$post.data( 'hidden' ) && !$post.data( 'deleted' );
+       }
+       // }}}
 
        // }}}
+       
+       // {{{ Actions
+       /**
+        * Actions - available actions on the page.
+        * 
+        * Each action is an object with the following properties:
+        *              hasTipsy - true if the action needs a flyover panel
+        *              tipsyHtml - html for the corresponding flyover panel
+        *              click - click action
+        *              apiFlagType - flag type for api call
+        *              apiFlagDir - flag direction for api call (+/-1)
+        *              onSuccess - callback to execute after action success. 
Callback parameters:
+        *                      id - respective post id
+        *                      data - any data returned by the AJAX call
+        */
+       $.articleFeedbackv5special.actions = {
+               
+               // Vote helpful
+               'helpful': {
+                       'hasTipsy': false,
+                       'click': function( e ) {
+                               e.preventDefault();
+                               var $link = $( e.target );
+                               if( $.articleFeedbackv5special.canBeFlagged( 
$link.closest( '.articleFeedbackv5-feedback' ) ) ) {
+                                       var id = $link.closest( 
'.articleFeedbackv5-feedback' ).attr( 'rel' );
+                                       var activity = 
$.articleFeedbackv5special.getActivity( id );
+                                       
$.articleFeedbackv5special.listControls.allowMultiple = true;
+                                       if( activity['unhelpful'] ) {
+                                               
$.articleFeedbackv5special.flagFeedback( id, 'reverseunhelpful', '' );
+                                       }
+                                       
$.articleFeedbackv5special.flagFeedback( id, 'helpful', '' );
+                                       
$.articleFeedbackv5special.listControls.allowMultiple = false;
+                               }
+                       },
+                       'apiFlagType': 'helpful',
+                       'apiFlagDir': 1,
+                       'onSuccess': function( id, data ) {
+                               $( '#articleFeedbackv5-helpful-votes-' + id 
).text( data['articlefeedbackv5-flag-feedback'].helpful );
+                               $( '#articleFeedbackv5-helpful-link-' + id )
+                                       .addClass( 'helpful-active' )
+                                       .removeClass( 
'articleFeedbackv5-helpful-link' )
+                                       .addClass( 
'articleFeedbackv5-reversehelpful-link' )
+                                       .attr( 'id', 
'articleFeedbackv5-reversehelpful-link-' + id );
+                               $.articleFeedbackv5special.setActivityFlag( id, 
'helpful', true );
+                       }
+               },
+               
+               // Un-vote helpful
+               'reversehelpful': {
+                       'hasTipsy': false,
+                       'click': function( e ) {
+                               e.preventDefault();
+                               var $link = $( e.target );
+                               if( $.articleFeedbackv5special.canBeFlagged( 
$link.closest( '.articleFeedbackv5-feedback' ) ) ) {
+                                       $.articleFeedbackv5special.flagFeedback(
+                                               $link.closest( 
'.articleFeedbackv5-feedback' ).attr( 'rel' ), 'reversehelpful', '' );
+                               }
+                       },
+                       'apiFlagType': 'helpful',
+                       'apiFlagDir': -1,
+                       'onSuccess': function( id, data ) {
+                               $( '#articleFeedbackv5-helpful-votes-' + id 
).text( data['articlefeedbackv5-flag-feedback'].helpful );
+                               $( '#articleFeedbackv5-reversehelpful-link-' + 
id )
+                                       .removeClass( 'helpful-active' )
+                                       .removeClass( 
'articleFeedbackv5-reversehelpful-link')
+                                       .addClass( 
'articleFeedbackv5-helpful-link' )
+                                       .attr( 'id', 
'articleFeedbackv5-helpful-link-' + id );
+                               $.articleFeedbackv5special.setActivityFlag( id, 
'helpful', false );
+                       }
+               },
+               
+               // Vote unhelpful
+               'unhelpful': {
+                       'hasTipsy': false,
+                       'click': function( e ) {
+                               e.preventDefault();
+                               var $link = $( e.target );
+                               if( $.articleFeedbackv5special.canBeFlagged( 
$link.closest( '.articleFeedbackv5-feedback' ) ) ) {
+                                       var id = $link.closest( 
'.articleFeedbackv5-feedback' ).attr( 'rel' );
+                                       var activity = 
$.articleFeedbackv5special.getActivity( id );
+                                       
$.articleFeedbackv5special.listControls.allowMultiple = true;
+                                       if( activity['helpful'] ) {
+                                               
$.articleFeedbackv5special.flagFeedback( id, 'reversehelpful', '' );
+                                       }
+                                       
$.articleFeedbackv5special.flagFeedback( id, 'unhelpful', '' );
+                                       
$.articleFeedbackv5special.listControls.allowMultiple = false;
+                               }
+                       },
+                       'apiFlagType': 'unhelpful',
+                       'apiFlagDir': 1,
+                       'onSuccess': function( id, data ) {
+                               $( '#articleFeedbackv5-helpful-votes-' + id 
).text( data['articlefeedbackv5-flag-feedback'].helpful );
+                               $( '#articleFeedbackv5-unhelpful-link-' + id )
+                                       .addClass( 'helpful-active' )
+                                       .removeClass( 
'articleFeedbackv5-unhelpful-link')
+                                       .addClass( 
'articleFeedbackv5-reverseunhelpful-link' )
+                                       .attr( 'id', 
'articleFeedbackv5-reverseunhelpful-link-' + id );
+                               $.articleFeedbackv5special.setActivityFlag( id, 
'unhelpful', true );
+                       }
+               },
+               
+               // Un-vote unhelpful
+               'reverseunhelpful': {
+                       'hasTipsy': false,
+                       'click': function( e ) {
+                               e.preventDefault();
+                               var $link = $( e.target );
+                               if( $.articleFeedbackv5special.canBeFlagged( 
$link.closest( '.articleFeedbackv5-feedback' ) ) ) {
+                                       $.articleFeedbackv5special.flagFeedback(
+                                               $link.closest( 
'.articleFeedbackv5-feedback' ).attr( 'rel' ), 'reverseunhelpful', '' );
+                               }
+                       },
+                       'apiFlagType': 'unhelpful',
+                       'apiFlagDir': -1,
+                       'onSuccess': function( id, data ) {
+                               $( '#articleFeedbackv5-helpful-votes-' + id 
).text( data['articlefeedbackv5-flag-feedback'].helpful );
+                               $( '#articleFeedbackv5-reverseunhelpful-link-' 
+ id )
+                                       .removeClass( 'helpful-active' )
+                                       .removeClass( 
'articleFeedbackv5-reverseunhelpful-link')
+                                       .addClass( 
'articleFeedbackv5-unhelpful-link' )
+                                       .attr( 'id', 
'articleFeedbackv5-unhelpful-link-' + id );
+                               $.articleFeedbackv5special.setActivityFlag( id, 
'unhelpful', false );
+                       }
+               },
 
+               // Flag post as abusive
+               'abuse': {
+                       'hasTipsy': false,
+                       'click': function( e ) {
+                               e.preventDefault();
+                               var $link = $( e.target );
+                               if( $.articleFeedbackv5special.canBeFlagged( 
$link.closest( '.articleFeedbackv5-feedback' ) ) ) {
+                                       var id = $link.closest( 
'.articleFeedbackv5-feedback' ).attr( 'rel' );
+                                       
$.articleFeedbackv5special.flagFeedback( $link.closest( 
'.articleFeedbackv5-feedback' ).attr( 'rel' ), 'abuse', '' );
+                               }
+                       },
+                       'apiFlagType': 'abuse',
+                       'apiFlagDir': 1,
+                       'onSuccess': function( id, data ) {
+                               $link = $( '#articleFeedbackv5-abuse-link-' + 
id );
+                               if( mw.config.get( 'afCanEdit' ) == 1 ) {
+                                       $link.text( mw.msg( 
'articlefeedbackv5-abuse-saved', 
data['articlefeedbackv5-flag-feedback'].abuse_count ) );
+                               } else {
+                                       $link.text( mw.msg( 
'articlefeedbackv5-abuse-saved-masked', 
data['articlefeedbackv5-flag-feedback'].abuse_count ) );
+                               }
+                               $link.attr( 'rel', 
data['articlefeedbackv5-flag-feedback'].abuse_count );
+                               if ( 
data['articlefeedbackv5-flag-feedback'].abusive ) {
+                                       $link.addClass( 'abusive' );
+                               } else {
+                                       $link.removeClass( 'abusive' );
+                               }
+                               if ( 
data['articlefeedbackv5-flag-feedback']['abuse-hidden'] ) {
+                                       $.articleFeedbackv5special.markHidden( 
$link.closest( '.articleFeedbackv5-feedback' ) );
+                               }
+                               $link.attr( 'id', 
'articleFeedbackv5-unabuse-link-' + id )
+                                       .removeClass( 
'articleFeedbackv5-abuse-link' )
+                                       .addClass( 
'articleFeedbackv5-unabuse-link' );
+                               $.articleFeedbackv5special.setActivityFlag( id, 
'abuse', true );
+                       }
+               },
+               
+               // Unflag post as abusive
+               'unabuse': {
+                       'hasTipsy': false,
+                       'click': function( e ) {
+                               e.preventDefault();
+                               var $link = $( e.target );
+                               if( $.articleFeedbackv5special.canBeFlagged( 
$link.closest( '.articleFeedbackv5-feedback' ) ) ) {
+                                       var id = $link.closest( 
'.articleFeedbackv5-feedback' ).attr( 'rel' );
+                                       
$.articleFeedbackv5special.flagFeedback( $link.closest( 
'.articleFeedbackv5-feedback' ).attr( 'rel' ), 'unabuse', '' );
+                               }
+                       },
+                       'apiFlagType': 'abuse',
+                       'apiFlagDir': -1,
+                       'onSuccess': function( id, data ) {
+                               $link = $( '#articleFeedbackv5-unabuse-link-' + 
id );
+                               if( mw.config.get( 'afCanEdit' ) == 1 ) {
+                                       $link.text( mw.msg( 
'articlefeedbackv5-form-abuse', 
data['articlefeedbackv5-flag-feedback'].abuse_count ) );
+                               } else {
+                                       $link.text( mw.msg( 
'articlefeedbackv5-form-abuse-masked', 
data['articlefeedbackv5-flag-feedback'].abuse_count ) );
+                               }
+                               $link.attr( 'rel', 
data['articlefeedbackv5-flag-feedback'].abuse_count );
+                               if ( 
data['articlefeedbackv5-flag-feedback'].abusive ) {
+                                       $link.addClass( 'abusive' );
+                               } else {
+                                       $link.removeClass( 'abusive' );
+                               }
+                               if ( 
data['articlefeedbackv5-flag-feedback']['abuse-hidden'] ) {
+                                       $.articleFeedbackv5special.markHidden( 
$link.closest( '.articleFeedbackv5-feedback' ) );
+                               }
+                               $link.attr( 'id', 
'articleFeedbackv5-abuse-link-' + id )
+                                       .removeClass( 
'articleFeedbackv5-unabuse-link' )
+                                       .addClass( 
'articleFeedbackv5-abuse-link' );
+                               $.articleFeedbackv5special.setActivityFlag( id, 
'abuse', false );
+                       }
+               },
+               
+               // Hide post action
+               'hide': {
+                       'hasTipsy': true,
+                       'tipsyHtml': undefined,
+                       'click': $.articleFeedbackv5special.toggleTipsy,
+                       'apiFlagType': 'hide',
+                       'apiFlagDir': 1,
+                       'onSuccess': function( id, data ) {
+                               var $link = $( '#articleFeedbackv5-hide-link-' 
+ id )
+                                       .attr( 'action', 'show' )
+                                       .attr( 'id', 
'articleFeedbackv5-show-link-' + id )
+                                       .text( mw.msg( 
'articlefeedbackv5-form-unhide' ) )
+                                       .removeClass( 
'articleFeedbackv5-hide-link' )
+                                       .addClass( 
'articleFeedbackv5-show-link' );
+                               $.articleFeedbackv5special.markHidden( 
$link.closest( '.articleFeedbackv5-feedback' ) );
+                               $.articleFeedbackv5special.setActivityFlag( id, 
'hide', true );
+                       }
+               },
+               
+               // Show post action
+               'show': {
+                       'hasTipsy': true,
+                       'tipsyHtml': undefined,
+                       'click': $.articleFeedbackv5special.toggleTipsy,
+                       'apiFlagType': 'hide',
+                       'apiFlagDir': -1,
+                       'onSuccess': function( id, data ) {
+                               var $link = $( '#articleFeedbackv5-show-link-' 
+ id )
+                                       .attr( 'action', 'hide' )
+                                       .attr( 'id', 
'articleFeedbackv5-hide-link-' + id )
+                                       .text( mw.msg( 
'articlefeedbackv5-form-hide' ) )
+                                       .removeClass( 
'articleFeedbackv5-show-link' )
+                                       .addClass( 
'articleFeedbackv5-hide-link' );
+                               $.articleFeedbackv5special.unmarkHidden( 
$link.closest( '.articleFeedbackv5-feedback' ));
+                               $.articleFeedbackv5special.setActivityFlag( id, 
'hide', false );
+                       }
+               },
+               
+               // Request oversight action
+               'requestoversight': {
+                       'hasTipsy': true,
+                       'tipsyHtml': undefined,
+                       'click': $.articleFeedbackv5special.toggleTipsy,
+                       'apiFlagType': 'oversight',
+                       'apiFlagDir': 1,
+                       'onSuccess': function( id, data ) {
+                               $( '#articleFeedbackv5-requestoversight-link-' 
+ id )
+                                       .attr( 'action', 'unrequestoversight' )
+                                       .attr( 'id', 
'articleFeedbackv5-unrequestoversight-link-' + id )
+                                       .text( mw.msg( 
'articlefeedbackv5-form-unoversight' ) )
+                                       .removeClass( 
'articleFeedbackv5-requestoversight-link' )
+                                       .addClass( 
'articleFeedbackv5-unrequestoversight-link');
+                       }
+               },
+               
+               // Cancel oversight request action
+               'unrequestOversight': {
+                       'hasTipsy': true,
+                       'tipsyHtml': undefined,
+                       'click': $.articleFeedbackv5special.toggleTipsy,
+                       'apiFlagType': 'oversight',
+                       'apiFlagDir': -1,
+                       'onSuccess': function( id, data ) {
+                               $( 
'#articleFeedbackv5-unrequestoversight-link-' + id )
+                                       .attr( 'action', 'requestoversight' )
+                                       .attr( 'id', 
'articleFeedbackv5-requestoversight-link-' + id )
+                                       .text( mw.msg( 
'articlefeedbackv5-form-oversight' ) )
+                                       .removeClass( 
'articleFeedbackv5-unrequestoversight-link' )
+                                       .addClass( 
'articleFeedbackv5-requestoversight-link');
+                       }
+               },
+               
+               // Oversight post action
+               'oversight': {
+                       'hasTipsy': true,
+                       'tipsyHtml': undefined,
+                       'click': $.articleFeedbackv5special.toggleTipsy,
+                       'apiFlagType': 'delete',
+                       'apiFlagDir': 1,
+                       'onSuccess': function( id, data ) {
+                               var $link = $( 
'#articleFeedbackv5-oversight-link-' + id )
+                                       .attr( 'action', 'unoversight' )
+                                       .attr( 'id', 
'articleFeedbackv5-unoversight-link-' + id )
+                                       .text( mw.msg( 
'articlefeedbackv5-form-undelete' ) )
+                                       .removeClass( 
'articleFeedbackv5-oversight-link' )
+                                       .addClass( 
'articleFeedbackv5-unoversight-link' );
+                               $.articleFeedbackv5special.markDeleted( 
$link.closest( '.articleFeedbackv5-feedback' ) );
+                               $.articleFeedbackv5special.setActivityFlag( id, 
'delete', true );
+                       }
+               },
+               
+               // Un-oversight action
+               'unoversight': {
+                       'hasTipsy': true,
+                       'tipsyHtml': undefined,
+                       'click': $.articleFeedbackv5special.toggleTipsy,
+                       'apiFlagType': 'delete',
+                       'apiFlagDir': 1,
+                       'onSuccess': function( id, data ) {
+                               var $link = $( 
'#articleFeedbackv5-unoversight-link-' + id )
+                                       .attr( 'action', 'oversight' )
+                                       .attr( 'id', 
'articleFeedbackv5-oversight-link-' + id )
+                                       .text( mw.msg( 
'articlefeedbackv5-form-delete' ) )
+                                       .removeClass( 
'articleFeedbackv5-unoversight-link' )
+                                       .addClass( 
'articleFeedbackv5-oversight-link' );
+                               $.articleFeedbackv5special.unmarkDeleted( 
$link.closest( '.articleFeedbackv5-feedback' ) );
+                               $.articleFeedbackv5special.setActivityFlag( id, 
'delete', false );
+                       }
+               },
+               
+               // Decline oversight action
+               'declineoversight': {
+                       'hasTipsy': true,
+                       'tipsyHtml': undefined,
+                       'click': $.articleFeedbackv5special.toggleTipsy,
+                       'apiFlagType': 'resetoversight',
+                       'apiFlagDir': 1,
+                       'onSuccess': function( id, data ) {
+                               $( '#articleFeedbackv5-declineoversight-link-' 
+ id ).remove();
+                       }
+               },
+               
+               // View activity log action
+               'activity': {
+                       'hasTipsy': true,
+                       'tipsyHtml': '\
+                               <div>\
+                                       <div 
class="articlefeedbackv5-flyover-header">\
+                                               <h3 
id="articlefeedbackv5-noteflyover-caption">Activity log</h3>\
+                                               <a 
id="articlefeedbackv5-noteflyover-helpbutton" href="#"></a>\
+                                               <a 
id="articlefeedbackv5-noteflyover-close" href="#"></a>\
+                                       </div>\
+                                       <div 
id="articlefeedbackv5-activity-log"></div>\
+                               </div>',
+                       'click': function( e ) {
+                               if( $.articleFeedbackv5special.toggleTipsy( e ) 
) {
+                                       
$.articleFeedbackv5special.loadActivityLog( $( e.target ).closest( 
'.articleFeedbackv5-feedback' ).attr( 'rel' ) );
+                               }
+                       }
+               }
+               
+       };
        // }}}
 
 // }}}


_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to