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 2015/06/22 22:11:44 UTC

svn commit: r1686927 [1/11] - in /jspwiki/trunk: ./ jspwiki-war/src/main/config/wro/ jspwiki-war/src/main/java/org/apache/wiki/ jspwiki-war/src/main/resources/templates/ jspwiki-war/src/main/scripts/behaviors/ jspwiki-war/src/main/scripts/dialog/ jspwi...

Author: brushed
Date: Mon Jun 22 20:11:42 2015
New Revision: 1686927

URL: http://svn.apache.org/r1686927
Log:
2.10.2-svn-17 : third major HADDOCK commit, mainly stabilization fixes related for the plain editor
       * [JSPWIKI-482] Wrong insert from the suggestion box 
       * [JSPWIKI-788] Support multiple tabbedSections in single document

Added:
    jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/
    jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Accordion.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/AddCSS.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Collapsible.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Columns.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/CommentBox.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Element.Reflect.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Flip.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/GraphBar.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/TableX.Filter.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/TableX.Sort.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/TableX.Zebra.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/TableX.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Tabs.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Viewer.Carousel.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Viewer.Slimbox.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Viewer.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/lib/mootools-core-1.5.1.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/lib/mootools-more-1.5.1.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/Array.Extend.HSV.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/Function.Extend.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/wiki-edit/Snipe.Snips.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/wiki-edit/Undoable.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/wiki/Wiki.Behaviors.js
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Accordion.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Calendar.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Category.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Collapsible.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Columns.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/CommentBox.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Dialog.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Flip.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/GraphBar.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/ImagePlugin.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/IndexPlugin.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/RecentChangesPlugin.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/TOCPlugin.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/TableX.Filter.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/TableX.Sort.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Tabs.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Template.Attach.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Template.Content.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Template.Diff.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Template.Edit.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Template.Nav.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Template.Preview.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Template.Search.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Template.SearchBox.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Template.Sidebar.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Template.UserBox.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Template.View.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Tips.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Viewer.Carousel.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Viewer.Slimbox.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/Viewer.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/WeblogPlugin.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/build.less   (with props)
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/forms.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/grid.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/pagination.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/prettify.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/print.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/tables.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/type.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/default/variables.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/fontjspwiki/fonts/
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/fontjspwiki/fonts/FontJspwiki.eot   (with props)
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/fontjspwiki/fonts/FontJspwiki.svg   (with props)
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/fontjspwiki/fonts/FontJspwiki.ttf   (with props)
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/fontjspwiki/fonts/FontJspwiki.woff   (with props)
    jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/images/hue-wheel.png   (with props)
Removed:
    jspwiki/trunk/jspwiki-war/src/main/scripts/dynamic-styles/
    jspwiki/trunk/jspwiki-war/src/main/scripts/wiki-edit/Snipe.Sections.old.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/wiki-edit/UndoRedo.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/wiki/Dynamic-styles.js
    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/Dialog.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/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/images/circle-256.png
    jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/images/icon-filter.gif
    jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/images/icon-search.png
    jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/images/jspwiki-strip.gif
