
(function ($) {

Drupal.Nodejs = Drupal.Nodejs || {'presenceCallbacks': {}, 'callbacks': {}, 'socket': false, 'connectionSetupHandlers': {}};

Drupal.behaviors.nodejs = {
  attach: function (context, settings) {
    if (!Drupal.Nodejs.socket) {
      if (Drupal.Nodejs.connect()) {
        Drupal.Nodejs.sendAuthMessage();
      }
    }
  }
};

Drupal.Nodejs.runCallbacks = function (message) {
  // It's possible that this message originated from an ajax request from the
  // client associated with this socket.
  if (message.clientSocketId == Drupal.Nodejs.socket.socket.sessionid) {
    return;
  }

  if (message.callback && $.isFunction(Drupal.Nodejs.callbacks[message.callback].callback)) {
    try {
      Drupal.Nodejs.callbacks[message.callback].callback(message);
    }
    catch (exception) {}
  }
  else if (message.presenceNotification != undefined) {
    $.each(Drupal.Nodejs.presenceCallbacks, function () {
      if ($.isFunction(this.callback)) {
        try {
          this.callback(message);
        }
        catch (exception) {}
      }
    });
  }
  else {
    $.each(Drupal.Nodejs.callbacks, function () {
      if ($.isFunction(this.callback)) {
        try {
          this.callback(message);
        }
        catch (exception) {}
      }
    });
  }
};

Drupal.Nodejs.runSetupHandlers = function (type) {
  $.each(Drupal.Nodejs.connectionSetupHandlers, function () {
    if ($.isFunction(this[type])) {
      try {
        this[type]();
      }
      catch (exception) {}
    }
  });
};

Drupal.Nodejs.connect = function () {
  var scheme = Drupal.settings.nodejs.secure ? 'https' : 'http',
      url = scheme + '://' + Drupal.settings.nodejs.host + ':' + Drupal.settings.nodejs.port;
  Drupal.settings.nodejs.connectTimeout = Drupal.settings.nodejs.connectTimeout || 5000;
  if (typeof io === 'undefined') {
     return false;
  }
  Drupal.Nodejs.socket = io.connect(url, {'connect timeout': Drupal.settings.nodejs.connectTimeout});
  Drupal.Nodejs.socket.on('connect', function() {
    Drupal.Nodejs.sendAuthMessage();
    Drupal.Nodejs.runSetupHandlers('connect');
    Drupal.Nodejs.socket.on('message', Drupal.Nodejs.runCallbacks);

    // Monkey-patch Drupal.ajax.prototype.beforeSerialize to auto-magically
    // send sessionId for AJAX requests so we can exclude the current browser
    // window from resulting notifications. We do this so that modules can hook
    // in to other modules ajax requests without having to patch them.
    Drupal.Nodejs.originalBeforeSerialize = Drupal.ajax.prototype.beforeSerialize;
    Drupal.ajax.prototype.beforeSerialize = function(element_settings, options) {
      options.data['nodejs_client_socket_id'] = Drupal.Nodejs.socket.socket.sessionid;
      return Drupal.Nodejs.originalBeforeSerialize(element_settings, options);
    };
  });
  Drupal.Nodejs.socket.on('disconnect', function() {
    Drupal.Nodejs.runSetupHandlers('disconnect');
    Drupal.ajax.prototype.beforeSerialize = Drupal.Nodejs.originalBeforeSerialize;
  });
  setTimeout("Drupal.Nodejs.checkConnection()", Drupal.settings.nodejs.connectTimeout + 250);
};

Drupal.Nodejs.checkConnection = function () {
  if (!Drupal.Nodejs.socket.socket.connected) {
    Drupal.Nodejs.runSetupHandlers('connectionFailure');
  }
};

Drupal.Nodejs.sendAuthMessage = function () {
  var authMessage = {
    authToken: Drupal.settings.nodejs.authToken,
    contentTokens: Drupal.settings.nodejs.contentTokens
  };
  Drupal.Nodejs.socket.emit('authenticate', authMessage);
};

})(jQuery);

// vi:ai:expandtab:sw=2 ts=2

;

(function ($) {

Drupal.Nodejs.callbacks.chatroomNodejsMessageHandler = {
  callback: function (message) {
    switch (message.type) {
      case 'newMessage':
        Drupal.chatroom.addMessagesToBoard([message.data]);
        break;
      case 'userSeen':
        Drupal.chatroom.updateUserList(message.data);
        break;
      case 'newCommandMessage':
        Drupal.chatroom.addCommandMessage(response.data);
        break;
    }
  }
};

})(jQuery);

;

(function ($) {

  var element_settings = {};
  element_settings.event = 'fake_event';
  element_settings.url = '';

  var element = $('');
  Drupal.nodejs_ajax = new Drupal.ajax('nodejs_ajax', element, element_settings);

  Drupal.Nodejs.callbacks.nodejsNodeAjaxBroadcast = {
    callback: function (message) {
      switch (message.channel) {
        case 'nodejs_ajax_broadcast':
          Drupal.nodejs_ajax.runCommands(message);
          break;
      }
    }
  };

  Drupal.Nodejs.callbacks.nodejsNodeAjax = {
    callback: function (message) {
      Drupal.nodejs_ajax.runCommands(message);
    }
  };

  Drupal.nodejs_ajax.runCommands = function(message) {
    var response = message.commands;
    for (var i in response) {
      if (response[i]['command'] && Drupal.nodejs_ajax.commands[response[i]['command']]) {
        Drupal.nodejs_ajax.commands[response[i]['command']](Drupal.nodejs_ajax, response[i], 200);
      }
    }
  }

})(jQuery);

;

(function ($) {

Drupal.Nodejs.callbacks.nodejsNotify = {  
  callback: function (message) {
    var notifyTime = Drupal.settings.nodejs_notify.notification_time;
    if (notifyTime > 0) {
      $.jGrowl(message.data.body, {header: message.data.subject, life:(notifyTime * 1000)});
    }
    else {
      $.jGrowl(message.data.body, {header: message.data.subject, sticky:true});
    }
  }
};

})(jQuery);

// vi:ai:expandtab:sw=2 ts=2

;

