var twitter_username = "", twitter_password = "", twitter_oauth_token = "";
var show_avatars = true;

// users is an associative array by screen_name
var users = new Object();

// Ordered array of indexes into "users" array for display.
var usersArray = new Array();

var n_friends = 0, n_followers = 0, n_mutuals = 0, n_total = 0;

Array.prototype.map = function(callback) {
  var results = new Array();
  for (var i = 0, j = this.length; i < j; i++) {
    results.push(callback(this[i]));
  }
  return results;
};

Array.prototype.filter = function(callback) {
  var results = new Array();
  for (var i = 0, j = this.length; i < j; i++) {
    if (callback(this[i])) {
      results.push(this[i]);
    }
  }
  return results;
}

function raiseAlert(msg) {
  alert(msg);
};

function showMessage(msg, id) {
  if (id == null) {
    id = "output";
  }
  var o = document.getElementById(id);
  o.innerHTML = msg;
};

function load(method, url, data) {
  $.ajax({
    type: method,
    url: url,
    data: data,
    success: function(data) {
      $('#remote').html(data);
    }
  });
};

function whack() {
  if (twitter_oauth_token == "") {
    twitter_username = $('#username').val();
    twitter_password = $('#password').val();
  }

  show_avatars = $('#avatars').not(':checked').size() > 0;
  showMessage('<div class="status"><p>Loading ...</p><div><img src="img/loader-bar.gif" width="220" height="19" border="0" /><p style="font-size: 80%">(Yes, this could take a long time ... <b>if this takes more than 5 minutes, you should reload the page and try again.</b>)</p><p style="font-size: 80%">(Perhaps you\'d like to <a href="faq.adp" target="_blank">read the FAQ</a> while you wait?)</p></div>', 'whack');
  load("POST", "whack.adp", {
    username: twitter_username, 
    password: twitter_password,
    token: twitter_oauth_token
  });
}

function addTwitter(id, screen_name, profile_image_url, followers, is_friend, is_follower, last_updated, last_updated_stamp) {
  var obj = {
    id: id,
    screen_name: screen_name,
    profile_image_url: profile_image_url,
    followers: followers,
    is_friend: is_friend,
    is_follower: is_follower,
    last_updated: last_updated,
    last_updated_stamp: last_updated_stamp
  };
  // users.push(obj);
  users[screen_name] = obj;
  return true;
};

function filterUsers() {
  usersArray = new Array();
  n_friends = n_followers = n_mutuals = n_total = 0;
  for (var screen_name in users) {
    if (users[screen_name].is_friend && users[screen_name].is_follower) {
      n_mutuals++;
    } else if (users[screen_name].is_friend) {
      n_friends++;
    } else if (users[screen_name].is_follower) {
      n_followers++;
    }
    n_total++;
    usersArray.push(screen_name);
  }

  var e = document.getElementById("filter-by");
  switch (e.options[e.selectedIndex].value) {
  case "all":
    // Do nothing, we extracted everything in the first step.
    break;
  case "only_following":
    usersArray = usersArray.filter(function (obj) {
      return (users[obj].is_friend && !users[obj].is_follower);
    });
    break;
  case "only_followers":
    usersArray = usersArray.filter(function (obj) {
      return (!users[obj].is_friend && users[obj].is_follower);
    });
    break;
  case "all_following":
    usersArray = usersArray.filter(function (obj) {
      return users[obj].is_friend;
    });
    break;
  case "all_followers":
    usersArray = usersArray.filter(function (obj) {
      return users[obj].is_follower;
    });
    break;
  case "mutual":
    usersArray = usersArray.filter(function (obj) {
      return (users[obj].is_friend && users[obj].is_follower);
    });
    break;
  }
}

function sorter(a, b) {
  var e = document.getElementById("sort-by");
  switch (e.options[e.selectedIndex].value) {
  case "last_updated":
    if (users[a].last_updated_stamp < users[b].last_updated_stamp) {
      return 1;
    } else if (users[a].last_updated_stamp > users[b].last_updated_stamp) {
      return -1;
    } else {
      return 0;
    }
    break;
  case "ascending":
    if (a == b) {
      return 0;
    }
    var aLower = a.toLowerCase();
    var bLower = b.toLowerCase();
    if (aLower < bLower) {
      return -1;
    } else if (aLower > bLower) {
      return 1;
    }
    break;
  case "descending":
    if (a == b) {
      return 0;
    }
    var aLower = a.toLowerCase();
    var bLower = b.toLowerCase();
    if (aLower < bLower) {
      return 1;
    } else if (aLower > bLower) {
      return -1;
    }
    break;
  case "followers":
    if (users[a].followers < users[b].followers) {
      return 1;
    } else if (users[a].followers > users[b].followers) {
      return -1;
    } else {
      return 0;
    }
    break;
  }
}

function sortUsers() {
  usersArray.sort(sorter);
}

