Source: js/defaults.js

/** @namespace Defaults
    @desc      Collection of methods for retrieving default options.
    @todo      Document defaults objects?
*/
var Defaults =
{
    /** @method   Defaults.Get
        @readonly
        @desc     Retrieves default value for a specific category and key.
        
        @arg      {String} category - Category of option.
        @arg      {String} key      - Key of option.
        @returns  {Mixed}             Default value of option requested.
    */
    'Get': function (category, key)
    {
        var categoryObject = this[category];
        
        if (!categoryObject) { return null; }
        
        return key ? categoryObject[key] : categoryObject;
    },
    
    /** @method   Defaults.GetCategoryOptions
        @readonly
        @desc     Retrieves default value for a specific category and key.
        
        @arg      {String} category - Category of option.
        @arg      {String} key      - Key of option.
        @returns  {Mixed}             Default value of option requested.
    */
    'GetCategoryOptions': function (category)
    {
        return this[category];
    },
    
    /** @method   Defaults.Extend
        @readonly
        @desc     Retrieve defaults for specific category and overwrite properties with those supplied.
        
        @arg      {String} category - Category of options.
        @arg      {Object} overlay  - Properties to overwrite defaults.
        @returns  {Object}            Extended defaults.
    */
    'Extend': function (category, overlay)
    {
        var defaults        = this[category],
            combinedObject  = {};
        
        // copy defaults
        
        if (defaults)
        {
            for (var key in defaults) { if (defaults.hasOwnProperty(key))
            {
                combinedObject[key]                         = defaults[key];
                combinedObject['{0}_isDefault'.format(key)] = true;
            }}
        }
        
        // copy overlay
        
        if (overlay)
        {
            for (var key in overlay) { if (overlay.hasOwnProperty(key))
            {
                combinedObject[key]                         = overlay[key];
                combinedObject['{0}_isDefault'.format(key)] = false;
            }}
        }
        
        return combinedObject;
    },
    
    '_global':
    {
        'privacyMode'                 : false,
        //'hideAvatar'                  : true, // This was duplicated in Contacts category
        
        'call-notice-duration'        : '30',
        'call-notice-sound'           : 'bottle',
        'chat-notice-duration'        : '30',
        'chat-notice-sound'           : 'bottle',
        'video-notice-duration'       : '30',
        'video-notice-sound'          : 'bottle',
        'voicemail-notice-duration'   : '30',
        'voicemail-notice-sound'      : 'bottle',
        'meetup-notice-duration'      :	'30',
        'meetup-notice-sound'         : 'bottle',
        'faxdelivered-notice-duration': '30',
        'faxdelivered-notice-sound'   : 'bottle',
        'fax-notice-duration'         : '30',
        'fax-notice-sound'            : 'bottle',
        
        'autostartFramework'          : false,
        'startMinimized'              : false,
        'startupStarlet'              : 'StarScope 2',
        'hideCallAlerts'              : false
    },
    
    'Activity':
    {
        'inbound'  : true,
        'outbound' : true,
        'voicemail': true,
        'fax'      : true,
        'chat'     : true,
        'video'    : true,
        'count'    : 99
    },
    
    'ChatWindow':
    {
        'color-in'          : '#F1F1F1',
        'color-out'         : '#E0F1D8',
        'font-size'         : '14',
        'incomingMsgDisplay': 'name'
    },
    
    'StarChat':
    {
        'display': 'full'
    },
    
    'FaxList':
    {
        'display-limit': 99
    },
    
    'Dialpad':
    {
        'collapsedDialpad': false
    },
    
    'LocationGroupList':
    {
        'collapsedDialpad'               : false, // TODO - Add handling of Dialpad category in index.js for SS2 Settings....
        'advancedOptions'                : false,
        'showUnregisteredExt'            : false,
        'activeCallDragDropBlindTransfer': false,
        'autoClearFilter'                : false,
        'expandDefaultExt'               : false,
        'display'                        : 'compact',
        'sortBy'                         : 'callerid'
    },
    
    'StarFax': {},
    
    'Downloads': 
    {
        'concurrentLimit': 6
    },
    
    'Contacts':
    {
        'hideAvatar'          : true,
        'onPhoneAvailability' : false, // put in Contacts since that is the widget that uses the setting
        'autoUnavailTriggered': false
    }
};



/** @namespace Options
    @desc      Collection of methods for dealing with options.
*/
var Options =
{
    /** @method   Options.Get
        @readonly
        @desc     Retrieves options by category and key, converts them into an indexed object, and overides defaults.
        
        @arg      {String}   category - Category of option.
        @arg      {Boolean}  update   - Whether to receive future updates.
        @arg      {String}   key      - Key of option.
        @arg      {Function} callback - Function to pass options on initial list and update.
        @returns  {Object}              {@link Bus.ask} promise.
    */
    Get: function (category, update, key, callback)
    {
        var internalCallback = function (packet)
        {
            var options = Utilities.CategoryKeyValueListFromArray(packet.data, 'categoryName', 'key', 'value');
            
            if (update) // if update, don't overlay defaults
            {
                callback && callback(options);
                
                return options;
            }
            
            if (key) // single key
            {
                !options[key] && (options[key] = Defaults.Get(category, key)); // get default if no value
                callback      && callback(options);                            // fire callback
                
                return options;
            }
            else // whole category
            {
                options = Defaults.Extend(category, Utilities.CategoryKeyValueListFromArray(packet.data, 'categoryName', 'key', 'value'))
                
                callback && callback(options);
                
                return options;
            }
        };
        
        return Bus.ask('options',
        {
            action     : 'list',
            subscribe  : update,
            callback   : callback ? internalCallback : false,
            category   : category,
            filter     : key
        })
        .then(internalCallback);
    }
};