<!-- Error and Success templates -->

<script type="text/template" id="xos-error-response">
  <h5>Error</h5>
  <table>
  <tr><td>error:</td><td><%= error %></td></tr>
  <tr><td>check:</td><td><%= specific_error %></td></tr>
  </table>
  <h5>Details:</h5>
      <table>
      <tbody>
      <% _.each(reasons, function(element, index) { %>
          <tr><td><%= index %></td><td><%= element %></td></tr>
      <% }); %>
      </tbody>
      </table>
</script>

<script type="text/template" id="xos-error-rawresponse">
  <h5>Error</h5>
  <pre>The server returned:
"<%= responseText %>"</pre>
</script>

<script type="text/template" id="xos-error-template">
  <button id="close-error-box">Close Error Message</button>
  <h3>An error has occurred.</h3>
  <table class="test-error-table">
  <tr><td>Code:</td><td><%= status %></td></tr>
  <tr><td>Message:</td><td><%= statusText %></td></tr>
  </table>
</script>

<script type="text/template" id="xos-success-template">
  <button id="close-success-box">Close Success Message</button>
  <h3>Success!</h3>
  <table class="test-success-table">
  <tr><td>Code:</td><td><%= status %></td></tr>
  <tr><td>Message:</td><td><%= statusText %></td></tr>
  </table>
</script>

<script type="text/template" id="xos-navbutton-old">
  <button class="btn btn-default btn-xosnav" onclick="<%= router %>.navigate('<%= routeUrl %>', {trigger: true})"><%= name %></button><br>
</script>

<script type="text/template" id="xos-status-template">
  <div class="xos-status xos-<%= statusclass %>"><%= what %>: <%= statusText %> (<%= status %>)</div>
</script>

<script type="text/template" id="xos-tabs-template">
  <ul class="xos-nav-list">
  <% _.each(tabs, function(tab) { %>
      <li class="xos-nav-item" id="xos-nav-<%= tab["region"] %>"><%= tab["name"] %></li>
  <% }); %>
  </ul>
</script>

<script type="text/template" id="xos-title-list">
  <h3><img src="/static/img/brokencircle.gif" height=16 width=16 id="xos-list-title-spinner"> <%= title %></h3>
</script>

<script type="text/template" id="xos-title-detail">
  <h3><%= title %></h3>
</script>

<script type="text/template" id="xos-navbutton">
  <li>
      <a href="<%= routeUrl %>">
          <i class="<%= iconClass %>"></i>
          <%= name %>
      </a>
  </li>
</script>

<script type="text/template" id="xos-inline-detail-buttons-template">
    <tr>
       <td colspan=2><button class="btn js-submit btn-xos-detail btn-xos-save-leave">Save</button>
           <button class="btn js-submit btn-xos-detail btn-xos-save-continue">Save and Continue Editing</button>
           <button class="btn js-submit btn-xos-detail btn-xos-save-another">Save and Add Another</button>
           <button class="btn js-submit btn-xos-detail btn-xos-delete">Delete</button>
       </td>
    </tr>
</script>

<script type="text/template" id="xos-backend-status-icon-template">
    <% if (! ("enacted" in arguments) ) { %>
        <!-- enacted is undefined; this must be a new object -->
    <% } else if ((enacted) && (enacted >= updated)) { %>
        <span style="min-width:16px;"><img src="/static/admin/img/icon_success.gif"></span>
    <% } else { %>
        <% if ((backend_status == "Provisioning in progress") || (!backend_status)) { %>
            <span style="min-width:16px;" title="<%= _.escape(backend_status) %>"><img src="/static/admin/img/icon_clock.gif"></span>
        <% } else { %>
            <span style="min-width:16px;" title="<%= _.escape(backend_status) %>"><img src="/static/admin/img/icon_error.gif"></span>
        <% } %>
    <% } %>
</script>

<script type="text/template" id="xos-backend-status-text-template">
    <%= xosBackendStatusIconTemplate.apply(this,arguments) %>
    <% if (model.enacted === undefined) { %>
        <!-- enacted is undefined; this must be a new object -->
    <% } else if ((enacted) && (enacted >= updated)) { %>
        Successfully enacted
    <% } else { %>
        <%= _.escape(backend_status) %>
    <% } %>
</script>

<script type="text/template" id="xos-list-header-template">
    <button class="btn js-submit btn-xos-list btn-xos-add">Add</button>
    <button class="btn js-submit btn-xos-list btn-xos-refresh">Refresh</button>
</script>

<script type="text/template" id="xos-list-footer-template">
    <% if (addChildHash) { %>
        <a href="<%= addChildHash %>">Add...</a>
    <% } %>
</script>

