<!--
/**
 * 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" novalidate>

  <div class="col-xs-24"><label class="mt15">TIMING</label></div>

  <div class="col-xs-24 mb10">
    <label class="light" tooltip="process.properties.timezone">Timezone<mandatory-field></mandatory-field></label>
    <time-zone-select ng-model="process.timezone" id="timeZoneSelect" required="true">
    </time-zone-select>
  </div>
  <div class="col-xs-24 plr0px">
    <div class="col-xs-9">
    <div class="inlineInputsGroup">
      <div><label class="light">Frequency Every<mandatory-field></mandatory-field></label></div>
      <input type="text" class="form-control" validation-message="{{validations.messages.number}}"
             ng-model="process.frequency.quantity" ng-keydown="validations.acceptOnlyNumber($event)"
             id="frequencyQuantity"
             ng-required="true"
             ng-pattern="validations.patterns.twoDigits"/>

      <select
        ng-model="process.frequency.unit"
        ng-required="true">
        <option selected 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-7">
    <div class="inlineInputsGroup">
      <div><label class="light">Maximum Parallel Instances<mandatory-field></mandatory-field></label></div>
      <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]">{{value}}</option>
      </select>
    </div>
    </div>
    <div class="col-xs-8">
    <div class="inlineInputsGroup">
      <div>
        <label class="light" tooltip="process.properties.order">
          Instance Usage<mandatory-field></mandatory-field>
        </label>
      </div>
      <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']">{{value}}</option>
      </select>
    </div>
    </div>
  </div>
  <div class="col-xs-24"><label class="mt15">RETRY</label></div>
  <div class="col-xs-24 plr0px">
    <div class="col-xs-9 inlineInputsGroup">
      <div>
        <label class="light" tooltip="process.properties.retryPolicy" tooltip-position="up">
          Retry Policy<mandatory-field></mandatory-field>
        </label>
      </div>
      <select ng-model="process.retry.policy" ng-required="true" validation-message="{{validations.messages.option}}">
        <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 class="col-xs-7 inlineInputsGroup">
      <div><label class="light">Attempts<mandatory-field></mandatory-field></label></div>

      <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-pattern="validations.patterns.twoDigits"/>
    </div>
    <div class="col-xs-8">
    <div class="inlineInputsGroup">
      <div><label class="light">Delay Up to<mandatory-field></mandatory-field></label></div>
      <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-required="true"
             ng-pattern="validations.patterns.twoDigits"/>

      <select ng-model="process.retry.delay.unit" ng-required="true" 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>
  <div class="col-xs-24 mt35 pb15px pl0px">
    <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 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>
    </div>
  </div>

</form>
