BugMeNot

By hosts Last update Mar 1, 2009 — Installed 3,860 times. Daily Installs: 13, 6, 7, 15, 9, 4, 2, 6, 7, 8, 8, 8, 8, 8, 13, 14, 8, 8, 9, 3, 11, 5, 12, 3, 3, 10, 7, 4, 5, 5, 3, 6

There are 1 previous version of this script.

// ==UserScript==

// @name           BugMeNot

// @namespace      http://

// @include        http://*

// @exclude        *bugmenot*

// ==/UserScript==

// latest update 01.03.09

// based on code found at http://www.oreillynet.com/pub/h/4171


// Notes from previous releases (this release does't have any permission)

// ----------------------------

// based on code by Matt McCarthy

// and included here with his gracious permission



// new logins gotten from the current page (reset on every page load)

var retrievals = 0;

// millisecond delay between a field losing focus and checking to see

// if any other of our fields has focus. If this is too low, the menu

// won't work because it will get "display: none" and its onclick

// won't fire.

var BLUR_TIMEOUT = 150;

//http://www.bugmenot.com/view/orasisx.net



//phoneRegex = /(?:http://)(.*)/.*?/;

//doma= location.href.match( phoneRegex );



myString = location.href;

domainnameRE = new RegExp("(?:http://)(.*?)/.*?", "i");

domainname = myString.match(domainnameRE)

domainname = domainname[1];

//alert (domainname);

var allInputs = null;

var bmnView = "http://bugmenot.com/view";

var bmnUri = bmnView + "/" + domainname;

var bmnHomeUri = "http://bugmenot.com/";

var DEBUG = false;

var bmnWrappers = new Object();



var Style = {

	menuLink: {

		border: "none",

		backgroundColor: "#fff",

		color: "#000",



		display: "block",

		padding: "2px",

		margin: "0",

		width: "12em",



		fontSize: "8pt",

		fontWeight: "normal",

		textDecoration: "none"

	},



	menuLinkHover: {

		backgroundColor: "#316AC5",



		color: "#fff"

	},



	menuLinkWrapper: {

		textAlign: "left",

		padding: "1px",

		margin: 0

	},

	bmnWrapper: {

		display: "none",

		fontFamily: "tahoma, verdana, arial, sans-serif",

		whiteSpace: "nowrap",



		position: "absolute",

		zIndex: 1000,



		padding: "2px",

		border: "1px solid #ACA899",

		backgroundColor: "#fff",



		opacity: "0.9",

		filter: "alpha(opacity=90)"

	}

};

function copyProperties(to, from) {

	for (var i in from) {

		to[i] = from[i];

	}

}



function main() {

	processPasswordFields();

}

function getBmnWrapper(pwFieldIndex) {

	return document.getElementById("reify-bugmenot-bmnWrapper" +

		pwFieldIndex);

}



function processPasswordFields() {

	var allInputs = document.getElementsByTagName("input");

	//allInputslength = allInputs.length;

	var bmnContainer = document.createElement("div");

	 bmnContainer.id = "reify-bugmenot-container";



	var bodyEl = document.getElementsByTagName("body")[0];

	if (!bodyEl) return;



	for (var i = 0; i < allInputs.length; i++) {

		var pwField = allInputs[i];

		//GM_log (allInputs[i].type.toLowerCase());

		if (!(pwField.type && pwField.type.toLowerCase() == "password")) {

			continue;

		}

		var previousTextFieldInd = getPreviousTextField(i,allInputs);

		if (previousTextFieldInd == -1) {

			if (DEBUG) {

			GM_log("Couldn't find text field before password input " +

			   i + ".");

			continue;

			}

		}

		var usernameField = allInputs[previousTextFieldInd];

		usernameField.setAttribute('usernameInputIndex',

					   previousTextFieldInd);

		usernameField.setAttribute('passwordInputIndex', i);

		Utility.addEventHandler(usernameField, "focus",

					usernameField_onfocus);

		Utility.addEventHandler(usernameField, "blur",

					usernameField_onblur);



		Utility.addEventHandler(pwField, "focus", pwField_onfocus);

		Utility.addEventHandler(pwField, "blur", pwField_onblur);

		pwField.setAttribute('usernameInputIndex', previousTextFieldInd);

		pwField.setAttribute('passwordInputIndex', i);



		var getLoginLink = menuLink(bmnUri, "Get login from Bug Me Not",

			"Get a login from Bug Me Not",

			getLoginLink_onclick, Style.menuLink, previousTextFieldInd,

			i, menuLink_onmouseover, menuLink_onmouseout);

		var getLoginLinkWrapper = menuEntry(getLoginLink,

			Style.menuLinkWrapper);



		var fullFormLink = menuLink(bmnUri, "More options",

			"See more options for getting logins from BugMeNot.com " +

			"(opens a new window)", openMenuLink_onclick,

			Style.menuLink, previousTextFieldInd, i,

			menuLink_onmouseover, menuLink_onmouseout);

		var fullFormLinkWrapper = menuEntry(fullFormLink,

			Style.menuLinkWrapper);



		var visitBmnLink = menuLink(bmnHomeUri, "Visit Bug Me Not",

			"Go to the Bug Me Not home page (opens a new window)",

			openMenuLink_onclick, Style.menuLink, previousTextFieldInd,

			i, menuLink_onmouseover, menuLink_onmouseout);

		var visitBmnLinkWrapper = menuEntry(visitBmnLink,

			Style.menuLinkWrapper);



		var bmnWrapper = document.createElement("div");

		bmnWrapper.id = "reify-bugmenot-bmnWrapper" + i;

		bmnWrapper.className = "reify-bugmenot-bmnWrapper";

		bmnWrapper.appendChild(getLoginLinkWrapper);

		bmnWrapper.appendChild(fullFormLinkWrapper);

		bmnWrapper.appendChild(visitBmnLinkWrapper);

		copyProperties(bmnWrapper.style, Style.bmnWrapper);



		bmnContainer.appendChild(bmnWrapper);

	}

	if (bmnContainer.hasChildNodes()) {

		bodyEl.appendChild(bmnContainer);

	}

}

