/*
 *  Copyright (c) 2008 Snapvine, LLC. All rights reserved.
 *
 * THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF Snapvine, LLC
 *    The copyright notice above does not evidence any
 *    actual or intended publication of such source code.
 */
if (typeof(snapvine) == "undefined") snapvine = function() {};
if (typeof(snapvine.addressbook)  == "undefined") snapvine.addressbook = function() {};


var gSV_USERS = new Array();
var gNON_SV_USERS = new Array();
var gAB_USAGE = new String();

var ad_book_last_hidden_id;

function safe_ab_track(state)
{
  safeUrchinTracker("/addressbook/addressbook_show_" + gAB_USAGE + "_state_" + state);
}

function ab_popup(cb_js, cb_urn, usage)
{
  url = "/addressbook/popup_lookup";
  url += "?cb_js_r=" + cb_js + "&cb_urn=" + cb_urn + "&u=" + usage;

  ab_popup_url(url);
}

function ab_popup_url(url)
{
  p_width = 800;
  p_height = 650;
  
  url += "&w=" + p_width;
  open_popup_window(url, p_width + 20, p_height);
}

function login_form_submit()
{
  if ($('#provider').val() != '')
  {
    start_poll();
  }
}

function hide_option(id_to_hide)
{
  // First we show the hidden option
  $('#provider_list li:hidden').animate({width: "show"});
  $('#' + ad_book_last_hidden_id).animate({width: "show"}); //Hack to fix BZ 5185.
  
  // Then hide the one that just got clicked
  $('#' + id_to_hide).animate({width: "hide"});
  ad_book_last_hidden_id = id_to_hide;
}

function change_form(chosen_id)
{
  var provider = chosen_id.toLowerCase();

  // Set the hidden field to the chosen provider
  $('#provider').val(chosen_id);
  
  // Change the image
  $('.highlight img').attr({src: '/images/addressbook/providers/large/' + provider + '.png'});
  
  // Change the label
  $('.highlight label').html(chosen_id + ' Password:');

  $('.highlight SELECT').hide();
  
  // Change the domain. If we have a hotmail account, the domain could be
  // hotmail.com, msn.com, live.com, etc., so we'll just make the input box
  // larger and hide the domain
  if (provider != 'hotmail' && provider != 'gmail')
  {
    var current_prefix = $('#prefix').val();
    var at_location = current_prefix.indexOf('@');
    if (at_location != -1)
    {
      // We have a "@" symbol, so we'll delete the symbol and everything after it
      $('#prefix').val(current_prefix.substr(0, at_location));
    }
    $('#prefix').removeClass('prefix_small');
    $('#domain').html('@' + provider + '.com');
    $('#domain').show();
  }
  else
  {
    $('#selected_domain_' + provider).show();
    $('#domain').html('');
    $('#domain').hide();
    $('#prefix').addClass('prefix_small');
  }
  
  $('.highlight:hidden').slideDown();
  
  $('#emails_only_link_area:hidden').slideDown();
  //$('#emails_only:visible').slideUp();
}

function toggle_email_entry_form()
{
  $('.highlight').slideUp();
  hide_option(''); // Call hide_option with a blank id parameter so it will show all email images, but hide none
  
  $('#emails_only_link_area').slideUp();
  $('#emails_only').slideDown();
  
  $('#provider').val('');
}

function check_inputs(email, password)
{
  if (email == '')
  {
    alert('You must provide your email address.');
    return false;
  }
  
  if (password == '')
  {
    alert('You must provide your password.');
    return false;
  }
}

function start_poll()
{
  
  var email_entered = $('#prefix').val().replace(/^\s+|\s+$/g, '');
  var email = email_entered + $('#domain').html();
  
  var dropdown_domain_value = $('.highlight SELECT:visible').val();
  if (dropdown_domain_value != null)
  {
    email += dropdown_domain_value;
  }
  var password = $('#password').val().replace(/^\s+|\s+$/g, '');
  
  var provider = $('#provider').val();
  
  if (check_inputs(email_entered, password) == false)
  {
    return false;
  }

  safe_ab_track("lookup_provider_" + $('#provider').val());
  
  $('#main-login').hide();
  $('#skip_link:visible').hide();
  $('#main-progress').show();
  
  almostDoneTimer = window.setTimeout("$('#almost_done').fadeIn(180)", 5000);
  
  $.ajax({
    type: 'POST',
    url: '/addressbook/start_lookup',
    data: 'provider=' + provider + '&login=' + escape(email) + '&password=' + escape(password),
    dataType: 'json',
    error: function()
    {
      poll_error('Snapvine appears to be having difficulty, please try again later.');
    },
    success: function(json)
    {
      handle_lookup(json);
    }
  });
}

function poll_error(msg)
{
  // Clear the "almost done" box timeout
  window.clearTimeout(almostDoneTimer);
  
  $('#error_area').html('<div class="error_content">' + msg + '</div>');
  $('#error_area:hidden').show();
  
  $('#main-login').show();
  $('#skip_link:hidden').show();
  $('#main-progress').hide();
  $('#almost_done').hide();
}

