if( typeof(Sharer) == 'undefined'){ var Sharer = {}; }

/**
 * Render the importer after the user clicks the #importer_link, activate keyboard inputs
 */

Sharer.ref_override = 'postembed__view'; // todo - fix me

/*
 * @options may include:
 *   to_share:
 *   pcid
 *   pxcid
 * @options to add (in order to mimic the cheetah method signature)
 *   default_provider:
 *   known_user_email_prefix:
 *   address_book:
 */

Sharer.initialize = function( options ){
  // options passed in will be available at Sharer.options
  options = lu.defaults(options, {
  });
  Sharer.options = options;

  var sharer = $('#sharer');

  if( options.message ){
    sharer.find('#message').val( options.message );
  }
  else if( options.to_share instanceof api.Channel ){
    if( AppBase.user && options.to_share && options.to_share['owner_puid'] == AppBase.user['puid'] ){
      sharer.find('#message').val( translate('Check_mine_out', translate('channel_type_'+options.to_share.type)) );
    }else if( options.to_share ){
      sharer.find('#message').val( translate('Check_it_out', translate('channel_type_'+options.to_share.type)) );
    }
  }else if( options.to_share instanceof api.Group ){
    options.to_share['type'] = 'group';
    if( Groups.is_moderator ){
      sharer.find('#message').val( lu.unescape_HTML(translate('Default_group_inviter_text', options.to_share.display_name)) );
    }else if( options.to_share ){
      sharer.find('#message').val( lu.unescape_HTML(translate('Default_group_inviter_text_for_visitor', options.to_share.display_name)) );
    }
  }

  $('#friend_selector').autoselect(
    null,
    {
      'minChars' : 1,
      'focusClear':1,
      'preFoundTipEmpty' : '<br/><br/>',
      'onNewEntry' : Sharer.init_autoselect_onNewEntry,
      'onItemSelect' : Sharer.init_onItemSelect,
      'onNewResult' : function(){Sharer.updateEmailInputTip(true);},
      'onEmptyResult' : function(){Sharer.updateEmailInputTip(false);}
    },
    address_book
  );

  Sharer.selectAll();
  Sharer.update_importer_form(false);

  return sharer;
};


/**
 * for backwards-compatability
Sharer.init_autoselect = function(pxcid, pcid, options){
  return Sharer.initialize($.extend(options, {
    'pxcid' : pxcid,
    'pcid' : pcid
  }));
};
*/

Sharer.show_import = function(do_effects){
  if( do_effects ){
    $('#selector_importer').slideDown();
  }else{
    $('#selector_importer').show();
  }
  $('#importer_link').hide();
  $.each(['import_name','import_password'], function( idx, inid ){
    $('#'+inid).unbind().bind('keydown',
      function(e){
	if( e.keyCode == 13 ){
	  Sharer.submit_importer();
	  return false;
	}
	return true;
      });
    });
};

Sharer.hide_import = function(){
  $('#selector_importer').slideUp();
  $('#importer_link').show();
};

/**
 * Updates the importer form based on the number of current contacts
 * @param do_effects Boolean, if true we use animations
 */
Sharer.update_importer_form = function(do_effects){
  lu.default_to( do_effects, true );
  if( $('#friend_selector')[0].autoselector.entryCount() == 0 ){
    Sharer.show_import();
  }else{
    Sharer.hide_import();
  }
};

Sharer.submit_importer = function(){
  var domain = $('#import_domain option:selected').text();
  var name = $('#import_name')[0].value;
  var password = $('#import_password')[0].value;

  if( name.length == 0 || password.length == 0 ){
    	Sharer.showWarning( $('#selector_importer .warning'), translate('no_name_or_password'));
	return;
  }

  $("#selector_importer table").hide();
  $("#selector_importer .progress").show();

  var oldcontacts_length = $('#friend_selector')[0].autoselector.entryCount();

  AppBase.post(
    '/contacts',
    {
      'xaction' : 'scrape',
      'inviter_email' : name,
      'inviter_password' : password,
      'inviter_provider' : domain,
      'ref_override' : Sharer.ref_override
    },
    function(response){ //Success function
      Sharer.clearWarning($('#selector_importer .warning'));
      var newContacts = response['contacts'];
      if(!AppBase.user){
	  AppBase.user = response['user'];
	}
      	var toAdd = [];
	$("#selector_importer table").show();
	$("#selector_importer .progress").hide();

	if( parseInt(response['scraped_count']) == 0 ){
	  $('.ac_control').show();
	  $('#importer_link').show();
	  $('#selector_importer').slideUp();
	  alert( translate('no_contacts'));
	  return;
	}

	for( var i = 0; i < newContacts.length; i++){
	  if( !newContacts[i]['email'] || !newContacts[i]['display_name'] || !newContacts[i]['puid']){ continue; }
	  var newEmail = newContacts[i]['email'].split('@')[1];
	  toAdd.push([newContacts[i]['display_name'],
		      newEmail,
		      newContacts[i]['puid']] );
	}
	$('#friend_selector')[0].autoselector.addNewEntries(toAdd);
        Sharer.update_importer_form();
	Sharer.init_onItemSelect(); // Update selected item counter for autoselected additions
    },
    function(response){ //Failure function
      $("#selector_importer table").show();
      $("#selector_importer .progress").hide();

      if( response.indexOf('bad_password') > 0 ){
	Sharer.showWarning( $('#selector_importer .warning'), translate('bad_password'));
      }else if( response.indexOf('yahoo_rate_limit') > 0 ){
	Sharer.showWarning( $('#selector_importer .warning'), translate('yahoo_rate_limit'));
      }else{
	Sharer.showWarning( $('#selector_importer .warning'), translate('bad_import_inputs'));
      }
    }
  );
};

