// Stored info about the current plan listings
var plans_params = new Array();

// Stored info about current page
var plan_page_info 			= new Array();
var category_page_info 	= new Array();

// Ajax cache objects, used for when we need to cancel requests
var plans_tabs_select_ajax 				= new XMLHttpRequest();
var plans_tabs_select_insert_ajax = new XMLHttpRequest();

/**
 * Indicates whether two sets of plans parameters match
 *
 * @param Array params1
 * @param Array params2
 * @return bool
 */
function plans_params_match(params1, params2)
{
	if(typeof params1 == 'undefined' || typeof params2 == 'undefined') { return false; } // canary
	
	// Compare type
	if(params1['type'] != params2['type'] && !(!params1['type'] && params2['type'] == 'categorized' || !params2['type'] && params1['type'] == 'categorized'))
	{
		return false;
	}

	// Compare category
	if(params1['type'] == 'category' && !(params1['category_id'] == params2['category_id'] || params1['category_slug'] == params2['category_slug']))
	{
		return false;
	}
	
	// Compare scopes
	if(params1['scope'] != params2['scope'] && params1['type'] != 'user')
	{
		return false;
	}

	// Compare places
	if(params1['scope'] == 'local' && params1['place_id'] != params2['place_id'] && params1['type'] != 'user')
	{
		return false;
	}
	
	return true;
}

/**
 * Selects a plans tab
 *
 * @param string url URL of plans
 */
function plans_tabs_select(url, event)
{
	// Allow opening of new window if certain keys pressed or middle button used
	if(event && (event.metaKey || event.shiftKey || event.ctrlKey || event.which == 2)) { return true; }

	// Don't proceed if current plan params match those selected
	if(plans_params_match(get_state_plans_params(url), plans_params))
	{
		return false;
	}

	// Grab link element that corresponds to url
	if(url != '/')
	{ 
		element = $('#plans_tabs a[href^="' + get_unscoped_state(url) +'"]'); 
	}
	else
	{ 
		element = $('#plans_tabs_' + default_plans_tab);
	}
	
	// Change address bar to reflect URL
	change_state(url);
	
	// Abort any previously triggered, relevant ajax calls
	plans_tabs_select_ajax.abort();
	plans_tabs_select_insert_ajax.abort();

	if($('#content_bumper').length)
	{
		loading_more_content = false;
		clearInterval(infinite_scroll_interval);
		$('#content_bumper').hide();
		$('#content_loading').hide();
	}

	// Hide scope menu if selecting "me" tab
	if(url.split('/')[2] == 'me')
	{
		$('#plans_scope_menu').hide();
	}
	// Otherwise, show scope menu
	else
	{
		$('#plans_scope_menu').show();
	}

	// Change selected tab
	$('.plans_tabs_selected').removeClass('plans_tabs_selected');
	element.addClass('plans_tabs_selected');
	
	// Update scope menu
	plans_scope_update();
	
	// Update all plans tabs to reflect current scope
  plans_tabs_update_scope();
	
	// Remove current plans and show pending icon
	$('#plans').empty();
	$('#plans_pending').show();
	
	// Make sure columns don't have odd relative heights
	three_column_layout_heights_ensure();

	// Insert new plans
	var onSuccess = function(data)
	{
		$('#plans_pending').hide();
		$('#plans').html(data);
	}

	// Get plans
	plans_tabs_select_ajax = $.get(url, null, onSuccess);

	// Scroll back to the top of the page to view top of new plans listings
	scroll_top();

	// Update sidebar 
	if($('#col3_interior') && request_format == 'standard')
	{
		switch(url.split('/')[2])
		{
			// My plans sidebar
			case 'me':
			
				if($('#col3_user_sidebar').length) { return false; } // canary
		
				$('#col3_interior').empty();
				plans_tabs_select_insert_ajax = insert($('#col3_interior'), 'default/userSidebar', null, null, function() { three_column_layout_heights_ensure(); });
			
				break;
		
			// Homepage or splash page sidebar
			default:
			
				if(session_user_id)
				{
					if($('#col3_default_sidebar').length) { return false; } // canary

					$('#col3_interior').empty();
					
					plans_tabs_select_insert_ajax = insert($('#col3_interior'), 'default/defaultSidebar', null, null, function() { three_column_layout_heights_ensure(); });
				}
				else
				{
					if($('#col3_splash_sidebar').length) { return false; } // canary

					$('#col3_interior').empty();
					
					plans_tabs_select_insert_ajax = insert($('#col3_interior'), 'default/splashSidebar', null, null, function() { three_column_layout_heights_ensure(); });
				}
			
				break;
		}
	}
	
	return false;
}

/**
 * Updates the scope of the plans tabs hrefs to reflect current state's scope
 *
 */
function plans_tabs_update_scope()
{
	var scope_map = get_state_scope_map(get_current_state());

	var plans_tabs = $('#plans_tabs').find('a');
	
	for(var i = 0; i < plans_tabs.length; i++)
	{
		$(plans_tabs[i]).attr('href', get_scoped_state($(plans_tabs[i]).attr('href'), scope_map['scope'], scope_map['place_id']));
	}
}

