<%inherit file="bazki.templates.edit.base"/>

<%!
from bazbase import conversion, renderer, cache
from bazbase.benchmark import benchmarking
from bazbase.wiki import NoContentException
from bazki.getting import get_url_for, has_get_url, attachment_url_for
from bazki.translators import url
from bazki.util import jsarg_escape
from bazbase.flavors import FLAVORS
from bazbase.db import get_log
%>

<%def name="render_title()">Element ${element.ename} - ${parent.render_title()}</%def>

<%def name="head()">
<%
hbm = benchmarking("head")
hbm.__enter__()
%>
${parent.head()}
<script type="text/javascript" src="${url('/bazki/javascript/element.js')}">
</script>
<%
hbm.__exit__(None, None, None)
%>
</%def>

<%def name="savebuttons(primary)">
%if preview:
<div class="savediv preview">
%else:
<div class="savediv">
<span class="savebuttons">
%endif
<label>
  Commit Message:
  <input type="text"
%if primary:
         id="commit_message" name="commit_message"
%endif
         class="commit_clone" onchange="sync_commit(this.value)"
         value="${commit_message}" /><br/>
</label>
<input type="submit" value="Save" onclick="window.onbeforeunload = null"/>
%if preview:
<a href="./${element.ename}">Discard Changes</a>
<span class="savebuttons">
%endif
<input type="submit" name="preview" value="Preview"
       onclick="window.onbeforeunload = null"/>
</span>
</div>
</%def>

<h1>
%if preview:
Preview of
%endif
<%
parent_element = element.get_parent()
%>
%if parent_element is None:
Root
%endif
Element '${element.ename}'</h1>

<%
remainder = []
%>

<form action="./${element.ename}" method="post" enctype="multipart/form-data"
      id="form">

%for a in args:
%if a.startswith('remove_'):
<input type="hidden" name="${a}" value="${args[a]}" />
%endif
%endfor

<div id="parents">
%for e in element.get_ancestors():
    / <a href="${url(e.ename)}">${e.ename}</a>
%endfor
%if parent_element is not None:
<a class="editlink" href="javascript:edit_parent('${parent_element.ename}');">change parent</a>
%endif
</div>

%if parent_element is not None:
<div class="siblings">
<% sibs = parent_element.get_children() %>
Siblings (${len(sibs)}): ${', '.join('<a href="./%s">%s</a>' % (e.ename,
                                                                e.ename)
                           for e in sorted(sibs, key=lambda e: e.ename))|n}
</div>
%endif

<div class="children">
<% kids = element.get_children() %>
%if len(kids) > 0:
Children (${len(kids)}): ${', '.join('<a href="./%s">%s</a>' % (e.ename,
                                                                e.ename)
                           for e in sorted(kids, key=lambda e: e.ename))|n}
%endif
</div>

<div class="producing">
%if has_get_url(element):
  Produce as <a href="${get_url_for(element,type='.html')}">html</a>, 
     <a href="${get_url_for(element,type='.tex')}">tex</a>, 
     <a href="${get_url_for(element,type='.ps')}">ps</a>, 
     <a href="${get_url_for(element,type='.pdf')}">pdf</a>
<%
pdfinfo = conversion.cached(element.ename, u'product', u'pdfinfo')
if pdfinfo is None:
    remainder.append(u'product>pdfinfo')
%>
%if pdfinfo is None:
     (<span id="async-product>pdfinfo"><span class="loading">Page count loading...</span></span>)
%else:
     (${pdfinfo})
%endif
##  %if 'stuff' in element:
##    <br />
##    Produce with stuff as 
##       <a href="${get_url_for(element,type='html',withStuff=True)}">html</a>, 
##       <a href="${get_url_for(element,type='ps',withStuff=True)}">ps</a>, 
##       <a href="${get_url_for(element,type='pdf',withStuff=True)}">pdf</a>
##  %endif
%endif
</div>

${savebuttons(True)}

<table class="proptable" id="proptable"><tbody id="ptbody">

<%
even=True
with benchmarking("metadata"):
    final_map = element.get_final_map()
    value_map = element.get_value_map()
    flavor_map = element.get_flavor_map()
with benchmarking("sorting keys"):
    keys = sorted(element.list_props(), key=lambda k: k in final_map)
nice_value_map = None
midsaved = False
%>
%for k in keys:
<%
bm = benchmarking("entry for %s" % k)
bm.__enter__()

value = unicode(value_map[k].value, 'utf-8')
flavor = flavor_map[k]

