/*
 * Astra Account Signin
 *
 * Programmer: Andy Magoon
 *
 * Copyright (C) 2009 Cerulean Studios 
 *
 */
var force_ssl = true;
var html_aal_style = '<style>.success-field {font: 12px "Segoe UI", Arial, Helvetica, sans-serif; line-height: 18px; display: table-cell; padding: 3 0 3 0; text-align: left; vertical-align: middle; background: url("/common/images/info.png") 0px 4px no-repeat; text-indent: 20px; }</style><!--[if lt IE 7]><style>.success-field {background: url("/common/images/info.png") 0px 4px no-repeat;} .success-row {line-height: 18px;} </style><![endif]--><!--[if gte IE 5.5]><style type="text/css"> .error-field {display: inline; padding-left: 20px;} .cardfield.error {text-indent: 0px;} .success-field {display: inline; paddign-left: 20px;} </style> <![endif]-->';
var html_aal_div = '<div id="aal" style="display: none; overflow: hidden"></div>';
/* Please sign in to your Astra Account
 *  Astra username | Forgot username? | Password | Forgot password?
 */
var html_aal_signin = '\
<div class="content" id="signin">\
	<div>\
		<h3>Please sign in to your Astra Account</h3>\
		<div class="card">\
			<div class="card-row"><div class="card-desc">Astra username</div><div class="card-field"><input class="card-input large" name="username" id="username" type="text" value="" tabindex="1" /></div></div>\
			<div class="card-row"><div class="card-desc"></div><div class="card-field">Need to <a href=# id="new_user">register</a>?  Forgot your <a href=# id="forgot_username">username?</a></div></div>\
			<div class="card-row"><div class="card-desc">Password</div><div class="card-field"><input class="card-input large" name="password" id="password" type="password" value="" tabindex="2" /></div></div>\
			<div class="card-row"><div class="card-desc"></div><div class="card-field">Forgot your <a href="#" id="forgot_password">password</a>?</div></div>\
			<div class="card-row"><div class="card-desc" style="height: 24px"></div><div class="error-field" id="password_error">Invalid password.  Please try again.</div></div>\
		</div>\
	</div>\
	<div class="command" style="position: relative; left: -20; top: 0; width: 980; margin: 10 0 20 0;">\
		<a href="#" onclick="self.parent.tb_remove();" id="cancel_button"><div class="button s200x30 left gray" id="cancel"><p>Cancel</p></div></a>\
		<input name="class" value="a" type="hidden">\
		<input id="submit" class="button s200x30 right green" name="submitted" value="Sign in" type="submit">\
	</div>\
</div>';
/* New user
 */
var html_aal_newuser = '\
<div class="content" id="newuserinfo">\
	<div>\
		<h3>Web-based registration is not yet available.</h3>\
		<h4>To create an Astra Account, please download and install our Windows software from <a href="http://www.trillian.im/download">http://www.trillian.im/download</a></h4>\
		<p>An Astra Account is now required for Trillian.  New for 4.0, your Astra Account is your centralized account for storing all of your Trillian preferences and payment history.  <br/>It synchronizes your settings between devices.</p>\
		<p>Customers of older versions can migrate Trillian Pro payment history during or after Astra Account registration.</p>\
		<p>Gift redemption requires you to first register an Astra Account.  Download and install Trillian using the link above, then register an account.</p>\
	</div>\
	<div class="command" style="position: relative; left: -20; top: 64; width: 980; margin: 10 0 20 0;">\
			<input id="back" class="button s200x30 left gray" name="back" value="Back" type="button">\
			<input id="download" class="button s200x30 right blue" name="download" value="Download" type="button">\
	</div>\
</div>';
/* Recover forgotten Astra Username
 * Email Address | Astra Username
 */
var html_aal_lostuser = '\
<div class="content" id="lostuser">\
	<div>\
		<h3>Recover forgotten Astra Username</h3>\
		<div class="card">\
			<div class="card-row"><div class="card-desc">Email address</div><div class="card-field"><input class="card-input large" name="email" id="email" type="text" value="" tabindex="1" /></div></div>\
			<div class="card-row"><div class="card-desc" style="height: 24px"></div><div class="error-field" id="missing">Email address not found.  Please try again.</div><div class="error-field" id="error">Error while communicating with our server.  Please try again before <a href="/help/401"><u>contacting us</u></a>.</div><div class="error-field" id="invalid">Invalid entry.  Please make sure you are entering a valid email address.</div><div class="success-field" id="success">Check your email! &nbsp; We have sent Astra Account information to you.</div></div>\
		</div>\
		<div class="command" style="position: relative; left: -20; top: 94; width: 980; margin: 10 0 20 0;">\
			<input id="back" class="button s200x30 left gray" name="back" value="Back" type="button">\
			<input id="submit" class="button s200x30 right green" name="submitted" value="Recover" type="submit">\
		</div>\
	</div>\
</div>\
';
/* Recover forgotten password
 * Astra username | Email address
 */