Modified:
    jspwiki/trunk/ChangeLog
    jspwiki/trunk/jspwiki-war/src/main/config/wro/wro-haddock.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/resources/templates/default.properties
    jspwiki/trunk/jspwiki-war/src/main/scripts/dialog/Dialog.Buttons.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/dialog/Dialog.Chars.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/dialog/Dialog.Color.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/dialog/Dialog.Find.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/dialog/Dialog.Font.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/dialog/Dialog.Selection.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/dialog/Dialog.js
    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/Date.Extend.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/Element.Extend.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/Form.File.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/Form.MultipleFile.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/HighlightQuery.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/moo-extend/Request.File.js
    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-edit/Snipe.Commands.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/wiki-edit/Snipe.Sections.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/wiki-edit/Snipe.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/wiki-edit/Wiki.Edit.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/wiki-edit/Wiki.Snips.js
    jspwiki/trunk/jspwiki-war/src/main/scripts/wiki/Category.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/fontjspwiki/core.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/fontjspwiki/font-jspwiki.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/fontjspwiki/icons.less
    jspwiki/trunk/jspwiki-war/src/main/styles/haddock/fontjspwiki/path.less
    jspwiki/trunk/jspwiki-war/src/main/webapp/Install.jsp
    jspwiki/trunk/jspwiki-war/src/main/webapp/Search.jsp
    jspwiki/trunk/jspwiki-war/src/main/webapp/WEB-INF/web.xml
    jspwiki/trunk/jspwiki-war/src/main/webapp/error/Forbidden.html
    jspwiki/trunk/jspwiki-war/src/main/webapp/templates/default/AJAXSearch.jsp
    jspwiki/trunk/jspwiki-war/src/main/webapp/templates/default/FindContent.jsp
    jspwiki/trunk/jspwiki-war/src/main/webapp/templates/default/admin/UserManagement.jsp
    jspwiki/trunk/jspwiki-war/src/main/webapp/templates/default/skins/CleanBlue/skin.js
    jspwiki/trunk/jspwiki-war/src/main/webapp/templates/default/skins/Smart/skin.css
    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/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/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/PreferencesTab.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/admin/UserManagement.jsp
    jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/commonheader.jsp
    jspwiki/trunk/jspwiki-war/src/main/webapp/templates/haddock/editors/plain.jsp
    jspwiki/trunk/jspwiki-war/src/main/webapp/templates/reader/ViewTemplate.jsp
    jspwiki/trunk/pom.xml

Modified: jspwiki/trunk/ChangeLog
URL: http://svn.apache.org/viewvc/jspwiki/trunk/ChangeLog?rev=1686927&r1=1686926&r2=1686927&view=diff
==============================================================================
--- jspwiki/trunk/ChangeLog (original)
+++ jspwiki/trunk/ChangeLog Mon Jun 22 20:11:42 2015
@@ -1,3 +1,43 @@
+2015-06-22  Dirk Frederickx (brushed AT apache DOT org)
+
+       * 2.10.2-svn-17
+         
+       This is the third major check-in of the HADDOCK template, with mainly
+       stabilization fixes related for the plain editor, and many UI improvements.
+       The HADDOCK template is close to completion - go ahead and play with it. 
+       (group related JSPs still to be done) 
+
+       Summary of main changes:
+
+       * Many Suggestion dialogs are added to the plain editor:
+         links, link-options, images, acls, plugins, variables, %%styles, 
+         hexadecimal colors, fonts, symbols, %%icons, ...
+         You can create new suggestion dialogs via json snippets in Wiki.Snips.js
+
+       * Fixed [JSPWIKI-482] Wrong insert from the suggestion box 
+       
+       * The editor toolbar is simplified, as most functions are reachable via the
+         suggestion dialogs. The find & replace UI can be repositioned on the screen.
+       
+       * Sticky menu bar, which stays on top of the screen when scrolling down.
+       
+       * The Quick Navigation menu is redesigned to improve usability for creating
+         and cloning new pages.
+         [JSPWIKI-531] usability: hints on or mechanism for creating a page
+       
+       * New %%styles added:  %%dropcaps, %%flip, %%flop, %%addcss, %%progress,
+         %%scrollable-250 (limit the height of a code-block, so it becomes scrollable )
+
+       * Show READER view (also great for printing) has been added to the More menu.
+       
+       * [JSPWIKI-788] TabbedSection - support multiple tabbedSections in single 
+         document with same tab-identifiers
+
+       * Updated to the latest mootools v1.5.1
+       * Updated to wro4j 1.7.8
+
+       * Some additional i18n properties added -- but translation still to be done.
+
 2015-05-31  Harry Metske (metskem@apache.org)
 
        * 2.10.2-svn-16