/*
 * This function is called by the addressbook/no_results partial when no results are found
 */
function reset_form()
{
  $('#main-login').show();
  $('#no-results').hide();
  $('#almost_done').hide();
}

function handle_lookup(json)
{
  if (typeof json.poll_token == 'undefined')
  {
    // We'll get here if the controller doesn't return a poll_token (will return
    // a status and text message instead)
    poll_error('addressbook lookup failed')
    return false;
  }
  var s_token = json.poll_token;
  var s_klass = json.klass;

  var poll_urn = '/poll/job_status?token=' + json.poll_token + '&klass=' + json.klass + '&status_only=1';
  
  do_poll(poll_urn, {get_progress_info:true}, 0.5, 30,
          function(success,json){
            if (json == null) {
              poll_error('Your lookup timed out. Please try again.');
              safe_ab_track("lookup_provider_timeout");
              jQuery.getJSON('/addressbook/lookup_timeout?token='+s_token+'&klass='+s_klass, function(json) {});
            } else if (json.process_status == 0) {
              contacts_loaded({token:s_token, klass:s_klass});
            } else if (json.process_status == 7) {
              poll_error('Incorrect email address or password.');
            } else if (json.process_status != 1 && json.process_status != 11) {
              poll_error('Failed loading your contacts. (code ' + json.process_status + ')');
            }
          }
  );
}

function render_results(results_urn)
{
  gSV_USERS = new Array();
  gNON_SV_USERS = new Array();

  // Attach ab params
  var state_json = ab_state();
  results_urn += '&' + Object.toQueryString(state_json);

  var opts = {asynchronous:true, evalScripts:true };
  opts.onComplete = function(response, param) {
    $('#main-progress').hide();
    $('#main-results').show();
  };
  
  new Ajax.Updater('main-results', results_urn, opts);  
}


function contacts_loaded(results)
{
  lookup_data = {token: null, klass: null, list: null};
  Object.extend(lookup_data, results || {});

  if (results.token != null)
  {
    var r_urn = '/addressbook/results?token='+results.token+'&klass='+results.klass;
    render_results(r_urn);
  }
}


function selected_svusers()
{
  user_info = new Array();
  $('#sv-results input:checkbox').each(function(offset)
    {
      if (this.checked)
        user_info.push(gSV_USERS[offset]);
    }
  );
  return user_info;
}


function selected_nonsvusers()
{
  user_info = new Array();
  $('#nonsv-results input:checkbox').each(function(offset)
    {
      if (this.checked)
        user_info.push(gNON_SV_USERS[offset]);
    }
  );
  return user_info;
}


function typed_emails_submit()
{
  safe_ab_track("lookup_manually");

  var email_list = new Array();
  $('#email-only-form input:text').each(function()
    {
      if (this.value.length > 0)
        email_list.push(this.value);
    }
  );
  if (email_list.length == 0)
  {
    alert("Enter your friends' emails");
    return;
  }

  $('#main-login').hide();
  $('#skip_link:visible').hide();
  $('#main-progress').show();
    
  var e_list = encodeURIComponent(email_list.toString());
  var r_urn = '/addressbook/results_ajax?list=' + e_list;

  render_results(r_urn);
}

function set_all_checkboxes(which_list, check_value)
{
  if (check_value)  {
    safe_ab_track("select_all_checked");
  } else {
    safe_ab_track("select_all_unchecked");
  }
    
  $('#'+which_list+' input:checkbox:enabled').each(function(){this.checked = check_value;});
}

function postto_urn(urn, results, callback)
{
  safe_ab_track("posting_to_users");

  // Convert to JSON...requires Prototype.js
  json_data = Object.toJSON(results);

  return jQuery.ajax({
        type: "POST",
        url: urn,
        data: 'data=' + encodeURIComponent(json_data),
        success: callback,
        error: callback,
        dataType: "json"
  });
}

$(document).ready(function()
{ 
  $('#provider_list li').click(function() { hide_option(this.id); change_form(this.id); } );
  $('#emails_only_link_area a').click(function() { toggle_email_entry_form(); return false; });

  // Dont wait for the doc to be ready to load these.See bz: 4595  
  //$('#provider_login_form').submit(function() {login_form_submit(); return false; } );
  //$('#email-only-form').submit(function() { typed_emails_submit(); return false; } );
});



/*  
 *
 */
snapvine.addressbook.PostUrn = function(urn, results, callback) {
  postto_urn(urn, results, callback);
};



/* Show the addressbook in a popup
 * 
 * @param width
 * @param height
 * @param callback_name   STRING, name of the callback: func(results)
 */
snapvine.addressbook.ShowPopup = function(width, height, callback_name) {
  var url = "/share/addressbook_popup?cb_js_r=" + callback_name;
  url += "&w=" + width;
  url += "&h=" + height;
  url += "&popup=1";
  open_popup_window(url, width + 20, height);
};
