/**
 * Toggle the display of a prompt
 *
 * @param bool 			display 	Whether to show or hide prompt
 * @param string		id				Prompt identifier
 */
function prompt_toggle(display, id, params)
{ 
	if(display)
	{
		// Determine URL for given prompt and run any other preprocessing
		switch(id)
		{
			case 'sign_in':
			
				var url = routes['prompt_sign_in'];
				
				if(params)
				{
					prompt_sign_in_callback_custom = params['callback'];
				}
				else
				{
					prompt_sign_in_callback_custom = null;
				}
				
				// Load the Twitter authorize URL if not already loaded so Twitter Sign In button works
				if(!twitter_authorize_url)
				{
					fetch_twitter_authorize_url();
				}
					
				break;
				
			case 'subscribe_all':
				var url = routes['prompt_subscribe_all'];
				break;
				
			case 'calendar_export':

				if(params['scope'] == 'local' && (typeof params['place_id'] == 'undefined'))
				{
					params['scope'] = 'everywhere';
				}
			
				var url = routes['plan_listings'];
				break;
				
			case 'user_pic':
				var url = routes['prompt_user_pic'];
				break;
				
			default: 
				var url = routes['prompt_'+id];
				break;
		}

		prompt_page_cover_toggle(true);

		var prompt_exterior = $('<div />');
		prompt_exterior.attr('id', 'prompt_exterior_'+id);
		prompt_exterior.addClass('prompt_exterior');
		prompt_exterior.css({ top: ($(window).scrollTop())+'px' });
		
		var prompt = $('<div />');
		prompt.attr('id', 'prompt_'+id);
		prompt.addClass('prompt');
		
		var prompt_interior = $('<div />');
		prompt_interior.addClass('prompt_interior');
		prompt_interior.addClass('prompt_wait');
		
		prompt.append(prompt_interior);
		prompt_exterior.append(prompt);
			
		var body = $('body');
		body.append(prompt_exterior);

		var onSuccess = function(data)
		{
			// Size the prompt based on the request format
			if(request_format == 'standard')
			{
				prompt.css({ width: data.width+'px' });
				prompt_interior.css({ width: (data.width-52)+'px', height: 'auto', background: 'white' });
			}
			else
			{
				prompt.css({ width: ($(document).width() - 20) + 'px' });
				prompt_interior.css({ width: ($(document).width() - 52) + 'px', height: 'auto', background: 'white' });
			}
			
			prompt_interior.append(data.html);
			
			// Expand height of prompt to the maximum size given the size of the viewport, if desired
			if(data.max_height_element)
			{
				viewport_bound_elements.push(data.max_height_element);
				
				resize_fixed_elements();
			}
			
			// Execute prompt-specific display script, if appropriate
			switch(id)
			{
				case 'plan_merge':
				
					$('#plan_merge_prompt_1').find('input').focus();
					
					break;
					
				case 'syndicate_plan':
				case 'plan_add':
				
					fetch_twitter_authorize_url();
					fetch_google_authorize_url();
					fetch_linkedin_authorize_url();
					
					break;
					
				case 'plan_comments':
				
					setTimeout("$('#plan_comments_add_input').focus();",100);
					
					break;
					
				case 'plan_place':
				
					setTimeout("plan_place_map_initialize()",100);
					
					break;
					
				case 'user_new_place':
				
					$('#prompt_user_new_place_input').focus();
					
					break;

				case 'plan_suggestion':

					setTimeout("var input = $('#prompt_plan_suggestion_input_exterior').find('input').focus();",200);

					break;
			}
		}
		
		// Close prompt if loading content fails
		var onFailure = function()
		{
			prompt_toggle(false,id);
		}

		// Remove any callback function from the params before getting the prompt content, otherwise JQuery borks
		if(typeof params != 'undefined')
		{
			params['callback'] = undefined;
		}
		
		$.get(url, params, onSuccess).error(onFailure);
	}
	else
	{
		$('#prompt_exterior_'+id).remove();
		prompt_page_cover_toggle(false);
		
		// Execute prompt-specific hide script, if appropriate
		switch(id)
		{
			case 'plan_comments':
			case 'plan_attendees':
				var idx = jQuery.inArray('plan_comments_ul', viewport_bound_elements);

				if(idx != -1) 
				{
					viewport_bound_elements.splice(idx, 1); 
				}
				
				break;
				
			case 'syndicate_plan':
			
				if(isset('params') && params['redirect'])
				{
					window.location.href = params['redirect'];
				}
			
				break;
		}
	}
}

