Source: Map/VariableConcept.js

"use strict";

/*global require*/
var defaultValue = require('terriajs-cesium/Source/Core/defaultValue');
var defined = require('terriajs-cesium/Source/Core/defined');
var knockout = require('terriajs-cesium/Source/ThirdParty/knockout');

var inherit = require('../Core/inherit');
var Concept = require('./Concept');

/**
 * Represents a variable concept associated with a DisplayVariablesConcept.
 *
 * @alias VariableConcept
 * @constructor
 * @extends Concept
 *
 * @param {String} name    The display name of this variable.
 * @param {Object} [options] Options:
 * @param {Concept} [options.parent] The parent of this variable; if not parent.allowMultiple, parent.toggleActiveItem(variable) is called when toggling on.
 * @param {Boolean} [options.active] Whether the variable should start active.
 * @param {String} [options.color] The string description of the color of this variable, if any.
 * @param {String} [options.id] The id of this variable; defaults to the name (via the parent class Concept).
 * @param {Boolean} [options.visible] Whether this variable is visible in the NowViewing tab (defaults to True).
 */
var VariableConcept = function(name, options) {
    Concept.call(this, name);

    options = defaultValue(options, defaultValue.EMPTY_OBJECT);
    /**
     * Gets or sets the parent for a node.  This property is observable.
     * @type {VariableConcept[]}
     */
    this.parent = options.parent;

    /**
     * Gets or sets a value indicating whether this variable is currently active.
     * This property is observable.
     * @type {Boolean}
     */
    this.isActive = defaultValue(options.active, false);

    /**
     * Flag to say if this if this node is selectable.  This property is observable.
     * @type {Boolean}
     */
    this.isSelectable = true;

    /**
     * String describing the color of this node, if applicable.  This property is observable.
     * @type {String}
     */
    this.color = options.color;

    if (defined(options.id)) {
        this.id = options.id;
    }

    knockout.track(this, ['isActive', 'parent']);  // name, isSelectable, color already tracked by Concept

    knockout.getObservable(this, 'isActive').subscribe(function(nowActive) {
        // If this concept has been activated, and its parent has a color callback, use it to set this concept's color now.
        if (nowActive && defined(this.parent) && !defined(this.color) && defined(this.parent.getColorCallback)) {
            this.color = this.parent.getColorCallback(this.parent.getColumnIndex(this.id));
        }
    }, this);
};

inherit(Concept, VariableConcept);

/**
 * Toggles the {@link VariableConcept#isActive} property, by using the parent's toggleActiveItem (if defined), or else manually.
 */
VariableConcept.prototype.toggleActive = function() {
    if (defined(this.parent) && defined(this.parent.toggleActiveItem)) {
        this.parent.toggleActiveItem(this);
    } else {
        this.isActive = !this.isActive;
    }
};

module.exports = VariableConcept;