function menuEntry(linkEl, styleObj) {

	var p = document.createElement("p");

	copyProperties(p.style, styleObj);	

	p.appendChild(linkEl); 

	return p;

}

function menuLink(href, text, title, onclick, styleObj,

	usernameInputIndex, passwordInputIndex, onmouseover, onmouseout) {

	var newMenuLink = document.createElement("a");

	newMenuLink.href = href;

	newMenuLink.appendChild(document.createTextNode(text));

	newMenuLink.title = title;

	newMenuLink.setAttribute('usernameInputIndex', usernameInputIndex);

	newMenuLink.setAttribute('passwordInputIndex', passwordInputIndex);



	Utility.addEventHandler(newMenuLink, "click", onclick);

	Utility.addEventHandler(newMenuLink, "mouseover", onmouseover);

	Utility.addEventHandler(newMenuLink, "mouseout", onmouseout);



	copyProperties(newMenuLink.style, styleObj);

	

	return newMenuLink;

}

function menuLink_onmouseover(event) {

	event = event || window.event;

	var target = event.currentTarget || event.srcElement;

	copyProperties(target.style, Style.menuLinkHover);

}



function menuLink_onmouseout(event) {

	event = event || window.event;

	var target = event.currentTarget || event.srcElement;

	copyProperties(target.style, Style.menuLink);

}

function getLoginLink_onclick(event) {

	var allInputs = document.getElementsByTagName("input");

	if((!allInputs[this.getAttribute('passwordInputIndex')].value.length &&

		!allInputs[this.getAttribute('usernameInputIndex')].value.length) ||

		confirm("Overwrite the current login entry?")) {

		getLogin(bmnUri, this.getAttribute('usernameInputIndex'),

			this.getAttribute('passwordInputIndex'));

	}

	menuLink_onmouseout({currentTarget: this});

	event.preventDefault && event.preventDefault( );

	return false;

}



function openMenuLink_onclick(event) {

	if (typeof GM_openInTab != 'undefined') {

		GM_openInTab(this.href);

	} else {

		window.open(this.href);

	}

	menuLink_onmouseout({currentTarget: this});

	event.preventDefault && event.preventDefault( );

	return false;

}



function usernameField_onfocus(event) {

	var allInputs = document.getElementsByTagName("input");

	event = event || window.event;

	var target = event.currentTarget || event.srcElement;

	target.setAttribute('hasFocus', true);

	showHideBmnWrapper(target, allInputs[target.

getAttribute('passwordInputIndex')], true);

}



function usernameField_onblur(event) {

	var allInputs = document.getElementsByTagName("input");

	event = event || window.event || this;

	var target = event.currentTarget || event.srcElement;

	target.setAttribute('hasFocus', false);

	var fRef = hideIfNoFocus(allInputs[target.

getAttribute('usernameInputIndex')],

		allInputs[target.getAttribute('passwordInputIndex')]);

	// race condition: wait for other element's onfocus

	setTimeout(fRef, BLUR_TIMEOUT);

}



function pwField_onfocus(event) {

	var allInputs = document.getElementsByTagName("input");

	event = event || window.event;

	var target = event.currentTarget || event.srcElement;

	target.setAttribute('hasFocus', true);

	showHideBmnWrapper(allInputs[target.getAttribute('usernameInputIndex')],

			target, true);

}

