var MAIN_HOST = 'http://ni.mindjolt.com';
var NI_HOST = MAIN_HOST + '/ni';

var g_owner = null;
var g_viewer = null;
var g_viewerFriends = null;
var g_ownerFriends = null;
var g_networkId = null;

// Used to delay the display of showing the page loading
var showloadingtimer = null;

function getHeight() {
  var docHeight;

  if (typeof(document.height) != 'undefined') {
    docHeight = document.height;
  } else if (document.body && typeof(document.body.scrollHeight) != 'undefined') {
    docHeight = document.body.scrollHeight;
  }

  if (!docHeight) {
    if (gadgets.views.getCurrentView().getName() == 'canvas') {
      docHeight = "2000";
    } else {
      docHeight = "300";
    }
  }

  return docHeight;
}


function showPageLoadingTimer() {
  if (showloadingtimer) {
    window.clearTimeout(showloadingtimer);
    showloadingtimer = null;
  }

  document.getElementById('loading').style.display = "none";
  showloadingtimer = window.setTimeout(showPageLoading, 1000);
}

// Shows the loading page and hides the contet
function showPageLoading() {
  document.getElementById('content').style.display = "none";
  document.getElementById('content').innerHTML = "";
  document.getElementById('loading').style.display = "block";
}

// Shows the given page content
function showPageContent() {
  if (showloadingtimer) {
    window.clearTimeout(showloadingtimer);
    showloadingtimer = null;
  }

  document.getElementById('loading').style.display = "none";
  document.getElementById('content').style.display = "inline";
  gadgets.window.adjustHeight();
}

function ctrAdd(div) {
  if (!div.getElementsByTagName) return false;

  var links = div.getElementsByTagName('a')

  for (var i = 0; i < links.length; i++) {
    if (links[i].getAttribute('id')) {
      Event.observe(links[i], 'mousedown', ctrRecord, false);
    }
  }
}

function ctrRecord(e) {
  if (!e)
    var e = window.event;
  var target = Event.element(e);

  var id;
  if (target.tagName == "IMG") {
    if (target.parentNode.tagName == "A") {
      id = target.parentNode.getAttribute('id');
    }
  } else {
    id = target.getAttribute('id');
  }

  var page = null;
  var pageUri = document.getElementById('request_uri');

  if (pageUri) {
    page = pageUri.value;
  }

  (new Image()).src=MAIN_HOST + '/servlet/CTR?link=' + id + '&page=' + page;
  return false;
}

// appends data to a url
function appendToUrl(url, data) {

    if (url.indexOf("?") == -1) {
      finalUrl = url + "?" + gadgets.io.encodeValues(data);
    } else {
      finalUrl = url + "&" + gadgets.io.encodeValues(data);
    }

  return finalUrl;
}

// navigates to a url
function navigateTo(url) {
  var surface = gadgets.views.getCurrentView();

  // Full navigation, for use when requestNavigateTo works 100%.
  if (surface.getName() == 'canvas') {
    displayPage(url, {});
  } else {
    var params = {}; 
    params['page'] = url; 
    gadgets.views.requestNavigateTo(new gadgets.views.View('canvas'), params);   
  }
}

function display() {
  var surface = gadgets.views.getCurrentView();
  var params = gadgets.views.getParams();
  var urlToDisplay = params['page'];

  if (urlToDisplay)
    displayPage(urlToDisplay, {});
  else
    displayPage("/surface/" + surface.getName() + ".jsp", {});
}

function populateWithOwnerAndViewerData(data, owner, viewer, ownerFriends, viewerFriends) {
  if (gadgets.views.getCurrentView().getName() != 'canvas') {
    var ownerId = owner.getField(opensocial.Person.Field.ID);
    data['opensocial_owner_id']  = ownerId;

    var viewerId = viewer.getField(opensocial.Person.Field.ID);
    data['opensocial_viewer_id']  = viewerId;
  }

  if (viewer) {
    var viewerId = viewer.getField(opensocial.Person.Field.ID);
    data['osvid']  = viewerId;
    data['is_app_user'] = '1';

    var fullName = viewer.getDisplayName();
    if (fullName)
      data['full_name'] = fullName;
    else
      data['full_name'] = '';
  }

  if (viewerFriends) {
    var friendIds = '';

    viewerFriends.each(function(person) {
      if (friendIds == '') {
        friendIds += person.getField(opensocial.Person.Field.ID);
      } else {
        friendIds += ',' + person.getField(opensocial.Person.Field.ID);
      }
    });

    data['friend_ids'] = friendIds;
  }
}

