/**
 * Subscribes the session user to the given category
 *  
 * @param Array params Parameters (context, category_id)
 */
function category_subscribe(params)
{
  // Prompt for sign in first if necessary
	if(!session_user_id)
	{
		prompt_toggle(true,'sign_in',{ reason: 'subscribe to <br />'+params['category_title'], callback: function() { params['new_session_user'] = true; category_subscribe(params); return false; } }); 
		return false;
	}

	// Tasks & ajax call parameters for category page context
	if(params['context'] == 'page')
	{
		track_event('Categories', 'Page Subscribe');
		
		var parameters =
		{ 
      category_id: 	params['category_id'],
      context: 			'page'
    };

		var onFailure = function()
    {
      switch_category_page_subscription_toggle(params['category_id'], 'subscribe');
    };

		switch_category_page_subscription_toggle(params['category_id'], 'unsubscribe');
	}
	// Tasks & ajax call parameters for category listing context
	else
	{
		track_event('Categories', 'Listing Subscribe');
		
		var parameters =
		{ 
      category_id: 	params['category_id'],
      context: 			'listing'
    };

		var onFailure = function()
    {
      switch_category_listing_subscription_toggle(params['category_id'], 'subscribe');
    };

		plans_tabs_category_add(params['category_id']);
		switch_category_listing_subscription_toggle(params['category_id'],'unsubscribe');
	}
	
	// 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['category_subscribe'], parameters);
		window.location = routes['user_activation'] + '?category_id=' + params['category_id'];
		return true;
	}
	
  $.post(routes['category_subscribe'], parameters).error(onFailure);
}

/**
 * Unsubscribes the session user from the given category
 *
 * @param Array params Parameters (context, category_id)
 */
function category_unsubscribe(params)
{
  // Tasks & ajax call parameters for plan page context
	if(params['context'] == 'page')
	{
		track_event('Categories', 'Page Unsubscribe');
		
		var parameters =
		{ 
      category_id: 	params['category_id'],
      context: 			'page'
    };
		
		var onCreate = function()
    {
      switch_category_page_subscription_toggle(params['category_id'],'subscribe');
    };

		var onFailure = function()
    {
      switch_category_page_subscription_toggle(params['category_id'],'unsubscribe');
    };
	}
	// Tasks & ajax call parameters for category listing context
	else
	{
		track_event('Categories', 'Listing Unsubscribe');

		var parameters =
		{ 
      category_id: 	params['category_id'],
      context: 			'listing'
    };
		
		var onCreate = function()
    {
      switch_category_listing_subscription_toggle(params['category_id'],'subscribe');
			plans_tabs_category_remove(params['category_id']);
    };

		var onFailure = function()
    {
      switch_category_listing_subscription_toggle(params['category_id'],'unsubscribe');
    };
	}

	onCreate();
	
  $.post(routes['category_unsubscribe'], parameters).error(onFailure);
}


/**
 * Switch the subscribe / unsubscribe status of the subscription toggle on a category page
 *
 * @param integer category_id Category ID
 * @param string status Whether to switch button to "subscribe" or "unsubscribe"
 */
function switch_category_page_subscription_toggle(category_id, status)
{
	if(status == 'subscribe')
	{
		$('#category_page_subscription_toggle').unbind('click');
		
		// Change button click behavior
		$('#category_page_subscription_toggle').click(function(event) { 
			category_subscribe({ 
        context:      'page', 
        category_id:      category_id
      });
    
			event.stopPropagation();
		});
		
		$('#category_page_subscription_toggle').removeClass('category_page_subscription_toggle_unsubscribe');
		$('#category_page_subscription_toggle').addClass('category_page_subscription_toggle_subscribe');
	}
	else
	{  
		$('#category_page_subscription_toggle').unbind('click');
		
		// Change button click behavior
		$('#category_page_subscription_toggle').click(function(event) { 
			category_unsubscribe({ 
        context:      'page', 
        category_id:      category_id
      }); 
    
			event.stopPropagation();
		});
		
		$('#category_page_subscription_toggle').removeClass('category_page_subscription_toggle_subscribe');
		$('#category_page_subscription_toggle').addClass('category_page_subscription_toggle_unsubscribe');
	}
}

/**
 * Switch the subscribe / unsubscribe status of a category listing subscription toggle
 *
 * @param integer category_id Category ID
 * @param string status Whether to switch button to "subscribe" or "unsubscribe"
 */
