<!--
/**
 * 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="feedFormAdvancedStep">
		<div class="col-xs-24"><label>Job Details</label></div>
		<div class="col-xs-24 plr0px">
			<div ng-repeat="property in feed.properties track by $index">
				<div ng-if="property.key === 'queueName'">
					<div class="col-xs-4">
						<label class="light">Queue Name</label>
						<input type="text" class="form-control"
							ng-model="property.value" />
					</div>
				</div>
				<div ng-if="property.key === 'jobPriority'">
					<div class="col-xs-4">
						<label class="light">Job Priority</label>
						<select ng-model="property.value" class="form-control padding0">
              <option value="" disabled selected style='display:none;'>-Select job-</option>
              <option value="VERY_HIGH">Very high</option>
              <option value="HIGH">High</option>
              <option value="NORMAL">Normal</option>
              <option value="LOW">Low</option>
              <option value="VERY_LOW">Very Low</option>
            </select>
					</div>
				</div>
			</div>
		</div>

		<div class="col-xs-24 plr0px">
			<div class="col-xs-4">
				<label class="col-xs-24 light plr0px">Late Arrival Cutoff</label>
				<input type="text" class="col-xs-4" ng-keydown="validations.acceptOnlyNumber($event)"
                 ng-model="feed.lateArrival.cutOff.quantity"
                 ng-pattern="validations.patterns.twoDigits"/>
        <select
          ng-model="feed.lateArrival.cutOff.unit" class="col-xs-offset-1 col-xs-19">
          <option value="" disabled selected style='display:none;'>-Select unit-</option>
          <option value="minutes">minutes</option>
          <option value="hours">hours</option>
          <option value="days">days</option>
          <option value="months">months</option>
        </select>
			</div>
			<div class="col-xs-4">
				<label class="light">Availability Flag</label>
				<input type="text" class="form-control"
					ng-model="feed.availabilityFlag"
					validation-optional-message="{{validations.messages.value}}"
					ng-pattern="validations.patterns.alpha">
			</div>
		</div>

		<label class="col-xs-24">Performance & Throttling - Distributed Copy</label>

		<div class="col-xs-24 plr0px">
			<div ng-repeat="property in feed.properties track by $index">
				<div ng-if="property.key === 'mapBandwidthKB'">
					<div class="col-xs-4">
						<label class="light">Max Bandwidth</label>
						<input type="text" class="form-control"
							ng-model="property.value">
					</div>
				</div>
				<div ng-if="property.key === 'maxMaps'">
					<div class="col-xs-4">
						<label class="light">Max map jobs</label>
						<input type="text" class="form-control"
							ng-model="property.value">
					</div>
				</div>
			</div>
		</div>

		<div class="col-xs-24 plr0px">
			<div ng-repeat="property in feed.properties track by $index">
				<div ng-if="property.key === 'parallel'">
					<div class="col-xs-4">
						<label class="col-xs-24 light plr0px">Parallel</label>
						<input type="text" class="form-control"
							ng-model="property.value">
					</div>
				</div>
			</div>
		</div>

    <div class="col-xs-24"><label>Access Control List</label></div>
    <div class="col-xs-24 plr0px">
        <div class="col-xs-8">
          <label class="light">Owner<mandatory-field></mandatory-field></label>
          <input type="text" class="form-control" validation-message="{{validations.messages.acl.owner}}"
                 ng-required="true"
                 ng-pattern="validations.patterns.unixId"
                 ng-model="feed.ACL.owner"/>
        </div>
        <div class="col-xs-8">
          <label class="light">Group<mandatory-field></mandatory-field></label>
          <input type="text" class="form-control" validation-message="{{validations.messages.acl.group}}"
                 ng-required="true"
                 ng-pattern="validations.patterns.unixId"
                 ng-model="feed.ACL.group"/>
        </div>
				<div class="col-xs-24">
		<div class="col-xs-8 plr0px">
		<label class="light">Permissions<mandatory-field></mandatory-field></label>
					  <acl-permissions acl-model="feed.ACL.permission"></acl-permissions>
		</div>
				</div>
	</div>
    <div class="col-xs-24"><label>Feed Schema</label></div>
    <div class="col-xs-8">
      <label class="light" tooltip="feed.schema.location">Location<mandatory-field></mandatory-field></label>
      <input type="text" class="form-control" validation-message="{{validations.messages.location}}"
        ng-maxlength="200"
        ng-pattern="validations.patterns.osPath"
        ng-model="feed.schema.location"/>
    </div>
    <div class="col-xs-8">
      <label class="light" tooltip="feed.schema.provider">Provider<mandatory-field></mandatory-field></label>
      <input type="text" class="form-control" validation-message="{{validations.messages.provider}}"
        ng-pattern="validations.patterns.osPath"
        ng-model="feed.schema.provider"/>
    </div>
	<div class="col-xs-8"></div>


  <div class="col-xs-24 pb15px mt35">
		<button id="feed.backToStep1" class="btn prevBtn" type="button" 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.step1" class="btn nextBtn"
	         ng-disabled="buttonSpinners.show"
	         ng-click="goNext(feedForm.$invalid)"
					 scroll-to-error>
	      NEXT <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.show" />
	    </button>
			<button class="btn advancedSaveBtn"
           ng-disabled="feedForm.$invalid || buttonSpinners.saveShow"
           ng-click="saveEntity(feedForm.$invalid)" scroll-to-error>
        SAVE ADVANCED OPTIONS <img src="css/img/ajax-loader.gif" ng-if="buttonSpinners.saveShow" />
      </button>
		</div>
  </div>

</form>