// displays the page at the url
function displayPage(url, params) {
  showPageLoadingTimer();

  var data = {};
  var prefs = new gadgets.Prefs();

  if (prefs.getCountry()) {
    data['country'] = prefs.getCountry();
  }
  if (prefs.getLang()) {
    data['lang'] = prefs.getLang();
  }

  data["network"] = gadgets.util.getUrlParameters().domain;
  data["networkApp"] = networkApp;

  params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.TEXT;

  if (gadgets.views.getCurrentView().getName() == 'canvas') {
    params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.SIGNED;
  }

  if (!g_viewer && !g_owner && !g_viewerFriends && !g_ownerFriends) {
    ning.app.getInfo(function(infoResponse) {
      if (!infoResponse.hadError()) {
        g_networkId = infoResponse.getField(ning.app.Field.SUB_DOMAIN);
      }

      var req = opensocial.newDataRequest();
      var reqParams = {};

      reqParams['max'] = 500;

      req.add(req.newFetchPersonRequest(opensocial.DataRequest.PersonId.OWNER), 'owner');
      req.add(req.newFetchPersonRequest(opensocial.DataRequest.PersonId.VIEWER), 'viewer');
      req.add(req.newFetchPeopleRequest('VIEWER_FRIENDS', reqParams), 'viewerFriends');
      req.add(req.newFetchPeopleRequest('OWNER_FRIENDS', reqParams), 'ownerFriends');

      req.send(function (dataResponse) {
        g_owner = dataResponse.get('owner').getData();
        g_viewer = dataResponse.get('viewer').getData();
        g_viewerFriends = dataResponse.get('viewerFriends').getData();
        g_ownerFriends = dataResponse.get('ownerFriends').getData();

        populateWithOwnerAndViewerData(data, g_owner, g_viewer, g_ownerFriends, g_viewerFriends);
        runMakeRequest(url, params, data);
      });
    });
  } else {
    populateWithOwnerAndViewerData(data, g_owner, g_viewer, g_ownerFriends, g_viewerFriends);
    runMakeRequest(url, params, data);
  }
}

// runs the request for displaying the page at the url
function runMakeRequest(url, params, data) {
  if (g_networkId != null)
    data["networkId"] = g_networkId;

  params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.POST; 
  params[gadgets.io.RequestParameters.POST_DATA] = gadgets.io.encodeValues(data);

  gadgets.io.makeRequest(NI_HOST + url, function (response) {
    if (!response || !response.data) { 
      document.getElementById('content').innerHTML = "<center><br /><br /><h1>There was a problem processing your request.  MindJolt Games and Ning are working to fix any problems you are seeing.</h1><h1>Please refresh to try again.</h1></center>";
      showPageContent();
      return; 
    } 
    document.getElementById('content').innerHTML = response.data;

    var redirElement = document.getElementById('redirect');

    if (redirElement) {
      if (redirElement.href) {
        window.parent.location = redirElement.href;
      } else {
        displayPage(redirElement.value, {});
      }
    } else {
      showPageContent();

      var surface = gadgets.views.getCurrentView();

      if (surface.getName() == 'canvas') {
        ctrAdd(document.getElementById('content'));
      }

      var analytics = document.getElementById('analytics');

      if (analytics) {
        var pageTracker = _gat._getTracker(analytics.value);

        pageTracker._initData();

        var analyticsPage = document.getElementById('analyticsPage');
        if (analyticsPage) {
          pageTracker._trackPageview(analyticsPage.value);
        } else {
          pageTracker._trackPageview();
        }
      }

      var scrollToTop = document.getElementById('scrollToTopId');
      if (scrollToTop) {
        scrollToTop.focus();
        scrollToTop.blur();
      }

      var activityTitle = document.getElementById('activity_title');

      if (activityTitle) {
        var activityParams = {};

        activityParams[opensocial.Activity.Field.TITLE] = activityTitle.value;

        var activity = opensocial.newActivity(activityParams);

        opensocial.requestCreateActivity(activity, opensocial.CreateActivityPriority.HIGH);
      }
    }
  }, params );
}

var oldGameIframeHeight = 0;
var oldGameIframeWidth = 0;

function hideGameIframe() {
  var gameIframe = document.getElementById("game_iframe");

  if (gameIframe) {
    oldGameIframeHeight = gameIframe.height;
    oldGameIframeWidth = gameIframe.width;
    gameIframe.height = 0;
    gameIframe.width = 0;
  }
}

function showGameIframe() {
  var gameIframe = document.getElementById("game_iframe");

  if (gameIframe) {
    gameIframe.height = oldGameIframeHeight;
    gameIframe.width = oldGameIframeWidth;
    oldGameIframeHeight = 0;
    oldGameIframeWidth = 0;
  }
}

function sendMessage(url, messageTitle, messageBody) {
  var params = [];
  var recipient = opensocial.DataRequest.Group.OWNER_FRIENDS;
  params[opensocial.Message.Field.TITLE] = messageTitle;

  var message = opensocial.newMessage(messageBody, params);

  hideGameIframe();

  opensocial.requestSendMessage(recipient, message, function(response) {
    showGameIframe();

    var data = {};

    if (response.getData() && response.getData().recipientIds) {
      data['recipients'] = response.getData().recipientIds;
    }

    if (response.getErrorCode()) {
      if (response.getErrorCode() == "cancelled") {
        data['cancel'] = '1';
      } else {
        data['error'] = '1';
      }
    }

    var params = {};

    params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.POST; 
    params[gadgets.io.RequestParameters.POST_DATA] = gadgets.io.encodeValues(data);
    params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.SIGNED;

    gadgets.io.makeRequest(url, function (response) {}, params);
  });
}

function toggle_high_scores() {
  if (document.getElementById('friend_high_scores_table').style.display != "none") {
    document.getElementById('friend_high_scores_table').style.display = "none";
    document.getElementById('global_new_high_scores_table').style.display = "";
  } else {
    document.getElementById('global_new_high_scores_table').style.display = "none";
    document.getElementById('friend_high_scores_table').style.display = "";
  }
}

function toggle_recently_played() {
  if (document.getElementById('friends_recently_played_table').style.display != "none") {
    document.getElementById('friends_recently_played_table').style.display = "none";
    document.getElementById('your_recently_played_table').style.display = "";
  } else {
    document.getElementById('your_recently_played_table').style.display = "none";
    document.getElementById('friends_recently_played_table').style.display = "";
  }
}

