APIs

Show:
/**
 This class...
 @class StationsCollection
 @constructor
 @return {Object} instantiated StationsCollection
 **/
define(['jquery', 'backbone', 'StationModel', 'simplestorage'], function ($, Backbone, StationModel, simpleStorage) {

    /**
     Custom event fired when station name changed
     @event STATION_NAME_CHANGED
     @param {This} caller
     @param {Self} context caller
     @param {Event} rss link
     @static
     @final
     **/
    BB.EVENTS.STATION_NAME_CHANGED = 'STATION_NAME_CHANGED';

    var StationsCollection = Backbone.Collection.extend({

        model: StationModel,

        /**
         Constructor
         @method initialize
         **/
        initialize: function () {
            var self = this;

            self.m_simpleStorage = simpleStorage;
            // self.m_blankNameStations = {};
            self.m_pollTimer = self.m_simpleStorage.get('pollStationsTime');
            if (_.isUndefined(self.m_pollTimer)) {
                self.m_pollTimer = 120;
                self.m_simpleStorage.set('pollStationsTime', self.m_pollTimer);
            }
            self.m_refreshHandle = undefined;
            self.resumeGetRemoteStations();
            // _.bind(self._onStationPollTimeChanged,self);
            // _.bindAll(self,'_onStationPollTimeChanged','_populateCollection');
            BB.comBroker.listen(BB.EVENTS['STATIONS_POLL_TIME_CHANGED'], $.proxy(self._onStationPollTimeChanged, self));
            BB.comBroker.listen(BB.EVENTS['STATIONS_POLL_TIME_CHANGED'], self._onStationPollTimeChanged);
        },

        /**
         Set how often to poll remote mediaSERVER for station updates, set by global settings component
         @method _onStationPollTimeChanged
         @param {Event} e
         **/
        _onStationPollTimeChanged: function (e) {
            var self = this;
            self.m_pollTimer = e.edata;
        },

        /**
         Create the stations collection with data received from remote mediaSERVER, create corresponding Backbone.models
         @method _populateCollection
         @param {Object} i_xmlStations
         **/
        _populateCollection: function (i_xmlStations) {
            var self = this;
            var addedNewStations = false;
            $(i_xmlStations).find('Station').each(function (key, value) {
                var stationID = $(value).attr('id');
                var stationData = {
                    stationID: stationID,
                    stationName: $(value).attr('name'),
                    watchDogConnection: $(value).attr('watchDogConnection') == 1 ? 'on' : 'off',
                    status: $(value).attr('status'),
                    startTime: $(value).attr('startTime'),
                    runningTime: $(value).attr('runningTime'),
                    caching: $(value).attr('caching'),
                    totalMemory: $(value).attr('totalMemory'),
                    peakMemory: $(value).attr('peakMemory'),
                    appVersion: $(value).attr('appVersion'),
                    airVersion: $(value).attr('airVersion'),
                    stationOS: $(value).attr('os'),
                    socket: $(value).attr('socket'),
                    connection: $(value).attr('connection'),
                    connectionStatusChanged: false,
                    lastUpdate: $(value).attr('lastUpdate'),
                    stationColor: self._getStationIconColor($(value).attr('connection'))
                };

                if (_.isEmpty(stationData.stationName))
                    self._getUpdatedStationName(stationData.stationID);

                var stationModel = self.findWhere({'stationID': stationID});
                if (_.isUndefined(stationModel)) {
                    // new station added
                    stationModel = new StationModel(stationData);
                    self.add(stationModel);
                    addedNewStations = true;
                } else {
                    // update existing station
                    if (stationModel.get('connection') != stationData.connection)
                        stationData.connectionStatusChanged = true;
                    stationModel.set(stationData);
                }
            });
            if (addedNewStations)
                pepper.sync(function () {
                });
        },

        /**
         Name is empty, so we pepper.sync to get updated station name
         @method setPlayerData
         @param {Number} i_playerData
         @return {Number} Unique clientId.
         **/
        _getUpdatedStationName: function (i_stationID) {
            var self = this;
            pepper.getStationNameAsync(i_stationID, function (i_stationName) {
                BB.comBroker.fire(BB.EVENTS.STATION_NAME_CHANGED, this, self,
                    {
                        stationID: i_stationID,
                        stationName: i_stationName
                    });
            });
        },

        /**
         Return a color string corresponding to the color code received from remote mediaSERVER
         @method _getStationIconColor
         @param {Number} i_connection
         **/
        _getStationIconColor: function (i_connection) {
            switch (i_connection) {
                case '2':
                {
                    return 'yellow';
                    break;
                }
                case '1':
                {
                    return 'green';
                    break;
                }
                default:
                {
                    return 'red';
                    break;
                }
            }
        },

        /**
         Pause retrieval of remote mediaSERVER station list and stats
         @method pauseGetRemoteStations
         **/
        pauseGetRemoteStations: function () {
            var self = this;
            clearInterval(self.m_refreshHandle);
        },

        /**
         Resume retrieval of remote mediaSERVER station list and stats
         @method resumeGetRemoteStations
         **/
        resumeGetRemoteStations: function () {
            var self = this;
            self.getRemoteStations();
            self.m_pollTimer = parseInt(self.m_pollTimer);
            log('polling on ' + self.m_pollTimer);
            if (_.isNaN(self.m_pollTimer) || _.isUndefined(self.m_pollTimer))
                self.m_pollTimer = 120;
            self.m_refreshHandle = setInterval(function () {
                self.getRemoteStations();
                log('getting station ' + Date.now() + ' ' + self.m_pollTimer);
            }, self.m_pollTimer * 1000);
        },

        /**
         Retrieve remote station list and status from remote mediaSERVER
         @method getRemoteStations
         **/
        getRemoteStations: function () {
            var self = this;
            var userData = pepper.getUserData();
            var url = window.g_protocol + userData.domain + '/WebService/getStatus.ashx?user=' + userData.userName + '&password=' + userData.userPass + '&callback=?';
            log(url);
            $.getJSON(url, function (data) {
                    var s64 = data['ret'];
                    var str = $.base64.decode(s64);
                    var xml = $.parseXML(str);
                    self._populateCollection(xml);
                }
            );
        }
    });

    return StationsCollection;

});