Modified: 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=1686927&r1=1686926&r2=1686927&view=diff
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/config/wro/wro-haddock.xml (original)
+++ jspwiki/trunk/jspwiki-war/src/main/config/wro/wro-haddock.xml Mon Jun 22 20:11:42 2015
@@ -23,8 +23,8 @@
 
   <!-- 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/mootools-core-1.5.1.js</js>
+    <js>/scripts/lib/mootools-more-1.5.1.js</js>
     <js>/scripts/lib/prettify4mar13.js</js>
   </group>
 
@@ -45,43 +45,47 @@
     <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 name="behaviors" abstract="true">
+    <js>/scripts/behaviors/AddCSS.js</js>
+    <js>/scripts/behaviors/Collapsible.js</js>
+    <js>/scripts/behaviors/CommentBox.js</js>
+    <js>/scripts/behaviors/Columns.js</js>
+    <js>/scripts/behaviors/GraphBar.js</js>
+    <js>/scripts/behaviors/Element.Reflect.js</js>
+    <js>/scripts/behaviors/Flip.js</js>
+    <js>/scripts/behaviors/TableX.js</js>
+    <js>/scripts/behaviors/TableX.Sort.js</js>
+    <js>/scripts/behaviors/TableX.Filter.js</js>
+    <js>/scripts/behaviors/TableX.Zebra.js</js>
+    <js>/scripts/behaviors/Tabs.js</js>
+    <js>/scripts/behaviors/Accordion.js</js>
+    <js>/scripts/behaviors/Viewer.js</js>
+    <js>/scripts/behaviors/Viewer.Slimbox.js</js>
+    <js>/scripts/behaviors/Viewer.Carousel.js</js>
   </group>
 
   <group name="haddock">
 
     <group-ref>lib</group-ref>
     <group-ref>mooextend</group-ref>
-    <group-ref>dynamic-styles</group-ref>
+    <group-ref>behaviors</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>
+    <js>/scripts/wiki/Wiki.Behaviors.js</js>
 
-    <css>/styles/haddock/jspwiki.less</css>
+    <css>/styles/haddock/default/build.less</css>
   </group>
 
   <group name="haddock-edit">
 
     <js>/scripts/moo-extend/Date.Extend.js</js>
+    <js>/scripts/moo-extend/Function.Extend.js</js>
     <js>/scripts/moo-extend/Array.Extend.HSV.js</js>
+
     <js>/scripts/dialog/Dialog.js</js>
     <js>/scripts/dialog/Dialog.Buttons.js</js>
     <js>/scripts/dialog/Dialog.Color.js</js>
@@ -91,8 +95,9 @@
     <js>/scripts/dialog/Dialog.Find.js</js>
 
     <js>/scripts/moo-extend/Textarea.js</js>
-    <js>/scripts/wiki-edit/UndoRedo.js</js>
+    <js>/scripts/wiki-edit/Undoable.js</js>
     <js>/scripts/wiki-edit/Snipe.js</js>
+    <js>/scripts/wiki-edit/Snipe.Snips.js</js>
     <js>/scripts/wiki-edit/Snipe.Commands.js</js>
     <js>/scripts/wiki-edit/Snipe.Sections.js</js>
     <js>/scripts/wiki-edit/Wiki.Snips.js</js>

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=1686927&r1=1686926&r2=1686927&view=diff
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/config/wro/wro.properties (original)
+++ jspwiki/trunk/jspwiki-war/src/main/config/wro/wro.properties Mon Jun 22 20:11:42 2015
@@ -15,6 +15,11 @@
 #  specific language governing permissions and limitations
 #  under the License.
 
+#minimizeEnabled=false
+debug=true
+
+
+#preProcessors=cssUrlRewriting,cssImport,semicolonAppender
 preProcessors=cssImport,semicolonAppender
 postProcessors=lessCss,yuiCssMin,uglifyJs
