You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jspwiki.apache.org by br...@apache.org on 2014/02/14 18:24:35 UTC
svn commit: r1568367 [1/13] - in /jspwiki/trunk: ./ jspwiki-war/
jspwiki-war/src/main/config/wro/ jspwiki-war/src/main/java/org/apache/wiki/
jspwiki-war/src/main/scripts/dynamic-styles/
jspwiki-war/src/main/scripts/lib/ jspwiki-war/src/main/scripts/moo...
Author: brushed
Date: Fri Feb 14 17:24:32 2014
New Revision: 1568367
URL: http://svn.apache.org/r1568367
Log:
* 2.10.0-svn-73, introducing the HADDOCK Template
* [JSPWIKI-504] New default look for 3.0
* [JSPWIKI-431] Attachment Upload, support upload of multiple files, drag&drop,
* [JSPWIKI-432] Simplify Tabbed Section Markup
* [JSPWIKI-712] Entites in ChangeNote should be decoded with "keep editing"
* [JSPWIKI-797] Refactoring the JSPWiki javascript routines, upgrade js libs:
* [JSPWIKI-798] Refactoring the JSPWiki main CSS stylesheet -
* [JSPWIKI-430] DOM based popups to replace regular js alert or prompt dialog boxes
* [JSPWIKI-429] Improved SLIMBOX to support Youtube, flash and other formats.
* [JSPWIKI-478] Remember cookies of collapsible for all contexts
* [JSPWIKI-693] style issues
* [JSPWIKI-463] display error in default template
* [JSPWIKI-449] Menuhide functionality is illogical
* [JSPWIKI-512] CSS Error with Firefox 2.0.20
Added:
jspwiki/trunk/jspwiki-war/src/main/config/wro/wro-haddock.xml
jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/
jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Accordion.js
jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Collapsible.js
jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Columns.js
jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/CommentBox.js
jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Element.Reflect.js
jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/GraphBar.js
jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/TableX.Filter.js
jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/TableX.Sort.js
jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/TableX.Zebra.js
jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/TableX.js
jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Tabs.js
jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Viewer.Carousel.js
jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Viewer.Slimbox.js
jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Viewer.js
jspwiki/trunk/jspwiki-war/src/main/scripts/lib/
jspwiki/trunk/jspwiki-war/src/main/scripts/lib/mootools-core-1.4.5.js
jspwiki/trunk/jspwiki-war/src/main/scripts/lib/mootools-more-1.4.0.1.js
jspwiki/trunk/jspwiki-war/src/main/scripts/lib/prettify4mar13.js
jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/
jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/Accesskey.js
jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/Array.Extend.js
jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/Array.NaturalSort.js
jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/Behavior.js
jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/Color.js
jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/Cookie.Flags.js
jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/Date.Extend.js
jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/Element.Extend.js
jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/Element.Placeholder.js
jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/Form.File.js (with props)
jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/Form.MultipleFile.js (with props)
jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/HighlightQuery.js
jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/Request.File.js (with props)
jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/String.Extend.js
jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/Textarea.js
jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/Tips.js
jspwiki/trunk/jspwiki-war/src/main/scripts/wiki/
jspwiki/trunk/jspwiki-war/src/main/scripts/wiki-edit/
jspwiki/trunk/jspwiki-war/src/main/scripts/wiki-edit/Wiki.Edit.js
jspwiki/trunk/jspwiki-war/src/main/scripts/wiki/Category.js
jspwiki/trunk/jspwiki-war/src/main/scripts/wiki/Dynamic-styles.js
jspwiki/trunk/jspwiki-war/src/main/scripts/wiki/Findpages.js
jspwiki/trunk/jspwiki-war/src/main/scripts/wiki/Group.js
jspwiki/trunk/jspwiki-war/src/main/scripts/wiki/Prefs.js
jspwiki/trunk/jspwiki-war/src/main/scripts/wiki/Recents.js
jspwiki/trunk/jspwiki-war/src/main/scripts/wiki/Search.js
jspwiki/trunk/jspwiki-war/src/main/scripts/wiki/Wiki.js
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/Accordion.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/Calendar.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/Category.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/Collapsible.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/Columns.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/CommentBox.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/GraphBar.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/ImagePlugin.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/IndexPlugin.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/RecentChangesPlugin.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/TOCPlugin.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/TableX.Filter.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/TableX.Sort.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/Tabs.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/Template.Attach.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/Template.Content.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/Template.Diff.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/Template.Edit.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/Template.Nav.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/Template.Preview.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/Template.Search.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/Template.SearchBox.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/Template.Sidebar.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/Template.View.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/Tips.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/Viewer.Carousel.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/Viewer.Slimbox.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/Viewer.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/WeblogPlugin.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/Wiki.Layouts.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/alerts.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/badges.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/bootstrap.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/breadcrumbs.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/button-groups.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/buttons.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/carousel.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/close.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/code.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/component-animations.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/dropdowns.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/forms.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/glyphicons.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/grid.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/input-groups.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/jumbotron.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/labels.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/list-group.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/mixins.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/modals.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/navbar.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/navs.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/normalize.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/pager.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/pagination.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/panels.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/popovers.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/print.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/progress-bars.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/responsive-utilities.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/scaffolding.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/tables.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/theme.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/tooltip.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/type.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/utilities.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/bootstrap/variables.less (with props)
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/forms.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/grid.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/jspwiki.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/pagination.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/prettify.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/print.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/tables.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/type.less
jspwiki/trunk/jspwiki-war/src/main/styles/haddock/variables.less
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/AttachmentTab.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/CommentContent.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/ConflictContent.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/DiffTab.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/EditContent.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/EditGroupContent.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/EditTemplate.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/FindContent.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/Footer.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/GroupContent.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/GroupTab.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/Header.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/InfoContent.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/LoginContent.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/Nav.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/NewGroupContent.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/PageContent.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/PageInfo.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/PageTab.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/PreferencesContent.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/PreferencesTab.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/PreviewContent.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/ProfileTab.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/SearchBox.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/Sidebar.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/UploadTemplate.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/UserBox.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/ViewTemplate.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/WorkflowContent.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/admin/
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/admin/AdminTemplate.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/admin/UserManagement.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/admin/admin.css
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/commonheader.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/editors/
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/editors/plain.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/editors/preview.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/images/
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/images/attach-strip.png (with props)
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/images/form-select-arrow.png (with props)
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/images/icon-filter.gif (with props)
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/images/icon-search.png (with props)
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/images/jspwiki-strip.gif (with props)
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/skins/
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/reader/
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/reader/ViewTemplate.jsp
Modified:
jspwiki/trunk/ChangeLog
jspwiki/trunk/jspwiki-war/pom.xml
jspwiki/trunk/jspwiki-war/src/main/config/wro/wro.properties
jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/Release.java
jspwiki/trunk/jspwiki-war/src/main/webapp/Install.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/admin/Admin.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/admin/SecurityConfig.jsp
jspwiki/trunk/pom.xml
Modified: jspwiki/trunk/ChangeLog
URL: http://svn.apache.org/viewvc/jspwiki/trunk/ChangeLog?rev=1568367&r1=1568366&r2=1568367&view=diff
==============================================================================
--- jspwiki/trunk/ChangeLog (original)
+++ jspwiki/trunk/ChangeLog Fri Feb 14 17:24:32 2014
@@ -1,3 +1,71 @@
+2014-02-14 Dirk Frederickx (brushed AT apache DOT org)
+
+ * 2.10.1-svn-5
+
+ Introducing the HADDOCK template, a new template/ui for Apache JSPWiki.
+
+ This template contains various UI improvements and JSP simplifications,
+ a major redesign of the JSPWiki CSS stylesheet based on BOOTSTRAP
+ (now modularly build with LESS) and a rework of the javascript routines
+ based on mootools v1.4.x. (also the js is now split into modular class files)
+
+ Be aware: this is a first commit -- expect things to be broken.
+ More work is needed on the plain editor; the Group UI is to be fixed.
+ Validation has been done against Safari, Chrome & FF; IE testing is left
+ to the adventurous user.
+
+ HADDOCK lives peacefully next to the default template. To activate the new
+ template, add following line to your jspwiki-custom.properties:
+
+ jspwiki.templateDir = haddock
+
+
+ * [JSPWIKI-504] New default look for 3.0
+
+ * [JSPWIKI-431] Attachment Upload, support upload of multiple files, drag&drop,
+ improved progress bars.
+ However the server functionality to upload multiple files is
+ currently broken. FFS
+
+ * [JSPWIKI-432] Simplify Tabbed Section Markup
+ Still maintaining backwards compatibility with the current %%tabbedSection
+ markup.
+
+ * [JSPWIKI-712] Entites in ChangeNote should be decoded with "keep editing"
+
+ * [JSPWIKI-797] Refactoring the JSPWiki javascript routines, upgrade js libs:
+ mootools-core-1.4.5
+ mootools-more-1.4.0.1
+ prettify (dd. 4 mar 2013)
+
+ * [JSPWIKI-798] Refactoring the JSPWiki main CSS stylesheet -
+ now based on the BOOTSTRAP CSS Framework
+
+ * [JSPWIKI-430] DOM based popups to replace regular js alert or prompt dialog boxes
+ Also the edit/clone UI has been refactored.
+ Some delete confirmation dialog boxes are still to be converted.
+
+ * [JSPWIKI-429] Improved SLIMBOX to support Youtube, flash and other formats.
+ You can now also 'slimbox' another wiki-page or an external url.
+ Based on this media viewer, also a %%carousel style has been added.
+
+ * [JSPWIKI-478] Remember cookies of collapsible for all contexts
+ Collapsible lists and boxes have been refactored, and styled with BOOTSTRAP.
+ In general, all %%dynamic-styles are re-styled with BOOTSTRAP css components.
+
+ * [JSPWIKI-693] style issues
+
+ * [JSPWIKI-463] display error in default template
+
+ * [JSPWIKI-449] Menuhide functionality is illogical
+ The sidebar (aka Favorites) can be shown/hidden via a toggle button.
+ By default, the sidebar is hidden in the Edit/Comment view, to give
+ maximum square-meters to the edit text-area.
+
+ * [JSPWIKI-512] CSS Error with Firefox 2.0.20
+
+ * Upgrade wro4j to latest version 1.7.3
+
2014-02-12 Juan Pablo Santos (juanpablo AT apache DOT org)
* 2.10.1-svn-4
Modified: jspwiki/trunk/jspwiki-war/pom.xml
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/pom.xml?rev=1568367&r1=1568366&r2=1568367&view=diff
==============================================================================
--- jspwiki/trunk/jspwiki-war/pom.xml (original)
+++ jspwiki/trunk/jspwiki-war/pom.xml Fri Feb 14 17:24:32 2014
@@ -241,28 +241,48 @@
<artifactId>wro4j-maven-plugin</artifactId>
<executions>
<execution>
+ <id>buildDefaultJsAndCss</id>
<phase>prepare-package</phase>
<goals>
<goal>run</goal>
<!--<goal>jshint</goal>-->
</goals>
+ <configuration>
+ <!--
+ <targetGroups>all</targetGroups>
+ <minimize>true</minimize>
+ <cssDestinationFolder>d:/static/css/</cssDestinationFolder>
+ <jsDestinationFolder>d:/static/js/</jsDestinationFolder>
+ <ignoreMissingResources>false</ignoreMissingResources>
+ -->
+ <minimize>true</minimize>
+ <wroManagerFactory>ro.isdc.wro.maven.plugin.manager.factory.ConfigurableWroManagerFactory</wroManagerFactory>
+ <jsDestinationFolder>${project.build.directory}/generated-sources/wro/scripts</jsDestinationFolder>
+ <cssDestinationFolder>${project.build.directory}/generated-sources/wro/templates/default/</cssDestinationFolder>
+ <contextFolder>${basedir}/src/main/</contextFolder>
+ <wroFile>src/main/config/wro/wro.xml</wroFile>
+ <extraConfigFile>src/main/config/wro/wro.properties</extraConfigFile>
+ </configuration>
+ </execution>
+
+ <!-- HADDOCK template -->
+ <execution>
+ <id>buildHaddockJsAndCss</id>
+ <phase>prepare-package</phase>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <configuration>
+ <minimize>true</minimize>
+ <wroManagerFactory>ro.isdc.wro.maven.plugin.manager.factory.ConfigurableWroManagerFactory</wroManagerFactory>
+ <jsDestinationFolder>${project.build.directory}/generated-sources/wro/scripts</jsDestinationFolder>
+ <cssDestinationFolder>${project.build.directory}/generated-sources/wro/templates/haddock/</cssDestinationFolder>
+ <contextFolder>${basedir}/src/main/</contextFolder>
+ <wroFile>src/main/config/wro/wro-haddock.xml</wroFile>
+ <extraConfigFile>src/main/config/wro/wro.properties</extraConfigFile>
+ </configuration>
</execution>
</executions>
- <configuration>
- <!--
- <targetGroups>all</targetGroups>
- <minimize>true</minimize>
- <cssDestinationFolder>d:/static/css/</cssDestinationFolder>
- <jsDestinationFolder>d:/static/js/</jsDestinationFolder>
- <ignoreMissingResources>false</ignoreMissingResources>
- -->
- <wroManagerFactory>ro.isdc.wro.maven.plugin.manager.factory.ConfigurableWroManagerFactory</wroManagerFactory>
- <jsDestinationFolder>${project.build.directory}/generated-sources/wro/scripts</jsDestinationFolder>
- <cssDestinationFolder>${project.build.directory}/generated-sources/wro/templates/default/</cssDestinationFolder>
- <contextFolder>${basedir}/src/main/</contextFolder>
- <wroFile>src/main/config/wro/wro.xml</wroFile>
- <extraConfigFile>src/main/config/wro/wro.properties</extraConfigFile>
- </configuration>
</plugin>
<!-- Compress certain CSS and JS files using the YUICompressor
Added: jspwiki/trunk/jspwiki-war/src/main/config/wro/wro-haddock.xml
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/config/wro/wro-haddock.xml?rev=1568367&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/config/wro/wro-haddock.xml (added)
+++ jspwiki/trunk/jspwiki-war/src/main/config/wro/wro-haddock.xml Fri Feb 14 17:24:32 2014
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<groups xmlns="http://www.isdc.ro/wro"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.isdc.ro/wro wro.xsd">
+
+ <!-- HADDOCK Template groups -->
+ <group name="lib" abstract="true">
+ <js>/scripts/lib/mootools-core-1.4.5.js</js>
+ <js>/scripts/lib/mootools-more-1.4.0.1.js</js>
+ <js>/scripts/lib/prettify4mar13.js</js>
+ </group>
+
+ <group name="mooextend" abstract="true">
+ <js>/scripts/moo-extend/Behavior.js</js>
+ <js>/scripts/moo-extend/String.Extend.js</js>
+ <js>/scripts/moo-extend/Array.Extend.js</js>
+ <js>/scripts/moo-extend/Array.NaturalSort.js</js>
+ <js>/scripts/moo-extend/Element.Extend.js</js>
+ <js>/scripts/moo-extend/Element.Placeholder.js</js>
+ <js>/scripts/moo-extend/Color.js</js>
+ <js>/scripts/moo-extend/HighlightQuery.js</js>
+ <js>/scripts/moo-extend/Accesskey.js</js>
+ <js>/scripts/moo-extend/Cookie.Flags.js</js>
+ <js>/scripts/moo-extend/Tips.js</js>
+ <js>/scripts/moo-extend/Request.File.js</js>
+ <js>/scripts/moo-extend/Form.MultipleFile.js</js>
+ <js>/scripts/moo-extend/Form.File.js</js>
+ </group>
+
+ <group name="dynamic-styles" abstract="true">
+ <js>/scripts/dynamic-styles/Collapsible.js</js>
+ <js>/scripts/dynamic-styles/CommentBox.js</js>
+ <js>/scripts/dynamic-styles/Columns.js</js>
+ <js>/scripts/dynamic-styles/GraphBar.js</js>
+ <js>/scripts/dynamic-styles/Element.Reflect.js</js>
+ <js>/scripts/dynamic-styles/TableX.js</js>
+ <js>/scripts/dynamic-styles/TableX.Sort.js</js>
+ <js>/scripts/dynamic-styles/TableX.Filter.js</js>
+ <js>/scripts/dynamic-styles/TableX.Zebra.js</js>
+ <js>/scripts/dynamic-styles/Tabs.js</js>
+ <js>/scripts/dynamic-styles/Accordion.js</js>
+ <js>/scripts/dynamic-styles/Viewer.js</js>
+ <js>/scripts/dynamic-styles/Viewer.Slimbox.js</js>
+ <js>/scripts/dynamic-styles/Viewer.Carousel.js</js>
+ </group>
+
+ <group name="haddock">
+
+ <group-ref>lib</group-ref>
+ <group-ref>mooextend</group-ref>
+ <group-ref>dynamic-styles</group-ref>
+
+ <js>/scripts/wiki/Wiki.js</js>
+ <js>/scripts/wiki/Search.js</js>
+ <js>/scripts/wiki/Recents.js</js>
+ <js>/scripts/wiki/FindPages.js</js>
+ <js>/scripts/wiki/Category.js</js>
+ <js>/scripts/wiki/Dynamic-styles.js</js>
+
+ <css>/styles/haddock/jspwiki.less</css>
+ </group>
+
+ <group name="haddock-edit">
+ <group-ref>haddock</group-ref>
+ <!--TODO
+ <js>/scripts/moo-extend/Date.Extend.js</js>
+ <js>/scripts/moo-extend/Textarea.js</js>
+ <js>/scripts/wiki-edit/Dialog.js</js>
+ <js>/scripts/wiki-edit/SnipEditor.js</js>
+ <js>/scripts/wiki-edit/SnipEditor.Commands.js</js>
+ <js>/scripts/wiki-edit/SnipEditor.Sections.js</js>
+ <js>/scripts/wiki-edit/UndoRedo.js</js>
+ <js>/scripts/wiki-edit/wiki.edit.js</js>
+ -->
+ </group>
+
+ <group name="haddock-prefs">
+ <js>/scripts/wiki/prefs.js</js>
+ <!--<js>/scripts/wiki/group.js</js>-->
+ </group>
+
+</groups>
\ No newline at end of file
Modified: jspwiki/trunk/jspwiki-war/src/main/config/wro/wro.properties
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/config/wro/wro.properties?rev=1568367&r1=1568366&r2=1568367&view=diff
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/config/wro/wro.properties (original)
+++ jspwiki/trunk/jspwiki-war/src/main/config/wro/wro.properties Fri Feb 14 17:24:32 2014
@@ -15,5 +15,5 @@
# specific language governing permissions and limitations
# under the License.
-preProcessors=lessCss,semicolonAppender
-postProcessors=cssMinJawr,uglifyJs
\ No newline at end of file
+preProcessors=cssImport,semicolonAppender
+postProcessors=lessCss,yuiCssMin,uglifyJs
\ No newline at end of file
Modified: jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/Release.java
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/Release.java?rev=1568367&r1=1568366&r2=1568367&view=diff
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/Release.java (original)
+++ jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/Release.java Fri Feb 14 17:24:32 2014
@@ -72,7 +72,7 @@ public final class Release {
* <p>
* If the build identifier is empty, it is not added.
*/
- public static final String BUILD = "4";
+ public static final String BUILD = "5";
/**
* This is the generic version string you should use when printing out the version. It is of
Added: jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Accordion.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Accordion.js?rev=1568367&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Accordion.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Accordion.js Fri Feb 14 17:24:32 2014
@@ -0,0 +1,137 @@
+/*
+Class: Accordion
+ Add accordion effects
+ - type=accordion : vertical collapsible panes, with toggle buttons on top of each pane
+ - type=tabs : vertical collapsible, with tab-like nav buttons on top
+ - type=pills : vertical collapsible panes, with pill-like nav buttons left or right
+ from the panes
+
+ The styling is based on the panel component of the bootstrap framework.
+
+DOM structure:
+(start code)
+ //before invocation
+ div.accordion
+ div.tab-FirstTab ..
+ div.tab-SecondTab ..
+
+ //accordion
+ div.panel-group.accordion : panel headings are toggles
+ div.panel.panel-default
+ div.panel-heading.actie
+ div => fx.accordion collapsible content
+ div.panel-body
+ div.panel.panel-default
+ div.panel-heading => toggle
+ div => fx.accordion collapsible content
+ div.panel-body
+
+ //tabbedAccordion : tab toggles, panels without border
+ ul.nav.nav-tabs
+ li
+ a
+ div.panel-group.tabbedAccordion
+ div.active => fx.accordion collapsible content
+ div.panel-body
+ div => fx.accordion collapsible content
+ div.panel-body
+
+ //leftAccordion : pill-toggles, panels with border
+ ul.nav.nav-pills.pull-left
+ li
+ a
+ div.panel-group.leftAccordion
+ div => fx.accordion collapsible content
+ div.panel.panel-default.panel-body
+ div => fx.accordion collapsible content
+ div.panel.panel-default.panel-body
+
+ //rightAccordion : pill-toggles, panels with border
+ ul.nav.nav-pills.pull-right
+ li
+ a
+ div.panel-group.leftAccordion
+ div => fx.accordion collapsible content
+ div.panel.panel-default.panel-body
+ div => fx.accordion collapsible content
+ div.panel.panel-default.panel-body
+
+(end)
+*/
+var Accordion = new Class({
+
+ Implements: Options,
+ Extends: Tab,
+
+ options: {
+ //type: 'accordion' //accordion,tabs,pills
+ //position: 'pull-left' or 'pull-right' (only relevant with 'pills')
+ },
+
+ initialize : function(container, options){
+
+ var panes = this.getPanes( container ),
+ nav, i=0, pane, name, toggle,
+ type, position,
+ active = 'active',
+ toggles = [],
+ contents = [],
+ panelCSS = 'panel'.fetchContext(container);
+
+ this.setOptions(options);
+ type = this.options.type;
+ position = this.options.position;
+ if(position) position = ".nav-stacked." + position ;
+
+ nav = (type=='tabs') ? 'ul.nav.nav-tabs' :
+ (type=='pills') ? 'ul.nav.nav-pills' + (position||'') :
+ false;
+
+ if( nav ) nav = nav.slick().inject(container,'before');
+ container.addClass('panel-group');
+
+ //modify the DOM
+ while( pane = panes[i++] ){
+
+ name = this.getName(pane);
+
+ if( nav ){ //tabs or pills style accordion
+
+ nav.grab( toggle = ['li',[ 'a', {text:name} ]].slick() );
+ if( type=='pills' ) { pane.addClass( panelCSS ); }
+
+ } else { //standard accordion
+
+ toggle = 'div.panel-heading'.slick({ text:name })
+ 'div'.slick({'class':panelCSS}).wraps( pane ).grab( toggle, 'top' );
+
+ }
+
+ toggles.push(toggle);
+ contents.push( 'div'.slick().wraps( pane.addClass('panel-body') ) );
+
+ };
+
+ //invoke the Accordion animation
+ new Fx.Accordion( toggles, contents, {
+
+ //height: true,
+ alwaysHide: !nav, //allow closing all panes
+ onComplete: function(){
+ var el = $(this.elements[this.previous]);
+ if(el.offsetHeight > 0){ el.setStyle('height', 'auto'); }
+ },
+ onActive: function(toggle,content){
+ toggle.addClass(active);
+ content.addClass(active);
+ },
+ onBackground: function(toggle,content){
+ toggle.removeClass(active);
+ content.removeClass(active);
+ }
+
+ });
+
+ }
+
+});
\ No newline at end of file
Added: jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Collapsible.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Collapsible.js?rev=1568367&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Collapsible.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Collapsible.js Fri Feb 14 17:24:32 2014
@@ -0,0 +1,335 @@
+/*
+Class: Collapsible
+
+Options:
+ options - (object, optional)
+
+ bullet - (string) css selector to create collapsible bullets, default is 'b.bullet', //'b.bullet[html=•]'
+ open - (string) css class of expanded 'bullet' and 'target' elements
+ close - (string) css class of collapsed 'bullet' and 'target' elements
+ hint - (object) hint titles for the open en closed bullet, will be localized
+
+ nested - (optional) css selector of nested container elements, example 'li',
+ target - (optional) css selector of the target element which will expand/collapse, eg 'ul,ol'
+ The target is a descendent of the main element, default target is the main element itself.
+
+ collapsed - (optional) css selector to match element which should be collapsed at initialization (eg 'ol')
+ The initial state will be overruled by the Cookie.Flags, if any.
+ cookie - (optional) Cookie.Flags instance, persistent store of the collapsible state of the targets
+
+ fx - (optional, default = 'height') Fx animation parameter - the css style to be animated
+ fxy - (optional, default = 'y') Fx animation parameter
+ fxReset - (optional, default = 'auto') Fx animation parameter - end value of Fx animated style.
+ At the end of the animation, 'fx' is reset to this 'fxReset' value. ('auto' or fixed value)
+
+Depends on:
+ String.Extend: xsubs()
+ Element.Extend: ifClass()
+
+DOM structure:
+ (start code)
+ div.collapsible
+ ul
+ li
+ b.bullet.xpand|xpand[onclick="..."]
+ Toggle-text
+ ul.xpand|xpand
+ li .. collapsible content ..
+ (end)
+
+Example:
+ (start code)
+ ...
+ (end)
+*/
+!function(){
+
+var TCollapsible = this.Collapsible = new Class({
+
+ Implements: Options,
+
+ options: {
+ bullet: 'b.bullet', //'b.bullet[html=•]' //css selector of clickable bullet
+ hint: { open:"collapse", close:"expand" },
+ open: 'xpand',
+ close: 'clpse',
+
+ //cookie: null, //Cookie.Flags - persistent store of the state of the targets
+ //target: 'ul,ol', //the element which will expand/collapse
+ //nested: 'li', //(optional) css selector of nested container elements
+ //collapsed: 'ol', //css selector to check if default state is collapsed
+
+ fx: 'height', //style attribute to animate on collapse
+ fxy: 'y', //scroll direction to animate on collapse,
+ fxReset: 'auto' //end value after animation is complete on expanded element: 'auto' or fixed width
+ },
+
+ initialize: function(element, options){
+
+ var self = this;
+
+ self.element = element = document.getElement(element);
+ //note: setOptions() makes a copy of any object, so first retrieve the cookie!
+ self.cookie = options && options.cookie;
+ options = self.setOptions(options).options;
+
+ if( options.nested ){
+
+ element.getElements( options.nested ).each( self.build, self );
+
+ } else {
+
+ self.build( element );
+
+ }
+
+ element.addEvent(
+ 'click:relay({0}.{1},{0}.{2})'.xsubs(options.bullet,options.open,options.close),
+ function(event){ event.stop(); self.toggle(this); }
+ );
+
+ },
+
+ build: function( element ){
+
+ var self = this,
+ options = self.options,
+ bullet = options.bullet,
+ target;
+
+ if( !self.skip(element) ){
+
+ bullet = element.getElement(bullet) || bullet.slick().inject(element,'top');
+ target = element.getElement(options.target);
+
+ if( target && (target.get('text').trim()!='') ){
+
+ //console.log("FX tween",bullet,target,self.initState(element,target));
+ if( options.fx ){
+ target.set('tween',{
+ property: options.fx,
+ onComplete: function(){ self.fxReset( this.element ); }
+ });
+ }
+
+ self.update(bullet, target, self.initState(element,target), true);
+ }
+ }
+ },
+
+ //dummy skip function, can be overwritten by descendent classes
+ skip: function( /*element*/ ){
+ return false;
+ },
+
+ //function initState: returns true:expanded; false:collapsed
+ //cookies always overwrite the initial state
+ initState:function( element, target ){
+
+ var cookie = this.cookie,
+ isCollapsed = this.options.collapsed;
+
+ isCollapsed = !(isCollapsed && target.match(isCollapsed) );
+
+ return cookie ? cookie.get(target, isCollapsed) : isCollapsed;
+ },
+
+ //function getState: returns true:expanded, false:collapsed
+ getState: function( target ){
+
+ return target.hasClass(this.options.open);
+
+ },
+
+ toggle: function(bullet){
+
+ var self = this,
+ cookie = self.cookie,
+ options = self.options,
+ nested = options.nested,
+ element = nested ? bullet.getParent(nested) : self.element,
+ target, state;
+
+ if( element ){
+ target = element.getElement(options.target);
+ if( target ){
+ state = !self.getState(target);
+ self.update( bullet, target, state );
+ if( cookie ){ cookie.write(target, state); }
+ }
+ }
+ },
+
+ update: function( bullet, target, expand, force ){
+
+ var options = this.options, open=options.open, close=options.close;
+
+ if( bullet ){
+
+ bullet.ifClass(expand, open, close)
+ .set( 'title', options.hint[expand ? 'open' : 'close'].localize() );
+
+ }
+ if( target ){
+
+ this.animate( target.ifClass(expand, open, close), expand, force );
+
+ }
+
+ },
+
+ animate: function( element, expand, force ){
+
+ var fx = element.get('tween'),
+ fxReset = this.options.fxReset,
+ max = (fxReset!='auto') ? fxReset : element.getScrollSize()[this.options.fxy];
+
+ if( this.options.fx ){
+
+ if( force ){
+ fx.set( expand ? fxReset : 0);
+ } else {
+ fx.start( expand ? max : [max,0] );
+ }
+
+ }
+
+ },
+
+ fxReset: function(element){
+
+ var options = this.options;
+
+ if( options.fx && this.getState(element) ){
+
+ element.setStyle(options.fx, options.fxReset);
+
+ }
+
+ }
+
+});
+
+
+/*
+Class: Collapsible.List
+ Converts ul/ol lists into collapsible trees.
+ Converts every nested ul/ol into a collasible item.
+ By default, OL elements are collapsed.
+
+DOM Structure:
+ (start code)
+ div.collapsible
+ ul
+ li
+ b.bullet.xpand|xpand[onclick="..."]
+ Toggle-text
+ ul.xpand|xpand
+ li ... collapsible content ...
+ (end)
+*/
+TCollapsible/*this.Collapsible*/.List = new Class({
+
+ Extends:TCollapsible,
+
+ initialize: function(element,options){
+
+ this.parent( element, Object.merge({
+ target: 'ul,ol',
+ nested: 'li',
+ collapsed:'ol'
+ },options));
+
+ },
+
+ // SKIP empty LI elements (so, do not insert collapse-bullets)
+ // LI element is not-empty when is has
+ // - a child-node different from ul/ol
+ // - a non-empty #text-nodes
+ // Otherwise, it is considered
+ skip: function(element){
+
+ var n = element.firstChild,isTextNode, re=/ul|ol/i;
+
+ while( n ){
+
+ isTextNode = (n.nodeType==3);
+
+ if( ( !isTextNode && ( !re.test(n.tagName) ) )
+ || ( isTextNode && ( n.nodeValue.trim()!='') ) ){
+
+ return false;
+ }
+ n=n.nextSibling;
+ }
+
+ return true; //skip this element
+
+ }
+
+});
+
+/*
+Class: Collapsible.Box
+ Makes a collapsible box.
+ - the first element becomes the visible title, which gets a bullet inserted
+ - all other child elements are wrapped into a collapsible element
+
+Options:
+
+
+DOM Structure:
+ (start code)
+ div.collapsebox.panel.panel-default
+ div.panel-heading
+ b.bullet.xpand|clpse[onclick="..."]
+ h4.panel-title title
+ div.panel-body.xpand|clpse
+ .. collapsible content ..
+ (end)
+
+*/
+TCollapsible/*this.Collapsible*/.Box = new Class({
+
+ Extends:TCollapsible,
+
+ initialize:function(element,options){
+
+ //FFS: how to protect against empty boxes..
+ //if( element.getChildren().length >= 2 ){ //we don't do empty boxes
+
+ options.collapsed = options.collapsed ? 'div':''; // T/F converted to matching css selector
+ options.target = options.target || '!^'; //or '> :last-child'
+
+ this.parent( element, options );
+ //}
+ },
+
+ build: function( element ){
+
+ var options = this.options, heading, body, next
+ panelCSS = 'panel'.fetchContext(element);
+
+ //protect against double invocations
+ if( !element.getElement( options.bullet ) ){
+
+ //build bootstrap panel layout
+ element.className += ' '+panelCSS;
+
+ heading = ['div.panel-heading',[options.bullet]].slick().wraps(
+ element.getFirst().addClass('panel-title')
+ );
+
+ body = 'div.panel-body'.slick();
+ while(next = heading.nextSibling) body.appendChild( next );
+
+ //if( body.get('text').trim()!='' ) this-is-and-empty-box !!
+
+ this.parent( element.grab( 'div'.slick().grab(body) ) );
+
+ }
+ }
+
+});
+
+}();
Added: jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Columns.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Columns.js?rev=1568367&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Columns.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Columns.js Fri Feb 14 17:24:32 2014
@@ -0,0 +1,48 @@
+/*
+Script: Columns
+ Format the page content side by side, in columns, like in a newspaper.
+ HR elements (in wiki {{----}} markup) separate the columns.
+ Column widths are equal and automatically calculated.
+ Optionally, you can specify the width in pixel(px) for the columns.
+
+ FSS: use HTML5/CSS3 columns options if available
+
+Arguments:
+ width - (optional) column width in pixel(px)
+
+Example:
+(start code)
+ %%columms-300
+ column-text1 ...
+ ----
+ column-text1 ...
+ /%
+(end)
+
+DOM Structure
+(start code)
+ div-columns
+ div.col[styles={width:xx%}]
+ div.col[styles={width:xx%}]
+(end)
+*/
+function Columns(element, options){
+
+ var args = options.prefix.sliceArgs(element),
+ columnCount = element.getElements('hr').length,
+ width;
+
+ if( columnCount /*>0*/ ){
+
+ columnCount++;
+ width = ( args[0] ) ? args[0]/columnCount+'px' : 100/columnCount+'%';
+
+ element
+ .addClass('columns')
+ .grab('hr'.slick(),'top') //add one extra group-start-element at the top
+
+ .groupChildren('hr', 'div.col', function(col){ col.setStyle('width',width); });
+
+ }
+
+}
Added: jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/CommentBox.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/CommentBox.js?rev=1568367&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/CommentBox.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/CommentBox.js Fri Feb 14 17:24:32 2014
@@ -0,0 +1,46 @@
+/*
+Dynamic style: %%commentbox
+
+Example:
+> %%commentbox ... /% : floating box to the right
+> %%commentbox-Caption .... /% : commentbox with caption
+
+DOM structure
+(start code)
+ div.commentbox
+ h2|h3|h4 title
+ ..body..
+
+ //becomes, based on BOOTSTRAP Panels
+ div.panel.panel-default
+ div.panel-header
+ div.panel-body
+(end)
+*/
+function CommentBox(element, options){
+
+ var header = element.getFirst(),
+ caption = options.prefix.sliceArgs(element)[0],
+ panelCSS = 'panel'.fetchContext(element);
+
+ element.className='panel-body'; //reset className -- ie remove commentbox-...
+ 'div.commentbox'.slick().addClass(panelCSS).wraps(element);
+
+ if( caption ){
+
+ caption = 'h4'.slick({ text:caption.deCamelize() });
+
+ } else if( header && header.match('h2,h3,h4') ) {
+
+ caption = header;
+ }
+
+ if( caption ){
+
+ 'div.panel-heading'.slick()
+ .grab(caption.addClass('panel-title'))
+ .inject(element, 'before');
+
+ }
+
+}
\ No newline at end of file
Added: jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Element.Reflect.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Element.Reflect.js?rev=1568367&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Element.Reflect.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Element.Reflect.js Fri Feb 14 17:24:32 2014
@@ -0,0 +1,85 @@
+/*
+Element: reflect
+ Extend the base Element class with a reflect and unreflect methods.
+
+Credits:
+> reflection.js for mootools v1.42
+> (c) 2006-2008 Christophe Beyls, http://www.digitalia.be
+> MIT-style license.
+*/
+Element.implement({
+
+ reflect: function(options) {
+
+ var img = this,
+ oHeight = options.height || 0.33,
+ oOpacity = options.opacity || 0.5;
+
+ if (img.match('img')){
+
+ img.unreflect();
+
+ function doReflect(){
+ var reflection, reflectionHeight = Math.floor(img.height * oHeight), wrapper, context, gradient;
+
+ if (Browser.ie) {
+ reflection = new Element("img", {src: img.src, styles: {
+ width: img.width,
+ height: img.height,
+ marginBottom: -img.height + reflectionHeight,
+ filter: "flipv progid:DXImageTransform.Microsoft.Alpha(opacity=" + (oOpacity * 100) + ",style=1,finishOpacity=0,startx=0,starty=0,finishx=0,finishy=" + (oHeight * 100) + ")"
+ }});
+ } else {
+ reflection = new Element("canvas");
+ if (!reflection.getContext) return;
+ try {
+ context = reflection.setProperties({width: img.width, height: reflectionHeight}).getContext("2d");
+ context.save();
+ context.translate(0, img.height-1);
+ context.scale(1, -1);
+ context.drawImage(img, 0, 0, img.width, img.height);
+ context.restore();
+ context.globalCompositeOperation = "destination-out";
+
+ gradient = context.createLinearGradient(0, 0, 0, reflectionHeight);
+ gradient.addColorStop(0, "rgba(255,255,255," + (1 - oOpacity) + ")");
+ gradient.addColorStop(1, "rgba(255,255,255,1.0)");
+ context.fillStyle = gradient;
+ context.rect(0, 0, img.width, reflectionHeight);
+ context.fill();
+ } catch (e) {
+ return;
+ }
+ }
+ reflection.setStyles({display: "block", border: 0});
+
+ wrapper = new Element(img.getParent().match('a') ? 'span':'div').inject(img,'after').adopt(img, reflection);
+
+ wrapper.className = img.className;
+ img.store("reflected", wrapper.style.cssText = img.style.cssText);
+ wrapper.setStyles({width: img.width, height: img.height + reflectionHeight, overflow: "hidden"});
+ img.style.cssText = "display:block;border:0";
+ img.className = "reflected";
+ }
+
+ if(img.complete){ doReflect(); } else { img.onload = doReflect; }
+ }
+
+ return img;
+ },
+
+ unreflect: function() {
+ var img = this, reflected = this.retrieve('reflected'), wrapper;
+ img.onload = function(){};
+
+ if (reflected !== null) {
+ wrapper = img.parentNode;
+ img.className = wrapper.className;
+ img.style.cssText = reflected;
+ img.eliminate('reflected');
+ wrapper.parentNode.replaceChild(img, wrapper);
+ }
+
+ return img;
+ }
+});
Added: jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/GraphBar.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/GraphBar.js?rev=1568367&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/GraphBar.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/GraphBar.js Fri Feb 14 17:24:32 2014
@@ -0,0 +1,248 @@
+ /*
+Class: GraphBar
+ Generate horizontal or vertical bars, without using images.
+ Support any color, gradient bars, progress and gauge bars.
+ The length of the bars can be based on numbers or dates.
+ Allow to specify maximum and minimum values.
+
+> %%graphBars
+> %%gbBar 25 /%
+> /%
+
+ Graphbar parameters can be passed in the js class constructor (options)
+ or as css class parameters.
+
+> %%graphBars-min50-max3000-progress-lime-0f0f0f
+> %%gbBar 25 /%
+> /%
+
+ Other examples of wiki-markup:
+> %%graphBars-e0e0e0 ... %% use color #e0e0e0, default size 120
+> %%graphBars-blue-red ... %% blend colors from blue to red
+> %%graphBars-red-40 ... %% use color red, maxsize 40 chars
+> %%graphBars-vertical ... %% vertical bars
+> %%graphBars-progress ... %% progress bars in 2 colors
+> %%graphBars-gauge ... %% gauge bars in gradient colors
+
+Options:
+ gbBar - CSS classname of the bar value elements (default = gbBar)
+ gbBarContainer - CSS classname of parent element (default = graphBars)
+ lowerbound - lowerbound of bar values (default:20px)
+ upperbound - upperbound of bar values (default:320px)
+ vwidth - vertical bar width in px(default:20px)
+ isHorizontal - horizontal or vertical bars (default:true)
+ isProgress - progress bar show 2 bars, always summing up to 100%
+ isGauge - gauge bars have colour gradient related to the size/value of the bar
+
+
+DOM-structure:
+(start code)
+ // original DOM-structure
+ div.graphBar-(options)
+ span.gbBar 100
+
+ //becomes, based on BOOTSTRAP
+ //horizontal bar
+ span.gb-group(.striped.active)[width:125px]
+ span.gb-bar[style="background:blue;width:40%"]
+ span.gBar 100
+
+ //vertical bar
+ span.gb-group(.striped.active)(.vertical)[heigh:125px]
+ span.gb-bar[style="background:blue;height:100%;width:100%"]
+ span.gBar 100
+
+ //progress bar
+ span.gb-group[width:125px]
+ span.gb-bar[style="background:blue;width:40%"]
+ span.gb-bar[style="background:red;width:60%"]
+ span.gbBar 100
+(end)
+
+Examples:
+> new GraphBar( dom-element, { options });
+
+*/
+
+var GraphBar = new Class({
+
+ Implements: Options,
+
+ options: {
+ container: "graphBars", //classname of container
+ gBar: "gBar", //classname of value tags
+
+ gbGroup: "span.gb-group",
+ gbBar: "span.gb-bar",
+
+ offset:20, //(px) smallest bar = offset
+ size:300, //(px) tallest bar = offset+size
+
+ isHorizontal:true,
+ isProgress:false,
+ isGauge:false
+ },
+
+ initialize: function(el, options){
+
+
+ var self = this,
+ args = el.className,
+ bars, data, i, len, table, clazz;
+
+ self.setOptions(options);
+
+ clazz = this.options.container;
+
+ if( args.indexOf( clazz )==0 ){
+
+ options = self.getArguments( args.slice(clazz.length) );
+
+ bars = el.getElements('.'+ options.gBar + options.barName);
+
+ if( !bars[0] && ( table = el.getElement('table') )){
+
+ bars = new TableX( table ).filter(options.barName);
+
+ }
+
+ if( bars && bars[0] && (data = self.toNumbers(bars)) ){
+
+ data = data.scale();
+ for( i=0, len=bars.length; i<len; i++) self.render( bars[i], data[i], (i+1)/len );
+
+ }
+ }
+ },
+
+ getArguments: function( args ){
+
+ var options = this.options,
+ p,min,max,size;
+
+ args = args.split('-');
+ options.barName = args.shift(); //first param is optional barName
+ min = options.offset;
+ max = min + options.size;
+
+ while( args.length ){
+
+ p = args.shift().toLowerCase();
+
+ if( p == "vertical" ){ options.isHorizontal = false; }
+ else if( p == "gauge" ){ options.isGauge = true; }
+ else if( p == "progress" ){ options.isProgress = true; }
+
+ else if( p == "striped" ){ options.gbGroup += "." + p; }
+ else if( p == "active" ){ options.gbGroup += ".striped." + p; }
+ else if( p.test(/success|info|warning|danger/ )){ options.gbBar += ".progress-bar-"+p; }
+
+ else if( !p.indexOf("min") /*index==0*/){ min = p.slice(3).toInt(); }
+ else if( !p.indexOf("max") /*index==0*/){ max = p.slice(3).toInt(); }
+ else if( p != "" ){
+
+ p = new Color(p);
+ if( p.hex ){
+ if( !options.color1 ){ options.color1 = p; }
+ else if( !options.color2 ){ options.color2 = p; }
+ }
+
+ }
+ }
+
+ size = max-min;
+ options.offset = (size > 0) ? min : max;
+ options.size = size.abs();
+
+ return options;
+ },
+
+
+ /*
+ Function: render
+ Render a graphBar and add it before or inside the element.
+
+ Arguments:
+ el - element
+ val - converted value in range 0-100,
+ percent - position of the graphBar in the group, converted to a %
+
+ DOM Structure of a graphbar
+ (start code)
+ span.graphBar-Group[stle='width=..px']
+ span.graphBar[style='width=..%,background-color=..']
+ span.graphBar[style='width=..%,background-color=..'] //only for progress bars
+ (end)
+ */
+ render: function(el, val, percent){
+
+ var options = this.options,
+ size = options.size,
+ offset = options.offset,
+ color1 = options.color1,
+ color2 = options.color2,
+ isGauge = options.isGauge,
+ isProgress = options.isProgress,
+ //isHorizontal = options.isHorizontal,
+ dom, css;
+
+
+ //color invertor
+ if( !color2 && color1 && (isGauge||isProgress)) color2 = color1.invert();
+
+ //color mixer
+ if( !isProgress && color2 ) color1 = color1.mix(color2, 100*(isGauge ? val : percent));
+
+ val = val*100;
+
+ //first calculate bar sizes: group-bar, bar1, (optional) bar2
+ css = isProgress ?
+ [offset+size, val+"%", (100-val)+"%"] :
+ [offset+val/100*(offset+size), "100%" ];
+
+ //then convert sizes to bar css styles
+ css = css.map( function(size){
+ return options.isHorizontal ? {width:size} : {height:size, width:20};
+ });
+
+ //finally, add colors to the bar1 and bar2 css styles
+ if( color1 ) css[1].backgroundColor = color1.hex;
+ if( isProgress && color2 ) css[2].backgroundColor = color2.hex
+
+ //build slick template
+ dom = [options.gbGroup, { styles:css[0] }, [ options.gbBar, {styles:css[1]} ] ];
+ if( isProgress && color1) dom[2].push( options.gbBar, {styles:css[2]} );
+
+ dom.slick().inject(el, el.match('td') ? 'top' : 'before');
+
+ },
+
+ /*
+ Function: parseBarData
+ Parse bar data types and scale according to lbound and size
+
+ Convert values to %, min=0% and max=100%
+
+ */
+ toNumbers: function(nodes){
+
+ var num=[], dmy=[], val,
+ len=nodes.length, i,
+ min, scale;
+
+ //check -- reuse Array.makeSortable(some-array)...
+ for( i=0; i<len; i++) {
+ val = nodes[i].get('text').trim();
+
+ if( num && isNaN( num[i] = +val ) ) num=0;
+
+ //Only strings with non-numeric values
+ if( dmy && ( num || isNaN( dmy[i] = Date.parse(val) ) ) ) dmy=0;
+
+ };
+
+ return dmy || num || false;
+
+ }
+
+});
Added: jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/TableX.Filter.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/TableX.Filter.js?rev=1568367&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/TableX.Filter.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/TableX.Filter.js Fri Feb 14 17:24:32 2014
@@ -0,0 +1,96 @@
+/*
+Class: TableX.Filter
+ Allows to filter html tables based on regexp enabled filter search box.
+ Filtering happens both on column and row basis.
+
+Credits:
+ Filters inspired by http://www.codeproject.com/jscript/filter.asp and
+ jquery.filterTable by Sunny Walker http://sunnywalker.github.io/jQuery.FilterTable/
+
+*/
+TableX.Filter = new Class({
+
+ Implements: Options,
+
+ options :{
+ minSize: 5, //don't show the filter on tables with less than this number of rows
+ shortcut: 'a.btn.btn-link[text="{0}"]', //template for shortcut filter-strings
+ list: [], //['99','test'], //TODO list of shortcuts to quickly filter the table
+ hint: 'filter this table', //HTML5 placeholder text for the filter field
+ highlight: 'highlight' //class applied to cells containing the filter term
+ },
+
+ initialize: function(table, options){
+
+ options = this.setOptions(options).options;
+
+ var self = this,
+ items = [],
+ minRows = options.minRows,
+ filter = self.filter.bind(self);
+
+
+ self.table = table = new TableX(table, {minSize:options.minSize});
+
+ if( table && table.table){
+
+ options.list.each(function(item){
+ items.push( options.shortcut.xsubs(item),{
+ events:{click : self.shortcut.pass(item,self) }
+ });
+ });
+
+ ['div.form-group.filter-input',[
+ 'input.form-control[type=search][placeholder="'+options.hint+'"]',{
+ attach: [ self, 'input' ],
+ events: {
+ keyup: filter, //'keyup:throttle': filter,
+ click: filter
+ }
+ }],
+ items
+ ].slick().inject(table.table,'before');
+
+ }
+ },
+
+ shortcut: function(value){
+ this.input.set('value', value).fireEvent('click').focus();
+ return false;
+ },
+
+ filter: function(){
+
+ var self = this,
+ visible = 'visible',
+ highlight = self.options.highlight,
+
+ rows = self.table.rows,
+ cells = self.table.cells.removeClass(highlight),
+
+ query = self.input.value,
+ queryRE;
+
+
+ try { queryRE = RegExp( query/*.escapeRegExp()*/, 'i'); } catch(e){}
+
+ if( query == '' || !queryRE ){
+
+ rows.show().addClass(visible);
+
+ } else {
+
+ rows.hide().removeClass(visible); //hide all
+
+ cells.filter( function(el){
+
+ return queryRE.test( $(el).get('text') );
+
+ }).addClass(highlight).getParent(/*tr*/).show().addClass(visible);
+
+ }
+
+ self.table.refresh();
+ }
+
+});
Added: jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/TableX.Sort.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/TableX.Sort.js?rev=1568367&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/TableX.Sort.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/TableX.Sort.js Fri Feb 14 17:24:32 2014
@@ -0,0 +1,74 @@
+/*
+Class: TableX.Sort
+ Adds ''click'' handlers to sort table columns.
+ CSS classes are added to the header depending on the sort order.
+ The data-type of each column is auto-recognized.
+
+ Todo: add progress animation while sorting
+
+Depends:
+ Array.naturalSort
+
+Credits:
+ The originial implementation was inspired by the excellent javascript created by
+ Erik Arvidsson. See http://webfx.eae.net/dhtml/sortabletable/sortabletable.html.
+ The natural-Sort was inspired by an implement of Jim Palmer e.a.
+
+*/
+TableX.Sort = new Class({
+
+ Implements: Options,
+
+ options: {
+ css: {
+ sort: 'sort',
+ atoz: 'up',
+ ztoa: 'down'
+ },
+ hints: {
+ sort: "Click to sort",
+ atoz: "Ascending. Click to reverse",
+ ztoa: "Descending. Click to reverse"
+ }
+ },
+
+ initialize: function(table, options){
+
+ this.setOptions(options);
+
+ this.table = table = new TableX(table,{ minSize: 3 });
+
+ if( table && table.thead ){
+ //table.table.rows[0].addEvent( 'click:relay(th)', this.sort.bind(this) );
+ table.thead.addEvent( 'click', this.sort.bind(this) );
+ this.style( table.thead, this.options.css.sort );
+ }
+
+ },
+
+ style: function(element, newStyle){
+ var options = this.options;
+ element.set({'class': options.css[newStyle], title: options.hints[newStyle] });
+ },
+
+ sort: function( event ){
+
+ var table = this.table,
+ thead = table.thead,
+ rows = table.rows,
+ css = this.options.css,
+ th = event.target,
+ sortAtoZ = th.hasClass(css.atoz) ? 'ztoa':'atoz';
+
+ //this.style(th, "processing");
+ table.refresh(
+ th.hasClass( css.sort ) ?
+ rows.naturalSort( thead.indexOf(th) ) :
+ rows.reverse()
+ );
+ this.style( thead, 'sort');
+ this.style( th, sortAtoZ );
+
+ }
+
+});
\ No newline at end of file
Added: jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/TableX.Zebra.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/TableX.Zebra.js?rev=1568367&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/TableX.Zebra.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/TableX.Zebra.js Fri Feb 14 17:24:32 2014
@@ -0,0 +1,36 @@
+/*
+Class: TableX.Zebra
+ Simple class to add odd/even coloring to tables.
+
+ When the first color == 'table' or '' the predefined css class ''.odd''
+ is used to color the alternative rows.
+
+Usage:
+ > new TableX.Zebra( table-element, {colors:['eee','fff']});
+ > new TableX.Zebra( table-element, {colors:['red']});
+
+*/
+TableX.Zebra = function(table, options){
+
+ function stripe(){
+
+ this.rows.filter( Element.isVisible ).each( function(row,j){
+
+ j &= 1; //0,1,0,1...
+ if( isArr ){
+ row.setStyle('background-color', colors[j]||'');
+ } else {
+ row.ifClass(j, 'odd', '');
+ }
+ });
+ };
+
+ var colors = options.colors,
+ isArr = colors[0];
+
+ if ( isArr ){ colors = colors.map( function(c){ return new Color(c); }); }
+
+ //console.log("ZEBRA ",options.colors, colors[0],colors[1]);
+ stripe.call( new TableX(table, { onRefresh:stripe }) );
+
+}
Added: jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/TableX.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/TableX.js?rev=1568367&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/TableX.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/TableX.js Fri Feb 14 17:24:32 2014
@@ -0,0 +1,103 @@
+/*
+Class: TableX
+ Base class, with reusable table support functions.
+ Used by TableX.Sort, TableX.Zebra, ...
+
+
+Usage:
+ > var t = new TableX(table-element);
+ Creates maximum one TableX instance per table DOM element.
+
+ > t.addEvent('onRefresh', console.log('table got refreshed.'));
+ > t.refresh(new-rows-array);
+
+*/
+var TableX = new Class({
+
+ Implements: [Options,Events],
+
+ initialize: function(table, options){
+
+ var self = table.TableX, //max one TableXtend instance per table DOM element
+ minSize = ( options||{} ).minSize||0;
+
+ if( !self ){
+
+ if( !table.match('table') ||
+ ( ( minSize>0 )&&( table.rows.length < minSize ) ) ){
+ console.log("Error TableX size: ",table," minSize:",minSize);
+ return false;
+ }
+
+ table.TableX = self = this;
+ self.table = table;
+ self.thead = $(table.rows[0]).getChildren('th');
+ self.rows = $$(Array.slice(table.rows, self.thead.length>0 ? 1 : 0));
+ self.cells = table.getElements('td'); //fixme: check for nested tables
+
+ }
+ return self && self.setOptions(options); //set additional options
+ },
+
+ /*
+ Function:refresh
+ Put array of table rows back into the table
+ */
+ refresh: function( rows ){
+
+ //console.log(rows);
+
+ if( rows ){
+
+ var frag = document.createDocumentFragment();
+ rows.each( function(r){ frag.appendChild(r); });
+ this.table.tBodies[0].appendChild(frag);
+
+ }
+
+ this.fireEvent('refresh');
+
+ },
+
+ /*
+ Function: filter
+ Fetch a row or column from a table, based on a field-name
+ * check first-row to match field-name: return array with col values
+ * check first-column to match field-name: return array with row values
+ * ?? insert SPANs as place-holder of the missing gBars
+
+ */
+ filter: function(fieldName){
+
+ var rows = this.table.rows,
+ tlen = rows.length, col, l, r, i,
+ result=[];
+
+ if( tlen > 1 ){ /* check for COLUMN based table */
+ r = rows[0]; //header row
+
+ for( col=0, l=r.cells.length; col<l; col++ ){
+
+ if( $(r.cells[col]).get('text').trim() == fieldName ){
+
+ //take this COLUMN
+ for( i=1; i < tlen; i++)
+ //result.push( new Element('span').wraps(table.rows[i].cells[col]) );
+ result.push( rows[i].cells[col] );
+ return result;
+ }
+ }
+ }
+
+ for( i=0; i < tlen; i++ ){ // check for ROW based table
+ r = rows[i];
+ if( $(r.cells[0]).get('text').trim() == fieldName ){
+ //take this ROW
+ return Array.slice(r.cells,1);
+ }
+ }
+
+ return false;
+ }
+
+});
Added: jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Tabs.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Tabs.js?rev=1568367&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Tabs.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Tabs.js Fri Feb 14 17:24:32 2014
@@ -0,0 +1,155 @@
+/*
+Class: TabbedSection
+ Creates tabs, based on some css-class information
+
+Wiki Markup:
+(start code)
+ //Original markup
+ %%tabbedSection
+ %%tab-FirstTab
+ ...
+ /%
+ %%tab-FirstTab
+ ...
+ /%
+ /%
+
+ //Simplified markup
+ //Every tab is defined by headers tag. (!, !!, !!!)
+ //The level of the first header element determines the header-level of all tabs.
+ %%tabs
+ !First tab title
+ ...
+ !Second tab title
+ ...
+ /%
+(end)
+
+DOM structure before:
+ (start code)
+ //original syntax
+ div.tabbedSection
+ div.tab-FirstTab
+ div.tab-SecondTab
+
+ //simplified syntax
+ div.tabs (or div.pills)
+ h1 FirstTab
+ h1 SecondTab
+ h1 ThirdTab
+ (end)
+
+DOM structure after: (based on Bootstrap conventions)
+(start code)
+ ul.nav.nav-tabs(.nav-pills)
+ li
+ a[href="#home"] FirstTab
+ li
+ a[href="#profile"] SecondTab
+ li
+ a[href="#messages"] ThirdTab
+
+ div.tab-content
+ div.tab-pane.active[id="FirstTab"] ...
+ div.tab-pane[id="SecondTab"] ...
+ div.tab-pane[id="ThirdTab"] ...
+(end)
+*/
+var Tab = new Class({
+
+ Implements: Options,
+
+ options:{
+ nav: 'ul.nav.nav-tabs' //navigation section with all tab labels
+ },
+
+ initialize:function(container,options){
+
+ this.setOptions( options );
+
+ var panes = this.getPanes( container ),
+ pane, id, i=0,
+ items=[]; //collection of li for the tab navigation section
+
+ while( pane = panes[i++] ){
+
+ items.push('li',[ 'a', {text:this.getName(pane)} ]);
+
+ };
+
+ if( items[0] ){
+
+ items[0] +='.active';
+
+ [this.options.nav, {events:{'click:relay(a)':this.show}}, items]
+ .slick()
+ .inject(container,'before');
+
+ panes.addClass('tab-pane')[0].addClass('active');
+ container.addClass('tab-content');
+
+ }
+
+ },
+
+ getName:function(pane){
+
+ var name = pane.className.slice(4).deCamelize();
+ if( !pane.id ) pane.id = name; //CHECKME : support #<tab-name> urls ; eg h1 id="section-Tabbed+Section-Usage"
+ return name;
+
+ },
+
+ /*
+ Function: getPanes
+ Generic function to collect the tab panes. Reused by accordions, etc.
+ 1) panes = sections enclosed by tab-container elements, the tab caption is derived from the classname
+ 2) panes = sections divided by h<n> elements;
+
+ Arguments:
+ container - container DOM element
+ isPane - (string) selector to match predefined tab container
+ */
+ getPanes:function( container ){
+
+ var isPane = '[class^=tab-]',
+ first = container.getFirst(),
+ header = first.get('tag'),
+ hasPane = first && first.match(isPane); //predefined tab-panel containers
+
+ //avoid double runs -- obsolete, covered by behavior
+ //if( first.match('> .nav.nav-tabs') ) return null;
+
+ if( (!hasPane) && ( header.test(/h1|h2|h3|h4/) ) ){ //replace header by tab-panel containers
+
+ //first remove unwanted elements from the header
+ container.getChildren(header).getElements('.hashlink,.edit-section,.labels')
+ .each(function( el ){ el.destroy(); });
+
+ //then create div.tab-<pane-title> groups
+ container.groupChildren(header, 'div', function(pane,header){
+ pane.addClass( "tab-" + header.get('text').trim().replace(/\s+/g,'-').camelCase() );
+ pane.id = header.id;
+ });
+
+ }
+ return container.getChildren(isPane);
+
+ },
+
+ /*
+ Click-handler to toggle the visibilities of the tab panes.
+ */
+ show:function(event){
+
+ var active = 'active',
+ nav = this.getParent('ul'),
+ index = nav.getElements('a').indexOf(this);
+
+ event.stop();
+ nav.getChildren().removeClass(active)[index].addClass(active);
+ nav.getNext().getChildren().removeClass(active)[index].addClass(active);
+
+ }
+
+});
\ No newline at end of file
Added: jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Viewer.Carousel.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Viewer.Carousel.js?rev=1568367&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Viewer.Carousel.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/Viewer.Carousel.js Fri Feb 14 17:24:32 2014
@@ -0,0 +1,325 @@
+/*
+Plugin: Viewer.Carousel
+ Viewer plugin for automatic cycling through elements.
+ Inspired on bootstrap's implementation, relying on css3 transitions;
+ rewritten for mootools.
+
+Credit:
+ bootstrap-carousel.js v2.2.2 http://twitter.github.com/bootstrap/javascript.html#carousel
+
+Depends on:
+ Viewer
+
+DOM structure:
+
+ (start code)
+ div.carousel
+ a.xxx
+ a.xxx
+ (end)
+
+ becomes
+ (start code)
+ div.carousel[.slide]
+
+ ol.carousel-indicators
+ li.active[data-target="#myCarousel"][data-slide-to="0"]
+ li[data-target="#myCarousel"][data-slide-to="1"]
+ li[data-target="#myCarousel"][data-slide-to="2"]
+
+ <!-- Carousel items -->
+ div.carousel-inner
+ div.item.active
+ img | object | iframe
+ div.item
+ img | object | iframe
+ ...
+
+ <!-- Carousel nav -->
+ a.controls.prev[href="#myCarousel"][data-slide="prev"] <
+ a.controls.next[href="#myCarousel"][data-slide="next"] >
+ (end)
+
+Example:
+> new Carousel(container, [el1, el2], {container:..., ...} );
+
+*/
+Viewer.Carousel = new Class({
+
+ Binds: ['build', 'cycle','stop','next','prev','slid'],
+ Implements: [Events, Options],
+
+ options: {
+ cycle: 1e4, //=> when set, the carousel automatically cycles through all items
+ width: 400, // Default width of the carousel (in pixels)
+ height: 300 // Default height of the carousel (in pixels)
+ },
+
+ initialize : function(elements, options){
+
+ var self = this,
+ t = 'transitionend';
+
+ options = self.setOptions(options).options;
+ console.log('CAROUSEL Options: ',options);
+
+ self.css3 = Element.Events[t] ? t : null;
+ self.element = options.container;
+
+ Viewer.preloads( $$(elements), options, self.build );
+
+ },
+
+ build: function(elements, width, height){
+
+ console.log("CAROUSEL BUILD: ",elements.length,width,height);
+
+ var self = this,
+ items = [], indicators = [],
+ cycle = self.options.cycle,
+ NOP = function(){};
+
+
+
+ $$(elements).each( function(el,idx){
+
+ console.log(height,el.height, width, el.width);
+ items.push('div.item',[
+ el, { styles: {
+ //add padding to center the item inside its container, but still fill 100% of the available space
+ padding: Number(height - el.height).limit(0,height)/2 +"px "+
+ Number(width - el.width).limit(0, width)/2 +"px"
+ }},
+ 'div.carousel-caption', {
+ html: (el.title || el.alt || el.get('text'))
+ }
+ ]);
+ indicators.push('li');
+ });
+ items[0] += '.active';
+ indicators[0] +='.active';
+
+ self.element.empty()
+ .set({
+ 'class':'carousel',
+ //maxHeight,maxHeight will auto-scale the images if they are too big to fit
+ styles:{ maxWidth: width, maxHeight: height },
+ events:{
+ 'click:relay(li)':function(ev){ self.to(this.getAllPrevious().length); },
+ mouseenter: cycle ? self.stop : NOP,
+ mouseleave: cycle ? self.cycle : NOP
+ }
+ })
+ .adopt([
+ 'div.carousel-progress', /*ffs {'transitionDuration':self.cycle/1e3+'s'},*/
+ 'ol.carousel-indicators',
+ indicators,
+ 'div.carousel-inner',
+ items,
+ 'a.controls.prev[html=<]', {events:{ click: self.prev }},
+ 'a.controls.next[html=>]', {events:{ click: self.next }}
+ ].slick()
+ );
+
+ //self.cycle(); only start cycling after a first mouseenter , next()
+
+
+ },
+
+ get: function( selector ){
+ return this.element.getElements(selector);
+ },
+
+ /*
+ Function: cycle
+ Cycle through the carousel items.
+ - invoked on initialization
+ - invoked on mouseleave
+ - invokde at end of the sliding operations
+ */
+ cycle: function(/*event*/){
+
+ var self = this,
+ cycle = self.options.cycle;
+
+ if( cycle && !self.sliding ){
+ self.stop(); // make sure to first clear the tid
+ self.tid = self.next.delay( cycle );
+ self.element.addClass('sliding');
+ }
+
+ },
+
+ /*
+ Function: stop
+ Stop the autocycle mechanism.
+ - invoked on mouseenter
+ - invoked at start of the sliding operation
+ */
+ stop: function( /*event*/ ){
+
+ //console.log("stop ", this.tid, this.sliding, arguments);
+ clearTimeout( this.tid );
+ this.tid = null;
+ this.element.removeClass('sliding');
+
+ },
+
+ /*
+ Function: to
+ Slide directly to a specific carousel item.
+ Not yet used.
+ */
+ to: function( pos ){
+
+ var self = this,
+ items = self.get('.item'),
+ item = items[pos],
+ active = items.indexOf( items.filter('.active')[0] );
+
+ if ( !item ) return;
+
+ if( self.sliding ){
+
+ //console.log('concurrency betweeen slide() and pos() - wf "slid" event to occur');
+ self.element.addEvent('slid', self.to.pass(pos) );
+
+ } else if ( !item.match('.active') ){
+
+ self.slide( pos > active ? 'next' : 'prev', item );
+
+ }
+
+ },
+
+ next: function(){
+ if( !this.sliding ) this.slide('next');
+ },
+
+ prev: function () {
+ if( !this.sliding ) this.slide('prev');
+ },
+
+
+ /*
+ Function:slide
+ Move the carousel to the next item.
+ It fully relies on css3 transition.
+ If not supported, no animation-effects are applied (lazy me)
+
+ stable =>
+ > .active => left:0;
+ > .next => left:100%;
+ > .prev => left:-100%;
+
+ slide-type = next => Slide to left:
+ > item.active.left => left:-100%;
+ > item.next.left => left:0;
+
+ slide-type = prev => Slide to right:
+ > item.active.right => left:100%;
+ > item.prev.right => left:0;
+
+ Arguments
+ - type : 'next','prev'
+ - next : element to be shown at end of the "slide" ( array )
+
+ */
+ slide: function(type, next){
+
+ var self = this,
+ active = self.get('.item.active')[0],
+ gonext = (type == 'next')
+ css3 = self.css3,
+ slid = self.slid;
+
+ self.sliding = true;
+ self.stop();
+
+ next = next ||
+ active[ gonext ? 'getNext':'getPrevious' ]() ||
+ active.getParent()[ gonext ? 'getFirst':'getLast' ]();
+
+ if( next.match('.active') ) return;
+
+ next.addClass( type ); //.next or .prev
+
+ self.fireEvent('slide');
+
+ if( css3 ){
+
+ //console.log('transition: '+css3)
+ next.offsetWidth; // force reflow -- is this really needed ?
+ $$(active, next).addClass( gonext ? 'left' : 'right' );
+ self.element.addEvent( css3, slid );
+
+ } else {
+
+ slid();
+
+ }
+
+ },
+
+ slid:function(){
+
+ var self = this,
+ items = self.get('.item'),
+ newActive = self.get('.item.next,.item.prev')[0];
+
+ if( newActive ){
+
+ items.set('class','item'); //wipe out .active, .next, .prev, .left, .right
+ newActive.addClass('active');
+
+ self.get('li').set('class','')[items.indexOf(newActive)].addClass('active');
+
+ self.sliding = false;
+ self.cycle();
+ self.fireEvent('slid', 0 /*dummy*/, 1 /*delay 1ms*/);
+
+ }
+
+ }
+
+});
+
+
+/*
+Extension : css3 native events
+ Extend mootools to support css3 native events
+ (needed by Viewer.Carousel)
+
+Credits:
+ Inspired by https://github.com/amadeus/CSSEvents/
+
+Example:
+> $(element).addEvent('transitionend',function(event){ ...})
+
+*/
+!function(css3){
+
+var B = Browser,
+ NativeEvents = Element.NativeEvents,
+ pfx = B.cssprefix = (B.safari || B.chrome || B.Platform.ios) ? 'webkit' : (B.opera) ? 'o' : (B.ie) ? 'ms' : '';
+
+ for ( style in css3 ){
+
+ var eventType = css3[style],
+ type = eventType.toLowerCase(),
+ aType = pfx ? pfx + eventType : type,
+ aTest = pfx ? pfx + style.capitalize() : style;
+
+ if( document.createElement('div').style[ aTest ] != null ){
+
+ NativeEvents[type] = NativeEvents[aType] = 2;
+ Element.Events[type] = { base: aType };
+
+ }
+
+ //console.log(Element.NativeEvents, Element.Events);
+
+ }
+
+}({transition:'TransitionEnd'});
+//})({transition:'TransitionStart',transition:'TransitionEnd',animation:'AnimationStart',animation:'AnimationIteration',animation:'AnimationEnd');