function pwField_onblur(event) {

	var allInputs = document.getElementsByTagName("input");

	event = event || window.event;

	var target = event.currentTarget || event.srcElement;

	target.setAttribute('hasFocus', false);

	var fRef = hideIfNoFocus(allInputs[target.

getAttribute('usernameInputIndex')],

		allInputs[target.getAttribute('passwordInputIndex')]);

	// race condition: wait for other element's onfocus

	setTimeout(fRef, BLUR_TIMEOUT);

}



function hideIfNoFocus(usernameField, pwField) {

	return (function( ) {

		var bUsernameFocus = usernameField.getAttribute('hasFocus');

		if (typeof bUsernameFocus == 'string') {

			bUsernameFocus = (bUsernameFocus && bUsernameFocus != 'false');

		}

		var bPasswordFocus = pwField.getAttribute('hasFocus');

		if (typeof bPasswordFocus == 'string') {

			bPasswordFocus = (bPasswordFocus && bPasswordFocus != 'false');

		}

		if ((!bUsernameFocus) && (!bPasswordFocus)) {

			showHideBmnWrapper(usernameField, pwField, false);

		}

	});

}



function showHideBmnWrapper(usernameField, pwField, show) {

	var bmnWrapper = getBmnWrapper(pwField.

getAttribute('passwordInputIndex'));



	if (show) {

		bmnWrapper.style.display = "block";

		positionBmnWrapper(bmnWrapper, usernameField, pwField);

	} else {

		//GM_log('hiding bugmenot wrapper');

		bmnWrapper.style.display = "none";



		// Menu links may not get onmouseout event, so they get

		// stuck with the hover style unless we do this.

		var menuLinks = bmnWrapper.getElementsByTagName("div");

		for (var i = 0; i < menuLinks.length; i++) {

			copyProperties(menuLinks[i].style, Style.menuLink);

		}

	}

}

function positionBmnWrapper(bmnWrapper, usernameField, pwField) {

	var pwLeft = Utility.elementLeft(pwField);

	if (pwLeft + pwField.offsetWidth + bmnWrapper.offsetWidth +

		Utility.scrollLeft( ) + 10 < Utility.viewportWidth( )) {

		bmnWrapper.style.left = (pwLeft + pwField.offsetWidth + 2) + "px";

		bmnWrapper.style.top = Utility.elementTop(pwField) + "px";

	} else {

		bmnWrapper.style.left = (Utility.elementLeft(usernameField) -

			bmnWrapper.offsetWidth - 2) + "px";

		bmnWrapper.style.top = Utility.elementTop(usernameField) + "px";

	}

}



// We have a uri param rather than assuming it's for the current

// page so this function can be modular and potentially used

// for pages other than the current one.

function getLogin(uri, usernameInputIndex, passwordInputIndex) {

	var allInputs = document.getElementsByTagName("input");

	var usernameField = allInputs[usernameInputIndex];

	var pwField = allInputs[passwordInputIndex];

	waitOrRestoreFields(usernameField, pwField, false);

	

	var hostUri = location.hostname;

	var firstAttempt = retrievals == 0;

	var submitData = "submit=This+login+didn%27t+work&num=" + retrievals +

		"&site=" + encodeURI(location.hostname);

	GM_xmlhttpRequest({

		method: firstAttempt ? "get" : "post",

		headers: firstAttempt ? null :

			{"Content-type": "application/x-www-form-urlencoded"},

		data: firstAttempt ? null : submitData,

		url: firstAttempt ? uri : bmnView,

		onload: function(responseDetails) {

if (responseDetails.status == 200) {

			waitOrRestoreFields(usernameField, pwField, true); 

			decoded = decodeit(responseDetails.responseText);

			var doc = textToXml(decoded);

			 if (!(doc && doc.documentElement)) {

			  return Errors.say(Errors.malformedResponse);

			 }

			

			var accountInfo = doc.documentElement.getElementsByTagName("td")[0];

			if (!(accountInfo)) {

			return Errors.say(Errors.noLoginAvailable);

			}



			usernameField.value = accountInfo.childNodes[0].nodeValue;

			var pwsField = doc.documentElement.getElementsByTagName("td")[1];		

			pwField.value = pwsField.childNodes[0].nodeValue;

			retrievals++;

		}else{

			return Errors.say(Errors.xmlHttpFailure);

			}

		},

		onerror: function(responseDetails) {

			waitOrRestoreFields(usernameField, pwField, true);

			Errors.say(Errors.xmlHttpFailure);

		}

	});

}







function waitOrRestoreFields(usernameField, pwField, restore) {

	document.documentElement.style.cursor = restore ? "default" : "progress";

	usernameField.value = restore ? "" : "Loading...";

	//usernameField.disabled = !restore;

	//pwField.disabled = !restore;

}