function render() {
  filterUsers();
  sortUsers();

  var o = document.getElementById("output");
  var h = "\n";

/*
  h += "<div class=\"bugs-warning\"><p>Please note: There are currently outstanding Twitter API bugs that prevent the correct operation of Tweeter Karma.  For more information, see:</p>\n<ul>\n";
  h += "<li><a href=\"http://code.google.com/p/twitter-api/issues/detail?id=55\" target=\"_blank\">Issue #55</a>: Friends/followers API methods do not always include last tweet</li>\n";
  h += "</ul>\n</div>\n";
*/

  h += "<ul class=\"twitter-users\">\n";
  for (var i = 0; i < usersArray.length; i++) {
    var screen_name = usersArray[i];
    var user = users[screen_name];
    h += "<li>";
    if (show_avatars) {
      h += "<a href=\"http://twitter.com/" + user.screen_name + "\" class=\"avatar\" target=\"_blank\"><img src=\"" + user.profile_image_url + "\" width=\"48\" height=\"48\"/></a>";
    }
    h += "<input type=\"checkbox\" name=\"user-" + i + "\" value=\"" + user.screen_name + "\"/>";
    h += "<a href=\"http://twitter.com/" + user.screen_name + "\" class=\"screen-name\" target=\"_blank\">" + user.screen_name + "</a>";
    if (user.is_friend) {
      h += "<div class=\"is-friend\">you follow them</div>";
    }
    if (user.is_follower) {
      h += "<div class=\"is-follower\">they follow you</div>";
    }
    h += "<div class=\"last-updated\">Last updated: " + user.last_updated + "</div>";
    if (user.is_friend) {
      h += "<div class=\"action\"><a href=\"javascript:void(0);\" onclick=\"action(this, 'unfollow', '" + user.screen_name + "'); return false;\">unfollow</a></div>";
    } else {
      h += "<div class=\"action\"><a href=\"javascript:void(0);\" onclick=\"action(this, 'follow', '" + user.screen_name + "'); return false;\">follow</a></div>";
    }
    h += "</li>\n";
  }
  h += "</ul>\n";

  var s = document.getElementById("stats");
  s.innerHTML = "<p>Showing <b>" + usersArray.length + "</b> out of <b>" + n_total + "</b></p>";
  s.innerHTML += "<p style=\"font-size: 0.9em;\">[ <b>" + n_friends + "</b> only following, <b>" + n_mutuals + "</b> mutual friends, <b>" + n_followers + "</b> only followers ]</p>";

  document.getElementById("whack").style.display = "none";
  document.getElementById("control").style.display = "block";
  document.getElementById("stats").style.display = "block";
  document.getElementById("results-ads-top").style.display = "block";
  document.getElementById("results-ads-bottom").style.display = "block";
  document.getElementById("bulk").style.display = "block";
  o.innerHTML = h;

  return true;
};

function checkAll() {
  var list = document.getElementsByTagName("input");
  for (var i = 0; i < list.length; i++) {
    var e = list[i];
    if (e.type != "checkbox") {
      continue;
    }
    e.checked = true;
  }
}

function uncheckAll() {
  var list = document.getElementsByTagName("input");
  for (var i = 0; i < list.length; i++) {
    var e = list[i];
    if (e.type != "checkbox") {
      continue;
    }
    e.checked = false;
  }
}

function action(self, op, screen_name) {
  var parent = $(self).parent();
  $(parent).html(op + 'ing ...');

  $.get("action.adp", {
    username: twitter_username, 
    password: twitter_password,
    token: twitter_oauth_token,
    op: op,
    n: screen_name
  }, function(data) {
    $(parent).html(op + 'ed');
  });
}

function bulk(op) {
  var list = document.getElementsByTagName("input");
  var url = "bulk.adp";
  var items = [];
  for (var i = 0; i < list.length; i++) {
    var e = list[i];
    if (e.type != "checkbox") {
      continue;
    }
    if (e.checked) {
      items.push(e.value);
      e.checked = false;
    }
  }
  load("POST", url, {
    username: twitter_username, 
    password: twitter_password,
    token: twitter_oauth_token,
    op : op,
    n : items
  });
  alert('Your bulk operation has been submitted.  Any successful changes will be reflected in future visits as Twitter\'s data updates.');
}

$(function() {
  if ($.browser.msie) {
    $('#msie-warning').show();
  }

  var href = window.location.href;
  var referrer = document.referrer;
  if ((!referrer || referrer.match(/dossy.org/)) && href.indexOf("oauth_token") != -1) {
    var start = href.indexOf("oauth_token=");
    var end = href.indexOf("&", start);
    if (end == -1) {
      twitter_oauth_token = href.substr(start + 12);
    } else {
      twitter_oauth_token = href.substr(start + 12, end - start - 12);
    }

    $("#oauth-login").html('<b>Successfully logged in using OAuth</b>').show();
  }
});

