/*global define*/ define([ '../../Core/defined', '../../Core/defineProperties', '../../Core/destroyObject', '../../Core/DeveloperError', '../../ThirdParty/knockout', '../getElement', './InfoBoxViewModel' ], function( defined, defineProperties, destroyObject, DeveloperError, knockout, getElement, InfoBoxViewModel) { "use strict"; /** * A widget for displaying information or a description. * * @alias InfoBox * @constructor * * @param {Element|String} container The DOM element or ID that will contain the widget. * * @exception {DeveloperError} Element with id "container" does not exist in the document. */ var InfoBox = function(container) { //>>includeStart('debug', pragmas.debug); if (!defined(container)) { throw new DeveloperError('container is required.'); } //>>includeEnd('debug') container = getElement(container); this._container = container; var infoElement = document.createElement('div'); infoElement.className = 'cesium-infoBox'; infoElement.setAttribute('data-bind', '\ css: { "cesium-infoBox-visible" : showInfo, "cesium-infoBox-bodyless" : _bodyless }'); container.appendChild(infoElement); this._element = infoElement; var titleElement = document.createElement('div'); titleElement.className = 'cesium-infoBox-title'; titleElement.setAttribute('data-bind', 'text: titleText'); infoElement.appendChild(titleElement); var cameraElement = document.createElement('button'); cameraElement.type = 'button'; cameraElement.className = 'cesium-button cesium-infoBox-camera'; cameraElement.setAttribute('data-bind', '\ attr: { title: "Focus camera on object" },\ click: function () { cameraClicked.raiseEvent(); },\ enable: enableCamera,\ cesiumSvgPath: { path: cameraIconPath, width: 32, height: 32 }'); infoElement.appendChild(cameraElement); var closeElement = document.createElement('button'); closeElement.type = 'button'; closeElement.className = 'cesium-infoBox-close'; closeElement.setAttribute('data-bind', '\ click: function () { closeClicked.raiseEvent(); }'); closeElement.innerHTML = '×'; infoElement.appendChild(closeElement); var infoBodyElement = document.createElement('div'); infoBodyElement.className = 'cesium-infoBox-body'; infoElement.appendChild(infoBodyElement); var descriptionElement = document.createElement('div'); descriptionElement.className = 'cesium-infoBox-description'; descriptionElement.setAttribute('data-bind', '\ html: descriptionSanitizedHtml,\ style : { maxHeight : maxHeightOffset(40) }'); infoBodyElement.appendChild(descriptionElement); var viewModel = new InfoBoxViewModel(); this._viewModel = viewModel; knockout.applyBindings(this._viewModel, infoElement); }; defineProperties(InfoBox.prototype, { /** * Gets the parent container. * @memberof InfoBox.prototype * * @type {Element} */ container : { get : function() { return this._container; } }, /** * Gets the view model. * @memberof InfoBox.prototype * * @type {SelectionIndicatorViewModel} */ viewModel : { get : function() { return this._viewModel; } } }); /** * @returns {Boolean} true if the object has been destroyed, false otherwise. */ InfoBox.prototype.isDestroyed = function() { return false; }; /** * Destroys the widget. Should be called if permanently * removing the widget from layout. */ InfoBox.prototype.destroy = function() { var container = this._container; knockout.cleanNode(this._element); container.removeChild(this._element); return destroyObject(this); }; return InfoBox; });