// ==UserScript==
// @name Bug me not
// @author Simon Houston 
// @namespace http://opera.oslocity.org/shoust/ 
// @version 1.0
// @description  Allows the user to search BugMeNot.com service for
//			accounts to bypass compulsory authentification
//			on the site he/she is viewing.
// @ujs:category general: enhancements
// @ujs:published 2006-01-30 18:12
// @ujs:modified 2006-01-31 09:45
// @ujs:documentation http://userjs.org/scripts/general/enhancements/bug-me-not 
// @ujs:download http://userjs.org/scripts/download/general/enhancements/bug-me-not.js
// ==/UserScript==


/* 
 * This script is granted to the Public Domain.
 */

/*
	--- Changes made by userjs.org moderator (ROBO Design; robodesign.ro)

	To use the script press Ctrl+Shift+Double Click.

	To activate the script you can also use this bookmarklet:
	javascript:if(window && window.ujs_shoust_bugmenot) void(window.ujs_shoust_bugmenot.init()); else alert('Bug Me Not UserJS is probably not installed.');

	Same code can be used for making a button, menu item, keyboard shortcut, mouse gesture or voice command.

*/

document.addEventListener('load', function ()
{
	if(window.ujs_shoust_bugmenot)
		return false;

	window.ujs_shoust_bugmenot = new (function ()
{
	var manager = this;

	manager.teedee = -4; /* To toggle between the various logins for later */
	manager.teedi = -3;
	manager.empha = -1;

	manager.basename = 'ujs-shoust-bugmenot';
	manager.domain = 'bugmenot.com';
	manager.url = 'http://www.'+manager.domain+'/view.php?url=';

	manager.init = function ()
	{
		// do not allow running this script on manager.domain
		
		if (location.hostname.indexOf(manager.domain) != -1)
			return false;

		if (document.getElementById(manager.basename+'-bar'))
		{
			manager.resetdatas();
			/* Closes the bar and resets the values if the function is called again */
		} else {
			var bgment = document.createElement('div');
			/* Creating the toolbar element */
			bgment.style = "position:fixed; z-index:9999; bottom:0; height:30px; overflow:hidden; color:black; font:14px Arial; width:100%; background: -o-skin('Window Skin');display:block;margin:0;padding:0;float:none";
			bgment.id = manager.basename+'-bar';

			var obj = document.createElement('object');
			obj.id = manager.basename+'-obj';
			obj.data = manager.url + location.hostname;
			obj.style = 'visibility:hidden;width:0;height:0;position:absolute';
			
			obj.addEventListener('load',manager.nextlogin, false);
			bgment.appendChild(obj);
			
			var fetching=document.createElement('div');
			fetching.style='background-color:white;display:inline-block;border:1px dotted black;position:static;float:none;margin:0;padding:5px;height:20px';
			fetching.appendChild(document.createTextNode('Fetching possible logins'));
			bgment.appendChild(fetching);

			document.documentElement.appendChild(bgment);
		}
	}

	if (location.hostname.indexOf(manager.domain) == -1)
	{
		document.addEventListener('message',
			function(ev)
			{
				var splitted = ev.data.split(' ');
				/* The data sent back from bugmenot */

				if(splitted[0] != (manager.basename+'-msg'))
					return false;

				var usr = unescape(splitted[1]),
					pass = unescape(splitted[2]),
					ssrate = splitted[3],
					gmmnm = parseInt(splitted[6]),
					gmmnmy = parseInt(splitted[7]),
					bar = document.getElementById(manager.basename+'-bar');
				var gmmnmyt = gmmnm/4;

				if(!bar)
					return false;

				if (splitted[3] == 0)
				{
					alert(usr+' '+pass);
					manager.resetdatas();
					/* returned when no logins are found */
				} else if (document.getElementById(manager.basename+'-usr')) {
					if((manager.teedee+4) == gmmnm)
						document.getElementById(manager.basename+'-next').disabled = true;
					else
						document.getElementById(manager.basename+'-next').disabled = false;
					
					if((manager.teedee-4) == (gmmnm-gmmnm-4))
						document.getElementById(manager.basename+'-prev').disabled = true;
					else
						document.getElementById(manager.basename+'-prev').disabled = false;
					var tmp = document.getElementById(manager.basename+'-noflogins');
					tmp.removeChild(tmp.firstChild);
					tmp.appendChild(document.createTextNode(gmmnmy+' of '+gmmnmyt));
					document.getElementById(manager.basename+'-usr').value = usr;
					document.getElementById(manager.basename+'-pwd').value = pass;
					
					tmp = document.getElementById(manager.basename+'-ssrate');
					tmp.removeChild(tmp.firstChild);
					tmp.appendChild(document.createTextNode(ssrate));
				} else {
				
					bar.removeChild(bar.lastChild);
					var stye='background-color:white; display:inline-block; border:1px dotted black; position:static; float:none; margin:0; padding:5px; width:auto; height:20px; font:14px Arial; color:black';
					var styeinput = 'position:relative; display:inline-block; height:auto; float:none; vertical-align:middle; top:-10px;height:30px';
					var ssrate = splitted[3];
					// Close button
					var tmp=document.createElement('input');
					tmp.style=styeinput+';width:auto';
					tmp.type = 'button';
					tmp.value = 'X';
					tmp.title = 'Close the bar';
					tmp.addEventListener('click', manager.resetdatas, false);
					bar.appendChild(tmp);
					// Username
					var usrnme=document.createElement('label');
					usrnme.style=stye;
					usrnme.setAttribute('for', manager.basename+'-usr');
					usrnme.appendChild(document.createTextNode('Username'));
					bar.appendChild(usrnme);
					tmp = document.createElement('input');
					tmp.id = manager.basename+'-usr';
					tmp.value = usr;
					tmp.style = styeinput+";width:130px";
					bar.appendChild(tmp);
					// Password
					var psswd=document.createElement('label');
					psswd.style=stye;
					psswd.setAttribute('for', manager.basename+'-pwd');
					psswd.appendChild(document.createTextNode('Password'));
					bar.appendChild(psswd);
					tmp = document.createElement('input');
					tmp.id = manager.basename+'-pwd';
					tmp.value = pass;
					tmp.style = styeinput+";width:130px";
					bar.appendChild(tmp);
					// Success rate
					var sur=document.createElement('div');
					sur.style=stye+";border-right:0";
					sur.appendChild(document.createTextNode('Success rate:'));
					bar.appendChild(sur);
					tmp = document.createElement('strong');
					tmp.style=stye+";font-weight:bold;border-left:0";
					tmp.id = manager.basename+'-ssrate';
					tmp.appendChild(document.createTextNode(ssrate));
					bar.appendChild(tmp);
					// Previous login
					tmp = document.createElement('input');
					tmp.type = 'button';
					tmp.id = manager.basename+'-prev';
					tmp.disabled = true;
					tmp.value = '<<';
					tmp.title = 'Previous login';
					tmp.style = styeinput+";width:auto";
					tmp.addEventListener('click', manager.prevlogin, false);
					bar.appendChild(tmp);
					// Next login
					tmp = document.createElement('input');
					tmp.type = 'button';
					tmp.id = manager.basename+'-next';
					tmp.value = '>>';
					tmp.style = styeinput+";width:auto";
					tmp.title = 'Next login';
					if((manager.teedee+4) == gmmnm)
						tmp.disabled = true;
					tmp.addEventListener('click', manager.nextlogin, false);
					bar.appendChild(tmp);
					tmp = document.createElement('input');
					tmp.type = 'button';
					tmp.value = '^';
					tmp.style = styeinput+";width:auto";
					tmp.title = 'Use another pages login\'s';
					tmp.addEventListener('click', function(){
						var fgd=prompt('Get Another URLs passwords?','');
						if(!fgd)
							return false;
						document.getElementById(manager.basename+'-obj').data = manager.url+fgd;
						document.getElementById(manager.basename+'-ologins').href = manager.url+fgd;
						manager.teedee = -4;
						manager.teedi = -3;
						manager.empha = -1;
					}, false);
					bar.appendChild(tmp);
					// Number of logins
					tmp = document.createElement('span');
					tmp.style = stye;
					tmp.id = manager.basename+'-noflogins';
					tmp.appendChild(document.createTextNode(gmmnmy + ' of ' + gmmnmyt));
					bar.appendChild(tmp);
					// Wand = login to site using the current user name and password
					tmp = document.createElement('input');
					tmp.type = 'button';
					tmp.title = 'Login to site using the current user name and password'
					tmp.style = "background:-o-skin('Wand'); position:absolute; right:0; height:30px; width:30px;";
					tmp.addEventListener('click', manager.logintosite, false);
					bar.appendChild(tmp);
					// Open logins
					tmp = document.createElement('a');
					tmp.href = manager.url+location.hostname;
					tmp.id = manager.basename+'-ologins';
					tmp.style = 'position:absolute; right:30px; background-color:white; border:1px dotted black; float:none; padding:5px; height:20px; width:auto; font:14px Arial; color:black;';
					tmp.appendChild(document.createTextNode('Open logins'));
					bar.appendChild(tmp);
				}
			},
		false);
	} else {
		document.addEventListener('message', function(ev)
			{
				if(ev.data == '')
					return false;

				var received = ev.data.split(' ');
				if(received[0] != (manager.basename+'-msg'))
					return false;

				var tds = document.getElementsByTagName('td');
				var totalogins = tds.length,
					nototalogins = received[4];

				if (totalogins == 0)
				{
					var username = 'No',
						password = 'logins',
						susrate = totalogins = nototalogins = '0';
				} else {
					var username = tds[received[1]].innerText;
					var password = tds[received[2]].innerText;
					var susrate = document.getElementsByTagName('em')[received[3]].innerText;
					/* Grabs login data */
				}
				ev.source.postMessage(manager.basename+'-msg ' + escape(username) + ' ' + escape(password) + ' ' + susrate + ' ' + totalogins + ' ' + nototalogins);
				/* Posts the data back to main document */
			},
		false);
	}

	manager.logintosite = function ()
	{
		/* Logs into website when required */
		for (var i = 0, j, compl; !compl && (j = document.forms[i]); i++)
		{
			for (var n = 0, m; m = j.elements[n]; n++)
			{
				if (m.type == 'text')
				{
					m.value = document.getElementById(manager.basename+'-usr').value;
					j.hasBMNUser = true;
				} else if (m.type == 'password')
				{
					m.value = document.getElementById(manager.basename+'-pwd').value;
					j.hasBMNPass = true;
				}
	
				if (j.hasBMNUser && j.hasBMNPass)
				{
					j.submit();
					compl = true;
					break;
				}
			}
		}
	}

	document.addEventListener('dblclick',
		function()
		{
			if (event.shiftKey && event.ctrlKey)
			{
				manager.init();
			}
		}, false);

	manager.prevlogin = function ()
	{
		return manager.grabloginlist(-4,-4,-1);
	}

	manager.nextlogin = function ()
	{
		return manager.grabloginlist(4,4,1);
	}

	manager.grabloginlist = function (x, y, z)
	{
		manager.teedee += x;
		manager.teedi += y;
		/* Activates a toggle to grab the later parts of the document */
		manager.empha += z;
		var nomlogins = manager.teedee/4+1;

		var obj = document.getElementById(manager.basename+'-obj');
		if(!obj)
			return false;

		obj.contentDocument.postMessage(manager.basename+'-msg ' + manager.teedee + ' ' + manager.teedi + ' ' + manager.empha + ' ' + nomlogins);
	}

	manager.resetdatas = function ()
	{
		var bar = document.getElementById(manager.basename+'-bar');
		if(bar)
			document.documentElement.removeChild(bar);
		manager.teedee = -4;
		manager.teedi = -3;
		manager.empha = -1;
	}

})();}, false);

