var Tinyurl = new function() {
  this._lctrackerid = null;
  this.return_tinyurl = {url : '', url_id : ''};
  this.new_tinyurl = function(url_to_compress, source, medium, campaign, content) {
    $.ajax({
      url:  '/api/create_tiny_url',
      async: false,
      type: 'POST',
      dataType: 'json',
      data: {
        user : FeedController.myAccountID,
        url : url_to_compress,
        source : source,
        medium : medium,
        campaign : campaign,
        content : content
      },
      success: function(data, ts) {
        Tinyurl.return_tinyurl.url = data.url;
        Tinyurl.return_tinyurl.url_id = data.url_id + ""; // LOL @ JAVASCRIPT TYPING
      },
      error: function(xhr, ts, et) {
      //
    } });
    return Tinyurl.return_tinyurl;
  }

  this.track_page_view = function() {
    obj = {current_url : location.href};
    Tinyurl.send_request(obj);
  }

  this.created_account = function(i_user_id) {
    obj = {created_account : true, user_id : i_user_id};
    Tinyurl.send_request(obj);
  }

  this.played_game = function() {
    obj = {played_game : true};
    Tinyurl.send_request(obj);
  }

  this.notification_opt_in = function() {
    obj = {notification_opt_in : true};
    Tinyurl.send_request(obj);
  }

  this.facebook_attempted_connect = function() {
    obj = {facebook_attempted_connect : true};
    Tinyurl.send_request(obj);
  }

  this.facebook_established_connect = function() {
    obj = {facebook_established_connect : true};
    Tinyurl.send_request(obj);
  }

  this.facebook_constant_authorization = function() {
    obj = {facebook_constant_authorization : true};
    Tinyurl.send_request(obj);
  }

  this.facebook_stream_publish = function() {
    obj = {facebook_stream_publish : true};
    Tinyurl.send_request(obj);
  }

  this.connected_to_twitter = function() {
    obj = {connected_to_twitter : true};
    Tinyurl.send_request(obj);
  }

  this.send_request = function(i_obj) {
    if (Tinyurl._lctrackerid == null) {
      return;
    }
    i_obj.lctrackerid = Tinyurl._lctrackerid;
    $.ajax({
      url:  '/api/track_tiny_url',
      type: 'POST',
      dataType: 'json',
      data: i_obj,
      success: function(data, ts) {
      },
      error: function(xhr, ts, et) {
    } });
  }
}

// NOTE: if you call TwitterNotification.connect twice,
// only the last callback will execute.
var onTwitterConnected = function() {}

var TwitterNotification = new function() {
  this.connect = function(callback) {
    var href = '/auth/twitter/connect';
    Tinyurl.connected_to_twitter();
    window.open(href, 'twitter_oauth',
                'toolbar=0,location=1,menubar=0,directories=0,width=800,height=400');
    if (callback) {
      onTwitterConnected = callback;
    }
    else {
      onTwitterConnected = function() {};
    }
    return false;
  }
}

var FacebookNotification = new function() {
  this.ALL_PERMS = 'publish_stream,offline_access';

  this.checkExpiration = function() {
    $.ajax({
      url: '/auth/facebook/status',
      type: 'POST',
      dataType: 'json',
      data: {},
      success: function(data, ts) {
        if (data != null && !data.disconnected && (data.expired || !data.allow_publish)) {
          var perms = data.allow_publish ? null : 'publish_stream';
          FacebookNotification.loginAndPostCredentials(perms);
        }
      }
    });
  }

  this.loginAndPostCredentials = function(permissions, callback) {
    var postAuth = function() {
      $.ajax({
        url: '/auth/facebook/connect',
        type: 'POST',
        dataType: 'json',
        success: function(data, ts) {
          if (data.error != null) {
            lcToModal("error", ["display", data.error, true]);
            return;
          }
          if (callback != null) {
            callback();
          }
        }
      });
    }

    Tinyurl.facebook_attempted_connect();

    FB.ensureInit(function() {
      FB.Connect.requireSession(function () {
        Tinyurl.facebook_established_connect();
        if (permissions != null) {
          FB.Connect.showPermissionDialog(permissions, function (arg) {
            // only save credentials if we added publish_stream. we can live
            // without the permanent access.
            if (permissions.search('publish_stream') != -1) {
              Tinyurl.facebook_stream_publish();
            }
            if (permissions.search('offline_access') != -1) {
              Tinyurl.facebook_constant_authorization();
            }
            postAuth();
          });
        }
        else {
          postAuth();
        }
      });
    });
  }
}
