/** @scratch /panels/5

*
* include::panels/column.asciidoc[]
*/

/** @scratch /panels/column/0

*
* == Column
* Status: *Stable*
*
* A pseudo panel that lets you add other panels to be arranged in a column with defined heights.
* While the column panel is stable, it does have many limitations, including the inability to drag
* and drop panels within its borders. It may be removed in a future release.
*
*/

define([

'angular',
'app',
'lodash',
'config'

], function (angular, app, _, config) {

'use strict';

var module = angular.module('kibana.panels.column', []);

app.useModule(module);

module.controller('column', function($scope, $rootScope, $timeout) {
  $scope.panelMeta = {
    status  : "Stable",
    description : "A pseudo panel that lets you add other panels to be arranged in a column with"+
      "defined heights."
  };

  // Set and populate defaults
  var _d = {
    /** @scratch /panels/column/3
     *
     * === Parameters
     *
     * panel:: An array of panel objects
     */
    panels : []
  };
  _.defaults($scope.panel,_d);

  $scope.init = function(){
    $scope.reset_panel();
  };

  $scope.toggle_row = function(panel) {
    panel.collapse = panel.collapse ? false : true;
    if (!panel.collapse) {
      $timeout(function() {
        $scope.send_render();
      });
    }
  };

  $scope.send_render = function() {
    $scope.$broadcast('render');
  };

  $scope.add_panel = function(panel,newPanel) {
    panel.panels.push(newPanel);
  };

  $scope.reset_panel = function(type) {
    $scope.new_panel = {
      loading: false,
      error: false,
      sizeable: false,
      draggable: false,
      removable: false,
      span: 10,
      height: "150px",
      editable: true,
      type: type
    };
  };

});

module.directive('columnEdit', function($compile,$timeout) {
  return {
    scope : {
      new_panel:"=panel",
      row:"=",
      config:"=",
      dashboards:"=",
      type:"=type"
    },
    link: function(scope, elem) {
      scope.$on('render', function () {

        // Make sure the digest has completed and populated the attributes
        $timeout(function() {
          // Create a reference to the new_panel as panel so that the existing
          // editors work with our isolate scope
          scope.panel = scope.new_panel;
          var template = '<div ng-include src="partial(\'panelgeneral\')"></div>';

          if(!(_.isUndefined(scope.type)) && scope.type !== "") {
            template = template+'<div ng-include src="\'app/panels/'+scope.type+'/editor.html\'"></div>';
          }
          elem.html($compile(angular.element(template))(scope));
        });
      });
    }
  };
});

module.filter('withoutColumn', function() {
  return function() {
    return _.without(config.panel_names,'column');
  };
});

});