-#postProcessors=lessCss,yuiCssMin
\ No newline at end of file
+#postProcessors=less4j.less,cssCompressor,uglifyJs

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=1686927&r1=1686926&r2=1686927&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 Mon Jun 22 20:11:42 2015
@@ -72,7 +72,7 @@ public final class Release {
      *  <p>
      *  If the build identifier is empty, it is not added.
      */
-    public static final String     BUILD         = "16";
+    public static final String     BUILD         = "17";
 
     /**
      *  This is the generic version string you should use when printing out the version.  It is of 

Modified: jspwiki/trunk/jspwiki-war/src/main/resources/templates/default.properties
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/resources/templates/default.properties?rev=1686927&r1=1686926&r2=1686927&view=diff
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/resources/templates/default.properties (original)
+++ jspwiki/trunk/jspwiki-war/src/main/resources/templates/default.properties Mon Jun 22 20:11:42 2015
@@ -38,6 +38,8 @@ attach.bytes=bytes
 attach.add.selectfile=Select file:
 attach.add.changenote=Change Note:
 attach.add.submit=Upload
+attach.add.select=Select files or drop them here
+attach.add.drop=or drop them here
 attach.preview=Image preview
 attach.deleteconfirm=Please confirm that you want to delete this attachment permanently!
 attach.delete=Delete
@@ -318,6 +320,7 @@ actions.login=Log in
 actions.login.title=Log in or Register as new user
 actions.logout=Log out
 actions.logout.title=Log out
+actions.confirmlogout=Please confirm that you want to logout!
 actions.publishedon=This particular version was published on {0} by {1}.
 actions.notcreated=Page not created yet.
 actions.workflow=Workflow
@@ -326,6 +329,7 @@ actions.systeminfo=JSPWiki System Info
 actions.systeminfo.title=Show JSPWiki System settings &amp; info
 actions.rawpage=View Page Source
 actions.rawpage.title=View Page Source
+actions.showreaderview=Show Reader View
 
 # PageContent.jsp
 
@@ -349,8 +353,9 @@ prefs.cookies=Your choices will be saved
 
 prefs.user.skin=Skin
 prefs.user.orientation=Favorites style
-prefs.user.orientation.left=Left
-prefs.user.orientation.right=Right
+prefs.user.orientation.left=Sidebar / Content
+prefs.user.orientation.right=Content / Sidebar
+prefs.user.orientation.hidden=No Sidebar
 prefs.user.layout=Page Layout
 prefs.user.layout.fluid=Fluid
 prefs.user.layout.fixed=Fixed Width
@@ -466,7 +471,8 @@ preview.tab=Preview
 preview.info=This is a <strong>preview</strong>\!  Hit &\#8220;Keep Editing&\#8221; to go back to the editor, or hit &\#8220;Save&\#8221; if you&\#8217;re happy with what you see.
 
 #  SearchBox.jsp
-sbox.search.submit=Quick Navigation
+sbox.search.submit=To search, type ahead
+sbox.search.fullsearch=For full search, hit enter...
 sbox.view=view
 sbox.view.title=View the selected page
 sbox.edit=edit
@@ -500,7 +506,7 @@ view.title.view={0}: {1}
 
 editor.plain.name=Your <span class='accesskey'>n</span>ame
 editor.plain.remember=Remember me?
-editor.plain.email=Homepage or e<span class='accesskey'>m</span>ail
+editor.plain.email=Homepage or email
 editor.plain.save.submit=Save
 editor.plain.save.title=Save [ s ]
 editor.plain.preview.submit=Preview
@@ -538,7 +544,7 @@ editor.plain.livepreview=Live Preview
 editor.plain.sneakpreview=Sneak Preview
 editor.plain.sneakpreview.title=Sneak Preview. \
     Click outside the textarea to refresh the sneak preview area.
-
+editor.plain.sidebysidepreview=Side by Side Preview
 editor.plain.edit.resize=Drag to resize the text and preview area
 
 editor.plain.tbLink.title=link - Insert wiki link
@@ -583,6 +589,9 @@ blog.addcomments=Add new comments
 #
 #  The Javascript stuff
 #
+javascript.sbox.clearrecent=Clear Recent Searches
+javascript.sbox.clone =Clone this page
+javascript.sbox.create =Create {0}
 javascript.sbox.clone.suffix=-New
 
 javascript.edit.allsections=( All )
@@ -606,12 +615,13 @@ javascript.sort.click=Click to sort
 javascript.sort.ascending=Ascending order. Click to reverse sort order
 javascript.sort.descending=Descending order. Click to reverse sort order
 javascript.filter.all=( All )
-javascript.filter.hint=Enter filter pattern
+javascript.filter.hint=Enter filter pattern (esc to clear)
 
 javascript.group.validName=Please provide a valid name for the new Group
 
 javascript.category.title=Click to show category [{0}] ...
 
+javascript.slimbox.caption=Go to {0}
 javascript.slimbox.info=Image {0} of {1}
 javascript.slimbox.error=<h2>Error</h2>There was a problem with your request.<br />Please try again
 javascript.slimbox.directLink=Direct Link to the target
@@ -621,7 +631,7 @@ javascript.slimbox.next=Next&raquo;
 javascript.slimbox.close=Close &#215;
 javascript.slimbox.close.title=Close [Esc]
 javascript.slimbox.caption= Direct link to {0}
-javascript.slimbox.btn=Click to view {0} 
+javascript.slimbox.btn=Click to view {0}
 
 javascript.sectionediting.label=Section Overview
 

Added: jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Accordion.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Accordion.js?rev=1686927&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Accordion.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Accordion.js Mon Jun 22 20:11:42 2015
@@ -0,0 +1,164 @@
+/*
+    JSPWiki - a JSP-based WikiWiki clone.
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); fyou may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+/*
+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
+        //closed:  boolean  -- initial status of the accordion
+        //position: "pull-left" or "pull-right"  (only relevant with "pills")
+    },
+
+    initialize: function(container, options){
+
+        var panes = this.getPanes( container ),
+            nav, pane, name, toggle, type, position,
+            i = 0,
+            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;
+
+        this.options.closed = !nav && /-close/.test( container.className );
+
+        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,
+            display: this.options.closed ? -1 : 0, // initial display status
+            alwaysHide: !nav,   //allow closing all panes
+            initialDisplayFx: false,   //do not show effect on initial display
+            onComplete: function(){
+                var el = $(this.elements[this.current]);
+                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);
+            }
+
+        });
+
+    }
+
+});

Added: jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/AddCSS.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/AddCSS.js?rev=1686927&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/AddCSS.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/AddCSS.js Mon Jun 22 20:11:42 2015
@@ -0,0 +1,75 @@
+/* Behavior: Add-CSS
+        Inject any custom css into a wiki page.
+        You can either directly insert the css definitions in your page or
+        include it from another wiki page.
+
+        Carefull with CSS-injection (https://www.owasp.org/index.php/Testing_for_CSS_Injection_%28OTG-CLIENT-005%29)
+        - injection of "</style><script>...</script><style>" not possible, as all <,> are escaped by jspwiki
+        - take care of attribute selector attacks ??
+
+>   %%add-css ... /%
+>   %%add-css [some-remote-wiki-page] /%
+*/
+//Wiki.AddCSS function( element ){
+function AddCSS( element ){
+
+    function insertStyle ( elements ){
+
+        var css = "", item;
+
+        //collect all css to be inserted
+        while( item = elements.shift() ){ css += item.innerHTML; }
+
+        //magic to replace the inline wiki-image links to css url()
+        //xss protection: remove invalid url's;  only allow url([wiki-attachement])
+        css = css.replace( /url\(\<[^i][^)]*\)/gi, "url(invalid)" ); //remove url(<a...)
+        css = css.replace( /url\([^<][^)]*\)/gi, "url(invalid)" );  //remove url(xxx)
+        css = css.replace( /url\(<img class="inline" src="([^"]+)[^>]+>\)/gi, "url($1)" );
+
+        css = css.replace( /<p>|<\/p>/gi, "" ); //jspwiki inserts <p/> for empty lines
+
+        css = "style[type=text/css]".slick({text: css});
+
+        /*
+        Sequence to insert CSS is :
+            (1) jspwiki.css (<HEAD>)
+            (2) sidebar/favorites
+            (3) in-page additional styles
+
+        Because the side-bar is located at the end of the DOM, the additional sidebar styles
+        need to be inserted at the top of the DOM, i.e. just at the top of the BODY element.
+        Other CCS is injected in the order of appearance.
+        */
+        if( element.getParent( ".sidebar" ) ){
+
+            $(document.body).grab(css, "top");
+            element.destroy();
+
+        } else {
+
+            css.replaces( element );
+
+        }
+
+    };
+
+    if( element.innerHTML.test( /^\s*<a class="wikipage" href="([^"]+)">/ ) ){
+
+        //%%add-css [some-wikipage] /%
+        //go and read the %%add-css blocks from another remote page -- how hard is that ?
+        //then filter all div.page-content div.add-css elements
+
+        new Request.HTML({
+            url: RegExp.$1,
+            filter: "div.page-content div.add-css",
+            onSuccess: insertStyle,
+            evalScripts: false
+        }).get();
+
+    } else {
+
+        insertStyle([element]);
+
+    }
+
+}

