var user_invitations_last_query;
var user_invitations_last_matches;
var user_invitations_submit_pending = false;

// escape by Colin Snover
// Note: if you don't care for (), you can remove it..
RegExp.escape = function(text) {
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
}

function user_invitations_listing_highlight(term, base) 
{
  if(!term || !base) return;

  var re = new RegExp("(" + RegExp.escape(term) + ")", "gi"); //... just use term

  $("*", base).contents().each(function(i, el) 
	{
    if(el.nodeType === 3) 
		{
      var data = el.data;
      if(data = data.replace(re, function(match) { return '<span class="user_invitations_listing_highlight">' + match + '</span>'; })) 
      {
        var wrapper = $("<span>").html(data);
        $(el).before(wrapper.contents()).remove();
      }
    }
  });
}

jQuery.expr[':'].namecontains = function(div, i, m) 
{
  return ($(div).attr('user_name') || "").toUpperCase().indexOf(m[3].toUpperCase()) >= 0;
};

/**
 * Selects a recipient
 *
 */
function user_invitations_select(user_id, user_id_type, user_name, user_pic)
{
	var li = $('<li class="user_button selected" user_id="' + user_id + '" user_id_type="' + user_id_type + '" id="user_button_' + user_id_type +'_' + user_invitations_id_convert(user_id) + '" onclick="$(this).mouseout(); user_invitations_toggle(event, \'' + user_id + '\', \'' + user_id_type + '\');" onmouseover="show_tooltip($(this), \'' + user_name + '\', \'(Click to Deselect)\');" onmouseout="hide_tooltip()" user_name="' + user_name + '"><img src="' + user_pic + '" class="user_button_pic" /></li>');
	
	if(user_id_type == 'twitter_user')
	{
		li.append('<img src="/images/icons/twitter_small.png" class="user_invitations_selected_icon" />');
	}
	else if(user_id_type == 'email')
	{
		li.append('<img src="/images/icons/email.png" class="user_invitations_selected_icon" style="width: 11px !important; left: 19px !important;" />');
	}

	li.hide();
	$('#user_invitations_selected_clear').before(li);
	
	$('#user_invitations_composer_selected').show();
  $('#user_invitations_buttons_no_thanks').hide();

	li.fadeIn(500);

	show_tooltip(li, user_name);
	tooltip_hide_timeout = setTimeout(function() { hide_tooltip(500); }, 2000);
}

function user_invitations_toggle(event, user_id, user_id_type, user_name, user_pic)
{
	hide_tooltip();

	var listing = $('#user_invitations_listing_' + user_id_type + '_' + user_invitations_id_convert(user_id));

	// Deselect
  if(!listing.length || listing.hasClass('selected'))
  {
		// Hide selected button
		$('#user_button_' + user_id_type + '_' + user_invitations_id_convert(user_id)).fadeOut(500, function() {

			// Remove selected button
			$(this).remove();
			
			// Hide selected area and change buttons if nobody selected
			if($('#user_invitations_selected').children().length == 1)
	    {
	      $('#user_invitations_buttons_no_thanks').show();
	      $('#user_invitations_composer_selected').hide();
	    }
	
		});
		
		listing.removeClass('selected');
  	listing.attr('tooltip_value', 'Click to Select');
  }
	// Select
  else
  {
		user_invitations_select(user_id, user_id_type, user_name, user_pic);
		
    listing.addClass('selected');
		listing.attr('tooltip_value', 'Click to Deselect');
  }
  
  event.stopPropagation();
}

function user_invitations_search(event)
{    
	hide_tooltip();
	$('.user_invitations_listing_hover').removeClass('user_invitations_listing_hover');

	// Upon enter key
	if(event && event.keyCode == 13)
	{
		// Select email address
		if(is_valid_email(trim($(this).val())))
		{
			var email = trim($(this).val());
			$(this).val('');
			user_invitations_search();
			user_invitations_select(email, 'email', email, '/images/default_pic_square.png');
			return;
		}
		// Select sole listing viewed
		else
		{
			var visible_listings = $('#user_invitations_listings').find('.user_invitations_listing:visible');

			if(visible_listings.length == 1)
			{
				$(this).val('');
				user_invitations_search();
				visible_listings.click();
				return;
			}
		}
	}
	
  $('#user_invitations_listings_none').hide();
  
  var query = $(this).val();
  
  // Dehighlight any previous query results
  if(user_invitations_last_query && user_invitations_last_matches && user_invitations_last_matches.length)
  {
     $(user_invitations_last_matches).find('.user_invitations_listing_name').each(function () {
   		var text = $(this).text();
   		$(this).html(text);
     });
  }

  if(query.length > 0)
  {
    // Insert input clear button
    if(!$('#user_invitations_search_clear').length)
    {
      $('#user_invitations_search').append('<div id="user_invitations_search_clear"><img src="/images/icons/input_clear.png" /></div>');
      $('#user_invitations_search_clear').click(function() { $('#user_invitations_search_input').val(''); $('#user_invitations_search_input').keyup(); });
    }
    
    $('.user_invitations_listing').hide();
  
    var matches = $('#user_invitations_listings').find('div:namecontains(' + query + ')');
  
    if(matches.length)
    {
			$('#user_invitations_listings_exterior').show();
      matches.show();
      user_invitations_listing_highlight(query, matches);

			if(matches.length == 1)
			{
				matches.addClass('user_invitations_listing_hover');
			}
    }
    else
    {
      $('#user_invitations_listings_exterior').hide();
    }
  }
  else if(query.length == 0)
  {
		$('#user_invitations_listings_exterior').show();
    $('#user_invitations_search_clear').remove();
    $('.user_invitations_listing').show();
  }
  
  user_invitations_last_query = query;
  user_invitations_last_matches = matches;
}

