<tal:comment replace="nothing">
  This macro shows the content of a layouted object, like a page or widget.
  It requires:
    contextObj         The Zope object on which we are working
    layoutType         The kind of layout: "view"? "edit"? "cell"?
    layout             The layout object that will dictate how object content
                       will be rendered.
  Options:
    contextMacro       The base folder containing the macros to call for
                       rendering the elements within the layout.
                       Defaults to portal.skyn
</tal:comment>
<metal:show define-macro="layout"
            tal:define="contextMacro contextMacro| python: portal.skyn">
 <table tal:attributes="cellpadding  layout/cellpadding;
                        cellspacing  layout/cellspacing;
                        width        layout/width;
                        align        layout/align;
                        class        layout/css_class;
                        style        layout/style">
   <tal:comment replace="nothing">The table header row</tal:comment>
   <tr tal:condition="layout/headerRow" tal:attributes="valign layout/headerRow/valign">
     <th tal:repeat="cell layout/headerRow/cells"
         tal:attributes="align cell/align; width cell/width;">
     </th>
   </tr>
   <tal:comment replace="nothing">The table content</tal:comment>
   <tr tal:repeat="row layout/rows" tal:attributes="valign row/valign">
     <td tal:repeat="cell row/cells"
         tal:attributes="align cell/align; colspan cell/colspan;
                         style python: test(repeat['cell'].end, '', 'padding-right: 0.4em')">
       <tal:content repeat="elem cell/content">
         <tal:field condition="python: elem == '?'">
           <metal:call use-macro="python: contextMacro.get(widget['type'].lower()).macros.get(layoutType)"/>
         </tal:field>
         <tal:other condition="python: elem != '?'">
           <metal:call use-macro="python: contextMacro.get(elem[0]).macros.get(elem[1])"/>
         </tal:other>
         <img tal:condition="not: repeat/elem/end" tal:attributes="src string: $portal_url/skyn/space.gif"/>
       </tal:content>
     </td>
   </tr>
 </table>
</metal:show>

<tal:comment replace="nothing">
  This macro displays the widget corresponding to a given field. It requires:
    contextObj         The Zope object for which this widget must be rendered
    page               The page where the widget lies
    layoutType         "edit"? "view"? "cell?"
    widget             The widget to render
</tal:comment>
<metal:field define-macro="field"
       tal:define="contextMacro    python: portal.skyn.widgets;
                   layout          python: widget['layouts'][layoutType];
                   name            widget/name;
                   sync            python: widget['sync'][layoutType];
                   rawValue        python: contextObj.getFieldValue(name, onlyIfSync=True, layoutType=layoutType);
                   value           python: contextObj.getFormattedFieldValue(name, rawValue);
                   requestValue    python: request.get(name, None);
                   inRequest       python: request.has_key(name);
                   errors          errors | python: ();
                   inError         python: (widget['name'] in errors) and True or False;
                   isMultiple      python: (widget['multiplicity'][1] == None) or (widget['multiplicity'][1] &gt; 1)">

  <metal:layout use-macro="here/skyn/widgets/show/macros/layout"/>
</metal:field>

<tal:comment replace="nothing">
  This macro displays the widget corresponding to a group of widgets.
  It requires:
    contextObj         The Zope object for which this widget must be rendered
    page               The page where the widget lies
    layoutType         "edit"? "view"? "cell?"
    widget             The widget to render
</tal:comment>
<metal:group define-macro="group">
  <fieldset tal:condition="python: widget['style'] == 'fieldset'">
    <legend tal:condition="widget/hasLabel">
      <i tal:content="structure python: contextObj.translate(widget['labelId'])"></i>
      <tal:help condition="widget/hasHelp">
        <metal:call use-macro="portal/skyn/widgets/show/macros/help"/>
      </tal:help>
    </legend>
    <div tal:condition="widget/hasDescr" class="discreet" 
         tal:content="structure python: contextObj.translate(widget['descrId'])"></div>
    <metal:content use-macro="portal/skyn/widgets/show/macros/groupContent"/>
  </fieldset>
  <tal:asSection condition="python: widget['style'] not in ('fieldset', 'tabs')">
    <metal:content use-macro="portal/skyn/widgets/show/macros/groupContent"/>
  </tal:asSection>
  <tal:asTabs condition="python: widget['style'] == 'tabs'">
  <table cellpadding="0" cellspacing="0"
         tal:attributes="width python: test(widget['wide'], '100%', '');
                         class widget/css_class">
    <tal:comment replace="nothing">First row: the tabs.</tal:comment>
    <tr valign="middle"><td style="border-bottom: 1px solid #ff8040">
      <table cellpadding="0" cellspacing="0" style="position:relative; bottom:-1px;">
        <tr valign="middle">
          <tal:tab repeat="widgetRow widget/widgets">
          <tal:id define="tabId python:'tab_%s_%d_%d' % (widget['name'], repeat['widgetRow'].number(), len(widget['widgets']))">
          <td><img tal:attributes="src string: $portal_url/skyn/tabLeft.png;
                                   id python: '%s_left' % tabId"/><td>
          <td tal:attributes="style python:'background-image: url(%s/skyn/tabBg.png)' % portal_url;
                              id tabId">
            <a style="cursor:pointer"
               tal:content="python: tool.translate('%s_col%d' % (widget['labelId'], repeat['widgetRow'].number()))"
               tal:attributes="onClick python: 'showTab(\'%s_%d_%d\')' % (widget['name'], repeat['widgetRow'].number(), len(widget['widgets']))"></a>
          </td>
          <td><img tal:attributes="src string: $portal_url/skyn/tabRight.png;
                                   id python: '%s_right' % tabId"/><td>
          </tal:id>
          </tal:tab>
        </tr>
      </table>
    </td></tr>
    <tal:comment replace="nothing">Other rows: the widgets.</tal:comment>
    <tr tal:repeat="widgetRow widget/widgets"
        tal:attributes="id python: 'tabcontent_%s_%d_%d' % (widget['name'], repeat['widgetRow'].number(), len(widget['widgets']));
                        style python: test(repeat['widgetRow'].number()==1, 'display:table-row', 'display:none')">
      <td tal:define="widget python: widgetRow[0]">
        <tal:group condition="python: widget['type'] == 'group'">
          <metal:call use-macro="portal/skyn/widgets/show/macros/group"/>
        </tal:group>
        <tal:field condition="python: widget['type'] != 'group'">
          <metal:call use-macro="portal/skyn/widgets/show/macros/field"/>
        </tal:field>
      </td>
    </tr>
  </table>
  <script language="javascript"
          tal:content="python: 'initTab(\'tab_%s\', \'%s_1_%d\')' % (widget['name'], widget['name'], len(widget['widgets']))"></script>
  </tal:asTabs>