/**
 * Selects from the location toggle menu
 *
 * @param string scope Scope (local, everywhere)
 * @param integer place_id Place ID (if local)
 */
function plans_scope_select(scope, place_id)
{
	var state = get_scoped_state(get_current_state(), scope, place_id);

	plans_tabs_select(state);
	plans_scope_set(scope, place_id);
	
	// Save scope map to session
	$.post(routes['plan_set_scope_map'], { scope: scope, place_id: place_id });
}

/**
 * Sets the plans scope menu state
 *
 * @param string scope Scope
 * @param integer place_id Place ID
 */
function plans_scope_set(scope, place_id)
{
	var plans_scope 						= $('#plans_scope'); 
	var plans_scope_selected 		= plans_scope.find('.menu_selected');
	var plans_scope_options 		= plans_scope.find('li');
	
	if(scope == 'everywhere')
	{
		plans_scope_selected.html('Everywhere');
	}
	else if(scope == 'local' && place_id)
	{
		for(var i = 0; i < plans_scope_options.length; i++)
		{
			if($(plans_scope_options[i]).attr('place_id') == place_id)
			{
				plans_scope_selected.html($(plans_scope_options[i]).html());
				break;
			}
		}
	}
}

/**
 * Updates the plans scope menu based on the current state
 *
 */
function plans_scope_update()
{
	var scope_map = get_state_scope_map(get_current_state());

	plans_scope_set(scope_map['scope'], scope_map['place_id']);
}

/**
 * Attend a given plan
 *
 */
function plan_attend(params)
{
	// Tasks & ajax call parameters for plan page context
	if(params['context'] == 'page')
	{ 
		// Prompt for sign in first if necessary
		if(!session_user_id)
		{
			prompt_toggle(true,'sign_in',{ reason: 'count yourself into<br />'+plan_page_info['plan_title'], callback: function() { params['new_session_user'] = true; return plan_attend(params); } }); 
			return false;
		}
		
		// Prompt for confirmation on mobile
		if(request_format == 'mobile' && !params['new_session_user'] && !confirm('Are you sure you want to count yourself into this plan?'))
		{
			return;
		}

		track_event('Plans', 'Page CMI');

		var parameters =
		{ 
      plan_id: 	params['plan_id'],
      context: 	'page'
    };
		
		var onCreate = function()
    {
      switch_plan_page_attendance_toggle('unattend');
    };

		var onSuccess = function(data)
    {
      if(data.plan_syndicate && request_format != 'mobile')
			{	
				prompt_toggle(true,'syndicate_plan');
			}
    };

		var onFailure = function()
    {
      switch_plan_page_attendance_toggle('attend');
    };
	}
	// Tasks & ajax call parameters for plan listing context
	else
	{
		// Prompt for sign in first if necessary
		if(!session_user_id)
		{
			prompt_toggle(true,'sign_in',{ reason: 'count yourself into<br />'+$('#plan_'+params['plan_id']).attr('plan_title'), callback: function() { params['new_session_user'] = true; return plan_attend(params); } }); 
			return false;
		}
		
		// Prompt for confirmation on mobile
		if(request_format == 'mobile' && !params['new_session_user'] && !confirm('Are you sure you want to count yourself into this plan?'))
		{
			return;
		}
		
		track_event('Plans', 'Listing CMI');
		
		var parameters =
		{ 
      plan_id: 	params['plan_id'],
      context: 	'listing'
    };
		
		var onCreate = function()
    {
      switch_plan_listing_attendance_toggle(params['plan_id'],'unattend');
    };

		var onSuccess = function(data)
    {
      if(data.plan_syndicate && request_format != 'mobile')
			{
				prompt_toggle(true,'syndicate_plan');
			}
    };

		var onFailure = function()
    {
      switch_plan_listing_attendance_toggle(params['plan_id'],'attend');
    };
	}

	parameters['awesm'] = plan_page_info['awesm'];

	// Redirect to user activation flow if user signed in and not yet activated
	if(request_format != 'mobile' && !params['supress_activation_redirect'] && params['new_session_user'] && !session_user_activated)
	{
		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();
		
		$.post(routes['plan_attend'], parameters);
		window.location = routes['user_activation'] + '?plan_id=' + params['plan_id'];
		return true;
	}
	
	onCreate();
	
	$.post(routes['plan_attend'], parameters, onSuccess).error(onFailure);
}

/**
 * Unattend a given plan
 *
 */