/**
 * Converts an ID into something suitable for JQuery
 *
 */
function user_invitations_id_convert(id)
{
	return id.replace('.', '_').replace('@', '_');
}

function user_invitations_preview()
{
	var message = trim($('#user_invitations_message').val());
  
  // Require message
  if(!message)
  {
    alert('Please provide a message to send your friends about this plan.');
    return;
  }
  
  // Require message
  if(message.length > user_invitations_message_limit)
  {
    alert('Please shorten your message to '+user_invitations_message_limit+' characters or fewer.');
    return;
  }

	// Enter email address if not fully selected
	var search_input = $('#user_invitations_search_input');
	if(is_valid_email(search_input.val()))
	{
		user_invitations_select(search_input.val(), 'email', search_input.val(), '/images/default_pic_square.png');
		user_invitations_search();
		search_input.val('');
	}
	
	// Require recipients
	if(!$('#user_invitations_selected').find('.user_button').length)
	{
		alert('Please provide at least one recipient for your invite.');
		return;
	}

	$('#user_invitations_preview_message').html($('#user_invitations_message').val());

	// Plancast friends
	$('#user_invitations_preview_plancast_recipients').empty();
	$('#user_invitations_selected').find('.user_button[user_id_type=user]').each(function(i, el)
	{
		var image = $(el).find('.user_button_pic').clone();
		var li = $('<li onmouseover="show_tooltip($(this), \'' + $(el).attr('user_name') + '\');" onmouseout="hide_tooltip();"></li>');
		$('#user_invitations_preview_plancast_recipients').append(li.append(image));
		$('#user_invitations_preview_plancast').show();
	});
	
	// Email recipients
	$('#user_invitations_selected').find('.user_button[user_id_type=email]').each(function(i, el)
	{
		var image = $(el).find('.user_button_pic').clone();
		var li = $('<li onmouseover="show_tooltip($(this), \'' + $(el).attr('user_name') + '\');" onmouseout="hide_tooltip();"></li>');
		$('#user_invitations_preview_plancast_recipients').append(li.append(image));
		$('#user_invitations_preview_plancast').show();
	});
  
	// Twitter friends
	$('#user_invitations_preview_twitter_recipients').empty();
	$('#user_invitations_selected').find('.user_button[user_id_type=twitter_user]').each(function(i, el)
	{
		var image = $(el).find('.user_button_pic').clone();
		var li = $('<li onmouseover="show_tooltip($(this), \'' + $(el).attr('user_name') + '\');" onmouseout="hide_tooltip();"></li>');
		$('#user_invitations_preview_twitter_recipients').append(li.append(image));
		$('#user_invitations_preview_twitter').show();
	});
	
	// Facebook friends
	$('#user_invitations_preview_facebook_recipients').empty();
	$('#user_invitations_selected').find('.user_button[user_id_type=facebook_user]').each(function(i, el)
	{
		var image = $(el).find('.user_button_pic').clone();
		var li = $('<li onmouseover="show_tooltip($(this), \'' + $(el).attr('user_name') + '\');" onmouseout="hide_tooltip();"></li>');
		$('#user_invitations_preview_facebook_recipients').append(li.append(image));
		$('#user_invitations_preview_facebook').show();
	});
	
  $('#user_invitations_main').hide();
  $('#user_invitations_preview').show();
}

/**
 * Submits the user invitations form
 *
 */
function user_invitations_submit()
{
	if(user_invitations_submit_pending) { return; } 
	
	user_invitations_submit_pending = true;
	
	var message = trim($('#user_invitations_message').val());
  
  var recipients = new Array();
  var user_buttons = $('#user_invitations_selected').find('.user_button');
  
	for(var i = 0; i < user_buttons.length; i++)
  {
		recipients.push($(user_buttons[i]).attr('user_id') + ',' + $(user_buttons[i]).attr('user_id_type'));
  }

	// Compile parameters
  var params = 
	{
		plan_id: 					user_invitations_plan_id,
		message: 					message,
		new_plan:         user_invitations_new_plan
	};
	
	// Success
	var onsuccess = function(data)
	{
	  window.location.href = routes['plan'] + '/' + user_invitations_plan_id;
  }

	params['recipients[]'] = recipients;

	$('#prompt_user_invitations_close').hide();
	$('#user_invitations_preview_buttons_go_back').hide();
	$('#user_invitations_preview_buttons_send_invite').css({ opacity: .7, cursor: 'default', paddingLeft: '35px' });
	$('#user_invitations_preview_buttons_send_invite').addClass('user_invitations_buttons_invite_pending');

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

function user_button_mouseover()
{
  $(this).find('.user_button_close').show();
}

function user_button_mouseout()
{
  $(this).find('.user_button_close').hide();
}
