<!--
/**
 * 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="processForm" class="mt10" novalidate id="processFormAdvancedStep">
  <div class="col-xs-24"><label>Retry Policy</label></div>
  <div class="col-xs-24 plr0px">
    <div class="col-xs-4 plr0px">
      <div class="col-xs-24">
        <label class="light" tooltip="process.properties.retryPolicy" tooltip-position="up">
          Type
        </label>
      </div>
      <div class="col-xs-24">
        <select ng-model="process.retry.policy" ng-required="true" validation-message="{{validations.messages.option}}" ng-change="policyChange()">
          <option value="" disabled selected style='display:none;'>-Select policy-</option>
          <option value="periodic">Periodic</option>
          <option value="exp-backoff">Exponential Backup</option>
          <option value="final">None</option>
        </select>
      </div>
    </div>
    <div class="col-xs-offset-1 col-xs-5 plr0px">
      <div class="col-xs-24">
        <label class="light">Delay Up to</label>
      </div>
      <div class="col-xs-24 inlineInputsGroup">
        <input type="text" class="form-control"
               ng-model="process.retry.delay.quantity" validation-message="{{validations.messages.number}}"
               id="delayQuantity" ng-keydown="validations.acceptOnlyNumber($event)"
               ng-disabled = "process.retry.policy === 'final'"
               ng-required="true"
               ng-pattern="validations.patterns.twoDigits"/>

        <select ng-model="process.retry.delay.unit" ng-required="true" ng-disabled = "process.retry.policy === 'final'" validation-message="{{validations.messages.option}}">
          <option value="" disabled selected style='display:none;'>-Select delay-</option>
          <option value="minutes">minutes</option>
          <option value="hours">hours</option>
          <option value="days">days</option>
          <option value="months">months</option>
        </select>
      </div>
    </div>
    <div class="col-xs-4 plr0px">
      <div class="col-xs-24">
        <label class="light">Attempts</label>
      </div>
      <div class="col-xs-24">
        <input type="text" class="form-control" validation-message="{{validations.messages.number}}"
               ng-model="process.retry.attempts" ng-keydown="validations.acceptOnlyNumber($event)"
               id="attemptsField"
               ng-required="true"
               ng-disabled = "process.retry.policy === 'final'"
               ng-pattern="validations.patterns.twoDigits"/>
      </div>
    </div>
  </div>

  <div class="col-xs-24"><label>Performance & Ordering</label></div>
  <div class="col-xs-24 plr0px">
    <div class="col-xs-4 plr0px">
      <div class="col-xs-24">
        <label class="light">Max Parallel Instances</label>
      </div>
      <div class="col-xs-24">
        <select ng-model="process.parallel" ng-required="true">
          <option ng-repeat="value in [1,2,3,4,5,6,7,8,9,10,11,12] track by $index">{{value}}</option>
        </select>
      </div>
    </div>
    <div class="col-xs-offset-1 col-xs-4 plr0px">
      <div class="col-xs-24">
        <label class="light" tooltip="process.properties.order">Order</label>
      </div>
      <div class="col-xs-24">
        <select ng-model="process.order" ng-required="true" validation-message="{{validations.messages.option}}">
          <option value="" disabled selected style='display:none;'>-Select order-</option>
          <option ng-repeat="value in ['FIFO', 'LIFO', 'LAST_ONLY'] track by $index">{{value}}</option>
        </select>
      </div>
    </div>
  </div>

  <div class="col-xs-24">
    <label>Properties</label>
  </div>
  <div ng-repeat="property in process.properties track by $index" class="col-xs-24 plr0px">
      <div class="col-xs-6 dynamic-table-spacer">
        <input type="text" class="form-control" ng-model="property.name"
               ng-pattern="validations.patterns.propertyName"
               validation-optional-message="{{validations.messages.name}}"
               ng-disabled="xmlPreview.edit"
               ng-required="property.value" placeholder="name" />
      </div>
      <div class="col-xs-6 dynamic-table-spacer">
        <input type="text" class="form-control" ng-model="property.value"
               validation-optional-message="{{validations.messages.value}}"
               ng-disabled="xmlPreview.edit"
               ng-required="property.name" placeholder="value" />
      </div>
      <div class="dynamic-table-spacer">
        <button type="button" class="btn btn-default btn-xs" ng-click="removeProperty($index)" ng-if="!$first || !$last"
             ng-disabled="xmlPreview.edit">
          <span class="entypo minus"></span> delete
        </button>
        <button type="button" class="btn btn-default btn-xs" ng-click="addProperty()"
            ng-disabled="xmlPreview.edit" ng-if="$last">
            <span class="entypo plus"></span> ADD
        </button>
      </div>
  </div>


  <div class="col-xs-24"><label class="mt15">Access Control List</label></div>
  <div class="col-xs-24 plr0px">
    <div class="col-xs-4">
        <label class="light">Owner<mandatory-field></mandatory-field></label>
        <input type="text"
               name="aclOwnerInput"
               ng-model="process.ACL.owner"
               ng-pattern="validations.patterns.unixId"
               ng-required="true"
               class="form-control"
               validation-message="{{validations.messages.acl.owner}}"/>
    </div>
    <div class="col-xs-4">
        <label class="light">Group<mandatory-field></mandatory-field></label>
        <input type="text"
               name="aclGroupInput"
               ng-model="process.ACL.group"
               ng-pattern="validations.patterns.unixId"
               ng-required="true"
               class="form-control"
               validation-message="{{validations.messages.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="process.ACL.permission"></acl-permissions>
      </div>
    </div>
  </div>

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

</form>