function switch_category_listing_subscription_toggle(category_id, status)
{
	// Bail if there is no listing button for this category on the page
	if(!$('#category_'+category_id+'_subscription_toggle').length) { return; }
	
	if(status == 'subscribe')
	{
		$('#category_'+category_id+'_subscription_toggle').unbind('click');
		
		// Change button click behavior
		$('#category_'+category_id+'_subscription_toggle').click(function(event) { 
			category_subscribe({ 
        context:      		'listing', 
        category_id:      category_id
      }); 
    
			event.stopPropagation();
		});
		
		$('#category_'+category_id+'_subscription_toggle').removeClass('category_listing_subscription_toggle_pending');
		$('#category_'+category_id+'_subscription_toggle').removeClass('category_listing_subscription_toggle_unsubscribe');
		$('#category_'+category_id+'_subscription_toggle').addClass('category_listing_subscription_toggle_subscribe');
	}
	else
	{
		$('#category_'+category_id+'_subscription_toggle').unbind('click');
		
		// Change button click behavior
		$('#category_'+category_id+'_subscription_toggle').click(function(event) { 
			category_unsubscribe({ 
        context:      		'listing', 
        category_id:      category_id
      }); 
    
			event.stopPropagation();
		});
		
		$('#category_'+category_id+'_subscription_toggle').removeClass('category_listing_subscription_toggle_pending');
		$('#category_'+category_id+'_subscription_toggle').removeClass('category_listing_subscription_toggle_subscribe');
		$('#category_'+category_id+'_subscription_toggle').addClass('category_listing_subscription_toggle_unsubscribe');
	}
}

var categories_load_more_pending = false;

/**
 * Load more categories
 *
 * @param integer page Page of categories to load
 */
function categories_load_more(parameters, url, page)
{ 
	if(categories_load_more_pending) { return; } // canary
	
	categories_load_more_pending = true;
	
	var button = $('#categories_load_more');
	parameters['page'] = page;
	
	$('#categories_load_more').css({ opacity: .5, cursor: 'default' });

	var onSuccess = function(data)
  {
		button.before(data.html);
		button.remove();
		
		categories_load_more_pending = false;
  };

	var onFailure = function()
  {
    categories_load_more_pending = false;
  };

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

/**
 * Adds a category to the plans tabs
 *
 * @param integer category_id Category ID
 */
function plans_tabs_category_add(category_id)
{ 
	// Bail if there is no categories area
	if(!$('#plans_tabs_categories').length || $('#plans_tabs_category_'+category_id).length) { return; }
	
	// Make sure the categories area is visible
	$('#plans_tabs_categories').show();
	
	// Inserts new tab
	insert($('#plans_tabs_categories'), 'plan/listingsToggleCategory', null, { category_id: category_id })
}

/**
 * Remove a category from the plans tabs
 *
 * @param integer category_id Category ID
 */
function plans_tabs_category_remove(category_id)
{
	if(!$('#plans_tabs_category_'+category_id).length) { return; }
	
	$('#plans_tabs_category_'+category_id).remove();

	// If last category tab, hide category tabs area and select user subscriptions tab
	if($('#plans_tabs_categories').find('a').length == 1)
	{
		$('#plans_tabs_categories').hide();
		$('#plans_tabs_user_subscriptions').click();
	}
	// Otherwise, just check to see if current tab was the one removed, in which case select category subscriptions tab
	else
	{
		if(plans_params['category_id'] == category_id)
		{
			$('#plans_tabs_category_subscriptions').click();
		}
	}
}

/**
 * Selects a category in the user categories prompt
 *
 * @param string value
 */
function prompt_user_categories_category_add_select()
{ 
	var category_id = $(this).attr('category_id');
	
	if($('#category_'+category_id).length) { return; } // don't select if already selected
	
	var callback = function()
	{
		category_subscribe({ category_id: category_id, context: 'listing' });
	}
	
	insert($('#prompt_user_categories_ul'),'category/listing',null,{ category_id: category_id },callback);

	setTimeout("var input = $('#prompt_user_categories_category_add_input_exterior').find('input'); input.focus();",130);
}

function category_search_result_select(category_id)
{
	var lis = $('#plans_tabs_categories').find('li');

	for(var i = 0; i < lis.length; i++)
	{
		if(lis[i].attr('category_id') == category_id)
		{
			lis[i].click();
			return;
		}
	}
	
	category_subscribe({ category_id: category_id, context: 'listing' }, true);
	
	return false;
}