function plan_unattend(params)
{
	// Tasks & ajax call parameters for plan page context
	if(params['context'] == 'page')
	{
		// Prompt for confirmation when last attendee
		if(plan_page_info['plan_attendee_count'] == '1')
		{
			if(!confirm("You're the only person currently planning this. If you count yourself out, the plan will be deleted entirely.\n\nAre you sure you want to continue?"))
			{
				return;
			}
		}
		else if(!confirm('Are you sure you want to cancel your plan for this?'))
		{
			return;
		}
		
		track_event('Plans', 'Page CMO');
		
		var parameters =
		{ 
      plan_id: 	params['plan_id'],
      context: 	'page'
    };

		var onSuccess = function(data)
    {
      if(data.plan_is_dead)
			{
				window.location.href = routes['user']+'/'+session_user_id;
			}
    };

		var onFailure = function(data)
    {
      switch_plan_page_attendance_toggle('attend');
    };

		switch_plan_page_attendance_toggle('attend');
	}
	// Tasks & ajax call parameters for plan listing context
	else
	{
		track_event('Plans', 'Listing CMI');
		
		var parameters =
		{ 
      plan_id: 	params['plan_id'],
      context: 	'listing'
    };

		var onFailure = function(data)
    {
      switch_plan_listing_attendance_toggle(params['plan_id'],'unattend');
    };

		switch_plan_listing_attendance_toggle(params['plan_id'],'attend');
	}
	
  $.post(routes['plan_unattend'], parameters, onSuccess).error(onFailure);
}

/**
 * Switch the attend / unattend status of the plan attendance toggle
 *
 */
function switch_plan_page_attendance_toggle(status)
{
	var plan_id = plan_page_info['plan_id'];
	
	if(status == 'attend')
	{
		if(request_format == 'mobile')
		{
			$('#plan_page_attendance_toggle').unbind('click');
		
			// Change button click behavior
			$('#plan_page_attendance_toggle').click(function(event) { 
				plan_attend({ 
        	context:      'page',
        	plan_id:      plan_id
      	}); 
    
				event.stopPropagation();
			});
		
			$('#plan_page_attendance_toggle').removeClass('plan_page_attendance_toggle_unattend');
			$('#plan_page_attendance_toggle').addClass('plan_page_attendance_toggle_attend');
		}
		else
		{
			// Change visibility of invitations prompt
			$('#plan_attendance_header_attendee').hide();
			$('#plan_attendance_header_not_attendee').show();
			$('#plan_invitations_prompt').hide('blind', { direction: 'vertical' }, 500);
			setTimeout(function() { $('#plan_page_attendance_toggle').show('blind', { direction: 'vertical' }, 500); }, 600);

			// Remove attendee pic, if displayed
			var user_pic_square_li = $('#plan_attendees_li_'+session_user_id);

			if(user_pic_square_li.length)
			{
				var plan_attendees      = $('#plan_attendees');
	      var plan_attendees_lis  = plan_attendees.find('.plan_attendees_li');

				user_pic_square_li.remove();

				if(!plan_attendees_lis.length)
	      {
	        plan_attendees.hide();
	      }
			}
		}
	}
	else
	{
		if(request_format == 'mobile')
		{
			$('#plan_page_attendance_toggle').unbind('click');

			// Change button click behavior
			$('#plan_page_attendance_toggle').click(function(event) { 
				plan_unattend({ 
	        context:      'page', 
	        plan_id:      plan_id
	      }); 

				event.stopPropagation();
			});

			$('#plan_page_attendance_toggle').removeClass('plan_page_attendance_toggle_attend');
			$('#plan_page_attendance_toggle').addClass('plan_page_attendance_toggle_unattend');
		}
		else
		{
			// Change visibility of invitations prompt
			$('#plan_attendance_header_attendee').show();
			$('#plan_attendance_header_not_attendee').hide();
			$('#plan_page_attendance_toggle').hide('blind', { direction: 'vertical' }, 500);
			setTimeout(function() { $('#plan_invitations_prompt').show('blind', { direction: 'vertical' }, 500); }, 600);

			// Insert attendee pic
			if($('#plan_attendees').length)
			{
	    	var plan_attendees    = $('#plan_attendees');
		    var plan_attendees_ul = $('#plan_attendees_ul_others');

				if(!plan_attendees_ul.length)
				{
					plan_attendees_ul = $('#plan_attendees_ul_friends');
				}

		    var plan_attendees_li = $('#plan_attendees_li_'+session_user_id); 
    
		    if(!plan_attendees_li.length)
		    {
		      plan_attendees_ul.append(plan_page_info['session_user_li']);
		      plan_attendees.show();
		    }
			}
		}
	}
	
}

/**
 * Switch the attend / unattend status of a plan listing's attendance toggle
 *
 * @param integer plan_id Plan ID
 */
function switch_plan_listing_attendance_toggle(plan_id,status)
{
	if(status == 'attend')
	{
		$('#plan_'+plan_id+'_attendance_toggle').unbind('click');
		
		// Change button click behavior
		$('#plan_'+plan_id+'_attendance_toggle').click(function(event) { 
			plan_attend({ 
        context:      'listing', 
        plan_id:      plan_id
      }); 
    
			event.stopPropagation();
		});
		
		// Clear any remant mouseover behavior 
		$('#plan_'+plan_id+'_attendance_toggle').onmouseover = null;
		
		$('#plan_'+plan_id+'_attendance_toggle').removeClass('plan_attendance_toggle_unattend_fixed');
		$('#plan_'+plan_id+'_attendance_toggle').removeClass('plan_attendance_toggle_unattend');
		$('#plan_'+plan_id+'_attendance_toggle').addClass('plan_attendance_toggle_attend');
	}
	else
	{
		$('#plan_'+plan_id+'_attendance_toggle').unbind('click');
		
		// Change button click behavior
		$('#plan_'+plan_id+'_attendance_toggle').click(function(event) { 
			plan_unattend({ 
        context:      'listing', 
        plan_id:      plan_id
      }); 
    
			event.stopPropagation();
		});
		
		// Use regular unattend class (with hover effect) after mouse has been removed the first time
		$('#plan_'+plan_id+'_attendance_toggle').mouseover(function(event) { 
			$('#plan_'+plan_id+'_attendance_toggle').removeClass('plan_attendance_toggle_unattend_fixed');
			$('#plan_'+plan_id+'_attendance_toggle').addClass('plan_attendance_toggle_unattend');
			$('#plan_'+plan_id+'_attendance_toggle').onmouseover = null;
		});
		
		$('#plan_'+plan_id+'_attendance_toggle').removeClass('plan_attendance_toggle_attend');
		$('#plan_'+plan_id+'_attendance_toggle').addClass('plan_attendance_toggle_unattend_fixed');
	}
}

