/**
 * Javascript for users
 *
 */

function set_user_attribute(name,value)
{
  var params = {
		name: 	name,
		value: 	value
	}

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

var user_subscribed = false; // indicates whether the user has triggered a user subscription while on the current page

/**
 * Subscribes the session user to the given user
 *  
 */
function user_subscribe(params)
{ 
  // Prompt for sign in first if necessary
	if(!session_user_id)
	{
		prompt_toggle(true,'sign_in',{ reason: 'subscribe to '+params['user_name'], callback: function() { params['new_session_user'] = true; user_subscribe({ user_id: params['user_id'], user_name: params['user_name'], context: params['context'], new_session_user: true }); } }); 
		return false;
	}
	
	// Prompt subscriber to confirm if they are on mobile
	if(!params['new_session_user'] && params['context'] == 'page' && request_format == 'mobile' && !confirm('Are you sure you want to subscribe to ' + params['user_name'] + '?'))
	{
		return;
	}

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

		var onFailure = function()
    {
      switch_user_page_subscription_toggle(params['user_id'], params['user_name'], 'subscribe');
    };

		switch_user_page_subscription_toggle(params['user_id'], params['user_name'], 'unsubscribe');
	}
	// Tasks & ajax call parameters for user listing context
	else
	{
		track_event('Users', 'Listing Subscribe');
		
		var parameters =
		{ 
      user_id: 	params['user_id'],
      context: 	'listing'
    };

		var onFailure = function()
    {
      switch_user_listing_subscription_toggle(params['user_id'], params['user_name'], 'subscribe');
    };

		switch_user_listing_subscription_toggle(params['user_id'], params['user_name'], '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['user_subscribe'], parameters);
		window.location = routes['user_activation'] + '?user_id=' + params['user_id'];
		return true;
	}
	
  $.post(routes['user_subscribe'], parameters).error(onFailure);

	user_subscribed = true;
}

/**
 * Unsubscribes the session user from the given user
 *
 */
function user_unsubscribe(params)
{
	// Prompt for confirmation on mobile
	if(params['context'] == 'page' && request_format == 'mobile' && !confirm('Are you sure you want to unsubscribe from ' + params['user_name'] + '?'))
	{
		return;
	}
	
  // Tasks & ajax call parameters for plan page context
	if(params['context'] == 'page')
	{
		track_event('Users', 'Page Unsubscribe');
		
		var parameters =
		{ 
      user_id: 	params['user_id'],
      context: 	'page'
    };
		
		switch_user_page_subscription_toggle(params['user_id'], params['user_name'], 'subscribe');

		var onFailure = function()
    {
      switch_user_page_subscription_toggle(params['user_id'], params['user_name'], 'unsubscribe');
    };
	}
	// Tasks & ajax call parameters for user listing context
	else
	{
		track_event('Users', 'Listing Unsubscribe');
		
		var parameters =
		{ 
      user_id: 	params['user_id'],
      context: 	'listing'
    };
		
		switch_user_listing_subscription_toggle(params['user_id'], params['user_name'], 'subscribe');

		var onFailure = function()
    {
      switch_user_listing_subscription_toggle(params['user_id'], params['user_id'], 'unsubscribe');
    };
	}

  $.post(routes['user_unsubscribe'], parameters).error(onFailure);
}//if

/**
 * Switch the subscribe / unsubscribe status of the subscription toggle on a user profile page
 *
 */
function switch_user_page_subscription_toggle(user_id, user_name, status)
{
	if(status == 'subscribe')
	{
		$('#user_page_subscription_toggle').unbind('click');
		
		// Change button click behavior
		$('#user_page_subscription_toggle').click(function(event) { 
			user_subscribe({ 
        context:      'page', 
        user_id:      user_id,
				user_name: 		user_name
      }); 
    
			event.stopPropagation();
		});
		
		$('#user_page_subscription_toggle').removeClass('user_page_subscription_toggle_unsubscribe');
		$('#user_page_subscription_toggle').addClass('user_page_subscription_toggle_subscribe');
	}
	else
	{
		$('#user_page_subscription_toggle').unbind('click');
		
		// Change button click behavior
		$('#user_page_subscription_toggle').click(function(event) { 
			user_unsubscribe({ 
        context:      'page', 
        user_id:      user_id,
				user_name: 		user_name
      }); 
    
			event.stopPropagation();
		});

		$('#user_page_subscription_toggle').removeClass('user_page_subscription_toggle_subscribe');
		$('#user_page_subscription_toggle').addClass('user_page_subscription_toggle_unsubscribe');
	}
}

/**
 * Switch the subscribe / unsubscribe status of a user listing subscription toggle
 *
 */
function switch_user_listing_subscription_toggle(user_id, user_name, status)
{
	var toggles = $('.user_'+user_id+'_subscription_toggle');

	if(status == 'subscribe')
	{
		toggles.unbind('click');
		
		// Change button click behavior
		toggles.click(function(event) { 
			user_subscribe({ 
        context:      'listing', 
        user_id:      user_id,
				user_name: 		user_name
      }); 
  
			event.stopPropagation();
		});
	
		toggles.removeClass('user_listing_subscription_toggle_pending');
		toggles.removeClass('user_listing_subscription_toggle_unsubscribe');
		toggles.addClass('user_listing_subscription_toggle_subscribe');
	}
	else
	{
		toggles.unbind('click');
		
		// Change button click behavior
		toggles.click(function(event) { 
			user_unsubscribe({ 
        context:      'listing', 
        user_id:      user_id,
				user_name: 		user_name
      }); 
  
			event.stopPropagation();
		});
	
		toggles.removeClass('user_listing_subscription_toggle_pending');
		toggles.removeClass('user_listing_subscription_toggle_subscribe');
		toggles.addClass('user_listing_subscription_toggle_unsubscribe');
	}
}

var discovery_users_load_more_pending = false;
var discovery_users_load_more_cache = new Array();

/**
 * Loads an initial list of users on the discovery page
 * 
 * @param string service Service for which to load users
 */
function discovery_users_load(service)
{
	var parameters =
	{ 
    service: 	service,
    page: 		1
  };

	var onSuccess = function(data)
  {
		$('#discovery_col_pending_'+service).hide();
		$('#discovery_col_interior_'+service).append(data.html);
		
		discovery_users_load_more_refresh_cache(service,2);
  };

	$('#discovery_col_interior_'+service).empty();
	$('#discovery_col_pending_'+service).show();

	$.get(routes['user_discovery'], parameters, onSuccess);
}

/**
 * Load more users for the discovery page
 *
 * @param string service The service for which to load more users
 * @param integer page Page of users to load
 */
function discovery_users_load_more(service,page)
{
	if(discovery_users_load_more_pending) { return; } // canary
	
	var parameters =
	{ 
    service: 	service,
    page: 		page
  };

	if(discovery_users_load_more_cache[service])
	{
		var html = discovery_users_load_more_cache[service];
		discovery_users_load_more_refresh_cache(service,page+1);
		
		$('#discovery_load_more_'+service).remove();
		$('#discovery_col_'+service).append(html);
		return;
	}

	var onSuccess = function(data)
  {
		discovery_users_load_more_pending = false;
		
		$('#discovery_load_more_'+service).remove();
		$('#discovery_col_'+service).append(data.html);
		
		discovery_users_load_more_refresh_cache(service,page+1);
  };

	var onFailure = function(data)
  {
    discovery_users_load_more_pending = false;
  };

	discovery_users_load_more_pending = true;
  $('#discovery_load_more_'+service).css({ opacity: .5, cursor: 'default' });

	$.get(routes['user_discovery'], parameters, onSuccess).error(onFailure);
}

/**
 * Refresh the discovery users load more cache
 *
 */
function discovery_users_load_more_refresh_cache(service,page)
{
	var parameters =
	{ 
    service: 	service,
    page: 		page
  };

	var onSuccess = function(data)
  {
		discovery_users_load_more_cache[service] = data.html;
  };

	discovery_users_load_more_cache[service] = null;

	$.get(routes['user_discovery'], parameters, onSuccess);
}

var users_load_more_pending = false;

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

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

	var onFailure = function(data)
  {
    users_load_more_pending = false;
  };

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

function check_email_callback(request)
{
  var result = request.responseText;
  
  if(result == 'unavailable')
  {
    $('#signup_email_unavailable').css('display', 'block');
  }
  else
  {
    $('#signup_email_unavailable').css('display', 'none');
  }
}

var username_available = true;
var username_detect_watch_timeout;
var username_detect_last_char;

function username_detect_watch(event)
{
  username_detect_last_char = event.keyCode;

  if(username_detect_watch_timeout > 0)
  {
     clearTimeout(username_detect_watch_timeout);
  }//if

  if(username_detect_last_char != Event.KEY_RETURN)
  {
    if($('#user_username').val())
    {
      $('#username_url_value').html($('#user_username').val());
    }
    else
    {
      $('#username_url_value').html('your-username');
    }
    
    username_detect_watch_timeout = setTimeout(function() { username_detect(); }, 500);
  }//if
}


function username_detect()
{
  var username            					= $('#user_username');
  var username_detection_taken    	= $('#username_detection_taken');
  var username_detection_available  = $('#username_detection_available');
  var username_detection_invalid    = $('#username_detection_invalid');
  
  // Close detect area if no username
  if(!trim(username.val()))
  {
    username_detection_taken.hide();
    username_detection_available.hide();
    username_detection_invalid.hide();
    username_available = true;
    return;
  }

	var onSuccess = function(data)
  { 
    if(data.msg)
    {
      if(data.valid == true)
      {
        if(data.available == true)
        {
          username_detection_taken.hide();
          username_detection_invalid.hide();
          username_detection_available.show();
          username_available = true;
        }
        else if(data.available == false)
        {
          username_detection_taken.show();
          username_detection_available.hide();
          username_detection_invalid.hide();
          username_available = false;
        }
      }
      else
      {
        username_detection_taken.hide();
        username_detection_available.hide();
        username_detection_invalid.show();
        username_available = false;
      }
    }
  }

	$.get(routes['ajax_username_detection'], { username: username.val() }, onSuccess);

}//function

function validate_user_form(page)
{
  if(!username_available)
  {
    alert('Sorry, the username you have chosen is not available. Please choose another.');
    return false;
  }
  
  var empty_fields = '';
  
  // check name field
  if(!trim($('#user_name').val()))
  {
    empty_fields += "- Name\n";
  }
  
  // check username field
  if(!trim($('#user_username').val()))
  {
    empty_fields += "- Username\n";
  }
  
  // check password field
  if((trim($('#user_password').val()) && trim($('#user_password').val()).length < 6) || (page != 'basic_info' && !trim($('#user_password').val())))
  {
    empty_fields += "- Password (must be at least 6 characters long)\n";
  }
  
  // check email field
  if(!trim($('#user_email').val()))
  {
    empty_fields += "- Email\n";
  }
  
  // check location field
  if(!trim($('#user_location').val()))
  {
    empty_fields += "- Location\n";
  }
  
  // check timezone field
  if(!trim($('#user_timezone').val()))
  {
    empty_fields += "- Timezone\n";
  }
  
  if(empty_fields)
  {
    alert('Please fill out the following fields before submitting:\n\n'+empty_fields);
    return false;
  }

  if(!is_valid_email(trim($('#user_email').val())))
  {
    alert('Please provide a valid email address.');
    return false;
  }
  
  return true;
}

/**
 * Validate the mobile user completion form
 *
 */
function user_mobile_completion_form()
{
  var empty_fields = '';
  
  // check name field
  if(!trim($('#user_name').val()))
  {
    empty_fields += "- Name\n";
  }
  
  // check email field
  if(!trim($('#user_email').val()))
  {
    empty_fields += "- Email\n";
  }
  
  // check password field
  if((trim($('#user_password').val()) && trim($('#user_password').val()).length < 6) || (page != 'basic_info' && !trim($('#user_password').val())))
  {
    empty_fields += "- Password (must be at least 6 characters long)\n";
  }
  
  if(empty_fields)
  {
    alert('Please fill out the following fields before submitting:\n\n'+empty_fields);
    return false;
  }

  if(!is_valid_email(trim($('#user_email').val())))
  {
    alert('Please provide a valid email address.');
    return false;
  }
  
  return true;
}

var prompt_new_user_place_input_enter_pending = false;
var prompt_new_user_place_marker;

var prompt_user_new_place_id;
var prompt_user_new_place_name;

/**
 * Handles the entry of a new place in the prompt
 *
 */
function prompt_new_user_place_input_enter(event)
{
	if(prompt_new_user_place_input_enter_pending) { return false; } // canary
	
	if(!trim($('#prompt_user_new_place_input').val()))
	{
		$('#prompt_new_user_place_map').hide();
		$('#prompt_new_user_place_submit').hide();
		return;
	}
	
	prompt_new_user_place_input_enter_pending = true;
	
	$('#prompt_user_new_place_input').addClass('prompt_user_new_place_input_pending');
	
	var params = {
		'q': 				$('#prompt_user_new_place_input').val(),
		'limit' : 	1
	};

	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
		  };
		
			$('#prompt_new_user_place_map').show();
			$('#prompt_new_user_place_submit').show();

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

		  var prompt_new_user_place_marker = new google.maps.Marker({
		    position: 	latlng,
		    title: 			place.name,
		    map: 				map
		  });

			prompt_user_new_place_id 		= place.id;
			prompt_user_new_place_name 	= place.region_name;
		}
		else
		{
			$('#prompt_new_user_place_map').hide();
			$('#prompt_new_user_place_submit').hide();
		}
		
		$('#prompt_user_new_place_input').removeClass('prompt_user_new_place_input_pending');
	
		prompt_new_user_place_input_enter_pending = false;
	}
	
	var onFailure = function()
	{
		prompt_new_user_place_input_enter_pending = false;
	}
	
	$.get(routes['search_places'], params, onSuccess).error(onFailure);
}