var html_aal_lostpass='\
<div class="content" id=lostpass>\
		<h3>Recover forgotten password</h3>\
		<div class="card">\
			<div class="card-row"><div class="card-desc">Astra username</div><div class="card-field"><input class="card-input large" name="username" id="username" type="text" value="" tabindex="1" /></div></div>\
			<div class="card-row"><div class="card-desc"></div><div class="card-field">Forgot your <a href=# id="forgot_username">username?</a></div></div>\
			<div class="card-row"><div class="card-desc">Email address</div><div class="card-field"><input class="card-input large" name="email" id="email" type="text" value="" tabindex="1" /></div></div>\
			<div class="card-row"><div class="card-desc" style="height: 24px"></div><div class="error-field" id="missing">Astra Account not found with that username.  Please try again before <a href="/help/405"><u>contacting us</u></a>.</div><div class="error-field" id="error">Error while communicating with our server.  Please try again before <a href="/help/405"><u>contacting us</u></a>.</div><div class="error-field" id="mismatch">Astra Username and email address do not match!  Please try again, or go back and choose "Forgot Username".</div><div class="error-field" id="invalid">Invalid entry.  Please re-enter all information and try again.</div><div class="success-field" id="success">Check your email! &nbsp; We have sent password recovery instructions to you.</div></div>\
		</div>\
		<div class="command" style="position: relative; left: -20; top: 24; width: 980; margin: 10 0 20 0;">\
			<input id="back" class="button s200x30 left gray" name="back" value="Back" type="button">\
			<input id="submit" class="button s200x30 right green" name="submitted" value="Recover" type="submit">\
		</div>\
</div>';
//if ($.browser.msie) html_aal_lostpass2 = html_aal_lostpass2.replace(/top: 88/, "top:"80");
/* Recover forgotten password
 * Recovery Code
 */
var html_aal_lostpass2 = '\
<div class="content" id="lostpass2">\
		<h3>Recover forgotten password</h3>\
		<div class="card">\
			<div class="card-row"><div class="card-desc">Recovery Code</div><div class="card-field"><input class="card-input large" name="verificationcode" id="verificationcode" type="text" value="" tabindex="1" /></div></div>\
			<div class="card-row"><div class="card-desc" style="height: 24px">&nbsp;</div><div class="error-field" id="error">Error while communicating with our server.  Please try again before <a href="/help/405"><u>contacting us</u></a>.</div><div class="error-field" id="invalid">Invalid (or expired) code.  Before <a href="/help/405"><u>contacting us</u></a>, check your email (spam folder?) for the correct code.</div><div class="success-field" id="success">Check your email! &nbsp; We have mailed you a recovery code.  Confirm your identity by entering it above.</div></div>\
		</div>\
		<div class="command" style="position: relative; left: -20; top: 94; width: 980; margin: 10 0 20 0;">\
			<input id="back" class="button s200x30 left gray" name="back" value="Back" type="button">\
			<input id="submit" class="button s200x30 right green" name="submitted" value="Recover" type="submit">\
		</div>\
</div>';
/* Recover forgotten password
 * Security Question
 * Security Answer
 */
var html_aal_lostpass3 = '\
<div class="content" id="lostpass3">\
	<div>\
		<h3>Recover forgotten password</h3>\
		<div class="card">\
			<div class="card-row"><div class="card-desc">Security Question</div><div class="card-field" id="securityquestion"></div></div>\
			<div class="card-row"><div class="card-desc">Security Answer</div><div class="card-field"><input class="card-input large" name="securityanswer" id="securityanswer" type="text" value="" tabindex="1" /></div></div>\
			<div class="card-row"><div class="card-desc" style="height: 24px"></div><div class="error-field" id="error">Error while communicating with our server.  Please try again before <a href="/help/405"><u>contacting us</u></a>.</div><div class="error-field" id="invalid">Invalid entry.</div><div class="error-field" id="mismatch">Incorrect answer.  Please try again before <a id="resetlink" href="#"><u>resetting your password</u></a>.</div></div>\
		</div>\
		<div class="command" style="position: relative; left: -20; top: 70; top-was: 134; width: 980; margin: 10 0 20 0;">\
			<input id="back" class="button s200x30 left gray" name="back" value="Cancel" type="button">\
			<input id="submit" class="button s200x30 right green" name="submitted" value="Recover" type="submit">\
		</div>\
	</div>\
</div>';
/* Recover forgotten password
 * Your password is
 */
var html_aal_lostpass4 = '\
<div class="content" id="lostpass4">\
	<div>\
		<h3>Recover forgotten password</h3>\
		<div class="card">\
			<div class="card-row"><div class="card-desc">Your password is: </div><div class="card-field" id="password"></div></div>\
		</div>\
		<div class="command" style="position: relative; left: -20; top: 140; width: 980; margin: 10 0 20 0;">\
			<input id="back" class="button s200x30 right green" name="back" value="Finish" type="button">\
		</div>\
	</div>\
</div>';
/* Reset password 1
 * New password
 * Retype new password
 */
