Index: trunk/extensions/OnlineStatus/OnlineStatus.css
===================================================================
--- trunk/extensions/OnlineStatus/OnlineStatus.css (revision 0)
+++ trunk/extensions/OnlineStatus/OnlineStatus.css (revision 39651)
@@ -0,0 +1,17 @@
+/**
+ * CSS stylesheet for OnlineStatus extension
+ */
+
+.online-status-js {
+ overflow: auto;
+ overflow-x: hidden;
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ background-color: white;
+ border-style: solid;
+ border-color: #AAAAAA;
+ border-width: 1px;
+ z-index: 99;
+ font-size: 120%;
+}
Property changes on: trunk/extensions/OnlineStatus/OnlineStatus.css
___________________________________________________________________
Name: svn:eol-style
+ native
Index: trunk/extensions/OnlineStatus/OnlineStatus.js
===================================================================
--- trunk/extensions/OnlineStatus/OnlineStatus.js (revision 0)
+++ trunk/extensions/OnlineStatus/OnlineStatus.js (revision 39651)
@@ -0,0 +1,83 @@
+var OnlineStatusCreated = false;
+
+function OnlineStatus(){
+ var status = document.getElementById( 'pt-status' );
+ if( typeof status == 'object' ){
+ var link = status.firstChild;
+ link.onmousedown = status.onkeypress = ShowOnlineToggle;
+ }
+}
+
+function ShowOnlineToggle(){
+ if( !OnlineStatusCreated ){
+ var div = document.createElement( 'div' );
+ div.id = 'online-status-js';
+ div.className = 'online-status-js';
+
+ // Taken from skins/mwsuggest.js of core
+ // Credit: Robert Stojnić
+ var left = 0;
+ var top = this.offsetHeight;
+ var elem = this;
+ while( elem ){
+ left += elem.offsetLeft;
+ top += elem.offsetTop;
+ elem = elem.offsetParent;
+ }
+ if( navigator.userAgent.indexOf( 'Mac' ) != -1 && typeof document.body.leftMargin != 'undefined' ){
+ left += document.body.leftMargin;
+ top += document.body.topMargin;
+ }
+
+ div.style.left = left + "px";
+ div.style.top = top + "px";
+ var table = document.createElement( 'table' );
+ sajax_do_call( 'efOnlineStatusAjax', ['get'], function( x ){
+ if( x.status == 200 ){
+ var resp = x.responseText;
+ // A bit unsafe, but...
+ var json = eval( resp );
+ for( i = 0; i < json.length; i++ ){
+ var status = json[i];
+ var tr = document.createElement( 'tr' );
+ var td = document.createElement( 'td' );
+ if( status[2] ){
+ td.appendChild( document.createTextNode( status[1] ) );
+ } else {
+ var a = document.createElement( 'a' );
+ a.status = status[0];
+ a.onmousedown = a.onkeypress = ChangeOnlineStatus;
+ a.appendChild( document.createTextNode( status[1] ) );
+ td.appendChild( a );
+ }
+ tr.appendChild( td );
+ table.appendChild( tr );
+ }
+ }
+ } );
+ div.appendChild( table );
+ div.visible = true;
+ document.body.appendChild( div );
+ OnlineStatusCreated = true;
+ } else {
+ var div = document.getElementById( 'online-status-js' );
+ div.parentNode.removeChild( div );
+ OnlineStatusCreated = false;
+ }
+}
+
+function ChangeOnlineStatus(){
+ var status = this.status;
+ sajax_do_call( 'efOnlineStatusAjax', ['set', status], function( x ){
+ if( x.status == 200 ){
+ var resp = x.responseText;
+ jsMsg( resp, 'watch' );
+ // Force update
+ var div = document.getElementById( 'online-status-js' );
+ div.parentNode.removeChild( div );
+ OnlineStatusCreated = false;
+ }
+ } );
+}
+
+hookEvent( 'load', OnlineStatus );
\ No newline at end of file
Property changes on: trunk/extensions/OnlineStatus/OnlineStatus.js
___________________________________________________________________
Name: svn:eol-style
+ native
Index: trunk/extensions/OnlineStatus/OnlineStatus.i18n.php
===================================================================
--- trunk/extensions/OnlineStatus/OnlineStatus.i18n.php (revision 39650)
+++ trunk/extensions/OnlineStatus/OnlineStatus.i18n.php (revision 39651)
@@ -9,10 +9,14 @@
$messages['en'] = array(
'onlinestatus-desc' => 'Add a preference to show if the user is currently present or not on the wiki',
+ 'onlinestatus-js-anon' => 'Error: you must be logged in to use this feature',
+ 'onlinestatus-js-changed' => 'Your status has been changed to "$1"',
+ 'onlinestatus-js-error' => 'Impossible to change status, value "$1" is invalid',
'onlinestatus-levels' => '* online
* offline', // Do not translate this message
'onlinestatus-subtitle-offline' => 'This user is currently offline',
'onlinestatus-subtitle-online' => 'This user is currently online',
+ 'onlinestatus-tab' => 'Status',
'onlinestatus-toggles-desc' => 'Your status:',
'onlinestatus-toggles-explain' => 'This allows you to show to other users if you are actually online or not by viewing your user page.',
'onlinestatus-toggles-show' => 'Show online status on my user page',
@@ -156,8 +160,12 @@
*/
$messages['fr'] = array(
'onlinestatus-desc' => "Ajoute une préférence pour montrer si l'utilisateur est présent ou non",
+ 'onlinestatus-js-anon' => 'Erreur : vous devez être connecté pour utiliser cette fonctionnalité',
+ 'onlinestatus-js-changed' => 'Votre status a été changé à « $1 »',
+ 'onlinestatus-js-error' => 'Impossible de changer le statut, la valeur « $1 » est invalide',
'onlinestatus-subtitle-offline' => 'Cet utilisateur est actuellement hors ligne',
'onlinestatus-subtitle-online' => 'Cet utilisateur est actuellement en ligne',
+ 'onlinestatus-tab' => 'Statut',
'onlinestatus-toggles-desc' => 'Votre statut :',
'onlinestatus-toggles-explain' => 'Ceci permet aux autres utilisateur de savoir si vous êtes actuellement présent en regardant votre page utilisateur.',
'onlinestatus-toggles-show' => 'Montrer mon statut sur ma page utilisateur',
Index: trunk/extensions/OnlineStatus/OnlineStatus.php
===================================================================
--- trunk/extensions/OnlineStatus/OnlineStatus.php (revision 39650)
+++ trunk/extensions/OnlineStatus/OnlineStatus.php (revision 39651)
@@ -13,8 +13,8 @@
// Add credit :)
$wgExtensionCredits['other'][] = array(
- 'svn-date' => '$LastChangedDate$',
- 'svn-revision' => '$LastChangedRevision$',
+ 'svn-date' => '$LastChangedDate$',
+ 'svn-revision' => '$LastChangedRevision$',
'name' => 'OnlineStatus',
'author' => 'Alexandre Emsenhuber',
'url' => 'http://www.mediawiki.org/wiki/Extension:OnlineStatus',
@@ -29,10 +29,55 @@
*/
$wgAllowAnyUserOnlineStatusFunction = true;
+function efOnlineStatusAjax( $action, $stat = false ){
+ global $wgUser;
+ wfLoadExtensionMessages( 'OnlineStatus' );
+
+ if( $wgUser->isAnon() )
+ return wfMsgHtml( 'onlinestatus-js-anon' );
+
+ switch( $action ){
+ case 'get':
+ $def = $wgUser->getOption( 'online' );
+ $msg = wfMsgForContentNoTrans( 'onlinestatus-levels' );
+ $lines = explode( "\n", $msg );
+ $radios = array();
+ foreach( $lines as $line ){
+ if( substr( $line, 0, 1 ) != '*' )
+ continue;
+ $lev = trim( $line, '* ' );
+ $radios[] = array(
+ $lev,
+ wfMsg( 'onlinestatus-toggle-' . $lev ),
+ $lev == $def
+ );
+ }
+ return json_encode( $radios );
+ case 'set':
+ if( $stat ){
+ $dbw = wfGetDB(DB_MASTER);
+ $dbw->begin();
+ $actual = $wgUser->getOption( 'online' );
+ $wgUser->setOption( 'online', $stat );
+ if( $actual != $stat ){
+ $wgUser->getUserPage()->invalidateCache();
+ $wgUser->getTalkPage()->invalidateCache();
+ }
+ $wgUser->saveSettings();
+ $wgUser->invalidateCache();
+ $dbw->commit();
+ return wfMsgHtml( 'onlinestatus-js-changed', wfMsgHtml( 'onlinestatus-toggle-'.$stat ) );
+ } else {
+ return wfMsgHtml( 'onlinestatus-js-error', $stat );
+ }
+ }
+}
+
class OnlineStatus {
static function init(){
- global $wgExtensionMessagesFiles, $wgExtensionFunctions, $wgHooks, $wgAllowAnyUserOnlineStatusFunction;
+ global $wgExtensionMessagesFiles, $wgExtensionFunctions, $wgHooks, $wgAjaxExportList;
+ global $wgAllowAnyUserOnlineStatusFunction;
// Add messages file
$wgExtensionMessagesFiles['OnlineStatus'] = dirname( __FILE__ ) . '/OnlineStatus.i18n.php';
@@ -60,6 +105,10 @@
// User page
$wgHooks['BeforePageDisplay'][] = 'OnlineStatus::BeforePageDisplay';
+ $wgHooks['PersonalUrls'][] = 'OnlineStatus::PersonalUrls';
+
+ // Ajax stuff
+ $wgAjaxExportList[] = 'efOnlineStatusAjax';
}
/**
@@ -241,7 +290,19 @@
* Hook function for BeforePageDisplay
*/
static function BeforePageDisplay( &$out ){
- global $wgTitle, $wgRequest;
+ global $wgTitle, $wgRequest, $wgUser;
+ global $wgUseAjax;
+
+ if( $wgUser->isLoggedIn() && $wgUseAjax ){
+ global $wgScriptPath, $wgJsMimeType;
+ $out->addScript( "<script type=\"{$wgJsMimeType}\" src=\"{$wgScriptPath}/extensions/OnlineStatus/OnlineStatus.js\"></script>" );
+ $out->addLink( array(
+ 'rel' => 'stylesheet',
+ 'type' => 'text/css',
+ 'href' => "{$wgScriptPath}/extensions/OnlineStatus/OnlineStatus.css"
+ ) );
+ }
+
if( !in_array( $wgRequest->getVal( 'action', 'view' ), array( 'view', 'purge' ) ) )
return true;
$status = self::GetUserStatus( $wgTitle, true );
@@ -249,8 +310,32 @@
return true;
wfLoadExtensionMessages( 'OnlineStatus' );
$out->setSubtitle( wfMsgExt( 'onlinestatus-subtitle-' . $status, array( 'parse' ) ) );
+
return true;
}
+
+ /**
+ * Hook for PersonalUrls
+ */
+ static function PersonalUrls( &$urls, &$title ){
+ global $wgUser, $wgUseAjax;
+ # Require ajax
+ if( !$wgUser->isLoggedIn() || !$wgUseAjax )
+ return true;
+ $arr = array();
+ foreach( $urls as $key => $val ){
+ if( $key == 'logout' ){
+ wfLoadExtensionMessages( 'OnlineStatus' );
+ $arr['status'] = array(
+ 'text' => wfMsgHtml( 'onlinestatus-tab' ),
+ 'href' => 'javascript:;',
+ );
+ }
+ $arr[$key] = $val;
+ }
+ $urls = $arr;
+ return true;
+ }
}
OnlineStatus::init();
\ No newline at end of file