/**
 * Handles the submit of a new place in the prompt
 *
 */
function prompt_new_user_place_submit(event)
{ 
	if(!prompt_user_new_place_id || !prompt_user_new_place_name) { return false; }

	var plans_scope 					= $('#plans_scope'); 
	var plans_scope_options 	= plans_scope.find('li');
	
	var li_exists = false;

	// Check to see if list item for this place is already in menu
	for(var i = 0; i < plans_scope_options.length; i++)
	{ 
		plans_scope_options[i] = $(plans_scope_options[i]);
		
		if(plans_scope_options[i].attr('place_id') == prompt_user_new_place_id)
		{ 
			li_exists = true;
			break;
		}
	}
	
	// Insert new list item if one doesn't already exist for this place
	if(!li_exists)
	{
		var new_li = $('<li place_id="' + prompt_user_new_place_id + '" onclick="plans_scope_select(\'local\', $(this).attr(\'place_id\'));">' + prompt_user_new_place_name + '</li>');
		$('#plans_scope_everywhere').after(new_li);
	}

	// Select plans for this new place
	plans_scope_select('local', prompt_user_new_place_id);
}

/**
 * Handles a subscription request
 *
 * @param integer id Subscription request ID
 * @param string decision Whether to approve or deny request
 */
function user_subscription_request_respond(id, decision)
{
	$.post(routes['user_subscription_request_respond'], { subscription_request_id: id, decision: decision });
	
	$('#user_subscription_request_'+id).fadeOut();
}

