User:Fl/qui.js
Appearance
< User:Fl
(Redirected from User:^.^/qui.js)Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
Documentation for this user script can be added at User:Fl/qui. |
/* <source lang="javascript">
Please keep the following lines intact
Userscript: [[User:TheDJ/Qui]]. Qui is a script that helps you to switch your
Wikipedia online status and allows you to easily view the online status of your
WikiFriends. You can install it by adding "importScript( 'User:TheDJ/qui.js );" to
your [[Special:MyPage/monobook.js]].
Written by: [[User:TheDJ]]
<nowiki> */
// External variables
var add_symbol = "http://upload.wikimedia.org/wikipedia/commons/thumb/c/c2/Pictogram_voting_support.svg/128px-Pictogram_voting_support.svg.png";
var del_symbol = "http://upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Pictogram_voting_oppose.svg/128px-Pictogram_voting_oppose.svg.png";
var watchlist_symbol = "http://upload.wikimedia.org/wikipedia/commons/8/8e/Nuvola_apps_kmag.png";
var friends_symbol = "http://upload.wikimedia.org/wikipedia/commons/c/cc/Nuvola_apps_kdmconfig.png";
// Local variables
var statuspage = "/Status";
var friendspage = "/QuiFriends";
var watcherspage = "/QuiWatchers";
var linkprefix = mw.config.get('wgServer')+mw.config.get('wgScript')+"?title=User:";
var statusCookieName = "wikipedia.qui.status";
var quiCookieRedirect = "wikipedia.qui.redirectto";
var encodedUserName = encodeURIComponent(wgUserName);
var lastseenQueryString = "/api.php?action=query&format=json&list=usercontribs&uclimit=1&ucprop=timestamp&ucuser=";
var qui_system = new Object();
qui_system['online'] = [ "Online", "http://upload.wikimedia.org/wikipedia/commons/thumb/a/ab/Green_pog.svg/128px-Green_pog.svg.png" ];
qui_system['busy'] = [ "Busy", "http://upload.wikimedia.org/wikipedia/commons/thumb/d/d7/Blue_pog.svg/128px-Blue_pog.svg.png" ];
qui_system['sleep'] = [ "Sleeping", "http://upload.wikimedia.org/wikipedia/commons/thumb/0/0c/Red_pog.svg/128px-Red_pog.svg.png" ];
qui_system['offline'] = [ "Offline", "http://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Black_pog.svg/128px-Black_pog.svg.png" ];
qui_system['unknown'] = [ "Unknown", "http://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/White_pog.svg/128px-White_pog.svg.png" ];
function qui_init() {
// Import the CSS elements
if( typeof( quivar_custom_stylesheet ) != "undefined" )
importStylesheet( quivar_custom_stylesheet );
else importStylesheet( "User:TheDJ/qui.css");
var current_status = qui_getCookie( statusCookieName ) || "unknown";
// Add the change status menu
if( current_status == "unknown" )
qui_downloadStatus();
else qui_addMenu( current_status );
//Are we here to auto-edit the status?
if ( (wgTitle == wgUserName+statuspage || wgTitle == wgUserName+friendspage) && wgAction == "view" ) {
var new_location = qui_getCookie( quiCookieRedirect );
qui_deleteCookie( quiCookieRedirect );
if( new_location ) {
document.location.href = wgServer+"/wiki/"+new_location;
}
} else if( wgTitle == wgUserName+statuspage ) {
if( wgAction == "edit" && location.href.indexOf("&action=edit&newstatus=") != -1) {
//Get new status
var statusRegExp = /&action=edit&newstatus=(.*)/;
var new_status = statusRegExp.exec( location.href )[1];
var qui_cmt = wgUserName +' is now ' + qui_system[new_status][0].toLowerCase() +'.';
qui_setCookie( statusCookieName, new_status, 24, "/", false, false );
//Modify the form
document.getElementById('wpTextbox1').value = new_status;
document.getElementById('wpSummary').value = qui_cmt;
// Submit it!
document.getElementById('editform').submit();
}
} else if( wgTitle == wgUserName+friendspage ) {
var currentlist = document.getElementById('wpTextbox1').value;
if( wgAction == "edit" && location.href.indexOf("&action=edit&addfriend=") != -1) {
//Get new friend
var statusRegExp = /&action=edit&addfriend=(.*)/;
var new_friend = decodeURIComponent( statusRegExp.exec( location.href )[1] );
var userexp = new RegExp("\\[\\[User:"+new_friend+watcherspage+".*[\r\n]*", "g" );
var qui_cmt = "Adding [[User:"+new_friend+"|"+new_friend+"]] to my [[WP:Qui|Qui]] friends";
if( currentlist.match( userexp ) ) {
alert( "This user appears to be already present on your Qui friendslist.");
return;
}
//Modify the form
document.getElementById('wpTextbox1').value += "[[User:"+new_friend+watcherspage+"|"+new_friend+"]]\n";
document.getElementById('wpSummary').value = qui_cmt;
// Submit it!
document.getElementById('editform').submit();
} else if ( wgAction == "edit" && location.href.indexOf("&action=edit&delfriend=") != -1) {
//Get new friend
var statusRegExp = /&action=edit&delfriend=(.*)/;
var del_friend = decodeURIComponent( statusRegExp.exec( location.href )[1]);
var userexp = new RegExp("\\[\\[User:"+del_friend+watcherspage+".*[\r\n]*", "g" );
var qui_cmt = "Removing [[User:"+del_friend+"|"+del_friend+"]] from my [[WP:Qui|Qui]] friends";
currentlist = currentlist.replace( userexp, "" );
//Modify the form
document.getElementById('wpTextbox1').value = currentlist;
document.getElementById('wpSummary').value = qui_cmt;
// Submit it!
document.getElementById('editform').submit();
}
}
}
function qui_addMenu( current_status ) {
if( typeof( qui_system[current_status]) == "undefined" ) {
qui_deleteCookie( quiCookieRedirect );
jsMsg( "We encountered an unknown status.\nPlease blank your [[Special:MyPage/Status]] page." );
}
var body = document.getElementsByTagName( 'body')[0];
var indicator = document.createElement( "div" );
indicator.className = "qui-indicator noprint";
indicator.id = "qui-indicator";
var link = document.createElement( "a" );
link.href = "javascript:qui_openMenu();";
link.setAttribute( "title", qui_system[current_status][0] );
var img = document.createElement( "img" );
img.className = "qui-status-image";
img.setAttribute( "src", qui_system[current_status][1] );
img.setAttribute( "alt", qui_system[current_status][0] );
link.appendChild( img );
indicator.appendChild( link );
var qui_elements = "";
for( var astatus in qui_system ) {
if( astatus != "unknown" && typeof( qui_system[astatus] ) == 'object' && qui_system[astatus].length ) {
qui_elements += '<li class="qui-menuelement qui-statusitem" id="qui-' + astatus +
'" onClick="qui_switchStatus(\'' + astatus +
'\');"><img class="qui-status-image" src="' + qui_system[astatus][1] +'" alt="' + qui_system[astatus][0] +
'" />' + qui_system[astatus][0] + '</li>';
}
}
if( wgNamespaceNumber == 2 || wgNamespaceNumber == 3 ) {
var subject_user = wgTitle;
subject_user = subject_user.replace( RegExp( "\\/.*", "g"), "" );
qui_elements += '<li class="qui-menuelement" id="qui-add-friend" onClick="qui_addFriend(\''+ subject_user + '\');">' +
'<img class="qui-status-image" src="' + add_symbol + '" alt="Add Friend" />Add ' + subject_user + '</li>';
qui_elements += '<li class="qui-menuelement" id="qui-del-friend" onClick="qui_delFriend(\''+ subject_user + '\');">' +
'<img class="qui-status-image" src="' + del_symbol + '" alt="Remove Friend" />Remove ' + subject_user + '</li>';
}
qui_elements += '<li class="qui-menuelement" id="qui-watchlist" onClick="qui_openWatchList();"><img class="qui-status-image" src="' +
watchlist_symbol + '" alt="Show list of Qui friends that watch you." />Qui watches you?</li>';
qui_elements += '<li class="qui-menuelement" id="qui-friends" onClick="qui_openFriendsMenu();"><img class="qui-status-image" src="' +
friends_symbol + '" alt="Show list of your Qui friends." />Show Qui friends</li>';
var menu = document.createElement( "ul" );
menu.className = "qui-menu";
menu.id = "qui-menu";
menu.innerHTML = qui_elements;
if (indicator.addEventListener) {
indicator.addEventListener( "click", qui_openMenu, false);
indicator.addEventListener( "mouseover", qui_openMenu, false);
indicator.addEventListener( "mouseout", qui_closeMenu, false);
menu.addEventListener( "mouseover", qui_openMenu, false);
menu.addEventListener( "mouseout", qui_closeMenu, false);
} else if (indicator.attachEvent) {
indicator.attachEvent("onClick", qui_openMenu);
indicator.attachEvent("onMouseOver", qui_openMenu);
indicator.attachEvent("onMouseOut", qui_closeMenu);
menu.attachEvent("onMouseOver", qui_openMenu);
menu.attachEvent("onMouseOut", qui_closeMenu);
}
body.appendChild( indicator );
indicator.appendChild( menu );
};
function qui_openMenu() {
var menu = document.getElementById("qui-menu");
menu.style.display = "block";
};
function qui_closeMenu() {
var menu = document.getElementById("qui-menu");
menu.style.display = "none";
};
function qui_switchStatus( ourstatus ) {
qui_setCookie( quiCookieRedirect, wgPageName, 24, "/", false, false );
document.location.href = linkprefix+encodedUserName+statuspage+"&smaxage=0&action=edit&newstatus="+ourstatus;
};
function qui_downloadStatus() {
var a=sajax_init_object();
a.open("GET", linkprefix+encodedUserName+statuspage + "&smaxage=0&action=raw", true);
a.onreadystatechange = function()
{
if(a.readyState != 4) return;
var new_status = a.responseText ? a.responseText : "unknown";
qui_setCookie( statusCookieName, new_status, 24, "/", false, false );
qui_addMenu( new_status );
};
a.send(null);
};
var buddy_list = new Object();
// Array fmt: friend: [status, lastseen, HTMLobj]
function qui_openFriendsMenu() {
var b=sajax_init_object();
b.open("GET", linkprefix+encodedUserName+friendspage + "&smaxage=0&action=raw", true);
b.onreadystatechange = function()
{
if(b.readyState != 4) return;
if( b.responseText ) {
var array_of_users = b.responseText.split( /[\r\n]/ );
var userexp = /\[\[User:([^\/]*)/;
for( i=0 ; i < array_of_users.length; i++ ) {
var local_username = userexp.exec(array_of_users[i])[1];
if( local_username ) {
buddy_list[local_username] = {status: false, lastseen: false, HTMLobj: false };
qui_getFriendStatus( local_username );
}
}
if( i > 0 ) document.getElementById( "qui-friends" ).style.display = "none";
}
};
b.send(null);
};
function qui_getFriendStatus( friend ) {
var c=sajax_init_object();
c.open("GET", linkprefix+encodeURIComponent(friend)+statuspage + "&smaxage=0&action=raw", true);
c.onreadystatechange = function() {
if(c.readyState != 4)
return;
var local_status = c.responseText || "unknown";
if( typeof( qui_system[local_status] ) == "undefined" )
local_status = "unknown";
buddy_list[friend]["status"] = local_status;
qui_getFriendLastSeen( friend );
};
c.send(null);
};
function qui_getFriendLastSeen( friend ) {
var d=sajax_init_object();
d.open("GET", wgServer + wgScriptPath + lastseenQueryString + encodeURIComponent(friend), true);
d.onreadystatechange = function() {
if(d.readyState != 4) return;
try {
eval( "var queryResult="+ d.responseText );
} catch (someError ) {
alert( "Oh dear, our JSON query went down the drain?\n" + friend+ "\nError: " +someError );
}
if( queryResult.query.usercontribs[0] ) {
var local_lastseen = qui_APIToJSDate(queryResult.query.usercontribs[0].timestamp);
buddy_list[friend]["lastseen"] = local_lastseen;
}
qui_addFriendToMenu( friend );
};
d.send(null);
};
function qui_addFriendToMenu( friend ) {
var friend_status = buddy_list[friend]["status"];
var friend_lastseen = buddy_list[friend]["lastseen"];
if( friend_lastseen )
var friend_lastseen_string = " (" + qui_lastseenString(friend_lastseen) + ")";
else var friend_lastseen_string = "";
var menu = document.getElementById("qui-menu");
var menu_item = document.createElement( "li" );
menu_item.className = "qui-menuelement qui-friendsitem";
menu_item.innerHTML = '<img class="qui-status-image" src="' +
qui_system[friend_status][1] + '" alt="' + friend + ' is currently ' + qui_system[friend_status][0] + '" />'
+ '<a class="qui-friend-link" href="' + linkprefix + encodeURIComponent(friend) + '" title="' + friend
+ ' is currently ' + qui_system[friend_status][0] + '">'
+ friend + '</a> (<a class="qui-friend-talklink" href="' + mw.config.get('wgServer') + mw.config.get('wgScript') + '?title=User%20talk:' + encodeURIComponent(friend)
+ '" title="Talkpage">'
+ 'T</a>) (<a class="qui-friend-dellink" href="javascript:qui_delFriend(\'' + friend + '\');" title="Remove this QuiFriend">'
+ 'D</a>)' + friend_lastseen_string;
menu.appendChild( menu_item );
buddy_list[friend]["HTMLobj"] = menu_item;
};
function qui_addFriend( newfriend ) {
qui_setCookie( quiCookieRedirect, wgPageName, 24, "/", false, false );
document.location.href = linkprefix+encodedUserName+friendspage+"&smaxage=0&action=edit&addfriend="+encodeURIComponent(newfriend?newfriend:wgTitle);
};
function qui_delFriend( oldfriend ) {
qui_setCookie( quiCookieRedirect, wgPageName, 24, "/", false, false );
document.location.href = linkprefix+encodedUserName+friendspage+"&smaxage=0&action=edit&delfriend="+encodeURIComponent(oldfriend);
};
function qui_openWatchList() {
document.location.href = mw.config.get('wgServer') + mw.config.get('wgScript') + "?title=Special:Whatlinkshere/User:"+encodedUserName+watcherspage;
};
function qui_lastseenString( our_lastseentime ) {
var lastseentime = our_lastseentime.getTime();
var currentDate = new Date().getTime();
var aminute = 60000; var ahour = 60*aminute; var aday = 24*ahour; amonth = 30.5*aday; var ayear = 12*amonth;
var aminuteAgo = currentDate - aminute*1.5;
var ahourAgo = currentDate - ahour*1.5;
var adayAgo = currentDate - aday*1.5;
var amonthAgo = currentDate - amonth*1.5;
var ayearAgo = currentDate - ayear*1.5;
if( lastseentime < ayearAgo )
return ""+Math.round((ayearAgo - lastseentime) / ayear)+"y";
else if( lastseentime < amonthAgo )
return ""+Math.round((amonthAgo - lastseentime) / amonth)+"mo";
else if( lastseentime < adayAgo )
return ""+Math.round((adayAgo - lastseentime) / aday)+"d";
else if( lastseentime < ahourAgo )
return ""+Math.round((ahourAgo - lastseentime) / ahour)+"h";
else if( lastseentime < aminuteAgo )
return ""+Math.round((aminuteAgo - lastseentime) / aminute)+"m";
else return "<m";
};
// Cookie helpers, modified from en.wiktionary
function qui_setCookie(our_cookieName, our_cookieValue, our_hours, our_path, our_domain, our_secure) {
var expire = new Date();
var nHours = our_hours;
expire.setTime( expire.getTime() + (3600000 * nHours) );
document.cookie = our_cookieName + "=" + escape(our_cookieValue)
+ ((expire) ? "; expires=" + expire.toGMTString() : "" )
+ ((our_path) ? "; path=" + our_path : "" )
+ ((our_domain) ? "; domain=" + our_domain : "" )
+ ((our_secure) ? "; secure" : "" );
}
function qui_getCookie(cookieName) {
var start = document.cookie.indexOf( cookieName + "=" );
if ( start == -1 ) return "";
var len = start + cookieName.length + 1;
if ( ( !start ) &&
( cookieName != document.cookie.substring( 0, cookieName.length ) ) )
{
return "";
}
var end = document.cookie.indexOf( ";", len );
if ( end == -1 ) end = document.cookie.length;
return unescape( document.cookie.substring( len, end ) );
}
function qui_deleteCookie(cookieName) {
var the_cookieValue = qui_getCookie(cookieName);
if ( the_cookieValue ) {
qui_setCookie( cookieName, "", -48, "/", false, false);
}
}
function qui_APIToJSDate(api_date) {
var hourpart = api_date.slice(api_date.indexOf('T')+1, api_date.indexOf('Z'));
var hourparts = hourpart.split(":");
var datepart = api_date.slice(0, api_date.indexOf('T'));
var dateparts = datepart.split("-");
var js_date = new Date( dateparts[0], dateparts[1]-1, dateparts[2], hourparts[0], hourparts[1], hourparts[2], 0);
return js_date;
}
if( navigator.appName == "Microsoft Internet Explorer" && wgUserName != "TheDJ" )
jsMsg( "The script User:TheDJ/qui.js is currently not yet compatible with Internet Explorer and therefore disabled." );
else
addOnloadHook( qui_init );
/* </nowiki></source> */