/**
 * Generic warning message
 * @param element Target element, will contain message
 * @param warningText Warning text to display (string)
 * @param warningElem Warning element to append (domElement)
 * @param timeOut Timeout in ms, message will be hidden after this time. Message stays if this is false or null
 */
Sharer.showWarning = function( element, warningText, warningElem, timeOut ){
  if( typeof( warningElem ) == 'undefined' ){warningElem = null;}
  if( typeof( timeOut ) == 'undefined'){timeOut = 5000;}
  element.show();
  element.text(warningText);
  if( warningElem ){
    element.append( warningElem );
  }
  if( timeOut ){
    setTimeout(function(){ element.fadeOut(); }, timeOut);
  }
};

Sharer.clearWarning = function( element ){
  element.hide();
};

Sharer.updateEmailInputTip = function( matches ){
  var entryText = $("#friend_selector")[0].value;
  if( entryText == '' || matches){
    $("#friend_selector_info").hide();
    $("#import_domain").css({'visibility':'visible'});
    return false;
  }
  if( AppBase.is_legal_email(entryText) ){
    $("#friend_selector_info")[0].innerHTML = translate('email_info_complete_'+Sharer.options.to_share['type'])+"<br/><b><a href='#' onclick='Sharer.addCurrentInputValue();return false;'>"+translate('click_add_more')+"</a></b>";
    $("#import_domain").css({'visibility':'hidden'});
    $("#friend_selector_info").show();
  }
  if( !AppBase.is_legal_email(entryText) ){
    $("#import_domain").css({'visibility':'visible'}); // We are not blocking with the short message
    $("#friend_selector_info").text(translate('email_info_incomplete_'+Sharer.options.to_share['type']));
    $("#friend_selector_info").show();
  }
};

/**
 * Deselect all entries in contact list
 */
Sharer.selectNone = function(){
  $('#friend_selector')[0].autoselector.selectNone();
};

/**
 * Select all entries in contact list
 */
Sharer.selectAll = function(){
  $('#friend_selector')[0].autoselector.selectAll();
};

Sharer.addCurrentInputValue = function(send_after_add){
  if( typeof( send_after_add ) == 'undefined' ){
    send_after_add = false;
  }
  var callback = function(toAdd){
    $('#friend_selector')[0].autoselector.addNewEntries([toAdd]);
  };
  if( send_after_add ){
    callback = function(toAdd){
      $('#friend_selector')[0].autoselector.addNewEntries([toAdd]);
      Sharer.sendSelected();
    };
  }

  Sharer.init_autoselect_onNewEntry( $('#friend_selector')[0].value,callback );
};

/**
 * Send messages to all selected entries
 */
Sharer.sendSelected = function(){
  if(Sharer.sendSelected_blocking){ return false; }
  Sharer.sendSelected_blocking = true;

  var selected = $('#friend_selector')[0].autoselector.getSelected();
  var message = $('#message')[0].value;
  var fromName = $('#from_display_name')[0].value;
  if( fromName.length == 0 ){
    Sharer.showWarning( $('#from_display_name_warning'), translate('enter_name'));
    Sharer.sendSelected_unblock();
    return false;
  }

  if( selected.length == 0 ){
    if( Mu.validate_email($('#friend_selector')[0].value) ){
      Sharer.addCurrentInputValue(true);
    }else{
      $("#friend_selector_info").text(translate('invalid_email'));
      $("#friend_selector_info").show();
    }
    Sharer.sendSelected_unblock();
    return false;
  }


  var parameters = {
    'message' : message,
    'puids' : selected,
    'sender' : fromName,
    'ref_override' : Sharer.ref_override
  };
  if( Sharer.options.to_share instanceof api.Channel ){
    parameters.xaction = 'channel_invite';
    parameters.pcid = Sharer.options.pcid;
  }else if( Sharer.options.to_share instanceof api.Group ){
    parameters.xaction = 'group_invite';
    parameters.focal_group_puid = Sharer.options.to_share.puid;
  }

  AppBase.post(
    '/contacts',
    parameters,
    Sharer.on_successful_send_selected,
    Sharer.on_failed_send_selected
  );
  return false;
};