var html_aal_resetpass1 = '\
<div class="content" id="resetpass1">\
	<div>\
		<h3>New password</h3>\
		<p style="margin-right: 30;">Please note:&nbsp; Resetting your password will <b>clear stored passwords</b> for all saved accounts (for IM networks, checking email, etc) because that information can only be decrypted with your lost Astra Account password.&nbsp; If you do choose to continue then you can simply re-enter any saved accounts next time you use Trillian.&nbsp; If you are currently signed in to your Astra Account elsewhere then <b>please sign out</b> before continuing</b>.</p>\
		<div class="card">\
			<div class="card-row"><div class="card-desc">New Password</div><div class="card-field"><input class="card-input large" name="newpassword" id="newpassword" type="password" value="" tabindex="1" /></div></div>\
			<div class="card-row"><div class="card-desc">Re-enter New Password</div><div class="card-field"><input class="card-input large" name="newpasswordverify" id="newpasswordverify" type="password" value="" tabindex="2" /></div></div>\
			<div class="card-row"><div class="card-desc" style="height: 24px">&nbsp;</div><div class="error-field" id="error">Error while communicating with our server.  Please try again before <a href="/help/405"><u>contacting us</u></a>.</div><div class="error-field" id="invalid">Invalid entry.  Password must be between 6 and 32 characters in length.</div><div class="error-field" id="mismatch">Your entries don\'t match.  Please try again.</div></div>\
		</div>\
		<div class="command" style="position: relative; left: -20; top: -11; width: 980; margin: 10 0 20 0;">\
			<input id="back" class="button s200x30 left gray" name="back" value="Cancel" type="button">\
			<input id="submit" class="button s200x30 right green" name="submitted" value="Next" type="submit">\
		</div>\
	</div>\
</div>';

/* Reset password 2
 * New security question
 * New security answer
 */
var html_aal_resetpass2 = '\
<div class="content" id="resetpass2">\
	<div>\
		<h3>New security answer</h3>\
		<div class="card">\
			<div class="card-row"><div class="card-desc">Security Question</div><div class="card-field"><select class="card-input large" name="newsecurityquestion" id="newsecurityquestion" value="" tabindex="1"><option value="-1">Please choose...</option><option value="0">Custom question (you type it below)</option><option value="1">What is your primary frequent flyer number?</option><option value="2">What is your library card number?</option><option value="3">What was your first phone number?</option><option value="4">What was your first teacher\'s name?</option></select></div></div>\
			<div class="card-row" id="newsecuritycustomdiv"><div class="card-desc">Custom Security Question</div><div class="card-field"><input class="card-input large" name="newsecuritycustom" id="newsecuritycustom" type="text" value="" tabindex="2" /></div></div>\
			<div class="card-row"><div class="card-desc">Security Answer</div><div class="card-field"><input class="card-input large" name="newsecurityanswer" id="newsecurityanswer" type="text" value="" tabindex="3" /></div></div>\
			<div class="card-row"><div class="card-desc" style="height: 24px"></div><div class="error-field" id="error">Error while communicating with our server.  Please try again before <a href="/help/405"><u>contacting us</u></a>.</div><div class="error-field" id="invalid">Invalid entry.</div><div class="error-field" id="mismatch">Incorrect answer.  Please try again before <a id="resetlink" href="#"><u>resetting your password</u></a>.</div></div>\
		</div>\
		<div class="command" style="position: relative; left: -20; top: 2; width: 980; margin: 10 0 20 0;">\
			<input id="back" class="button s200x30 left gray" name="back" value="Back" type="button">\
			<input id="submit" class="button s200x30 right green" name="submitted" value="Next" type="submit">\
		</div>\
	</div>\
</div>';
/* Reset password 3
 * Success
 */
var html_aal_resetpass3 = '\
<div class="content" id="resetpass3">\
	<div>\
		<h3>Password changed</h3>\
		<div class="card">\
			<p>Your Astra Account password has been changed successfully!</p>\
			<p style="margin-right: 30;">If you had any connections with saved passwords then those will be lost because they were encrypted using your old Astra Account password.  You can fill them in again the next time you start Trillian.</p>\
		</div>\
		<div class="command" style="position: relative; left: -20; top: 100; width: 980; margin: 10 0 20 0;">\
			<input id="submit" class="button s200x30 right green" name="submitted" value="Finished" type="submit">\
		</div>\
	</div>\
</div>';

/* We store our selectors globally for performance, also makes
 * code easier to read
 */
var accessory_mode, aal, signin, newuserinfo, lostuser, lostpass, lostpass2, lostpass3, lostpass4, resetpass1, resetpass2, resetpass3;

/* Force ssl if we are doing that sort of thing
 */
if (location.href.indexOf("https:")!=-1) html_aal_style = html_aal_style.replace(/http:/, "https:");
if ($.browser.msie)
{
	$(window).load (function () {
		if (force_ssl && location.href.indexOf("https:")==-1) {
			window.location.href = location.href.replace(/http:/, "https:");
		}
	});
} 
else
{
	if (force_ssl && location.href.indexOf("https:")==-1) {
		window.location.href = location.href.replace(/http:/, "https:");
	}
}
/* Set up the page
 * main()
 */
