define(['connectionManager', 'events'], function (connectionManager, events) {
    'use strict';

    var serverNotifications = {};

    function onWebSocketMessageReceived(e, msg) {

        var apiClient = this;

        if (msg.MessageType === "UserDataChanged") {

            if (msg.Data.UserId === apiClient.getCurrentUserId()) {

                for (var i = 0, length = msg.Data.UserDataList.length; i < length; i++) {
                    events.trigger(serverNotifications, 'UserDataChanged', [apiClient, msg.Data.UserDataList[i]]);
                }
            }
        }
        else {

            events.trigger(serverNotifications, msg.MessageType, [apiClient, msg.Data]);
        }
    }

    function bindEvents(apiClient) {

        events.off(apiClient, "websocketmessage", onWebSocketMessageReceived);
        events.on(apiClient, "websocketmessage", onWebSocketMessageReceived);
    }

    var current = connectionManager.currentApiClient();
    if (current) {
        bindEvents(current);
    }

    events.on(connectionManager, 'apiclientcreated', function (e, newApiClient) {

        bindEvents(newApiClient);
    });

    return serverNotifications;
});