+- Initial build.
+
diff --git a/ccm-bundle/bundles/standard/NEWS b/ccm-bundle/bundles/standard/NEWS
new file mode 100644
index 000000000..e69de29bb
diff --git a/ccm-bundle/bundles/standard/README b/ccm-bundle/bundles/standard/README
new file mode 100644
index 000000000..e69de29bb
diff --git a/ccm-bundle/bundles/standard/bundle.in b/ccm-bundle/bundles/standard/bundle.in
new file mode 100644
index 000000000..0bed0eda7
--- /dev/null
+++ b/ccm-bundle/bundles/standard/bundle.in
@@ -0,0 +1,4 @@
+BUNDLE_NAME=aplaws-plus-shp
+BUNDLE_PRETTY_NAME="APLAWS+ SHP Standard Bundle"
+VERSION=1.0.5devel
+RELEASE=1
diff --git a/ccm-bundle/etc/servlet-declarations.xml b/ccm-bundle/etc/servlet-declarations.xml
new file mode 100644
index 000000000..1093f614a
--- /dev/null
+++ b/ccm-bundle/etc/servlet-declarations.xml
@@ -0,0 +1,23 @@
+
+ TextOnlyServlet
+ Text Only Servlet
+
+ com.arsdigita.web.InternalPrefixerServlet
+
+
+ prefix
+ /text
+
+
+
+
+ PrintFriendlyServlet
+ Printer Friendly Output Servlet
+
+ com.arsdigita.web.InternalPrefixerServlet
+
+
+ prefix
+ /print
+
+
diff --git a/ccm-bundle/etc/servlet-mappings.xml b/ccm-bundle/etc/servlet-mappings.xml
new file mode 100644
index 000000000..54d31d105
--- /dev/null
+++ b/ccm-bundle/etc/servlet-mappings.xml
@@ -0,0 +1,10 @@
+
+ TextOnlyServlet
+ /text/*
+
+
+
+ PrintFriendlyServlet
+ /print/*
+
+
diff --git a/ccm-bundle/sql/upgrade/default/0.0.0-6.6.0/upd_nav_templates_table.sql b/ccm-bundle/sql/upgrade/default/0.0.0-6.6.0/upd_nav_templates_table.sql
new file mode 100644
index 000000000..9162b36c7
--- /dev/null
+++ b/ccm-bundle/sql/upgrade/default/0.0.0-6.6.0/upd_nav_templates_table.sql
@@ -0,0 +1,92 @@
+--
+-- Copyright (C) 2011 Peter Boy All Rights Reserved.
+--
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public License
+-- as published by the Free Software Foundation; either version 2.1 of
+-- the License, or (at your option) any later version.
+--
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+-- Lesser General Public License for more details.
+--
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+--
+-- $DateTime: 2011/11/10 23:15:09 $
+-- $Id: upd_nav_templates_table pboy $
+
+-- Internal use at Bremen University only!
+-- Updates various university sites from als ccm-xxx-aplaws to scm-sci-bundle
+
+-- Update new path
+update nav_templates
+ set url=replace(url,'packages/navigation/templates'
+ ,'templates/ccm-navigation/navigation')
+ where url like '%packages/navigation/templates%';
+
+
+-- AAP: update jsp names
+update nav_templates
+ set url=replace(url,'aap-atoz','sci-atoz'),
+ description=replace(description,'AAP','SCI'),
+ title=replace(title,'AAP','SCI')
+ where url like '%aap-atoz%';
+
+update nav_templates
+ set url=replace(url,'aap-default' ,'sci-default'),
+ description=replace(description,'AAP','SCI'),
+ title=replace(title,'AAP','SCI')
+ where url like '%aap-default%';
+
+update nav_templates
+ set url=replace(url,'aap-portal' ,'sci-portal'),
+ description=replace(description,'AAP','SCI'),
+ title=replace(title,'AAP','SCI')
+ where url like '%aap-portal%';
+
+update nav_templates
+ set url=replace(url,'aap-recent' ,'sci-recent'),
+ description=replace(description,'AAP','SCI'),
+ title=replace(title,'AAP','SCI')
+ where url like '%aap-recent%';
+
+update nav_templates
+ set url=replace(url,'aap-welcome' ,'sci-welcome'),
+ description=replace(description,'AAP','SCI'),
+ title=replace(title,'AAP','SCI')
+ where url like '%aap-welcome%';
+
+
+-- IAW: update jsp names
+update nav_templates
+ set url=replace(url,'iaw-atoz','sci-atoz'),
+ description=replace(description,'IAW','SCI'),
+ title=replace(title,'IAW','SCI')
+ where url like '%iaw-atoz%';
+
+update nav_templates
+ set url=replace(url,'iaw-default' ,'sci-default'),
+ description=replace(description,'IAW','SCI'),
+ title=replace(title,'IAW','SCI')
+ where url like '%iaw-default%';
+
+update nav_templates
+ set url=replace(url,'iaw-portal' ,'sci-portal'),
+ description=replace(description,'IAW','SCI'),
+ title=replace(title,'IAW','SCI')
+ where url like '%iaw-portal%';
+
+update nav_templates
+ set url=replace(url,'iaw-recent' ,'sci-recent'),
+ description=replace(description,'IAW','SCI'),
+ title=replace(title,'IAW','SCI')
+ where url like '%iaw-recent%';
+
+update nav_templates
+ set url=replace(url,'iaw-welcome' ,'sci-welcome'),
+ description=replace(description,'IAW','SCI'),
+ title=replace(title,'IAW','SCI')
+ where url like '%iaw-welcome%';
diff --git a/ccm-bundle/sql/upgrade/default/0.0.0-6.6.0/upd_system_tables.sql b/ccm-bundle/sql/upgrade/default/0.0.0-6.6.0/upd_system_tables.sql
new file mode 100644
index 000000000..636401d60
--- /dev/null
+++ b/ccm-bundle/sql/upgrade/default/0.0.0-6.6.0/upd_system_tables.sql
@@ -0,0 +1,68 @@
+--
+-- Copyright (C) 2011 Peter Boy All Rights Reserved.
+--
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public License
+-- as published by the Free Software Foundation; either version 2.1 of
+-- the License, or (at your option) any later version.
+--
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+-- Lesser General Public License for more details.
+--
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+--
+-- $Id: upd_system_tables.sql pboy $
+
+-- adjust various system tables to the new name of application (ccm-sci-bundle)
+
+alter table init_requirements drop constraint init_requirements_init_f_cmmdn ;
+
+alter table init_requirements drop constraint init_require_requ_init_f_i6rgg ;
+
+update inits
+ set class_name=replace(class_name,'arsdigita.aplaws', 'arsdigita.bundle')
+ where class_name like '%arsdigita.aplaws%' ;
+
+update init_requirements
+ set init=replace(init,'arsdigita.aplaws', 'arsdigita.bundle')
+ where init like '%arsdigita.aplaws%' ;
+
+update init_requirements
+ set required_init=replace(required_init,'arsdigita.aplaws', 'arsdigita.bundle')
+ where required_init like '%arsdigita.aplaws%' ;
+
+ALTER TABLE ONLY init_requirements
+ ADD CONSTRAINT init_requirements_init_f_cmmdn FOREIGN KEY (init)
+ REFERENCES inits (class_name) MATCH SIMPLE
+ ON UPDATE NO ACTION ON DELETE NO ACTION;
+
+ALTER TABLE init_requirements
+ ADD CONSTRAINT init_require_requ_init_f_i6rgg FOREIGN KEY (required_init)
+ REFERENCES inits (class_name) MATCH SIMPLE
+ ON UPDATE NO ACTION ON DELETE NO ACTION;
+
+
+-- update application_types
+-- set object_type=replace(object_type,'london.portal', 'portalworkspace')
+-- where object_type like '%london.portal%' ;
+
+-- table applications doesn't require an update
+
+-- update apm_package_types
+-- set package_key=replace(package_key,'workspace', 'portalworkspace')
+-- where package_key like 'workspace' ;
+
+-- table apm_packages doesn't require an update either
+-- table site_nodes doesn't require an update either
+
+
+-- update application type in acs_objects
+update acs_objects
+ set (object_type,default_domain_class) =
+ (replace(object_type,'arsdigita.aplaws', 'arsdigita.bundle') ,
+ replace(default_domain_class,'arsdigita.aplaws', 'arsdigita.bundle') )
+ where object_type like '%arsdigita.aplaws%' ;
diff --git a/ccm-bundle/sql/upgrade/oracle-se-0.0.0-6.6.0.sql b/ccm-bundle/sql/upgrade/oracle-se-0.0.0-6.6.0.sql
new file mode 100755
index 000000000..6986ce216
--- /dev/null
+++ b/ccm-bundle/sql/upgrade/oracle-se-0.0.0-6.6.0.sql
@@ -0,0 +1,26 @@
+--
+-- Copyright (C) 2011 Peter Boy All Rights Reserved.
+--
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public License
+-- as published by the Free Software Foundation; either version 2.1 of
+-- the License, or (at your option) any later version.
+--
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+-- Lesser General Public License for more details.
+--
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+--
+-- $DateTime: 2011/11/10 23:15:09 $
+-- $Id: oracle-se-0.0.0-6.6.0 pboy $
+
+-- Internal use at Bremen University only!
+-- Updates various university sites from als ccm-xxx-aplaws to scm-sci-bundle
+
+@@ default/0.0.0-6.6.0/upd_system_tables.sql
+@@ default/0.0.0-6.6.0/upd_nav_templates_table.sql
+
diff --git a/ccm-bundle/sql/upgrade/postgres-0.0.0-6.6.0.sql b/ccm-bundle/sql/upgrade/postgres-0.0.0-6.6.0.sql
new file mode 100755
index 000000000..fcccc1630
--- /dev/null
+++ b/ccm-bundle/sql/upgrade/postgres-0.0.0-6.6.0.sql
@@ -0,0 +1,31 @@
+--
+-- Copyright (C) 2011 Peter Boy All Rights Reserved.
+--
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public License
+-- as published by the Free Software Foundation; either version 2.1 of
+-- the License, or (at your option) any later version.
+--
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+-- Lesser General Public License for more details.
+--
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+--
+-- $DateTime: 2011/11/10 23:15:09 $
+-- $Id: postgres-0.0.0-6.6.0 pboy $
+
+\echo Red Hat Enterprise ccm-sci-bundle 0.0.0 -> 6.6.0 Upgrade Script (PostgreSQL)
+
+-- Internal use at Bremen University only!
+-- Updates various university sites from als ccm-xxx-aplaws to scm-sci-bundle
+
+begin;
+
+\i default/0.0.0-6.6.0/upd_system_tables.sql
+\i default/0.0.0-6.6.0/upd_nav_templates_table.sql
+
+commit;
diff --git a/ccm-bundle/src/WEB-INF/resources/scientificCMS-stylesheet-paths.txt b/ccm-bundle/src/WEB-INF/resources/scientificCMS-stylesheet-paths.txt
new file mode 100644
index 000000000..df964c308
--- /dev/null
+++ b/ccm-bundle/src/WEB-INF/resources/scientificCMS-stylesheet-paths.txt
@@ -0,0 +1,47 @@
+# -*- text -*-
+# This file locates stylesheets, if you are using the
+# "PatternStylesheetResolver". Please read the Javadoc for that file for
+# the full story.
+
+# Output type is for things such as text/javascript
+http://::host::/resource/::webapp::/__ccm__/apps/::application::/xsl/::url::-::outputtype::-::locale::.xsl
+http://::host::/resource/::webapp::/__ccm__/apps/::application::/xsl/::url::-::outputtype::.xsl
+
+# Grabs custom item xsl for CMS
+http://::host::/__ccm__/servlet/content-item/index.xsl?oid=::item_template_oid::&delegated=::item_delegated_url::
+
+# added by Quasimodo
+# Theme with single entry point (e.g Mandalay)
+http://::host::/resource/::webapp::/themes/::themedir::/::theme::/start.xsl
+
+# Theme, with optional locale & prefix
+http://::host::/resource/::webapp::/themes/::themedir::/::theme::/::application::-::url::-::prefix::-::locale::.xsl
+http://::host::/resource/::webapp::/themes/::themedir::/::theme::/::application::-::url::-::prefix::.xsl
+
+# Theme, with optional locale
+http://::host::/resource/::webapp::/themes/::themedir::/::theme::/::application::-::url::-::locale::.xsl
+http://::host::/resource/::webapp::/themes/::themedir::/::theme::/::application::-::url::.xsl
+
+# APLAWS generic default, with locale and prefix
+# XXX change ROOT -> ccm-ldn-aplaws
+http://::host::/resource/ROOT/themes/static/aplaws-generic/::application::-::url::-::prefix::-::locale::.xsl
+http://::host::/resource/ROOT/themes/static/aplaws-generic/::application::-::url::-::prefix::.xsl
+http://::host::/resource/ROOT/__ccm__/themes/aplaws-generic/::application::-::url::-::prefix::-::locale::.xsl
+http://::host::/resource/ROOT/__ccm__/themes/aplaws-generic/::application::-::url::-::prefix::.xsl
+
+# APLAWS generic default, with locale
+# XXX change ROOT -> ccm-ldn-aplaws
+http://::host::/resource/ROOT/themes/static/aplaws-generic/::application::-::url::-::locale::.xsl
+http://::host::/resource/ROOT/themes/static/aplaws-generic/::application::-::url::.xsl
+http://::host::/resource/ROOT/__ccm__/themes/aplaws-generic/::application::-::url::-::locale::.xsl
+http://::host::/resource/ROOT/__ccm__/themes/aplaws-generic/::application::-::url::.xsl
+
+# Global default, from application's own web app
+http://::host::/resource/::webapp::/__ccm__/apps/::application::/xsl/::url::-::locale::.xsl
+http://::host::/resource/::webapp::/__ccm__/apps/::application::/xsl/::url::.xsl
+
+# Global default, from application's own web app - relocated version >= 6.6.1
+http://::host::/resource/ROOT/themes/heirloom/apps/::application::/xsl/::url::-::locale::.xsl
+http://::host::/resource/ROOT/themes/heirloom/apps/::application::/xsl/::url::.xsl
+http://::host::/resource/::webapp::/themes/heirloom/apps/::application::/xsl/::url::-::locale::.xsl
+http://::host::/resource/::webapp::/themes/heirloom/apps/::application::/xsl/::url::.xsl
diff --git a/ccm-bundle/src/ccm-bundle.config b/ccm-bundle/src/ccm-bundle.config
new file mode 100644
index 000000000..2388ec38f
--- /dev/null
+++ b/ccm-bundle/src/ccm-bundle.config
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/ccm-bundle/src/ccm-bundle.load b/ccm-bundle/src/ccm-bundle.load
new file mode 100644
index 000000000..758485901
--- /dev/null
+++ b/ccm-bundle/src/ccm-bundle.load
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/src/ccm-bundle.upgrade b/ccm-bundle/src/ccm-bundle.upgrade
new file mode 100755
index 000000000..ffa6136ae
--- /dev/null
+++ b/ccm-bundle/src/ccm-bundle.upgrade
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/ccm-bundle/src/com/arsdigita/bundle/Bundle.java.nolongerInUse b/ccm-bundle/src/com/arsdigita/bundle/Bundle.java.nolongerInUse
new file mode 100644
index 000000000..4f6d74d7e
--- /dev/null
+++ b/ccm-bundle/src/com/arsdigita/bundle/Bundle.java.nolongerInUse
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2002-2005 Runtime Collective Ltd. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+package com.arsdigita.aplaws;
+
+import org.apache.log4j.Logger;
+
+public class Aplaws {
+ public static final String versionId =
+ "$Id: Aplaws.java 1297 2006-08-25 18:17:50Z apevec $";
+
+ private static final Logger LOG = Logger.getLogger(Aplaws.class);
+
+ private static AplawsConfig aplawsConfig = new AplawsConfig();
+
+ static {
+ aplawsConfig.load();
+ }
+
+ public static final AplawsConfig getAplawsConfig() {
+ return aplawsConfig;
+ }
+}
diff --git a/ccm-bundle/src/com/arsdigita/bundle/BundleConfig.java.nolongerInUse b/ccm-bundle/src/com/arsdigita/bundle/BundleConfig.java.nolongerInUse
new file mode 100644
index 000000000..8be495ad3
--- /dev/null
+++ b/ccm-bundle/src/com/arsdigita/bundle/BundleConfig.java.nolongerInUse
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2002-2005 Runtime Collective Ltd. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+package com.arsdigita.aplaws;
+
+import com.arsdigita.runtime.AbstractConfig;
+import com.arsdigita.util.parameter.Parameter;
+import com.arsdigita.util.parameter.BooleanParameter;
+import com.arsdigita.util.parameter.StringParameter;
+
+/**
+ * AplawsConfig
+ *
+ * @version $Revision: 1.2 $ $Date: 2005/01/07 19:01:40 $
+ * @version $Id: AplawsConfig.java 1565 2007-04-18 16:46:14Z apevec $
+ */
+public class AplawsConfig extends AbstractConfig {
+
+ private final Parameter m_ajaxExpandAllBranches = new BooleanParameter(
+ "com.arsdigita.aplaws.ajax_expand_on_all_branches",
+ Parameter.OPTIONAL,
+ Boolean.FALSE);
+
+
+
+ public AplawsConfig() {
+ register(m_ajaxExpandAllBranches);
+ loadInfo();
+ }
+
+
+
+ public boolean ajaxExpandAllBranches () {
+ return ((Boolean)get(m_ajaxExpandAllBranches)).booleanValue();
+ }
+}
diff --git a/ccm-bundle/src/com/arsdigita/bundle/BundleConfig_parameter.properties.nolongerInUse b/ccm-bundle/src/com/arsdigita/bundle/BundleConfig_parameter.properties.nolongerInUse
new file mode 100644
index 000000000..b4de56826
--- /dev/null
+++ b/ccm-bundle/src/com/arsdigita/bundle/BundleConfig_parameter.properties.nolongerInUse
@@ -0,0 +1,4 @@
+com.arsdigita.aplaws.ajax_expand_on_all_branches.title=Use Ajax on all branch expansions
+com.arsdigita.aplaws.ajax_expand_on_all_branches.purpose=Use Ajax on all branches, or bring back entire subtree on expansion of top level root
+com.arsdigita.aplaws.ajax_expand_on_all_branches.example=true|false
+com.arsdigita.aplaws.ajax_expand_on_all_branches.format=[boolean]
diff --git a/ccm-bundle/src/com/arsdigita/bundle/Initializer.java b/ccm-bundle/src/com/arsdigita/bundle/Initializer.java
new file mode 100644
index 000000000..7d87802c1
--- /dev/null
+++ b/ccm-bundle/src/com/arsdigita/bundle/Initializer.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+package com.arsdigita.bundle;
+
+import com.arsdigita.categorization.Categorization;
+import com.arsdigita.runtime.CompoundInitializer;
+import com.arsdigita.runtime.DomainInitEvent;
+import com.arsdigita.templating.PatternStylesheetResolver;
+
+import com.arsdigita.london.terms.TermCategoryListener;
+
+import org.apache.log4j.Logger;
+
+
+/**
+ * The CCM bundle initializer.
+ *
+ * @version $Id: Initializer.java 1232 2006-06-22 12:01:30Z sskracic $
+ */
+public class Initializer extends CompoundInitializer {
+
+ private static Logger s_log = Logger.getLogger
+ (Initializer.class.getName());
+
+
+ /**
+ * Package Implementation of {@link Initializer#init(DomainInitEvent)}.
+ *
+ * @param evt
+ */
+ @Override
+ public void init(DomainInitEvent evt) {
+ super.init(evt);
+
+ Categorization.addCategoryListener(new TermCategoryListener());
+
+ PatternStylesheetResolver.registerPatternGenerator(
+ "webapp",
+ new WebAppPatternGenerator()
+ );
+ }
+}
diff --git a/ccm-bundle/src/com/arsdigita/bundle/Loader.java b/ccm-bundle/src/com/arsdigita/bundle/Loader.java
new file mode 100644
index 000000000..2314eca07
--- /dev/null
+++ b/ccm-bundle/src/com/arsdigita/bundle/Loader.java
@@ -0,0 +1,307 @@
+/*
+ * Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+package com.arsdigita.bundle;
+
+import com.arsdigita.london.terms.Domain;
+import com.arsdigita.london.terms.importer.Parser;
+
+import com.arsdigita.categorization.Category;
+import com.arsdigita.categorization.RootCategoryCollection;
+import com.arsdigita.cms.ContentSection;
+import com.arsdigita.cms.SecurityManager;
+import com.arsdigita.cms.ui.role.RoleFactory;
+import com.arsdigita.loader.PackageLoader;
+import com.arsdigita.kernel.Role;
+import com.arsdigita.kernel.RoleCollection;
+import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
+import com.arsdigita.persistence.DataQuery;
+import com.arsdigita.runtime.ScriptContext;
+import com.arsdigita.util.parameter.Parameter;
+import com.arsdigita.util.parameter.StringArrayParameter;
+import com.arsdigita.web.Application;
+
+import org.apache.log4j.Logger;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+/**
+ * Loader executes nonrecurring at install time and loads (installs and
+ * initializes) the ScientificCMS integration module persistently into database.
+ *
+ * Creates category domains in the terms application according to
+ * configuration files and adds jsp templates to navigation.
+ *
+ * @author Justin Ross <jross@redhat.com>
+ * @author Peter Boy <pboy@barkhof.uni-bremen.de>
+ * @version $Id: Loader.java 755 2005-09-02 13:42:47Z sskracic $
+ */
+public class Loader extends PackageLoader {
+
+ /** Logger instance for debugging */
+ private static final Logger s_log = Logger.getLogger(Loader.class);
+
+ /**
+ * List of comma separated sets of application instance specifications,
+ * optionally used to create arbitrary custom application instances
+ * according to local sites requirements.
+ * It's the developers / administrators responsibility to ensure all
+ * necessary application types have been created previously.
+ * Example:
+ * "FULL_QUALIFIED_CLASS_NAME : URL : TITLE ,
+ * FULL_QUALIFIED_CLASS_NAME : URL : TITLE ,
+ * .... ,
+ * FULL_QUALIFIED_CLASS_NAME : URL : TITLE "
+ */
+ private Parameter m_customApplicationInstances = new StringArrayParameter(
+ "com.arsdigita.bundle.local_app_instances",
+ Parameter.OPTIONAL, null
+ );
+
+ /**
+ * Comma separated list of fully qualified filenames, each file containing
+ * a set of Terms domain catagories definitions. These form an initial set
+ * of category tree(s), at minimum for navigation, optionally additional
+ * domains.
+ * Files are stored as part of the jar, so classloader can find them.
+ */
+ private Parameter m_categoryFiles = new StringArrayParameter(
+ "com.arsdigita.bundle.category_files",
+ Parameter.REQUIRED,new String[]{
+ "bundle/categories/sci-nav-domain-1.00.xml",
+ "bundle/categories/sci-nav-hierarchy-1.00.xml" }
+ );
+
+ /**
+ * List of comma separated sets of domain mappings.
+ * It's the developers / administrators responsibility to ensure all
+ * necessary category domains have been imported previously and are spelled
+ * correctly. The list may contain set for different domain key and/or
+ * different applications and contexts. If an domain key requires several
+ * applications, repeat the key and specify a different application and/or
+ * context
+ * Example:
+ * "DOMAIN_KEY_1 : APP_URL_1 [: CONTEXT_1] ,
+ * DOMAIN_KEY_1 : APP_URL_2 [: CONTEXT_1] ,
+ * DOMAIN_KEY_2 : APP_URL_1 [: CONTEXT] ,
+ * .... ,
+ * DOMAIN_KEY_n : APP_URL_n [: CONTEXT_n] "
+ *
+ */
+ private Parameter m_domainMappings = new StringArrayParameter(
+ "com.arsdigita.bundle.domain_mappings",
+ Parameter.REQUIRED,new String[]{ "STD-NAV:/navigation/",
+ "STD-NAV:/content/",
+ "STD-NAV:/portal/" }
+ );
+
+
+ /**
+ * Constructor
+ */
+ public Loader() {
+
+ // Register defined parameters to the context by adding
+ // the parameter to a map of parameters
+ register(m_customApplicationInstances);
+ register(m_categoryFiles);
+ register(m_domainMappings);
+
+ }
+
+
+ public void run(final ScriptContext ctx) {
+
+ /* Create site specific custom applications instances of arbitrary
+ * type specified by optional configuration parameter.
+ * Typically used to create additional navigation instances for alternativ
+ * navigation tree(s) or additional content sections.
+ */
+ String[] customApplicationInstances = (String[]) get(m_customApplicationInstances);
+ if ( customApplicationInstances != null) {
+
+ for (int i = 0 ; i < customApplicationInstances.length ; i++) {
+
+ final String aCustomApplicationInstance = customApplicationInstances[i];
+
+ StringTokenizer tok = new StringTokenizer( aCustomApplicationInstance, ":" );
+ String type = null; // full qualified class name
+ String url = null; // url fragment (last part)
+ String title = null; // title of new application instance
+ String parent = null; // parent class name
+ for ( int j = 0; tok.hasMoreTokens(); j++ ) {
+ if ( 0 == j ) {
+ type = tok.nextToken();
+ } else if ( 1 == j ) {
+ url = tok.nextToken();
+ } else if ( 2 == j ) {
+ title = tok.nextToken();
+ } else if ( 3 == j ) {
+ parent = tok.nextToken();
+ } else {
+ parent = null;
+ }
+ }
+
+ Application.createApplication(type, url, title, null);
+ }
+
+ }
+
+
+ /* Import from the categories definition files: Create Terms domains
+ * and populate them with categories
+ * (alternatively this could be delegated to terms.Loader because it's
+ * all Terms)
+ * Creates one or more Terms domains, but NO domain mapping for navigation.
+ * Therefore, registerDomains is required for /navigation/ otherwise
+ * the systems throws NPE for ccm/navigation.
+ */
+ String[] files = (String[]) get(m_categoryFiles);
+ final Parser parser = new Parser();
+ // for each filename in the array of files containing categories
+ for (int i = 0 ; i < files.length ; i++) {
+ final String file = files[i];
+ if (s_log.isInfoEnabled()) {
+ s_log.info("Process " + file);
+ }
+ /* Import a Terms category domain. */
+ parser.parse(Thread.currentThread().getContextClassLoader().
+ getResourceAsStream(file));
+ }
+
+
+ /* Creates domain mappings according to configuration file. By default
+ * at least one domain mapping for standard navigation is created,
+ * otherwise navigation wouldn't work.
+ * IOt is the developers / administrators responsibility that KEY is
+ * existent, i.e. previously importet in the previous step.
+ */
+ String[] domainMappings = (String[]) get(m_domainMappings);
+ for (int i = 0 ; i < domainMappings.length ; i++) {
+
+ final String aDomainMapping = domainMappings[i];
+
+ StringTokenizer tok = new StringTokenizer( aDomainMapping, ":" );
+ String key = null;
+ String app = null;
+ String context = null;
+ for ( int j = 0; tok.hasMoreTokens(); j++ ) {
+ if ( 0 == j ) {
+ key = tok.nextToken();
+ } else if ( 1 == j ) {
+ app = tok.nextToken();
+ } else if ( 2 == j ) {
+ context = tok.nextToken();
+ } else {
+ context = null;
+ }
+ }
+
+ registerDomain(key, app, context);
+
+ }
+
+
+ // registerServicesTemplate("/services/"); wird nicht gebraucht
+
+ } // end run method
+
+
+// public void registerServicesTemplate(String appURL) {
+// Application app = Application.retrieveApplicationForPath(appURL);
+// Assert.exists(app, Application.class);
+// Category root = Category.getRootForObject(app);
+// Assert.exists(root, Category.class);
+//
+// Template template = Template.create(
+// "APLAWS Services",
+// "APLAWS ESD Toolkit Services",
+// "/packages/navigation/templates/aplaws-services.jsp");
+//
+// new TemplateMapping( template,
+// root,
+// Template.DEFAULT_DISPATCHER_CONTEXT,
+// Template.DEFAULT_USE_CONTEXT );
+// }
+
+
+ /**
+ * Determines the Terms domain using domainKey as well as the application
+ * instance using appURL and then creates a domain mapping using context
+ * as domain context.
+ *
+ * Uses Package com.arsdigita.london.terms.Domain (!)
+ *
+ * @param domainKey
+ * @param appURL
+ * @param context
+ */
+ public void registerDomain(String domainKey,
+ String appURL,
+ String context) {
+ if (s_log.isDebugEnabled()) {
+ s_log.debug("Mapping domain " + domainKey + " to app " + appURL
+ + " in context " + context);
+ }
+
+ /* Determine Domain and Application objects, both MUST exist! */
+ Domain domain = Domain.retrieve(domainKey);
+ Application app = Application.retrieveApplicationForPath(appURL);
+
+ /* Create domain mapping */
+ domain.setAsRootForObject(app, context);
+
+ /* Create permissions and roles for content-center applications only */
+ if (app instanceof ContentSection) {
+ RoleCollection coll = ((ContentSection) app).getStaffGroup().getOrderedRoles();
+ Set adminRoles = new HashSet();
+ Set categorizeRoles = new HashSet();
+ while (coll.next()) {
+ Role role = coll.getRole();
+ final DataQuery privs = RoleFactory.getRolePrivileges(
+ app.getID(), role.getGroup().getID());
+ while (privs.next()) {
+ String priv = (String) privs.get(RoleFactory.PRIVILEGE);
+ if (priv.equals(SecurityManager.CMS_CATEGORY_ADMIN)) {
+ adminRoles.add(role);
+ } else if (priv.equals(SecurityManager.CMS_CATEGORIZE_ITEMS)) {
+ categorizeRoles.add(role);
+ }
+ }
+
+ }
+ RootCategoryCollection catCollection = Category.getRootCategories(((ContentSection) app));
+ while (catCollection.next()) {
+ Iterator adminIter = adminRoles.iterator();
+ while (adminIter.hasNext()) {
+ ((Role) adminIter.next()).grantPermission(catCollection.getCategory(),
+ PrivilegeDescriptor.ADMIN);
+ }
+ Iterator categorizeIter = categorizeRoles.iterator();
+ while (categorizeIter.hasNext()) {
+ ((Role) categorizeIter.next()).grantPermission(catCollection.getCategory(),
+ Category.MAP_DESCRIPTOR);
+ }
+ }
+ }
+ }
+}
diff --git a/ccm-bundle/src/com/arsdigita/bundle/ObjectTypeSchemaGenerator.java b/ccm-bundle/src/com/arsdigita/bundle/ObjectTypeSchemaGenerator.java
new file mode 100644
index 000000000..ba9b45fdb
--- /dev/null
+++ b/ccm-bundle/src/com/arsdigita/bundle/ObjectTypeSchemaGenerator.java
@@ -0,0 +1,374 @@
+/*
+ * Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+package com.arsdigita.bundle;
+
+import com.arsdigita.xml.Element;
+
+import com.arsdigita.persistence.metadata.ObjectType;
+import com.arsdigita.persistence.metadata.Property;
+
+import java.util.HashMap;
+import java.util.Stack;
+import java.math.BigDecimal;
+import org.apache.log4j.Logger;
+
+public class ObjectTypeSchemaGenerator extends ObjectTypeTraversal {
+
+ private static final Logger logger = Logger.getLogger(ObjectTypeSchemaGenerator.class);
+ private boolean m_wrapRoot = false;
+ private boolean m_wrapObjects = false;
+ private boolean m_wrapAttributes = false;
+ private Stack m_history = new Stack();
+ private HashMap m_elements = new HashMap();
+ // The xs:element
+ private Element m_element;
+ // The (optional) xs:complexType
+ private Element m_type;
+ // The (optional) xs:sequence
+ private Element m_sequence;
+ // The (optional property
+ private Property m_property;
+ private Stack m_properties = new Stack();
+ private Element m_root;
+ private String m_rootName;
+ public static final String SCHEMA_PREFIX = "xs:";
+ public static final String SCHEMA_NS =
+ "http://www.w3.org/2001/XMLSchema";
+ private static HashMap s_types = new HashMap();
+
+ static {
+ logger.debug("Static initalizer starting...");
+ s_types.put(String.class, "xs:string");
+ s_types.put(Boolean.class, "xs:boolean");
+ s_types.put(Integer.class, "xs:integer");
+ s_types.put(BigDecimal.class, "xs:double");
+ logger.debug("Static initalizer finished.");
+ }
+
+ protected static String lookupType(Class klass) {
+ if (s_types.containsKey(klass)) {
+ return (String) s_types.get(klass);
+ }
+ return "xs:string";
+ }
+
+ public static void registerType(Class klass, String type) {
+ s_types.put(klass, type);
+ }
+
+ public ObjectTypeSchemaGenerator(String rootName,
+ String namespace) {
+ m_root = new Element(SCHEMA_PREFIX + "schema",
+ SCHEMA_NS);
+ m_rootName = rootName;
+
+ // Set the namespace for nodes defined by the schema
+ m_root.addAttribute("targetNamespace", namespace);
+ // Set the default namespace for unqualified nodes
+ m_root.addAttribute("xmlns", namespace);
+ // All nodes in an instance doc conforming to the schema
+ // must be qualified
+ m_root.addAttribute("elementFormDefault", "qualified");
+ }
+
+ public Element getRoot() {
+ return m_root;
+ }
+
+ /**
+ * Determines XML output for root object.
+ * If set to true a separate element will
+ * be output for the root object, if false,
+ * then the element passed into the constructor
+ * will be used.
+ */
+ public void setWrapRoot(boolean value) {
+ m_wrapRoot = value;
+ }
+
+ /**
+ * Determines XML output used for objects.
+ * If set to true, then a wrapper XML element
+ * will be generated for the association,
+ * and then individual elements generated for
+ * each object. If false then no wrapper
+ * XML element will be produced.
+ */
+ public void setWrapObjects(boolean value) {
+ m_wrapObjects = value;
+ }
+
+ /**
+ * Determines XML output used for scalar
+ * attributes. If set to true, then each
+ * attribute is output as a separate element,
+ * otherwise, attributes are output as simple
+ * attributes.
+ */
+ public void setWrapAttributes(boolean value) {
+ m_wrapAttributes = value;
+ }
+
+ /**
+ * Method called when the processing of an object
+ * starts
+ */
+ protected void beginObject(ObjectType obj,
+ String path) {
+ // XXX deal with revisited objects - xs:choice possibly
+
+ if (m_type != null && m_sequence == null) {
+ Element sequence = m_type.newChildElement(SCHEMA_PREFIX + "sequence",
+ SCHEMA_NS);
+ m_sequence = sequence;
+ }
+
+ Element parent;
+ String name;
+ if (m_element == null) {
+ if (m_wrapRoot) {
+ Element element = m_root.newChildElement(SCHEMA_PREFIX
+ + "element",
+ SCHEMA_NS);
+ element.addAttribute("name", m_rootName);
+
+ Element type = element.newChildElement(SCHEMA_PREFIX
+ + "complexType",
+ SCHEMA_NS);
+ Element sequence = type.newChildElement(SCHEMA_PREFIX
+ + "sequence",
+ SCHEMA_NS);
+
+ parent = sequence;
+ name = nameFromPath(path);
+ } else {
+ parent = m_root;
+ name = m_rootName;
+ }
+ } else {
+ parent = m_sequence;
+ if (m_wrapObjects) {
+ name = "object";
+ } else {
+ name = nameFromPath(path);
+ }
+ }
+ Element element = parent.newChildElement(SCHEMA_PREFIX + "element",
+ SCHEMA_NS);
+ element.addAttribute("name", name);
+
+ if (m_property != null) {
+ if (m_property.isNullable()) {
+ element.addAttribute("minOccurs", "0");
+ }
+ if (m_property.isCollection()) {
+ element.addAttribute("maxOccurs", "unbounded");
+ }
+ }
+
+ Element type = element.newChildElement(SCHEMA_PREFIX + "complexType",
+ SCHEMA_NS);
+
+ Element oid = type.newChildElement(SCHEMA_PREFIX + "attribute",
+ SCHEMA_NS);
+ oid.addAttribute("name", "oid");
+ oid.addAttribute("type", "xs:string");
+
+ // Add to the path -> element map, not that we use this info yet
+ m_elements.put(path, element);
+
+ // Preserve context
+ m_history.push(new Element[]{m_element, m_type, m_sequence});
+
+ m_element = element;
+ m_type = type;
+ m_sequence = null;
+ }
+
+ /**
+ * Method called when the procesing of an object
+ * completes
+ */
+ protected void endObject(ObjectType obj,
+ String path) {
+ Element[] saved = (Element[]) m_history.pop();
+ m_element = saved[0];
+ m_type = saved[1];
+ m_sequence = saved[2];
+ }
+
+ /**
+ * Method called when an attribute is encountered
+ */
+ protected void handleAttribute(ObjectType obj,
+ String path,
+ Property property) {
+ if (m_wrapAttributes) {
+ if (m_sequence == null) {
+ Element sequence = m_type.newChildElement(SCHEMA_PREFIX
+ + "sequence",
+ SCHEMA_NS);
+ m_sequence = sequence;
+ }
+
+ Element element = new Element(SCHEMA_PREFIX + "element",
+ SCHEMA_NS);
+ element.addAttribute("name", property.getName());
+ // XXX pdl type -> xs type mapping
+ element.addAttribute("type", lookupType(property.getJavaClass()));
+
+ if (property.isNullable()) {
+ element.addAttribute("minOccurs", "0");
+ }
+
+ // Add to element
+ m_sequence.addContent(element);
+
+ // Add to the path -> element map
+ m_elements.put(path, element);
+ } else {
+ Element element = new Element(SCHEMA_PREFIX + "attribute",
+ SCHEMA_NS);
+ element.addAttribute("name", property.getName());
+ // XXX pdl type -> xs type mapping
+ element.addAttribute("type", lookupType(property.getJavaClass()));
+
+ if (property.isRequired()) {
+ element.addAttribute("use", "required");
+ }
+
+ // Add to element
+ m_type.addContent(element);
+
+ // Add to the path -> element map
+ m_elements.put(path, element);
+ }
+ }
+
+ /**
+ * Method called when the processing of a role
+ * starts
+ */
+ protected void beginRole(ObjectType obj,
+ String path,
+ Property property) {
+ if (m_wrapObjects) {
+ if (m_sequence == null) {
+ Element sequence = m_type.newChildElement(SCHEMA_PREFIX
+ + "sequence",
+ SCHEMA_NS);
+ m_sequence = sequence;
+ }
+
+ Element element = m_sequence.newChildElement(SCHEMA_PREFIX
+ + "element",
+ SCHEMA_NS);
+ element.addAttribute("name", property.getName());
+ if (property.isNullable()) {
+ element.addAttribute("minOccurs", "0");
+ }
+
+ Element type = element.newChildElement(SCHEMA_PREFIX + "complexType",
+ SCHEMA_NS);
+ Element sequence = type.newChildElement(SCHEMA_PREFIX + "sequence",
+ SCHEMA_NS);
+
+ // Preserve context
+ m_history.push(new Element[]{m_element, m_type, m_sequence});
+
+ m_element = element;
+ m_type = type;
+ m_sequence = sequence;
+ }
+ m_properties.push(m_property);
+ m_property = property;
+ }
+
+ /**
+ * Method called when the procesing of a role
+ * completes
+ */
+ protected void endRole(ObjectType obj,
+ String path,
+ Property property) {
+ if (m_wrapObjects) {
+ Element[] saved = (Element[]) m_history.pop();
+ m_element = saved[0];
+ m_type = saved[1];
+ m_sequence = saved[2];
+ }
+ m_property = (Property) m_properties.pop();
+ }
+
+ /**
+ * Method called when the processing of an association
+ * starts
+ */
+ protected void beginAssociation(ObjectType obj,
+ String path,
+ Property property) {
+ if (m_wrapObjects) {
+ if (m_sequence == null) {
+ Element sequence = m_type.newChildElement(SCHEMA_PREFIX
+ + "sequence",
+ SCHEMA_NS);
+ m_sequence = sequence;
+ }
+
+ Element element = m_sequence.newChildElement(SCHEMA_PREFIX
+ + "element",
+ SCHEMA_NS);
+ element.addAttribute("name", property.getName());
+ if (property.isNullable()) {
+ element.addAttribute("minOccurs", "0");
+ }
+
+ Element type = element.newChildElement(SCHEMA_PREFIX + "complexType",
+ SCHEMA_NS);
+ Element sequence = type.newChildElement(SCHEMA_PREFIX + "sequence",
+ SCHEMA_NS);
+
+ // Preserve context
+ m_history.push(new Element[]{m_element, m_type, m_sequence});
+
+ m_element = element;
+ m_type = type;
+ m_sequence = sequence;
+ }
+ m_properties.push(m_property);
+ m_property = property;
+ }
+
+ /**
+ * Method called when the procesing of an association
+ * completes
+ */
+ protected void endAssociation(ObjectType obj,
+ String path,
+ Property property) {
+ if (m_wrapObjects) {
+ Element[] saved = (Element[]) m_history.pop();
+ m_element = saved[0];
+ m_type = saved[1];
+ m_sequence = saved[2];
+ }
+ m_property = (Property) m_properties.pop();
+ }
+
+}
diff --git a/ccm-bundle/src/com/arsdigita/bundle/ObjectTypeTraversal.java b/ccm-bundle/src/com/arsdigita/bundle/ObjectTypeTraversal.java
new file mode 100644
index 000000000..67b0141fb
--- /dev/null
+++ b/ccm-bundle/src/com/arsdigita/bundle/ObjectTypeTraversal.java
@@ -0,0 +1,358 @@
+/*
+ * Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+package com.arsdigita.bundle;
+
+import com.arsdigita.util.Assert;
+
+import com.arsdigita.persistence.metadata.ObjectType;
+import com.arsdigita.persistence.metadata.Property;
+import com.arsdigita.persistence.metadata.MetadataRoot;
+
+import java.util.Iterator;
+import java.util.HashMap;
+
+import org.apache.log4j.Logger;
+
+// XXX this class is pretty similar to DomainObjectTraversal
+// and it would be nice to figure out a way to let them share
+// some of their logic (provided it didn't cripple / obfuscate
+// the API).
+
+// At minimum the process for registering & looking up hierachical
+// adapters can be shared. Also the mangling of names / paths.
+
+
+/**
+ * This class provides a general purpose framework for iterating
+ * over a domain object's properties, processing attributes and
+ * traversing associations as required.
+ *
+ * Subclasses should implement the startXXX and endXXX methods to
+ * provide whatever processing logic they require upon encountering
+ * attributes, roles, associations and objects.
+ *
+ * The {@link com.arsdigita.domain.ObjectTypeTraversalAdapter}
+ * provides a means to control which properties are processed and,
+ * most importantly, which associations are traversed. When
+ * registering an adapter, a 'use context' is supplied allowing
+ * different adapters to be used according to the requirements of any
+ * implementing subclass. It is recommended that the use context be
+ * based on the fully qualified name of the class using
+ * ObjectTypeTraversal, e.g.,
+ * com.arsdigita.cms.ui.ObjectTypeRenderer.
+ *
+ * The path argument provided to the adapter and the startXXX ad
+ * endXXX methods indicates which associations are currently being
+ * traversed. The first element in the path is always '/object'. If it
+ * then starts to traverse the 'rootCategory' association, the path
+ * will become '/object/rootCategory'. For self-recursive
+ * associations, rather than building up a long repeating string, the
+ * path will be shortened by adding a '+' for each element that is
+ * repeated. For example, '/object/container+' indicates that the
+ * container association has been followed two or more times.
+ */
+public abstract class ObjectTypeTraversal {
+
+ private static HashMap s_adapters = new HashMap();
+
+ private static final Logger s_log = Logger.getLogger(ObjectTypeTraversal.class);
+
+ /**
+ * Registers a traversal adapter for an object type in a given
+ * context.
+ *
+ * @param type the object type whose items will be traversed
+ * @param adapter the adapter for controlling object traversal
+ * @param context the context in which the adapter should be used
+ */
+ public static void registerAdapter(ObjectType type,
+ ObjectTypeTraversalAdapter adapter,
+ String context) {
+ s_adapters.put(new AdapterKey(type, context), adapter);
+ }
+
+ /**
+ * Unregisteres a traversal adapter for an object type in a
+ * given context
+ *
+ * @param type the object type whose items will be traversed
+ * @param context the context in which the adapter should be used
+ */
+ public static void unregisterAdapter(ObjectType type,
+ String context) {
+ s_adapters.remove(new AdapterKey(type, context));
+ }
+
+ /**
+ * Registers a traversal adapter for an object type in a given
+ * context.
+ *
+ * @param type the object type whose items will be traversed
+ * @param adapter the adapter for controlling object traversal
+ * @param context the context in which the adapter should be used
+ */
+ public static void registerAdapter(String type,
+ ObjectTypeTraversalAdapter adapter,
+ String context) {
+ registerAdapter(MetadataRoot.getMetadataRoot().getObjectType(type),
+ adapter,
+ context);
+ }
+
+ /**
+ * Unregisteres a traversal adapter for an object type in a
+ * given context
+ *
+ * @param type the object type whose items will be traversed
+ * @param context the context in which the adapter should be used
+ */
+ public static void unregisterAdapter(String type,
+ String context) {
+ unregisterAdapter(MetadataRoot.getMetadataRoot().getObjectType(type),
+ context);
+ }
+
+ /**
+ * Retrieves the traversal adapter for an object type in a given
+ * context.
+ *
+ * @param type the object type to lookup
+ * @param context the adapter context
+ */
+ public static ObjectTypeTraversalAdapter lookupAdapter(ObjectType type,
+ String context) {
+ return (ObjectTypeTraversalAdapter)s_adapters
+ .get(new AdapterKey(type, context));
+ }
+
+ /**
+ * Retrieves the closest matching traversal adapter for an object type
+ * in a given context. The algorithm looks for an exact match, then
+ * considers the supertype, and the supertype's supertype. If no match
+ * could be found at all, returns null
+ *
+ * @param type the object type to search for
+ * @param context the adapter context
+ */
+ public static ObjectTypeTraversalAdapter findAdapter(ObjectType type,
+ String context) {
+ ObjectTypeTraversalAdapter adapter = null;
+ while (adapter == null && type != null) {
+ adapter = lookupAdapter(type, context);
+ type = type.getSupertype();
+ }
+ return adapter;
+ }
+
+ /**
+ * Walks over properties of a domain object, invoking
+ * methods to handle assoications, roles and attributes.
+ *
+ * @param obj the domain object to traverse
+ * @param context the context for the traversal adapter
+ */
+ public void walk(String type,
+ String context) {
+ walk(MetadataRoot.getMetadataRoot().getObjectType(type),
+ context);
+ }
+
+ /**
+ * Walks over properties of a domain object, invoking
+ * methods to handle assoications, roles and attributes.
+ *
+ * @param obj the domain object to traverse
+ * @param context the context for the traversal adapter
+ */
+ public void walk(ObjectType type,
+ String context) {
+ Assert.exists(type, ObjectType.class);
+
+ ObjectTypeTraversalAdapter adapter = findAdapter(type,
+ context);
+ Assert.exists(adapter, ObjectTypeTraversalAdapter.class);
+ walk(adapter, type, "/object");
+ }
+
+ private void walk(ObjectTypeTraversalAdapter adapter,
+ ObjectType type,
+ String path) {
+ beginObject(type, path);
+
+ if (s_log.isInfoEnabled()) {
+ s_log.info("Walking " + path + " type: " + type.getQualifiedName());
+ }
+
+ for (Iterator i = type.getProperties(); i.hasNext(); ) {
+ Property prop = (Property) i.next();
+ String propName = prop.getName();
+
+ if (!adapter.processProperty(type,
+ appendToPath(path, prop.getName()),
+ prop)) {
+ if (s_log.isDebugEnabled()) {
+ s_log.debug("Skipping property " + propName);
+ }
+ continue;
+ }
+ if (s_log.isDebugEnabled()) {
+ s_log.debug("Process property " + propName + " type " + prop.getType().getQualifiedName());
+ }
+
+ if (prop.isAttribute()) {
+ handleAttribute(type, path, prop);
+ } else {
+ if (!prop.isCollection()) {
+ beginRole(type, path, prop);
+
+ walk(adapter,
+ (ObjectType)prop.getType(),
+ appendToPath(path, propName));
+
+ endRole(type, path, prop);
+ } else {
+ beginAssociation(type, path, prop);
+
+ Property roleProp = prop.getAssociatedProperty();
+
+ walk(adapter,
+ (ObjectType)prop.getType(),
+ appendToPath(path, propName));
+
+ endAssociation(type, path, prop);
+ }
+ }
+ }
+
+ endObject(type, path);
+ }
+
+
+ /**
+ * Method called when the processing of an object
+ * starts
+ */
+ protected abstract void beginObject(ObjectType obj,
+ String path);
+ /**
+ * Method called when the procesing of an object
+ * completes
+ */
+ protected abstract void endObject(ObjectType obj,
+ String path);
+
+ /**
+ * Method called when an attribute is encountered
+ */
+ protected abstract void handleAttribute(ObjectType obj,
+ String path,
+ Property property);
+
+ /**
+ * Method called when the processing of a role
+ * starts
+ */
+ protected abstract void beginRole(ObjectType obj,
+ String path,
+ Property property);
+
+ /**
+ * Method called when the procesing of a role
+ * completes
+ */
+ protected abstract void endRole(ObjectType obj,
+ String path,
+ Property property);
+
+ /**
+ * Method called when the processing of an association
+ * starts
+ */
+ protected abstract void beginAssociation(ObjectType obj,
+ String path,
+ Property property);
+
+ /**
+ * Method called when the procesing of an association
+ * completes
+ */
+ protected abstract void endAssociation(ObjectType obj,
+ String path,
+ Property property);
+
+
+ protected String appendToPath(String path,
+ String name) {
+ if (path.endsWith("/" + name)) {
+ path = path + "+";
+ } else if (!path.endsWith("/" + name + "+")) {
+ path = path + "/" + name;
+ }
+
+ return path;
+ }
+
+ protected String nameFromPath(String path) {
+ int index = path.lastIndexOf("/");
+ Assert.isTrue(index >= 0, "Path starts with /");
+
+ if (path.endsWith("+")) {
+ return path.substring(index + 1, path.length() - 2);
+ } else {
+ return path.substring(index + 1);
+ }
+ }
+
+ protected String parentFromPath(String path) {
+ int index = path.lastIndexOf("/");
+ Assert.isTrue(index >= 0, "Path starts with /");
+
+ if (index == 0) {
+ return null;
+ } else {
+ return path.substring(0, index - 1);
+ }
+ }
+
+ private static class AdapterKey {
+ private ObjectType m_type;
+ private String m_context;
+
+ public AdapterKey(ObjectType type,
+ String context) {
+ m_type = type;
+ m_context = context;
+ }
+
+ public boolean equals(Object o) {
+ if (o instanceof AdapterKey) {
+ AdapterKey k = (AdapterKey)o;
+ return k.m_type.equals(m_type) &&
+ k.m_context.equals(m_context);
+ } else {
+ return false;
+ }
+ }
+
+ public int hashCode() {
+ return m_type.hashCode() + m_context.hashCode();
+ }
+ }
+
+}
diff --git a/ccm-bundle/src/com/arsdigita/bundle/ObjectTypeTraversalAdapter.java b/ccm-bundle/src/com/arsdigita/bundle/ObjectTypeTraversalAdapter.java
new file mode 100644
index 000000000..e01b62c21
--- /dev/null
+++ b/ccm-bundle/src/com/arsdigita/bundle/ObjectTypeTraversalAdapter.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+package com.arsdigita.bundle;
+
+import com.arsdigita.persistence.metadata.Property;
+import com.arsdigita.persistence.metadata.ObjectType;
+
+// XXX this class is pretty similar to DomainObjectTraversal
+// and it would be nice to figure out a way to let them share
+// some of their logic (provided it didn't cripple / obfuscate
+// the API).
+
+/**
+ * This interface is used to control traversal of domain
+ * objects. Whenever a property is encountered, the {@link
+ * #processProperty} method will be called to determine whether or not
+ * to continue processing the object. The most important use for this
+ * is to prevent the needless (and potentially infinite) traversal of
+ * associations between objects, but it can also be used to filter out
+ * certain attributes.
+ *
+ * Instances of this class need to be registered using the
+ * DomainObjectTraversal.registerAdapter method.
+ *
+ * @see com.arsdigita.domain.DomainObjectTraversal
+ * @see com.arsdigita.domain.SimpleDomainObjectTraversalAdapter
+ * @version $Id: ObjectTypeTraversalAdapter.java 287 2005-02-22 00:29:02Z sskracic $
+ */
+public interface ObjectTypeTraversalAdapter {
+ /**
+ * Invoked to determine whether to process a property.
+ * Should return true to allow processing to commence,
+ * false to prevent it.
+ *
+ * @param obj the object type currently being processed
+ * @param path the path to the current domain object from
+ * the root object being traversed
+ * @param prop the property about to be processed
+ * @return true if the property should be processed
+ */
+ public boolean processProperty(ObjectType obj,
+ String path,
+ Property prop);
+}
diff --git a/ccm-bundle/src/com/arsdigita/bundle/SimpleObjectTypeTraversalAdapter.java b/ccm-bundle/src/com/arsdigita/bundle/SimpleObjectTypeTraversalAdapter.java
new file mode 100644
index 000000000..2fe9506d6
--- /dev/null
+++ b/ccm-bundle/src/com/arsdigita/bundle/SimpleObjectTypeTraversalAdapter.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+package com.arsdigita.bundle;
+
+import org.apache.log4j.Logger;
+import com.arsdigita.persistence.metadata.Property;
+import com.arsdigita.persistence.metadata.ObjectType;
+import java.util.HashSet;
+
+/**
+ * This is a general purpose traversal adaptor
+ * that allows/denies processing of a property
+ * based on the path to the property, and its
+ * presence in an inclusion/exclusion set.
+ *
+ * Instances of this class can be configured using
+ * the ObjectTypeTraversalInitializer
+ *
+ * See com.arsdigita.cms.installer.ObjectTypeTraversalInitializer.
+ */
+public class SimpleObjectTypeTraversalAdapter
+ implements ObjectTypeTraversalAdapter {
+
+ private static final Logger s_log =
+ Logger.getLogger(SimpleObjectTypeTraversalAdapter.class);
+
+ /**
+ * Rule that indicates the set of properties should be treated
+ * as an inclusion list. ie, don't allow any properties except
+ * those listed. This is the default for associations
+ */
+ public final static int RULE_INCLUDE = 0;
+ /**
+ * Rule that indicates the set of properties should be treated
+ * as an exclusion list. ie, allow through all properties,
+ * except those listed. This is the default for attributes.
+ */
+ public final static int RULE_EXCLUDE = 1;
+
+ private HashSet m_attr = new HashSet();
+ private HashSet m_assoc = new HashSet();
+
+ private int m_attrRule = RULE_EXCLUDE;
+ private int m_assocRule = RULE_INCLUDE;
+
+ private SimpleObjectTypeTraversalAdapter m_parent;
+
+ /**
+ * Creates a new traversal adapter, with no parent
+ * delegate. If no explicit rule is present it will
+ * return false if RULE_INCLUDE is set, or true if
+ * RULE_EXCLUDE is set.
+ */
+ public SimpleObjectTypeTraversalAdapter() {
+ this(null);
+ }
+
+ /**
+ * Creates a new traversal adapter, extending the rules
+ * defined by a parent. If there is no explicit rule
+ * for the property questioned, it will delegate the
+ * query to the parent.
+ * @param parent the parent adapter to delegate to
+ */
+ public SimpleObjectTypeTraversalAdapter(
+ SimpleObjectTypeTraversalAdapter parent
+ ) {
+ m_parent = parent;
+ }
+
+ /**
+ * Set the rule for processing attributes
+ *
+ * @param rule the new processing rule
+ */
+ public void setAttributeRule(int rule) {
+ m_attrRule = rule;
+ }
+
+ /**
+ * Set the rule for processing associations
+ *
+ * @param rule the new processing rule
+ */
+ public void setAssociationRule(int rule) {
+ m_assocRule = rule;
+ }
+
+ /**
+ * Add a property to the attribute property set.
+ *
+ * @param path the full path to the property
+ */
+ public void addAttributeProperty(String prop) {
+ m_attr.add(prop);
+ }
+
+ /**
+ * Add a property to the association property set.
+ *
+ * @param path the full path to the property
+ */
+ public void addAssociationProperty(String prop) {
+ m_assoc.add(prop);
+ }
+
+ /**
+ * Determines whether or not to allow processing
+ * of a property, based on the property set and
+ * the processing rule
+ */
+ public boolean processProperty(ObjectType obj,
+ String path,
+ Property prop) {
+ if (prop.isAttribute()) {
+ boolean result = m_attr.contains(path);
+ s_log.debug("Check attr " + path + " contains " +
+ result + " " + m_attrRule);
+ if (!result && m_parent != null) {
+ s_log.debug("No explicit rule, delegating to parent");
+ return m_parent.processProperty(obj, path, prop);
+ }
+ return m_attrRule == RULE_INCLUDE ? result : !result;
+ } else {
+ boolean result = m_assoc.contains(path);
+ s_log.debug("Check assoc " + path + " contains " +
+ result + " " + m_attrRule);
+ if (!result && m_parent != null) {
+ s_log.debug("No explicit rule, delegating to parent");
+ return m_parent.processProperty(obj, path, prop);
+ }
+ return m_assocRule == RULE_INCLUDE ? result : !result;
+ }
+ }
+}
diff --git a/ccm-bundle/src/com/arsdigita/bundle/WebAppPatternGenerator.java b/ccm-bundle/src/com/arsdigita/bundle/WebAppPatternGenerator.java
new file mode 100644
index 000000000..32832502b
--- /dev/null
+++ b/ccm-bundle/src/com/arsdigita/bundle/WebAppPatternGenerator.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+package com.arsdigita.bundle;
+
+
+import com.arsdigita.web.Application;
+import com.arsdigita.web.Web;
+import com.arsdigita.templating.PatternGenerator;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.log4j.Logger;
+
+
+/**
+ * Generates a set of patterns corresponding to the current
+ * web application prefix
+ */
+public class WebAppPatternGenerator implements PatternGenerator {
+
+ private static final Logger s_log =
+ Logger.getLogger(WebAppPatternGenerator.class);
+
+ public String[] generateValues(String key,
+ HttpServletRequest req) {
+ Application app = Web.getContext().getApplication();
+ String ctx = app == null ? null : app.getContextPath();
+
+ if (app == null ||
+ ctx == null ||
+ "".equals(ctx)) {
+ return new String[] { Web.ROOT_WEBAPP };
+ }
+
+ if (ctx.startsWith("/")) {
+ ctx = ctx.substring(1);
+ }
+
+ return new String[] { ctx };
+ }
+}
diff --git a/ccm-bundle/src/com/arsdigita/bundle/ui/AssignedIndexItemTerms.java.probably.nolongerInUse b/ccm-bundle/src/com/arsdigita/bundle/ui/AssignedIndexItemTerms.java.probably.nolongerInUse
new file mode 100644
index 000000000..4a50487b7
--- /dev/null
+++ b/ccm-bundle/src/com/arsdigita/bundle/ui/AssignedIndexItemTerms.java.probably.nolongerInUse
@@ -0,0 +1,46 @@
+/**
+ * Copyright (C) 2005 Runtime Collective Ltd. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+package com.arsdigita.bundle.ui;
+
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.cms.CMS;
+import com.arsdigita.cms.ContentBundle;
+import com.arsdigita.cms.ContentItem;
+import com.arsdigita.cms.ContentPage;
+import com.arsdigita.kernel.ACSObject;
+import com.arsdigita.london.navigation.Navigation;
+import com.arsdigita.london.terms.ui.AbstractAssignedTerms;
+
+import org.apache.log4j.Logger;
+
+public class AssignedIndexItemTerms extends AbstractAssignedTerms {
+
+ private static final Logger s_log = Logger.getLogger(AssignedIndexItemTerms.class);
+
+ protected ACSObject getObject(PageState state) {
+
+ ACSObject obj = Navigation.getConfig().getDefaultModel().getObject();
+
+ if (s_log.isDebugEnabled()) {
+ s_log.debug("Dealing with item " + obj);
+ }
+
+ return obj;
+ }
+}
diff --git a/ccm-bundle/src/com/arsdigita/bundle/ui/AssignedItemTerms.java b/ccm-bundle/src/com/arsdigita/bundle/ui/AssignedItemTerms.java
new file mode 100644
index 000000000..433c7478e
--- /dev/null
+++ b/ccm-bundle/src/com/arsdigita/bundle/ui/AssignedItemTerms.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+package com.arsdigita.bundle.ui;
+
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.cms.CMS;
+import com.arsdigita.kernel.ACSObject;
+import com.arsdigita.london.terms.ui.AbstractAssignedTerms;
+
+/**
+ *
+ * Invoked by jsp
+ * (e.g. packages/content-section/templates/default/aplaws-item.jsp)
+ */
+public class AssignedItemTerms extends AbstractAssignedTerms {
+
+ protected ACSObject getObject(PageState state) {
+ return CMS.getContext().getContentItem().getParent();
+ }
+}
diff --git a/ccm-bundle/src/com/arsdigita/bundle/ui/CategoryPortalSelectionModel.java b/ccm-bundle/src/com/arsdigita/bundle/ui/CategoryPortalSelectionModel.java
new file mode 100644
index 000000000..c88e4f8a5
--- /dev/null
+++ b/ccm-bundle/src/com/arsdigita/bundle/ui/CategoryPortalSelectionModel.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+package com.arsdigita.bundle.ui;
+
+import com.arsdigita.navigation.Navigation;
+import com.arsdigita.navigation.NavigationModel;
+
+import com.arsdigita.persistence.SessionManager;
+import com.arsdigita.persistence.DataCollection;
+
+import com.arsdigita.domain.DomainObjectFactory;
+
+import com.arsdigita.categorization.Category;
+import com.arsdigita.util.Assert;
+import com.arsdigita.bebop.PageState;
+
+import com.arsdigita.portalworkspace.Workspace;
+import com.arsdigita.portalworkspace.ui.WorkspaceSelectionModel;
+
+public class CategoryPortalSelectionModel extends WorkspaceSelectionModel {
+
+ protected Workspace getDefaultWorkspace(PageState state) {
+ NavigationModel model = Navigation.getConfig().getDefaultModel();
+ Category cat = model.getCategory();
+ Assert.exists(cat);
+
+ DataCollection workspaces
+ = SessionManager.getSession().retrieve(
+ Workspace.BASE_DATA_OBJECT_TYPE);
+ workspaces.addEqualsFilter("categories.id", cat.getID());
+
+ if (workspaces.next()) {
+ Workspace wk = (Workspace)DomainObjectFactory
+ .newInstance(workspaces.getDataObject());
+ workspaces.close();
+ return wk;
+ }
+
+ return null;
+ }
+}
diff --git a/ccm-bundle/src/com/arsdigita/bundle/ui/CategoryTermDetails.java.probably.nolongerInUse b/ccm-bundle/src/com/arsdigita/bundle/ui/CategoryTermDetails.java.probably.nolongerInUse
new file mode 100644
index 000000000..70bb784d1
--- /dev/null
+++ b/ccm-bundle/src/com/arsdigita/bundle/ui/CategoryTermDetails.java.probably.nolongerInUse
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+package com.arsdigita.bundle.ui;
+
+import com.arsdigita.london.terms.Term;
+import com.arsdigita.london.terms.ui.AbstractTermDetails;
+import com.arsdigita.persistence.DataCollection;
+import com.arsdigita.persistence.SessionManager;
+import com.arsdigita.london.navigation.Navigation;
+import com.arsdigita.categorization.Category;
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.domain.DomainObjectFactory;
+
+import org.apache.log4j.Logger;
+
+public class CategoryTermDetails extends AbstractTermDetails {
+
+ private static final Logger s_log = Logger.getLogger(CategoryTermDetails.class);
+
+ protected Term getTerm(PageState state) {
+ Category cat = Navigation.getConfig().getDefaultModel()
+ .getCategory();
+
+ if (cat == null) {
+ s_log.debug("No category found, skiping term");
+ return null;
+ }
+
+ DataCollection terms = SessionManager.getSession()
+ .retrieve(Term.BASE_DATA_OBJECT_TYPE);
+ terms.addEqualsFilter(Term.MODEL + "." + Category.ID,
+ cat.getID());
+
+ if (terms.next()) {
+ Term term = (Term)DomainObjectFactory
+ .newInstance(terms.getDataObject());
+ terms.close();
+ if (s_log.isInfoEnabled()) {
+ s_log.info("Found term " + term + " for category " + cat);
+ }
+ return term;
+ }
+
+ if (s_log.isDebugEnabled()) {
+ s_log.debug("No term found for category " + cat);
+ }
+ return null;
+ }
+
+}
diff --git a/ccm-bundle/src/com/arsdigita/bundle/ui/HomepagePortalSelectionModel.java b/ccm-bundle/src/com/arsdigita/bundle/ui/HomepagePortalSelectionModel.java
new file mode 100644
index 000000000..65c0b2dab
--- /dev/null
+++ b/ccm-bundle/src/com/arsdigita/bundle/ui/HomepagePortalSelectionModel.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2001 ArsDigita Corporation. All Rights Reserved.
+ *
+ * The contents of this file are subject to the ArsDigita Public
+ * License (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.arsdigita.com/ADPL.txt
+ *
+ * Software distributed under the License is distributed on an "AS
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * rights and limitations under the License.
+ *
+ */
+
+package com.arsdigita.aplaws.ui;
+
+import com.arsdigita.bebop.AbstractSingleSelectionModel;
+import com.arsdigita.portalworkspace.ui.PortalSelectionModel;
+import com.arsdigita.portalworkspace.WorkspacePage;
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.bebop.parameters.ParameterModel;
+import com.arsdigita.domain.DomainObject;
+
+import org.apache.log4j.Logger;
+
+public class HomepagePortalSelectionModel extends AbstractSingleSelectionModel
+ implements PortalSelectionModel {
+
+ /** Private logger instance for debugging */
+ private static Logger s_log = Logger.getLogger(
+ HomepagePortalSelectionModel.class);
+
+ private HomepageWorkspaceSelectionModel m_workspace;
+ private int m_column;
+
+ public HomepagePortalSelectionModel(HomepageWorkspaceSelectionModel workspace,
+ int column) {
+ m_workspace = workspace;
+ m_column = column;
+
+ if (s_log.isDebugEnabled()) {
+ s_log.debug("Constructor HomepageWorkspaceSelectionModel " + " [" +
+ "Workspace: " + m_workspace + "," +
+ "Columns: " + column + "]");
+ }
+
+ }
+
+ public void onCustomize(PageState state) {
+ m_workspace.onCustomize(state, m_column);
+ }
+
+ public void onReset(PageState state) {
+ m_workspace.onReset(state, m_column);
+ }
+
+ public HomepageWorkspaceSelectionModel getWorkspaceModel() {
+ return m_workspace;
+ }
+
+ public Object getSelectedKey(PageState state) {
+ return getSelectedPortal(state).getID();
+ }
+
+ public void setSelectedKey(PageState state,
+ Object key) {
+ throw new UnsupportedOperationException("cannot set key");
+ }
+
+ public void setSelectedObject(PageState state,
+ DomainObject key) {
+ throw new UnsupportedOperationException("cannot set object");
+ }
+
+ public ParameterModel getStateParameter() {
+ throw new UnsupportedOperationException("not state param");
+ }
+
+
+ public DomainObject getSelectedObject(PageState state) {
+ return getSelectedPortal(state);
+ }
+
+ public WorkspacePage getSelectedPortal(PageState state) {
+ return m_workspace.getPortal(state, m_column);
+ }
+}
diff --git a/ccm-bundle/src/com/arsdigita/bundle/ui/HomepageWorkspace.java b/ccm-bundle/src/com/arsdigita/bundle/ui/HomepageWorkspace.java
new file mode 100644
index 000000000..879c8f620
--- /dev/null
+++ b/ccm-bundle/src/com/arsdigita/bundle/ui/HomepageWorkspace.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2001 ArsDigita Corporation. All Rights Reserved.
+ *
+ * The contents of this file are subject to the ArsDigita Public
+ * License (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.arsdigita.com/ADPL.txt
+ *
+ * Software distributed under the License is distributed on an "AS
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * rights and limitations under the License.
+ *
+ */
+
+package com.arsdigita.aplaws.ui;
+
+import com.arsdigita.bebop.SimpleContainer;
+import com.arsdigita.bebop.ActionLink;
+import com.arsdigita.bebop.Page;
+import com.arsdigita.bebop.event.ActionEvent;
+import com.arsdigita.bebop.event.ActionListener;
+import com.arsdigita.portalworkspace.ui.PersistentPortal;
+import com.arsdigita.portalworkspace.Workspace;
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.xml.Element;
+import com.arsdigita.portalworkspace.ui.PortalConstants;
+import com.arsdigita.kernel.permissions.PermissionService;
+import com.arsdigita.kernel.permissions.PermissionDescriptor;
+import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
+import com.arsdigita.kernel.Party;
+import com.arsdigita.kernel.Kernel;
+
+import org.apache.log4j.Logger;
+
+
+/**
+ *
+ *
+ */
+public class HomepageWorkspace extends SimpleContainer {
+
+ /** Private logger instance for debugging */
+ private static Logger s_log = Logger.getLogger(
+ HomepageWorkspace.class);
+
+ private HomepagePortalSelectionModel m_model;
+ private ActionLink m_reset;
+ private ActionLink m_browse;
+ private ActionLink m_edit;
+ private PersistentPortal m_browser;
+ private PersistentPortal m_editor;
+ private boolean m_customizable;
+ private boolean m_readOnly;
+ private String m_name;
+
+ public HomepageWorkspace() {
+ super("portal:homepageWorkspace", PortalConstants.PORTAL_XML_NS);
+ m_customizable = false;
+
+ if (s_log.isDebugEnabled()) {
+ s_log.debug("Constructor HomepageWorkspace finished. " );
+ }
+
+ }
+
+ public void setModel(HomepagePortalSelectionModel model) {
+ m_model = model;
+
+ if (s_log.isDebugEnabled()) {
+ s_log.debug("setModel: " + m_model );
+ }
+ }
+
+ public void setCustomizable(boolean customizable) {
+ m_customizable = customizable;
+ }
+
+ public void setReadOnly(boolean readOnly) {
+ m_readOnly = readOnly;
+ }
+
+ public void setName(String name) {
+ m_name = name;
+ }
+
+ public void addWidgets() {
+ m_edit = new ActionLink("customize");
+ m_browse = new ActionLink("browse");
+ m_reset = new ActionLink("reset");
+ m_reset.setConfirmation("Are you sure you wish to reset this column? " +
+ "This will permanently remove all portlets.");
+
+ m_browser = new PersistentPortal(m_model,
+ m_name,
+ PortalConstants.MODE_DISPLAY);
+ m_editor = new PersistentPortal(m_model,
+ m_name,
+ PortalConstants.MODE_EDITOR);
+
+ m_edit.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ PageState state = e.getPageState();
+ setDisplayMode(state, false);
+
+ m_model.onCustomize(state);
+ }
+ });
+ m_browse.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ PageState state = e.getPageState();
+ setDisplayMode(state, true);
+ }
+ });
+ m_reset.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ PageState state = e.getPageState();
+ setDisplayMode(state, true);
+
+ m_model.onReset(state);
+ }
+ });
+
+ add(m_edit);
+ add(m_browse);
+ add(m_reset);
+ add(m_editor);
+ add(m_browser);
+ }
+
+ public void setDisplayMode(PageState state,
+ boolean browse) {
+ if (m_readOnly) {
+ return;
+ }
+ m_browse.setVisible(state, !browse);
+ m_reset.setVisible(state, !browse);
+ m_edit.setVisible(state, browse);
+ m_browser.setVisible(state, browse);
+ m_editor.setVisible(state, !browse);
+ }
+
+ public void register(Page page) {
+ super.register(page);
+
+ page.setVisibleDefault(m_browse, false);
+ page.setVisibleDefault(m_reset, false);
+ page.setVisibleDefault(m_edit, !m_readOnly);
+ page.setVisibleDefault(m_browser, true);
+ page.setVisibleDefault(m_editor, false);
+ }
+
+ public void generateXML(PageState state,
+ Element parent) {
+ Party party = Kernel.getContext().getParty();
+ Workspace global = m_model.getWorkspaceModel().getGlobalWorkspace(state);
+ PermissionDescriptor admin =
+ new PermissionDescriptor(PrivilegeDescriptor.ADMIN,
+ global,
+ party);
+ boolean hasAdmin = PermissionService.checkPermission(admin);
+ boolean userWorkspaces = Workspace.getConfig().getCreateUserWorkspaces();
+
+ if (party == null || m_readOnly ||
+ (!hasAdmin && !m_customizable) || (!hasAdmin && !userWorkspaces)) {
+ m_reset.setVisible(state, false);
+ m_browse.setVisible(state, false);
+ m_edit.setVisible(state, false);
+ }
+
+ super.generateXML(state, parent);
+ }
+
+}
diff --git a/ccm-bundle/src/com/arsdigita/bundle/ui/HomepageWorkspaceSelectionModel.java b/ccm-bundle/src/com/arsdigita/bundle/ui/HomepageWorkspaceSelectionModel.java
new file mode 100644
index 000000000..fc6fc5d57
--- /dev/null
+++ b/ccm-bundle/src/com/arsdigita/bundle/ui/HomepageWorkspaceSelectionModel.java
@@ -0,0 +1,287 @@
+/*
+ * Copyright (C) 2001 ArsDigita Corporation. All Rights Reserved.
+ *
+ * The contents of this file are subject to the ArsDigita Public
+ * License (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.arsdigita.com/ADPL.txt
+ *
+ * Software distributed under the License is distributed on an "AS
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * rights and limitations under the License.
+ *
+ */
+
+package com.arsdigita.aplaws.ui;
+
+
+import com.arsdigita.bebop.RequestLocal;
+import com.arsdigita.bebop.PageState;
+
+
+import com.arsdigita.kernel.Party;
+import com.arsdigita.kernel.User;
+import com.arsdigita.kernel.Kernel;
+import com.arsdigita.kernel.permissions.PermissionService;
+import com.arsdigita.kernel.permissions.PermissionDescriptor;
+import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
+
+import com.arsdigita.portalworkspace.Workspace;
+import com.arsdigita.portalworkspace.WorkspacePage;
+import com.arsdigita.portalworkspace.WorkspacePageCollection;
+
+import com.arsdigita.london.subsite.Subsite;
+
+import com.arsdigita.util.Assert;
+import com.arsdigita.util.UncheckedWrapperException;
+
+import com.arsdigita.domain.DataObjectNotFoundException;
+
+import org.apache.log4j.Logger;
+
+
+public class HomepageWorkspaceSelectionModel {
+ private RequestLocal m_loaded = new RequestLocal();
+ private RequestLocal m_global = new RequestLocal();
+ private RequestLocal m_personal = new RequestLocal();
+ private RequestLocal m_left = new RequestLocal();
+ private RequestLocal m_middle = new RequestLocal();
+ private RequestLocal m_right = new RequestLocal();
+ private RequestLocal m_custom = new RequestLocal();
+
+ private static Logger s_log = Logger.getLogger
+ (HomepageWorkspaceSelectionModel.class.getName());
+
+ public WorkspacePage getPortal(PageState state,
+ int column) {
+ if (!Boolean.TRUE.equals(m_loaded.get(state))) {
+ loadWorkspacePages(state);
+ }
+
+ if (column == 0) { // Always global portal
+ return (WorkspacePage)m_left.get(state);
+ } else if (column == 1) { // Always global portal
+ return (WorkspacePage)m_middle.get(state);
+ } else if (column == 2) { // Personal portal, fallback on global
+ Party party = (Party)Kernel.getContext().getParty();
+ WorkspacePage right = (WorkspacePage)m_right.get(state);
+ PermissionDescriptor admin =
+ new PermissionDescriptor(PrivilegeDescriptor.ADMIN,
+ right,
+ party);
+ // Always ensure admin gets global portal
+ // don't use custom portals if asked not to
+ if (m_custom.get(state) == null ||
+ PermissionService.checkPermission(admin) ||
+ !Workspace.getConfig().getCreateUserWorkspaces()) {
+ s_log.debug("Returning global portal");
+ return (WorkspacePage)m_right.get(state);
+ } else {
+ s_log.debug("Returning personal portal");
+ return (WorkspacePage)m_custom.get(state);
+ }
+ }
+
+ throw new UncheckedWrapperException("column out of range (0..2)");
+ }
+
+ public void onCustomize(PageState state,
+ int column) {
+ if (!Boolean.TRUE.equals(m_loaded.get(state))) {
+ loadWorkspacePages(state);
+ }
+
+ Party party = (Party)Kernel.getContext().getParty();
+
+ Assert.exists(party, Party.class);
+
+ // When customizing right column, may need to clone
+ // for a personal portal
+ // don't use custom portals if asked not to
+ if (column == 2 &&
+ Workspace.getConfig().getCreateUserWorkspaces()) {
+ Workspace global = getTopWorkspace();
+
+ WorkspacePage right = (WorkspacePage)m_right.get(state);
+ PermissionDescriptor admin =
+ new PermissionDescriptor(PrivilegeDescriptor.ADMIN,
+ right,
+ party);
+ if (PermissionService.checkPermission(admin)) {
+ s_log.debug("Party has admin on global portal");
+ return;
+ }
+
+ if (m_custom.get(state) != null) {
+ s_log.debug("Party has custom portal already");
+ return;
+ }
+
+ s_log.debug("Looking for custom column 2");
+
+ Workspace custom = null;
+ try {
+ custom = global.retrieveSubworkspaceForParty(party);
+ s_log.debug("Found exsting personal workspce");
+ } catch (DataObjectNotFoundException ex) {
+ s_log.debug("Created new personal workspace");
+ custom = Workspace.createWorkspace(
+ "personal-" + party.getID(),
+ "Personal Workspace for " + party.getDisplayName(),
+ global,
+ (User)party
+ );
+ }
+ s_log.debug("Looking for portal");
+ m_personal.set(state, custom);
+ WorkspacePageCollection portals = custom.getPages();
+ portals.addOrder(WorkspacePage.SORT_KEY);
+ WorkspacePage portal;
+ if (portals.next()) {
+ s_log.debug("Found portal");
+ portal = portals.getPage();
+ portals.close();
+ } else {
+ s_log.debug("Create portal");
+ portal = custom.addPage("Custom", "Custom page");
+ }
+ m_custom.set(state, portal);
+ }
+ }
+
+
+ public void onReset(PageState state,
+ int column) {
+ if (!Boolean.TRUE.equals(m_loaded.get(state))) {
+ loadWorkspacePages(state);
+ }
+
+ Party party = Kernel.getContext().getParty();
+
+ Assert.exists(party, Party.class);
+
+ WorkspacePage clear = null;
+
+ // don't use custom portals if asked not to
+ if (column == 2 &&
+ Workspace.getConfig().getCreateUserWorkspaces()) {
+ // If we find a custom workspace, then delete it,
+ // otherwise just clear the portlets.
+ Workspace global = getTopWorkspace();
+ Workspace custom = null;
+ try {
+ custom = global.retrieveSubworkspaceForParty(party);
+ Assert.isTrue(custom.getParty() != null &&
+ custom.getParty().equals(party),
+ "party is not null and not admin");
+ s_log.debug("Found exsting personal workspce");
+ custom.delete();
+ m_custom.set(state, null);
+ } catch (DataObjectNotFoundException ex) {
+ clear = (WorkspacePage)m_right.get(state);
+ }
+ } else if (column == 1) {
+ clear = (WorkspacePage)m_middle.get(state);
+ } else if (column == 0) {
+ clear = (WorkspacePage)m_left.get(state);
+ }
+
+ if (clear != null) {
+ clear.clearPortlets();
+ }
+ }
+
+
+ public Workspace getGlobalWorkspace(PageState state) {
+ if (!Boolean.TRUE.equals(m_loaded.get(state))) {
+ loadWorkspacePages(state);
+ }
+
+ return (Workspace)m_global.get(state);
+ }
+
+ public Workspace getPersonalWorkspace(PageState state) {
+ if (!Boolean.TRUE.equals(m_loaded.get(state))) {
+ loadWorkspacePages(state);
+ }
+
+ return (Workspace)m_personal.get(state);
+ }
+
+ private void loadWorkspacePages(PageState state) {
+ Workspace global = getTopWorkspace();
+ m_global.set(state, global);
+
+ WorkspacePage left = null;
+ WorkspacePage middle = null;
+ WorkspacePage right = null;
+
+ WorkspacePageCollection portals = global.getPages();
+ portals.addOrder(WorkspacePage.SORT_KEY);
+ while (portals.next()) {
+ WorkspacePage portal = portals.getPage();
+
+ if (portal.getSortKey() == 0) {
+ left = portal;
+ } else if (portal.getSortKey() == 1) {
+ middle = portal;
+ } else if (portal.getSortKey() == 2) {
+ right = portal;
+ }
+ }
+
+ if (left == null) {
+ left = global.addPage("Left", "Left hand page");
+ }
+ if (middle == null) {
+ middle = global.addPage("Middle", "Middle page");
+ }
+ if (right == null) {
+ right = global.addPage("Right", "Right hand page");
+ }
+ m_left.set(state, left);
+ m_middle.set(state, middle);
+ m_right.set(state, right);
+
+
+ Party party = (Party)Kernel.getContext().getParty();
+ m_custom.set(state, null);
+ if (party != null) {
+ Workspace custom = null;
+ try {
+ custom = global.retrieveSubworkspaceForParty(party);
+ } catch (DataObjectNotFoundException ex) {
+ // nada
+ }
+ if (custom != null) {
+ portals = custom.getPages();
+ portals.addOrder(WorkspacePage.SORT_KEY);
+ if (portals.next()) {
+ WorkspacePage portal = portals.getPage();
+ m_custom.set(state, portal);
+ }
+ portals.close();
+ }
+ s_log.debug("Is there a custom portal ?" + custom +
+ " - " + m_custom.get(state));
+ m_personal.set(state, custom);
+ }
+
+ m_loaded.set(state, Boolean.TRUE);
+ }
+
+ protected Workspace getTopWorkspace() {
+ if (Subsite.getContext().hasSite()) {
+ if (s_log.isDebugEnabled()) {
+ s_log.debug("Return a subsite front page");
+ }
+ return (Workspace)Subsite.getContext().getSite().getFrontPage();
+ } else {
+ if (s_log.isDebugEnabled()) {
+ s_log.debug("Return the main front page");
+ }
+ return (Workspace)Kernel.getContext().getResource();
+ }
+ }
+}
diff --git a/ccm-bundle/src/com/arsdigita/bundle/ui/ItemCategoryPicker.java b/ccm-bundle/src/com/arsdigita/bundle/ui/ItemCategoryPicker.java
new file mode 100644
index 000000000..1b9365278
--- /dev/null
+++ b/ccm-bundle/src/com/arsdigita/bundle/ui/ItemCategoryPicker.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+package com.arsdigita.aplaws.ui;
+
+import org.apache.log4j.Logger;
+
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.bebop.parameters.BigDecimalParameter;
+import com.arsdigita.bebop.parameters.StringParameter;
+import com.arsdigita.categorization.ui.ACSObjectCategoryForm;
+import com.arsdigita.cms.CMS;
+import com.arsdigita.cms.ContentItem;
+import com.arsdigita.cms.ui.authoring.*;
+import com.arsdigita.kernel.ACSObject;
+import com.arsdigita.london.terms.ui.ACSObjectCategoryPicker;
+import com.arsdigita.london.terms.ui.TermWidget;
+
+/**
+ *
cms specific Concrete implementation of
+ * com.arsdigita.aplaws.ui.ACSObjectCategoryPicker.
+ *
+ *
+ *
+ * Activated by pointing the parameter
+ * com.arsdigita.cms.category_authoring_add_form< to it.
+ */
+
+
+public class ItemCategoryPicker extends ACSObjectCategoryPicker {
+
+ private static final Logger s_log = Logger.getLogger(ItemCategoryPicker.class);
+ // private static final class s_picker = this ;
+
+ public ItemCategoryPicker(BigDecimalParameter root,
+ StringParameter mode) {
+ super(root, mode);
+ s_log.debug("instantiating ItemCategoryPicker");
+
+ }
+
+
+ /*
+ * @see com.arsdigita.aplaws.ui.ACSObjectCategoryPicker#getForm(
+ com.arsdigita.bebop.parameters.BigDecimalParameter,
+ com.arsdigita.bebop.parameters.StringParameter)
+ */
+ protected ACSObjectCategoryForm getForm(BigDecimalParameter root,
+ StringParameter mode) {
+ s_log.debug("getForm");
+ return new ItemCategoryForm(root, mode, new TermWidget(mode, this));
+ }
+
+
+ /*
+ * @see com.arsdigita.aplaws.ui.ACSObjectCategoryPicker#getObject()
+ */
+ protected ACSObject getObject(PageState state) {
+ ContentItem item = CMS.getContext().getContentItem();
+ return item.getParent();
+
+ }
+
+
+}
diff --git a/ccm-bundle/src/com/arsdigita/bundle/ui/SimplePage.java b/ccm-bundle/src/com/arsdigita/bundle/ui/SimplePage.java
new file mode 100644
index 000000000..bafa8be3c
--- /dev/null
+++ b/ccm-bundle/src/com/arsdigita/bundle/ui/SimplePage.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+package com.arsdigita.aplaws.ui;
+
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.bebop.Label;
+import com.arsdigita.dispatcher.DispatcherHelper;
+import com.arsdigita.xml.Document;
+import com.arsdigita.xml.Element;
+import com.arsdigita.web.Web;
+
+/**
+ *
+ * Special implementation of com.arsdigita.ui.SimplePage as
+ * the base page to serve bebop pages.
+ *
+ * Activated by pointing the parameter waf.bebop.base_page
+ * to it.
+ */
+public class SimplePage extends com.arsdigita.ui.SimplePage {
+
+ public SimplePage(String application,
+ Label title,
+ String id) {
+ super(application, title, id);
+ }
+
+
+ public Element generateXMLHelper(PageState state,
+ Document parent) {
+ Element page = super.generateXMLHelper(state, parent);
+
+ /*
+ * TODO: What specific funcionality is added here and what is
+ * its purpose and why is the bebop standard implementation
+ * insufficient.
+ *
+ * Two xml attributes are added in addition to the bebop standard
+ * implementation.
+ */
+ if (Web.getContext().getRequestURL() != null) {
+ page.addAttribute("url", Web.getContext().getRequestURL().toString());
+
+ page.addAttribute("textOnly", "/text".equals(
+ DispatcherHelper
+ .getDispatcherPrefix(state.getRequest()))
+ ? "1" : "0"
+ );
+ }
+
+ return page;
+ }
+}
diff --git a/ccm-bundle/src/com/arsdigita/bundle/ui/TermItemSummary.java b/ccm-bundle/src/com/arsdigita/bundle/ui/TermItemSummary.java
new file mode 100644
index 000000000..f6aee2e6e
--- /dev/null
+++ b/ccm-bundle/src/com/arsdigita/bundle/ui/TermItemSummary.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+package com.arsdigita.aplaws.ui;
+
+import com.arsdigita.london.terms.Domain;
+import com.arsdigita.london.terms.ui.AbstractTermItemSummary;
+
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.bebop.Page;
+import com.arsdigita.bebop.parameters.StringParameter;
+
+public class TermItemSummary extends AbstractTermItemSummary {
+
+ private StringParameter m_key;
+ private String m_defaultKey = "LGSL";
+
+ public TermItemSummary() {
+ m_key = new StringParameter("key");
+ }
+
+ public void register(Page p) {
+ super.register(p);
+
+ p.addGlobalStateParam(m_key);
+ }
+
+ public void setDefaultDomain(String key) {
+ m_defaultKey = key;
+ }
+
+ protected Domain getDomain(PageState state) {
+ String key = (String)state.getValue(m_key);
+
+ if (key == null) {
+ key = m_defaultKey;
+ }
+
+ return Domain.retrieve(key);
+ }
+
+}
diff --git a/ccm-bundle/web/assets/fckeditor/config/fckconfigOpenCCM.js b/ccm-bundle/web/assets/fckeditor/config/fckconfigOpenCCM.js
new file mode 100644
index 000000000..fe045f7ce
--- /dev/null
+++ b/ccm-bundle/web/assets/fckeditor/config/fckconfigOpenCCM.js
@@ -0,0 +1,137 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 Frederico Caldeira Knabben
+ *
+ * Licensed under the terms of the GNU Lesser General Public License:
+ * http://www.opensource.org/licenses/lgpl-license.php
+ *
+ * For further information visit:
+ * http://www.fckeditor.net/
+ *
+ * File Name: fckconfigOpenCCM.js
+ * Editor configuration settings for use in admin interface in APLAWS/OpenCCM.
+ * This configuration is designed to match the following goals:
+ * - Easy useage of the editor
+ * - Clean HTML output, this means for example that no deprected elements are useable from the editor
+ *
+ * This file is organized in the same way as the page of the FCKEditor documentation showing all config options.
+ * The page can be found here: http://docs.fckeditor.net/FCKeditor_2.x/Developers_Guide/Configuration/Configuration_Options
+ *
+ * - Semantic HTML output. This means that elements like are prefered against such as
+ * This config is loaded from the Javascript in the calling page using AFTER the
+ * default fckconfig.js is loaded.
+ *
+ * File Authors:
+ * Chris Burnett (orginale fckeditordefaultstyle.js for APLAWS)
+ * Jens Pelzetter
+ */
+
+/* **************************************************************************************************************** */
+
+
+/* Editor Behavior
+ --------------- */
+
+FCKConfig.AutoDetectPasteFromWord = false ; //Paste Word text directly to the editor (only IE)
+FCKConfig.CleanWordKeepsStructure = true ; //Prefer to keep HTML structure, not layout
+FCKConfig.DocType = '' ;
+FCKConfig.ForcePasteAsPlainText = true ; //Text pasted in from another app will appear as plain text
+
+
+/* Styles
+ ------ */
+
+FCKConfig.StylesXmlPath = FCKConfig.EditorPath + 'config/fckconfigOpenCCM.xml' ; //Some styles
+
+/* HTML Output
+ ----------- */
+
+FCKConfig.FormatOutput = true ; //Format output code
+FCKConfig.FormatSource = true ;
+
+/* User interface
+ -------------- */
+
+FCKConfig.ContextMenu = ['Generic','Link','Anchor','Image','Flash','Select','Textarea','Checkbox','Radio','TextField','HiddenField','ImageButton','Button','BulletedList','NumberedList','TableCell','Table','Form'] ;
+FCKConfig.ImageDlgHideLink = true ;
+FCKConfig.ImageDlgHideAdvanced = true ;
+FCKConfig.ShowDropDialog = true ;
+FCKConfig.ToolbarSets["AplawsBasic"] = [
+ ['Style','-','OrderedList','UnorderedList','Subscript', 'Superscript', '-','SpellCheck','Link','Unlink','RemoveFormat','-','ImageButton', '-', 'AdvToolbar', 'About']
+] ;
+
+FCKConfig.ToolbarSets["AplawsAdvanced"] = [
+ ['Style','-','OrderedList','UnorderedList','Subscript', 'Superscript'],
+ ['Cut','Copy','Paste','PasteText','PasteWord','Undo','Redo','RemoveFormat'],
+ ['Find','Replace','SelectAll', '-','SpellCheck'],
+ '/',
+ ['Link','Unlink','Anchor','-','Source'],
+ ['SimpleToolbar']
+] ;
+
+
+// Replace the Advanced toolbar with AplawsAdvanced & setup the Basic toolbar to use the AplawsBasic toolbar
+// The two toolbars are used to support the dynamic toolbar switching plugin.
+// Set the Default to be the Basic version so that the editor loads the basic toolbar on startup.
+
+FCKConfig.ToolbarSets["Advanced"] = FCKConfig.ToolbarSets["AplawsAdvanced"] ;
+FCKConfig.ToolbarSets["Basic"] = FCKConfig.ToolbarSets["AplawsBasic"] ;
+FCKConfig.ToolbarSets["Default"] = FCKConfig.ToolbarSets["Basic"] ;
+
+/* Advanced
+ -------- */
+FCKConfig.FirefoxSpellChecker = true ;
+FCKConfig.SpellChecker = 'ieSpell' ; // 'ieSpell' | 'SpellerPages'
+FCKConfig.IeSpellDownloadUrl = 'http://www.iespell.com/rel/ieSpellSetup211325.exe' ;
+
+/* File Browser and Updoader
+ ------------------------- */
+
+FCKConfig.LinkBrowser = true ;
+FCKConfig.LinkBrowserURL = "/ccm/content/admin/search.jsp?useURL=true&widget=getElementById('txtUrl')" ;
+FCKConfig.LinkBrowserWindowWidth = FCKConfig.ScreenWidth * 0.7 ; // 70%
+FCKConfig.LinkBrowserWindowHeight = FCKConfig.ScreenHeight * 0.7 ; // 70%
+
+
+/*
+FCKConfig.ToolbarSets["AplawsBasic"] = [
+ ['Style','-','Bold','OrderedList','UnorderedList','-','SpellCheck','Link','Unlink','RemoveFormat','-','AdvToolbar']
+] ;
+
+FCKConfig.ToolbarSets["AplawsAdvanced"] = [
+ ['Style','-','Bold','OrderedList','UnorderedList'],
+ ['Cut','Copy','Paste','PasteText','PasteWord','Undo','Redo','RemoveFormat'],
+ ['Find','Replace','SelectAll', '-','SpellCheck'],
+ '/',
+ ['UniversalKey'],
+ ['Link','Unlink','Anchor','-','Source'],
+ ['SimpleToolbar']
+] ;
+
+
+// Replace the Advanced toolbar with AplawsAdvanced & setup the Basic toolbar to use the AplawsBasic toolbar
+// The two toolbars are used to support the dynamic toolbar switching plugin.
+// Set the Default to be the Basic version so that the editor loads the basic toolbar on startup.
+
+FCKConfig.ToolbarSets["Advanced"] = FCKConfig.ToolbarSets["AplawsAdvanced"] ;
+FCKConfig.ToolbarSets["Basic"] = FCKConfig.ToolbarSets["AplawsBasic"] ;
+FCKConfig.ToolbarSets["Default"] = FCKConfig.ToolbarSets["Basic"] ;
+
+
+FCKConfig.StylesXmlPath = FCKConfig.EditorPath + 'config/fckconfigstyledefault.xml' ;
+FCKConfig.ContextMenu = ['Generic','Link','Anchor','Image','Flash','Select','Textarea','Checkbox','Radio','TextField','HiddenField','ImageButton','Button','BulletedList','NumberedList','TableCell','Table','Form'] ;
+
+FCKConfig.SpellChecker = 'ieSpell' ; // 'ieSpell' | 'SpellerPages'
+FCKConfig.IeSpellDownloadUrl = 'http://www.iespell.com/rel/ieSpellSetup211325.exe' ;
+
+FCKConfig.ImageDlgHideLink = true ;
+FCKConfig.ImageDlgHideAdvanced = true ;
+
+FCKConfig.FlashDlgHideAdvanced = true ;
+
+FCKConfig.LinkBrowser = true ;
+FCKConfig.LinkBrowserURL = "/ccm/content/admin/search.jsp?useURL=true&widget=getElementById('txtUrl')" ;
+FCKConfig.LinkBrowserWindowWidth = FCKConfig.ScreenWidth * 0.7 ; // 70%
+FCKConfig.LinkBrowserWindowHeight = FCKConfig.ScreenHeight * 0.7 ; // 70%
+*/
+
diff --git a/ccm-bundle/web/assets/fckeditor/config/fckconfigOpenCCM.xml b/ccm-bundle/web/assets/fckeditor/config/fckconfigOpenCCM.xml
new file mode 100644
index 000000000..c5ebd5667
--- /dev/null
+++ b/ccm-bundle/web/assets/fckeditor/config/fckconfigOpenCCM.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/assets/xinha/XinhaConfig.js b/ccm-bundle/web/assets/xinha/XinhaConfig.js
new file mode 100644
index 000000000..d39daff3b
--- /dev/null
+++ b/ccm-bundle/web/assets/xinha/XinhaConfig.js
@@ -0,0 +1,18 @@
+/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
+/* This file is part of version 0.95 released Mon, 12 May 2008 17:33:15 +0200 */
+/* The URL of the most recent version of this file is http://svn.xinha.webfactional.com/trunk/examples/XinhaConfig.js */
+xinha_init=null;
+xinha_config=null;
+xinha_init=xinha_init?xinha_init:function(){
+xinha_editors=xinha_editors?xinha_editors:["myTextArea","anotherOne"];
+xinha_plugins=xinha_plugins?xinha_plugins:["CharacterMap","ContextMenu","SmartReplace","Stylist","Linker","SuperClean","TableOperations"];
+if(!Xinha.loadPlugins(xinha_plugins,xinha_init)){
+return;
+}
+xinha_config=xinha_config?xinha_config():new Xinha.Config();
+xinha_config.pageStyleSheets=[_editor_url+"examples/full_example.css"];
+xinha_editors=Xinha.makeEditors(xinha_editors,xinha_config,xinha_plugins);
+Xinha.startEditors(xinha_editors);
+};
+Xinha.addOnloadHandler(xinha_init);
+
diff --git a/ccm-bundle/web/packages/content-section/templates/default/aplaws-folder.jsp b/ccm-bundle/web/packages/content-section/templates/default/aplaws-folder.jsp
new file mode 100644
index 000000000..7341b15cf
--- /dev/null
+++ b/ccm-bundle/web/packages/content-section/templates/default/aplaws-folder.jsp
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+// throw new RedirectSignal(URL.there(request, "/navigation/"), false);
+ throw new RedirectSignal(URL.there(request, "/portal/"), false);
+
+
diff --git a/ccm-bundle/web/packages/content-section/templates/default/aplaws-item.jsp b/ccm-bundle/web/packages/content-section/templates/default/aplaws-item.jsp
new file mode 100644
index 000000000..017b1664e
--- /dev/null
+++ b/ccm-bundle/web/packages/content-section/templates/default/aplaws-item.jsp
@@ -0,0 +1,41 @@
+
+
+
+
+
+ NavigationModel model = new CMSNavigationModel();
+
+
+
+
+
+
+ ((com.arsdigita.navigation.ui.category.Path)categoryPath)
+ .setModel(model);
+
+
+
+ ((com.arsdigita.navigation.ui.category.Menu)categoryMenu)
+ .setModel(model);
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/packages/content-section/www/admin/auto-cat.jsp b/ccm-bundle/web/packages/content-section/www/admin/auto-cat.jsp
new file mode 100644
index 000000000..db1494bd1
--- /dev/null
+++ b/ccm-bundle/web/packages/content-section/www/admin/auto-cat.jsp
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/packages/content-section/www/admin/load-cat.jsp b/ccm-bundle/web/packages/content-section/www/admin/load-cat.jsp
new file mode 100644
index 000000000..6e555992d
--- /dev/null
+++ b/ccm-bundle/web/packages/content-section/www/admin/load-cat.jsp
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/packages/content-section/www/crash-me.jsp b/ccm-bundle/web/packages/content-section/www/crash-me.jsp
new file mode 100644
index 000000000..ddb3e8ded
--- /dev/null
+++ b/ccm-bundle/web/packages/content-section/www/crash-me.jsp
@@ -0,0 +1,10 @@
+
+
+
+ ((Object)null).hashCode();
+
+
+
diff --git a/ccm-bundle/web/packages/content-section/www/person4homepages.jsp b/ccm-bundle/web/packages/content-section/www/person4homepages.jsp
new file mode 100644
index 000000000..ad3103a5d
--- /dev/null
+++ b/ccm-bundle/web/packages/content-section/www/person4homepages.jsp
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+ long age = Navigation.getConfig().getIndexPageCacheLifetime();
+ if (age == 0) {
+ DispatcherHelper.cacheDisable(response);
+ } else {
+ DispatcherHelper.cacheForWorld(response, (int)age);
+ }
+
+
+
+
+
+
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) personList).setDefinition(new CMSDataCollectionDefinition());
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) personList).setRenderer(new CMSDataCollectionRenderer());
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) personList).getDefinition().setObjectType("com.arsdigita.cms.contenttypes.GenericPerson");
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) personList).getRenderer().setSpecializeObjects(true);
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) personList).getDefinition().setDescendCategories(true);
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) personList).getDefinition().setExcludeIndexObjects(false);
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) personList).getDefinition().setFilterCategory(false);
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) personList).getRenderer().setPageSize(99999);
+ if((request.getParameterMap().get("DaBInId") != null) && (((String[])request.getParameterMap().get("DaBInId")).length > 0)) {
+ String[] params = (String[]) request.getParameterMap().get("DaBInId");
+ String dabinid = params[0];
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) personList).setSQLFilter(String.format("pageDescription LIKE '%%DaBInId={%s}%%'", dabinid));
+ }
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ccm-bundle/web/packages/content-section/www/projects4homepages.jsp b/ccm-bundle/web/packages/content-section/www/projects4homepages.jsp
new file mode 100644
index 000000000..5579d1073
--- /dev/null
+++ b/ccm-bundle/web/packages/content-section/www/projects4homepages.jsp
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+ long age = Navigation.getConfig().getIndexPageCacheLifetime();
+ if (age == 0) {
+ DispatcherHelper.cacheDisable(response);
+ } else {
+ DispatcherHelper.cacheForWorld(response, (int)age);
+ }
+
+
+
+
+
+
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) projectList).setDefinition(new CMSDataCollectionDefinition());
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) projectList).setRenderer(new CMSDataCollectionRenderer());
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) projectList).getDefinition().setObjectType("com.arsdigita.cms.contenttypes.SciProject");
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) projectList).getRenderer().setSpecializeObjects(true);
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) projectList).getDefinition().setDescendCategories(true);
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) projectList).getDefinition().setExcludeIndexObjects(false);
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) projectList).getDefinition().setFilterCategory(false);
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) projectList).getDefinition().setAddOrder("title");
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) projectList).getRenderer().setSpecializeObjectsContext("sciProjectList");
+ if((request.getParameterMap().get("DaBInId") != null) && (((String[])request.getParameterMap().get("DaBInId")).length > 0)) {
+ String[] params = (String[]) request.getParameterMap().get("DaBInId");
+ String dabinid = params[0];
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) projectList).setSQLFilter(String.format("persons.pageDescription LIKE '%%DaBInId={%s}%%'", dabinid));
+
+ }
+
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) projectList).getRenderer().setPageSize(99999);
+
+
+
+
+
+
diff --git a/ccm-bundle/web/packages/content-section/www/publications4homepages.jsp b/ccm-bundle/web/packages/content-section/www/publications4homepages.jsp
new file mode 100644
index 000000000..6a3f587f7
--- /dev/null
+++ b/ccm-bundle/web/packages/content-section/www/publications4homepages.jsp
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+ long age = Navigation.getConfig().getIndexPageCacheLifetime();
+ if (age == 0) {
+ DispatcherHelper.cacheDisable(response);
+ } else {
+ DispatcherHelper.cacheForWorld(response, (int)age);
+ }
+
+
+
+
+
+
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) publicationList).setDefinition(new CMSDataCollectionDefinition());
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) publicationList).setRenderer(new CMSDataCollectionRenderer());
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) publicationList).getDefinition().setObjectType("com.arsdigita.cms.contenttypes.Publication");
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) publicationList).getRenderer().setSpecializeObjects(true);
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) publicationList).getDefinition().setDescendCategories(true);
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) publicationList).getDefinition().setExcludeIndexObjects(false);
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) publicationList).getDefinition().setFilterCategory(false);
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) publicationList).getDefinition().addOrder("yearOfPublication desc");
+ if((request.getParameterMap().get("DaBInId") != null) && (((String[])request.getParameterMap().get("DaBInId")).length > 0)) {
+ String[] params = (String[]) request.getParameterMap().get("DaBInId");
+ String dabinid = params[0];
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) publicationList).setSQLFilter(String.format("authors.pageDescription LIKE '%%DaBInId={%s}%%'", dabinid));
+
+ }
+
+ ((com.arsdigita.london.navigation.ui.object.ComplexObjectList) publicationList).getRenderer().setPageSize(99999);
+
+
+
+
+
+
diff --git a/ccm-bundle/web/packages/content-section/www/textonly.jsp b/ccm-bundle/web/packages/content-section/www/textonly.jsp
new file mode 100644
index 000000000..90d45c2c1
--- /dev/null
+++ b/ccm-bundle/web/packages/content-section/www/textonly.jsp
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+ String returnURL = request.getParameter("returnURL");
+
+ if ( returnURL == null ) {
+ returnURL = "/";
+ }
+
+ String mode = request.getParameter("textOnly");
+ if ("1".equals(mode)) {
+ if (!returnURL.startsWith("/text")) {
+ returnURL = "/text" + returnURL;
+ }
+ } else {
+ if (returnURL.startsWith("/text")) {
+ returnURL = returnURL.substring(5);
+ }
+ }
+
+ response.sendRedirect(returnURL);
+
+
+
diff --git a/ccm-bundle/web/templates/ccm-navigation/navigation/Sci-README b/ccm-bundle/web/templates/ccm-navigation/navigation/Sci-README
new file mode 100644
index 000000000..034e7065c
--- /dev/null
+++ b/ccm-bundle/web/templates/ccm-navigation/navigation/Sci-README
@@ -0,0 +1,9 @@
+Information for administrators and developers:
+
+This directory contains Navigation item pages specifically crafted for
+Scientific CMS. The are activated by a customized template.txt file list.
+
+These file may be overwritten or ammended by site specific templates stored
+in den bundles subdirectory. In case of additional templates a customised
+template.txt must be provided and activated in the integrations.properties
+configuration file.
\ No newline at end of file
diff --git a/ccm-bundle/web/templates/ccm-navigation/navigation/SciPublicationList.jsp b/ccm-bundle/web/templates/ccm-navigation/navigation/SciPublicationList.jsp
new file mode 100644
index 000000000..05888eb75
--- /dev/null
+++ b/ccm-bundle/web/templates/ccm-navigation/navigation/SciPublicationList.jsp
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+ long age = Navigation.getConfig().getIndexPageCacheLifetime();
+ if (age == 0) {
+ DispatcherHelper.cacheDisable(response);
+ } else {
+ DispatcherHelper.cacheForWorld(response, (int)age);
+ }
+
+
+
+
+
+
+
+
+
+ CustomizableObjectList objList = (CustomizableObjectList) itemList;
+ objList.setDefinition(new CMSDataCollectionDefinition());
+ objList.setRenderer(new CMSDataCollectionRenderer());
+ objList.setCustomName("SciPublicationsList");
+ objList.getDefinition().setObjectType("com.arsdigita.cms.contenttypes.Publication");
+ objList.getDefinition().setDescendCategories(false);
+ objList.addTextFilter("title", "title");
+ objList.addTextFilter("authors.surname", "author");
+ objList.addSelectFilter("yearOfPublication", "yearOfPublication", true, true, true, true);
+ objList.addSortField("title", "title asc");
+ objList.addSortField("yearAsc", "yearOfPublication asc");
+ objList.addSortField("yearDesc", "yearOfPublication desc");
+ objList.addSortField("authors", "authors.surname asc, authors.givenname asc");
+ objList.getDefinition().addOrder(objList.getOrder(request.getParameter("sort")));
+
+ objList.getRenderer().setPageSize(20);
+ objList.getRenderer().setSpecializeObjects(true);
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ccm-bundle/web/templates/ccm-navigation/navigation/SpecializingList.jsp b/ccm-bundle/web/templates/ccm-navigation/navigation/SpecializingList.jsp
new file mode 100644
index 000000000..31fd0f20e
--- /dev/null
+++ b/ccm-bundle/web/templates/ccm-navigation/navigation/SpecializingList.jsp
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+ long age = Navigation.getConfig().getIndexPageCacheLifetime();
+ if (age == 0) {
+ DispatcherHelper.cacheDisable(response);
+ } else {
+ DispatcherHelper.cacheForWorld(response, (int)age);
+ }
+
+
+
+
+
+
+
+
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) itemList).setDefinition(new CMSDataCollectionDefinition());
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) itemList).setRenderer(new CMSDataCollectionRenderer());
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) itemList).getDefinition().setObjectType("com.arsdigita.cms.ContentPage");
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) itemList).getDefinition().addOrder("parent.categories.link.sortKey");
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) itemList).getRenderer().setPageSize(20);
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) itemList).getRenderer().setSpecializeObjects(true);
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ccm-bundle/web/templates/ccm-navigation/navigation/sci-atoz.jsp b/ccm-bundle/web/templates/ccm-navigation/navigation/sci-atoz.jsp
new file mode 100644
index 000000000..f830f7cbb
--- /dev/null
+++ b/ccm-bundle/web/templates/ccm-navigation/navigation/sci-atoz.jsp
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+ long age = Navigation.getConfig().getIndexPageCacheLifetime();
+ if (age == 0) {
+ DispatcherHelper.cacheDisable(response);
+ } else {
+ DispatcherHelper.cacheForWorld(response, (int)age);
+ }
+
+
+
+
+
+
+
+
+
+ ((com.arsdigita.navigation.ui.object.AtoZObjectList) itemList).setDefinition(new CMSDataCollectionDefinition());
+ ((com.arsdigita.navigation.ui.object.AtoZObjectList) itemList).setRenderer(new CMSDataCollectionRenderer());
+ ((com.arsdigita.navigation.ui.object.AtoZObjectList) itemList).getDefinition().setObjectType("com.arsdigita.cms.ContentPage");
+
+ ((com.arsdigita.navigation.ui.object.AtoZObjectList) itemList).getDefinition().setDescendCategories(false);
+ ((com.arsdigita.navigation.ui.object.AtoZObjectList) itemList).getDefinition().addOrder("title");
+
+ ((com.arsdigita.navigation.ui.object.AtoZObjectList) itemList).getRenderer().setPageSize(20);
+ ((com.arsdigita.navigation.ui.object.AtoZObjectList) itemList).getRenderer().addAttribute("objectType");
+ ((com.arsdigita.navigation.ui.object.AtoZObjectList) itemList).getRenderer().addAttribute( "title");
+ ((com.arsdigita.navigation.ui.object.AtoZObjectList) itemList).getRenderer().addAttribute( "definition");
+ ((com.arsdigita.navigation.ui.object.AtoZObjectList) itemList).getRenderer().addAttribute( "summary");
+ ((com.arsdigita.navigation.ui.object.AtoZObjectList) itemList).getRenderer().addAttribute( "lead");
+
+
+
+
+
diff --git a/ccm-bundle/web/templates/ccm-navigation/navigation/sci-default.jsp b/ccm-bundle/web/templates/ccm-navigation/navigation/sci-default.jsp
new file mode 100644
index 000000000..0a3422b34
--- /dev/null
+++ b/ccm-bundle/web/templates/ccm-navigation/navigation/sci-default.jsp
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+ long age = Navigation.getConfig().getIndexPageCacheLifetime();
+ if (age == 0) {
+ DispatcherHelper.cacheDisable(response);
+ } else {
+ DispatcherHelper.cacheForWorld(response, (int)age);
+ }
+
+
+
+
+
+
+
+
+
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).setDefinition(new CMSDataCollectionDefinition());
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).setRenderer(new CMSDataCollectionRenderer());
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getDefinition().setObjectType("com.arsdigita.cms.ContentPage");
+
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getDefinition().setDescendCategories(false);
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getDefinition().addOrder("parent.categories.link.sortKey");
+
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().setPageSize(30);
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute("objectType");
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute("title");
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute( "definition");
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute( "summary");
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute( "lead");
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute( "description");
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute( "eventDate");
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute( "startDate" );
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute( "endDate");
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute( "newsDate");
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/templates/ccm-navigation/navigation/sci-events.jsp b/ccm-bundle/web/templates/ccm-navigation/navigation/sci-events.jsp
new file mode 100644
index 000000000..1394178e6
--- /dev/null
+++ b/ccm-bundle/web/templates/ccm-navigation/navigation/sci-events.jsp
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+ long age = Navigation.getConfig().getIndexPageCacheLifetime();
+ if (age == 0) {
+ DispatcherHelper.cacheDisable(response);
+ } else {
+ DispatcherHelper.cacheForWorld(response, (int)age);
+ }
+
+
+
+
+
+
+
+
+
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).setDefinition(new CMSDataCollectionDefinition());
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).setRenderer(new CMSDataCollectionRenderer());
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).getDefinition().setObjectType("com.arsdigita.cms.contenttypes.Event");
+
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).setSQLFilter("(endDate >= :today and (endTime > :time or endTime is null)) or (endDate is null and startDate >= :today)");
+
+ // Java ist mal wieder kompliziert. Man braucht ein Calender-Object, damit man Datumsarithmetik betreiben kann. java.util.Calendar ist allerdings // abstract. Deshalb muß man java.util.GregorianCalendar verwenden. Dann kann man mit der add-Methode verschiedene Felder manipulieren. // Aber Achtung - die add-Method liefert void zurück. Daher kann man das nicht alles in einer Zeile machen. Also Variablen anlegen. // Komplizierter geht's wohl nicht mehr.
+ java.util.GregorianCalendar now = new java.util.GregorianCalendar();
+ java.util.Date today = (new java.util.GregorianCalendar(now.get(java.util.GregorianCalendar.YEAR),
+ now.get(java.util.GregorianCalendar.MONTH),
+ now.get(java.util.GregorianCalendar.DATE))).getTime();
+ // Im Event-CT ist das Datum als SQL-Type Date eingetragen, die Uhrzeit aber als SQL-Typ timestamptz. Leider wird von ccm im letzten
+ // das Datum nicht gesetzt, so daß der Timestamp immer eine Uhrzeit am 1.1.1970 angibt. Das ist ziemlich bescheuert und macht hier
+ // diesen kompliezierten Vergleich notwendig. Sonst könnte man einfach mit dem aktuellen Timestamp vergleichen.
+ java.util.Date time = (new java.util.GregorianCalendar(70,0,1, // this is 01.01.1970 - start of UNIX timestamp
+ now.get(java.util.GregorianCalendar.HOUR_OF_DAY),
+ now.get(java.util.GregorianCalendar.MINUTE),
+ now.get(java.util.GregorianCalendar.SECOND))).getTime();
+
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).setParameter("today", today);
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).setParameter("time", time);
+
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).getDefinition().setDescendCategories(true);
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).getDefinition().addOrder("startDate");
+
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).getRenderer().addAttribute("objectType");
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).getRenderer().addAttribute("title");
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).getRenderer().addAttribute("lead");
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).getRenderer().addAttribute("eventDate");
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).getRenderer().addAttribute("launchDate");
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).getRenderer().addAttribute("startDate");
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).getRenderer().addAttribute("endDate");
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/templates/ccm-navigation/navigation/sci-portal-welcome.jsp b/ccm-bundle/web/templates/ccm-navigation/navigation/sci-portal-welcome.jsp
new file mode 100644
index 000000000..fa67f6b0e
--- /dev/null
+++ b/ccm-bundle/web/templates/ccm-navigation/navigation/sci-portal-welcome.jsp
@@ -0,0 +1,38 @@
+
+
+ <%-- JSP template to use a portal page as index page in navigation --%>
+
+
+
+
+
+
+
+ long age = Navigation.getConfig().getIndexPageCacheLifetime();
+ if (age == 0) {
+ DispatcherHelper.cacheDisable(response);
+ } else {
+ DispatcherHelper.cacheForWorld(response, (int)age);
+ }
+
+
+
+
+
+
+
+
+ ((com.arsdigita.portalworkspace.ui.WorkspaceViewer) portalWorkspace).setWorkspaceModel(new CategoryPortalSelectionModel());
+
+
+
+
+
diff --git a/ccm-bundle/web/templates/ccm-navigation/navigation/sci-portal.jsp b/ccm-bundle/web/templates/ccm-navigation/navigation/sci-portal.jsp
new file mode 100644
index 000000000..bd78893d6
--- /dev/null
+++ b/ccm-bundle/web/templates/ccm-navigation/navigation/sci-portal.jsp
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+ long age = Navigation.getConfig().getIndexPageCacheLifetime();
+ if (age == 0) {
+ DispatcherHelper.cacheDisable(response);
+ } else {
+ DispatcherHelper.cacheForWorld(response, (int)age);
+ }
+
+
+
+
+
+
+
+
+ ((com.arsdigita.portalworkspace.ui.WorkspaceViewer) portalWorkspace).setWorkspaceModel(new CategoryPortalSelectionModel());
+
+
+
+
+
diff --git a/ccm-bundle/web/templates/ccm-navigation/navigation/sci-recent.jsp b/ccm-bundle/web/templates/ccm-navigation/navigation/sci-recent.jsp
new file mode 100644
index 000000000..fb78c4971
--- /dev/null
+++ b/ccm-bundle/web/templates/ccm-navigation/navigation/sci-recent.jsp
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+ long age = Navigation.getConfig().getIndexPageCacheLifetime();
+ if (age == 0) {
+ DispatcherHelper.cacheDisable(response);
+ } else {
+ DispatcherHelper.cacheForWorld(response, (int)age);
+ }
+
+
+
+
+
+
+
+
+
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).setDefinition(new CMSDataCollectionDefinition());
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).setRenderer(new CMSDataCollectionRenderer());
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getDefinition().setObjectType("com.arsdigita.cms.ContentPage");
+
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getDefinition().setDescendCategories(false);
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getDefinition().addOrder("id");
+
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().setPageSize(30);
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute("objectType");
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute("title");
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute( "definition");
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute( "summary");
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute( "lead");
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute( "eventDate");
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute( "startDate" );
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute( "endDate");
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute( "newsDate");
+
+
+
+
+
+
diff --git a/ccm-bundle/web/templates/ccm-navigation/navigation/sci-welcome.jsp b/ccm-bundle/web/templates/ccm-navigation/navigation/sci-welcome.jsp
new file mode 100644
index 000000000..a0d85d6f8
--- /dev/null
+++ b/ccm-bundle/web/templates/ccm-navigation/navigation/sci-welcome.jsp
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+
+
+ long age = Navigation.getConfig().getIndexPageCacheLifetime();
+ if (age == 0) {
+ DispatcherHelper.cacheDisable(response);
+ } else {
+ DispatcherHelper.cacheForWorld(response, (int)age);
+ }
+
+
+
+
+
+
+
+
+
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).setDefinition(new CMSDataCollectionDefinition());
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).setRenderer(new CMSDataCollectionRenderer());
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getDefinition().setObjectType("com.arsdigita.cms.ContentPage");
+
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getDefinition().setDescendCategories(false);
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getDefinition().addOrder("parent.categories.link.sortKey");
+
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().setPageSize(30);
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute("objectType");
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute("title");
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute("eventDate");
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute("launchDate");
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute("startDate");
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute("endDate");
+ ((com.arsdigita.navigation.ui.object.SimpleObjectList) itemList).getRenderer().addAttribute("newsDate");
+
+
+
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).setDefinition(new CMSDataCollectionDefinition());
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).setRenderer(new CMSDataCollectionRenderer());
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).getDefinition().setObjectType("com.arsdigita.cms.contenttypes.Event");
+
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).setSQLFilter("(endDate >= :today and (endTime > :time or endTime is null)) or (endDate is null and startDate >= :today)");
+
+ // Java ist mal wieder kompliziert. Man braucht ein Calender-Object, damit man Datumsarithmetik betreiben kann. java.util.Calendar ist allerdings // abstract. Deshalb muß man java.util.GregorianCalendar verwenden. Dann kann man mit der add-Methode verschiedene Felder manipulieren. // Aber Achtung - die add-Method liefert void zurück. Daher kann man das nicht alles in einer Zeile machen. Also Variablen anlegen. // Komplizierter geht's wohl nicht mehr.
+ java.util.GregorianCalendar now = new java.util.GregorianCalendar();
+ java.util.Date today = (new java.util.GregorianCalendar(now.get(java.util.GregorianCalendar.YEAR),
+ now.get(java.util.GregorianCalendar.MONTH),
+ now.get(java.util.GregorianCalendar.DATE))).getTime();
+ // Im Event-CT ist das Datum als SQL-Type Date eingetragen, die Uhrzeit aber als SQL-Typ timestamptz. Leider wird von ccm im letzten
+ // das Datum nicht gesetzt, so daß der Timestamp immer eine Uhrzeit am 1.1.1970 angibt. Das ist ziemlich bescheuert und macht hier
+ // diesen kompliezierten Vergleich notwendig. Sonst könnte man einfach mit dem aktuellen Timestamp vergleichen.
+ java.util.Date time = (new java.util.GregorianCalendar(70,0,1, // this is 01.01.1970 - start of UNIX timestamp
+ now.get(java.util.GregorianCalendar.HOUR_OF_DAY),
+ now.get(java.util.GregorianCalendar.MINUTE),
+ now.get(java.util.GregorianCalendar.SECOND))).getTime();
+
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).setParameter("today", today);
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).setParameter("time", time);
+
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).getDefinition().setDescendCategories(true);
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).getDefinition().addOrder("startDate");
+
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).getRenderer().setPageSize(5);
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).getRenderer().addAttribute("objectType");
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).getRenderer().addAttribute("title");
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).getRenderer().addAttribute("lead");
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).getRenderer().addAttribute("eventDate");
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).getRenderer().addAttribute("launchDate");
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).getRenderer().addAttribute("startDate");
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) eventList).getRenderer().addAttribute("endDate");
+
+
+
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) newsList).setDefinition(new CMSDataCollectionDefinition());
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) newsList).setRenderer(new CMSDataCollectionRenderer());
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) newsList).getDefinition().setObjectType("com.arsdigita.cms.contenttypes.NewsItem");
+
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) newsList).setSQLFilter("newsDate > :oldNewsDate");
+
+ // Java ist mal wieder kompliziert. Man braucht ein Calender-Object, damit man Datumsarithmetik betreiben kann. java.util.Calendar ist allerdings
+ // abstract. Deshalb muß man java.util.GregorianCalendar verwenden. Dann kann man mit der add-Methode verschiedene Felder manipulieren.
+ // Aber Achtung - die add-Method liefert void zurück. Daher kann man das nicht alles in einer Zeile machen. Also Variablen anlegen.
+ // Komplizierter geht's wohl nicht mehr.
+ java.util.GregorianCalendar oldDate = new java.util.GregorianCalendar();
+ oldDate.add(java.util.Calendar.MONTH, -2);
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) newsList).setParameter("oldNewsDate", oldDate.getTime());
+
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) newsList).getDefinition().setDescendCategories(true);
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) newsList).getDefinition().addOrder("newsDate desc");
+
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) newsList).getRenderer().setPageSize(5);
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) newsList).getRenderer().addAttribute("objectType");
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) newsList).getRenderer().addAttribute("title");
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) newsList).getRenderer().addAttribute("lead");
+ ((com.arsdigita.navigation.ui.object.ComplexObjectList) newsList).getRenderer().addAttribute("newsDate");
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/templates/ccm-navigation/navigation/sitemap.jsp b/ccm-bundle/web/templates/ccm-navigation/navigation/sitemap.jsp
new file mode 100644
index 000000000..2c4559768
--- /dev/null
+++ b/ccm-bundle/web/templates/ccm-navigation/navigation/sitemap.jsp
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+ DispatcherHelper.cacheForWorld( response );
+
+
+
+
+
+ sitemapPage.setClassAttr("sitemapPage");
+
+
+
+
+
+
+ ((com.arsdigita.navigation.ui.category.Hierarchy) categoryNav).setShowItems(false);
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/templates/ccm-navigation/services/pid.jsp b/ccm-bundle/web/templates/ccm-navigation/services/pid.jsp
new file mode 100644
index 000000000..199774055
--- /dev/null
+++ b/ccm-bundle/web/templates/ccm-navigation/services/pid.jsp
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+ DispatcherHelper.cacheForWorld( response );
+ Integer pid = (Integer)new IntegerParameter("pid").transformValue(request);
+
+ Domain lgcl = Domain.retrieve("LGSL");
+ Term service = lgcl.getTerm(pid);
+
+ String url = URLService.locate(service.getOID());
+ throw new RedirectSignal(url, false);
+
+
diff --git a/ccm-bundle/web/templates/ccm-navigation/services/summary.jsp b/ccm-bundle/web/templates/ccm-navigation/services/summary.jsp
new file mode 100644
index 000000000..1c52b6861
--- /dev/null
+++ b/ccm-bundle/web/templates/ccm-navigation/services/summary.jsp
@@ -0,0 +1,26 @@
+
+
+
+
+
+ DispatcherHelper.cacheForWorld( response );
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/templates/ccm-portalworkspace/portal/README.txt b/ccm-bundle/web/templates/ccm-portalworkspace/portal/README.txt
new file mode 100644
index 000000000..8db7e6319
--- /dev/null
+++ b/ccm-bundle/web/templates/ccm-portalworkspace/portal/README.txt
@@ -0,0 +1,6 @@
+jsp files replace files provided by ccm-ldn-portal.
+
+goal: Make the portal homepage read-only and cached for 15min. EXPERIMENTAL
+
+Dynamic no-cache version is available at /ccm/portal/custom.jsp for admins to get the 'customize area' links.
+see r1082
diff --git a/ccm-bundle/web/templates/ccm-portalworkspace/portal/custom.jsp b/ccm-bundle/web/templates/ccm-portalworkspace/portal/custom.jsp
new file mode 100644
index 000000000..fef11cc49
--- /dev/null
+++ b/ccm-bundle/web/templates/ccm-portalworkspace/portal/custom.jsp
@@ -0,0 +1,37 @@
+
+
+
+
+
+ DispatcherHelper.cacheDisable(response);
+
+
+
+
+
+
+
+
+
+HomepageWorkspaceSelectionModel workspace = new HomepageWorkspaceSelectionModel();
+((HomepageWorkspace)left).setModel(new HomepagePortalSelectionModel(workspace, 0));
+((HomepageWorkspace)left).setName("left");
+((HomepageWorkspace)left).addWidgets();
+((HomepageWorkspace)middle).setModel(new HomepagePortalSelectionModel(workspace, 1));
+((HomepageWorkspace)middle).setName("middle");
+((HomepageWorkspace)middle).addWidgets();
+((HomepageWorkspace)right).setModel(new HomepagePortalSelectionModel(workspace, 2));
+((HomepageWorkspace)right).setCustomizable(true);
+((HomepageWorkspace)right).setName("right");
+((HomepageWorkspace)right).addWidgets();
+
+
+
+
+
+
diff --git a/ccm-bundle/web/templates/ccm-portalworkspace/portal/index.jsp b/ccm-bundle/web/templates/ccm-portalworkspace/portal/index.jsp
new file mode 100644
index 000000000..2000fb99d
--- /dev/null
+++ b/ccm-bundle/web/templates/ccm-portalworkspace/portal/index.jsp
@@ -0,0 +1,39 @@
+
+
+
+
+
+ DispatcherHelper.cacheForWorld(response,900);
+
+
+
+
+
+
+
+
+
+HomepageWorkspaceSelectionModel workspace = new HomepageWorkspaceSelectionModel();
+((HomepageWorkspace)left).setModel(new HomepagePortalSelectionModel(workspace, 0));
+((HomepageWorkspace)left).setReadOnly(true);
+((HomepageWorkspace)left).setName("left");
+((HomepageWorkspace)left).addWidgets();
+((HomepageWorkspace)middle).setModel(new HomepagePortalSelectionModel(workspace, 1));
+((HomepageWorkspace)middle).setReadOnly(true);
+((HomepageWorkspace)middle).setName("middle");
+((HomepageWorkspace)middle).addWidgets();
+((HomepageWorkspace)right).setModel(new HomepagePortalSelectionModel(workspace, 2));
+((HomepageWorkspace)right).setReadOnly(true);
+((HomepageWorkspace)right).setName("right");
+((HomepageWorkspace)right).addWidgets();
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/admin-index.css b/ccm-bundle/web/themes/static/aplaws-generic/admin-index.css
new file mode 100644
index 000000000..4210f401a
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/admin-index.css
@@ -0,0 +1 @@
+@import url(/css/acs-master.css);
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/admin-index.xsl b/ccm-bundle/web/themes/static/aplaws-generic/admin-index.xsl
new file mode 100644
index 000000000..fa0b5ad35
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/admin-index.xsl
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/atoz-admin.css.NotUsedForNow b/ccm-bundle/web/themes/static/aplaws-generic/atoz-admin.css.NotUsedForNow
new file mode 100644
index 000000000..54c8c5bc3
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/atoz-admin.css.NotUsedForNow
@@ -0,0 +1,2 @@
+@import url("/css/acs-master.css");
+@import url("/__ccm__/static/atoz/atoz.css");
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/atoz-admin.xsl.NotUsedForNow b/ccm-bundle/web/themes/static/aplaws-generic/atoz-admin.xsl.NotUsedForNow
new file mode 100644
index 000000000..c5ca40b98
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/atoz-admin.xsl.NotUsedForNow
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/atoz-index.css.NotUsedForNow b/ccm-bundle/web/themes/static/aplaws-generic/atoz-index.css.NotUsedForNow
new file mode 100644
index 000000000..54c8c5bc3
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/atoz-index.css.NotUsedForNow
@@ -0,0 +1,2 @@
+@import url("/css/acs-master.css");
+@import url("/__ccm__/static/atoz/atoz.css");
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/atoz-index.xsl.NotUsedForNow b/ccm-bundle/web/themes/static/aplaws-generic/atoz-index.xsl.NotUsedForNow
new file mode 100644
index 000000000..c8351bdd8
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/atoz-index.xsl.NotUsedForNow
@@ -0,0 +1,160 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APLAWS+: A to Z
+
+
+
+
+
+ Skip over navigation
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+ |
+
+
+ A to Z List
+ |
+
+
+ |
+ |
+
+
+ |
+
+ |
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+home
+>
+A to Z
+
+
+
+
+
+
+
+
+
+
+
+
+
+Skip to A-Z results
+
+ Browse the alphabetically listed information and services below
+
+
+
Categories starting with the letter
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/category-step.xsl b/ccm-bundle/web/themes/static/aplaws-generic/category-step.xsl
new file mode 100644
index 000000000..693fd7c38
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/category-step.xsl
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/consultations-index.xsl b/ccm-bundle/web/themes/static/aplaws-generic/consultations-index.xsl
new file mode 100644
index 000000000..1e4b542ca
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/consultations-index.xsl
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+ bebop:dimensionalNavbar
+
+
+
+
+
+
+ >
+
+
+
+
+
+
+ /bebop:dimensionalNavbar
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/content-center-index.xsl b/ccm-bundle/web/themes/static/aplaws-generic/content-center-index.xsl
new file mode 100644
index 000000000..8ff5c3798
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/content-center-index.xsl
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+ /cms/admin/page
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/content-section-admin.xsl b/ccm-bundle/web/themes/static/aplaws-generic/content-section-admin.xsl
new file mode 100644
index 000000000..5c22541fa
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/content-section-admin.xsl
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+ /cms/admin/page
+
+
+
+
+
+ ()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/content-section-index.xsl b/ccm-bundle/web/themes/static/aplaws-generic/content-section-index.xsl
new file mode 100644
index 000000000..012769826
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/content-section-index.xsl
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APLAWS+:
+
+
+
+
+
+ Skip over navigation
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+ |
+
+
+
+ |
+
+
+ |
+ |
+
+
+ |
+
+ |
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/css/main.css b/ccm-bundle/web/themes/static/aplaws-generic/css/main.css
new file mode 100644
index 000000000..8ba53c820
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/css/main.css
@@ -0,0 +1,1066 @@
+/* Uncomment to debug box model */
+/*
+* {
+ border: 1px solid black !important;
+ margin: 2px !important;
+ padding: 2px !important;
+}
+*/
+
+body {
+margin: 0;
+background-color: #FFF;
+color: #000;
+font-family: Verdana, Arial, Helvetica, sans-serif;
+}
+
+a {
+ color: #333;
+ text-decoration: underline;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+#startcontent {
+text-decoration: none !important;
+}
+
+.intLink {
+text-decoration: none !important;
+}
+
+.topLink {
+color: #69C !important;
+text-decoration: none !important;
+}
+
+
+img,a img {
+border: none;
+}
+
+.hide {display:none}
+
+.navHide {
+ position: absolute;
+ left: -1000px;
+ width: 990px;
+ font-size:1px;
+}
+
+
+
+
+
+
+
+#header {
+clear: both;
+width: 100%;
+background-color: #036;
+margin: 0px;
+border-top: 4px solid #036;
+border-bottom: 1px solid #999;
+}
+
+#logo {
+float: left;
+margin: 0px;
+}
+
+#utils {
+float: left;
+width: 50%;
+margin: 7px 0 0 0;
+text-align: right;
+font-size: 0.7em;
+font-weight: normal;
+color: #FFF;
+}
+
+#utils a:link {
+color: #FFF;
+text-decoration: underline;
+}
+#utils a:visited {
+color: #FFF;
+text-decoration: underline;
+}
+#utils a:hover {
+color: #FFF;
+text-decoration: underline;
+}
+#utils a:active {
+color: #FFF;
+text-decoration: underline;
+}
+
+#search {
+float: right;
+text-align: right;
+margin: 0px 10px 0 0;
+font-weight: bold;
+color: #000;
+background-color: #999;
+border-top: 3px solid #999;
+border-bottom: 3px solid #999;
+}
+
+#search form {
+margin: 0;
+}
+
+#search label {
+display: none;
+position: absolute;
+}
+
+.searchBox {
+font-size: 0.7em;
+font-weight: normal;
+margin-left: 20px;
+}
+
+.go {
+font-size: 0.7em;
+font-weight: normal;
+margin-right: 10px;
+padding: 0px;
+}
+
+#clear {
+ clear: both;
+}
+
+#tlcNav {
+clear: both;
+position: relative;
+width: 100%;
+font-size: 0.6em;
+font-weight: normal;
+color: #666;
+background-color: #CCC;
+border-top: 1px solid #9CF;
+border-bottom: 1px solid #9CF;
+text-transform: uppercase;
+}
+
+#tlcNav p{
+margin: 0 2px 0 3px;
+}
+
+
+#tlcNav a{
+color: #036;
+text-transform: uppercase;
+text-decoration: none;
+}
+
+#tlcNav a:hover{
+color: #FFF;
+text-transform: uppercase;
+text-decoration: underline;
+}
+
+#bread {
+clear: both;
+position: relative;
+width: 100%;
+font-size: 0.7em;
+border-top: 1px solid #036;
+border-bottom: 1px solid #333;
+background-color: #EEE;
+text-transform: lowercase;
+}
+
+#bread p {
+margin: 1px 0 1px 3px;
+}
+
+#bread a {
+color: #333 !important;
+text-decoration: none;
+}
+
+#bread a:hover {
+color: #000;
+text-decoration: underline;
+}
+
+#LHS{
+text-transform: capitalize;
+}
+
+#nav{
+padding-top: 1em;
+margin: 0 0 0px 2px;
+}
+
+.navUp {
+margin-top: 5px;
+font-size: 0.7em;
+border-bottom: 1px solid #333;
+}
+
+.navUp a{
+text-decoration: none;
+}
+
+.navHere {
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+background-color: #CCC;
+border-bottom: 1px solid #333;
+}
+
+.navHere p {
+margin: 0 0 0 1.4em;
+}
+
+.navHere a {
+text-decoration: none;
+}
+
+.navChild {
+display: block;
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+margin: 0.2em 0 0.2em 1.4em;
+border-bottom: 1px solid #9CF;
+text-decoration: none;
+}
+
+.navChild:hover {
+background-color: #DDD;
+text-decoration: none;
+}
+
+#title {
+padding-top: 1em;
+}
+
+#title h1{
+font-size: 0.7em;
+font-weight: bold;
+margin: 5px 0 0 15px;
+border-bottom: 1px solid #CCC;
+}
+
+#greeting {
+margin: 1em 1em 2em 15px;
+}
+
+#greeting img{
+margin: 0 0 0 1em;
+}
+
+#greeting {
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+}
+
+#greeting ul{
+list-style: square;
+margin-left: 15px;
+font-size: 1em;
+font-weight: normal;
+color: #000;
+}
+
+#contentLinks{
+clear: both;
+position: relative;
+margin: 1em 1em 2em 15px;
+border-bottom: 20px solid #FFF;
+}
+
+#contentLinks a {
+display: block;
+font-size: 0.7em;
+font-weight: normal;
+padding: 0.2em 0 0.2em 0;
+color: #000;
+text-decoration: underline;
+}
+
+#contentLinks a:hover {
+text-decoration: underline;
+}
+
+#lead {
+font-weight: bold;
+}
+
+#leadDetails {
+font-weight: normal;
+}
+
+#leadDetails .bold {
+display: block;
+font-weight: bold;
+}
+
+#details {
+clear: both;
+position: relative;
+margin: 2em 1em 2em 15px;
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+}
+
+#details p{
+margin: 0 0 0.3em 0;
+}
+
+#details .bold{
+padding: 0 0.5em 0 0;
+font-weight:bold;
+}
+
+#newsDate {
+text-align: right;
+}
+
+.caption {
+text-align: right;
+}
+
+#R_image {
+float: right;
+margin: 0 0 1em 2em;
+padding: 0 0 0 0.8em;
+text-align: left;
+}
+
+#mainBody {
+clear: both;
+position: relative;
+margin: 2em 1em 2em 15px;
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+}
+
+#mainBody ul {
+list-style: square;
+margin-left: 15px;
+font-size: 1em;
+font-weight: normal;
+color: #000;
+}
+
+#mainBody ol {
+list-style: decimal;
+margin-left: 22px;
+font-size: 1em;
+font-weight: normal;
+color: #000;
+}
+
+#mainBody .bold {
+font-weight: bold;
+}
+
+.attachment {
+clear: both;
+position: relative;
+margin: 2em 1em 2em 15px;
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+}
+
+.attachment h2{
+font-size: 1em;
+font-weight: bold;
+border-bottom: 1px solid #CCC;
+}
+
+.attachment ul {
+list-style: square;
+margin-left: 15px;
+font-size: 1em;
+font-weight: normal;
+color: #000;
+}
+
+#sectionList {
+clear: both;
+position: relative;
+margin: 1em 1em 2em 15px;
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+}
+
+#sectionList .bold {
+display: block;
+font-weight: bold;
+}
+
+#sectionList a {
+color: #69C;
+}
+
+.section {
+clear: both;
+position: relative;
+margin: 1em 1em 2em 15px;
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+}
+
+.section img{
+margin: 0 0 0 1em;
+}
+
+.section ul {
+list-style: square;
+margin-left: 15px;
+font-size: 1em;
+font-weight: normal;
+color: #000;
+}
+
+.section ol {
+list-style: decimal;
+margin-left: 22px;
+font-size: 1em;
+font-weight: normal;
+color: #000;
+}
+
+.section .bold {
+float: left;
+display: block;
+font-weight: bold;
+font-size: 1em;
+color: #000;
+}
+
+#mpaDirection {
+clear: both;
+position: relative;
+margin: 1em 1em 2em 15px;
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+}
+
+#mpaDirection a {
+color: #000;
+font-weight: bold;
+text-decoration: none;
+}
+
+#related{
+margin: 1em 2px 0 0;
+border-left: 1px solid #9CF;
+}
+
+#related h2{
+font-size: 0.7em;
+font-weight: bold;
+padding-left: 1em;
+}
+
+#related a {
+display: block;
+width: 100%;
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+padding: 0.2em 0 0.2em 1.1em;
+text-decoration: none;
+}
+
+#related a:hover {
+text-decoration: underline;
+}
+
+#footer {
+text-align: center;
+border-top: 1px solid #036;
+padding-top: 0.3em;
+}
+
+#foottlc {
+font-size: 0.7em;
+font-weight: normal;
+color: #333;
+margin: 0 10%;
+}
+
+#foottlc a{
+color: #333;
+text-transform: lowercase;
+}
+
+#legal {
+border-top: 1px solid #999;
+font-size: 0.65em;
+font-weight: normal;
+color: #666;
+margin: 1em 0 0 0;}
+
+#legal a{
+color: #666;
+}
+
+#compliance{
+}
+
+#compliance a {
+}
+
+#compliance img {
+border: 0;
+}
+
+#searchArea {
+clear: both;
+position: relative;
+margin: 1em 1em 2em 15px;
+background-color: #CCC;
+color: #333;
+}
+
+.searchLabel {
+position: absolute;
+left: -1000px;
+width: 990px;
+font-size:1px;
+}
+
+
+
+
+
+.searchExplanation {
+margin: 1em 0 2em 3px;
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+border-top: 1px solid #999;
+}
+
+#advGo {
+text-align: right;
+border-top: 1px solid #9CF;
+}
+
+.adgo {
+font-size: 0.7em;
+font-weight: normal;
+height: 1.6em;
+background-color: #9CF;
+}
+
+.searchAgain {
+padding-left: 0.3em;
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+}
+
+#resultsInfo {
+clear: both;
+position: relative;
+margin: 1em 0 1em 0.3em;
+border-bottom: 1px solid #FFF;
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+}
+
+#resultsList {
+clear: both;
+position: relative;
+margin: 1em 1em 2em 15px;
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+border-bottom: 20px solid #FFF;
+}
+
+.searchResult {
+clear: both;
+position: relative;
+margin: 1em 0 1em 0;
+font-weight: normal;
+color: #000 !important;
+}
+
+.searchResult a{
+display: block;
+font-weight: bold;
+color: #333;
+}
+
+#resultsPage {
+clear: both;
+position: relative;
+margin: 1em 1em 2em 15px;
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+border-top: 1px solid #CCC;
+}
+
+#pLeft {
+float: left;
+text-align: left;
+border-top: 1px solid #CCC;
+margin-top: -1px;
+}
+
+#pRight {
+float: right;
+text-align: right;
+border-top: 1px solid #CCC;
+margin-top: -1px;
+}
+
+#resultsPage a {
+color: #333;
+}
+
+.searchFilter {
+margin: 0;
+color: #333;
+font-size: 0.7em;
+}
+
+#advancedS {
+width: 255px !important;
+margin-top: 8px;
+font-size: 0.7em;
+border: 1px solid #666;
+}
+
+#advlisthead {
+color: #FFF;
+background-color: #9CF;
+}
+
+#remoteS {
+width: 255px !important;
+margin-top: 8px;
+font-size: 0.7em;
+border: 1px solid #666;
+}
+
+#remotelisthead {
+color: #FFF;
+background-color: #9CF;
+}
+
+#sLinks{
+margin: 3em 2px 0 0;
+border-left: 1px solid #333;
+}
+
+#sLinks h2{
+color: #000;
+font-size: 0.7em;
+font-weight: bold;
+padding-left: 1em;
+}
+
+.sLink {
+width: 100%;
+font-size: 0.7em ;
+font-weight: normal;
+color: #000;
+padding: 1em 0 0.2em 1.1em;
+}
+
+.sLink a {
+display: block;
+font-weight: bold;
+color: #9CF !important;
+text-decoration: none;
+}
+
+.sLink a:hover {
+text-decoration: underline;
+}
+
+
+
+
+#azArea {
+clear: both;
+position: relative;
+margin: 1em 1em 1em 15px;
+background-color: #CCC;
+padding-bottom: 0.3em;
+}
+
+#azSub {
+clear: both;
+position: relative;
+margin: 2em 0 0 15px;
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+}
+
+#azInfo {
+clear: both;
+position: relative;
+margin: 1em 0 1em 0;
+border-bottom: 1px solid #FFF;
+padding-bottom: 0.2em;
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+}
+
+#azPlace {
+clear: both;
+position: relative;
+margin: 2em 0 0 0;
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+}
+
+#azList {
+clear: both;
+position: relative;
+margin: 1em 1em 1em 15px;
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+border-bottom: 20px solid #FFF;
+}
+
+.letterSelected {
+font-weight: bold !important;
+text-transform: uppercase;
+}
+
+#azList h2{
+font-size: 1em;
+}
+
+.azTitleDescription {
+font-weight: normal !important;
+margin: 0 0 0 1em;
+}
+
+.azResult {
+clear: both;
+position: relative;
+margin: 1em 0;
+font-weight: normal;
+color: #000 !important;
+}
+
+.azResult a{
+display: block;
+font-weight: normal;
+color: #333;
+}
+
+#siteArea {
+clear: both;
+position: relative;
+margin: 1em 1em 1em 15px;
+background-color: #CCC;
+padding-bottom: 1em;
+}
+
+#siteInfo {
+clear: both;
+position: relative;
+margin: 1em 0 1em 0.3em;
+border-bottom: 1px solid #FFF;
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+}
+
+#topSiteList {
+clear: both;
+position: relative;
+margin: 1em 0 0em 0.3em;
+font-size: 0.7em;
+font-weight: bold;
+color: #000;
+}
+
+#topSiteList a{
+display: block;
+}
+
+.anchor {
+text-decoration: none !important;
+}
+
+#siteList {
+clear: both;
+position: relative;
+margin: 1em 1em 2em 15px;
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+border-bottom: 20px solid #FFF;
+}
+
+#siteList ul {
+list-style: none;
+}
+
+.L1 {
+margin: 0 !important;
+}
+
+.L2 {
+margin: 0 !important;
+}
+
+.L3 {
+margin: 0 !important;
+}
+
+.L4 {
+margin: 0 !important;
+}
+
+.cat1 {
+margin: 1em 0 1em 0;
+border-top: 1px solid #9CF;
+}
+
+.cat1 a {
+font-weight: bold;
+text-decoration: underline;
+}
+
+.cat1 a:hover {
+font-weight: bold;
+text-decoration: underline !important;
+}
+
+.cat2 {
+margin: 1em 0 2em 2em;
+border-top: 1px solid #CCC;
+}
+
+.cat2 a {
+font-weight: bold;
+text-decoration: none;
+}
+
+.cat2 a:hover {
+font-weight: bold;
+text-decoration: underline;
+}
+
+.cat3 {
+font-weight: normal;
+margin: 0em 0 0em 0;
+}
+
+.cat3 a {
+font-weight: bold;
+text-decoration: none;
+}
+
+.cat4 {
+font-weight: normal;
+margin: 0em 0 0em 2em;
+}
+
+.item {
+font-weight: normal !important;
+padding-left: 1em;
+background-image: url("../images/arrowSitemap.gif") !important;
+background-position: 0px 5px;
+background-repeat: no-repeat;
+}
+
+.toTop {
+margin: 1em 0 5em 0;
+}
+
+#dirBox {
+clear: both;
+position: relative;
+margin: 0.5em 0 0 0 ;
+padding: 0.3em;
+border-top: 4px solid #CCC;
+}
+
+#dirBox h2 {
+font-size: 1.2em;
+margin: 0 0 1em 0;
+}
+
+.RSS {
+padding: 0.5em 0em 0.5em 0em ;
+margin: 0;
+font-size: 1em;
+font-weight: normal;
+color: #000;
+background-color: #9CF;
+}
+
+.RSS h2 {
+font-size: 1.2em;
+margin: 0 0 1em 0;
+border-bottom: 1px solid #666;
+}
+
+.RSS a {
+display: block;
+font-weight: normal;
+color: #333;
+}
+
+.RSS a:hover {
+color: #000;
+}
+
+#poll {
+clear: both;
+position: relative;
+margin: 0;
+padding: 0.3em;
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+background-color: #CCC;
+border-top: 2px solid #666;
+border-bottom: 1px solid #9CF;
+}
+
+#poll h2 {
+font-size: 1.2em;
+margin: 0 0 1em 0;
+border-top: 1px solid #9CF;
+}
+
+.pollQ {
+border-bottom: 1px solid #FFF;
+}
+
+.pollSend {
+border-top: 1px solid #FFF;
+text-align: right;
+font-size: 1em;
+}
+
+.pollSend input{
+border-top: 1px solid #FFF;
+text-align: center;
+font-size: 1em;
+}
+
+.CI {
+clear: both;
+position: relative;
+margin: 0em 0em 1em 0;
+}
+
+.CI h2 {
+font-size: 1.2em;
+margin: 0 0 1em 0;
+}
+
+#loginBox {
+clear: both;
+position: relative;
+margin: 0 ;
+padding: 0.3em;
+font-size: 1em;
+font-weight: normal;
+color: #000;
+background-color: #CCC;
+border-top: 2px solid #666;
+border-bottom: 1px solid #9CF;
+}
+
+#loginBox h2 {
+font-size: 1.2em;
+margin: 0 0 1em 0;
+}
+
+#loginBox ul {
+list-style: none;
+margin: 1em 0;
+}
+
+#registerB {
+font-weight: bold;
+text-align: right;
+}
+
+#portalTitle h1{
+font-size: 0.7em;
+font-weight: bold;
+margin: 5px 0 0 0px;
+border-bottom: 1px solid #CCC;
+}
+
+#portalLHS {
+padding-top: 0em;
+}
+
+.portalWrap {
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+}
+
+.portletWrap {
+width: 100%;
+}
+
+.dirCat {
+margin-top: 5px;
+border-top: 1px solid #9CF;
+}
+
+.custLink {
+margin-top: 1em;
+font-size: 0.7em;
+font-weight: normal;
+color: #000;
+border-top: 1px solid #CCC;
+background-color: #EEE;
+}
+
+.custLink a {
+padding-right: 1em;
+}
+
+.directoryEntryLink {
+font-weight: bold;
+}
+
+.logbx {
+width: 100px;
+font-size: 1em;
+}
+
+.logSubmit {
+text-align: right;
+border-top: 1px solid #9CF;
+}
+
+.loggo {
+font-size: 1em;
+font-weight: normal;
+height: 1.6em;
+background-color: #9CF;
+}
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/css/wysiwyg.css b/ccm-bundle/web/themes/static/aplaws-generic/css/wysiwyg.css
new file mode 100644
index 000000000..2b9fd37ca
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/css/wysiwyg.css
@@ -0,0 +1,17 @@
+
+.main {
+color: #333 !important;
+}
+
+.light {
+color: #CCC !important;
+}
+
+.medium {
+color: #6F3 !important;
+}
+
+.dark {
+color: #336 !important;
+font-style: bold !important;
+}
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/forum-example/categorised-forum/forum-categories.xsl b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/categorised-forum/forum-categories.xsl
new file mode 100644
index 000000000..1d6994b9b
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/categorised-forum/forum-categories.xsl
@@ -0,0 +1,308 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Assign Categories
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Add categories
+
+
+
+
+
+
+
+ There are no categories assigned in this context
+
+
+
+
+
+
+ -
+
+
+
+
+ Remove
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Selected Categories
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ '
+ \'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/forum-example/categorised-forum/forum-index.xsl b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/categorised-forum/forum-index.xsl
new file mode 100644
index 000000000..230109cc2
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/categorised-forum/forum-index.xsl
@@ -0,0 +1,1311 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Forum
+
+
+
+
+
+
+
+
+
+
+ Skip over navigation
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+ |
+
+
+ |
+
+
+
+
+ |
+
+
+ |
+
+
+
+ |
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+ postOdd
+
+
+ postEven
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Thread:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Thread
+
Author
+
Replies
+
Last Post
+
+
+ No messages have been posted yet
+
+
+
+
+
+
+
+ odd
+
+
+ even
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Subject
+
Replies
+
Author
+
Last Post
+
Status
+
Delete
+
+
+
+
+ You are not subscribed to any threads
+
+
+
+
+
+
+ postOdd
+
+
+ postEven
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
Topic
+
Threads
+
Last Post
+
+
+
+
+
+
+ postOdd
+
+
+ postEven
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ n/a
+
+
+
+
+
+
+
+
+
+ postOdd
+
+
+ postEven
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ n/a
+
+
+
+
+
+
+
+
+
+
+
Forum Alerts
+
+
+
+
+
+
+
+
+
+
Thread Alerts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+ |
+
+
+
+
+
+
+ |
+ |
+
+
+ |
+
+
+
+ forum member list
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Original Message:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ No images attached to this post
+
+
+
+
+
+
+
+
+ postOdd
+
+
+ postEven
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ No files attached to this post
+
+
+
+
+
+
+ File |
+ Description |
+ |
+
+
+
+ |
+
+
+
+
+
+
+ |
+
+
+
+
+ |
+ Remove |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Post New Message
+
+
+ Add Images (optional)
+
+
+ Add Files (optional)
+
+
+ Preview New Message
+
+
+
+
+
+
+
+
+
+
+
+ Edit Message
+
+
+ Edit Images
+
+
+ Edit Files
+
+
+ Preview Changes
+
+
+
+
+
+
+
+
+
+
+
+ Post reply
+
+
+ Add Images (optional)
+
+
+ Add Files (optional)
+
+
+ Preview Reply
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ You are watching this thread. To stop watching this thread, click "Stop Watching Thread" below.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/forum-example/forum-index.css b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/forum-index.css
new file mode 100644
index 000000000..74c5d3a59
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/forum-index.css
@@ -0,0 +1,403 @@
+@import url("css/main.css");
+/* Chris presumably forgot the ! to comment the following 2 lines out
+/* <--@import url("/css/acs-master.css");--> */
+/* <--@import url("/css/tabbed-pane/tabbed-pane.css");--> */
+
+
+body {
+ margin: 0;
+ background-color: #FFF;
+ color: #000;
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+}
+
+.forum {
+ font-size: 0.8em;
+ margin: 8px 0 10px 2px;
+}
+
+.content {
+ margin-left: 10px;
+}
+
+
+/*form submission*/
+
+.forumSelect {
+ margin-top: 0.2em;
+ float:left;
+}
+.forumButton input {
+ float:left;
+ margin-top: 0.2em;
+ margin-right: 5px;
+ padding-left: 2px;
+ padding-right: 2px;
+ color: #000;
+ background-color: #CCC;
+ vertical-align: middle;
+ border: 1px solid #000;
+
+}
+
+.submit {
+ clear: both;
+ margin-left: 100px;
+}
+
+/*
+view all threads
+
+*/
+
+#selectLabel {
+ float:left;
+ color: white;
+ padding-top: 0.2em;
+ padding-left: 0.2em;
+}
+#selectCategory {
+ background-color: #999;
+ height: 2.2em;
+
+}
+
+#threadHead {
+ background-color: #E5F3FC;
+ font-weight: bold;
+ height: 1.5em;
+ padding-left: 0.2em;
+ margin-bottom: 0.3em;
+
+}
+#noMessages {
+ clear:both;
+ float:left;
+ width: 100%;
+
+}
+.subject {
+ clear: both;
+ float:left;
+ width: 190px;
+ padding: 4px 0 4px 22px;
+ background-position: 4px 0.7em;
+ background-repeat: no-repeat;
+ background-image: url("images/forum/read.gif");
+}
+
+.topic {
+ clear:both;
+ float:left;
+ width: 212px;
+ padding: 4px 0 4px 0px;
+}
+
+.threadSubject {
+ clear:both;
+ float:left;
+ width: 140px;
+ padding: 4px 0 4px 0px;
+}
+
+.author {
+ float:left;
+ width: 100px;
+ padding: 4px 0 4px 0px;
+ text-align: center;
+}
+
+.replies {
+ float:left;
+ text-align: center;
+ width: 60px;
+ padding: 4px 0 4px 0px;
+}
+
+.threads {
+ float:left;
+ text-align: center;
+ width: 75px;
+ padding: 4px 0 4px 0px;
+}
+
+.status {
+ float:left;
+ width: 75px;
+ padding: 4px 0 4px 0px;
+}
+
+.delete {
+ float:left;
+ text-align: center;
+ width: 50px;
+ padding: 4px 0 4px 0px;
+}
+
+.lastPost {
+ float: left;
+ text-align: center;
+ width: 150px;
+ padding: 4px 0 4px 0px;
+}
+
+#newTopicLink a {
+ padding: 4px 0 4px 22px;
+ background-position: 0px 0.3em;
+ background-repeat: no-repeat;
+ background-image: url("images/forum/post-16x16.gif");
+}
+
+#viewAllTopicsLink a {
+ float: left;
+ padding: 4px 15px 4px 22px;
+ background-position: 0px 0.3em;
+ background-repeat: no-repeat;
+ background-image: url("images/forum/back-to-16x16.gif");
+
+}
+
+#watchTopicLink a {
+ float: left;
+ padding: 4px 0 4px 22px;
+ background-position: 0px 0.3em;
+ background-repeat: no-repeat;
+ background-image: url("images/forum/watch-16x16.gif");
+ margin-left: 0.8em;
+ margin-bottom: 0.8em;
+}
+
+#info {
+ clear:both;
+ padding: 4px 0 4px 22px;
+ background-position: 0px 0.6em;
+ background-repeat: no-repeat;
+ background-image: url("images/forum/info-16x16.gif");
+ color: green;
+ margin-left: 0.8em;
+}
+
+.post {
+ clear: both;
+ margin-bottom: 0.8em;
+ font-size: 1em;
+}
+
+.postOdd {
+ background-color: #EFEFEF;
+
+}
+
+.postEven {
+ background-color: #FFFFFF;
+}
+
+#topic {
+ margin-bottom: 0.8em;
+ font-weight: bold;
+}
+
+.actions {
+ float: right;
+ margin-right: 0.3em;
+}
+
+.header {
+ float: left;
+ margin-left: 0.3em;
+ font-weight: bold;
+}
+
+.message {
+ clear: both;
+ float: left;
+ width:98%;
+ margin-left: 0.3em;
+ margin-bottom: 0.5em;
+}
+
+.postDetails {
+ clear: both;
+ float: left;
+ margin-bottom: 0.5em;
+ margin-left: 0.3em;
+}
+
+.bar {
+ clear:both;
+ float:left;
+ width: 98%;
+ padding-left: 0.3em;
+ padding-right: 0.3em;
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+}
+
+.replyBar {
+ clear:both;
+ padding-right: 0.3em;
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+}
+
+
+.clearGroup {
+ clear:both;
+ margin-bottom: 0.5em;
+}
+
+.columnOne {
+ float: left;
+ width: 100px;
+ font-size: 1em;
+}
+
+.columnOneWide {
+ float: left;
+ width: 130px;
+ font-size: 1em;
+}
+
+.columnTwo {
+ display: inline;
+ font-size: 1em;
+ margin: 0;
+}
+
+
+.columnTwo input {
+ width: 300px;
+}
+
+.columnTwo select {
+ width: 300px;
+}
+
+
+.columnTwo textArea {
+ width: 300px;
+}
+
+.columnThree {
+ font-size: 1em;
+}
+
+#title {
+ float:left;
+ width: 100%;
+
+ font-size: 1.2em;
+}
+
+
+fieldset {
+ padding: 0.3em 0.3em 0.3em 0.3em;
+}
+
+.fileLink {
+ margin-left: 0.5em;
+ clear: both;
+ float:left;
+}
+
+
+textarea {
+ width: 450px;
+}
+
+.validationError {
+ color: red;
+ margin-left: 100px;
+}
+
+#images {
+ clear: both;
+ float:left;
+ margin-left: 0.3em;
+}
+
+#plainText {
+ clear: both;
+ font-size: 1em;
+ margin-bottom: 0.5em;
+}
+
+li {
+ list-style-position: inside;
+}
+
+.expiry input {
+ width: 50px;
+}
+
+.fileTable {
+ width: 100%;
+}
+
+
+pre {
+
+ font-size: 1em;
+}
+
+
+/* Contents of tabbed-pane.css - forum tabs */
+
+div.tabbed-pane div, div.tabbed-pane table.tab-set, div.tabbed-pane table.tab-set td {
+ margin: 0;
+ border: 0;
+ padding: 0;
+}
+
+div.tabbed-pane table {
+ border-collapse: collapse;
+}
+
+div.tabbed-pane table.tab-set {
+ margin-left: 10px;
+}
+
+div.tabbed-pane table.tab-set a {
+ text-decoration: none;
+ color: rgb(63,63,63);
+}
+
+div.tabbed-pane table.tab-set td.tab-label {
+ margin-left: 4px;
+ padding: 5px 0 3px 10px;
+
+ background: rgb(225,225,225) url(/css/tabbed-pane/tab-unselected.png) no-repeat;
+}
+
+div.tabbed-pane table.tab-set td.tab-end {
+ width: 10px;
+ background: url(/css/tabbed-pane/tab-unselected-end.png) no-repeat;
+}
+
+div.tabbed-pane table.tab-set td.current-tab-label {
+ margin-left: 4px;
+ padding: 5px 0 3px 10px;
+ background: rgb(162,30,30) url(/css/tabbed-pane/tab-selected.png) no-repeat;
+ color: white;
+}
+
+div.tabbed-pane table.tab-set td.current-tab-end {
+ width: 10px;
+ background: url(/css/tabbed-pane/tab-selected-end.png) no-repeat;
+}
+
+div.tabbed-pane table.tab-set td.tab-spacer {
+ width: 4px;
+}
+
+div.tabbed-pane table.rule {
+ margin-left: 10px;
+ width: 100%;
+ background: rgb(162,30,30) url(/css/tabbed-pane/tab-bar.png) repeat-x;
+ height: 10px;
+}
+
+div.tabbed-pane div.current-pane {
+ width: 100%;
+}
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/forum-example/forum-index.xsl b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/forum-index.xsl
new file mode 100644
index 000000000..8440f6225
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/forum-index.xsl
@@ -0,0 +1,1308 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Forum
+
+
+
+
+
+
+
+
+
+ Skip over navigation
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+ |
+
+
+ |
+
+
+
+
+ |
+
+
+ |
+
+
+
+ |
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+ postOdd
+
+
+ postEven
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Thread:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Thread
+
Author
+
Replies
+
Last Post
+
+
+ No messages have been posted yet
+
+
+
+
+
+
+
+ odd
+
+
+ even
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Subject
+
Replies
+
Author
+
Last Post
+
Status
+
Delete
+
+
+
+
+ You are not subscribed to any threads
+
+
+
+
+
+
+ postOdd
+
+
+ postEven
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
Topic
+
Threads
+
Last Post
+
+
+
+
+
+
+ postOdd
+
+
+ postEven
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ n/a
+
+
+
+
+
+
+
+
+
+ postOdd
+
+
+ postEven
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ n/a
+
+
+
+
+
+
+
+
+
+
+
Forum Alerts
+
+
+
+
+
+
+
+
+
+
Thread Alerts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+ |
+
+
+
+
+
+
+ |
+ |
+
+
+ |
+
+
+
+ forum member list
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Original Message:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ No images attached to this post
+
+
+
+
+
+
+
+
+ postOdd
+
+
+ postEven
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ No files attached to this post
+
+
+
+
+
+
+ File |
+ Description |
+ |
+
+
+
+ |
+
+
+
+
+
+
+ |
+
+
+
+
+ |
+ Remove |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Post New Message
+
+
+ Add Images (optional)
+
+
+ Add Files (optional)
+
+
+ Preview New Message
+
+
+
+
+
+
+
+
+
+
+
+ Edit Message
+
+
+ Edit Images
+
+
+ Edit Files
+
+
+ Preview Changes
+
+
+
+
+
+
+
+
+
+
+
+ Post reply
+
+
+ Add Images (optional)
+
+
+ Add Files (optional)
+
+
+ Preview Reply
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ You are watching this thread. To stop watching this thread, click "Stop Watching Thread" below.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/archived-16x16.gif b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/archived-16x16.gif
new file mode 100644
index 000000000..2d3db34c2
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/archived-16x16.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/back-to-16x16.gif b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/back-to-16x16.gif
new file mode 100644
index 000000000..95d374a32
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/back-to-16x16.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/delete-16x16.gif b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/delete-16x16.gif
new file mode 100644
index 000000000..867d48eee
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/delete-16x16.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/edit-16x16.gif b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/edit-16x16.gif
new file mode 100644
index 000000000..3e9a90a47
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/edit-16x16.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/info-16x16.gif b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/info-16x16.gif
new file mode 100644
index 000000000..5acb95064
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/info-16x16.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/post-16x16.gif b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/post-16x16.gif
new file mode 100644
index 000000000..07b98d107
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/post-16x16.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/read.gif b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/read.gif
new file mode 100644
index 000000000..26d0d6fb5
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/read.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/reply-16x16.gif b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/reply-16x16.gif
new file mode 100644
index 000000000..0395fca0f
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/reply-16x16.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/watch-16x16.gif b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/watch-16x16.gif
new file mode 100644
index 000000000..01e001924
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/forum-example/images/forum/watch-16x16.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/forum-index.css b/ccm-bundle/web/themes/static/aplaws-generic/forum-index.css
new file mode 100644
index 000000000..74c5d3a59
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/forum-index.css
@@ -0,0 +1,403 @@
+@import url("css/main.css");
+/* Chris presumably forgot the ! to comment the following 2 lines out
+/* <--@import url("/css/acs-master.css");--> */
+/* <--@import url("/css/tabbed-pane/tabbed-pane.css");--> */
+
+
+body {
+ margin: 0;
+ background-color: #FFF;
+ color: #000;
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+}
+
+.forum {
+ font-size: 0.8em;
+ margin: 8px 0 10px 2px;
+}
+
+.content {
+ margin-left: 10px;
+}
+
+
+/*form submission*/
+
+.forumSelect {
+ margin-top: 0.2em;
+ float:left;
+}
+.forumButton input {
+ float:left;
+ margin-top: 0.2em;
+ margin-right: 5px;
+ padding-left: 2px;
+ padding-right: 2px;
+ color: #000;
+ background-color: #CCC;
+ vertical-align: middle;
+ border: 1px solid #000;
+
+}
+
+.submit {
+ clear: both;
+ margin-left: 100px;
+}
+
+/*
+view all threads
+
+*/
+
+#selectLabel {
+ float:left;
+ color: white;
+ padding-top: 0.2em;
+ padding-left: 0.2em;
+}
+#selectCategory {
+ background-color: #999;
+ height: 2.2em;
+
+}
+
+#threadHead {
+ background-color: #E5F3FC;
+ font-weight: bold;
+ height: 1.5em;
+ padding-left: 0.2em;
+ margin-bottom: 0.3em;
+
+}
+#noMessages {
+ clear:both;
+ float:left;
+ width: 100%;
+
+}
+.subject {
+ clear: both;
+ float:left;
+ width: 190px;
+ padding: 4px 0 4px 22px;
+ background-position: 4px 0.7em;
+ background-repeat: no-repeat;
+ background-image: url("images/forum/read.gif");
+}
+
+.topic {
+ clear:both;
+ float:left;
+ width: 212px;
+ padding: 4px 0 4px 0px;
+}
+
+.threadSubject {
+ clear:both;
+ float:left;
+ width: 140px;
+ padding: 4px 0 4px 0px;
+}
+
+.author {
+ float:left;
+ width: 100px;
+ padding: 4px 0 4px 0px;
+ text-align: center;
+}
+
+.replies {
+ float:left;
+ text-align: center;
+ width: 60px;
+ padding: 4px 0 4px 0px;
+}
+
+.threads {
+ float:left;
+ text-align: center;
+ width: 75px;
+ padding: 4px 0 4px 0px;
+}
+
+.status {
+ float:left;
+ width: 75px;
+ padding: 4px 0 4px 0px;
+}
+
+.delete {
+ float:left;
+ text-align: center;
+ width: 50px;
+ padding: 4px 0 4px 0px;
+}
+
+.lastPost {
+ float: left;
+ text-align: center;
+ width: 150px;
+ padding: 4px 0 4px 0px;
+}
+
+#newTopicLink a {
+ padding: 4px 0 4px 22px;
+ background-position: 0px 0.3em;
+ background-repeat: no-repeat;
+ background-image: url("images/forum/post-16x16.gif");
+}
+
+#viewAllTopicsLink a {
+ float: left;
+ padding: 4px 15px 4px 22px;
+ background-position: 0px 0.3em;
+ background-repeat: no-repeat;
+ background-image: url("images/forum/back-to-16x16.gif");
+
+}
+
+#watchTopicLink a {
+ float: left;
+ padding: 4px 0 4px 22px;
+ background-position: 0px 0.3em;
+ background-repeat: no-repeat;
+ background-image: url("images/forum/watch-16x16.gif");
+ margin-left: 0.8em;
+ margin-bottom: 0.8em;
+}
+
+#info {
+ clear:both;
+ padding: 4px 0 4px 22px;
+ background-position: 0px 0.6em;
+ background-repeat: no-repeat;
+ background-image: url("images/forum/info-16x16.gif");
+ color: green;
+ margin-left: 0.8em;
+}
+
+.post {
+ clear: both;
+ margin-bottom: 0.8em;
+ font-size: 1em;
+}
+
+.postOdd {
+ background-color: #EFEFEF;
+
+}
+
+.postEven {
+ background-color: #FFFFFF;
+}
+
+#topic {
+ margin-bottom: 0.8em;
+ font-weight: bold;
+}
+
+.actions {
+ float: right;
+ margin-right: 0.3em;
+}
+
+.header {
+ float: left;
+ margin-left: 0.3em;
+ font-weight: bold;
+}
+
+.message {
+ clear: both;
+ float: left;
+ width:98%;
+ margin-left: 0.3em;
+ margin-bottom: 0.5em;
+}
+
+.postDetails {
+ clear: both;
+ float: left;
+ margin-bottom: 0.5em;
+ margin-left: 0.3em;
+}
+
+.bar {
+ clear:both;
+ float:left;
+ width: 98%;
+ padding-left: 0.3em;
+ padding-right: 0.3em;
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+}
+
+.replyBar {
+ clear:both;
+ padding-right: 0.3em;
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+}
+
+
+.clearGroup {
+ clear:both;
+ margin-bottom: 0.5em;
+}
+
+.columnOne {
+ float: left;
+ width: 100px;
+ font-size: 1em;
+}
+
+.columnOneWide {
+ float: left;
+ width: 130px;
+ font-size: 1em;
+}
+
+.columnTwo {
+ display: inline;
+ font-size: 1em;
+ margin: 0;
+}
+
+
+.columnTwo input {
+ width: 300px;
+}
+
+.columnTwo select {
+ width: 300px;
+}
+
+
+.columnTwo textArea {
+ width: 300px;
+}
+
+.columnThree {
+ font-size: 1em;
+}
+
+#title {
+ float:left;
+ width: 100%;
+
+ font-size: 1.2em;
+}
+
+
+fieldset {
+ padding: 0.3em 0.3em 0.3em 0.3em;
+}
+
+.fileLink {
+ margin-left: 0.5em;
+ clear: both;
+ float:left;
+}
+
+
+textarea {
+ width: 450px;
+}
+
+.validationError {
+ color: red;
+ margin-left: 100px;
+}
+
+#images {
+ clear: both;
+ float:left;
+ margin-left: 0.3em;
+}
+
+#plainText {
+ clear: both;
+ font-size: 1em;
+ margin-bottom: 0.5em;
+}
+
+li {
+ list-style-position: inside;
+}
+
+.expiry input {
+ width: 50px;
+}
+
+.fileTable {
+ width: 100%;
+}
+
+
+pre {
+
+ font-size: 1em;
+}
+
+
+/* Contents of tabbed-pane.css - forum tabs */
+
+div.tabbed-pane div, div.tabbed-pane table.tab-set, div.tabbed-pane table.tab-set td {
+ margin: 0;
+ border: 0;
+ padding: 0;
+}
+
+div.tabbed-pane table {
+ border-collapse: collapse;
+}
+
+div.tabbed-pane table.tab-set {
+ margin-left: 10px;
+}
+
+div.tabbed-pane table.tab-set a {
+ text-decoration: none;
+ color: rgb(63,63,63);
+}
+
+div.tabbed-pane table.tab-set td.tab-label {
+ margin-left: 4px;
+ padding: 5px 0 3px 10px;
+
+ background: rgb(225,225,225) url(/css/tabbed-pane/tab-unselected.png) no-repeat;
+}
+
+div.tabbed-pane table.tab-set td.tab-end {
+ width: 10px;
+ background: url(/css/tabbed-pane/tab-unselected-end.png) no-repeat;
+}
+
+div.tabbed-pane table.tab-set td.current-tab-label {
+ margin-left: 4px;
+ padding: 5px 0 3px 10px;
+ background: rgb(162,30,30) url(/css/tabbed-pane/tab-selected.png) no-repeat;
+ color: white;
+}
+
+div.tabbed-pane table.tab-set td.current-tab-end {
+ width: 10px;
+ background: url(/css/tabbed-pane/tab-selected-end.png) no-repeat;
+}
+
+div.tabbed-pane table.tab-set td.tab-spacer {
+ width: 4px;
+}
+
+div.tabbed-pane table.rule {
+ margin-left: 10px;
+ width: 100%;
+ background: rgb(162,30,30) url(/css/tabbed-pane/tab-bar.png) repeat-x;
+ height: 10px;
+}
+
+div.tabbed-pane div.current-pane {
+ width: 100%;
+}
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/forum-index.xsl b/ccm-bundle/web/themes/static/aplaws-generic/forum-index.xsl
new file mode 100644
index 000000000..666133a05
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/forum-index.xsl
@@ -0,0 +1,1307 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Forum
+
+
+
+
+
+
+
+
+
+ Skip over navigation
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+ |
+
+
+ |
+
+
+
+
+ |
+
+
+ |
+
+
+
+ |
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+ postOdd
+
+
+ postEven
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Thread:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Thread
+
Author
+
Replies
+
Last Post
+
+
+ No messages have been posted yet
+
+
+
+
+
+
+
+ odd
+
+
+ even
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Subject
+
Replies
+
Author
+
Last Post
+
Status
+
Delete
+
+
+
+
+ You are not subscribed to any threads
+
+
+
+
+
+
+ postOdd
+
+
+ postEven
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
Topic
+
Threads
+
Last Post
+
+
+
+
+
+
+ postOdd
+
+
+ postEven
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ n/a
+
+
+
+
+
+
+
+
+
+ postOdd
+
+
+ postEven
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ n/a
+
+
+
+
+
+
+
+
+
+
+
Forum Alerts
+
+
+
+
+
+
+
+
+
+
Thread Alerts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+ |
+
+
+
+
+
+
+ |
+ |
+
+
+ |
+
+
+
+ forum member list
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Original Message:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ No images attached to this post
+
+
+
+
+
+
+
+
+ postOdd
+
+
+ postEven
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ No files attached to this post
+
+
+
+
+
+
+ File |
+ Description |
+ |
+
+
+
+ |
+
+
+
+
+
+
+ |
+
+
+
+
+ |
+ Remove |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Post New Message
+
+
+ Add Images (optional)
+
+
+ Add Files (optional)
+
+
+ Preview New Message
+
+
+
+
+
+
+
+
+
+
+
+ Edit Message
+
+
+ Edit Images
+
+
+ Edit Files
+
+
+ Preview Changes
+
+
+
+
+
+
+
+
+
+
+
+ Post reply
+
+
+ Add Images (optional)
+
+
+ Add Files (optional)
+
+
+ Preview Reply
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ You are watching this thread. To stop watching this thread, click "Stop Watching Thread" below.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/aplaws-logo-small.png b/ccm-bundle/web/themes/static/aplaws-generic/images/aplaws-logo-small.png
new file mode 100644
index 000000000..3280df920
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/aplaws-logo-small.png differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/aplaws-logo.gif b/ccm-bundle/web/themes/static/aplaws-generic/images/aplaws-logo.gif
new file mode 100644
index 000000000..e0fa5a9ee
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/aplaws-logo.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/aplawsplus.gif b/ccm-bundle/web/themes/static/aplaws-generic/images/aplawsplus.gif
new file mode 100644
index 000000000..576719675
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/aplawsplus.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/arrowSitemap.gif b/ccm-bundle/web/themes/static/aplaws-generic/images/arrowSitemap.gif
new file mode 100644
index 000000000..278673f15
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/arrowSitemap.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/forum/archived-16x16.gif b/ccm-bundle/web/themes/static/aplaws-generic/images/forum/archived-16x16.gif
new file mode 100644
index 000000000..2d3db34c2
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/forum/archived-16x16.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/forum/back-to-16x16.gif b/ccm-bundle/web/themes/static/aplaws-generic/images/forum/back-to-16x16.gif
new file mode 100644
index 000000000..95d374a32
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/forum/back-to-16x16.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/forum/delete-16x16.gif b/ccm-bundle/web/themes/static/aplaws-generic/images/forum/delete-16x16.gif
new file mode 100644
index 000000000..867d48eee
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/forum/delete-16x16.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/forum/edit-16x16.gif b/ccm-bundle/web/themes/static/aplaws-generic/images/forum/edit-16x16.gif
new file mode 100644
index 000000000..3e9a90a47
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/forum/edit-16x16.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/forum/info-16x16.gif b/ccm-bundle/web/themes/static/aplaws-generic/images/forum/info-16x16.gif
new file mode 100644
index 000000000..5acb95064
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/forum/info-16x16.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/forum/post-16x16.gif b/ccm-bundle/web/themes/static/aplaws-generic/images/forum/post-16x16.gif
new file mode 100644
index 000000000..07b98d107
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/forum/post-16x16.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/forum/read.gif b/ccm-bundle/web/themes/static/aplaws-generic/images/forum/read.gif
new file mode 100644
index 000000000..26d0d6fb5
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/forum/read.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/forum/reply-16x16.gif b/ccm-bundle/web/themes/static/aplaws-generic/images/forum/reply-16x16.gif
new file mode 100644
index 000000000..0395fca0f
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/forum/reply-16x16.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/forum/watch-16x16.gif b/ccm-bundle/web/themes/static/aplaws-generic/images/forum/watch-16x16.gif
new file mode 100644
index 000000000..01e001924
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/forum/watch-16x16.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/portal/customize.gif b/ccm-bundle/web/themes/static/aplaws-generic/images/portal/customize.gif
new file mode 100644
index 000000000..1fc3b9048
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/portal/customize.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/portal/delete.gif b/ccm-bundle/web/themes/static/aplaws-generic/images/portal/delete.gif
new file mode 100644
index 000000000..0a685ae48
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/portal/delete.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/portal/display.gif b/ccm-bundle/web/themes/static/aplaws-generic/images/portal/display.gif
new file mode 100644
index 000000000..820295a58
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/portal/display.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/portal/moveDown.gif b/ccm-bundle/web/themes/static/aplaws-generic/images/portal/moveDown.gif
new file mode 100644
index 000000000..9c631a238
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/portal/moveDown.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/portal/moveLeft.gif b/ccm-bundle/web/themes/static/aplaws-generic/images/portal/moveLeft.gif
new file mode 100644
index 000000000..09a282b51
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/portal/moveLeft.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/portal/moveRight.gif b/ccm-bundle/web/themes/static/aplaws-generic/images/portal/moveRight.gif
new file mode 100644
index 000000000..ef767a035
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/portal/moveRight.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/portal/moveUp.gif b/ccm-bundle/web/themes/static/aplaws-generic/images/portal/moveUp.gif
new file mode 100644
index 000000000..accc954a2
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/portal/moveUp.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/spacer.gif b/ccm-bundle/web/themes/static/aplaws-generic/images/spacer.gif
new file mode 100644
index 000000000..5bfd67a2d
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/spacer.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/tlcArrow-s.gif b/ccm-bundle/web/themes/static/aplaws-generic/images/tlcArrow-s.gif
new file mode 100644
index 000000000..9be407815
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/tlcArrow-s.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/tlcArrow.gif b/ccm-bundle/web/themes/static/aplaws-generic/images/tlcArrow.gif
new file mode 100644
index 000000000..8230bf333
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/tlcArrow.gif differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/w3c-css.bmp b/ccm-bundle/web/themes/static/aplaws-generic/images/w3c-css.bmp
new file mode 100644
index 000000000..7f7cf9381
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/w3c-css.bmp differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/w3c-css.png b/ccm-bundle/web/themes/static/aplaws-generic/images/w3c-css.png
new file mode 100644
index 000000000..020c75a73
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/w3c-css.png differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/w3c-xhtml.bmp b/ccm-bundle/web/themes/static/aplaws-generic/images/w3c-xhtml.bmp
new file mode 100644
index 000000000..e0328dc6f
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/w3c-xhtml.bmp differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/images/w3c-xhtml.png b/ccm-bundle/web/themes/static/aplaws-generic/images/w3c-xhtml.png
new file mode 100644
index 000000000..3855210c6
Binary files /dev/null and b/ccm-bundle/web/themes/static/aplaws-generic/images/w3c-xhtml.png differ
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/lib/body.xsl b/ccm-bundle/web/themes/static/aplaws-generic/lib/body.xsl
new file mode 100644
index 000000000..0c1921625
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/lib/body.xsl
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/lib/head.xsl b/ccm-bundle/web/themes/static/aplaws-generic/lib/head.xsl
new file mode 100644
index 000000000..4eacbf3dc
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/lib/head.xsl
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/lib/header.xsl b/ccm-bundle/web/themes/static/aplaws-generic/lib/header.xsl
new file mode 100644
index 000000000..48c37d16a
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/lib/header.xsl
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/lib/leftNav.xsl b/ccm-bundle/web/themes/static/aplaws-generic/lib/leftNav.xsl
new file mode 100644
index 000000000..40d397605
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/lib/leftNav.xsl
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+|
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/lib/lib.xsl b/ccm-bundle/web/themes/static/aplaws-generic/lib/lib.xsl
new file mode 100644
index 000000000..3ffab4e5f
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/lib/lib.xsl
@@ -0,0 +1,562 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+|
+
+
+
+home >
+|
+
+
+
+
+
+
+
+
+|
+ >
+
+
+
+
+
+
+
+
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Data Protection and Information Sharing notice. No personal information you have given us will be passed on to third parties for commercial purposes. The Council's policy is that all information will be shared among officers and other agencies where the legal framework allows it, if this will help to improve the service you receive and to develop other services. If you do not wish certain information about you to be exchanged within the Council, you can request that this does not happen.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+A to Z
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
![]()
+
/cms-service/stream/image/?image_id=
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dated Links
+
+
+
Items ordered in order
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
+ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
+
+
+ !'()*-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~
+
+ 0123456789ABCDEF
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Warning: string contains a character that is out of range! Substituting "?".
+ 63
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Related Items
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+APLAWS+:
+
+
+
+
+
+
+
+
+
+
+
+
+
+20
+ -
+
+
+ 01
+ 02
+ 03
+ 04
+ 05
+ 06
+ 07
+ 08
+ 09
+ 10
+ 11
+ 12
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/lib/lib.xsl~ b/ccm-bundle/web/themes/static/aplaws-generic/lib/lib.xsl~
new file mode 100644
index 000000000..ad362ffde
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/lib/lib.xsl~
@@ -0,0 +1,565 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+|
+
+
+
+home >
+|
+
+
+
+
+
+
+
+
+|
+ >
+
+
+
+
+
+
+
+
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Data Protection and Information Sharing notice. No personal information you have given us will be passed on to third parties for commercial purposes. The Council's policy is that all information will be shared among officers and other agencies where the legal framework allows it, if this will help to improve the service you receive and to develop other services. If you do not wish certain information about you to be exchanged within the Council, you can request that this does not happen.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+A to Z
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
![]()
+
/cms-service/stream/image/?image_id=
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dated Links
+
+
+
Items ordered in order
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
+ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
+
+
+ !'()*-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~
+
+ 0123456789ABCDEF
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Warning: string contains a character that is out of range! Substituting "?".
+ 63
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Related Items
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+APLAWS+:
+
+
+
+
+
+
+
+
+
+
+
+
+
+20
+ -
+
+
+ 01
+ 02
+ 03
+ 04
+ 05
+ 06
+ 07
+ 08
+ 09
+ 10
+ 11
+ 12
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/lib/page.xsl b/ccm-bundle/web/themes/static/aplaws-generic/lib/page.xsl
new file mode 100644
index 000000000..9af4bce18
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/lib/page.xsl
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/lib/user-banner.xsl b/ccm-bundle/web/themes/static/aplaws-generic/lib/user-banner.xsl
new file mode 100644
index 000000000..1e9b0bb8d
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/lib/user-banner.xsl
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/navigation-admin.css b/ccm-bundle/web/themes/static/aplaws-generic/navigation-admin.css
new file mode 100644
index 000000000..49dd80c4e
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/navigation-admin.css
@@ -0,0 +1,2 @@
+@import url("/css/acs-master.css");
+@import url("/themes/heirloom/apps/navigation/xsl/admin.css");
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/navigation-admin.xsl b/ccm-bundle/web/themes/static/aplaws-generic/navigation-admin.xsl
new file mode 100644
index 000000000..6233f0d7a
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/navigation-admin.xsl
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/navigation-directory.xsl b/ccm-bundle/web/themes/static/aplaws-generic/navigation-directory.xsl
new file mode 100644
index 000000000..3e6a59603
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/navigation-directory.xsl
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/navigation-index.xsl b/ccm-bundle/web/themes/static/aplaws-generic/navigation-index.xsl
new file mode 100644
index 000000000..800e9c2a9
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/navigation-index.xsl
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/navigation-services.xsl b/ccm-bundle/web/themes/static/aplaws-generic/navigation-services.xsl
new file mode 100644
index 000000000..db3673ea0
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/navigation-services.xsl
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/navigation-sitemap.xsl b/ccm-bundle/web/themes/static/aplaws-generic/navigation-sitemap.xsl
new file mode 100644
index 000000000..ccb45f5da
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/navigation-sitemap.xsl
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APLAWS+: Site Map
+
+
+
+
+
+ Skip over navigation
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+ |
+
+
+ Site Map
+ |
+
+
+ |
+ |
+
+
+ |
+
+
+ |
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+home
+>
+Site Map
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Select an area to view
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/navigation-summary.xsl b/ccm-bundle/web/themes/static/aplaws-generic/navigation-summary.xsl
new file mode 100644
index 000000000..362666eb8
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/navigation-summary.xsl
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ | PID |
+ Term |
+ # items |
+
+
+
+
+ |
+ |
+ |
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/portal-workspace-index.xsl b/ccm-bundle/web/themes/static/aplaws-generic/portal-workspace-index.xsl
new file mode 100644
index 000000000..dc71550d2
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/portal-workspace-index.xsl
@@ -0,0 +1,194 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APLAWS+:
+
+
+
+
+
+
+ Skip over navigation
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+ |
+
+
+ APLAWS+ Plus
+ |
+
+
+ |
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+back to user's view
+delete area
+customise area
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/portal-workspace-portal-admin.xsl b/ccm-bundle/web/themes/static/aplaws-generic/portal-workspace-portal-admin.xsl
new file mode 100644
index 000000000..10f65c812
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/portal-workspace-portal-admin.xsl
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/portal/application-directory-portlet.xsl b/ccm-bundle/web/themes/static/aplaws-generic/portal/application-directory-portlet.xsl
new file mode 100644
index 000000000..d3ec401c9
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/portal/application-directory-portlet.xsl
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/portal/content-item-portlet.xsl b/ccm-bundle/web/themes/static/aplaws-generic/portal/content-item-portlet.xsl
new file mode 100644
index 000000000..5dd4f948d
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/portal/content-item-portlet.xsl
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/portal/content-sections-portlet.xsl b/ccm-bundle/web/themes/static/aplaws-generic/portal/content-sections-portlet.xsl
new file mode 100644
index 000000000..a38288f70
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/portal/content-sections-portlet.xsl
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ table_row_odd
+ table_row_even
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/portal/directory-portlet.xsl b/ccm-bundle/web/themes/static/aplaws-generic/portal/directory-portlet.xsl
new file mode 100644
index 000000000..6aab1c230
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/portal/directory-portlet.xsl
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/portal/freeform-html-portlet.xsl b/ccm-bundle/web/themes/static/aplaws-generic/portal/freeform-html-portlet.xsl
new file mode 100644
index 000000000..317ee6eab
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/portal/freeform-html-portlet.xsl
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/portal/lib.xsl b/ccm-bundle/web/themes/static/aplaws-generic/portal/lib.xsl
new file mode 100644
index 000000000..7e181bdd4
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/portal/lib.xsl
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+ Move Down
+
+
+ Move Up
+
+
+ Configure
+
+
+ Delete
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/portal/login-portlet.xsl b/ccm-bundle/web/themes/static/aplaws-generic/portal/login-portlet.xsl
new file mode 100644
index 000000000..3b982ff14
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/portal/login-portlet.xsl
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Welcome
+
+|
+
+
+
+
+
+ Site Login
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/portal/portlets.xsl b/ccm-bundle/web/themes/static/aplaws-generic/portal/portlets.xsl
new file mode 100644
index 000000000..7af695964
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/portal/portlets.xsl
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/portal/rss-feed-portlet.xsl b/ccm-bundle/web/themes/static/aplaws-generic/portal/rss-feed-portlet.xsl
new file mode 100644
index 000000000..d2fd5570e
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/portal/rss-feed-portlet.xsl
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/portal/tasklist-portlet.xsl b/ccm-bundle/web/themes/static/aplaws-generic/portal/tasklist-portlet.xsl
new file mode 100644
index 000000000..720efab26
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/portal/tasklist-portlet.xsl
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ ,
+
+ No assigned users
+
+
+ 1 assigned user
+
+
+ assigned users
+
+
+
+
+
+
+ No tasks to display.
+
+
+
+ | Item Title | Action | Due Date | Status |
+
+
+
+
+ table_row_odd
+ table_row_even
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/portal/time-of-day-portlet.xsl b/ccm-bundle/web/themes/static/aplaws-generic/portal/time-of-day-portlet.xsl
new file mode 100644
index 000000000..1d4dd4075
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/portal/time-of-day-portlet.xsl
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/portal/workspace-directory-portlet.xsl b/ccm-bundle/web/themes/static/aplaws-generic/portal/workspace-directory-portlet.xsl
new file mode 100644
index 000000000..1e533ace5
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/portal/workspace-directory-portlet.xsl
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/search-admin.xsl b/ccm-bundle/web/themes/static/aplaws-generic/search-admin.xsl
new file mode 100644
index 000000000..06891ba23
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/search-admin.xsl
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/search-index.xsl b/ccm-bundle/web/themes/static/aplaws-generic/search-index.xsl
new file mode 100644
index 000000000..11e9e9d3d
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/search-index.xsl
@@ -0,0 +1,591 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ APLAWS+: Search
+
+
+
+
+
+ Skip over navigation
+ |
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+ |
+
+
+ Search
+ |
+
+
+ |
+ |
+
+
+
+ |
+
+ |
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+ home
+ >
+
+
+ Search
+ Advanced Search
+ Remote Search
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Explanation of Search
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Explanation of Advanced Search
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Explanation of Remote Search
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Quick Matches
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+You searched for >
+
+
+ There were no results for your search
+
+
+
+ results found
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ There were no results for your search
+
+
+
+ displaying results
+
+ to
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Displaying page
+
+ of
+
+ (maximum of
+
+ results per page)
+
+
+
+
+
+
+
+
+
+
+ | Score |
+ Title |
+ Summary |
+
+
+
+
+
+
+
+ odd
+ even
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+ |
+ |
+
+
+
+
+
+
+
+
+
+ Query:
+ |
+
+
+ |
+
+
+
+
+ Types:
+ |
+
+
+ |
+
+
+
+
+ Categories:
+ |
+
+
+ |
+
+
+
+
+
+
+ hidden
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/shortcuts-index.css b/ccm-bundle/web/themes/static/aplaws-generic/shortcuts-index.css
new file mode 100644
index 000000000..4210f401a
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/shortcuts-index.css
@@ -0,0 +1 @@
+@import url(/css/acs-master.css);
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/shortcuts-index.xsl b/ccm-bundle/web/themes/static/aplaws-generic/shortcuts-index.xsl
new file mode 100644
index 000000000..a4e103c89
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/shortcuts-index.xsl
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/subsite-index.css b/ccm-bundle/web/themes/static/aplaws-generic/subsite-index.css
new file mode 100644
index 000000000..4210f401a
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/subsite-index.css
@@ -0,0 +1 @@
+@import url(/css/acs-master.css);
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/subsite-index.xsl b/ccm-bundle/web/themes/static/aplaws-generic/subsite-index.xsl
new file mode 100644
index 000000000..cb04a688c
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/subsite-index.xsl
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/terms-index.css b/ccm-bundle/web/themes/static/aplaws-generic/terms-index.css
new file mode 100644
index 000000000..15fd56956
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/terms-index.css
@@ -0,0 +1,6 @@
+@import url(/css/acs-master.css);
+/* Following import is valid if terms is executed in its own */
+/* web application context (ccm-ldn-terms) */
+/* @import url(/ccm-ldn-terms/__ccm__/apps/terms/xsl/index.css); */
+/* import if installed in the main (common) web context */
+@import url(/__ccm__/apps/terms/xsl/index.css);
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/terms-index.xsl b/ccm-bundle/web/themes/static/aplaws-generic/terms-index.xsl
new file mode 100644
index 000000000..0ee053d22
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/terms-index.xsl
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/theme-index.css b/ccm-bundle/web/themes/static/aplaws-generic/theme-index.css
new file mode 100644
index 000000000..4210f401a
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/theme-index.css
@@ -0,0 +1 @@
+@import url(/css/acs-master.css);
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/theme-index.xsl b/ccm-bundle/web/themes/static/aplaws-generic/theme-index.xsl
new file mode 100644
index 000000000..3f85303aa
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/theme-index.xsl
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/types/Address.xsl b/ccm-bundle/web/themes/static/aplaws-generic/types/Address.xsl
new file mode 100644
index 000000000..70f9f4de5
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/types/Address.xsl
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+Address:
+
+
+
+
+Post Code:
+
+
+
+
+Country:
+
+
+
+
+Phone:
+
+
+
+
+Mobile:
+
+
+
+
+Fax:
+
+
+
+
+Email:
+
+
+
+
+Notes:
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/types/Agenda.xsl b/ccm-bundle/web/themes/static/aplaws-generic/types/Agenda.xsl
new file mode 100644
index 000000000..17c62d363
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/types/Agenda.xsl
@@ -0,0 +1,98 @@
+
+]>
+
+
+
+
+
+
+
+
+Date:
+
+
+Location:
+
+
+Attendees:
+
+
+Contact Info:
+
+
+
+
+
+Subject Items:
+
+
+
+Summary:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Mon
+Tue
+Wed
+Thu
+Fri
+Sat
+Sun
+
+
+
+
+
+st
+nd
+rd
+th
+
+
+
+
+Jan
+Feb
+Mar
+Apr
+May
+Jun
+Jul
+Aug
+Sep
+Oct
+Nov
+Dec
+
+
+
+20
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/types/Article.xsl b/ccm-bundle/web/themes/static/aplaws-generic/types/Article.xsl
new file mode 100644
index 000000000..5053ca2d6
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/types/Article.xsl
@@ -0,0 +1,36 @@
+
+]>
+
+
+
+
+
+
+
+
+
+
+
![]()
+
/cms-service/stream/image/?image_id=
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/types/ContentTypes.xsl b/ccm-bundle/web/themes/static/aplaws-generic/types/ContentTypes.xsl
new file mode 100644
index 000000000..e385d8209
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/types/ContentTypes.xsl
@@ -0,0 +1,77 @@
+
+]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/types/Event.xsl b/ccm-bundle/web/themes/static/aplaws-generic/types/Event.xsl
new file mode 100644
index 000000000..9a25fec03
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/types/Event.xsl
@@ -0,0 +1,60 @@
+
+]>
+
+
+
+
+
+
+
+Event Type:
+
+
+Event Date:
+
+
+
+Start Date:
+
+
+
+Start Time:
+
+
+
+End Date:
+
+
+
+End Time:
+
+
+
+Contributor:
+
+
+Location:
+
+
+Map:
+
+View map
+
+
+
+Cost:
+
+
+
+
+
\ No newline at end of file
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/types/FileStorageItem.xsl b/ccm-bundle/web/themes/static/aplaws-generic/types/FileStorageItem.xsl
new file mode 100644
index 000000000..af6319ba7
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/types/FileStorageItem.xsl
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/types/InlineSite.xsl b/ccm-bundle/web/themes/static/aplaws-generic/types/InlineSite.xsl
new file mode 100644
index 000000000..e87f28ef8
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/types/InlineSite.xsl
@@ -0,0 +1,29 @@
+
+]>
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/types/Job.xsl b/ccm-bundle/web/themes/static/aplaws-generic/types/Job.xsl
new file mode 100644
index 000000000..b6e1c034d
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/types/Job.xsl
@@ -0,0 +1,46 @@
+
+]>
+
+
+
+
+
+
+
+
+Grade:
+
+
+Department:
+
+
+Salary:
+
+
+Ref:
+
+
+Closing Date:
+
+
+Contact:
+
+
+
+
+Job Description:
+
+
+
+Person Specification:
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/types/LegalNotice.xsl b/ccm-bundle/web/themes/static/aplaws-generic/types/LegalNotice.xsl
new file mode 100644
index 000000000..4a6bfe587
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/types/LegalNotice.xsl
@@ -0,0 +1,23 @@
+
+]>
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/types/Minutes.xsl b/ccm-bundle/web/themes/static/aplaws-generic/types/Minutes.xsl
new file mode 100644
index 000000000..43360a7ae
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/types/Minutes.xsl
@@ -0,0 +1,34 @@
+
+]>
+
+
+
+
+
+
+
+Description of Minutes:
+
+
+Minutes ID Number:
+
+
+Attendees At Meeting:
+
+
+
+
+
+
+
+Action Item:
+
+
+
+
+
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/types/MultiPartArticle.xsl b/ccm-bundle/web/themes/static/aplaws-generic/types/MultiPartArticle.xsl
new file mode 100644
index 000000000..8ac049b4d
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/types/MultiPartArticle.xsl
@@ -0,0 +1,151 @@
+
+]>
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /cms-service/stream/image/?image_id=
+
+
+
+
+
+
+
+
+ :
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/types/NewsItem.xsl b/ccm-bundle/web/themes/static/aplaws-generic/types/NewsItem.xsl
new file mode 100644
index 000000000..8a7030c51
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/types/NewsItem.xsl
@@ -0,0 +1,41 @@
+
+]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
![]()
+
/cms-service/stream/image/?image_id=
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/types/PressRelease.xsl b/ccm-bundle/web/themes/static/aplaws-generic/types/PressRelease.xsl
new file mode 100644
index 000000000..a25dd2dc5
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/types/PressRelease.xsl
@@ -0,0 +1,30 @@
+
+]>
+
+
+
+
+
+
+
+Ref Code:
+
+
+Contact:
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/types/Service.xsl b/ccm-bundle/web/themes/static/aplaws-generic/types/Service.xsl
new file mode 100644
index 000000000..2758df8a3
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/types/Service.xsl
@@ -0,0 +1,40 @@
+
+]>
+
+
+
+
+
+
+
+
+Opening Times:
+
+
+Contact:
+
+
+Address:
+
+
+
+
+
+Services Provided:
+
+
+
+Summary:
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ccm-bundle/web/themes/static/aplaws-generic/types/SiteProxy.xsl b/ccm-bundle/web/themes/static/aplaws-generic/types/SiteProxy.xsl
new file mode 100644
index 000000000..bbbb5c6ac
--- /dev/null
+++ b/ccm-bundle/web/themes/static/aplaws-generic/types/SiteProxy.xsl
@@ -0,0 +1,21 @@
+
+]>
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file