var prompt_prompt_page_cover_onclick;

/**
 * Toggle the display of the page cover (used as a backdrop for overlayed prompts)
 * 
 * @param boolean display Whether to show or hide the cover
 * @param function onclick Function to trigger if user clicks on the cover when shown
 */
function prompt_page_cover_toggle(display,onclick)
{
  if(display)
  {
		var body 									= $('body');
		var prompt_page_cover 		= $('<div />');
		
		prompt_page_cover.attr('id', 'prompt_page_cover');

		if(onclick)
    {
      prompt_page_cover.bind('click',onclick);
    }

		body.append(prompt_page_cover);
  }
  else
  {
    $('#prompt_page_cover').remove();
  }
}

/**
 * Actions to take after user has signed in
 *
 */
function prompt_sign_in_callback()
{
	// Run custom prompt sign in callback if available
	if(typeof prompt_sign_in_callback_custom == 'function')
	{
		// Skip rest of sign in procedure if the callback returns true, indicating it has triggered a page refresh
		if(prompt_sign_in_callback_custom())
		{
			return true;
		}
	}

	// Run custom page sign in callback if available
	if(typeof page_sign_in_callback == 'function')
	{
		page_sign_in_callback()
	}

	// Display a welcome toaster if appropriate for the newly signed-in user
	if(!session_user_activated && request_format != 'mobile')
	{
		insert($('body'), 'user/welcomeToaster');
	}

	// Remove all notices
	var notices = $(document).find('.notice');
	notices.remove();
	
	// Hide prompt
	prompt_toggle(false,'sign_in');
	
	// Hide banner
	$('#banner').hide();
	
	// Replace header options
	if(request_format != 'mobile')
	{
		$.get(routes['user_header_options'], function(data) { $('#header_right').html(data.html); });
	}
}

var prompt_sign_in_callback_custom;
var prompt_sign_in_pending = false;
var session_user_activated;

/**
 * Submit username and password for sign in prompt
 *
 */
function prompt_sign_in_submit()
{
	if(prompt_sign_in_pending || !$('#prompt_sign_in_username').val() || !$('#prompt_sign_in_password').val() || $('#prompt_sign_in_username').val() == 'username' || $('#prompt_sign_in_password').val() == 'password')
	{
		return;
	}
	
	var parameters =
	{ 
		username: 	$('#prompt_sign_in_username').val(),
		password: 	$('#prompt_sign_in_password').val()
	};

	var onSuccess = function(data)
	{
		track_event('Users', 'Sign In Ajax Regular');
		
		var msg = data.msg;
		
		if(msg == 'success')
		{	
			session_user_id 										= data.session_user_id;
			session_facebook_user_id 						= data.session_facebook_user_id;
			session_twitter_user_id 						= data.session_twitter_user_id;
			session_linkedin_user_id 						= data.session_linkedin_user_id;
			session_google_user_authenticated 	= data.session_google_user_authenticated;
			session_user_activated 							= data.session_user_activated;
			
			// Run callback and return if function returns true
			if(prompt_sign_in_callback())
			{
				return;
			}
		}
		else
		{
			$('#prompt_sign_in_notice').show();
			$('#prompt_sign_in_password').focus();
		}
		
		prompt_sign_in_pending = false;
		$('#prompt_sign_in_submit_button').css({ opacity: 1, cursor: 'pointer' });
		$('#prompt_sign_in_submit_pending').hide();
	};

	var onFailure = function()
	{
		prompt_sign_in_pending = false;
	};
	
	prompt_sign_in_pending = true;
	$('#prompt_sign_in_submit_button').css({ opacity: .7, cursor: 'default' });
	$('#prompt_sign_in_submit_pending').show();
	$('#prompt_sign_in_notice').hide();
	
	// and remember the jqxhr object for this request
	$.post(routes['user_sign_in'], parameters, onSuccess).error(onFailure);
}

