{{!
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
}}

<div class="alert alert-error">
  <h2>Ambari's Experimental Functionality</h2>
  <p>
    <span class="label label-important">Important</span> <strong>Changes made here are neither tested nor supported by Ambari</strong>
  </p>
  <p>
    Ambari's experimental functionality is provided <strong>as-is</strong>.<br>
    Any changes will effect application behavior, including data corruption. Users making changes do so at their own risk.<br>
    Experimental functionality can be modified or removed at any time without notice.
  </p>  
</div>
    
{{#if App}}
  {{#if App.supports}}
    <table class="table table-bordered table-striped">
      <thead>
        <tr>
          <td style="width: 20%; font-weight: bold;">Experimental Functionality</td>
          <td style="width: 20%; font-weight: bold;">Enabled?</td>
          <td style="width: 60%; font-weight: bold;">Description</td>
        </tr>
      </thead>
      <tbody>
		    {{#each support in controller.supports}}
		      <tr>
		        <td>{{support.name}}</td>
		        <td>{{view Ember.Checkbox checkedBinding="support.selected"}}</td>
		        <td></td>
			    </tr>
		    {{/each}}
    </tbody>
    </table>
    <div class="control-group" style="margin-bottom: 70px;">
        <div class="controls pull-right">
	      <button class="btn" {{action doCancel target="controller"}}>{{t form.cancel}}</button>
	      <button class="btn btn-primary" {{action doSave target="controller"}}>{{t common.save}}</button>
	    </div>
	</div>
    <hr>
    <div class="control-group" style="margin-bottom: 100px;">
      {{#isAuthorized "CLUSTER.MANAGE_USER_PERSISTED_DATA"}}
        <div class="controls pull-left" style="margin-bottom: 100px;">
          <button class="btn btn-danger" {{action doResetUIStates target="controller"}}>{{t reset.ui.states}}</button>
          <p class="pull-right" style="margin-left: 10px; padding-top: 5px;">
              Reset UI state locally and on the server
          </p>
        </div>
      {{/isAuthorized}}
    </div>
  {{else}}
    <div class="alert alert-error">
      No application supports found. Please login to Ambari and revisit this page.
    </div>
  {{/if}}
{{else}}
  <div class="alert alert-error">
    No application found. Please login to Ambari and revisit this page.
  </div>
{{/if}}


