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=&bull;]'
+    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=&bull;]' //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"] &lt;
+      a.controls.next[href="#myCarousel"][data-slide="next"] &gt;
+    (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=&lt;]', {events:{ click: self.prev }},
+                'a.controls.next[html=&gt;]', {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');