</metal:group>

<tal:comment replace="nothing">
  This macro displays the content of a group of widgets.
  It is exclusively called by macro "group" above.
</tal:comment>
<table metal:define-macro="groupContent"
       tal:attributes="width python: test(widget['wide'], '100%', '');
                       align widget/align;
                       class widget/css_class;
                       cellspacing widget/cellspacing;
                       cellpadding widget/cellpadding">
  <tal:comment replace="nothing">Display the title of the group if it is not rendered a fieldset.</tal:comment>
  <tr tal:condition="python: (widget['style'] != 'fieldset') and widget['hasLabel']">
    <td tal:attributes="colspan python: len(widget['columnsWidths']);
                        class widget/style" align="left">
      <span tal:replace="structure python: contextObj.translate(widget['labelId'])"/>
      <tal:help condition="widget/hasHelp">
        <metal:call use-macro="portal/skyn/widgets/show/macros/help"/>
      </tal:help>
    </td>
  </tr>
  <tr tal:condition="python: (widget['style'] != 'fieldset') and widget['hasDescr']">
    <td tal:attributes="colspan python: len(widget['columnsWidths'])" class="discreet"
        tal:content="structure python: contextObj.translate(widget['descrId'])">
    </td>
  </tr>
  <tr> <tal:comment replace="nothing">The column headers</tal:comment>
    <th tal:repeat="colNb python:range(len(widget['columnsWidths']))"
        tal:attributes="width python:widget['columnsWidths'][colNb];
                        align python:widget['columnsAligns'][colNb]"
        tal:content="structure python: test(widget['hasHeaders'], contextObj.translate('%s_col%d' % (widget['labelId'], colNb+1)), '')">
    </th>
  </tr>
  <tal:comment replace="nothing">The rows of widgets</tal:comment>
  <tr tal:attributes="valign widget/valign" tal:repeat="widgetRow widget/widgets">
    <td tal:repeat="widget widgetRow"
        tal:attributes="colspan widget/colspan|python:1;
                        style python: test(repeat['widget'].number() != len(widgetRow), 'padding-right: 0.6em', '')">
      <tal:showWidget condition="widget">
        <tal:group condition="python: widget['type'] == 'group'">
          <metal:call use-macro="portal/skyn/widgets/show/macros/group"/>
        </tal:group>
        <tal:field condition="python: widget['type'] != 'group'">
          <metal:call use-macro="portal/skyn/widgets/show/macros/field"/>
        </tal:field>
      </tal:showWidget>
    </td>
  </tr>
</table>

<tal:comment replace="nothing">Displays a field label.</tal:comment>
<tal:label metal:define-macro="label" condition="widget/hasLabel">
  <label tal:attributes="for widget/name"
         tal:condition="python: not ((widget['type'] == 'Action') or ((widget['type'] == 'Ref') and (widget['add'])))"
         tal:content="structure python: contextObj.translate(widget['labelId'])"></label>
</tal:label>

<tal:comment replace="nothing">Displays a field description.</tal:comment>
<tal:description metal:define-macro="description" condition="widget/hasDescr">
  <span class="discreet" tal:content="structure python: contextObj.translate(widget['descrId'])"></span>
</tal:description>

<tal:comment replace="nothing">Displays a field help.</tal:comment>
<tal:help metal:define-macro="help">
  <acronym tal:attributes="title python: contextObj.translate(widget['helpId'])">
    <img tal:attributes="src string: $portal_url/skyn/help.png"/>
  </acronym>
</tal:help>

<tal:comment replace="nothing">Displays validation-error-related info about a field.</tal:comment>
<tal:validation metal:define-macro="validation">
  <acronym tal:condition="inError" tal:attributes="title python: errors[name]">
    <img tal:attributes="src string: $portal_url/skyn/warning.png"/>
  </acronym>
  <img tal:condition="not: inError" tal:attributes="src string: $portal_url/skyn/warning_no.png"/>
</tal:validation>

<tal:comment replace="nothing">Displays the fact that a field is required.</tal:comment>
<tal:required metal:define-macro="required"><img tal:attributes="src string: $portal_url/skyn/required.png"/></tal:required>