<script type="text/template" id="xos-delete-button-template">
    <a href="#delete<%= firstCharUpper(modelName) %>/<%= id %>">delete</a>
</script>

<script type="text/template" id="xos-detail-link-template">
    <a href="#<%= collectionName %>/<%= id %>"><%= text %></a>
</script>

<script type="text/template" id="xos-add-template">
  <h3 class="xos-detail-title">Add Object: <%= modelName %></h3>
  <form>
  <table>
  <% args = arguments; %>
  <% _.each(addFields, function(fieldName) { %>
     <tr><td><%= fieldNameToHumanReadable(fieldName) %>:</td>
        <% readOnly = $.inArray(fieldName, model.readOnlyFields)>=0 ? " readonly" : "";  %>
        <% if (fieldName in foreignFields) { %>
            <td><%= idToSelect(fieldName, model.attributes[fieldName], foreignFields[fieldName], "humanReadableName", readOnly) %></td>
        <% } else if (inputType[fieldName] == "checkbox") { %>
            <td><input type="checkbox" name="<%= fieldName %>" <% if (model.attributes[fieldName]) print("checked"); %><%= readOnly %>></td>
        <% } else if (fieldName=="backend_status") { %>
            <td><%= xosBackendStatusTextTemplate.apply(this, args) %></td>
        <% } else { %>
            <td><input type="text" name="<%= fieldName %>" value="<%= model.attributes[fieldName] %>"<%= readOnly %>></td>
        <% } %>
     </tr>
  <% }); %>
  <%= xosInlineDetailButtonsTemplate() %>
  </table>
  </form>
</script>

<script type="text/template" id="xos-detail-template">
  <h3 class="xos-detail-title">Edit Object: <%= modelName %></h3>
  <form>
  <table>
  <% args = arguments; %>
  <% _.each(detailFields, function(fieldName) { %>
     <tr><td><%= fieldNameToHumanReadable(fieldName) %>:</td>
        <% readOnly = $.inArray(fieldName, model.readOnlyFields)>=0 ? " readonly" : "";  %>
        <% if (fieldName in choices) { %>
            <td><%= choicesToSelect(fieldName, model.attributes[fieldName], choices[fieldName]) %></td>
        <% } else if (fieldName in foreignFields) { %>
            <td><%= idToSelect(fieldName, model.attributes[fieldName], foreignFields[fieldName], "humanReadableName", readOnly) %></td>
        <% } else if (inputType[fieldName] == "spinner") { %>
            <!-- note: I never finished working on this spinner stuff! -->
            <td><%= xosSpinnerTemplate({id: "picker_" + fieldName, fieldName: fieldName, value: model.attributes[fieldName]}) %></td>
        <% } else if (inputType[fieldName] == "checkbox") { %>
            <td><input type="checkbox" name="<%= fieldName %>" <% if (model.attributes[fieldName]) print("checked"); %><%= readOnly %>></td>
        <% } else if (inputType[fieldName] == "picker") { %>
            <% lookupFunc = makeIdToName(model.m2mFields[fieldName], "humanReadableName"); %>
            <td><%= xosPickerTemplate({pickedItems: model.attributes[fieldName], unpickedItems: model.getChoices(fieldName,true), id: "picker_" + fieldName, fieldName: fieldName, detailView: detailView, lookupFunc: lookupFunc}) %></td>
        <% } else if (fieldName=="backend_status") { %>
            <td><%= xosBackendStatusTextTemplate.apply(this, args) %></td>
        <% } else { %>
            <td><input type="text" name="<%= fieldName %>" value="<%= model.attributes[fieldName] %>"<%= readOnly %>></td>
        <% } %>
     </tr>
  <% }); %>
  <%= xosInlineDetailButtonsTemplate() %>
  </table>
  </form>
</script>

<script type="text/template" id="xos-list-template">
  <h3 class="xos-list-title"><%= title %></h3>
  <%= xosListHeaderTemplate() %>
  <table class="test-table">
  <thead>
  <tr>
  <% _.each(listFields, function(fieldName) { %>
      <th><%= fieldNameToHumanReadable(fieldName) %></th>
  <% }); %>
  <th>delete</th>
  </tr></thead>
  <tbody></tbody>
  </table>
  <%= xosListFooterTemplate({addChildHash: addChildHash}) %>
</script>

<script type="text/template" id="xos-listitem-template">
  <% _.each(listFields, function(fieldName) { %>
      <% if ($.inArray(fieldName, model.detailLinkFields)>=0) { %>
          <td><%= xosDetailLinkTemplate({collectionName: collectionName, id: id, text: model.attributes[fieldName]}) %></td>
      <% } else if (fieldName in foreignFields) { %>
          <td><%= idToName(model.attributes[fieldName], foreignFields[fieldName], "humanReadableName") %></td>
      <% } else { %>
      <td><%= model.attributes[fieldName] %></td>
      <% } %>
  <% }); %>
  <td><%= xosDeleteButtonTemplate({modelName: modelName, id: id}) %></td>