$(document).ready(function(){
	/* Linkify 
	 * For pages that we're included on 
	 * Activate our tools for any elements with certain classes
	 */
	accessory_mode = false;
	$(".signinrequired")
		.click(function(){
			var destination = $(this).data("destination")
			if (!userLoggedIn())
			{  
				showLoginForm($(this), destination)
				return false
			} else {
					window.location.href = destination
				return true
			}
		}) //close click(
		.each(function(){
			var destination = $(this).attr("href")
			$(this).data("destination", destination)
			$(this).attr("href",'#')
		}) //close each(
	$(".lostpassword").click(function(){
			accessory_mode = true;
			lostpass.find("input#back").click(function(){
				setTimeout('lostpass.hide();signin.show();', 100)
				tb_remove()
				return false
			}) //close click(
			lostpass.show()
			signin.hide()
			showLoginThickbox()
			lostpass.find("input#username").focus()
			return false
	}) //close click(
	$(".lostusername").click(function(){
			accessory_mode = true;
			lostuser.find("input#back").click(function(){
				setTimeout('lostuser.hide();signin.show();', 100)
				tb_remove()
				return false
			}) //close click(
			lostuser.show()
			signin.hide()
			showLoginThickbox()
			lostuser.find("input#email").focus()
			return false
	}) //close click(

	/* Thickbox 
	 * Insert it into whatever page we're included on
	 * Including our username/password recovery tools
	 */
	$("div#container").append(html_aal_style).append(html_aal_div)
	aal=$("div#aal")
	aal
		.empty()
		.append(html_aal_signin)
		.append(html_aal_newuser)
		.append(html_aal_lostuser)
		.append(html_aal_lostpass)
		.append(html_aal_lostpass2)
		.append(html_aal_lostpass3)
		.append(html_aal_lostpass4)
		.append(html_aal_resetpass1)
		.append(html_aal_resetpass2)
		.append(html_aal_resetpass3)
	/* Signin 
	 */
	signin=aal.find("div#signin")
	signin
		.find("#signin input#submit").click(function(){
			aal_signin()
			return false
		})
	signin
		.find("#password_error").hide()
	signin
		.find("input").bind('keypress', function(e){ 
			signin.find("input#username, input#password").removeClass("error")
			signin.find("#password_error").hide()
			if(e.which == 13) { 
				aal_signin()
				return false
			}
		}) //close bind(
	signin
		.find("input#submit").click(function(){
			aal_signin()
			return false
		}) //close click(
	signin
		.find("#forgot_username").click(function(){ show_lostuser(); return false })
	signin
		.find("#forgot_password").click(function(){show_lostpass(); return false })
	signin
		.find("#new_user").click(function(){show_newuserinfo(); return false })
	if ($.cookie("astra_username")) signin.find("input#username").val($.cookie("astra_username"))

	/* New User Page
	 */
	newuserinfo=aal.find("div#newuserinfo");
	newuserinfo.hide();

	/* Lost User Page
	 */
	lostuser=aal.find("div#lostuser")
	lostuser
		.hide()
		.find("div#error, div#success, div#missing, div#invalid").hide()
	lostuser
		.find("input").bind('keypress', function(e){
			lostuser.find("input#email").removeClass("error")
			lostuser.find("div#error, div#success, div#missing, div#invalid").hide()
			if (e.which == 13) {
				aal_lostuser()
				return false
			}
		}) //close bind(
	lostuser
		.find("input#submit").click(function(){
			aal_lostuser()
			return false
		}) //close click(

	/* Lost Pass Page
	 * Asks for username, email
	 * Emails recovery code
	 */
	lostpass=aal.find("div#lostpass")
	lostpass
		.hide()
		.find("div#error, div#success, div#missing, div#invalid, div#mismatch").hide()
	lostpass
		.find("input").bind('keypress', function(e){
			lostuser.find("input#email").removeClass("error")
			lostuser.find("div#error, div#success, div#missing, div#mismatch, div#invalid").hide()
			if (e.which == 13) {
				aal_lostpass()
				return false
			}
		}) //close bind(
	lostpass
		.find("input#submit").click(function(){
			aal_lostpass()
			return false
		}) //close click(
	lostpass 
		.find("#forgot_username").click(function(){ lostpass.hide(); show_lostuser(); return false })

	/* Lost Pass Page 2 
	 * Asks for emailed recovery code
	 * Gets security question
	 */
	lostpass2=aal.find("div#lostpass2")
	lostpass2
		.hide()
		.find("div#error, div#mismatch, div#invalid").hide()
	lostpass2
		.find("input")
			.bind('keypress', function(e){
				lostpass2.find("input#verificationcode").removeClass("error")
				if (e.which == 13) {
					aal_lostpass2()
					return false
				}
			}) //close bind(
	lostpass2
		.find("input#back").click(function(){
			lostpass2.find("div#error, div#mismatch, div#invalid").hide()
			lostpass2.hide()
			signin.show()
			$("input#verificationcode, input#securityanswer, input#email, div#lostpass input#username").val("");
			return false
		}) //close click(
	lostpass2
		.find("input#submit").click(function(){
			aal_lostpass2()
			return false
		}) //close click(

	/* Lost Pass Page 3
	 * Shows question
	 * Asks for answer
	 */
	lostpass3=aal.find("div#lostpass3")
	lostpass3
		.hide()
		.find("div#error, div#mismatch, div#invalid").hide()
	lostpass3
		.find("input")
			.bind('keypress', function(e){
				lostpass3.find("input#securityanswer").removeClass("error")
				lostpass3.find("div#error, div#mismatch, div#invalid").hide()
				if (e.which == 13) {
					aal_lostpass3()
					return false
				}
			}) //close bind(
	lostpass3
		.find("input#back").click(function(){
			lostpass3.hide()
			signin.show()
			$("input#verificationcode, input#securityanswer, input#email, div#lostpass input#username").val("");
			return false
		}) //close click(
	lostpass3
		.find("input#submit").click(function(){
			aal_lostpass3()
			return false
		}) //close click(
	lostpass3
		.find("#resetlink").click(function(){ show_resetpass1(); return false })
	/* Lost Pass Page 4
	 * Shows your password
	 */
	lostpass4=aal.find("div#lostpass4")
	lostpass4
		.hide()
		.find("input#back").click(function(){
			lostpass4.hide()
			signin.show()
			$("input#verificationcode, input#securityanswer, input#email, div#lostpass input#username").val("");
			return false
		}) //close click(
	/* Reset password page 1
	 * New Password
	 */
	resetpass1=aal.find("div#resetpass1");
	resetpass1
		.hide()
		.find("input#back").click(function(){
			resetpass1.hide()
			signin.show()
			$("input#verificationcode, input#newsecurityanswer, input#email, div#lostpass input#username").val("");
			return false
		}) //close click(
	resetpass1
		.find("input")
			.bind('keypress', function(e){
				if (e.which == 13) {
					aal_resetpass1()
					return false
				}
			}) //close bind(
	resetpass1
		.find("input#submit").click(function(){
			aal_resetpass1()
			return false
		}) //close click(
	resetpass1
		.find("div#error, div#invalid, div#mismatch").hide()
	/* Reset password page 2
	 * New Security
	 */
	resetpass2=aal.find("div#resetpass2");
	resetpass2
		.hide()
		.find("input#back").click(function(){
			show_resetpass1();
			return false
		}) //close click(
	resetpass2
		.find("input")
			.bind('keypress', function(e){
				if (e.which == 13) {
					aal_resetpass2()
					return false
				}
			}) //close bind(
	resetpass2
		.find("input#submit").click(function(){
			aal_resetpass2()
			return false
		}) //close click(
	resetpass2
		.find("div#error, div#invalid, div#mismatch").hide()
	resetpass2
		.find("select#newsecurityquestion").change(function(){
			if ($(this).val() == "0")
			{
				resetpass2.find("div#newsecuritycustomdiv").css('visibility', 'visible').hide().fadeIn();
				resetpass2.find("input#newsecuritycustom").focus();
			} else {
				resetpass2.find("div#newsecuritycustomdiv").css('visibility', 'hidden');
			}
		}).change();
	/* Reset password page 3
	 * Changed Pass
	 */
	resetpass3=aal.find("div#resetpass3");
	resetpass3
		.hide()
		.find("input#submit").click(function(){
			resetpass3.hide()
			signin.show()
			$("input#verificationcode, input#newsecurityanswer, input#email, div#lostpass input#username").val("");
			tb_remove();
			return false
		}) //close click(
	/* Browser-specific adjustments
	 * I hate to do it.  FIXME
	 */
        if ($.browser.msie)
	{
		if ($.browser.version == 7 || $.browser.version == 6)	
		{
			addPixels(signin.find("div.command"), "top", 20);
			addPixels(newuserinfo.find("div.command"), "top", 4);
			addPixels(lostuser.find("div.command"), "top", 8);
			addPixels(lostpass.find("div.command"), "top", 16);
			addPixels(lostpass2.find("div.command"), "top", 8);
			addPixels(lostpass3.find("div.command"), "top", 12);
			addPixels(lostpass4.find("div.command"), "top", 7);
			addPixels(resetpass1.find("div.command"), "top", 12);
			addPixels(resetpass2.find("div.command"), "top", 20);
			addPixels(resetpass3.find("div.command"), "top", 3);
		}
		if ($.browser.version == 8)
		{
			addPixels(signin.find("div.command"), "top", 24);
			addPixels(newuserinfo.find("div.command"), "top", 4);
			addPixels(lostuser.find("div.command"), "top", 10);
			addPixels(lostpass.find("div.command"), "top", 16);
			addPixels(lostpass2.find("div.command"), "top", 10);
			addPixels(lostpass3.find("div.command"), "top", 14);
			addPixels(lostpass4.find("div.command"), "top", 7);
		}
	}
}) //close ready(
function addPixels(element, css, amount)
{
	var currentPixels = parseInt(element.css(css));
	var newPixels = parseInt(currentPixels + parseInt(amount)) + "px";
	$(element).css(css, newPixels);
}

