diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index afabba75c..3ddddf667 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -235,24 +235,6 @@ spring-dispatcher /api/* - - - - js - text/javascript - - - - mjs - text/javascript - - - - css - text/css - diff --git a/src/main/webapp/docs/celements2web/Panels/ClassEditorWelcome.xml b/src/main/webapp/docs/celements2web/Panels/ClassEditorWelcome.xml index f9978efbc..13dc69363 100644 --- a/src/main/webapp/docs/celements2web/Panels/ClassEditorWelcome.xml +++ b/src/main/webapp/docs/celements2web/Panels/ClassEditorWelcome.xml @@ -1,156 +1,121 @@ -Panels -ClassEditorWelcome - -en -0 -Panels.WebHome -XWiki.Admin -xwiki:XWiki.msladek - -xwiki:XWiki.msladek -1154086211000 -1539796412000 -1539796412000 -1.1 - - - - -Imported from XAR -false -xwiki/1.0 -false - - -Panels.PanelClass - - - - - - - - -0 -0 -select -0 -category -5 -Category -0 - - ,| -1 -0 -Information|Navigation|Tools|Administration|Other -com.xpn.xwiki.objects.classes.StaticListClass - - -0 -Text -content -4 -Content -25 -60 -0 -com.xpn.xwiki.objects.classes.TextAreaClass - - -0 -Text -description -3 -Description -5 -40 -0 -com.xpn.xwiki.objects.classes.TextAreaClass - - -0 -name -1 -Name -40 -0 -com.xpn.xwiki.objects.classes.StringClass - - -0 -0 -select -0 -type -2 -Panel type -0 - - ,| -1 -0 -view|edit -com.xpn.xwiki.objects.classes.StaticListClass - - -Panels.ClassEditorWelcome -0 -Panels.PanelClass -5f54f197-af72-47c8-879a-c602defc559b - -Information - - -#largepanelheader($msg.get("classEditorIntro")) -##$xwiki.jsx.use('Panels.ClassSwitcher')## -<p>$msg.get("xe.panels.classedit.youare") <strong>${doc.fullName}</strong>. $msg.get("xe.panels.classedit.chooseproperty")</p> -<div> -<form id="changeclass" method="post" action="$doc.getURL("redirect")"> -<div> -<select id="classname" name="xredirect" size="1"> -<option value="-">Edit another class</option> -## -## Existing classes are enumerated, grouped by space name. -## The list is already sorted alphabetically -## -#set($prevSpace = "") -#set($optGroupOpen = false) -#foreach ($classname in $xwiki.classList) - #if($!xwiki.hasAccessLevel("edit", $classname)) - #set($classdoc = $xwiki.getDocument($classname)) - #if($classdoc.space != $prevSpace) - #if($optGroupOpen) - </optgroup> - #else - #set($optGroupOpen = true) - #end - <optgroup label="$classdoc.space"> - #set($prevSpace = $classdoc.space) - #end - <option value="$classdoc.getURL("edit", "editor=class")">$classdoc.name</option> - #end -#end -#if($optGroupOpen) - </optgroup> -#end -</select> -<span class="buttonwrapper"><input class="button" type="submit" value="$msg.get("changeclass")"/></span></div> -#warning($msg.get('xe.panels.classedit.unsavedchanges')) -</form> -</div> -#panelfooter() - - -Class Editor welcome and brief information message. - - -Class Editor Welcome - - -edit - - -#includeForm("Panels.PanelSheet") + Panels + ClassEditorWelcome + + en + 0 + Panels.WebHome + XWiki.Admin + xwiki:XWiki.msladek + + xwiki:XWiki.msladek + 1154086211000 + 1539796412000 + 1539796412000 + 1.1 + + + + + Imported from XAR + false + xwiki/1.0 + false + + + Panels.PanelClass + + + + + + + + + 0 + 0 + select + 0 + category + 5 + Category + 0 + + ,| + 1 + 0 + Information|Navigation|Tools|Administration|Other + com.xpn.xwiki.objects.classes.StaticListClass + + + 0 + Text + content + 4 + Content + 25 + 60 + 0 + com.xpn.xwiki.objects.classes.TextAreaClass + + + 0 + Text + description + 3 + Description + 5 + 40 + 0 + com.xpn.xwiki.objects.classes.TextAreaClass + + + 0 + name + 1 + Name + 40 + 0 + com.xpn.xwiki.objects.classes.StringClass + + + 0 + 0 + select + 0 + type + 2 + Panel type + 0 + + ,| + 1 + 0 + view|edit + com.xpn.xwiki.objects.classes.StaticListClass + + + Panels.ClassEditorWelcome + 0 + Panels.PanelClass + 5f54f197-af72-47c8-879a-c602defc559b + + Information + + + #largepanelheader($msg.get("classEditorIntro"))

$msg.get("xe.panels.classedit.youare") + ${doc.fullName}. $msg.get("xe.panels.classedit.chooseproperty")

#panelfooter()
+
+ + Class Editor welcome and brief information message. + + + Class Editor Welcome + + + edit + +
+ #includeForm("Panels.PanelSheet") + diff --git a/src/main/webapp/docs/celements2web/Panels/ClassSwitcher.xml b/src/main/webapp/docs/celements2web/Panels/ClassSwitcher.xml index 7ce7d06f8..2ebb8509c 100644 --- a/src/main/webapp/docs/celements2web/Panels/ClassSwitcher.xml +++ b/src/main/webapp/docs/celements2web/Panels/ClassSwitcher.xml @@ -1,259 +1,156 @@ -Panels -ClassSwitcher - -en -0 -Panels.WebHome -XWiki.Admin -xwiki:XWiki.msladek - -xwiki:XWiki.msladek -1154079605000 -1539796411000 -1539796411000 -1.1 - - - - -Imported from XAR -false -xwiki/1.0 -false - - -Panels.PanelClass - - - - - - - - -0 -0 -select -0 -category -5 -Category -0 - - ,| -1 -0 -Information|Navigation|Tools|Administration|Other -com.xpn.xwiki.objects.classes.StaticListClass - - -0 -Text -content -4 -Content -25 -60 -0 -com.xpn.xwiki.objects.classes.TextAreaClass - - -0 -Text -description -3 -Description -5 -40 -0 -com.xpn.xwiki.objects.classes.TextAreaClass - - -0 -name -1 -Name -40 -0 -com.xpn.xwiki.objects.classes.StringClass - - -0 -0 -select -0 -type -2 -Panel type -0 - - ,| -1 -0 -view|edit -com.xpn.xwiki.objects.classes.StaticListClass - - -Panels.ClassSwitcher -0 -Panels.PanelClass -32c7090e-d98d-415f-965d-b3319b10cca7 - -Tools - - -#largepanelheader('Class Switcher') -##$xwiki.jsx.use('Panels.ClassSwitcher')## -<div> -<form id="changeclass" method="post" action="$doc.getURL("redirect")"> -<div> -<select id="classname" name="xredirect" size="1"> -<option value="-">Edit another class</option> -## -## Existing classes are enumerated, grouped by space name. -## The list is already sorted alphabetically -## -#set($prevSpace = "") -#set($optGroupOpen = false) -#foreach ($classname in $xwiki.classList) - #if($!xwiki.hasAccessLevel("edit", $classname)) - #set($classdoc = $xwiki.getDocument($classname)) - #if($classdoc.space != $prevSpace) - #if($optGroupOpen) + Panels + ClassSwitcher + + en + 0 + Panels.WebHome + XWiki.Admin + xwiki:XWiki.msladek + + xwiki:XWiki.msladek + 1154079605000 + 1539796411000 + 1539796411000 + 1.1 + + + + + Imported from XAR + false + xwiki/1.0 + false + + + Panels.PanelClass + + + + + + + + + 0 + 0 + select + 0 + category + 5 + Category + 0 + + ,| + 1 + 0 + Information|Navigation|Tools|Administration|Other + com.xpn.xwiki.objects.classes.StaticListClass + + + 0 + Text + content + 4 + Content + 25 + 60 + 0 + com.xpn.xwiki.objects.classes.TextAreaClass + + + 0 + Text + description + 3 + Description + 5 + 40 + 0 + com.xpn.xwiki.objects.classes.TextAreaClass + + + 0 + name + 1 + Name + 40 + 0 + com.xpn.xwiki.objects.classes.StringClass + + + 0 + 0 + select + 0 + type + 2 + Panel type + 0 + + ,| + 1 + 0 + view|edit + com.xpn.xwiki.objects.classes.StaticListClass + + + Panels.ClassSwitcher + 0 + Panels.PanelClass + 32c7090e-d98d-415f-965d-b3319b10cca7 + + Tools + + + #largepanelheader('Class Switcher') + <div> + <form id="changeclass" method="post" action="$doc.getURL("redirect")"> + <div> + <select id="classname" name="xredirect" size="1"> + <option value="-">Edit another class</option> + ## + ## Existing classes are enumerated, grouped by space name. + ## The list is already sorted alphabetically + ## + #set($prevSpace = "") + #set($optGroupOpen = false) + #foreach ($classname in $xwiki.classList) + #if($!xwiki.hasAccessLevel("edit", $classname)) + #set($classdoc = $xwiki.getDocument($classname)) + #if($classdoc.space != $prevSpace) + #if($optGroupOpen) </optgroup> - #else + #else #set($optGroupOpen = true) - #end - <optgroup label="$classdoc.space"> - #set($prevSpace = $classdoc.space) - #end - <option value="$classdoc.getURL("edit", "editor=class")">$classdoc.name</option> - #end -#end -#if($optGroupOpen) + #end + <optgroup label="$classdoc.space"> + #set($prevSpace = $classdoc.space) + #end + <option value="$classdoc.getURL("edit", "editor=class")">$classdoc.name</option> + #end + #end + #if($optGroupOpen) </optgroup> -#end -</select> -<span class="buttonwrapper"><input class="button" type="submit" value="$msg.get("changeclass")"/></span></div> -#warning($msg.get('xe.panels.classedit.unsavedchanges')) -</form> -</div> -#panelfooter() - - -Form that allows choosing the class for the object to be added to the current document. - - -Class Switcher - - -edit - - - - -XWiki.JavaScriptExtension - - - - - - - - -0 -0 -select -0 -cache -5 -Caching policy -0 - - ,| -1 -0 -long|short|default|forbid -com.xpn.xwiki.objects.classes.StaticListClass - - -0 -code -2 -Code -20 -50 -0 -com.xpn.xwiki.objects.classes.TextAreaClass - - -0 -name -1 -Name -30 -0 -com.xpn.xwiki.objects.classes.StringClass - - -0 -select -yesno -parse -4 -Parse content -0 -com.xpn.xwiki.objects.classes.BooleanClass - - -0 -0 -select -0 -use -3 -Use this extension -0 - - ,| -1 -0 -onDemand=On demand|always=Always -com.xpn.xwiki.objects.classes.StaticListClass - - -Panels.ClassSwitcher -0 -XWiki.JavaScriptExtension -951b5864-df3e-46d0-bdbe-bac923e58dc8 - -long - - -document.observe('dom:loaded', function() { - var switcher = $('classname'); - if(typeof (switcher) != 'undefined') { - switcher.observe('change', function() { - var value = this.options[this.selectedIndex].value; - if (value != '-') { - window.self.location = value; - } - }.bindAsEventListener(switcher)); - switcher.up('form').down("input[type='submit']").hide(); - } -}); - - - -Instant class switcher - - -0 - - -onDemand - - -#includeForm("Panels.PanelSheet") + #end + </select> + <span class="buttonwrapper"><input class="button" type="submit" + value="$msg.get("changeclass")"/></span></div> + #warning($msg.get('xe.panels.classedit.unsavedchanges')) + </form> + </div> + #panelfooter() + + + Form that allows choosing the class for the object to be added to the current document. + + + Class Switcher + + + edit + + + #includeForm("Panels.PanelSheet") + diff --git a/src/main/webapp/docs/celements2web/Panels/SyntaxHelp.xml b/src/main/webapp/docs/celements2web/Panels/SyntaxHelp.xml deleted file mode 100644 index 0a2ad4179..000000000 --- a/src/main/webapp/docs/celements2web/Panels/SyntaxHelp.xml +++ /dev/null @@ -1,185 +0,0 @@ - - -Panels -SyntaxHelp - -en -0 -Panels.WebHome -XWiki.Admin -xwiki:XWiki.msladek - -xwiki:XWiki.msladek -1153995199000 -1539796419000 -1539796419000 -1.1 -XWiki syntax help - - - -Imported from XAR -false -xwiki/1.0 -false -img.png -959 -XWiki.Admin -1203518471000 -1.1 -iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAAAAADgE0Q3AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAA -CxMAAAsTAQCanBgAAAAHdElNRQfWBxcOEy+3/bdlAAADUElEQVRIx52WTW/cVBSG32tfezxJZiaT -0EwnCkVKgVZI3cFAVYkFLEFCKoI/wz9Bgh/ApqqEWLQLFmUHAtJKqKIqMKhSJ50R+aCTTHzPey4L -2/PVIru9C8u6Po/f83XtYzxefAUvwcACAMZPjrXc1gfJVm0VgPHA+HCQGmOMKcfQ6jYypeO/jQ1t -WAGCng1sHRY4ehzYuBbUwzIojb1nOkmMBf5xNonW46iCUhoxPY3WLPBvEK826lFQAUq8xhawgNrE -1muBqZJsFwVQWMAE8Vq0xIxv7a+rjhN38Z3Ezu3HQORgPO6G7VYSLjD9Gx92SJK8e//z15KFF3qJ -AgBmOZz+d5+ec8455+TSe18/mCw8NEAAPFvXGx9Z55yIiHPr79/suwq9d+fd0ImIc86JuFbrx5Ev -hwY7LndORCS9uPfo7HkNu7goQiWZXWhOn5wmpZB3M4JK6kTKleAKHVGSozAMKkCS6YiSSh4mjbiy -Uu4b03qjVpq98eMs3yLihCKj+lpUqvRzV0hRKkmlsjV8epaUKR2tO+co4kQoItJ1fx2Vutc9dCJ5 -F4mI7FPKO2JrNI+IjNrbjVLovP81s6aIk8HoaXc7KYXsZ40D5hhl8OjC5XNhKWQ2r0ym7k2423ur -gfLixu2sGZTKk/obVzq2AgRkZVKqnq502hZVoFcPEyU9VVVXl3vo//4aTVJIISmTqBaiktKBcapU -VVXWrKkGfdNkjmhkjDcVoOGXJioYjf54uL1iyqDht7+3QdUsD/TRzb2Pdxc/lzAe9+xGM9/t//bL -SQuFilIzsvN275VZaC6ag/o//MkVy4Iorqr0Pn7zg0tJsAyN7txn02R29My8o5+iCC/0crkCSm/3 -NyLmZizc0iIyVQAIbOdarxMUUP2r8wHpqXO+Kf0UmZ7BcOuLTbjIAsDDDQinxpr7VUQ2d2w5fLBZ -pHzsnV8MfuagLhx1OZjWSZpHupjnWUyLVdxJ84Y1uPa6kJSsRUmhZvdcZnD1kxyqAX6XuX1mKxSK -yDNML/sVGo/RsN38CXv76mflVFX1y8jOVVwHXBgYj5NR1EqC732+FF7hvX/OTHd91ns4OV4tn3Gm -+QsNjAcwUSSm2vBhYTIlAGk1xmQzinmZcfQ/40v+ffqYGLoAAAAASUVORK5CYII= - - - -Panels.PanelClass - - - - - - - - -0 -0 -select -0 -category -5 -Category -0 - - ,| -1 -0 -Information|Navigation|Tools|Administration|Other -com.xpn.xwiki.objects.classes.StaticListClass - - -0 -Text -content -4 -Content -25 -60 -0 -com.xpn.xwiki.objects.classes.TextAreaClass - - -0 -Text -description -3 -Description -5 -40 -0 -com.xpn.xwiki.objects.classes.TextAreaClass - - -0 -name -1 -Name -40 -0 -com.xpn.xwiki.objects.classes.StringClass - - -0 -0 -select -0 -type -2 -Panel type -0 - - ,| -1 -0 -view|edit -com.xpn.xwiki.objects.classes.StaticListClass - - -Panels.SyntaxHelp -0 -Panels.PanelClass -7d78bddb-56fc-4cc0-87a7-f6050ae66786 - -Information - - -#largepanelheader($msg.get("xe.panels.syntax.help")) -#set ($syntaxDoc = $xwiki.getDocument("XWiki.XWikiSyntax")) -#if ($syntaxDoc.isNew()) - #set ($url = "http://platform.xwiki.org/xwiki/bin/view/Main/XWikiSyntax?xpage=print") -#else - #set ($url = $xwiki.getURL("XWiki.XWikiSyntax", "view", "xpage=print")) -#end -$msg.get("helponsyntax") <a href="$url" onclick="openURL('$url', '_blank'); return false;"><span class="nobr">$msg.get("xwikisyntax")</span></a> -#panelfooter() - - -Displays information on the XWiki syntax. - - -Syntax help - - -edit - - - - -XWiki.TagClass - - - - - - - - -0 -0 -checkbox -1 -tags -1 -Tags -1 - - ,| -30 -0 - -com.xpn.xwiki.objects.classes.StaticListClass - - -Panels.SyntaxHelp -0 -XWiki.TagClass -041947c1-9c4b-4f63-8b66-47ea8ebc1589 - - - - -#includeForm("Panels.PanelSheet") diff --git a/src/main/webapp/docs/xwiki/XWiki/AdminExportSheet.xml b/src/main/webapp/docs/xwiki/XWiki/AdminExportSheet.xml deleted file mode 100644 index fa6236c5a..000000000 --- a/src/main/webapp/docs/xwiki/XWiki/AdminExportSheet.xml +++ /dev/null @@ -1,29 +0,0 @@ - - -XWiki -AdminExportSheet - -en -0 -XWiki.AdminSheet -XWiki.Admin -XWiki.Admin - -xwiki:XWiki.Admin -1211800201000 -1212569607000 -1213892723000 -1.1 -AdminExportSheet - - - -Imported from XAR -false -xwiki/2.0 -false -{{velocity}} -{{html}} -#template('exportinline.vm') -{{/html}} -{{/velocity}} diff --git a/src/main/webapp/docs/xwiki/XWiki/AdminFieldsDisplaySheet.xml b/src/main/webapp/docs/xwiki/XWiki/AdminFieldsDisplaySheet.xml deleted file mode 100644 index fdfb0bcb4..000000000 --- a/src/main/webapp/docs/xwiki/XWiki/AdminFieldsDisplaySheet.xml +++ /dev/null @@ -1,79 +0,0 @@ - - -XWiki -AdminFieldsDisplaySheet - -en -0 -XWiki.AdminSheet -XWiki.Admin -XWiki.Admin - -xwiki:XWiki.Admin -1211800243000 -1275386737000 -1275386737000 -1.1 -AdminFieldsDisplaySheet - - - -Imported from XAR -false -xwiki/2.0 -false -{{velocity}} -### Sheet used to generically display the XWikiPreferences object fields in the administration sheets. -#if ("$!section" != '') - ## clean="false" due to bug #XWIKI-4122 - the <legend> element is dropped. - {{html clean="false"}} - <form id="$section.toLowerCase()" method="post" action="$xwiki.getURL($currentDoc, 'saveandcontinue')" onsubmit="cancelCancelEdit()"> - #foreach ($item in $legend) - #set ($fields = $params.get($item)) - <fieldset class="$item"> - #if($legend.size() > 1) - <legend>$msg.get("admin.${item}")</legend> - #end - #foreach($field in $fields) - #set($prop = $obj.xWikiClass.get($field)) - #set($title = $msg.get($field)) - #if ($title == $field && $prop) - #set ($title = $!prop.prettyName) - #end - <p> - <label #if($prop)for="${prefsclassname}_${obj.number}_${prop.name}"#end class="$field">$title - #if($field == 'skin') - #set ($skin = $xwiki.skin) - #if ($skin.indexOf('.') != -1) - &nbsp;<span class="buttonwrapper"><a href="$xwiki.getURL($skin)">$msg.get('admin.customize')</a></span> - #end - #end - #if($field == 'colorTheme') - #set ($colorThemeName = $xwiki.getXWikiPreference('colorTheme')) - #if ($colorThemeName.indexOf('.') != -1) - &nbsp;<span class="buttonwrapper"><a href="$xwiki.getURL($colorThemeName, 'inline')">$msg.get('admin.customize')</a></span> - #end - #end - </label> - #if ($prop) - $doc.displayEdit($prop, "${prefsclassname}_${obj.number}_", $obj) - #end - </p> - #end - </fieldset> - #end - <div class="hidden"> - <input type="hidden" name="form_token" value="$!{services.csrf.getToken()}" /> - <input type="hidden" name="xcontinue" value="$xwiki.getURL($currentDoc, 'admin', "editor=${escapetool.url(${editor})}&amp;section=${escapetool.url(${section})}&amp;space=${escapetool.url(${currentSpace})}")" /> - <input type="hidden" name="xredirect" value="$xwiki.getURL($currentDoc, 'admin', "editor=${escapetool.url(${editor})}&amp;section=${escapetool.url(${section})}&amp;space=${escapetool.url(${currentSpace})}")" /> - <input type="hidden" name="classname" value="XWiki.XWikiPreferences" /> - </div> - <div class="bottombuttons"> - <p class="admin-buttons"> - <span class="buttonwrapper"><input class="button" type="submit" name="formactionsac" value="$msg.get('admin.save')" /></span> - </p> - </div> ## bottombuttons - </form> - {{/html}} -#end -{{/velocity}} diff --git a/src/main/webapp/docs/xwiki/XWiki/AdminGeneralSheet.xml b/src/main/webapp/docs/xwiki/XWiki/AdminGeneralSheet.xml deleted file mode 100644 index ae4b01e2c..000000000 --- a/src/main/webapp/docs/xwiki/XWiki/AdminGeneralSheet.xml +++ /dev/null @@ -1,35 +0,0 @@ - - -XWiki -AdminGeneralSheet - -en -0 -XWiki.AdminSheet -XWiki.Admin -XWiki.Admin - -xwiki:XWiki.Admin -1211800256000 -1240316643000 -1240316643000 -1.1 -AdminGeneralSheet - - - -Imported from XAR -false -xwiki/2.0 -false -{{velocity output="false"}} -### Administrate general wiki preferences, at global level -#set($legend = ['language', 'editor', 'admin', 'smtp']) -#set($params = $util.hashMap) -#set($params.language = ['multilingual', 'languages' , 'default_language', 'dateformat']) -#set($params.editor = ['editor', 'core.defaultDocumentSyntax', 'xwiki.title.mandatory']) -#set($params.admin = ['admin_email']) -#set($params.smtp = ['smtp_server', 'smtp_port', 'smtp_server_username', 'smtp_server_password', 'javamail_extra_props']) -{{/velocity}} - -{{include document="XWiki.AdminFieldsDisplaySheet" /}} diff --git a/src/main/webapp/docs/xwiki/XWiki/AdminGroupsSheet.xml b/src/main/webapp/docs/xwiki/XWiki/AdminGroupsSheet.xml deleted file mode 100644 index 467291b42..000000000 --- a/src/main/webapp/docs/xwiki/XWiki/AdminGroupsSheet.xml +++ /dev/null @@ -1,119 +0,0 @@ - - -XWiki -AdminGroupsSheet - -en -0 -XWiki.AdminSheet -XWiki.Admin -XWiki.Admin - -xwiki:XWiki.Admin -1211800831000 -1267456765000 -1267456765000 -1.1 -AdminGroupsSheet - - - -Imported from XAR -false -xwiki/2.0 -false -{{velocity}} -### Globally administrate the groups in a wiki. -#set($formname = "update") -#set($saveaction = "save") -## -## Inject needed JS and CSS files -## -#set($jsService = $services.javascript) -#set($extJsParam = $jsService.createExtJSParam().setAction('file')) -#set($extJsParam = $extJsParam.setLazyLoad(true)) -$!jsService.includeExtJsFile($extJsParam.setJsFile(':js/xwiki/lightbox/lightbox.js'))## -$!jsService.includeExtJsFile($extJsParam.setJsFile(':js/xwiki/usersandgroups/usersandgroups.js'))## -$services.css.includeCSSPage(':js/xwiki/usersandgroups/usersandgroups.css')## -$!jsService.includeExtJsFile($extJsParam.setJsFile(':js/xwiki/table/livetable.js'))## -$services.css.includeCSSPage(':js/xwiki/table/livetable.css')## -## -## url to get the groups for displaying them in the ajax-based table -## -#set($url = $doc.getURL('get', 'xpage=getgroups')) -#if($xcontext.database != "xwiki") - #set($mainwk = false) -#else - #set($mainwk = true) -#end -{{html}} -<div id="xwikieditcontent"> - <table id="groupstable" class="xwiki-livetable"> - <tr> - <td class="xwiki-livetable-pagination" colspan="2"> - <span id="groupstable-limits" class="xwiki-livetable-limits"></span> - <span id="groupstable-ajax-loader" class="xwiki-livetable-loader"><img src="$xwiki.getSkinFile('icons/ajax-loader.gif')" alt="$msg.get('xe.livetable.loading')" title="" />$msg.get("xe.livetable.loading")</span> - <span class="pagination"> - <span id="groupstable-pagination-text" class="xwiki-livetable-pagination-text">$msg.get("xe.pagination.page")</span> - <span id="groupstable-pagination" class="xwiki-livetable-pagination-content" ></span> - </span> - </td> - </tr> - <tr> - <td class="xwiki-livetable-display-container"> - <table class="xwiki-livetable-display"> - <thead class="xwiki-livetable-display-header"> - <tr> - <th class="xwiki-livetable-display-header-text" scope="col">$msg.get("xe.admin.groups.groupname")</th> - <th class="xwiki-livetable-display-header-text" scope="col">$msg.get("xe.admin.groups.members")</th> - <th class="xwiki-livetable-display-header-text" scope="col">$msg.get("xe.admin.groups.manage")</th> - </tr> - <tr id="groupstable-filters" class="xwiki-livetable-display-filters"> - <td class="xwiki-livetable-display-header-filter"><label for="name" class="hidden">$msg.get("xe.admin.groups.filter.groupName")</label><input id="name" name="name" type="text" class="filter"/></td> - <td class="xwiki-livetable-display-header-filter"></td> - <td class="xwiki-livetable-display-header-filter"> - #if (!$mainwk) - <label for="wiki" class="hidden">$msg.get("xe.admin.groups.filter.scope")</label> - <select name="wiki" class="filter"> - <option value="local" selected="selected">$msg.get("xe.admin.groups.local")</option> - <option value="global">$msg.get("xe.admin.groups.global")</option> - <option value="both">$msg.get("xe.admin.groups.both")</option> - </select> - #else - <input type="hidden" value="local" name="wiki" /> - #end - </td> - </tr> - </thead> - <tbody id="groupstable-display" class="xwiki-livetable-display-body"><tr><td>&nbsp;</td></tr></tbody> - </table> - </td> - </tr> - <tr> - <td id="tdAddNewUserOrGroup"> - <span class="buttonwrapper"><a href="#" id="addNewGroup">$msg.get("rightsmanager.addnewgroup")</a></span> - </td> - </tr> - </table> - #set($addnewurl = $xwiki.getURL("XWiki.XWikiGroups", "view", "xpage=addnewgroup")) - #set($saveurl = $xwiki.getURL("XWiki.XWikiGroups", "view")) - #set($redirecturl = $xwiki.getDocument("XWiki.XWikiPreferences").getURL("admin", "editor=${editor}&section=Groups")) - <script type="text/javascript"> - //<![CDATA[ - (function() { - var startup = function() { - var callback = function(row, i, table) { return displayGroups(row, i, table, "$!{services.csrf.getToken()}"); }; - var ta = new XWiki.widgets.LiveTable("$url", "groupstable", callback); - Event.observe($('addNewGroup'), "click", makeAddHandler("$addnewurl", "$saveurl", "$redirecturl")); - } - if ((typeof(XWiki) != 'undefined') && (typeof(XWiki.widgets) != 'undefined') && (typeof(XWiki.widgets.LiveTable) != 'undefined')) { - startup(); - } else { - document.observe('xwiki:dom:loading', startup); - } - })(); - //]]> - </script> -</div> ## xwikieditcontent -{{/html}} -{{/velocity}} diff --git a/src/main/webapp/docs/xwiki/XWiki/AdminImportSheet.xml b/src/main/webapp/docs/xwiki/XWiki/AdminImportSheet.xml deleted file mode 100644 index bafc3e35e..000000000 --- a/src/main/webapp/docs/xwiki/XWiki/AdminImportSheet.xml +++ /dev/null @@ -1,30 +0,0 @@ - - -XWiki -AdminImportSheet - -en -0 -XWiki.AdminSheet -XWiki.Admin -XWiki.Admin - -xwiki:XWiki.Admin -1211801093000 -1212569671000 -1213892723000 -1.1 -AdminImportSheet - - - -Imported from XAR -false -xwiki/2.0 -false -{{velocity}} -## Administrate the wiki import. -{{html}} -#template('importinline.vm') -{{/html}} -{{/velocity}} diff --git a/src/main/webapp/docs/xwiki/XWiki/AdminInlineSheet.xml b/src/main/webapp/docs/xwiki/XWiki/AdminInlineSheet.xml deleted file mode 100644 index d918c1760..000000000 --- a/src/main/webapp/docs/xwiki/XWiki/AdminInlineSheet.xml +++ /dev/null @@ -1,73 +0,0 @@ - - -XWiki -AdminInlineSheet - -en -0 -XWiki.AdminSheet -XWiki.Admin -XWiki.Admin - -xwiki:XWiki.Admin -1212747498000 -1213088015000 -1213892723000 -1.1 -AdminInlineSheet - - - -Imported from XAR -false -xwiki/2.0 -false -{{velocity}}###---------------------------------- -## modified version of editinline.vm -###---------------------------------- -#if ($doc.fullName != 'XWiki.AdminInlineSheet') ## Prevents infinite loops - #set($formname = 'inline') - #set($saveaction = 'save') - #set($previewenabled = true) - #set($xnotification = $!request.getParameter('xnotification')) - {{html}} - <form id="inline" method="post" action="$doc.getURL('preview')"> - <div> - <div class="hidden"><input type="hidden" name="xcontinue" value="$doc.getURL('admin', "${request.queryString}&editmode=inline").replaceAll('&','&amp;')" /></div> - <input type="hidden" name="xredirect" value="$doc.getURL('admin', "editor=${editor}&section=${section}&space=XWiki").replaceAll('&','&amp;')" /> - <input type="hidden" name="form_token" value="$!{services.csrf.getToken()}" /> - <input type="hidden" name="xnotification" value="$!xnotification" /> - <input type="hidden" name="template" value="$!request.template" /> - <input type="hidden" name="language" value="$!doc.language" /> - #if("$!request.parent" != '') - <input type="hidden" name="parent" value="$!request.parent" /> - #end - #if("$!request.title" != "") - <input type="hidden" name="title" value="$!request.title" /> - #end - #set($force = $!request.get('force')) - #if(($doc.getLocked() == true) && (!$force)) ## locking - <div> - $msg.get('doclockedby') $xwiki.getLocalUserName($doc.getLockingUser()). <br /> - <a href="$doc.getURL('inline', "$!request.getQueryString()&force=1")">$msg.get('forcelock')</a> - </div> - #else - #foreach($class in $doc.xWikiClasses) - #set($nb = $doc.getObjectNumbers("${class.name}")) - <input type="hidden" name="${class.name}_nb" value="$nb" /> - #end - $doc.getTranslatedDocument().getRenderedContent() - <div class="bottombuttons"> - <p class="admin-buttons"> - <span class="buttonwrapper"><input class="button" type="submit" name="formactioncancel" value="$msg.get('cancel')" onclick="document.forms.update.action='$doc.getURL('cancel')'; if (document.forms.update.onsubmit) document.forms.update.onsubmit();" /></span> - <span class="buttonwrapper"><input class="button" type="submit" name="formactionsac" value="$msg.get('saveandcontinue')" onclick="document.forms.update.action='$doc.getURL('saveandcontinue')'; if (document.forms.update.onsubmit) document.forms.update.onsubmit();if(checkDocumentContent()) document.forms.update.submit(); return false;" /></span> - <span class="buttonwrapper"><input class="button" type="submit" name="formactionsave" value="$msg.get('saveandview')" onclick="document.forms.update.action='$doc.getURL('saveandview')'; if (document.forms.update.onsubmit) document.forms.update.onsubmit();if(checkDocumentContent()) document.forms.update.submit(); return false;" /></span> - </p> - </div> ## bottombuttons - #end - </div> ## form - </form> - #template('textarea_wysiwyg.vm') - {{html}} -#end -{{/velocity}} diff --git a/src/main/webapp/docs/xwiki/XWiki/AdminPresentationSheet.xml b/src/main/webapp/docs/xwiki/XWiki/AdminPresentationSheet.xml deleted file mode 100644 index d5d8677dc..000000000 --- a/src/main/webapp/docs/xwiki/XWiki/AdminPresentationSheet.xml +++ /dev/null @@ -1,41 +0,0 @@ - - -XWiki -AdminPresentationSheet - -en -0 -XWiki.AdminSheet -XWiki.Admin -XWiki.Admin - -xwiki:XWiki.Admin -1211800290000 -1214047286000 -1214047286000 -1.1 -AdminPresentationSheet - - - -Imported from XAR -false -xwiki/2.0 -false -{{velocity output="false"}} -### Administrate the presentation preferences globally and at space level. -#if("$!editor" == 'globaladmin') - #set($legend = ['header', 'panels', 'footer', 'skin']) -#else - #set($legend = ['header', 'panels', 'skin']) -#end -#set($params = $util.hashMap) -#set($params.header = ['title', 'meta']) -#set($params.panels = ['showLeftPanels', 'leftPanels', 'showRightPanels', 'rightPanels']) -#set($params.skin = ['skin', 'colorTheme', 'stylesheet', 'stylesheets']) -#if("$!editor" == 'globaladmin') - #set($params.footer = ['webcopyright', 'version']) -#end -{{/velocity}} - -{{include document="XWiki.AdminFieldsDisplaySheet" /}} diff --git a/src/main/webapp/docs/xwiki/XWiki/AdminProgrammingSheet.xml b/src/main/webapp/docs/xwiki/XWiki/AdminProgrammingSheet.xml deleted file mode 100644 index a61ee7977..000000000 --- a/src/main/webapp/docs/xwiki/XWiki/AdminProgrammingSheet.xml +++ /dev/null @@ -1,33 +0,0 @@ - - -XWiki -AdminProgrammingSheet - -en -0 -XWiki.AdminSheet -XWiki.Admin -XWiki.Admin - -xwiki:XWiki.Admin -1211801263000 -1212569686000 -1213892723000 -1.1 -AdminProgrammingSheet - - - -Imported from XAR -false -xwiki/2.0 -false -{{velocity output="false"}} -### Globally administrate the programming preferences. -#set($legend = ['programming']) -#set($params = $util.hashMap) -#set($params.programming = ['macros_languages', 'macros_velocity', 'macros_groovy', 'macros_mapping', 'notification_pages', 'documentBundles']) -{{/velocity}} - -{{include document="XWiki.AdminFieldsDisplaySheet" /}} - diff --git a/src/main/webapp/docs/xwiki/XWiki/AdminRegistrationSheet.xml b/src/main/webapp/docs/xwiki/XWiki/AdminRegistrationSheet.xml deleted file mode 100644 index cbdc5317d..000000000 --- a/src/main/webapp/docs/xwiki/XWiki/AdminRegistrationSheet.xml +++ /dev/null @@ -1,33 +0,0 @@ - - -XWiki -AdminRegistrationSheet - -en -0 -XWiki.AdminSheet -XWiki.Admin -XWiki.Admin - -xwiki:XWiki.Admin -1211801310000 -1212568742000 -1213892723000 -1.1 -AdminRegistrationSheet - - - -Imported from XAR -false -xwiki/2.0 -false -{{velocity output="false"}} -### Globally administrate the registration of new users in a wiki. -#set($legend = ['registration']) -#set($params = $util.hashMap) -#set($params.registration = ['use_email_verification', 'auth_active_check', 'validation_email_content', 'confirmation_email_content', 'invitation_email_content']) -{{/velocity}} - -{{include document="XWiki.AdminFieldsDisplaySheet" /}} - diff --git a/src/main/webapp/docs/xwiki/XWiki/AdminRightsSheet.xml b/src/main/webapp/docs/xwiki/XWiki/AdminRightsSheet.xml deleted file mode 100644 index de8131d59..000000000 --- a/src/main/webapp/docs/xwiki/XWiki/AdminRightsSheet.xml +++ /dev/null @@ -1,30 +0,0 @@ - - -XWiki -AdminRightsSheet - -en -0 -XWiki.AdminSheet -XWiki.Admin -XWiki.Admin - -xwiki:XWiki.Admin -1211801338000 -1213904460000 -1213904460000 -1.1 -AdminRightsSheet - - - -Imported from XAR -false -xwiki/2.0 -false -{{velocity}} -### Administrate the rights in a wiki (globally or per space). -{{html}} -#template('rightsUI.vm') -{{/html}} -{{/velocity}} diff --git a/src/main/webapp/docs/xwiki/XWiki/AdminSheet.xml b/src/main/webapp/docs/xwiki/XWiki/AdminSheet.xml deleted file mode 100644 index 00f36fed7..000000000 --- a/src/main/webapp/docs/xwiki/XWiki/AdminSheet.xml +++ /dev/null @@ -1,2918 +0,0 @@ - - -XWiki -AdminSheet - -en -0 -XWiki.XWikiPreferences -XWiki.Admin -XWiki.Admin - -xwiki:XWiki.Admin -1211801518000 -1294164055000 -1294164055000 -1.1 -AdminSheet - - - -Imported from XAR -false -xwiki/2.0 -false -general.png -14651 -XWiki.Admin -1284772798000 -1.1 -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 -YII= - -registration.png -12871 -XWiki.Admin -1284772797000 -1.1 -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 - -users.png -10532 -XWiki.Admin -1284772797000 -1.1 -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 - -export.png -16654 -XWiki.Admin -1284772798000 -1.1 -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 -AABJRU5ErkJggg== - -presentation.png -13548 -XWiki.Admin -1284772798000 -1.1 -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 - -templates.png -5760 -XWiki.Admin -1284772798000 -1.1 -iVBORw0KGgoAAAANSUhEUgAAAH0AAABVCAYAAABkf+t+AAAABmJLR0QA/wD/AP+gvaeTAAAWNUlE -QVR4Xuyav28bRxbH3yx/LkVySUWWJSuRFMQnC7LiGOcUcQK3BzssDkiKwK6MK6+41mUQ3B/gLt0h -XQykSZM0/gMSuwjgAx2kODvwD0VSQuoHRZGUqOW8vLfYLAYcrrjS0D4L2Sd88YZvVytgP/N9y51R -EhEhjj+XkvB/jlgx9Fgx9JjP7du358fHxydu3rz5AyIexNBPhsS9e/cmq9Xq7OnTp0uO45RqtfUZ -RKts27aTTqeLvZ47PjaWzyeTyWKn0ykVCt7YsSwr9+GH1+DgwGM9SarF0F+unDt37sxlMpmJcrlc -6vV6r21ubp7JZrNFlpSynMvZBQbHcl3XIahFAlew7Sxcu3YVvECAt5eXwc7lIChgMApq6rC+scGj -9Cvd3gUFvIJRq9Xya2trp376qTpXKpUdclepXq+fQRRlgln0XUfwxjx4BNYhYAUCVxRCWO++ewly -DMvnNDExoQBAleHQOqLkFApcTdTeIZ2GcSHEKgwJpIgO3Rwyi+OFAr979252aWlp/P79+7MEYqJY -LDp8/8l1U+w4BgcgSwTHA5dIsOt6RYa3svI8BRTvv38lgLC4uMQgNUj6rdNdSW4POxalHiTd4Xod -ESwA0nAWnJAVNgmSI4JtkRJ+HjoBKpVK6saNG2V6Vk3v7+9POY5TzOfzTqPRmBLCc12BcomgFXx4 -BSl73EbZdRmCB2fPnlVhwaVLl1QbAYZ7QXMdPUePClyP4e6O2M5DJ02GZEN4oJLlHyJEnJFjVE4X -dPNTt27d+lsul3ktmcyUafZPNJvNyWw2U0il0gUAdAhOPpVKMby8lFggqDZQpFJJIKcGOBYWFlSQ -rEggWbu7uwrsqNJBR4dt7u5nK78EtcbODjQaTVheWgSnWNSvg1CilIfwUIG7vg5IPV+HQ19ZWblQ -rf73o93dNrTb7Wan00p0u+4mUGxsbDRarVZya2tr+/r16+LKlQ8+vnz5vX9AxMBDqJDrWaFwIgdG -cqPhtcx/v+wUwA8aE+g3/pjATW3SfPnlVxUhsEKdLkkGCpyRSCTS9AjLgh/ff/9d9bPP/v0fvp0k -y89SUCBFKPSnT5++feHCO5/OzLweAg5BSum9Sjx+/AjOn1+OADs6NN3h0emg2Xm6w458DdSSQesP -dO7cwr+GPRY46rV6m1KR1CJhn9PDoe/s7GxSa4YhweAjwUA0gD3iiYFoANvsUaAlRIz+uNATCKHX -9rtddnfeL7mkru/43mHtnZx7/lmt9htMTk4eAlIydAPYRl1h9O5GHAY7grsjw1Z1rO8NQpD4xxuI -gIuULn+wmb/PN0ESrEOhz87O1n788WEYSEUYBvuktXJz2BGdz5AfPXoEhUIBTGJ7awvemJ0Fer6D -ZVmB61F6cNOklPpGFeWVbTPMfb+srsHK6irUNzah292Hc2+9ORB4Z3+PpRwShq1XBCDQS6EIdaZH -bOeo/AH0C6gyVoBikMOO6dAPJML8/DyYxD8//wI++fs1WDz7JvCKnyUYvGCvA4PWYEeA7u7t7bUo -j/XD+Pqbb+F/j3/2XO66rg9dB7Za+xV+Xnnmg9ChowoS9Vog1OraNY2vqwCRqLRf6Pvsj6V/DINj -ynnQdx5CX03CpJ2Av75zAegew/r6Ohw1eML8Wq9Dq7UL+3SNTDoNVtJSfaDCFlGdDvQasI2IY/31 -melphq66ghUxYqlkaLHp2I5Hfnvqdr03qB6NE4CarY/qdHLxQYMZ99e5lcQxGj148MBz+9TUVFDb -3t723H/16tWhk0dKBNn3RRCkwYYLraztQBwvVKVSiYEzZHZ8kKnO8Fmh7R2ETx5Z6nKcAfRmk5eF -9LCz5k6Ppbd4dr0KnDMrNFD/KLwiHhs6L+9tDarPnJmGkUWswNEXL15kp3uKGqjIG6Ew2k/nNfDt -Yy85I0Y7LwYeuPrJkydc4mc8j7kD8DisvWvofeZG0PkPNrrdLtD+tMISAUe1dBrLc/egWFxcjOxz -NQlAM+hzc3PPeRbyUqwKc2Z6ymDpNNZIhSNu751OZ3sQTNu2+3EfD3gso8UZHETftL03m82tl/Jg -jr+5Gxi9b7PGtL27rvtbq9WGU6eAQ3N7u90G41A7CR62di60IzjgZK2EIXV1P0CcSKcHBleBCzBs -75VK5dnDh1XQA/m5zkuxEV4mwkFjP3ivICjhgAkhNGjBuTi4LoRQjmlwtQ0ROv+EOV3lru74GEAn -bR7vnxDCkSOiAl1QliSvAD53fTfLOyZCrifUgtIPRLDfTAO/bnk1v6pNEDyhbx76TqEZ9K6UskPZ -DmAa7Fur4Fk9KT1568c96dcBJAn6d7Ck6koVMWg1ZMgkyyIJizKLgbPAnwTKhKB64HREHr3s9/Sj -dgdlrR772ruXhQl06HT2GgBo97u7rC4PRtxlQ/7ZeQ540GbQHvCxU38BK5WHng9dkny23jleJ5DB -tuWAayotXOniDLLruuC6PUgQzGQiARaLISvabe9RHcCbGMpVX/AWWzChHcdhmV4OULO6AfTfqbuW -3jauK/zNi6RIynpSlPWwY8m1I8eoC9sJ3EVRZNWN+wO6yL7/okV/QFF0UaC7Ft1k102DLJo2CNC0 -QV6NLKeOZFm2/KAkkqZIShQfM+Qtv8v4YuTRiJxyxkU+4HpGHtOA5tP5zjn3nHNlGsa+EPAk5pMT -E8FfkQAWDz7A6/FNIDGBX737GD/9+W/x5q1biAKbj5/iyU4eI4k44rE4YjELhq4rwonP726oXiLR -exYZ5+1WA06zIVvMaraOra0taeWVSgUvI5vN0qJPKtBwqfhDvEy4FgLptuNUESIs0QB0S5rktUUd -hdIh1tfXETYuX76MavUAudwOUqkkkokE4vEY6wkgr6lkSvbX247dU4cXMh8V5wLIpOO4ffttuMGN -ryBY+/oeN80wMz15clCKEEiv1WoHPmY79N779l4d32u35ZBCFGg0m6jy/1bbwx1YpikJTsQTICj/ -um7A0AWEoVKeKKB8IC27Wg1uS4uLi/jy7j08K+zjJz/+ocp4IMKVd1pG+aSAbfnCa0MHdOezI+p+ -ampKrn548uSJ/OYJ7hNwHMn1OQ5iyEUYpoV2RyA9Ooozo2mkkyOSUnfFmLNolFuhOj2j8uuKlqH8 -eDGfx8b9TRxWSrCdtmqEClXeW61WOdh82OAo1xzMeMjqj42NDbjg+7n6UR2tZgul5yU4rSaa9STH -qGRU/wIdVy9c9EBfS6c1n4Z8oYAPP/kCX3yzhanJCSRHEr3MBFooO3Jq/10RGm5/O+VdkZ5Opwdp -CebWcAB3oAiF8HshIrhhL2SncPncHFY3t7H7vIyAUIRnMhkVrOXzeY5Rox9GUmksXljC+eVlvDZ/ -Fufm5xikMj0NZUeOYLBTLO+XMTY+7knZhsW1JUUyCadMS7nN5XK8ul0M5ubmeH2hPn6ugM+U5Zum -hUQyKQO2dColVyxmMk7xsB4El8/PITs5jtcdJwDpHosm0bR49i3wB4BXFmBIvu9nmHbGEiMYSaaR -Sp+hm5Dqpek6JMTwO3IkY7dl254HkyS9j9T3M5/VrQO8+RYU2DhA8kkw7+mvWdGj5JFI+nA+J7E7 -OzvoB8exUe9+5ihmwjR0mfPHLEtaxTCgtNLS7z16hsnRFARdTOUAQRGPx0k6r8rieT1N4jXdgGlZ -iMXjiCcSSPTk3bUbKUKJ3iseQgNuw/a3dAWSydyVBQWSTCtVPwB0AQHAl6GmP8JEuVrDv9Y2MN4l -/PaPboL4w18+RADQykk2CaZ1M0AdyNI1tcWsQ+OOI68vGbgYknRaWMkz69Vv3ipQIOcP0zQp83K5 -wE4eT8RO63/VsB0HLdvhrt7/auG8utvTlKUHyAm829HDkn716tVHxWIBmelpD6FM29bvbyqzFkME -cu7NChLK1IwBG617eXlZyTsxoLyrUWpeo8BhvYF3//qxDBZ/cOk1rFxYwN8+W0OuuA8fqO+RKyx4 -08zOcKR3z3YprN2540fo6ZYfTN4p6SqQI0g4wa8pbXwWpDjBQG7EG8hJCQ0bFxfOIm5ZmJ2a6Eu6 -kvDgwd/JL15TChza6VL1dqfTpCr1o9k7j4tBAzmmYu6M4SQ3o/4d5b1P9B44kGMEvLK0iN1iGeXD -I5ybzcjdu/tPchhPJzGXmcT6do5yzuhdWvnjvSKyk2Mykv/H6j1MnElje6eA65cvIFfY9yM/sIT3 -F3i3vItQSEejUa8CyBwL1IQ3bVPPgqdslHK5BgXlPUxcOj+PK0vnkJkYx9r9R7h55SKI/H4F17rS -PTMxBmKvVMGNlWUQf3r/I7x94ypilolPv7Zxd+sprlxY6JK+hDeWbPzxvY8QFbyGrjx8KKQzAi4D -IqNiOZWrjymyh9iRC4pI5L18cNhdNewUS9LSc4USLNPAUaOJR7m8vN8/OESt3sB+9RCl7iIePN1F -dmpc5eu7z/dl+vZopxC9vMMr7xDhkE6ZLPch1O8IrkEDOSXZARCqvD/be47CflUWX4hP1tbViDEJ -fJjLqyaP9//5b1n3Jz6794B/Ly3+3Ow0Pvj0Dv780acQwr+BhFH7wsJC4A5iWSOAcDdERifvrZZT -DRaoiaDyriLy7yrSI4neNZno2zXEItHe3l5g0ufn578tELU5pqy6ijRoIcu7t7yqpPxsNhvgVCXf -QO47i5hp4ubKMg6OGvj7F2tIJRKnR+5CqIoeMxMSGIT4UqkklctuNtHqrrbjSMXRaetaSPLuLa8K -N+eMQofanJGWHq68E69MMRitLy/Mgvhq4yGqtcZAEs20k10zVDc36alUSq7TcFQ7RKtxhMZRTR5I -0Gm3oZsaBFysd0KJ3hvlfqSqx0EDudDlPfo83bIMjKdTDOZkINe0ncGjbSFoRDQY+naPpVP6T8Mb -ly5isd7E+NQUhN3snUChYjkxzHy6t7xqt2xu9Hvm1P0JFwFKq2Ei+oLLjdeXsTSflYR/fGc9iEQr -P8wt5uvXryMobrn6CX/569+hclBDZtICQpZ3yu5OuVJxHXMt5Do7O3P6IXdiYHmnC5EVtQGg8nm6 -A7oFH3n3tXRuzQ6Dlu2obdjIGir8oerwT3O7sh1senI8/Ohd1/WiR8fl6hPERRzIsexKiSwWi3QP -siTrglImVqTqjQZJl23VsVgcw+DLb7bwOVO1QA5NQ75axy9+83tsrq/jre+v0NKHbYH2kB1a9M6D -fxXLbkMOHMT5W3o7WIOk+syDBw+wsrJCpWAblScYpLx3xkYxPZ2V0W6z2VCnTr9qGLEEMnMLsNsC -o+MTqufPp7uGp3YOSLg7Vw8vZcuzwuX13UzbvBI/qL6rQK6/vNOSuTwlVlbg+OL4jAUJku8OCJOp -FLtfZV48OzMje+D/X2D9e3T0DDLZLJLJOFzgDyItXhVjqGD9oHk25XgXEunvvPPOw9XVryC8pNK3 -+OXqUQdyVAYSr3rrXp6idWxbBVmUdgmNmUJTtkC/QqjeesMwSShdj7t6Rt/Oxgr1NRVA+Xsfn07a -hWI9XHknakIIG4Cl2BzAp4uI5V11wQaP3l2ka6+UeVq7HK/Sdc859+o6aKu0BiJcefeeKSemXiY1 -EY/7Gnih0sR/HleO5agzLQdIuoYdEB1aThsH9SYMq4GOZqDVASzTljJrw0QLOrYLJapFd1mwTAu6 -oXvHmgUgTvsFPH4xjXccW6aRR40W7Ljm7uV3WS9U61R/SydEFPKuBhmrEJgSOI7Z7Ixvns5m/FrT -cb8DVahQww7RQQ0Jtrk6HTjttpRYraPzvrs6TL/klGsHgCMAo60rKQ4ZJF0tCM9vkfJYfj9L1zTX -i9UQurzDMozyCT791DydE6KUVTc0Bwrb+TquJZPy97ZEgWQqienMNMZGRzHavR9JJmRjhE7f2rvK -3TXL7C3T4HizZDwS0kmOJvhOKPPKnw/jLNwKo/7QNKGFQnrTtssgAvh0vkDL0I5ZXqUZQ6lSAyxD -BmCiXcPufoX5sxotch+9raxD/eWAr2O3iGKpzP9Xjiw3bBtoaGgZnF0jqS1yi7hlSuJNU4fRXT1f -qyEizqEJnaTTIIaurWvai3ekQrpw5f2IO/3ePJ1pkE+eLnqWZByf+l4b/xlW2x1wW7e1YuPxZgnN -u+/BtjlL7qgqFK9cspTY7t13ROfU6UxNpUY6Uze2QNFfy2VJn22SVD5n67D034m4BcM03PPrEZIu -viVdJ+lDt05RjYQycS10eWeqUTrJdycScV+J13XQgjzjtEIHDN3sLlDqaG2S8DYJp8VD8KqI7hw7 -sEAMlBqRXBJpmrTkHrHG8UMJ1AkVhqGre/CZCuSik/cQWvGVpRMi3G1YVQWruKzYtfwl3tCUvCsI -ofEBOt1FSY1bBtpt61uClcT3lERK/rE1cE6sK1INN6nKV2vHyFf3/23vbHqjhoEw7HGyWbr9ALZa -OAEnQOJExYV7/1LF3+EPcEAc+AuISvRWThwqUcEBWkpbSttsPCTi1TLZSZS6TqpKpBrLydtJt+rj -Gcdy0hFR3l16H0S2pfROBYEu0/tJ9ZzOGjgkzOm2uihPZAEyRgQzglj00p+9l8T/oBJuzspAock7 -dXncTXq3mNPbSe9gINM7B0DX5vbzed2MFkYl5g/u38t3tb5Uz+m2WBcDugYvemEqVQWaglpf9ABR -3iV0pPci66hdNq83ZIoqWiQ07mKdPpnc3S3e914AdIEIpjWZ3rVR4/v/rA98UJe7BtcOWZfBlCM9 -aJeNiGaBg8P2oGNEqjldA2fZibv33uTdexJHpo2/iqVyppwtax2HQ8erRT/W1tYAusR8/kTO6fPp -vYdO1gyLvYCMPdfpesNFTlvMLa/TUe14Z2/vu1kdj5v3W+SSLSIodNEKRvBtMOnLHr5K1KcAhF7W -XRPH+CaL+bROgz/q07I5nUZmRBy8Tk8zxlr9bz8L9Lagr6+v721tfchyIQJY0aofqLgxSMzNpWWo -cNIQtN40EDjEV0OX/gxorOquGZxLsAw/5aOvh48lzkEPTMJpeHq3cTna216nY6etmNfH1Y9Mseom -t1fzNlY6BA1bO0GRuvbVKvR6TZ0GaVCa/TAI2JnDoyPz6s1b8/HTTu3I1Kf6v3Zaa5vSO6P5Q8dT -sUfG8FhVea2Bqvg2AFR8ta59tQodmjewgAEkYGsNhqK4K8sr5vmzp+bJ44fVfhpk5f7DZHyr7ho3 -B5svBT1JBj91kHMzqI5ga11oPsBCNQGjRlNgiUwOftGsLC1CUylagb7ogMAj3hnAu6BIT9PpQUUp -ZzkArk0qD4cYonllAA1bg/QaFEQRo2Z6Cvh86Ujf3Hz/msi+2939PCoE5zI6PjweUBTx9vZ2Np2e -2yxzVOhZxoSi+sXyYokuvEHtmjZ+kjiOhuqS2qu5IXsl+ndj9OzUz2x4/SvJ29Cw77WwuS3SOBks -e/3JLOHp5f39vDvJ25kC7wt9Y+PFS9TkPmDmtACJ8yGKtI/QEuj9Iv1qjREC07ydAvw5zt2loDPz -QU1opgDM+ABZnd+g761bY9FnBWy0MwF9ZnHABgITkQNoBvxTUbC9t6s3FuBlcwWvYOgA74hIfpCs -zn/1Ud4DLy/Z0AvgCnpQxIsP6+0amIKtoYeDh8A9gOtvcQ/g//v6A5oBi1cqpeH7AAAAAElFTkSu -QmCC - -groups.png -13294 -XWiki.Admin -1284772798000 -1.1 -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 -FwAAAABJRU5ErkJggg== - -programming.png -15690 -XWiki.Admin -1284772797000 -1.1 -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 -mcs8AAAAAElFTkSuQmCC - -import.png -17661 -XWiki.Admin -1284772797000 -1.1 -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 - -rights.png -13595 -XWiki.Admin -1284772797000 -1.1 -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 -WAP4i9ywscF/axyXL5fOHAQAAAAASUVORK5CYII= - - -XWiki.AdminSheet -0 -XWiki.JavaScriptExtension -4e754542-66c4-41c6-816a-96ed94c54205 - -long - - -/* Administration application custom JavaScript */ - -function showAdminSections(e) { - $('admin-page-menu').style.display = "none"; - rmClass($('admin-page-menu'), "hidden"); - toggleClass($('showsectionswrapper'), "hidden"); - toggleClass($('hidesectionswrapper'), "hidden"); - if (!eltHasClass($('admin-page-menu'), "alreadyMoved")) { - $('admin-page-menu').parentNode.insertBefore($('admin-page-menu'), $('admin-page-content')); - addClass($('admin-page-menu'), "alreadyMoved"); - } - Effect.SlideDown('admin-page-menu', { duration: 0.7 }); - Event.stop(e); -} - -function hideAdminSections(e) { - toggleClass($('showsectionswrapper'), "hidden"); - toggleClass($('hidesectionswrapper'), "hidden"); - $('admin-page-menu').style.display = "none"; - Event.stop(e); -} - -function goTo(e) { - var select = $('goto-select'); - var i = select.selectedIndex; - if (window.location != select.options[i].value) { - window.location = select.options[i].value; - } -} - -Event.observe(window, 'load', function() { - if($('showsections')) { Event.observe($('showsections'), 'click', showAdminSections, false); } - if($('hidesections')) { Event.observe($('hidesections'), 'click', hideAdminSections, false); } - if($('goto-select')) { Event.observe($('goto-select'), 'change', goTo, false); } -}); -Administration application javascript - - -0 - - -onDemand - - - -XWiki.AdminSheet -0 -XWiki.StyleSheetExtension -672fe873-2dc7-4ae0-9826-fb75e67eb350 - -long - - -/* Override xwiki.js */ - -.hidden { - display: none !important; -} - -/* Override userandgroups.css */ - -.display td, #specialusersandgroups td { - border: 1px solid #7c7c7c !important; -} - -#userstable td, #groupstable td, #usersandgroupstable td, #alldocstable td { - border-color: transparent; -} - -#userstable, #groupstable, #usersandgroupstable, #alldocstable { - border-color: transparent; -} - -/* Additions */ - -#admin-page-header .submenuitem a, #admin-page-header .submenuitem a:link, #admin-page-header .submenuitem a:visited, #admin-page-header .submenuitem a:active { - display:block; - float: none; - width: 100%; - font-size:0.8em; - font-weight: bold; - text-decoration:none; - height:auto; - padding:2px 0 0 0; - line-height:1.2em; - border: 0; - text-align: left; - color:#FFF; -} - -#admin-page-header .submenuitem a:hover { - text-decoration: underline; - background-image: none; -} - -#admin-page-header { - color: #FFF; - padding-top: 5px; - padding-bottom: 5px; - background-color: #AFAFB5; -} - -.admin-page-header-spacer { - clear:both; - height:5px; -} - -h1#admin-header { - float:left; - line-height: 46px; - margin-left: 20px; - font-size: 2em; - font-weight: bold; - margin-top: 0px; - overflow:hidden; -} - -#change-context { - float:right; - margin-right:20px; - width:300px; - font-size:12px; - line-height: 22px; - text-align:right; -} - -#goto-globaladmin a { - color: #808085; - font-weight: bold; -} - -#admin-page-menu { - clear: both; - width: 100%; -} - -#admin-icons { - float: left; - width: 100%; - margin: 0px; -} - -#admin-icons li { - list-style-type: none; - display: inline-block; - width: 125px; - margin: 15px; - text-align: center; - vertical-align: top; -} -/* For IE6/7, which don't really understand inline-block on block elements */ -* html #admin-icons li { - display: inline; -} -*+html #admin-icons li { - display: inline; -} - -#admin-icons li a { - display: block; - background-position: 50% 0%; - background-repeat: no-repeat; - width: 124px; - font-weight: bold; - color: #808085; - text-decoration: none; -} - -#admin-icons li a img { - display: block; - height: 85px; - text-decoration: none; - border: 0; -} - -#admin-page { - width: 100%; -} - -#admin-page-content { - background-color: #F9F9F9; - margin: 0px auto; - margin-top: 10px; - padding: 5px; - clear: both; -} - -#if($xwiki.getBaseSkin() == "albatross") -h1#admin-header { - margin-bottom: 0px; -} - -#showsectionswrapper, #hidesectionswrapper { - float: right; - margin: 0px; -} - -.rightmenu .submenu .submenuitem { - border: 0px; - margin: 0px; - padding: 0px; -} - -.rightmenu #tmAdmin a strong { - padding: 0px !important; -} - -#admin-page .bottombuttons { - background: transparent !important; - margin: 0px auto !important; - margin-bottom: 10 px !important; -} - -.bottombuttons .buttonwrapper { - display: inline; -} -#end - -#admin-page-content #xwikieditcontent { - background-color: transparent; -} - -#admin-page-content fieldset { - border: 0px; - border-bottom: 3px solid #FFF; - margin-bottom: 10px; -} - -#admin-page-content fieldset p { - width: 80%; - display: block; - margin-bottom: 10px; - padding-left: 10px; - padding-right: 10px; -} - -#admin-page-content fieldset legend { - color: #606B72; - font-size: 1.5em; - font-weight: bold; - padding-top: 10px; - padding-left: 10px; -} - -p.legend { - width: auto !important; - padding: 0px; - margin: 0px; - color: #606B72; - font-size: 1.5em; - font-weight: bold; - margin-bottom: 10px; -} - -#admin-page-content fieldset p label { - width: 30% !important; - float: left; - color: #4A4A4B; - font-weight: bold; - clear: left; - margin-bottom: 10px; - padding-left: 10px; - padding-right: 10px; -} - -#admin-page-content fieldset p input, #admin-page-content fieldset p textarea { - width: 65%; - margin-left: 10px; - margin-bottom: 10px; -} - -/* Checkboxes are centered in some browsers without this. */ -#admin-page-content fieldset p input[type=checkbox] { - width: auto; - margin: 0 0 0 10px; -} - -#admin-page-content fieldset p select { - width: 30%; - margin-left: 10px; - margin-bottom: 10px; -} - -#goto-select { - clear:both; - width:290px; -} - -#goto-select optgroup { - margin: 6px; -} - -#usersandgroupstable-filters #name { - width: 65%; -} -Administration application stylesheet - - -1 - - -onDemand - - -{{velocity}} -##************************************************************************************************** -## Administration Sheet,used to display a common UI for some wiki features (presentation, users, -## groups, rights etc.) at global / space level and also for several applications. -##************************************************************************************************** -#if($xcontext.action == 'view') - $response.sendRedirect($xwiki.getURL($doc.getFullName(), 'admin', $request.getQueryString()))## -#else - ##---------------------------------------------------------------------------- - ## hard-coded links to app. admin pages which appear at global/space level - ## TODO: replace this when the new IX are ready - ##---------------------------------------------------------------------------- - #set($globalAppAdmin = ['Panels.PanelWizard', 'Photos.Links', 'XWiki.OfficeImporterAdmin']) - #set($spaceAppAdmin = ['Panels.PanelWizard']) - ##----------------------------------------------------------------------------- - ## some applications at space level (like Panel Wizard) might require a different type of - ## integration to allow users with space admin rights to use them, so they will have a - ## "/xwiki/bin/Space/WebPreferences?section=application" type of url, while some at global level - ## need to use a "/xwiki/admin/App/Settings" type of url, to be edited inline - ## inside the administration application UI. - ##------------------------------------------------------------------------------ - #set($hasAdminActionUrl = ['Photos.Links']) - #set($section = "$!{request.section}") - ##------------------------------------- - ## determine the displayed sections - ##------------------------------------- - #set($jsService = $services.javascript) - #set($extJsParam = $jsService.createExtJSParam().setAction('file')) - #set($extJsParam = $extJsParam.setLazyLoad(true)) - $!jsService.includeExtJsFile($extJsParam.setJsFile(':js/scriptaculous/scriptaculous.js'))## -## $xwiki.jsx.use('XWiki.AdminSheet')## -## $xwiki.ssx.use('XWiki.AdminSheet')## - #if($editor == 'globaladmin') - #set($currentDoc = 'XWiki.XWikiPreferences') - #set($sections = ['General', 'Presentation', 'Registration', 'Programming', 'Rights', 'Users', 'Groups', 'Import', 'Export', 'Templates']) - #set($discard = $sections.addAll($globalAppAdmin)) - #elseif($editor == 'spaceadmin') - #set($currentDoc = "${currentSpace}.WebPreferences") - #set($sections = ['Presentation', 'Rights']) - #set($discard = $sections.addAll($spaceAppAdmin)) - #end - #if($section != '' && $section.indexOf('.') > 0) - #set($sectionname = $xwiki.getDocument($section).getDisplayTitle()) - #elseif($section != '') - ## If there is no translation (translated message is equals to key), don't display the message key, but the section name instead. - #if($msg.get("admin.${section.toLowerCase()}") != "admin.${section.toLowerCase()}") - #set($sectionname = $msg.get("admin.${section.toLowerCase()}")) - #else - #set($sectionname = $section) - #end - #end - ##----------------------------------------- - ## admin-page display - ##----------------------------------------- - {{html clean="false"}} - <div id="admin-page"> - <div id="admin-page-header"> - <div class="admin-page-header-spacer">&nbsp;</div> - <h1 id="admin-header">#if($section == '')$escapetool.xml($msg.get("admin.${editor}"))#else $escapetool.xml($sectionname)#end</h1> - <div id="change-context"> - <label for="goto-select" class="hidden">$msg.get('admin.placetoadminister')</label> - <select id="goto-select"> - #if ($xwiki.hasAccessLevel('admin', $xcontext.user, 'XWiki.XWikiPreferences')) - <optgroup label="$msg.get('admin.gotoglobaladministration')"> - <option value="$xwiki.getURL('XWiki.XWikiPreferences', 'admin')" #if("$!{editor}"=="globaladmin")selected="selected"#end>$msg.get('admin.globaladministration')</option> - </optgroup> - #end - <optgroup label="$msg.get('admin.gotospaceadministration')"> - #foreach($spaceitem in $xwiki.spaces) - #if ($xwiki.hasAccessLevel('admin', $xcontext.user, "${spaceitem}.WebPreferences")) - <option value="$xwiki.getURL("${spaceitem}.WebPreferences", 'admin')" #if("$!{currentSpace}" == ${spaceitem} && "$!{editor}" != 'globaladmin')selected="selected"#end>$escapetool.xml($spaceitem)</option> - #end - #end - </optgroup> - </select> - #if($section != '')<br/><span id="showsectionswrapper" class="buttonwrapper"><a id="showsections" href="$xwiki.getURL($currentDoc, 'admin')">$msg.get('admin.showsections')</a></span> - <span id="hidesectionswrapper" class="hidden buttonwrapper"><a id="hidesections" href="$xwiki.getURL($currentDoc, 'admin')">$msg.get('admin.hidesections')</a></span>#end - </div> ## change-context - <div class="admin-page-header-spacer">&nbsp;</div> - </div> ## admin-page-header - #if($section != '') - <div id="admin-page-content"> - <div class="$escapetool.xml($sectionname)"></div> - ##------------------------------------------------------------------------------------------------------------ - ## The Administration allows editing other pages from different applications inside the admin context (UI) - ##------------------------------------------------------------------------------------------------------------ - #if("$!{request.editmode}" == 'inline' && $xwiki.exists($section)) - $xcontext.setDisplayMode('edit') - {{include document="XWiki.AdminInlineSheet" /}} - ##includeForm('XWiki.AdminInlineSheet') - ##-------------------------------------------------------------------------------------------------------------- - ## The Administration app., along with its default sections, dynamically includes and display pages from apps. - ## (hard-coded links). TODO: replace the hard-coded links by Interface Extensions - ##-------------------------------------------------------------------------------------------------------------- - #else - #if($xwiki.exists("XWiki.Admin${section}Sheet")) - ## Custom XE administration section - #includeForm("XWiki.Admin${section}Sheet") - #elseif($xwiki.exists($section)) - ## Application section - #if($hasAdminActionUrl.contains($section)) - $xwiki.getDocument($section).getTranslatedDocument().getRenderedContent() - #else - #includeForm($section) - #end - #end - #end - #includeForm("XWiki.ConfigurableClass") - </div> ## admin-page-content - #end - <div id="admin-page-menu" #if($section != '')class="hidden"#end> - <ul id="admin-icons"> - #foreach($asection in $sections) - #if($xwiki.exists($asection) || $xwiki.exists("XWiki.Admin${asection}Sheet")) - #set($aiconurl = '') - #if($asection.indexOf('.') > 0) - #set($adoc = $xwiki.getDocument($asection)) - #set($atitle = $adoc.getDisplayTitle()) - #if($adoc.getAttachment('icon.png')) - #set($aiconurl = $adoc.getAttachmentURL('icon.png')) - #end - #else - #set($adoc = $xwiki.getDocument("XWiki.AdminSheet")) - #set($atitle = $msg.get("admin.${asection.toLowerCase()}")) - #set($aiconname = "${asection.toLowerCase()}.png") - #if($adoc.getAttachment($aiconname)) - #set($aiconurl = $adoc.getAttachmentURL($aiconname)) - #end - #end - #set($query = "editor=$escapetool.url(${editor})&amp;section=$escapetool.url(${asection})") - #if($editor != 'globaladmin') - #set($query = $query + "&amp;space=$escapetool.url(${currentSpace})") - #end - #set($dotindx = $asection.indexOf('.')) - #if($dotindx > 0) #set($name = $asection.replaceAll("\.", "_")) #else #set($name = $asection) #end - #if($asection == 'Import') - #set($url = $xwiki.getURL('XWiki.Import', 'import', $query)) - #elseif($asection == 'Export') - #set($url = $xwiki.getURL('XWiki.Export', 'export', $query)) - #elseif($xwiki.exists("XWiki.Admin${asection}Sheet")) - #set($url = $xwiki.getURL($currentDoc, 'admin', $query)) - #elseif($xwiki.exists($asection)) - #if($hasAdminActionUrl.contains($asection)) - #set($url = $xwiki.getURL($asection, 'admin', $query)) - #else - #set($url = $xwiki.getURL($currentDoc, 'admin', $query)) - #end - #end - <li class="${name}"><a href="$url"><span>#if("$!aiconurl" != '')<img src="$aiconurl" alt="$name icon" />#end#if("$!atitle" != '')$atitle#else$name#end</span></a></li> - #end - #end - #set($section = '') - #set($doNotUnlockConfigurableDocuments = true) - #includeForm('XWiki.ConfigurableClass') - </ul> - </div> ## admin-page-menu - </div> ## admin-page - {{/html}} -#end -{{/velocity}} diff --git a/src/main/webapp/docs/xwiki/XWiki/AdminTemplatesSheet.xml b/src/main/webapp/docs/xwiki/XWiki/AdminTemplatesSheet.xml deleted file mode 100644 index 44b8c7c2d..000000000 --- a/src/main/webapp/docs/xwiki/XWiki/AdminTemplatesSheet.xml +++ /dev/null @@ -1,52 +0,0 @@ - - -XWiki -AdminTemplatesSheet - -en -0 -XWiki.XWikiPreferences -XWiki.Admin -XWiki.Admin - -xwiki:XWiki.Admin -1274777649000 -1274777649000 -1274777649000 -1.1 -Admin Templates Sheet - - - -Imported from XAR -false -xwiki/2.0 -false -{{velocity}} -= $msg.get('admin.templates.createprovider') = - -{{html}} - <form action="$doc.getURL('create')" method="post"> - <div> - <input type="hidden" name="form_token" value="$!{services.csrf.getToken()}" /> - <input type="hidden" name="parent" value="XWiki.TemplateProviderClass"/> - <input type="hidden" name="template" value="XWiki.TemplateProviderTemplate"/> - <label for="space">$msg.get('admin.templates.createprovider.space')</label> - <input type="text" id="space" name="space" value="XWiki" size="8"/> - <label for="page">$msg.get('admin.templates.createprovider.page')</label> - <input type="text" id="page" name="page" value="$msg.get('admin.templates.createprovider.defaultdocname')" class="withTip"'/> - <input id="createTemplateProvider" type="submit" value="$msg.get('admin.templates.createprovider.create')" class="button"/> - </div> - </form> -{{/html}} - -#set($availableProviders = $xwiki.searchDocuments(", BaseObject obj where doc.fullName=obj.name and obj.className='XWiki.TemplateProviderClass' and doc.fullName!='XWiki.TemplateProviderTemplate'")) -#if($availableProviders.size() > 0) - -= $msg.get('admin.templates.providerslist') = - - #foreach($providerFullname in $availableProviders) - * [[$xwiki.getDocument($providerFullname).getTitle()>>$providerFullname]] - #end -#end -{{/velocity}} diff --git a/src/main/webapp/docs/xwiki/XWiki/AdminUsersSheet.xml b/src/main/webapp/docs/xwiki/XWiki/AdminUsersSheet.xml deleted file mode 100644 index 63905dfd5..000000000 --- a/src/main/webapp/docs/xwiki/XWiki/AdminUsersSheet.xml +++ /dev/null @@ -1,123 +0,0 @@ - - -XWiki -AdminUsersSheet - -en -0 -XWiki.AdminSheet -XWiki.Admin -XWiki.Admin - -xwiki:XWiki.Admin -1211801430000 -1267456606000 -1267456606000 -1.1 -AdminUsersSheet - - - -Imported from XAR -false -xwiki/2.0 -false -{{velocity}} -### Globally administrate the users in a wiki. -#set($formname = "update") -#set($saveaction = "save") -## -## inject needed JS and CSS files -## -#set($jsService = $services.javascript) -#set($extJsParam = $jsService.createExtJSParam().setAction('file')) -#set($extJsParam = $extJsParam.setLazyLoad(true)) -$!jsService.includeExtJsFile($extJsParam.setJsFile(':js/xwiki/lightbox/lightbox.js'))## -$!jsService.includeExtJsFile($extJsParam.setJsFile(':js/xwiki/usersandgroups/usersandgroups.js'))## -$services.css.includeCSSPage(':js/xwiki/usersandgroups/usersandgroups.css')## -$!jsService.includeExtJsFile($extJsParam.setJsFile(':js/xwiki/table/livetable.js'))## -$services.css.includeCSSPage(':js/xwiki/table/livetable.css')## -###set($ok = $xwiki.ssx.use("XWiki.XWikiUserSheet")) -###set($ok = $xwiki.jsx.use("XWiki.XWikiUserSheet")) -## -## url to get the users for displaying them in the ajax-based table -## -#set($url = $doc.getURL('get', 'xpage=getusers')) -#if($xcontext.database != "xwiki") - #set($mainwk = false) -#else - #set($mainwk = true) -#end -{{html}} -<div id="xwikieditcontent"> - <table id="userstable" class="xwiki-livetable"> - <tr> - <td class="xwiki-livetable-pagination" colspan="2"> - <span id="userstable-limits" class="xwiki-livetable-limits"></span> - <span id="userstable-ajax-loader" class="xwiki-livetable-loader"><img src="$xwiki.getSkinFile('icons/ajax-loader.gif')" alt="$msg.get('xe.livetable.loading')" title="" />$msg.get("xe.livetable.loading")</span> - <span class="pagination"> - <span id="userstable-pagination-text" class="xwiki-livetable-pagination-text">$msg.get("xe.pagination.page")</span> - <span id="userstable-pagination" class="xwiki-livetable-pagination-content" ></span> - </span> - </td> - </tr> - <tr> - <td class="xwiki-livetable-display-container"> - <table class="xwiki-livetable-display"> - <thead class="xwiki-livetable-display-header"> - <tr> - <th class="xwiki-livetable-display-header-text" scope="col">$msg.get("xe.admin.users.username")</th> - <th class="xwiki-livetable-display-header-text" scope="col">$msg.get("xe.admin.users.firstname")</th> - <th class="xwiki-livetable-display-header-text" scope="col">$msg.get("xe.admin.users.lastname")</th> - <th class="xwiki-livetable-display-header-text" scope="col">$msg.get("xe.admin.users.manage")</th> - </tr> - <tr id="userstable-filters" class="xwiki-livetable-display-filters"> - <td class="xwiki-livetable-display-header-filter"><label for="name" class="hidden">$msg.get("xe.admin.users.filter.username")</label><input id="name" name="name" type="text" class="filter"/></td> - <td class="xwiki-livetable-display-header-filter"><label for="first_name" class="hidden">$msg.get("xe.admin.users.filter.username")</label><input id="first_name" name="first_name" type="text" class="filter"/></td> - <td class="xwiki-livetable-display-header-filter"><label for="last_name" class="hidden">$msg.get("xe.admin.users.filter.username")</label><input id="last_name" name="last_name" type="text" class="filter"/></td> - <td class="xwiki-livetable-display-header-filter"> - #if(!$mainwk) - <select name="wiki" class="filter"> - <option value="local" selected="selected">$msg.get("rightsmanager.local")</option> - <option value="global">$msg.get("rightsmanager.global")</option> - <option value="both">$msg.get("rightsmanager.both")</option> - </select> - #else - <input name="wiki" type="hidden" value="local" /> - #end - </td> - </tr> - </thead> - <tbody id="userstable-display" class="xwiki-livetable-display-body"> - <tr> - <td colspan="4">&nbsp;</td> - </tr> - </tbody> - </table> - </td> - </tr> - <tr><td colspan="3" id="tdAddNewUserOrGroup"> - <span class="buttonwrapper"><a href="#" id="addNewUser" class="addNewUserOrGroup">$msg.get("rightsmanager.addnewuser")</a></span> - </td></tr> - </table> - <script type="text/javascript"> - // <![CDATA[ - (function() { - var startup = function() { - var ta = new XWiki.widgets.LiveTable("$url", "userstable", displayUsers); - #set($registerurl = $doc.getURL('view', 'xpage=registerinline')) - #set($saveurl = $doc.getURL('register', 'xpage=registerinline')) - #set($redirectuserurl = $xwiki.getDocument('XWiki.XWikiPreferences').getURL('admin', "editor=${editor}&section=Users")) - Event.observe($('addNewUser'), "click", makeAddHandler("$registerurl", "$saveurl", "$redirectuserurl")); - } - if ((typeof(XWiki) != 'undefined') && (typeof(XWiki.widgets) != 'undefined') && (typeof(XWiki.widgets.LiveTable) != 'undefined')) { - startup(); - } else { - document.observe('xwiki:dom:loading', startup); - } - })(); - // ]]> - </script> -</div> ## end of xwikieditcontent -{{/html}} -{{/velocity}} diff --git a/src/main/webapp/docs/xwiki/XWiki/ConfigurableClass.xml b/src/main/webapp/docs/xwiki/XWiki/ConfigurableClass.xml deleted file mode 100644 index c9d7dde36..000000000 --- a/src/main/webapp/docs/xwiki/XWiki/ConfigurableClass.xml +++ /dev/null @@ -1,938 +0,0 @@ - - -XWiki -ConfigurableClass - -en -0 -XWiki.WebHome -XWiki.Admin -XWiki.Admin - -xwiki:XWiki.Admin -1265775370000 -1296127640000 -1296127640000 -1.1 -XWiki.ConfigurableClass - - - -Imported from XAR -false -xwiki/2.0 -false -DefaultAdminSectionIcon.png -7257 -XWiki.Admin -1266210801000 -1.1 -iVBORw0KGgoAAAANSUhEUgAAAH0AAABVCAYAAABkf+t+AAAABmJLR0QA/wD/AP+gvaeTAAAcDklE -QVR4Xu1dWZMU15U+uVVXV69V1Q00CAQIic3sgwRGCMmSxtaLxxEOxfwDTYT9H+xH+80x8+D3mRiH -ZhSOCVkOWQrLiE2LQYBkhEBgBAgkdQPqpXqvLXPOd+LGvc6lq6CobCyrLzrKrSoz63737OfedoMg -oKX27SKXltoS6Eu0BPoSpUCWZdlqV7aHDh1yf/aznxVXrVpVdF13wLbtgUwmU+D9/Nzc3Py6dev+ -g9Vw/cGDvgSchY0Q2hZy6ALRL3/5y85nnnmm0NHVMdid7S54njfgOM6A7/sAtMCAFr788ssig1gg -m/K2ZRfqtXp/vV6ngP/5dZ9qtRpVq1WCvTU+Pj7V09PzX/y4CSLyA27tA32J60A2gyfHAPDll1/O -r1+/vtiT7xnozHYWLN8aYKwFvJGRkTwDBfBwrsBbUJ6IOvmYKpUKMdACXrlcBpAAUYi5mPgehGbZ -FmU7sjgnoHuuJ9dsW14D9+jhgbTxpz/96RkiqjH4wN3/1oMO4KKnhPNUe3Hri5mXXnqpMDg4WGSu -ATgQn+DCws2bN5cRUYG5scBgCZBElOdOzzNALh8LeIEfAEDZRwMoAAoAR4HEtb6+Pg0c31t/9p4B -8jzasGHDHiI6xxQw1fF77wd49+8cPNuIT95eIOvXv/517vHHHy90dnYOdHR0FLLZ7OAXX3wBoIoM -BCjPwBSYigCRwSwycL1KKgpodb+uRSjfQ8BR14nvp8EBiK5nuggcCSAXs1lEGEC7ePMbJp8U8Cly -euu6Lgqe4UAmJT5ff/31wvLlyweZKwBenrlugIhEfGLLhOOCAhKcCMpCDNaqNUIDWADCcR2y1K0V -kAAPJMDZajzZjg0RKucfUMPAM/sQ+UZ6QCpEON3F79lOXeTRDFUV4IGSMH5bQQfXJZ0WMnpPzv3k -Jz/xfvzjHxeHhoaKl69eHnACpwhxqbhsUO0LeDW/VrDJzitR6jCYAhzva12mgARpcFgUh4HscRsB -h3skHrPRJISGwZPYAmp03xaumeui52s1DXytWsVv1yoim41Ik0AGydb//c/f/muxv7/c2dVZz2Vz -df5scPnyZV8NIt0Rmzdv/u9mlr6bBPapU6fWnrt4bnl3RzdEqFiaSnwWQHxcBNexsVL0Ml7esZ0e -usuWsTPYaF3XCDBshUgGRSMwsW0OSPI+aOFBECTfW44Nt0bRTXpOdBsfYzMzpJt5JgZDdsvGjf8e -Grx1UVGhd56emsbmVabSvXH6EGVXPbTqCOuvNQqUGNdhH2JyYnyC+vv7ZYQutQdPf/nLX1oU78NU -z3iZid7e3jUQtw3a4uvFJWqmPlrW6T6LjdI3NhGzBLqj7LEArTno5stJOsEEGPDPD8hPNh4RjBC3 -6BvZvhljPW7wGXIU+Qy+iuA1Bz1gI6GUZNSUSiUACkLESR5M/RRrwyPDCCeK3l9qTcZXcO/cPD8/ -T2sffphyuVzoGuM2qzB1VFyDkoB3E25au3LlSinpZaamp2j4q2EBf4Ytzc1bttBC7aGHHloy8FKi -q9euJbgY2m9Hp3fQuPj0vnKzG4BuRsxkcnTIoosXL9L169dF1D/Mo+2BtCUybmSgYDW4dggNhyJ3 -/t2AnmjIwZrnNB/duXNHuL1RC1JUjkuAa+BDbKwwyypurzFJBM9SWZpmoI+rKBF0Qgh0hDjhvz9A -g2ipWWSCPDE+Jk+BXgnlLu6C08ewjYJOFuEYtMiYm3i1PNu8G6ih+ItfN/H6er1K43PDND5/i2zL -pULnSurLDuI7Sd9t4bkpxTNMVC9BupMjuHbx6RmylUHXFHQYaROJvoDtUK4rd5ecHvy9BCkAAAYN -tiEQpislOn/7GJ0fOUoZJ0c7Vz5PW5c/RV2ZfgAX+q7KCbTyLm0GPR6mDYC6GqgKdBuA31PChUt0 -JiDeow1Jj57uHoC+2JgDqERug/s4MTFBM7Oz4i3kOSzc1dUVAmghzpurTdHnE5/QuZE/UafbQ8u6 -19D6wi6ALlm5gAzXGq4y35+cmpJno696urupl3PonuuGJAUovYENYrB9+X90UFr3Ajo6clRbhy23 -IA3QNceC4K9+/vnn9PHHH9OXX31F3dzxW7dupa3sSnKxhAZ8IRFb86tUrs3QbGWS4O3MV6epWq8I -uMCKIYsmSDSgEyWWEufP04ULF2TgrV27lrZt20arVq7E4AupkbZzO4z2WNJG71uge06tHj58eOLg -wYOJHa8SL4uJeRQ83fG3bt2id997j04cP05ffPkldTHoXFBB9VqN9uzeTdnOTg1YhPM01zqWS57T -IWTbjupRJisZcJyfnp6ms2fPop8w4AC6eDWzLG2eefpp4hoBgJyaeA8sI00tDbd1f/n0X/3Pr+Z/ -/vOfz8P8jyT0jWg3nbmYLpsGDRFBAHz69Gn66Nw52CEiWmd5yw2cjtwyVFKyiFcgwoBz7AyTJ/sI -W8c5yQw2AAvufuutt+jkyZMy8Oq+T+MTE/LM72zdCtBDUiEtfS5uun4/PwELbcQ1B52GwSy1SRal -WQMyQc89+CC28TBge9DU1JTsd2azMiBHR0cFjF4GwPOkvgxbABgX9cb0Db8uACYNvJZu88zRn376 -qQD+wQcfSKyCy7Z0AeTk5KRwvWrpAB5nLaXPLQTMZlvmdNpCAQM+wbdaFuGyqMhdZMgNxyJeMDAw -IOHeGzdugAM1uAgeHTt2DIDgHCKHiDEY0Mky0jAAh9TJZ4JeV+jHOLzCYH525Qod5fu+++67MOBU -PZ10tnD56tWriVPSixuRw75xa4PWQb8goMdCbhjxqrzpLtBJzZDTVTdrGEwukqQ7X39NFz75BNwG -IARcrrejEydOICkBwwqAGA5Xm8AKqB7UqOpXyA0qCngj/xluLVU+54F14p136D22IUZYpKsgFThb -9rew8fgEvwtEuwIlNUMuUP0b1unGkGu1Ri6AeKcg7rIpN+ZBcbpxh4ikaufxvXshVkWXX716FcDL -e9Z4e+WzzyjLRh6seoAPyWAajDiHXKeDMm5OyHOy5NoomgwPNOjtk6dOAXR4C3L/DBO8B0iQRx99 -lA4++STt2rkTHB8yHNNoltZGSq9bbSiMRKaNO7BxIUWyIZeWPovpY19x0cpVq+jJAweg3wE4kkFy -vpNBhnF36dIl+O1yfOipp0LpyKzbTat6H6PNyw5Qh5OjFT0bqNPrCT1zii31P7ONcIwHDwYVzuWy -WXA49sVVe/rQIXpi3z4aGBwMBYJAqVjvIN0nFnbaUw27YPWMZcto/ppF6gOw4xKDLjwLhb73ve+B -84SGh4ehzwG2HJ87d04Hbnbs2CHX0LoyfbR58AAN5B4i2/IY9PWU9Yx/D9fs9Jkz9PaRI/QpZxf9 -eh2DBn2j3TQAfohpDauPhPdLU6mDdExBVRS3AnrzTJvnOBBnAL0Bl6cSnGkI/Jo1a+jZZ58VMN58 -802IfOh3kEiBDz/8kFzHAdfj/eW8a3fQ8u71VMytFv3tOp6EmtFgGF5kS/3VV1+FvQB3RgZORU1T -WrZsGQaaEE88TAI5VV/d5FmCaPVt0oNwLmgGOoyUMYxoFXeOly0vfug9MTJmZp90CMc/xSIcrtRx -NuIg3nPKgldcS8VCAb8BrhxA1IEZ0wjSQdTCG2+8IVJifm5OBoxwOF/rY4nx1MGD0OMwEKHXk1zC -FEOx6lmgu2Ov5kUUKvgxiRsncByAbzUBkQb3a/ABMEKw4NKx8XEABt8aAwLAC/cfZd3cn8/D4oZ0 -wPkQWODia9euwWgTmpmexmch+eRad0+PGGzPMIdj4OBaqoZbMuSKAYxot1qKyMVBL1G8yaju6e3F -tlkyIHUON/uGq+An72S9PcGg829ApQ9EMoCXd/6KY/THWAogZAvAeFaOll6YeYJwLvzwdxjwO7dv -i+WvbBzoc4m4Pffcc3DRdGIHJC35/VJIrZJ6BiZWWiS9bfmQyvcFOizh8QSfHByOzgpx2aJnVpPB -18cFFuEH2KKfZvFeVkEVDAAYcNhehkXPAPYyoNDtcOXQYbcZ5A9OnxbV8Bm7ex1qoMAmgCp47LHH -YLRJbKCvt7eRSE9dChrpHpA5Dqz7NeTGmgRiFq9cKt6pUeC1ulHXAST0LkBGNE378N3MnSUO3Z5n -46yDgYQr9yTrZohvGHtIoly6fBmgYZDA38e+RPWe5mQK3MNCPh8COMLdqefSjV5XTrvCvlavz90P -6IhhlxYw8MhqlkwIUsmyNQMfFHpPhGiR9YJhNsd088YNiH9wOc4BeBhlEP/ijr3D+v4SW+wAGmId -iZQZ5vINjzxCvLqEDKIVK1ZggDUzLJOut1O6GxXqM/ii2Alh1Pr9ROQQ5Bjbv39/DFjPyzB5AH3x -OD25ECK6jQGB94R1DQ6FiH7jD3+gyelpiGqQSIGPz5+H7hZweHUJ6G6IdRH3Zb4OkAE4/HG4ZspS -Dz+bIu8QH4htzqeHGKF9wZlf/OIXYy+++GJrU3PbDLgS302eYRkQLK3jBNx1a9cKl5Y4SXKcDTS4 -YF7Gk3uOj42BQoYqgAe397NUOGRcs6il3/zXSurWQvQwXTteVHlw36AjqlVXSZe+cOdbOv4utADA -gd9e4Cu1Ok2WazRTqVO1BheFKVRMQJRxberpcKk765KtkLdsG1Y3cuti1I0x8IiuYV+wIBPJck0M -QkqfdnAlzPPPP0+PsHhn7g91dVCrUlCeJb8yR4GewmWHijAsL0N2JkdWRyd4vf1ZNt8E4gPeMl6t -GnKGADoD2xfV6cCzqYHXZvvl89FZOnl1lC7dmqY5Bt51bLIV6PVAkKc+Bvs7q3pp7/oC8dJO5NhW -yJXjECzy7wCXdfclmp2bwzXNwcpwxWel7OqFH/wAgyXsmkFsVytUu3Od5q+fo+roTQrqVbJsFxwB -NPi4JuA73f2UGdpE2XU7yc71tTnLhq0PtEMRufsF3VeFFDE/ndA51CDZkoLPdnlkiv7v1E06eekO -zTPojqcCREqqwBDr78rQszuGaFm+k/K5DgwMABla/Ae6eXh4hPX3LQZ9lup+IBweqBWhIBmKbPnv -3rWLDrBYZ5cu1KEiQaoc47/5CU2e/C3NX/uIfOZ628uSxfcB+/mVMvELkZtfTt07vk9ecTW57QNd -xdwFdWwjvnvrhhwArXIochLgJoHqOu6ihmHnaj6VZis0PckdzvuW55LlqFHuy7IisF5pYq5C83U/ -SY8qrs5IjN2CFDAXgGrIfgD3g5IanuPPz1Bt8muqTdxCHpr8DIOuOD1g0AO/Kvetz5SIapV0iiiU -WLdk2x5OB5dMJrttNvxgGEmLlmZbP9BF3982ROsKOZqp+mS7RryD00HQ5TtZtK/s7STXFiBDhZCI -xX9w6gO6cJG5tFQCJky2DBBighSDZBgbHUXBo2TOdu3eDX0eLoN2M5RZsYG6tz9PmcH1It5JDSSx -ZXAc+OT0FKnzkb1kd/WnZ8YFapaiH7QcnIln2uIGGbgF4Ut0RhK2qnPa2zYN9VCRxfcoc3KlFgjg -lpniI6hmPZuK3R00wATRHhjXSQD/hAsaf//676V0eWZ6hhzbBupiqaOpWjis0khnzp6FyEesHVk5 -AG9cRy9L2TXbyMsPgZPFkAtIeQ4ChI/7wohj4AvkdhfaDXY4Ioc+aIfLpvT3eCTTZnTKItdF5jIO -PczcvjrIRWrDjIQGYDbFw8Ow1Hn6Nb31xz/SRx99JBk3z/UEGAV2qB5OBafoNBc/DhaLEPPI4Mk2 -8BWgnd1Cnhh/fsR6leEmUoTs9CJyynxX0bn2gI6wZWmBTBsGxKIGZ+CN2NKHgm5jI8e8J34DCiel -Xu7E8RNUKk0i/Krr7fL5vKgqVVCJgkeAqitrjxw9iqIRGHQIzsj5UIrLtgn/GkCDgQJ930a8rYgR -BwpgiM61aMjFCyniUTkP9WmwmBskA9ode9f9HE1sLBj9gpTixXelMvYogzdyawQA4joCNOKKbdm8 -GQkUxK3p/fffRx09cuaIu0MCSE3c22+/DfsFkT2oNZNWBqGZ+Hs8s5ZG/B2Ya+4OFZT4rXO64RRd -SBGqf3cc6EMNevrlQXGwkxMbsq+5GAWNSJEih45qVoDsua746h6yZhs3AkiQuGvC3WNjCN4gJ685 -/PJf/4rPyz5m/gyqWrikhEv6FTMmuaH+U0kXqz3WOwM+7gdxn9ysBEo6oLFI05qiHLXgVGYYY8iL -o77t2tWrUAuoYMVERxHJmzZtkrz4zp07MVFCOHnPnj0ohERWDpUziNfDgEM/wCbQHI/0Knz+pKnJ -aj+6TSWtGijw2xSGNVOWxXoP4pk2x0X5UIjbovYlpdgWFOsgTC5EyfIRFutIk6qFf1EkIRy9kTkc -8fR/YpDBtUqHy+TDfU88QdNTUwActgBsFwCNrBysf4h9maG6l1UCMnER4NPOpRsPIaRCZduWMCw6 -SBdSgIxON2u4KkpbxMeLNpLnmmGgSiHjnw4fFtdsXnGr+j0AWSJt+7/7XZM1I2kAF6s2Ib8u95F6 -ekyBVhMbIAU+ZOu/gyVDb38/SrOiETtsU8+nB6S53Ng5QZuCM2UqjyIZwRSaCKh8d/LjoKcLfvIz -QnPV/8r69zCL4Q/PnkV9m15vDYAj8QIOP3jggGTepL4t0png5MfYLwenY1IiZrRUKxXYAlptwNhD -qBY1eWquXEq58+a+Opp4ke0S7+8cfmd8+8btcWBVupAaLLJLQbplUoqLYq7Z8ePH4Z7pEmhwKADH -tGUkXF544QWId8WhyJb5qtegt2yybEfXwkGXj8OwY/1eY+AzCniUfx89cgSTJPFZFGvgOVEOT82g -U10f7vM2JVzw90hmX/q3l8oMYkdUvMNyF043lHYRRUOxj0UJYLRBj8O/BhfCN4YuBkdjwYB/+dGP -aNPmzXwtpzJKdareGaPa7TEixyJv+QB5hTxZji2W+47t22nyhz8k/3e/k+nJlVpNT1pEASVKq1Bw -qWrfQ/o8Tc63QNqG01GJti3yXy+XK8i0DTaavgQLP1bRAVqkgkjMUweHgwA+dDDcSujljJpc+BwD -s3fPHtTI6f6pjpVo/PBxKp14j+xclvLPslV+YD95+V6djt2/bx/q6CHiYdFjzhxUAEqpUCqN4I0M -hCfZlRtasSLp/VLT6WA6iwR5gN8W0AFejS3WKQE9MofbCi1gF4u7M1ntBjtqKesomsw1Yw6/xvPY -LD7nqQpW5nQUQKBODuABxFDH1SYmafL0Gbr92qvkMmdnBorU/Z2tAF2DJpW1bPThfiBUyc4p6QEp -AhsCoEN9oGgSEb7FKIOWe2q9rtOsVjs4HdN5Sgx6rC7Lst0mC+gHqbpqIHAglgEBh1+Ga1apAAzo -d9HH6xlwGG6IuC1bvjxeXIm/olSaoMrYbfKxPzpJ/pyqqLFMNA06+7v79yNmD8DFdnBcF2BjMgVE -P9w38d13794NaZLyylLRxBb6I8BvnmsP6L4PTtczMU3RoYNHUdSlM6VU6VrqEK83eA76+3/+Mzod -XAeXS96nogoawaFPqvo22zYpVNJABJIOtRy4oI6JagUme6cST0i4oM5OgjuzTJhM4TB3I+ADCYBU -LGL4K1euRPVsumvOqJIsH+8P0Y49bNsQhgUhOYFQLNw2dJx5qCKl01OfwGjUismc3RoZQT07rGmA -GkqiYLLDM4cOAQAZDNL54aVFsM/kkE0ug8/kqKyYFR9s4OqNmzaBs6HXEd6VcK6jFmq4feuWiP4x -tvYDHiBpu22BAG5y6uqA2gI6piwrTgtndUhnu6I6XW3TDcLbvAWYCKHinFp+BLNJJZz6z889h1Br -aK6ZSQ9HV5swZDWQMl3KlYP6wOyZMzwhcpQHHEBXcXrtz6doyIXKo/Srtye1aoojmaKrJuLHJYt3 -bEEp63QAvop1LSpbECmD1Q5QMI/tWQYcy5Jj9krk3QBEpOMgJJl8FDRKGYrJjMWNRzEGt7P7B/0O -LkfdfEWtI4e6ukEedAnRw1SmKTuKy4Ws9oEOfaYzbaDognUgnI8PQ0p1zRlwLVwkiHEESLDGjPKt -kUSBYdVwrpk0+U1Vqgdlsv151LolTUaMBYRgsGF9GehzGHnQ6VigAGvXDbJeT3/NGWWtg3TxTHs5 -fcIPQoCbjmwQPAnSn7UqYD+6YQN0uOhXWXGqWAQoSZm3ODkuWR0e2RnZkpVjch2iGKfG580Vi0Wo -EXA4cvGY0IhzWp2kmWWzNK/bGnBVHtc+nQ7RFwXWlB/HEi5peWyJmSwESlYztzVZiTluBPE/p7eb -cus2UO/2x2U/++jD2AJzfKZZCBg+PKjBs9Odsaoqt8gnOdE+0DFlWSVdIOo1sIh42VZMp6vrbef0 -MNhxAKLBm4aDBQMVrlqm0E/5pw5Qppgny/Ooe+c28ooqT+4LcInPSVYb8XNqP81iCrPYUBvFO6pN -7qjZH6CkGMFicXpShy40OKLnEq87XTnq278X1GjuHABr4bmha6mAbelpbEF7QS9xQw4aLabPTbIl -Dj4ttfQoqbagfaAjqTCGSFNEjEPUL1jYIJ9dgj3NwIy2TMRVF0xkudL5toD+2muv3d61a1eS9R5x -4+LWxvUb15VEsEwgxEi6+LHsm8+akKklG0tnevSHw1E2bE2BqjlWNfHm65b5nmEcc1U/UzJY5nNE -8c9jP3o/kD4f/20UqHsnz2s3vaPgtaJ9F116RJ30ubUF9FdeeaXOqzQhvdqbqLvjxxI4mZqaaThO -TVRPxY+T58xpiMx3iGKfjn9Pg626zZxUh/p0YA5lm/gBbPV5HDcNNRt0dJTf/D/xheO2kqX1N8W+ -nfVczSANAkEBbSFq/jdckuvfp3gTBT1GqlG+v6/53yaP15U1L7tq/tnkfen8lv/E9j8cuXe5CkSJ -9cWqul/Hmu8hkGI6vDnIyeA9eJD19hveAIQPui/QHceR+LvMA7f9ECDqXxzk5tzcDExs7xpktXOv -kuIfkZvr8aWeWhPvk75acNYO7NCqDfNz8xgMSYC1AmpjoLFp5b7NAW7hesuEgBeygrqeHnkCpGQR -PlZMpr2je2iw3i3F4TXN8RcoaAl0n/wSqlImsaYaSTUNXhwvLClG27huoaidWpk4OhOmFR0avdYo -exYHOXk/WUI0H4To3NmAmzpOWit/psHvqItrlbzOD/qpwn1WaTBg5nGPBBUc8OKHl4hojqkiwA9R -QMMUoN0z6OW58muTE5OlqZkpd3Z61uGXtoEDZ5emGQwkPupkChgqDHzAI9nnMuQyDwyHX9Rh8C2Z -NG8mUpT5fPlvX/pvgZvlxs+p/+115dIEKmg0hUcuIJl8LqyYDn/XNH6vCtfWleVeycupzXEHVts4 -GTtdHeKRT1X9t1XLGvRhiPoWOX3fvn2/YUBe1t8x5DE56k88GgcT5wxhXpDLKFuRCdwg+HcYAUG8 -k+L7iSCr2StULgctABSkAODikwO4BWBfAV6mIQHdbw30uDdZN8eyb2vADeggW93fYlDtBdYfB+AU -Gwhd1LjNaPADBjsFoL5hNK8Zoq63eab7BT3gZsSvFhuWJnWsQR1iGo4MgmQg/DioLQA2RN++NhyR -iKAtTBe0AQfYWgXdAG9qCi1fA5wQWwLgSdydYgcsNRLABafWgzPNB4DsfrNE6VJz6VvXltr/A+kB -/wpRrz9iAAAAAElFTkSuQmCC - - -XWiki.ConfigurableClass - - - - - - - - -0 ---- -codeToExecute -7 -0 -codeToExecute -5 -40 -0 - - -com.xpn.xwiki.objects.classes.TextAreaClass - - -0 -configurationClass -3 -0 -configurationClass -30 -0 - - -com.xpn.xwiki.objects.classes.StringClass - - - -0 -checkbox - -configureGlobally -4 -configureGlobally -0 - - -com.xpn.xwiki.objects.classes.BooleanClass - - -0 -displayInSection -1 -0 -displayInSection -30 -0 - - -com.xpn.xwiki.objects.classes.StringClass - - -0 -heading -2 -0 -heading -30 -0 - - -com.xpn.xwiki.objects.classes.StringClass - - -0 -iconAttachment -8 -0 -iconAttachment -30 -0 - - -com.xpn.xwiki.objects.classes.StringClass - - -0 -linkPrefix -5 -0 -linkPrefix -30 -0 - - -com.xpn.xwiki.objects.classes.StringClass - - -0 -0 -input -1 -propertiesToShow -6 -0 -propertiesToShow -1 - - ,| -20 -none -0 - - - -com.xpn.xwiki.objects.classes.StaticListClass - - - -XWiki.ConfigurableClass -0 -XWiki.JavaScriptExtension -71fc6ffa-92cb-48f1-9d80-a845d1807b10 - -long - - -document.observe('dom:loaded', function() { - // Hide headers unless they have error messages under them. - var elementsInPage = $('admin-page-content').childNodes; - var errorShown = false; - for (var i = elementsInPage.length - 1; i > -1; i--) { - var e = elementsInPage[i]; - if (e.tagName != undefined && e.tagName.toLowerCase() == 'div' && e.getAttribute('class') != undefined && e.getAttribute('class').indexOf('errormessage') != -1) - { - errorShown = true; - } else if (!errorShown - && e.tagName != undefined - && e.tagName.toLowerCase() == 'h1' - && e.getAttribute('id') != undefined - && e.getAttribute('id').toLowerCase().indexOf('hcustomize') == 0) - { - e.parentNode.removeChild(e); - errorShown = false; - } - } - - // Hide individual submit buttons. - var forms = document.getElementsByTagName('form'); - var inputs = document.getElementsByTagName('input'); - for (var i = 0; i < inputs.length; i++) { - if (inputs[i].getAttribute('type') != undefined && inputs[i].getAttribute('type').toLowerCase() == 'submit') { - inputs[i].parentNode.removeChild(inputs[i]); - } - } - - // Add a submit button for saving all sections at once. - var button = new Element('input', {'type':'submit', 'class':'button', 'value':'$msg.get("admin.save")', 'name':'formactionsac'}); - var wrapper = new Element('span', {'class':'buttonwrapper'}); - var adminButtons = new Element('p', {'class':'admin-buttons'}); - var bottomButtons = new Element('div', {'class':'bottombuttons'}); - $('admin-page-content').appendChild(bottomButtons); - bottomButtons.appendChild(adminButtons); - adminButtons.appendChild(wrapper); - wrapper.appendChild(button); - - Event.observe(button, 'click', function() { - var forms = $('admin-page-content').getElementsByTagName('form'); - for (var i = 0; i < forms.length; i++) { - Event.fire(document, 'xwiki:actions:save', {'form':forms[i].id, 'continue':true}); - } - }); -}); - - - - - -1 - - -onDemand - - -{{velocity}} -#* - * This part takes the configuration from any documents containing XWiki.ConfigurableClass objects and creates a form - * for each. To includeForm this document, you may specify: - * - * $section - String - The section which we are administrating eg: "Registration", "Users", or "Import". - * If none is specified then it checks for a request parameter called "section" and uses that, - * if no parameter, then this code assumes that it is part of the admin icons sheet and adds icons - * for any section which is not in $sections, in that event, this code assumes it is being run - * inside of a <ul> block. - * - * $sections - List<String> - If section is not specified, any sections on this list will not have icons made for them - * the assumption being that the icons are already there. If section is specified then this - * is not taken into account and may safely be undefined. - * - * $currentDoc - String (document.fullName) - The administration document, users who don't have permission to edit - * it will not be able to include applications (possibly injecting - * arbitrary code.) if none specified then $doc.getFullName() is used. - * - * $globaladmin - boolean - If set true then we will assume we are administrationg the entire wiki. - * If not set then we look for a request parameter called "editor" if that exists and equals - * "globaladmin" then $globaladmin is true, if it doesn't exist then we check to see if - * $currentDoc.getFullName() equals "XWiki.XWikiPreferences". - * - * $doNotUnlockConfigurableDocuments - boolean - If true then this code will not make any attempt to unlock configurable - * documents. By default it does because it locks any document in the - * section which is being configured which would lead to a lot of stray - * locks if they weren't all canceled. Only recommended if this page is - * being included twice in the same page. - *### -## Constants: -#set($redirectParameter = 'xredirect') -#set($nameOfThisDocument = 'XWiki.ConfigurableClass') -## -## Form submission depends on this. -#set($jsService = $services.javascript) -#set($extJsParam = $jsService.createExtJSParam().setAction('file')) -#set($extJsParam = $extJsParam.setLazyLoad(true)) -$!jsService.includeExtJsFile($extJsParam.setJsFile(':js/xwiki/actionbuttons/actionButtons.js'))## -## -#if(!$section) - #set($section = $request.getParameter('section')) -#end -#if(!$currentDoc) - #set($currentDoc = $doc.getFullName()) -#end -## Get value of $globaladmin if not specified. -#if("$!globaladmin" == '') - #if($editor != 'globaladmin' - && $request.getParameter('editor') != 'globaladmin' - && $currentDoc != 'XWiki.XWikiPreferences') - ## - #set($globaladmin = false) - #else - #set($globaladmin = true) - #end -#end -#set($currentSpace = $xwiki.getDocument($currentDoc).getSpace()) -## -## This application should not run with programming rights because it evaluates code which may not be trustworthy. -## Removing the next line will open a security hole. -#sandboxDocument() -## -## This application locks every document in a section while that section is being edited so we should -## check for locks held by the current user on any of the applications configured here and remove them. -#if(!$doNotUnlockConfigurableDocuments) - #set($outputList = []) - #findNamesOfAppsToConfigure("", $globaladmin, $currentSpace, $outputList)## - ## We don't want to generate javascript which unlocks the current document just after we got finished locking it. - #set($discard = $outputList.remove($currentDoc)) - #unlockDocuments($outputList) -#end -## -##------------------------------------------------------------------------------------------------------------ -## If $section exists then we are viewing the admin page for a particular section. -## eg: 'Registration', 'Presentation', 'Import' etc. -##------------------------------------------------------------------------------------------------------------ -## -#if($section && $section != '') - ## - ## This is for keeping track of whether we have shown the heading yet or not. - ## If the heading doesn't need to be shown, but an error occurs in processing, then we show the heading - ## so that the user knows what the error relates to. - #set($headingShowing = false) - ## - ## Searches the database for names of apps to be configured - #set($outputList = []) - #findNamesOfAppsToConfigure($section, $globaladmin, $xwiki.getDocument($currentDoc).getSpace(), $outputList) - ## - #foreach($appName in $outputList) - ## - ## Make sure the current user has permission to edit the configurable application. - #set($userHasAccessToDocument = $xcontext.hasAccessLevel('edit', $appName)) - ## - ## If the document was not last saved by a user with edit privilege on this page - ## then we can't safely display the page but we should warn the viewer. - #if($userHasAccessToDocument) - ## Get the configurable application - #set($app = $xwiki.getDocument($appName)) - ## - #set($documentSavedByAuthorizedUser = false) - #checkDocumentSavedByAuthorizedUser($app, $currentDoc, $documentSavedByAuthorizedUser) - #end - ## - ## There is no need to display a heading unless: - ## 1. There was already a section before this document. - ## 2. This is not the first document in this section. - ## - ## If we are displaying the heading and there is an error to be shown Javascript will not strip the heading. - #if(!$appName.equals($outputList.get(0)) || $sections.contains($section)) - ## Create a document heading. - #showHeading($appName, $headingShowing) - #end - ## - #if(!$userHasAccessToDocument) - #showHeading($appName, $headingShowing) - - {{error}}$msg.get('xe.admin.configurable.noPermissionThisApplication'){{/error}} - - #else - ## - #if(!$documentSavedByAuthorizedUser) - #showHeading($appName, $headingShowing) - - {{error}}$msg.get('xe.admin.configurable.applicationAuthorNoAdmin', [$app.Author]){{/error}} - - #else - ## - ## Locking document - ##------------------------------------------------------------------------------------------------------------ - #if($app.getLocked()) - #set($locked = true) - #end - ## If the document is locked and not by the current user and forceEdit is not set true, - #if($locked && $app.getLockingUser() != $xcontext.getUser() && !$request.getParameter('forceEdit')) - #set($requestURL = "$request.getRequestURL()") - #if($requestURL.indexOf('?') == -1) - #set($requestURL = "${requestURL}?") - #end - #showHeading($appName, $headingShowing) - - {{error}}$msg.get('doclockedby') $app.getLockingUser() [[$msg.get('forcelock')>>${requestURL}&forceEdit=1]]{{/error}} - - #else - ## If the document is not already locked, attempt to acquire the lock. - #if(!$locked) - ## Try to use an AJAX call to lock the document. - - - {{html wiki=true}} - <noscript> - - {{warning}}$msg.get('xe.admin.configurable.cannotLockNoJavascript'){{/warning}} - - </noscript> - <script type="text/javascript"> - document.observe("xwiki:dom:loaded", function() { - new Ajax.Request("$xwiki.getURL($app.getFullName(), 'lock', 'ajax=1')"); - }); - </script> - {{/html}} - - #set($discard = $lockedDocumentNames.add($app.getFullName())) - #end - ##------------------------------------------------------------------------------------------------------------ - ## Done Locking. - ## - ## Get all objects of the "ConfigurableClass" from this document. - #set($allConfigurableObjs = $app.getObjects($nameOfThisDocument)) - ## Separate out the objects which are for this section. - #set($configurableObjs = []) - #foreach($configurableObj in $allConfigurableObjs) - #if($app.getValue('displayInSection', $configurableObj) == $section) - ## If this is space admin, then don't display global, if global don't display space. - #if($globaladmin == ($app.getValue('configureGlobally', $configurableObj) == 1)) - #set($discard = $configurableObjs.add($configurableObj)) - #end - #end - #end - #if($configurableObjs.size() == 0) - ## Internal error, not translated. - #showHeading($appName, $headingShowing) - - {{error}}Internal error: All objects were filtered out for application: $appName.{{/error}} - - #else - #set($formAction = $xwiki.getURL($app.getFullName(), 'save')) - #set($formId = "${section.toLowerCase()}_${app.getFullName()}") - #set($escapedAppName = $escapetool.xml($app.getFullName())) - #foreach($configurableObj in $configurableObjs) - ## Display the header if one exists. - #set($heading = $app.getValue('heading', $configurableObj)) - #if($heading && $heading != '') - == #evaluate($heading) == - #end - ## - #set($codeToExecute = "$!app.getValue('codeToExecute', $configurableObj)") - #if($codeToExecute != '') - (%class="codeToExecute"%)(((## - #evaluate($codeToExecute)## - ))) - #end - ## - ## If propertiesToShow is set, then we will only show the properties contained therein. - #set($propertiesToShow = $app.getValue('propertiesToShow', $configurableObj)) - #if(!$propertiesToShow || $propertiesToShow.getClass().getName().indexOf('List') == -1) - #set($propertiesToShow = []) - #end - ## - ## If linkPrefix is set, then we will make each property label a link which starts with that prefix. - #set($linkPrefix = "$!app.getValue('linkPrefix', $configurableObj)") - ## - ## If the Configurable object specifies a configuration class, use it, - ## otherwise assume custom forms are used instead. - #set($configClassName = "$!app.getValue('configurationClass', $configurableObj)") - #if($configClassName != '') - #set($objClass = $xwiki.getDocument($configClassName).getxWikiClass()) - #if(!$objClass || $objClass.getClass().getName().indexOf('.Class') == -1) - #showHeading($appName, $headingShowing) - - {{error}}$msg.get('xe.admin.configurable.configurationClassNonexistant'){{/error}} - - #else - ## Use the first object from the document which is of the configuration class. - #set($obj = $app.getObject($objClass.getName())) - ## - #if(!$obj || $obj.getClass().getName().indexOf('.Object') == -1) - #showHeading($appName, $headingShowing) - - {{error}} - $msg.get('xe.admin.configurable.noObjectOfConfigurationClassFound', - [$objClass.getName(), $app.getFullName()]) - {{/error}} - - #else - ## - ## Merge save buttons, remove headings from subsections, and make information links into popups. - ## This is not done if there is only a custom defined form. -## $xwiki.jsx.use($nameOfThisDocument) - ## - ## We don't begin the form until we have content for it so that a configurable can specify a - ## custom form in codeToExecute and if that configurable object is the first of it's kind in that - ## document, the custom form will not be put inside of our form. - #if(!$insideForm) - ## We are opening a form and fieldset without closing it, thus we cannot clean this html. - - {{html clean=false}} - <form id="$formId" method="post" action="$formAction"> - <fieldset> - {{/html}} - #set($insideForm = true) - #end - #define($formHtml) - #foreach($propName in $objClass.getPropertyNames()) - #if($propertiesToShow.size() > 0 && !$propertiesToShow.contains($propName)) - ## Silently skip over this property. - #else - <p> - #set($prettyName = "#evaluate($app.displayPrettyName($propName, $obj))") - ## App Name is prepended to for= to make label work with id which is modified to prevent collisions. - <label for="${escapedAppName}_$objClass.getName()_$obj.getNumber()_$propName"> - #if($linkPrefix != '') - #set($linkScript = "$linkPrefix$propName") - <a href="$escapetool.xml("#evaluate($linkScript)")">$escapetool.xml($prettyName)</a> - #else - $escapetool.xml($prettyName) - #end - </label> - ## Step 1: Strip pre tags which $obj.display inserts, this won't affect content because it's escaped. - #set($out = $obj.display($propName, 'edit').replaceAll('<[/]?pre>', '')) - ## Step 2: Select only content between first < and last > because $obj.display inserts html macros. - ## Careful not to remove html macros from the content because they are not escaped! - ## Step 3: Prepend app name to all ID and FOR attributes to prevent id collision with multiple apps on one page. - $out.substring($out.indexOf('<'), $mathtool.add(1, $out.lastIndexOf('>'))).replaceAll( - " id='$objClass.getName()_$obj.getNumber()_$propName", - " id='${escapedAppName}_$objClass.getName()_$obj.getNumber()_$propName").replaceAll( - " for='$objClass.getName()_$obj.getNumber()_$propName", - " for='${escapedAppName}_$objClass.getName()_$obj.getNumber()_$propName") - </p> - #end## If property is in propertiesToShow - #end## Foreach property in this class - #end## define $formHtml - - - {{html}} - $formHtml.toString() - {{/html}} - - #end## If object exists - #end## If class exists - #end## If class name is specified. - #end## Foreach configurable object found in this document - ## If a form was started then we end it. - #if($insideForm) - - ## This is closing an open form which was opened above, we cannot clean this html. - {{html clean=false}} - ## We add in a redirect field to prevent the user from being carried away when they save - ## if they don't have javascript. - #set($thisURL = $request.getRequestURL()) - #if($request.getQueryString() && $request.getQueryString().length() > 0) - #set($thisURL = "${thisURL}?$request.getQueryString()") - #end - <input type="hidden" id="${escapedAppName}_redirect" name="$redirectParameter" value="$escapetool.xml($thisURL)" /> - <input type="hidden" name="form_token" value="$!{services.csrf.getToken()}" /> - </fieldset> - <div class="bottombuttons"> - <p class="admin-buttons"> - <span class="buttonwrapper"> - ## Text to display on the button. If there is a heading then this button should be labeled - ## that it is for saving this section. Otherwise it should be a generic "save" button. - #if($headingShowing) - #set($buttonText = "$msg.get('admin.save') $escapedAppName") - #else - #set($buttonText = "$msg.get('admin.save')") - #end - <input class="button" type="submit" name="action_saveandcontinue" value="$buttonText" /> - </span> - </p> - </div> ## bottombuttons - </form> - #set($insideForm = false) - {{/html}} - - #end - #end## If there are configurable objects - #end## If document is not locked or forceEdit is enabled - #end## If app author has permission to edit admin page - #end## If the current user has permission to edit the configurable application. - #end## Foreach document name in names to configure - - - {{html}} - <script type="text/javascript"> - /* <![CDATA[ */ - ## Alt+Shift+S presses the first saveAndContinue button it finds, not what we want so we will disable edit shortcuts. - document.observe('xwiki:dom:loaded', function() { - XWiki.actionButtons.EditActions = Object.extend(XWiki.actionButtons.EditActions, {addShortcuts : function() { }}); - }); - //]]> - </script> - {{/html}}## - ## -#else - ## - ##------------------------------------------------------------------------------------------------------------ - ## If section is not set then we are viewing the main administration page. - ##------------------------------------------------------------------------------------------------------------ - ## - ## If there is no list called sections then we set sections to an empty list. - #if(!$sections || $sections.getClass().getName().indexOf('List') == -1) - #set($sections = []) - #end - ## - ## We have to create a list of documents which the current user doesn't have permission to view. - ## So we can add an error message to the bottom of the page if there are any. - #set($appsUserCannotView = []) - ## - ## A list of sections (to be added) which the user is not allowed to edit, icons will be displayed with a message - #set($sectionsUserCannotEdit = []) - ## List of sections to be added, in order by creationDate of oldest contained application. - #set($sectionsToAdd = []) - ## Map of URL of icon to use by the name of the section to use that icon on. - #set($iconBySection = {}) - ## - #set($outputList = []) - #findNamesOfAppsToConfigure("", $globaladmin, $currentSpace, $outputList) - ## - #foreach($appName in $outputList) - ## - ## Get the configurable application - #set($app = $xwiki.getDocument($appName)) - ## - ## If getDocument returns null, then warn the user that they don't have view access to that application. - #if(!$app) - #set($discard = $appsUserCannotView.add($appName)) - #end - ## - #set($configurableObjects = $app.getObjects($nameOfThisDocument)) - #foreach($configurableObject in $configurableObjects) - #set($displayInSection = $app.getValue('displayInSection', $configurableObject)) - ## - ## If there is no section for this configurable or if the section cannot be edited, then check if the - ## application can be edited by the current user, if so then we display the icon from the current app and - ## don't display any message to tell the user they can't edit that section. - #if(!$sections.contains($displayInSection) || $sectionsUserCannotEdit.contains($displayInSection)) - ## - ## If there is no section for this configurable, then we will have to add one. - #if(!$sections.contains($displayInSection) && !$sectionsToAdd.contains($displayInSection)) - #set($discard = $sectionsToAdd.add($displayInSection)) - #end - ## - ## If an attachment by the filename iconAttachment exists and is an image - #set($attachment = $app.getAttachment("$app.getValue('iconAttachment', $configurableObject)")) - #if($attachment && $attachment.isImage()) - ## Set the icon for this section as the attachment URL. - #set($discard = $iconBySection.put($displayInSection, $app.getAttachmentURL($attachment.getFilename()))) - #end - ## - ## If the user doesn't have edit access to the application, we want to show a message on the icon - #if(!$xcontext.hasAccessLevel("edit", $app.getFullName())) - #if(!$sectionsUserCannotEdit.contains($displayInSection)) - #set($discard = $sectionsUserCannotEdit.add($displayInSection)) - #end - #elseif($sectionsUserCannotEdit.contains($displayInSection)) - ## If the user didn't have access to the section before but does have access to _this_ app which is - ## configured in the section, then the section becomes accessible. - #set($discard = $sectionsUserCannotEdit.remove($displayInSection)) - #end - #end## If section doesn't exist or user doesn't have access. - #end## Foreach configurable object in this app. - #end## Foreach application which is configurable. - ## - ## Now we go through sectionsToAdd and generate icons for them - #set($defaultIcon = $xwiki.getAttachmentURL($nameOfThisDocument, 'DefaultAdminSectionIcon.png')) - #if($globaladmin) - #set($queryString = "editor=globaladmin&amp;section=") - #else - #set($queryString = "space=${currentSpace}&amp;section=") - #if($request.getParameter('editor')) - #set($queryString = "editor=$escapetool.url($request.getParameter('editor'))&amp;$queryString") - #end - #end - - ## This is an html fragment and thus cannot be cleaned - {{html clean=false}} - #foreach($sectionToAdd in $sectionsToAdd) - #set($icon = $iconBySection.get($sectionToAdd)) - #if(!$icon) - #set($icon = $defaultIcon) - #end - <li class="$escapetool.xml($sectionToAdd).replaceAll(' ', '_')"> - #set($hasAccess = !$sectionsUserCannotEdit.contains($sectionToAdd)) - #if($hasAccess) - <a href="$xwiki.getURL($currentDoc, $xcontext.getAction(), "$queryString$escapetool.url($sectionToAdd)")"> - #else - <a title="$msg.get('xe.admin.configurable.sectionIconNoAccessTooltip')"> - #end - <span> - <img src="$icon" alt="$escapetool.xml($sectionToAdd) icon"/> - ## Try to translate the names of the sections, build the key by adding an "admin." in front. - ## Not the best way to translate, but very inline with the way the translations are done in XWiki.AdminSheet for individual administration page titles. - ## If there is no translation (translated message is equals to key), don't display the message key, but the section name instead. - #if($msg.get("admin.${sectionToAdd.toLowerCase()}") != "admin.${sectionToAdd.toLowerCase()}") - #set($sectionDisplayName = $msg.get("admin.${sectionToAdd.toLowerCase()}")) - #else - #set($sectionDisplayName = $sectionToAdd) - #end - $escapetool.xml($sectionDisplayName) - </span> - #if(!$hasAccess) - <br/><span class="errormessage">$msg.get('xe.admin.configurable.sectionIconNoAccess')</span> - #end - </a> - </li> - #end - {{/html}} - - ## Finally we display an error message if there are any applications which we were unable to view. - #if($appsUserCannotView.size() > 0) - - {{error}}$msg.get('xe.admin.configurable.noViewAccessSomeApplications', [$appsUserCannotView]){{/error}} - - #end -#end## If we should be looking at the main administration page. -## -##------------------------------------------------------------------------------------------------------------ -## The Macros, nothing below this point is run directly. -##------------------------------------------------------------------------------------------------------------ -## -#* - * - * Any documents which are on the provided list ($documentNames) which are locked by the current user will be unlocked. - * If this macro has programming rights, then they are unlocked programmatically, otherwise a javascript tag is - * generated with ajax calls to cancel for all of the documents. If there are documents on this list which are not - * locked by the current user, then they are ignored. - * - * @param $documentNames - List<String> - fullNames of documents which should be unlocked if they are locked by the - * current user. - *### -#macro(unlockDocuments $documentNames) - #if($documentNames.size() > 0) - #set($sql = "doc.fullName=") - #foreach($documentName in $documentNames) - #set($sql = "${sql}'$documentName' or doc.fullName=") - #end - ## Trim the dangling ' or doc.fullName=?' - #set($sql = $sql.substring(0, $sql.lastIndexOf(' or doc.fullName='))) - #set($sql = ", XWikiLock lock where lock.docId=doc.id and lock.userName='$xcontext.getUser()' and (${sql})") - #set($namesOfdocumentsToUnlock = $xwiki.searchDocuments($sql)) - ## Use ajax and hope the user runs javascript. - {{html}} - <script type="text/javascript"> - document.observe("dom:loaded", function() { - #foreach($nameOflockedDocument in $namesOfdocumentsToUnlock) - new Ajax.Request("$xwiki.getURL($nameOflockedDocument, 'cancel', 'ajax=1')"); - #end - }); - </script> - {{/html}}## - #end## If output list size > 0 -#end## Macro -## -#* - * Find names of documents which contain objects of the class 'XWiki.ConfigurableClass' - * - * @param $section - String - Look for apps which specify that they should be configured in this section, - * if null or "" then returns them for all sections. - * - * @param $globaladmin - boolean - If true then we will look for applications which should be configured globally. - * - * @param $space - String - If not looking for apps which are configured globally, then this is the space where we - * will look for apps in. If null or "" or if $globaladmin is true, then all spaces will be - * searched. - * - * @param $outputList - List - The returns from this macro will be put in this list, passing the list as a parameter - * a safety measure because macros can't return values. - *### -#macro(findNamesOfAppsToConfigure, $section, $globaladmin, $space, $outputList) - ## Use a parameterized sql query to prevent injection. - #set($params = []) - #if($section && $section != '') - #set($discard = $params.add("$section")) - #set($sqlA = ' StringProperty as section,') - #set($sqlB = " and section.id=obj.id and section.name='displayInSection' and section.value=?") - #else - ## Make sure they are "" in case they were set prior to calling the macro. - #set($sqlA = '') - #set($sqlB = '') - #end - ## Set up query based on value of $globaladmin - #if($globaladmin == true) - #set($sqlC = '1') - #else - #if($space && $space != '') - #set($sqlC = '0 and doc.space = ?') - #set($discard = $params.add($space)) - #else - #set($sqlC = '0') - #end - #end - #set($sql = ", BaseObject as obj,$sqlA IntegerProperty as global where " - + "doc.fullName=obj.name and obj.className='" + $nameOfThisDocument + "'$sqlB " - + "and global.id=obj.id and global.name='configureGlobally' and global.value=$sqlC " - + "order by doc.creationDate") - ## - ## Run the search - #set($outputList = $xwiki.searchDocuments($sql, 0, 0, $params)) - ## -#end -## -#* - * If this document is saved with programming access or is includeForm'd into a document with programming, we have to - * drop programming rights in order for it to run safely because it evaluates potentially untrustworthy code. - *### -#macro(sandboxDocument) - #if($xcontext.hasProgrammingRights()) - $xcontext.dropPermissions()## - #end -#end -## -#* - * Try to determine whether a document was edited by a user who has edit right on this page. This is tricky because - * documents are imported with the name XWiki.XWikiGuest who has no access to anything after import. - * - * @param theDoc - Document who's editor should be checked for edit access on this document. - *### -#macro(checkDocumentSavedByAuthorizedUser, $docToCheck, $currentDoc, $hasAccess) - ## The system is started and the only user is XWikiGuest who has admin right but gives it up when he imports the default - ## documents, we are checking to see if this looks like the guest imported the document with the first import. - #if($docToCheck.getWiki() == $xcontext.getMainWikiName() - && $docToCheck.getVersion() == '1.1' - && $docToCheck.getCreator() != $docToCheck.getContentAuthor() - && $docToCheck.getContentAuthor() == 'XWiki.XWikiGuest') - ## - #set($userToCheck = $docToCheck.getCreator()) - #else - #set($userToCheck = $docToCheck.getAuthor()) - #end - #set($hasAccess = $xwiki.hasAccessLevel('edit', $userToCheck, $currentDoc)) -#end -## -#* - * Show the heading for configuration for a given application. - * - * $appName (String) Name of the application to show configuration heading for. - * - * $headingAlreadyShowing (boolean) If true then we don't make another heading. Otherwise it is set to true. - *### -#macro(showHeading, $appName, $headingAlreadyShowing) - #if(!$headingAlreadyShowing) - #set($headingAlreadyShowing = true) - - = $msg.get("admin.customize") __[[$appName>>$appName]]__: = - #end -#end -{{/velocity}} diff --git a/src/main/webapp/docs/xwiki/XWiki/DefaultSkin.xml b/src/main/webapp/docs/xwiki/XWiki/DefaultSkin.xml deleted file mode 100644 index 1c63f4f2d..000000000 --- a/src/main/webapp/docs/xwiki/XWiki/DefaultSkin.xml +++ /dev/null @@ -1,160 +0,0 @@ - - -XWiki -DefaultSkin - -en -0 -XWiki.XWikiPreferences -XWiki.Admin -XWiki.Admin - -xwiki:XWiki.Admin -1167576476000 -1167576476000 -1167576476000 -1.1 -$msg.get("xe.admin.skin") - - - -Imported from XAR -false -xwiki/2.0 -false - - -XWiki.XWikiSkins - - - - - - - - -0 -baseskin -2 -Base Skin -30 -0 -com.xpn.xwiki.objects.classes.StringClass - - -0 -edit.vm -9 -Edit -15 -80 -0 -com.xpn.xwiki.objects.classes.TextAreaClass - - -0 -footer.vm -6 -Footer -15 -80 -0 -com.xpn.xwiki.objects.classes.TextAreaClass - - -0 -header.vm -5 -Header -15 -80 -0 -com.xpn.xwiki.objects.classes.TextAreaClass - - -0 -logo -3 -Logo -30 -0 -com.xpn.xwiki.objects.classes.StringClass - - -0 -name -1 -Name -30 -0 -com.xpn.xwiki.objects.classes.StringClass - - -0 -style.css -4 -Style -15 -80 -0 -com.xpn.xwiki.objects.classes.TextAreaClass - - -0 -view.vm -8 -View -15 -80 -0 -com.xpn.xwiki.objects.classes.TextAreaClass - - -0 -viewheader.vm -7 -View Header -15 -80 -0 -com.xpn.xwiki.objects.classes.TextAreaClass - - -XWiki.DefaultSkin -0 -XWiki.XWikiSkins -c52655e2-0fae-4b2c-8508-378d1c1fb4ac - -colibri - - - - - - - - - - - -logo.png - - -Default XWiki Skin - - - - - - - - - - - -{{velocity}} -$msg.get("xe.admin.skin.makeyourown") - -* {{html clean="false"}}<a href="$doc.getURL('edit', 'editor=object&amp;classname=XWiki.XWikiSkins')">$msg.get('xe.admin.skin.editskin')</a>{{/html}} -* [[$msg.get('xe.admin.skin.testskin')>>Main.WebHome?skin=${doc.fullName}]] -{{/velocity}} diff --git a/src/main/webapp/docs/xwiki/XWiki/XWikiGroupSheet.xml b/src/main/webapp/docs/xwiki/XWiki/XWikiGroupSheet.xml index de4e78be1..06c781744 100644 --- a/src/main/webapp/docs/xwiki/XWiki/XWikiGroupSheet.xml +++ b/src/main/webapp/docs/xwiki/XWiki/XWikiGroupSheet.xml @@ -155,20 +155,6 @@ $services.css.includeCSSPage(':js/xwiki/table/livetable.css')## $('addNewGroup').observe('click', this.addNewMember.bind(this, 'group', $('groupSuggest'))); } }, - createSuggest: function(input, uorg, suggestObj) { - // Clear the errors - $('errMsg').innerHTML = ""; - suggesturl = "${doc.getURL('view', 'xpage=uorgsuggest&classname=XWiki.XWikiUsers&wiki=local')}"; - - if (uorg == "user") { - suggesturl += "&uorg=user&"; - icon = "$xwiki.getSkinFile('icons/silk/user.gif')"; - } else { - suggesturl += "&uorg=group&"; - icon = "$xwiki.getSkinFile('icons/silk/group.gif')"; - } - return new XWiki.widgets.Suggest(input, { script: suggesturl, varname:'input', icon:icon }); - }, addNewMember: function(uorg, input) { if (input) { var url = "${doc.getURL()}?xpage=adduorg&uorg=" + uorg + "&name=" + input.value; diff --git a/src/main/webapp/docs/xwiki/XWiki/XWikiUserPreferencesSheet.xml b/src/main/webapp/docs/xwiki/XWiki/XWikiUserPreferencesSheet.xml deleted file mode 100644 index 760585569..000000000 --- a/src/main/webapp/docs/xwiki/XWiki/XWikiUserPreferencesSheet.xml +++ /dev/null @@ -1,64 +0,0 @@ - - -XWiki -XWikiUserPreferencesSheet - -en -0 -XWiki.XWikiUserSheet -XWiki.Admin -XWiki.Admin - -xwiki:XWiki.Admin -1263288512000 -1263288512000 -1263288512000 -1.1 - - - - -Imported from XAR -false -xwiki/2.0 -false -{{velocity}} -#set($obj = $doc.getObject("XWiki.XWikiUsers")) -#if(!$obj) -{{info}}$msg.get('xe.admin.users.applyonusers'){{/info}}## -#else -$doc.use($obj) -##$xwiki.ssx.use('XWiki.XWikiUserSheet')## -{{html wiki="true"}} - <div class="#if($context.action == 'view')half #{else}full #{end}column"> - <div class="userPreferences"> - #if($xcontext.action == 'view' && $hasEdit) - <div class="editProfileCategory"><a href="$doc.getURL('inline', 'category=preferences')"><span class="hidden">$msg.get('platform.core.profile.category.preferences.edit')</span></a></div> - #end - <h1>$msg.get('platform.core.profile.section.displayPreferences')</h1> - <dl> - <dt class="label"><label>$msg.get('platform.core.profile.enableAccessibility')</label></dt> - <dd>$doc.display('accessibility')</dd> - </dl> - <h1>$msg.get('platform.core.profile.section.editorPreferences')</h1> - <dl> - <dt class="label"><label>$msg.get('platform.core.profile.editor')</label></dt> - <dd>$doc.display('editor')</dd> - <dt class="label"><label>$msg.get('platform.core.profile.userType')</label></dt> - <dd>$doc.display('usertype')</dd> - </dl> - </div> - </div> - #set($isMyProfile = ($xwiki.getDocument($xcontext.user).prefixedFullName == $doc.prefixedFullName)) - #if(($isMyProfile || $hasAdmin) && !$doc.getObject('XWiki.LDAPProfileClass') && $xcontext.action == 'view') - <div class="half column"> - <div class="passwordManagement"> - <h1>$msg.get('platform.core.profile.section.security')</h1> - <span class="buttonwrapper"><a id="changePassword" href="$doc.getURL("view", "xpage=passwd")">$msg.get("platform.core.profile.changePassword")</a></span> - </div> - </div> - #end - <div class="clearfloats">&nbsp;</div> -{{/html}}## -#end -{{/velocity}} diff --git a/src/main/webapp/docs/xwiki/XWiki/XWikiUserProfileSheet.xml b/src/main/webapp/docs/xwiki/XWiki/XWikiUserProfileSheet.xml deleted file mode 100644 index a7dfbe565..000000000 --- a/src/main/webapp/docs/xwiki/XWiki/XWikiUserProfileSheet.xml +++ /dev/null @@ -1,112 +0,0 @@ - - -XWiki -XWikiUserProfileSheet - -en -0 -XWiki.XWikiUserSheet -XWiki.Admin -XWiki.Admin - -xwiki:XWiki.Admin -1262856167000 -1262856167000 -1262856167000 -1.1 - - - - -Imported from XAR -false -xwiki/2.0 -false -{{velocity}} -#set($obj = $doc.getObject("XWiki.XWikiUsers")) -## Allow $obfuscateEmail to be set in some other place. -#if("$!obfuscateEmail" == '') - #set($obfuscateEmail = true) -#end -#if(!$obj) -= $msg.get('xe.admin.users.sheet') = - -{{info}}$msg.get('xe.admin.users.applyonusers'){{/info}}## -#else -$doc.use($obj) -{{html clean="false" wiki="true"}} -#set($username = $xwiki.getUserName($doc.fullName, false)) -= $msg.get('platform.core.profile.title', [$username]) = - -#if($xcontext.action == 'view') - <div class="vcard"> - <span class="fn hidden">$username</span> -#end -##$xwiki.ssx.use("XWiki.XWikiUserSheet")## - <div class="#if($context.action == 'view')half #{else}full #{end}column"> - <div class="userInfo"> - #if($xcontext.action == 'view' && $hasEdit) - <div class="editProfileCategory"><a href="$doc.getURL('inline', 'category=profile')"><span class="hidden">$msg.get('platform.core.profile.category.profile.edit')</span></a></div> - #end - ## Please do not insert extra empty lines here (as it affects the validity of the rendered xhtml) - <h1>$msg.get('platform.core.profile.section.personal')</h1> - <dl> - <dt class="label"><label>$msg.get('platform.core.profile.firstname')</label></dt> - <dd #if($xcontext.action == 'view')class="given-name"#end>$doc.display('first_name')</dd> - <dt class="label"><label>$msg.get('platform.core.profile.lastname')</label></dt> - <dd #if($xcontext.action == 'view')class="family-name"#end>$doc.display('last_name')</dd> - #if(($obj.getProperty('company') && $obj.getProperty('company').getValue() != '') || $xcontext.action != 'view') - <dt class="label"><label>$msg.get('platform.core.profile.company')</label></dt> - <dd #if($xcontext.action == 'view')class="org"#end>$doc.display('company')</dd> - #end - #if(($obj.getProperty('comment') && $obj.getProperty('comment').getValue() != '') || $xcontext.action != 'view') - <dt class="label"><label>$msg.get('platform.core.profile.about')</label></dt> - <dd #if($xcontext.action == 'view')class="note"#end>$doc.display('comment')</dd> - #end - </dl> - <h1>$msg.get('platform.core.profile.section.contact')</h1> - <dl> - <dt class="label"><label>$msg.get('platform.core.profile.email')</label></dt> - <dd #if($xcontext.action=="view")class="email"#end>#if($xcontext.action != 'view' || !$obfuscateEmail)$doc.display('email')#else $doc.display('email').replaceAll('@.*', '@ ~-~-~-~-~-~-')#end</dd> - <dt class="label"><label>$msg.get('platform.core.profile.phone')</label></dt> - <dd #if($xcontext.action == 'view')class="tel"#end>$doc.display('phone')</dd> - <dt class="label"><label>$msg.get('platform.core.profile.address')</label></dt> - <dd #if($xcontext.action == 'view')class="adr"#end>$doc.display('address')</dd> - </dl> - #set($hasBlog = ($obj.getProperty('blog') && $obj.getProperty('blog').getValue() != '')) - #set($hasBlogFeed = ($obj.getProperty('blogfeed') && $obj.getProperty('blogfeed').getValue() != '')) - #if($hasBlog || $hasBlogFeed || $xcontext.action != 'view') - <h1>$msg.get('platform.core.profile.section.links')</h1> - <dl> - #if($hasBlog || $xcontext.action != 'view') - <dt class="label"><label>$msg.get('platform.core.profile.blog')</label></dt> - <dd>$doc.display('blog')</dd> - #end - #if($hasBlogFeed || $xcontext.action != 'view') - <dt class="label"><label>$msg.get('platform.core.profile.blogFeed')</label></dt> - <dd>$doc.display('blogfeed')</dd> - #end - </dl> - #end - </div> - </div> - #if ($xcontext.action == 'view') - <div class="half column"> - <div class="userRecentChanges"> - <h1>$msg.get('platform.core.profile.section.activity')</h1> -{{/html}} - -{{activity authors="${doc.fullName}" /}} - -{{html clean="false"}} - </div> - </div> - #end - <div class="clearfloats">&nbsp;</div> -#if($xcontext.action == 'view') - ## Close the vcard - </div> -#end -{{/html}}## -#end -{{/velocity}} diff --git a/src/main/webapp/docs/xwiki/XWiki/XWikiUserSheet.xml b/src/main/webapp/docs/xwiki/XWiki/XWikiUserSheet.xml deleted file mode 100644 index b0c66fd04..000000000 --- a/src/main/webapp/docs/xwiki/XWiki/XWikiUserSheet.xml +++ /dev/null @@ -1,445 +0,0 @@ - - -XWiki -XWikiUserSheet - -en -0 -Main.XWikiUsers -XWiki.Admin -XWiki.Admin - -xwiki:XWiki.Admin -1106308018000 -1106308018000 -1106308018000 -1.1 - - - - -Imported from XAR -false -xwiki/2.0 -false -noavatar.png -3076 -XWiki.Admin -1263400909000 -1.1 -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 - - -XWiki.XWikiUserSheet -0 -XWiki.JavaScriptExtension -4a317e5c-a75e-4dec-aad0-1f80ffde5124 - -long - - -Object.extend(XWiki, { - userprofile : { - - init : function() { - if ($('avatar')) { - Event.observe($('avatar'), 'mouseover', function() { XWiki.userprofile.displayChangePhoto('true') }); - Event.observe($('avatar'), 'mouseout', function() { XWiki.userprofile.displayChangePhoto('false') }); - XWiki.userprofile.adjustTabsContainerHeight(); - } - }, - - /* - ** This ugly hack is used as a workaround for IE6 box model (3px jog bug) which prevent from - ** putting the separating border between tabs and panes on the pane div. We put the border - ** on the tabs container and adjust its size depending on the size of the right pane. - ** FIXME: find a better mechanism for tabbed UIs / drop this hack when stopping IE6 support. - */ - adjustTabsContainerHeight: function() { - var currentPane; - $("vertical-panes").select("div.vertical-pane").each(function(pane){ - if(!pane.hasClassName('hidden')) { - currentPane = pane; - } - }); - if (currentPane.getHeight() > $('vertical-tabs').getHeight()) { - $('vertical-tabs').setStyle({ height: currentPane.getHeight() + 'px' }); - } else { - $('vertical-tabs').setStyle({ height: '' }); - } - }, - - displayChangePhoto : function(display) { - var changePhoto = $('avatarUpload'); - if (display == true) { - changePhoto.removeClassName('hidden'); - } else { - changePhoto.addClassName('hidden'); - } - }, - - switchTab : function(tab) { - $("vertical-panes").select("div.vertical-pane").each(function(pane){ - pane.addClassName('hidden'); - }); - $('vertical-tabs').setStyle({ height: '' }); - $(tab + 'Pane').removeClassName('hidden'); - $("vertical-tabs").select("li.vertical-tab").each(function(tab){ - tab.removeClassName('active'); - }); - $(tab + 'Tab').addClassName('active'); - XWiki.userprofile.adjustTabsContainerHeight(); - } - } -}); - -Event.observe(window, 'load', function() { XWiki.userprofile.init() }); - - -userprofile - - -0 - - -onDemand - - - - -XWiki.SheetClass - - - - - - - - -0 -defaultEditMode -1 -Default Edit Mode -15 -0 -com.xpn.xwiki.objects.classes.StringClass - - -XWiki.XWikiUserSheet -0 -XWiki.SheetClass -03ac24bd-55c2-4ce2-b80a-9b4ecf5f5282 - - - - - -XWiki.XWikiUserSheet -0 -XWiki.StyleSheetExtension -30c9f7e7-0b53-468b-a254-645d035d9416 - -long - - -#template("colorThemeInit.vm") -#set($tabswidth = "130px") - -td.recentChangesLeft, .recentChangesMoreActions { - display:none; -} - -td.recentChangesRight { - padding: 0 !important; -} - -#profilePane .column h1 { - font-weight:bold; - font-size:115%; - margin:10px 0; -} - -#profilePane .column h2 { - font-size: 110%; -} - -div.userInfo, div.userRecentChanges, div.userPreferences, div.passwordManagement, div.watchlistManagement, div.watchlistRss, div.watchlistElements { - margin: 5px 10px 10px; - padding: 5px 10px 10px; -} - -div.userInfo, div.userPreferences, div.watchlistManagement { - background-color: $theme.backgroundSecondaryColor; -} - -.userInfo img { - max-width: 100%; -} - -div.userInfo input[type="text"], div.userInfo input[type="password"], div.userInfo textarea, div.userInfo select, div.userPreferences select { - width: 100%; -} - -div.editProfileCategory { - float:right; -} - -div.editProfileCategory a { - display:block; - width: 16px; - height: 16px; - background: url($xwiki.getSkinFile('icons/silk/pencil.gif')) no-repeat; -} - -/* Watchlist */ - -#watchlistRssLink { - background: url($xwiki.getSkinFile('icons/xwiki/rss-medium.png')) no-repeat; - padding-left: 18px; - font-weight: bold; -} - -span.wikiWatchlistType, span.spaceWatchlistType, span.pageWatchlistType { - width: 16px; - height: 16px; - display: block; -} - -span.wikiWatchlistType { - background: url($xwiki.getSkinFile('icons/silk/world.gif')) no-repeat; -} - -span.spaceWatchlistType { - background: url($xwiki.getSkinFile('icons/silk/folder.gif')) no-repeat; -} - -span.pageWatchlistType { - background: url($xwiki.getSkinFile('icons/silk/page_white_text.gif')) no-repeat; -} - -/* Tabs */ - -div#vertical-panes { - margin-top: 10px; -} - -span#avatarUpload { - display:block; - width:$tabswidth; - position:absolute; - font-size: 10px; - font-weight: bold; - background-color: white; -} - -#vertical-tabs { - float:left; - width:$tabswidth; - border-right: solid 1px $theme.menuBackgroundColor; -} - -#vertical-tabs ul { - margin:0; - margin-top:5px; - padding:0; - border-right:0; - border-bottom:0; - border-left:0; -} - -#vertical-tabs ul li { - display: block; - list-style-type: none; - list-style-position: outside; - margin:0; - border: solid 1px $theme.pageContentBackgroundColor; - border-right: 0; -} - -#vertical-tabs ul li img { - float:left; - margin-right:4px; - vertical-align:middle; -} - -#vertical-tabs ul li span { - line-height:1.5em; -} - -#vertical-tabs ul li.active { - border: solid 1px $theme.menuBackgroundColor; - border-right: 0px; -} - -#vertical-tabs ul li a { - padding: 3px 0px 3px 10px; - text-decoration: none; - display:block; - color:$theme.menuBackgroundColor; -} - -#vertical-tabs ul li.active a { - text-decoration: none; - position:relative; - left:1px; - background:$theme.pageContentBackgroundColor; - color: $theme.textColor; - padding-left: 9px; -} - -.vertical-pane { - margin-left:$tabswidth; - padding: 10px; - padding-top: 0; -} - -.vertical-pane .column { - overflow: hidden; -} - - -userprofile - - -1 - - -onDemand - - -{{velocity}} -## -## Extensions and vars -## -##$xwiki.ssx.use("XWiki.XWikiUserSheet")## -##$xwiki.jsx.use("XWiki.XWikiUserSheet")## -#set($obj = $doc.getObject("XWiki.XWikiUsers")) -## -## Categories -## -#set($categories = $util.arrayList) -#set($discard = $categories.add(['profile', $msg.get('platform.core.profile.category.profile'), 'XWiki.XWikiUserProfileSheet', 'icons/silk/vcard.gif'])) -#set($isMyProfile = ($xcontext.user == $doc.fullName)) -#if($isMyProfile || $hasAdmin) - #set($discard = $categories.add(['preferences', $msg.get('platform.core.profile.category.preferences'), 'XWiki.XWikiUserPreferencesSheet', 'icons/silk/wrench.gif'])) -#end -## TODO: add APIs to be able to display users watchlists to admins -#if($isMyProfile && $hasWatch) - #set($discard = $categories.add(['watchlist', $msg.get('platform.core.profile.category.watchlist'), 'XWiki.XWikiUserWatchListSheet', 'icons/silk/star.gif'])) -#end -## -## Avatar -## -#set($avatarURL = '') -#if($obj.getProperty("avatar") && $obj.getProperty("avatar").getValue() != '') - #foreach ($attach in $doc.attachmentList) - #if($attach.filename == $obj.getProperty("avatar").getValue()) - #set($avatarURL = "$doc.getAttachmentURL($attach.filename, 'download', 'width=120')") - #end - #end -#end -#if("$!avatarURL" == '') - #set($avatarURL = $xwiki.getDocument("XWiki.XWikiUserSheet").getAttachmentURL('noavatar.png', 'download', 'width=120')) -#end -## -## Current category -## -#set($currentCategory = "$!request.category") -#if($currentCategory == "") - #set($currentCategory = $listtool.get($listtool.get($categories, 0), 0)) -#end -## -## Display -## -{{html clean="false"}} - <div id="vertical-panes"> - ## - ## Tabs - ## - <div id="vertical-tabs"> - <div id="avatar"> - <span id="avatarUpload" class="hidden">$msg.get('platform.core.profile.changePhoto')</span> - <a href="$doc.getURL('edit', 'xpage=changemyavatar')" ><img class="photo" id="xwikiuseravatar" alt="$doc.display('first_name', 'view', $obj)" src="$avatarURL"/></a> - </div> - <div> - <ul> - #foreach($tab in $categories) - #set($tabKey = $listtool.get($tab, 0)) - #set($tabName = $listtool.get($tab, 1)) - #set($tabIcon = $listtool.get($tab, 3)) - <li id="${tabKey}Tab" class="vertical-tab#if($tabKey == $currentCategory) active#end"><a href="?category=${tabKey}"><img src="$xwiki.getSkinFile($tabIcon)" alt="$tabName" /><span>$tabName</span></a><script type="text/javascript">Event.observe($("${tabKey}Tab"), 'click', function(event) { XWiki.userprofile.switchTab("${tabKey}"); Event.stop(event); });</script></li> - #end - </ul> - </div> - </div> - ## - ## Panes - ## - #foreach($tab in $categories) - #set($tabKey = $listtool.get($tab, 0)) - #set($tabInclude = $listtool.get($tab, 2)) - <div id="${tabKey}Pane" class="vertical-pane#if($tabKey != $currentCategory) hidden#end"> -{{/html}} - -{{include document="${tabInclude}" /}} - -{{html clean="false"}} - </div> - #end - <div class="clearfloats">&nbsp;</div> - </div> -{{/html}} -{{/velocity}} diff --git a/src/main/webapp/docs/xwiki/XWiki/XWikiUserTemplate.xml b/src/main/webapp/docs/xwiki/XWiki/XWikiUserTemplate.xml deleted file mode 100644 index d0b083c95..000000000 --- a/src/main/webapp/docs/xwiki/XWiki/XWikiUserTemplate.xml +++ /dev/null @@ -1,25 +0,0 @@ - - -XWiki -XWikiUserTemplate - -en -0 -XWiki.XWikiUsers -XWiki.Admin -XWiki.Admin - -xwiki:XWiki.Admin -1106311618000 -1265297862000 -1265297862000 -1.1 - - - - -Imported from XAR -false -xwiki/2.0 -false -{{include document="XWiki.XWikiUserSheet"/}} diff --git a/src/main/webapp/resources/celJS/addSuggest.js b/src/main/webapp/resources/celJS/addSuggest.js deleted file mode 100644 index b2c9a7967..000000000 --- a/src/main/webapp/resources/celJS/addSuggest.js +++ /dev/null @@ -1,70 +0,0 @@ -/* - * See the NOTICE file distributed with this work for additional - * information regarding copyright ownership. - * - * This is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this software; if not, write to the Free - * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA, or see the FSF site: http://www.fsf.org. - */ - -Event.observe(window, 'load', getSuggestConf); - -function getSuggestConf() { - var fields = new Array(); - $$('input').each(function(inpField){ - if(inpField.type == 'text') { - fields.push(inpField.id); - } - }); - new Ajax.Request('?', { - method : 'post', - parameters : { - 'xpage' : 'celements_ajax', - 'ajax_mode' : 'GetSuggestFields', - 'fields' : fields - }, - onSuccess : function(transport){ - answer = transport.responseText; - if(answer.isJSON()) { - jsonanswer = transport.responseText.evalJSON(); - for(var i = 0; i < jsonanswer.length; i++) { - addSuggest(jsonanswer[i]); - } - } else { - if ((typeof console != 'undefined') && (typeof console.error != 'undefined')) { - console.error("Ajax answer is no JSON.", transport); - } - } - }, - onFailure : function(transport) { - if ((typeof console != 'undefined') && (typeof console.error != 'undefined')) { - console.error("Getting suggest fields failed.", transport); - } - } - }); -} - -var addSuggest = function(conf) { - Event.observe($(conf.id), "focus", function() { - var url = '?xpage=suggest&classname=' + conf.classname + '&fieldname=' + conf.fieldname + '&'; - new XWiki.widgets.Suggest(this, { - script: url, - varname: "input", - seps: " ,|", - offsety: 13, - minchars: 2, - timeout: 10000 - }); - }); -}; diff --git a/src/main/webapp/resources/celRes/CelLayout.css b/src/main/webapp/resources/celRes/CelLayout.css index ea1216da2..06ec228e5 100644 --- a/src/main/webapp/resources/celRes/CelLayout.css +++ b/src/main/webapp/resources/celRes/CelLayout.css @@ -17,7 +17,7 @@ body #cel_layout_editor #cel_skin_editor_reorder_tree ul { padding-bottom: 2px; } body #cel_layout_editor #cel_skin_editor_reorder_tree ul li{ - list-style-image: url("$xwiki.getSkinFile('celRes/document.gif', true)"); + list-style-image: url(/skin/resources/celRes/document.gif); list-style-position: inside; margin: 0px; padding: 0px; @@ -94,22 +94,22 @@ body #cel_layout_editor #cel_skin_editor_reorder_tree.reorderMode ul li{ width:90%; } body #cel_layout_editor #cel_skin_editor_reorder_tree ul li.PageContentCell{ - list-style-image:url("$xwiki.getSkinFile('celRes/PageContentCell.gif', true)"); + list-style-image:url(/skin/resources/celRes/PageContentCell.gif); } body #cel_layout_editor #cel_skin_editor_reorder_tree ul li.BannerCell{ - list-style-image:url("$xwiki.getSkinFile('celRes/BannerCell.gif', true)") + list-style-image:url(/skin/resources/celRes/BannerCell.gif) } body #cel_layout_editor #cel_skin_editor_reorder_tree ul li.NavigationCell{ - list-style-image:url("$xwiki.getSkinFile('celRes/NavigationCell.gif', true)") + list-style-image:url(/skin/resources/celRes/NavigationCell.gif) } body #cel_layout_editor #cel_skin_editor_reorder_tree ul li.RichTextCell{ - list-style-image:url("$xwiki.getSkinFile('celRes/RichTextCell.gif', true)") + list-style-image:url(/skin/resources/celRes/RichTextCell.gif) } body #cel_layout_editor #cel_skin_editor_reorder_tree ul li.SlideshowCell{ - list-style-image:url("$xwiki.getSkinFile('celRes/SlideShowCell.gif', true)") + list-style-image:url(/skin/resources/celRes/SlideShowCell.gif) } body #cel_layout_editor #cel_skin_editor_reorder_tree ul li.GroupCell{ - list-style-image:url("$xwiki.getSkinFile('celRes/GroupCell.gif', true)") + list-style-image:url(/skin/resources/celRes/GroupCell.gif) } #cel_layout_editor{ font-family:Tahoma,Geneva,Helvetica,Arial,sans-serif; diff --git a/src/main/webapp/resources/celRes/ImageAndFilePicker/ImageAndFilePicker.css b/src/main/webapp/resources/celRes/ImageAndFilePicker/ImageAndFilePicker.css index b0a341fd9..c37c8bedb 100644 --- a/src/main/webapp/resources/celRes/ImageAndFilePicker/ImageAndFilePicker.css +++ b/src/main/webapp/resources/celRes/ImageAndFilePicker/ImageAndFilePicker.css @@ -1,5 +1,5 @@ -@import url(google-fonts/Terminal-Dosis/Terminal-Dosis-200,300,400,500,600,700,800.css); -@import url(google-fonts/Open-Sans/Open-Sans-300italic,400italic,600italic,700italic,800italic,300,400,600,700,800.css); +@import url(celRes/google-fonts/Terminal-Dosis/Terminal-Dosis-200,300,400,500,600,700,800.css); +@import url(celRes/google-fonts/Open-Sans/Open-Sans-300italic,400italic,600italic,700italic,800italic,300,400,600,700,800.css); .filebasePicker #attachments { display: flex; diff --git a/src/main/webapp/resources/celRes/celTabMenu/tabMenu.css b/src/main/webapp/resources/celRes/celTabMenu/tabMenu.css index 293a7697f..b125e666f 100644 --- a/src/main/webapp/resources/celRes/celTabMenu/tabMenu.css +++ b/src/main/webapp/resources/celRes/celTabMenu/tabMenu.css @@ -1,4 +1,4 @@ -@import url(google-fonts/Terminal-Dosis/Terminal-Dosis-200,300,400,500,600,700,800.css); +@import url(celRes/google-fonts/Terminal-Dosis/Terminal-Dosis-200,300,400,500,600,700,800.css); /* tabMenu.css: * tabMenu layout * 2008 - 2011 synventis gmbh diff --git a/src/main/webapp/resources/celRes/celements2.css b/src/main/webapp/resources/celRes/celements2.css index 3065f478f..49f6d8ece 100644 --- a/src/main/webapp/resources/celRes/celements2.css +++ b/src/main/webapp/resources/celRes/celements2.css @@ -1,5 +1,5 @@ -@import url(google-fonts/Terminal-Dosis/Terminal-Dosis-200,300,400,500,600,700,800.css); -@import url(google-fonts/Open-Sans/Open-Sans-300italic,400italic,600italic,700italic,800italic,300,400,600,700,800.css); +@import url(celRes/google-fonts/Terminal-Dosis/Terminal-Dosis-200,300,400,500,600,700,800.css); +@import url(celRes/google-fonts/Open-Sans/Open-Sans-300italic,400italic,600italic,700italic,800italic,300,400,600,700,800.css); /* Floating Windows Classes */ .sheet { position: absolute; diff --git a/src/main/webapp/resources/celRes/theme/defaultColors.css b/src/main/webapp/resources/celRes/theme/defaultColors.css new file mode 100644 index 000000000..da2076f06 --- /dev/null +++ b/src/main/webapp/resources/celRes/theme/defaultColors.css @@ -0,0 +1,27 @@ +:root { + --pageBackgroundColor: #DDDDDD; + --pageHeaderBackgroundColor: #FFFFFF; + --pageContentBackgroundColor: #FFFFFF; + --textColor: #000000; + --textPrimaryColor: #888888; + --textSecondaryColor: #b3b3b3; + --titleColor: #888888; + --borderColor: #CCCCCC; + --linkColor: #0089DC; + --highlightColor: #FFFFDD; + --menuBackgroundColor: #CCCCCC; + --menuLinkColor: #FFFFFF; + --menuSelectedEntryBackgroundColor: #EFEFEF; + --menuSelectedEntryLinkColor: #888888; + --panelBackgroundColor: #FFFFFF; + --panelHeaderBackgroundColor: #FFFFFF; + --panelHeaderTextColor: #888888; + --panelTextColor: #000000; + --panelCollapsedBackgroundColor: #CCCCCC; + --panelCollapsedTextColor: #FFFFFF; + --buttonPrimaryBackgroundColor: #0089DC; + --buttonPrimaryTextColor: #FFFFFF; + --buttonSecondaryBackgroundColor: #FFFFFF; + --buttonSecondaryTextColor: #0089DC; + --backgroundSecondaryColor: #EFEFEF; +} diff --git a/src/main/webapp/resources/js/smartclient/initsc.js b/src/main/webapp/resources/js/smartclient/initsc.js deleted file mode 100644 index cd8e1992f..000000000 --- a/src/main/webapp/resources/js/smartclient/initsc.js +++ /dev/null @@ -1,7 +0,0 @@ -// prevent collision with prototype, see http://forums.smartclient.com/showthread.php?t=853 -window.isc_useSimpleNames = false; -// -// TODO : When XWIKI-3582 will be fixed we should better use the line below. -// var isomorphicDir = "$xwiki.getSkinFile('js/smartclient/')"; -// -var isomorphicDir = "${request.getContextPath()}/resources/js/smartclient/"; diff --git a/src/main/webapp/resources/js/smartclient/overwritesc.js b/src/main/webapp/resources/js/smartclient/overwritesc.js deleted file mode 100644 index 0065ee048..000000000 --- a/src/main/webapp/resources/js/smartclient/overwritesc.js +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Overrides the isc.Element.getOffsetLeft() function set in ISC_Core with this version, fixed to work around - * the bug described by http://forums.smartclient.com/showthread.php?t=3097 . - * TODO: remove when we'll upgrade SmartClient to the 7.0 version, which is mentioned to fix the bug. - */ - -isc.Element.addClassMethods({ -// Element.getOffsetLeft() -// Takes 'element' -// element should be a pointer to a DOM element or the ID for a DOM element -// (To get the offsetLeft for a widget use use widget.getOffsetLeft() instead) -// Returns the true offsetLeft - the absolute left coordinate with respect to whatever is -// reported by the DOM as the offsetParent of the element. -getOffsetLeft : function (element) { - - // Note: This method is used by the canvas instance 'getOffsetLeft()' method to calculate - // the offset position. - // We work with coordinates / sizes relative to the outside of any margins around our - // widgets - do the same with this method. - - if (element == null) { - this.logWarn("getOffsetLeft: passed null element"); - return 0; - } - - // IE and Moz both return somewhat unreliable values for element.offsetLeft by default. - // Paper over these bugs and differences. - var left = element.offsetLeft; - // --- caching code: - // If we've already calculated a value (based on a reported offsetLeft value), and - // the reported value has not changed, return the previously calculated value. - // This caching is safe except for cases where an indirect parent's styling changes in a - // way that would affect this element's true offsetLeft. - if (element._cachedReportedOffsetLeft == left) { - return element._cachedCalculatedOffsetLeft; - } else { - // debug message for sanity checking coordinate caching - //this.logWarn(element.getAttribute("eventProxy") + ": new DOM value for offsetLeft"); - } - - // always subtract the left margin (if there is one) to get the position OUTSIDE the - // margins. - // Note: for a negative margin, the reported offsetLeft does not need to be adjusted by the - // specified margin size - it represents the position of the element - and in this case there - // is no margin outside the element (rather the specified margin shifts the element to the - // left / up) - var leftMargin = parseInt(isc.Element.getComputedStyleAttribute(element, "marginLeft")); - if (isc.isA.Number(leftMargin) && leftMargin > 0) { - left -= leftMargin; - } - - - var documentBody = this.getDocumentBody(), - parentStyle, - px = "px", - // determine whether the element is absolutely / relatively / etc. positioned - elementPosition = element.style.position; - - // Workarounds for Moz - if (isc.Browser.isMoz) { - // In moz we get some unexpected results - - if (element.offsetParent == null) return left; - - if (element.offsetParent != documentBody) { - - parentStyle = - this.ns.Element.getComputedStyle(element.offsetParent, ["borderLeftWidth", "overflow"]); - - // The behavior changes with different releses of Moz / Firefox - var geckoVersion = isc.Browser.geckoVersion, - - - scrollingAdjustment = (parentStyle.overflow != "visible") && - (geckoVersion >= 20051111 || - (elementPosition == isc.Canvas.ABSOLUTE && parentStyle.overflow != "hidden")), - - accountForBorderBox = (geckoVersion > 20020826 && - (element.offsetParent.style.MozBoxSizing == "border-box")); - - - if (accountForBorderBox != scrollingAdjustment) { - - - if (accountForBorderBox) { - left -= (isc.isA.Number(parseInt(parentStyle.borderLeftWidth)) ? - parseInt(parentStyle.borderLeftWidth) : 0); - - } - - if (scrollingAdjustment) { - left += (isc.isA.Number(parseInt(parentStyle.borderLeftWidth)) ? - parseInt(parentStyle.borderLeftWidth) : 0); - - } - } - - } - } - - // Workarounds for IE - - if (isc.Browser.isIE && !isc.Browser.isIE8Strict) { - - - - var currentParent = element.offsetParent, - parentStyle; - // I bet parentStyle!=documentBody should not have been like this here, but I'll avoid changing it since I haven't got a better idea - // and make sure currentParent is not null at this point otherwise the next access will fail - if (currentParent && parentStyle != documentBody) parentStyle = currentParent.currentStyle; - - - var hasSpecifiedSize = (element.currentStyle.height != isc.Canvas.AUTO || - element.currentStyle.width != isc.Canvas.AUTO); - - - var continueDeductingBorders = true; - - // iterate up the offsetParents till we reach the doc. body - // Better comparison with the document.body than with documentBody which differs from strict to quirks mode - // and make sure currentParent is not null - // This whole loops seems very unsafe wrt currentParent.offsetParent which can be null - while (currentParent && currentParent != document.body) { - - - - - if (parentStyle.position == isc.Canvas.ABSOLUTE) continueDeductingBorders = false; - - - if (parentStyle.width == isc.Canvas.AUTO && - parentStyle.height == isc.Canvas.AUTO && - parentStyle.position == isc.Canvas.RELATIVE) { - - - if (continueDeductingBorders && - isc.isA.String(parentStyle.borderLeftWidth) && - parentStyle.borderLeftWidth.contains(px) ) { - left -= parseInt(parentStyle.borderLeftWidth); - } - - - if (hasSpecifiedSize) { - - if (isc.isA.String(parentStyle.marginLeft) && - parentStyle.marginLeft.contains(px)) - { - var parentMarginLeft = parseInt(parentStyle.marginLeft); - if (parentMarginLeft > 0) left -= parentMarginLeft; - } - - - if (currentParent.offsetParent != documentBody) { - - var superPadding = currentParent.offsetParent.currentStyle.padding; - if (isc.isA.String(superPadding) && superPadding.contains(px)) { - left -= parseInt(superPadding); - } - } else { - - left -= (documentBody.leftMargin ? parseInt(documentBody.leftMargin) : 0); - } - } - - } // end of if - - - elementPosition = currentParent.style.position; - currentParent = currentParent.offsetParent; - // make sure the currentParent is not null again at this point - if (currentParent && currentParent != document.body) { - parentStyle = currentParent.currentStyle; - } - - } // End of while loop - - } - - // Workarounds for Safari - if (isc.Browser.isSafari && isc.Browser.safariVersion < 525.271) { - // In some versions of Safari, if the offsetParent has a border, the offsetLeft / top - // reported is relative to the outside of that border, rather than the inside, so deduct - // that value - // No longer the case in Safari 3.2.1 (525.27.1) - if (element.offsetParent != null && element.offsetParent != documentBody) { - var parentBorder = - this.ns.Element.getComputedStyle(element.offsetParent, ["borderLeftWidth"]).borderLeftWidth; - if (parentBorder != null) parentBorder = parseInt(parentBorder); - if (isc.isA.Number(parentBorder)) left -= parentBorder; - } - } - // --- cacheing code: - // Cache the calculated and reported value, by saving it as attributes on the DOM element - element._cachedReportedOffsetLeft = element.offsetLeft; - element._cachedCalculatedOffsetLeft = left; - - return left; -} -}); \ No newline at end of file diff --git a/src/main/webapp/resources/js/xwiki/actionbuttons/actionButtons.css b/src/main/webapp/resources/js/xwiki/actionbuttons/actionButtons.css index dc8a1ca52..2a8a80e1a 100644 --- a/src/main/webapp/resources/js/xwiki/actionbuttons/actionButtons.css +++ b/src/main/webapp/resources/js/xwiki/actionbuttons/actionButtons.css @@ -1,6 +1,6 @@ -#template('colorThemeInit.vm') +@import "/file/resources/celRes/theme/defaultColors.css"; .meta-versionSummary label { - color: $theme.textSecondaryColor; + color: var(--textSecondaryColor); display: block; font-size: .85em; font-weight: 700; diff --git a/src/main/webapp/resources/js/xwiki/actionbuttons/actionButtons.js b/src/main/webapp/resources/js/xwiki/actionbuttons/actionButtons.js index 81a4b177e..b5aa232ec 100644 --- a/src/main/webapp/resources/js/xwiki/actionbuttons/actionButtons.js +++ b/src/main/webapp/resources/js/xwiki/actionbuttons/actionButtons.js @@ -12,7 +12,15 @@ if (typeof(XWiki.actionButtons) == 'undefined') { } XWiki.actionButtons.EditActions = Class.create({ + translations : {}, + initialize : function() { + if (window.celExecOnceAfterMessagesLoaded) { + window.celExecOnceAfterMessagesLoaded( + celMessages => this.translations = celMessages.actionButtons); + } else { + console.warn('celExecOnceAfterMessagesLoaded not available!'); + } this.addListeners(); this.addShortcuts(); this.addValidators(); @@ -33,14 +41,14 @@ XWiki.actionButtons.EditActions = Class.create({ }, addShortcuts : function() { var shortcuts = { - 'action_cancel' : "$msg.get('core.shortcuts.edit.cancel')", - 'action_preview' : "$msg.get('core.shortcuts.edit.preview')", + 'action_cancel' : this.translations.cancel, + 'action_preview' : this.translations.preview, // The following 2 are both "Back to edit" in the preview mode, depending on the used editor - 'action_edit' : "$msg.get('core.shortcuts.edit.backtoedit')", - 'action_inline' : "$msg.get('core.shortcuts.edit.backtoedit')", - 'action_save' : "$msg.get('core.shortcuts.edit.saveandview')", - 'action_propupdate' : "$msg.get('core.shortcuts.edit.saveandview')", - 'action_saveandcontinue' : "$msg.get('core.shortcuts.edit.saveandcontinue')" + 'action_edit' : this.translations.backtoedit, + 'action_inline' : this.translations.backtoedit, + 'action_save' : this.translations.saveandview, + 'action_propupdate' : this.translations.saveAndView, + 'action_saveandcontinue' : this.translations.saveandcontinue } for (var key in shortcuts) { var targetButtons = $$("input[name=" + key + "]"); @@ -59,7 +67,7 @@ XWiki.actionButtons.EditActions = Class.create({ var input = inputs[i]; var validator = new LiveValidation(input, { validMessage: "" }); validator.add(Validate.Presence, { - failureMessage: "$msg.get('core.editors.validation.mandatoryField')" + failureMessage: this.translations.mandatoryField }); validator.validate(); this.validators.push(validator); @@ -71,25 +79,6 @@ XWiki.actionButtons.EditActions = Class.create({ return false; } } - #if($xwiki.isEditCommentMandatory()) - var commentField = form.comment - while (commentField.value == "") { - var response = prompt("${msg.get('core.comment.prompt')}"); - if (response === null) { - return false; - } - commentField.value = response; - } - #elseif($xwiki.isEditCommentSuggested()) - var commentField = form.comment - if (commentField.value == "") { - var response = prompt("${msg.get('core.comment.prompt')}"); - if (response === null) { - return false; - } - commentField.value = response; - } - #end return true; }, onCancel : function(event) { diff --git a/src/main/webapp/resources/js/xwiki/compatibility.js b/src/main/webapp/resources/js/xwiki/compatibility.js index 3ed6efd25..86021e302 100644 --- a/src/main/webapp/resources/js/xwiki/compatibility.js +++ b/src/main/webapp/resources/js/xwiki/compatibility.js @@ -20,47 +20,6 @@ } } - /** - * Deprecated since 2.6RC2 - */ - if (typeof XWiki.widgets == 'object' && typeof XWiki.widgets.FullScreen == 'function') { - XWiki.editors = XWiki.editors || {}; - XWiki.editors.FullScreenEditing = Class.create(XWiki.widgets.FullScreen, { - initialize: function ($super) { - warn("XWiki.editors.FullScreenEditing is deprecated since XWiki 2.6RC2. Use XWiki.widgets.FullScreen instead."); - $super(); - } - }); - } - - - /** - * _xwk is an old namespace for XWiki code that was optional - * Deprecated since 2.6RC1 - */ - if (window.useXWKns) { - warn("_xwk namespace is deprecated since XWiki 2.6RC1. Use the XWiki namespace instead."); - if (typeof _xwk == "undefined") { - _xwk = new Object(); - } - } else { - _xwk = window; - } - - /** - * Deprecated since 2.6RC1 - */ - if (typeof XWiki.widgets.Suggest !== 'undefined') { - _xwk.ajaxSuggest = Class.create(XWiki.widgets.Suggest, { - initialize: function ($super) { - warn("ajaxSuggest is deprecated since XWiki 2.6RC1. Use XWiki.widgets.Suggest instead."); - var args = $A(arguments) - args.shift(); - $super.apply(_xwk, args); - } - }); - } - /** * Deprecated since 1.9M2 */ diff --git a/src/main/webapp/resources/js/xwiki/editors/autosave.css b/src/main/webapp/resources/js/xwiki/editors/autosave.css index 9775afd0c..4e0baf809 100644 --- a/src/main/webapp/resources/js/xwiki/editors/autosave.css +++ b/src/main/webapp/resources/js/xwiki/editors/autosave.css @@ -1,4 +1,4 @@ -#template('colorThemeInit.vm') +@import "/file/resources/celRes/theme/defaultColors.css"; #autosaveControl { display: inline; } diff --git a/src/main/webapp/resources/js/xwiki/editors/dataeditors.css b/src/main/webapp/resources/js/xwiki/editors/dataeditors.css index 99c2cd78c..9c7f7f3a6 100644 --- a/src/main/webapp/resources/js/xwiki/editors/dataeditors.css +++ b/src/main/webapp/resources/js/xwiki/editors/dataeditors.css @@ -1,55 +1,318 @@ -#template('colorThemeInit.vm') #xwikiobjects,#xwikiclassproperties{padding:0 8px;overflow:auto;border:none!important;} -#body #xwikiobjects label,#body #xwikiclassproperties label{display:inline;text-transform:none;font-variant:normal;color:$theme.textPrimaryColor;} -#xwikiobjects input,#xwikiobjects textarea,#xwikiclassproperties input,#xwikiclassproperties textarea{border:1px solid $theme.borderColor;width:90%;} -.boolean-property input{width:auto!important;border:none!important;} -#xwikiobjects input:hover,#xwikiobjects textarea:hover,#xwikiobjects input:focus,#xwikiobjects textarea:focus,#xwikiclassproperties input:hover,#xwikiclassproperties textarea:hover,#xwikiclassproperties input:focus,#xwikiclassproperties textarea:focus{border:1px solid $theme.textPrimaryColor;} -#xwikiobjects input:focus,#xwikiobjects textarea:focus,#xwikiclassproperties input:focus,#xwikiclassproperties textarea:focus{background-color:$theme.highlightColor;} -.more-actions{padding:8px 2px;} -.more-actions .edit-all{display:block;padding:2px 18px;background:transparent url($xwiki.getSkinFile('icons/silk/pencil.gif', true)) left top no-repeat;} -.xclass-title{margin:16px 0 2px;} -.xclass-title h2,xproperty-title h2{border:none;font-weight:bold;font-size:100%;margin:0;padding:0;} -.xclass-content{padding:0 0 0 16px;margin:0 0 10px 0;} -.xobject-title{position:relative;border:none;cursor:default;background:transparent;} -.xobject:hover .xobject-title,.xproperty:hover .xproperty-title{background-color:$theme.highlightColor;color:$theme.textPrimaryColor;} -.xobject-title h3{border:none;font-size:100%;font-weight:100;margin:0;padding:4px 4px 4px 10px;border:none;} -.xobject-content{padding:4px 14px 8px;border:none;margin-bottom:2px;} -.xobject dl,.xproperty dl{margin:0;} -.xobject-content dt,.xproperty-content dt{font-size:75%;font-weight:bold;} -#body .xobject-title h3,#body .xclass-title{padding-left:14px;} -.xobject-title:hover,.xclass-title:hover,.xproperty-title:hover{cursor:default;} -.xobject-action{display:block;overflow:hidden;position:absolute;top:2px;width:16px;height:16px;text-indent:30px;line-height:30px;background:transparent left top no-repeat;} -.xobject-title .delete{right:0;background-image:url($xwiki.getSkinFile('icons/silk/cross.gif', true));} -.xobject-title .edit{right:16px;background-image:url($xwiki.getSkinFile('icons/silk/pencil.gif', true));} -.xproperty{border:none;} -.xproperty-content{padding:4px 16px 8px 16px;margin-bottom:2px;} -.xproperty-content dl{margin:0;padding-left:16px;} -.xproperty-title{cursor:default;padding:0;overflow:hidden;} -.xproperty-title .xproperty-property{float:left;margin-right:8px;} -.xproperty_number_input input{width:2em;} -.xproperty-title h2{display:block;padding:2px;padding-left:32px;margin:0;font-size:1em;font-weight:100;background:transparent url($xwiki.getSkinFile('icons/datamodel/propertyType-Generic.png', true)) 14px center no-repeat;min-height:16px;} -.xproperty-title label{font-size:60%;line-height:1em;} -.xproperty-content{clear:both;} -.xproperty-title .xproperty-prettyName{float:none;clear:both;} -.xobject-content dt,.xproperty-content dt{font-size:75%;font-weight:bold;} -.xobject-content dd,.xproperty-content dd{margin:0 0 4px;} -#body .collapsable .xobject-title h3,#body .collapsable .xclass-title,#body .collapsable .xproperty-title{background-image:url($xwiki.getSkinFile('icons/silk/bullet_toggle_minus.gif', true));background-position:0 center;background-repeat:no-repeat;} -#body .collapsed .xobject-title h3,#body .collapsed .xclass-title,#body .collapsed .xproperty-title{background-image:url($xwiki.getSkinFile('icons/silk/bullet_toggle_plus.gif', true));} -.xclass.collapsed .xclass-content,.xobject.collapsed .xobject-content,.xproperty.collapsed .xproperty-content{display:none;} -.collapsable dt .collapser{background-image:url($xwiki.getSkinFile('icons/silk/bullet_toggle_minus.gif', true));background-position:-4px center;background-repeat:no-repeat;cursor:default;width:10px;height:10px;padding-left:10px;} -#xwikiobjects .collapsable dd{padding-left:10px;} -#xwikiclassproperties .collapsable dt{margin-left:-10px;} -.collapsable dt .collapsed{background-image:url($xwiki.getSkinFile('icons/silk/bullet_toggle_plus.gif', true));} -.xproperty-title .move{display:block;overflow:hidden;position:absolute;right:0;top:2px;padding:2px;cursor:move;} -.dragged .xproperty-title{border:1px solid $theme.borderColor;} -.StringClass h2{background-image:url($xwiki.getSkinFile('icons/datamodel/string.png', true));} -.DateClass h2{background-image:url($xwiki.getSkinFile('icons/datamodel/calendar.png', true));} -.TextAreaClass h2{background-image:url($xwiki.getSkinFile('icons/datamodel/textarea.png', true));} -.NumberClass h2{background-image:url($xwiki.getSkinFile('icons/datamodel/number.png', true));} -.BooleanClass h2{background-image:url($xwiki.getSkinFile('icons/datamodel/boolean.png, true'));} -.StaticListClass h2{background-image:url($xwiki.getSkinFile('icons/datamodel/staticlist.png, true'));} -.GroupsClass h2{background-image:url($xwiki.getSkinFile('icons/datamodel/groups.png, true'));} -.UsersClass h2{background-image:url($xwiki.getSkinFile('icons/datamodel/users.png', true));} -.LevelsClass h2{background-image:url($xwiki.getSkinFile('icons/datamodel/rights.png', true));} -.DBListClass h2{background-image:url($xwiki.getSkinFile('icons/datamodel/database.png', true));} -.DBTreeListClass h2{background-image:url($xwiki.getSkinFile('icons/datamodel/tree.png', true));} -.PasswordClass h2{background-image:url($xwiki.getSkinFile('icons/datamodel/password.png', true));} \ No newline at end of file +@import "/file/resources/celRes/theme/defaultColors.css"; +#xwikiobjects, +#xwikiclassproperties { + padding: 0 8px; + overflow: auto; + border: none !important; +} + +#body #xwikiobjects label, +#body #xwikiclassproperties label { + display: inline; + text-transform: none; + font-variant: normal; + color: var(--textPrimaryColor); +} + +#xwikiobjects input, +#xwikiobjects textarea, +#xwikiclassproperties input, +#xwikiclassproperties textarea { + border: 1px solid var(--borderColor); + width: 90%; +} + +.boolean-property input { + width: auto !important; + border: none !important; +} + +#xwikiobjects input:hover, +#xwikiobjects textarea:hover, +#xwikiobjects input:focus, +#xwikiobjects textarea:focus, +#xwikiclassproperties input:hover, +#xwikiclassproperties textarea:hover, +#xwikiclassproperties input:focus, +#xwikiclassproperties textarea:focus { + border: 1px solid var(--textPrimaryColor); +} + +#xwikiobjects input:focus, +#xwikiobjects textarea:focus, +#xwikiclassproperties input:focus, +#xwikiclassproperties textarea:focus { + background-color: var(--highlightColor); +} + +.more-actions { + padding: 8px 2px; +} + +.more-actions .edit-all { + display: block; + padding: 2px 18px; + background: transparent url(/skin/resources/icons/silk/pencil.gif) left top + no-repeat; +} + +.xclass-title { + margin: 16px 0 2px; +} + +.xclass-title h2, +xproperty-title h2 { + border: none; + font-weight: bold; + font-size: 100%; + margin: 0; + padding: 0; +} + +.xclass-content { + padding: 0 0 0 16px; + margin: 0 0 10px 0; +} + +.xobject-title { + position: relative; + border: none; + cursor: default; + background: transparent; +} + +.xobject:hover .xobject-title, +.xproperty:hover .xproperty-title { + background-color: var(--highlightColor); + color: var(--textPrimaryColor); +} + +.xobject-title h3 { + border: none; + font-size: 100%; + font-weight: 100; + margin: 0; + padding: 4px 4px 4px 10px; + border: none; +} + +.xobject-content { + padding: 4px 14px 8px; + border: none; + margin-bottom: 2px; +} + +.xobject dl, +.xproperty dl { + margin: 0; +} + +.xobject-content dt, +.xproperty-content dt { + font-size: 75%; + font-weight: bold; +} + +#body .xobject-title h3, +#body .xclass-title { + padding-left: 14px; +} + +.xobject-title:hover, +.xclass-title:hover, +.xproperty-title:hover { + cursor: default; +} + +.xobject-action { + display: block; + overflow: hidden; + position: absolute; + top: 2px; + width: 16px; + height: 16px; + text-indent: 30px; + line-height: 30px; + background: transparent left top no-repeat; +} + +.xobject-title .delete { + right: 0; + background-image: url("/file/resources/icons/silk/cross.gif"); +} + +.xobject-title .edit { + right: 16px; + background-image: url("/file/resources/icons/silk/pencil.gif"); +} + +.xproperty { + border: none; +} + +.xproperty-content { + padding: 4px 16px 8px 16px; + margin-bottom: 2px; +} + +.xproperty-content dl { + margin: 0; + padding-left: 16px; +} + +.xproperty-title { + cursor: default; + padding: 0; + overflow: hidden; +} + +.xproperty-title .xproperty-property { + float: left; + margin-right: 8px; +} + +.xproperty_number_input input { + width: 2em; +} + +.xproperty-title h2 { + display: block; + padding: 2px; + padding-left: 32px; + margin: 0; + font-size: 1em; + font-weight: 100; + background: transparent + url(/skin/resources/icons/datamodel/propertyType-Generic.png) 14px center + no-repeat; + min-height: 16px; +} + +.xproperty-title label { + font-size: 60%; + line-height: 1em; +} + +.xproperty-content { + clear: both; +} + +.xproperty-title .xproperty-prettyName { + float: none; + clear: both; +} + +.xobject-content dt, +.xproperty-content dt { + font-size: 75%; + font-weight: bold; +} + +.xobject-content dd, +.xproperty-content dd { + margin: 0 0 4px; +} + +#body .collapsable .xobject-title h3, +#body .collapsable .xclass-title, +#body .collapsable .xproperty-title { + background-image: url(/skin/resources/icons/silk/bullet_toggle_minus.gif); + background-position: 0 center; + background-repeat: no-repeat; +} + +#body .collapsed .xobject-title h3, +#body .collapsed .xclass-title, +#body .collapsed .xproperty-title { + background-image: url(/skin/resources/icons/silk/bullet_toggle_plus.gif); +} + +.xclass.collapsed .xclass-content, +.xobject.collapsed .xobject-content, +.xproperty.collapsed .xproperty-content { + display: none; +} + +.collapsable dt .collapser { + background-image: url(/skin/resources/icons/silk/bullet_toggle_minus.gif); + background-position: -4px center; + background-repeat: no-repeat; + cursor: default; + width: 10px; + height: 10px; + padding-left: 10px; +} + +#xwikiobjects .collapsable dd { + padding-left: 10px; +} + +#xwikiclassproperties .collapsable dt { + margin-left: -10px; +} + +.collapsable dt .collapsed { + background-image: url(/skin/resources/icons/silk/bullet_toggle_plus.gif); +} + +.xproperty-title .move { + display: block; + overflow: hidden; + position: absolute; + right: 0; + top: 2px; + padding: 2px; + cursor: move; +} + +.dragged .xproperty-title { + border: 1px solid var(--borderColor); +} + +.StringClass h2 { + background-image: url(/skin/resources/icons/datamodel/string.png); +} + +.DateClass h2 { + background-image: url(/skin/resources/icons/datamodel/calendar.png); +} + +.TextAreaClass h2 { + background-image: url(/skin/resources/icons/datamodel/textarea.png); +} + +.NumberClass h2 { + background-image: url(/skin/resources/icons/datamodel/number.png); +} + +.BooleanClass h2 { + background-image: url(/skin/resources/icons/datamodel/boolean.png); +} + +.StaticListClass h2 { + background-image: url(/skin/resources/icons/datamodel/staticlist.png); +} + +.GroupsClass h2 { + background-image: url(/skin/resources/icons/datamodel/groups.png); +} + +.UsersClass h2 { + background-image: url(/skin/resources/icons/datamodel/users.png); +} + +.LevelsClass h2 { + background-image: url(/skin/resources/icons/datamodel/rights.png); +} + +.DBListClass h2 { + background-image: url(/skin/resources/icons/datamodel/database.png); +} + +.DBTreeListClass h2 { + background-image: url(/skin/resources/icons/datamodel/tree.png); +} + +.PasswordClass h2 { + background-image: url(/skin/resources/icons/datamodel/password.png); +} diff --git a/src/main/webapp/resources/js/xwiki/editors/dataeditors.js b/src/main/webapp/resources/js/xwiki/editors/dataeditors.js index a4d27a645..eb746019c 100644 --- a/src/main/webapp/resources/js/xwiki/editors/dataeditors.js +++ b/src/main/webapp/resources/js/xwiki/editors/dataeditors.js @@ -1,78 +1,209 @@ -$j(document).ready(function(){$$("#xwikiobjects a.delete").each(function(B){B.observe("click",function(C){B.blur(); -C.stop(); -if(!B.disabled){new XWiki.widgets.ConfirmedAjaxRequest(B.href,{onCreate:function(){B.disabled=true -},onSuccess:function(){var D=B.up(".xobject"); -var E=D.up(".xclass"); -D.remove(); -if(E.select(".xobject").size()==0){E.remove() -}}.bind(this),onComplete:function(){B.disabled=false -}},{confirmationText:"$msg.get('core.editors.object.delete.confirm')",progressMessageText:"$msg.get('core.editors.object.delete.inProgress')",successMessageText:"$msg.get('core.editors.object.delete.done')",failureMessageText:"$msg.get('core.editors.object.delete.failed')"}) -}}.bindAsEventListener()) +// this is minified code reformatted +$j(document).ready(function () { + let translations = {}; + if (window.celExecOnceAfterMessagesLoaded) { + window.celExecOnceAfterMessagesLoaded( + celMessages => translations = celMessages.dataeditors); + } else { + console.warn('celExecOnceAfterMessagesLoaded not available!'); + } + $$("#xwikiobjects a.delete").each(function (B) { + B.observe( + "click", + function (C) { + B.blur(); + C.stop(); + if (!B.disabled) { + new XWiki.widgets.ConfirmedAjaxRequest( + B.href, + { + onCreate: function () { + B.disabled = true; + }, + onSuccess: function () { + var D = B.up(".xobject"); + var E = D.up(".xclass"); + D.remove(); + if (E.select(".xobject").size() == 0) { + E.remove(); + } + }.bind(this), + onComplete: function () { + B.disabled = false; + }, + }, + { + confirmationText: translations.confirmationText, + progressMessageText: translations.progressMessageText, + successMessageText: translations.successMessageText, + failureMessageText: translations.failureMessageText, + }, + ); + } + }.bindAsEventListener(), + ); + }); + $$("#xwikiobjects a.edit").each(function (B) { + B.observe( + "click", + function (C) { + B.blur(); + C.stop(); + window.location = B.href; + }.bindAsEventListener(), + ); + }); + $$("#xwikiobjects .xclass-title").each(function (B) { + B.observe( + "click", + function (C) { + B.up().toggleClassName("collapsed"); + }.bindAsEventListener(), + ); + }); + $$("#xwikiobjects .xclass").each(function (B) { + B.addClassName("collapsable"); + }); + var A = $$(".xproperty").size(); + $$(".xproperty").each(function (B) { + B.addClassName("collapsable"); + if (A > 1) { + B.toggleClassName("collapsed"); + } + }); + $$(".xproperty-title").each(function (B) { + B.observe( + "click", + function (C) { + B.up().toggleClassName("collapsed"); + }.bindAsEventListener(), + ); + }); + A = $$("#xwikiobjects .xobject").size(); + $$("#xwikiobjects .xobject").each(function (B) { + B.addClassName("collapsable"); + if (A > 1) { + B.toggleClassName("collapsed"); + } + }); + $$("#xwikiobjects .xobject-title").each(function (B) { + B.observe( + "click", + function (C) { + B.up().toggleClassName("collapsed"); + }.bindAsEventListener(), + ); + }); + $$(".xobject-content dt, .xproperty-content dt").each(function (B) { + if (!B.down("input[type=checkbox]")) { + B.addClassName("collapsable"); + B.insertBefore( + new Element("span", { class: "collapser" }), + B.firstDescendant(), + ); + } else { + B.addClassName("uncollapsable"); + } + }); + $$(".xobject-content dt label, .xproperty-content dt label").each( + function (B) { + B.observe( + "click", + function (C) { + if (B.up("dt").down("span").hasClassName("collapsed")) { + B.up("dt").next("dd").toggle(); + B.up("dt").down("span").toggleClassName("collapsed"); + } + }.bindAsEventListener(), + ); + }, + ); + $$(".collapser").each(function (B) { + B.observe( + "click", + function (C) { + B.up("dt").next("dd").toggle(); + B.toggleClassName("collapsed"); + }.bindAsEventListener(), + ); + }); }); -$$("#xwikiobjects a.edit").each(function(B){B.observe("click",function(C){B.blur(); -C.stop(); -window.location=B.href -}.bindAsEventListener()) +if (typeof XWiki == "undefined") { + XWiki = new Object(); +} +if (typeof XWiki.editors == "undefined") { + XWiki.editors = new Object(); +} +XWiki.editors.XPropertyOrdering = Class.create({ + initialize: function () { + $$(".xproperty-content").each(function (A) { + A.select("input").each(function (B) { + if (B.id.endsWith("_number")) { + A.numberProperty = B; + B.up().hide(); + if (B.up().previous("dt")) { + B.up().previous("dt").hide(); + } + } + }); + }); + if ($$(".xproperty").size() <= 1) { + return; + } + $$(".xproperty-title").each(function (B) { + var A = new Element("img", { + src: "/skin/resources/icons/datamodel/move.png", + class: "move", + alt: "move", + title: "Drag and drop to change the order", + }); + B.makePositioned(); + B.appendChild(A); + A.observe( + "click", + function (C) { + C.stop(); + }.bindAsEventListener(), + ); + }); + Sortable.create("xclassContent", { + tag: "div", + only: "xproperty", + handle: "move", + starteffect: this.startDrag.bind(this), + endeffect: this.endDrag.bind(this), + onUpdate: this.updateOrder.bind(this), + }); + }, + updateOrder: function (A) { + var C = A.childElements(); + for (var B = 0; B < C.size(); ++B) { + var D = C[B].down(".xproperty-content"); + D.numberProperty.value = B + 1; + } + }, + startDrag: function (A) { + A.addClassName("dragged"); + $("xclassContent") + .childElements() + .each(function (B) { + B._expandedBeforeDrag = !B.hasClassName("collapsed"); + B.addClassName("collapsed"); + }); + }, + endDrag: function (A) { + A.removeClassName("dragged"); + $("xclassContent") + .childElements() + .each(function (B) { + if (B._expandedBeforeDrag) { + B.removeClassName("collapsed"); + } + }); + }, }); -$$("#xwikiobjects .xclass-title").each(function(B){B.observe("click",function(C){B.up().toggleClassName("collapsed") -}.bindAsEventListener()) +$j(document).ready(function () { + if ($("xclassContent")) { + new XWiki.editors.XPropertyOrdering(); + } }); -$$("#xwikiobjects .xclass").each(function(B){B.addClassName("collapsable") -}); -var A=$$(".xproperty").size(); -$$(".xproperty").each(function(B){B.addClassName("collapsable"); -if(A>1){B.toggleClassName("collapsed") -}}); -$$(".xproperty-title").each(function(B){B.observe("click",function(C){B.up().toggleClassName("collapsed") -}.bindAsEventListener()) -}); -A=$$("#xwikiobjects .xobject").size(); -$$("#xwikiobjects .xobject").each(function(B){B.addClassName("collapsable"); -if(A>1){B.toggleClassName("collapsed") -}}); -$$("#xwikiobjects .xobject-title").each(function(B){B.observe("click",function(C){B.up().toggleClassName("collapsed") -}.bindAsEventListener()) -}); -$$(".xobject-content dt, .xproperty-content dt").each(function(B){if(!B.down("input[type=checkbox]")){B.addClassName("collapsable"); -B.insertBefore(new Element("span",{"class":"collapser"}),B.firstDescendant()) -}else{B.addClassName("uncollapsable") -}}); -$$(".xobject-content dt label, .xproperty-content dt label").each(function(B){B.observe("click",function(C){if(B.up("dt").down("span").hasClassName("collapsed")){B.up("dt").next("dd").toggle(); -B.up("dt").down("span").toggleClassName("collapsed") -}}.bindAsEventListener()) -}); -$$(".collapser").each(function(B){B.observe("click",function(C){B.up("dt").next("dd").toggle(); -B.toggleClassName("collapsed") -}.bindAsEventListener()) -}) -}); -if(typeof (XWiki)=="undefined"){XWiki=new Object() -}if(typeof (XWiki.editors)=="undefined"){XWiki.editors=new Object() -}XWiki.editors.XPropertyOrdering=Class.create({initialize:function(){$$(".xproperty-content").each(function(A){A.select("input").each(function(B){if(B.id.endsWith("_number")){A.numberProperty=B; -B.up().hide(); -if(B.up().previous("dt")){B.up().previous("dt").hide() -}}}) -}); -if($$(".xproperty").size()<=1){return -}$$(".xproperty-title").each(function(B){var A=new Element("img",{src:"$xwiki.getSkinFile('icons/datamodel/move.png', true)","class":"move",alt:"move",title:"Drag and drop to change the order"}); -B.makePositioned(); -B.appendChild(A); -A.observe("click",function(C){C.stop() -}.bindAsEventListener()) -}); -Sortable.create("xclassContent",{tag:"div",only:"xproperty",handle:"move",starteffect:this.startDrag.bind(this),endeffect:this.endDrag.bind(this),onUpdate:this.updateOrder.bind(this)}) -},updateOrder:function(A){var C=A.childElements(); -for(var B=0; -B0){this.makeFullScreen(A[0]) -}}},addBehavior:function(A){if(this.isWysiwyg20Content(A)){this.addWysiwyg20ContentButton(A) -}else{if(this.isWysiwyg10Content(A)){this.addWysiwyg10ContentButton(A) -}else{if(this.isWikiContent(A)){this.addWikiContentButton(A) -}else{if(this.isWysiwyg20Field(A)){this.addWysiwyg20FieldButton(A) -}else{if(this.isWikiField(A)){this.addWikiFieldButton(A) -}else{if(this.isWysiwyg10Field(A)){this.addWysiwyg10FieldButton(A) -}}}}}}},addWysiwyg20Listener:function(){document.observe("xwiki:wysiwyg:created",this.wysiwyg20Created.bindAsEventListener(this)) -},wysiwyg20Created:function(B,A){},isWikiContent:function(A){return A.name=="content"&&A.visible() -},isWysiwyg10Content:function(A){return A.name=="content"&&(Prototype.Browser.IE?A.previous(".mceEditorContainer"):A.next(".mceEditorContainer")) -},isWysiwyg20Content:function(A){return A.hasClassName("xRichTextEditor")&&A.up("div[id^=content_container]") -},isWikiField:function(A){return A.visible() -},isWysiwyg10Field:function(A){return !A.visible()&&A.name!="content"&&(Prototype.Browser.IE?A.previous(".mceEditorContainer"):A.next(".mceEditorContainer")) -},isWysiwyg20Field:function(A){return A.hasClassName("xRichTextEditor")&&!A.up("div[id^=content_container]") -},addWikiContentButton:function(A){A._toolbar=$(document.body).down(".leftmenu2"); -if(A._toolbar){A._toolbar.insert({top:this.createOpenButton(A)}) -}else{this.addWikiFieldButton(A) -}},addWysiwyg10ContentButton:function(E){var B=(Prototype.Browser.IE?E.previous(".mceEditorContainer"):E.next(".mceEditorContainer")); -if(!B){return false -}var D=B.down(".mceToolbar"); -if(!D){return false -}var A=new Element("span",{"class":"mce_editor_fullscreentoolbar"}); -var C=new Element("a",{"class":"mceButtonNormal"}); -A.insert(new Element("img",{"class":"mceSeparatorLine",height:15,width:1,src:D.down("img.mceSeparatorLine").src})); -A.insert(C.insert(this.createOpenButton(B))); -D.insert(A); -B._toolbar=D; -return true -},addWysiwyg20ContentButton:function(B){var A=B.down(".gwt-MenuBar"); -if(!A){if(!B._x_fullScreenLoader){B._x_fullScreenLoader_iterations=0; -B._x_fullScreenLoader=new PeriodicalExecuter(function(C){if(C._x_fullScreenLoader_iteration>100){C._x_fullScreenLoader.stop(); -C._x_fullScreenLoader=false; -return -}C._x_fullScreenLoader_iteration++; -this.addWysiwyg20ContentButton(C) -}.bind(this,B),0.2) -}return false -}A.insert({top:this.createOpenButton(B)}); -B._toolbar=A; -if(B._x_fullScreenLoader){B._x_fullScreenLoader.stop(); -B._x_fullScreenLoader=false -}return true -},addWikiFieldButton:function(A){Element.insert(A,{before:this.createOpenLink(A)}) -},addWysiwyg10FieldButton:function(A){this.addWysiwyg10ContentButton(A) -},addWysiwyg20FieldButton:function(A){this.addWysiwyg20ContentButton(A) -},createOpenButton:function(B){var A=new Element("img",{"class":"fullScreenEditButton",title:"$msg.get('core.editors.fullscreen.editFullScreen')",alt:"$msg.get('core.editors.fullscreen.editFullScreen')",src:"$xwiki.getSkinFile('icons/silk/arrow_out.gif', true)"}); -A.observe("click",this.makeFullScreen.bind(this,B)); -A.observe("mousedown",this.preventDrag.bindAsEventListener(this)); -B._x_fullScreenActivator=A; -A._x_maximizedElement=B; -return A -},createOpenLink:function(B){var C=new Element("div",{"class":"fullScreenEditLinkContainer"}); -var A=new Element("a",{"class":"fullScreenEditLink",title:"$msg.get('core.editors.fullscreen.editFullScreen')"}); -A.update("${msg.get('core.editors.fullscreen.editFullScreen')} »"); -A.observe("click",this.makeFullScreen.bind(this,B)); -C.update(A); -B._x_fullScreenActivator=A; -A._x_maximizedElement=B; -return C -},createCloseButtons:function(){this.closeButton=new Element("img",{"class":"fullScreenCloseButton",title:"$msg.get('core.editors.fullscreen.exitFullScreen')",alt:"$msg.get('core.editors.fullscreen.exitFullScreen')",src:"$xwiki.getSkinFile('icons/silk/arrow_in.gif', true)"}); -this.closeButton.observe("click",this.closeFullScreen.bind(this)); -this.closeButton.observe("mousedown",this.preventDrag.bindAsEventListener(this)); -this.closeButton.hide(); -this.actionCloseButton=new Element("input",{type:"button","class":"button",value:"$msg.get('core.editors.fullscreen.exitFullScreen')"}); -this.actionCloseButtonWrapper=new Element("span",{"class":"buttonwrapper"}); -this.actionCloseButtonWrapper.update(this.actionCloseButton); -this.actionCloseButton.observe("click",this.closeFullScreen.bind(this)); -this.actionCloseButtonWrapper.hide(); -this.buttons.down(".buttons").insert({top:this.actionCloseButtonWrapper}) -},makeFullScreen:function(A){if(this.maximizedReference){if(A.id){this.maximizedReference.value=A.tagName+"[id='"+A.id+"']" -}else{if(A.name){this.maximizedReference.value=A.tagName+"[name='"+A.name+"']" -}else{if(A.className){this.maximizedReference.value=A.tagName+"."+A.className -}}}}this.maximized=A; -A._originalStyle={width:A.style.width,height:A.style.height}; -if(A.hasClassName("xRichTextEditor")){var D=A.down(".gwt-RichTextArea"); -D._originalStyle={width:D.style.width,height:D.style.height} -}else{if(A.hasClassName("mceEditorContainer")){var D=A.down(".mceEditorIframe"); -D._originalStyle={width:D.style.width,height:D.style.height}; -var C=A.down(".mceEditorSource"); -C._originalStyle={width:C.style.width,height:C.style.height} -}}var E=A.up(); -E.addClassName("fullScreenWrapper"); -if(A._toolbar){if(A._toolbar.hasClassName("leftmenu2")){E.insert({top:A._toolbar.replace(this.toolbarPlaceholder)}) -}A._x_fullScreenActivator.replace(this.closeButton) -}E.insert(this.buttons.replace(this.buttonsPlaceholder).show()); -var B=A.up(); -A._x_fullScreenActivator.hide(); -while(B!=document.body){B._originalStyle={overflow:B.style.overflow,position:B.style.position,width:B.style.width,height:B.style.height,left:B.style.left,right:B.style.right,top:B.style.top,bottom:B.style.bottom,padding:B.style.padding,margin:B.style.margin}; -B.setStyle({overflow:"visible",position:"absolute",width:"100%",height:"100%",left:0,top:0,right:0,bottom:0,padding:0,margin:0}); -B.siblings().each(function(F){F._originalDisplay=F.style.display; -F.setStyle({display:"none"}) -}); -B=B.up() -}document.body._originalStyle={overflow:B.style.overflow,width:B.style.width,height:B.style.height}; -document.body.setStyle({overflow:"hidden",width:"100%",height:"100%"}); -this.resizeListener=this.resizeTextArea.bind(this,A); -Event.observe(window,"resize",this.resizeListener); -this.closeButton.show(); -this.actionCloseButtonWrapper.show(); -this.resizeTextArea(A); -if(A._toolbar){A._toolbar.viewportOffset() -}},closeFullScreen:function(){var A=this.maximized; -this.closeButton.hide(); -this.actionCloseButtonWrapper.hide(); -Event.stopObserving(window,"resize",this.resizeListener); -A.up().removeClassName("fullScreenWrapper"); -if(A.hasClassName("xRichTextEditor")){var D=A.down(".gwt-RichTextArea"); -D.setStyle(D._originalStyle) -}else{if(A.hasClassName("mceEditorContainer")){var D=A.down(".mceEditorIframe"); -D.setStyle(D._originalStyle); -var C=A.down(".mceEditorSource"); -C.setStyle(C._originalStyle) -}}var B=A.up(); -while(B!=document.body){B.setStyle(B._originalStyle); -B.siblings().each(function(E){E.style.display=E._originalDisplay -}); -B=B.up() -}document.body.setStyle(document.body._originalStyle); -this.buttonsPlaceholder.replace(this.buttons); -if(this.buttons._x_isCustom){this.buttons.hide() -}if(A._toolbar){if(A._toolbar.hasClassName("leftmenu2")){this.toolbarPlaceholder.replace(A._toolbar) -}this.closeButton.replace(A._x_fullScreenActivator) -}if(Prototype.Browser.IE){setTimeout(function(){A._x_fullScreenActivator.show(); -this.setStyle(this._originalStyle) -}.bind(A),500) -}else{A._x_fullScreenActivator.show(); -A.setStyle(A._originalStyle) -}delete this.maximized; -if(this.maximizedReference){this.maximizedReference.value="" -}},resizeTextArea:function(B){if(!this.maximized){return -}var A=document.viewport.getHeight(); -var C=document.viewport.getWidth(); -if(C<=0){C=document.body.clientWidth; -A=document.body.clientHeight -}C=C-this.margin; -A=A-B.positionedOffset().top-this.margin-this.buttons.getHeight(); -B.setStyle({width:C+"px",height:A+"px"}); -if(B.hasClassName("xRichTextEditor")){B.down(".gwt-RichTextArea").setStyle({width:C+"px",height:A-B.down(".xToolbar").getHeight()-B.down(".gwt-MenuBar").getHeight()+"px"}) -}else{if(B.hasClassName("mceEditorContainer")){B.down(".mceEditorIframe").setStyle({width:C+"px",height:A-B._toolbar.getHeight()+"px"}); -B.down(".mceEditorSource").setStyle({width:C+"px",height:A-B._toolbar.getHeight()+"px"}) -}}},preventDrag:function(A){A.stop() -}}); -Event.observe(window,"load",function(){if(Prototype.Browser.IE){setTimeout("new XWiki.editors.FullScreenEditing();",500) -}else{new XWiki.editors.FullScreenEditing() -}}); \ No newline at end of file diff --git a/src/main/webapp/resources/js/xwiki/fullscreenedit/fullscreenEdit.css b/src/main/webapp/resources/js/xwiki/fullscreenedit/fullscreenEdit.css deleted file mode 100644 index a5f1fbaf3..000000000 --- a/src/main/webapp/resources/js/xwiki/fullscreenedit/fullscreenEdit.css +++ /dev/null @@ -1,187 +0,0 @@ -#show-dialog-btn { - background: url(img/fullscreen22.gif) top right no-repeat; - width: 15px; - height: 15px; - cursor: pointer; - float:right; - top: 3px; - right: 20px; - position: absolute; - z-index: 12312; -} -#xwikieditcontent { - position: relative; -} -html > body #show-dialog-btn { - right: 1px; - top: 1px; -} - -.leftmenu2 { - min-height: 15px; -} - -#fullscreen-dlg { - display:none; - position: absolute; - top:0px; - left:0px; - bottom: 0px; - right: 0px; - z-index:30000; - background-color: #ffd; - padding: 0px; - height: 100%; -} - -#fullscreen-dlg-head { - background: url(img/hd-sprite.gif) repeat-x 0px -82px; - background-color:navy; - color:#FFF; - font: bold 12px tahoma, verdana, helvetica, "sans serif"; - padding: 5px; - overflow: hidden; - white-space: nowrap; - width: 100%; -} - -#fullscreen-dlg-body { - background-color: #9cbbe9; - color: #fff; - width: 100%; - border:1px solid #6593cf; - border-top:0 none; - /*padding:10px;*/ - position: absolute; - top: 0px; - left: 0px; - bottom: 0px; - overflow:hidden; -} - -* html #fullscreen-dlg-body { - height: 100%; - top: 0px; left: 0px; right: 0px; bottom: 0px; - position: relative; -} - -#fullscreen-dlg-body-tab-wiki, #fullscreen-dlg-body-tab-wysiwyg { - background-color: #fff; - border:1px solid #6593cf; - position: absolute; - margin: 10px auto 0px; - left: 4px; - right: 4px; - bottom: 30px; - top: 20px; - text-align:center; -} - -* html #fullscreen-dlg-body-tab-wiki { - width: 99%; - height: 90%; - top: 0px; left: 0.5%; right: 0px; bottom: 0px; - position: relative; -} - -* html #fullscreen-dlg-body-tab-wysiwyg { - width: 99%; - height: 88%; - top: 0px; left: 0.5%; right: 0px; bottom: 0px; - position: relative; -} - -#fullscreen-dlg-body-tab-wiki textarea { - position: absolute; - left: 0px; - right: 0px; - top: 20px; - bottom: 0px; - width: 99.5% !important; - height: 95% !important; -} - -#fullscreen-dlg-body-tab-wysiwyg textarea { - position: absolute; - left: 0px; - right: 0px; - top: 20px; - bottom: 0px; - width: 99.5% !important; - height: 99% !important; -} - -* html #fullscreen-dlg-body-tab-wysiwyg textarea { - width: 100% !important; - height: 100% !important; - position: static; -} - -* html #fullscreen-dlg-body-tab-wiki textarea { - width: 100% !important; - height: 96.5% !important; - position: static; -} - -#fullscreen-dlg-body-tab-wysiwyg td, #fullscreen-dlg-body-tab-wiki td { - text-align: center; -} - -* html #parentswapDiv iframe { - position: static; - height: 99.6% !important; - width: 100% !important; -} - -#parentswapDiv { - width: 100%; - height: 100%; - text-align: center; -} - -#swapDiv { - width: 100%; - height: 100%; -} - -.backBtn { - z-index: 30001; - position: absolute; - left: 5px; - bottom: 5px; - background: transparent url(img/button.gif) no-repeat; - width:75px; - height: 20px; - cursor: pointer; -} - -#closeBtn { - position: absolute; - top: 0px; right: 0px; - height:20px; - width:20px; - margin:0; - padding:0; - line-height:1px; - font-size:1px; - background-repeat:no-repeat; - cursor:pointer; - background: url(img/close.gif) center no-repeat; -} - -.btnText { - text-align: center; - font: 12px "sans serif", tahoma, verdana, helvetica; - color: #fff; - padding-top: 1px; -} - -.titleText { - float:left; - height:15px; - width:15px; - margin:0; - margin-left:2px; - padding:0; - cursor:default; -} \ No newline at end of file diff --git a/src/main/webapp/resources/js/xwiki/fullscreenedit/fullscreenEdit.js b/src/main/webapp/resources/js/xwiki/fullscreenedit/fullscreenEdit.js deleted file mode 100644 index 51771b71e..000000000 --- a/src/main/webapp/resources/js/xwiki/fullscreenedit/fullscreenEdit.js +++ /dev/null @@ -1,257 +0,0 @@ -(function(){ - - //function to get a style property of an element - ////////////////////////////////////////////// - function getStyle(el, style){ - if (!document.getElementById) - return; - var value = el.style[toCamelCase(style)]; - if (!value) { - if (document.defaultView) { - value = document.defaultView.getComputedStyle(el, "").getPropertyValue(style); - } - else - if (el.currentStyle) { - value = el.currentStyle[toCamelCase(style)]; - } - } - return value; - } - - //function to set a style property for an element - //////////////////////////////////// - function setStyle(el, style, value){ - el.style[style] = value; - } - - //utility function - /////////////////// - function toCamelCase(sInput){ - var oStringList = sInput.split('-'); - if (oStringList.length == 1) { - return oStringList[0]; - } - var ret = sInput.indexOf("-") == 0 ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1) : oStringList[0]; - for (var i = 1, len = oStringList.length; i < len; i++) { - var s = oStringList[i]; - ret += s.charAt(0).toUpperCase() + s.substring(1) - } - return ret; - } - - //move the children of srcNode into destNode - ///////////////////////////////////////////// - function moveChildren(srcNode, destNode){ - var node; - while (srcNode.hasChildNodes()) { - node = srcNode.firstChild; - destNode.appendChild(node); - } - } - - //add the element that will trigger the dialog - ///////////////////////////////////////////// - Event.observe(window, "load", function(){ - - if (!$('xwikieditcontent')) { // make sure we are in edit mode - return; - } - - var activator, deactivator, what; - - if ($('mce_editor_0_parent')) { // we are in the wysiwyg 1.0 - activator = wysiwygFullscreen; - deactivator = wysiwygHide; - what = "wysiwyg"; - } - else { // we are in the wiki editor - activator = wikiFullscreen; - deactivator = wikiHide; - what = "wiki"; - } - - var parentDiv = document.getElementById("xwikitext"); - if (parentDiv) { - //Fullscreen button - var showBtn = document.createElement("div"); - showBtn.setAttribute("id", "show-dialog-btn"); - Event.observe(showBtn, "click", activator, true); - showBtn.setAttribute("title", "$msg.get('fullScreenTooltip')"); - var textdiv = document.getElementById("xwikieditcontent"); - textdiv.insertBefore(showBtn, textdiv.firstChild); - - //fullscreen div - var newdiv = document.createElement("div"); - newdiv.setAttribute("id", "fullscreen-dlg"); - - //fullscreen div header - var newdivhd = document.createElement("div"); - newdivhd.setAttribute("id", "fullscreen-dlg-head"); - - //close button - var closeBtn = document.createElement("div"); - closeBtn.setAttribute("id", "closeBtn"); - Event.observe(closeBtn, "click", deactivator, true); - newdivhd.appendChild(closeBtn); - - var title = document.createElement("div"); - title.className = "titleText"; - title.appendChild(document.createTextNode("Fullscreen Editing")); - newdivhd.appendChild(title); - - //fullscreen div body - var newdivbd = document.createElement("div"); - newdivbd.setAttribute("id", "fullscreen-dlg-body"); - newdivbd.appendChild(newdivhd); - - var newdivbdtab = document.createElement("div"); - newdivbdtab.setAttribute("id", "fullscreen-dlg-body-tab-" + what); - newdivbd.appendChild(newdivbdtab); - - newdiv.appendChild(newdivbd); - - var backBtn = document.createElement("div"); - backBtn.className = "backBtn"; - Event.observe(backBtn, "click", deactivator, true); - var btnText = document.createElement("div"); - btnText.className = "btnText"; - btnText.appendChild(document.createTextNode("Back")); - backBtn.appendChild(btnText); - - newdivbd.appendChild(backBtn); - - document.body.appendChild(newdiv); - } - - }); - - //maximize or minimize the editing area - /////////////////////////////////////// - function wysiwygFullscreen(){ - - var flscrDiv = document.getElementById("fullscreen-dlg"); - var flscrDivBdTab = document.getElementById("fullscreen-dlg-body-tab-wysiwyg"); - setStyle(flscrDiv, "display", "block"); - - var parentswapDiv = document.getElementById("parentswapDiv"); - var swapDiv = document.getElementById("swapDiv"); - - if (parentswapDiv == null || parentswapDiv == undefined) { - parentswapDiv = document.createElement("div"); - parentswapDiv.setAttribute("id", "parentswapDiv"); - if (swapDiv == null || swapDiv == undefined) { - swapDiv = document.createElement("div"); - swapDiv.setAttribute("id", "swapDiv"); - } - parentswapDiv.appendChild(swapDiv); - flscrDivBdTab.appendChild(parentswapDiv); - } - //swaps the swapDiv with xwikieditcontent - var xwikidiv = document.getElementById("xwikieditcontent"); - - //remove the editor - tinyMCE.execCommand('mceRemoveControl', false, 'content'); - - var auxdiv = document.createElement("div"); - document.body.appendChild(auxdiv); - moveChildren(parentswapDiv, auxdiv); - moveChildren(xwikidiv, parentswapDiv); - moveChildren(auxdiv, xwikidiv); - document.body.removeChild(auxdiv); - - //hide scrollbars - document.body.style.overflow = "hidden"; - // hide the fullscreen button - document.getElementById("show-dialog-btn").style.display = "none"; - - //put the editor back - tinyMCE.execCommand('mceAddControl', false, 'content'); - } - - //hide dialog and restore the textarea - ///////////////////////////////////// - function wysiwygHide(){ - var flscrDiv = document.getElementById("fullscreen-dlg"); - setStyle(flscrDiv, "display", "none"); - - var parentswapDiv = document.getElementById("parentswapDiv"); - var xwikidiv = document.getElementById("xwikieditcontent"); - var swapDiv = document.getElementById("swapDiv"); - - //remove the editor - tinyMCE.execCommand('mceRemoveControl', false, 'content'); - - var auxdiv = document.createElement("div"); - document.body.appendChild(auxdiv); - moveChildren(parentswapDiv, auxdiv); - moveChildren(xwikidiv, parentswapDiv); - moveChildren(auxdiv, xwikidiv); - document.body.removeChild(auxdiv); - - //show the scrollbars - document.body.style.overflow = "auto"; - // show the fullscreen button - document.getElementById("show-dialog-btn").style.display = "block"; - - //put the editor back - window.setTimeout("tinyMCE.execCommand('mceAddControl', false, 'content')", 10); - } - - //maximize or minimize the editing area - /////////////////////////////////////// - function wikiFullscreen(){ - var flscrDiv = document.getElementById("fullscreen-dlg"); - setStyle(flscrDiv, "display", "block"); - - var parentswapDiv = document.getElementById("parentswapDiv"); - var swapDiv = document.getElementById("swapDiv"); - - if (parentswapDiv == null || parentswapDiv == undefined) { - parentswapDiv = document.createElement("div"); - parentswapDiv.setAttribute("id", "parentswapDiv"); - if (swapDiv == null || swapDiv == undefined) { - swapDiv = document.createElement("div"); - swapDiv.setAttribute("id", "swapDiv"); - } - - parentswapDiv.appendChild(swapDiv); - var flscrDivBdTab = document.getElementById("fullscreen-dlg-body-tab-wiki"); - flscrDivBdTab.appendChild(parentswapDiv); - } - - //swaps the swapDiv with xwikieditcontent - var xwikidiv = document.getElementById("xwikieditcontentinner"); - - var auxdiv = document.createElement("div"); - document.body.appendChild(auxdiv); - moveChildren(parentswapDiv, auxdiv); - moveChildren(xwikidiv, parentswapDiv); - moveChildren(auxdiv, xwikidiv); - document.body.removeChild(auxdiv); - - //hide scrollbars - document.body.style.overflow = "hidden"; - } - - //hide dialog and restore the textarea - ///////////////////////////////////// - function wikiHide(){ - var flscrDiv = document.getElementById("fullscreen-dlg"); - setStyle(flscrDiv, "display", "none"); - - var parentswapDiv = document.getElementById("parentswapDiv"); - var xwikidiv = document.getElementById("xwikieditcontentinner"); - var swapDiv = document.getElementById("swapDiv"); - - var auxdiv = document.createElement("div"); - document.body.appendChild(auxdiv); - moveChildren(parentswapDiv, auxdiv); - moveChildren(xwikidiv, parentswapDiv); - moveChildren(auxdiv, xwikidiv); - document.body.removeChild(auxdiv); - - //show the scrollbars - document.body.style.overflow = "auto"; - } - -})(); diff --git a/src/main/webapp/resources/js/xwiki/fullscreenedit/img/btn-sprite.gif b/src/main/webapp/resources/js/xwiki/fullscreenedit/img/btn-sprite.gif deleted file mode 100644 index 8527cbc0c..000000000 Binary files a/src/main/webapp/resources/js/xwiki/fullscreenedit/img/btn-sprite.gif and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/fullscreenedit/img/button.gif b/src/main/webapp/resources/js/xwiki/fullscreenedit/img/button.gif deleted file mode 100644 index 4151a54da..000000000 Binary files a/src/main/webapp/resources/js/xwiki/fullscreenedit/img/button.gif and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/fullscreenedit/img/close.gif b/src/main/webapp/resources/js/xwiki/fullscreenedit/img/close.gif deleted file mode 100644 index 988ee82ca..000000000 Binary files a/src/main/webapp/resources/js/xwiki/fullscreenedit/img/close.gif and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/fullscreenedit/img/fullscreen22.gif b/src/main/webapp/resources/js/xwiki/fullscreenedit/img/fullscreen22.gif deleted file mode 100644 index a972af6e5..000000000 Binary files a/src/main/webapp/resources/js/xwiki/fullscreenedit/img/fullscreen22.gif and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/fullscreenedit/img/fullscreen3.gif b/src/main/webapp/resources/js/xwiki/fullscreenedit/img/fullscreen3.gif deleted file mode 100644 index 4e27d3063..000000000 Binary files a/src/main/webapp/resources/js/xwiki/fullscreenedit/img/fullscreen3.gif and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/fullscreenedit/img/gradient-bg.gif b/src/main/webapp/resources/js/xwiki/fullscreenedit/img/gradient-bg.gif deleted file mode 100644 index 8134e4994..000000000 Binary files a/src/main/webapp/resources/js/xwiki/fullscreenedit/img/gradient-bg.gif and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/fullscreenedit/img/hd-sprite.gif b/src/main/webapp/resources/js/xwiki/fullscreenedit/img/hd-sprite.gif deleted file mode 100644 index 42da1ea1a..000000000 Binary files a/src/main/webapp/resources/js/xwiki/fullscreenedit/img/hd-sprite.gif and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/importer/import.css b/src/main/webapp/resources/js/xwiki/importer/import.css index 2377866eb..638ead41e 100644 --- a/src/main/webapp/resources/js/xwiki/importer/import.css +++ b/src/main/webapp/resources/js/xwiki/importer/import.css @@ -1,4 +1,4 @@ -#template('colorThemeInit.vm') +@import "/file/resources/celRes/theme/defaultColors.css"; /* Overriding skins */ #import ul.xlist li.xitem div.xitemcontainer { @@ -49,7 +49,7 @@ div.loading { } #packagelist fieldset { - background-color: $theme.backgroundSecondaryColor; + background-color: var(--backgroundSecondaryColor); padding: 5px; } @@ -74,7 +74,7 @@ div.loading { } #packagelist .active { - border: 0px solid $theme.borderColor; + border: 0px solid var(--borderColor); background-color: #FCFCFC; } @@ -83,7 +83,7 @@ div.loading { } #packagelistcontainer .size { - color: $theme.textSecondaryColor; + color: var(--textSecondaryColor); } #packagelistcontainer .xwikibuttonlinks { @@ -109,7 +109,7 @@ div.loading { #packageDescription { background-color: #FCFCFC; - border: 0px solid $theme.borderColor; + border: 0px solid var(--borderColor); overflow: hidden; padding: 10px; margin-bottom: 1px; @@ -130,12 +130,12 @@ div.loading { } #packagecontainer .packageinfos span { - color: $theme.textSecondaryColor; + color: var(--textSecondaryColor); margin: 0 5px 0; } #packagecontainer .packageinfos span.label { - color: $theme.textColor; + color: var(--textColor); font-size: .85em; font-weight: 700; text-transform: uppercase; @@ -148,7 +148,7 @@ div.loading { } .selectLinks span { - color: $theme.linkColor; + color: var(--linkColor); cursor: pointer; margin-left: .2em; } @@ -158,8 +158,8 @@ div#package div.importOption { } div#package ul.package { - background-color: $theme.pageContentBackgroundColor; - border: 0px solid $theme.borderColor; + background-color: var(--pageContentBackgroundColor); + border: 0px solid var(--borderColor); margin: 0 0 1em 0 !important; padding: 3px !important; width: 98%; @@ -187,7 +187,7 @@ ul.package li.xitem div.xitemcontainer div.spacename { } ul.package li.xitem div.xitemcontainer div.selection { - color: $theme.textSecondaryColor; + color: var(--textSecondaryColor); margin-left: auto; font-size: .8em; line-height: 1.7em; diff --git a/src/main/webapp/resources/js/xwiki/importer/import.js b/src/main/webapp/resources/js/xwiki/importer/import.js index bae522df3..92eeda17b 100644 --- a/src/main/webapp/resources/js/xwiki/importer/import.js +++ b/src/main/webapp/resources/js/xwiki/importer/import.js @@ -10,10 +10,6 @@ var XWiki = (function (XWiki) { console.warn('celExecOnceAfterMessagesLoaded not available!'); } - // FIXME: we should have those images outside SmartClient library to lessen the dependency towards the library - var expandFolderImagePath = "$xwiki.getSkinFile('js/smartclient/skins/Enterprise/images/TreeGrid/opener_closed.png', true)"; - var collapseFolderImagePath = "$xwiki.getSkinFile('js/smartclient/skins/Enterprise/images/TreeGrid/opener_opened.png', true)"; - /** * Initialization hook for the rich UI. * We hijack clicks on package names links, to display the rich importer UI since javascript is available. diff --git a/src/main/webapp/resources/js/xwiki/lightbox/lightbox.css b/src/main/webapp/resources/js/xwiki/lightbox/lightbox.css index 6803454d5..5a0264157 100644 --- a/src/main/webapp/resources/js/xwiki/lightbox/lightbox.css +++ b/src/main/webapp/resources/js/xwiki/lightbox/lightbox.css @@ -1,37 +1,194 @@ -.rounded .top *,.rounded .bottom *,.roundedlight .top *,.roundedlight .bottom *{display:block;overflow:hidden;border-color:#A9B6C3;border-style:solid;background:#EEF3F6 none repeat scroll 0 50%;height:1px;border-width:0 1px;} -.roundedlight .b1,.roundedlight .b1b{background:#A9B6C3 none repeat scroll 0 50%;margin:0 5px;border-width:0;} -.roundedlight .b2,.roundedlight .b2b{border-width:0 2px;margin:0 3px;} -.roundedlight .b3,.roundedlight .b3b{margin:0 2px;} -.roundedlight .b4,.roundedlight .b4b{height:2px;margin:0 1px;} -.rounded .b1,.rounded .b1b{border-width:0;margin:0 16px;background:#A9B6C3 none repeat scroll 0 50%;} -.rounded .b2,.rounded .b2b{border-width:0 3px;margin:0 13px;} -.rounded .b3,.rounded .b3b{border-width:0 2px;margin:0 11px;} -.rounded .b4,.rounded .b4b{border-width:0 2px;margin:0 9px;} -.rounded .b5,.rounded .b5b{margin:0 8px;} -.rounded .b6,.rounded .b6b{margin:0 7px;} -.rounded .b7,.rounded .b7b{margin:0 6px;} -.rounded .b8,.rounded .b8b{margin:0 5px;} -.rounded .b9,.rounded .b9b{margin:0 4px;} -.rounded .b10,.rounded .b10b{height:2px;margin:0 3px;} -.rounded .b11,.rounded .b11b{height:2px;margin:0 2px;} -.rounded .b12,.rounded .b12b{height:3px;margin:0 1px;} -#lb-bg{background-image:url("$xwiki.getSkinFile("js/xwiki/lightbox/back.png", true)");background-repeat:repeat;height:100%;width:100%;position:fixed;left:0;top:0;z-index:100000;overflow:auto;} -#lb input[type=text],#lb textarea{cursor:text;} -#lb button{cursor:pointer;} -#lb-align{min-height:100%;position:absolute;width:100%;left:0;text-align:center;vertical-align:middle;z-index:100002;} -#lb{position:absolute;left:50%;top:50px;margin-left:-450px;z-index:100005;width:900px;} -.lb-content{background:#eef3f6;border:1px solid #A9B6C3;border-width:0 1px;padding:0;text-align:center;} -.lb-squarred{background:#eef3f6;border:1px solid #A9B6C3;} -#lb-bottom .lb-squarred{border-top-width:0;} -#lb-top .lb-squarred{border-bottom-width:0;} -#lb-content h1,#lb-content h2,#lb-content h3{margin-top:0;padding-top:0;} -*+html #lb-top .roundedlight,* html #lb-top .roundedlight{margin-top:-1em;} -* html #lb-bottom .roundedlight{margin-top:-1em;} -*+html #lb-top .rounded,* html #lb-top .rounded{margin-top:-1em;} -* html #lb-bottom .rounded{margin-top:0;} -*+html #lb-top .rounded .b1,* html #lb-top .rounded .b1,*+html #lb-top .roundedlight .b1,* html #lb-top .roundedlight .b1{margin-bottom:-0.15em;} -*+html #lb-bottom .rounded .b12b,* html #lb-bottom .rounded .b12b,*+html #lb-bottom .roundedlight .b4b,* html #lb-bottom .roundedlight .b4b{margin-bottom:-0.1em;} -#lb .lb-content{padding:4px 18px;} -.lb-content{overflow:hidden;text-align:left;} -#close-wrap{position:relative;top:18px;right:7px;text-align:right;cursor:default;} -#lb-close{margin-left:auto;margin-right:10px;width:30px;cursor:pointer;background-image:url("$xwiki.getSkinFile("js/xwiki/lightbox/btnClose.png", true)");background-repeat:no-repeat;} \ No newline at end of file +.rounded .top *, +.rounded .bottom *, +.roundedlight .top *, +.roundedlight .bottom * { + display: block; + overflow: hidden; + border-color: #a9b6c3; + border-style: solid; + background: #eef3f6 none repeat scroll 0 50%; + height: 1px; + border-width: 0 1px; +} +.roundedlight .b1, +.roundedlight .b1b { + background: #a9b6c3 none repeat scroll 0 50%; + margin: 0 5px; + border-width: 0; +} +.roundedlight .b2, +.roundedlight .b2b { + border-width: 0 2px; + margin: 0 3px; +} +.roundedlight .b3, +.roundedlight .b3b { + margin: 0 2px; +} +.roundedlight .b4, +.roundedlight .b4b { + height: 2px; + margin: 0 1px; +} +.rounded .b1, +.rounded .b1b { + border-width: 0; + margin: 0 16px; + background: #a9b6c3 none repeat scroll 0 50%; +} +.rounded .b2, +.rounded .b2b { + border-width: 0 3px; + margin: 0 13px; +} +.rounded .b3, +.rounded .b3b { + border-width: 0 2px; + margin: 0 11px; +} +.rounded .b4, +.rounded .b4b { + border-width: 0 2px; + margin: 0 9px; +} +.rounded .b5, +.rounded .b5b { + margin: 0 8px; +} +.rounded .b6, +.rounded .b6b { + margin: 0 7px; +} +.rounded .b7, +.rounded .b7b { + margin: 0 6px; +} +.rounded .b8, +.rounded .b8b { + margin: 0 5px; +} +.rounded .b9, +.rounded .b9b { + margin: 0 4px; +} +.rounded .b10, +.rounded .b10b { + height: 2px; + margin: 0 3px; +} +.rounded .b11, +.rounded .b11b { + height: 2px; + margin: 0 2px; +} +.rounded .b12, +.rounded .b12b { + height: 3px; + margin: 0 1px; +} +#lb-bg { + background-image: url(/skin/resources/js/xwiki/lightbox/back.png); + background-repeat: repeat; + height: 100%; + width: 100%; + position: fixed; + left: 0; + top: 0; + z-index: 100000; + overflow: auto; +} +#lb input[type="text"], +#lb textarea { + cursor: text; +} +#lb button { + cursor: pointer; +} +#lb-align { + min-height: 100%; + position: absolute; + width: 100%; + left: 0; + text-align: center; + vertical-align: middle; + z-index: 100002; +} +#lb { + position: absolute; + left: 50%; + top: 50px; + margin-left: -450px; + z-index: 100005; + width: 900px; +} +.lb-content { + background: #eef3f6; + border: 1px solid #a9b6c3; + border-width: 0 1px; + padding: 0; + text-align: center; +} +.lb-squarred { + background: #eef3f6; + border: 1px solid #a9b6c3; +} +#lb-bottom .lb-squarred { + border-top-width: 0; +} +#lb-top .lb-squarred { + border-bottom-width: 0; +} +#lb-content h1, +#lb-content h2, +#lb-content h3 { + margin-top: 0; + padding-top: 0; +} +* + html #lb-top .roundedlight, +* html #lb-top .roundedlight { + margin-top: -1em; +} +* html #lb-bottom .roundedlight { + margin-top: -1em; +} +* + html #lb-top .rounded, +* html #lb-top .rounded { + margin-top: -1em; +} +* html #lb-bottom .rounded { + margin-top: 0; +} +* + html #lb-top .rounded .b1, +* html #lb-top .rounded .b1, +* + html #lb-top .roundedlight .b1, +* html #lb-top .roundedlight .b1 { + margin-bottom: -0.15em; +} +* + html #lb-bottom .rounded .b12b, +* html #lb-bottom .rounded .b12b, +* + html #lb-bottom .roundedlight .b4b, +* html #lb-bottom .roundedlight .b4b { + margin-bottom: -0.1em; +} +#lb .lb-content { + padding: 4px 18px; +} +.lb-content { + overflow: hidden; + text-align: left; +} +#close-wrap { + position: relative; + top: 18px; + right: 7px; + text-align: right; + cursor: default; +} +#lb-close { + margin-left: auto; + margin-right: 10px; + width: 30px; + cursor: pointer; + background-image: url(/skin/resources/js/xwiki/lightbox/btnClose.png); + background-repeat: no-repeat; +} diff --git a/src/main/webapp/resources/js/xwiki/lightbox/lightbox.js b/src/main/webapp/resources/js/xwiki/lightbox/lightbox.js index bda815075..9c19bc9e0 100644 --- a/src/main/webapp/resources/js/xwiki/lightbox/lightbox.js +++ b/src/main/webapp/resources/js/xwiki/lightbox/lightbox.js @@ -1,78 +1,301 @@ -Lightbox=Class.create({initialize:function(C,A,B){this.formUrl=C; -this.saveUrl=A; -this.redirectUrl=B; -this.formData=""; -this.loadedForms=new Object(); -this.lbinit(); -this.lbShow(); -this.lbLoadForm(C) -},lbShow:function(){this.lbLoading(); -toggleClass($("lb-bg"),"hidden"); -toggleClass($("lb-align"),"hidden"); -$("lb-bg").style.height=(document.body.offsetHeight+35)+"px" -},lbHide:function(){toggleClass($("lb-bg"),"hidden"); -toggleClass($("lb-align"),"hidden") -},lbLoading:function(){if(this.currentUrl){this.loadedForms[this.currentUrl]=$("lb-content").firstChild.cloneNode(true) -}$("lb-content").innerHTML=this.getWaiting() -},lbLoadForm:function(url){this.currentUrl=url; -if(this.loadedForms[url]){var c=$("lb-content"); -$("lb-content").innerHTML=""; -$("lb-content").appendChild(this.loadedForms[url]); -this.form=c.getElementsByTagName("form")[0]; -var scripts=c.getElementsByTagName("script"); -for(var i=0; -i"; -this.form=c.getElementsByTagName("form")[0]; -var scripts=c.getElementsByTagName("script"); -for(var i=0; -i' -},lbcustominit:function(B,A,E,C){if(!$("lb")){var D=this.insertlbcontent(B,A,E,C); -new Insertion.Top("body",D) -}},lbinit:function(){return this.lbcustominit("#FFF","#FFF","#000","rounded") -},insertlbcontent:function(B,A,E,C){var D='' -}}return D -},roundedlightbottom:function(A,B){var C='
'; -return C -},roundedbottom:function(A,B){var C='
'; -return C -},roundedlighttop:function(A,B){var C='
'; -return C -},roundedtop:function(A,B){var C='
'; -return C -},lightboxlink:function(B,A){var C='"+B+""; -return C -}}); \ No newline at end of file +Lightbox = Class.create({ + initialize: function (C, A, B) { + this.formUrl = C; + this.saveUrl = A; + this.redirectUrl = B; + this.formData = ""; + this.loadedForms = new Object(); + this.lbinit(); + this.lbShow(); + this.lbLoadForm(C); + }, + lbShow: function () { + this.lbLoading(); + toggleClass($("lb-bg"), "hidden"); + toggleClass($("lb-align"), "hidden"); + $("lb-bg").style.height = document.body.offsetHeight + 35 + "px"; + }, + lbHide: function () { + toggleClass($("lb-bg"), "hidden"); + toggleClass($("lb-align"), "hidden"); + }, + lbLoading: function () { + if (this.currentUrl) { + this.loadedForms[this.currentUrl] = + $("lb-content").firstChild.cloneNode(true); + } + $("lb-content").innerHTML = this.getWaiting(); + }, + lbLoadForm: function (url) { + this.currentUrl = url; + if (this.loadedForms[url]) { + var c = $("lb-content"); + $("lb-content").innerHTML = ""; + $("lb-content").appendChild(this.loadedForms[url]); + this.form = c.getElementsByTagName("form")[0]; + var scripts = c.getElementsByTagName("script"); + for (var i = 0; i < scripts.length; ++i) { + eval(scripts[i].text); + } + } else { + new Ajax.Request(url, { onSuccess: this.lbFormDataLoaded.bind(this) }); + } + }, + lbFormDataLoaded: function (transport) { + var c = $("lb-content"); + c.innerHTML = "
" + transport.responseText + "
"; + this.form = c.getElementsByTagName("form")[0]; + var scripts = c.getElementsByTagName("script"); + for (var i = 0; i < scripts.length; ++i) { + eval(scripts[i].text); + } + $("lb-bg").style.height = document.body.offsetHeight + 35 + "px"; + }, + lbSaveForm: function () { + this.lbSaveData(); + Form.disable(this.form); + this.lbSaveSync(this.saveUrl); + this.lbHide(); + window.location = this.redirectUrl; + }, + lbNext: function (A) { + this.lbSaveData(); + this.lbLoading(); + this.lbLoadForm(A); + }, + lbSaveData: function () { + this.formData += "&" + Form.serialize(this.form); + this.formData = this.formData.replace("_segmentChief=&", "=&"); + this.formData = this.formData.replace("_periodicity=&", "=&"); + }, + lbSave: function (A) { + this.lbSaveData(); + new Ajax.Request(A + "?ajax=1", { + parameters: this.formData, + onSuccess: this.lbSaveDone.bind(this), + }); + }, + lbSaveSync: function (A) { + new Ajax.Request(A + "?ajax=1", { + parameters: this.formData, + asynchronous: false, + }); + }, + lbSaveDone: function (A) { + this.lbHide(); + }, + lbClearData: function () { + this.formData = ""; + }, + lbClose: function () { + this.lbHide(); + if (this.redirectUrl !== undefined) { + window.location = this.redirectUrl; + } + }, + lbSetNext: function (A) { + this.nextURL = A; + }, + getWaiting: function () { + return '
'; + }, + lbcustominit: function (B, A, E, C) { + if (!$("lb")) { + var D = this.insertlbcontent(B, A, E, C); + new Insertion.Top("body", D); + } + }, + lbinit: function () { + return this.lbcustominit("#FFF", "#FFF", "#000", "rounded"); + }, + insertlbcontent: function (B, A, E, C) { + var D = + ''; + } + } + return D; + }, + roundedlightbottom: function (A, B) { + var C = + '
'; + return C; + }, + roundedbottom: function (A, B) { + var C = + '
'; + return C; + }, + roundedlighttop: function (A, B) { + var C = + '
'; + return C; + }, + roundedtop: function (A, B) { + var C = + '
'; + return C; + }, + lightboxlink: function (B, A) { + var C = + '" + + B + + ""; + return C; + }, +}); diff --git a/src/main/webapp/resources/js/xwiki/lightbox/lightboxIE.css b/src/main/webapp/resources/js/xwiki/lightbox/lightboxIE.css index 77c5c2b0d..6b53414b2 100644 --- a/src/main/webapp/resources/js/xwiki/lightbox/lightboxIE.css +++ b/src/main/webapp/resources/js/xwiki/lightbox/lightboxIE.css @@ -1,40 +1,212 @@ -.rounded .top *,.rounded .bottom *,.roundedlight .top *,.roundedlight .bottom *{display:block;overflow:hidden;border-color:#A9B6C3;border-style:solid;background:#EEF3F6 none repeat scroll 0 50%;height:1px;border-width:0 1px;margin:0;padding:0;zoom:1;line-height:1px;} -.rounded,.rounded .top,.rounded .bottom{height:16px;} -.roundedlight,.roundedlight .top,.roundedlight .bottom{height:5px;} -.roundedlight .b1,.roundedlight .b1b{background:#A9B6C3 none repeat scroll 0 50%;margin:0 5px;border-width:0;} -.roundedlight .b2,.roundedlight .b2b{border-width:0 2px;margin:0 3px;} -.roundedlight .b3,.roundedlight .b3b{margin:0 2px;} -.roundedlight .b4,.roundedlight .b4b{height:2px;margin:0 1px;} -.rounded .b1,.rounded .b1b{border-width:0;margin:0 16px;background:#A9B6C3 none repeat scroll 0 50%;} -.rounded .b2,.rounded .b2b{border-width:0 3px;margin:0 13px;} -.rounded .b3,.rounded .b3b{border-width:0 2px;margin:0 11px;} -.rounded .b4,.rounded .b4b{border-width:0 2px;margin:0 9px;} -.rounded .b5,.rounded .b5b{margin:0 8px;} -.rounded .b6,.rounded .b6b{margin:0 7px;} -.rounded .b7,.rounded .b7b{margin:0 6px;} -.rounded .b8,.rounded .b8b{margin:0 5px;} -.rounded .b9,.rounded .b9b{margin:0 4px;} -.rounded .b10,.rounded .b10b{height:2px;margin:0 3px;} -.rounded .b11,.rounded .b11b{height:2px;margin:0 2px;} -.rounded .b12,.rounded .b12b{height:3px;margin:0 1px;} -#lb-bg{background-color:#000;height:100%;left:0;position:absolute;top:0;width:100%;z-index:100000;filter:alpha(opacity=70);opacity:.7;overflow:auto;} -#lb input[type=text],#lb textarea{cursor:text;} -#lb button{cursor:hand;} -#lb-align{min-height:100%;position:absolute;width:100%;left:0;text-align:center;vertical-align:middle;z-index:100002;} -#lb{position:absolute;left:50%;top:50px;margin-left:-450px;z-index:100005;width:900px;} -.lb-content{background:#eef3f6;border:1px solid #A9B6C3;border-width:0 1px;padding:0;text-align:center;} -#lb ul li{_zoom:1;} -.lb-squarred{background:#eef3f6;border:1px solid #A9B6C3;} -#lb-bottom .lb-squarred{border-top-width:0;} -#lb-top .lb-squarred{border-bottom-width:0;} -#lb-content h1,#lb-content h2,#lb-content h3{margin-top:0;padding-top:0;} -#lb-top .roundedlight{margin-bottom:-0.15em;margin-top:-0.9em;} -#lb-bottom .roundedlight{margin-top:-0.75em;} -#lb-top .rounded{margin-bottom:0;margin-top:0;} -#lb-bottom .rounded{margin-top:-0.2em;} -*+html #lb-top .rounded .b1,* html #lb-top .rounded .b1,*+html #lb-top .roundedlight .b1,* html #lb-top .roundedlight .b1{margin-bottom:-1em;} -*+html #lb-bottom .rounded .b12b,* html #lb-bottom .rounded .b12b,*+html #lb-bottom .roundedlight .b4b,* html #lb-bottom .roundedlight .b4b{margin-bottom:-1em;} -#lb .lb-content{padding:4px 18px;} -.lb-content{overflow:hidden;text-align:left;} -#close-wrap{position:relative;top:18px;right:7px;text-align:right;cursor:default;} -#lb-close{margin-left:auto;margin-right:10px;width:30px;cursor:pointer;background-image:url($xwiki.getSkinFile("js/xwiki/lightbox/btnClose.png", true));background-repeat:no-repeat;} \ No newline at end of file +.rounded .top *, +.rounded .bottom *, +.roundedlight .top *, +.roundedlight .bottom * { + display: block; + overflow: hidden; + border-color: #a9b6c3; + border-style: solid; + background: #eef3f6 none repeat scroll 0 50%; + height: 1px; + border-width: 0 1px; + margin: 0; + padding: 0; + zoom: 1; + line-height: 1px; +} +.rounded, +.rounded .top, +.rounded .bottom { + height: 16px; +} +.roundedlight, +.roundedlight .top, +.roundedlight .bottom { + height: 5px; +} +.roundedlight .b1, +.roundedlight .b1b { + background: #a9b6c3 none repeat scroll 0 50%; + margin: 0 5px; + border-width: 0; +} +.roundedlight .b2, +.roundedlight .b2b { + border-width: 0 2px; + margin: 0 3px; +} +.roundedlight .b3, +.roundedlight .b3b { + margin: 0 2px; +} +.roundedlight .b4, +.roundedlight .b4b { + height: 2px; + margin: 0 1px; +} +.rounded .b1, +.rounded .b1b { + border-width: 0; + margin: 0 16px; + background: #a9b6c3 none repeat scroll 0 50%; +} +.rounded .b2, +.rounded .b2b { + border-width: 0 3px; + margin: 0 13px; +} +.rounded .b3, +.rounded .b3b { + border-width: 0 2px; + margin: 0 11px; +} +.rounded .b4, +.rounded .b4b { + border-width: 0 2px; + margin: 0 9px; +} +.rounded .b5, +.rounded .b5b { + margin: 0 8px; +} +.rounded .b6, +.rounded .b6b { + margin: 0 7px; +} +.rounded .b7, +.rounded .b7b { + margin: 0 6px; +} +.rounded .b8, +.rounded .b8b { + margin: 0 5px; +} +.rounded .b9, +.rounded .b9b { + margin: 0 4px; +} +.rounded .b10, +.rounded .b10b { + height: 2px; + margin: 0 3px; +} +.rounded .b11, +.rounded .b11b { + height: 2px; + margin: 0 2px; +} +.rounded .b12, +.rounded .b12b { + height: 3px; + margin: 0 1px; +} +#lb-bg { + background-color: #000; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; + z-index: 100000; + filter: alpha(opacity=70); + opacity: 0.7; + overflow: auto; +} +#lb input[type="text"], +#lb textarea { + cursor: text; +} +#lb button { + cursor: hand; +} +#lb-align { + min-height: 100%; + position: absolute; + width: 100%; + left: 0; + text-align: center; + vertical-align: middle; + z-index: 100002; +} +#lb { + position: absolute; + left: 50%; + top: 50px; + margin-left: -450px; + z-index: 100005; + width: 900px; +} +.lb-content { + background: #eef3f6; + border: 1px solid #a9b6c3; + border-width: 0 1px; + padding: 0; + text-align: center; +} +#lb ul li { + _zoom: 1; +} +.lb-squarred { + background: #eef3f6; + border: 1px solid #a9b6c3; +} +#lb-bottom .lb-squarred { + border-top-width: 0; +} +#lb-top .lb-squarred { + border-bottom-width: 0; +} +#lb-content h1, +#lb-content h2, +#lb-content h3 { + margin-top: 0; + padding-top: 0; +} +#lb-top .roundedlight { + margin-bottom: -0.15em; + margin-top: -0.9em; +} +#lb-bottom .roundedlight { + margin-top: -0.75em; +} +#lb-top .rounded { + margin-bottom: 0; + margin-top: 0; +} +#lb-bottom .rounded { + margin-top: -0.2em; +} +* + html #lb-top .rounded .b1, +* html #lb-top .rounded .b1, +* + html #lb-top .roundedlight .b1, +* html #lb-top .roundedlight .b1 { + margin-bottom: -1em; +} +* + html #lb-bottom .rounded .b12b, +* html #lb-bottom .rounded .b12b, +* + html #lb-bottom .roundedlight .b4b, +* html #lb-bottom .roundedlight .b4b { + margin-bottom: -1em; +} +#lb .lb-content { + padding: 4px 18px; +} +.lb-content { + overflow: hidden; + text-align: left; +} +#close-wrap { + position: relative; + top: 18px; + right: 7px; + text-align: right; + cursor: default; +} +#lb-close { + margin-left: auto; + margin-right: 10px; + width: 30px; + cursor: pointer; + background-image: url(/skin/resources/js/xwiki/lightbox/btnClose.png); + background-repeat: no-repeat; +} diff --git a/src/main/webapp/resources/js/xwiki/suggest/ajaxSuggest.css b/src/main/webapp/resources/js/xwiki/suggest/ajaxSuggest.css deleted file mode 100644 index f1e846c3f..000000000 --- a/src/main/webapp/resources/js/xwiki/suggest/ajaxSuggest.css +++ /dev/null @@ -1,66 +0,0 @@ -#template('colorThemeInit.vm') - -.xhover { - background:red; -} - -input[type="text"].suggest { - border-width: 1px; -} - -body { - position: relative; -} - -div.suggestItems { - position:absolute; - border: 1px solid $theme.borderColor; - border-top: none; - background: white; /* theme color ? */ - z-index: 100013; - text-align:left; -} - -div.suggestItems ul { - margin: 0px; -} - -div.suggestItems li { - overflow:hidden; - white-space:nowrap; - margin-right:2px; -} - -ul.suggestList { - margin:0px !important; - text-transform:none; - color:$theme.textColor; - font-weight:normal; -} - -ul.suggestList .xhighlight { - background-color: $theme.highlightColor; -} - -div.suggestItemName { - text-indent: 0; -} - -div.suggestItemInfo { - color: #556677; - font-size: 0.8em; - padding-left: 20px; - text-indent: 0; -} - -div.suggestItemName, -div.suggestItemInfo { - text-decoration: inherit; -} - -.highlight { - background-color: $theme.highlightColor; - font-weight:bold; - text-decoration: inherit; -} - diff --git a/src/main/webapp/resources/js/xwiki/suggest/ajaxSuggest.js b/src/main/webapp/resources/js/xwiki/suggest/ajaxSuggest.js deleted file mode 100644 index ff6f545b2..000000000 --- a/src/main/webapp/resources/js/xwiki/suggest/ajaxSuggest.js +++ /dev/null @@ -1,561 +0,0 @@ -var XWiki = (function(XWiki){ - - var widgets = XWiki.widgets = XWiki.widgets || {}; - - if (typeof widgets.XList == 'undefined') { - if (typeof console != "undefined" && typeof console.warn == "function") { - console.warn("[Suggest widget] Required class missing: XWiki.widgets.XList"); - } - } else { - -/** - * Suggest class. - * Provide value suggestions to users when starting to type in a text input. - */ - widgets.Suggest = Class.create({ - options : { - // The minimum number of characters after which to trigger the suggest - minchars : 1, - // The HTTP method for the AJAX request - method : "get", - // The name of the request parameter holding the input stub - varname : "input", - // The CSS classname of the suggest list - className : "ajaxsuggest", - timeout : 2500, - delay : 500, - offsety : 0, - // Display a "no results" message, or simply hide the suggest box when no suggestions are available - shownoresults : true, - // The message to display as the "no results" message - noresults : "No results!", - maxheight : 250, - cache : false, - seps : "", - icon : null, - // The name of the JSON variable or XML element holding the results. - // "results" for the old suggest, "searchResults" for the REST search. - resultsParameter : "results", - // The name of the JSON parameter or XML attribute holding the result identifier. - // "id" for both the old suggest and the REST search. - resultId : "id", - // The name of the JSON parameter or XML attribute holding the result value. - // "value" for the old suggest, "pageFullName" for the REST page search. - resultValue : "value", - // The name of the JSON parameter or XML attribute holding the result auxiliary information. - // "info" for the old suggest, "pageFullName" for the REST search. - resultInfo : "info", - // The id of the element that will hold the suggest element - parentContainer : "body" - }, - sInput : "", - nInputChars : 0, - aSuggestions : [], - iHighlighted : 0, - - /** - * Initialize the suggest - * - * @param {Object} fld the suggest field - * @param {Object} param the options - */ - initialize: function (fld, param){ - this.fld = $(fld); - - if (!this.fld) { - return false; - } - - // Clone default options from the prototype so that they are not shared and extend options with passed parameters - this.options = Object.extend(Object.clone(this.options), param || { }); - - // Reset the container if the configured parameter is not valid - if (!$(this.options.parentContainer)) { - this.options.parentContainer = $(document.body); - } - - if (this.options.seps) { - this.seps = this.options.seps; - } else { - this.seps = ""; - } - // Bind the key listeners on the input field. - this.fld.observe("keyup", this.onKeyUp.bindAsEventListener(this)); - if (Prototype.Browser.IE || Prototype.Browser.WebKit) { - this.fld.observe("keydown", this.onKeyPress.bindAsEventListener(this)); - } else { - this.fld.observe("keypress", this.onKeyPress.bindAsEventListener(this)); - } - - // Prevent normal browser autocomplete - this.fld.setAttribute("autocomplete", "off"); - }, - - /** - * Treats normal characters and triggers the autocompletion behavior. This is needed since the field value is not - * updated when keydown/keypress are called, so the suggest would work with the previous value. The disadvantage is - * that keyUp is not fired for each stroke in a long keypress, but only once at the end. This is not a real problem, - * though. - */ - onKeyUp: function(event) - { - var key = event.keyCode; - switch(key) { - // Ignore special keys, which are treated in onKeyPress - case Event.KEY_RETURN: - case Event.KEY_ESC: - case Event.KEY_UP: - case Event.KEY_DOWN: - break; - default: { - // If there are separators in the input string, get suggestions only for the text after the last separator - // TODO The user might be typing in the middle of the field, not in the last item. Do a better detection by - // comparing the new value with the old one. - if(this.seps) { - var lastIndx = -1; - for(var i = 0; i < this.seps.length; i++) { - if(this.fld.value.lastIndexOf(this.seps.charAt(i)) > lastIndx) { - lastIndx = this.fld.value.lastIndexOf(this.seps.charAt(i)); - } - } - if(lastIndx == -1) { - this.getSuggestions(this.fld.value); - } else { - this.getSuggestions(this.fld.value.substring(lastIndx+1)); - } - } else { - this.getSuggestions(this.fld.value); - } - } - } - }, - /** - * Treats Up and Down arrows, Enter and Escape, affecting the UI meta-behavior. Enter puts the currently selected - * value inside the target field, Escape closes the suggest dropdown, Up and Down move the current selection. - */ - onKeyPress: function(event) { - if(!$(this.suggest)) { - // Let the key events pass through if the UI is not displayed - return; - } - var key = event.keyCode; - - switch(key) { - case Event.KEY_RETURN: - if(this.aSuggestions.length == 1) { - this.highlightFirst(); - } - this.setHighlightedValue(); - Event.stop(event); - break; - case Event.KEY_ESC: - this.clearSuggestions(); - Event.stop(event); - break; - case Event.KEY_UP: - this.changeHighlight(key); - Event.stop(event); - break; - case Event.KEY_DOWN: - this.changeHighlight(key); - Event.stop(event); - break; - default: - break; - } - }, - - /** - * Get suggestions - * - * @param {Object} val the value to get suggestions for - */ - getSuggestions: function (val) - { - // if input stays the same, do nothing - // - val = val.strip(); - if (val == this.sInput) { - return false; - } - - // input length is less than the min required to trigger a request - // reset input string - // do nothing - // - if (val.length < this.options.minchars) { - this.sInput = ""; - return false; - } - - // if caching enabled, and user is typing (ie. length of input is increasing) - // filter results out of aSuggestions from last request - // - if (val.length>this.nInputChars && this.aSuggestions.length && this.options.cache) - { - var arr = []; - for (var i=0;i" + val.substring(st, st+this.sInput.length) + "" + val.substring(st+this.sInput.length); - var span = new Element("span").update(output); - var valueNode = new Element('div') - .insert(new Element('span', {'class':'suggestId'}).update(arr[i].id)) - .insert(new Element('span', {'class':'suggestValue'}).update(arr[i].value)) - .insert(new Element('span', {'class':'suggestInfo'}).update(arr[i].info)); - - var item = new XWiki.widgets.XListItem( span , { - containerClasses: 'suggestItem', - value: valueNode, - noHighlight: true // we do the highlighting ourselves - }); - - list.addItem(item); - } - - // no results - if (arr.length == 0) - { - list.addItem( new XWiki.widgets.XListItem(this.options.noresults, {'classes' : 'noSuggestion'})) - } - div.appendChild( list.getElement() ); - - // get position of target textfield - // position holding div below it - // set width of holding div to width of field - var pos = this.fld.cumulativeOffset(); - - div.style.left = pos.left + "px"; - div.style.top = (pos.top + this.fld.offsetHeight + this.options.offsety) + "px"; - div.style.width = this.fld.offsetWidth + "px"; - - // set mouseover functions for div - // when mouse pointer leaves div, set a timeout to remove the list after an interval - // when mouse enters div, kill the timeout so the list won't be removed - div.onmouseover = function(){ pointer.killTimeout() } - div.onmouseout = function(){ pointer.resetTimeout() } - - // add DIV to document - $(this.options.parentContainer).insert(div); - this.suggest = div; - - // currently no item is highlighted - this.iHighlighted = 0; - - // remove list after an interval - var pointer = this; - this.toID = setTimeout(function () { pointer.clearSuggestions() }, this.options.timeout); - }, - - /** - * Change highlight - * - * @param {Object} key - */ - changeHighlight: function(key) - { - var list = this.suggest.down('ul'); - if (!list) - return false; - - var n, elem; - - if (this.iHighlighted) { - if (key == 40) - elem = this.iHighlighted.next() || list.down('li'); - else if (key == 38) - elem = this.iHighlighted.previous() || list.down('li:last-child'); - } - else { - if (key == 40) - elem = list.down('li'); - else if (key == 38) - if (list.select('li') > 0) { - elem = list.select('li')[list.select('li').length]; - } - } - - if (elem) { - this.setHighlight(elem); - } - }, - - /** - * Set highlight - * - * @param {Object} n - */ - setHighlight: function(highlightedItem) - { - if (this.iHighlighted) - this.clearHighlight(); - - highlightedItem.addClassName("xhighlight"); - - this.iHighlighted = highlightedItem; - - this.killTimeout(); - }, - - /** - * Clear highlight - */ - clearHighlight: function() - { - if (this.iHighlighted) { - this.iHighlighted.removeClassName("xhighlight"); - delete this.iHighlighted; - } - }, - - highlightFirst: function() - { - if (this.suggest && this.suggest.down('ul')) { - var first = this.suggest.down('ul').down('li'); - if (first) { - this.setHighlight(first); - } - } - }, - - setHighlightedValue: function () - { - if (this.iHighlighted && !this.iHighlighted.hasClassName('noSuggestion')) - { - if(this.sInput == "" && this.fld.value == "") - this.sInput = this.fld.value = this.iHighlighted.down(".suggestValue").innerHTML; - else { - if(this.seps) { - var lastIndx = -1; - for(var i = 0; i < this.seps.length; i++) - if(this.fld.value.lastIndexOf(this.seps.charAt(i)) > lastIndx) - lastIndx = this.fld.value.lastIndexOf(this.seps.charAt(i)); - if(lastIndx == -1) - this.sInput = this.fld.value = this.iHighlighted.down(".suggestValue").innerHTML; - else - { - this.fld.value = this.fld.value.substring(0, lastIndx+1) + this.iHighlighted.down(".suggestValue").innerHTML; - this.sInput = this.fld.value.substring(lastIndx+1); - } - } - else - this.sInput = this.fld.value = this.iHighlighted.down(".suggestValue").innerHTML; - } - - Event.fire(this.fld, "xwiki:suggest:selected", { - 'id': this.iHighlighted.down(".suggestId").innerHTML, - 'value': this.iHighlighted.down(".suggestValue").innerHTML, - 'info': this.iHighlighted.down(".suggestInfo").innerHTML - }); - this.fld.focus(); - - /* - // move cursor to end of input (safari) - // - if (this.fld.selectionStart) - this.fld.setSelectionRange(this.sInput.length, this.sInput.length);*/ - - this.clearSuggestions(); - - // pass selected object to callback function, if exists - - if (typeof(this.options.callback) == "function") { - this.options.callback( { - 'id': this.iHighlighted.down(".suggestId").innerHTML, - 'value': this.iHighlighted.down(".suggestValue").innerHTML, - 'info': this.iHighlighted.down(".suggestInfo").innerHTML - } ); - } - - //there is a hidden input - if(this.fld.id.indexOf("_suggest") > 0) { - var hidden_id = this.fld.id.substring(0, this.fld.id.indexOf("_suggest")); - var hidden_inp = $(hidden_id); - - if(hidden_inp) - hidden_inp.value = this.iHighlighted.down(".suggestInfo").innerHTML; - } - - } - }, - - /** - * Kill timeout - */ - killTimeout: function() - { - clearTimeout(this.toID); - }, - - /** - * Reset timeout - */ - resetTimeout: function() - { - clearTimeout(this.toID); - var pointer = this; - this.toID = setTimeout(function () { pointer.clearSuggestions() }, 1000); - }, - - /** - * Clear suggestions - */ - clearSuggestions: function() { - this.killTimeout(); - var ele = $(this.suggest); - var pointer = this; - if (ele) { - var fade = new Effect.Fade(ele, {duration: "0.25", afterFinish : function() { - if($(pointer.suggest)) { - $(pointer.suggest).remove(); - delete pointer.suggest; - } - }}); - } - } - - }); - - } - - return XWiki; - -})(XWiki || {}); diff --git a/src/main/webapp/resources/js/xwiki/suggest/suggest_img/as_pointer.gif b/src/main/webapp/resources/js/xwiki/suggest/suggest_img/as_pointer.gif deleted file mode 100644 index dbc21220f..000000000 Binary files a/src/main/webapp/resources/js/xwiki/suggest/suggest_img/as_pointer.gif and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/suggest/suggest_img/hl_corner_bl.gif b/src/main/webapp/resources/js/xwiki/suggest/suggest_img/hl_corner_bl.gif deleted file mode 100644 index b701d01c9..000000000 Binary files a/src/main/webapp/resources/js/xwiki/suggest/suggest_img/hl_corner_bl.gif and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/suggest/suggest_img/hl_corner_br.gif b/src/main/webapp/resources/js/xwiki/suggest/suggest_img/hl_corner_br.gif deleted file mode 100644 index 11debd7fe..000000000 Binary files a/src/main/webapp/resources/js/xwiki/suggest/suggest_img/hl_corner_br.gif and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/suggest/suggest_img/hl_corner_tl.gif b/src/main/webapp/resources/js/xwiki/suggest/suggest_img/hl_corner_tl.gif deleted file mode 100644 index 1c2bbaf7a..000000000 Binary files a/src/main/webapp/resources/js/xwiki/suggest/suggest_img/hl_corner_tl.gif and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/suggest/suggest_img/hl_corner_tr.gif b/src/main/webapp/resources/js/xwiki/suggest/suggest_img/hl_corner_tr.gif deleted file mode 100644 index 38b1eff9a..000000000 Binary files a/src/main/webapp/resources/js/xwiki/suggest/suggest_img/hl_corner_tr.gif and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/suggest/suggest_img/ul_corner_bl.gif b/src/main/webapp/resources/js/xwiki/suggest/suggest_img/ul_corner_bl.gif deleted file mode 100644 index 6d890012b..000000000 Binary files a/src/main/webapp/resources/js/xwiki/suggest/suggest_img/ul_corner_bl.gif and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/suggest/suggest_img/ul_corner_br.gif b/src/main/webapp/resources/js/xwiki/suggest/suggest_img/ul_corner_br.gif deleted file mode 100644 index 6a81d6a54..000000000 Binary files a/src/main/webapp/resources/js/xwiki/suggest/suggest_img/ul_corner_br.gif and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/suggest/suggest_img/ul_corner_tl.gif b/src/main/webapp/resources/js/xwiki/suggest/suggest_img/ul_corner_tl.gif deleted file mode 100644 index d9aaf500e..000000000 Binary files a/src/main/webapp/resources/js/xwiki/suggest/suggest_img/ul_corner_tl.gif and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/suggest/suggest_img/ul_corner_tr.gif b/src/main/webapp/resources/js/xwiki/suggest/suggest_img/ul_corner_tr.gif deleted file mode 100644 index 58c5b13fc..000000000 Binary files a/src/main/webapp/resources/js/xwiki/suggest/suggest_img/ul_corner_tr.gif and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/table/livetable.css b/src/main/webapp/resources/js/xwiki/table/livetable.css index db9768292..478cc9a6d 100644 --- a/src/main/webapp/resources/js/xwiki/table/livetable.css +++ b/src/main/webapp/resources/js/xwiki/table/livetable.css @@ -1,86 +1,437 @@ -.xwiki-livetable td.xwiki-livetable-pagination{color:#888;font-size:90%;line-height:22px;border:0;} -.xwiki-livetable-loader,.xwiki-livetable-loader img{float:left;} -.xwiki-livetable-pagination .xwiki-livetable-limits{float:left;} -.xwiki-livetable-pagination .xwiki-livetable-limits strong{font-weight:normal;} -.xwiki-livetable-pagination .xwiki-livetable-pagination-content,.xwiki-livetable-pagination .xwiki-livetable-pagination-text{display:in-line;} -.xwiki-livetable-pagination span.pagenumber{color:#888;cursor:pointer;} -.xwiki-livetable-pagination span.pagenumber:hover{color:#4D4D4D;text-decoration:underlined;} -.xwiki-livetable-pagination span.selected{color:#4D4D4D;font-weight:bold;} -.xwiki-livetable-pagination span.pagenumber:focus{outline:dotted 1px #000;} -.pagination{float:right;margin-right:10px;} -.controlPagination{position:relative;width:42px;height:22px;overflow:hidden;margin:0!important;padding:0!important;float:right;} -.controlPagination span{position:absolute;top:0;left:0;line-height:25px;outline:none;overflow:hidden;border:none;} -.controlPagination span.prevPagination,.controlPagination span.noPrevPagination,.controlPagination span.nextPagination,.controlPagination span.noNextPagination{background-image:url("$xwiki.getSkinFile('icons/xwiki/pagination-controls.png', true)");width:21px;height:22px;} -.controlPagination span.prevPagination:hover,.controlPagination span.nextPagination:hover{cursor:pointer;} -.controlPagination span.prevPagination{background-position:left top;} -.controlPagination span.noPrevPagination{background-position:left bottom;} -.controlPagination span.nextPagination{background-position:right top;left:21px;} -.controlPagination span.noNextPagination{background-position:right bottom;left:21px;} -table.xwiki-livetable{width:100%;margin:0;} -.xwiki-livetable td.xwiki-livetable-display-container{margin:0;border-color:#fff;padding:0 0 0 4px;width:auto;} -.xwiki-livetable td.xwiki-livetable-display-container table.xwiki-livetable-display{margin:0;border-collapse:collapse;width:100%;} -.xwiki-livetable-display td{border-color:#fff;border-bottom-color:#ccc;} -html>body .xwiki-livetable-display td{border:0;} -table.xwiki-livetable table.xwiki-livetable-display thead.xwiki-livetable-display-header{border-bottom:5px solid #ddd;} -thead.xwiki-livetable-display-header tr.xwiki-livetable-display-filters:hover,thead.xwiki-livetable-display-header tr.rowHover.{background-color:#fff;} -thead.xwiki-livetable-display-header th.xwiki-livetable-display-header-text{background-color:#ddd;border:0;border-collapse:separate;border-right:1px solid #FFF;color:#4D4D4D;padding:3px 16px 3px 5px;font-weight:normal;text-align:left;white-space:nowrap;} -thead.xwiki-livetable-display-header th.sortable a{color:#4D4D4D;text-decoration:none;} -thead.xwiki-livetable-display-header th.sortable{cursor:pointer;} -thead.xwiki-livetable-display-header th.desc{background:#ddd url("$xwiki.getSkinFile('icons/silk/bullet_arrow_down.gif', true)") no-repeat scroll right center;} -thead.xwiki-livetable-display-header th.asc{background:#ddd url("$xwiki.getSkinFile('icons/silk/bullet_arrow_up.gif', true)") no-repeat scroll right center;} -thead.xwiki-livetable-display-header th.selected{color:#4D4D4D;background-color:lemonChiffon;} -thead.xwiki-livetable-display-header td.xwiki-livetable-display-header-filter{padding:1px;} -html>body thead.xwiki-livetable-display-header td.xwiki-livetable-display-header-filter{padding:2px 5px 2px 0;border-color:transparent;} -thead.xwiki-livetable-display-header td.xwiki-livetable-display-header-filter input,thead.xwiki-livetable-display-header td.xwiki-livetable-display-header-filter select{width:100%;border:1px solid #DDD;color:#888;margin:0;padding:0 0 0 2px;} -tbody.xwiki-livetable-display-body tr{border-bottom:1px solid #ccc;} -tbody.xwiki-livetable-display-body tr:hover,tbody.xwiki-livetable-display-body tr.rowHover{background-color:lemonChiffon;} -tbody.xwiki-livetable-display-body tr.rowHover td{border-left-color:lemonChiffon;border-right-color:lemonChiffon;} -tbody.xwiki-livetable-display-body td{color:#4D4D4D;padding:3px 2px 3px 4px;background-image:none;} -tbody.xwiki-livetable-display-body a,tbody.xwiki-livetable-display-body a:hover{color:#00007e;} -tbody.xwiki-livetable-display-body td.linkeditor,tbody.xwiki-livetable-display-body td.editableCellHover.linkeditor a{padding-right:16px;cursor:pointer;} -tbody.xwiki-livetable-display-body td:hover.linkeditor{background:lemonChiffon url("$xwiki.getSkinFile('pencil.gif', true)") no-repeat scroll right center;cursor:pointer;} -tbody.xwiki-livetable-display-body td.linkeditor a.editableCellHover{display:block;background:lemonChiffon url("$xwiki.getSkinFile('pencil.gif', true)") no-repeat scroll right center;cursor:pointer;color:#4D4D4D;padding-right:16px;} -tbody.xwiki-livetable-display-body td.linkeditor a{color:#4D4D4D;text-decoration:none;} -tbody.xwiki-livetable-display-body td:hover.typenumeric,tbody.xwiki-livetable-display-body td.editableCellHover.typenumeric,tbody.xwiki-livetable-display-body td.typenumeric{text-align:right;} -tbody.xwiki-livetable-display-body td:hover.typenone,tbody.xwiki-livetable-display-body td.editableCellHover.typenone,tbody.xwiki-livetable-display-body td.typenone{text-align:center;padding-left:0;} -tbody.xwiki-livetable-display-body td a.action{color:#888;padding-left:20px;background-repeat:no-repeat;margin-right:5px;padding-bottom:1px;} -tbody.xwiki-livetable-display-body td a.action:hover{text-decoration:underline;} -tbody.xwiki-livetable-display-body td a.actioncopy{background-image:url($xwiki.getSkinFile("icons/silk/page_white_copy.gif", true));} -tbody.xwiki-livetable-display-body td a.actionrename{background-image:url($xwiki.getSkinFile("icons/silk/textfield_rename.gif", true));} -tbody.xwiki-livetable-display-body td a.actiondelete{background-image:url($xwiki.getSkinFile("icons/silk/cross.gif", true));} -tbody.xwiki-livetable-display-body td a.actionrights{background-image:url($xwiki.getSkinFile("icons/silk/lock_edit.gif", true));} -tbody.xwiki-livetable-display-body td a.actionedit{background-image:url($xwiki.getSkinFile("icons/silk/page_white_edit.gif", true));} -div.dialog-loading{border:1px solid #aaa;} -div.dialog-loading tr.dialogTop td.dialogTopCenter div.Caption{background-color:#DDD;} -div.dialog-loading tr.dialogMiddle td.dialogMiddleCenter div.gwt-ModalDialog-Content{padding:20px;} -div.xwikigwt-editfield{background-color:#FFF;border:1px solid #aaa;} -div.xwikigwt-editfield-main{padding:20px;} -div.xwikigwt-editfield tr.dialogTop td.dialogTopCenter div.Caption{background-color:#DDD;color:#4D4D4D;padding:9px 4px 4px;} -div.xwikigwt-editfield tr.dialogMiddle td.dialogMiddleCenter div.xwikigwt-editfield-actions{margin-top:10px;width:75%;} -div.xwikigwt-editfield tr.dialogMiddle td.dialogMiddleCenter div.xwikigwt-editfield-actions .xwikigwt-cancel{background-color:#fff;color:#00007E;padding:0;border:0;float:right;} -div.xwikigwt-editfield tr.dialogMiddle td.dialogMiddleCenter div.xwikigwt-editfield-actions .xwikigwt-next{background-color:#ddd;color:#000;} -.xwiki-livetable-tagcloud-container{border:1px solid #ddd;border-bottom:5px solid #ddd;background-color:transparent;padding:10px;position:relative;margin-top:10px;} -.xwiki-livetable-tagcloud-container h2{background:url($xwiki.getSkinFile('icons/silk/tag_yellow.gif', true)) no-repeat;font-size:1em;color:#888;padding-left:25px;} -.xwiki-livetable-tagcloud-container h2 span{color:#888;font-size:.8em;font-weight:normal;line-height:2em;margin:0 0 10px;border:none;} -.xwiki-livetable-tagcloud-container div.clearfloats{background-color:transparent;margin:0;overflow:hidden;} -div.xwiki-livetable-tagcloud ol.tagCloud{margin:0;} -div.xwiki-livetable-tagcloud ol.tagCloud li span{color:#ddd;padding:0 3px 0 3px;border:1px solid #fff;} -div.xwiki-livetable-tagcloud ol.tagCloud li.selectable span{cursor:pointer;color:#4D4D4D;} -div.xwiki-livetable-tagcloud ol.tagCloud li.selected span{background-color:lemonChiffon;border-bottom:1px solid #DDD;border-top:1px solid #DDD;} -.xwiki-livetable-tagcloud-tip .tippointer{position:relative;width:0;height:0;top:-3px!important;left:45px;border-top:20px solid #ddd;border-right:20px dotted transparent;border-left:20px dotted transparent;border-bottom:0 none;} -.xwiki-livetable-tagcloud-tip .tippointer div{position:absolute;width:0;height:0;top:-20px;left:-15px;border-top:15px solid #ddd;border-right:15px dotted transparent;border-left:15px dotted transparent;border-bottom:0 none;} -div.xwiki-livetable-pagination-content{background:url($xwiki.getSkinFile("icons/silk/page_white_copy.gif", true)) no-repeat;padding-left:20px;padding-bottom:2px;display:inline;} -div.xwiki-livetable-pagination-content span.pagenumber{display:inline;color:#888;cursor:pointer;} -div.xwiki-livetable-pagination-content span.pagenumber:hover{color:#4D4D4D;text-decoration:underlined;} -div.xwiki-livetable-pagination-content span.selected{color:#4D4D4D;font-weight:bold;} -div.xwiki-livetable-pagination-content span.pagenumber:focus{outline:dotted 1px #000;} -.display{border-collapse:collapse;border:1px solid #e8e8e8;width:100%;} -.display td{border:1px solid #e8e8e8;padding:3px;} -.icon-manage{cursor:pointer;padding-right:10px;} -.icon-manageg{padding-right:10px;} -#ajax-loader{margin:0;padding:0;position:absolute;top:50%;left:35%;z-index:1000000000;display:none;width:220px;background-color:#fff;border:1px solid #999;font-size:11px;padding:8px;text-indent:5px;} -.theader{background-color:#ccc;color:#FFF;font-weight:bold;font-size:1em;} -#table-filters{background-color:#efefef;} -.filter{width:70%;} -.theader td{padding:3px 0 3px 10px;} -table.livetable{width:100%;position:relative;border:5px solid #fff;margin:0;left:0;} \ No newline at end of file +.xwiki-livetable td.xwiki-livetable-pagination { + color: #888; + font-size: 90%; + line-height: 22px; + border: 0; +} +.xwiki-livetable-loader, +.xwiki-livetable-loader img { + float: left; +} +.xwiki-livetable-pagination .xwiki-livetable-limits { + float: left; +} +.xwiki-livetable-pagination .xwiki-livetable-limits strong { + font-weight: normal; +} +.xwiki-livetable-pagination .xwiki-livetable-pagination-content, +.xwiki-livetable-pagination .xwiki-livetable-pagination-text { + display: in-line; +} +.xwiki-livetable-pagination span.pagenumber { + color: #888; + cursor: pointer; +} +.xwiki-livetable-pagination span.pagenumber:hover { + color: #4d4d4d; + text-decoration: underlined; +} +.xwiki-livetable-pagination span.selected { + color: #4d4d4d; + font-weight: bold; +} +.xwiki-livetable-pagination span.pagenumber:focus { + outline: dotted 1px #000; +} +.pagination { + float: right; + margin-right: 10px; +} +.controlPagination { + position: relative; + width: 42px; + height: 22px; + overflow: hidden; + margin: 0 !important; + padding: 0 !important; + float: right; +} +.controlPagination span { + position: absolute; + top: 0; + left: 0; + line-height: 25px; + outline: none; + overflow: hidden; + border: none; +} +.controlPagination span.prevPagination, +.controlPagination span.noPrevPagination, +.controlPagination span.nextPagination, +.controlPagination span.noNextPagination { + background-image: url(/skin/resources/icons/xwiki/pagination-controls.png); + width: 21px; + height: 22px; +} +.controlPagination span.prevPagination:hover, +.controlPagination span.nextPagination:hover { + cursor: pointer; +} +.controlPagination span.prevPagination { + background-position: left top; +} +.controlPagination span.noPrevPagination { + background-position: left bottom; +} +.controlPagination span.nextPagination { + background-position: right top; + left: 21px; +} +.controlPagination span.noNextPagination { + background-position: right bottom; + left: 21px; +} +table.xwiki-livetable { + width: 100%; + margin: 0; +} +.xwiki-livetable td.xwiki-livetable-display-container { + margin: 0; + border-color: #fff; + padding: 0 0 0 4px; + width: auto; +} +.xwiki-livetable + td.xwiki-livetable-display-container + table.xwiki-livetable-display { + margin: 0; + border-collapse: collapse; + width: 100%; +} +.xwiki-livetable-display td { + border-color: #fff; + border-bottom-color: #ccc; +} +html > body .xwiki-livetable-display td { + border: 0; +} +table.xwiki-livetable + table.xwiki-livetable-display + thead.xwiki-livetable-display-header { + border-bottom: 5px solid #ddd; +} +thead.xwiki-livetable-display-header tr.xwiki-livetable-display-filters:hover, +thead.xwiki-livetable-display-header tr.rowHover. { + background-color: #fff; +} +thead.xwiki-livetable-display-header th.xwiki-livetable-display-header-text { + background-color: #ddd; + border: 0; + border-collapse: separate; + border-right: 1px solid #fff; + color: #4d4d4d; + padding: 3px 16px 3px 5px; + font-weight: normal; + text-align: left; + white-space: nowrap; +} +thead.xwiki-livetable-display-header th.sortable a { + color: #4d4d4d; + text-decoration: none; +} +thead.xwiki-livetable-display-header th.sortable { + cursor: pointer; +} +thead.xwiki-livetable-display-header th.desc { + background: #ddd url(/skin/resources/icons/silk/bullet_arrow_down.gif) + no-repeat scroll right center; +} +thead.xwiki-livetable-display-header th.asc { + background: #ddd url(/skin/resources/icons/silk/bullet_arrow_up.gif) no-repeat + scroll right center; +} +thead.xwiki-livetable-display-header th.selected { + color: #4d4d4d; + background-color: lemonChiffon; +} +thead.xwiki-livetable-display-header td.xwiki-livetable-display-header-filter { + padding: 1px; +} +html + > body + thead.xwiki-livetable-display-header + td.xwiki-livetable-display-header-filter { + padding: 2px 5px 2px 0; + border-color: transparent; +} +thead.xwiki-livetable-display-header + td.xwiki-livetable-display-header-filter + input, +thead.xwiki-livetable-display-header + td.xwiki-livetable-display-header-filter + select { + width: 100%; + border: 1px solid #ddd; + color: #888; + margin: 0; + padding: 0 0 0 2px; +} +tbody.xwiki-livetable-display-body tr { + border-bottom: 1px solid #ccc; +} +tbody.xwiki-livetable-display-body tr:hover, +tbody.xwiki-livetable-display-body tr.rowHover { + background-color: lemonChiffon; +} +tbody.xwiki-livetable-display-body tr.rowHover td { + border-left-color: lemonChiffon; + border-right-color: lemonChiffon; +} +tbody.xwiki-livetable-display-body td { + color: #4d4d4d; + padding: 3px 2px 3px 4px; + background-image: none; +} +tbody.xwiki-livetable-display-body a, +tbody.xwiki-livetable-display-body a:hover { + color: #00007e; +} +tbody.xwiki-livetable-display-body td.linkeditor, +tbody.xwiki-livetable-display-body td.editableCellHover.linkeditor a { + padding-right: 16px; + cursor: pointer; +} +tbody.xwiki-livetable-display-body td:hover.linkeditor { + background: lemonChiffon url(/skin/resources/pencil.gif) no-repeat scroll + right center; + cursor: pointer; +} +tbody.xwiki-livetable-display-body td.linkeditor a.editableCellHover { + display: block; + background: lemonChiffon url(/skin/resources/pencil.gif) no-repeat scroll + right center; + cursor: pointer; + color: #4d4d4d; + padding-right: 16px; +} +tbody.xwiki-livetable-display-body td.linkeditor a { + color: #4d4d4d; + text-decoration: none; +} +tbody.xwiki-livetable-display-body td:hover.typenumeric, +tbody.xwiki-livetable-display-body td.editableCellHover.typenumeric, +tbody.xwiki-livetable-display-body td.typenumeric { + text-align: right; +} +tbody.xwiki-livetable-display-body td:hover.typenone, +tbody.xwiki-livetable-display-body td.editableCellHover.typenone, +tbody.xwiki-livetable-display-body td.typenone { + text-align: center; + padding-left: 0; +} +tbody.xwiki-livetable-display-body td a.action { + color: #888; + padding-left: 20px; + background-repeat: no-repeat; + margin-right: 5px; + padding-bottom: 1px; +} +tbody.xwiki-livetable-display-body td a.action:hover { + text-decoration: underline; +} +tbody.xwiki-livetable-display-body td a.actioncopy { + background-image: url(/skin/resources/icons/silk/page_white_copy.gif); +} +tbody.xwiki-livetable-display-body td a.actionrename { + background-image: url(/skin/resources/icons/silk/textfield_rename.gif); +} +tbody.xwiki-livetable-display-body td a.actiondelete { + background-image: url(/skin/resources/icons/silk/cross.gif); +} +tbody.xwiki-livetable-display-body td a.actionrights { + background-image: url(/skin/resources/icons/silk/lock_edit.gif); +} +tbody.xwiki-livetable-display-body td a.actionedit { + background-image: url(/skin/resources/icons/silk/page_white_edit.gif); +} +div.dialog-loading { + border: 1px solid #aaa; +} +div.dialog-loading tr.dialogTop td.dialogTopCenter div.Caption { + background-color: #ddd; +} +div.dialog-loading + tr.dialogMiddle + td.dialogMiddleCenter + div.gwt-ModalDialog-Content { + padding: 20px; +} +div.xwikigwt-editfield { + background-color: #fff; + border: 1px solid #aaa; +} +div.xwikigwt-editfield-main { + padding: 20px; +} +div.xwikigwt-editfield tr.dialogTop td.dialogTopCenter div.Caption { + background-color: #ddd; + color: #4d4d4d; + padding: 9px 4px 4px; +} +div.xwikigwt-editfield + tr.dialogMiddle + td.dialogMiddleCenter + div.xwikigwt-editfield-actions { + margin-top: 10px; + width: 75%; +} +div.xwikigwt-editfield + tr.dialogMiddle + td.dialogMiddleCenter + div.xwikigwt-editfield-actions + .xwikigwt-cancel { + background-color: #fff; + color: #00007e; + padding: 0; + border: 0; + float: right; +} +div.xwikigwt-editfield + tr.dialogMiddle + td.dialogMiddleCenter + div.xwikigwt-editfield-actions + .xwikigwt-next { + background-color: #ddd; + color: #000; +} +.xwiki-livetable-tagcloud-container { + border: 1px solid #ddd; + border-bottom: 5px solid #ddd; + background-color: transparent; + padding: 10px; + position: relative; + margin-top: 10px; +} +.xwiki-livetable-tagcloud-container h2 { + background: url(/skin/resources/icons/silk/tag_yellow.gif) no-repeat; + font-size: 1em; + color: #888; + padding-left: 25px; +} +.xwiki-livetable-tagcloud-container h2 span { + color: #888; + font-size: 0.8em; + font-weight: normal; + line-height: 2em; + margin: 0 0 10px; + border: none; +} +.xwiki-livetable-tagcloud-container div.clearfloats { + background-color: transparent; + margin: 0; + overflow: hidden; +} +div.xwiki-livetable-tagcloud ol.tagCloud { + margin: 0; +} +div.xwiki-livetable-tagcloud ol.tagCloud li span { + color: #ddd; + padding: 0 3px 0 3px; + border: 1px solid #fff; +} +div.xwiki-livetable-tagcloud ol.tagCloud li.selectable span { + cursor: pointer; + color: #4d4d4d; +} +div.xwiki-livetable-tagcloud ol.tagCloud li.selected span { + background-color: lemonChiffon; + border-bottom: 1px solid #ddd; + border-top: 1px solid #ddd; +} +.xwiki-livetable-tagcloud-tip .tippointer { + position: relative; + width: 0; + height: 0; + top: -3px !important; + left: 45px; + border-top: 20px solid #ddd; + border-right: 20px dotted transparent; + border-left: 20px dotted transparent; + border-bottom: 0 none; +} +.xwiki-livetable-tagcloud-tip .tippointer div { + position: absolute; + width: 0; + height: 0; + top: -20px; + left: -15px; + border-top: 15px solid #ddd; + border-right: 15px dotted transparent; + border-left: 15px dotted transparent; + border-bottom: 0 none; +} +div.xwiki-livetable-pagination-content { + background: url(/skin/resources/icons/silk/page_white_copy.gif) no-repeat; + padding-left: 20px; + padding-bottom: 2px; + display: inline; +} +div.xwiki-livetable-pagination-content span.pagenumber { + display: inline; + color: #888; + cursor: pointer; +} +div.xwiki-livetable-pagination-content span.pagenumber:hover { + color: #4d4d4d; + text-decoration: underlined; +} +div.xwiki-livetable-pagination-content span.selected { + color: #4d4d4d; + font-weight: bold; +} +div.xwiki-livetable-pagination-content span.pagenumber:focus { + outline: dotted 1px #000; +} +.display { + border-collapse: collapse; + border: 1px solid #e8e8e8; + width: 100%; +} +.display td { + border: 1px solid #e8e8e8; + padding: 3px; +} +.icon-manage { + cursor: pointer; + padding-right: 10px; +} +.icon-manageg { + padding-right: 10px; +} +#ajax-loader { + margin: 0; + padding: 0; + position: absolute; + top: 50%; + left: 35%; + z-index: 1000000000; + display: none; + width: 220px; + background-color: #fff; + border: 1px solid #999; + font-size: 11px; + padding: 8px; + text-indent: 5px; +} +.theader { + background-color: #ccc; + color: #fff; + font-weight: bold; + font-size: 1em; +} +#table-filters { + background-color: #efefef; +} +.filter { + width: 70%; +} +.theader td { + padding: 3px 0 3px 10px; +} +table.livetable { + width: 100%; + position: relative; + border: 5px solid #fff; + margin: 0; + left: 0; +} diff --git a/src/main/webapp/resources/js/xwiki/table/livetable.js b/src/main/webapp/resources/js/xwiki/table/livetable.js index 727c61e53..963604a0f 100644 --- a/src/main/webapp/resources/js/xwiki/table/livetable.js +++ b/src/main/webapp/resources/js/xwiki/table/livetable.js @@ -1,1141 +1,1148 @@ (function(){ + let translations = {}; + if (window.celExecOnceAfterMessagesLoaded) { + window.celExecOnceAfterMessagesLoaded( + celMessages => translations = celMessages.livetable); + } else { + console.warn('celExecOnceAfterMessagesLoaded not available!'); + } -/** - * XWiki namespace - */ -if (typeof XWiki == "undefined") { - XWiki = new Object(); -} - -/** - * widgets namespace - */ -if (typeof XWiki.widgets == "undefined") { - XWiki.widgets = new Object(); -} - -/** - * The class representing an AJAX-populated live table. - * It is (almost) independent of the underlying HTML markup, a function passed as an argument being - * responsible with displaying the content corresponding to a row. Uses JSON for the response - * encoding. - */ -XWiki.widgets.LiveTable = Class.create({ /** - * @param url The base address for requesting the table data. - * @param domNodeName The node supposed to hold the data rows, should be a . DOM element or - * identifier. - * @param handler A javascript function called for displaying fetched rows. The function - * accepts a JSON-parsed object and returns a DOM node - * @param options An object with options for the live table. Supported options: - *
    - *
  • "limit" the maximum number of row entries in the table
  • - *
  • "maxPages" the maximum number of pages to display at the same time in the pagination section.
  • - *
- * @todo Make this a valid ARIA table: http://www.w3.org/TR/aria-role/#structural + * XWiki namespace + */ + if (typeof XWiki == "undefined") { + XWiki = new Object(); + } + + /** + * widgets namespace + */ + if (typeof XWiki.widgets == "undefined") { + XWiki.widgets = new Object(); + } + + /** + * The class representing an AJAX-populated live table. + * It is (almost) independent of the underlying HTML markup, a function passed as an argument being + * responsible with displaying the content corresponding to a row. Uses JSON for the response + * encoding. */ - initialize: function(url, domNodeName, handler, options) - { - if (!options) { - var options = {}; - } - - // id of the root element that encloses this livetable - this.domNodeName = domNodeName; - - // Remove, if present, the message that indicates the table cannot execute. - // (It can since we are executing JavaScript). - if ($(this.domNodeName).down('tr.xwiki-livetable-initial-message')) { - $(this.domNodeName).down('tr.xwiki-livetable-initial-message').remove(); - } - - // id of the display element (the inner dynamic table) of this livetable - // defined by convention as the root node id on which is appended "-display". - // fallback on the unique "display1" id for backward compatibility. - this.displayNode = $(domNodeName + "-display") || $('display1'); - - // Nodes under which all forms controls (input, selects, etc.) will be filters for this table - this.filtersNodes = [ - options.filterNodes // Option API to precise filter nodes (single node or array of nodes) - || $(options.filtersNode) // Deprecated option (kept for backward compatibility) - || $(domNodeName).down(".xwiki-livetable-display-filters") // Default filter node when none precised - ].flatten().compact(); - - // Array of nodes under which pagination for this livetable will be displayed. - this.paginationNodes = options.paginationNodes || $(this.domNodeName).select(".xwiki-livetable-pagination"); - - // Array of nodes under which a page size control will be displayed - this.pageSizeNodes = options.pageSizeNodes || $(this.domNodeName).select(".xwiki-livetable-pagesize"); - - if (typeof options == "undefined") { - options = {}; - } + XWiki.widgets.LiveTable = Class.create({ + /** + * @param url The base address for requesting the table data. + * @param domNodeName The node supposed to hold the data rows, should be a . DOM element or + * identifier. + * @param handler A javascript function called for displaying fetched rows. The function + * accepts a JSON-parsed object and returns a DOM node + * @param options An object with options for the live table. Supported options: + *
    + *
  • "limit" the maximum number of row entries in the table
  • + *
  • "maxPages" the maximum number of pages to display at the same time in the pagination section.
  • + *
+ * @todo Make this a valid ARIA table: http://www.w3.org/TR/aria-role/#structural + */ + initialize: function(url, domNodeName, handler, options) + { + if (!options) { + var options = {}; + } + + // id of the root element that encloses this livetable + this.domNodeName = domNodeName; + + // Remove, if present, the message that indicates the table cannot execute. + // (It can since we are executing JavaScript). + if ($(this.domNodeName).down('tr.xwiki-livetable-initial-message')) { + $(this.domNodeName).down('tr.xwiki-livetable-initial-message').remove(); + } + + // id of the display element (the inner dynamic table) of this livetable + // defined by convention as the root node id on which is appended "-display". + // fallback on the unique "display1" id for backward compatibility. + this.displayNode = $(domNodeName + "-display") || $('display1'); + + // Nodes under which all forms controls (input, selects, etc.) will be filters for this table + this.filtersNodes = [ + options.filterNodes // Option API to precise filter nodes (single node or array of nodes) + || $(options.filtersNode) // Deprecated option (kept for backward compatibility) + || $(domNodeName).down(".xwiki-livetable-display-filters") // Default filter node when none precised + ].flatten().compact(); + + // Array of nodes under which pagination for this livetable will be displayed. + this.paginationNodes = options.paginationNodes || $(this.domNodeName).select(".xwiki-livetable-pagination"); + + // Array of nodes under which a page size control will be displayed + this.pageSizeNodes = options.pageSizeNodes || $(this.domNodeName).select(".xwiki-livetable-pagesize"); + + if (typeof options == "undefined") { + options = {}; + } - this.action = options.action || "view"; // FIXME check if this can be removed safely. + this.action = options.action || "view"; // FIXME check if this can be removed safely. - // Initialize table params that are used for permalinks - this.limit = options.limit || 10; - this.lastOffset = 1; - $(this.domNodeName).select('th.sortable').each(function(el) { - if (el.hasClassName('selected')) { - this.selectedColumn = el; - } - },this); + // Initialize table params that are used for permalinks + this.limit = options.limit || 10; + this.lastOffset = 1; + $(this.domNodeName).select('th.sortable').each(function(el) { + if (el.hasClassName('selected')) { + this.selectedColumn = el; + } + },this); - // Initialize the throttling delay, that is the delay a user can type a second filter key after a first one without - // sending an AJAX request to the server. - this.throttlingDelay = options.throttlingDelay || 0.5; + // Initialize the throttling delay, that is the delay a user can type a second filter key after a first one without + // sending an AJAX request to the server. + this.throttlingDelay = options.throttlingDelay || 0.5; - // If permalinks is enable, load initial hash, using the URL hash if available or the default above - this.permalinks = new LiveTableHash(this,(typeof options.permalinks == "undefined" || options.permalinks)); + // If permalinks is enable, load initial hash, using the URL hash if available or the default above + this.permalinks = new LiveTableHash(this,(typeof options.permalinks == "undefined" || options.permalinks)); - // Get params from permalinks - this.limit = this.permalinks.getLimit(); - var initialPage = this.permalinks.getPage(); + // Get params from permalinks + this.limit = this.permalinks.getLimit(); + var initialPage = this.permalinks.getPage(); - // Initialize page size control bounds - if (typeof this.pageSizeNodes != "undefined") { - this.pageSizer = new LiveTablePageSizer(this, this.pageSizeNodes, options.pageSizeBounds, this.limit); - } + // Initialize page size control bounds + if (typeof this.pageSizeNodes != "undefined") { + this.pageSizer = new LiveTablePageSizer(this, this.pageSizeNodes, options.pageSizeBounds, this.limit); + } - // Initialize pagination - if (typeof this.paginationNodes != "undefined") { - this.paginator = new LiveTablePagination(this, this.paginationNodes, options.maxPages || 10); - } + // Initialize pagination + if (typeof this.paginationNodes != "undefined") { + this.paginator = new LiveTablePagination(this, this.paginationNodes, options.maxPages || 10); + } - // Initialize filters - if (this.filtersNodes.length > 0) { - this.filter = new LiveTableFilter(this, this.filtersNodes, this.permalinks.getFilters(), { - throttlingDelay: this.throttlingDelay - }); - } + // Initialize filters + if (this.filtersNodes.length > 0) { + this.filter = new LiveTableFilter(this, this.filtersNodes, this.permalinks.getFilters(), { + throttlingDelay: this.throttlingDelay + }); + } - if ($(domNodeName + "-tagcloud")) - { - this.tagCloud = new LiveTableTagCloud(this, domNodeName + "-tagcloud"); - } - this.loadingStatus = $(this.domNodeName + '-ajax-loader') || $('ajax-loader'); - this.limitsDisplay = $(this.domNodeName + '-limits') || new Element("div"); - this.filters = ""; - this.handler = handler || function(){}; - this.totalRows = -1; - this.fetchedRows = new Array(); - this.getUrl = url; - this.sendReqNo = 0; - this.recvReqNo = 0; - - // Initialize sort column and observe sort events - this.observeSortableColumns(this.permalinks.getSortColumn(), this.permalinks.getSortDirection()); - - this.currentOffset = (initialPage - 1) * this.limit + 1; - - // Show initial rows - this.showRows(this.currentOffset, this.limit); - }, + if ($(domNodeName + "-tagcloud")) + { + this.tagCloud = new LiveTableTagCloud(this, domNodeName + "-tagcloud"); + } + this.loadingStatus = $(this.domNodeName + '-ajax-loader') || $('ajax-loader'); + this.limitsDisplay = $(this.domNodeName + '-limits') || new Element("div"); + this.filters = ""; + this.handler = handler || function(){}; + this.totalRows = -1; + this.fetchedRows = new Array(); + this.getUrl = url; + this.sendReqNo = 0; + this.recvReqNo = 0; + + // Initialize sort column and observe sort events + this.observeSortableColumns(this.permalinks.getSortColumn(), this.permalinks.getSortDirection()); - /** - * Set the page size of the table and refresh the display - * @param pageSize The new maximum number of rows to display per page - **/ - setPageSize: function(pageSize) - { - this.limit = pageSize; - this.showRows(1, this.limit); - }, + this.currentOffset = (initialPage - 1) * this.limit + 1; - /** - * Initializes an AJAX request for retrieving some table data. Uses two ranges, one defines the - * range that must be retrieved from the server, and one defines the range that should be - * displayed. Two ranges are needed as some of the displayed rows can already be available from - * a previous request. - * @param reqOffset Starting request offset; the index of the first row that should be retrieved. - * @param reqLimit Maximum number of rows to retrieve. - * @param displayOffset Starting display offset; the index of the first row that should be displayed. - * @param displayLimit Maximum number of rows to display. - * @param delay An possible delay before firing the request to allow that request to be cancelled (used - * for submission throttling on filters) - */ - getRows: function(reqOffset, reqLimit, displayOffset, displayLimit, delay) - { - var self = this; - - if (this.nextRequestTimeoutId) { - // If a request was queued previously, cancel it - window.clearTimeout(this.nextRequestTimeoutId); - delete this.nextRequestTimeoutId; - } + // Show initial rows + this.showRows(this.currentOffset, this.limit); + }, + + /** + * Set the page size of the table and refresh the display + * @param pageSize The new maximum number of rows to display per page + **/ + setPageSize: function(pageSize) + { + this.limit = pageSize; + this.showRows(1, this.limit); + }, - var doRequest = function(){ + /** + * Initializes an AJAX request for retrieving some table data. Uses two ranges, one defines the + * range that must be retrieved from the server, and one defines the range that should be + * displayed. Two ranges are needed as some of the displayed rows can already be available from + * a previous request. + * @param reqOffset Starting request offset; the index of the first row that should be retrieved. + * @param reqLimit Maximum number of rows to retrieve. + * @param displayOffset Starting display offset; the index of the first row that should be displayed. + * @param displayLimit Maximum number of rows to display. + * @param delay An possible delay before firing the request to allow that request to be cancelled (used + * for submission throttling on filters) + */ + getRows: function(reqOffset, reqLimit, displayOffset, displayLimit, delay) + { + var self = this; - var url = self.getUrl + '&offset='+reqOffset+'&limit='+reqLimit+'&reqNo='+ (++self.sendReqNo); - if (self.filter) { - self.filters = self.filter.serializeFilters(); - if (self.filters != undefined && self.filters != "") { - url += self.filters; - } - } - if (typeof self.tags != "undefined" && self.tags.length > 0) { - self.tags.each(function(tag) { - url += ("&tag=" + encodeURIComponent(tag.unescapeHTML())); - }); + if (this.nextRequestTimeoutId) { + // If a request was queued previously, cancel it + window.clearTimeout(this.nextRequestTimeoutId); + delete this.nextRequestTimeoutId; } - url += self.getSortURLFragment(); - self.loadingStatus.removeClassName("hidden"); + var doRequest = function(){ - // Let code know the table is about to load new entries. - // 1. Named event (for code interested by that table only) - document.fire("xwiki:livetable:" + this.domNodeName + ":loadingEntries"); - // 2. Generic event (for code potentially interested in any livetable) - document.fire("xwiki:livetable:loadingEntries", { - "tableId" : this.domNodeName - }); - - var ajx = new Ajax.Request(url, - { - method: 'get', - onComplete: function( transport ) { - // Let code know loading is finished - // 1. Named event (for code interested by that table only) - document.fire("xwiki:livetable:" + self.domNodeName + ":loadingComplete", { - "status" : transport.status - }); - // 2. Generic event (for code potentially interested in any livetable) - document.fire("xwiki:livetable:loadingComplete", { - "status" : transport.status, - "tableId" : self.domNodeName + var url = self.getUrl + '&offset='+reqOffset+'&limit='+reqLimit+'&reqNo='+ (++self.sendReqNo); + if (self.filter) { + self.filters = self.filter.serializeFilters(); + if (self.filters != undefined && self.filters != "") { + url += self.filters; + } + } + if (typeof self.tags != "undefined" && self.tags.length > 0) { + self.tags.each(function(tag) { + url += ("&tag=" + encodeURIComponent(tag.unescapeHTML())); }); + } + url += self.getSortURLFragment(); - self.loadingStatus.addClassName("hidden"); - }, - onSuccess: function( transport ) { - var res = eval( '(' + transport.responseText + ')'); + self.loadingStatus.removeClassName("hidden"); - if (res.reqNo < self.sendReqNo) { - return; - } + // Let code know the table is about to load new entries. + // 1. Named event (for code interested by that table only) + document.fire("xwiki:livetable:" + this.domNodeName + ":loadingEntries"); + // 2. Generic event (for code potentially interested in any livetable) + document.fire("xwiki:livetable:loadingEntries", { + "tableId" : this.domNodeName + }); - self.recvReqNo = res.reqNo; - self.loadingStatus.addClassName("hidden"); + var ajx = new Ajax.Request(url, + { + method: 'get', + onComplete: function( transport ) { + // Let code know loading is finished + // 1. Named event (for code interested by that table only) + document.fire("xwiki:livetable:" + self.domNodeName + ":loadingComplete", { + "status" : transport.status + }); + // 2. Generic event (for code potentially interested in any livetable) + document.fire("xwiki:livetable:loadingComplete", { + "status" : transport.status, + "tableId" : self.domNodeName + }); - if (self.tagCloud && res.matchingtags) { - self.tagCloud.updateTagCloud(res.tags, res.matchingtags); - } + self.loadingStatus.addClassName("hidden"); + }, + onSuccess: function( transport ) { + var res = eval( '(' + transport.responseText + ')'); - // Let code know new entries arrived - // 1. Named event (for code interested by that table only) - document.fire("xwiki:livetable:" + this.domNodeName + ":receivedEntries", { - "data" : res - }); - // 2. Generic event (for code potentially interested in any livetable) - document.fire("xwiki:livetable:receivedEntries", { - "data" : res, - "tableId" : self.domNodeName - }); + if (res.reqNo < self.sendReqNo) { + return; + } - self.updateFetchedRows(res); - self.displayRows(displayOffset, displayLimit); - } - }); + self.recvReqNo = res.reqNo; + self.loadingStatus.addClassName("hidden"); - } + if (self.tagCloud && res.matchingtags) { + self.tagCloud.updateTagCloud(res.tags, res.matchingtags); + } - if (typeof delay != 'undefined' && delay > 0) { - // fire the request after a withdrawal period in which it can be cancelled - this.nextRequestTimeoutId = Function.delay.call(doRequest, delay); - } - else { - // no withdrawal period - doRequest(); - } - }, + // Let code know new entries arrived + // 1. Named event (for code interested by that table only) + document.fire("xwiki:livetable:" + this.domNodeName + ":receivedEntries", { + "data" : res + }); + // 2. Generic event (for code potentially interested in any livetable) + document.fire("xwiki:livetable:receivedEntries", { + "data" : res, + "tableId" : self.domNodeName + }); - /** - * Add/refresh items to the cache of fetched data. - * @param json Returned data from the server, as a parsed JSON object. - */ - updateFetchedRows: function(json) - { - this.json = json; - this.totalRows = json.totalrows; - for (var i = json.offset; i < json.offset + json.returnedrows; ++i) { - this.fetchedRows[i] = json.rows[i-json.offset]; - } - }, + self.updateFetchedRows(res); + self.displayRows(displayOffset, displayLimit); + } + }); - /** - * Removes the displayed rows from the XHTML document. - */ - clearDisplay: function() - { - var object = this.displayNode; - while (object.hasChildNodes()) { - object.removeChild(object.firstChild); - } - }, + } - /** - * Displays already fetched rows. Calls {@link #handler} for creating the XHTML elements, and - * inserts them in {@link domNode}. - * @param offset Starting offset; the index of the first row that should be displayed. - * @param limit Maximum number of rows to display. - */ - displayRows: function(offset, limit) - { - var f = offset + limit - 1; - if (f > this.totalRows) f = this.totalRows; - var off = (this.totalRows > 0) ? offset : 0; - var msg = "" + off + " - " + f + " $msg.get('xe.pagination.results.of') " + this.totalRows + ""; - msg = msg.toLowerCase(); - - this.limitsDisplay.innerHTML = "$msg.get('xe.pagination.results') " + msg; - this.clearDisplay(); - - for (var i = off; i <= f; i++) { - if (this.fetchedRows[i]) { - var elem = this.handler(this.fetchedRows[i], i, this); - this.displayNode.appendChild(elem); - var memo = { - "data": this.fetchedRows[i], - "row":elem, - "table":this, - "tableId":this.domNodeName - }; - // 1. Named event (for code interested by that table only) - document.fire("xwiki:livetable:" + this.domNodeName + ":newrow", memo); - // 2. Generic event (for code potentially interested in any livetable) - document.fire("xwiki:livetable:newrow", memo); + if (typeof delay != 'undefined' && delay > 0) { + // fire the request after a withdrawal period in which it can be cancelled + this.nextRequestTimeoutId = Function.delay.call(doRequest, delay); } - } - if (this.paginator) this.paginator.refreshPagination(); - - // Let code know displaying is finished - // 1. Named event (for code interested by that table only) - document.fire("xwiki:livetable:" + this.domNodeName + ":displayComplete") - // 2. Generic event (for code potentially interested in any livetable) - document.fire("xwiki:livetable:displayComplete", { - "tableId" : this.domNodeName - }); - }, + else { + // no withdrawal period + doRequest(); + } + }, - /** - * Fetch and display rows. This method checks the existing fetched data to determine which (if - * any) rows should be fetched from the server, then forwards the call to {@link #displayRows}. - * @param offset Starting offset; the index of the first row that should be displayed. - * @param limit Maximum number of rows to display. - * @param in case we need to fetch rows, an optional delay before the rows are actually fetched - * against the server (allows submission throttling) - */ - showRows: function(offset, limit, delay) - { - this.lastOffset = offset; + /** + * Add/refresh items to the cache of fetched data. + * @param json Returned data from the server, as a parsed JSON object. + */ + updateFetchedRows: function(json) + { + this.json = json; + this.totalRows = json.totalrows; + for (var i = json.offset; i < json.offset + json.returnedrows; ++i) { + this.fetchedRows[i] = json.rows[i-json.offset]; + } + }, + + /** + * Removes the displayed rows from the XHTML document. + */ + clearDisplay: function() + { + var object = this.displayNode; + while (object.hasChildNodes()) { + object.removeChild(object.firstChild); + } + }, - // Update permalinks - this.permalinks.update(); + /** + * Displays already fetched rows. Calls {@link #handler} for creating the XHTML elements, and + * inserts them in {@link domNode}. + * @param offset Starting offset; the index of the first row that should be displayed. + * @param limit Maximum number of rows to display. + */ + displayRows: function(offset, limit) + { + var f = offset + limit - 1; + if (f > this.totalRows) f = this.totalRows; + var off = (this.totalRows > 0) ? offset : 0; + var msg = "" + off + " - " + f + " " + translations.resultsOf + " " + this.totalRows + ""; + msg = msg.toLowerCase(); + + this.limitsDisplay.innerHTML = translations.results + " " + msg; + this.clearDisplay(); + + for (var i = off; i <= f; i++) { + if (this.fetchedRows[i]) { + var elem = this.handler(this.fetchedRows[i], i, this); + this.displayNode.appendChild(elem); + var memo = { + "data": this.fetchedRows[i], + "row":elem, + "table":this, + "tableId":this.domNodeName + }; + // 1. Named event (for code interested by that table only) + document.fire("xwiki:livetable:" + this.domNodeName + ":newrow", memo); + // 2. Generic event (for code potentially interested in any livetable) + document.fire("xwiki:livetable:newrow", memo); + } + } + if (this.paginator) this.paginator.refreshPagination(); - // This is some debugging string. - var buff = 'request to display rows '+offset+' to '+(offset+limit)+'
\n'; + // Let code know displaying is finished + // 1. Named event (for code interested by that table only) + document.fire("xwiki:livetable:" + this.domNodeName + ":displayComplete") + // 2. Generic event (for code potentially interested in any livetable) + document.fire("xwiki:livetable:displayComplete", { + "tableId" : this.domNodeName + }); + }, - // If no rows fetched yet, get all we need - if (this.totalRows == -1) { - this.getRows(offset, limit, offset, limit, delay); - buff += 'table is empty so we get all rows'; - return buff; - } + /** + * Fetch and display rows. This method checks the existing fetched data to determine which (if + * any) rows should be fetched from the server, then forwards the call to {@link #displayRows}. + * @param offset Starting offset; the index of the first row that should be displayed. + * @param limit Maximum number of rows to display. + * @param in case we need to fetch rows, an optional delay before the rows are actually fetched + * against the server (allows submission throttling) + */ + showRows: function(offset, limit, delay) + { + this.lastOffset = offset; + + // Update permalinks + this.permalinks.update(); + + // This is some debugging string. + var buff = 'request to display rows '+offset+' to '+(offset+limit)+'
\n'; - // Make a range of required rows - var min = -1; - var max = -1; + // If no rows fetched yet, get all we need + if (this.totalRows == -1) { + this.getRows(offset, limit, offset, limit, delay); + buff += 'table is empty so we get all rows'; + return buff; + } + + // Make a range of required rows + var min = -1; + var max = -1; - for (var i = offset; i < (offset + limit); ++i) { - if (this.fetchedRows[i] == undefined) { - if (min == -1) { - min = i; + for (var i = offset; i < (offset + limit); ++i) { + if (this.fetchedRows[i] == undefined) { + if (min == -1) { + min = i; + } + max = i; } - max = i; } - } - // If we don't need any new row - if (min == -1) { - buff += 'no need to get new rows
\n'; - this.displayRows(offset, limit); - } else { - // We need to get new rows - buff += 'we need to get rows '+min+' to '+ (max+1) +'
\n'; - this.getRows(min, max - min + 1, offset, limit); - } - - if(this.paginator) this.paginator.refreshPagination(); + // If we don't need any new row + if (min == -1) { + buff += 'no need to get new rows
\n'; + this.displayRows(offset, limit); + } else { + // We need to get new rows + buff += 'we need to get rows '+min+' to '+ (max+1) +'
\n'; + this.getRows(min, max - min + 1, offset, limit); + } + + if(this.paginator) this.paginator.refreshPagination(); - return buff; - }, + return buff; + }, - /** - * Delete a row from the fetch cache, shifting the remaining rows accordingly. - */ - deleteAndShiftRows: function(indx) - { - for(var i in this.fetchedRows) { - if(i >= indx) - this.fetchedRows[i] = this.fetchedRows[''+(parseInt(i)+1)]; - } - }, + /** + * Delete a row from the fetch cache, shifting the remaining rows accordingly. + */ + deleteAndShiftRows: function(indx) + { + for(var i in this.fetchedRows) { + if(i >= indx) + this.fetchedRows[i] = this.fetchedRows[''+(parseInt(i)+1)]; + } + }, - /** - * Debug method. Dumps the content of the fetch cache (row indexes only). - */ - debugFetchedRows: function() { - var buf = ''; - for (var i in this.fetchedRows) { - if (this.fetchedRows[i] != undefined) { - buf += i+' '; + /** + * Debug method. Dumps the content of the fetch cache (row indexes only). + */ + debugFetchedRows: function() { + var buf = ''; + for (var i in this.fetchedRows) { + if (this.fetchedRows[i] != undefined) { + buf += i+' '; + } } - } - return buf; - }, + return buf; + }, - /** - * Delete a row and redisplay the table. - * @param indx The index of the row that must be deleted. - */ - deleteRow: function(indx) { - this.deleteAndShiftRows(indx); + /** + * Delete a row and redisplay the table. + * @param indx The index of the row that must be deleted. + */ + deleteRow: function(indx) { + this.deleteAndShiftRows(indx); + + // Compute new refresh offset + var newoffset = this.lastOffset; + if(indx > this.totalRows - this.limit - 1) { + newoffset -= 1; + } + if(newoffset <= 0) { + newoffset = 1; + } + this.totalRows -= 1; + if(this.totalRows < this.limit) { + this.showRows(newoffset, this.totalRows); + } + else { + this.showRows(newoffset, this.limit); + } + + if (this.paginator) this.paginator.refreshPagination(); - // Compute new refresh offset - var newoffset = this.lastOffset; - if(indx > this.totalRows - this.limit - 1) { - newoffset -= 1; - } - if(newoffset <= 0) { - newoffset = 1; - } - this.totalRows -= 1; - if(this.totalRows < this.limit) { - this.showRows(newoffset, this.totalRows); - } - else { - this.showRows(newoffset, this.limit); - } - - if (this.paginator) this.paginator.refreshPagination(); - - // Let code know displaying is finished - // 1. Named event (for code interested by that table only) - document.fire("xwiki:livetable:" + this.domNodeName + ":displayComplete") - // 2. Generic event (for code potentially interested in any livetable) - document.fire("xwiki:livetable:displayComplete", { - "tableId" : this.domNodeName - }); - }, + // Let code know displaying is finished + // 1. Named event (for code interested by that table only) + document.fire("xwiki:livetable:" + this.domNodeName + ":displayComplete") + // 2. Generic event (for code potentially interested in any livetable) + document.fire("xwiki:livetable:displayComplete", { + "tableId" : this.domNodeName + }); + }, - /** - * Return the URL fragment with sort parameters depending on the state of the table. - */ - getSortURLFragment:function() - { - var column = this.getSortColumn(); - var fragment = ""; - if( column != null ) { - fragment += "&sort=" + column; - var direction = this.getSortDirection(); - if( direction != null ) { - return fragment += "&dir=" + direction; + /** + * Return the URL fragment with sort parameters depending on the state of the table. + */ + getSortURLFragment:function() + { + var column = this.getSortColumn(); + var fragment = ""; + if( column != null ) { + fragment += "&sort=" + column; + var direction = this.getSortDirection(); + if( direction != null ) { + return fragment += "&dir=" + direction; + } } - } - return fragment; - }, + return fragment; + }, - /** - * Return the name of the current sorted column, null if no sortable column is selected - */ - getSortColumn: function() - { - if (!this.selectedColumn) { - return null; - } - var a = this.selectedColumn.down("a"); - if (!a) { - return null; - } - return a.getAttribute('rel'); - }, + /** + * Return the name of the current sorted column, null if no sortable column is selected + */ + getSortColumn: function() + { + if (!this.selectedColumn) { + return null; + } + var a = this.selectedColumn.down("a"); + if (!a) { + return null; + } + return a.getAttribute('rel'); + }, - /** - * Return the sorting direction of the current sorted column, null if no sortable column is selected - */ - getSortDirection: function() - { - if (!this.selectedColumn) { - return null; - } - return (this.selectedColumn.hasClassName('desc') ? 'desc' : 'asc'); - }, + /** + * Return the sorting direction of the current sorted column, null if no sortable column is selected + */ + getSortDirection: function() + { + if (!this.selectedColumn) { + return null; + } + return (this.selectedColumn.hasClassName('desc') ? 'desc' : 'asc'); + }, - /** - * Remove all the fetched data from the cache. - */ - clearCache: function() - { - this.fetchedRows.clear(); - this.totalRows = -1; - }, + /** + * Remove all the fetched data from the cache. + */ + clearCache: function() + { + this.fetchedRows.clear(); + this.totalRows = -1; + }, - /** - * Iterate over the column headers that have the sortable class to observe sort changes when user clicks the column header. - * - * @param column the sort column to select initially - * @param direction the sort direction for the sort column selected - */ - observeSortableColumns: function(column, direction) - { - var self = this; - $(this.domNodeName).select('th.sortable').each(function(el) { - var colname = el.down("a") ? el.down("a").getAttribute("rel") : null; - if (colname == column) { - self.selectedColumn = el; - el.addClassName('selected'); - if (direction == "asc") { - if (el.hasClassName('desc')) { - el.removeClassName('desc'); + /** + * Iterate over the column headers that have the sortable class to observe sort changes when user clicks the column header. + * + * @param column the sort column to select initially + * @param direction the sort direction for the sort column selected + */ + observeSortableColumns: function(column, direction) + { + var self = this; + $(this.domNodeName).select('th.sortable').each(function(el) { + var colname = el.down("a") ? el.down("a").getAttribute("rel") : null; + if (colname == column) { + self.selectedColumn = el; + el.addClassName('selected'); + if (direction == "asc") { + if (el.hasClassName('desc')) { + el.removeClassName('desc'); + } + el.addClassName("asc") + } else { + if (el.hasClassName('asc')) { + el.removeClassName('asc'); + } + el.addClassName("desc") } - el.addClassName("asc") } else { - if (el.hasClassName('asc')) { - el.removeClassName('asc'); + if (el.hasClassName('selected')) { + el.removeClassName('selected'); + } + if (!el.hasClassName('desc') && !el.hasClassName('asc')) { // no order set in the HTML. Force desc + el.addClassName('desc'); } - el.addClassName("desc") - } - } else { - if (el.hasClassName('selected')) { - el.removeClassName('selected'); - } - if (!el.hasClassName('desc') && !el.hasClassName('asc')) { // no order set in the HTML. Force desc - el.addClassName('desc'); } - } - Event.observe(el, "click", function(event) { - var elem = event.element(); - if (!elem.hasClassName('sortable')) { - elem = elem.up('th.sortable'); - } - if (elem == null) { - // This should never happen in real life, but better safe than sorry... - return; - } - if (elem.hasClassName("selected")) { // Sort column already selected. Change direction - var direction = elem.hasClassName("asc") ? "asc" : "desc"; - var newDirection = direction == "asc" ? "desc" : "asc"; - elem.removeClassName(direction); - elem.addClassName(newDirection); - } - else { // sort column was not selected, do not change direction, just column - if (self.selectedColumn){ - self.selectedColumn.removeClassName("selected"); - } - elem.addClassName("selected"); - self.selectedColumn = elem; - } - self.clearCache(); //reset - self.showRows(1, self.limit); - }); - }); - } -}); + Event.observe(el, "click", function(event) { + var elem = event.element(); + if (!elem.hasClassName('sortable')) { + elem = elem.up('th.sortable'); + } + if (elem == null) { + // This should never happen in real life, but better safe than sorry... + return; + } + if (elem.hasClassName("selected")) { // Sort column already selected. Change direction + var direction = elem.hasClassName("asc") ? "asc" : "desc"; + var newDirection = direction == "asc" ? "desc" : "asc"; + elem.removeClassName(direction); + elem.addClassName(newDirection); + } + else { // sort column was not selected, do not change direction, just column + if (self.selectedColumn){ + self.selectedColumn.removeClassName("selected"); + } + elem.addClassName("selected"); + self.selectedColumn = elem; + } + self.clearCache(); //reset + self.showRows(1, self.limit); + }); + }); + } + }); -/** - * Helper class to manage permalinks - **/ -var LiveTableHash = Class.create({ /** - * new LiveTableHash( table, enable ) - * @param table the livetable link to this hash - * @param enable if false, the hash will be disabled (not updated) - */ - initialize: function(table, enable) - { - this.table = table; - this.enable = enable; - this.loadFromHash(); - }, + * Helper class to manage permalinks + **/ + var LiveTableHash = Class.create({ + /** + * new LiveTableHash( table, enable ) + * @param table the livetable link to this hash + * @param enable if false, the hash will be disabled (not updated) + */ + initialize: function(table, enable) + { + this.table = table; + this.enable = enable; + this.loadFromHash(); + }, - /** - * Returns the parameters for the current table from hash. - * If permalink is disabled, or there is no parameter for the current table in hash, returns null - */ - loadFromHash: function() - { - this.params = this.getTableParams(); - this.filters = new Object(); - - if (!this.enable) return; - - var hashString = window.location.hash.substring(1); - if (!hashString.blank()) { - var tables = hashString.split("|"); - for (var i = 0; i < tables.length; i++) { - var params = tables[i].toQueryParams(); - if (params["t"] == this.table.domNodeName) { - for (var param in params) { - if (param.length == 1 && "tplsd".indexOf(param) != -1) { - this.params[param] = params[param]; - } else { - this.filters[param] = params[param]; + /** + * Returns the parameters for the current table from hash. + * If permalink is disabled, or there is no parameter for the current table in hash, returns null + */ + loadFromHash: function() + { + this.params = this.getTableParams(); + this.filters = new Object(); + + if (!this.enable) return; + + var hashString = window.location.hash.substring(1); + if (!hashString.blank()) { + var tables = hashString.split("|"); + for (var i = 0; i < tables.length; i++) { + var params = tables[i].toQueryParams(); + if (params["t"] == this.table.domNodeName) { + for (var param in params) { + if (param.length == 1 && "tplsd".indexOf(param) != -1) { + this.params[param] = params[param]; + } else { + this.filters[param] = params[param]; + } } } } } - } - }, + }, - /** - * Returns a parameter map of current livetable state - */ - getTableParams: function() - { - var result = new Object(); - result["t"] = this.table.domNodeName; - result["p"] = ((this.table.lastOffset - 1) / this.table.limit) + 1; - result["l"] = this.table.limit; - if (this.table.getSortColumn() != null) { - result["s"] = this.table.getSortColumn(); - result["d"] = this.table.getSortDirection(); - } - return result; - }, + /** + * Returns a parameter map of current livetable state + */ + getTableParams: function() + { + var result = new Object(); + result["t"] = this.table.domNodeName; + result["p"] = ((this.table.lastOffset - 1) / this.table.limit) + 1; + result["l"] = this.table.limit; + if (this.table.getSortColumn() != null) { + result["s"] = this.table.getSortColumn(); + result["d"] = this.table.getSortDirection(); + } + return result; + }, - /** - * Get helpers, private - */ - getParam: function(name) { return this.params[name]; }, - getIntParam: function(name) { return parseInt(this.params[name]); }, + /** + * Get helpers, private + */ + getParam: function(name) { return this.params[name]; }, + getIntParam: function(name) { return parseInt(this.params[name]); }, + + /** + * Return individual parameter from permlinks hash + */ + getLimit: function() { return this.getIntParam("l"); }, + getPage: function() { return this.getIntParam("p"); }, + getSortColumn: function() { return this.getParam("s"); }, + getSortDirection: function() { return this.getParam("d"); }, + + /** + * Returns filters from permalink hash + * Note: Currently filters are not kept/updated after initialization + */ + getFilters: function(name) + { + return this.filters; + }, - /** - * Return individual parameter from permlinks hash - */ - getLimit: function() { return this.getIntParam("l"); }, - getPage: function() { return this.getIntParam("p"); }, - getSortColumn: function() { return this.getParam("s"); }, - getSortDirection: function() { return this.getParam("d"); }, + /** + * Serialize permalink parameters to query string. + * This function ensure serialization is always applied in the same order so that comparing strings is meaningful + * + * @param newParams Optional argument to serialize future parameters in place of current ones + */ + serializeParams: function(newParams) + { + var params = $H((newParams) ? newParams : this.params); + params = params.inject({}, function(params, pair) { + params[pair.key] = encodeURIComponent(pair.value); + return params; + }); - /** - * Returns filters from permalink hash - * Note: Currently filters are not kept/updated after initialization - */ - getFilters: function(name) - { - return this.filters; - }, + var result = "t=#{t}&p=#{p}&l=#{l}".interpolate(params); + if (params["s"]) { + result += "&s=#{s}&d=#{d}".interpolate(params); + } + return result; + }, - /** - * Serialize permalink parameters to query string. - * This function ensure serialization is always applied in the same order so that comparing strings is meaningful - * - * @param newParams Optional argument to serialize future parameters in place of current ones - */ - serializeParams: function(newParams) - { - var params = $H((newParams) ? newParams : this.params); - params = params.inject({}, function(params, pair) { - params[pair.key] = encodeURIComponent(pair.value); - return params; - }); + /** + * Re-write location hash with current page and filters values + * Nothing is done if the hash is disabled + */ + update: function() + { + if (!this.enable) return; - var result = "t=#{t}&p=#{p}&l=#{l}".interpolate(params); - if (params["s"]) { - result += "&s=#{s}&d=#{d}".interpolate(params); + var params = this.getTableParams(); + var paramsString = this.serializeParams(params); + var filterString = this.table.filter ? this.table.filter.serializeFilters() : ""; + + var shouldUpdate = !filterString.blank() || (paramsString != this.serializeParams()); + + if (shouldUpdate) { + var currentHash = window.location.hash.substring(1); + var tables = currentHash.split("|"), newHash = ""; + for (var i = 0; i < tables.length; i++) { + if (tables[i].toQueryParams()["t"] != params["t"]) { + // Don't override other tables params + newHash += (tables[i] + "|"); + } + } + newHash += paramsString; + newHash += filterString; + + this.params = params; + this.filters = null; //better, but useless: this.filters = filterString.toQueryParams(); + window.location.hash = "#" + newHash; + } } - return result; - }, + }); - /** - * Re-write location hash with current page and filters values - * Nothing is done if the hash is disabled + /** + * Helper class to display pagination */ - update: function() - { - if (!this.enable) return; - - var params = this.getTableParams(); - var paramsString = this.serializeParams(params); - var filterString = this.table.filter ? this.table.filter.serializeFilters() : ""; - - var shouldUpdate = !filterString.blank() || (paramsString != this.serializeParams()); - - if (shouldUpdate) { - var currentHash = window.location.hash.substring(1); - var tables = currentHash.split("|"), newHash = ""; - for (var i = 0; i < tables.length; i++) { - if (tables[i].toQueryParams()["t"] != params["t"]) { - // Don't override other tables params - newHash += (tables[i] + "|"); + var LiveTablePagination = Class.create({ + initialize: function(table, domNodes, max) + { + this.table = table; + var self = this; + this.pagesNodes = []; + domNodes.each(function(elem){ + self.pagesNodes.push(elem.down(".xwiki-livetable-pagination-content")); + }); + this.max = max; + $(this.table.domNodeName).select(".prevPagination").invoke("observe", "click", this.gotoPrevPage.bind(this)); + $(this.table.domNodeName).select(".nextPagination").invoke("observe", "click", this.gotoNextPage.bind(this)); + }, + refreshPagination: function() + { + var self = this; + this.pagesNodes.each(function(elem){ + elem.innerHTML = ""; + }); + var pages = Math.ceil(this.table.totalRows / this.table.limit); + var currentMax = (!this.max) ? pages : this.max; + var currentPage = Math.floor( this.table.lastOffset / this.table.limit) + 1; + var startPage = Math.floor(currentPage / currentMax) * currentMax - 1; + // always display the first page + if (startPage>1) { + this.pagesNodes.each(function(elem){ + elem.insert(self.createPageLink(1, false)); + }); + if (startPage>2) { + this.pagesNodes.invoke("insert", " ... "); + } + } + // display pages + for (var i=(startPage<=0) ? 1 : startPage;i<=Math.min(startPage + currentMax + 1, pages);i++) { + var selected = (currentPage == i); + this.pagesNodes.each(function(elem){ + elem.insert(self.createPageLink(i, selected)); + }); + this.pagesNodes.invoke("insert", " "); + } + // alwyas display the last page. + if (i 0) { + this.table.showRows(((parseInt(prevPage) - 1) * this.table.limit) + 1, this.table.limit); + } + }, + gotoNextPage: function(ev) { + ev.stop(); + var currentPage = Math.floor( this.table.lastOffset / this.table.limit) + 1; + var pages = Math.ceil(this.table.totalRows / this.table.limit); + var nextPage = currentPage + 1; + if (nextPage <= pages) { + this.table.showRows(((parseInt(nextPage) - 1) * this.table.limit) + 1, this.table.limit); } } - newHash += paramsString; - newHash += filterString; - - this.params = params; - this.filters = null; //better, but useless: this.filters = filterString.toQueryParams(); - window.location.hash = "#" + newHash; - } - } -}); + }); /** - * Helper class to display pagination - */ -var LiveTablePagination = Class.create({ - initialize: function(table, domNodes, max) - { + * Helper class to display the page size control + **/ + var LiveTablePageSizer = Class.create({ + /** + * Create a new instance + * @param table The LiveTable + * @param domNodes An array of nodes indicating where the controls will be created + * @param pageSizeBounds The bounds specification for acceptable values (an array of min, max, step) + * @param currentPageSize The currently selected page size. + **/ + initialize: function(table, domNodes, pageSizeBounds, currentPageSize) { this.table = table; + this.currentValue = currentPageSize; + var bounds = pageSizeBounds || []; + this.startValue = bounds[0] || 10; + this.step = bounds[2] || 10; + this.maxValue = bounds[1] || 100; + var self = this; - this.pagesNodes = []; - domNodes.each(function(elem){ - self.pagesNodes.push(elem.down(".xwiki-livetable-pagination-content")); + this.pageSizeNodes = []; + domNodes.each(function(elem) { + self.pageSizeNodes.push(elem.down(".xwiki-livetable-pagesize-content")); }); - this.max = max; - $(this.table.domNodeName).select(".prevPagination").invoke("observe", "click", this.gotoPrevPage.bind(this)); - $(this.table.domNodeName).select(".nextPagination").invoke("observe", "click", this.gotoNextPage.bind(this)); - }, - refreshPagination: function() - { - var self = this; - this.pagesNodes.each(function(elem){ - elem.innerHTML = ""; + + this.pageSizeNodes.each(function(elem) { + elem.insert(self.createPageSizeSelectControl()); }); - var pages = Math.ceil(this.table.totalRows / this.table.limit); - var currentMax = (!this.max) ? pages : this.max; - var currentPage = Math.floor( this.table.lastOffset / this.table.limit) + 1; - var startPage = Math.floor(currentPage / currentMax) * currentMax - 1; - // always display the first page - if (startPage>1) { - this.pagesNodes.each(function(elem){ - elem.insert(self.createPageLink(1, false)); - }); - if (startPage>2) { - this.pagesNodes.invoke("insert", " ... "); - } - } - // display pages - for (var i=(startPage<=0) ? 1 : startPage;i<=Math.min(startPage + currentMax + 1, pages);i++) { - var selected = (currentPage == i); - this.pagesNodes.each(function(elem){ - elem.insert(self.createPageLink(i, selected)); - }); - this.pagesNodes.invoke("insert", " "); - } - // alwyas display the last page. - if (i prevStep && this.currentValue < i) { + select.appendChild(new Element('option', {'value':this.currentValue, 'text':this.currentValue, selected:true}).update(this.currentValue)); + } } - var self = this; - pageSpan.observe("click", function(ev){ - ev.stop(); - self.gotoPage(ev.element().innerHTML); - }); - return pageSpan; - }, - gotoPage: function(page) - { - this.table.showRows(((parseInt(page) - 1 )* this.table.limit) + 1, this.table.limit); - }, - gotoPrevPage: function(ev) { - ev.stop(); - var currentPage = Math.floor( this.table.lastOffset / this.table.limit) + 1; - var prevPage = currentPage - 1; - if (prevPage > 0) { - this.table.showRows(((parseInt(prevPage) - 1) * this.table.limit) + 1, this.table.limit); + select.appendChild(new Element('option', attrs).update(i)); } + select.observe("change", this.changePageSize.bind(this)); + return select; }, - gotoNextPage: function(ev) { - ev.stop(); - var currentPage = Math.floor( this.table.lastOffset / this.table.limit) + 1; - var pages = Math.ceil(this.table.totalRows / this.table.limit); - var nextPage = currentPage + 1; - if (nextPage <= pages) { - this.table.showRows(((parseInt(nextPage) - 1) * this.table.limit) + 1, this.table.limit); - } - } -}); - -/** - * Helper class to display the page size control - **/ - var LiveTablePageSizer = Class.create({ - /** - * Create a new instance - * @param table The LiveTable - * @param domNodes An array of nodes indicating where the controls will be created - * @param pageSizeBounds The bounds specification for acceptable values (an array of min, max, step) - * @param currentPageSize The currently selected page size. - **/ - initialize: function(table, domNodes, pageSizeBounds, currentPageSize) { - this.table = table; - this.currentValue = currentPageSize; - var bounds = pageSizeBounds || []; - this.startValue = bounds[0] || 10; - this.step = bounds[2] || 10; - this.maxValue = bounds[1] || 100; - - var self = this; - this.pageSizeNodes = []; - domNodes.each(function(elem) { - self.pageSizeNodes.push(elem.down(".xwiki-livetable-pagesize-content")); - }); - this.pageSizeNodes.each(function(elem) { - elem.insert(self.createPageSizeSelectControl()); - }); - }, - - /** - * Create the page size control using a select node and returns it - * @return an Element containing the select - **/ - createPageSizeSelectControl: function() { - var select = new Element('select', {'class':'pagesizeselect'}); - for (var i=this.startValue; i<=this.maxValue; i += this.step) { - var attrs = {'value':i, 'text':i}; - if (i == this.currentValue) { - attrs.selected = true; - } else { - var prevStep = i - this.step; - if (this.currentValue > prevStep && this.currentValue < i) { - select.appendChild(new Element('option', {'value':this.currentValue, 'text':this.currentValue, selected:true}).update(this.currentValue)); - } - } - select.appendChild(new Element('option', attrs).update(i)); + /** + * Change the page size of the table + **/ + changePageSize: function(event) { + var newLimit = parseInt($F(Event.element(event))); + this.table.setPageSize(newLimit); } - select.observe("change", this.changePageSize.bind(this)); - return select; - }, - - /** - * Change the page size of the table - **/ - changePageSize: function(event) { - var newLimit = parseInt($F(Event.element(event))); - this.table.setPageSize(newLimit); - } -}); + }); -/* - * The class that deals with the filtering in a table - */ -var LiveTableFilter = Class.create({ - initialize: function(table, filterNodes, filters, options) - { - this.table = table; - this.filterNodes = filterNodes; - this.filters = filters || new Object(); - this.throttlingDelay = options.throttlingDelay || 0; + /* + * The class that deals with the filtering in a table + */ + var LiveTableFilter = Class.create({ + initialize: function(table, filterNodes, filters, options) + { + this.table = table; + this.filterNodes = filterNodes; + this.filters = filters || new Object(); + this.throttlingDelay = options.throttlingDelay || 0; - this.inputs = this.filterNodes.invoke('select','input').flatten(); - this.selects = this.filterNodes.invoke('select','select').flatten(); + this.inputs = this.filterNodes.invoke('select','input').flatten(); + this.selects = this.filterNodes.invoke('select','select').flatten(); - this.initializeFilters(); + this.initializeFilters(); - this.attachEventHandlers(); - }, + this.attachEventHandlers(); + }, - /** - * Initialize DOM values of the filters elements based on the passed map of name/value. - */ - initializeFilters: function() - { - for (var i = 0; i < this.inputs.length; ++i) { - var key = this.inputs[i].name; - if ((this.inputs[i].type == "radio") || (this.inputs[i].type == "checkbox")) { - var filter = this.filters[key]; - if (filter) { - if (Object.isArray(filter)) { - this.inputs[i].checked = (filter.indexOf(this.inputs[i].value.strip()) != -1); - } else { - this.inputs[i].checked = (filter == this.inputs[i].value.strip()); + /** + * Initialize DOM values of the filters elements based on the passed map of name/value. + */ + initializeFilters: function() + { + for (var i = 0; i < this.inputs.length; ++i) { + var key = this.inputs[i].name; + if ((this.inputs[i].type == "radio") || (this.inputs[i].type == "checkbox")) { + var filter = this.filters[key]; + if (filter) { + if (Object.isArray(filter)) { + this.inputs[i].checked = (filter.indexOf(this.inputs[i].value.strip()) != -1); + } else { + this.inputs[i].checked = (filter == this.inputs[i].value.strip()); + } } + } else { + if (this.filters[key]) { + this.inputs[i].value = this.filters[key]; + } + this.applyActiveFilterStyle(this.inputs[i]); } - } else { - if (this.filters[key]) { - this.inputs[i].value = this.filters[key]; - } - this.applyActiveFilterStyle(this.inputs[i]); } - } - for (var i = 0; i < this.selects.length; ++i) { - var filter = this.filters[this.selects[i].name]; - if (filter) { - for (var j = 0; j < this.selects[i].options.length; ++j) { - if (Object.isArray(filter)) { - this.selects[i].options[j].selected = (filter.indexOf(this.selects[i].options[j].value) != -1); - } else { - this.selects[i].options[j].selected = (this.selects[i].options[j].value == filter); + for (var i = 0; i < this.selects.length; ++i) { + var filter = this.filters[this.selects[i].name]; + if (filter) { + for (var j = 0; j < this.selects[i].options.length; ++j) { + if (Object.isArray(filter)) { + this.selects[i].options[j].selected = (filter.indexOf(this.selects[i].options[j].value) != -1); + } else { + this.selects[i].options[j].selected = (this.selects[i].options[j].value == filter); + } } } + this.applyActiveFilterStyle(this.selects[i]); } - this.applyActiveFilterStyle(this.selects[i]); - } - }, - - serializeFilters: function() - { - // It's a shame we can't use prototype Form methods on non-form elements. - // In the future, we need to have the livetable filters in a real form (for a degraded version w/o js) - // Then we can write : - // return Form.serializeElements(Form.getElements(this.domNodeName); - var result = ""; - var filters = [this.inputs, this.selects].flatten(); - for (var i=0;i 0) { - this.updateTagCloud(tags); - } - } - }, + var LiveTableTagCloud = Class.create({ + /** + * Constructor. + */ + initialize: function(table, domNodeName, tags) { + this.table = table; + this.domNode = $(domNodeName); + this.cloudFilter = false; + if (typeof tags == "array") { + this.tags = tags; + if (tags.length > 0) { + this.updateTagCloud(tags); + } + } + }, - /** - * Tags cardinality map. Empty at first. - */ - tags: [], + /** + * Tags cardinality map. Empty at first. + */ + tags: [], - /** - * Tags matching the current filters - */ - matchingTags: [], + /** + * Tags matching the current filters + */ + matchingTags: [], - /** - * Tags selected as filters - */ - selectedTags: {}, - - /** - * Default popularity levels. Used as CSS class on the tag list items. - */ - popularityLevels: ["notPopular", "notVeryPopular", "somewhatPopular", "popular", "veryPopular", "ultraPopular"], + /** + * Tags selected as filters + */ + selectedTags: {}, + + /** + * Default popularity levels. Used as CSS class on the tag list items. + */ + popularityLevels: ["notPopular", "notVeryPopular", "somewhatPopular", "popular", "veryPopular", "ultraPopular"], + + /** + * Update the tag cloud with new tags values. + * This is the only hook the table will call us from. + */ + updateTagCloud: function(tags, matchingTags) { + if (!this.hasTags && tags.length > 0) { + this.tags = tags; + this.map = this.buildPopularityMap(this.tags); + this.hasTags = true; + this.domNode.removeClassName("hidden"); + } + this.matchingTags = matchingTags; + this.displayTagCloud(); + }, - /** - * Update the tag cloud with new tags values. - * This is the only hook the table will call us from. - */ - updateTagCloud: function(tags, matchingTags) { - if (!this.hasTags && tags.length > 0) { - this.tags = tags; - this.map = this.buildPopularityMap(this.tags); - this.hasTags = true; - this.domNode.removeClassName("hidden"); - } - this.matchingTags = matchingTags; - this.displayTagCloud(); - }, - - displayTagCloud: function(){ - this.domNode.down('.xwiki-livetable-tagcloud').innerHTML = ""; - var cloud = new Element("ol", {'class':'tagCloud'}); - var levels = this.map ? this.map.keys().sortBy(function(k){return parseInt(k)}).reverse() : []; - var liClass; - for (var i=0;i= levels[j] || (j == (levels.length - 1))) { - liClass = this.map.get(levels[j]); - break; - } - } - var tagLabel = this.tags[i].tag; - var tagSpan = new Element("span").update(tagLabel.escapeHTML()); - var tag = new Element("li", {'class':liClass}).update(tagSpan); - if (typeof this.matchingTags[tagLabel] != "undefined") { - tag.addClassName("selectable"); - Event.observe(tagSpan, "click", function(event) { - var tag = event.element().up("li").down("span").innerHTML.unescapeHTML(); - event.element().up("li").toggleClassName("selected"); - if (event.element().up("li").hasClassName("selected")) { - self.selectedTags[tag] = {}; - } - else { - delete self.selectedTags[tag]; - } - self.table.tags = self.getSelectedTags(); - self.table.totalRows = -1; - self.table.fetchedRows = new Array(); - self.table.showRows(1, self.table.limit); - }); - } - if (this.selectedTags[tagLabel] != undefined) { - tag.addClassName("selected"); - } - var self = this; - tag.appendChild(document.createTextNode(" ")); - cloud.appendChild(tag); - } - this.domNode.down('.xwiki-livetable-tagcloud').appendChild(cloud); - }, + displayTagCloud: function(){ + this.domNode.down('.xwiki-livetable-tagcloud').innerHTML = ""; + var cloud = new Element("ol", {'class':'tagCloud'}); + var levels = this.map ? this.map.keys().sortBy(function(k){return parseInt(k)}).reverse() : []; + var liClass; + for (var i=0;i= levels[j] || (j == (levels.length - 1))) { + liClass = this.map.get(levels[j]); + break; + } + } + var tagLabel = this.tags[i].tag; + var tagSpan = new Element("span").update(tagLabel.escapeHTML()); + var tag = new Element("li", {'class':liClass}).update(tagSpan); + if (typeof this.matchingTags[tagLabel] != "undefined") { + tag.addClassName("selectable"); + Event.observe(tagSpan, "click", function(event) { + var tag = event.element().up("li").down("span").innerHTML.unescapeHTML(); + event.element().up("li").toggleClassName("selected"); + if (event.element().up("li").hasClassName("selected")) { + self.selectedTags[tag] = {}; + } + else { + delete self.selectedTags[tag]; + } + self.table.tags = self.getSelectedTags(); + self.table.totalRows = -1; + self.table.fetchedRows = new Array(); + self.table.showRows(1, self.table.limit); + }); + } + if (this.selectedTags[tagLabel] != undefined) { + tag.addClassName("selected"); + } + var self = this; + tag.appendChild(document.createTextNode(" ")); + cloud.appendChild(tag); + } + this.domNode.down('.xwiki-livetable-tagcloud').appendChild(cloud); + }, - getSelectedTags: function() { - var result = new Array(); - this.domNode.select("li.selected").each(function(tag) { - result.push(tag.down("span").innerHTML); - }); - return result; - }, + getSelectedTags: function() { + var result = new Array(); + this.domNode.select("li.selected").each(function(tag) { + result.push(tag.down("span").innerHTML); + }); + return result; + }, - /** - * Transform the cardinality map of tags in a map of CSS classes. - * Ported to JS from XWiki.TagCloud for consistency. - */ - buildPopularityMap:function(tags){ - var totalCount = 0; - var minCount = 0; - var maxCount = -1; - tags.each(function(tag){ - totalCount += tag.count; - if(tag.count < minCount || minCount === 0) { - minCount = tag.count; - } - if(tag.count > maxCount || maxCount === -1) { - maxCount = tag.count; + /** + * Transform the cardinality map of tags in a map of CSS classes. + * Ported to JS from XWiki.TagCloud for consistency. + */ + buildPopularityMap:function(tags){ + var totalCount = 0; + var minCount = 0; + var maxCount = -1; + tags.each(function(tag){ + totalCount += tag.count; + if(tag.count < minCount || minCount === 0) { + minCount = tag.count; + } + if(tag.count > maxCount || maxCount === -1) { + maxCount = tag.count; + } + }); + var countAverage = totalCount / tags.length; + var levelsHalf = this.popularityLevels.length / 2; + var firstHalfCountDelta = countAverage - minCount; + var secondHalfCountDelta = maxCount - countAverage; + + var firstHalfIntervalSize = firstHalfCountDelta / levelsHalf; + var secondHalfIntervalSize = secondHalfCountDelta / levelsHalf; + var previousPopularityMax = minCount; + var intervalSize = firstHalfIntervalSize; + var halfPassed = false; + var count = 0; + var currentPopularityMax; + + var popularityMap = new Hash(); + + this.popularityLevels.each(function(level){ + count++; + if(count > levelsHalf && !halfPassed) { + intervalSize = secondHalfIntervalSize; + halfPassed = true; } + currentPopularityMax = previousPopularityMax + intervalSize; + popularityMap.set(currentPopularityMax, level); + previousPopularityMax = currentPopularityMax; + }); + + return popularityMap; + } + }); + + + /** + * The Ugly: Fix IE6 + * Add specific classes when mouse is over table rows, since it cannot be handled in CSS. + */ + if(browser.isIE6x) { + // get notified of all new rows created by live tables. + document.observe("xwiki:livetable:newrow", function(ev) { + // Add events listeners to mouse over/out on the + Event.observe(ev.memo.row, "mouseover", function(event){ + event.element().up("tr").addClassName("rowHover"); }); - var countAverage = totalCount / tags.length; - var levelsHalf = this.popularityLevels.length / 2; - var firstHalfCountDelta = countAverage - minCount; - var secondHalfCountDelta = maxCount - countAverage; - - var firstHalfIntervalSize = firstHalfCountDelta / levelsHalf; - var secondHalfIntervalSize = secondHalfCountDelta / levelsHalf; - var previousPopularityMax = minCount; - var intervalSize = firstHalfIntervalSize; - var halfPassed = false; - var count = 0; - var currentPopularityMax; - - var popularityMap = new Hash(); - - this.popularityLevels.each(function(level){ - count++; - if(count > levelsHalf && !halfPassed) { - intervalSize = secondHalfIntervalSize; - halfPassed = true; - } - currentPopularityMax = previousPopularityMax + intervalSize; - popularityMap.set(currentPopularityMax, level); - previousPopularityMax = currentPopularityMax; + Event.observe(ev.memo.row, "mouseout", function(event){ + event.element().up("tr").removeClassName("rowHover"); }); - - return popularityMap; - } -}); - - -/** - * The Ugly: Fix IE6 - * Add specific classes when mouse is over table rows, since it cannot be handled in CSS. - */ -if(browser.isIE6x) { - // get notified of all new rows created by live tables. - document.observe("xwiki:livetable:newrow", function(ev) { - // Add events listeners to mouse over/out on the - Event.observe(ev.memo.row, "mouseover", function(event){ - event.element().up("tr").addClassName("rowHover"); }); - Event.observe(ev.memo.row, "mouseout", function(event){ - event.element().up("tr").removeClassName("rowHover"); - }); - }); -} + } })(); diff --git a/src/main/webapp/resources/js/xwiki/table/tablefilterNsort.js b/src/main/webapp/resources/js/xwiki/table/tablefilterNsort.js index 737fb2c0e..59ff3f652 100644 --- a/src/main/webapp/resources/js/xwiki/table/tablefilterNsort.js +++ b/src/main/webapp/resources/js/xwiki/table/tablefilterNsort.js @@ -1,307 +1,514 @@ -var image_path=""; -var image_up="$xwiki.getSkinFile('icons/table/arrow-up.gif', true)"; -var image_down="$xwiki.getSkinFile('js/xwiki/table/img/arrow-down.gif', true)"; -var image_none="$xwiki.getSkinFile('js/xwiki/table/img/arrow-none.gif', true)"; -var TblId,StartRow,SearchFlt,ModFn,ModFnId; -TblId=new Array(),StartRow=new Array(); -ModFn=new Array(),ModFnId=new Array(); -addEvent(window,"load",init_sortnfilter); +var image_path = ""; +var image_up = "/file/resources/icons/table/arrow-up.gif"; +var image_down = "/file/resources/js/xwiki/table/img/arrow-down.gif"; +var image_none = "/file/resources/js/xwiki/table/img/arrow-none.gif"; +var TblId, StartRow, SearchFlt, ModFn, ModFnId; +TblId = new Array(), StartRow = new Array(); +ModFn = new Array(), ModFnId = new Array(); +addEvent(window, "load", init_sortnfilter); var SORT_COLUMN_INDEX; -function init_sortnfilter(){sortables_init(); -filterable_init() -}function sortables_init(){if(!document.getElementsByTagName){return -}var C=document.getElementsByTagName("table"); -for(var A=0; -A'; -Q.reverse(); -N.setAttribute("sortdir","up") -}else{L='↓'; -N.setAttribute("sortdir","down") -}for(var O=0; -O' -}}}N.innerHTML=L; -alternate(P) -}function Filter(J){getFilters(J); -var H=document.getElementById(J); -var O=new Array(); -var M=getCellsNb(J); -var L=1; -for(var Q=0; -Q=/.test(O[P])&&!isNaN(R)){R>=parseFloat(O[P].replace(/>=/,""))?I[P]=3:I[P]=1 -}else{if(//.test(O[P])&&!isNaN(R)){R>parseFloat(O[P].replace(/>/,""))?I[P]=3:I[P]=1 -}else{I[P]=E.split(O[P]).length -}}}}}}for(var G=0; -G-1){return A -}}return 0 -}function getSortBottomRow(B){for(var A=0; -A-1){return A -}}return null -}function ts_getInnerText(D){if(typeof D=="string"){return D -}if(typeof D=="undefined"){return"" -}if(typeof D=="object"&&D.tagName.toLowerCase()=="img"){return D.alt -}if(D.innerText){return D.innerText -}var E=""; -var C=D.childNodes; -var A=C.length; -for(var B=0; -B0){E=D.rows[getHeaderRow(D)] -}if(!E){return -}for(var C=0; -C'+A+'↓' -}}alternate(D) -}function alternate(F){if(F.className.indexOf("doOddEven")>-1){var G=1; -var A=null!=getSortBottomRow(F)?getSortBottomRow(F):F.rows.length; -var D=F.getElementsByTagName("tbody"); -for(var C=0; -C1){for(var B=0; -B-1)){B.className=replace(B.className,"odd","even") -}else{B.className=B.className.indexOf("even")>-1?B.className:B.className+" even" -}}else{if((B.className.indexOf("even")>-1)){B.className=replace(B.className,"even","odd") -}B.className=B.className.indexOf("odd")>-1?B.className:B.className+" odd" -}}function ts_sort_date(C,A){var F=ts_getInnerText(C.cells[SORT_COLUMN_INDEX]); -var G=ts_getInnerText(A.cells[SORT_COLUMN_INDEX]); -var D,E,B; -if(F.length==10){D=F.substr(6,4)+F.substr(3,2)+F.substr(0,2) -}else{E=F.substr(6,2); -if(parseInt(E)<50){E="20"+E -}else{E="19"+E -}D=E+F.substr(3,2)+F.substr(0,2) -}if(G.length==10){B=G.substr(6,4)+G.substr(3,2)+G.substr(0,2) -}else{E=G.substr(6,2); -if(parseInt(E)<50){E="20"+E -}else{E="19"+E -}B=E+G.substr(3,2)+G.substr(0,2) -}if(D==B){return 0 -}if(D'; + Q.reverse(); + N.setAttribute("sortdir", "up") + } else { + L = '↓'; + N.setAttribute("sortdir", "down") + } for (var O = 0; + O < Q.length; + O++) { + if (!Q[O].className || (Q[O].className && (Q[O].className.indexOf("sortBottom") == -1))) { + P.tBodies[0].appendChild(Q[O]) + } + } for (var O = 0; + O < Q.length; + O++) { + if (Q[O].className && (Q[O].className.indexOf("sortBottom") != -1)) { + P.tBodies[0].appendChild(Q[O]) + } + } for (var O = 0; + O < J.length; + O++) { + P.tBodies[0].appendChild(J[O]) + } var A = document.getElementsByTagName("span"); + for (var H = 0; + H < A.length; + H++) { + if (A[H].className == "sortarrow") { + if (getParent(A[H], "table") == getParent(R, "table")) { + A[H].innerHTML = '↓' + } + } + } N.innerHTML = L; + alternate(P) +} function Filter(J) { + getFilters(J); + var H = document.getElementById(J); + var O = new Array(); + var M = getCellsNb(J); + var L = 1; + for (var Q = 0; + Q < SearchFlt.length; + ++Q) { + O.push((document.getElementById(SearchFlt[Q]).value).toLowerCase()) + } var F = getStartRow(J); + var D = H.getElementsByTagName("tr"); + var C = null != getSortBottomRow(H) ? getSortBottomRow(H) : H.rows.length; + for (var N = F; + N < D.length; + N++) { + var A = true; + if (D[N].style.display == "none") { + D[N].style.display = "" + } var B = getChildElms(D[N]).childNodes; + var K = B.length; + if (K == M) { + var S = new Array(); + var I = new Array(); + for (var P = 0; + P < K; + P++) { + var E = getCellText(B[P]).toLowerCase(); + S.push(E); + if (O[P] != "") { + var R = parseFloat(E); + if (/<=/.test(O[P]) && !isNaN(R)) { + R <= parseFloat(O[P].replace(/<=/, "")) ? I[P] = 3 : I[P] = 1 + } else { + if (/>=/.test(O[P]) && !isNaN(R)) { + R >= parseFloat(O[P].replace(/>=/, "")) ? I[P] = 3 : I[P] = 1 + } else { + if (//.test(O[P]) && !isNaN(R)) { + R > parseFloat(O[P].replace(/>/, "")) ? I[P] = 3 : I[P] = 1 + } else { + I[P] = E.split(O[P]).length + } + } + } + } + } + } for (var G = 0; + G < M; + G++) { + if (O[G] != "" && I[G] < 2) { + A = false + } + } + } if (A == false && N < C) { + D[N].style.display = "none" + } else { + D[N].style.display = "" + } + } alternate(H) +} function getHeaderRow(B) { + for (var A = 0; + A < B.rows.length - 1; + A++) { + if (B.rows[A].className.indexOf("sortHeader") > -1) { + return A + } + } return 0 +} function getSortBottomRow(B) { + for (var A = 0; + A < B.rows.length; + A++) { + if (B.rows[A].className.indexOf("sortBottom") > -1) { + return A + } + } return null +} function ts_getInnerText(D) { + if (typeof D == "string") { + return D + } if (typeof D == "undefined") { + return "" + } if (typeof D == "object" && D.tagName.toLowerCase() == "img") { + return D.alt + } if (D.innerText) { + return D.innerText + } var E = ""; + var C = D.childNodes; + var A = C.length; + for (var B = 0; + B < A; + B++) { + switch (C[B].nodeType) { + case 1: E += ts_getInnerText(C[B]); + break; + case 3: E += C[B].nodeValue; + break + } + } return E +} function ts_makeSortable(D) { + var E; + if (D.rows && D.rows.length > 0) { + E = D.rows[getHeaderRow(D)] + } if (!E) { + return + } for (var C = 0; + C < E.cells.length; + C++) { + var B = E.cells[C]; + var A = ts_getInnerText(B); + if (B.className != "unsortable" && B.className.indexOf("unsortable") == -1) { + B.innerHTML = '' + A + '↓' + } + } alternate(D) +} function alternate(F) { + if (F.className.indexOf("doOddEven") > -1) { + var G = 1; + var A = null != getSortBottomRow(F) ? getSortBottomRow(F) : F.rows.length; + var D = F.getElementsByTagName("tbody"); + for (var C = 0; + C < D.length; + C++) { + var E = D[C].getElementsByTagName("tr"); + for (var B = getHeaderRow(F) + 1; + B < A; + B++) { + if (E[B].style.display == "") { + G++; + swapOddEven(E[B], G) + } + } + } + } +} function getParent(B, A) { + if (B == null) { + return null + } else { + if (B.nodeType == 1 && B.tagName.toLowerCase() == A.toLowerCase()) { + return B + } else { + return getParent(B.parentNode, A) + } + } +} function addEvent(E, D, B, A) { + if (E.addEventListener) { + E.addEventListener(D, B, A); + return true + } else { + if (E.attachEvent) { + var C = E.attachEvent("on" + D, B); + return C + } else { + alert("Handler could not be removed") + } + } +} function replace(D, C, A) { + var B = D.indexOf(C); + var E = ""; + if (B == -1) { + return D + } E += D.substring(0, B) + A; + if (B + C.length < D.length) { + E += replace(D.substring(B + C.length, D.length), C, A) + } return E +} function setFilterGrid(G) { + var E = document.getElementById(G); + var F, D; + if (E != null && E.nodeName.toLowerCase() == "table") { + TblId.push(G); + if (arguments.length > 1) { + for (var B = 0; + B < arguments.length; + B++) { + var A = typeof arguments[B]; + switch (A.toLowerCase()) { + case "number": F = arguments[B]; + break; + case "object": D = arguments[B]; + break + } + } + } F == undefined ? StartRow.push(2) : StartRow.push(F + 2); + var C = getCellsNb(G, F); + AddRow(G, C, D) + } +} function AddRow(C, G, J) { + var P = document.getElementById(C); + var M = P.insertRow(0); + var A = P.rows[getHeaderRow(P)]; + var K, Q, F, L, O; + J != undefined && J.btn == false ? Q = false : Q = true; + J != undefined && J.btn_text != undefined ? F = J.btn_text : F = "Filter"; + J != undefined && J.enter_key == false ? L = false : L = true; + J != undefined && J.mod_filter_fn ? O = true : O = false; + if (O) { + ModFnId.push(C); + ModFn.push(J.mod_filter_fn) + } for (var I = 0; + I < G; + I++) { + var E = M.insertCell(I); + var H = A.cells[I]; + I == G - 1 && Q == true ? K = "flt_s" : K = "flt"; + if ((J == undefined || J["col_" + I] == undefined || J["col_" + I] == "none") && H.className.indexOf("selectFilter") == -1) { + var N = document.createElement("input"); + N.setAttribute("id", "flt" + I + "_" + C); + N.setAttribute("size", "5"); + if (H.className.indexOf("noFilter") == -1) { + N.setAttribute("type", "text") + } else { + N.setAttribute("type", "hidden") + } N.className = K; + E.appendChild(N); + if (L) { + N.onkeypress = DetectKey + } + } else { + if (H.className.indexOf("selectFilter") != -1) { + var B = document.createElement("select"); + B.setAttribute("id", "flt" + I + "_" + C); + B.className = K; + E.appendChild(B); + PopulateOptions(C, I, G); + if (L) { + B.onkeypress = DetectKey + } + } + } if (I == G - 1 && Q == true) { + var D = document.createElement("input"); + D.setAttribute("id", "btn" + I + "_" + C); + D.setAttribute("type", "button"); + D.setAttribute("value", F); + D.className = "btnflt"; + E.appendChild(D); + (!O) ? D.onclick = function () { + Filter(C) + } : D.onclick = J.mod_filter_fn + } + } +} function PopulateOptions(B, J, I) { + var M = document.getElementById(B); + var K = getStartRow(B); + var N = M.getElementsByTagName("tr"); + var F = new Array(); + var H = 0; + for (var D = K; + D < N.length; + D++) { + var L = getChildElms(N[D]).childNodes; + var C = L.length; + if (C == I) { + for (var E = 0; + E < C; + E++) { + if (J == E) { + var G = getCellText(L[E]); + if (F.toString().toUpperCase().search(G.toUpperCase()) == -1) { + H++; + F.push(G); + var A = new Option(G, G, false, false); + document.getElementById("flt" + J + "_" + B).options[H] = A + } + } + } + } + } +} function getCellsNb(E, C) { + var A = document.getElementById(E); + var B; + if (C == undefined) { + B = A.getElementsByTagName("tr")[0] + } else { + B = A.getElementsByTagName("tr")[C] + } var D = getChildElms(B); + return D.childNodes.length +} function getFilters(E) { + SearchFlt = new Array(); + var B = document.getElementById(E); + var C = B.getElementsByTagName("tr")[0]; + var D = C.childNodes; + for (var A = 0; + A < D.length; + A++) { + SearchFlt.push(D[A].firstChild.getAttribute("id")) + } +} function getStartRow(C) { + var B; + for (var A in TblId) { + if (TblId[A] == C) { + B = StartRow[A] + } + } return B +} function getChildElms(D) { + if (D.nodeType == 1) { + var C = D.childNodes; + for (var A = 0; + A < C.length; + A++) { + var B = C[A]; + if (B.nodeType == 3) { + D.removeChild(B) + } + } return D + } +} function getCellText(E) { + var B = ""; + var D = E.childNodes; + for (var A = 0; + A < D.length; + A++) { + var C = D[A]; + if (C.nodeType == 3) { + B += C.data + } else { + B += getCellText(C) + } + } return B +} function DetectKey(G) { + var A = (G) ? G : (window.event) ? window.event : null; + if (A) { + var D = (A.charCode) ? A.charCode : ((A.keyCode) ? A.keyCode : ((A.which) ? A.which : 0)); + if (D == "13") { + var H, E, B, F; + H = this.getAttribute("id"); + E = this.getAttribute("id").split("_")[0]; + B = H.substring(E.length + 1, H.length); + for (var C in ModFn) { + ModFnId[C] == B ? F = true : F = false + } (F) ? ModFn[C].call() : Filter(B) + } + } +} function swapOddEven(B, A) { + if ((A % 2) == 0) { + if ((B.className.indexOf("odd") > -1)) { + B.className = replace(B.className, "odd", "even") + } else { + B.className = B.className.indexOf("even") > -1 ? B.className : B.className + " even" + } + } else { + if ((B.className.indexOf("even") > -1)) { + B.className = replace(B.className, "even", "odd") + } B.className = B.className.indexOf("odd") > -1 ? B.className : B.className + " odd" + } +} function ts_sort_date(C, A) { + var F = ts_getInnerText(C.cells[SORT_COLUMN_INDEX]); + var G = ts_getInnerText(A.cells[SORT_COLUMN_INDEX]); + var D, E, B; + if (F.length == 10) { + D = F.substr(6, 4) + F.substr(3, 2) + F.substr(0, 2) + } else { + E = F.substr(6, 2); + if (parseInt(E) < 50) { + E = "20" + E + } else { + E = "19" + E + } D = E + F.substr(3, 2) + F.substr(0, 2) + } if (G.length == 10) { + B = G.substr(6, 4) + G.substr(3, 2) + G.substr(0, 2) + } else { + E = G.substr(6, 2); + if (parseInt(E) < 50) { + E = "20" + E + } else { + E = "19" + E + } B = E + G.substr(3, 2) + G.substr(0, 2) + } if (D == B) { + return 0 + } if (D < B) { + return -1 + } return 1 +} function ts_sort_currency(B, A) { + var C = ts_getInnerText(B.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g, ""); + var D = ts_getInnerText(A.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g, ""); + return isNaN(parseFloat(C) - parseFloat(D)) ? -1 : parseFloat(C) - parseFloat(D) +} function ts_sort_numeric(B, A) { + var C = parseFloat(ts_getInnerText(B.cells[SORT_COLUMN_INDEX])); + var D = parseFloat(ts_getInnerText(A.cells[SORT_COLUMN_INDEX])); + if (isNaN(C)) { + C = 0 + } if (isNaN(D)) { + D = 0 + } return C - D +} function ts_sort_caseinsensitive(B, A) { + var C = ts_getInnerText(B.cells[SORT_COLUMN_INDEX]).toLowerCase(); + var D = ts_getInnerText(A.cells[SORT_COLUMN_INDEX]).toLowerCase(); + if (C == D) { + return 0 + } if (C < D) { + return -1 + } return 1 +} function ts_sort_default(B, A) { + var C = ts_getInnerText(B.cells[SORT_COLUMN_INDEX]); + var D = ts_getInnerText(A.cells[SORT_COLUMN_INDEX]); + if (C == D) { + return 0 + } if (C < D) { + return -1 + } return 1 +}; diff --git a/src/main/webapp/resources/js/xwiki/usersandgroups/img/allow-black.png b/src/main/webapp/resources/js/xwiki/usersandgroups/img/allow-black.png deleted file mode 100644 index b83e680b4..000000000 Binary files a/src/main/webapp/resources/js/xwiki/usersandgroups/img/allow-black.png and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/usersandgroups/img/allow.png b/src/main/webapp/resources/js/xwiki/usersandgroups/img/allow.png deleted file mode 100644 index 09617cb85..000000000 Binary files a/src/main/webapp/resources/js/xwiki/usersandgroups/img/allow.png and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/usersandgroups/img/but1-hover.png b/src/main/webapp/resources/js/xwiki/usersandgroups/img/but1-hover.png deleted file mode 100644 index 06a4c8846..000000000 Binary files a/src/main/webapp/resources/js/xwiki/usersandgroups/img/but1-hover.png and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/usersandgroups/img/but1.png b/src/main/webapp/resources/js/xwiki/usersandgroups/img/but1.png deleted file mode 100644 index 58d367d67..000000000 Binary files a/src/main/webapp/resources/js/xwiki/usersandgroups/img/but1.png and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/usersandgroups/img/clear.png b/src/main/webapp/resources/js/xwiki/usersandgroups/img/clear.png deleted file mode 100644 index d9e8e6fba..000000000 Binary files a/src/main/webapp/resources/js/xwiki/usersandgroups/img/clear.png and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/usersandgroups/img/clearg.png b/src/main/webapp/resources/js/xwiki/usersandgroups/img/clearg.png deleted file mode 100644 index 255b1bd56..000000000 Binary files a/src/main/webapp/resources/js/xwiki/usersandgroups/img/clearg.png and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/usersandgroups/img/deny1.png b/src/main/webapp/resources/js/xwiki/usersandgroups/img/deny1.png deleted file mode 100644 index 6de56fd4b..000000000 Binary files a/src/main/webapp/resources/js/xwiki/usersandgroups/img/deny1.png and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/usersandgroups/img/edit.png b/src/main/webapp/resources/js/xwiki/usersandgroups/img/edit.png deleted file mode 100644 index eabf03679..000000000 Binary files a/src/main/webapp/resources/js/xwiki/usersandgroups/img/edit.png and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/usersandgroups/img/filter.png b/src/main/webapp/resources/js/xwiki/usersandgroups/img/filter.png deleted file mode 100644 index da803b2a0..000000000 Binary files a/src/main/webapp/resources/js/xwiki/usersandgroups/img/filter.png and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/usersandgroups/img/group.png b/src/main/webapp/resources/js/xwiki/usersandgroups/img/group.png deleted file mode 100644 index 5db64141e..000000000 Binary files a/src/main/webapp/resources/js/xwiki/usersandgroups/img/group.png and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/usersandgroups/img/none.png b/src/main/webapp/resources/js/xwiki/usersandgroups/img/none.png deleted file mode 100644 index 19c5d3c46..000000000 Binary files a/src/main/webapp/resources/js/xwiki/usersandgroups/img/none.png and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/usersandgroups/img/revert.png b/src/main/webapp/resources/js/xwiki/usersandgroups/img/revert.png deleted file mode 100644 index 3c4897372..000000000 Binary files a/src/main/webapp/resources/js/xwiki/usersandgroups/img/revert.png and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/usersandgroups/img/revertg.png b/src/main/webapp/resources/js/xwiki/usersandgroups/img/revertg.png deleted file mode 100644 index ecaed83ef..000000000 Binary files a/src/main/webapp/resources/js/xwiki/usersandgroups/img/revertg.png and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/usersandgroups/img/rights-alert.gif b/src/main/webapp/resources/js/xwiki/usersandgroups/img/rights-alert.gif deleted file mode 100644 index 2786a4d3b..000000000 Binary files a/src/main/webapp/resources/js/xwiki/usersandgroups/img/rights-alert.gif and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/usersandgroups/img/save.png b/src/main/webapp/resources/js/xwiki/usersandgroups/img/save.png deleted file mode 100644 index b305f5bcb..000000000 Binary files a/src/main/webapp/resources/js/xwiki/usersandgroups/img/save.png and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/usersandgroups/img/saveg.png b/src/main/webapp/resources/js/xwiki/usersandgroups/img/saveg.png deleted file mode 100644 index 4bc2bbf4e..000000000 Binary files a/src/main/webapp/resources/js/xwiki/usersandgroups/img/saveg.png and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/usersandgroups/img/user.png b/src/main/webapp/resources/js/xwiki/usersandgroups/img/user.png deleted file mode 100644 index e7881b8d2..000000000 Binary files a/src/main/webapp/resources/js/xwiki/usersandgroups/img/user.png and /dev/null differ diff --git a/src/main/webapp/resources/js/xwiki/usersandgroups/usersandgroups.css b/src/main/webapp/resources/js/xwiki/usersandgroups/usersandgroups.css deleted file mode 100644 index c8a94cb11..000000000 --- a/src/main/webapp/resources/js/xwiki/usersandgroups/usersandgroups.css +++ /dev/null @@ -1,19 +0,0 @@ -#xwikieditcontent{position:relative;} -#memberstable{width:500px;margin-bottom:5px;} -#specialusersandgroups{border-collapse:collapse;border:1px solid #d4dee8;width:99.5%;} -#specialusersandgroups td{border:1px solid #d4dee8;} -.manage{text-align:center;width:15%;} -.hmanage{width:15%;padding-left:10px;} -.rights{text-align:center;padding-left:0!important;padding-top:4px;width:9%;} -#usersandgroupstable.spacerights .rights{width:12%!important;} -#usersandgroupstable.rights .rights{width:15%!important;} -.spaceName{margin-left:13px;margin-top:5px;margin-bottom:5px;} -#tdAddNewUserOrGroup{padding-top:11px;} -#tdAddNewUserOrGroup a{color:#fff;font-weight:bold;font-size:12px;text-decoration:none;background-image:url($xwiki.getSkinFile('js/xwiki/usersandgroups/img/but1.png', true));background-repeat:no-repeat!important;display:block;text-align:center;padding-top:3px;width:130px;height:24px;} -#errMsg{color:#D70;font-size:12px;font-weight:bold;} -#XWikiGuestSpecial{background-color:#fff;color:#000;} -.suorg{padding-left:10px;padding-top:4px;} -.username{padding-left:10px;} -#addNewMember{margin-top:5px;} -.addlabel{font-weight:bold;} -tr.userorgroups-header{background-color:#DDD;} \ No newline at end of file diff --git a/src/main/webapp/resources/js/xwiki/usersandgroups/usersandgroups.js b/src/main/webapp/resources/js/xwiki/usersandgroups/usersandgroups.js deleted file mode 100644 index 897a50f2f..000000000 --- a/src/main/webapp/resources/js/xwiki/usersandgroups/usersandgroups.js +++ /dev/null @@ -1,508 +0,0 @@ -/* this represent a triple state checkbox */ -MSCheckbox = Class.create({ - /** - * @todo Make confirmations generic. - * @todo msg.get - * @todo Send the state number, or a generic map {state => sendValue} - * @todo Configuration: automatic save, or just change the value. - * @todo "Busy" icon when saving. - * @todo Changing the value should change the cache, not invalidate it. - * @todo The new state should be taken from the response, not just increment it. - * @todo Make this a valid ARIA checkbox: http://www.w3.org/TR/aria-role/#checkbox - */ - initialize: function(domNode, right, saveUrl, defaultState, table, idx) - { - this.table = table; - this.idx = idx; - if (this.table && this.idx && this.table.fetchedRows[this.idx]) { - this.currentUorG = this.table.fetchedRows[this.idx].fullname; - this.isUserInGroup = this.table.fetchedRows[this.idx].isuseringroup; - } else { - // guest users - this.currentUorG = window.unregUser; - this.isUserInGroup = false; - } - this.domNode = $(domNode); - this.right = right; - this.saveUrl = saveUrl; - this.defaultState = defaultState; - this.state = defaultState; - this.states = [0,1,2]; // 0 = inherit; 1 = allow, 2 == deny - this.nrstates = this.states.length; - this.images = [ - "$xwiki.getSkinFile('js/xwiki/usersandgroups/img/none.png',true)", - "$xwiki.getSkinFile('js/xwiki/usersandgroups/img/allow.png',true)", - "$xwiki.getSkinFile('js/xwiki/usersandgroups/img/deny1.png',true)" - ]; - this.labels = ['','','']; - - this.draw(this.state); - this.attachEvents(); - }, - - /** - * @todo Draw with the current this.state, don't pass as an argument. - */ - draw: function(state) - { - //remove child nodes - while (this.domNode.childNodes.length > 0) { - this.domNode.removeChild(this.domNode.firstChild); - } - //add new image - var img = document.createElement('img'); - img.src = this.images[state]; - this.domNode.appendChild(img); - //add label - if (this.labels[state] != '') { - var la = document.createElement('span'); - la.appendChild(document.createTextNode(this.labels[state])); - this.domNode.appendChild(la); - } - }, - - next: function() - { - this.state = (this.state + 1) % this.nrstates; - if (this.table != undefined) { - // TODO: Just update the cache, don't invalidate the row, once the rights are as stored as an - // array, and not as a string. - delete this.table.fetchedRows[this.idx]; - } - this.draw(this.state); - }, - - /* Confirmation cases: - * 1. The current user is clearing / denying himself any right. - * 2. The current user is clearing / denying any rights for a group he belongs to. - * 3. The current user is is clearing / denying admin right for any user / group. - * User can clear it's own right after canceling the deny action and confirming the clear action. - */ - createClickHandler: function(self) - { - return function() { - if (self.req) { - return; - } - - var action = ""; - var nxtst = (self.state + 1) % self.nrstates; - - // 1. The current user is clearing / denying himself any right. - if (self.currentUorG == window.currentUser) { - if (nxtst == 2) { - var denymessage = "$msg.get('rightsmanager.denyrightforcurrentuser').replaceAll('"', '\\"')".replace('__right__', self.right); - if (!confirm(denymessage)) { - var clearmessage = "$msg.get('rightsmanager.clearrightforcurrentuserinstead').replaceAll('"', '\\"')".replace('__right__', self.right); - if (confirm(clearmessage)) { - action = "clear"; - self.state = 2; - nxtst = 0; - } else { - return; - } - } - } else if (nxtst == 0) { - var clearmessage = "$msg.get('rightsmanager.clearrightforcurrentuser').replaceAll('"', '\\"')".replace('__right__', self.right); - if (!confirm(clearmessage)) { - return; - } - } - } - // 2. The current user is clearing / denying any rights for a group he belongs to. - else if (self.isUserInGroup || (window.currentUser == "XWiki.XWikiGuest" && self.currentUorG == "XWiki.XWikiAllGroup")) { - if (nxtst == 2) { - var denymessage = "$msg.get('rightsmanager.denyrightforgroup').replaceAll('"', '\\"')".replace(/__right__/g, self.right); - denymessage = denymessage.replace('__name__', self.currentUorG); - if (!confirm(denymessage)) { - var clearmessage = "$msg.get('rightsmanager.clearrightforgroupinstead').replaceAll('"', '\\"')".replace(/__right__/g, self.right); - clearmessage = clearmessage.replace('__name__', self.currentUorG); - if (confirm(clearmessage)) { - action = "clear"; - self.state = 2; - nxtst = 0; - } else { - return; - } - } - } else if (nxtst == 0) { - var clearmessage = "$msg.get('rightsmanager.clearrightforgroup').replaceAll('"', '\\"')".replace(/__right__/g, self.right); - clearmessage = clearmessage.replace('__name__', self.currentUorG); - if (!confirm(clearmessage)) { - return; - } - } - } - // 3. The current user is is clearing / denying admin right for any user / group. - else if (self.right == "admin") { - if (nxtst == 2) { - var denymessage = "$msg.get('rightsmanager.denyrightforuorg').replaceAll('"', '\\"')".replace('__right__', self.right); - denymessage = denymessage.replace('__name__', self.currentUorG); - if (!confirm(denymessage)) { - return; - } - } else if (nxtst == 0) { - var clearmessage = "$msg.get('rightsmanager.clearrightforuorg').replaceAll('"', '\\"')".replace('__right__', self.right); - clearmessage = clearmessage.replace('__name__', self.currentUorG); - if (!confirm(clearmessage)) { - return; - } - } - } - - if (action == "") { - if (nxtst == 0) { - action = "clear"; - } else if (nxtst == 1) { - action = "allow"; - } else { - action = "deny"; - } - } - - // Compose the complete URI - var url = self.saveUrl + "&action=" + action + "&right=" + self.right; - - self.req = new Ajax.Request(url, { - method: 'get', - onSuccess: function(transport) { - if (transport.responseText.strip() == "SUCCESS") { - self.next(); - } else { - //if an error occurred while trying to save a right rule, display an alert - // and refresh the page, since probably the user does not have the right to perform - // that action - alert("$msg.get('platform.core.rightsManagement.saveFailure')"); - var rURL = unescape(window.location.pathname); - window.location.href = rURL; - } - }, - onFailure: function() { - alert("$msg.get('platform.core.rightsManagement.ajaxFailure')"); - }, - onComplete: function() { - delete self.req; - } - }); - } - }, - - attachEvents: function() - { - Event.observe(this.domNode, 'click', this.createClickHandler(this)); - } -}); - -/** - * user list element creator. Used in adminusers.vm. - */ -function displayUsers(row, i, table) -{ - var userurl = row.userurl; - var usersaveurl = row.usersaveurl; - var userinlineurl = row.userinlineurl; - var wikiname = row.wikiname; - var docurl = row.docurl; - - var tr = document.createElement('tr'); - - var username = document.createElement('td'); - if (wikiname == "local") { - var a = document.createElement('a'); - a.href = userurl; - a.appendChild(document.createTextNode(row.username)); - username.appendChild(a); - } else { - username.appendChild(document.createTextNode(row.username)); - } - username.className="username"; - tr.appendChild(username); - - var firstname = document.createElement('td'); - firstname.appendChild(document.createTextNode(row.firstname) ); - tr.appendChild(firstname); - - var lastname = document.createElement('td'); - lastname.appendChild(document.createTextNode(row.lastname) ); - tr.appendChild(lastname); - - var manage = document.createElement('td'); - manage.className = "manage"; - - if (wikiname == "local") { - //edit user - var edit = document.createElement('img'); - edit.src = '$xwiki.getSkinFile("js/xwiki/usersandgroups/img/edit.png",true)'; - edit.title = "$msg.get('edit')"; - Event.observe(edit, 'click', editUserOrGroup(userinlineurl, usersaveurl, docurl)); - edit.className = 'icon-manage'; - manage.appendChild(edit); - - //delete group - var del = document.createElement('img'); - - if (row.grayed == "true") { - del.src = '$xwiki.getSkinFile("js/xwiki/usersandgroups/img/clearg.png",true)'; - del.className = 'icon-manageg'; - } else { - del.src = '$xwiki.getSkinFile("js/xwiki/usersandgroups/img/clear.png",true)'; - Event.observe(del, 'click', deleteUserOrGroup(i, table, row.fullname, "user")); - del.className = 'icon-manage'; - } - del.title = "$msg.get('delete')"; - manage.appendChild(del); - } - - tr.appendChild(manage); - return tr; -} - -/** group list element creator **/ -function displayGroups(row, i, table) -{ - var userurl = row.userurl; - var userinlineurl = row.userinlineurl; - var usersaveurl = row.usersaveurl; - var wikiname = row.wikiname; - var docurl = row.docurl; - - var tr = document.createElement('tr'); - - var username = document.createElement('td'); - if (wikiname == "local") { - var a = document.createElement('a'); - a.href = userurl; - a.appendChild( document.createTextNode( row.username ) ); - username.appendChild( a ); - } else { - username.appendChild(document.createTextNode(row.username)); - } - username.className="username"; - tr.appendChild(username); - - var members = document.createElement('td'); - if (wikiname == "local") { - members.appendChild(document.createTextNode(row.members)); - } else { - members.appendChild(document.createTextNode("-")); - } - tr.appendChild(members); - - var manage = document.createElement('td'); - manage.className = "manage"; - - if (wikiname == "local") { - //delete group - var del = document.createElement('img'); - del.src = '$xwiki.getSkinFile("js/xwiki/usersandgroups/img/clear.png",true)'; - del.title = "$msg.get('delete')"; - Event.observe(del, 'click', deleteUserOrGroup(i, table, row.fullname, "group")); - del.className = 'icon-manage'; - - //edit user - var edit = document.createElement('img'); - edit.src = '$xwiki.getSkinFile("js/xwiki/usersandgroups/img/edit.png",true)'; - edit.title = "$msg.get('edit')"; - Event.observe(edit, 'click', editUserOrGroup(userinlineurl, usersaveurl, docurl)); - edit.className = 'icon-manage'; - - manage.appendChild(edit); - manage.appendChild(del); - } - - tr.appendChild(manage); - - return tr; -} - -/** group members list element creator **/ -function displayMembers(row, i, table) -{ - var tr = document.createElement('tr'); - var membername = document.createElement("td"); - - var displayedName = document.createTextNode(row.prettyname); - if (row.wikiname == "local") { - var a = document.createElement("a"); - a.href = row.memberurl; - a.appendChild(displayedName); - membername.appendChild(a); - } else { - membername.appendChild(displayedName); - } - membername.className="username"; - tr.appendChild(membername); - - /* do not allow to delete users from a group when not in inline mode */ - if (table.action == "inline") { - var membermanage = document.createElement("td"); - membermanage.className = "manage"; - - var del = document.createElement('img'); - - if (row.grayed == "true") { - del.src = '$xwiki.getSkinFile("js/xwiki/usersandgroups/img/clearg.png",true)'; - del.className = 'icon-manageg'; - } else { - del.src = '$xwiki.getSkinFile("js/xwiki/usersandgroups/img/clear.png",true)'; - Event.observe(del, 'click', deleteMember(i, table, row.fullname, row.docurl)); - del.className = 'icon-manage'; - } - del.title = "$msg.get('delete')"; - membermanage.appendChild(del); - tr.appendChild(membermanage); - } - - return tr; -} - -/** - * User and groups list element creator. - * Used in adminglobalrights.vm, adminspacerights.vm, editrights.vm. - * @todo allows and denys should be arrays, not strings. - */ -function displayUsersAndGroups(row, i, table, idx) -{ - var userurl = row.userurl; - var uorg = table.json.uorg; - var allows = row.allows; - var denys = row.denys; - var saveUrl = "?xpage=saverights&clsname=" + table.json.clsname + "&fullname=" + row.fullname + "&uorg=" + uorg; - - var tr = document.createElement('tr'); - - var username = document.createElement('td'); - if (row.wikiname == "local") { - var a = document.createElement('a'); - a.href = userurl; - a.appendChild( document.createTextNode( row.username ) ); - username.appendChild( a ); - } else { - username.appendChild(document.createTextNode(row.username)); - } - - username.className = "username"; - tr.appendChild(username); - activeRights.each(function(right) { - if (right) - { - var td = document.createElement('td'); - td.className = "rights"; - var r = 0; - if (allows.indexOf(right) >= 0) { - r = 1; - } else if (denys.indexOf(right) >= 0) { - r = 2; - } - var chbx = new MSCheckbox(td, right, saveUrl, r, table, i); - tr.appendChild(td); - } - }); - - return tr; -} - -//////////////////////////////////////////////////////////////// - -function editUserOrGroup(userinlineurl, usersaveurl, userredirecturl) -{ - return function() { - window.lb = new Lightbox(userinlineurl, usersaveurl, userredirecturl); - } -} - - -//function to delete a user with ajax -function deleteUserOrGroup(i, table, docname, uorg) -{ - return function() { - var url = "?xpage=deleteuorg&docname=" + docname; - if (uorg == "user") { - if (confirm("$msg.get('rightsmanager.confirmdeleteuser').replaceAll('"', '\\"')".replace('__name__', docname))) { - new Ajax.Request(url, { - method: 'get', - onSuccess: function(transport) { - table.deleteRow(i); - } - }); - } - } else { - if (confirm("$msg.get('rightsmanager.confirmdeletegroup').replaceAll('"', '\\"')".replace('__name__', docname))) { - new Ajax.Request(url, { - method: 'get', - onSuccess: function(transport) { - table.deleteRow(i); - } - }); - } - } - } -} - -//deletes a member of a group (only the object) -function deleteMember(i, table, docname, docurl) -{ - return function() { - var url = docurl + "?xpage=deletegroupmember&fullname=" + docname; - if (confirm("$msg.get('rightsmanager.confirmdeletemember').replaceAll('"', '\\"')")) { - new Ajax.Request(url, { - method: 'get', - onSuccess: function(transport) { - table.deleteRow(i); - } - }); - } - } -} - -function makeAddHandler(url, saveurl, redirecturl) -{ - return function() { - window.lb = new Lightbox(url, saveurl, redirecturl); - } -} - -function setGuestExtendedRights(self) -{ - return function() { - var url = '$xwiki.getURL("XWiki.XWikiPreferences", "save")'; - var pivot = self; - if (self.getAttribute('alt') == "yes") { - if (self.id.indexOf('view') > 0) { - new Ajax.Request(url, { - method: 'post', - parameters: {"XWiki.XWikiPreferences_0_authenticate_view" : "0"}, - onSuccess: function() { - pivot.alt = "no"; - pivot.src = "$xwiki.getSkinFile('js/xwiki/usersandgroups/img/none.png',true)"; - }}); - } else { - new Ajax.Request(url, { - method: 'post', - parameters: {"XWiki.XWikiPreferences_0_authenticate_edit" : "0"}, - onSuccess: function() { - pivot.alt = "no"; - pivot.src = "$xwiki.getSkinFile('js/xwiki/usersandgroups/img/none.png',true)"; - }}); - } - } else { - if (self.id.indexOf('view') > 0) { - new Ajax.Request(url, { - method: 'post', - parameters: {"XWiki.XWikiPreferences_0_authenticate_view" : "1"}, - onSuccess: function() { - pivot.alt = "yes"; - pivot.src = "$xwiki.getSkinFile('js/xwiki/usersandgroups/img/allow-black.png',true)"; - }}); - } else { - new Ajax.Request(url, { - method: 'post', - parameters: {"XWiki.XWikiPreferences_0_authenticate_edit" : "1"}, - onSuccess: function() { - pivot.alt = "yes"; - pivot.src = "$xwiki.getSkinFile('js/xwiki/usersandgroups/img/allow-black.png',true)"; - }}); - } - } - } -} diff --git a/src/main/webapp/resources/js/xwiki/viewers/attachments.css b/src/main/webapp/resources/js/xwiki/viewers/attachments.css index 5951d0ff6..bb466f476 100644 --- a/src/main/webapp/resources/js/xwiki/viewers/attachments.css +++ b/src/main/webapp/resources/js/xwiki/viewers/attachments.css @@ -1,10 +1,49 @@ -.attachmentActionButton{background-color:transparent;border:none;padding:2px 4px;font-size:80%;margin-bottom:4px;background:transparent 2px center no-repeat;padding-left:20px;} -.add-file-input{margin-left:10px;background-position:2px top;background-image:url($xwiki.getSkinFile('icons/silk/textfield_add.gif', true));} -.add-file-input:hover{color:#070;} -.remove-file-input{background-image:url($xwiki.getSkinFile('icons/silk/cross.gif', true));width:16px;text-indent:30px;} -.remove-file-input:hover{color:#D00;} -.uploadFileInput{margin:5px 10px!important;border:1px solid #ddd!important;} -.attachment .xwikibuttonlinks a{width:16px;height:16px;text-indent:30px;line-height:30px;overflow:hidden;background:transparent left top no-repeat;display:block;float:right;margin:0 0 0 4px;} -.attachment .xwikibuttonlinks a.deletelink{background-image:url($xwiki.getSkinFile('icons/silk/cross.gif', true));} -.attachment .xwikibuttonlinks a.editlink{background-image:url($xwiki.getSkinFile('icons/silk/pencil.gif', true));} -#AddAttachment{border-top:1px solid #DDD;} \ No newline at end of file +.attachmentActionButton { + background-color: transparent; + border: none; + padding: 2px 4px; + font-size: 80%; + margin-bottom: 4px; + background: transparent 2px center no-repeat; + padding-left: 20px; +} +.add-file-input { + margin-left: 10px; + background-position: 2px top; + background-image: url(/skin/resources/icons/silk/textfield_add.gif); +} +.add-file-input:hover { + color: #070; +} +.remove-file-input { + background-image: url(/skin/resources/icons/silk/cross.gif); + width: 16px; + text-indent: 30px; +} +.remove-file-input:hover { + color: #d00; +} +.uploadFileInput { + margin: 5px 10px !important; + border: 1px solid #ddd !important; +} +.attachment .xwikibuttonlinks a { + width: 16px; + height: 16px; + text-indent: 30px; + line-height: 30px; + overflow: hidden; + background: transparent left top no-repeat; + display: block; + float: right; + margin: 0 0 0 4px; +} +.attachment .xwikibuttonlinks a.deletelink { + background-image: url(/skin/resources/icons/silk/cross.gif); +} +.attachment .xwikibuttonlinks a.editlink { + background-image: url(/skin/resources/icons/silk/pencil.gif); +} +#AddAttachment { + border-top: 1px solid #ddd; +} diff --git a/src/main/webapp/resources/js/xwiki/viewers/attachments.js b/src/main/webapp/resources/js/xwiki/viewers/attachments.js index f59ea42ca..c80192198 100644 --- a/src/main/webapp/resources/js/xwiki/viewers/attachments.js +++ b/src/main/webapp/resources/js/xwiki/viewers/attachments.js @@ -1,190 +1,197 @@ var XWiki = (function (XWiki) { -// Start XWiki augmentation. -var viewers = XWiki.viewers = XWiki.viewers || {}; -/** - * Enhancements for the Attachment upload area: adding and removing file fields, resetting with the Cancel button, - * preventing submit if no files are selected. - */ -viewers.Attachments = Class.create({ - /** Counter for creating distinct upload field names. */ - counter : 1, - /** Constructor. Adds all the JS improvements of the Attachment area. */ - initialize : function() { - if ($("attachform")) { - // Listeners for AJAX attachment deletion - this.addDeleteListener(); - // If the upload form is already visible, enhance it. - this.prepareForm(); - } else { - // Otherwise, we wait for a notification for the AJAX loading of the Attachments metadata tab. - this.addTabLoadListener(); - } - }, + let translations = {}; + if (window.celExecOnceAfterMessagesLoaded) { + window.celExecOnceAfterMessagesLoaded( + celMessages => translations = celMessages.attachments + ); + } else { + console.warn('celExecOnceAfterMessagesLoaded not available!'); + } + // Start XWiki augmentation. + var viewers = XWiki.viewers = XWiki.viewers || {}; /** - * Ajax attachment deletion. - * For all delete buttons, listen to "click", and make ajax request to remove the attachment. Remove the corresponding - * HTML element on succes. Display error message (alert) on failure. + * Enhancements for the Attachment upload area: adding and removing file fields, resetting with the Cancel button, + * preventing submit if no files are selected. */ - addDeleteListener : function() { - $$('.attachment a.deletelink').each(function(item) { - item.observe('click', function(event) { - item.blur(); - event.stop(); - if (item.disabled) { - // Do nothing if the button was already clicked and it's waiting for a response from the server. - return; - } else { - new XWiki.widgets.ConfirmedAjaxRequest( - /* Ajax request URL */ - item.readAttribute('href') + (Prototype.Browser.Opera ? "" : "&ajax=1"), - /* Ajax request parameters */ - { - onCreate : function() { - // Disable the button, to avoid a cascade of clicks from impatient users - item.disabled = true; + viewers.Attachments = Class.create({ + /** Counter for creating distinct upload field names. */ + counter : 1, + /** Constructor. Adds all the JS improvements of the Attachment area. */ + initialize : function() { + if ($("attachform")) { + // Listeners for AJAX attachment deletion + this.addDeleteListener(); + // If the upload form is already visible, enhance it. + this.prepareForm(); + } else { + // Otherwise, we wait for a notification for the AJAX loading of the Attachments metadata tab. + this.addTabLoadListener(); + } + }, + /** + * Ajax attachment deletion. + * For all delete buttons, listen to "click", and make ajax request to remove the attachment. Remove the corresponding + * HTML element on succes. Display error message (alert) on failure. + */ + addDeleteListener : function() { + $$('.attachment a.deletelink').each(function(item) { + item.observe('click', function(event) { + item.blur(); + event.stop(); + if (item.disabled) { + // Do nothing if the button was already clicked and it's waiting for a response from the server. + return; + } else { + new XWiki.widgets.ConfirmedAjaxRequest( + /* Ajax request URL */ + item.readAttribute('href') + (Prototype.Browser.Opera ? "" : "&ajax=1"), + /* Ajax request parameters */ + { + onCreate : function() { + // Disable the button, to avoid a cascade of clicks from impatient users + item.disabled = true; + }, + onSuccess : function() { + // Remove the corresponding HTML element from the UI and update the attachment count + item.up(".attachment").remove(); + this.updateCount(); + }.bind(this), + onComplete : function() { + // In the end: re-inable the button + item.disabled = false; + } }, - onSuccess : function() { - // Remove the corresponding HTML element from the UI and update the attachment count - item.up(".attachment").remove(); - this.updateCount(); - }.bind(this), - onComplete : function() { - // In the end: re-inable the button - item.disabled = false; + /* Interaction parameters */ + { + confirmationText: translations.deleteConfirm, + progressMessageText : translations.deleteInProgress, + successMessageText : translations.deleteDone, + failureMessageText : translations.deleteFailed } - }, - /* Interaction parameters */ - { - confirmationText: "$msg.get('core.viewers.attachments.delete.confirm')", - progressMessageText : "$msg.get('core.viewers.attachments.delete.inProgress')", - successMessageText : "$msg.get('core.viewers.attachments.delete.done')", - failureMessageText : "$msg.get('core.viewers.attachments.delete.failed')" - } - ); + ); + } + }.bindAsEventListener(this)); + }.bind(this)); + }, + updateCount : function() { + if ($("Attachmentstab") && $("Attachmentstab").down(".itemCount")) { + $("Attachmentstab").down(".itemCount").update(translations["extranb"].replace("__number__", $("Attachmentspane").select(".attachment").size())); } + if ($("attachmentsshortcut") && $("attachmentsshortcut").down(".itemCount")) { + $("attachmentsshortcut").down(".itemCount").update(translations["extranb"].replace("__number__", $("Attachmentspane").select(".attachment").size())); + } + }, + /** Enhance the upload form with JS behaviors. */ + prepareForm : function() { + if (!$("attachform")) { + return; + } + this.form = $("attachform").up("form"); + this.defaultFileDiv = this.form.down("input[type='file']").up("div"); + this.inputSize = this.form.down("input[type='file']").size; + this.addInitialRemoveButton(); + this.addAddButton(); + this.blockEmptySubmit(); + this.resetOnCancel(); + }, + /** By default the form contains one upload field. Add a "remove" button for this one, too. */ + addInitialRemoveButton : function() { + this.defaultFileDiv.appendChild(this.createRemoveButton()); + }, + /** Add an "Add another file" button below the file fields. */ + addAddButton : function() { + var addButton = new Element("input", { + type: "button", + value: translations.addFileInput, + className: "attachmentActionButton add-file-input" + }); + this.addDiv = new Element("div"); + this.addDiv.appendChild(addButton); + Event.observe(addButton, 'click', this.addField.bindAsEventListener(this)); + this.defaultFileDiv.up().insertBefore(this.addDiv, this.defaultFileDiv.next()); + }, + /** Add a submit listener that prevents submitting the form if no file was specified. */ + blockEmptySubmit : function() { + Event.observe(this.form, 'submit', this.onSubmit.bindAsEventListener(this)); + }, + /** Add a reset listener that resets the number of file fields to 1. */ + resetOnCancel : function() { + Event.observe(this.form, 'reset', this.onReset.bindAsEventListener(this)); + Event.observe(this.form.down('.cancel'), 'click', this.onReset.bindAsEventListener(this)); + }, + /** Creates and inserts a new file input field. */ + addField : function(event) { + var fileInput = new Element("input", { + type: "file", + name: "filepath_" + this.counter, + size: this.inputSize, + className: "uploadFileInput" + }); + // For the moment, specifying a different name is not used anymore. + var filenameInput = new Element("input", {type: "hidden", name : "filename_" + this.counter}); + var removeButton = this.createRemoveButton(); + var containerDiv = new Element("div"); + containerDiv.insert(filenameInput).insert(fileInput).insert(removeButton); + this.addDiv.parentNode.insertBefore(containerDiv, this.addDiv); + // Remove the focus border from the button + event.element().blur(); + this.counter++; + }, + /** Remove a file field when pressing the corresponding "Remove" button. */ + removeField : function(event) { + event.element().up("div").remove(); + }, + /** Create a remove button that triggers {@link #removeField} when clicked. */ + createRemoveButton : function() { + var removeButton = new Element("input", { + type: "button", + value: translations.removeFileInput, + title: translations.removeFileInputTitle, + className: "attachmentActionButton remove-file-input" + }); + Event.observe(removeButton, "click", this.removeField.bindAsEventListener(this)); + return removeButton; + }, + /** Form submit listener. It checks that at least one file item contains a filename. If not, cancel the submission. */ + onSubmit : function(event) { + var hasFiles = false; + this.form.getInputs("file").each(function(item) { + if(item.value != '') { + hasFiles = true; } - }.bindAsEventListener(this)); - }.bind(this)); - }, - updateCount : function() { - if ($("Attachmentstab") && $("Attachmentstab").down(".itemCount")) { - $("Attachmentstab").down(".itemCount").update("$msg.get('docextra.extranb', ['__number__'])".replace("__number__", $("Attachmentspane").select(".attachment").size())); - } - if ($("attachmentsshortcut") && $("attachmentsshortcut").down(".itemCount")) { - $("attachmentsshortcut").down(".itemCount").update("$msg.get('docextra.extranb', ['__number__'])".replace("__number__", $("Attachmentspane").select(".attachment").size())); - } - }, - /** Enhance the upload form with JS behaviors. */ - prepareForm : function() { - if (!$("attachform")) { - return; - } - this.form = $("attachform").up("form"); - this.defaultFileDiv = this.form.down("input[type='file']").up("div"); - this.inputSize = this.form.down("input[type='file']").size; - this.addInitialRemoveButton(); - this.addAddButton(); - this.blockEmptySubmit(); - this.resetOnCancel(); - }, - /** By default the form contains one upload field. Add a "remove" button for this one, too. */ - addInitialRemoveButton : function() { - this.defaultFileDiv.appendChild(this.createRemoveButton()); - }, - /** Add an "Add another file" button below the file fields. */ - addAddButton : function() { - var addButton = new Element("input", { - type: "button", - value: "$msg.get('core.viewers.attachments.upload.addFileInput')", - className: "attachmentActionButton add-file-input" - }); - this.addDiv = new Element("div"); - this.addDiv.appendChild(addButton); - Event.observe(addButton, 'click', this.addField.bindAsEventListener(this)); - this.defaultFileDiv.up().insertBefore(this.addDiv, this.defaultFileDiv.next()); - }, - /** Add a submit listener that prevents submitting the form if no file was specified. */ - blockEmptySubmit : function() { - Event.observe(this.form, 'submit', this.onSubmit.bindAsEventListener(this)); - }, - /** Add a reset listener that resets the number of file fields to 1. */ - resetOnCancel : function() { - Event.observe(this.form, 'reset', this.onReset.bindAsEventListener(this)); - Event.observe(this.form.down('.cancel'), 'click', this.onReset.bindAsEventListener(this)); - }, - /** Creates and inserts a new file input field. */ - addField : function(event) { - var fileInput = new Element("input", { - type: "file", - name: "filepath_" + this.counter, - size: this.inputSize, - className: "uploadFileInput" - }); - // For the moment, specifying a different name is not used anymore. - var filenameInput = new Element("input", {type: "hidden", name : "filename_" + this.counter}); - var removeButton = this.createRemoveButton(); - var containerDiv = new Element("div"); - containerDiv.insert(filenameInput).insert(fileInput).insert(removeButton); - this.addDiv.parentNode.insertBefore(containerDiv, this.addDiv); - // Remove the focus border from the button - event.element().blur(); - this.counter++; - }, - /** Remove a file field when pressing the corresponding "Remove" button. */ - removeField : function(event) { - event.element().up("div").remove(); - }, - /** Create a remove button that triggers {@link #removeField} when clicked. */ - createRemoveButton : function() { - var removeButton = new Element("input", { - type: "button", - value: "$msg.get('core.viewers.attachments.upload.removeFileInput')", - title: "$msg.get('core.viewers.attachments.upload.removeFileInput.title')", - className: "attachmentActionButton remove-file-input" - }); - Event.observe(removeButton, "click", this.removeField.bindAsEventListener(this)); - return removeButton; - }, - /** Form submit listener. It checks that at least one file item contains a filename. If not, cancel the submission. */ - onSubmit : function(event) { - var hasFiles = false; - this.form.getInputs("file").each(function(item) { - if(item.value != '') { - hasFiles = true; + }); + if(!hasFiles) { + event.stop(); } - }); - if(!hasFiles) { - event.stop(); - } - }, - /** Form reset listener. It resets the number of file fields to just one. */ - onReset : function(event) { - if (event) { - event.stop(); - } - this.form.getInputs("file").each(function(item) { - item.up().remove(); - }); - this.counter = 1; - this.addField(event); - }, - /** - * Registers a listener that watches for the insertion of the Attachments tab and triggers the form enhancement. - * After that, the listener removes itself, since it is no longer needed. - */ - addTabLoadListener : function(event) { - var listener = function(event) { - if (event.memo.id == 'Attachments') { - this.addDeleteListener(); - this.prepareForm(); - document.stopObserving("xwiki:docextra:loaded", listener); - delete listener; + }, + /** Form reset listener. It resets the number of file fields to just one. */ + onReset : function(event) { + if (event) { + event.stop(); } - }.bindAsEventListener(this); - document.observe("xwiki:docextra:loaded", listener); - } -}); -// End XWiki augmentation. -return XWiki; + this.form.getInputs("file").each(function(item) { + item.up().remove(); + }); + this.counter = 1; + this.addField(event); + }, + /** + * Registers a listener that watches for the insertion of the Attachments tab and triggers the form enhancement. + * After that, the listener removes itself, since it is no longer needed. + */ + addTabLoadListener : function(event) { + var listener = function(event) { + if (event.memo.id == 'Attachments') { + this.addDeleteListener(); + this.prepareForm(); + document.stopObserving("xwiki:docextra:loaded", listener); + delete listener; + } + }.bindAsEventListener(this); + document.observe("xwiki:docextra:loaded", listener); + } + }); + // End XWiki augmentation. + return XWiki; }(XWiki || {})); // When the document is loaded, trigger the attachment form enhancements. diff --git a/src/main/webapp/resources/js/xwiki/widgets/jumpToPage.css b/src/main/webapp/resources/js/xwiki/widgets/jumpToPage.css deleted file mode 100644 index 4f3405545..000000000 --- a/src/main/webapp/resources/js/xwiki/widgets/jumpToPage.css +++ /dev/null @@ -1,20 +0,0 @@ -.xdialog-box .buttons { - margin-top: 10px; - text-align: right; -} - -.xdialog-box #jmp_target { - width: 98%; - padding: 1px 2px; -} - -/* The "Jump to any page..." text inserted in the QuickLinks panel */ -.jmp-activator { - cursor: pointer; - font-size: 80%; - font-weight: 900; -} - -.jmp-activator:hover { - text-decoration: underline; -} \ No newline at end of file diff --git a/src/main/webapp/resources/js/xwiki/widgets/jumpToPage.js b/src/main/webapp/resources/js/xwiki/widgets/jumpToPage.js deleted file mode 100644 index f4744602d..000000000 --- a/src/main/webapp/resources/js/xwiki/widgets/jumpToPage.js +++ /dev/null @@ -1,109 +0,0 @@ -// Make sure the XWiki 'namespace' and the ModalPopup class exist. -if(typeof(XWiki) == "undefined" || typeof(XWiki.widgets) == "undefined" || typeof(XWiki.widgets.ModalPopup) == "undefined") { - if (typeof console != "undefined" && typeof console.warn == "function") { - console.warn("[JumpToPage widget] Required class missing: XWiki.widgets.ModalPopup"); - } -} else { -/** - * "Jump to page" behavior. Allows the users to jump to any other page by pressing a shortcut, entering a page name, and - * pressing enter. It also enables a Suggest behavior on the document name selector, for easier selection. - */ -XWiki.widgets.JumpToPage = Class.create(XWiki.widgets.ModalPopup, { - /** The template of the XWiki URL. */ - urlTemplate : "$xwiki.getURL('__space__.__document__', '__action__')", - /** Constructor. Registers the key listener that pops up the dialog. */ - initialize : function($super) { - var content = new Element("div"); - this.input = new Element("input", { - "type" : "text", - "id" : "jmp_target", - "title" : "$msg.get('core.viewers.jump.dialog.input.tooltip')" - }); - content.appendChild(this.input); - this.viewButton = this.createButton("button", "$msg.get('core.viewers.jump.dialog.actions.view')", "$msg.get('core.viewers.jump.dialog.actions.view.tooltip')", "jmp_view"); - this.editButton = this.createButton("button", "$msg.get('core.viewers.jump.dialog.actions.edit')", "$msg.get('core.viewers.jump.dialog.actions.edit.tooltip')", "jmp_edit"); - var buttonContainer = new Element("div", {"class" : "buttons"}); - buttonContainer.appendChild(this.viewButton); - buttonContainer.appendChild(this.editButton); - content.appendChild(buttonContainer); - $super( - content, - { - "show" : { method : this.showDialog, keys : [$msg.get('core.viewers.jump.shortcuts')] }, - "view" : { method : this.openDocument, keys : [$msg.get('core.viewers.jump.dialog.actions.view.shortcuts')] }, - "edit" : { method : this.openDocument, keys : [$msg.get('core.viewers.jump.dialog.actions.edit.shortcuts')] } - }, - { - title : "$msg.get('core.viewers.jump.dialog.content')", - verticalPosition : "top" - } - ); - this.addQuickLinksEntry(); - }, - /** - * Callback called when the UI was fully retrieved and inserted. Adds listeners to the buttons, enables the suggest, - * and forwards the call to the {@link #showDialog} method. - */ - createDialog : function($super, event) { - // Register the listeners executed when clicking on the buttons. - Event.observe(this.viewButton, 'click', this.openDocument.bindAsEventListener(this, "view")); - Event.observe(this.editButton, 'click', this.openDocument.bindAsEventListener(this, "edit")); - $super(event); - if (typeof(XWiki.widgets.Suggest) != "undefined") { - // Create the Suggest. - new XWiki.widgets.Suggest(this.input, { - // This document also provides the suggestions. - script: "${request.contextPath}/rest/wikis/${context.database}/search?scope=name&number=10&media=json&", - // Prefixed with & since the current (as of 1.7) Suggest code does not automatically append it. - varname: "q", - noresults: "$msg.get('core.viewers.jump.suggest.noResults')", - icon: "${xwiki.getSkinFile('icons/silk/page_white_text.gif')}", - json: true, - resultsParameter : "searchResults", - resultId : "id", - resultValue : "pageFullName", - resultInfo : "pageFullName", - timeout : 30000, - parentContainer : this.dialog - }); - } - }, - /** Called when the dialog is displayed. Enables the key listeners and gives focus to the (cleared) input. */ - showDialog : function($super) { - // Display the dialog - $super(); - // Clear the input field - this.input.value = ''; - // Focus the input field - this.input.focus(); - }, - /** - * Open the selected document in the specified mode. - * - * @param {Event} event The event that triggered this action. Either a keyboard shortcut or a button click. - * @param {String} mode The mode that the document should be opened in. One of "view" or "edit". Note that on the - * server side, "edit" could be replaced with "inline" if the document is sheet-based. - */ - openDocument : function(event, mode) { - if (!$('as_jmp_target') && this.input.value != "") { - Event.stop(event); - window.self.location = this.urlTemplate.replace("__space__/__document__", this.input.value.replace(".", "/")).replace("__action__", mode); - } - }, - addQuickLinksEntry : function() { - $$(".panel.QuickLinks .xwikipanelcontents").each(function(item) { - var jumpToPageActivator = new Element('span', {'class': "jmp-activator"}); - jumpToPageActivator.update("$msg.get('core.viewers.jump.quickLinksText')"); - Event.observe(jumpToPageActivator, "click", function(event) { - this.showDialog(event); - }.bindAsEventListener(this)); - item.appendChild(jumpToPageActivator); - }.bind(this)); - } -}); - -// When the document is loaded, enable the keyboard listener that triggers the dialog. -document.observe("xwiki:dom:loaded", function() { - new XWiki.widgets.JumpToPage(); -}); -} // if the parent widget is defined \ No newline at end of file diff --git a/src/main/webapp/resources/js/xwiki/widgets/modalPopup.css b/src/main/webapp/resources/js/xwiki/widgets/modalPopup.css index 22bab76f0..bc4860075 100644 --- a/src/main/webapp/resources/js/xwiki/widgets/modalPopup.css +++ b/src/main/webapp/resources/js/xwiki/widgets/modalPopup.css @@ -1,4 +1,4 @@ -#template('colorThemeInit.vm') +@import "/file/resources/celRes/theme/defaultColors.css"; .xdialog-modal-container { position: fixed; top: 0px; @@ -31,9 +31,9 @@ margin: auto; position: relative; width: 400px; - color: $theme.textColor; - border: 2px solid $theme.borderColor; - background-color: $theme.backgroundSecondaryColor; + color: var(--textColor); + border: 2px solid var(--borderColor); + background-color: var(--backgroundSecondaryColor); } .xdialog-close { float: right; @@ -47,7 +47,7 @@ text-transform: lowercase; font-family: Arial, Helvetica, sans-serif; line-height: 8px; - color: $theme.textColor; + color: var(--textColor); } * html .xdialog-close { width: 22px; @@ -57,5 +57,5 @@ font-weight: bold; margin-top: -5px; margin-bottom: 10px; - color: $theme.textColor; -} \ No newline at end of file + color: var(--textColor); +} diff --git a/src/main/webapp/resources/js/xwiki/wysiwyg/xwe/XWikiWysiwyg.js b/src/main/webapp/resources/js/xwiki/wysiwyg/xwe/XWikiWysiwyg.js deleted file mode 100644 index d4ea4b329..000000000 --- a/src/main/webapp/resources/js/xwiki/wysiwyg/xwe/XWikiWysiwyg.js +++ /dev/null @@ -1,234 +0,0 @@ -## The module name must match the value of the rename-to attribute from Wysiwyg.gwt.xml -#set($moduleName = "xwe") -/** - * XWiki's custom WYSIWYG controller. - * Usage: \$xwiki.jsfx.use("path/to/XWikiWysiwyg.js", {'forceSkinAction': true, 'lazy': true}) - * - * @type object - * @param lazy {@code true} if you want to load the WYSIWYG code on demand, {@code false} if you want to load the - * WYSIWYG code when the page is loaded - */ -var Wysiwyg = -{ - /** - * This is the entry pointy for XWiki GWT services. - * - * @see web.xml - */ - xwikiservice: '${request.contextPath}/XWikiService', - - /** - * This is the entry pointy for the new WYSIWYG's GWT services. - * - * @see web.xml - */ - wysiwygServiceURL: '${request.contextPath}/WysiwygService', - - /** - * Indicates the state of the WYSIWYG GWT module. Possible values are: 0 (uninitialized), 1 (loading), 2 (loaded). - */ - readyState: 0, - - /** - * The queue of functions to execute after the WYSIWYG module is loaded. - */ - onModuleLoadQueue: [], - - /** - * Loads the WYSIWYG code on demand. - */ - load : function() - { - // Test if the code has been already loaded. - // GWT loads the WYSIWYG code in an in-line frame with the 'com.xpn.xwiki.wysiwyg.Wysiwyg' id. - if (document.getElementById('${moduleName}') || this.readyState != 0) { - return; - } - - // Start loading the WYSIWYG GWT module. - this.readyState = 1; - - // Create the script tag to be used for importing the GWT script loader. - var script = document.createElement('script'); - script.type = 'text/javascript'; - script.src = '$xwiki.getSkinFile("js/xwiki/wysiwyg/${moduleName}/${moduleName}.nocache.js", true)'; - - // The default GWT script loader calls document.write() twice which prevents us from loading the WYSIWYG code - // on demand, after the document has been loaded. To overcome this we have to overwrite the document.write() - // method before the GWT script loader is executed and restore it after. - // NOTE: The GWT script loader uses document.write() to compute the URL from where it is loaded. - var counter = 0; - var limit = 2; - var oldWrite = document.write; - var newWrite = function(html) { - if (counter < limit) { - counter++; - // Try to wrap onScriptLoad in order to be notified when the WYSIWYG script is loaded. - Wysiwyg.maybeHookOnScriptLoad(); - // Fail silently if the script element hasn't been attached to the document. - if (!script.parentNode) { - return; - } - // Create a DIV and put the HTML inside. - var div = document.createElement('div'); - // We have to replace all the script tags because otherwise IE drops them. - div.innerHTML = html.replace(//gi, "
");
-                // Move DIV contents after the GWT script loader.
-                var nextSibling = script.nextSibling;
-                while(div.firstChild) {
-                    var child = div.firstChild;
-                    // Recover the script tags.
-                    if (child.nodeName.toLowerCase() == 'pre' && child.getAttribute('script') == 'script') {
-                        var pre = child;
-                        pre.removeAttribute('script');
-                        // Create the script tag.
-                        child = document.createElement('script');
-                        // Copy all the attributes.
-                        for (var i = 0; i < pre.attributes.length; i++) {
-                            var attrNode = pre.attributes[i];
-                            // In case of IE we have to copy only the specified attributes.
-                            if (typeof attrNode.specified == 'undefined'
-                                || (typeof attrNode.specified == 'boolean' && attrNode.specified)) {
-                                child.setAttribute(attrNode.nodeName, attrNode.nodeValue);
-                            }
-                        }
-                        // Copy the script text.
-                        child.text = typeof pre.innerText == 'undefined' ? pre.textContent : pre.innerText;
-                        // Don't forget to remove the placeholder.
-                        div.removeChild(pre);
-                    }
-                    if (nextSibling) {
-                        script.parentNode.insertBefore(child, nextSibling);
-                    } else {
-                        script.parentNode.appendChild(child);
-                    }
-                }
-            }
-            if (counter >= limit) {
-                document.write = oldWrite;
-                oldWrite = undefined;
-                script = undefined;
-                counter = undefined;
-            }
-        }
-
-        // Append the script tag to the head.
-        var heads = document.getElementsByTagName('head');
-        if (heads.length > 0) {
-            document.write = newWrite;
-            heads[0].appendChild(script);
-        }
-    },
-
-    /**
-     * Schedules a function to be executed after the WYSIWYG module is loaded. A call to this method forces the WYSIWYG
-     * module to be loaded, unless the second parameter, {@code lazy}, is set to {@code true}.
-     *
-     * @param fCode a function
-     * @param lazy {@code true} to prevent loading the WYSIWYG module at this point, {@code false} otherwise
-     */
-    onModuleLoad: function(fCode, lazy) {
-        if (typeof fCode != 'function') {
-            return;
-        }
-        switch (this.readyState) {
-            // uninitialized
-            case 0:
-                if (!lazy) {
-                    this.load();
-                }
-                // fall-through
-
-            // loading
-            case 1:
-                this.onModuleLoadQueue.push(fCode);
-                break;
-
-            // loaded
-            case 2:
-                fCode();
-                break; 
-        }
-    },
-
-    /**
-     * Executes all the functions scheduled from on module load.
-     */
-    fireOnModuleLoad: function() {
-        // The WYSIWYG module has been loaded successfully.
-        this.readyState = 2;
-
-        // Execute all the scheduled functions.
-        for (var i = 0; i < this.onModuleLoadQueue.length; i++) {
-            this.onModuleLoadQueue[i]();
-        }
-
-        // There's no need to schedule functions anymore. They will be execute immediately. 
-        this.onModuleLoadQueue = undefined;
-    },
-
-    /**
-     * Try to wrap onScriptLoad in order to be notified when the WYSIWYG script is loaded.
-     */
-    maybeHookOnScriptLoad: function() {
-        if (${moduleName} && ${moduleName}.onScriptLoad) {
-            var onScriptLoad = ${moduleName}.onScriptLoad;
-            ${moduleName}.onScriptLoad = function() {
-                Wysiwyg.hookGwtOnLoad();
-                onScriptLoad();
-
-                // Restore the default onScriptLoad function.
-                if (${moduleName} && ${moduleName}.onScriptLoad) {
-                    ${moduleName}.onScriptLoad = onScriptLoad;
-                }
-                onScriptLoad = undefined;
-            }
-
-            // Prevent further calls to this method.
-            this.maybeHookOnScriptLoad = function(){};
-        }
-    },
-
-    /**
-     * Wrap gwtOnLoad in order to be notified when the WYSIWYG module is loaded.
-     */
-    hookGwtOnLoad: function() {
-        var iframe = document.getElementById('${moduleName}');
-        var gwtOnLoad = iframe.contentWindow.gwtOnLoad;
-        iframe.contentWindow.gwtOnLoad = function(errFn, modName, modBase) {
-            gwtOnLoad(function() {
-                Wysiwyg.fireOnModuleLoad = function(){};
-                if (typeof errFn == 'function') {
-                    errFn();
-                }
-            }, modName, modBase);
-            Wysiwyg.fireOnModuleLoad();
-
-            // Restore the default gwtOnLoad function.
-            iframe.contentWindow.gwtOnLoad = gwtOnLoad;
-            iframe = undefined;
-            gwtOnLoad = undefined;
-        }
-
-        // Prevent further calls to this method.
-        this.hookGwtOnLoad = function(){};
-    }
-};
-
-// Enhance the WysiwygEditor class with custom events.
-Wysiwyg.onModuleLoad(function() {
-    var WysiwygEditorAspect = function() {
-        WysiwygEditorAspect.base.constructor.apply(this, arguments);
-        if (this.getRichTextArea()) {
-            // If the editor was successfully created then fire a custom event.
-            document.fire('xwiki:wysiwyg:created', {'instance': this});
-        }
-    }
-    WysiwygEditorAspect.prototype = new WysiwygEditor;
-    WysiwygEditorAspect.base = WysiwygEditor.prototype;
-    WysiwygEditor = WysiwygEditorAspect;
-}, true);
-
-#if("$!request.lazy" != "true")
-Wysiwyg.load();
-#end
\ No newline at end of file
diff --git a/src/main/webapp/resources/js/xwiki/xwiki-misc.js b/src/main/webapp/resources/js/xwiki/xwiki-misc.js
new file mode 100644
index 000000000..f6e9bce2d
--- /dev/null
+++ b/src/main/webapp/resources/js/xwiki/xwiki-misc.js
@@ -0,0 +1,20 @@
+/** this are js-snippets moved to disk from xwiki-sheets on
+ * dropping skinx plugins **/
+document.addEventListener("DOMContentLoaded", function () {
+  const switcher = document.getElementById("classname");
+  if (switcher) {
+    switcher.addEventListener("change", function () {
+      const value = this.options[this.selectedIndex].value;
+      if (value !== "-") {
+        window.location = value;
+      }
+    });
+    const form = switcher.closest("form");
+    if (form) {
+      const submit = form.querySelector("input[type='submit']");
+      if (submit) {
+        submit.style.display = "none";
+      }
+    }
+  }
+});
diff --git a/src/main/webapp/resources/js/xwiki/xwiki.js b/src/main/webapp/resources/js/xwiki/xwiki.js
index 6b078ee4d..3f7ce7aa7 100644
--- a/src/main/webapp/resources/js/xwiki/xwiki.js
+++ b/src/main/webapp/resources/js/xwiki/xwiki.js
@@ -7,9 +7,11 @@ var XWiki = (function (XWiki) {
    */
 
   Object.extend(XWiki, {
-
+    messages: {
+      translations: {},
+      celMeta: {},
+    },
     constants: {
-
       /**
        * Character that separates wiki from space in a page fullName (example: xwiki:Main.WebHome).
        */
@@ -48,18 +50,20 @@ var XWiki = (function (XWiki) {
       /**
        * URL Anchor for page comments.
        */
-      docextraInformationAnchor: "Information"
+      docextraInformationAnchor: "Information",
     },
 
     resource: {
-
       /**
        * Extract the name of the wiki from a resource name. Examples: returns "xwiki" with "xwiki:Main.WebHome",
        * returns null with "Main.WebHome".
        */
       getWikiFromResourceName: function (name) {
         if (name.include(XWiki.constants.wikiSpaceSeparator)) {
-          return name.substring(0, name.indexOf(XWiki.constants.wikiSpaceSeparator));
+          return name.substring(
+            0,
+            name.indexOf(XWiki.constants.wikiSpaceSeparator),
+          );
         }
         return null;
       },
@@ -72,20 +76,31 @@ var XWiki = (function (XWiki) {
         var originalName = name;
         // Remove wiki if any.
         if (name.include(XWiki.constants.wikiSpaceSeparator)) {
-          name = name.substring(name.indexOf(XWiki.constants.wikiSpaceSeparator) + 1, name.length);
+          name = name.substring(
+            name.indexOf(XWiki.constants.wikiSpaceSeparator) + 1,
+            name.length,
+          );
         }
         // If the resource contains an attachment, make sure the dot is not part of the attachment name.
         if (name.include(XWiki.constants.spacePageSeparator)) {
-          if (name.include(XWiki.constants.pageAttachmentSeparator) && name.indexOf(XWiki.constants.spacePageSeparator)
-            > name.indexOf(XWiki.constants.pageAttachmentSeparator)) {
+          if (
+            name.include(XWiki.constants.pageAttachmentSeparator) &&
+            name.indexOf(XWiki.constants.spacePageSeparator) >
+            name.indexOf(XWiki.constants.pageAttachmentSeparator)
+          ) {
             return null;
           }
-          return name.substring(0, name.indexOf(XWiki.constants.spacePageSeparator));
+          return name.substring(
+            0,
+            name.indexOf(XWiki.constants.spacePageSeparator),
+          );
         }
         // If the resource name looks like "xwiki:Main" we return "Main".
-        if (originalName.include(XWiki.constants.wikiSpaceSeparator)
-          && !originalName.include(XWiki.constants.pageAttachmentSeparator)
-          && !originalName.include(XWiki.constants.anchorSeparator)) {
+        if (
+          originalName.include(XWiki.constants.wikiSpaceSeparator) &&
+          !originalName.include(XWiki.constants.pageAttachmentSeparator) &&
+          !originalName.include(XWiki.constants.anchorSeparator)
+        ) {
           return name;
         }
         return null;
@@ -99,18 +114,30 @@ var XWiki = (function (XWiki) {
         var originalName = name;
         // Remove wiki if any.
         if (name.include(XWiki.constants.wikiSpaceSeparator)) {
-          name = name.substring(name.indexOf(XWiki.constants.wikiSpaceSeparator) + 1, name.length);
+          name = name.substring(
+            name.indexOf(XWiki.constants.wikiSpaceSeparator) + 1,
+            name.length,
+          );
         }
         // remove attachment if any.
         if (name.include(XWiki.constants.pageAttachmentSeparator)) {
-          name = name.substring(0, name.indexOf(XWiki.constants.pageAttachmentSeparator));
+          name = name.substring(
+            0,
+            name.indexOf(XWiki.constants.pageAttachmentSeparator),
+          );
         }
         // remove anchor if any.
         if (name.include(XWiki.constants.anchorSeparator)) {
-          name = name.substring(0, name.indexOf(XWiki.constants.anchorSeparator));
+          name = name.substring(
+            0,
+            name.indexOf(XWiki.constants.anchorSeparator),
+          );
         }
         if (name.include(XWiki.constants.spacePageSeparator)) {
-          return name.substring(name.indexOf(XWiki.constants.spacePageSeparator) + 1, name.length);
+          return name.substring(
+            name.indexOf(XWiki.constants.spacePageSeparator) + 1,
+            name.length,
+          );
         } else {
           if (originalName.include(XWiki.constants.wikiSpaceSeparator)) {
             // If the resource name looks like "xwiki:Main" it does not contain page info.
@@ -127,7 +154,10 @@ var XWiki = (function (XWiki) {
        */
       getAttachmentFromResourceName: function (name) {
         if (name.include(XWiki.constants.pageAttachmentSeparator)) {
-          return name.substring(name.indexOf(XWiki.constants.pageAttachmentSeparator) + 1, name.length);
+          return name.substring(
+            name.indexOf(XWiki.constants.pageAttachmentSeparator) + 1,
+            name.length,
+          );
         }
         return null;
       },
@@ -138,7 +168,10 @@ var XWiki = (function (XWiki) {
        */
       getAnchorFromResourceName: function (name) {
         if (name.include(XWiki.constants.anchorSeparator)) {
-          return name.substring(name.indexOf(XWiki.constants.anchorSeparator) + 1, name.length);
+          return name.substring(
+            name.indexOf(XWiki.constants.anchorSeparator) + 1,
+            name.length,
+          );
         }
         return null;
       },
@@ -165,15 +198,26 @@ var XWiki = (function (XWiki) {
         var attachment = this.getAttachmentFromResourceName(name);
         var anchor = this.getAnchorFromResourceName(name);
 
-        if (!wiki) { wiki = XWiki.currentWiki; }
-        if (!space) { space = XWiki.currentSpace; }
-        if (!pageName) { pageName = XWiki.currentPage; }
-        if (!attachment) { attachment = ""; }
-        if (!anchor) { anchor = ""; }
+        if (!wiki) {
+          wiki = XWiki.currentWiki;
+        }
+        if (!space) {
+          space = XWiki.currentSpace;
+        }
+        if (!pageName) {
+          pageName = XWiki.currentPage;
+        }
+        if (!attachment) {
+          attachment = "";
+        }
+        if (!anchor) {
+          anchor = "";
+        }
 
         var fullName = space + XWiki.constants.spacePageSeparator + pageName;
         var prefixedSpace = wiki + XWiki.constants.wikiSpaceSeparator + space;
-        var prefixedFullName = wiki + XWiki.constants.wikiSpaceSeparator + fullName;
+        var prefixedFullName =
+          wiki + XWiki.constants.wikiSpaceSeparator + fullName;
 
         return {
           wiki: wiki,
@@ -183,7 +227,7 @@ var XWiki = (function (XWiki) {
           prefixedFullName: prefixedFullName,
           name: pageName,
           attachment: attachment,
-          anchor: anchor
+          anchor: anchor,
         };
       },
 
@@ -194,7 +238,7 @@ var XWiki = (function (XWiki) {
        * @return a string that can be passed to the #get(String) method to reconstruct the resource
        */
       serialize: function (resource) {
-        var name = '';
+        var name = "";
         if (resource.wiki) {
           name = resource.wiki;
         }
@@ -223,7 +267,7 @@ var XWiki = (function (XWiki) {
           name += resource.anchor;
         }
         return name;
-      }
+      },
     },
 
     /**
@@ -258,7 +302,7 @@ var XWiki = (function (XWiki) {
         window.activeDocExtraPane.className = "";
         tab.blur();
 
-        document.fire("xwiki:docextra:activated", { "id": extraID });
+        document.fire("xwiki:docextra:activated", { id: extraID });
       };
 
       // Use Ajax.Updater to display the requested pane (extraID) : comments, attachments, etc.
@@ -273,17 +317,17 @@ var XWiki = (function (XWiki) {
         $("docextrapanes").className = "loading";
         new Ajax.Updater(
           extraID + "pane",
-          window.docgeturl + '?xpage=xpart&vm=' + extraTemplate,
+          window.docgeturl + "?xpage=xpart&vm=" + extraTemplate,
           {
-            method: 'post',
+            method: "post",
             evalScripts: true,
             onComplete: function (transport) {
               $("docextrapanes").className = "";
 
               // Let other know new content has been loaded
               document.fire("xwiki:docextra:loaded", {
-                "id": extraID,
-                "element": $(extraID + "pane")
+                id: extraID,
+                element: $(extraID + "pane"),
               });
 
               // switch tab
@@ -293,18 +337,19 @@ var XWiki = (function (XWiki) {
                 // Yes, this is a POJW (Plain Old JavaScript Ha^Wworkaround) which
                 // prevents the anchor 'jump' after a click event but enable it
                 // when the user is arriving from a direct /Space/Page#Section URL
-                $(extraID + 'anchor').id = extraID;
-                location.href = '#' + extraID;
-                $(extraID).id = extraID + 'anchor';
+                $(extraID + "anchor").id = extraID;
+                location.href = "#" + extraID;
+                $(extraID).id = extraID + "anchor";
               }
-            }
-          });
+            },
+          },
+        );
       } else {
         dhtmlSwitch(extraID);
         if (scrollToAnchor) {
-          $(extraID + 'anchor').id = extraID;
-          location.href = '#' + extraID;
-          $(extraID).id = extraID + 'anchor';
+          $(extraID + "anchor").id = extraID;
+          location.href = "#" + extraID;
+          $(extraID).id = extraID + "anchor";
         }
       }
     },
@@ -318,15 +363,20 @@ var XWiki = (function (XWiki) {
       if (typeof content == "undefined") {
         content = document.body;
       }
-      $(content).select(".xwikirenderingerror").each(function (error) {
-        if (error.next().innerHTML !== "" && error.next().hasClassName("xwikirenderingerrordescription")) {
-          error.style.cursor = "pointer";
-          error.title = "$msg.get('platform.core.rendering.error.readTechnicalInformation')";
-          Event.observe(error, "click", function (event) {
-            event.element().next().toggleClassName("hidden");
-          });
-        }
-      });
+      $(content)
+        .select(".xwikirenderingerror")
+        .each(function (error) {
+          if (
+            error.next().innerHTML !== "" &&
+            error.next().hasClassName("xwikirenderingerrordescription")
+          ) {
+            error.style.cursor = "pointer";
+            error.title = this.messages.translations.readTechnicalInformation;
+            Event.observe(error, "click", function (event) {
+              event.element().next().toggleClassName("hidden");
+            });
+          }
+        });
     },
 
     /**
@@ -364,92 +414,63 @@ var XWiki = (function (XWiki) {
       }
     },
 
-    /**
-     * Insert a link for editing sections.
-     */
-    insertSectionEditLinks: function () {
-      // Insert links only in view mode and for xwiki/2.0 documents.
-      if (XWiki.docsyntax == "xwiki/2.0" && XWiki.contextaction == "view" && XWiki.hasEdit) {
-
-        // Section count starts at one, not zero.
-        var sectioncount = 1;
-
-        // We can't use element.select() since it does not keep the order of the elements in the flow.
-        var nodes = $("xwikicontent");
-        if (!nodes) {
-          return;
-        }
-        nodes = nodes.childNodes;
-
-        // Only allow section editing for the specified depth level (2 by default)
-        var headerPattern = new RegExp("H[1-" + $xwiki.getSectionEditingDepth() + "]");
-
-        // For all non-generated headers, add a SPAN and A element in order to be able to edit the section.
-        for (var i = 0; i < nodes.length; i++) {
-
-          var node = $(nodes[i]);
-
-          if (headerPattern.test(node.nodeName) && node.className.include("wikigeneratedheader") == false) {
-            var editspan = document.createElement("SPAN");
-            var editlink = document.createElement("A");
-
-            editlink.href = window.docediturl + "?section=" + sectioncount;
-            editlink.style.textDecoration = "none";
-            editlink.innerHTML = "$msg.get('edit')";
-            editspan.className = "edit_section";
-
-            editspan.appendChild(editlink);
-            node.insert({ 'after': editspan });
-            sectioncount++;
-          }
-        }
-      }
-    },
-
     /**
      * Display a modal box allowing to create the new document from a template when clicking on broken links.
      */
     insertCreatePageFromTemplateModalBoxes: function () {
       // Insert links only in view mode and for xwiki/2.0 documents.
-      if (XWiki.docsyntax == "xwiki/2.0" && XWiki.contextaction == "view" && XWiki.hasEdit) {
+      if (
+        XWiki.docsyntax == "xwiki/2.0" &&
+        XWiki.contextaction == "view" &&
+        XWiki.hasEdit
+      ) {
         XWiki.widgets.CreatePagePopup = Class.create(XWiki.widgets.ModalPopup, {
           initialize: function ($super, interactionParameters) {
-            var content = new Element('div', { 'class': 'modal-popup' });
+            var content = new Element("div", { class: "modal-popup" });
             content.insert(interactionParameters.content);
             $super(
               content,
               {
-                "show": { method: this.showDialog, keys: [] },
-                "close": { method: this.closeDialog, keys: ['Esc'] }
+                show: { method: this.showDialog, keys: [] },
+                close: { method: this.closeDialog, keys: ["Esc"] },
               },
               {
                 displayCloseButton: true,
                 verticalPosition: "center",
-                backgroundColor: "#FFF"
-              }
+                backgroundColor: "#FFF",
+              },
             );
             this.showDialog();
             this.setClass("createpage-modal-popup");
-          }
+          },
         });
 
         var spans = document.body.select("span.wikicreatelink");
         for (var i = 0; i < spans.length; i++) {
-          spans[i].down('a').observe('click', function (event) {
-            new Ajax.Request(event.findElement('a').href + '&xpage=createinline&ajax=1', {
-              method: 'get',
-              onSuccess: function (transport) {
-                var redirect = transport.getHeader('redirect');
-                if (redirect) {
-                  window.location = redirect;
-                } else {
-                  new XWiki.widgets.CreatePagePopup({ content: transport.responseText });
-                }
+          spans[i].down("a").observe("click", function (event) {
+            new Ajax.Request(
+              event.findElement("a").href + "&xpage=createinline&ajax=1",
+              {
+                method: "get",
+                onSuccess: function (transport) {
+                  var redirect = transport.getHeader("redirect");
+                  if (redirect) {
+                    window.location = redirect;
+                  } else {
+                    new XWiki.widgets.CreatePagePopup({
+                      content: transport.responseText,
+                    });
+                  }
+                },
+                onFailure: function () {
+                  new XWiki.widgets.Notification(
+                    this.messages.translations.createAjaxError,
+                    "error",
+                    { inactive: true },
+                  ).show();
+                },
               },
-              onFailure: function () {
-                new XWiki.widgets.Notification("$msg.get('core.create.ajax.error')", 'error', { inactive: true }).show();
-              }
-            });
+            );
             event.stop();
           });
         }
@@ -460,29 +481,28 @@ var XWiki = (function (XWiki) {
      * Watchlist methods.
      */
     watchlist: {
-
       /**
        * Mapping between link IDs and associated actions.
        */
       actionsMap: {
-        'tmWatchDocument': 'adddocument',
-        'tmUnwatchDocument': 'removedocument',
-        'tmWatchSpace': 'addspace',
-        'tmUnwatchSpace': 'removespace',
-        'tmWatchWiki': 'addwiki',
-        'tmUnwatchWiki': 'removewiki'
+        tmWatchDocument: "adddocument",
+        tmUnwatchDocument: "removedocument",
+        tmWatchSpace: "addspace",
+        tmUnwatchSpace: "removespace",
+        tmWatchWiki: "addwiki",
+        tmUnwatchWiki: "removewiki",
       },
 
       /**
        * Mapping allowing to know which action to display when a previous action has been executed.
        */
       flowMap: {
-        'tmWatchDocument': 'tmUnwatchDocument',
-        'tmUnwatchDocument': 'tmWatchDocument',
-        'tmWatchSpace': 'tmUnwatchSpace',
-        'tmUnwatchSpace': 'tmWatchSpace',
-        'tmWatchWiki': 'tmUnwatchWiki',
-        'tmUnwatchWiki': 'tmWatchWiki'
+        tmWatchDocument: "tmUnwatchDocument",
+        tmUnwatchDocument: "tmWatchDocument",
+        tmWatchSpace: "tmUnwatchSpace",
+        tmUnwatchSpace: "tmWatchSpace",
+        tmWatchWiki: "tmUnwatchWiki",
+        tmUnwatchWiki: "tmWatchWiki",
       },
 
       /**
@@ -491,21 +511,22 @@ var XWiki = (function (XWiki) {
        * @param element the element that fired the action.
        */
       executeAction: function (element) {
-        var surl = window.docgeturl + "?xpage=watch&do=" + this.actionsMap[element.id];
-        var myAjax = new Ajax.Request(
-          surl,
-          {
-            method: 'get',
-            onComplete: function () {
-              if (element.nodeName == 'A') {
-                element.parentNode.toggleClassName('hidden');
-                $(XWiki.watchlist.flowMap[element.id]).parentNode.toggleClassName('hidden');
-              } else {
-                element.toggleClassName('hidden');
-                $(XWiki.watchlist.flowMap[element.id]).toggleClassName('hidden');
-              }
+        var surl =
+          window.docgeturl + "?xpage=watch&do=" + this.actionsMap[element.id];
+        var myAjax = new Ajax.Request(surl, {
+          method: "get",
+          onComplete: function () {
+            if (element.nodeName == "A") {
+              element.parentNode.toggleClassName("hidden");
+              $(XWiki.watchlist.flowMap[element.id]).parentNode.toggleClassName(
+                "hidden",
+              );
+            } else {
+              element.toggleClassName("hidden");
+              $(XWiki.watchlist.flowMap[element.id]).toggleClassName("hidden");
             }
-          });
+          },
+        });
       },
 
       /**
@@ -517,23 +538,23 @@ var XWiki = (function (XWiki) {
             var element = $(button);
             var self = this;
 
-            if (element.nodeName != 'A') {
-              element = $(button).down('A');
+            if (element.nodeName != "A") {
+              element = $(button).down("A");
             }
 
             // unregister previously registered handler if any
-            element.stopObserving('click');
-            element.observe('click', function (event) {
+            element.stopObserving("click");
+            element.observe("click", function (event) {
               Event.stop(event);
               var element = event.element();
-              while (element.id == '') {
+              while (element.id == "") {
                 element = element.parentNode;
               }
               XWiki.watchlist.executeAction(element);
             });
           }
         }
-      }
+      },
     },
 
     cookies: {
@@ -548,10 +569,9 @@ var XWiki = (function (XWiki) {
       create: function (name, value, days) {
         if (days) {
           var date = new Date();
-          date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
+          date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);
           var expires = "; expires=" + date.toGMTString();
-        }
-        else var expires = "";
+        } else var expires = "";
         document.cookie = name + "=" + value + expires + "; path=/";
       },
 
@@ -563,10 +583,10 @@ var XWiki = (function (XWiki) {
        */
       read: function (name) {
         var nameEQ = name + "=";
-        var ca = document.cookie.split(';');
+        var ca = document.cookie.split(";");
         for (var i = 0; i < ca.length; i++) {
           var c = ca[i];
-          while (c.charAt(0) == ' ') {
+          while (c.charAt(0) == " ") {
             c = c.substring(1, c.length);
           }
           if (c.indexOf(nameEQ) == 0) {
@@ -584,8 +604,7 @@ var XWiki = (function (XWiki) {
        */
       erase: function (name) {
         XWiki.cookies.create(name, "", -1);
-      }
-
+      },
     },
 
     /**
@@ -597,8 +616,10 @@ var XWiki = (function (XWiki) {
       element = $(element);
       element.toggleClassName("collapsed");
       if (cookieName) {
-        var cookieValue = element.hasClassName('collapsed') ? 'collapsed' : 'expanded';
-        XWiki.cookies.create(cookieName, cookieValue, '');
+        var cookieValue = element.hasClassName("collapsed")
+          ? "collapsed"
+          : "expanded";
+        XWiki.cookies.create(cookieName, cookieValue, "");
       }
     },
 
@@ -610,23 +631,32 @@ var XWiki = (function (XWiki) {
     initialize: function () {
       // Extra security to make sure we do not get initalized twice.
       // It would fire the custom dom:loaded event twice, which could make their observers misbehave.
-      if (typeof this.isInitialized == "undefined" || this.isInitialized == false) {
+      if (
+        typeof this.isInitialized == "undefined" ||
+        this.isInitialized == false
+      ) {
         this.isInitialized = true;
-        document.fire("xwiki:dom:loading");
-
-        this.makeRenderingErrorsExpandable();
-        this.fixLinksTargetAttribute();
-        this.insertSectionEditLinks();
-        this.insertCreatePageFromTemplateModalBoxes();
-        this.watchlist.initialize();
-
-        document.fire("xwiki:dom:loaded");
+        if (window.celExecOnceAfterMessagesLoaded) {
+          window.celExecOnceAfterMessagesLoaded(
+            (celMessages) => {
+              this.messages.translations = celMessages.xwiki;
+              this.messages.celMeta = celMessages.celmeta;
+              document.fire("xwiki:dom:loading");
+              this.makeRenderingErrorsExpandable();
+              this.fixLinksTargetAttribute();
+              this.insertCreatePageFromTemplateModalBoxes();
+              this.watchlist.initialize();
+              document.fire("xwiki:dom:loaded");
+            },
+          );
+        } else {
+          console.warn("celExecOnceAfterMessagesLoaded not available!");
+        }
       }
-    }
+    },
   });
 
   return XWiki;
-
 })(XWiki || {});
 
 /**
@@ -653,15 +683,17 @@ function showsubmenu(element) {
         clearTimeout(window.hidetimer);
         window.hidetimer = null;
         window.hideelement = null;
-      }
-      else {
+      } else {
         doHide();
       }
     }
     var coords = Element.positionedOffset(element);
-    element.lastChild.style.left = (coords[0] - 10) + "px";
-    element.lastChild.style.top = (coords[1] + element.offsetHeight) + "px";
-    element.lastChild.className = element.lastChild.className.replace("hidden", "visible");
+    element.lastChild.style.left = coords[0] - 10 + "px";
+    element.lastChild.style.top = coords[1] + element.offsetHeight + "px";
+    element.lastChild.className = element.lastChild.className.replace(
+      "hidden",
+      "visible",
+    );
   }
 }
 
@@ -684,7 +716,10 @@ function hidesubmenu(element) {
  * @return
  */
 function doHide() {
-  window.hideelement.className = window.hideelement.className.replace("visible", "hidden");
+  window.hideelement.className = window.hideelement.className.replace(
+    "visible",
+    "hidden",
+  );
   clearTimeout(window.hidetimer);
   window.hidetimer = null;
   window.hideelement = null;
@@ -699,9 +734,8 @@ function doHide() {
  */
 function toggleClass(o, className) {
   if (!eltHasClass(o, className)) {
-    o.className += ' ' + className
-  }
-  else {
+    o.className += " " + className;
+  } else {
     rmClass(o, className);
   }
 }
@@ -714,8 +748,7 @@ function toggleClass(o, className) {
  * @return
  */
 function addClass(o, className) {
-  if (!eltHasClass(o, className))
-    o.className += ' ' + className
+  if (!eltHasClass(o, className)) o.className += " " + className;
 }
 
 /**
@@ -726,9 +759,8 @@ function addClass(o, className) {
  * @return True if the element has the class.
  */
 function eltHasClass(o, className) {
-  if (!o.className)
-    return false;
-  return new RegExp('\\b' + className + '\\b').test(o.className)
+  if (!o.className) return false;
+  return new RegExp("\\b" + className + "\\b").test(o.className);
 }
 
 /**
@@ -739,7 +771,10 @@ function eltHasClass(o, className) {
  * @return
  */
 function rmClass(o, className) {
-  o.className = o.className.replace(new RegExp('\\s*\\b' + className + '\\b'), '')
+  o.className = o.className.replace(
+    new RegExp("\\s*\\b" + className + "\\b"),
+    "",
+  );
 }
 
 /**
@@ -749,7 +784,11 @@ function rmClass(o, className) {
  * @return
  */
 function openURL(url) {
-  win = open(url, "win", "titlebar=0,width=990,height=500,resizable,scrollbars");
+  win = open(
+    url,
+    "win",
+    "titlebar=0,width=990,height=500,resizable,scrollbars",
+  );
   if (win) {
     win.focus();
   }
@@ -762,7 +801,11 @@ function openURL(url) {
  * @return
  */
 function openHelp() {
-  win = open("http://platform.xwiki.org/xwiki/bin/view/Main/XWikiSyntax?xpage=print", "XWikiSyntax", "titlebar=0,width=750,height=480,resizable,scrollbars");
+  win = open(
+    "http://platform.xwiki.org/xwiki/bin/view/Main/XWikiSyntax?xpage=print",
+    "XWikiSyntax",
+    "titlebar=0,width=750,height=480,resizable,scrollbars",
+  );
   if (win) {
     win.focus();
   }
@@ -800,8 +843,14 @@ function updateName(field1, field2, removeclass) {
  * @return The cleaned string.
  */
 function noaccent(txt) {
-  temp = txt.replace(/[\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u0100\u0102\u0104\u01cd\u01de\u01e0\u01fa\u0200\u0202\u0226]/g, "A");
-  temp = temp.replace(/[\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u0101\u0103\u0105\u01ce\u01df\u01e1\u01fb\u0201\u0203\u0227]/g, "a");
+  temp = txt.replace(
+    /[\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u0100\u0102\u0104\u01cd\u01de\u01e0\u01fa\u0200\u0202\u0226]/g,
+    "A",
+  );
+  temp = temp.replace(
+    /[\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u0101\u0103\u0105\u01ce\u01df\u01e1\u01fb\u0201\u0203\u0227]/g,
+    "a",
+  );
   temp = temp.replace(/[\u00c6\u01e2\u01fc]/g, "AE");
   temp = temp.replace(/[\u00e6\u01e3\u01fd]/g, "ae");
   temp = temp.replace(/[\u008c\u0152]/g, "OE");
@@ -810,14 +859,26 @@ function noaccent(txt) {
   temp = temp.replace(/[\u00e7\u0107\u0109\u010b\u010d]/g, "c");
   temp = temp.replace(/[\u00d0\u010e\u0110]/g, "D");
   temp = temp.replace(/[\u00f0\u010f\u0111]/g, "d");
-  temp = temp.replace(/[\u00c8\u00c9\u00ca\u00cb\u0112\u0114\u0116\u0118\u011a\u0204\u0206\u0228]/g, "E");
-  temp = temp.replace(/[\u00e8\u00e9\u00ea\u00eb\u0113\u0115\u0117\u0119\u011b\u01dd\u0205\u0207\u0229]/g, "e");
+  temp = temp.replace(
+    /[\u00c8\u00c9\u00ca\u00cb\u0112\u0114\u0116\u0118\u011a\u0204\u0206\u0228]/g,
+    "E",
+  );
+  temp = temp.replace(
+    /[\u00e8\u00e9\u00ea\u00eb\u0113\u0115\u0117\u0119\u011b\u01dd\u0205\u0207\u0229]/g,
+    "e",
+  );
   temp = temp.replace(/[\u011c\u011e\u0120\u0122\u01e4\u01e6\u01f4]/g, "G");
   temp = temp.replace(/[\u011d\u011f\u0121\u0123\u01e5\u01e7\u01f5]/g, "g");
   temp = temp.replace(/[\u0124\u0126\u021e]/g, "H");
   temp = temp.replace(/[\u0125\u0127\u021f]/g, "h");
-  temp = temp.replace(/[\u00cc\u00cd\u00ce\u00cf\u0128\u012a\u012c\u012e\u0130\u01cf\u0208\u020a]/g, "I");
-  temp = temp.replace(/[\u00ec\u00ed\u00ee\u00ef\u0129\u012b\u012d\u012f\u0131\u01d0\u0209\u020b]/g, "i");
+  temp = temp.replace(
+    /[\u00cc\u00cd\u00ce\u00cf\u0128\u012a\u012c\u012e\u0130\u01cf\u0208\u020a]/g,
+    "I",
+  );
+  temp = temp.replace(
+    /[\u00ec\u00ed\u00ee\u00ef\u0129\u012b\u012d\u012f\u0131\u01d0\u0209\u020b]/g,
+    "i",
+  );
   temp = temp.replace(/[\u0132]/g, "IJ");
   temp = temp.replace(/[\u0133]/g, "ij");
   temp = temp.replace(/[\u0134]/g, "J");
@@ -827,17 +888,32 @@ function noaccent(txt) {
   temp = temp.replace(/[\u0139\u013b\u013d\u013f\u0141]/g, "L");
   temp = temp.replace(/[\u013a\u013c\u013e\u0140\u0142\u0234]/g, "l");
   temp = temp.replace(/[\u00d1\u0143\u0145\u0147\u014a\u01f8]/g, "N");
-  temp = temp.replace(/[\u00f1\u0144\u0146\u0148\u0149\u014b\u01f9\u0235]/g, "n");
-  temp = temp.replace(/[\u00d2\u00d3\u00d4\u00d5\u00d6\u00d8\u014c\u014e\u0150\u01d1\u01ea\u01ec\u01fe\u020c\u020e\u022a\u022c\u022e\u0230]/g, "O");
-  temp = temp.replace(/[\u00f2\u00f3\u00f4\u00f5\u00f6\u00f8\u014d\u014f\u0151\u01d2\u01eb\u01ed\u01ff\u020d\u020f\u022b\u022d\u022f\u0231]/g, "o");
+  temp = temp.replace(
+    /[\u00f1\u0144\u0146\u0148\u0149\u014b\u01f9\u0235]/g,
+    "n",
+  );
+  temp = temp.replace(
+    /[\u00d2\u00d3\u00d4\u00d5\u00d6\u00d8\u014c\u014e\u0150\u01d1\u01ea\u01ec\u01fe\u020c\u020e\u022a\u022c\u022e\u0230]/g,
+    "O",
+  );
+  temp = temp.replace(
+    /[\u00f2\u00f3\u00f4\u00f5\u00f6\u00f8\u014d\u014f\u0151\u01d2\u01eb\u01ed\u01ff\u020d\u020f\u022b\u022d\u022f\u0231]/g,
+    "o",
+  );
   temp = temp.replace(/[\u0156\u0158\u0210\u0212]/g, "R");
   temp = temp.replace(/[\u0157\u0159\u0211\u0213]/g, "r");
   temp = temp.replace(/[\u015a\u015c\u015e\u0160\u0218]/g, "S");
   temp = temp.replace(/[\u015b\u015d\u015f\u0161\u0219]/g, "s");
   temp = temp.replace(/[\u00de\u0162\u0164\u0166\u021a]/g, "T");
   temp = temp.replace(/[\u00fe\u0163\u0165\u0167\u021b\u0236]/g, "t");
-  temp = temp.replace(/[\u00d9\u00da\u00db\u00dc\u0168\u016a\u016c\u016e\u0170\u0172\u01d3\u01d5\u01d7\u01d9\u01db\u0214\u0216]/g, "U");
-  temp = temp.replace(/[\u00f9\u00fa\u00fb\u00fc\u0169\u016b\u016d\u016f\u0171\u0173\u01d4\u01d6\u01d8\u01da\u01dc\u0215\u0217]/g, "u");
+  temp = temp.replace(
+    /[\u00d9\u00da\u00db\u00dc\u0168\u016a\u016c\u016e\u0170\u0172\u01d3\u01d5\u01d7\u01d9\u01db\u0214\u0216]/g,
+    "U",
+  );
+  temp = temp.replace(
+    /[\u00f9\u00fa\u00fb\u00fc\u0169\u016b\u016d\u016f\u0171\u0173\u01d4\u01d6\u01d8\u01da\u01dc\u0215\u0217]/g,
+    "u",
+  );
   temp = temp.replace(/[\u0174]/g, "W");
   temp = temp.replace(/[\u0175]/g, "w");
   temp = temp.replace(/[\u00dd\u0176\u0178\u0232]/g, "Y");
@@ -865,7 +941,7 @@ function prepareName(form) {
     fname.replace(/ /g, "");
   }
   if (lname != "") {
-    lname = lname.substring(0, 1).toUpperCase() + lname.substring(1)
+    lname = lname.substring(0, 1).toUpperCase() + lname.substring(1);
     lname.replace(/ /g, "");
   }
   if (cxwikiname.value == "") {
@@ -885,18 +961,21 @@ function checkAdvancedContent(message) {
     return true;
   }
   data = document.forms.edit.content.value;
-  myRE = new RegExp("]*)>", "ig")
-  results = data.match(myRE)
-  if (results && results.length > 0)
-    result = true;
-
-  myRE2 = new RegExp("(#(set|include|if|end|for)|#(#) Advanced content|public class|/\* Advanced content \*/)", "ig")
-  results = data.match(myRE2)
-  if (results && results.length > 0)
-    result = true;
-
-  if (result == true)
-    return confirm(message);
+  myRE = new RegExp(
+    "]*)>",
+    "ig",
+  );
+  results = data.match(myRE);
+  if (results && results.length > 0) result = true;
+
+  myRE2 = new RegExp(
+    "(#(set|include|if|end|for)|#(#) Advanced content|public class|/\* Advanced content \*/)",
+    "ig",
+  );
+  results = data.match(myRE2);
+  if (results && results.length > 0) result = true;
+
+  if (result == true) return confirm(message);
 
   return true;
 }
@@ -909,25 +988,26 @@ function checkAdvancedContent(message) {
  * License : BSD
  */
 shortcut = {
-  'all_shortcuts': {},//All the shortcuts are stored in this array
-  'add': function (shortcut_combination, callback, opt) {
+  all_shortcuts: {}, //All the shortcuts are stored in this array
+  add: function (shortcut_combination, callback, opt) {
     //Provide a set of default options
     var default_options = {
-      'type': 'keydown',
-      'propagate': false,
-      'disable_in_input': false,
-      'target': document,
-      'keycode': false
-    }
+      type: "keydown",
+      propagate: false,
+      disable_in_input: false,
+      target: document,
+      keycode: false,
+    };
     if (!opt) opt = default_options;
     else {
       for (var dfo in default_options) {
-        if (typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];
+        if (typeof opt[dfo] == "undefined") opt[dfo] = default_options[dfo];
       }
     }
 
-    var ele = opt.target
-    if (typeof opt.target == 'string') ele = document.getElementById(opt.target);
+    var ele = opt.target;
+    if (typeof opt.target == "string")
+      ele = document.getElementById(opt.target);
     var ths = this;
     shortcut_combination = shortcut_combination.toLowerCase();
 
@@ -935,12 +1015,17 @@ shortcut = {
     var func = function (e) {
       e = e || window.event;
 
-      if (opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields
+      if (opt["disable_in_input"]) {
+        //Don't enable shortcut keys in Input, Textarea fields
         var element;
         if (e.target) element = e.target;
         else if (e.srcElement) element = e.srcElement;
         if (element.nodeType == 3) element = element.parentNode;
-        if (element.tagName == 'INPUT' || element.tagName == 'TEXTAREA' || element.tagName == 'SELECT') {
+        if (
+          element.tagName == "INPUT" ||
+          element.tagName == "TEXTAREA" ||
+          element.tagName == "SELECT"
+        ) {
           return;
         }
       }
@@ -961,117 +1046,116 @@ shortcut = {
       //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken
       var shift_nums = {
         "`": "~",
-        "1": "!",
-        "2": "@",
-        "3": "#",
-        "4": "$",
-        "5": "%",
-        "6": "^",
-        "7": "&",
-        "8": "*",
-        "9": "(",
-        "0": ")",
+        1: "!",
+        2: "@",
+        3: "#",
+        4: "$",
+        5: "%",
+        6: "^",
+        7: "&",
+        8: "*",
+        9: "(",
+        0: ")",
         "-": "_",
         "=": "+",
         ";": ":",
-        "'": "\"",
+        "'": '"',
         ",": "<",
         ".": ">",
         "/": "?",
-        "\\": "|"
-      }
+        "\\": "|",
+      };
       //Special Keys - and their codes
       var special_keys = {
-        'esc': 27,
-        'escape': 27,
-        'tab': 9,
-        'space': 32,
-        'return': 13,
-        'enter': 13,
-        'backspace': 8,
-
-        'scrolllock': 145,
-        'scroll_lock': 145,
-        'scroll': 145,
-        'capslock': 20,
-        'caps_lock': 20,
-        'caps': 20,
-        'numlock': 144,
-        'num_lock': 144,
-        'num': 144,
-
-        'pause': 19,
-        'break': 19,
-
-        'insert': 45,
-        'home': 36,
-        'delete': 46,
-        'end': 35,
-
-        'pageup': 33,
-        'page_up': 33,
-        'pu': 33,
-
-        'pagedown': 34,
-        'page_down': 34,
-        'pd': 34,
-
-        'left': 37,
-        'up': 38,
-        'right': 39,
-        'down': 40,
-
-        'f1': 112,
-        'f2': 113,
-        'f3': 114,
-        'f4': 115,
-        'f5': 116,
-        'f6': 117,
-        'f7': 118,
-        'f8': 119,
-        'f9': 120,
-        'f10': 121,
-        'f11': 122,
-        'f12': 123
-      }
+        esc: 27,
+        escape: 27,
+        tab: 9,
+        space: 32,
+        return: 13,
+        enter: 13,
+        backspace: 8,
+
+        scrolllock: 145,
+        scroll_lock: 145,
+        scroll: 145,
+        capslock: 20,
+        caps_lock: 20,
+        caps: 20,
+        numlock: 144,
+        num_lock: 144,
+        num: 144,
+
+        pause: 19,
+        break: 19,
+
+        insert: 45,
+        home: 36,
+        delete: 46,
+        end: 35,
+
+        pageup: 33,
+        page_up: 33,
+        pu: 33,
+
+        pagedown: 34,
+        page_down: 34,
+        pd: 34,
+
+        left: 37,
+        up: 38,
+        right: 39,
+        down: 40,
+
+        f1: 112,
+        f2: 113,
+        f3: 114,
+        f4: 115,
+        f5: 116,
+        f6: 117,
+        f7: 118,
+        f8: 119,
+        f9: 120,
+        f10: 121,
+        f11: 122,
+        f12: 123,
+      };
 
       var modifiers = {
         shift: { wanted: false, pressed: false },
         ctrl: { wanted: false, pressed: false },
         alt: { wanted: false, pressed: false },
-        meta: { wanted: false, pressed: false }   //Meta is Mac specific
+        meta: { wanted: false, pressed: false }, //Meta is Mac specific
       };
       if (e.ctrlKey) modifiers.ctrl.pressed = true;
       if (e.shiftKey) modifiers.shift.pressed = true;
       if (e.altKey) modifiers.alt.pressed = true;
       if (e.metaKey) modifiers.meta.pressed = true;
 
-      for (var i = 0; k = keys[i], i < keys.length; i++) {
+      for (var i = 0; (k = keys[i]), i < keys.length; i++) {
         //Modifiers
-        if (k == 'ctrl' || k == 'control') {
+        if (k == "ctrl" || k == "control") {
           kp++;
           modifiers.ctrl.wanted = true;
-
-        } else if (k == 'shift') {
+        } else if (k == "shift") {
           kp++;
           modifiers.shift.wanted = true;
-
-        } else if (k == 'alt') {
+        } else if (k == "alt") {
           kp++;
           modifiers.alt.wanted = true;
-        } else if (k == 'meta') {
+        } else if (k == "meta") {
           kp++;
           modifiers.meta.wanted = true;
-        } else if (k.length > 1) { //If it is a special key
+        } else if (k.length > 1) {
+          //If it is a special key
           if (special_keys[k] == code) kp++;
-
-        } else if (opt['keycode']) {
-          if (opt['keycode'] == code) kp++;
-
-        } else { //The special keys did not match
+        } else if (opt["keycode"]) {
+          if (opt["keycode"] == code) kp++;
+        } else {
+          //The special keys did not match
           if (character == k) kp++;
           else {
-            if (shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase
+            if (shift_nums[character] && e.shiftKey) {
+              //Stupid Shift key bug created by using lowercase
               character = shift_nums[character];
               if (character == k) kp++;
             }
@@ -1079,14 +1163,17 @@ shortcut = {
         }
       }
 
-      if (kp == keys.length &&
+      if (
+        kp == keys.length &&
         modifiers.ctrl.pressed == modifiers.ctrl.wanted &&
         modifiers.shift.pressed == modifiers.shift.wanted &&
         modifiers.alt.pressed == modifiers.alt.wanted &&
-        modifiers.meta.pressed == modifiers.meta.wanted) {
+        modifiers.meta.pressed == modifiers.meta.wanted
+      ) {
         callback(e);
 
-        if (!opt['propagate']) { //Stop the event
+        if (!opt["propagate"]) {
+          //Stop the event
           //e.cancelBubble is supported by IE - this will kill the bubbling process.
           e.cancelBubble = true;
           e.returnValue = false;
@@ -1104,33 +1191,34 @@ shortcut = {
           return false;
         }
       }
-    }
+    };
     this.all_shortcuts[shortcut_combination] = {
-      'callback': func,
-      'target': ele,
-      'event': opt['type']
+      callback: func,
+      target: ele,
+      event: opt["type"],
     };
     //Attach the function with the event
-    if (ele.addEventListener) ele.addEventListener(opt['type'], func, false);
-    else if (ele.attachEvent) ele.attachEvent('on' + opt['type'], func);
-    else ele['on' + opt['type']] = func;
+    if (ele.addEventListener) ele.addEventListener(opt["type"], func, false);
+    else if (ele.attachEvent) ele.attachEvent("on" + opt["type"], func);
+    else ele["on" + opt["type"]] = func;
   },
 
   //Remove the shortcut - just specify the shortcut and I will remove the binding
-  'remove': function (shortcut_combination) {
+  remove: function (shortcut_combination) {
     shortcut_combination = shortcut_combination.toLowerCase();
     var binding = this.all_shortcuts[shortcut_combination];
-    delete (this.all_shortcuts[shortcut_combination])
+    delete this.all_shortcuts[shortcut_combination];
     if (!binding) return;
-    var type = binding['event'];
-    var ele = binding['target'];
-    var callback = binding['callback'];
-
-    if (ele.detachEvent) ele.detachEvent('on' + type, callback);
-    else if (ele.removeEventListener) ele.removeEventListener(type, callback, false);
-    else ele['on' + type] = false;
-  }
-}
+    var type = binding["event"];
+    var ele = binding["target"];
+    var callback = binding["callback"];
+
+    if (ele.detachEvent) ele.detachEvent("on" + type, callback);
+    else if (ele.removeEventListener)
+      ele.removeEventListener(type, callback, false);
+    else ele["on" + type] = false;
+  },
+};
 
 /**
  * Browser Detect
@@ -1138,99 +1226,124 @@ shortcut = {
  * URL: http://dithered.chadlindstrom.ca/javascript/browser_detect/index.html
  * License: http://creativecommons.org/licenses/by/1.0/
  * Author: Chris Nott (chris[at]dithered[dot]com)
-*/
+ */
 function BrowserDetect() {
   var ua = navigator.userAgent.toLowerCase();
 
   // browser engine name
-  this.isGecko = (ua.indexOf('gecko') != -1 && ua.indexOf('safari') == -1);
-  this.isAppleWebKit = (ua.indexOf('applewebkit') != -1);
+  this.isGecko = ua.indexOf("gecko") != -1 && ua.indexOf("safari") == -1;
+  this.isAppleWebKit = ua.indexOf("applewebkit") != -1;
 
   // browser name
-  this.isKonqueror = (ua.indexOf('konqueror') != -1);
-  this.isSafari = (ua.indexOf('safari') != - 1);
-  this.isOmniweb = (ua.indexOf('omniweb') != - 1);
-  this.isOpera = (ua.indexOf('opera') != -1);
-  this.isIcab = (ua.indexOf('icab') != -1);
-  this.isAol = (ua.indexOf('aol') != -1);
-  this.isIE = (ua.indexOf('msie') != -1 && !this.isOpera && (ua.indexOf('webtv') == -1));
-  this.isMozilla = (this.isGecko && ua.indexOf('gecko/') + 14 == ua.length);
-  this.isFirefox = (ua.indexOf('firefox/') != -1 || ua.indexOf('firebird/') != -1);
-  this.isNS = ((this.isGecko) ? (ua.indexOf('netscape') != -1) : ((ua.indexOf('mozilla') != -1) && !this.isOpera && !this.isSafari && (ua.indexOf('spoofer') == -1) && (ua.indexOf('compatible') == -1) && (ua.indexOf('webtv') == -1) && (ua.indexOf('hotjava') == -1)));
+  this.isKonqueror = ua.indexOf("konqueror") != -1;
+  this.isSafari = ua.indexOf("safari") != -1;
+  this.isOmniweb = ua.indexOf("omniweb") != -1;
+  this.isOpera = ua.indexOf("opera") != -1;
+  this.isIcab = ua.indexOf("icab") != -1;
+  this.isAol = ua.indexOf("aol") != -1;
+  this.isIE =
+    ua.indexOf("msie") != -1 && !this.isOpera && ua.indexOf("webtv") == -1;
+  this.isMozilla = this.isGecko && ua.indexOf("gecko/") + 14 == ua.length;
+  this.isFirefox =
+    ua.indexOf("firefox/") != -1 || ua.indexOf("firebird/") != -1;
+  this.isNS = this.isGecko
+    ? ua.indexOf("netscape") != -1
+    : ua.indexOf("mozilla") != -1 &&
+    !this.isOpera &&
+    !this.isSafari &&
+    ua.indexOf("spoofer") == -1 &&
+    ua.indexOf("compatible") == -1 &&
+    ua.indexOf("webtv") == -1 &&
+    ua.indexOf("hotjava") == -1;
 
   // spoofing and compatible browsers
-  this.isIECompatible = ((ua.indexOf('msie') != -1) && !this.isIE);
-  this.isNSCompatible = ((ua.indexOf('mozilla') != -1) && !this.isNS && !this.isMozilla);
+  this.isIECompatible = ua.indexOf("msie") != -1 && !this.isIE;
+  this.isNSCompatible =
+    ua.indexOf("mozilla") != -1 && !this.isNS && !this.isMozilla;
 
   // rendering engine versions
-  this.geckoVersion = ((this.isGecko) ? ua.substring((ua.lastIndexOf('gecko/') + 6), (ua.lastIndexOf('gecko/') + 14)) : -1);
-  this.equivalentMozilla = ((this.isGecko) ? parseFloat(ua.substring(ua.indexOf('rv:') + 3)) : -1);
-  this.appleWebKitVersion = ((this.isAppleWebKit) ? parseFloat(ua.substring(ua.indexOf('applewebkit/') + 12)) : -1);
+  this.geckoVersion = this.isGecko
+    ? ua.substring(ua.lastIndexOf("gecko/") + 6, ua.lastIndexOf("gecko/") + 14)
+    : -1;
+  this.equivalentMozilla = this.isGecko
+    ? parseFloat(ua.substring(ua.indexOf("rv:") + 3))
+    : -1;
+  this.appleWebKitVersion = this.isAppleWebKit
+    ? parseFloat(ua.substring(ua.indexOf("applewebkit/") + 12))
+    : -1;
 
   // browser version
   this.versionMinor = parseFloat(navigator.appVersion);
 
   // correct version number
   if (this.isGecko && !this.isMozilla) {
-    this.versionMinor = parseFloat(ua.substring(ua.indexOf('/', ua.indexOf('gecko/') + 6) + 1));
-  }
-  else if (this.isMozilla) {
-    this.versionMinor = parseFloat(ua.substring(ua.indexOf('rv:') + 3));
-  }
-  else if (this.isIE && this.versionMinor >= 4) {
-    this.versionMinor = parseFloat(ua.substring(ua.indexOf('msie ') + 5));
-  }
-  else if (this.isKonqueror) {
-    this.versionMinor = parseFloat(ua.substring(ua.indexOf('konqueror/') + 10));
-  }
-  else if (this.isSafari) {
-    this.versionMinor = parseFloat(ua.substring(ua.lastIndexOf('safari/') + 7));
-  }
-  else if (this.isOmniweb) {
-    this.versionMinor = parseFloat(ua.substring(ua.lastIndexOf('omniweb/') + 8));
-  }
-  else if (this.isOpera) {
-    this.versionMinor = parseFloat(ua.substring(ua.indexOf('opera') + 6));
-  }
-  else if (this.isIcab) {
-    this.versionMinor = parseFloat(ua.substring(ua.indexOf('icab') + 5));
+    this.versionMinor = parseFloat(
+      ua.substring(ua.indexOf("/", ua.indexOf("gecko/") + 6) + 1),
+    );
+  } else if (this.isMozilla) {
+    this.versionMinor = parseFloat(ua.substring(ua.indexOf("rv:") + 3));
+  } else if (this.isIE && this.versionMinor >= 4) {
+    this.versionMinor = parseFloat(ua.substring(ua.indexOf("msie ") + 5));
+  } else if (this.isKonqueror) {
+    this.versionMinor = parseFloat(ua.substring(ua.indexOf("konqueror/") + 10));
+  } else if (this.isSafari) {
+    this.versionMinor = parseFloat(ua.substring(ua.lastIndexOf("safari/") + 7));
+  } else if (this.isOmniweb) {
+    this.versionMinor = parseFloat(
+      ua.substring(ua.lastIndexOf("omniweb/") + 8),
+    );
+  } else if (this.isOpera) {
+    this.versionMinor = parseFloat(ua.substring(ua.indexOf("opera") + 6));
+  } else if (this.isIcab) {
+    this.versionMinor = parseFloat(ua.substring(ua.indexOf("icab") + 5));
   }
 
   this.versionMajor = parseInt(this.versionMinor);
 
   // dom support
-  this.isDOM1 = (document.getElementById);
-  this.isDOM2Event = (document.addEventListener && document.removeEventListener);
+  this.isDOM1 = document.getElementById;
+  this.isDOM2Event = document.addEventListener && document.removeEventListener;
 
   // css compatibility mode
-  this.mode = document.compatMode ? document.compatMode : 'BackCompat';
+  this.mode = document.compatMode ? document.compatMode : "BackCompat";
 
   // platform
-  this.isWin = (ua.indexOf('win') != -1);
-  this.isWin32 = (this.isWin && (ua.indexOf('95') != -1 || ua.indexOf('98') != -1 || ua.indexOf('nt') != -1 || ua.indexOf('win32') != -1 || ua.indexOf('32bit') != -1 || ua.indexOf('xp') != -1));
-  this.isMac = (ua.indexOf('mac') != -1);
-  this.isUnix = (ua.indexOf('unix') != -1 || ua.indexOf('sunos') != -1 || ua.indexOf('bsd') != -1 || ua.indexOf('x11') != -1)
-  this.isLinux = (ua.indexOf('linux') != -1);
+  this.isWin = ua.indexOf("win") != -1;
+  this.isWin32 =
+    this.isWin &&
+    (ua.indexOf("95") != -1 ||
+      ua.indexOf("98") != -1 ||
+      ua.indexOf("nt") != -1 ||
+      ua.indexOf("win32") != -1 ||
+      ua.indexOf("32bit") != -1 ||
+      ua.indexOf("xp") != -1);
+  this.isMac = ua.indexOf("mac") != -1;
+  this.isUnix =
+    ua.indexOf("unix") != -1 ||
+    ua.indexOf("sunos") != -1 ||
+    ua.indexOf("bsd") != -1 ||
+    ua.indexOf("x11") != -1;
+  this.isLinux = ua.indexOf("linux") != -1;
 
   // specific browser shortcuts
-  this.isNS4x = (this.isNS && this.versionMajor == 4);
-  this.isNS40x = (this.isNS4x && this.versionMinor < 4.5);
-  this.isNS47x = (this.isNS4x && this.versionMinor >= 4.7);
-  this.isNS4up = (this.isNS && this.versionMinor >= 4);
-  this.isNS6x = (this.isNS && this.versionMajor == 6);
-  this.isNS6up = (this.isNS && this.versionMajor >= 6);
-  this.isNS7x = (this.isNS && this.versionMajor == 7);
-  this.isNS7up = (this.isNS && this.versionMajor >= 7);
-
-  this.isIE4x = (this.isIE && this.versionMajor == 4);
-  this.isIE4up = (this.isIE && this.versionMajor >= 4);
-  this.isIE5x = (this.isIE && this.versionMajor == 5);
-  this.isIE55 = (this.isIE && this.versionMinor == 5.5);
-  this.isIE5up = (this.isIE && this.versionMajor >= 5);
-  this.isIE6x = (this.isIE && this.versionMajor == 6);
-  this.isIE6up = (this.isIE && this.versionMajor >= 6);
-
-  this.isIE4xMac = (this.isIE4x && this.isMac);
+  this.isNS4x = this.isNS && this.versionMajor == 4;
+  this.isNS40x = this.isNS4x && this.versionMinor < 4.5;
+  this.isNS47x = this.isNS4x && this.versionMinor >= 4.7;
+  this.isNS4up = this.isNS && this.versionMinor >= 4;
+  this.isNS6x = this.isNS && this.versionMajor == 6;
+  this.isNS6up = this.isNS && this.versionMajor >= 6;
+  this.isNS7x = this.isNS && this.versionMajor == 7;
+  this.isNS7up = this.isNS && this.versionMajor >= 7;
+
+  this.isIE4x = this.isIE && this.versionMajor == 4;
+  this.isIE4up = this.isIE && this.versionMajor >= 4;
+  this.isIE5x = this.isIE && this.versionMajor == 5;
+  this.isIE55 = this.isIE && this.versionMinor == 5.5;
+  this.isIE5up = this.isIE && this.versionMajor >= 5;
+  this.isIE6x = this.isIE && this.versionMajor == 6;
+  this.isIE6up = this.isIE && this.versionMajor >= 6;
+
+  this.isIE4xMac = this.isIE4x && this.isMac;
 }
 var browser = new BrowserDetect();
 
@@ -1250,16 +1363,22 @@ XWiki.Document = Class.create({
    * Gets an URL pointing to this document.
    */
   getURL: function (action, queryString, fragment) {
-    action = action || 'view';
+    action = action || "view";
     var url = XWiki.Document.URLTemplate;
     url = url.replace("__space__", encodeURIComponent(this.space));
-    url = url.replace("__page__", (this.page == 'WebHome') ? '' : encodeURIComponent(this.page));
-    url = url.replace("__action__/", (action == 'view') ? '' : (encodeURIComponent(action) + "/"));
+    url = url.replace(
+      "__page__",
+      this.page == "WebHome" ? "" : encodeURIComponent(this.page),
+    );
+    url = url.replace(
+      "__action__/",
+      action == "view" ? "" : encodeURIComponent(action) + "/",
+    );
     if (queryString) {
-      url += '?' + queryString;
+      url += "?" + queryString;
     }
     if (fragment) {
-      url += '#' + fragment;
+      url += "#" + fragment;
     }
     return url;
   },
@@ -1267,7 +1386,7 @@ XWiki.Document = Class.create({
    * Gets an URL which points to the REST location for accessing this document.
    */
   getRestURL: function (entity, queryString) {
-    entity = entity || '';
+    entity = entity || "";
     var url = XWiki.Document.RestURLTemplate;
     url = url.replace("__wiki__", this.wiki);
     url = url.replace("__space__", this.space);
@@ -1276,26 +1395,42 @@ XWiki.Document = Class.create({
       url += "/" + entity;
     }
     if (queryString) {
-      url += '?' + queryString;
+      url += "?" + queryString;
     }
     return url;
-  }
+  },
 });
 
 /* Initialize the document URL factory, and create XWiki.currentDocument. */
-document.observe('xwiki:dom:loading', function () {
-  XWiki.Document.currentWiki = ($$("meta[name=wiki]").length > 0) ? $$("meta[name=wiki]")[0].content : "xwiki";
-  XWiki.Document.currentSpace = ($$("meta[name=space]").length > 0) ? $$("meta[name=space]")[0].content : "Main";
-  XWiki.Document.currentPage = ($$("meta[name=page]").length > 0) ? $$("meta[name=page]")[0].content : "WebHome";
-  XWiki.Document.URLTemplate = "$xwiki.getURL('__space__.__page__', '__action__')";
-  XWiki.Document.RestURLTemplate = "${request.contextPath}/rest/wikis/__wiki__/spaces/__space__/pages/__page__";
-  XWiki.Document.WikiSearchURLStub = "${request.contextPath}/rest/wikis/__wiki__/search";
-  XWiki.Document.SpaceSearchURLStub = "${request.contextPath}/rest/wikis/__wiki__/spaces/__space__/search";
+document.observe("xwiki:dom:loading", function () {
+  XWiki.Document.currentWiki =
+    $$("meta[name=wiki]").length > 0
+      ? $$("meta[name=wiki]")[0].content
+      : "xwiki";
+  XWiki.Document.currentSpace =
+    $$("meta[name=space]").length > 0
+      ? $$("meta[name=space]")[0].content
+      : "Main";
+  XWiki.Document.currentPage =
+    $$("meta[name=page]").length > 0
+      ? $$("meta[name=page]")[0].content
+      : "WebHome";
+  XWiki.Document.URLTemplate =
+    "/__action__/__space__/__page__";
+  XWiki.Document.RestURLTemplate =
+    XWiki.messages.celMeta.contextPath + "/rest/wikis/__wiki__/spaces/__space__/pages/__page__";
+  XWiki.Document.WikiSearchURLStub =
+    XWiki.messages.celMeta.contextPath + "/rest/wikis/__wiki__/search";
+  XWiki.Document.SpaceSearchURLStub =
+    XWiki.messages.celMeta.contextPath + "/rest/wikis/__wiki__/spaces/__space__/search";
   XWiki.Document.getRestSearchURL = function (queryString, space, wiki) {
     wiki = wiki || XWiki.Document.currentWiki;
     var url;
     if (space) {
-      url = XWiki.Document.SpaceSearchURLStub.replace("__wiki__", wiki).replace("__space__", space);
+      url = XWiki.Document.SpaceSearchURLStub.replace("__wiki__", wiki).replace(
+        "__space__",
+        space,
+      );
     } else {
       url = XWiki.Document.WikiSearchURLStub.replace("__wiki__", wiki);
     }
@@ -1312,103 +1447,109 @@ document.observe('xwiki:dom:loading', function () {
  *
  * To activate this behavior on an input element, add the "withTip" classname to it.
  */
-document.observe('xwiki:dom:loaded', function () {
+document.observe("xwiki:dom:loaded", function () {
   var onFocus = function () {
     if (this.value == this.defaultValue) {
       this.value = "";
     } else {
       this.select();
     }
-  }
+  };
   var onBlur = function () {
     if (this.value == "") {
       this.value = this.defaultValue;
     }
-  }
+  };
   $$("input.withTip").each(function (item) {
-    item.observe('focus', onFocus.bindAsEventListener(item));
-    item.observe('blur', onBlur.bindAsEventListener(item));
+    item.observe("focus", onFocus.bindAsEventListener(item));
+    item.observe("blur", onBlur.bindAsEventListener(item));
   });
 });
 
 /*
  * AJAX improvements for setting the document parent.
  */
-document.observe('xwiki:dom:loaded', function () {
-  var hierarchyElement = $('hierarchy');
-  var breadcrumbsElement = $('breadcrumbs');
-  var editParentTrigger = $('editParentTrigger');
-  var parentInputSection = $('parentinput');
-  var parentInputField = $('xwikidocparentinput');
-  var titleInputField = $('xwikidoctitleinput');
+document.observe("xwiki:dom:loaded", function () {
+  var hierarchyElement = $("hierarchy");
+  var breadcrumbsElement = $("breadcrumbs");
+  var editParentTrigger = $("editParentTrigger");
+  var parentInputSection = $("parentinput");
+  var parentInputField = $("xwikidocparentinput");
+  var titleInputField = $("xwikidoctitleinput");
 
   /** Hides the parent input field when focusing out of the parent field. */
   function hideParentSection(event) {
     if (event) {
       event.stop();
     }
-    parentInputSection.removeClassName('active');
-    editParentTrigger.addClassName('edit-parent');
-    editParentTrigger.removeClassName('hide-edit-parent');
+    parentInputSection.removeClassName("active");
+    editParentTrigger.addClassName("edit-parent");
+    editParentTrigger.removeClassName("hide-edit-parent");
   }
   /** Displays the parent input field when clicking on the "Edit parent" button. */
   function showParentSection(event) {
     if (event) {
       event.stop();
     }
-    parentInputSection.addClassName('active');
+    parentInputSection.addClassName("active");
     parentInputField.focus();
-    editParentTrigger.removeClassName('edit-parent');
-    editParentTrigger.addClassName('hide-edit-parent');
+    editParentTrigger.removeClassName("edit-parent");
+    editParentTrigger.addClassName("hide-edit-parent");
   }
   /** Toggles the visibility of the parent input field. */
   function toggleParentSectionVisibility(event) {
     event.stop();
     event.element().blur();
-    if (editParentTrigger.hasClassName('edit-parent')) {
+    if (editParentTrigger.hasClassName("edit-parent")) {
       showParentSection();
     } else {
       hideParentSection();
     }
   }
 
-  if ($('hideEditParentTrigger')) {
-    $('hideEditParentTrigger').style.display = 'none';
+  if ($("hideEditParentTrigger")) {
+    $("hideEditParentTrigger").style.display = "none";
   }
   if (editParentTrigger) {
-    editParentTrigger.observe('click', toggleParentSectionVisibility);
+    editParentTrigger.observe("click", toggleParentSectionVisibility);
   }
   if (parentInputField) {
     if (hierarchyElement || breadcrumbsElement) {
-      ['blur', 'change', 'xwiki:suggest:selected'].each(function (monitoredEvent) {
-        parentInputField.observe(monitoredEvent, function () {
-          new Ajax.Request(XWiki.currentDocument.getURL('edit'), {
-            parameters: {
-              xpage: 'xpart',
-              vm: (hierarchyElement ? 'hierarchy.vm' : 'space.vm'),
-              parent: parentInputField.value,
-              title: titleInputField.value
-            },
-            onSuccess: function (response) {
-              if (hierarchyElement) {
-                hierarchyElement.replace(response.responseText);
-                hierarchyElement = $('hierarchy');
-              } else {
-                var tmp = new Element('div');
-                tmp.update(response.responseText);
-                breadcrumbsElement.replace(tmp.down('[id=breadcrumbs]'));
-                breadcrumbsElement = $('breadcrumbs');
-              }
-            }
+      ["blur", "change", "xwiki:suggest:selected"].each(
+        function (monitoredEvent) {
+          parentInputField.observe(monitoredEvent, function () {
+            new Ajax.Request(XWiki.currentDocument.getURL("edit"), {
+              parameters: {
+                xpage: "xpart",
+                vm: hierarchyElement ? "hierarchy.vm" : "space.vm",
+                parent: parentInputField.value,
+                title: titleInputField.value,
+              },
+              onSuccess: function (response) {
+                if (hierarchyElement) {
+                  hierarchyElement.replace(response.responseText);
+                  hierarchyElement = $("hierarchy");
+                } else {
+                  var tmp = new Element("div");
+                  tmp.update(response.responseText);
+                  breadcrumbsElement.replace(tmp.down("[id=breadcrumbs]"));
+                  breadcrumbsElement = $("breadcrumbs");
+                }
+              },
+            });
           });
-        });
-      });
+        },
+      );
     }
-    $('body').observe('click', function (event) {
-      if (!event.element().descendantOf(parentInputSection) && event.element() != parentInputSection && event.element() != editParentTrigger) {
+    $("body").observe("click", function (event) {
+      if (
+        !event.element().descendantOf(parentInputSection) &&
+        event.element() != parentInputSection &&
+        event.element() != editParentTrigger
+      ) {
         hideParentSection();
       }
-    })
+    });
   }
 });
 
@@ -1416,31 +1557,46 @@ document.observe('xwiki:dom:loaded', function () {
  * JS improvement for keeping the content menu visible on the screen when scrolling down.
  */
 document.observe("xwiki:dom:loaded", function () {
-  var menu = $('contentmenu') || $('editmenu'); // Both for view and edit
-  var content = $('mainContentArea') || $('mainEditArea'); // Both for view and edit
+  var menu = $("contentmenu") || $("editmenu"); // Both for view and edit
+  var content = $("mainContentArea") || $("mainEditArea"); // Both for view and edit
   if (menu && content) {
     createGhost(menu);
     // Resize the fixed menu when the window width changes
-    Event.observe(window, 'resize', function () {
-      if (menu.style.position == 'fixed') {
-        menu.style.width = content.getWidth() + 'px';
-        if (typeof (menu.__fm_extra) != 'undefined') {
-          if (menu.__fm_extra.getStyle('padding-left').replace(/[^a-z]/g, '') == 'px') {
-            var boxExtra = menu.__fm_extra.getStyle('border-left-width').replace(/[^0-9.]/g, '') - 0;
-            boxExtra += menu.__fm_extra.getStyle('padding-left').replace(/[^0-9.]/g, '') - 0;
-            boxExtra += menu.__fm_extra.getStyle('padding-right').replace(/[^0-9.]/g, '') - 0;
-            boxExtra += menu.__fm_extra.getStyle('border-right-width').replace(/[^0-9.]/g, '') - 0;
+    Event.observe(window, "resize", function () {
+      if (menu.style.position == "fixed") {
+        menu.style.width = content.getWidth() + "px";
+        if (typeof menu.__fm_extra != "undefined") {
+          if (
+            menu.__fm_extra.getStyle("padding-left").replace(/[^a-z]/g, "") ==
+            "px"
+          ) {
+            var boxExtra =
+              menu.__fm_extra
+                .getStyle("border-left-width")
+                .replace(/[^0-9.]/g, "") - 0;
+            boxExtra +=
+              menu.__fm_extra.getStyle("padding-left").replace(/[^0-9.]/g, "") -
+              0;
+            boxExtra +=
+              menu.__fm_extra
+                .getStyle("padding-right")
+                .replace(/[^0-9.]/g, "") - 0;
+            boxExtra +=
+              menu.__fm_extra
+                .getStyle("border-right-width")
+                .replace(/[^0-9.]/g, "") - 0;
           } else {
             boxExtra = 50; // magic number 50 = standard left+right padding
           }
-          menu.__fm_extra.style.width = (content.getWidth() - boxExtra) + 'px';
+          menu.__fm_extra.style.width = content.getWidth() - boxExtra + "px";
         }
       }
     });
-    if (!browser.isIE6x) { // IE6 is too dumb to be supported
-      Event.observe(window, 'scroll', handleScroll);
+    if (!browser.isIE6x) {
+      // IE6 is too dumb to be supported
+      Event.observe(window, "scroll", handleScroll);
       // Make sure the annotations settings panel shows up in the right place
-      document.observe('xwiki:annotations:settings:loaded', handleScroll);
+      document.observe("xwiki:annotations:settings:loaded", handleScroll);
     }
   }
 
@@ -1448,7 +1604,7 @@ document.observe("xwiki:dom:loaded", function () {
    * Ensures that the content menu is always visible when scrolling down.
    */
   function handleScroll() {
-    var menuExtras = $$('.annotationsettings');
+    var menuExtras = $$(".annotationsettings");
     var extraHeight = 0;
     if (menuExtras && menuExtras.size() > 0) {
       menu.__fm_extra = menuExtras[0];
@@ -1456,13 +1612,20 @@ document.observe("xwiki:dom:loaded", function () {
       extraHeight = menu.__fm_extra.getHeight();
     }
     var menuHeight = menu.getHeight();
-    var menuMaxTop = content.cumulativeOffset().top + content.getHeight() - menuHeight - extraHeight;
+    var menuMaxTop =
+      content.cumulativeOffset().top +
+      content.getHeight() -
+      menuHeight -
+      extraHeight;
     var menuMinTop = content.cumulativeOffset().top - menuHeight - extraHeight;
-    if (document.viewport.getScrollOffsets().top >= menuMinTop && document.viewport.getScrollOffsets().top < menuMaxTop) {
+    if (
+      document.viewport.getScrollOffsets().top >= menuMinTop &&
+      document.viewport.getScrollOffsets().top < menuMaxTop
+    ) {
       var menuWidth = content.getWidth();
       var menuLeft = content.cumulativeOffset().left;
       makeFixed(menu, 0, menuLeft, menuWidth);
-      makeFixed(menu.__fm_extra, menuHeight, menuLeft, (menuWidth - 50)); // magic number 50 = left+right padding
+      makeFixed(menu.__fm_extra, menuHeight, menuLeft, menuWidth - 50); // magic number 50 = left+right padding
     } else if (document.viewport.getScrollOffsets().top >= menuMaxTop) {
       makeAbsolute(menu, menuMaxTop);
       makeAbsolute(menu.__fm_extra, menuMaxTop + menuHeight);
@@ -1477,29 +1640,29 @@ document.observe("xwiki:dom:loaded", function () {
    * This clone prevents layout changes when moving the element outside its parent.
    * The clone will be stored in the __fm_ghost property of the element and is inserted
    * after the element in the DOM. The clone is not visible initially.
-   * 
+   *
    * @param element the element whose position and dimesions should be cloned
    */
   function createGhost(element) {
-    if (typeof (element.__fm_ghost) == 'undefined') {
-      element.__fm_ghost = new Element('div');
+    if (typeof element.__fm_ghost == "undefined") {
+      element.__fm_ghost = new Element("div");
       element.__fm_ghost.hide();
-      element.insert({ 'after': element.__fm_ghost });
+      element.insert({ after: element.__fm_ghost });
     }
     element.__fm_ghost.clonePosition(element, { setWidth: false });
   }
   /**
    * Pins the provided element at a certain position inside the window. The element's clone is made
    * visible to prevent layout changes.
-   * 
+   *
    * @see #createGhost
    */
   function makeFixed(element, top, left, width) {
     if (element) {
-      element.style.position = 'fixed';
-      element.style.top = top + 'px';
-      element.style.left = left + 'px';
-      element.style.width = width + 'px';
+      element.style.position = "fixed";
+      element.style.top = top + "px";
+      element.style.left = left + "px";
+      element.style.width = width + "px";
       element.__fm_ghost.show();
     }
   }
@@ -1508,8 +1671,8 @@ document.observe("xwiki:dom:loaded", function () {
    */
   function makeAbsolute(element, top) {
     if (element) {
-      element.style.position = 'absolute';
-      element.style.top = top + 'px';
+      element.style.position = "absolute";
+      element.style.top = top + "px";
       element.__fm_ghost.show();
     }
   }
@@ -1518,10 +1681,10 @@ document.observe("xwiki:dom:loaded", function () {
    */
   function makeScrollable(element) {
     if (element) {
-      element.style.position = '';
-      element.style.top = '';
-      element.style.left = '';
-      element.style.width = '';
+      element.style.position = "";
+      element.style.top = "";
+      element.style.left = "";
+      element.style.width = "";
       element.__fm_ghost.hide();
     }
   }
diff --git a/src/main/webapp/resources/js/xwiki/xwikiexplorer/xwikiexplorer.js b/src/main/webapp/resources/js/xwiki/xwikiexplorer/xwikiexplorer.js
deleted file mode 100644
index 9ae5da86a..000000000
--- a/src/main/webapp/resources/js/xwiki/xwikiexplorer/xwikiexplorer.js
+++ /dev/null
@@ -1,250 +0,0 @@
-if(typeof XWiki=="undefined"){alert("ERROR: xwikiexplorer.js depends on xwiki.js")
-}XWiki.constants.rest={baseRestURI:XWiki.contextPath+"/rest/",restChildrenRel:"http://www.xwiki.org/rel/children",restParentRel:"http://www.xwiki.org/rel/parent",restAttachmentsRel:"http://www.xwiki.org/rel/attachments",restHomeRel:"http://www.xwiki.org/rel/home"};
-isc.ClassFactory.defineClass("XWEResultTree",isc.ResultTree);
-isc.XWEResultTree.addClassProperties({constants:{addNodeSuffix:"..new",attachmentsTitle:"$msg.get('xwikiexplorer.attachments.title')",addPageTitle:"$msg.get('xwikiexplorer.addpage.title')",addAttachmentTitle:"$msg.get('xwikiexplorer.addattachment.title')"}});
-isc.XWEResultTree.addProperties({multiDSTree:true,callbacks:{dataArrived:new Array()},parentMap:{},displayLinks:true,displayAddPage:false,displayAddPageOnTop:true,displayAttachments:true,displayAttachmentsOnTop:false,displayAttachmentsWhenEmpty:false,displayAddAttachment:false,displayAddAttachmentOnTop:true,displayBlacklistedSpaces:false});
-isc.XWEResultTree.addMethods({getChildDataSource:function(E,D){var C=E[this.childTypeProperty];
-if(C!=null){return isc.DS.get(C)
-}var D=D||this.getNodeDataSource(E);
-if(D==null||!this.isMultiDSTree()){return this.getRootDataSource()
-}var B=this.treeRelations,A=D.getChildDataSources();
-var F=XWiki.resource.get(E.id);
-E.resource=F;
-if(D.Class=="XWEDataSource"){C=isc.XWEWikiDataSource.getOrCreate(F.wiki).getID()
-}else{if(D.Class=="XWEWikiDataSource"){C=isc.XWESpaceDataSource.getOrCreate(F.wiki,F.space).getID()
-}else{if(D.Class=="XWESpaceDataSource"){if(E.isXWikiAttachment==null){C=isc.XWESpaceDataSource.getOrCreate(F.wiki,F.space).getID()
-}else{C=isc.XWEAttachmentsDataSource.getOrCreate(F.wiki,F.space,F.name).getID()
-}}else{if(B){C=B[D.ID]
-}}}}if(C!=null){return isc.DS.get(C)
-}if(A!=null){return A[0]
-}},dataArrived:function(E){var I=this.getNodeDataSource(E);
-var C="";
-if(I==null){I=this.getDataSource()
-}if(I.Class=="XWEWikiDataSource"&&this.displayBlacklistedSpaces==false){this.filterNodesByName(this.getChildren(),XWiki.blacklistedSpaces)
-}var B=this.getChildren(E);
-for(var D=0;
-D"+G+""
-}isc.addProperties(B[D],{icon:A.icon,title:G,isNewPage:false,isNewAttachment:false});
-if(D==0){C=A.Class
-}}if(C=="XWESpaceDataSource"&&I.Class=="XWEWikiDataSource"&&this.displayAddPage==true){this.addAddPageNode(E)
-}if(I.Class=="XWESpaceDataSource"&&this.displayAttachments==true&&!E.isXWikiAttachment){this.addAttachmentsNode(E)
-}if(E.isXWikiAttachment&&this.displayAddAttachment==true){this.addAddAttachmentsNode(E)
-}if(this.callbacks.dataArrived.length>0){var H=this.callbacks.dataArrived.shift();
-H.callback()
-}},isFolder:function(D){var C=this.getNodeDataSource(D);
-if(C!=null){if(C.Class=="XWEDataSource"){return true
-}else{if(C.Class=="XWEWikiDataSource"){return true
-}else{if(C.Class=="XWESpaceDataSource"){if(D.isXWikiAttachment==true){return true
-}var A=(D.link!=null)?D.link:new Array();
-for(var B=0;
-B"+H+""
-}var A={id:G.id+XWiki.constants.anchorSeparator+XWiki.constants.docextraAttachmentsAnchor,fullName:G.fullName+XWiki.constants.anchorSeparator+XWiki.constants.docextraAttachmentsAnchor,wiki:G.wiki,space:G.space,title:H,name:G.name,parentId:G.id,xwikiRelativeURL:G.xwikiRelativeURL+XWiki.constants.anchorSeparator+XWiki.constants.docextraAttachmentsAnchor,icon:"$xwiki.getSkinFile('icons/silk/page_white_zip.gif', true)",resource:XWiki.resource.get(G.id+XWiki.constants.anchorSeparator+XWiki.constants.docextraAttachmentsAnchor),isXWikiAttachment:true,isNewPage:false,isNewAttachment:false};
-var C;
-if(this.displayAttachmentsOnTop==true){C=0
-}else{C=null
-}this.add(A,G,C)
-}}});
-isc.ClassFactory.defineClass("XWEDataSource",isc.DataSource);
-isc.XWEDataSource.addClassProperties({sep:"_"});
-isc.XWEDataSource.addProperties({dataFormat:"xml",xmlNamespaces:{xwiki:"http://www.xwiki.org"},resultTreeClass:"XWEResultTree",transformResponse:function(B,A,D){if(this.callbacks.transformResponse.length>0){var C=this.callbacks.transformResponse.shift();
-C.callback(B,A,D)
-}return B
-},dataURL:XWiki.constants.rest.baseRestURI+"wikis/",recordXPath:"/xwiki:wikis/xwiki:wiki",fields:[{name:"id",required:true,type:"text",primaryKey:true},{name:"name",type:"text"},{name:"title",type:"text"},{name:"xwikiRelativeUrl",type:"text"}],icon:"$xwiki.getSkinFile('icons/silk/database.gif', true)",requestProperties:{promptStyle:"cursor"},callbacks:{transformResponse:new Array()}});
-isc.XWEDataSource.addMethods({transformRequest:function(A){if(A.originalData){A.originalData.r=""+Math.floor(Math.random()*1000000)
-}return A.data
-}});
-isc.ClassFactory.defineClass("XWEWikiDataSource",isc.XWEDataSource);
-isc.XWEWikiDataSource.addClassMethods({getOrCreate:function(A){var C="XWEWikiDataSource_"+A;
-var B=this.get(C);
-if(B==null){B=this.create({ID:C,wiki:A})
-}return B
-}});
-isc.XWEWikiDataSource.addProperties({wiki:XWiki.currentWiki,recordXPath:"/xwiki:spaces/xwiki:space",fields:[{name:"id",required:true,type:"text",primaryKey:true},{name:"name",required:true,type:"text"},{name:"title",type:"text"},{name:"xwikiRelativeUrl",type:"text"}],icon:"$xwiki.getSkinFile('icons/silk/folder.gif', true)"});
-isc.XWEWikiDataSource.addMethods({init:function(){this.dataURL=XWiki.constants.rest.baseRestURI+"wikis/"+this.wiki+"/spaces";
-this.Super("init",arguments)
-}});
-isc.ClassFactory.defineClass("XWESpaceDataSource",isc.XWEDataSource);
-isc.XWESpaceDataSource.addClassMethods({getOrCreate:function(A,C){var D="XWESpaceDataSource_"+A+isc.XWEDataSource.sep+C;
-var B=this.get(D);
-if(B==null){B=this.create({ID:D,wiki:A,space:C})
-}return B
-}});
-isc.XWESpaceDataSource.addProperties({wiki:"xwiki",space:"Main",recordXPath:"/xwiki:pages/xwiki:pageSummary",fields:[{name:"id",required:true,type:"text",primaryKey:true},{name:"fullName",required:true,type:"text"},{name:"wiki",required:true,type:"text"},{name:"space",required:true,type:"text"},{name:"name",required:true,type:"text"},{name:"title",required:true,type:"text"},{name:"parentId",required:true,type:"text",foreignKey:"id"},{name:"parent",required:true,type:"text"},{name:"xwikiRelativeUrl",type:"text"},{name:"link",propertiesOnly:true}],icon:"$xwiki.getSkinFile('icons/silk/page_white_text.gif', true)"});
-isc.XWESpaceDataSource.addMethods({init:function(){this.dataURL=XWiki.constants.rest.baseRestURI+"wikis/"+this.wiki+"/spaces/"+this.space+"/pages";
-this.transformRequest=function(A){var B=this.wiki+XWiki.constants.wikiSpaceSeparator+this.space;
-if(A.originalData.parentId==B||A.originalData.parentId==null){A.originalData.parentId="^(?!"+B+".).*$"
-}return this.Super("transformRequest",arguments)
-};
-this.Super("init",arguments)
-}});
-isc.ClassFactory.defineClass("XWEPageDataSource",isc.XWEDataSource);
-isc.XWEPageDataSource.addClassMethods({getOrCreate:function(A,D,C){var E="XWEPageDataSource_"+A+isc.XWEDataSource.sep+D+isc.XWEDataSource.sep+C;
-var B=this.get(E);
-if(B==null){B=this.create({ID:E,wiki:A,space:D,page:C})
-}return B
-}});
-isc.XWEPageDataSource.addProperties({wiki:"xwiki",space:"Main",page:"WebHome",recordXPath:"/xwiki:page",fields:[{name:"id",required:true,type:"text",primaryKey:true},{name:"wiki",required:true,type:"text"},{name:"space",required:true,type:"text"},{name:"name",required:true,type:"text"},{name:"parentId",required:true,type:"text"},{name:"parent",required:true,type:"text"},{name:"link",propertiesOnly:true}],icon:"$xwiki.getSkinFile('icons/silk/page_white_text.gif', true)"});
-isc.XWEPageDataSource.addMethods({init:function(){this.dataURL=XWiki.constants.rest.baseRestURI+"wikis/"+this.wiki+"/spaces/"+this.space+"/pages/"+this.page;
-this.Super("init",arguments)
-}});
-isc.ClassFactory.defineClass("XWEAttachmentsDataSource",isc.XWEDataSource);
-isc.XWEAttachmentsDataSource.addClassMethods({getOrCreate:function(A,D,C){var E="XWEAttachmentsDataSource_"+A+isc.XWEDataSource.sep+D+isc.XWEDataSource.sep+C;
-var B=this.get(E);
-if(B==null){B=this.create({ID:E,wiki:A,space:D,page:C})
-}return B
-}});
-isc.XWEAttachmentsDataSource.addProperties({wiki:"xwiki",space:"Main",page:"WebHome",recordXPath:"/xwiki:attachments/xwiki:attachment",fields:[{name:"id",required:true,type:"text",primaryKey:true},{name:"name",required:true,type:"text"},{name:"title",type:"text"},{name:"xwikiRelativeUrl",type:"text"}],icon:"$xwiki.getSkinFile('icons/silk/attach.gif', true)"});
-isc.XWEAttachmentsDataSource.addMethods({init:function(){this.dataURL=XWiki.constants.rest.baseRestURI+"wikis/"+this.wiki+"/spaces/"+this.space+"/pages/"+this.page+"/attachments";
-this.Super("init",arguments)
-}});
-isc.ClassFactory.defineClass("XWETreeGrid",isc.TreeGrid);
-isc.XWETreeGrid.addProperties({autoDraw:false,autoFetchData:true,nodeClick:function(C,A,B){this.nodeClickCallback(C,A,B)
-},showHeader:false,folderIcon:"$xwiki.getSkinFile('icons/silk/database.gif', true)",position:"relative",dropIconSuffix:"",openIconSuffix:"",closedIconSuffix:"",animateFolders:false,wiki:XWiki.currentWiki,space:null,displaySuggest:true,defaultValue:"Main.WebHome",inputValueCache:""});
-isc.XWETreeGrid.addMethods({draw:function(){if(this.Super("draw",arguments)!=null){return this
-}if(typeof this.input=="undefined"&&this.input==null){this.drawInput()
-}for(member in this){if(typeof member!="function"&&member.startsWith("display")){this.data[member]=this[member]
-}}var A="div.listGrid td, div.listGrid table {margin:0;padding:0;} div.listGrid td {border:0;color:#333;} #actionmenu {z-index: 999999;}";
-var C=document.getElementsByTagName("head")[0];
-var B=document.createElement("style");
-B.type="text/css";
-B.media="screen";
-if(B.styleSheet){B.styleSheet.cssText=A
-}else{B.appendChild(document.createTextNode(A))
-}C.appendChild(B)
-},invalidateCache:function(){this.Super("invalidateCache",arguments);
-this.inputValueCache=""
-},openNode:function(A,E,B){var D={treeId:this.getID(),callback:function(){window[this.treeId].openNodesFromInput()
-}};
-var C=A.findById(E);
-if(C!=null){if(A.isFolder(C)&&!A.isOpen(C)){if(B==true){this.getData().callbacks.dataArrived.push(D)
-}A.openFolder(C);
-return null
-}this.selectNodeAndScroll(C);
-return C
-}return null
-},selectNodeAndScroll:function(A){this.deselectAllRecords();
-this.selectRecord(A);
-nodeYPos=this.getFocusRow()*this.getRowHeight();
-this.body.scrollTo(this.body.getScrollLeft(),nodeYPos)
-},openParent:function(A,D){if(D.name!=""){if(A.parentMap[D.prefixedFullName]==null){var E=isc.XWEPageDataSource.getOrCreate(D.wiki,D.space,D.name);
-var C=function(J,I,L,H){if(J.httpResponseCode==200){var G=XWiki.resource.get(J.data[0].parent);
-var F=A.findById(G.fullName);
-A.parentMap[D.prefixedFullName]=G;
-if(A.findById(G.prefixedFullName)!=null){this.openNode(A,G.prefixedFullName,true)
-}else{this.openParent(A,G)
-}}else{if(this.displayAddPage==true){var K=this.getData().findById(D.prefixedSpace+isc.XWEResultTree.constants.addNodeSuffix);
-K.resource=D;
-this.selectNodeAndScroll(K)
-}}}.bind(this);
-E.fetchData(null,C,null)
-}else{var B=A.parentMap[D.prefixedFullName];
-if(A.findById(B.prefixedFullName)!=null){this.openNode(A,B.prefixedFullName,true)
-}else{this.openParent(A,B)
-}}}},openNodesFromInput:function(){var I=this.getDataSource().Class;
-var D=XWiki.resource.get(this.input.value);
-var B=XWiki.resource.get("");
-var E=this.getData();
-if(this.getSelectedRecord()!=null){B=this.getSelectedRecord().resource
-}if(I=="XWEDataSource"){var J=this.openNode(E,D.wiki,true);
-if(J==null){return 
-}}if(I=="XWEDataSource"||I=="XWEWikiDataSource"){if(D.space!=B.space){this.deselectRecord(this.getSelectedRecord())
-}var F=this.openNode(E,D.prefixedSpace,true);
-if(F==null){return 
-}}var K=this.openNode(E,D.prefixedFullName,true);
-if(K==null){this.openParent(E,D)
-}if(B.attachment!=D.attachment||(B.anchor!=D.anchor&&D.anchor==XWiki.constants.docextraAttachmentsAnchor)){var C=D.prefixedFullName+XWiki.constants.anchorSeparator+XWiki.constants.docextraAttachmentsAnchor;
-var A=this.openNode(E,C,true);
-if(A==null){return 
-}var G=D.prefixedFullName+XWiki.constants.pageAttachmentSeparator+D.attachment;
-var H=this.openNode(E,G,false)
-}return 
-},inputObserver:function(){var A=this.input.value;
-if(A!=""&&A!=this.inputValueCache){this.openNodesFromInput();
-this.inputValueCache=A
-}setTimeout(this.inputObserver.bind(this),2000)
-},drawInput:function(){var D=(this.displaySuggest==false)?"hidden":"text";
-var A=this.width-6;
-var B=document.createElement("input");
-B.setAttribute("id",this.getID()+"_Input");
-B.setAttribute("name",this.getID()+"_Input");
-B.setAttribute("style","width:"+A+"px;clear:both");
-B.setAttribute("type",D);
-if(this.defaultValue){B.setAttribute("value",this.defaultValue)
-}this.htmlElement.appendChild(B);
-this.input=B;
-if(this.displaySuggest){var C=function(){var F=new ajaxSuggest(this,{script:"/xwiki/rest/wikis/"+XWiki.currentWiki+"/search?scope=name&",varname:"q"});
-F.setSuggestions=function(K){this.aSuggestions=[];
-var H=K.responseXML;
-var J=H.getElementsByTagName("searchResult");
-for(var I=0;
-I this.translations = celMessages.code);
+    } else {
+        console.warn('celExecOnceAfterMessagesLoaded not available!');
+    }
     this.showingLineNumbers = initialShowLineNumbers;
     this.toggleLink = $('toggleLineNumbers');
-    this.showText = "$msg.get('core.viewers.code.showLineNumbers')";
-    this.hideText = "$msg.get('core.viewers.code.hideLineNumbers')";
+    this.showText = this.translations.showLineNumbers;
+    this.hideText = this.translations.hideLineNumbers;
     if (this.toggleLink) {
       this.textarea = this.toggleLink.up().down('textarea');
       if (this.textarea) {
diff --git a/src/main/webapp/resources/uicomponents/viewers/comments.css b/src/main/webapp/resources/uicomponents/viewers/comments.css
index 25ac1765f..32546b00f 100644
--- a/src/main/webapp/resources/uicomponents/viewers/comments.css
+++ b/src/main/webapp/resources/uicomponents/viewers/comments.css
@@ -1,26 +1,119 @@
-.commentthread{margin:0 0 0 32px;}
-.commentthread fieldset{margin:0!important;padding:0 0 8px 0;border:none;}
-ul.commentreplies,li.reply{margin:0;padding:0;text-indent:0;}
-li.reply{list-style-type:none;}
-* html .reply{border-top:1px solid #FFF;}
-.xwikicomment{padding:0 0 8px;border:none;}
-.commentheader{border-bottom:1px solid #DDD;margin:0;padding:2px 0;}
-.commentheader:hover{background-color:#FFD;}
-.commentauthor{font-size:120%;}
-.commentdate{font-size:80%;}
-.commentcontent{border:none;padding:0 36px 0 32px;margin:0;font-size:100%;font-style:italic;text-align:justify;}
-.commenttools{display:block;float:right;margin-top:-1.2em;}
-.commenttool a{width:16px;height:16px;text-indent:30px;line-height:30px;overflow:hidden;background:transparent left top no-repeat;display:block;float:left;margin:0 0 0 4px;}
-.commentdelete a{background-image:url($xwiki.getSkinFile('icons/silk/cross.gif', true));}
-.commentreply a{background-image:url($xwiki.getSkinFile('icons/silk/comments_add.gif', true));}
-#AddComment{border-top:1px solid #DDD;}
-.commentthread #AddComment legend{display:none;}
-.commentthread #AddComment{border-top:none;}
-#xwikidata #AddComment{width:auto;}
-#AddComment .commentcontainer{padding:4px 32px;background:transparent url($xwiki.getSkinFile('icons/xwiki/rquo.gif', true)) right 4px no-repeat;}
-#AddComment .commentcontainer label{width:24px;height:24px;text-indent:0;font-size:1px;line-height:120px;overflow:hidden;background:transparent url($xwiki.getSkinFile('icons/xwiki/lquo.gif', true)) left top no-repeat;display:inline;float:left;margin-left:-32px;}
-#AddComment .commentcontainer textarea{border:1px solid #DDD;width:100%;}
-* html #AddComment .commentcontainer textarea{width:98%;}
-#AddComment label{font-weight:bold;}
-div.notification{background-color:#FFD;padding:2px 32px;border:1px solid #DDD;font-size:80%;font-style:italic;margin:4px 0;}
-#xwikidata #commentscontent{background:transparent;}
\ No newline at end of file
+.commentthread {
+  margin: 0 0 0 32px;
+}
+.commentthread fieldset {
+  margin: 0 !important;
+  padding: 0 0 8px 0;
+  border: none;
+}
+ul.commentreplies,
+li.reply {
+  margin: 0;
+  padding: 0;
+  text-indent: 0;
+}
+li.reply {
+  list-style-type: none;
+}
+* html .reply {
+  border-top: 1px solid #fff;
+}
+.xwikicomment {
+  padding: 0 0 8px;
+  border: none;
+}
+.commentheader {
+  border-bottom: 1px solid #ddd;
+  margin: 0;
+  padding: 2px 0;
+}
+.commentheader:hover {
+  background-color: #ffd;
+}
+.commentauthor {
+  font-size: 120%;
+}
+.commentdate {
+  font-size: 80%;
+}
+.commentcontent {
+  border: none;
+  padding: 0 36px 0 32px;
+  margin: 0;
+  font-size: 100%;
+  font-style: italic;
+  text-align: justify;
+}
+.commenttools {
+  display: block;
+  float: right;
+  margin-top: -1.2em;
+}
+.commenttool a {
+  width: 16px;
+  height: 16px;
+  text-indent: 30px;
+  line-height: 30px;
+  overflow: hidden;
+  background: transparent left top no-repeat;
+  display: block;
+  float: left;
+  margin: 0 0 0 4px;
+}
+.commentdelete a {
+  background-image: url(/skin/resources/icons/silk/cross.gif);
+}
+.commentreply a {
+  background-image: url(/skin/resources/icons/silk/comments_add.gif);
+}
+#AddComment {
+  border-top: 1px solid #ddd;
+}
+.commentthread #AddComment legend {
+  display: none;
+}
+.commentthread #AddComment {
+  border-top: none;
+}
+#xwikidata #AddComment {
+  width: auto;
+}
+#AddComment .commentcontainer {
+  padding: 4px 32px;
+  background: transparent url(/skin/resources/icons/xwiki/rquo.gif) right 4px
+    no-repeat;
+}
+#AddComment .commentcontainer label {
+  width: 24px;
+  height: 24px;
+  text-indent: 0;
+  font-size: 1px;
+  line-height: 120px;
+  overflow: hidden;
+  background: transparent url(/skin/resources/icons/xwiki/lquo.gif) left top
+    no-repeat;
+  display: inline;
+  float: left;
+  margin-left: -32px;
+}
+#AddComment .commentcontainer textarea {
+  border: 1px solid #ddd;
+  width: 100%;
+}
+* html #AddComment .commentcontainer textarea {
+  width: 98%;
+}
+#AddComment label {
+  font-weight: bold;
+}
+div.notification {
+  background-color: #ffd;
+  padding: 2px 32px;
+  border: 1px solid #ddd;
+  font-size: 80%;
+  font-style: italic;
+  margin: 4px 0;
+}
+#xwikidata #commentscontent {
+  background: transparent;
+}
diff --git a/src/main/webapp/resources/uicomponents/viewers/comments.js b/src/main/webapp/resources/uicomponents/viewers/comments.js
index 06b604520..1fdcab5cf 100644
--- a/src/main/webapp/resources/uicomponents/viewers/comments.js
+++ b/src/main/webapp/resources/uicomponents/viewers/comments.js
@@ -1,423 +1,565 @@
 var XWiki = (function (XWiki) {
-// Start XWiki augmentation.
-var viewers = XWiki.viewers = XWiki.viewers || {};
-/**
- * Javascript enhancements for the comments viewer.
- */
-viewers.Comments = Class.create({
-  xcommentSelector : ".xwikicomment",
-  /** Constructor. Adds all the JS improvements of the Comments area. */
-  initialize : function() {
-    if ($("commentscontent")) {
-      // If the comments area is already visible, enhance it.
-      this.startup();
-    }
-    if ($("Commentstab")) {
-      this.container = $("Commentspane");
-      this.generatorTemplate = "commentsinline.vm";
-    } else if ($$(".main.layoutsubsection").size() > 0 && $$(".main.layoutsubsection").first().down("#commentscontent")) {
-      this.container = $$(".main.layoutsubsection").first();
-      this.generatorTemplate = "comments.vm";
-    }
-    // We wait for a notification for the AJAX loading of the Comments metadata tab.
-    this.addTabLoadListener();
-  },
-  /** Enhance the Comments UI with JS behaviors. */
-  startup : function() {
-    if ($("commentform")) {
-      this.form = $("commentform").up("form");
-    } else {
-      this.form = undefined;
-    }
-    this.loadIDs();
-    this.addDeleteListener();
-    this.addReplyListener();
-    this.addSubmitListener(this.form);
-    this.addCancelListener();
-    this.addEditListener();
-    this.addPreview(this.form);
-  },
+  // Start XWiki augmentation.
+  var viewers = (XWiki.viewers = XWiki.viewers || {});
+
   /**
-   * Parse the IDs of the comments to obtain the xobject number.
+   * Javascript enhancements for the comments viewer.
    */
-  loadIDs : function() {
-    $$(this.xcommentSelector).each(function(item) {
-      var elementId = item.id;
-      item._x_number = elementId.substring(elementId.lastIndexOf("_") + 1) - 0;
-    });
-  },
-  /**
-   * Ajax comment deletion.
-   * For all delete buttons, listen to "click", and make ajax request to remove the comment. Remove the corresponding
-   * HTML element on succes (replace it with a small notification message). Display error message (alert) on failure.
-   */
-  addDeleteListener : function() {
-    $$(this.xcommentSelector).each(function(item) {
-      // Prototype bug in Opera: $$(".comment a.delete") returns only the first result.
-      // Quick fix until Prototype 1.6.1 is integrated.
-      item = item.down('a.delete');
-      if (!item) {
-        return;
+  viewers.Comments = Class.create({
+    translations: translations,
+    xcommentSelector: ".xwikicomment",
+    /** Constructor. Adds all the JS improvements of the Comments area. */
+    initialize: function () {
+      if (window.celExecOnceAfterMessagesLoaded) {
+        window.celExecOnceAfterMessagesLoaded(
+          (celMessages) => (this.translations = celMessages.comments),
+        );
+      } else {
+        console.warn("celExecOnceAfterMessagesLoaded not available!");
       }
-      item.observe('click', function(event) {
-        item.blur();
-        event.stop();
-        if (item.disabled) {
-          // Do nothing if the button was already clicked and it's waiting for a response from the server.
-          return;
-        } else {
-          new XWiki.widgets.ConfirmedAjaxRequest(
-            /* Ajax request URL */
-            item.readAttribute('href') + (Prototype.Browser.Opera ? "" : "&ajax=1"),
-            /* Ajax request parameters */
-            {
-              onCreate : function() {
-                // Disable the button, to avoid a cascade of clicks from impatient users
-                item.disabled = true;
-              },
-              onSuccess : function() {
-                // Remove the corresponding HTML element from the UI and update the comment count
+      if ($("commentscontent")) {
+        // If the comments area is already visible, enhance it.
+        this.startup();
+      }
+      if ($("Commentstab")) {
+        this.container = $("Commentspane");
+        this.generatorTemplate = "commentsinline.vm";
+      } else if (
+        $$(".main.layoutsubsection").size() > 0 &&
+        $$(".main.layoutsubsection").first().down("#commentscontent")
+      ) {
+        this.container = $$(".main.layoutsubsection").first();
+        this.generatorTemplate = "comments.vm";
+      }
+      // We wait for a notification for the AJAX loading of the Comments metadata tab.
+      this.addTabLoadListener();
+    },
+    /** Enhance the Comments UI with JS behaviors. */
+    startup: function () {
+      if ($("commentform")) {
+        this.form = $("commentform").up("form");
+      } else {
+        this.form = undefined;
+      }
+      this.loadIDs();
+      this.addDeleteListener();
+      this.addReplyListener();
+      this.addSubmitListener(this.form);
+      this.addCancelListener();
+      this.addEditListener();
+      this.addPreview(this.form);
+    },
+    /**
+     * Parse the IDs of the comments to obtain the xobject number.
+     */
+    loadIDs: function () {
+      $$(this.xcommentSelector).each(function (item) {
+        var elementId = item.id;
+        item._x_number =
+          elementId.substring(elementId.lastIndexOf("_") + 1) - 0;
+      });
+    },
+    /**
+     * Ajax comment deletion.
+     * For all delete buttons, listen to "click", and make ajax request to remove the comment. Remove the corresponding
+     * HTML element on succes (replace it with a small notification message). Display error message (alert) on failure.
+     */
+    addDeleteListener: function () {
+      $$(this.xcommentSelector).each(
+        function (item) {
+          // Prototype bug in Opera: $$(".comment a.delete") returns only the first result.
+          // Quick fix until Prototype 1.6.1 is integrated.
+          item = item.down("a.delete");
+          if (!item) {
+            return;
+          }
+          item.observe(
+            "click",
+            function (event) {
+              item.blur();
+              event.stop();
+              if (item.disabled) {
+                // Do nothing if the button was already clicked and it's waiting for a response from the server.
+                return;
+              } else {
+                new XWiki.widgets.ConfirmedAjaxRequest(
+                  /* Ajax request URL */
+                  item.readAttribute("href") +
+                    (Prototype.Browser.Opera ? "" : "&ajax=1"),
+                  /* Ajax request parameters */
+                  {
+                    onCreate: function () {
+                      // Disable the button, to avoid a cascade of clicks from impatient users
+                      item.disabled = true;
+                    },
+                    onSuccess: function () {
+                      // Remove the corresponding HTML element from the UI and update the comment count
+                      var comment = item.up(this.xcommentSelector);
+                      // If the form is inside this comment's reply thread, move it back to the bottom.
+                      if (
+                        this.form &&
+                        this.form.descendantOf(comment.next(".commentthread"))
+                      ) {
+                        this.resetForm();
+                      }
+                      // Replace the comment with a "deleted comment" placeholder
+                      comment.replace(
+                        this.createNotification(this.translations.commentDeleted),
+                      );
+                      this.updateCount();
+                    }.bind(this),
+                    onComplete: function () {
+                      // In the end: re-enable the button
+                      item.disabled = false;
+                    },
+                  },
+                  /* Interaction parameters */
+                  {
+                    confirmationText: this.translations.deleteConfirm,
+                    progressMessageText: this.translations.deleteInProgress,
+                    successMessageText: this.translations.deleteDone,
+                    failureMessageText: this.translations.deleteFailed,
+                  },
+                );
+              }
+            }.bindAsEventListener(this),
+          );
+        }.bind(this),
+      );
+    },
+    /**
+     * Ajax comment editing.
+     * For all edit buttons, listen to "click", and make ajax request to retrieve the form and save the comment.
+     */
+    addEditListener: function () {
+      $$(this.xcommentSelector).each(
+        function (item) {
+          // Prototype bug in Opera: $$(".comment a.delete") returns only the first result.
+          // Quick fix until Prototype 1.6.1 is integrated.
+          item = item.down("a.edit");
+          if (!item) {
+            return;
+          }
+          item.observe(
+            "click",
+            function (event) {
+              item.blur();
+              event.stop();
+              if (item.disabled) {
+                // Do nothing if the button was already clicked and it's waiting for a response from the server.
+                return;
+              } else if (item._x_editForm) {
+                // If the form was already fetched, but hidden after cancel, just show it again
+                // without making a new request
                 var comment = item.up(this.xcommentSelector);
-                // If the form is inside this comment's reply thread, move it back to the bottom.
-                if (this.form && this.form.descendantOf(comment.next('.commentthread'))) {
-                  this.resetForm();
-                }
-                // Replace the comment with a "deleted comment" placeholder
-                comment.replace(this.createNotification("$msg.get('core.viewers.comments.commentDeleted')"));
-                this.updateCount();
-              }.bind(this),
-              onComplete : function() {
-                // In the end: re-enable the button
-                item.disabled = false;
+                comment.hide();
+                item._x_editForm.show();
+              } else {
+                new Ajax.Request(
+                  /* Ajax request URL */
+                  item
+                    .readAttribute("href")
+                    .replace(
+                      "viewer=comments",
+                      "xpage=xpart&vm=commentsinline.vm",
+                    ),
+                  /* Ajax request parameters */
+                  {
+                    onCreate: function () {
+                      // Disable the button, to avoid a cascade of clicks from impatient users
+                      item.disabled = true;
+                      item._x_notification = new XWiki.widgets.Notification(
+                        this.translations.editFormFetchInProgress,
+                        "inprogress",
+                      );
+                    },
+                    onSuccess: function (response) {
+                      // Hide other comment editing forms (allow only one comment to be edited at a time)
+                      if (this.editing) {
+                        this.cancelEdit(false, this.editing);
+                      }
+                      // Replace the comment text with a form for editing it
+                      var comment = item.up(this.xcommentSelector);
+                      comment.insert({ before: response.responseText });
+                      item._x_editForm = comment.previous();
+                      this.addSubmitListener(item._x_editForm);
+                      this.addPreview(item._x_editForm);
+                      item._x_editForm
+                        .down("a.cancel")
+                        .observe(
+                          "click",
+                          this.cancelEdit.bindAsEventListener(this, item),
+                        );
+                      comment.hide();
+                      item._x_notification.hide();
+                      // Currently editing: this comment
+                      this.editing = item;
+                    }.bind(this),
+                    onFailure: function (response) {
+                      var failureReason = response.statusText;
+                      if (
+                        response.statusText == "" /* No response */ ||
+                        response.status == 12031 /* In IE */
+                      ) {
+                        failureReason = "Server not responding";
+                      }
+                      item._x_notification.replace(
+                        new XWiki.widgets.Notification(
+                          this.translations.editFormFetchFailed + failureReason,
+                          "error",
+                        ),
+                      );
+                    }.bind(this),
+                    on0: function (response) {
+                      response.request.options.onFailure(response);
+                    },
+                    onComplete: function () {
+                      // In the end: re-enable the button
+                      item.disabled = false;
+                    },
+                  },
+                );
               }
-            },
-            /* Interaction parameters */
-            {
-               confirmationText: "$msg.get('core.viewers.comments.delete.confirm')",
-               progressMessageText : "$msg.get('core.viewers.comments.delete.inProgress')",
-               successMessageText : "$msg.get('core.viewers.comments.delete.done')",
-               failureMessageText : "$msg.get('core.viewers.comments.delete.failed')"
-            }
+            }.bindAsEventListener(this),
           );
-        }
-      }.bindAsEventListener(this));
-    }.bind(this));
-  },
-  /**
-   * Ajax comment editing.
-   * For all edit buttons, listen to "click", and make ajax request to retrieve the form and save the comment.
-   */
-  addEditListener : function() {
-    $$(this.xcommentSelector).each(function(item) {
-      // Prototype bug in Opera: $$(".comment a.delete") returns only the first result.
-      // Quick fix until Prototype 1.6.1 is integrated.
-      item = item.down('a.edit');
-      if (!item) {
-        return;
-      }
-      item.observe('click', function(event) {
-        item.blur();
+        }.bind(this),
+      );
+    },
+    /**
+     * Cancel edit
+     */
+    cancelEdit: function (event, editActivator) {
+      if (event) {
         event.stop();
-        if (item.disabled) {
-          // Do nothing if the button was already clicked and it's waiting for a response from the server.
-          return;
-        } else if (item._x_editForm){
-          // If the form was already fetched, but hidden after cancel, just show it again
-          // without making a new request
-          var comment = item.up(this.xcommentSelector);
-          comment.hide();
-          item._x_editForm.show();
-        } else {
-          new Ajax.Request(
-            /* Ajax request URL */
-            item.readAttribute('href').replace('viewer=comments', 'xpage=xpart&vm=commentsinline.vm'),
-            /* Ajax request parameters */
-            {
-              onCreate : function() {
-                // Disable the button, to avoid a cascade of clicks from impatient users
-                item.disabled = true;
-                item._x_notification = new XWiki.widgets.Notification("$msg.get('core.viewers.comments.editForm.fetch.inProgress')", "inprogress");
-              },
-              onSuccess : function(response) {
-                // Hide other comment editing forms (allow only one comment to be edited at a time)
-                if (this.editing) {
-                  this.cancelEdit(false, this.editing);
+      }
+      var comment = editActivator.up(this.xcommentSelector);
+      editActivator._x_editForm.hide();
+      comment.show();
+      this.cancelPreview(editActivator._x_editForm);
+      this.editing = false;
+    },
+    /**
+     * Inline reply: Move the form under the replied comment and update the hidden "replyto" field.
+     */
+    addReplyListener: function () {
+      if (this.form) {
+        $$(this.xcommentSelector).each(
+          function (item) {
+            // Prototype bug in Opera: $$(".comment a.commentreply") returns only the first result.
+            // Quick fix until Prototype 1.6.1 is integrated.
+            item = item.down("a.commentreply");
+            if (!item) {
+              return;
+            }
+            item.observe(
+              "click",
+              function (event) {
+                item.blur();
+                event.stop();
+                // If the form was already displayed as a reply, re-enable the Reply button for the old location
+                if (this.form.up(".commentthread")) {
+                  this.form
+                    .up(".commentthread")
+                    .previous(this.xcommentSelector)
+                    .down("a.commentreply")
+                    .show();
                 }
-                // Replace the comment text with a form for editing it
-                var comment = item.up(this.xcommentSelector);
-                comment.insert({before: response.responseText});
-                item._x_editForm = comment.previous();
-                this.addSubmitListener(item._x_editForm);
-                this.addPreview(item._x_editForm);
-                item._x_editForm.down('a.cancel').observe('click', this.cancelEdit.bindAsEventListener(this, item));
-                comment.hide();
-                item._x_notification.hide();
-                // Currently editing: this comment
-                this.editing = item;
+                // Insert the form on top of that comment's discussion
+                item
+                  .up(this.xcommentSelector)
+                  .next(".commentthread")
+                  .insert({ top: this.form });
+                // Set the replyto field to the replied comment's number
+                this.form["XWiki.XWikiComments_replyto"].value = item.up(
+                  this.xcommentSelector,
+                )._x_number;
+                // Clear the contents and focus the textarea
+                this.form["XWiki.XWikiComments_comment"].value = "";
+                this.form["XWiki.XWikiComments_comment"].focus();
+                // Hide the reply button
+                item.hide();
+              }.bindAsEventListener(this),
+            );
+          }.bind(this),
+        );
+      } else {
+        // If, for some reason, the form is missing, hide the reply functionality from the user
+        $$(this.xcommentSelector + " a.commentreply").each(function (item) {
+          item.hide();
+        });
+      }
+    },
+    /**
+     * When pressing Submit, check that the comment is not empty. Submit the form with ajax and update the whole comments
+     * zone on success.
+     */
+    addSubmitListener: function (form) {
+      if (form) {
+        // Add listener for submit
+        form.down("input[type='submit']").observe(
+          "click",
+          function (event) {
+            event.stop();
+            if (form.down("textarea").value != "") {
+              var formData = new Hash(form.serialize(true));
+              formData.set(
+                "xredirect",
+                window.docgeturl + "?xpage=xpart&vm=" + this.generatorTemplate,
+              );
+              // Allows CommentAddAction to parse a template which will return a message telling if the captcha was wrong.
+              formData.set("xpage", "xpart");
+              formData.set("vm", this.generatorTemplate);
+              // Strip whatever query string is supplied by the form so it doesn't override the formData.
+              var url = form.action.replace(/\?.*/, "");
+              formData.unset("action_cancel");
+              // Create a notification message to display to the user when the submit is being sent
+              form._x_notification = new XWiki.widgets.Notification(
+                this.translations.addInProgress,
+                "inprogress",
+              );
+              form.disable();
+              this.restartNeeded = false;
+              new Ajax.Request(url, {
+                method: "post",
+                parameters: formData,
+                onSuccess: function () {
+                  this.restartNeeded = true;
+                  this.editing = false;
+                  form._x_notification.replace(
+                    new XWiki.widgets.Notification(
+                      this.translations.addDone,
+                      "done",
+                    ),
+                  );
+                }.bind(this),
+                onFailure: function (response) {
+                  var failureReason = response.statusText;
+                  if (
+                    response.statusText == "" /* No response */ ||
+                    response.status == 12031 /* In IE */
+                  ) {
+                    failureReason = "Server not responding";
+                  }
+                  form._x_notification.replace(
+                    new XWiki.widgets.Notification(
+                      this.translations.addFailed + failureReason,
+                      "error",
+                    ),
+                  );
+                }.bind(this),
+                on0: function (response) {
+                  response.request.options.onFailure(response);
+                },
+                onComplete: function (response) {
+                  if (this.restartNeeded) {
+                    this.container.update(response.responseText);
+                    document.fire("xwiki:docextra:loaded", {
+                      id: "Comments",
+                      element: this.container,
+                    });
+                    this.updateCount();
+                  } else {
+                    form.enable();
+                  }
+                }.bind(this),
+              });
+            }
+          }.bindAsEventListener(this),
+        );
+      }
+    },
+    /**
+     * When pressing Cancel, reset the form.
+     */
+    addCancelListener: function () {
+      if (this.form) {
+        this.initialLocation = new Element("span", { className: "hidden" });
+        $("_comments").insert(this.initialLocation);
+        // If the form is inside a thread, as a reply form, move it back to the bottom.
+        this.form
+          .down("a.cancel")
+          .observe("click", this.resetForm.bindAsEventListener(this));
+      }
+    },
+    /**
+     * Add a preview button that generates the rendered comment,
+     */
+    addPreview: function (form) {
+      if (!form) {
+        return;
+      }
+      var previewURL =  "/preview/__space__/__page__"
+        .replace(
+          "__space__",
+          encodeURIComponent($$("meta[name=space]")[0].content),
+        )
+        .replace(
+          "__page__",
+          encodeURIComponent($$("meta[name=page]")[0].content),
+        );
+      form.commentElt = form.down("textarea");
+      var buttons = form.down("input[type=submit]").up("div");
+      form.previewButton = new Element("span", {
+        class: "buttonwrapper",
+      }).update(
+        new Element("input", {
+          type: "button",
+          class: "button",
+          value: this.translations.previewButtonPreview,
+        }),
+      );
+      form.previewButton._x_modePreview = false;
+      form.previewContent = new Element("div", {
+        class: "commentcontent commentPreview",
+      });
+      form.commentElt.insert({ before: form.previewContent });
+      form.previewContent.hide();
+      buttons.insert({ top: form.previewButton });
+      form.previewButton.observe(
+        "click",
+        function () {
+          if (
+            !form.previewButton._x_modePreview &&
+            !form.previewButton.disabled
+          ) {
+            form.previewButton.disabled = true;
+            var notification = new XWiki.widgets.Notification(
+              this.translations.previewInProgress,
+              "inprogress",
+            );
+            new Ajax.Request(previewURL, {
+              method: "post",
+              parameters: { xpage: "plain", content: form.commentElt.value },
+              onSuccess: function (response) {
+                this.doPreview(response.responseText, form);
+                notification.hide();
+              }.bind(this),
+              /* If the content is empty or does not generate anything, we have the "This template does not exist" response,
+               with a 400 status code. */
+              on400: function (response) {
+                this.doPreview(" ", form);
+                notification.hide();
               }.bind(this),
-              onFailure : function (response) {
+              onFailure: function (response) {
                 var failureReason = response.statusText;
-                if (response.statusText == '' /* No response */ || response.status == 12031 /* In IE */) {
-                  failureReason = 'Server not responding';
+                if (
+                  response.statusText == "" /* No response */ ||
+                  response.status == 12031 /* In IE */
+                ) {
+                  failureReason = "Server not responding";
                 }
-                item._x_notification.replace(new XWiki.widgets.Notification("$msg.get('core.viewers.comments.editForm.fetch.failed')" + failureReason, "error"));
-              }.bind(this),
-              on0 : function (response) {
+                notification.replace(
+                  new XWiki.widgets.Notification(
+                    this.translations.previewFailed + failureReason,
+                    "error",
+                  ),
+                );
+              },
+              on0: function (response) {
                 response.request.options.onFailure(response);
               },
-              onComplete : function() {
-                // In the end: re-enable the button
-                item.disabled = false;
-              }
-            }
-          );
-        }
-      }.bindAsEventListener(this));
-    }.bind(this));
-  },
-  /**
-   * Cancel edit
-   */
-  cancelEdit : function (event, editActivator) {
-    if (event) {
-      event.stop();
-    }
-    var comment = editActivator.up(this.xcommentSelector);
-    editActivator._x_editForm.hide();
-    comment.show();
-    this.cancelPreview(editActivator._x_editForm);
-    this.editing = false;
-  },
-  /**
-   * Inline reply: Move the form under the replied comment and update the hidden "replyto" field.
-   */
-  addReplyListener : function() {
-    if (this.form) {
-      $$(this.xcommentSelector).each(function(item) {
-        // Prototype bug in Opera: $$(".comment a.commentreply") returns only the first result.
-        // Quick fix until Prototype 1.6.1 is integrated.
-        item = item.down('a.commentreply');
-        if (!item) {
-          return;
-        }
-        item.observe('click', function(event) {
-          item.blur();
-          event.stop();
-          // If the form was already displayed as a reply, re-enable the Reply button for the old location
-          if (this.form.up('.commentthread')) {
-            this.form.up(".commentthread").previous(this.xcommentSelector).down('a.commentreply').show();
+              onComplete: function (response) {
+                form.previewButton.disabled = false;
+              }.bind(this),
+            });
+          } else {
+            this.cancelPreview(form);
           }
-          // Insert the form on top of that comment's discussion
-          item.up(this.xcommentSelector).next('.commentthread').insert({'top' : this.form});
-          // Set the replyto field to the replied comment's number
-          this.form["XWiki.XWikiComments_replyto"].value = item.up(this.xcommentSelector)._x_number;
-          // Clear the contents and focus the textarea
-          this.form["XWiki.XWikiComments_comment"].value = "";
-          this.form["XWiki.XWikiComments_comment"].focus();
-          // Hide the reply button
-          item.hide();
-        }.bindAsEventListener(this));
-      }.bind(this));
-    } else {
-      // If, for some reason, the form is missing, hide the reply functionality from the user
-      $$(this.xcommentSelector + ' a.commentreply').each(function(item) {
-        item.hide();
-      });
-    }
-  },
-  /**
-   * When pressing Submit, check that the comment is not empty. Submit the form with ajax and update the whole comments
-   * zone on success.
-   */
-  addSubmitListener : function(form) {
-    if (form) {
-      // Add listener for submit
-      form.down("input[type='submit']").observe('click', function(event) {
+        }.bindAsEventListener(this),
+      );
+    },
+    /**
+     * Display the comment preview instead of the comment textarea.
+     *
+     * @param content the rendered comment, as HTML text
+     * @param form the form for which the preview is done
+     */
+    doPreview: function (content, form) {
+      form.previewButton._x_modePreview = true;
+      form.previewContent.update(content);
+      form.previewContent.show();
+      form.commentElt.hide();
+      form.previewButton.down("input").value = this.translations.previewButtonBack;
+    },
+    /**
+     * Display the comment textarea instead of the comment preview.
+     *
+     * @param form the form for which the preview is canceled
+     */
+    cancelPreview: function (form) {
+      form.previewButton._x_modePreview = false;
+      form.previewContent.hide();
+      form.previewContent.update("");
+      form.commentElt.show();
+      form.previewButton.down("input").value =
+        this.translations.previewButtonPreview;
+    },
+    resetForm: function (event) {
+      if (event) {
         event.stop();
-        if (form.down('textarea').value != "") {
-          var formData = new Hash(form.serialize(true));
-          formData.set('xredirect', window.docgeturl + '?xpage=xpart&vm=' + this.generatorTemplate);
-          // Allows CommentAddAction to parse a template which will return a message telling if the captcha was wrong.
-          formData.set('xpage', 'xpart');
-          formData.set('vm', this.generatorTemplate);
-          // Strip whatever query string is supplied by the form so it doesn't override the formData.
-          var url = form.action.replace(/\?.*/, '');
-          formData.unset('action_cancel');
-          // Create a notification message to display to the user when the submit is being sent
-          form._x_notification = new XWiki.widgets.Notification("$msg.get('core.viewers.comments.add.inProgress')", "inprogress");
-          form.disable();
-          this.restartNeeded = false;
-          new Ajax.Request(url, {
-            method : 'post',
-            parameters : formData,
-            onSuccess : function () {
-              this.restartNeeded = true;
-              this.editing = false;
-              form._x_notification.replace(new XWiki.widgets.Notification("$msg.get('core.viewers.comments.add.done')", "done"));
-            }.bind(this),
-            onFailure : function (response) {
-              var failureReason = response.statusText;
-              if (response.statusText == '' /* No response */ || response.status == 12031 /* In IE */) {
-                failureReason = 'Server not responding';
-              }
-              form._x_notification.replace(new XWiki.widgets.Notification("$msg.get('core.viewers.comments.add.failed')" + failureReason, "error"));
-            }.bind(this),
-            on0 : function (response) {
-              response.request.options.onFailure(response);
-            },
-            onComplete : function (response) {
-              if (this.restartNeeded) {
-                this.container.update(response.responseText);
-                document.fire("xwiki:docextra:loaded", {
-                  "id" : "Comments",
-                  "element": this.container
-                });
-                this.updateCount();
-              } else {
-                form.enable();
-              }
-            }.bind(this)
-          });
-        }
-      }.bindAsEventListener(this));
-    }
-  },
-  /**
-   * When pressing Cancel, reset the form.
-   */
-  addCancelListener : function() {
-    if (this.form) {
-      this.initialLocation = new Element("span", {className : "hidden"});
-      $('_comments').insert(this.initialLocation);
-      // If the form is inside a thread, as a reply form, move it back to the bottom.
-      this.form.down('a.cancel').observe('click', this.resetForm.bindAsEventListener(this));
-    }
-  },
-  /**
-   * Add a preview button that generates the rendered comment,
-   */
-  addPreview : function(form) {
-    if (!form) {
-      return;
-    }
-    var previewURL = "$xwiki.getURL('__space__.__page__', 'preview')".replace("__space__", encodeURIComponent($$("meta[name=space]")[0].content)).replace("__page__", encodeURIComponent($$("meta[name=page]")[0].content));
-    form.commentElt = form.down('textarea');
-    var buttons = form.down('input[type=submit]').up('div');
-    form.previewButton = new Element('span', {'class' : 'buttonwrapper'}).update(new Element('input', {'type' : 'button', 'class' : 'button', 'value' : "$msg.get('core.viewers.comments.preview.button.preview')"}));
-    form.previewButton._x_modePreview = false;
-    form.previewContent = new Element('div', {'class' : 'commentcontent commentPreview'});
-    form.commentElt.insert({'before' : form.previewContent});
-    form.previewContent.hide();
-    buttons.insert({'top' : form.previewButton});
-    form.previewButton.observe('click', function() {
-      if (!form.previewButton._x_modePreview && !form.previewButton.disabled) {
-         form.previewButton.disabled = true;
-         var notification = new XWiki.widgets.Notification("$msg.get('core.viewers.comments.preview.inProgress')", "inprogress");
-         new Ajax.Request(previewURL, {
-            method : 'post',
-            parameters : {'xpage' : 'plain', 'content' : form.commentElt.value},
-            onSuccess : function (response) {
-              this.doPreview(response.responseText, form);
-              notification.hide();
-            }.bind(this),
-            /* If the content is empty or does not generate anything, we have the "This template does not exist" response,
-               with a 400 status code. */
-            on400 : function(response) {
-              this.doPreview(' ', form);
-              notification.hide();
-            }.bind(this),
-            onFailure : function (response) {
-              var failureReason = response.statusText;
-              if (response.statusText == '' /* No response */ || response.status == 12031 /* In IE */) {
-                failureReason = 'Server not responding';
-              }
-              notification.replace(new XWiki.widgets.Notification("$msg.get('core.viewers.comments.preview.failed')" + failureReason, "error"));
-            },
-            on0 : function (response) {
-              response.request.options.onFailure(response);
-            },
-            onComplete : function (response) {
-              form.previewButton.disabled = false;
-            }.bind(this)
-        });
-      } else {
-        this.cancelPreview(form);
       }
-    }.bindAsEventListener(this));
-  },
-  /**
-   * Display the comment preview instead of the comment textarea.
-   * 
-   * @param content the rendered comment, as HTML text
-   * @param form the form for which the preview is done
-   */
-  doPreview : function(content, form) {
-    form.previewButton._x_modePreview = true;
-    form.previewContent.update(content);
-    form.previewContent.show();
-    form.commentElt.hide();
-    form.previewButton.down('input').value = "$msg.get('core.viewers.comments.preview.button.back')";
-  },
-  /**
-   * Display the comment textarea instead of the comment preview.
-   *
-   * @param form the form for which the preview is canceled
-   */
-  cancelPreview : function(form) {
-    form.previewButton._x_modePreview = false;
-    form.previewContent.hide();
-    form.previewContent.update('');
-    form.commentElt.show();
-    form.previewButton.down('input').value = "$msg.get('core.viewers.comments.preview.button.preview')";
-  },
-  resetForm : function (event) {
-    if (event) {
-      event.stop();
-    }
-    if (this.form.up('.commentthread')) {
-      // Show the comment's reply button
-      this.form.up(".commentthread").previous(this.xcommentSelector).down('a.commentreply').show();
-      // Put the form back to its initial location and clear the contents
-      this.initialLocation.insert({after: this.form});
-    }
-    this.form["XWiki.XWikiComments_replyto"].value = "";
-    this.form["XWiki.XWikiComments_comment"].value = "";
-    this.cancelPreview(this.form);
-  },
-  updateCount : function() {
-    if ($("Commentstab") && $("Commentstab").down(".itemCount")) {
-      $("Commentstab").down(".itemCount").update("$msg.get('docextra.extranb', ['__number__'])".replace("__number__", $$(this.xcommentSelector).size()));
-    }
-    if ($("commentsshortcut") && $("commentsshortcut").down(".itemCount")) {
-      $("commentsshortcut").down(".itemCount").update("$msg.get('docextra.extranb', ['__number__'])".replace("__number__", $$(this.xcommentSelector).size()));
-    }
-  },
-  /**
-   * Registers a listener that watches for the insertion of the Comments tab and triggers the enhancements.
-   * After that, the listener removes itself, since it is no longer needed.
-   */
-  addTabLoadListener : function(event) {
-    var listener = function(event) {
-      if (event.memo.id == 'Comments') {
-        this.startup();
+      if (this.form.up(".commentthread")) {
+        // Show the comment's reply button
+        this.form
+          .up(".commentthread")
+          .previous(this.xcommentSelector)
+          .down("a.commentreply")
+          .show();
+        // Put the form back to its initial location and clear the contents
+        this.initialLocation.insert({ after: this.form });
       }
-    }.bindAsEventListener(this);
-    document.observe("xwiki:docextra:loaded", listener);
-  },
-  /**
-   * Just a simple message box that is displayed at various events: comment deleted, sending comment...
-   */
-  createNotification : function(message) {
-    var msg = new Element('div', {"class" : "notification" });
-    msg.update(message);
-    return msg;
-  }
-});
-// End XWiki augmentation.
-return XWiki;
-}(XWiki || {}));
+      this.form["XWiki.XWikiComments_replyto"].value = "";
+      this.form["XWiki.XWikiComments_comment"].value = "";
+      this.cancelPreview(this.form);
+    },
+    updateCount: function () {
+      if ($("Commentstab") && $("Commentstab").down(".itemCount")) {
+        $("Commentstab")
+          .down(".itemCount")
+          .update(
+            this.translations["extranb"].replace(
+              "__number__",
+              $$(this.xcommentSelector).size(),
+            ),
+          );
+      }
+      if ($("commentsshortcut") && $("commentsshortcut").down(".itemCount")) {
+        $("commentsshortcut")
+          .down(".itemCount")
+          .update(
+            this.translations["extranb"].replace(
+              "__number__",
+              $$(this.xcommentSelector).size(),
+            ),
+          );
+      }
+    },
+    /**
+     * Registers a listener that watches for the insertion of the Comments tab and triggers the enhancements.
+     * After that, the listener removes itself, since it is no longer needed.
+     */
+    addTabLoadListener: function (event) {
+      var listener = function (event) {
+        if (event.memo.id == "Comments") {
+          this.startup();
+        }
+      }.bindAsEventListener(this);
+      document.observe("xwiki:docextra:loaded", listener);
+    },
+    /**
+     * Just a simple message box that is displayed at various events: comment deleted, sending comment...
+     */
+    createNotification: function (message) {
+      var msg = new Element("div", { class: "notification" });
+      msg.update(message);
+      return msg;
+    },
+  });
+  // End XWiki augmentation.
+  return XWiki;
+})(XWiki || {});
 // ======================================
 // Comment actions enhancements
-document.observe('xwiki:dom:loaded', function() {
+document.observe("xwiki:dom:loaded", function () {
   new XWiki.viewers.Comments();
 });
diff --git a/src/main/webapp/resources/uicomponents/viewers/tags.css b/src/main/webapp/resources/uicomponents/viewers/tags.css
deleted file mode 100644
index d55cfa8de..000000000
--- a/src/main/webapp/resources/uicomponents/viewers/tags.css
+++ /dev/null
@@ -1,83 +0,0 @@
-#template("colorThemeInit.vm")
-.doc-tags {
-  float: left;
-  width: 48%;
-}
-.tag-wrapper {
-  padding: 2px 1px;
-}
-.tag-wrapper .separator {
-  display: none;
-}
-.tag {
-  word-wrap: break-word;
-}
-a.tag-delete, a.tag-delete:visited {
-  color: $theme.pageContentBackgroundColor;
-  font-size: 70%;
-  font-weight: bold;
-  text-decoration: none !important;
-  vertical-align: super;
-}
-.tag-wrapper:hover a.tag-delete {
-  color: $theme.textPrimaryColor;
-}
-.tag-wrapper a.tag-delete:hover {
-  color: #C00;
-}
-.tag-add {
-  color: $theme.textPrimaryColor;
-  display: inline;
-}
-.tag-add a, .tag-add a:visited {
-  color: $theme.textPrimaryColor;
-  font-size: 80%;
-  text-decoration: none;
-}
-.tag-add a:hover {
-  color: $theme.linkColor;
-}
-
-.tag-add-form {
-  border: 1px outset $theme.borderColor;
-  position: absolute;
-  vertical-align: top !important;
-  z-index: 1000;
-}
-* html .tag-add-form {
-  width: 190px;
-}
-.tag-add-form div {
-  background: $theme.backgroundSecondaryColor;
-  overflow: hidden;
-  padding: 4px 8px;
-}
-
-.tag-add-form label {
-  color: $theme.textColor;
-  font-size: 80%;
-  margin: 2px 0;
-}
-
-.tag-add-form .input-tag {
-  width: 16em;
-  height: 80%;
-  margin-right: 3px;
-}
-
-.tag-add-form .buttonwrapper {
-  margin-left: 0;
-}
-
-#body .tag-add-form .button {
-  font-size: 80%;
-  padding: 3px 5px !important;
-  cursor: pointer;
-  display: inline-block;
-  min-height: 0 !important;
-}
-
-.tag-add-form .button-add-tag-cancel {
-  font-size: 80%;
-  padding: 4px 5px !important;
-}
diff --git a/src/main/webapp/resources/uicomponents/viewers/tags.js b/src/main/webapp/resources/uicomponents/viewers/tags.js
deleted file mode 100644
index 1eb89e6ed..000000000
--- a/src/main/webapp/resources/uicomponents/viewers/tags.js
+++ /dev/null
@@ -1,167 +0,0 @@
-// ======================================
-// Ajax tag editing
-// 
-var XWiki = (function (XWiki) {
-// Start XWiki augmentation.
-var viewers = XWiki.viewers = XWiki.viewers || {};
-
-/**
- * Tag editing.
- */
-viewers.Tags = Class.create({
-  /**
-   * Initialization: add listeners for all tag actions, to perform them via AJAX
-   */
-  initialize : function() {
-    // delete tags
-    $$('.doc-tags .tag-delete').each(this.ajaxTagDelete);
-    $$('.doc-tags .tag-add a').each(this.createTagAddForm.bind(this));
-    if ($$('.doc-tags .tag-add-form').length > 0) {
-      this.ajaxifyForm($$('.doc-tags .tag-add-form')[0]);
-    }
-  },
-  /** AJAX tag removal */
-  ajaxTagDelete : function (item) {
-    item.observe('click', function(event) {
-      if (event) {
-        event.stop();
-      }
-      if (!item.disabled) {
-        new Ajax.Request(
-          item.readAttribute('href').replace(/&xredirect=.+$/, "&ajax=1"),
-          {
-            onCreate : function () {
-              // ignore "cascade" clicks
-              item.disabled = true;
-              item.notification = new XWiki.widgets.Notification("Deleting tag...", "inprogress");
-            },
-            onSuccess : function () {
-              // delete the corresponding element
-              item.up('.tag-wrapper').remove();
-            },
-            onFailure : function (response) {
-               new XWiki.widgets.Notification(response.responseText || 'Server not responding', "error");
-            },
-            // 0 is returned for network failures, except on IE where a strange large number (12031) is returned.
-            on0 : function(response) {
-              response.request.options.onFailure(response);
-            },
-            onComplete : function () {
-              item.disabled = false;
-              item.notification.hide();
-            }
-          }
-        );
-      }
-    }.bindAsEventListener());
-  },
-  createTagAddForm : function (item) {
-    item.observe('click', function(event) {
-      if (event) {
-        event.stop();
-      }
-      if (!item._x_form) {
-        if (!item.disabled) {
-          new Ajax.Request(
-            item.readAttribute('href').replace(/#.+$/, "&ajax=1&xpage=documentTags"),
-            {
-              onCreate : function () {
-                // ignore "cascade" clicks
-                item.disabled = true;
-                item.notification = new XWiki.widgets.Notification("Fetching form...", "inprogress");
-              },
-              onSuccess : function (response) {
-                var iParent = item.up();
-                item.remove();
-                iParent.update(response.responseText);
-                item._x_form = iParent.firstDescendant();
-                item._x_form._x_activator = item;
-                item._x_form.down('input[type=text]').focus();
-                this.ajaxifyForm(item._x_form);
-              }.bind(this),
-              onFailure : function (response) {
-                new XWiki.widgets.Notification(response.responseText || 'Server not responding', "error");
-              },
-              // 0 is returned for network failures, except on IE where a strange large number (12031) is returned.
-              on0 : function(response) {
-                response.request.options.onFailure(response);
-              },
-              onComplete : function () {
-                item.disabled = false;
-                item.notification.hide();
-              }
-            }
-          );
-        }
-      } else {
-        Element.replace(item, item._x_form);
-        item._x_form.down('input[type=text]').focus();
-      }
-    }.bindAsEventListener(this));
-  },
-  ajaxifyForm : function(form) {
-    form.setAttribute('autocomplete', 'off');
-    form.down('input[type=text]').setAttribute('autocomplete', 'off');
-    form.down('input[type=text]').setAttribute('autocomplete', 'off');
-    form.observe('submit', function(event) {
-      event.stop();
-      form.down('input[type=text]').focus();
-      if (form.tag.value != '') {
-        new Ajax.Request(
-          form.action.replace(/&xredirect=.+$/, '&ajax=1&tag=') + encodeURIComponent(form.tag.value),
-          {
-            onCreate : function () {
-              // ignore "cascade" clicks
-              form.disable();
-              form.notification = new XWiki.widgets.Notification("Adding tag...", "inprogress");
-            },
-            onSuccess : function (response) {
-              var wrapper = new Element('span');
-              wrapper.insert(response.responseText + ' ');
-              wrapper.select('.tag-delete').each(this.ajaxTagDelete);
-              while (wrapper.childNodes.length > 0) {
-                form.up('.tag-add').insert({before : wrapper.firstChild});
-                form.up('.tag-add').insert({before : ' '});
-                wrapper.removeChild(wrapper.firstChild);
-              }
-              form.reset();
-            }.bind(this),
-            onFailure : function (response) {
-              new XWiki.widgets.Notification(response.responseText || 'Server not responding', "error");
-            },
-            onComplete : function () {
-              form.enable();
-              form.notification.hide();
-            },
-            // 0 is returned for network failures, except on IE where a strange large number (12031) is returned.
-            on0 : function(response) {
-              response.request.options.onFailure(response);
-            }
-          }
-        );
-      }
-    }.bindAsEventListener(this));
-    form.observe('reset', function(event) {
-      Element.replace(form, form._x_activator);
-    }.bindAsEventListener(this));
-    // Replace the Cancel link (which is supposed to 
-    var cancel = new Element("input", {type: "reset", value : form.down('.button-add-tag-cancel').innerHTML, "class" : "button"});
-    form.down('.button-add-tag-cancel').replace(cancel);
-
-    new XWiki.widgets.Suggest(form.down('input[type=text]'), {
-      script: "${xwiki.getURL('Main.WebHome', 'view', 'xpage=suggest&classname=XWiki.TagClass&fieldname=tags&firCol=-&secCol=-')}&",
-      varname: 'input',
-      seps: "${xwiki.getDocument('XWiki.TagClass').xWikiClass.tags.getProperty('separators').value}",
-      shownoresults : false,
-      icon: "${xwiki.getSkinFile('icons/silk/tag_yellow.gif')}"
-    });
-  }
-});
-// End XWiki augmentation.
-return XWiki;
-}(XWiki || {}));
-
-// Create the tags editing behavior on startup.
-document.observe('xwiki:dom:loaded', function() {
-    new XWiki.viewers.Tags();
-});
diff --git a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_bars.png b/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_bars.png
deleted file mode 100644
index cbd818411..000000000
Binary files a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_bars.png and /dev/null differ
diff --git a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_bg.gif b/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_bg.gif
deleted file mode 100644
index f0d26f66f..000000000
Binary files a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_bg.gif and /dev/null differ
diff --git a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_bg.png b/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_bg.png
deleted file mode 100644
index 47903c360..000000000
Binary files a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_bg.png and /dev/null differ
diff --git a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_boxes.png b/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_boxes.png
deleted file mode 100644
index e024a2104..000000000
Binary files a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_boxes.png and /dev/null differ
diff --git a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_close.png b/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_close.png
deleted file mode 100644
index ec4e0a377..000000000
Binary files a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_close.png and /dev/null differ
diff --git a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_drop.png b/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_drop.png
deleted file mode 100644
index 65e83ccd3..000000000
Binary files a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_drop.png and /dev/null differ
diff --git a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_palette_raw.png b/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_palette_raw.png
deleted file mode 100644
index a67824700..000000000
Binary files a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_palette_raw.png and /dev/null differ
diff --git a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_sel_circle.gif b/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_sel_circle.gif
deleted file mode 100644
index 0e0278403..000000000
Binary files a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_sel_circle.gif and /dev/null differ
diff --git a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_sel_circle.png b/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_sel_circle.png
deleted file mode 100644
index 771fd774c..000000000
Binary files a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_sel_circle.png and /dev/null differ
diff --git a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_sel_rect.gif b/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_sel_rect.gif
deleted file mode 100644
index c1be1cd67..000000000
Binary files a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_sel_rect.gif and /dev/null differ
diff --git a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_sel_rect.png b/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_sel_rect.png
deleted file mode 100644
index 2c68a2ba4..000000000
Binary files a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_sel_rect.png and /dev/null differ
diff --git a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_wheel_black.png b/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_wheel_black.png
deleted file mode 100644
index 56d1564c4..000000000
Binary files a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_wheel_black.png and /dev/null differ
diff --git a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_wheel_rgb.jpg b/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_wheel_rgb.jpg
deleted file mode 100644
index b7dc4e0bb..000000000
Binary files a/src/main/webapp/resources/uicomponents/widgets/colorpicker/img/procolor_win_wheel_rgb.jpg and /dev/null differ
diff --git a/src/main/webapp/resources/uicomponents/widgets/colorpicker/procolor.js b/src/main/webapp/resources/uicomponents/widgets/colorpicker/procolor.js
deleted file mode 100644
index 98fd1a55e..000000000
--- a/src/main/webapp/resources/uicomponents/widgets/colorpicker/procolor.js
+++ /dev/null
@@ -1,753 +0,0 @@
-/*
-**  PROCOLOR LICENSE
-**  ----------------
-**
-**  Redistribution and use in source and binary forms, with or without
-**  modification, are permitted provided that the following conditions are met:
-**
-**    * Redistributions of source code must retain the above copyright
-**       notice, this list of conditions and the following disclaimer.
-**
-**    * Redistributions in binary form must reproduce the above copyright
-**       notice, this list of conditions and the following disclaimer in the
-**       documentation and/or other materials provided with the distribution.
-**
-**  THIS SOFTWARE IS PROVIDED BY THE PHANTOM INKER AND CONTRIBUTORS "AS IS"
-**  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-**  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-**  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-**  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-**  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-**  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-**  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-**  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-**  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
-**  THE POSSIBILITY OF SUCH DAMAGE.
-*/
-if(typeof Prototype=="undefined"){alert("ProColor Error:  Prototype is not loaded. Please make sure that your page includes prototype.js before it includes procolor.js.")
-}if(Prototype.Version<"1.6"){alert("ProColor Error:  Minimum Prototype 1.6.0 is required; you are using "+Prototype.Version)
-}Element.addMethods({build:function(B,D,A,C){var E=$(document.createElement(D));
-$H(A).each(function(F){E[F.key]=F.value
-});
-if(C){E.setStyle(C)
-}B.appendChild(E);
-return E
-},isEventIn:function(B,C){var E=B.getDimensions();
-var D=B.cumulativeOffset();
-var A=C.pointerX(),F=C.pointerY();
-return(A>=D.left&&F>=D.top&&A=5.5&&D<7&&document.body.filters);
-this.div=null;
-this.color=null;
-this.listeners={};
-this.dblclk={time:0};
-if(A.parent){this.parent=$(A.parent)
-}else{this.parent=Element.extend(document.body)
-}if(A.input){this.input=$(A.input)
-}else{this.input=null
-}this.options={mode:"static",width:360,height:192,offsetx:13,offsety:8,input:null,showInField:false,parent:null,closeButton:(A.mode=="popup"),imgPath:"",color:(!this.input?"#FFFFFF":this.input.tagName=="INPUT"?this.input.value:this.input.innerHTML),editbg:"#FFFFFF",edittext:"#4C4C4C",outputFormat:"#{RR}{GG}{BB}",onOpening:null,onOpened:null,onClosing:null,onClosed:null,onCloseButton:null,onChanging:null,onChanged:null,onCancelClick:null,onAcceptClick:null};
-for(var B in A){this.options[B]=A[B]
-}if(this.options.onOpening){this.options.onOpening(this,"opening")
-}this.createDiv();
-if(this.options.mode=="popup"){this.positionPopup();
-Event.observe(document,"mousedown",this.closeClickHandler=this.handleCloseClick.bindAsEventListener(this));
-Event.observe(document,"keypress",this.keyPressHandler=this.handleKeyPress.bindAsEventListener(this))
-}if(this.options.onOpened){this.options.onOpened(this,"opened")
-}},positionPopup:function(){var I=this.div.cumulativeOffset(),K=I[0],H=I[1];
-var C=this.div.getDimensions(),M=C.height,B=C.width;
-var D=document.viewport.getHeight(),N=document.viewport.getWidth();
-var Q=document.viewport.getScrollOffsets();
-var O=$(this.input).cumulativeOffset(),F=O[1],P=O[0];
-var G=$(this.input).getDimensions().height,J=F+G;
-if(P+B>N-8){P=N-8-B
-}if(P<8){P=8
-}var L=(J+M>Q.top+D)&&(J-M>Q.top);
-var A=P.toString()+"px";
-var E=(L?(F-M):(F+G)).toString()+"px";
-this.div.style.left=A;
-this.div.style.top=E;
-this.div.setStyle({visibility:"",display:"block"})
-},createDiv:function(){var B={display:"block",width:this.options.width+"px",height:this.options.height+"px",backgroundPosition:"0% 0%",backgroundAttachment:"scroll",backgroundRepeat:"no-repeat",backgroundImage:"url("+this.options.imgPath+(this.old_ie?"bg.gif)":"bg.png)"),color:"#BBBBD7",left:0,top:0};
-if(this.options.mode=="popup"){B.position="absolute";
-B.display="none";
-B.visibility="hidden";
-B.zIndex=999999
-}else{B.position="relative"
-}this.div=$(this.parent).build("div",{className:"procolor_box"},B);
-this.img_palette=this.loadBgImage(this.div,"palette_raw.png",0,1,66,174);
-this.img_bar_lower=this.loadBgImage(this.div,"bars.png",77,1,20,174,{zIndex:1,opacity:1});
-this.img_bar_middle=this.loadBgImage(this.div,"bars.png",77,1,20,174,{zIndex:2,opacity:0});
-this.img_bar_upper=this.loadBgImage(this.div,"bars.png",77,1,20,174,{zIndex:3,opacity:0});
-this.img_wheel_rgb=this.loadBgImage(this.div,"wheel_rgb.jpg",105,0,176,176,{zIndex:1,opacity:1});
-this.img_wheel_black=this.loadBgImage(this.div,"wheel_black.png",105,0,176,176,{zIndex:2,opacity:1});
-this.img_boxes=this.loadBgImage(this.div,"boxes.png",287,25,50,149,{zIndex:1});
-this.img_bar_dragger=this.createImageButton(this.div,"sel_rect",73+this.options.offsetx,-1+this.options.offsety,24,8,{zIndex:4});
-this.img_wheel_dragger=this.createImageButton(this.div,"sel_circle",184+this.options.offsetx,79+this.options.offsety,17,17,{zIndex:5});
-this.listeners.wheel=this.onWheelEvent.bindAsEventListener(this);
-this.img_wheel_black.observe("mousedown",this.listeners.wheel);
-this.img_wheel_dragger.observe("mousedown",this.listeners.wheel);
-this.img_wheel_dragger.observe("keydown",this.listeners.wheel);
-this.listeners.bar=this.onBarEvent.bindAsEventListener(this);
-this.img_bar_upper.observe("mousedown",this.listeners.bar);
-this.img_bar_dragger.observe("mousedown",this.listeners.bar);
-this.img_bar_dragger.observe("keydown",this.listeners.bar);
-this.listeners.palette=this.onPaletteEvent.bindAsEventListener(this);
-this.img_palette.observe("mousedown",this.listeners.palette);
-this.wheel={left:106+this.options.offsetx,top:1+this.options.offsety,width:174,height:174};
-this.bar={left:77+this.options.offsetx,top:2+this.options.offsety,width:20,height:172};
-this.wheelsel={width:17,height:17};
-this.barsel={width:24,height:8};
-this.listeners.rgb=this.onNumberBox.bindAsEventListener(this,"rgb",0,255,0);
-this.r_edit=this.createEdit(this.div,287,25,37,20,this.listeners.rgb);
-this.g_edit=this.createEdit(this.div,287,47,37,20,this.listeners.rgb);
-this.b_edit=this.createEdit(this.div,287,69,37,20,this.listeners.rgb);
-this.listeners.hue=this.onNumberBox.bindAsEventListener(this,"hsb",0,359,360);
-this.listeners.satbrt=this.onNumberBox.bindAsEventListener(this,"hsb",0,100,0);
-this.hue_edit=this.createEdit(this.div,287,110,37,20,this.listeners.hue);
-this.sat_edit=this.createEdit(this.div,287,132,37,20,this.listeners.satbrt);
-this.brt_edit=this.createEdit(this.div,287,154,37,20,this.listeners.satbrt);
-if(this.options.closeButton){this.img_close=this.createImageButton(this.div,"close",this.options.width-40,0,24,16);
-this.listeners.close=this.onCloseEvent.bindAsEventListener(this);
-this.img_close.observe("mouseover",this.listeners.close);
-this.img_close.observe("mouseout",this.listeners.close);
-this.img_close.observe("mousedown",this.listeners.close);
-this.img_close.observe("keydown",this.listeners.close);
-this.img_close.trackingMouse=false
-}if(this.input&&this.input.tagName=="INPUT"){this.listeners.input=this.onInput.bindAsEventListener(this);
-this.input.observe("keyup",this.listeners.input);
-this.input.observe("focus",this.listeners.input);
-this.input.observe("blur",this.listeners.input)
-}else{this.listeners.input=null
-}var A=this.decodeHexColor(this.options.color);
-if(!A){A={r:0,g:0,b:0}
-}this.update("rgb",A,[])
-},loadBgImage:function(G,A,F,E,H,D,I){var B={display:"block",position:"absolute",width:H+"px",height:D+"px",left:F+this.options.offsetx+"px",top:E+this.options.offsety+"px",padding:"0",backgroundImage:"url("+this.options.imgPath+A+")"};
-if(I){for(var C in I){B[C]=I[C]
-}}return G.build("div",{},B)
-},createImageButton:function(H,A,G,F,I,E,J){var B={display:"block",position:"absolute",width:I+"px",height:E+"px",left:G+"px",top:F+"px",border:"0",cursor:"default",padding:"0",fontSize:"1px",backgroundImage:"url("+this.options.imgPath+A+(this.old_ie?".gif)":".png)")};
-if(J){for(var D in J){B[D]=J[D]
-}}var C=H.build("a",{href:"#"},B);
-return C
-},createEdit:function(F,A,H,B,E,G){A+=5;
-B-=9;
-H+=2;
-E-=6;
-var D={display:"inline",position:"absolute",width:B+"px",height:E+"px",left:A+this.options.offsetx+"px",top:H+this.options.offsety+"px",verticalAlign:"top",backgroundColor:this.options.editbg,padding:"0",color:this.options.edittext,fontFamily:"Verdana,Tahoma,Arial,sans-serif,sans serif,sans",fontSize:"12px",fontStyle:"Normal",fontVariant:"Normal",fontWeight:"Normal",textAlign:"right",direction:"ltr",border:0,zIndex:10};
-var C=F.build("input",{type:"text",value:"0",maxLength:3},D);
-C.observe("keypress",G);
-C.observe("keyup",G);
-C.observe("focus",G);
-C.observe("blur",G);
-return C
-},close:function(){if(!this.div){return false
-}if(this.options.onClosing){this.options.onClosing(this,"closing")
-}if(this.options.closeButton){Event.stopObserving(this.img_close)
-}Event.stopObserving(this.r_edit);
-Event.stopObserving(this.g_edit);
-Event.stopObserving(this.b_edit);
-Event.stopObserving(this.hue_edit);
-Event.stopObserving(this.sat_edit);
-Event.stopObserving(this.brt_edit);
-Event.stopObserving(this.img_wheel_black);
-Event.stopObserving(this.img_bar_upper);
-Event.stopObserving(this.img_palette);
-Event.stopObserving(this.img_wheel_dragger);
-Event.stopObserving(this.img_bar_dragger);
-if(this.listeners.input){Event.stopObserving(this.input,"keyup",this.listeners.input);
-Event.stopObserving(this.input,"focus",this.listeners.input);
-Event.stopObserving(this.input,"blur",this.listeners.input)
-}Event.stopObserving(document,"mousedown",this.closeClickHandler);
-Event.stopObserving(document,"keypress",this.keyPressHandler);
-this.div.remove();
-this.div=null;
-this.listeners={};
-this.dblclk={};
-if(this.input.type!="hidden"&&!this.input.disabled){this.input.focus()
-}if(this.options.onClosed){this.options.onClosed(this,"closed")
-}},updateState:{},updateTimeout:false,queuedUpdate:function(D,A,B){if(!Prototype.Browser.IE){this.update(D,A,B)
-}else{var C=this;
-C.updateState={mode:D,color:A,sources:B};
-if(C.updateTimeout==false){C.updateTimeout=setTimeout(function(){C.updateTimeout=false;
-C.update(C.updateState.mode,C.updateState.color,C.updateState.sources)
-},25)
-}}},finalUpdate:function(){if(this.updateTimeout){clearTimeout(this.updateTimeout);
-this.updateTimeout=false;
-this.update(this.updateState.mode,this.updateState.color,this.updateState.sources);
-this.updateState={}
-}},update:function(I,F,A){if(typeof (F)!="object"){F={r:0,g:0,b:0,hue:0,sat:0,brt:0}
-}F.r=this.toNumber(F.r);
-F.g=this.toNumber(F.g);
-F.b=this.toNumber(F.b);
-F.hue=this.toNumber(F.hue);
-F.sat=this.toNumber(F.sat);
-F.brt=this.toNumber(F.brt);
-var K,G;
-if(I=="rgb"){K=F;
-G=this.RGBtoHSB(K)
-}else{if(I=="hsb"){G=F;
-K=this.HSBtoRGB(G)
-}}if(K.r<0){K.r=0
-}if(K.r>255){K.r=255
-}if(K.g<0){K.g=0
-}if(K.g>255){K.g=255
-}if(K.b<0){K.b=0
-}if(K.b>255){K.b=255
-}G.hue=G.hue%360;
-if(G.hue<0){G.hue+=360
-}if(G.sat<0){G.sat=0
-}if(G.sat>100){G.sat=100
-}if(G.brt<0){G.brt=0
-}if(G.brt>100){G.brt=100
-}source={};
-A.each(function(R){source[R]=true
-});
-var P=this;
-if(!source.wheel){var B=G.brt/100;
-if(B>0.9999){B=0.9999
-}P.img_wheel_black.setOpacity(1-B);
-var C=((G.hue+270)%360)*(Math.PI*2/360);
-var J=Math.cos(C);
-var Q=Math.sin(C);
-var N=Math.floor(J*G.sat*P.wheel.width/200+0.5)+P.wheel.left+((P.wheel.width-4)/2)+2;
-var L=Math.floor(Q*G.sat*P.wheel.height/200+0.5)+P.wheel.top+((P.wheel.height-4)/2)+2;
-P.img_wheel_dragger.setStyle({left:N-Math.floor(P.wheelsel.width/2)+"px",top:L-Math.floor(P.wheelsel.height/2)+"px"})
-}if(!source.bar){var E=Math.floor(G.hue/60);
-var H=(E+1)%6;
-P.img_bar_lower.setStyle({backgroundPosition:(-E*20-20)+"px 0px"});
-P.img_bar_middle.setStyle({backgroundPosition:(-H*20-20)+"px 0px"});
-P.img_bar_middle.setOpacity((G.hue-E*60)/60);
-var B=(100-G.sat)/100;
-if(B<0.0001){B=0.0001
-}P.img_bar_upper.setOpacity(B);
-P.img_bar_dragger.setStyle({top:P.bar.top-Math.floor(P.barsel.height/2)+Math.floor((100-G.brt)*P.bar.height/100+0.5)+"px",left:P.bar.left+Math.floor(P.bar.width-P.barsel.width)/2+"px"})
-}K.r=Math.floor(K.r+0.5);
-K.g=Math.floor(K.g+0.5);
-K.b=Math.floor(K.b+0.5);
-G.hue=Math.floor(G.hue+0.5);
-G.sat=Math.floor(G.sat+0.5);
-G.brt=Math.floor(G.brt+0.5);
-G.hue=G.hue%360;
-this.color="#"+(K.r.toColorPart()+K.g.toColorPart()+K.b.toColorPart()).toUpperCase();
-if(!source.rgb){this.r_edit.value=K.r;
-this.g_edit.value=K.g;
-this.b_edit.value=K.b
-}if(!source.hsb){this.hue_edit.value=G.hue;
-this.sat_edit.value=G.sat;
-this.brt_edit.value=G.brt
-}if(this.options.input){var M=$(this.options.input);
-if(!source.input){var O=this.internalFormatOutput(K,G,this.options.outputFormat);
-if(M.tagName=="INPUT"){M.value=O
-}else{M.innerHTML=O
-}}if(this.options.showInField){var D=this.computeTextColor(K);
-M.setStyle({backgroundColor:this.color,color:"#"+D.r.toColorPart()+D.g.toColorPart()+D.b.toColorPart()})
-}}},toNumber:function(A){switch(typeof A){case"number":return A;
-case"string":if(matches=/^[^0-9.+-]*([+-]?(?:[0-9]*\.[0-9]+|[0-9]+(?:\.[0-9]*)?))(?:[^0-9]|$)/.exec(A)){return Number(matches[1])
-}else{return 0
-}case"boolean":return A?1:0;
-case"object":return A?1:0;
-case"function":return 1;
-default:case"undefined":return 0
-}},formatOutput:function(B,C){if(!C){C="#{RR}{GG}{BB}"
-}var A=this.decodeHexColor(B);
-if(!A){A={r:0,g:0,b:0}
-}return this.internalFormatOutput(A,this.RGBtoHSB(A),C)
-},internalFormatOutput:function(C,A,E){var D=E.match(/(\{\w+\}|[^{]+)/g);
-var B="";
-D.each(function(G){var F;
-switch(G){case"{RR}":F=C.r.toColorPart().toUpperCase();
-break;
-case"{GG}":F=C.g.toColorPart().toUpperCase();
-break;
-case"{BB}":F=C.b.toColorPart().toUpperCase();
-break;
-case"{rr}":F=C.r.toColorPart().toLowerCase();
-break;
-case"{gg}":F=C.g.toColorPart().toLowerCase();
-break;
-case"{bb}":F=C.b.toColorPart().toLowerCase();
-break;
-case"{R}":F=this.halfColorPart(C.r).toUpperCase();
-break;
-case"{G}":F=this.halfColorPart(C.g).toUpperCase();
-break;
-case"{B}":F=this.halfColorPart(C.b).toUpperCase();
-break;
-case"{r}":F=this.halfColorPart(C.r).toLowerCase();
-break;
-case"{g}":F=this.halfColorPart(C.g).toLowerCase();
-break;
-case"{b}":F=this.halfColorPart(C.b).toLowerCase();
-break;
-case"{red}":F=C.r.toString();
-break;
-case"{grn}":F=C.g.toString();
-break;
-case"{blu}":F=C.b.toString();
-break;
-case"{hue}":F=A.hue.toString();
-break;
-case"{sat}":F=A.sat.toString();
-break;
-case"{brt}":F=A.brt.toString();
-break;
-default:F=G;
-break
-}B+=F
-});
-return B
-},halfColorPart:function(A){return Math.floor((A+8)/17).toString(16)
-},decodeHexColor:function(B){var E;
-if(E=/^[^0-9A-Fa-f]*([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{0,2})(?:[^0-9A-Fa-f]|$)/.exec(B)){return{r:parseInt(E[1],16),g:parseInt(E[2],16),b:parseInt(E[3],16)}
-}if(E=/^[^0-9A-Fa-f]*([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f])(?:[^0-9A-Fa-f]|$)/.exec(B)){var A=parseInt(E[3],16);
-return{r:parseInt(E[1],16),g:parseInt(E[2],16),b:A*16+A}
-}if(E=/^[^0-9A-Fa-f]*([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})(?:[^0-9A-Fa-f]|$)/.exec(B)){var D=parseInt(E[2],16);
-return{r:parseInt(E[1],16),g:D,b:D}
-}if(E=/^[^0-9A-Fa-f]*([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f]{0,2})(?:[^0-9A-Fa-f]|$)/.exec(B)){var C=parseInt(E[1],16);
-var D=parseInt(E[2],16);
-var A=parseInt(E[3],16);
-return{r:C*16+C,g:D*16+D,b:A*16+A}
-}if(E=/^[^0-9A-Fa-f]*([0-9A-Fa-f]{2})(?:[^0-9A-Fa-f]|$)/.exec(B)){var D=parseInt(E[1],16);
-return{r:D,g:D,b:D}
-}if(E=/^[^0-9A-Fa-f]*([0-9A-Fa-f])(?:[^0-9A-Fa-f]|$)/.exec(B)){var D=parseInt(E[1],16);
-D=D*16+D;
-return{r:D,g:D,b:D}
-}return false
-},trueBrightness:function(A){return(A.r/255*0.3)+(A.g/255*0.59)+(A.b/255*0.11)
-},computeTextColor:function(C){var D=this.trueBrightness(C);
-if(D<0.5){var A=Math.floor(D*20)+3;
-var B=255*(A-1)
-}else{var A=Math.floor((1-D)*20)+3;
-var B=0
-}return{r:Math.floor((C.r+B)/A),g:Math.floor((C.g+B)/A),b:Math.floor((C.b+B)/A)}
-},RGBtoHSB:function(E){var A=Math.floor(this.toNumber(E.r)+0.5);
-var D=Math.floor(this.toNumber(E.g)+0.5);
-var F=Math.floor(this.toNumber(E.b)+0.5);
-if(A<0){A=0
-}if(A>255){A=255
-}if(D<0){D=0
-}if(D>255){D=255
-}if(F<0){F=0
-}if(F>255){F=255
-}var G,J,H,B;
-var C=A,K=D,I=F;
-if(A>D){if(A>F){I=G=A,B=0,H=D-F
-}else{I=G=F,B=240,H=A-D
-}J=G-((DF){I=G=D,B=120,H=F-A
-}else{I=G=F,B=240,H=A-D
-}J=G-((A100){G=100
-}G=G*255/100;
-var I=this.toNumber(C.sat);
-if(I<=0){G=Math.floor(G+0.5);
-return{r:G,g:G,b:G}
-}if(I>100){I=100
-}var D=this.toNumber(C.hue);
-D=D%360;
-if(D<0){D+=360
-}var H=G*I/100;
-var B=(H*((D*256/60)%256))/256;
-var A,E,F;
-switch(Math.floor(D/60)){case 0:A=G;
-E=G-H+B;
-F=G-H;
-break;
-case 1:A=G-B;
-E=G;
-F=G-H;
-break;
-case 2:A=G-H;
-E=G;
-F=G-H+B;
-break;
-case 3:A=G-H;
-E=G-B;
-F=G;
-break;
-case 4:A=G-H+B;
-E=G-H;
-F=G;
-break;
-case 5:A=G;
-E=G-H;
-F=G-B;
-break
-}A=Math.floor(A+0.5);
-E=Math.floor(E+0.5);
-F=Math.floor(F+0.5);
-if(A<0){A=0
-}if(A>255){A=255
-}if(E<0){E=0
-}if(E>255){E=255
-}if(F<0){F=0
-}if(F>255){F=255
-}return{r:A,g:E,b:F}
-},acceptAndClose:function(){if(this.options.onAcceptClick){this.options.onAcceptClick(this,"acceptclick")
-}if(this.options.mode=="popup"){this.close()
-}},cancelAndClose:function(){if(this.options.onCancelClick){this.options.onCancelClick(this,"cancelclick")
-}if(this.options.mode=="popup"){this.close()
-}},closeOnDoubleClick:function(D){var A=D.pointerX(),E=D.pointerY();
-var B=new Date;
-var C=B.getTime();
-if(Math.abs(this.dblclk.x-A)<3&&Math.abs(this.dblclk.y-E)<3&&C-this.dblclk.time<=500){this.dblclk.time=0;
-this.acceptAndClose();
-return true
-}else{this.dblclk.x=A;
-this.dblclk.y=E;
-this.dblclk.time=C;
-return false
-}},brtFromPoint:function(A,D){var C=this.img_bar_upper.getDimensions();
-var B=this.img_bar_upper.cumulativeOffset();
-if(D=B.top+C.height){return 0
-}else{return((B.top+C.height-1-D)*100/C.height)
-}}},hueSatFromPoint:function(A,H){var G=this.img_wheel_rgb.getDimensions();
-var F=this.img_wheel_rgb.cumulativeOffset();
-var B=(H-(F.top+G.height/2))/((G.height-4)/2);
-var E=(A-(F.left+G.width/2))/((G.width-4)/2);
-var D=Math.sqrt(B*B+E*E)*100+0.5;
-var C=Math.atan2(B,E)*180/Math.PI+90;
-if(D<=0){C=D=0
-}if(D>100){D=100
-}if(C<0){C+=360
-}return{sat:D,hue:C}
-},colorFromPalette:function(B,G){var F=this.img_palette.getDimensions();
-var E=this.img_palette.cumulativeOffset();
-if(B=E.left+F.width){return false
-}B=Math.floor((B-E.left)/11);
-if(G>=E.top&&GE.top+20&&G100){F=100
-}if(E.options.onChanging&&(B!=F)){E.options.onChanging(E,"changing")
-}E.update("hsb",{hue:E.hue_edit.value,sat:E.sat_edit.value,brt:F},[]);
-if(E.options.onChanged&&(B!=F)){E.options.onChanged(E,"changed")
-}break;
-case"mousedown":G.stop();
-var E=this;
-E.oldcolor=E.color;
-if(E.img_bar_dragger.focus){E.img_bar_dragger.focus()
-}var C=function(I){var H={hue:E.hue_edit.value,sat:E.sat_edit.value,brt:E.brtFromPoint(I.pointerX(),I.pointerY())};
-E.queuedUpdate("hsb",H,[]);
-if(E.options.onChanging){E.options.onChanging(E,"changing")
-}};
-C(G);
-if(this.closeOnDoubleClick(G)){break
-}var A=new MouseCapture;
-A.setCursor("default");
-A.begin(function(I,H){switch(H){case"mouseup":case"keyup":A.end();
-E.finalUpdate();
-if(E.options.onChanged&&E.oldcolor!=E.color){E.options.onChanged(E,"changed")
-}break;
-case"mousemove":C(I);
-break
-}});
-break
-}},onWheelEvent:function(E){switch(E.type){case"keydown":var I=this;
-var D=this.toNumber(I.hue_edit.value),A=D;
-var C=this.toNumber(I.sat_edit.value),G=C;
-var F=E.shiftKey||E.ctrlKey||E.altKey;
-switch(E.keyCode){case Event.KEY_UP:C+=F?10:1;
-E.stop();
-break;
-case Event.KEY_DOWN:C-=F?10:1;
-E.stop();
-break;
-case Event.KEY_LEFT:D-=F?10:1;
-E.stop();
-break;
-case Event.KEY_RIGHT:D+=F?10:1;
-E.stop();
-break;
-case Event.KEY_PAGEUP:C+=F?25:10;
-E.stop();
-break;
-case Event.KEY_PAGEDOWN:C-=F?25:10;
-E.stop();
-break;
-case Event.KEY_HOME:C=100;
-E.stop();
-break;
-case Event.KEY_END:C=0;
-E.stop();
-break
-}if(C<0){C=0
-}if(C>100){C=100
-}D=D%360;
-if(D<0){D+=360
-}if(I.options.onChanging&&(A!=D||G!=C)){I.options.onChanging(I,"changing")
-}I.update("hsb",{hue:D,sat:C,brt:I.brt_edit.value},[]);
-if(I.options.onChanged&&(A!=D||G!=C)){I.options.onChanged(I,"changed")
-}break;
-case"mousedown":E.stop();
-var I=this;
-I.oldcolor=I.color;
-if(I.img_wheel_dragger.focus){I.img_wheel_dragger.focus()
-}var B=function(K){var J=I.hueSatFromPoint(K.pointerX(),K.pointerY());
-J.brt=I.brt_edit.value;
-I.queuedUpdate("hsb",J,[]);
-if(I.options.onChanging){I.options.onChanging(I,"changing")
-}};
-B(E);
-if(this.closeOnDoubleClick(E)){break
-}var H=new MouseCapture;
-H.setCursor("default");
-H.begin(function(K,J){switch(J){case"mouseup":case"keyup":H.end();
-I.finalUpdate();
-if(I.options.onChanged&&I.oldcolor!=I.color){I.options.onChanged(I,"changed")
-}break;
-case"mousemove":B(K);
-break
-}});
-break
-}},onPaletteEvent:function(D){switch(D.type){case"mousedown":var C=this;
-C.oldcolor=C.color;
-if(C.img_palette.focus){C.img_palette.focus()
-}var B=function(F){var E=C.colorFromPalette(F.pointerX(),F.pointerY());
-if(E){C.queuedUpdate("rgb",E,[])
-}if(C.options.onChanging){C.options.onChanging(C,"changing")
-}return E
-};
-if(!B(D)){break
-}D.stop();
-if(this.closeOnDoubleClick(D)){break
-}var A=new MouseCapture;
-A.setCursor("default");
-A.begin(function(F,E){switch(E){case"mouseup":case"keyup":A.end();
-C.finalUpdate();
-if(C.options.onChanged&&C.oldcolor!=C.color){C.options.onChanged(C,"changed")
-}break;
-case"mousemove":B(F);
-break
-}});
-break
-}},onNumberBox:function(F,G,E,A,D){var C=Event.element(F);
-switch(F.type){case"keypress":if(!F||F.ctrlKey||F.altKey){F.stop()
-}else{if((F.charCode>=48&&F.charCode<=57)||(F.keyCode>=48&&F.keyCode<=57)){}else{if(F.keyCode>0&&F.keyCode<48){}else{F.stop()
-}}}break;
-case"keyup":if(F.keyCode!=Event.KEY_TAB){this.updateByMode(G);
-if(this.options.onChanging){this.options.onChanging(this,"changing")
-}}if(F.keyCode==Event.KEY_RETURN){this.acceptAndClose();
-F.stop()
-}if(F.keyCode==Event.KEY_ESC){this.cancelAndClose();
-F.stop()
-}break;
-case"focus":this.oldcolor=this.color;
-break;
-case"blur":var B=this.toNumber(C.value);
-if(BA){if(D){B%=D;
-if(B<0){B+=D
-}}else{if(B 
+          this.defaultInteractionParameters = {
+            confirmationText: celMessages.confirmationBox.defaultQuestion,
+            yesButtonText: celMessages.confirmationBox.yes,
+            noButtonText: celMessages.confirmationBox.no
+        });
+      } else {
+        console.warn("celExecOnceAfterMessagesLoaded not available!");
       }
-    );
-    this.showDialog();
-    this.setClass("confirmation");
-    this.behavior = behavior || { };
-  },
-  /** Create the content of the confirmation dialog: icon + question text, buttons */
-  createContent : function (data) {
-    var question = new Element("div", {"class" : "question"}).update(data.confirmationText);
-    var buttons = new Element("div", {"class" : "buttons"});
-    var yesButton = this.createButton("button", data.yesButtonText, "(Enter)", "");
-    var noButton = this.createButton("button", data.noButtonText, "(Esc)", "");
-    buttons.insert(yesButton);
-    buttons.insert(noButton);
-    var content =  new Element("div");
-    content.insert(question).insert(buttons);
-    Event.observe(yesButton, "click", this.onYes.bindAsEventListener(this));
-    Event.observe(noButton, "click", this.onNo.bindAsEventListener(this));
-    return content;
-  },
-  onYes : function() {
-    this.closeDialog();
-    if (typeof (this.behavior.onYes) == 'function') {
-      this.behavior.onYes();
-    }
-  },
-  onNo : function() {
-    this.closeDialog();
-    if (typeof (this.behavior.onNo) == 'function') {
-      this.behavior.onNo();
-    }
-  }
-});
-} // if the parent widget is defined
\ No newline at end of file
+      this.interactionParameters = Object.extend(
+        Object.clone(this.defaultInteractionParameters),
+        interactionParameters || {},
+      );
+      $super(
+        this.createContent(this.interactionParameters),
+        {
+          show: { method: this.showDialog, keys: [] },
+          yes: { method: this.onYes, keys: ["Enter", "Space"] },
+          no: { method: this.onNo, keys: ["Esc"] },
+          close: { method: this.closeDialog, keys: [] },
+        },
+        {
+          displayCloseButton: false,
+          removeOnClose: true,
+        },
+      );
+      this.showDialog();
+      this.setClass("confirmation");
+      this.behavior = behavior || {};
+    },
+    /** Create the content of the confirmation dialog: icon + question text, buttons */
+    createContent: function (data) {
+      var question = new Element("div", { class: "question" }).update(
+        data.confirmationText,
+      );
+      var buttons = new Element("div", { class: "buttons" });
+      var yesButton = this.createButton(
+        "button",
+        data.yesButtonText,
+        "(Enter)",
+        "",
+      );
+      var noButton = this.createButton(
+        "button",
+        data.noButtonText,
+        "(Esc)",
+        "",
+      );
+      buttons.insert(yesButton);
+      buttons.insert(noButton);
+      var content = new Element("div");
+      content.insert(question).insert(buttons);
+      Event.observe(yesButton, "click", this.onYes.bindAsEventListener(this));
+      Event.observe(noButton, "click", this.onNo.bindAsEventListener(this));
+      return content;
+    },
+    onYes: function () {
+      this.closeDialog();
+      if (typeof this.behavior.onYes == "function") {
+        this.behavior.onYes();
+      }
+    },
+    onNo: function () {
+      this.closeDialog();
+      if (typeof this.behavior.onNo == "function") {
+        this.behavior.onNo();
+      }
+    },
+  });
+} // if the parent widget is defined
diff --git a/src/main/webapp/resources/uicomponents/widgets/confirmedAjaxRequest.js b/src/main/webapp/resources/uicomponents/widgets/confirmedAjaxRequest.js
index 971aaff13..fe5e0fb59 100644
--- a/src/main/webapp/resources/uicomponents/widgets/confirmedAjaxRequest.js
+++ b/src/main/webapp/resources/uicomponents/widgets/confirmedAjaxRequest.js
@@ -44,14 +44,20 @@ XWiki.widgets.ConfirmedAjaxRequest = Class.create(XWiki.widgets.ConfirmationBox,
   },
   /** Constructor. Registers the key listener that pops up the dialog. */
   initialize : function($super, requestUrl, ajaxRequestParameters, interactionParameters) {
-    this.interactionParameters = Object.extend({
-      displayProgressMessage: true,
-      progressMessageText : "$msg.get('core.widgets.confirmationBox.notification.inProgress')",
-      displaySuccessMessage: true,
-      successMessageText : "$msg.get('core.widgets.confirmationBox.notification.done')",
-      displayFailureMessage: true,
-      failureMessageText : "$msg.get('core.widgets.confirmationBox.notification.failed')"
-    }, interactionParameters || {});
+    if (window.celExecOnceAfterMessagesLoaded) {
+      window.celExecOnceAfterMessagesLoaded(
+        celMessages => this.interactionParameters = Object.extend({
+          displayProgressMessage: true,
+          progressMessageText : celMessages.confirmedAjaxRequest.notificationInProgress,
+          displaySuccessMessage: true,
+          successMessageText : celMessages.confirmedAjaxRequest.notificationDone,
+          displayFailureMessage: true,
+          failureMessageText : celMessages.confirmedAjaxRequest.notificationFailed
+        }, interactionParameters || {})
+      );
+    } else {
+        console.warn('celExecOnceAfterMessagesLoaded not available!');
+    }
     this.requestUrl = requestUrl;
     this.ajaxRequestParameters = Object.extend(Object.clone(this.defaultAjaxRequestParameters), ajaxRequestParameters || {});
     Object.extend(this.ajaxRequestParameters, {
diff --git a/src/main/webapp/resources/uicomponents/widgets/fullScreen.css b/src/main/webapp/resources/uicomponents/widgets/fullScreen.css
deleted file mode 100644
index 972c46b9b..000000000
--- a/src/main/webapp/resources/uicomponents/widgets/fullScreen.css
+++ /dev/null
@@ -1,89 +0,0 @@
-#template('colorThemeInit.vm')
-.fullScreenEditButton {
-  cursor: ne-resize !important;
-}
-.fullScreenEditLinkContainer {
-  text-transform: lowercase;
-  font-size: 80%;
-  color: $theme.linkColor;
-  cursor: pointer;
-  display: block;
-  margin-top: -1.4em;
-  text-align: right;
-}
-
-/* Matches the style of the new object editor */
-#xwikiobjects .fullScreenEditLinkContainer, #xwikiclassproperties .fullScreenEditLinkContainer {
-  margin-right: 10%;
-}
-
-.fullScreenWrapper .fullScreenEditLinkContainer {
-  display: none;
-}
-.fullScreenCloseButton {
-  cursor: sw-resize !important;
-}
-.leftmenu2 .fullScreenEditButton, .leftmenu2 .fullScreenCloseButton {
-  margin: 2px;
-  float: right;
-}
-.mceToolbar .fullScreenEditButton, .mceToolbar .fullScreenCloseButton {
-  padding: 2px;
-  width: 16px;
-  height: 16px;
-}
-.gwt-MenuBar .fullScreenEditButton, .gwt-MenuBar .fullScreenCloseButton {
-  float: right;
-  margin: 5px;
-}
-
-#body .fullScreenWrapper {
-  z-index: 5;
-  position: fixed !important;
-  left: 0;
-  top: 0px;
-  right: 0;
-  bottom: 0;
-  width: 100%;
-  height: 100%;
-  padding: 0 !important;
-  margin: 0 !important;
-  background-color: $theme.pageContentBackgroundColor;
-}
-
-/* Comment this to make the version comment and minor edit checkbox visible in full screen */
-.fullScreenWrapper .metamodifs {
-  display: none !important;
-}
-
-.fullScreenWrapper .mceEditorContainer {
-  height: auto !important;
-}
-.fullScreenWrapper table.mceEditor {
-  height: auto !important;
-  margin: 0 !important;
-  border: none !important;
-}
-* html .fullScreenWrapper {
-  position: absolute !important;
-}
-/* Make sure gwt popup menus are visible in full screen: */
-.gwt-MenuBarPopup {
-  z-index: 12;
-}
-/* This overrides the pre behavior when the buttons end up as children of such a field */
-#body .fullScreenWrapper {
-  white-space: normal;
-}
-/* This overrides a rule for the Object Editor that is supposed to resize text inputs. */
-#body .fullScreenWrapper .buttons .buttonwrapper input {
-  width: auto;
-}
-#xwikiobjects .fullScreenWrapper textarea:focus, #xwikiclassproperties .fullScreenWrapper textarea:focus {
-  background-color: $theme.pageContentBackgroundColor;
-}
-.fullScreenWrapper textarea {
-  margin: 0 !important;
-  padding: 0 2px !important;
-  border: 0 none !important;
-}
\ No newline at end of file
diff --git a/src/main/webapp/resources/uicomponents/widgets/fullScreen.js b/src/main/webapp/resources/uicomponents/widgets/fullScreen.js
deleted file mode 100644
index f973e2cc8..000000000
--- a/src/main/webapp/resources/uicomponents/widgets/fullScreen.js
+++ /dev/null
@@ -1,497 +0,0 @@
-// ======================================
-// Full screen editing for page content
-// 
-// Make sure the XWiki 'namespace' exists.
-if (typeof(XWiki) == 'undefined') {
-  XWiki = new Object();
-}
-// Make sure the editors 'namespace' exists.
-if (typeof(XWiki.widgets) == 'undefined') {
-  XWiki.widgets = new Object();
-}
-
-/**
- * Full screen editing for textareas or maximizable elements.
- *
- * TODO Revisit once the new WYSIWYG supports inline editing.
- */
-XWiki.widgets.FullScreen = Class.create({
-  // Some layout settings, to be customized for other skins
-  /** Maximized element margins */
-  margin : 0,
-  /** Full screen activator / deactivator button size */
-  buttonSize : 16,
-  /**
-   * Full screen control initialization
-   * Identifies the elements that must be visible in full screen: the textarea or the rich text editor, along with their
-   * toolbar and the form buttons.
-   * Creates two buttons for closing the fullscreen: one (image) to insert in the toolbar, and one (plain form button)
-   * to add next to the form's action buttons.
-   * Finally, the textareas and rich text editors in the form are equipped with their own fullscreen activators,
-   * inserted in the corresponding toolbar, if there is any, or simply next to the textarea in the document
-   * (see the {@link #addBehavior} function),
-   */
-  initialize : function() {
-    // The action buttons need to be visible in full screen
-    this.buttons = $(document.body).down(".bottombuttons");
-    // If there are no buttons, at least the Exit FS button should be visible, so create an empty button container
-    if (!this.buttons) {
-      this.buttons = new Element("div", {"class" : "bottombuttons"}).update(new Element("div", {"class" : "buttons"}));
-      this.buttons._x_isCustom = true;
-      // It doesn't matter where the container is, it will only be needed in fullScreen.
-      document.body.appendChild(this.buttons.hide());
-    }
-    // When the full screen is activated, the buttons will be brought in the fullscreen, thus removed from their parent
-    // element, where they are replaced by a placeholder, so that we know exactly where to put them back.
-    this.buttonsPlaceholder = new Element("span");
-    // Placeholder for the toolbar, see above.
-    this.toolbarPlaceholder = new Element("span");
-    // The controls that will close the fullscreen
-    this.createCloseButtons();
-    // Prepare textareas / maximizable elements for full screen editing
-    $$('textarea', '.maximizable').each(function(element) {
-      this.addBehavior(element);
-    }.bind(this));
-    // The GWT editor removes the textarea from the document, thus should be treated separately
-    $$('.xRichTextEditor').each(function(item) {
-      this.addBehavior(item);
-    }.bind(this));
-    // WYSIWYGR sends events when a new editor is created.
-    this.addWysiwyg20Listener();
-    // When comming back from preview, check if the user was in full screen before hitting preview, and if so restore
-    // that full screen
-    this.maximizedReference = $(document.body).down("input[name='x-maximized']");
-    if (this.maximizedReference && this.maximizedReference.value != "") {
-      var matches = $$(this.maximizedReference.value);
-      if (matches && matches.length > 0) {
-        this.makeFullScreen(matches[0]);
-      }
-    }
-  },
-  /** According to the type of each element being maximized, a button in created and attached to it. */
-  addBehavior : function (item) {
-    if (this.isWysiwyg20Content(item)) {
-      this.addWysiwyg20ContentButton(item);
-    } else if (this.isWysiwyg10Content(item)) {
-      this.addWysiwyg10ContentButton(item);
-    } else if (this.isWikiContent(item)) {
-      this.addWikiContentButton(item);
-    } else if (this.isWysiwyg20Field(item)) {
-      this.addWysiwyg20FieldButton(item);
-    } else if (this.isWikiField(item)) {
-      this.addWikiFieldButton(item);
-    } else if (this.isWysiwyg10Field(item)) {
-      this.addWysiwyg10FieldButton(item);
-    } else {
-      // a div element with class maximazable
-      this.addElementButton(item);
-    }
-  },
-  addWysiwyg20Listener : function () {
-    document.observe('xwiki:wysiwyg:created', this.wysiwyg20Created.bindAsEventListener(this));
-  },
-  wysiwyg20Created : function(event) {
-    var item = $(event.memo.instance.getRichTextArea()).up(".xRichTextEditor");
-    this.addBehavior(item);
-    // Remove the old maximize link inserted for the plain textarea before the WYSIWYG was loaded
-    while (true) {
-      item = item.up();
-      if (!item) {
-        return;
-      } else if (item.previous(".fullScreenEditLinkContainer")) {
-        item.previous(".fullScreenEditLinkContainer").remove();
-        return;
-      }
-    }
-  },
-  // Some simple functions that help deciding what kind of editor is the target element
-  isWikiContent : function (textarea) {
-    // If the textarea is not visible, then the WYSIWYG editor is active.
-    return textarea.name == 'content' && textarea.visible();
-  },
-  isWysiwyg10Content : function (textarea) {
-    // If the textarea is not visible, then the WYSIWYG editor is active.
-    // In IE, the WYSIWYG is placed before its textarea.
-    return textarea.name == 'content' && (Prototype.Browser.IE ? textarea.previous(".mceEditorContainer") : textarea.next(".mceEditorContainer"));
-  },
-  isWysiwyg20Content : function (item) {
-    return item.hasClassName("xRichTextEditor") && item.up("div[id^=content_container]");
-  },
-  isWikiField : function (textarea) {
-    // If the textarea is not visible, then the WYSIWYG editor is active.
-    return textarea.visible();
-  },
-  isWysiwyg10Field : function (textarea) {
-    return !textarea.visible() && textarea.name != 'content' && (Prototype.Browser.IE ? textarea.previous(".mceEditorContainer") : textarea.next(".mceEditorContainer"));
-  },
-  isWysiwyg20Field : function (item) {
-    return item.hasClassName("xRichTextEditor") && !item.up("div[id^=content_container]");
-  },
-  /** Adds the fullscreen button in the Wiki editor toolbar. */
-  addWikiContentButton : function (textarea) {
-    textarea._toolbar = $(document.body).down(".leftmenu2");
-    // Normally there should be a simple toolbar with basic actions
-    if (textarea._toolbar) {
-      textarea._toolbar.insert({top: this.createOpenButton(textarea)});
-    } else {
-      this.addWikiFieldButton(textarea);
-    }
-  },
-  /** Adds the fullscreen button in the TinyMCE WYSIWYG editor toolbar. */
-  addWysiwyg10ContentButton : function (item) {
-    var container = (Prototype.Browser.IE ? item.previous(".mceEditorContainer") : item.next(".mceEditorContainer"));
-    if (!container) {
-      return false;
-    }
-    var toolbar = container.down(".mceToolbar");
-    if (!toolbar) {
-      return false;
-    }
-    // Create a tinymce-like internal toolbar to contain the fullscreen button
-    var newToolbar = new Element('span', {'class': 'mce_editor_fullscreentoolbar'});
-    var link = new Element('a', {'class' : 'mceButtonNormal'});
-    // Separator
-    newToolbar.insert(new Element('img', {
-       'class': 'mceSeparatorLine',
-       height: 15,
-       width: 1,
-       src: toolbar.down('img.mceSeparatorLine').src
-    }));
-    newToolbar.insert(link.insert(this.createOpenButton(container)));
-    toolbar.insert(newToolbar);
-    container._toolbar = toolbar;
-    return true;
-  },
-  /** Adds the fullscreen button in the GWT WYSIWYGR editor menu. */
-  addWysiwyg20ContentButton : function (item) {
-    var toolbar = item.down(".gwt-MenuBar");
-    // Sometimes the toolbar isn't loaded when this method executes (in IE). Schedule a periodical reatempt.
-    if (!toolbar) {
-      // Only schedule once
-      if (!item._x_fullScreenLoader) {
-        item._x_fullScreenLoader_iterations = 0;
-        item._x_fullScreenLoader = new PeriodicalExecuter(function(item) {
-          // Give up after 20 seconds
-          if (item._x_fullScreenLoader_iteration > 100) {
-            item._x_fullScreenLoader.stop();
-            item._x_fullScreenLoader = false;
-            return;
-          }
-          item._x_fullScreenLoader_iteration++;
-          this.addWysiwyg20ContentButton(item);
-        }.bind(this, item), 0.2);
-      }
-      return false;
-    }
-    toolbar.insert({"top" : this.createOpenButton(item)});
-    item._toolbar = toolbar;
-    if (item._x_fullScreenLoader) {
-      item._x_fullScreenLoader.stop();
-      item._x_fullScreenLoader = false;
-    }
-    return true;
-  },
-  addElementButton: function(element) {
-    Element.insert(element, {before: this.createOpenLink(element)});
-  },
-  addWikiFieldButton : function (textarea) {
-    Element.insert(textarea, {before: this.createOpenLink(textarea)});
-  },
-  addWysiwyg10FieldButton : function (textarea) {
-    this.addWysiwyg10ContentButton(textarea);
-  },
-  addWysiwyg20FieldButton : function (textarea) {
-    this.addWysiwyg20ContentButton(textarea);
-  },
-  /** Creates a full screen activator button for the given element. */
-  createOpenButton : function (targetElement) {
-    // Create HTML element
-    var fullScreenActivator = new Element('img', {
-      'class': 'fullScreenEditButton',
-      title: "$msg.get('core.editors.fullscreen.editFullScreen')",
-      alt: "$msg.get('core.editors.fullscreen.editFullScreen')",
-      src: "$xwiki.getSkinFile('icons/silk/arrow_out.gif')"
-    });
-    // Add functionality
-    fullScreenActivator.observe('click', this.makeFullScreen.bind(this, targetElement));
-    fullScreenActivator.observe('mousedown', this.preventDrag.bindAsEventListener(this));
-    // Remember the button associated with each maximizable element
-    targetElement._x_fullScreenActivator = fullScreenActivator;
-    fullScreenActivator._x_maximizedElement = targetElement;
-    return fullScreenActivator;
-  },
-  createOpenLink : function (targetElement) {
-    // Create HTML element
-    var fullScreenActivatorContainer = new Element('div', {
-      'class': 'fullScreenEditLinkContainer'
-    });
-    var fullScreenActivator = new Element('a', {
-      'class': 'fullScreenEditLink',
-      title: "$msg.get('core.editors.fullscreen.editFullScreen')"
-    });
-    fullScreenActivator.update("${msg.get('core.editors.fullscreen.editFullScreen')} »")
-    // Add functionality
-    fullScreenActivator.observe('click', this.makeFullScreen.bind(this, targetElement));
-    // Add it to the container
-    fullScreenActivatorContainer.update(fullScreenActivator);
-    // Remember the button associated with each maximizable element
-    targetElement._x_fullScreenActivator = fullScreenActivator;
-    fullScreenActivator._x_maximizedElement = targetElement;
-    return fullScreenActivatorContainer;
-  },
-  /**
-   * Creates the full screen close buttons (which are generic, not attached to the maximized elements like the activators)
-   */
-  createCloseButtons : function () {
-    // Toolbar image button
-    // Create HTML element
-    this.closeButton = new Element('img', {
-      'class': 'fullScreenCloseButton',
-      title: "$msg.get('core.editors.fullscreen.exitFullScreen')",
-      alt: "$msg.get('core.editors.fullscreen.exitFullScreen')",
-      src: "$xwiki.getSkinFile('icons/silk/arrow_in.gif')"
-    });
-    // Add functionality
-    this.closeButton.observe('click', this.closeFullScreen.bind(this));
-    this.closeButton.observe('mousedown', this.preventDrag.bindAsEventListener(this));
-    // Hide by default
-    this.closeButton.hide();
-
-    // Edit actions button
-    // Create HTML element
-    this.actionCloseButton = new Element('input', {
-      "type" : "button",
-      'class': 'button',
-      value: "$msg.get('core.editors.fullscreen.exitFullScreen')"
-    });
-    this.actionCloseButtonWrapper = new Element('span', {
-      'class': 'buttonwrapper'
-    });
-    this.actionCloseButtonWrapper.update(this.actionCloseButton);
-    // Add functionality
-    this.actionCloseButton.observe('click', this.closeFullScreen.bind(this));
-    // Hide by default
-    this.actionCloseButtonWrapper.hide();
-    // Add it in the action bar
-    this.buttons.down(".buttons").insert({top: this.actionCloseButtonWrapper});
-  },
-
-  /**
-    * How this works:
-    * - All the elements between the targetElement and the root element are maximized, and all the other nodes are hidden
-    * - The parent element becomes a wrapper around the targetElement
-    * - Move the toolbar (if it exists) and the action buttons in the wrapper
-    * - Hide the overflows of the body element, so that a scrollbar doesn't appear
-    * - All the initial styles of the altered elements are remembered, so that they can be restored when exiting fullscreen
-    */
-  makeFullScreen : function (targetElement) {
-    // Store the selector of the target element in the form, in the hidden input called 'x-maximized'.
-    // This is needed so that the full screen can be reactivated when comming back from preview, if it was activate before
-    // the user hit the preview button.
-    if (this.maximizedReference) {
-      if (targetElement.id) {
-        // Using #ID fails since the IDs for the textareas in inline editing contain the '.' character, which marks a classname
-        this.maximizedReference.value = targetElement.tagName + "[id='" + targetElement.id + "']";
-      } else if (targetElement.name) {
-        this.maximizedReference.value = targetElement.tagName + "[name='" + targetElement.name + "']" ;
-      } else if (targetElement.className) {
-        // No id, no name. This must be the GWT editor...
-        this.maximizedReference.value = targetElement.tagName + "." + targetElement.className ;
-      }
-    }
-    // Remember the maximized element
-    this.maximized = targetElement;
-    // Remember the original dimensions of the maximized element
-    targetElement._originalStyle = {
-      'width' : targetElement.style['width'],
-      'height' : targetElement.style['height']
-    };
-    if (targetElement.hasClassName("xRichTextEditor")) {
-      var iframe = targetElement.down(".gwt-RichTextArea");
-      iframe._originalStyle = {
-        'width' : iframe.style['width'],
-        'height' : iframe.style['height']
-      };
-    } else if (targetElement.hasClassName("mceEditorContainer")) {
-      var iframe = targetElement.down(".mceEditorIframe");
-      iframe._originalStyle = {
-        'width' : iframe.style['width'],
-        'height' : iframe.style['height']
-      };
-      var tframe = targetElement.down(".mceEditorSource");
-      tframe._originalStyle = {
-        'width' : tframe.style['width'],
-        'height' : tframe.style['height']
-      };
-    }
-    // All the elements between the targetElement and the root element are set to position: static, so that the offset
-    // parent of the targetElement will be the window. Remember the previous settings in order to be able to restore the
-    // layout when exiting fullscreen.
-    var wrapper = targetElement.up();
-    wrapper.addClassName("fullScreenWrapper");
-    if(targetElement._toolbar) {
-      // The wiki editor has the toolbar outside the textarea element, unlike the other editors, which have it as a descendant
-      if (targetElement._toolbar.hasClassName("leftmenu2")) {
-        wrapper.insert({"top" : targetElement._toolbar.replace(this.toolbarPlaceholder)});
-      }
-      // Replace the Maximize button in the toolbar with the Restore one
-      targetElement._x_fullScreenActivator.replace(this.closeButton);
-    }
-    wrapper.insert(this.buttons.replace(this.buttonsPlaceholder).show());
-    var parent = targetElement.up();
-    targetElement._x_fullScreenActivator.hide();
-    while (parent != document.body) {
-      parent._originalStyle = {
-        'overflow' : parent.style['overflow'],
-        'position' : parent.style['position'],
-        'width' : parent.style['width'],
-        'height' : parent.style['height'],
-        'left' : parent.style['left'],
-        'right' : parent.style['right'],
-        'top' : parent.style['top'],
-        'bottom' : parent.style['bottom'],
-        'padding' : parent.style['padding'],
-        'margin' : parent.style['margin']
-      };
-      parent.setStyle({'overflow': "visible", 'position': "absolute", width: "100%", height: "100%", left: 0, top:0, right:0, bottom: 0, padding: 0, margin: 0});
-      parent.siblings().each(function(item) {
-        item._originalDisplay = item.style['display'];
-        item.setStyle({display: "none"});
-      });
-      parent = parent.up();
-    }
-    document.body._originalStyle = {
-      'overflow' : parent.style['overflow'],
-      'width' : parent.style['width'],
-      'height' : parent.style['height']
-    };
-    var root = $(document.body).up();
-    root._originalStyle = {
-      'overflow' : root.style['overflow'],
-      'width' : root.style['width'],
-      'height' : root.style['height']
-    };
-    $(document.body).setStyle({'overflow': 'hidden', 'width': '100%', 'height': '100%'});
-    root.setStyle({'overflow': "hidden", 'width': "100%", 'height': "100%"});
-
-    // Make sure to resize the targetElement when the window dimensions are changed. Both document and window are monitored,
-    // since different browsers send events to different elements.
-    this.resizeListener = this.resizeTextArea.bind(this, targetElement);
-    Event.observe(window, 'resize', this.resizeListener);
-    // Show the exit buttons
-    this.closeButton.show();
-    this.actionCloseButtonWrapper.show();
-    // Maximize the targetElement
-    this.resizeTextArea(targetElement);
-    // IE6 has yet another bug, if we don't call this, then sometimes the toolbar will be invisible. Don't ask why.
-    if (targetElement._toolbar) {
-      targetElement._toolbar.viewportOffset();
-    }
-    document.fire("xwiki:fullscreen:entered", { "target" : targetElement });
-  },
-  /** Restore the layout. */
-  closeFullScreen : function() {
-    var targetElement = this.maximized;
-    // Hide the exit buttons
-    this.closeButton.hide();
-    this.actionCloseButtonWrapper.hide();
-    // We're no longer interested in resize events
-    Event.stopObserving(window, 'resize', this.resizeListener);
-    // Restore the parent element (the wrapper)
-    targetElement.up().removeClassName("fullScreenWrapper");
-    // Restore the WYSIWYGs
-    if (targetElement.hasClassName("xRichTextEditor")) {
-      var iframe = targetElement.down(".gwt-RichTextArea");
-      iframe.setStyle(iframe._originalStyle);
-    } else if (targetElement.hasClassName("mceEditorContainer")) {
-      var iframe = targetElement.down(".mceEditorIframe");
-      iframe.setStyle(iframe._originalStyle);
-      var tframe = targetElement.down(".mceEditorSource");
-      tframe.setStyle(tframe._originalStyle);
-    }
-
-    // Restore the previous layout
-    // NOTE: We restore the previous layout in reverse order (from the document body down to the target element) to
-    // overcome a IE7 bug (see http://jira.xwiki.org/jira/browse/XWIKI-4346 ).
-    var parent = targetElement.up();
-    var parents = [];
-    while (parent != document.body) {
-      parents.push(parent);
-      parent = parent.up();
-    }
-    var i = parents.length;
-    while (i--) {
-      parent = parents[i];
-      parent.setStyle(parent._originalStyle);
-      parent.siblings().each(function(item) {
-        item.style['display'] = item._originalDisplay;
-      });
-    }
-    document.body.setStyle(document.body._originalStyle);
-    $(document.body).up().setStyle($(document.body).up()._originalStyle);
-    // Restore the toolbar and action buttons to their initial position
-    this.buttonsPlaceholder.replace(this.buttons);
-    if (this.buttons._x_isCustom) {
-      this.buttons.hide();
-    }
-    if (targetElement._toolbar) {
-      if (targetElement._toolbar.hasClassName("leftmenu2")) {
-        this.toolbarPlaceholder.replace(targetElement._toolbar);
-      }
-      // Replace the Restore button in the toolbar with the Maximize one
-      this.closeButton.replace(targetElement._x_fullScreenActivator);
-    }
-    if (Prototype.Browser.IE) {
-      // IE crashes if we try to resize this without a bit of delay.
-      setTimeout(function() {
-        targetElement._x_fullScreenActivator.show();
-        this.setStyle(this._originalStyle);
-      }.bind(targetElement), 500);
-    } else {
-      targetElement._x_fullScreenActivator.show();
-      targetElement.setStyle(targetElement._originalStyle);
-    }
-    // No element is maximized anymore
-    delete this.maximized;
-    if (this.maximizedReference) {
-      this.maximizedReference.value = '';
-    }
-    document.fire("xwiki:fullscreen:exited", { "target" : targetElement });
-  },
-  /** In full screen, when the containers's dimensions change, the maximized element must be resized accordingly. */
-  resizeTextArea : function(targetElement) {
-    if (!this.maximized) {
-      return;
-    }
-    // Compute the maximum space available for the textarea:
-    var newHeight = document.viewport.getHeight();
-    var newWidth = document.viewport.getWidth();
-    // Prototype fails to return the right viewport in IE6. This works:
-    if(newWidth <= 0) {
-      newWidth = document.body.clientWidth;
-      newHeight = document.body.clientHeight;
-    }
-    // Window width - styling padding
-    newWidth = newWidth - this.margin;
-    // Window height - margin (for the toolbar) - styling padding - buttons
-    newHeight = newHeight - targetElement.positionedOffset().top - this.margin - this.buttons.getHeight();
-    targetElement.setStyle({'width' :  newWidth + 'px', 'height' :  newHeight + 'px'});
-    // Resize the WYSIWYGs
-    if (targetElement.hasClassName("xRichTextEditor")) {
-      targetElement.down(".gwt-RichTextArea").setStyle({'width' :  newWidth + 'px', 'height' : newHeight - targetElement.down(".xToolbar").getHeight() - targetElement.down(".gwt-MenuBar").getHeight() + 'px'});
-    } else if (targetElement.hasClassName("mceEditorContainer")) {
-      targetElement.down(".mceEditorIframe").setStyle({'width' :  newWidth + 'px', 'height' : newHeight - targetElement._toolbar.getHeight() + 'px'});
-      targetElement.down(".mceEditorSource").setStyle({'width' :  newWidth + 'px', 'height' : newHeight - targetElement._toolbar.getHeight() + 'px'});
-    }
-    document.fire("xwiki:fullscreen:resized", { "target" : targetElement });
-  },
-  /** onMouseDown handler that prevents dragging the button. */
-  preventDrag : function(event) {
-    event.stop();
-  }
-});
-
-// Create the fullscreen behavior on startup.
-document.observe('xwiki:dom:loaded', function() {
-  new XWiki.widgets.FullScreen();
-});
diff --git a/src/main/webapp/resources/uicomponents/widgets/list/xlist.js b/src/main/webapp/resources/uicomponents/widgets/list/xlist.js
index 999507c7c..6d4faaf0d 100644
--- a/src/main/webapp/resources/uicomponents/widgets/list/xlist.js
+++ b/src/main/webapp/resources/uicomponents/widgets/list/xlist.js
@@ -10,7 +10,7 @@
  *      ], 
  *      { // options
  *         numbered: false,
- *         icon: "$xwiki.getSkinFile('icons/silk/sport_basketball.gif')",
+ *         icon: "pathToIcon",
  *         classes : "myListExtraClass",
  *         itemClasses : "myListItemExtraClasses",
  *         eventListeners : {
@@ -25,7 +25,7 @@
  *
  * xlist.addItem(
  *   new XWiki.widgets.XListItem('A fifth element added later', {
- *     icon : "$xwiki.getSkinFile('icons/silk/bomb.gif')", // this overrides the one defined for the whole list
+ *     icon : "pathToIcon", // this overrides the one defined for the whole list
  *     eventListeners: {
  *       // Event listeners defined just for this specific list item
  *       'mouseout' : function() { console.log('just this list item is bound to this event', this); }
diff --git a/src/main/webapp/resources/uicomponents/widgets/notification.css b/src/main/webapp/resources/uicomponents/widgets/notification.css
index 73f47f24a..e582cedbb 100644
--- a/src/main/webapp/resources/uicomponents/widgets/notification.css
+++ b/src/main/webapp/resources/uicomponents/widgets/notification.css
@@ -20,36 +20,30 @@
   font-weight: bold;
   line-height: 20px;
 }
-
-#set($notificationCustommization = [])
-## each element:                       [notification type, bg color, text color, icon]
-#set($discard = $notificationCustommization.add(["info", "#268", "#fff"]))
-#set($discard = $notificationCustommization.add(["warning", "#fd8", "#330"]))
-#set($discard = $notificationCustommization.add(["error", "#a00", "#fff"]))
-#set($discard = $notificationCustommization.add(["inprogress", "#333", "#fff", "icons/xwiki/spinner-white.gif"]))
-#set($discard = $notificationCustommization.add(["done", "#160", "#fff"]))
-##
-#foreach($item in $notificationCustommization)
-  #set($notificationType  = ${item.get(0)})
-  #set($bgColor = ${item.get(1)})
-  #set($textColor = ${item.get(2)})
-  #set($imgUrl = '')
-  #if ($item.size() >= 4)
-    #set($imgName = "$!{item.get(3)}")
-    #if($imgName.indexOf("/") >= 0)
-      #set($imgUrl = $xwiki.getSkinFile($imgName, true))
-    #else
-      #set($imgUrl = $xwiki.getSkinFile("icons/silk/${imgName}.gif", true))
-    #end
-  #end
-/** $notificationType */
-.xnotification-${notificationType} {
-  background-color: $bgColor;
-  color:  $textColor;
-  border-color:  $textColor;
-#if($imgUrl != '')
-  background-image: url(${imgUrl});
+.xnotification-info {
+  background-color: #268;
+  color:  #fff;
+  border-color:  #fff;
+}
+.xnotification-warning {
+  background-color: #fd8;
+  color:  #330;
+  border-color:  #330;
+}
+.xnotification-error {
+  background-color: #a00;
+  color:  #fff;
+  border-color:  #fff;
+}
+.xnotification-inprogress {
+  background-color: #333;
+  color:  #fff;
+  border-color:  #fff;
+  background-image: url(/skin/resources/icons/xwiki/spinner%2Dwhite.gif);
   padding-left: 22px;
-#end
 }
-#end
+.xnotification-done {
+  background-color: #160;
+  color:  #fff;
+  border-color:  #fff;
+}
diff --git a/src/main/webapp/skins/albatross/screenlayout.css b/src/main/webapp/skins/albatross/screenlayout.css
index 884667706..d4100adc1 100644
--- a/src/main/webapp/skins/albatross/screenlayout.css
+++ b/src/main/webapp/skins/albatross/screenlayout.css
@@ -1,5 +1,5 @@
-@import url(google-fonts/Terminal-Dosis/Terminal-Dosis-200,300,400,500,600,700,800.css);
-@import url(google-fonts/Open-Sans/Open-Sans-300italic,400italic,600italic,700italic,800italic,300,400,600,700,800.css);
+@import url(/file/resources/celRes/google-fonts/Terminal-Dosis/Terminal-Dosis-200,300,400,500,600,700,800.css);
+@import url(/file/resources/celRes/google-fonts/Open-Sans/Open-Sans-300italic,400italic,600italic,700italic,800italic,300,400,600,700,800.css);
 /**
 
 General layout of the page
@@ -7,46 +7,61 @@ for @media screen displays
 
 **/
 
-body#body{
+body#body {
   width: 100%;
   padding: 0;
-  margin: 0 ;  /* padding et margin nul pour emulation min width*/
+  margin: 0;
+  /* padding et margin nul pour emulation min width*/
   min-width: 760px;
 }
 
-#xwikimaincontainer{
+#xwikimaincontainer {
   margin: 0px 40px;
   text-align: center;
   margin-bottom: 40px;
 }
 
-html > body .minwidth, html > body .minwidthb, html > body .minwidthc{
+html>body .minwidth,
+html>body .minwidthb,
+html>body .minwidthc {
   display: none;
 }
-.minwidth, .minwidthb, .minwidthc{
+
+.minwidth,
+.minwidthb,
+.minwidthc {
   width: 720px;
   height: 0px;
 }
-* html .minwidth, * html .minwidthb, * html .minwidthc{
+
+* html .minwidth,
+* html .minwidthb,
+* html .minwidthc {
   height: 1px !important;
   overflow: hidden;
 }
-.minwidthb{
+
+.minwidthb {
   width: 520px;
 }
-.minwidthc{
+
+.minwidthc {
   width: 438px;
 }
-.layoutsection{
+
+.layoutsection {
   clear: both;
 }
-#xwikimaincontainerinner{
+
+#xwikimaincontainerinner {
   text-align: left;
 }
-#contentcontainer{
+
+#contentcontainer {
   z-index: 1;
 }
-#xwikieditor{
+
+#xwikieditor {
   border-right: 310px solid;
   z-index: 1;
 }
@@ -63,13 +78,14 @@ Global header
 ---------------------------------------
 */
 
-#headerglobal{
+#headerglobal {
   display: block;
   height: 8em;
   min-height: 100px;
-  border-right:200px solid ;
+  border-right: 200px solid;
   z-index: 1;
 }
+
 #globallinks {
   position: relative;
   float: left;
@@ -79,10 +95,11 @@ Global header
   margin-right: -200px;
 }
 
-.editbody #headerglobal{
-  border-right:310px solid ;
+.editbody #headerglobal {
+  border-right: 310px solid;
 }
-.editbody #globallinks{
+
+.editbody #globallinks {
   width: 310px;
   margin-right: -310px;
 }
@@ -93,21 +110,24 @@ Global header
   font-size: 115%;
   line-height: 1em;
 }
+
 #globalmenu .glink {
   display: block;
   text-decoration: none;
   font-size: 0.8em;
   font-weight: bold;
 }
-#globalmenu #headerlanguages a{
+
+#globalmenu #headerlanguages a {
   text-transform: capitalize;
 }
+
 #globalmenu span {
   display: none;
 }
 
 
-#company{
+#company {
   height: 8em;
   float: left;
   width: 100%;
@@ -123,46 +143,30 @@ Global header
 }
 
 #globaldoctitle {
-  display: none; /*pour éviter pb dans IE -- a regler*/
+  display: none;
+  /*pour éviter pb dans IE -- a regler*/
 }
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 /*
 ---------------------------------------
 Space header, footer
 ---------------------------------------
 */
-#headerspace, #footerglobal {
+#headerspace,
+#footerglobal {
   height: 1.5em;
 }
+
 #footerglobal {
   padding: 1em 0px;
   text-align: center;
 }
 
-#headerspace hr, #footerglobal hr{
+#headerspace hr,
+#footerglobal hr {
   display: none;
 }
+
 #breadcrumbs {
   padding-left: 40px;
   display: inline-block;
@@ -175,9 +179,12 @@ Space header, footer
   vertical-align: middle;
   float: left;
 }
-#headerspace:target #breadcrumbs, #headerspace:target .edit-meta-tools {
+
+#headerspace:target #breadcrumbs,
+#headerspace:target .edit-meta-tools {
   display: none;
 }
+
 .edit-meta-tools a {
   display: block;
   width: 16px;
@@ -187,11 +194,13 @@ Space header, footer
   background: transparent none left top no-repeat;
   margin-left: 4px;
 }
+
 .edit-meta-tools a.edit-parent {
-  background-image: url("$xwiki.getSkinFile('icons/xwiki/parent_edit.gif')");
+  background-image: url(/skin/resources/icons/xwiki/parent_edit.gif);
 }
+
 .edit-meta-tools a.hide-edit-parent {
-  background-image: url("$xwiki.getSkinFile('icons/silk/chart_organisation.gif')");
+  background-image: url(/skin/resources/icons/silk/chart_organisation.gif);
 }
 
 /* Parent editing area */
@@ -201,38 +210,47 @@ Space header, footer
   font-size: 90%;
   vertical-align: baseline;
 }
+
 #headerspace #parentinput * {
   vertical-align: baseline;
 }
+
 /* Don't combine the following two rules, otherwise IE will fail to recognize either of them */
 #headerspace:target #parentinput {
   display: inline-block;
 }
+
 #headerspace #parentinput.active {
   display: inline-block;
 }
 
-#footerglobal, #headerspace {
-  clear:both;
+#footerglobal,
+#headerspace {
+  clear: both;
 }
+
 #xwikilicence {
   float: right;
   clear: right;
   margin-right: 5px;
 }
+
 #xwikidocinfo {
   width: 100%;
 }
+
 #celementsplatformversion {
   float: left;
   margin-left: 5px;
 }
+
 /*
 ---------------------------------------
 Content
 ---------------------------------------
 */
-#contentcontainerinner, #xwikieditorinner {
+#contentcontainerinner,
+#xwikieditorinner {
   width: 100%;
   background-color: #FFF;
 }
@@ -241,47 +259,54 @@ Content
   float: right;
   padding: 0px;
 }
+
 * html #contentcolumn {
   width: auto;
 }
+
 .main {
   padding: 20px 40px 20px 40px;
 }
-.leftsidecolumns{
+
+.leftsidecolumns {
   float: left;
   width: 100%;
 }
-.content{
+
+.content {
   border-right: 200px solid;
   border-left: 200px solid;
 }
-.contenthideleft{
-  border-right: 200px solid ;
-  border-left: 0px solid ;
+
+.contenthideleft {
+  border-right: 200px solid;
+  border-left: 0px solid;
 }
-.contenthideright{
-  border-right: 0px solid ;
+
+.contenthideright {
+  border-right: 0px solid;
   border-left: 200px solid;
 }
-#contentcontainer.contenthidelefthideright{
-  border-right: 0px solid ;
-  border-left: 0px solid ;
+
+#contentcontainer.contenthidelefthideright {
+  border-right: 0px solid;
+  border-left: 0px solid;
 }
 
-#editcolumn{
+#editcolumn {
   width: 100%;
   float: left;
   overflow: hidden;
   padding-bottom: 20px;
 }
 
-#actionmenu{}
 #xwikieditcontent textarea#content {
   width: 100%;
 }
-.layoutsubsection{}
 
-.layoutsubsection.about{
+.layoutsubsection {}
+
+.layoutsubsection.about {
   border: none;
   text-align: right;
   font-style: italic;
@@ -290,10 +315,10 @@ Content
 }
 
 .about {
-  float:right;
-  text-align:right;
-  width:230px;
-  overflow:hidden;
+  float: right;
+  text-align: right;
+  width: 230px;
+  overflow: hidden;
   height: 30px;
   line-height: 15px;
 }
@@ -303,13 +328,14 @@ Content
 Zone for Comments, attachments, History...
 ---------------------------------------
 */
-#xwikidata{
+#xwikidata {
   padding: 0px;
   border: none;
 }
-.xwikiintratitle{
-}
-.xwikiintracontent{
+
+.xwikiintratitle {}
+
+.xwikiintracontent {
   margin: 0px;
 }
 
@@ -318,7 +344,7 @@ Zone for Comments, attachments, History...
 "Message Boxes"
 ---------------------------------------------
 */
-fieldset.xwikimessage{
+fieldset.xwikimessage {
   display: block;
   float: none;
   width: 480px;
@@ -327,7 +353,8 @@ fieldset.xwikimessage{
   border-top: 8px solid #BBB;
   padding: 0px 8px 16px;
 }
-html > body fieldset.xwikimessage{
+
+html>body fieldset.xwikimessage {
   padding-top: 8px;
 }
 
@@ -337,54 +364,65 @@ fieldset.xwikimessage legend {
   padding: 2px 8px;
   margin: 0px;
 }
-fieldset.xwikimessage .xwikimessage{
+
+fieldset.xwikimessage .xwikimessage {
   text-align: center;
   font-weight: bold;
   font-size: 110%;
 }
+
 fieldset.xwikimessage .buttons {
   text-align: center;
 }
+
 fieldset.xwikimessage .buttons a {
   text-decoration: none;
   margin: 8px;
 }
 
-.button{
+.button {
   font-family: Helvetica, sans-serif;
   font-weight: bold;
   text-align: center;
 }
-.topbuttons{
+
+.topbuttons {
   margin-bottom: 5px;
 }
-.bottombuttons{
+
+.bottombuttons {
   margin-top: 5px;
 }
+
 /*
 ----------------------------------------------
 Comments
 ----------------------------------------------
 */
-.xwikicomment {
-}
+.xwikicomment {}
 
-#xwikidata #commentscontent{
+#xwikidata #commentscontent {
   background: #E5F0FE url("icons/black-bg-comments-left.png") left top no-repeat;
 }
-#comments, #attachments {
+
+#comments,
+#attachments {
   padding: 0px 20px;
 }
-#xwikidata .xwikititlewrapper{
+
+#xwikidata .xwikititlewrapper {
   cursor: pointer;
 }
-#xwikidata #commentscontent .xwikititlewrapper{
+
+#xwikidata #commentscontent .xwikititlewrapper {
   background: transparent url("icons/black-bg-comments-right.png") right top no-repeat;
 }
-#xwikidata #attw{
+
+#xwikidata #attw {
   background: transparent url("icons/black-bg-attach-right.png") right bottom no-repeat;
 }
-.xwikiintratitle{
+
+.xwikiintratitle {
   background: transparent url("icons/black-content-more.png") right center no-repeat;
   font-size: 160%;
   font-weight: 400;
@@ -392,115 +430,140 @@ Comments
   margin: 0px 24px;
   padding: 16px 0px 16px;
 }
-.exp .xwikiintratitle{
+
+.exp .xwikiintratitle {
   background: transparent url("icons/black-content-less.png") right center no-repeat;
 }
+
 #xwikidata #attachmentscontent {
   background: url("icons/black-bg-attach-left.png") left bottom no-repeat;
 }
-#attachmentscontent table{
+
+#attachmentscontent table {
   border: none;
 }
-.mime{
+
+.mime {
   text-align: center;
 }
-.xwikicomment{
+
+.xwikicomment {
   padding: 10px 24px;
   position: relative;
   overflow: hidden;
 }
-.commentspacer{
+
+.commentspacer {
   display: none;
 }
-#comments .odd{
+
+#comments .odd {
   background-color: #FFF;
 }
-#comments .even{
+
+#comments .even {
   background-color: #E5F0FE;
 }
 
-.commentavatar{
+.commentavatar {
   left: 0px;
   top: 0px;
   width: 54px;
 }
-.commentavatar img{
+
+.commentavatar img {
   width: 3.5em;
   display: block;
   margin: auto;
 }
-.commentheader{
+
+.commentheader {
   padding: 6px 0px;
 }
-.commentauthor{
+
+.commentauthor {
   font-size: 130%;
   font-weight: 900;
 }
-.commentauthor a{
+
+.commentauthor a {
   text-decoration: none;
   color: #000 !important;
 }
-.commentcontent{
 
-}
+.commentcontent {}
 
-.xwikibuttonlink a{
+.xwikibuttonlink a {
   background-color: #BBB;
   padding: 2px 4px;
   text-decoration: none;
   font-weight: bold;
 }
-table.xwikidatatable{
+
+table.xwikidatatable {
   margin: 8px auto;
   /* width: 100%; */
 }
-table.xwikidatatable, table.xwikidatatable th{
+
+table.xwikidatatable,
+table.xwikidatatable th {
   border: 1px solid #DDD;
 }
-table.xwikidatatable td{
+
+table.xwikidatatable td {
   padding: 2px 8px;
 }
 
-.xwikiintracontent legend{
+.xwikiintracontent legend {
   border: 1px solid #ddd;
   padding: 2px 4px;
 }
-.xwikiintracontent fieldset{
+
+.xwikiintracontent fieldset {
   border-color: #ddd;
   border-style: solid;
   padding: 8px 8px;
 }
-.xwikiintracontent legend{
+
+.xwikiintracontent legend {
   font-size: 110%;
   font-weight: bold;
   cursor: pointer;
   margin-bottom: 8px;
 }
-html > body .xwikiintracontent legend{
+
+html>body .xwikiintracontent legend {
   margin-bottom: 0px;
 }
-.xwikiintracontent fieldset.collapsed{
+
+.xwikiintracontent fieldset.collapsed {
   border: none;
 }
-.xwikiintracontent fieldset.collapsed legend{
+
+.xwikiintracontent fieldset.collapsed legend {
   margin-left: 2px;
 }
-.xwikiintracontent fieldset.collapsed div{
+
+.xwikiintracontent fieldset.collapsed div {
   display: none;
 }
-.xwikiintracontent fieldset.expanded .expands{
+
+.xwikiintracontent fieldset.expanded .expands {
   display: none;
 }
 
-.commentsno, .attachmentsno{
+.commentsno,
+.attachmentsno {
   font-size: 50%;
   background: transparent url("icons/black-comment2.png") center no-repeat;
   padding: 11px 24px 13px;
   font-weight: 900;
 }
-.attachmentsno{
+
+.attachmentsno {
   background: transparent url("icons/black-doc2.png") center no-repeat;
 }
+
 /*
 ---------------------------------------
 Menu
@@ -520,58 +583,66 @@ Menu
   overflow: visible;
 }
 
-html > body #actionmenu{
+html>body #actionmenu {
   position: fixed;
   top: 0;
   left: 0;
   width: 100%;
 }
 
-#actionmenu a{
+html>body.celementsmenubarvisible #actionmenu {
+  top: 28px;
+}
+
+#actionmenu a {
   text-decoration: none;
 }
-.rightmenu{
-	position: absolute;
-	right: 0px;
-	margin-right: 40px;
+
+.rightmenu {
+  position: absolute;
+  right: 0px;
+  margin-right: 40px;
 }
-.rightmenu a{
+
+.rightmenu a {
   float: left;
   width: 200px;
   text-align: center;
-  border:1px solid;
-  border-width:0px 1px;
+  border: 1px solid;
+  border-width: 0px 1px;
   margin-right: -1px;
-  font-size:1em;
-  text-decoration:none;
-  height:2em;
-  line-height:1.9em;
+  font-size: 1em;
+  text-decoration: none;
+  height: 2em;
+  line-height: 1.9em;
 }
 
-.leftmenu{
+.leftmenu {
   position: absolute;
   left: 42px;
 }
 
 
 .leftmenu2 {
-   text-align: left;
+  text-align: left;
 }
 
 
-.topmenuentry{
+.topmenuentry {
   float: left;
   width: 7em;
   height: 2em;
   text-align: center;
-  border:1px solid ;
-  border-width:0px 1px;
+  border: 1px solid;
+  border-width: 0px 1px;
   margin-right: -1px;
 }
-.topmenuentry strong{
+
+.topmenuentry strong {
   font-size: 90%;
 }
-.submenu{
+
+.submenu {
   display: block;
   width: 12em;
   text-align: left;
@@ -581,26 +652,29 @@ html > body #actionmenu{
 
 }
 
-.topmenuentry a, .topmenuentry a:link, .topmenuentry a:visited, .topmenuentry a:active{
-display:block;
-font-size:1em;
-text-decoration:none;
-width:7em;
-height:2em;
-line-height:1.9em;
+.topmenuentry a,
+.topmenuentry a:link,
+.topmenuentry a:visited,
+.topmenuentry a:active {
+  display: block;
+  font-size: 1em;
+  text-decoration: none;
+  width: 7em;
+  height: 2em;
+  line-height: 1.9em;
 }
 
-.rightmenu a{
-height:2em;
-line-height:1.9em;
-font-size:1em;
-text-decoration:none;
+.rightmenu a {
+  height: 2em;
+  line-height: 1.9em;
+  font-size: 1em;
+  text-decoration: none;
 }
 
-.submenu .submenuitem{
+.submenu .submenuitem {
   display: block;
   padding: 2px;
-  border-bottom: 1px dashed ;
+  border-bottom: 1px dashed;
   margin-bottom: -1px;
 }
 
@@ -608,26 +682,30 @@ text-decoration:none;
   display: block;
   font-size: 1px;
   line-height: 1px;
-  border-top: 1px solid ;
+  border-top: 1px solid;
 }
 
-.submenu.hidden{
+.submenu.hidden {
   display: none;
 }
-.submenuitem a, .submenuitem a:link, .submenuitem a:visited, .submenuitem a:active  {
-display:block;
-width: auto;
-font-size:0.8em;
-font-weight: bold;
-text-decoration:none;
-height:auto;
-padding:1px 3px;
-line-height:1.5em;
+
+.submenuitem a,
+.submenuitem a:link,
+.submenuitem a:visited,
+.submenuitem a:active {
+  display: block;
+  width: auto;
+  font-size: 0.8em;
+  font-weight: bold;
+  text-decoration: none;
+  height: auto;
+  padding: 1px 3px;
+  line-height: 1.5em;
 
 }
 
 .menuarrow {
-  display:none;
+  display: none;
 }
 
 /*
@@ -635,7 +713,8 @@ line-height:1.5em;
 Editors
 ---------------------------------------
 */
-#xwikieditorstitles, #xwikiviewerstitles{
+#xwikieditorstitles,
+#xwikiviewerstitles {
   display: none;
 }
 
@@ -644,11 +723,12 @@ Editors
 Tabs
 ---------------------------------------
 */
-ul.xwikitabbar{
+ul.xwikitabbar {
   padding: 4px 0px;
   margin: 0px;
 }
-.xwikitabbar li{
+
+.xwikitabbar li {
   display: inline;
   padding: 5px 0px;
   list-style-type: none;
@@ -657,30 +737,34 @@ ul.xwikitabbar{
   margin-right: 2px;
   margin-top: 2px;
 }
-html > body .xwikitabbar li{
+
+html>body .xwikitabbar li {
   padding: 5px 0px;
 }
-.xwikitabbar li a{
+
+.xwikitabbar li a {
   padding: 5px 15px;
   font-weight: bold;
   text-decoration: none;
 }
-.xwikitabbar li a:hover{
+
+.xwikitabbar li a:hover {
   text-decoration: none;
 }
 
-.xwikitabbar li.active{
+.xwikitabbar li.active {
   border: 1px solid;
   border-bottom: 3px solid;
 }
 
-.xwikitabbar li.active a:hover{
+.xwikitabbar li.active a:hover {
   cursor: default;
 }
+
 /*
 --
 */
-#xwikicontentedit{
+#xwikicontentedit {
   border: 1px solid;
 }
 
@@ -695,47 +779,56 @@ Panels
   margin: 0px;
   padding: 0px 0px 30px;
 }
-.globalsearch input{
+
+.globalsearch input {
   font-size: 0.7em;
   border: 1px solid;
   display: inline !important;
 }
-.globalsearch input.button{
+
+.globalsearch input.button {
   vertical-align: middle;
   font-size: 1em;
   border: 0px;
   padding: 0px;
 }
 
-#rightPanels, #leftPanels {
+#rightPanels,
+#leftPanels {
   position: relative;
   float: left;
   width: 200px;
   padding-top: 0px;
 }
-#rightPanels{
+
+#rightPanels {
   margin-right: -200px;
 }
+
 #leftPanels {
   margin-left: -200px;
 }
 
-.panels{
-}
-html > body .panels{
+.panels {}
+
+html>body .panels {
   margin-top: 0px;
 }
+
 .panels.left {
   float: left;
   clear: none;
   margin-left: 0px;
 }
+
 .panels.right {
   float: right;
   clear: right;
   margin-right: 0px;
 }
-.panel, .fakepanel{
+
+.panel,
+.fakepanel {
   color: #DDD;
   width: 200px;
   display: block;
@@ -743,62 +836,75 @@ html > body .panels{
   padding: 0px;
   border: 0px solid;
 }
-.placeholder{
+
+.placeholder {
   width: 200px;
 }
-html > body #dragbox {
+
+html>body #dragbox {
   width: 198px !important;
 }
-#xwikinavcontainer{
+
+#xwikinavcontainer {
   margin-bottom: 20px;
 }
-.fakepanel{
+
+.fakepanel {
   display: none;
   height: 320px;
 }
 
-#editPanels.panels{
+#editPanels.panels {
   width: 310px;
   float: left;
   position: relative;
   margin-right: -310px;
 }
-#editPanels .panel{
+
+#editPanels .panel {
   width: 310px;
 }
-.collapsed .xwikipanelcontents{
+
+.collapsed .xwikipanelcontents {
   display: none;
 }
-span.panelitem{
+
+span.panelitem {
   display: block;
 }
-span.pitemseparator{
+
+span.pitemseparator {
   display: none;
 }
-.panelcontainer{
+
+.panelcontainer {
   height: 200px;
   overflow: hidden;
   border: 1px inset #444;
   padding: 3px;
 }
-.panelitemc{
+
+.panelitemc {
   height: 256px;
   margin: 0px 4px;
   width: 210px;
   float: left;
 }
-.panelitemc .label, .panelitemc .xwikibuttonlink{
+
+.panelitemc .label,
+.panelitemc .xwikibuttonlink {
   text-align: center;
 }
+
 /*
 ----------------------------------
 Scriptaculous Acordeon
 ----------------------------------
 */
 #xwikisyntaxhelp {
-  margin-top:6px;
-  border-top-width:1px;
-  border-top-style:solid;
+  margin-top: 6px;
+  border-top-width: 1px;
+  border-top-style: solid;
   border: none;
 }
 
@@ -807,29 +913,37 @@ Scriptaculous Acordeon
 }
 
 /* Note that h6 styling is provided in order to ensure backward compatibility after XSALBATROSS-71 */
-.accordionTabTitleBar h1, .accordionTabTitleBar h6 {
+.accordionTabTitleBar h1,
+.accordionTabTitleBar h6 {
   margin: 0px;
   padding: 0px 4px;
 }
 
-#editPanels .accordionTabContentBox{
+#editPanels .accordionTabContentBox {
   border: none;
   overflow: auto !important;
 }
 
-#editPanels .accordionTabContentBox table{
+#editPanels .accordionTabContentBox table {
   border: none;
 }
-.accordionTabContentBox table th{
+
+.accordionTabContentBox table th {
   border-bottom: 1px solid #DDD;
   text-align: center;
 }
-#xwikihelptitlesContent h1, #xwikihelptitlesContent h2, #xwikihelptitlesContent h3, #xwikihelptitlesContent h4, #xwikihelptitlesContent h5, #xwikihelptitlesContent h6{
+
+#xwikihelptitlesContent h1,
+#xwikihelptitlesContent h2,
+#xwikihelptitlesContent h3,
+#xwikihelptitlesContent h4,
+#xwikihelptitlesContent h5,
+#xwikihelptitlesContent h6 {
   margin: 0px;
   text-align: right;
 }
 
-.accordionTabTitleBar{
+.accordionTabTitleBar {
   border: 1px solid #FFF;
   cursor: default;
 }
@@ -840,65 +954,76 @@ Scriptaculous Acordeon
 Misc
 -----------------------------
 */
-#xwikihelplistsContent ul, #xwikihelplistsContent ol{
+#xwikihelplistsContent ul,
+#xwikihelplistsContent ol {
   margin: 0px;
 }
-#contentcolumn .panel.large{
+
+#contentcolumn .panel.large {
   width: 290px;
 }
-.accordionTabTitleBar tt{
+
+.accordionTabTitleBar tt {
   font-style: normal;
   font-size: 150%;
   font-weight: 100;
   padding: 0px 4px;
 }
+
 /*.accordionTabContentBox div{
   padding: 0px;
 }*/
-td.label{
+td.label {
   text-align: right;
   padding-right: 4px;
 }
-#xwikiclassproperties, #xwikiobjects{
+
+#xwikiclassproperties,
+#xwikiobjects {
   border: 1px solid #DDD !important;
   overflow: hidden;
 }
-.center{
+
+.center {
   text-align: center;
 }
 
-.padded{
+.padded {
   padding: 8px;
 }
 
-#xwikihelpsyntax{
+#xwikihelpsyntax {
   border-top: 1px solid #DDD;
   padding: 2px 6px;
   margin: -2px 1px 0px;
 }
 
-.editactions{
+.editactions {
   border: none !important;
   margin-top: 10px;
   padding: 0px;
 }
-#historycontent td{
+
+#historycontent td {
   padding: 2px;
 }
-#xwikiuserprofile th{
+
+#xwikiuserprofile th {
   background-color: transparent;
   text-align: right;
 }
-#xwikiuserprofile td, #xwikiuserprofile th{
+
+#xwikiuserprofile td,
+#xwikiuserprofile th {
   padding: 4px;
 }
 
-#xwikiobjects td{
+#xwikiobjects td {
   vertical-align: top;
 }
 
 
-html > body .xwikidatatable{
+html>body .xwikidatatable {
   width: 100%;
 }
 
@@ -908,35 +1033,37 @@ html > body .xwikidatatable{
   border: 2px solid;
 }
 
-.edit_section{
+.edit_section {
   visibility: hidden;
   display: block;
   overflow: hidden;
   height: 24px;
   width: 24px;
-/*  position: relative;
+  /*  position: relative;
   top: -4em;
 */
 }
-.edit_section a{
+
+.edit_section a {
   visibility: visible;
   position: relative;
   top: -1.2em;
   background: transparent url("icons/black-edit.png") left bottom no-repeat;
   padding: 0px 10px 20px;
 }
+
 /*
 ------------------------
 Page Layout Selection
 ------------------------
 */
 
-td div.pagelayoutoption{
+td div.pagelayoutoption {
   margin: 0px auto;
   width: 106px;
 }
 
-div.layoutmaquette{
+div.layoutmaquette {
   width: 100px;
   height: 100px;
   border: 1px solid #ddd;
@@ -944,7 +1071,8 @@ div.layoutmaquette{
   padding: 2px;
 }
 
-div.lmleftcolumn, div.lmrightcolumn{
+div.lmleftcolumn,
+div.lmrightcolumn {
   width: 20px;
   height: 60px;
   border: 1px solid #aaa;
@@ -952,80 +1080,80 @@ div.lmleftcolumn, div.lmrightcolumn{
   float: left;
 }
 
-div.lmrightcolumn{
+div.lmrightcolumn {
   float: right;
 }
 
-div.lmcontentcolumn{
+div.lmcontentcolumn {
   border: 1px solid #aaa;
   background-color: #eee;
   height: 90px;
 }
 
-#leftcolumn div.lmcontentcolumn{
+#leftcolumn div.lmcontentcolumn {
   margin-left: 24px;
 }
 
 
-#rightcolumn div.lmcontentcolumn{
+#rightcolumn div.lmcontentcolumn {
   margin-right: 24px;
 }
 
 
-#bothcolumns div.lmcontentcolumn{
+#bothcolumns div.lmcontentcolumn {
   margin-left: 24px;
   margin-right: 24px;
 }
 
-div.pagelayoutoption:hover .layoutmaquette{
+div.pagelayoutoption:hover .layoutmaquette {
   background-color: #ffd;
 }
 
-div.pagelayoutoption:hover .lmcontentcolumn{
+div.pagelayoutoption:hover .lmcontentcolumn {
   background-color: #ddd;
 }
 
 div.pagelayoutoption:hover .lmleftcolumn,
-div.pagelayoutoption:hover .lmrightcolumn{
+div.pagelayoutoption:hover .lmrightcolumn {
   background-color: #acf;
 }
 
-div.pagelayoutoptions > table{
+div.pagelayoutoptions>table {
   width: 100%;
   text-align: center;
 }
 
-div.pagelayoutoptions td{
+div.pagelayoutoptions td {
   padding: 2px;
   vertical-align: bottom;
 }
 
-#selectedoption{
-}
+#selectedoption {}
 
-#selectedoption .lmcontentcolumn{
+#selectedoption .lmcontentcolumn {
   background-color: #acf;
 }
 
 #selectedoption .lmleftcolumn,
-#selectedoption .lmrightcolumn{
+#selectedoption .lmrightcolumn {
   background-color: #369;
 }
 
-.pagelayoutoption label{
+.pagelayoutoption label {
   color: #aaa;
 }
 
-#selectedoption label, .pagelayoutoption:hover label{
+#selectedoption label,
+.pagelayoutoption:hover label {
   color: #000;
 }
 
-.hastooltip{
+.hastooltip {
   border-bottom: 1px dotted #000;
   cursor: help;
 }
 
-#dhtmltooltip{
+#dhtmltooltip {
   border: 1px solid #aaa;
   padding: 2px 4px;
   background-color: #ffd;
@@ -1033,61 +1161,66 @@ div.pagelayoutoptions td{
   position: absolute;
 }
 
-#panelwizardbuttons{
+#panelwizardbuttons {
   padding: 8px 5px 0px;
   margin: 8px -5px 0px;
   border-top: 1px solid #ddd;
   text-align: left;
 }
 
-.alleditcontent{
+.alleditcontent {
   position: relative;
   width: auto;
   margin: 20px 20px 0px 20px;
 }
 
-.floatcontainer{
+.floatcontainer {
   overflow: hidden;
 }
 
-#xwikieditcontent, .xwikitabpanescontainer {
+#xwikieditcontent,
+.xwikitabpanescontainer {
   border: 2px solid #3381CC;
   padding: 3px 8px 3px 3px;
   overflow: auto;
 }
 
-#xwikieditcontent div{
+#xwikieditcontent div {
   overflow: hidden;
 }
 
-* html #xwikieditcontent{
+* html #xwikieditcontent {
   padding: 0px 3px 3px 3px;
 }
 
-.editinfo{
+.editinfo {
   height: 2em;
   font-weight: bold;
   font-size: 1em;
   line-height: 2em;
 }
-#edit{
+
+#edit {
   padding: 0px;
   margin: 0px;
   border: none;
 }
-#xwikitext{
+
+#xwikitext {
   clear: both;
 }
-#panelsBackground{
+
+#panelsBackground {
   height: 20px;
   background-color: #384554;
 }
 
-#xwikidoctitleinput{
+#xwikidoctitleinput {
   width: 100%;
   font-size: 150%;
 }
-* html form{
+
+* html form {
   margin-top: 0px;
 }
 
@@ -1096,6 +1229,7 @@ div.pagelayoutoptions td{
   display: inline;
   margin-right: 2px;
 }
+
 .xwiki-form-listclass {
   margin-right: 10px;
 }
@@ -1114,28 +1248,34 @@ div.attachment {
   border-left: 1px solid #eee;
   font-size: 85%;
 }
+
 .attachment .mime {
   display: block;
   float: left;
   padding-right: 8px;
   padding-bottom: 4px;
 }
+
 .attachment .information {
   position: relative;
   overflow: hidden;
 }
+
 .attachment .name {
   display: block;
   float: left;
   font-size: 170%;
   padding: 0px 6px 4px 0px;
 }
+
 .attachment .version {
   display: block;
 }
+
 .attachment .meta {
   clear: left;
 }
+
 .attachment .xwikibuttonlinks {
   float: right;
   font-size: 130%;
@@ -1143,11 +1283,11 @@ div.attachment {
 }
 
 .mceEditorContainer {
-	display: block;
-	height: 100% !important;
-	position: relative;
+  display: block;
+  height: 100% !important;
+  position: relative;
 }
 
 .mceToolbar {
-	z-index: 30002;
-}
\ No newline at end of file
+  z-index: 30002;
+}
diff --git a/src/main/webapp/skins/albatross/style.css b/src/main/webapp/skins/albatross/style.css
index 14dc43f34..57fbc9752 100644
--- a/src/main/webapp/skins/albatross/style.css
+++ b/src/main/webapp/skins/albatross/style.css
@@ -1,29 +1,6 @@
-@import "elements.css";
-
-@import "classes.css";
-
-/* @import "js/xwiki/chartwizard/chwSkin.css";*/
-@import "xwiki.css";
-
-@import "wiki.css";
-
-@import "page.css";
-
-@import "rss.css";
-
-@import "screenlayout.css?ver=20230902";
-
-@import "microformats.css";
-
-@import "presentation.css";
-
-@import "colorsblack.css";
-
-/*@import "ie.css"; */
-
 /* Empty lines between block elements. Generated by the new rendering */
 .wikimodel-emptyline {
-    height:1em;
+	height: 1em;
 }
 
 .rightmenu a {
@@ -55,7 +32,8 @@
 }
 
 /* Note that h6 styling is provided in order to ensure backward compatibility after XSALBATROSS-71 */
-.panel .accordionTabTitleBar h1, .panel .accordionTabTitleBar h6 {
+.panel .accordionTabTitleBar h1,
+.panel .accordionTabTitleBar h6 {
 	border-top: 1px solid #999;
 }
 
@@ -88,7 +66,8 @@ li.selected {
 
 
 /* Note that h6 styling is provided in order to ensure backward compatibility after XSALBATROSS-71 */
-#xwikieditcontent .accordionTabTitleBar h1, #xwikieditcontent .accordionTabTitleBar h6 {
+#xwikieditcontent .accordionTabTitleBar h1,
+#xwikieditcontent .accordionTabTitleBar h6 {
 	width: 100%;
 }
 
@@ -112,8 +91,11 @@ div.panellayoutcontainer-5col .panellayoutcol {
 	width: 20%;
 }
 
-div.panellayoutcontainer-1col,div.panellayoutcontainer-2col,div.panellayoutcontainer-3col,div.panellayoutcontainer-4col,div.panellayoutcontainer-5col
-	{
+div.panellayoutcontainer-1col,
+div.panellayoutcontainer-2col,
+div.panellayoutcontainer-3col,
+div.panellayoutcontainer-4col,
+div.panellayoutcontainer-5col {
 	overflow: auto;
 	clear: left;
 	height: 1%;
@@ -154,20 +136,18 @@ div.panellayoutcontainer-1col,div.panellayoutcontainer-2col,div.panellayoutconta
 	color: #fff;
 	border-bottom: 1px solid #ddd;
 	background-image:
-		url("icons/black-less-cont.png")
-		;
+		url("icons/black-less-cont.png");
 }
 
 #xwikicontent .panellayoutcol .collapsed .xwikipaneltitle {
 	background-color: #CDE;
 	color: #fff;
 	background-image:
-		url("icons/black-more-cont.png")
-		;
+		url("icons/black-more-cont.png");
 }
 
-#xwikicontent .panellayoutcol .expanded h1.xwikipaneltitle:hover,#xwikicontent .panellayoutcol .collapsed h1.xwikipaneltitle:hover
-	{
+#xwikicontent .panellayoutcol .expanded h1.xwikipaneltitle:hover,
+#xwikicontent .panellayoutcol .collapsed h1.xwikipaneltitle:hover {
 	color: #fff;
 }
 
@@ -177,45 +157,46 @@ div.panellayoutcontainer-1col,div.panellayoutcontainer-2col,div.panellayoutconta
 */
 
 #docExtraTabs {
-  border: 0px !important;
-  background-color: white;
+	border: 0px !important;
+	background-color: white;
 }
 
 #docExtrasTabsUl {
-  float: left;
+	float: left;
 }
 
 #docExtraTabs ul.xwikitabbar {
-  width: auto;
-  padding: 0;
+	width: auto;
+	padding: 0;
 }
 
 #docextrapanes {
-  border : solid 1px #3280CC;
-  background-color: #E4F6FF;
-  padding: 10px;
-  clear: both;
+	border: solid 1px #3280CC;
+	background-color: #E4F6FF;
+	padding: 10px;
+	clear: both;
 }
 
 #docextraanchors {
-  height: 2em;
+	height: 2em;
 }
 
-#_information dd, #_information dt {
-  padding-top: 4px;
-  padding-bottom: 4px;
-  clear: both;
+#_information dd,
+#_information dt {
+	padding-top: 4px;
+	padding-bottom: 4px;
+	clear: both;
 }
 
 #_information #tags {
-  width: 400px;
-  font-size: 110%;
-  float:left;
+	width: 400px;
+	font-size: 110%;
+	float: left;
 }
 
 #tageditsavewrapper {
-  display:inline;
-  margin:0 0 10px 10px;
+	display: inline;
+	margin: 0 0 10px 10px;
 }
 
 #tageditsavesuccess {
@@ -233,50 +214,52 @@ div.panellayoutcontainer-1col,div.panellayoutcontainer-2col,div.panellayoutconta
 */
 
 ul.xlist {
-  margin: 0 0 0 0.5em !important;
-  padding: 0 !important;
+	margin: 0 0 0 0.5em !important;
+	padding: 0 !important;
 }
 
 ul.xlist li.xunderline {
-  border-bottom: solid 1px #efefef !important;
+	border-bottom: solid 1px #efefef !important;
 }
 
 ul.xlist li.xhighlight:hover {
-  background-color: lemonChiffon;
+	background-color: lemonChiffon;
 }
 
 ul.xlist li {
-  width: 100% !important;
-  padding-top: 0.2em;
-  list-style-type: none;
+	width: 100% !important;
+	padding-top: 0.2em;
+	list-style-type: none;
 }
 
-ul.xlist li.space, ul.xlist li.page, ul.xlist li.comment, ul.xlist li.attachment {
-  background-repeat: no-repeat;
-  background-position: 2px 3px;
+ul.xlist li.space,
+ul.xlist li.page,
+ul.xlist li.comment,
+ul.xlist li.attachment {
+	background-repeat: no-repeat;
+	background-position: 2px 3px;
 }
 
 ul.xlist li.space {
-  background-image: url( ../../resources/icons/silk/folder.gif );
+	background-image: url(../../resources/icons/silk/folder.gif );
 }
 
 ul.xlist li.page {
-  background-image: url( ../../resources/icons/silk/page_white_text.gif );
+	background-image: url(../../resources/icons/silk/page_white_text.gif );
 }
 
 ul.xlist li.comment {
-  background-image: url( ../../resources/icons/silk/comment.gif );
+	background-image: url(../../resources/icons/silk/comment.gif );
 }
 
 ul.xlist li.attachment {
-  background-image: url( ../../resources/icons/silk/attach.gif );
+	background-image: url(../../resources/icons/silk/attach.gif );
 }
 
 ul.xlist li.xitem div.xitemcontainer {
-  text-indent: 1.5em;
+	text-indent: 1.5em;
 }
 
 ul.xlist li.xitem div.xitemcontainer ul.xlist {
-  text-indent: 0em;
+	text-indent: 0em;
 }
-
diff --git a/src/main/webapp/skins/albatross/wiki.css b/src/main/webapp/skins/albatross/wiki.css
index 19a46bb8d..cd9ae4731 100644
--- a/src/main/webapp/skins/albatross/wiki.css
+++ b/src/main/webapp/skins/albatross/wiki.css
@@ -401,7 +401,7 @@ span.wikicreatelink a {
 /* Used to signify a rendering error in the rendered page. Valid only with new rendering */
 .xwikirenderingerror {
   background-color: #eee; 
-  background-image: url($xwiki.getSkinFile("icons/silk/exclamation.gif", true));
+  background-image: url(/skin/resources/icons/silk/exclamation.gif);
   background-position: 2px 50%;
   background-repeat: no-repeat;
   color: #e14726;
diff --git a/src/main/webapp/templates/celMacros/CelMessages.vm b/src/main/webapp/templates/celMacros/CelMessages.vm
index f599d86cc..c5df5d184 100644
--- a/src/main/webapp/templates/celMacros/CelMessages.vm
+++ b/src/main/webapp/templates/celMacros/CelMessages.vm
@@ -2,6 +2,8 @@ $jsonBuilder.openProperty('celmeta')
 $jsonBuilder.openDictionary()
 $jsonBuilder.addStringProperty('language', "$language")
 $jsonBuilder.addStringProperty('admin-language', "$admin_language")
+$jsonBuilder.addStringProperty('contextPath', "${request.contextPath}")
+$jsonBuilder.addStringProperty('database', "${context.database}")
 $jsonBuilder.openProperty('isAdmin')
 $jsonBuilder.addBoolean($isAdmin)
 $jsonBuilder.openProperty('isSuperAdmin')
@@ -102,3 +104,113 @@ $jsonBuilder.openProperty('celmenu')
 $jsonBuilder.openDictionary()
 $jsonBuilder.addStringProperty('supportLinkURL', "$!services.celementsweb.getSupportLinkURL()")
 $jsonBuilder.closeDictionary()
+
+## actionButtons.js
+$jsonBuilder.openProperty('actionButtons')
+$jsonBuilder.openDictionary()
+$jsonBuilder.addStringProperty('cancel', "$!adminMsg.get('core.shortcuts.edit.cancel')")
+$jsonBuilder.addStringProperty('preview', "$!adminMsg.get('core.shortcuts.edit.preview')")
+$jsonBuilder.addStringProperty('backtoedit', "$!adminMsg.get('core.shortcuts.edit.backtoedit')")
+$jsonBuilder.addStringProperty('saveandview', "$!adminMsg.get('core.shortcuts.edit.saveandview')")
+$jsonBuilder.addStringProperty('saveandcontinue', "$!adminMsg.get('core.shortcuts.edit.saveandcontinue')")
+$jsonBuilder.addStringProperty('mandatoryField', "$!adminMsg.get('core.editors.validation.mandatoryField')")
+$jsonBuilder.addStringProperty('commentPrompt', "$!adminMsg.get('core.comment.prompt')")
+$jsonBuilder.closeDictionary()
+## attachments.js
+$jsonBuilder.openProperty('attachments')
+$jsonBuilder.openDictionary()
+$jsonBuilder.addStringProperty('deleteConfirm', "$!adminMsg.get('core.viewers.attachments.delete.confirm')")
+$jsonBuilder.addStringProperty('deleteInProgress', "$!adminMsg.get('core.viewers.attachments.delete.inProgress')")
+$jsonBuilder.addStringProperty('deleteDone', "$!adminMsg.get('core.viewers.attachments.delete.done')")
+$jsonBuilder.addStringProperty('deleteFailed', "$!adminMsg.get('core.viewers.attachments.delete.failed')")
+$jsonBuilder.addStringProperty('addFileInput', "$!adminMsg.get('core.viewers.attachments.upload.addFileInput')")
+$jsonBuilder.addStringProperty('removeFileInput', "$!adminMsg.get('core.viewers.attachments.upload.removeFileInput')")
+$jsonBuilder.addStringProperty('removeFileInputTitle', "$!adminMsg.get('core.viewers.attachments.upload.removeFileInput.title')")
+$jsonBuilder.addStringProperty('extranb', "$!adminMsg.get('docextra.extranb', ['__number__'])")
+$jsonBuilder.closeDictionary()
+## code.js
+$jsonBuilder.openProperty('code')
+$jsonBuilder.openDictionary()
+$jsonBuilder.addStringProperty('showLineNumbers', "$!adminMsg.get('core.viewers.code.showLineNumbers')")
+$jsonBuilder.addStringProperty('hideLineNumbers', "$!adminMsg.get('core.viewers.code.hideLineNumbers')")
+$jsonBuilder.closeDictionary()
+## comments.js
+$jsonBuilder.openProperty('comments')
+$jsonBuilder.openDictionary()
+$jsonBuilder.addStringProperty('commentDeleted', "$!adminMsg.get('core.viewers.comments.commentDeleted')")
+$jsonBuilder.addStringProperty('deleteConfirm', "$!adminMsg.get('core.viewers.comments.delete.confirm')")
+$jsonBuilder.addStringProperty('deleteInProgress', "$!adminMsg.get('core.viewers.comments.delete.inProgress')")
+$jsonBuilder.addStringProperty('deleteDone', "$!adminMsg.get('core.viewers.comments.delete.done')")
+$jsonBuilder.addStringProperty('deleteFailed', "$!adminMsg.get('core.viewers.comments.delete.failed')")
+$jsonBuilder.addStringProperty('editFormFetchInProgress', "$!adminMsg.get('core.viewers.comments.editForm.fetch.inProgress')")
+$jsonBuilder.addStringProperty('editFormFetchFailed', "$!adminMsg.get('core.viewers.comments.editForm.fetch.failed')")
+$jsonBuilder.addStringProperty('addInProgress', "$!adminMsg.get('core.viewers.comments.add.inProgress')")
+$jsonBuilder.addStringProperty('addDone', "$!adminMsg.get('core.viewers.comments.add.done')")
+$jsonBuilder.addStringProperty('addFailed', "$!adminMsg.get('core.viewers.comments.add.failed')")
+$jsonBuilder.addStringProperty('previewButtonPreview', "$!adminMsg.get('core.viewers.comments.preview.button.preview')")
+$jsonBuilder.addStringProperty('previewInProgress', "$!adminMsg.get('core.viewers.comments.preview.inProgress')")
+$jsonBuilder.addStringProperty('previewFailed', "$!adminMsg.get('core.viewers.comments.preview.failed')")
+$jsonBuilder.addStringProperty('previewButtonBack', "$!adminMsg.get('core.viewers.comments.preview.button.back')")
+$jsonBuilder.addStringProperty('extranb', "$!adminMsg.get('docextra.extranb', ['__number__'])")
+$jsonBuilder.closeDictionary()
+## confirmationBox.js
+$jsonBuilder.openProperty('confirmationBox')
+$jsonBuilder.openDictionary()
+$jsonBuilder.addStringProperty('defaultQuestion', "$!adminMsg.get('core.widgets.confirmationBox.defaultQuestion')")
+$jsonBuilder.addStringProperty('yes', "$!adminMsg.get('core.widgets.confirmationBox.button.yes')")
+$jsonBuilder.addStringProperty('no', "$!adminMsg.get('core.widgets.confirmationBox.button.no')")
+$jsonBuilder.closeDictionary()
+## confirmedAjaxRequest.js
+$jsonBuilder.openProperty('confirmedAjaxRequest')
+$jsonBuilder.openDictionary()
+$jsonBuilder.addStringProperty('notificationInProgress', "$!adminMsg.get('core.widgets.confirmationBox.notification.inProgress')")
+$jsonBuilder.addStringProperty('notificationDone', "$!adminMsg.get('core.widgets.confirmationBox.notification.done')")
+$jsonBuilder.addStringProperty('notificationFailed', "$!adminMsg.get('core.widgets.confirmationBox.notification.failed')")
+$jsonBuilder.closeDictionary()
+## dataeditors.js
+$jsonBuilder.openProperty('dataeditors')
+$jsonBuilder.openDictionary()
+$jsonBuilder.addStringProperty('confirmationText', "$!adminMsg.get('core.editors.object.delete.confirm')")
+$jsonBuilder.addStringProperty('progressMessageText', "$!adminMsg.get('core.editors.object.delete.inProgress')")
+$jsonBuilder.addStringProperty('successMessageText', "$!adminMsg.get('core.editors.object.delete.done')")
+$jsonBuilder.addStringProperty('failureMessageText', "$!adminMsg.get('core.editors.object.delete.failed')")
+$jsonBuilder.closeDictionary()
+## livetable.js
+$jsonBuilder.openProperty('livetable')
+$jsonBuilder.openDictionary()
+$jsonBuilder.addStringProperty('resultsOf', "$!adminMsg.get('xe.pagination.results.of')")
+$jsonBuilder.addStringProperty('results', "$!adminMsg.get('xe.pagination.results')")
+$jsonBuilder.closeDictionary()
+## usersandgroups.js
+$jsonBuilder.openProperty('usersandgroups')
+$jsonBuilder.openDictionary()
+$jsonBuilder.addStringProperty('denyrightforcurrentuser', "$!adminMsg.get('rightsmanager.denyrightforcurrentuser')")
+$jsonBuilder.addStringProperty('clearrightforcurrentuserinstead', "$!adminMsg.get('rightsmanager.clearrightforcurrentuserinstead')")
+$jsonBuilder.addStringProperty('clearrightforcurrentuser', "$!adminMsg.get('rightsmanager.clearrightforcurrentuser')")
+$jsonBuilder.addStringProperty('denyrightforgroup', "$!adminMsg.get('rightsmanager.denyrightforgroup')")
+$jsonBuilder.addStringProperty('clearrightforgroupinstead', "$!adminMsg.get('rightsmanager.clearrightforgroupinstead')")
+$jsonBuilder.addStringProperty('clearrightforgroup', "$!adminMsg.get('rightsmanager.clearrightforgroup')")
+$jsonBuilder.addStringProperty('denyrightforuorg', "$!adminMsg.get('rightsmanager.denyrightforuorg')")
+$jsonBuilder.addStringProperty('clearrightforuorg', "$!adminMsg.get('rightsmanager.clearrightforuorg')")
+$jsonBuilder.addStringProperty('saveFailure', "$!adminMsg.get('platform.core.rightsManagement.saveFailure')")
+$jsonBuilder.addStringProperty('ajaxFailure', "$!adminMsg.get('platform.core.rightsManagement.ajaxFailure')")
+$jsonBuilder.addStringProperty('edit', "$!adminMsg.get('edit')")
+$jsonBuilder.addStringProperty('delete', "$!adminMsg.get('delete')")
+$jsonBuilder.addStringProperty('confirmdeleteuser', "$!adminMsg.get('rightsmanager.confirmdeleteuser')")
+$jsonBuilder.addStringProperty('confirmdeletegroup', "$!adminMsg.get('rightsmanager.confirmdeletegroup')")
+$jsonBuilder.addStringProperty('confirmdeletemember', "$!adminMsg.get('rightsmanager.confirmdeletemember')")
+$jsonBuilder.closeDictionary()
+## xwiki.js
+$jsonBuilder.openProperty('xwiki')
+$jsonBuilder.openDictionary()
+$jsonBuilder.addStringProperty('readTechnicalInformation', "$!adminMsg.get('platform.core.rendering.error.readTechnicalInformation')")
+$jsonBuilder.addStringProperty('edit', "$!adminMsg.get('edit')")
+$jsonBuilder.addStringProperty('createAjaxError', "$!adminMsg.get('core.create.ajax.error')")
+$jsonBuilder.closeDictionary()
+## xwikiexplorer.js
+$jsonBuilder.openProperty('xwikiexplorer')
+$jsonBuilder.openDictionary()
+$jsonBuilder.addStringProperty('attachmentsTitle', "$!adminMsg.get('xwikiexplorer.attachments.title')")
+$jsonBuilder.addStringProperty('addPageTitle', "$!adminMsg.get('xwikiexplorer.addpage.title')")
+$jsonBuilder.addStringProperty('addAttachmentTitle', "$!adminMsg.get('xwikiexplorer.addattachment.title')")
+$jsonBuilder.closeDictionary()
diff --git a/src/main/webapp/templates/celTemplates/ObjectEdit.vm b/src/main/webapp/templates/celTemplates/ObjectEdit.vm
index afe78bc5d..614a3d8a9 100644
--- a/src/main/webapp/templates/celTemplates/ObjectEdit.vm
+++ b/src/main/webapp/templates/celTemplates/ObjectEdit.vm
@@ -181,16 +181,16 @@
 #else
   #set($properties = $class.properties)
 #end
+#set($jsService = $services.javascript)
+#set($extJsParam = $jsService.createExtJSParam().setAction('file'))
 #foreach($prop in $properties)
 #set($classRef = $services.model.resolveDocument($class.getName()))
 #if($services.editorsupport.getSuggestBaseClass($classRef, "$!prop.getName()").isPicker())
-$services.javascript.addExtJSfileOnce(':celJS/prototype.js')
-$services.javascript.addExtJSfileOnce(':js/xwiki/xwiki.js', 'file')
-$services.javascript.addExtJSfileOnce(':uicomponents/widgets/list/xlist.js', 'file')
-<-- ajaxSuggest loaded ?? -->
-$services.javascript.addExtJSfileOnce(':js/xwiki/suggest/ajaxSuggest.js', 'file')
-$services.javascript.addExtJSfileOnce(':js/scriptaculous/effects.js', 'file')
-$services.javascript.addExtJSfileOnce(':celJS/addSuggest.js', 'file')
+$!jsService.includeExtJsFile($extJsParam.setJsFile(':celJS/prototype.js'))##
+$!jsService.includeExtJsFile($extJsParam.setJsFile(':celJS/initCelements.min.js'))##
+$!jsService.includeExtJsFile($extJsParam.setJsFile(':js/xwiki/xwiki.js', 'file'))##
+$!jsService.includeExtJsFile($extJsParam.setJsFile(':uicomponents/widgets/list/xlist.js', 'file'))##
+$!jsService.includeExtJsFile($extJsParam.setJsFile(':js/scriptaculous/effects.js', 'file'))##
 #end
 #if($cel_embedded_editobj)
 #set($cel_editobj_validationClass = '')
diff --git a/src/main/webapp/templates/code.vm b/src/main/webapp/templates/code.vm
index 5ca072ae2..b90a601b3 100644
--- a/src/main/webapp/templates/code.vm
+++ b/src/main/webapp/templates/code.vm
@@ -6,8 +6,6 @@
 #set($extJsParam = $jsService.createExtJSParam().setAction('file'))
 #set($extJsParam = $extJsParam.setLazyLoad(true))
 $!jsService.includeExtJsFile($extJsParam.setJsFile(':uicomponents/viewers/code.js'))##
-$!jsService.includeExtJsFile($extJsParam.setJsFile(':uicomponents/widgets/fullScreen.js'))##
- 
 

$msg.get('core.viewers.code.title', [$escapetool.xml($doc.getPlainTitle()), $doc.getURL()])

## ---------------------------- ## Display the shortcuts diff --git a/src/main/webapp/templates/createinline.vm b/src/main/webapp/templates/createinline.vm index b239ae40f..1d245a418 100644 --- a/src/main/webapp/templates/createinline.vm +++ b/src/main/webapp/templates/createinline.vm @@ -1,3 +1,5 @@ +#set($jsService = $services.javascript) +#set($extJsParam = $jsService.createExtJSParam().setAction('file')) ## --------------------------------------------------------------------------------------------------------- ## Since this template can be used for creating a Page or a Space, check the passed "tocreate" parameter ## which can be either "page" or "space". If no "tocreate" parameter is passed then we default to creating a Page. @@ -127,8 +129,8 @@ ## --------------------------------------------------------------------------------------------------------- ## Output JavaScript validation code ## --------------------------------------------------------------------------------------------------------- -$xwiki.get('jsfx').use('uicomponents/widgets/validation/livevalidation_prototype.js')## -$xwiki.get('ssfx').use('uicomponents/widgets/validation/livevalidation.css')## +$!jsService.includeExtJsFile($extJsParam.setJsFile(':uicomponents/widgets/validation/livevalidation_prototype.js'))## +$services.css.includeCSSPage(':uicomponents/widgets/validation/livevalidation.css')## - **# $!jsService.includeExtJsFile($extJsParam.setJsFile(':js/xwiki/widgets/modalPopup.js'))## - $!jsService.includeExtJsFile($extJsParam.setJsFile(':js/xwiki/widgets/jumpToPage.js'))## $!jsService.includeExtJsFile($extJsParam.setJsFile(':uicomponents/widgets/confirmationBox.js'))## $!jsService.includeExtJsFile($extJsParam.setJsFile(':uicomponents/widgets/confirmedAjaxRequest.js'))## $!jsService.includeExtJsFile($extJsParam.setJsFile(':uicomponents/widgets/notification.js'))## diff --git a/src/main/webapp/templates/javascript.vm b/src/main/webapp/templates/javascript.vm index 081efad45..685e57b90 100644 --- a/src/main/webapp/templates/javascript.vm +++ b/src/main/webapp/templates/javascript.vm @@ -1,7 +1,6 @@ ## ## CSS files related to JS libraries. ## - ## ## JS Libraries. @@ -11,19 +10,25 @@ $!jsService.includeExtJsFile($extJsParam.setJsFile(':celJS/prototype.js'))## $!jsService.includeExtJsFile($extJsParam.setJsFile(':celJS/jquery.min.js'))## $!jsService.includeExtJsFile($extJsParam.setJsFile(':celJS/jquery-noconflict.js'))## +$!jsService.includeExtJsFile($extJsParam.setJsFile(':celJS/initCelements.min.js'))## $!jsService.includeExtJsFile($extJsParam.setJsFile(':js/xwiki/xwiki.js'))## $!jsService.includeExtJsFile($extJsParam.setJsFile(':js/scriptaculous/effects.js'))## $!jsService.includeExtJsFile($extJsParam.setJsFile(':js/xwiki/widgets/modalPopup.js'))## $services.css.includeCSSPage(':js/xwiki/widgets/modalPopup.css')## -$!jsService.includeExtJsFile($extJsParam.setJsFile(':js/xwiki/widgets/jumpToPage.js'))## -##$xwiki.ssfx.use('js/xwiki/widgets/jumpToPage.css', {'forceSkinAction' : true, 'language' : $context.language}) $!jsService.includeExtJsFile($extJsParam.setJsFile(':uicomponents/widgets/confirmationBox.js'))## $services.css.includeCSSPage(':uicomponents/widgets/confirmationBox.css')## $!jsService.includeExtJsFile($extJsParam.setJsFile(':uicomponents/widgets/confirmedAjaxRequest.js'))## $!jsService.includeExtJsFile($extJsParam.setJsFile(':uicomponents/widgets/notification.js'))## $services.css.includeCSSPage(':uicomponents/widgets/notification.css')## $!jsService.includeExtJsFile($extJsParam.setJsFile(':uicomponents/widgets/list/xlist.js'))## -$!jsService.includeExtJsFile($extJsParam.setJsFile(':uicomponents/suggest/suggest.js'))## +$!jsService.includeExtJsFile($extJsParam.setJsFile(':js/xwiki/xwiki-misc.js'))## +#if($hasedit || $isContentEditor || $isAdmin || ($services.celMenu.getMenuHeaders().size() > 0)) + $services.css.includeCSSPage(':celRes/celements2.css')## + $!jsService.includeExtJsFile($extJsParam.setJsFile(':celJS/moofx/moo.fx.js')) + $!jsService.includeExtJsFile($extJsParam.setJsFile(':celJS/moofx/moo.fx.utils.js')) + $!jsService.includeExtJsFile($extJsParam.setJsFile(':celJS/adminUi/admininterface.js')) + $!jsService.includeExtJsFile($extJsParam.setJsFile(':celJS/adminUi/menubar.js')) +#end #if($xwiki.exists('XWiki.SearchSuggestConfig')) ## Hook to request the search suggest script if search suggest configuration is present. ## We can't just have it as a always-use SSX yet since we compute a hash to be sure to refresh @@ -39,10 +44,15 @@ $!jsService.includeExtJsFile($extJsParam.setJsFile(':uicomponents/suggest/sugges #set($searchSuggestConfigHash = "${searchSuggestConfigHash}|${sourceId}") #end #end - $!jsService.includeExtJsFile($extJsParam.setJsFile(':uicomponents/search/searchSuggest.js'))## - $services.css.includeCSSPage(':uicomponents/search/searchSuggest.css')## #end #end +#if(($xcontext.action=="inline")||($xcontext.action=="edit") || ($xcontext.action=="admin")) + $!jsService.includeExtJsFile($extJsParam.setJsFile(':uicomponents/widgets/validation/livevalidation_prototype.js'))## + $services.css.includeCSSPage(':uicomponents/widgets/validation/livevalidation.css')## +#end +$!jsService.includeExtJsFile($extJsParam.setJsFile(':js/xwiki/compatibility.js'))## +$!jsService.includeExtJsFile($extJsParam.setJsFile(':celDynJS/DynamicLoader/celLazyLoader.mjs'))## +$!services.javascript.getAllExternalJavaScriptFiles() -#if(($xcontext.action=="inline")||($xcontext.action=="edit") || ($xcontext.action=="admin")) -$!jsService.includeExtJsFile($extJsParam.setJsFile(':uicomponents/widgets/validation/livevalidation_prototype.js'))## -$xwiki.get('ssfx').use('uicomponents/widgets/validation/livevalidation.css', true) -$!jsService.includeExtJsFile($extJsParam.setJsFile(':js/xwiki/compatibility.js'))## -$!jsService.includeExtJsFile($extJsParam.setJsFile(':celDynJS/DynamicLoader/celLazyLoader.mjs'))## -$!services.javascript.getAllExternalJavaScriptFiles() ## - + function prepareCancelEdit() { + lockEdit(); + } + function cancelCancelEdit() { + cancelCancelEditFlag = false; + } + Event.observe(window, "unload", cancelEdit); + Event.observe(window, "pagehide", cancelEdit); + $j(document).ready(prepareCancelEdit); + // ]]> + #end ## diff --git a/src/main/webapp/templates/simpleedittoolbar.vm b/src/main/webapp/templates/simpleedittoolbar.vm deleted file mode 100644 index 69fa74d55..000000000 --- a/src/main/webapp/templates/simpleedittoolbar.vm +++ /dev/null @@ -1,59 +0,0 @@ - - diff --git a/src/main/webapp/templates/startpage.vm b/src/main/webapp/templates/startpage.vm index 5c206e9d1..e8d3acc97 100644 --- a/src/main/webapp/templates/startpage.vm +++ b/src/main/webapp/templates/startpage.vm @@ -1,6 +1,7 @@ #template("xwikivars.vm") #template("layoutvars.vm") #template("htmlheader.vm") +#set($displayMainMenu = "$request.get('xwikiMenu')" == 'true') #if($displayMainMenu)