/**
 * Favorite a given plan
 *
 */
function plan_favorite(params)
{
	// Prompt for sign in first if necessary
	if(!session_user_id)
	{
		prompt_toggle(true,'sign_in',{ reason: 'favorite<br />'+$('#plan_'+params['plan_id']).attr('plan_title'), callback: function() { plan_favorite({ plan_id: params['plan_id'] }); } }); 
		return false;
	}

	// Tasks & ajax call parameters for plan page context
	if(isset('plan_page_info'))
	{
		// ?
	}
	// Tasks & ajax call parameters for plan listing context
	else
	{
		track_event('Plans', 'Listing Favorite');
		
		var parameters =
		{ 
      plan_id: 	params['plan_id'],
      context: 	'listing'
    };
		
		var onCreate = function()
    {
      plan_favorite_switch_toggle(params['plan_id'],'unfavorite');
    };

		var onSuccess = function(data)
    {
      
    };

		var onFailure = function()
    {
      plan_favorite_switch_toggle(params['plan_id'],'favorite');
    };
	}

  $.post(routes['plan_favorite'], parameters, onSuccess).error(onFailure);
}

/**
 * Unfavorite a given plan
 *
 */
function plan_unfavorite(params)
{
	// Tasks & ajax call parameters for plan page context
	if(isset('plan_page_info'))
	{
		// ?
	}
	// Tasks & ajax call parameters for plan listing context
	else
	{
		track_event('Plans', 'Listing Unfavorite');
		
		var parameters =
		{ 
      plan_id: 	params['plan_id'],
      context: 	'listing'
    };
		
		var onCreate = function()
    {
      plan_favorite_switch_toggle(params['plan_id'],'favorite');
    };

		var onSuccess = function(data)
    {
      
    };

		var onFailure = function()
    {
      plan_favorite_switch_toggle(params['plan_id'],'unfavorite');
    };
	}

  $.post(routes['plan_unfavorite'], parameters, onSuccess).error(onFailure);
}

/**
 * Switch the favorite / unfavorite status of a plan favorite toggle
 *
 * @param integer plan_id Plan ID
 */
function plan_favorite_switch_toggle(plan_id,status)
{
	if(status == 'favorite')
	{
		$('#plan_'+plan_id+'_favorite_toggle').unbind('click');
		
		// Change button click behavior
		$('#plan_'+plan_id+'_favorite_toggle').click(function(event) { 
			plan_favorite({ 
        context:      'listing', 
        plan_id:      plan_id
      }); 
    
			event.stopPropagation();
		});
		
		$('#plan_'+plan_id+'_favorite_toggle').removeClass('plan_favorite_toggle_unfavorite');
		$('#plan_'+plan_id+'_favorite_toggle').addClass('plan_favorite_toggle_favorite');
	}
	else
	{
		$('plan_'+plan_id+'_favorite_toggle').unbind('click');
		
		// Change button click behavior
		$('plan_'+plan_id+'_favorite_toggle').click(function(event) { 
			plan_unfavorite({ 
        context:      'listing', 
        plan_id:      plan_id
      }); 
    
			event.stopPropagation();
		});
		
		$('#plan_'+plan_id+'_favorite_toggle').removeClass('plan_favorite_toggle_favorite');
		$('#plan_'+plan_id+'_favorite_toggle').addClass('plan_favorite_toggle_unfavorite');
	}
}

var plan_comments_add_pending = false;

/**
 * Add a comment to a plan
 *
 */