Added: jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Collapsible.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Collapsible.js?rev=1686927&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Collapsible.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Collapsible.js Mon Jun 22 20:11:42 2015
@@ -0,0 +1,357 @@
+/*
+    JSPWiki - a JSP-based WikiWiki clone.
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); fyou may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+/*
+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", //clickable bullet
+        hint: { open:"collapse", close:"expand" },
+        open: "xpand",
+        close: "clpse",
+
+        //cookie: null,    //Cookie.Flags - persist the state of the targets
+        //target: "ul,ol", //the elements 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 all objects, so first copy 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(
+            //EG: "click:relay(b.bullet.xpand,b.bullet.clpse)"
+            "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" or "> .panel-body"
+
+            this.parent( element, options );
+        //}
+    },
+
+    build: function( element ){
+
+        var options = this.options, heading, body, next
+            panelCSS = "panel".fetchContext(element);
+
+        //we don"t do 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/behaviors/Columns.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Columns.js?rev=1686927&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Columns.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Columns.js Mon Jun 22 20:11:42 2015
@@ -0,0 +1,72 @@
+/*
+    JSPWiki - a JSP-based WikiWiki clone.
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); fyou may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+/*
+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.
+
+    FFS: 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),
+        divider = "hr",
+        columnCount = element.getChildren(divider).length,
+        width;
+
+    if( columnCount /*>0*/ ){
+
+        columnCount++;
+        width = ( args[0] ) ? args[0] / columnCount + "px" : 100 / columnCount + "%";
+
+        element
+            .addClass("columns")
+            .grab(divider.slick(), "top") //add one extra group-start-element at the top
+
+            .groupChildren(divider, "div.col", function(column){
+
+                column.setStyle("width", width);
+
+            });
+    }
+
+}

