<!--!  Copyright (C) 2006-2014 Edgewall Software

  This software is licensed as described in the file COPYING, which
  you should have received as part of this distribution. The terms
  are also available at http://trac.edgewall.com/license.html.

  This software consists of voluntary contributions made by many
  individuals. For the exact contribution history, see the revision
  history and logs, available at http://trac.edgewall.org/.
-->
<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:i18n="http://genshi.edgewall.org/i18n"
      xmlns:py="http://genshi.edgewall.org/"
      xmlns:xi="http://www.w3.org/2001/XInclude">
  <xi:include href="layout.html" />
  <head>
    <title>${title or _('Error')}</title>
    <link rel="stylesheet" type="text/css" href="${chrome.htdocs_location}css/code.css"/>
    <script py:if="frames" type="text/javascript">/*<![CDATA[*/
      jQuery(document).ready(function($) {
        $("#traceback a").click(function() {
          $("div", this.parentNode).slideToggle("fast");
          return false;
        });
        $("#plugins td.file a").click(function() {
          var idx = parseInt($(this).attr("href").substring(6));
          $("#traceback li").eq(idx).children("div").slideDown("fast");
          return true;
        });
        $("#tbtoggle").click(function() {
          if (this.value.indexOf("interactive") < 0) {
            this.value = "Switch to interactive view";
            $("#traceback ul").fadeOut("fast", function() {
              $("#traceback pre").fadeIn("fast");
            });
          } else {
            this.value = "Switch to plain text view";
            $("#traceback pre").fadeOut("fast", function() {
              $("#traceback ul").fadeIn("fast");
            });
          }
          return false;
        });
       /* Only activate interactive view if Javascript is enabled */
       $("#traceback ul").show();
       $("#traceback pre").hide();
       $("#tbtoggle").parent().show();

       $("#systeminfo").append("<tr><th>jQuery</th><td>"+$().jquery+"</td></tr>" +
                               "<tr><th>jQuery UI</th><td>"+$.ui.version+"</td></tr>" +
                               "<tr><th>jQuery Timepicker</th><td>"+$.timepicker.version+"</td></tr>");
       $("#systeminfo").before("<p>User Agent: <tt>" + navigator.userAgent + "</tt></p>");
      });
    /*]]>*/</script>
    <script type="text/javascript">/*<![CDATA[*/
      jQuery(document).ready(function($) {
        $("form.newticket textarea").each(function() {
          $(this).val($(this).val()
                             .replace(/#USER_AGENT#/m, navigator.userAgent)
                             .replace(/#JQUERY#/m, $().jquery)
                             .replace(/#JQUERYUI#/m, $.ui.version)
                             .replace(/#JQUERYTP#/m, $.timepicker.version));
        });
      });
    /*]]>*/</script>
  </head>

  <py:def function="create_ticket(url=None)">
    <input type="hidden" name="reporter" value="${get_reporter_id(req)}" />
    <input py:if="url == trac.homepage.strip('/')" type="hidden" name="version"
           value="${trac.version.split('-', 1)[0] if 'dev' in trac.version else trac.version}" />
    <input type="hidden" name="$arg" value="$value" py:for="arg, value in tracker_args.iteritems()" />
    <input type="hidden" name="summary" value="$message" />
    <textarea name="description" rows="3" cols="10">
${description_en if url else description}</textarea>
    <span class="inlinebuttons">
      <input type="submit" name="create" value="${_('Create')}" />
    </span>
  </py:def>

  <body>
    <div id="content" class="error">
      <py:choose test="type">
        <py:when test="'TracError'">
          <h1>$title</h1>
          <py:choose test="">
            <p py:when="not find_element(message, tag='p')" class="message">$message</p>
            <py:otherwise>$message</py:otherwise>
          </py:choose>
        </py:when>
        <py:when test="'internal'">
          <h1>Oops&hellip;</h1>
          <div class="message">
            <strong>Trac detected an internal error:</strong>
            <pre>$message</pre>
          </div>
          <py:choose>
            <py:when test="not defined('trac_error_rendering') and 'TRAC_ADMIN' not in perm">
              <p i18n:msg="">There was an internal error in Trac.
                It is recommended that you notify your local
                <a py:strip="not project.admin" href="mailto:${project.admin}">
                    Trac administrator</a> with the information needed to
                reproduce the issue.
              </p>
              <form py:if="project.admin_href"
                    class="newticket" method="get" action="${project.admin_href.newticket()}#">
                <p i18n:msg="create">To that end, you could ${create_ticket()} a ticket.</p>
              </form>
              <p>The action that triggered the error was:</p>
              <pre>${req.method}: ${req.path_info}</pre>
            </py:when>
            <py:otherwise py:choose="">
              <p py:when="not project.admin_href or project.admin_trac_url == '.'">
                This is probably a local installation issue.
              </p>
              <form py:otherwise=""
                    class="newticket" method="get" action="${project.admin_href.newticket()}#">
                <p>This is probably a local installation issue.
                  <i18n:msg params="create">
                    You should ${create_ticket()} a ticket at the admin Trac to report
                    the issue.
                  </i18n:msg>
                </p>
              </form>
              <h2>Found a bug in Trac?</h2>
              <p>If you think this should work and you can reproduce the problem,
              you should consider creating a bug report.</p>
              <p py:if="faulty_plugins" py:choose="len(faulty_plugins)">
                <py:when test="1"><i18n:msg params="name">
                  Note that the ${faulty_plugins[0].name} plugin seems to be involved.
                </i18n:msg></py:when>
                <py:otherwise>
                  Note that the following plugins seem to be involved:
                  ${', '.join([p.name for p in faulty_plugins])}
                </py:otherwise>
                <strong>Please report this issue to the plugin maintainer.</strong>
              </p>
              <p i18n:msg="" py:with="q = quote_plus(message[:80])">Before you do that, though, please first try
                <strong><a href="${tracker}/search?ticket=yes&amp;noquickjump=1&amp;q=$q">searching</a>
                for similar issues</strong>, as it is quite likely that this problem
                has been reported before. For questions about installation
                and configuration of Trac or its plugins, please try the
                <a href="${trac.homepage}wiki/MailingList">mailing list</a>
                instead of creating a ticket.
              </p>
              <form class="newticket" method="get" action="${tracker}/newticket">
                <p i18n:msg="create">Otherwise, please ${create_ticket(tracker)} a new bug report
                describing the problem and explain how to reproduce it.</p>
              </form>
              <py:if test="traceback">
                <h2>Python Traceback</h2>
                <div id="traceback">
                  Most recent call last:
                  <ul py:if="frames" style="display: none">
                    <li class="frame" py:for="idx, frame in enumerate(frames)">
                      <a href="#frame${idx}" id="frame${idx}"><span i18n:msg="file, line, function" py:strip="">
                        <span class="file">File "${frame.filename}",
                        line <strong>${frame.lineno + 1}</strong>, in</span>
                        <var>${frame.function}</var></span>
                      </a>
                      <div py:if="frame.line" class="source" style="display: none">
                        <h3>Code fragment:</h3>
                        <table class="code">
                          <thead><tr><th class="lineno">Line</th><th class="content"></th></tr></thead>
                          <tbody>
                            <tr py:for="i, line in enumerate(frame.lines_before + [frame.line] + frame.lines_after)"
                                class="${'current' if i == len(frame.lines_before) else None}">
                              <th>${frame.lineno + i + 1 - len(frame.lines_before)}</th><td>${line or u'\xa0'}</td>
                            </tr>
                          </tbody>
                        </table>
                      </div>
                      <div py:if="frame.vars" class="vars" style="display: none">
                        <h3>Local variables:</h3>
                        <table class="listing">
                          <thead><tr><th>Name</th><th>Value</th></tr></thead>
                          <tbody>
                            <tr py:for="idx, (name, value) in enumerate(sorted(frame.vars.items()))"
                                class="${'odd' if idx % 2 else None}">
                              <th scope="row"><var>$name</var></th>
                              <td><code>${shorten_line(repr(value))}</code></td>
                            </tr>
                          </tbody>
                        </table>
                      </div>
                    </li>
                  </ul>
                  <pre><py:for each="frame in frames"><i18n:msg params="file, line, function">File "${frame.filename}", line ${frame.lineno + 1}, in ${frame.function}</i18n:msg><py:if test="frame.line">
  ${frame.line.lstrip()}
</py:if></py:for><py:if test="not frames">${traceback}</py:if></pre>
                  <p style="display: none"><input type="button" id="tbtoggle" value="${_('Switch to plain text view')}" /></p>
                </div>
              </py:if>
              <h2>System Information:</h2>
              <table class="listing" id="systeminfo">
                <tr py:for="name, value in get_systeminfo()">
                  <th>$name</th>
                  <td>$value</td>
                </tr>
              </table>
              <py:if test="plugins">
                <h2>Enabled Plugins:</h2>
                <table class="listing" id="plugins">
                  <tr py:for="plugin in plugins">
                    <th py:with="url = plugin.info.home_page or plugin.info.author_email and 'mailto:' + plugin.info.author_email">
                      <a py:strip="not url" href="$url">$plugin.name</a>
                    </th>
                    <td>${plugin.version or _('N/A')}</td>
                    <td class="file"><a py:strip="'frame_idx' not in plugin" href="#frame$plugin.frame_idx">$plugin.path</a></td>
                  </tr>
                </table>
              </py:if>
            </py:otherwise>
          </py:choose>
        </py:when>
      </py:choose>
      <p>
        <a href="${href.wiki('TracGuide')}">TracGuide</a> &mdash; The Trac User and Administration Guide
      </p>
    </div>
  </body>
</html>
