<!--
/**
 * 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 name="feedForm" novalidate id="feedFormLocationStep">
  <div class="col-xs-24 locationStep">
    <div class="row">
      <div class="col-xs-24 feedLocationNavBox">
        <h4 class="col-xs-10" ng-show="feed.storage.fileSystem.active">Default Storage type </h4>
        <h4 class="col-xs-10" ng-show="feed.storage.catalog.active"> Storage type </h4>

        <div class="col-xs-14 feedLocationNav">
          <button type="button"
                  class="btn btn-default pull-right"
                  ng-class="{active: feed.storage.catalog.active}"
                  ng-click="toggleStorage()">
            Catalog Storage
          </button>
          <button type="button"
                  class="btn btn-default pull-right"
                  ng-class="{active: feed.storage.fileSystem.active}"
                  ng-click="toggleStorage()">
            File System
          </button>

        </div>
        <div class="clearfix"></div>
      </div>
      <h4 class="col-xs-12">Default Location</h4>
      <div class="col-xs-24">
        <div ng-show="feed.storage.fileSystem.active"
          ng-repeat="location in feed.storage.fileSystem.locations" class="row">

          <div class="col-xs-8">
            <label class="light">{{capitalize(location.type)}} path</label>
          </div>
          <div class="pull-right" ng-show="location.focused">
            <label class="light">add</label>
            <label ng-repeat="timeVariable in ['${YEAR}', '${MONTH}', '${DAY} ', '${HOUR}']"
                   ng-click="appendVariable(timeVariable, location, 'path')">
              {{timeVariable}}
            </label>
          </div>
          <div class="clearfix hidden-md"></div>
          <div class="col-xs-24">
            <input type="text" class="form-control" validation-message="{{validations.messages.path}}"
              ng-required="true"
              ng-model="location.path"
              ng-pattern="validations.patterns.osPath"
              ng-class="{firstInput: $index === 0}"
              ng-focus="location.focused = true"/>
          </div>
        </div>
      </div>


      <div ng-show="feed.storage.catalog.active">
        <div class="col-xs-8">
          <label class="light">Table uri</label>
        </div>

        <div class="pull-right" ng-show="feed.storage.catalog.catalogTable.focused">
          <label class="light">add</label>
          <label ng-repeat="timeVariable in ['${YEAR}', '${MONTH}', '${DAY} ', '${HOUR}']"
                 ng-click="appendVariable(timeVariable, feed.storage.catalog.catalogTable, 'uri')">
            {{timeVariable}}
          </label>
        </div>

        <div class="col-xs-24">
          <input type="text" class="form-control catalogStorageInput" custom-autofocus
            ng-model="feed.storage.catalog.catalogTable.uri"
            ng-pattern="validations.patterns.tableUri"
            ng-required="feed.storage.catalog.active" validation-message="{{validations.messages.path}}"
            ng-focus="feed.storage.catalog.catalogTable.focused = true"/>
        </div>

      </div>
    </div>

    <div class="row">
      <div class="col-xs-24 mt20">
        <button type="button"
                id="feed.backToStep2" class="btn prevBtn"
                ng-click="goBack('forms.feed.properties')"
                ng-disabled="buttonSpinners.backShow">
          Previous <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
        </button>
        <button id="feed.step3" class="btn nextBtn pull-right" ng-click="goNext(feedForm.$invalid, 'forms.feed.clusters')" >
          Next <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
        </button>
        <a class="pull-right" ui-sref="main">
          Cancel
        </a>
      </div>
    </div>
  </div>
</form>