Added: jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/CommentBox.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/CommentBox.js?rev=1686927&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/CommentBox.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/CommentBox.js Mon Jun 22 20:11:42 2015
@@ -0,0 +1,66 @@
+/*
+    JSPWiki - a JSP-based WikiWiki clone.
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); fyou may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+/*
+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/behaviors/Element.Reflect.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Element.Reflect.js?rev=1686927&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Element.Reflect.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Element.Reflect.js Mon Jun 22 20:11:42 2015
@@ -0,0 +1,105 @@
+/*
+    JSPWiki - a JSP-based WikiWiki clone.
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); fyou may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+/*
+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/behaviors/Flip.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Flip.js?rev=1686927&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Flip.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Flip.js Mon Jun 22 20:11:42 2015
@@ -0,0 +1,75 @@
+/*
+    JSPWiki - a JSP-based WikiWiki clone.
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); fyou may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+       http://www.apache.org/licenses/LICENSE-2.0
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+/*
+Behavior: Flip & Flop
+
+Markup
+(start code)
+%%flip-h300-w500-none-default-primary-info-warning-success-danger
+Front
+----
+Back
+/%
+(end)
+
+DOM Structure
+(start code)
+div.flip-container
+  div.flip
+    div.face
+        ..front face..
+    div.face
+        ..back face
+(end)
+*/
+function Flip(element, options){
+
+    var args = options.prefix.sliceArgs(element), arg,
+        divider = "hr",
+        css = {},
+        frontback = ["default", "default"];
+
+    //require exactly to blocks: one for front and one for back
+    if( element.getChildren(divider).length == 1 ){
+
+        while( args.length ){
+
+            arg = args.pop();
+            if( !arg.indexOf("w") /*index==0*/ ){ css.width = arg.slice(1).toInt(); }
+            else if( !arg.indexOf("h") /*index==0*/ ){ css.height = arg.slice(1).toInt(); }
+            else if( arg.test(/none|default|success|info|warning|danger/ )){ frontback.push(arg); }
+
+        }
+
+        "div.flip-container".slick({ styles: css}).wraps(element);
+
+        element
+            .addClass(options.prefix)
+            .grab( divider.slick(), "top") //add one extra group-start-element at the top
+            .groupChildren( divider, "div.face", function(face){
+                var clazz;
+                if( frontback.length ){
+                    clazz = frontback.pop();
+                    face.ifClass( clazz != "none", clazz );
+                }
+
+            });
+
+    }
+
+}