var user_completion_submit_pending = false;

/**
 * Submits the user completion component
 *
 */
function user_completion_submit()
{
	if(user_completion_submit_pending) { return; } // canary

	if($('#user_completion_email').length && !$('#user_completion_email').val() || !$('#user_completion_password').val())
	{
		alert('Please fill out all of the fields before submitting.');
		return;
	}

	if($('#user_completion_email').length && !is_valid_email($('#user_completion_email').val()))
	{
		alert('Please check your email address to make sure it\'s correct.');
		return;
	}

	if(trim($('#user_completion_password').val()).length < 6)
	{
		alert('Please provide a password that is at least 6 characters in length.');
		return;
	}

	var parameters = {};
	
	if($('#user_completion_email').length)
	{
		parameters['email'] = $('#user_completion_email').val();
	}
	
	parameters['password'] = trim($('#user_completion_password').val());
	
	var onSuccess = function(data)
	{
		user_completion_submit_pending = false;
		
		$('#user_completion_1').hide();
		$('#user_completion_2').show();
		
		setTimeout("$('#user_completion').fadeOut();",1000);
	};

	var onFailure = function()
	{
		user_completion_submit_pending = false;
	};
	
	user_completion_submit_pending = true;
	$('#user_completion_submit_button').css({ opacity: .7, cursor: 'default' });

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

/**
 * Subscribes the session user to all external service friends from the user discovery page
 *
 */
function prompt_suggested_users_subscribe_all(service)
{ 
	var subscription_toggles = $('#prompt_suggested_users_content_'+service).find('.user_listing_subscription_toggle');
	
	for(var i = 0; i < subscription_toggles.length; i++)
	{
		switch_user_listing_subscription_toggle($(subscription_toggles[i]).attr('user_id'), $(subscription_toggles[i]).attr('user_name'), 'unsubscribe');
	}
	
	$.post(routes['user_subscribe_all'], { service: service });
}

/**
 * Subscribes the session user to all external service friends from the user discovery page
 *
 */
function user_activation_friends_subscribe_all(service)
{ 
	var subscription_toggles = $('#user_activation_friends_'+service).find('.user_listing_subscription_toggle');
	
	for(var i = 0; i < subscription_toggles.length; i++)
	{
		switch_user_listing_subscription_toggle($(subscription_toggles[i]).attr('user_id'), $(subscription_toggles[i]).attr('user_name'), 'unsubscribe');
	}
	
	$.post(routes['user_subscribe_all'], { service: service });
}

/* User activation */

/**
 * Proceeds to the next step along the user activation flow
 * 
 */
function user_activation_proceed()
{
	switch(user_activation_current_step)
	{
		// Friends
		case 'friends':
			// Change steps progress
			$('#user_activation_steps_friends').removeClass('user_activation_steps_current');
			$('#user_activation_steps_friends').addClass('user_activation_steps_completed');
			$('#user_activation_steps_suggested_users').addClass('user_activation_steps_current');
			
			// Change current step to next step
			user_activation_current_step = 'suggested_users';
			
			$('#user_activation_welcome_back').slideUp(750);
			
			break;
			
		// Suggested Users
		case 'suggested_users':
			// Change steps progress
			$('#user_activation_steps_suggested_users').removeClass('user_activation_steps_current');
			$('#user_activation_steps_suggested_users').addClass('user_activation_steps_completed');
			$('#user_activation_steps_categories').addClass('user_activation_steps_current');
			
			// Change current step to next step
			user_activation_current_step = 'categories';
			break;
			
		// Categories
		case 'categories':

			// Redirect to homepage
			window.location = routes['user_activation_complete'];
			return;
	}
	
	// Hide current step content and show loading icon
	$('#user_activation_content').hide();
	$('#user_activation_content_loading').show();
	
	// Load new step content upon call success
	var onSuccess = function(data)
	{
		$('#user_activation_content').html(data.html);
		$('#user_activation_content_loading').hide();
		$('#user_activation_content').show();
	}
	
	// Initiate call
	$.get(routes['user_activation'], { step: user_activation_current_step }, onSuccess);
}

/**
 * Reloads the content of the current user activation flow step
 * 
 * @param string tab Optional tab for step to be used when loaded
 */
function user_activation_reload(tab)
{
	// Hide current step content and show loading icon
	$('#user_activation_content').hide();
	$('#user_activation_content_loading').show();
	
	// Load new step content upon call success
	var onSuccess = function(data)
	{
		$('#user_activation_content').html(data.html);
		$('#user_activation_content_loading').hide();
		$('#user_activation_content').show();
	}
	
	// Initiate call
	$.get(routes['user_activation'], { step: user_activation_current_step, tab: tab }, onSuccess);
}

/**
 * Selects a tab for the friends step of the user activation flow
 *
 * @param string selection facebook/twitter
 */
function user_activation_friends_tab(selection)
{
	if(selection == 'facebook')
	{
		$('#user_activation_friends_tabs_facebook').addClass('user_activation_friends_tabs_selected');
		$('#user_activation_friends_tabs_twitter').removeClass('user_activation_friends_tabs_selected');
		$('#user_activation_friends_twitter').hide();
		$('#user_activation_friends_facebook').show();
	}
	else if(selection == 'twitter')
	{
		$('#user_activation_friends_tabs_twitter').addClass('user_activation_friends_tabs_selected');
		$('#user_activation_friends_tabs_facebook').removeClass('user_activation_friends_tabs_selected');
		$('#user_activation_friends_facebook').hide();
		$('#user_activation_friends_twitter').show();
	}
}

/**
 * Checks the number of categories selected in the categories step of the user activation flow to determine whether to allow user to finish
 *
 */  
function user_activation_categories_check()
{ 
  if(true || !$('#user_activation_proceed_categories')) { return; }

  var subscribe_toggles = $('#user_activation_content').find('.category_listing_subscription_toggle_unsubscribe');

  if(subscribe_toggles.length >= 3)
  {
    $('#user_activation_proceed_deactive').hide();
    $('#user_activation_proceed_active').show();
  }
  else if($('#user_activation_proceed_active').length)
  {
    $('#user_activation_proceed_active').hide();
    $('#user_activation_proceed_deactive').show();
  }
}
