/*
 * Proposed usage:
 *
 * var _ibe_ue = new IbeUserEvents(123, 123, 123, 123, 123);
 *
 * <a href="/" onclick="_ibe_ue.r(1,2,3);">click here!</a>
 *
 * <a href="/" onmouseover="_ibe_ue.r(3,2,3);"> look at this ! </a>
 *
 */

var IBE_USER_EVENT_TRACKER_PATH_PREFIX = '/ibe-user-event';

/**
 * Sole Constructor
 *
 * @param sessionId The session Id
 * @param requestId The request ID
 * @param domainId domain Id
 * @param resourceId resourceId of current resource
 * @param pageServerRenderTimeMillis the server-time
 */
var IbeUserEvents = function (sessionId, requestId, domainId, resourceId, pageServerRenderTimeMillis) {
  this.sessionId = sessionId;
  this.requestId = requestId;
  this.domainId = domainId;
  this.resourceId = resourceId;
  this.pageServerRenderTimeMillis = pageServerRenderTimeMillis;
  this.sentTrackingEvents = new Array();
  this.pageUQ = sessionId + ':' +
                requestId + ':' +
                domainId + ':' +
                resourceId + ':' +
                pageServerRenderTimeMillis;

  /**
   * Register the unique event.
   *
   * @param contextId event context
   * @param entityId entity of the Object
   * @param objectId the unique Object Id
   *
   * @param componentDefinitionId. Optional.
   *
   * @return true if the event was sent to the server.
   */
  this.r = function(contextId, entityId, objectId) {

    var compDefId = -999;
    if (arguments.length > 3) {
      compDefId = arguments[3];
    }

    // The order of this data must correspond to the order in UiUserEvent class.
    var uniquePageEvent = this.pageUQ + ':' +
                          contextId + ':' +
                          entityId + ':' +
                          objectId + ':' +
                          compDefId;

    //
    // We do NOT want to add the same within-page-event more than once.
    //
    var shouldTellServer = this._shouldTriggerEvent(uniquePageEvent);
    if (shouldTellServer) {
      // Trigger event.
      var eventUrl = IBE_USER_EVENT_TRACKER_PATH_PREFIX + '?event=' + uniquePageEvent;
      try {
        var image = new Image();
        image.src = eventUrl;
      } catch (e) {}
    }
    return shouldTellServer;
  }

  /**
   * If We do NOT want to trigger the same event more than once, this method ensures this.
   *
   * @param uniquePageEvent the first part of the event to trigger, excluding trigger-time.
   *
   * @return true if we should trigger the event.
   */
  this._shouldTriggerEvent = function(uniquePageEvent) {
    var exist = 0;
    var c = this.sentTrackingEvents;
    for (var i = 0; i < c.length; i++) {
      if (c[i] == uniquePageEvent) {
        exist = 1;
        break;
      }
    }
    if (exist == 0) {
      this.sentTrackingEvents[this.sentTrackingEvents.length] = uniquePageEvent;
    }
    return exist == 0;
  }

  /**
   * @return string info about page's events.
   */
  this.eventInfo = function() {
    var b = '';

    b += 'sessionId  = ' + this.sessionId + '\n';
    b += 'requestId  = ' + this.requestId + '\n';
    b += 'domainId   = ' + this.domainId + '\n';
    b += 'resourceId = ' + this.resourceId + '\n';
    b += 'pageTime   = ' + this.pageServerRenderTimeMillis + '\n';
    var c = this.sentTrackingEvents;
    b += 'PageEvents = ' + c.length + '\n';
    for (var i = 0; i < c.length; i++) {
      b += '  ' + (i + 1) + ' ' + c[i].replace(this.pageUQ + ':', '') + '\n';
    }

    return b;
  }
}