function show_lostuser()
{
	signin.hide()
	lostuser
		.show()
//		.find("input#back").empty().append("<p>Back</p>")
	lostuser
		.find("input#email").focus()
	lostuser
		.find("input#back").click(function(){
			accessoryback();
			lostuser.hide()
			signin.show()
			$("input#verificationcode, input#securityanswer, input#email, div#lostpass input#username").val("");
			if (signin.find("input#username").val()) signin.find("input#password").focus()
			else signin.find("input#username").focus()
			return false
		}) //close click(
}
function show_lostpass()
{
	/* Set up our thickbox for lost password recovery */
	signin.hide()
	lostpass.show()
//		.find("input#back").html("<p>Back</p>")
	lostpass
		.find("input#username").focus()
	lostpass
		.find("input#back").click(function(){
			accessoryback();
			lostpass.hide()
			signin.show()
			$("input#verificationcode, input#securityanswer, input#email, div#lostpass input#username").val("");
			if (signin.find("input#username").val())
			  signin.find("input#password").focus()
			else 
			  signin.find("input#username").focus()
			return false
		}) //close click(
}
function show_newuserinfo()
{
	/* This is deprecated so, for now, we'll simply throw them into the /register page; TODO */
	window.location.href = "/register/"
	return;
	
	/* Set up our thickbox for new user info */
	signin.hide()
	newuserinfo.show()
	newuserinfo
		.find("input#back").click(function(){
			newuserinfo.hide()
			signin.show()
			return false
		}) //close click(
	newuserinfo
		.find("input#download").click(function(){
			window.location.href = "http://www.trillian.im/download"
			return false
		}) //close click(
}
function show_lostpass2()
{
	/* Set up our thickbox to ask for verification code */
	lostpass.hide()
	lostpass2
		.show()
		.find("input#verificationcode").focus()
	lostpass2
		.find("input#back").click(function(){
			lostpass2.hide()
			signin.show()
			$("input#verificationcode, input#securityanswer, input#email, div#lostpass input#username").val("");
		}) //close click(
}
function show_lostpass3()
{
	/* Set up our thickbox to ask for security answer */
	lostpass2.hide()
	lostpass3
		.show()
		.find("input#securityanswer").focus()
	lostpass3
		.find("input#back").click(function(){
			lostpass3.hide()
			signin.show()
			$("input#verificationcode, input#securityanswer, input#email, div#lostpass input#username").val("");
		}) //close click(
}	
function show_lostpass4()
{
	/* Set up our thickbox to show the user their password */
	lostpass3.hide()
	lostpass4.show()
}
function show_resetpass1()
{
	/* Set up our thickbox to ask the user for their new password */
	resetpass2.hide()
	lostpass3.hide()
	resetpass1.show()
	resetpass1.find("input#newpassword").focus();
}
function show_resetpass2()
{
	/* Set up our thickbox to askt he user for their new security answer */
	resetpass1.hide()
	resetpass2.show()
	resetpass2.find("select#newsecurityquestion").focus();
}
function show_resetpass3()
{
	/* Tell the user that their password was changed successfully */
	resetpass2.hide();
	resetpass3.show();
}