Sharer.on_successful_send_selected = function(response){
  Sharer.sendSelected_unblock();
  if( response['result'] == 'success'){
    Sharer.on_finished_sharing();
  }else if(response['result'] == 'over_limit'){
    Sharer.showWarning($('#progress_warning'),
      translate('reached_limit'),
      A(
        {
          'href':'#',
          'class':'block_link',
          'onclick':function(){
            Sharer.login_or_create_prompt();
            return false;
          }
        },
        translate('create_to_send_more')
      )
    );
  }
};

Sharer.on_failed_send_selected = function(response){
  Sharer.sendSelected_unblock();
};

Sharer.on_finished_sharing = function(){
  if( Sharer.options.on_finished ){
    Sharer.options.on_finished();
  }
};

Sharer.sendSelected_unblock = function(){
  Sharer.sendSelected_blocking = false;
};
Sharer.sendSelected_blocking = false;

/**

  -- This is hazmat LT-only code --

Sharer.login_or_create_prompt = function( options ){
  options = lu.defaults(options, {
  });
  var splash = DIV({'id':'splash_register'},
		 H1({},translate('login_or_create_'+Sharer.options.to_share['type'])),
		 TABLE({},TBODY({},
				TR({},TD({},translate('full_name')),TD({}, INPUT({'type':'text', 'id':'new_account_real_name', 'maxlength':64}))),
				TR({},TD({},translate('your_email')),TD({}, INPUT({'type':'text', 'id':'new_account_email', 'maxlength':64}))),
				TR({},TD({},translate('new_password')),TD({}, INPUT({'type':'password', 'id':'new_account_password', 'maxlength':64}))),
				TR({},TD({}),TD({},
						INPUT({'type':'submit',
						       'onclick':function(){ Sharer.login_or_create_submit(options); },
						       'class':'slide_button',
						       'value':"It's mine"}),
						SPAN({'class':'hint'},'&nbsp;'+translate('or_')+'&nbsp;'),
						A({'href':'#', 'onclick':'bu.overlay.clear();'},'cancel')
			       )))),
		 DIV({'class':'warning', 'id':'in_place_registration_warning'})
  );
  bu.overlay(splash, {'width':300}); return false;
};

Sharer.login_or_create_submit = function( options ){
  if( ($('#new_account_real_name').val()).length < 2 ){
    Sharer.showWarning($('#in_place_registration_warning'), translate('in_place_reg_warning_name'));
    return false;
  }
  if( !Mu.validate_email($('#new_account_email').val()) ){
    Sharer.showWarning($('#in_place_registration_warning'), translate('in_place_reg_warning_email'));
    return false;
  }
  if( !AppBase.is_legal_password( $('#new_account_password').val() )){
    Sharer.showWarning($('#in_place_registration_warning'), translate('in_place_reg_warning_password'));
    return false;
  }

  AppBase.post(
    '/postembed',
    {
      'xaction' : 'login_or_create',
      'email' : $('#new_account_email').val(),
      'password' : $('#new_account_password').val(),
      'name' : $('#new_account_real_name').val(),
      'pxcid' : Sharer.options.pxcid,
      'ref_override' : 'postembed__view'
    },
    function( response ){ Sharer.on_successful_login_or_create(response, options); }
  );

};

Sharer.on_successful_login_or_create = function( response, options ){
  if( response['outcome'] == 'success' && response['user']){
    bu.overlay.clear();
    AppBase.user = response['user'];
  }else{
    Sharer.showWarning(
      $('#in_place_registration_warning'),
      translate('in_place_reg_account_exists'),
      P({},A({'href':'/forgot'}, translate('in_place_reg_account_pass'))),
      false
    );
  }
};
*/

Sharer.thank_and_close = function(){
  bu.popup(H1({'style':'text-align:center'},
    translate('thanks_sharing')
  ), {'autoclose':true});
};

Sharer.init_onItemSelect = function(){
  $('#selected_count').text( ""+$('#friend_selector')[0].autoselector.getSelected().length );
};

Sharer.init_autoselect_onNewEntry = function( entryText, callback ){
    if( !AppBase.is_legal_email(entryText) ){
      $("#friend_selector_info").hide();
      Sharer.showWarning( $("#friend_selector_warning"), translate('invalid_email'));
      $('#friend_selector')[0].autoselector.showAll();
    }else{
      AppBase.post(
	'/contacts',
	{
	  'xaction' : 'add_contact',
	  'contact_email' : entryText,
	  'ref_override' : 'postembed__view'

	},
	function(response){
	  var newContact = response['contact'];
	  var newEmail = newContact['pet_email'].split('@')[1];
	  callback([newContact['pet_name'], newEmail, newContact['puid']]);
	  Sharer.init_onItemSelect(); // Update selected item counter for autoselected additions
	  Sharer.update_importer_form();
	},
	function(response){
	  //failure
	}
      );
    }
  };


