--- scripts/fancy_login.js.orig	2011-01-24 21:49:48.000000000 -0800
+++ scripts/fancy_login.js	2012-04-04 19:45:34.000000000 -0700
@@ -1,8 +1,8 @@
-// $Id: fancy_login.js,v 1.16 2011/01/25 05:49:48 hakulicious Exp $
 (function($)
 {
 	var popupVisible = false;
 	var ctrlPressed = false;
+	var base_action = '';
 
 	function showLogin()
 	{
@@ -50,9 +50,9 @@
 		});
 		$(document).keyup(function(event)
 		{
-		    if(event.keyCode === 27) {
-		        hideLogin();
-		    }
+				if(event.keyCode === 27) {
+						hideLogin();
+				}
 		});
 	}
 
@@ -63,7 +63,7 @@
 			popupVisible = false;
 			$("#fancy_login_login_box").fadeOut(settings.boxFadeSpeed, function()
 			{
-				$(this).css({"position" : "static", "height" : "auto", "width" : "auto",  "background-color" : "transparent", "border" : "none" });
+				$(this).css({"position" : "static", "height" : "auto", "width" : "auto", "background-color" : "transparent", "border" : "none" });
 				$("#fancy_login_dim_screen").fadeOut(settings.dimFadeSpeed, function()
 				{
 					if(settings.hideObjects) {
@@ -128,7 +128,7 @@
 			}
 		});
 	}
-	
+
 	function toggleForm()
 	{
 		currentForm = ($("#fancy_login_form_contents #user-login").css("display") == "none") ? "#user-pass" : "#user-login";
@@ -141,6 +141,59 @@
 		});
 	}
 
+	// uri_parse() code copied and abridged from URI.parse() found at http://medialize.github.com/URI.js/ (MIT / GPL v3 license)
+	function uri_parse(string)
+	{
+		var pos, t, parts = {};
+		// [protocol"://"[username[":"password]"@"]hostname[":"port]"/"?][path]["?"querystring]["#"fragment]
+
+		// extract fragment
+		pos = string.indexOf('#');
+		if (pos > -1) {
+				// escaping?
+				parts.fragment = string.substring(pos + 1) || null;
+				string = string.substring(0, pos);
+		}
+
+		// extract query
+		pos = string.indexOf('?');
+		if (pos > -1) {
+				// escaping?
+				parts.query = string.substring(pos + 1) || null;
+				string = string.substring(0, pos);
+		}
+
+		// ... Leave protocol, access, host and port as part of parts.path
+
+		// what's left must be the path
+		parts.path = string;
+
+		// and we're done
+		return parts;
+	}
+
+	function uri_merge_query(uri1, uri2) {
+		var parts1 = uri_parse(uri1);
+		var parts2 = uri_parse(uri2);
+
+		// To replace conflicting params we break up and merge the queries here.
+		var query = [];
+		if (parts1.query) $.merge(query, parts1.query.split('&'));
+		if (parts2.query) $.merge(query, parts2.query.split('&'));
+		query = query.join('&');
+
+		var result = parts1.path;
+		if (query) {
+			result += '?' + query;
+		}
+		if (parts1.fragment) {
+			result += '#' + parts1.fragment;
+		} else if (parts2.fragment) {
+			result += '#' + parts2.fragment;
+		}
+		return result;
+	}
+
 	Drupal.behaviors.fancyLogin = function()
 	{
 		var settings = Drupal.settings.fancyLogin;
@@ -160,6 +213,12 @@
 					if(settings.httpsRoot) {
 						action = settings.httpsRoot + action;
 					}
+					// Save base action value once to use upon all popups
+					if (!base_action) {
+						base_action = $("#fancy_login_login_box form").attr("action");
+					}
+					// Merge query bits from base action for compatibility with JS of other modules (like BOTCHA)
+					action = uri_merge_query(action, base_action);
 					$("#fancy_login_login_box form").attr("action", action);
 					showLogin();
 					return false;
