<?xml version="1.0"?>
<!--
  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.
-->

<!-- $Id: generic.xsp 155806 2005-03-01 17:55:42Z andreas $ -->

<xsp:page 
    language="java" 
    xmlns:xsp="http://apache.org/xsp"
    xmlns:xsp-request="http://apache.org/xsp/request/2.0"
    xmlns:input="http://apache.org/cocoon/xsp/input/1.0"
    xmlns:i18n="http://apache.org/cocoon/i18n/2.1"    
    xmlns:wf="http://apache.org/cocoon/lenya/workflow/1.0"
    xmlns:uc="http://apache.org/cocoon/lenya/usecase/1.0"
    xmlns="http://apache.org/cocoon/lenya/menubar/1.0"
>

  <xsp:structure>
    <xsp:include>org.apache.lenya.cms.publication.Document</xsp:include>
    <xsp:include>org.apache.lenya.cms.publication.Publication</xsp:include>
  </xsp:structure>
  
  <menu>

    <menus>
      <menu i18n:attr="name" name="File">
        <block areas="site authoring" id="create">
          <item uc:usecase="sitemanagement.create" href="?doctype=cforms">
            <i18n:translate>
              <i18n:text>New ... Document</i18n:text>
              <i18n:param><i18n:text>resourceType-cforms</i18n:text></i18n:param>
            </i18n:translate>
          </item>
        </block>
      </menu>
      
      <menu i18n:attr="name" name="Edit">
          <xsp:logic>
            try {
                Object doc = <input:get-attribute module="page-envelope" as="object" name="document"/>;
                if (doc instanceof Document &amp;&amp; ((Document) doc).exists()) {
                    String doctype = <input:get-attribute module="page-envelope" as="string" name="document-type"/>;
                    if ("cforms".equals(doctype)) {
                        <block areas="authoring">
                          <item wf:event="edit" uc:usecase="cforms.edit" href="?"><i18n:text>With CForms</i18n:text></item>
                          <!-- TODO: add RelaxNG schemas for cforms doctype.
                          <item wf:event="edit" uc:usecase="editors.forms"><xsp:attribute name="href"><xsp:expr>"?form=" + doctype</xsp:expr></xsp:attribute><i18n:text>With Forms</i18n:text></item>
                          <item wf:event="edit" uc:usecase="editors.oneform" href="?"><i18n:text>With one Form</i18n:text></item>
                          -->
                        </block>
                    }
                }
            }
            catch (Exception e) {
                throw new ProcessingException("Error during menu generation: ", e);
            }
          </xsp:logic>
      </menu>
      
    </menus>
    
  </menu>
</xsp:page>