function plan_comments_add()
{
	if(plan_comments_add_pending) { return; } // canary
	
	var content = trim($('#plan_comments_add_input').val());
	var ul = $('#plan_comments_ul') ? $('#plan_comments_ul') : $('#prompt_plan_comments_ul')
	
	// Check to make sure a comment has been provided
	if(!content || content == 'write a comment') { return false; }
  
	// Prompt for sign in first if necessary
	if(!session_user_id)
	{
		prompt_toggle(true,'sign_in',{ reason: 'comment on this plan', callback: function() { plan_comments_add(); } }); 
		return false;
	}
	
	track_event('Plans', 'Add Comment');
	
	var parameters =
	{ 
		plan_id: 	plan_page_info['plan_id'],
		content: 	content
	};
	
	var onCreate = function()
	{
		plan_comments_add_pending = true;
		
		$('#plan_comments_add_input').css({ color: 'gray', background: 'url(/images/icons/wait/20.gif) no-repeat 98% 50%' });
		$('#plan_comments_add_submit_button').css({ opacity: .7, cursor: 'default' });
	};

	var onSuccess = function(data)
	{
		plan_comments_add_pending = false;
		
    $('#plan_comments_add_input').val('');
		$('#plan_comments_add_input').css({ color: 'black', background: 'none' });
		$('#plan_comments_add_submit_button').css({ opacity: 1, cursor: 'pointer' });
		
		var lis = ul.find('li');

		if(lis[0])
		{
			$(lis[0]).before(data.comment_li);
		}
		else
		{
			ul.append(data.comment_li);
		}
		
		ul.show();
	};

	var onFailure = function(data)
	{
		plan_comments_add_pending = false;
		
		$('#plan_comments_add_input').css({ color: 'black', background: 'none' });
		$('#plan_comments_add_submit_button').css({ opacity: 1, cursor: 'pointer' });
	};
	
	onCreate();

  $.post(routes['plan_comments_add'], parameters, onSuccess).error(onFailure);
}

var plan_delete_pending = false;

/**
 * Delete a comment from a plan
 *
 * @params integer comment_id Comment ID
 */
function plan_comments_delete(comment_id)
{
	if(plan_delete_pending) { return; } 
	
	track_event('Plans', 'Delete Comment');
	
	var parameters =
	{ 
		comment_id: 	comment_id
	};

	var onSuccess = function(data)
	{
		plan_delete_pending = false;
		
		$('#plan_comment_'+comment_id).fadeOut();
	};

	var onFailure = function(data)
	{
		plan_delete_pending = false;
		$('#plan_comment_'+comment_id).css({ opacity: 1 });
		alert("Oops! There was a problem deleting your comment. Please try again and email us at support@plancast.com if it still doesn't work.");
	};
	
	plan_delete_pending = true;
	$('#plan_comment_'+comment_id).css({ opacity: .7 });
	
	$.post(routes['plan_comments_delete'], parameters, onSuccess).error(onFailure);
}

/**
 * Expand the description on a plan page to show the full thing, not just an excerpt
 *
 */
function plan_description_expand()
{
	$('#plan_description_excerpt').hide();
	$('#plan_description_full').show();
}


/**
 * Load the rest of a plan's attendees
 *
 */
function plan_load_more_attendees(section, attendees_limit)
{
	track_event('Plans', 'Load more attendees');
	
	var parameters 						= {};
  parameters['plan_id'] 		= plan_page_info['plan_id'];
  parameters['section'] 		= section;
  parameters['start_at'] 		= attendees_limit+1;
  parameters['view_type'] 	= 'facepile';

	$('#plan_attendees_load_more_'+section).empty();
	$('#plan_attendees_load_more_'+section).append('<img src="/images/icons/wait/24.gif" style="margin-right: 5px" />');

	var onSuccess = function(data)
	{
		$('#plan_attendees_ul_'+section).append(data.html);
		$('#plan_attendees_load_more_'+section).hide();
	}
  
  var response = $.get(routes['plan_attendees'], parameters, onSuccess);
}

/**
 * Accept plan recommendation
 *
 * @param integer $plan_id Plan ID for currently displayed plan
 * @param integer $viewed_plan_id Plan ID for plan clicked on
 */
function accept_plan_recommendation(plan_id, viewed_plan_id)
{
	track_event('Plans', 'Viewed Plan Recommendation');
	
	if(!session_user_id) { return; } // canary
	
	var params = {
		'plan_id' 				: plan_id,
		'viewed_plan_id' 	: viewed_plan_id
	}
	
	$.post(routes['plan_accept_recommendation'], params);
}

var plan_merge_prompt_input_id;

var submit_plan_merge_prompt_pending = false;

/**
 * Submit plan page merge prompt 
 *
 */
function submit_plan_merge_prompt()
{
	if(!trim($('#'+plan_merge_prompt_input_id).val()))
	{
		alert('Please provide a link.');
		return;
	}
	
	submit_plan_merge_prompt_pending = true;
	
	$('#plan_merge_prompt_initiate_merge_button').css({ opacity: .5, cursor: 'default' });

	var parameters = 
	{
		primary_plan_url: 		trim($('#'+plan_merge_prompt_input_id).val()),
		secondary_plan_id: 		plan_page_info['plan_id']
	}
	
	var onSuccess = function(data) 
	{ 
		$('#plan_merge_prompt_initiate_merge_button').css({ opacity: 1, cursor: 'pointer' });
		
		if(data.msg == 'success')
		{
			if(data.redirect_url)
			{
				$('#plan_merge_prompt_okay').click(function() { window.location.href = data.redirect_url; });
				$('#plan_merge_prompt_1').hide();
				$('#plan_merge_prompt_2').show();
			}
			else
			{
				$('#plan_merge_prompt_1').hide();
				$('#plan_merge_prompt_3').show();
			}
		}
		else
		{
			alert('The link you provided does not appear to match a valid plan. Please check it and try again.');
		}
		
		submit_plan_merge_prompt_pending = false;
	}
	
	$.post(routes['plan_merge'], parameters, onSuccess);
}

