BF_Login = function() {	

	this.AUTH_RETURN_PAGE_COOKE = 'auth_return_page_cookie';
	
	this.LOGIN_ERR = 'Please enter a username and a password';
	this.AUTH_ERR = 'Please enter a valid username and a password';
	this.ERR = 'Sorry, we&rsquo;re unable to process your request at this time.';
	this.PASSWORD_ERR = 'Please enter your email address';
	this.PASSWORD_SUCCESS = 'We&rsquo;ve sent you an email with a reset password link.';
	this.PASSWORD_SERVER_ERROR = 'There was a problem contacting the server and we were unable to reset your password. Please try again later.';
	this.NEED_VALIDATION_ERROR = 'Your account needs to be validated. Please check your email for a validation link.';
	
	this.init = function(args) {
		this.already_sent = false;
		bf_login.ajax = new BF_Request();
		// Show/hide appropriate elements depending on whether user is logged in or not
		bf_register = new BF_Register();
		var user = new BF_User();
		var logged_in_elements = $$('.logged-in');
		var logged_out_elements = $$('.not-logged-in');
		if ( user.isLoggedIn() ) {
			logged_in_elements.each( function(el){el.show()} );
			logged_out_elements.each( function(el){el.hide()} );
		}
		else {
			logged_in_elements.each( function(el){el.hide()} );
			logged_out_elements.each( function(el){el.show()} );
		}
		if ( BF_STATIC.facebook_enabled ) {
			$$('.hide-unless-facebook-enabled').each( function(el){ el.show(); } );
		}
		// redirect user to their profile page if they are logged in and on the signin page
		{
			var si_user = new BF_User();
			if(document.location.pathname.toString().match(/\/(signin|signin\/)$/)  && si_user.isLoggedIn() && document.location.search.indexOf('microsite') == -1 ) {
				var si_user_info = si_user.getUserInfo();				
				var userpage = BF_STATIC.web_root + '/' + si_user_info.username;
				document.location.href = userpage;
				return;				
			}
			if ( ! si_user.isLoggedIn() && document.location.search.indexOf('microsite') != -1 ) {
				window.location.href = document.location.pathname;
			}
		}
					
		if ( args ) this.args = args;

		/*
		 * Event observer for submitting "Reset Password" form
		 * in /signin
		 */
		var forgot_password_form = $('forgot-password-form');
		if (forgot_password_form) {
			if (! bf_login.initialized ) {
				forgot_password_form.observe('submit',
					function(event) {
						event.stop();
						bf_login.reset_password();
					}.bind(this)			
				);
			}
		}
		
		var login_form = $('login-form');
		if(login_form) {			
			if (! bf_login.initialized ) {
				bf_login.initialized = true;
				login_form.observe('submit',
					function(event) {
						event.stop();
						bf_login.login();
					}.bind(this)			
				);
			}
		}
		var link_accounts_form = $('link-accounts-form');
		if ( link_accounts_form ) {
			link_accounts_form.observe( 'submit',
				function (e) {
					e.stop();
					bf_login.link_accounts();
				}.bind(this)
			);
		}

		var forgot_password_link = $('forgot-password-link');
		if ( forgot_password_link ) {
			forgot_password_link.observe('click',
				function( event ) {
					event.stop();
					$('login-form').hide();
					$('forgot-password-form').show();
				}.bind(this)
			);
		}
		var registration_form = $('regsitration-form');
		if ( registration_form && $('switch_to_register') ) {
			$('switch_to_register').observe('click',function(e){
				e.stop();
				$('login-form').hide();
				$('regsitration-form').showOnScreen();
			});
		}
		else if ($('switch_to_register')){
			$('switch_to_register').observe('click',function(e){
				e.stop();
				window.location.href=BF_STATIC.web_root + '/signup';
			});
		}
		var switch_to_login = $('switch_to_login');
		if ( switch_to_login ) {
			switch_to_login.observe('click',
				function( event ) {
					event.stop();
					bf_login.switch_registration_to_login();
				}.bind(this)
			);
		}
		var forgot_password_cancel = $('forgot-password-cancel');
		if ( forgot_password_cancel ) {
			forgot_password_cancel.observe('click',
				function( event ) {
					event.stop();
					bf_login.cancel_reset_password();
				}.bind(this)
			);
		}
		
		/// if bad auth cookie
		if(document.location.search.indexOf('badauth=true') > -1) {
			$('bad-cookie-message').show();
		}
		if ( BF_STATIC && BF_STATIC.facebook_enabled == true ) {
			if ($('facebook-login')) {
				$('login-form').addClassName('facebook-enabled');
				$('facebook-login').show();
			}
		}
		
		if ( document.location.pathname.toString().match(/\/(signin|signin\/)$/) ) {
			facebook.auto_register_enabled = false;
			facebook.link_accounts_enabled = true;
		}
	}

	this.switch_login_to_alias_registration = function() {
		$('login-form').hide();
		$('regsitration-form').hide();
		$('alias-registration-form').show();
		$('user_signin_message').hide();
		$('create_site_message').show();
	}

	this.switch_login_to_registration = function() {
		facebook.auto_register_enabled = false;
		facebook.observe( 'user_logged_in', function( ){
			var email = 'get_from_facebook@buzzfeed.com';
			try {
				email = facebook.user_data.email;
			} catch(e){}
			var initial_registration_fieldset = $('initial-registration-fieldset');
			var facebook_connected_div = $('facebook-connected-div');
			var facebook_button_div = $('facebook-registration-fieldset');
			if ( facebook_button_div ) { facebook_button_div.hide(); }
			if ( initial_registration_fieldset ) { initial_registration_fieldset.hide(); }
			if ( facebook_connected_div ) { facebook_connected_div.show(); }
			var temp_pw = '';
			var character = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_!@#$%^&*(){}[]:";<>,./?|';
			for( var i = 0; i < 10; i++ ) {
				temp_pw += character[Math.round(Math.random()*character.length-1)];
			}
			event_handler.HANDLERS['map_into'](
				{target:{value:temp_pw}},
				{target:'submit-button',field:'register.pw2'}
			);
			event_handler.HANDLERS['map_into'](
				{target:{value:temp_pw}},
				{target:'submit-button',field:'register.pw'}
			);
			event_handler.HANDLERS['map_into'](
				{target:{value:facebook.session.uid}},
				{target:'submit-button',field:'register.facebook_uid'}
			);
			event_handler.HANDLERS['map_into'](
				{target:{value:email}},
				{target:'submit-button',field:'register.email'}
			);
			event_handler.HANDLERS['map_into'](
				{target:{value:facebook.session.session_key}},
				{target:'submit-button',field:'register.facebook_session_key'}
			);
		});
		if ($('login-form')) $('login-form').hide();
		if ($('regsitration-form')) $('regsitration-form').show();
		if ($('alias-registration-form')) $('alias-registration-form').hide();
		if ($('new-registration-form')) $('new-registration-form').show();
		BF_UserSwitcher.count_aliases( function(obj){
			if ( $('alias-sites-left') && obj.success ) {
				var user_info = new BF_User().getUserInfo();
				var remaining = parseInt(user_info.max_aliases) - parseInt(obj.count);
				$('alias-sites-left').update( remaining ); 
				if ( remaining == 1 ) $('alias-sites-left-plural').hide();
				if ( obj.unlimited == 1) $('alias-count-message').hide();
				else $('alias-count-message').show();
				if ( remaining <= 0 && user_info.max_aliases != 0 ) {
					$('alias-registration-fieldset').hide();
					$('alias-registration-hit-limit').show();
				}
			}
		});
	}

	this.switch_to_link_accounts = function() {
		if ($('login-form')) $('login-form').hide();
		if ($('regsitration-form')) $('regsitration-form').hide();
		if ($('link-accounts-form')) $('link-accounts-form').show();
		if ($('alias-registration-form')) $('alias-registration-form').hide();
	}

	this.switch_registration_to_login = function() {
		if ($('link-accounts-form')) $('link-accounts-form').hide();
		$('login-form').show();
		$('regsitration-form').hide();
		$('alias-registration-form').hide();
	}

	this.cancel_reset_password = function() {
		$('login-form').show();
		$('forgot-password-form').hide();
		$('alias-registration-form').hide();
	}

	this.reset_password = function() {
		if ( this.already_sent ) return;
		this.already_sent = true;
		$('forgot-password-cancel').hide();
		var reset_password_status = $('resetting-password-status');
		if (reset_password_status) reset_password_status.show();
		$('forgot-password-message').hide();		
		var email = $F('login-email');
		if ( !email ) {
			this.setError( this.PASSWORD_ERR, 'forgot-password' );
			if ( reset_password_status ) reset_password_status.hide();
			$('forgot-password-cancel').show();
		}
		else {
			$('forgot-password-submit').disabled = true;

			var lr = function(resp) {
				this.passwordSent(resp);
			}.bindAsEventListener(this);

			var er = function(resp) {
				$('forgot-password-cancel').show();
				this.err(resp,'forgot-password');
			}.bindAsEventListener(this);

			var params = { email: email } 
			bf_login.ajax.request('/buzzfeed/_forgot_password', {method:'get',parameters:params,onSuccess:lr,onFailure:er});
		}
	}

	this.link_accounts = function() {
		try {
			if ($('link-accounts-status')) $('link-accounts-status').show();
			$('link-accounts-message').hide();		
			var username = $F('link-accounts-username');
			var password = $F('link-accounts-password');
			if(! username || ! password) {
				if ($('link-accounts-status')) {
					$('link-accounts-status').hide();
				}
				this.setError(this.LOGIN_ERR, 'link-accounts');
			} else {		
				$('link-accounts-submit').disabled = true;
	
				var lr = function(resp) {
					this.loggedIn(resp, {link_accounts:1});
				}.bindAsEventListener(this);
				
				var er = function(resp) {
					$('link-accounts-status').hide();
					$('link-accounts-submit').enable();
					$('link-accounts-message').update(this.LOGIN_ERR);
				}.bindAsEventListener(this);
				
				var params = { username: username, password: password, contribute: 1} 
				bf_login.ajax.request('/buzzfeed/_www_login', {method:'post',parameters:params,onSuccess:lr,onFailure:er});
			}
		} catch(e) {
			console.error(e);
		}
	}

	this.login = function() {
		try {
			$('bad-cookie-message').hide();
			if ($('logging-in-status')) $('logging-in-status').show();
			$('login-message').hide();		
			var username = $F('login-username');
			var password = $F('login-password');
			if(! username || ! password) {
				if ($('logging-in-status')) {
					$('logging-in-status').hide();
				}
				this.setError(this.LOGIN_ERR);
			} else {		
				$('login-submit').disabled = true;
	
				var lr = function(resp) {
					this.loggedIn(resp);
				}.bindAsEventListener(this);
				
				var er = function(resp) {
					this.err(resp);
				}.bindAsEventListener(this);
				
				//if ($('register-submit')) $('register-submit').disabled = true;
				var params = { username: username, password: password, contribute: 1} 
				bf_login.ajax.request('/buzzfeed/_www_login', {method:'post',parameters:params,onSuccess:lr,onFailure:er});
			}
		} catch(e) {
			console.error(e);
		}
	}


	this.cookieLogin = function() {
		var lr = function(resp) {
			this.loggedIn(resp);
		}.bindAsEventListener(this);		
		var er = function(resp) {
			this.err(resp);
		}.bindAsEventListener(this);		
		var params = { session_key: BFW_Util.getCookie(BFW_COOKIE) } 
		new Ajax.Request('/buzzfeed/_www_login', {method: 'post', parameters: params, onSuccess: lr, onFailure: er});		
	}
		
	this.passwordSent = function(resp) {
		$('forgot-password-cancel').show();
		var reset_password_status = $('resetting-password-status');
		try {
			obj = eval('(' + resp.responseText + ')');
			if ( obj.updated ) {
				this.setError( this.PASSWORD_SUCCESS,'login' );
				$('login-message').className = 'message success';
				if ( reset_password_status ) reset_password_status.hide();
				$('login-form').show();
				$('forgot-password-form').hide();
			}
			else if ( 'User needs validation' == obj.error ) {
			  this.setError( this.NEED_VALIDATION_ERROR, 'forgot-password' );
				if ( reset_password_status ) reset_password_status.hide();
			}
			else {
				this.setError( obj.error, 'forgot-password' );
				this.already_sent = false;
				if ( reset_password_status ) reset_password_status.hide();
			}
		}
		catch (e) {
			console.dir({e: e});
			if ( reset_password_status ) reset_password_status.hide();
		}
	}
	
	this.loggedInCallbacks = [];
	this.loggedIn = function(resp, args) {
		if ( !args ) args = {};
		if ( document.location.search.indexOf( 'contribution=false' ) != -1 && !this.args ) this.args = { action : 'badge_vote' };
		try {
			if( $('login-submit') ) $('login-submit').disabled = false;
			if( $('link-accounts-submit') ) $('link-accounts-submit').disabled = false;			
			obj = eval('(' + resp.responseText + ')');
			if(obj.login) {
				// set cookie...
				BFW_Util.setCookie({name: BFW_COOKIE, value: obj.session_key });
				
				try {
					BFW_Util.setInfoCookie({value: obj });
				}
				catch(e) {
					console.error(e);
				}
				facebook.link_accounts();
				if ( typeof prepopulated_quickpost_manager != 'undefined' && prepopulated_quickpost_manager.onLogin ) {
					prepopulated_quickpost_manager.onLogin();
				}
				if ( typeof contest_manager != 'undefined' && contest_manager.onLogin ) {
					contest_manager.onLogin();
				}
				if ( typeof picks_controller != 'undefined' && picks_controller != null && picks_controller.onLogin ) {
					picks_controller.onLogin();
				}
				if ( typeof badge_vote_manager != 'undefined' && badge_vote_manager.onLogin ) {
					badge_vote_manager.onLogin();
					badge_vote_manager.onLogin = null;
				}
				if ( this.args && this.args.current_page == 'home' && !obj.test_mode && window.location.href.indexOf('testmode=on') == -1) {
					var url = BFW_Util.getCookie(this.AUTH_RETURN_PAGE_COOKE);
					if(url) {
						BFW_Util.deleteCookie(this.AUTH_RETURN_PAGE_COOKE);
						document.location = url;
					} else { 
						window.location.href = BF_STATIC.web_root + '/' + escape(obj.username);
					}
				}
				else if ( this.args && this.args.action=='vote' && vote_manager.contribution_id) {
					vote_manager._vote( null, vote_manager.contribution_id );
					if ( $('registration-div') ) {
						$('login-message').show();
						$('login-message').className = 'message success';
						$('login-message').update("Login Successful");
						if ($('logging-in-status')) $('logging-in-status').hide();
						$('login-fieldset').hide();
						setTimeout(function(){fadeOut('registration-div',100);},2000);
					}
				}
				else if ( this.args && this.args.action=='userdata') {					
					var user_nav = new BF_UserNav();
					user_nav.init();									
				}
				else if ( this.args && this.args.action=='bookmarklet') {					
					bf_bm.showForm();								
				}				
				else if ( this.args && this.args.action == 'badge_vote' ) {
					$('registration-div').hide();
					if ($('contribute-preview')) $('contribute-preview').hide();				
				}
				else {
					if ($('registration-div')) $('registration-div').hide();
					if ($('contribute-preview')) $('contribute-preview').hide();				
					if( $('contribute-submit-fieldset') ) $('contribute-submit-fieldset').show();
					if ( typeof bf_contribute != 'undefined' ) bf_contribute.submit();	
				}
				if ($('usernav-signin')) $('usernav-signin').hide();
				if ($('usernav-signup')) $('usernav-signup').hide();
				var user_nav = new BF_UserNav();
				user_nav.init();
				if ( this.loggedInCallbacks ) {
					this.loggedInCallbacks.each(function(fn){
						fn();
					});
				}
			} else {
				if ( args.link_accounts ) {
					this.setError(this.AUTH_ERR, 'link-accounts');	
				} 
				else {
					this.setError(this.AUTH_ERR);	
				}
				if ($('logging-in-status')) $('logging-in-status').hide();
				if ($('link-accounts-status')) $('link-accounts-status').hide();
			}
		} catch(e) {
			console.dir({e: e});
		}		
	}
	this.err = function(resp,target) {
		//BFW_Util.deleteCookie(BFW_COOKIE); 
		this.setError(this.ERR, target);
		if ($('logging-in-status')) $('logging-in-status').hide();
		if ($('resetting-password-status')) $('resetting-password-status').hide();
	}
	
	this.setError = function(err, target) {
		if ( !target ) target = 'login';
		try {
			$(target + '-message').update(err);
		} catch(e){
			$(target + '-message').innerText = err;
		}
		$(target + '-message').className='message error';
		$(target + '-message').show();
		$(target + '-submit').disabled = false;
	}
}

bf_login = new BF_Login();
BuzzLoader.register( bf_login.init, 1 );

var fadeOut = function(id,opacity) {
	$(id).setOpacity(opacity/100);
	if(opacity > 0) {
		setTimeout("fadeOut('"+id+"',"+(opacity-2)+")",5);
	} else {
		$(id).hide();
	}
};