var prompt_sign_in_create_pending = false;

/**
 * Submit create account form for sign in prompt
 *
 */
function prompt_sign_in_create_submit()
{
	if(prompt_sign_in_create_pending) { return; } // canary
	
	if(!$('#prompt_sign_in_create_name').val() || !$('#prompt_sign_in_create_email').val() || !$('#prompt_sign_in_create_password').val())
	{
		alert('Please fill out all of the fields before submitting.');
		return;
	}
	
	if(!is_valid_email($('#prompt_sign_in_create_email').val()))
	{
		alert('Please check your email address to make sure it\'s correct.');
		return;
	}
	
	if(trim($('#prompt_sign_in_create_password').val()).length < 6)
	{
		alert('Please provide a password that is at least 6 characters in length.');
		return;
	}
	
	var parameters =
	{ 
		name: 			$('#prompt_sign_in_create_name').val(),
		email: 			$('#prompt_sign_in_create_email').val(),
		password: 	trim($('#prompt_sign_in_create_password').val())
	};

	var onSuccess = function(data)
	{
		track_event('Users', 'Sign Up Ajax Regular');
		
		var msg = data.msg;
		
		if(msg == 'success')
		{
			session_user_id 							= data.session_user_id;
			session_user_activated 				= data.session_user_activated;
			
			// Run callback and return if function returns true
			if(prompt_sign_in_callback())
			{
				return;
			}
		}

		prompt_sign_in_create_pending = false;
		$('#prompt_sign_in_create_submit_button').css({ opacity: 1, cursor: 'pointer' });
		$('#prompt_sign_in_create_submit_pending').hide();
	};

	var onFailure = function()
	{
		prompt_sign_in_create_pending = false;
	};
	
	prompt_sign_in_create_pending = true;
	$('#prompt_sign_in_create_submit_button').css({ opacity: .7, cursor: 'default' });
	$('#prompt_sign_in_create_submit_pending').show();
	
	$.post(routes['user_sign_up'], parameters, onSuccess).error(onFailure);
}

/**
 * Submit reset password form in sign in prompt
 *
 */
function prompt_sign_in_reset_submit()
{
	var email = $('#prompt_sign_in_reset_email').val();
	
	// Canary for email address
	if(!email || !is_valid_email(email))
	{
		alert('Please provide a valid email address.');
		return;
	}
	
	var onSuccess = function(data) 
	{
		if(data.msg == 'failure')
		{
			alert("The email address you submitted doesn't match any user on Plancast. Please check it and try again.");
			return;
		}
		
		$('#prompt_sign_in_reset').hide();
		$('#prompt_sign_in_reset_confirm').show();
	}
	
	$.post(routes['user_reset_password'], { 'email' : email }, onSuccess);
}

/**
 * Toggle the selection of a service in the plan syndication prompt
 *
 */
