<!--
/**
 * 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 plr0px mt15">
        <span class="col-xs-10" ng-show="feed.storage.fileSystem.active"
          tooltip="feed.location.storageType">Default Storage Type</span>
        <span class="col-xs-10" ng-show="feed.storage.catalog.active"
          tooltip="feed.location.storageType">Storage Type</span>

        <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>
      <div class="col-xs-24"><label class="mt15">DEFAULT LOCATION</label></div>
      <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<mandatory-field></mandatory-field></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="feed.storage.fileSystem.active"
              ng-model="location.path"
              ng-pattern="validations.patterns.osPath"
              focus-if="feed.storage.fileSystem.active && $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<mandatory-field></mandatory-field></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}}"
            focus-if="feed.storage.catalog.active"
            ng-focus="feed.storage.catalog.catalogTable.focused = true"/>
        </div>

      </div>
    </div>
    <div class="col-xs-24 mt35 pb15px pl0px">
      <button type="button"
              id="feed.backToStep2" class="btn prevBtn"
              ng-click="goBack()"
              ng-disabled="buttonSpinners.backShow">
        PREVIOUS <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.backShow" />
      </button>
      <div class="pull-right">
        <a class="btn cnclBtn" ui-sref="main">
          CANCEL
        </a>
        <button id="feed.step3" class="btn nextBtn" ng-click="goNext(feedForm.$invalid)" scroll-to-error>
          NEXT <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
        </button>
      </div>
    </div>
  </div>
</form>
