{{!
* 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.
}}
  <form class="form-horizontal" id="addLocalRepositoryPopup" autocomplete="off">
    <div class="each-row">
      <label class="control-label">{{t installer.step1.advancedRepo.localRepo.label.os}}</label>
      <div class="controls">
        <div class="btn-group">
				  <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
				    {{view.selectedOS.osType}}
				    <span class="caret"></span>
				  </a>
				  <ul class="dropdown-menu">
  				  {{#each os in view.oses}}
					    <li>
  					    <a href="#" {{action selectOS os target="view"}}>
                  {{os.osType}}
                </a>
              </li>
				    {{/each}}
				  </ul>
				</div>
      </div>
    </div>
    <div class="each-row">
      <label class="control-label">{{t installer.step1.advancedRepo.localRepo.label.baseUrl}}</label>
      <div class="controls">
        {{view Em.TextField valueBinding="view.enteredUrl" classNames="span6"}}
      </div>
    </div>
    <div class="each-row">
      <label class="control-label">{{t installer.step1.advancedRepo.localRepo.label.stack}}</label>
      <div class="controls">
        {{view.stackName}}
      </div>
    </div>
    <div style="height:100px;"></div>
    {{#if view.errorMessage}}
	    <div class="alert">
			  <strong>{{t common.warning}}</strong>  {{view.errorMessage}}
			</div>
	  {{else}}
	    <div class="alert alert-info">
        Provide location of the local repository for the selected OS
      </div>
		{{/if}}
  </form>