Source: Models/TerrainCatalogItem.js

'use strict';

/*global require*/

var defined = require('terriajs-cesium/Source/Core/defined');
var defineProperties = require('terriajs-cesium/Source/Core/defineProperties');
var DeveloperError = require('terriajs-cesium/Source/Core/DeveloperError');

var CatalogItem = require('./CatalogItem');
var inherit = require('../Core/inherit');
var TerriaError = require('../Core/TerriaError');

/**
 * A {@link CatalogItem} that is added to the map as 3D terrain.
 *
 * @alias TerrainCatalogItem
 * @constructor
 * @extends CatalogItem
 * @abstract
 *
 * @param {Terria} terria The Terria instance.
 */
var TerrainCatalogItem = function(terria) {
    CatalogItem.call(this, terria);

    this._terrainProvider = undefined;
    this._originalTerrainProvider = undefined;
};

inherit(CatalogItem, TerrainCatalogItem);

defineProperties(TerrainCatalogItem.prototype, {
    /**
     * Gets the terrain provider object associated with this data source.
     * This property is undefined if the data source is not enabled.
     * @memberOf TerrainCatalogItem.prototype
     * @type {Object}
     */
    terrainProvider : {
        get : function() {
            return this._terrainProvider;
        }
    },

    /**
     * Gets a value indicating whether this data source, when enabled, can be reordered with respect to other data sources.
     * Data sources that cannot be reordered are typically displayed above reorderable data sources.
     * @memberOf TerrainCatalogItem.prototype
     * @type {Boolean}
     */
    supportsReordering : {
        get : function() {
            return false;
        }
    },

    /**
     * Gets a value indicating whether the opacity of this data source can be changed.
     * @memberOf TerrainCatalogItem.prototype
     * @type {Boolean}
     */
    supportsOpacity : {
        get : function() {
            return false;
        }
    }
});

TerrainCatalogItem.prototype._createTerrainProvider = function() {
    throw new DeveloperError('_createTerrainProvider must be implemented in the derived class.');
};

TerrainCatalogItem.prototype._showInCesium = function() {
    this._disableOtherTerrainItems();

    var terrainProvider = this._terrainProvider = this._createTerrainProvider();
    var scene = this.terria.cesium.scene;
    this._originalTerrainProvider = scene.terrainProvider;
    scene.terrainProvider = terrainProvider;
};

TerrainCatalogItem.prototype._hideInCesium = function() {
    if (!defined(this._originalTerrainProvider)) {
        return;
    }

    this.terria.cesium.scene.terrainProvider = this._originalTerrainProvider;
    this._originalTerrainProvider = undefined;
    this._terrainProvider = undefined;
};

TerrainCatalogItem.prototype._showInLeaflet = function() {
    this.isShown = false;
    throw new TerriaError({
        sender: this,
        title: 'Not supported in 2D',
        message: '"' + this.name + '" cannot be show in the 2D view.  Switch to 3D and try again.'
    });
};

TerrainCatalogItem.prototype._hideInLeaflet = function() {
    // Nothing to be done.
};

TerrainCatalogItem.prototype._enableInCesium = function() {
// Nothing to be done.
};

TerrainCatalogItem.prototype._disableInCesium = function() {
    // Nothing to be done.
};

TerrainCatalogItem.prototype._enableInLeaflet = function() {
    // Nothing to be done.
};

TerrainCatalogItem.prototype._disableInLeaflet = function() {
    // Nothing to be done.
};

TerrainCatalogItem.prototype._disableOtherTerrainItems = function() {
    var items = this.terria.nowViewing.items;

    for (var i = 0; i < items.length; i++) {
        var item = items[i];
        if (item !== this && hasTerrainProvider(item)) {
            item.isShown = false;
        }
    }
};

function hasTerrainProvider(catalogItem) {
    if (defined(catalogItem.terrainProvider)) {
        return true;
    }

    if (catalogItem.isMappable && defined(catalogItem.items)) {
        for (var i = 0; i < catalogItem.items.length; ++i) {
            if (hasTerrainProvider(catalogItem.items[i])) {
                return true;
            }
        }
    }

    return false;
}

module.exports = TerrainCatalogItem;