Added: jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/GraphBar.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/GraphBar.js?rev=1686927&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/GraphBar.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/GraphBar.js Mon Jun 22 20:11:42 2015
@@ -0,0 +1,255 @@
+/*
+    JSPWiki - a JSP-based WikiWiki clone.
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); fyou may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+/*
+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: 40, //(px) smallest bar = offset
+        size: 400, //(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 = bars.toNatural().scale(options.minv, options.maxv);
+
+                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 == "inside" ){ options.textInside = 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("minv") /*index==0*/){ options.minv = p.slice(4).toInt(); }
+            else if( !p.indexOf("maxv") /*index==0*/){ options.maxv = p.slice(4).toInt(); }
+
+            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[style="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,
+            inside = options.textInside,
+            isGauge = options.isGauge,
+            isProgress = options.isProgress,
+            //isHorizontal = options.isHorizontal,
+            dom, css;
+
+
+        //color invertor
+        if( isGauge && !color2 && color1 ){ color2 = color1.invert();}
+
+
+        //color mixer
+        if( !isProgress && color2 ){ color1 = color1.mix(color2, 100 * (isGauge ? val : percent)); }
+
+        val = val * 100;
+
+        //first calculate the 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(barsize){
+            return options.isHorizontal ? {width: barsize} : {height: barsize, width: 20, "vertical-align":"text-bottom"};
+        });
+
+        //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 dom template
+        dom = [options.gbGroup, { styles: css[0] }, [ options.gbBar, {
+                styles: css[1],
+                text: inside ? el.innerHTML : ""
+            } ] ];
+        if( inside ){ el.innerHTML = ""; }
+        if( isProgress && color2){ dom[2].push( options.gbBar, {styles: css[2]} ); }
+
+        dom.slick().inject(el, el.match("td") ? "top" : "before");
+
+    }
+
+});