final = final_map.get(k, False)
if final and not FLAVORS[flavor].quick:
    rendering = conversion.cached(element.ename, k, u'html')
else:
    try:
        rendering = conversion.convert_any(element.ename, k, [u'html']).asData()
    except NoContentException:
        rendering = "<em>No Content</em>"

if rendering is None and not FLAVORS[flavor].binary:
    if nice_value_map is None:
        nice_value_map = element.get_nice_value_map()
    nice_value = nice_value_map[k]
    if nice_value.startswith('<<') or nice_value.endswith('>>'):
        nice_value = None
else:
    nice_value = None
if rendering is None:
    remainder.append(k)
%>
%if final and not midsaved:
<tr>
<td colspan="3">
${savebuttons(False)}
</td>
</tr>
<% midsaved=True %>
%endif
<tr class="${'even' if even else 'odd'}${' locked' if final else ''}">
  <th class="head" id="head-${k}">
%if 'orig_'+k in args:
    <input type="hidden" name="orig_${k}" id="orig_${k}"
           value="${args['orig_'+k]}" />
%endif
    <a href="property/${k}">${k}</a> (${flavor})</a>
  </th>
  <td class="value" id="value-${k}">
%if 'set_'+k in args:
  <input type="hidden" name="set_${k}" value="${args['set_'+k]}" />
%endif
%if rendering is None:
    <div id="async-${k}">
%if nice_value is None:
      <div class="loading">Loading...</div>
%else:
      <pre class="loading">${nice_value}</pre>
%endif
    </div>
%else:
    <div>
      ${rendering|n}
    </div>
%endif
  </td>
  <td class="revision">
%if FLAVORS[flavor].binary:
    <a id="editize-${k}" class="editlink" href="javascript:blobize('${k}');">replace</a> 
%else:
    <a id="editize-${k}" class="editlink" href="javascript:editize('${k}','${jsarg_escape(value)|n}');">${'edit' if not final else 'default'}</a> 
  %if final:
    from <a href="${final}#head-${k}">${final}</a>
  %endif
%endif
    <div id="editfields-${k}" class="editfields">
      <label><input name="remove_${k}" type="checkbox" value="1" />Reset</label>
      <br/>
      <a href="javascript:toggle_codemirror('${k}')">Toggle rich editor</a>
      <br/>
      Delta: <span id="delta_${k}">+0</span>
      <br/>
      <a href="javascript:show_diff('${k}')">Show diff</a>
    </div>
  </td>
</tr>
<%
bm.__exit__(None, None, None)
even=not even
%>
%endfor
</tbody></table>

%if not preview:
<div>
<label>Add Property Named: <input id="newpropname" type="text"/></label> <input type="button" value="Add Property" onclick="newprop();"/>
</div>
%endif

##<div>
##<label>Display format: <select name="orgmode" onchange="save_enable()">
##<option value="normal"${' selected' if element.orgmode == 'normal' else ''}>Normal</option>
##<option value="list"${' selected' if element.orgmode == 'list' else ''}>List with children</option>
##<option value="toplevel"${' selected' if element.orgmode == 'toplevel' else ''}>Toplevel (major category)</option>
##</select></label>
##</div>

${savebuttons(False)}

<h3>Operations:</h3>
<div>
<label>Rename element '${element.ename}' to: <input type="text" name="newname" /></label> <input type="submit" name="rename" value="Rename" /><br />
%if parent_element is not None:
<input type="submit" name="delete" value="Delete Element '${element.ename}'" 
       onclick="window.onbeforeunload = null; return confirm('Are you sure you want to delete the element \'${element.ename}\'?');" />
%endif
</div>

</form>

<div id="operations">
<form action="new" method="post">
<label>Add New Child (a ${element.ename}): <input type="text" name="ename" /></label> 
<input type="hidden" name="parent" value="${element.ename}" />
<input type="submit" value="Add" />
</form>
%if parent_element is not None:
<form action="new" method="post">
<label>Add New Sibling (a ${parent_element.ename}): <input type="text" name="ename" /></label> 
<input type="hidden" name="parent" value="${parent_element.ename}" />
<input type="submit" value="Add" />
</form>
%endif
</div>

<div id="diffscreen" onclick="this.className = ''">
<div class="margin"></div>
<div id="diffbox">
</div>
</div>

%if remainder and not nothreads:
<%
renderer.start_render(element.ename, remainder, u'html')
%>
<script type="text/javascript" src="${url('/edit/propvals/' + element.ename
                                    + '/html?' + '&'.join(remainder))|n}"
        async="async"></script>
%endif

<pre class="log">
${get_log()}
</pre>
