<!--
/**
 * 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.
 */
-->
<div class="entityForm">
  <div class="col-xs-24">
      <div class="preview pullOver">
          <button id="previewXMLBtn" type="button" class="btn btn-default btn-md pull-right nextBtn" ng-click="toggleclick()" >Preview XML</button>
      </div>
      <br/>
    <div>
      <div class=" formBoxContainer detailsBox">
        <div class="row processProgressBox" ng-class="{
          general:isActive('forms.process.general'),
          summary:isActive('forms.process.summary')
          }">
          <div class="progressBar col-xs-24">
            <div class="text-center fir" ng-class="{
                active:isActive('forms.process.general'),
                completed:isCompleted('forms.process.general')}">General</div>
            <div class="text-center thi" ng-class="{
                active:isActive('forms.process.summary'),
                completed:isCompleted('forms.process.summary')}">Summary</div>
          </div>
        </div>

        <div class="row customContainer">
          <div class="col-xs-offset-1 col-xs-22">
            <fieldset id="fieldWrapper" ng-disabled="!editXmlDisabled">
              <div class="formViewContainer">
                <div class="col-xs-24">
                  <label class="title"><span class="entypo cycle icon-lg entypo-align-sub"></span> NEW PROCESS</label>
                </div>
                <div ui-view></div>
              </div>
            </fieldset>
          </div>
        </div>
	  </div>
      <div class="hide xmlPreviewContainer detailsBox">
        <div class="row dt">
          <div class="col-xs-24 pt15px">
            <div class="col-xs-13 noSpecial">
                <h5>XML Preview</h5>
                <label style="margin-top: -10px;margin-bottom: -2px;" ng-if="invalidXml" class="custom-danger">Invalid Xml</label>
            </div>
            <div class="pull-right">
              <button type="button"
                      id="editXmlButton"
                      class="btn btn-default btn-xs"
                      ng-click="toggleEditXml()"
                      ng-class="{'btn-warning':!editXmlDisabled}"
                      ng-disabled="invalidXml">
                <div ng-if="editXmlDisabled">Edit XML</div>
                <div ng-if="!editXmlDisabled">Finish</div>
              </button>

              <button type="button"
                      id="revertXMLBtn"
                      class="btn btn-default btn-xs"
                      ng-if="invalidXml"
                      ng-click="revertXml()">
                  <div>Revert</div>
              </button>
            </div>
          </div>
          <div class="col-xs-24 showValidationStyle">
            <textarea ng-model="prettyXml"
                      class="form-control"
                      elastic
                      ng-disabled="editXmlDisabled"
                      ng-class="{fakeInvalid:invalidXml}">
            </textarea>
          </div>
        </div>
      </div>
  </div>
</div>