function prompt_syndicate_plan_toggle_service(event,service)
{
	var checkbox 	= $('#prompt_syndicate_plan_checkbox_'+service);
	var tr 				= $('#prompt_syndicate_plan_tr_'+service);
	
	// Ensure the user has authenticated to the service to which they want to syndicate
	switch(service)
	{
		// Facebook
		case 'facebook':
			if(!session_facebook_user_id)
			{
				popup_external_service_authorize_display('facebook',"opener.prompt_syndicate_plan_toggle_service(null,'facebook')"); 
				return;
			}
			
			break;
		
		// Twitter
		case 'twitter':
			if(!session_twitter_user_id)
			{
				popup_external_service_authorize_display('twitter',"opener.prompt_syndicate_plan_toggle_service(null,'twitter')"); 
				return;
			}
			
			break;
			
		// LinkedIn
		case 'linkedin':
			if(!session_linkedin_user_id)
			{
				popup_external_service_authorize_display('linkedin',"opener.prompt_syndicate_plan_toggle_service(null,'linkedin')"); 
				return;
			}
			
			break;
			
		// Google Buzz
		case 'buzz':
			if(!session_google_user_authenticated)
			{
				popup_external_service_authorize_display('google',"opener.prompt_syndicate_plan_toggle_service(null,'buzz')"); 
				return;
			}
			
			break;
	}
	
	if(!checkbox.attr('checked'))
	{
		tr.addClass('prompt_syndicate_plan_selected');
		checkbox.attr('checked', true);
	}
	else
	{
		tr.removeClass('prompt_syndicate_plan_selected');
		checkbox.attr('checked', false);
	}

	if(prompt_syndicate_plan_service_checked())
	{
		$('#prompt_syndicate_plan_post_button_li').show();
		$('#prompt_syndicate_plan_cancel_button_li').hide();
	}
	else
	{
		$('#prompt_syndicate_plan_post_button_li').hide();
		$('#prompt_syndicate_plan_cancel_button_li').show();
	}
	
	if(event)
	{
		event.stopPropagation();
	}
	
	prompt_syndicate_plan_update_save_text();
}

/**
 * Indicates whether at least one service is checked in the plan syndicate prompt
 *
 */
function prompt_syndicate_plan_service_checked()
{
	var checkboxes = $('#prompt_syndicate_plan_table').find('input');
	
	for(var i = 0; i < checkboxes.length; i++)
	{
		if($(checkboxes[i]).attr('checked'))
		{
			return true;
		}
	}
	
	return false;
}

/**
 * Submit the plan syndication prompt
 *
 */
function prompt_syndicate_plan_submit(syndicate,redirect_url)
{
	$('#prompt_syndicate_plan_submit_button').css({ opacity: .5, cursor: 'default' });
	$('#prompt_syndicate_plan_cancel_button').css({ opacity: .5, cursor: 'default' });
	$('#prompt_syndicate_plan_submit_pending').show();

	var services = new Array();
	
	if(syndicate)
	{
		if($('#prompt_syndicate_plan_checkbox_facebook').attr('checked'))
		{
			services[0] = 'facebook';
		}
	
		if($('#prompt_syndicate_plan_checkbox_twitter').attr('checked'))
		{
			services[1] = 'twitter';
		}
	
		if($('#prompt_syndicate_plan_checkbox_buzz').attr('checked'))
		{
			services[2] = 'buzz';
		}
	}
	
	var parameters = 
	{
		'services[]' 			: services,
		'save_syndicates' : $('#save_syndicates').attr('checked')
	}
	
	$.post(routes['user_plan_syndication'], parameters);
	
	if(redirect_url != null)
	{
		window.location.href = redirect_url;
	}
	else
	{
		prompt_toggle(false,'syndicate_plan');
	}
}

/**
 * Update the "save text" for the plan syndication prompt based on user's selection
 *
 */
function prompt_syndicate_plan_update_save_text()
{
	var text = $('#prompt_syndicate_plan_save_text');
	
	var selections = new Array();
	var checkboxes = $('#prompt_syndicate_plan_table').find('input');
	
	for(var i = 0; i < checkboxes.length; i++)
	{
		if($(checkboxes[i]).attr('checked'))
		{
			selections.push(capitalize_words($(checkboxes[i]).val()));
		}
	}
	
	if(!selections.length)
	{
		text.html("Don't ask again");
	}
	else
	{
		text.html("Automatically post my plans to "+list_array(selections)+" in the future");
	}
}