function getPreviousTextField(pwFieldIndex,allInputs) {

	//var allInputs = document.getElementsByTagName("input");

	for (var i = pwFieldIndex; i >= 0 && i <allInputs.length; i--)

		if (allInputs[i].type && allInputs[i].type.toLowerCase( ) == "text")

			return i;



	return -1;

}

function decodeit(codedtext){ 



var regexkey = /var key = (.*?)\;/;

var match = regexkey.exec(codedtext);

if (match != null) {

var key = parseInt(match[1]);

} else {

	alert ("decoded key cannot be found\nbugmenot site has changed");

}



var codedtext = codedtext.replace(/<script>d\('(.*?)'\)\;<\/script>/gi, aaa);



//alert (codedtext);

return codedtext;



function aaa(str, strInput, offset, s){

	return d(strInput);

}



function decoder(data){

	var b64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

	var o1,o2,o3,h1,h2,h3,h4,bits,i=0,enc='';do{h1=b64.indexOf(data.charAt(i++));

		h2=b64.indexOf(data.charAt(i++));

		h3=b64.indexOf(data.charAt(i++));

		h4=b64.indexOf(data.charAt(i++));

		bits=h1<<18|h2<<12|h3<<6|h4;o1=bits>>16&0xff;o2=bits>>8&0xff;o3=bits&0xff;

		if(h3==64)enc+=String.fromCharCode(o1);

		else if(h4==64)enc+=String.fromCharCode(o1,o2);

			else enc+=String.fromCharCode(o1,o2,o3)}while(i<data.length);

			return enc;

			}

			

function d(strInput){

	strInput=decoder(strInput);

	var strOutput="";

	var intOffset=(key+112)/12;

	for(i=4;i<strInput.length;i++){

		thisLetter=strInput.charAt(i);

		thisCharCode=strInput.charCodeAt(i);

		newCharCode=thisCharCode-intOffset;

		strOutput+=String.fromCharCode(newCharCode)

		}

		return strOutput;

		}

}







function textToXml(t) {



	try {

		if (typeof DOMParser != undefined) {

			//t = toString(t);

//			var dp = new DOMParser( );

//			return dp.parseFromString(t, "text/xml");

			

var parser = new DOMParser();

//var t = t.replace(/<\?xml.*?\?>/g, ""); // strip <?xml ?> tag

//t = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n<rando>" + t + "</rando>";

//t = t.replace(/&(?!\w*;)/g, "&");

//alert(t);

//alert(parser.parseFromString(t, "application/xml"));

return  parser.parseFromString(t, "application/xml");

		

		}

		else {

			return null;

		}

	}

	catch (e) {

		return null;

	}

}



var Errors = {

	noLoginAvailable: "Sorry, but BugMeNot.com had no login available " +

		"for this site.\nIf you're feeling helpful, you can click \"More " +

		"options\" to provide a login for future visitors.",

	malformedResponse: "Sorry, but I couldn't understand the response " +

		"from BugMeNot.com.\nThe service might be unavailable.",

	siteBlocked: "Sorry, but I couldn't understand the response " +

		"from BugMeNot.com.\nThe service might be unavailable.",		

	xmlHttpFailure: "There was an error in contacting BugMeNot.com.\n" +

		"The server may be unavailable or having internal errors.",



	say: function(msg) { alert(msg); return false; }

};



var Utility = {

	elementTop: function(el) {

		return Utility.recursiveOffset(el, "offsetTop");

	},

	elementLeft: function(el) {

		return Utility.recursiveOffset(el, "offsetLeft");

	},



	recursiveOffset: function(el, prop) {

		var dist = 0;

		while (el.offsetParent)

		{

			dist += el[prop];

			el = el.offsetParent;

		}

		return dist;

	},



	viewportWidth: function( ) {

		return Utility.detectAndUseAppropriateObj("clientWidth");

	},



	viewportHeight: function( ) {

		return Utility.detectAndUseAppropriateObj("clientHeight");

	},



	scrollLeft: function( ) {

		return Utility.detectAndUseAppropriateObj("scrollLeft");

	},



	scrollTop: function( ) {

		return Utility.detectAndUseAppropriateObj("scrollTop");

	},



	detectAndUseAppropriateObj: function(prop) {

		if (document.documentElement && document.documentElement[prop]) {

			return document.documentElement[prop];

		}

		else if (document.body && document.body[prop]) {

			return document.body[prop];

		} else {

			return -1;

		}

	},



	addEventHandler: function(target, eventName, eventHandler) {

		if (target.addEventListener) {

			target.addEventListener(eventName, eventHandler, false);

		} else if (target.attachEvent) {

			target.attachEvent("on" + eventName, eventHandler);

		}

	}

};

main( );


// to do

// http://www.bugmenot.com/view/thecavernforum.com  Site Blocked