{{!
* 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 view.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: 100px;">
	    <div class="controls pull-right">
	      <button class="btn" {{action doCancel target="view"}}>{{t form.cancel}}</button>
	      <button class="btn btn-primary" {{action doSave target="view"}}>{{t common.save}}</button>
	    </div>
	  </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}}