</script>

<script type="text/template" id="xos-savebuttons-template">
  <div class="box save-box">
    <button class="btn btn-high btn-info btn-xos-contentButtonPanel btn-xos-save-leave">Save</button>
    <button class="btn btn-high btn-xos-contentButtonPanel btn-xos-save-continue">Save and continue editing</button>
    <button class="btn btn-high btn-xos-contentButtonPanel btn-xos-save-another">Save and add another</button>
    <button class="btn btn-danger btn-xos-contentButtonPanel btn-xos-delete">Delete</button>
  </div>
</script>

<script type="text/template" id="xos-listbuttons-template">
  <div class="box save-box">
    <button class="btn btn-high btn-primary btn-xos-contentButtonPanel btn-xos-refresh">Refresh</button>
    <button class="btn btn-high btn-success btn-xos-contentButtonPanel btn-xos-add">Add</button>
  </div>
</script>

<script type="text/template" id="xos-datatable-spinner-template-old">
    <!-- arguments: value, id, collectionName, fieldName -->
    <%= value %> <a href='#increase/<%= collectionName %>/<%= id %>/<%= fieldName %>'>more</a> <a href='#decrease/<%= collectionName %>/<%= id %>/<%= fieldName %>'>less</a>
</script>

<script type="text/template" id="xos-datatable-spinner-template">
    <!-- arguments: value, id, collectionName, fieldName -->
    <%= value %> <a href="javascript:undefined" onclick='<%= app.varName %>.adjustCollectionField("<%= collectionName %>", <%= id %>, "<%= fieldName %>", 1)'> more </a>
                 <a href="javascript:undefined" onclick='<%= app.varName %>.adjustCollectionField("<%= collectionName %>", <%= id %>, "<%= fieldName %>", -1)'> less </a>
</script>

<script type="text/template" id="xos-spinner-template">
    <!-- arguments: fieldName, id, value -->
    <input name="<%= fieldName %>" class="xos-spinner" id="<%= id %>">
    <% detailView.viewInitializers.push( function() { init_spinner("#" + id, value); } ); %>
</script>

<script type="text/template" id="xos-picker-template">
    <!-- arguments: unpickedItems, pickedItems, fieldName, id -->
    <div id="<%= id %>">
    <div class="picker_row">
    <div class="picker_column">
    <div>Available</div>
    <select name="pickerfrom" class="select-picker-from" multiple size="5">
        <% _.each(unpickedItems, function(item) { %>
           <option value="<%= item %>"><%= lookupFunc? lookupFunc(item) : item %></option>
        <% });%>
    </select>
    </div>
    <div class="picker_column">
    <br>
    <div class="btn btn-success btn-picker-add">Add &raquo;</div><br><br>
    <div class="btn btn-success btn-picker-remove">&laquo; Remove</div>
    </div>
    <div class="picker_column">
    <div>Selected</div>
    <select name=<%= fieldName %> class="select-picker-to syphonall" multiple size="5">
        <% _.each(pickedItems, function(item) { %>
           <option value="<%= item %>"><%= lookupFunc ? lookupFunc(item) : item %></option>
        <% }); %>
    </select>
    </div>
    <div class="picker_column">
    <br>
    <div class="btn btn-success btn-picker-up">Up</div><br><br>
    <div class="btn btn-success btn-picker-down">Down</div>
    </div>
    </div>
    </div>
    <% detailView.viewInitializers.push( function() { init_picker("#" + id); } ); %>
</script>

<script type="text/template" id="xos-sliceselector-option">
   <%= name %>
</script>

<script type="text/template" id="xos-sliceselector-select">
    <select>
    </select>
</script>

<script>
xosInlineDetailButtonsTemplate = _.template($("#xos-inline-detail-buttons-template").html());
xosListHeaderTemplate = _.template($("#xos-list-header-template").html());
xosListFooterTemplate = _.template($("#xos-list-footer-template").html());
xosDeleteButtonTemplate = _.template($("#xos-delete-button-template").html());
xosDetailLinkTemplate = _.template($("#xos-detail-link-template").html());
xosBackendStatusIconTemplate = _.template($("#xos-backend-status-icon-template").html());
xosBackendStatusTextTemplate = _.template($("#xos-backend-status-text-template").html());
xosPickerTemplate = _.template($("#xos-picker-template").html());
xosSpinnerTemplate = _.template($("#xos-spinner-template").html());
xosDataTableSpinnerTemplate = _.template($("#xos-datatable-spinner-template").html());
</script>