Added: jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/TableX.Filter.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/TableX.Filter.js?rev=1686927&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/TableX.Filter.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/TableX.Filter.js Mon Jun 22 20:11:42 2015
@@ -0,0 +1,129 @@
+/*
+    JSPWiki - a JSP-based WikiWiki clone.
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); fyou may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+/*
+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/
+
+Options:
+    minSize - (number) minimum table rows to activate the filter
+    shortcut - css selector for shortcut filter-strings
+    list -(array) ist of shortcuts to quickly filter the table
+    hint - HTML5 placeholder text for the filter field
+    highlight - css class applied to cells matching the filter term
+
+*/
+TableX.Filter = new Class({
+
+    Implements: Options,
+
+    options: {
+        minSize: 5,
+        shortcut: "a.btn.btn-link[text=\"{0}\"]",
+        list: [], //["99","test"],
+        hint: "filter this table",
+        highlight: "highlight"
+    },
+
+    initialize: function(table, options){
+
+        options = this.setOptions(options).options;
+
+        var self = this,
+            items = [],
+            minRows = options.minSize,
+            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-inline.form-group.cage.filter-input", [
+                "input.form-control[type=search][placeholder=\"" + options.hint + "\"]", {
+                    attach: [ self, "input" ],
+                    events: {
+                        keyup: filter,    //"keyup:throttle": filter,
+                        click: filter
+                    }
+                },
+                "span.icon-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.trim(),
+            queryRE;
+
+
+        try {
+            queryRE = RegExp( query, "i");  //support regexp in filter
+            //queryRE = RegExp( query.escapeRegExp(), "i");
+        }
+        catch(e){}
+
+        if( query == "" || !queryRE ){
+
+            rows.show().addClass(visible);
+
+        } else {
+
+            rows.hide().removeClass(visible);
+
+            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/behaviors/TableX.Sort.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/TableX.Sort.js?rev=1686927&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/TableX.Sort.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/TableX.Sort.js Mon Jun 22 20:11:42 2015
@@ -0,0 +1,98 @@
+/*
+    JSPWiki - a JSP-based WikiWiki clone.
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); fyou may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+/*
+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, "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 );
+
+    }
+
+});

Added: jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/TableX.Zebra.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/TableX.Zebra.js?rev=1686927&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/TableX.Zebra.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/TableX.Zebra.js Mon Jun 22 20:11:42 2015
@@ -0,0 +1,62 @@
+/*
+    JSPWiki - a JSP-based WikiWiki clone.
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); fyou may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+/*
+Class: TableX.Zebra
+    Simple class to add odd/even coloring to tables.
+    Default colouring via css class "".odd""
+
+    CHECKME: use BOOTSTRAP class .striped
+
+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( hasColors ){
+
+                row.setStyle("background-color", colors[j] || "");
+
+            } else {
+
+                row.ifClass(j, "odd");
+
+            }
+
+        });
+    }
+
+    var colors = options.colors,
+        hasColors = colors[0] && (colors[0] != "table");
+
+    if ( hasColors ){ 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/behaviors/TableX.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/TableX.js?rev=1686927&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/TableX.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/TableX.js Mon Jun 22 20:11:42 2015
@@ -0,0 +1,126 @@
+/*
+    JSPWiki - a JSP-based WikiWiki clone.
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); fyou may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+/*
+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 ){ // first 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++ ){  // finally, 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/behaviors/Tabs.js
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Tabs.js?rev=1686927&view=auto
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Tabs.js (added)
+++ jspwiki/trunk/jspwiki-war/src/main/scripts/behaviors/Tabs.js Mon Jun 22 20:11:42 2015
@@ -0,0 +1,176 @@
+/*
+    JSPWiki - a JSP-based WikiWiki clone.
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); fyou may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+/*
+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,
+            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, caption){
+                pane.addClass( "tab-" + caption.get("text").trim().replace(/\s+/g, "-").camelCase() );
+                pane.id = caption.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);
+
+    }
+
+});