/** Plan categories **/

var plan_categories_add_form_displayed = false;

/**
 * Handle behavior when mouse goes over or out of the plan top area
 *
 * @param bool status Whether to show or hide the "+" button
 */
function plan_categories_show_toggle(status)
{
	if(!$('#plan_categories_add_show').length) { return; } 
	
	if(status && !plan_categories_add_form_displayed)
	{
		$('#plan_categories_add_show').show();
	}
	else
	{
		$('#plan_categories_add_show').hide();
	}
}

/**
 * Remove a category from a plan page
 * 
 * @param integer category_id Category ID
 */
function plan_categories_remove(category_id)
{
	var category = $('#category_button_'+category_id);
	
	category.remove();
	
	var params = {
		'plan_id' 				: plan_page_info['plan_id'],
		'category_id' 		: category_id
	}
	
	$.post(routes['plan_remove_category'], params);
}

/**
 * Toggles the plan categories add input
 *
 * @param bool display Whether to display or hide the input
 */
function plan_categories_add_form_toggle(display)
{ 
	if(display)
	{
		plan_categories_add_form_displayed = true;
		
		$('#plan_categories').show();
		$('#plan_categories_add_show').hide(); 
		$('#plan_categories_add_form').show(); 
		
		// Show remove buttons for each category
		var plan_category_as = $('#plan_categories').find('.category_button_a');
		
		if(plan_category_as)
		{
			plan_category_as.addClass('category_button_a_edit_active');
		}
		
		var plan_category_removes = $('#plan_categories').find('.category_button_remove');
		
		if(plan_category_removes)
		{
			plan_category_removes.show();
		}

		setTimeout("$('#plan_categories_add_input').focus();", 50);
	}
	else
	{ 
		plan_categories_add_form_displayed = false;
		
		$('#plan_categories_add_form').hide(); 
		$('#plan_categories_add_show').show();
		
		// Show remove buttons for each category
		var plan_category_as = $('#plan_categories').find('.category_button_a');
		
		if(plan_category_as)
		{
			plan_category_as.removeClass('category_button_a_edit_active');
		}
		
		var plan_category_removes = $('#plan_categories').find('.category_button_remove');
		
		if(plan_category_removes)
		{
			plan_category_removes.hide();
		}

		var lis = $('#plan_categories').find('li');

		if(lis.length == 2)
		{
			$('#plan_categories').hide();
		}
	}
}

/**
 * Submits a new value for the plan categories add input
 *
 */
function plan_categories_add_input_submit()
{
	var title = trim($('#plan_categories_add_input').val());

	if(!title) { return false; } // canary
	
	var params =
	{
		plan_id:  				plan_page_info['plan_id'],
		category_title:  	title
	}
	
	$.post(routes['plan_categories_add'], params, plan_categories_insert);
	
	return 1;
}

/** 
 * Selects a value from the plan categories autosuggestions
 *
 */
function plan_categories_add_input_select()
{
	var category_id = $(this).attr('category_id');
	
	var params =
	{
		plan_id:  			plan_page_info['plan_id'],
		category_id:  	category_id
	}
	
	$.post(routes['plan_categories_add'], params, plan_categories_insert);
	
	$('#plan_categories_add_input').val('');
	
	setTimeout("$('#plan_categories_add_input').focus();",100);
}

/**
 * Ajax callback for inserting a new category for a plan
 *
 * @param object data
 */
function plan_categories_insert(data)
{ 
  var button_html = data.button_html;
	
	if($('#plan_categories_add_show').length)
	{
		$('#plan_categories_add_show').before(button_html);
	}
	else
	{
		$('#plan_categories_add_form').before(button_html);
	}
	
	var buttons = $('#plan_categories').find('.category_button');
	
	if(buttons.length == 1 && $('#plan_contribution_options'))
	{
		replace($('#plan_contribution_options'), 'plan/contributionOptions', { plan_id: plan_page_info['plan_id'] });
	}
}

var plan_place_info;

/**
 * Initializes the plan place map
 *
 */
function plan_place_map_initialize() 
{
	if(!$('#plan_place_map').length) { return; }
	
  var latlng = new google.maps.LatLng(plan_place_info['latitude'], plan_place_info['longitude']);

  var myOptions = 
  {
    zoom: 									plan_place_info['zoom'],
    center: 								latlng,
    mapTypeId: 							google.maps.MapTypeId.ROADMAP,
    disableDefaultUI: 			true,
    navigationControl: 			true
  };

  var map = new google.maps.Map($('#plan_place_map')[0], myOptions);

  var infowindow = new google.maps.InfoWindow({
      content: '<div id="plan_where_name">'+plan_place_info['title']+'</div><div style="margin-top:5px"><a href="'+plan_place_info['directions_url']+'" target="_blank">Get Directions</a></div>'
  });
  
  var marker = new google.maps.Marker({
    position: 	latlng,
    title: 			plan_place_info['title'],
    map: 				map
  });
    
  google.maps.event.addListener(marker, 'click', function() { infowindow.open(map,marker); });
}

