There are 56 previous versions of this script.
Add Syntax Highlighting (this will take a few seconds, probably freezing your browser while it works)
// ==UserScript==
// @name Facebook MafiaWars Friendslinks
// @namespace
// @description Adding MafiaWars links to Facebook Friendlist
// @copyright 2009 - May, Don Papy
// @version 1.0
// @include http://www.facebook.com/*friends/*
// @include http://www.facebook.com/*
// @include http://www.new.facebook.com/*friends/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js
// @unwrap
// ==/UserScript==
/*
//======================================================================
// Script change log
//======================================================================
08MAY09 (0.1) Initial Script Created
09MAY09 (0.2) Replaced function to add friend to MafiaGang with direct AJAX call.
Added www.new.facebook link to script include list.
Script will add user in the background and reports end by adding ADDED before friend name.
10MAY09 (0.3) Added sctructure and comments to script for better reading - Included Change log
Event listener added to remove FaceBook Top Bar button when moving away from the Friends list.
Including code preparation to add Invite ALL and Invite CHECKED to Mafia Gang.
Added progress indicator during AJAX activity.
13MAY09 (0.4) Improved the AJAX progress indicator, with opaque box on fixed location while scrolling.
Included DEBUG capabilities in script (mainly to help during development).
First version of "add all friends" functionality built in upon request.
Changed button (conform current style) to add all users in friendlist.
21JUN09 (0.5) Updated Add-links (fix from recent FB-changes that broke the script)
26JUL09 (0.6) Updated Add-links again (fix from recent FB-changes that broke the script)
01AUG09 (0.7) Fix from recent FB-changes that broke the script.
16AUG09 (0.8) Vanity tag supported on Friendlist.
18AUG09 (0.9) Capability included to add friend to gang directly from FaceBook Profile Page.
Framework added to group more commands under one button in FaceBook Title Bar.
Added new update capability, including command in menu to manually check version.
Introducing BUILD numbers to allow for intermediate updates without modifying version
Quick fix to solve problem with FaceBook layout changes.
27AUG09 (1.0)
//======================================================================
// BUILD numbers change log
//======================================================================
Build 11 Initial release with DELETE capability.
Monkey Updater capability removed from script, now relying on new update function.
Daily auto version-check added, only reports if new version is available.
Build 12 Cosmetic changes and bugfixes.
Build 13 URL to add friends changed after ZYNGA fix.
Build 14 Error fixed that caused ADD-ALL to stop working.
Build 15 Change to fix failure due to FB DOM change
*/
var SCRIPT = {
url: 'http://userscripts.org/scripts/source/48627.user.js',
version: '1.0',
build: '15',
};
//======================================================================
// Enabling DEBUGGING functionality
//======================================================================
var GM_Debug = 1; //DEBUG
if(!GM_Debug) {
var GM_log = function(){}; // disable GM_log functionality
}
else if(unsafeWindow.console){ //Firebug is available
var GM_log = unsafeWindow.console.log; //log to firebug console
var console = unsafeWindow.console; //enable the firebug console commands
}
//======================================================================
// Definition of global variables in script
//======================================================================
// Find your FaceBook ID to use in ADD-links
//******************************************
var myownIDlink = $('#universal_search_input').html();
var myownID = myownIDlink.match(/search_friend_source\("(\d+?)-/img)[1];
var theURL = 'http://apps.facebook.com/inthemafia/remote/html_server.php?xw_controller=war&xw_action=add&xw_city=1&friend_id=';
// Create an array to store user ID's in
//***************************************
var allids = [];
var invalidusers=0;
//======================================================================
// List of Embedded Images in Script
//======================================================================
var MWAddIMG = '<img src="' + 'data:image/gif;base64,R0lGODlhIAAQAPcAAAAAAP////Pt9UVERvHw8uXj6Pb1+PHw8+7t8fn5+3Bwcfb3+PT19vX29vT19eXm5trb28LDw+3w7/b49/T29e7w797j4O7x7+3y7t/l4KvBrrnIu9bd19zj3bzOvsHTw8LSxNvj3Nri26C8o7/Wwb3Rv7/SwZ69oKLHpJ2/n6jAqbrTu7LIs63DrrrPu8PVxFaTV1GHUmyobmujbHOfdIOzhIWyhpK0kwCtAACkAACQAAB8ADSaNCp8Kk2JTWeeZ4G0gX2lfaTHpNPd0+/07+7y7j4/PvX39fn6+fj5+Pb39trb2gKzACqWKDCiLjCiLzKOMDeNNjeINlCVTmWrY1yaW3W+c1+WXmyoa4G0gI/DjpC+jwedAECqO1itVGfBZGrDZmO3YGzBaHTAcHK3b4/CjQ/BAAquABCQBhqpESO2GCWtGkHWNUHKNkTFO0vJQlzUUkygRWTRXFOqTWXNXlSpTmzMZV+uWRLPABHNABzhByHtCiXnECWyFjnoJjC/IUv4OETGN0vFPlDSRFXXSGnyXXj+al7BVXz6cIP/dXvwcHTGbRXEARvaBT7yKTmnLFXqRFXjRGDmUGzwW/39/fz8/Pr6+vn5+fT09PPz8/Hx8evr6+Xl5ePj49/f39ra2tfX19PT08/Pz8jIyMXFxcHBwb+/v7q6ura2tqysrKqqqqampp6enpubm5eXl5GRkY2NjYuLi4WFhYCAgH9/f3R0dHNzc2pqamZmZmJiYl5eXldXV1BQUEpKSkdHR0BAQD4+Pjk5OTQ0NDIyMi4uLioqKiQkJB4eHhsbGxkZGRcXFxEREQkJCQYGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAIAAQAAAI/wCP/QImTNivYwAAKPsVTFiwX8YoSZxIsSKlZr9YqUrlCqHCWKpUterFTAQMKlWCXLBIEYCxVKJElRKWcFiqUaNUEQMQIoyiRTYksJzoMhWoUJ9sJcQVUxQqYwA6fEFEp0aFoRIBHEPVyROnU8iWrfK0BEIEI8ksiEkEJwsBJHAtWdRqahMnu7t6geLEocQKEi80gDFESMaGDyY8gEhSUSspTJouXWolKzILKWrYyLFTCJKgOXHq3JkSo0hjY6AoXTJ16dMoTKNcQGGixxEgP38eBYokadKhK0QaF/uk+lYoiZ9qteixQ0cOHGfQ9Gnj5s2gLj4wNBbWSTUtVBJP2a8acmJLGS1AmnBh5GWEEBQpVBxp/IuTd1gSX9nKpOSBggEF8GBGI2QI0IADFExQSWPB2EeJLbtoggkuuGBCySa+AJDBE3jwYcUBWFECADHEUXKLMaJ8Mkwul1zYS1RO5LHHGAiECEAxqZnIzCqoMKOLhZz8AgAlUaSxBhYG2BhMd5TUAsAtTt5iISa8DEnDDD/cwEACC3S5QEXA1OLKK67EAkwwZ8rCypqz/BKiRQEBADs='+ '" BORDER=0/>';
var MWHitlistIMG = '<img src="' + 'data:image/gif;base64,R0lGODlhIAAQAPcAAP//////zP//mf//Zv//M///AP/M///MzP/Mmf/MZv/MM//MAP+Z//+ZzP+Zmf+ZZv+ZM/+ZAP9m//9mzP9mmf9mZv9mM/9mAP8z//8zzP8zmf8zZv8zM/8zAP8A//8AzP8Amf8AZv8AM/8AAMz//8z/zMz/mcz/Zsz/M8z/AMzM/8zMzMzMmczMZszMM8zMAMyZ/8yZzMyZmcyZZsyZM8yZAMxm/8xmzMxmmcxmZsxmM8xmAMwz/8wzzMwzmcwzZswzM8wzAMwA/8wAzMwAmcwAZswAM8wAAJn//5n/zJn/mZn/Zpn/M5n/AJnM/5nMzJnMmZnMZpnMM5nMAJmZ/5mZzJmZmZmZZpmZM5mZAJlm/5lmzJlmmZlmZplmM5lmAJkz/5kzzJkzmZkzZpkzM5kzAJkA/5kAzJkAmZkAZpkAM5kAAGb//2b/zGb/mWb/Zmb/M2b/AGbM/2bMzGbMmWbMZmbMM2bMAGaZ/2aZzGaZmWaZZmaZM2aZAGZm/2ZmzGZmmWZmZmZmM2ZmAGYz/2YzzGYzmWYzZmYzM2YzAGYA/2YAzGYAmWYAZmYAM2YAADP//zP/zDP/mTP/ZjP/MzP/ADPM/zPMzDPMmTPMZjPMMzPMADOZ/zOZzDOZmTOZZjOZMzOZADNm/zNmzDNmmTNmZjNmMzNmADMz/zMzzDMzmTMzZjMzMzMzADMA/zMAzDMAmTMAZjMAMzMAAAD//wD/zAD/mQD/ZgD/MwD/AADM/wDMzADMmQDMZgDMMwDMAACZ/wCZzACZmQCZZgCZMwCZAABm/wBmzABmmQBmZgBmMwBmAAAz/wAzzAAzmQAzZgAzMwAzAAAA/wAAzAAAmQAAZgAAMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAIAAQAAAI/wBZCRzI6ppBggIBKFyIZcbChwCusbJC0UpBgxUtXgOAyEuLBCATQFwo0cqKkxcnnhSE5eOAkC0+ChoZUeXJQAYDnVzxEWZMkAOw0JS4E+U1kyexvPwpoGkCBC2GsloBgOqKQFN3ChKAAAFXkDG5thpJ9CHFh6y6xvzotauAmRDLVq1qdWELrk0RJIjp9QrZqQp1Kry68MpXvk2bRo0LGIDgqoEWbnWbN6yAsQ/lBrKi0Erkqqwq//TaFC7JxoE+p16YlnJit34zo87K6jMAVnfzshgtYPFpqo6Prrj2eQUrwzFZkG7KIvbvwMRx2g60NbGA5qYh1s5IMKPFFlcCIQSiCTEgADs=' + '" BORDER=0/>';
var MWProfileIMG = '<img src="' + 'data:image/gif;base64,R0lGODlhIAAQAPcAAAAAAP///4J3eXZrb2tlbi8rSltacLy8yAcJRQ0OQgwNOhARSA4PLAsNPBMWVxYZVB4hXh4hXB8iWiksZBMXRR4jZxsfWRQXOyMnYCUpYygsYSktYi4yaTE2bC0wWDc7aS4zZzI3ajI4ajQ5bjI3aTQ5bS80YjQ6azc8biwwVkBGfEBGej1DdDxBcj9FdiUtZicuXTxCckFHd0JIeDxCbElQgkhPfUxTg0ZMdURMeEdOeUlQeycrQUlQeFJZglNag0VLalJYd0VPeFlkk1Fag1JchF9okTM3SNDS22FrkllihXB6oFhgfG59q295m19pai8kFnlbO++1dq2EVtGfaZJwSfe8fS8kGMGUY5JwS29WOXBWOpBvS6eBWJh7W450VoFhP6qCWHRYPF1HMLSKXqN9VYpqSNmnctGhbsyda7mOYZRyTsOWZ515U5d0UKB9WEk5KYh3ZmhWTS0iIP39/fn5+fT09PHx8evr6+Xl5ePj49/f39ra2tfX19PT08/Pz8jIyMXFxcHBwb+/v7q6ura2tqysrKqqqqampp6enpubm5eXl5GRkY2NjYuLi4WFhX9/f3R0dHNzc2pqamZmZmJiYl5eXldXV0pKSkBAQD4+Pjk5OTQ0NDIyMi4uLioqKiQkJB4eHhsbGxcXFxEREQkJCQYGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAIAAQAAAI/wBDZdLEiVOmUAAAjMq0idOmTKDoSJxIsSIdU5kSHTK0CKFCR4cOKcLEREkPHhZTAgBl6M8fQZwSdjIECNChJ02G1FCRImXFlYb6+OEjKSEll38KxRFggMaLChd8TgQQqpCePXkIiSKFaA8fPmOsSKHyRk4BBFIlUh2EJ0/bS5j65NGTx8wZNGmwTKkyJy0dqoHs3KlTR9GjwXfuiGGjhkwXN1yg+F3Zh06dQXX4ALIDqA6dK2HKtFljRovfv5/4WJ7kRyKfSHjo4IGTBUyULaf/ctJjGVIhiYQk3ZEtZICXLwRgnAaQKU/vRhIZSbLDYISTIgeQ5CABYfIm53QkXXq6Y4cSJTsejCxJ8sNHjBMZFKQF4Ek1nUmg/vDpVKkOkSBHAHGDDC2AgAEF831S2X2lIFJIKZbYYcMOOOgwQwsiaGDBAvNtwhsdkQAwSYiT2PHBCi6wgEIIG0jgQANpaRLJIows4ogmm+D4SCKJmFBCBxxMEMEDCfgVEAA7' + '" BORDER=0/>';
var AjaxIndicator = '<img src="' +
'data:image/gif;base64,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'+ '" BORDER=0/>';
var MWAddAllIMG = '<img src="' +
'data:image/gif;base64,R0lGODlheAAQAPcAAPPt9UVERvHw8uXj6Pb1+PHw8+7t8fn5+3Bwcfb3+PT19vX29vT19eXm5trb28LDw+3w7/b49/T29e7w797j4O7x7+3y7t/l4KvBrrnIu9bd19zj3bzOvsHTw8LSxNvj3Nri26C8o7/Wwb3Rv7/SwZ69oKLHpJ2/n6jAqbrTu7LIs63DrrrPu8PVxFaTV1GHUmyobmujbHOfdIOzhIWyhpK0kwCtAACkAACQAAB8ADSaNCp8Kk2JTWeeZ4G0gX2lfaTHpNPd0+/07+7y7j4/PvX39fn6+fj5+Pb39trb2gKzACqWKDCiLjCiLzKOMDeNNjeINlCVTmWrY1yaW3W+c1+WXmyoa4G0gI/DjpC+jwedAECqO1itVGfBZGrDZmO3YGzBaHTAcHK3b4/CjQ/BAAquABCQBhqpESO2GCWtGkHWNUHKNkTFO0vJQlzUUkygRWTRXFOqTWXNXlSpTmzMZV+uWRLPABHNABzhByHtCiXnECWyFjnoJjC/IUv4OETGN0vFPlDSRFXXSGnyXXj+al7BVXz6cIP/dXvwcHTGbRXEARvaBT7yKTmnLFXqRFXjRGDmUGzwW/////39/fz8/Pr6+vn5+fT09PPz8/Hx8evr6+Xl5ePj49/f39ra2tfX19PT08/Pz8jIyMXFxcHBwb+/v7q6ura2tqysrKqqqqampp6enpubm5eXl5GRkY2NjYuLi4WFhYCAgH9/f3R0dHNzc2pqamZmZmJiYl5eXldXV1BQUEpKSkdHR0BAQD4+Pjk5OTQ0NDIyMi4uLioqKiQkJB4eHhsbGxkZGRcXFxEREQkJCQYGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAeAAQAAAI/wCN+foVLJgvY82aJfMFLBgwX8WYSZxIsaLFixgzatzIsaNHX6tSoWqFUCGsVKlY8VoGwoWUKT8qTJpJs6akmzhz6tzJs6fPn0CD+mTWrBiqUKFIBUsoDJUoUamGNfvwBVEiGhBqap0ktKvXr2CDEjX6CZSnWglvIQ11qlizDV0MyZkxYavNsHjz6u1J1NgpTp02mTqmTFWnJA4eEEFGAcwhN1cEGJlciaZErjcp4tTMl9nmnJ47X8wsUVJF06FNky69eeLmZsZKado0WxevT5s0jEghogUGL4QEwcjQgQQHD0dmXv6cubnznaxVM+eZWrr00NVRM0+NfXrfUZcyWf+yxCqWeBVQ0KiBQ2eQI0Bx3sypE+XFkEmXuYO2zp/09f18Afhff551x1+B1BX1ySSWlGKJJ6JcIgoLTiiBByN+8NFHI388AkkkhVQhBH7KTadaddkNiOJQAhqYHYIDNpeiac0Q4wmDtoAykye0rLBDDjjcYEMZZuyxBhttBLIFDxaQiJ+JMD63nZQzrmbRdq6dCOOKqKHYTDCcMDjLKTOZUksQJWQxBhY+LKGFIlyEAIQJJ6BQhJP6fcYlgAZKqROXeb4oI5V/vubLJmK+MpMrtWCCRAMIBDCADmQsIgYACzAgQQSUXHngp6Cdtid0fE5Zap8EvgYMopPUoksml9yrcsslk2jSSzMXNGGHHlQUoBUzNfUpLKl6Ckjscy4W6p91w2bWzDA3TmJLMaF4IgwultTKy1tM3JFHGAb8GqyVrUVnbIGucXZuqKWJ2hq55YJW44LSLqPKKcvkQusmvjQzyRNnpGEFAXbRtNfBCIdFFDBhTkJLM7Y8bAutl+zirwwx9FCDAgck4HECWiUs8shD/UJLK660AssvwLAcyyowy+LRzDTXbPPNFgUEADs='+'" BORDER=0/>';
//======================================================================
// Interface Preparation Functions for Adding Friends
//======================================================================
function ShowFriendsLinks() {
allids=[];
// ################### BEGIN INTERFACE FOR FRIEND ADDING ON FRIENDLIST PAGE ###################
if($("#FriendsPage_Search").length > 0){
//======================================================================
// Build Help Information content
//======================================================================
if(!$("#AddHelpData").length > 0 ){
var helpdata="<div id='AddHelpData'style='position:relative; left: 7px; height:40px; margin-bottom: 10px; margin-top:10px'>";
helpdata+="<div id='AddAllDIV' style='position:absolute; top:0px; left:7px; width:250px; margin-bottom:4px'>"
helpdata+="<a id='InviteAll' class = 'InviteAll' href='#'>"
+ MWAddAllIMG+ "</a>";
helpdata+="</div><div id='FriendButtons' style='position:absolute; top:0; right:10px'>";
helpdata+=MWAddIMG+"= Add to MW Gang <BR \>";
helpdata+=MWProfileIMG+"= Show MW Profile <BR \>";
helpdata+=MWHitlistIMG+"= Hitlist <BR \>";
helpdata+="</div></div>";
$('#FriendsPage_ContentContainer').before(helpdata); // Show Help Information container above friendlist
$('#InviteAll').bind('click', function() {addAll();}); // Add function to "Add All Friends" Button
}
//======================================================================
// Insert ADD-buttons & -actions to every user object on friendlist page
//======================================================================
$('.UIObjectListing_Title').each(function(){
// Check if we can get id of friend from link on friend object in list
try{var userid = this.href.match(/\d{7,16}/)[0]; var vanity=0;}
// No ID found, so user has Vanity URL. Check picture for ID reference.
catch(err){
var pic = $(this).parent().parent().children("div.UIObjectListing_Pic").html();
var userid = pic.match(/\d{7,16}/);
if (userid==null){var vanity=2;}else{var vanity=1;}}
// Assign colors for user ID, based on above checks (ID, Vanity or No ID).
if (vanity==1){ var Vstart = "<font style='color: #000099;'>"; var Vend = "</font>";
}else if (vanity==0){ var Vstart = "<font style='color: #009900;'>"; var Vend = "</font>";
}else if (vanity==2){ var Vstart = "<font style='color: #FF0000;'>"; var Vend = "</font>"; }
if (vanity!=2){
allids.push(userid); // Add id to our array
}
// Create a DIV wrapper object to contain all the link buttons
var invitelink ="<div class = 'MWBox' id='MWBox"+userid+"'><div id='MWPics' style='float:left; width:130px'>";
// Add frame to capture response from ADD action
if (vanity==1){invitelink +="<div id='MWResponse"+userid+"'><B>VID=</B>"+Vstart+userid+Vend+"</div>";
}else if(vanity==0){invitelink +="<div id='MWResponse"+userid+"'><B>UID=</B>"+Vstart+userid+Vend+"</div>";
}else if (vanity==2){invitelink +="<div id='MWResponseUnknown'>"+Vstart+"<B>ERROR: </B>no ID found"+Vend+"</div>";
invitelink +="<div style='float:left'>Add from FB Profile</div>";}
if (vanity!==2){
// Add button for function to add friend to MafiaWars
invitelink +="<div style='float:left'><a id='MWConnect"+userid+"' class = 'MWConnect' href='#'>" +MWAddIMG+ "</a></div>";
// Add button to check MafiaWars Profile
//**************************************
invitelink +="<div style='float:left'><a id='MWProfile"+userid+"' class = 'MWProfile' href='http://apps.facebook.com/inthemafia/"+
"remote/html_server.php?&xw_controller=stats&xw_action=view&user="+userid+"' target='_MW'>" +MWProfileIMG+ "</a></div>";
// Add button to put user on Hitlist - Opens Hitlist screen in MW for this friend
//*******************************************************************************
invitelink +="<div style='float:left'><a id='MWHitlist"+userid+"' class = 'MWHitlist' href='http://apps.facebook.com/inthemafia/"+
"remote/html_server.php?&xw_controller=hitlist&xw_action=set&target_id="+userid+"' target='_MW'>" +
MWHitlistIMG+ "</a></div></div></div>";
}
$(this).before(invitelink);
if (vanity!==2){
// Send AJAX command to MafiaWars to add friend to my Mafia
//*********************************************************
$('#MWConnect'+userid).bind('click', function(responseDetails) {
$("#busyBox").show(); //Show Ajax Indicator
GM_xmlhttpRequest({
method: "GET",
url: theURL+userid,
onload: function(response) {
$("#busyBox").hide(); //Hide Ajax Indicator
if (response.status=200){
$('#MWResponse'+userid).html('<B>ID: </B>'+Vstart+userid+Vend+'<br> added to MafiaWars.');
}else{
$('#MWResponse'+userid).html('ERROR DETECTED!');
}
GM_log("UserID "+userid+": response-status= "+response.status);
}
});
return false;
});
}
});
// ################### END INTERFACE FOR FRIEND ADDING ON FRIENDLIST PAGE ###################
} else if($("#profileimage").length > 0) {
// #################### BEGIN INTERFACE FOR FRIEND ADDING ON PROFILE PAGE ###################
var userlink = $('#left_column').html();
var userid = userlink.match(/\d{7,25}/)[0];
// Create a link to add this user to MafiaWars
//************************************************************
var invitelink ="<div id='MWPics' class='profile_actions' style='padding-bottom: 0px'>";
invitelink +="<div><a id='MWConnect' class = 'profile_action actionspro_a' href='#'>" +
MWAddIMG+ "Add to my MafiaGang</a></div></div>";
invitelink +="<div id='MWResponse' style='padding: 3px 8px; border-bottom: 1px solid #D8DFEA'>FaceBook ID: <B>"+userid+"</B></div>";
$('#profileimage').after(invitelink);
// Send AJAX command to MafiaWars to add friend to my Mafia
//*********************************************************
$('#MWConnect').bind('click', function(responseDetails) {
$("#busyBox").show(); //Show Ajax Indicator
GM_xmlhttpRequest({
method: "GET",
url: theURL+userid,
onload: function(response) {
$("#busyBox").hide(); //Hide Ajax Indicator
if (response.status=200){
$('#MWResponse').html('User with ID: <B>' + userid + '</B><br>was added to your MafiaWars gang.');
}else{
$('#MWResponse').html('<B><font style="color: #FF0000;">ERROR DETECTED!</font></B>');
}
GM_log("UserID "+userid+": response-status= "+response.status);
}
});
return false;
});
}
// #################### END INTERFACE FOR FRIEND ADDING ON PROFILE PAGE ###################
return false;}
// ########################### BEGIN INTERFACE FOR FRIEND DELETION #########################
//======================================================================
// Interface Preparation Functions for Deleting FaceBook Friends
//======================================================================
function ShowDeleteLinks() {
allids=[];
invalidusers=0;
if($("#FriendsPage_Search").length > 0){
// Build Help Information content
if(!$("#DelHelpData").length > 0 ){
var helpdata="<div id='DelHelpData'style='position:relative; height:15px; margin-bottom: 10px; margin-top:10px'>";
helpdata+="<div id='Responses' style='position:absolute; top:0px; left:7px; width:250px; margin-bottom:4px'></div><div id='Buttons' style='position:absolute; top:0; right:0'>"
helpdata+="|  <a id='SelectAll' href='#'>"
+"Select All</a> ";
helpdata+="|  <a id='SelectNone' href='#'>"
+"Deselect All</a> ";
helpdata+="|  <a id='SelectDelete' href='#'>"
+"<font style='color: #FF0000;'><b>Delete Selected</b></font></a> ";
helpdata+="|</div></div>";
// Show Help Information container above friendlist
$('#FriendsPage_ContentContainer').before(helpdata);
// Attach actions to SELECT ALL CHECKBOXES button:
$('#SelectAll').bind('click', function() {
if(!$("#MWDelBox").length > 0 ){ShowDeleteLinks();}
$('#MWDelBox').each(function(){$('.CheckRemove').attr("checked", "checked");});
CountUsers();
return false;
});
// Attach actions to DESELECT ALL CHECKBOXES button:
$('#SelectNone').bind('click', function() {
if(!$("#MWDelBox").length > 0 ){ShowDeleteLinks();}
$("#Responses").html("<I>All accounts deselected.   </I>");
$('#MWDelBox').each(function(){$('.CheckRemove').removeAttr("checked");});
CountUsers();
return false;
});
// Attach actions to DELETE SELECTED USERS button:
$('#SelectDelete').bind('click', function() {
$('#MWDelBox').each(function(){$('.CheckRemove').removeAttr("checked");});
DoDelete();
return false;
});
}
//======================================================================
// Insert DELETE-buttons & -actions to every user object on friendlist page
//======================================================================
$('.UIObjectListing_Title').each(function(){
// Check if we can get id of friend from link on friend object in list
try{var userid = this.href.match(/\d{7,16}/)[0]; var vanity=0;}
// No ID found, so user has Vanity URL. Check picture for ID reference.
catch(err){ //VANITY TAG DETECTED !!!!
var pic = $(this).parent().parent().children("div.UIObjectListing_Pic").html();
var userid = pic.match(/\d{7,16}/);
if (userid==null){var vanity=2;}else{var vanity=1;} }
// Assign colors for user ID, based on above checks (ID, Vanity or No ID).
if (vanity==1){var Vstart = "<font style='color: #000099;'>";var Vend = "</font>";
}else if (vanity==0){var Vstart = "<font style='color: #009900;'>";var Vend = "</font>";
}else if (vanity==2){var Vstart = "<font style='color: #FF0000;'>";var Vend = "</font>";}
if (vanity!==2){allids.push(userid);} else {invalidusers+=1;} // Add to array(s)
// Create a DIV wrapper object to contain all the link buttons
var invitelink="<div id='MWDelBox'>";
// Add delete checkbox for users whose ID is detected
if (vanity!==2){invitelink+=
"<div id='MWRemove"+userid+"' style='float:left; width:140px' class='MWRemove'>"+
"<input type='checkbox' id='CheckRemove"+userid+
"' class='CheckRemove' value='"+userid+"' />"+" Mark to delete"+
"<div id='MWRemoveID"+userid+"' style='float:left; width:140px'>UserID: "+
Vstart+userid+Vend;
}else{// If no ID found, warn user!!!
invitelink+=
"<div id='MWRemoveNOID' style='float:left; width:140px'>"+
Vstart+" No ID detected!"+Vend+
"<div id='MWRemoveNOID' style='float:left; width:140px'>"+
"Delete manually!";
}
invitelink+="</div></div></div>";
// Update the selected # when a checkbox is clicked
$(".CheckRemove").click(function(){CountUsers();});
$(this).before(invitelink);
});
}
return false;
}
// ########################### END INTERFACE FOR FRIEND DELETION #########################
//======================================================================
// Function to support actions on listed users from the friendlist
//======================================================================
function CountUsers(){
allids=[];
$('.CheckRemove').each(function(){
var mycheckbox=$(this).is(':checked');
if(mycheckbox){
userid= $(this).val();
allids.push(userid);
}
});
$("#Responses").html("<I>" + allids.length +
" ID(s) selected. "+invalidusers+" invalid ID(s) detected.</I>");
}
function DoDelete(){
if(allids.length!==0){
var answer=confirm("OK to proceed with deleting " + allids.length +
" selected users? You can't undo or interrupt this action.");
if(answer){
//************** SCRIPT TO DELETE USERS FROM allid-ARRAY BELOW *************
jQuery.each(allids, function(i, val) {
//############### Write to list item of selected users ##############
$("#MWRemove" + val).html("<font style='color: #FF0000;'><B>Removed from friends</B>"+
"<BR>Updated next refresh.</font>");
//############### The actual DELETION happens here!!! ###############
var a=document.createElement('script');
a.innerHTML="new AsyncRequest().setURI('/friends/ajax/remove_friend.php').setData({ friend: '"+
val+"',type:'friend' }).send();";
document.body.appendChild(a);
});
//*****************************************************************************
$("#Responses").html("<I>Action completed: "+ allids.length +" selected friends removed.</I>");
return false;
}else{
$("#Responses").html("<I>Action cancelled upon your request.</I>");
return false;
}
}else{
alert("No users selected, aborting script.");
return false;
}
return true;
}
//======================================================================
// Remove buttons from every friend in list
//======================================================================
function RemoveFriendsLinks() {
if($("#FriendsPage_Search").length > 0){
$('.UIObjectListing_Title').each(function(){
$('#MWPics').remove();
$('.MWBox').remove();
$('#AddHelpData').remove();
});
allids=[];
}else{
$('#MWPics').remove();
$('#MWResponse').remove();
}
}
function RemoveDeleteLinks() {
if($("#FriendsPage_Search").length > 0){
$('.UIObjectListing_Title').each(function(){
$('#DelHelpData').remove();
$('#MWDelBox').remove();
});
allids=[];
}
}
//======================================================================
// Functions to perform when document is loaded
//======================================================================
// Add Mafiawars Menu to Facebook Top Bar
//***************************************
$(document).ready(function(){
DailyUpdateCheck();
$('#fb_menu_inbox').parent().append("<li id='MWLinks' class='fb_menu'>"+
"<a id='MWLinks' class='fb_menu_link'>MafiaWars</a>"+
"<div class='fb_menu_dropdown clearfix' id='fb_menu_mw_dropdown'>"+
"<div id='MWToggle' class='fb_menu_item'>"+
"<a class='fb_menu_item_link'>Toggle Friend-Links</a>"+
"</div>"+
"<div id='MWDelToggle' class='fb_menu_item'>"+
"<a class='fb_menu_item_link'>Toggle Remove-Links</a>"+
"</div>"+
"<div class='fb_menu_separator'></div>"+ // *******SEPARATOR IN MENU*********
"<div id='MWInviteAll' class='fb_menu_item'>"+
"<a class='fb_menu_item_link'>Add All Friends</a>"+
"</div>"+
"<div class='fb_menu_separator'></div>"+ // *******SEPARATOR IN MENU*********
"<div id='MWUpdate' class='fb_menu_item'>"+
"<a class='fb_menu_item_link'>Script Version Check</a>"+
"</div>"+
"</div>");
$('#MWToggle').click(function() {
if(!$("#MWPics").length > 0 ){
RemoveFriendsLinks();
RemoveDeleteLinks()
ShowFriendsLinks();
}else{
RemoveFriendsLinks();
RemoveDeleteLinks();
}
});
$('#MWDelToggle').click(function() {
if(!$("#MWDelBox").length > 0 ){
RemoveDeleteLinks();
RemoveFriendsLinks();
ShowDeleteLinks();
}else{
RemoveFriendsLinks();
RemoveDeleteLinks();
}
});
$('#MWInviteAll').click(function() {
addAll();
});
$('#MWUpdate').click(function() {
updateScript('man');
});
// Create a hidden box to show activity and progress during AJAX calls
//********************************************************************
$("body").append("<div id='busyBox' class='busyBox' style='z-index:1000; position: fixed; width: 100%; height:72px; top:0px; background-color:#00FF00; opacity:0.9; display:none'></div>");
$("#busyBox").html("<div style='padding: 16px;width: 350px; height: 50px; margin-left:auto; margin-right:auto; text-align:center'>Performing AJAX call...<\BR>"+AjaxIndicator+"<\BR><B>Please wait</B></div>");
$("#busyBox").hide();
// Remove button from Facebook Top Bar
//************************************
window.addEventListener("unload", function(e) {
$('#ScriptLinks').remove();
}, false);
});
//======================================================================
// Function to perform the AJAX calls for massinvite
//======================================================================
function addAll(){
if(!$("#HelpData").length > 0 ){
RemoveFriendsLinks();
RemoveDeleteLinks()
ShowFriendsLinks();
}
GM_log("Number of friends found:" + allids.length);
var i = 0;
var addID = 0;
// Begin of AJAX-function to add all friends
if (allids.length>0){
//$("#busyBox").show(); //Show Ajax Indicator
while(i<allids.length){
addID=allids[i];
doAJAX(addID);
i++;
}
}else{
$("#busyBox").hide(); //Hide Ajax Indicator
}
// End of AJAX-function to add all friends
//$("#busyBox").hide(); //Hide Ajax Indicator
}
function doAJAX(nr)
{
GM_log("Sending request to connect user with FaceBook ID: "+nr); //DEBUG
GM_xmlhttpRequest({ method: "GET",
url: theURL+nr,
onload: function(response) {
if (response.status=200){
$('#MWResponse'+nr).html('<B>ID: </B>'+nr+'<br> added to MafiaWars.');
}else{
$('#MWResponse'+nr).html('<B><font style="color: #FF0000;">ERROR DETECTED:</B><br> User not added.</font>');
}
GM_log("UserID "+nr+": response-status= "+response.status);
}
});
return false;
}
//======================================================================
// Update the script (Credits to Richard Gibson; ms99 and blannie)
//======================================================================
function updateScript(utype) {
var today = new Date();
GM_setValue('FriendLinksUpdaterLastCheck', String(today));
GM_log=("Preparing version check for script on "+SCRIPT.url); //DEBUG
GM_xmlhttpRequest({
method: 'GET',
url: SCRIPT.url + '?source', // don't increase the 'installed' count; just for checking
onload: function(result) {
if (result.status != 200) {
return;
}
if (!result.responseText.match(/build:\s+'(\d+)/)) return;
var theOtherBuild = parseInt(RegExp.$1);
var runningBuild = parseInt(SCRIPT.build);
GM_log=("Current build installed is: "+runningBuild); //DEBUG
var theOtherVersion = result.responseText.match(/@version\s+([\d.]+)/)? RegExp.$1 : '';
//BETA VERSION DETECTED
if (theOtherBuild < runningBuild) {
if (window.confirm('It seems that you have a beta version of the script (build ' + runningBuild + ') installed.\n\nClick OK to DOWNGRADE to the most recent official release (version: ' + theOtherVersion + ' - build: '+theOtherBuild+ ').\n\nAn automated update-check will be done again in 24 hours.\n\n')) {window.location.href = SCRIPT.url;}return;
//NEW RELEASE DETECTED
} else if (theOtherBuild > runningBuild || theOtherVersion != SCRIPT.version) {
if (window.confirm('Version ' + theOtherVersion + ' - build: '+theOtherBuild+ ' is available!\n\n' + 'Do you want to upgrade?' + '\n')) {
window.location.href = SCRIPT.url;}
//VERSION IS CURRENT
} else {
if(utype=='man'){
alert('You already have the latest version.');
return;
}else{
}
}
}
});
}
function DailyUpdateCheck(){
var lastupdatecheck = GM_getValue("FriendLinksUpdaterLastCheck", "never");
var today = new Date();
var one_day = 24 * 60 * 60 * 1000;
if(lastupdatecheck != 'never'){
today = today.getTime();
var lastupdatecheck = new Date(lastupdatecheck).getTime();
var interval = (today - lastupdatecheck) / one_day;
if(interval >= 1){
updateScript('auto');
}else{
}
}else{
updateScript('auto');
}
}