function accessoryback()
{
	if (accessory_mode)
	{
		tb_remove();
		return true;
	}
	return false;
}

function aal_lostuser()
{
	/* Emails usernames by sending to server: email address 
	 */
	var email = lostuser.find("input#email").removeClass("error").val()
	lostuser.find("div#error, div#success, div#missing, div#invalid").hide()
	$.ajax({
		type: "POST",
		url: "/api/user/0.1/index.php/username",
		data: {
			id        : nextID(),
			ae        : escape(email)
		},
		dataType: "xml",
		success: function(xml) {
                       $(xml).find('response').each(function(){
		       		var answer = $(this).text()
				if (answer == "sslrequired")
				{
					lostuser.find("div#error").fadeIn()
					alert("SSL is required.  Please use secure HTTPS protocol to view this page.")
				}
				else if (answer == "missing")
				{
					lostuser.find("div#missing").fadeIn()
					lostuser.find("input#email").focus()
				}
				else if (answer == "invalid")
				{
					lostuser.find("div#invalid").fadeIn()
					lostuser.find("input#email").focus()
				}
				else if (answer == "success") 
				{
					lostuser.find("div#success").fadeIn()
				} 
				else 
				{
					lostuser.find("div#error").fadeIn()
				}
			}) //close each(
		}, //close success:
		error: function(a,b,c) {
			alert("We were unable to communicate with our server.  Please try again later.  (" + b + ")")
		}
	}) //close ajax(
} //close aal_lostuser
function aal_lostpass()
{
	/* Emails recovery code by sending to server: email, username
	 */
	var email = lostpass.find("input#email").removeClass("error").val()
	var username = lostpass.find("input#username").removeClass("error").val()
	lostpass.find("div#error, div#success, div#missing, div#invalid, div#mismatch").hide()
	$.ajax({
		type: "POST",
		url: "/api/user/0.1/index.php/security/email",
		data: {
			id        : nextID(),
			ae        : escape(email),
			au        : escape(username)
		},
		dataType: "xml",
		success: function(xml) {
                       $(xml).find('response').each(function(){
		       		var answer = $(this).text()
				if (answer == "sslrequired")
				{
					lostpass.find("div#error").fadeIn()
					alert("SSL is required.  Please use secure HTTPS protocol to view this page.")
				}
				else if (answer == "mismatch")
				{
					lostpass.find("div#mismatch").fadeIn()
				}
				else if (answer == "invalid")
				{
					lostpass.find("div#invalid").fadeIn()
				}
				else if (answer == "success") 
				{
					lostpass2.find("div#success").fadeIn()
					show_lostpass2()
				} 
				else if (answer == "missing")
				{
					lostpass.find("div#missing").fadeIn()
				}
				else 
				{
					lostpass.find("div#error").fadeIn()
				}
			}) //close each(
			return false
		}, //close success:
		error: function(a,b,c) {
			alert("We were unable to communicate with our server.  Please try again later.  (" + b + ")")
		}
	}) //close ajax(
	return false
} //close aal_lostpass
function aal_lostpass2()
{
	/* Gets security question by sending to server: email, username, recoverycode 
	 */
	var email = lostpass.find("input#email").removeClass("error").val()
	var username = lostpass.find("input#username").removeClass("error").val()
	var verificationcode = lostpass2.find("input#verificationcode").removeClass("error").val()
	lostpass2.find("div#error, div#success, div#missing, div#invalid, div#mismatch").hide()
	$.ajax({
		type: "POST",
		url: "/api/user/0.1/index.php/security/question",
		data: {
			id        : nextID(),
			ae        : escape(email),
			au        : escape(username),
			ac	  : verificationcode
		},
		dataType: "xml",
		success: function(xml) {
                       $(xml).find('response').each(function(){
		       		var answer = $(this).text()
				if (answer == "sslrequired")
				{
					lostpass2.find("div#error").fadeIn()
					alert("SSL is required.  Please use secure HTTPS protocol to view this page.");
				}
				else if (answer == "missing")
				{
					lostpass2.find("div#missing").fadeIn()
					lostpass2.find("input#verificationcode").focus();
				}
				else if (answer == "mismatch")
				{
					lostpass2.find("div#invalid").fadeIn()
					lostpass2.find("input#verificationcode").focus();
				}
				else if (answer == "invalid")
				{
					lostpass2.find("div#invalid").fadeIn()
					lostpass2.find("input#verificationcode").focus();
				}
				else if (answer == "success") 
				{
					var question = decodeURIComponent( $(this).attr("question") )
					lostpass3.find("div#securityquestion").empty().append("<b>"+question+"</b>")
					show_lostpass3()
				} 
				else 
				{
					$("div#error").fadeIn()
				}
			}); //close each(
		}, //close success:
		error: function(a,b,c) {
			alert("We were unable to communicate with our server.  Please try again later.  (" + b + ")")
		}
	}) //close ajax(
} //close aal_lostpass2