var plans_load_more_params;
var plans_load_more_pending = false;

/**
 * Load more plan listings via ajax
 *
 */
function plans_load_more(parameters, url, page)
{
	if(plans_load_more_pending) { return; } // canary
	
	plans_load_more_pending = true;
	
  track_event('Plans', 'Load more');

	var button = $('#plans_load_more');
	
	if(!parameters) { var parameters = {}; }
	
	parameters['page'] = page; // load the next page
	
	button.css({ opacity: 0.3, cursor: 'default' });

	var onSuccess = function(data) 
	{ 
		button.before(data.html); // insert new plans  
		button.remove(); // remove the button
		
		plans_load_more_pending = false;

		reposition_fixed_elements();
	} 
	
	var onFailure = function(data)
	{
		button.css({ opacity: 1, cursor: 'pointer' });
	  button.unbind('click');
	
		plans_load_more_pending = false;
	}

  $.get(url, parameters, onSuccess).error(onFailure);
}

var plan_description_toggle_timeouts = new Array;

/**
 * Toggles the display of a plan description
 *
 */
function plan_description_toggle(status,id)
{
	if(!id || !$('#plan_description_'+id)) { return; }
	
	var description = $('#plan_description_'+id);
	
	if(status)
	{
		clearTimeout(plan_description_toggle_timeouts[id]);
		plan_description_toggle_timeouts[id] = setTimeout("$('#plan_description_'+"+id+").fadeIn(300);",200);
	}
	else
	{
		clearTimeout(plan_description_toggle_timeouts[id]);
		plan_description_toggle_timeouts[id] = setTimeout("if($('#plan_description_'+"+id+").length) $('#plan_description_'+"+id+").fadeOut(300);",200);
	}
}

/**
 * Sends notification about plan like
 *
 */
function plan_like()
{
	if(!session_user_id || !isset('plan_page_info')) { return; }

	var params =
	{
		plan_id: plan_page_info['plan_id']
	}

	$.post(routes['plan_like'], params);
}

var plan_add_description_submit_pending = false;

/**
 * Adds a description to a plan
 *
 */
function plan_add_description_submit()
{
	if(plan_add_description_submit_pending) { return; }
	
	if(!trim($('#plan_add_description_input').val()))
	{
		alert('Please provide a description.');
		return;
	}
	
	plan_add_description_submit_pending = true;
	
	var params = {}
	params['plan[id]'] = plan_page_info['plan_id'];
	params['plan[description]'] = $('#plan_add_description_input').val();
	
	var onSuccess = function(data)
	{
		replace($('#plan_details'),'plan/details',{ plan_id: plan_page_info['plan_id'] });
		replace($('#plan_contribution_options'),'plan/contributionOptions',{ plan_id: plan_page_info['plan_id'] });
		prompt_toggle(false,'plan_add_description');
		plan_add_description_submit_pending = false;
	}
	
	var onFailure = function()
	{
		replace($('#plan_details'),'plan/details',{ plan_id: plan_page_info['plan_id'] });
		replace($('#plan_contribution_options'),'plan/contributionOptions',{ plan_id: plan_page_info['plan_id'] });
		prompt_toggle(false,'plan_add_description');
		plan_add_description_submit_pending = false;
	}
	
	$.post(routes['plan_edit'], params, onSuccess).error(onFailure);
	
	$('#plan_add_description_submit_button').css({ opacity: 0.7, cursor: 'default' });
	$('#plan_add_description_header').css('background', "url(/images/icons/wait/30.gif) no-repeat 100% 50%");
}

var plan_add_external_url_submit_pending = false;

/**
 * Adds a description to a plan
 *
 */
function plan_add_external_url_submit()
{
	if(plan_add_external_url_submit_pending) { return; }
	
	if(!trim($('#plan_add_external_url_input').val()))
	{
		alert('Please provide a link.');
		return;
	}
	
	plan_add_external_url_submit_pending = true;
	
	var params = {}
	params['plan[id]'] = plan_page_info['plan_id'];
	params['plan[external_url]'] = $('#plan_add_external_url_input').val();
	
	var onSuccess = function(data)
	{
		replace($('#plan_details'),'plan/details',{ plan_id: plan_page_info['plan_id'] });
		replace($('#plan_contribution_options'),'plan/contributionOptions',{ plan_id: plan_page_info['plan_id'] });
		prompt_toggle(false,'plan_add_external_url');
		plan_add_external_url_submit_pending = false;
	}
	
	var onFailure = function()
	{
		replace($('#plan_details'),'plan/details',{ plan_id: plan_page_info['plan_id'] });
		replace($('#plan_contribution_options'),'plan/contributionOptions',{ plan_id: plan_page_info['plan_id'] });
		prompt_toggle(false,'plan_add_external_url');
		plan_add_external_url_submit_pending = false;
	}
	
	$.post(routes['plan_edit'], params, onSuccess).error(onFailure);
	
	$('#plan_add_external_url_submit_button').css({ opacity: 0.7, cursor: 'default' });
	$('#plan_add_external_url_header').css('background', "url(/images/icons/wait/30.gif) no-repeat 100% 50%");
}