function aal_lostpass3()
{
	/* Gets password by sending to server; email, username, securityanswer, recoverycode 
	 */
	var email = lostpass.find("input#email").removeClass("error").val();
	var username = lostpass.find("input#username").removeClass("error").val();
	var verificationcode = lostpass2.find("input#verificationcode").removeClass("error").val();
	var answer = lostpass3.find("input#securityanswer").removeClass("error").val();
	lostpass3.find("div#error, div#success, div#missing, div#invalid, div#mismatch").hide();
	$.ajax({
		type: "POST",
		url: "/api/user/0.1/index.php/security/answer",
		data: {
			id        : nextID(),
			ae        : escape(email),
			au        : escape(username),
			sa	  : escape(answer),
			sa2	  : encodeURIComponent(answer),
			ac	  : verificationcode
		},
		dataType: "xml",
		success: function(xml) {
                       $(xml).find('response').each(function(){
		       		var answer = $(this).text();
				if (answer == "sslrequired")
				{
					lostpass3.find("div#error").fadeIn();
					alert("SSL is required.  Please use secure HTTPS protocol to view this page.");
				}
				else if (answer == "missing")
				{
					lostpass3.find("div#missing").fadeIn();
					lostpass3.find("div#securityanswer").focus();
				}
				else if (answer == "mismatch")
				{
					lostpass3.find("div#mismatch").fadeIn();
					lostpass3.find("div#securityanswer").focus();
				}
				else if (answer == "invalid")
				{
					lostpass3.find("div#invalid").fadeIn();
					lostpass3.find("div#securityanswer").focus();
				}
				else if (answer == "success") 
				{
					var password = unescape( decodeURIComponent( $(this).attr("password") ) );
					lostpass4.find("div#password").empty().append("<b><big>"+password+"</big></b>");
					show_lostpass4();
					$("input#verificationcode, input#securityanswer, input#email, div#lostpass input#username").val("");
				} 
				else 
				{
					lostpass3.find("div#error").fadeIn();
				}
			}); //close each(
		}, //close success:
		error: function(a,b,c) {
			alert("We were unable to communicate with our server.  Please try again later.  (" + b + ")");
		}
	}); //close ajax(
} //close aal_lostpass3
function aal_resetpass1()
{
	var invalid=0;
	var mismatch=0;
	resetpass1.find("div#invalid").hide();
	resetpass1.find("div#mismatch").hide();
	var newpassword = resetpass1.find("input#newpassword");
	var newpasswordverify = resetpass1.find("input#newpasswordverify");
	newpassword.removeClass("error");
	newpasswordverify.removeClass("error");
	if (newpasswordverify.val().length < 6)
	{
		invalid++;
		newpasswordverify.addClass("error");
		newpasswordverify.focus();
	}
	if (newpassword.val().length < 6) 
	{
		invalid++;
		newpassword.addClass("error");
		newpassword.focus();
	}
	if (newpassword.val() != newpasswordverify.val())
	{
		mismatch++;
		newpassword.addClass("error");
		newpassword.focus();
		newpasswordverify.addClass("error");
	}
	if (invalid)
	{
		resetpass1.find("div#invalid").fadeIn();
	}
	else if (mismatch)
	{
		resetpass1.find("div#mismatch").fadeIn();
	}
	else
	{
		show_resetpass2();
	}
}
function aal_resetpass2()
{
	var invalid=0;
	var mismatch=0;
	resetpass2.find("div#invalid").hide();
	resetpass2.find("div#mismatch").hide();
	var newpassword = resetpass1.find("input#newpassword");
	var newpasswordverify = resetpass1.find("input#newpasswordverify");
	var newsecurityquestion = resetpass2.find("select#newsecurityquestion");
	var newsecuritycustom = resetpass2.find("input#newsecuritycustom");
	var newsecurityanswer = resetpass2.find("input#newsecurityanswer");
	newpassword.removeClass("error");
	newpasswordverify.removeClass("error");
	newsecurityquestion.removeClass("error");
	newsecuritycustom.removeClass("error");
	newsecurityanswer.removeClass("error");
	if (newsecurityanswer.val().length < 3)
	{
		invalid++;
		newsecurityanswer.addClass("error");
		newsecurityanswer.focus();
	}
	if (newsecuritycustom.val().length < 3 && newsecurityquestion.val() == 0)
	{
		invalid++;
		newsecuritycustom.addClass("error");
		newsecuritycustom.focus();
	}
	if (newsecurityquestion.val() == -1)
	{
		invalid++;
		newsecurityquestion.addClass("error");
		newsecurityquestion.focus();
	}
	if (invalid)
	{
		resetpass2.find("div#invalid").fadeIn();
	}
	else
	{
		var email = lostpass.find("input#email").removeClass("error").val();
		var username = lostpass.find("input#username").removeClass("error").val();
		var verificationcode = lostpass2.find("input#verificationcode").removeClass("error").val();
		$.ajax({
			type: "POST",
			url: "/api/user/0.1/index.php/change/password",
			data: {
				au		: escape(username),
				ae		: escape(email),
				ac		: verificationcode,
				nap		: encodeURIComponent(newpassword.val()),
				nsq		: encodeURIComponent(newsecurityquestion.val()),
				nsc		: encodeURIComponent(newsecuritycustom.val()),
				nsa		: encodeURIComponent(newsecurityanswer.val())
			},
			dataType: "xml",
			success: function(xml) {
	                       $(xml).find('response').each(function(){
			       		var answer = $(this).text();
					switch (answer)
					{
						case "sslrequired":
							alert("We were rejected by the login server: SSL is required (HTTPS) in order to sign in.");
							break;
						case "success":
							show_resetpass3();
							break;
						case "badnewpass":
                					newpasswordverify.addClass("error");
							resetpass2.hide();
							resetpass1.show();
							newpassword.focus();
							resetpass1.find("div#invalid").fadeIn();
							break;
						case "badsecurityquestion":
							newsecurityquestion.addClass("error");
							newsecurityquestion.focus();
							newsecuritycustom.addClass("error");
							resetpass2.find("div#invalid").fadeIn();
							break;
						case "badsecurityanswer":
							newsecurityanswer.addClass("error");
							newsecurityanswer.focus();
							resetpass2.find("div#invalid").fadeIn();
							break;
						case "error":
							alert("There was an error processing this change.  Please start over and try again.");
							resetpass2.hide();
							lostpass1.show();
							break;
						case "failure":
							alert("The server is currently unable to process this.  Please wait a little bit before resubmitting.");
							break;
						default:
							alert(answer);
							break;
					}
				}); //close each(
			}, //close success:
			error: function(a,b,c) {
				alert("We were unable to communicate with our server.  Please try again later.  (" + b + ")");
			}
		}); //close ajax(
	}
}
function aal_signin()
{
	/* Signs in user by sending to server: username, password
	 */
	signin
		.find("input#username, input#password").removeClass("error")
	signin
		.find("#password_error").hide()
	var username = signin.find("input#username").val();
	var password = signin.find("input#password").val();
	$.ajax({
		type: "POST",
		url: "/api/user/0.1/index.php/signin",
		data: {
			id        : nextID(),
			username  : escape(username),
			password  : encodeURIComponent(password) 
		},
		dataType: "xml",
		success: function(xml) {
                       $(xml).find('response').each(function(){
		       		var answer = $(this).text();
				switch (answer)
				{
					case "sslrequired":
						alert("We were rejected by the login server: SSL is required (HTTPS) in order to sign in.");
						break;
					case "success":
						window.location.href = $("#aal").data("destination");
						break;
					case "must_set_email":
						alert("Your Astra Account has no email address on record.  We now require you to set one before you can sign in.  Press OK to add an email address to your Astra Account.");
						window.location.href = "/account/email/";
						break;
					default:
						badpass();
						break;
				}
			}); //close each(
		}, //close success:
		error: function(a,b,c) {
			alert("We were unable to communicate with our server.  Please try again later.  (" + b + ")");
		}
	}); //close ajax(
} //close aal_signin(
var currentID=0;
function nextID() { return currentID++; }
function badpass()
{
	signin.find("input#username, input#password").addClass("error");
	signin.find("#password_error").fadeIn();
}
function showLoginForm(target, destination)
{
	/* Pulls down the thickbox itself */
	/* Wrapper for showLoginThickbox */
	$("#aal").data("destination", destination);
	showLoginThickbox(target);
	if (signin.find("input#username").val()) signin.find("input#password").focus();
	else signin.find("input#username").focus();
        return false;
}
function showLoginThickbox(target)
{
	/* Pulls down the thickbox itself */
	var t = "Trillian <b>Sign In</b>";
	var height = 350-40;
	if (!$.browser.msie) height = 306-40;
	var a = "#TB_inline?height="+height+"&width=940&inlineId=aal&modal=true";
	var g = false;
        tb_show(t,a,g);
        if (target) target.blur();
}
function userLoggedIn()
{
	/* Returns Astra username; or false */
	var username = $.cookie("astra_username");
	var loggedin = $.cookie("astra_loggedin")
	if (username && loggedin) return username;
	return false;
}