var plan_add_place_submit_pending = false;

/**
 * Adds a place to a plan
 *
 */
function plan_add_place_submit()
{
	if(plan_add_place_submit_pending) { return; }
	
	plan_add_place_submit_pending = true;
	
	var params = {}
	params['plan[id]'] = plan_page_info['plan_id'];
	params['plan[place_id]'] = plan_add_place_id;
	
	var onSuccess = function(data)
	{
		replace($('#plan_where_exterior'),'plan/place',{ plan_id: plan_page_info['plan_id'] });
		replace($('#plan_contribution_options'),'plan/contributionOptions',{ plan_id: plan_page_info['plan_id'] });
		prompt_toggle(false,'plan_add_place');
		plan_add_place_submit_pending = false;
	}
	
	var onFailure = function()
	{
		replace($('#plan_where_exterior'),'plan/place',{ plan_id: plan_page_info['plan_id'] });
		replace($('#plan_contribution_options'),'plan/contributionOptions',{ plan_id: plan_page_info['plan_id'] });
		prompt_toggle(false,'plan_add_place');
		plan_add_place_submit_pending = false;
	}
	
	$.post(routes['plan_edit'], params, onSuccess).error(onFailure);
	
	$('#plan_add_place_submit_button').css({ opacity: 0.7, cursor: 'default' });
	$('#plan_add_place_header').css('background', "url(/images/icons/wait/30.gif) no-repeat 100% 50%");
}

var plan_add_place_submit_pending = false;
var plan_add_place_marker;

var plan_add_place_id;
var plan_add_place_name;

/**
 * Handles the adding of a place to a plan
 *
 */
function plan_add_place_input_submit(event)
{
	if(plan_add_place_submit_pending) { return false; } // canary
	
	if(!trim($('#plan_add_place_input').val()))
	{
		plan_add_place_id 		= null;
		plan_add_place_name 	= null;
		$('#plan_add_place_map').hide();
		$('#plan_add_place_submit_button').hide();
		return;
	}
	
	plan_add_place_submit_pending = true;
	
	$('#plan_add_place_input').addClass('plan_add_place_input_pending');
	
	var params = {
		'q': $('#plan_add_place_input').val()
	};
	
	var onSuccess = function(data)
	{
		if(data.places_count)
		{
			var place = data.places[0];
			
			var latlng = new google.maps.LatLng(place['latitude'], place['longitude']);

		  var myOptions = 
		  {
		    zoom: 									place['zoom'],
		    center: 								latlng,
		    mapTypeId: 							google.maps.MapTypeId.ROADMAP,
		    disableDefaultUI: 			true,
		    navigationControl: 			true
		  };
		
			$('#plan_add_place_map').show();
			$('#plan_add_place_submit_button').show();

		  var map = new google.maps.Map($('#plan_add_place_map')[0],myOptions);

		  var plan_add_place_marker = new google.maps.Marker({
		    position: 	latlng,
		    title: 			place['name'],
		    map: 				map
		  });
		
			plan_add_place_id 		= place['id'];
			plan_add_place_name 	= place['name'];
		}
		else
		{
			$('#plan_add_place_map').hide();
			$('#plan_add_place_submit_button').hide();
		}
		
		$('#plan_add_place_input').removeClass('plan_add_place_input_pending');
	
		plan_add_place_submit_pending = false;
	}
	
	var onFailure = function()
	{
		plan_add_place_submit_pending = false;
	}
	
	$.get(routes['search_places'], params, onSuccess).error(onFailure);
}

var plan_category_load_pending = false;

/**
 * Loads plans for a category page
 *
 */
function plan_category_load()
{
	plan_category_load_pending = true; 
	
	$('#plans_pending').show();
	
	var onSuccess = function(data)
	{
		// Insert new plans
		$('#plans_pending').hide();
		$('#plans').html(data.html);
		
		var params = data.params;
		
		switch(params['type'])
		{
			case 'user_subscriptions':
				$('#plans_tabs_user_subscriptions').addClass('plans_tabs_selected');
				break;
				
			case 'category_subscriptions':
				$('#plans_tabs_category_subscriptions').addClass('plans_tabs_selected');
				break;
				
			case 'category':
				$('#plans_tabs_category_'+params['category_id']).addClass('plans_tabs_selected');
				params['type'] = params['type']+'_'+params['category_id'];
				break;
				
			case 'user':
				$('#plans_tabs_user').addClass('plans_tabs_selected');
				break;
				
			default:
				params['type'] = 'categorized';
				$('#plans_tabs_categorized').addClass('plans_tabs_selected');
				break;
		}
		
		if(params['scope'] == 'everywhere')
		{
			$('#plans_scope_menu').find('.menu_selected').html('Everywhere');
		}
		else if(params['place_name'])
		{
			$('#plans_scope_menu').find('.menu_selected').html(params['place_name']);
		}
		
		$('#plans_scope_menu').show();
		
		plan_homepage_load_pending = false;
	}
	
	$.get(routes['category_plans'], { hash: window.location.hash }, onSuccess);
}
