Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

FLUID-3615: Cutting the Infusion 1.2beta1 tag from the branch.

svn path=/fluid/infusion/tags/infusion-1.2beta1/; revision=9817
  • Loading branch information...
commit 3d253847bad96d2352fb0f9837f8a3025675fcf5 0 parents
@jobara jobara authored
Showing with 23,005 additions and 0 deletions.
  1. +11 −0 .project
  2. +3 −0  .settings/org.eclipse.core.resources.prefs
  3. +227 −0 Infusion-LICENSE.txt
  4. +182 −0 README.txt
  5. +354 −0 build-scripts/build.js
  6. +80 −0 build-scripts/build.properties
  7. +264 −0 build-scripts/build.xml
  8. +88 −0 build-scripts/buildutils.xml
  9. BIN  build-scripts/lib/jslint4java-1.1+rhino.jar
  10. BIN  build-scripts/lib/yuicompressor-2.3.3.jar
  11. +46 −0 maven.xml
  12. +32 −0 pom.xml
  13. +3 −0  project.properties
  14. +36 −0 project.xml
  15. +8 −0 src/webapp/WEB-INF/web.xml
  16. +33 −0 src/webapp/components/inlineEdit/css/InlineEdit.css
  17. +7 −0 src/webapp/components/inlineEdit/inlineEditDependencies.json
  18. +684 −0 src/webapp/components/inlineEdit/js/InlineEdit.js
  19. +433 −0 src/webapp/components/inlineEdit/js/InlineEditIntegrations.js
  20. +69 −0 src/webapp/components/pager/css/Pager.css
  21. BIN  src/webapp/components/pager/images/arrow-dn.png
  22. BIN  src/webapp/components/pager/images/arrow-up.png
  23. +813 −0 src/webapp/components/pager/js/Pager.js
  24. +7 −0 src/webapp/components/pager/pagerDependencies.json
  25. +254 −0 src/webapp/components/progress/js/Progress.js
  26. +6 −0 src/webapp/components/progress/progressDependencies.json
  27. +116 −0 src/webapp/components/reorderer/css/ImageReorderer.css
  28. +73 −0 src/webapp/components/reorderer/css/Reorderer.css
  29. BIN  src/webapp/components/reorderer/images/Banana.jpg
  30. BIN  src/webapp/components/reorderer/images/Blackberry.jpg
  31. BIN  src/webapp/components/reorderer/images/Cherry.jpg
  32. BIN  src/webapp/components/reorderer/images/Dragonfruit.jpg
  33. BIN  src/webapp/components/reorderer/images/Fig.jpg
  34. BIN  src/webapp/components/reorderer/images/Grapes.jpg
  35. BIN  src/webapp/components/reorderer/images/Kiwano.jpg
  36. BIN  src/webapp/components/reorderer/images/Kiwi.jpg
  37. BIN  src/webapp/components/reorderer/images/Kumquat.jpg
  38. BIN  src/webapp/components/reorderer/images/Lemon.jpg
  39. BIN  src/webapp/components/reorderer/images/Mangosteen.jpg
  40. BIN  src/webapp/components/reorderer/images/Orange.jpg
  41. BIN  src/webapp/components/reorderer/images/RedApple.jpg
  42. BIN  src/webapp/components/reorderer/images/Tamarillo.jpg
  43. +611 −0 src/webapp/components/reorderer/js/GeometricManager.js
  44. +176 −0 src/webapp/components/reorderer/js/ImageReorderer.js
  45. +37 −0 src/webapp/components/reorderer/js/LayoutReorderer.js
  46. +232 −0 src/webapp/components/reorderer/js/ModuleLayout.js
  47. +696 −0 src/webapp/components/reorderer/js/Reorderer.js
  48. +95 −0 src/webapp/components/reorderer/js/ReordererDOMUtilities.js
  49. +7 −0 src/webapp/components/reorderer/reordererDependencies.json
  50. +33 −0 src/webapp/components/tableOfContents/html/TableOfContents.html
  51. +172 −0 src/webapp/components/tableOfContents/js/TableOfContents.js
  52. +6 −0 src/webapp/components/tableOfContents/tableOfContentsDependencies.json
  53. +34 −0 src/webapp/components/uiOptions/css/Slider.css
  54. +55 −0 src/webapp/components/uiOptions/css/UIOptions.css
  55. +18 −0 src/webapp/components/uiOptions/css/UIOptionsPreview.css
  56. +178 −0 src/webapp/components/uiOptions/html/UIOptions.html
  57. +85 −0 src/webapp/components/uiOptions/html/UIOptionsPreview.html
  58. BIN  src/webapp/components/uiOptions/images/500x327_mint_truffle.jpg
  59. BIN  src/webapp/components/uiOptions/images/border_1.png
  60. BIN  src/webapp/components/uiOptions/images/expand_collapse.png
  61. BIN  src/webapp/components/uiOptions/images/h1.png
  62. BIN  src/webapp/components/uiOptions/images/main_bg.png
  63. BIN  src/webapp/components/uiOptions/images/mintleaf.png
  64. +403 −0 src/webapp/components/uiOptions/js/UIEnhancer.js
  65. +498 −0 src/webapp/components/uiOptions/js/UIOptions.js
  66. +7 −0 src/webapp/components/uiOptions/uiOptionsDependencies.json
  67. +138 −0 src/webapp/components/undo/js/Undo.js
  68. +6 −0 src/webapp/components/undo/undoDependencies.json
  69. +103 −0 src/webapp/components/uploader/ReadMe.txt
  70. +465 −0 src/webapp/components/uploader/css/Uploader.css
  71. +127 −0 src/webapp/components/uploader/html/Uploader.html
  72. BIN  src/webapp/components/uploader/images/add.png
  73. BIN  src/webapp/components/uploader/images/browse.png
  74. BIN  src/webapp/components/uploader/images/error.png
  75. BIN  src/webapp/components/uploader/images/gradient-file-green.png
  76. BIN  src/webapp/components/uploader/images/gradient-file-grey.png
  77. BIN  src/webapp/components/uploader/images/gradient-total-green.png
  78. BIN  src/webapp/components/uploader/images/gradient-total-grey.png
  79. BIN  src/webapp/components/uploader/images/gradient-total-yellow.png
  80. BIN  src/webapp/components/uploader/images/remove.png
  81. BIN  src/webapp/components/uploader/images/tick.png
  82. +161 −0 src/webapp/components/uploader/js/DemoUploadManager.js
  83. +178 −0 src/webapp/components/uploader/js/FileQueue.js
  84. +363 −0 src/webapp/components/uploader/js/SWFUploadManager.js
  85. +131 −0 src/webapp/components/uploader/js/Scroller.js
  86. +963 −0 src/webapp/components/uploader/js/Uploader.js
  87. +7 −0 src/webapp/components/uploader/uploaderDependencies.json
  88. +64 −0 src/webapp/demos/fss/layout/css/layout.css
  89. +63 −0 src/webapp/demos/fss/layout/demo.html
  90. +195 −0 src/webapp/demos/fss/layout/html/layout.html
  91. +63 −0 src/webapp/demos/fss/mobile/demo.html
  92. +80 −0 src/webapp/demos/fss/mobile/html/buttons/basic.html
  93. +66 −0 src/webapp/demos/fss/mobile/html/content/basic.html
  94. +116 −0 src/webapp/demos/fss/mobile/html/mobile.html
  95. +182 −0 src/webapp/demos/fss/mobile/html/nav/basic.html
  96. +228 −0 src/webapp/demos/fss/mobile/html/nav/icon.html
  97. +480 −0 src/webapp/demos/fss/mobile/html/nav/thumb.html
  98. +78 −0 src/webapp/demos/fss/mobile/html/tabs/basic.html
  99. BIN  src/webapp/demos/fss/mobile/images/1.jpg
  100. BIN  src/webapp/demos/fss/mobile/images/10.jpg
  101. BIN  src/webapp/demos/fss/mobile/images/11.jpg
  102. BIN  src/webapp/demos/fss/mobile/images/12.jpg
  103. BIN  src/webapp/demos/fss/mobile/images/13.jpg
  104. BIN  src/webapp/demos/fss/mobile/images/14.jpg
  105. BIN  src/webapp/demos/fss/mobile/images/15.jpg
  106. BIN  src/webapp/demos/fss/mobile/images/16.jpg
  107. BIN  src/webapp/demos/fss/mobile/images/17.jpg
  108. BIN  src/webapp/demos/fss/mobile/images/18.jpg
  109. BIN  src/webapp/demos/fss/mobile/images/19.png
  110. BIN  src/webapp/demos/fss/mobile/images/2.jpg
  111. BIN  src/webapp/demos/fss/mobile/images/20.png
  112. BIN  src/webapp/demos/fss/mobile/images/3.jpg
  113. BIN  src/webapp/demos/fss/mobile/images/4.jpg
  114. BIN  src/webapp/demos/fss/mobile/images/5.jpg
  115. BIN  src/webapp/demos/fss/mobile/images/6.jpg
  116. BIN  src/webapp/demos/fss/mobile/images/7.jpg
  117. BIN  src/webapp/demos/fss/mobile/images/8.jpg
  118. BIN  src/webapp/demos/fss/mobile/images/9.jpg
  119. +84 −0 src/webapp/demos/fss/mobile/js/themer.js
  120. +4 −0 src/webapp/demos/fss/reset/css/reset.css
  121. +63 −0 src/webapp/demos/fss/reset/demo.html
  122. +17 −0 src/webapp/demos/fss/reset/html/reset.html
  123. +61 −0 src/webapp/demos/fss/reset/html/withReset.html
  124. +60 −0 src/webapp/demos/fss/reset/html/withoutReset.html
  125. +63 −0 src/webapp/demos/fss/text/demo.html
  126. +180 −0 src/webapp/demos/fss/text/html/text.html
  127. +63 −0 src/webapp/demos/fss/themes/demo.html
  128. +405 −0 src/webapp/demos/fss/themes/html/themes.html
  129. +161 −0 src/webapp/demos/index.html
  130. +63 −0 src/webapp/demos/inlineEdit/rich/demo.html
  131. +69 −0 src/webapp/demos/inlineEdit/rich/html/inlineEdit.html
  132. +58 −0 src/webapp/demos/inlineEdit/rich/js/inlineEdit.js
  133. +63 −0 src/webapp/demos/inlineEdit/simple/demo.html
  134. +49 −0 src/webapp/demos/inlineEdit/simple/html/inlineEdit.html
  135. +53 −0 src/webapp/demos/inlineEdit/simple/js/inlineEdit.js
  136. +50 −0 src/webapp/demos/keyboard-a11y/css/keyboard.css
  137. +51 −0 src/webapp/demos/keyboard-a11y/html/keyboard.html
  138. +76 −0 src/webapp/demos/keyboard-a11y/js/keyboard.js
  139. +59 −0 src/webapp/demos/pager/css/pager.css
  140. +204 −0 src/webapp/demos/pager/data/pager.js
  141. +63 −0 src/webapp/demos/pager/demo.html
  142. +90 −0 src/webapp/demos/pager/html/pager.html
  143. +45 −0 src/webapp/demos/pager/js/pager.js
  144. +20 −0 src/webapp/demos/portal/css/ajaxError.css
  145. +64 −0 src/webapp/demos/portal/css/demo.css
  146. +155 −0 src/webapp/demos/portal/css/portal.css
  147. +20 −0 src/webapp/demos/portal/html/sameOriginPolicyWarning.html
  148. BIN  src/webapp/demos/portal/images/comingSoon.png
  149. BIN  src/webapp/demos/portal/images/fss.png
  150. BIN  src/webapp/demos/portal/images/inlineEdit-dropdown.png
  151. BIN  src/webapp/demos/portal/images/inlineEdit-rich.png
  152. BIN  src/webapp/demos/portal/images/inlineEdit-simple.png
  153. BIN  src/webapp/demos/portal/images/pager.png
  154. BIN  src/webapp/demos/portal/images/progress.png
  155. BIN  src/webapp/demos/portal/images/renderer.png
  156. BIN  src/webapp/demos/portal/images/reorderer-grid.png
  157. BIN  src/webapp/demos/portal/images/reorderer-image.png
  158. BIN  src/webapp/demos/portal/images/reorderer-layout.png
  159. BIN  src/webapp/demos/portal/images/reorderer-list.png
  160. BIN  src/webapp/demos/portal/images/uiOptions.png
  161. BIN  src/webapp/demos/portal/images/uploader.png
  162. +251 −0 src/webapp/demos/portal/js/demoAssets.js
  163. +45 −0 src/webapp/demos/portal/lib/chili/cplusplus.js
  164. +41 −0 src/webapp/demos/portal/lib/chili/csharp.js
  165. +85 −0 src/webapp/demos/portal/lib/chili/css.js
  166. +41 −0 src/webapp/demos/portal/lib/chili/delphi.js
  167. +80 −0 src/webapp/demos/portal/lib/chili/html.js
  168. +41 −0 src/webapp/demos/portal/lib/chili/java.js
  169. +705 −0 src/webapp/demos/portal/lib/chili/jquery.chili-2.2.js
  170. +75 −0 src/webapp/demos/portal/lib/chili/js.js
  171. +54 −0 src/webapp/demos/portal/lib/chili/lotusscript.js
  172. +63 −0 src/webapp/demos/portal/lib/chili/mysql.js
  173. +142 −0 src/webapp/demos/portal/lib/chili/php-f.js
  174. +138 −0 src/webapp/demos/portal/lib/chili/php.js
  175. +364 −0 src/webapp/demos/portal/lib/chili/recipes.js
  176. +10 −0 src/webapp/demos/portal/lib/chili/start-here.html
  177. +74 −0 src/webapp/demos/progress/css/progress.css
  178. +63 −0 src/webapp/demos/progress/demo.html
  179. +42 −0 src/webapp/demos/progress/html/progress.html
  180. BIN  src/webapp/demos/progress/images/progress-bar-animation.gif
  181. +67 −0 src/webapp/demos/progress/js/progress.js
  182. +13 −0 src/webapp/demos/renderer/css/renderer.css
  183. +45 −0 src/webapp/demos/renderer/data/renderer.js
  184. +66 −0 src/webapp/demos/renderer/demo.html
  185. +80 −0 src/webapp/demos/renderer/html/renderer.html
  186. +235 −0 src/webapp/demos/renderer/js/renderer.js
  187. +15 −0 src/webapp/demos/reorderer/gridReorderer/css/gridReorderer.css
  188. +67 −0 src/webapp/demos/reorderer/gridReorderer/demo.html
  189. +56 −0 src/webapp/demos/reorderer/gridReorderer/html/gridReorderer.html
  190. +24 −0 src/webapp/demos/reorderer/gridReorderer/js/gridReorderer.js
  191. +70 −0 src/webapp/demos/reorderer/imageReorderer/css/imageReorderer.css
  192. +67 −0 src/webapp/demos/reorderer/imageReorderer/demo.html
  193. +93 −0 src/webapp/demos/reorderer/imageReorderer/html/imageReorderer.html
  194. +28 −0 src/webapp/demos/reorderer/imageReorderer/js/imageReorderer.js
  195. +10 −0 src/webapp/demos/reorderer/layoutReorderer/css/layoutReorderer.css
  196. +66 −0 src/webapp/demos/reorderer/layoutReorderer/demo.html
  197. +81 −0 src/webapp/demos/reorderer/layoutReorderer/html/layoutReorderer.html
  198. +28 −0 src/webapp/demos/reorderer/layoutReorderer/js/layoutReorderer.js
  199. +49 −0 src/webapp/demos/reorderer/listReorderer/css/listReorderer.css
  200. +66 −0 src/webapp/demos/reorderer/listReorderer/demo.html
  201. +77 −0 src/webapp/demos/reorderer/listReorderer/html/listReorderer.html
  202. +28 −0 src/webapp/demos/reorderer/listReorderer/js/listReorderer.js
  203. +3 −0  src/webapp/demos/uiOptions/css/uiOptions.css
  204. +63 −0 src/webapp/demos/uiOptions/demo.html
  205. +37 −0 src/webapp/demos/uiOptions/html/UIOptionsPreview.html
  206. +67 −0 src/webapp/demos/uiOptions/html/uiOptions.html
  207. +89 −0 src/webapp/demos/uiOptions/js/uiOptions.js
  208. +68 −0 src/webapp/demos/uploader/demo.html
  209. +132 −0 src/webapp/demos/uploader/html/uploader.html
  210. BIN  src/webapp/demos/uploader/images/add.png
  211. BIN  src/webapp/demos/uploader/images/browse.png
  212. BIN  src/webapp/demos/uploader/images/error.png
  213. BIN  src/webapp/demos/uploader/images/gradient-file-green.png
  214. BIN  src/webapp/demos/uploader/images/gradient-file-grey.png
  215. BIN  src/webapp/demos/uploader/images/gradient-total-green.png
  216. BIN  src/webapp/demos/uploader/images/gradient-total-grey.png
  217. BIN  src/webapp/demos/uploader/images/gradient-total-yellow.png
  218. BIN  src/webapp/demos/uploader/images/remove.png
  219. BIN  src/webapp/demos/uploader/images/tick.png
  220. +46 −0 src/webapp/demos/uploader/js/uploader.js
  221. +6 −0 src/webapp/framework/core/frameworkDependencies.json
  222. +350 −0 src/webapp/framework/core/js/DataBinding.js
  223. +973 −0 src/webapp/framework/core/js/Fluid.js
  224. +106 −0 src/webapp/framework/core/js/FluidDOMUtilities.js
  225. +73 −0 src/webapp/framework/core/js/FluidDebugging.js
  226. +120 −0 src/webapp/framework/core/js/JavaProperties.js
  227. +17 −0 src/webapp/framework/core/js/ProgressiveEnhancement.js
  228. +673 −0 src/webapp/framework/core/js/jquery.keyboard-a11y.js
  229. 0  src/webapp/framework/fss/css/fss-JSR168Bridge.css
  230. +283 −0 src/webapp/framework/fss/css/fss-layout.css
  231. +539 −0 src/webapp/framework/fss/css/fss-mobile-layout.css
  232. +279 −0 src/webapp/framework/fss/css/fss-mobile-theme-android.css
  233. +264 −0 src/webapp/framework/fss/css/fss-mobile-theme-iphone.css
  234. +137 −0 src/webapp/framework/fss/css/fss-reset.css
  235. +192 −0 src/webapp/framework/fss/css/fss-text.css
  236. +189 −0 src/webapp/framework/fss/css/fss-theme-coal.css
  237. +25 −0 src/webapp/framework/fss/css/fss-theme-debug.css
  238. +119 −0 src/webapp/framework/fss/css/fss-theme-hc.css
  239. +118 −0 src/webapp/framework/fss/css/fss-theme-hci.css
  240. +173 −0 src/webapp/framework/fss/css/fss-theme-mist.css
  241. +139 −0 src/webapp/framework/fss/css/fss-theme-rust.css
  242. +177 −0 src/webapp/framework/fss/css/fss-theme-slate.css
  243. +35 −0 src/webapp/framework/fss/css/fss-transitions.css
  244. +5 −0 src/webapp/framework/fss/fssDependencies.json
  245. +5 −0 src/webapp/framework/fss/fssLayoutDependencies.json
  246. +6 −0 src/webapp/framework/fss/fssResetDependencies.json
  247. +5 −0 src/webapp/framework/fss/fssTextDependencies.json
  248. +5 −0 src/webapp/framework/fss/fssThemesDependencies.json
  249. BIN  src/webapp/framework/fss/images/exclamation.png
  250. BIN  src/webapp/framework/fss/images/gripper.png
  251. BIN  src/webapp/framework/fss/images/themes/_common/exclamation.png
  252. BIN  src/webapp/framework/fss/images/themes/_common/gloss_25_repeater.png
  253. BIN  src/webapp/framework/fss/images/themes/_common/gripper.png
  254. BIN  src/webapp/framework/fss/images/themes/android/backbutton_mask.png
  255. BIN  src/webapp/framework/fss/images/themes/android/button_bg_insetShadow.png
  256. BIN  src/webapp/framework/fss/images/themes/android/listmenu_arrow.png
  257. BIN  src/webapp/framework/fss/images/themes/android/listmenu_loader.gif
  258. BIN  src/webapp/framework/fss/images/themes/android/listmenu_loader.png
  259. BIN  src/webapp/framework/fss/images/themes/android/navbar_back_button_insetShadow.png
  260. BIN  src/webapp/framework/fss/images/themes/android/navbar_normal_button_insetShadow.png
  261. BIN  src/webapp/framework/fss/images/themes/coal/buttons-light-bg.png
  262. BIN  src/webapp/framework/fss/images/themes/coal/buttons-light-cap.png
  263. BIN  src/webapp/framework/fss/images/themes/coal/buttons-med-bg.png
  264. BIN  src/webapp/framework/fss/images/themes/coal/buttons-med-cap.png
  265. BIN  src/webapp/framework/fss/images/themes/coal/buttons-titlebar-bg.png
  266. BIN  src/webapp/framework/fss/images/themes/coal/buttons-titlebar-cap.png
  267. BIN  src/webapp/framework/fss/images/themes/coal/icon-menu-Delete.png
  268. BIN  src/webapp/framework/fss/images/themes/coal/icon-widget-Close.png
  269. BIN  src/webapp/framework/fss/images/themes/coal/icon-widget-Less.png
  270. BIN  src/webapp/framework/fss/images/themes/coal/icon-widget-More.png
  271. BIN  src/webapp/framework/fss/images/themes/coal/icon-widget-ShowSettings.png
  272. BIN  src/webapp/framework/fss/images/themes/coal/icon-widget-gripper.png
  273. BIN  src/webapp/framework/fss/images/themes/coal/tabs-light-active-bg.png
  274. BIN  src/webapp/framework/fss/images/themes/coal/tabs-light-active-cap.png
  275. BIN  src/webapp/framework/fss/images/themes/coal/tabs-light-bg.png
  276. BIN  src/webapp/framework/fss/images/themes/coal/tabs-light-cap.png
  277. BIN  src/webapp/framework/fss/images/themes/coal/tabs-light-container-bg.png
  278. BIN  src/webapp/framework/fss/images/themes/coal/tabs-light-content-bg.png
  279. BIN  src/webapp/framework/fss/images/themes/coal/tabs-med-active-bg.png
  280. BIN  src/webapp/framework/fss/images/themes/coal/tabs-med-active-cap.png
  281. BIN  src/webapp/framework/fss/images/themes/coal/tabs-med-bg.png
  282. BIN  src/webapp/framework/fss/images/themes/coal/tabs-med-cap.png
  283. BIN  src/webapp/framework/fss/images/themes/coal/tabs-med-container-bg.png
  284. BIN  src/webapp/framework/fss/images/themes/coal/tabs-med-content-bg.png
  285. BIN  src/webapp/framework/fss/images/themes/coal/widget-bg.png
  286. BIN  src/webapp/framework/fss/images/themes/iphone/backbutton_mask.png
  287. BIN  src/webapp/framework/fss/images/themes/iphone/button_bg_insetShadow.png
  288. BIN  src/webapp/framework/fss/images/themes/iphone/listmenu_arrow.png
  289. BIN  src/webapp/framework/fss/images/themes/iphone/listmenu_loader.gif
  290. BIN  src/webapp/framework/fss/images/themes/iphone/listmenu_loader.png
  291. BIN  src/webapp/framework/fss/images/themes/iphone/navbar_back_button_insetShadow.png
  292. BIN  src/webapp/framework/fss/images/themes/iphone/navbar_normal_button_insetShadow.png
  293. BIN  src/webapp/framework/fss/images/themes/mist/buttons-light-bg.png
  294. BIN  src/webapp/framework/fss/images/themes/mist/buttons-light-cap.png
  295. BIN  src/webapp/framework/fss/images/themes/mist/buttons-med-bg.png
  296. BIN  src/webapp/framework/fss/images/themes/mist/buttons-med-cap.png
  297. BIN  src/webapp/framework/fss/images/themes/mist/buttons-titlebar-bg.png
  298. BIN  src/webapp/framework/fss/images/themes/mist/buttons-titlebar-cap.png
  299. BIN  src/webapp/framework/fss/images/themes/mist/icon-menu-Delete.png
  300. BIN  src/webapp/framework/fss/images/themes/mist/icon-options-ListOrGrid.png
Sorry, we could not display the entire diff because too many files (755) changed.
11 .project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>fluid-infusion</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ </buildSpec>
+ <natures>
+ </natures>
+</projectDescription>
3  .settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#Wed Feb 03 20:22:52 MST 2010
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
227 Infusion-LICENSE.txt
@@ -0,0 +1,227 @@
+Fluid is available under either the terms of the New BSD license or the
+Educational Community License, Version 2.0. As a recipient of Fluid, you may
+choose which license to receive this code under (except as noted in per-module
+LICENSE files). All modules are Copyright 2007 University of Toronto except
+where noted otherwise in the code itself, or if the modules reside in a separate
+directory, they may contain explicit declarations of copyright in both the
+LICENSE file in the directory in which they reside and in the code itself. No
+external contributions are allowed under licenses which are fundamentally
+incompatible with the ECL or BSD licenses that Fluid is distributed under.
+
+The text of the ECL and BSD licenses is reproduced below.
+
+Educational Community License, Version 2.0
+*************************************
+Copyright 2007 University of Toronto
+
+Educational Community License, Version 2.0, April 2007
+
+The Educational Community License version 2.0 ("ECL") consists of the Apache 2.0
+license, modified to change the scope of the patent grant in section 3 to be
+specific to the needs of the education communities using this license. The
+original Apache 2.0 license can be found at:
+http://www.apache.org/licenses/LICENSE-2.0
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and
+distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright
+owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all other entities
+that control, are controlled by, or are under common control with that entity.
+For the purposes of this definition, "control" means (i) the power, direct or
+indirect, to cause the direction or management of such entity, whether by
+contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
+outstanding shares, or (iii) beneficial ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising
+permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications, including
+but not limited to software source code, documentation source, and configuration
+files.
+
+"Object" form shall mean any form resulting from mechanical transformation or
+translation of a Source form, including but not limited to compiled object code,
+generated documentation, and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form, made
+available under the License, as indicated by a copyright notice that is included
+in or attached to the work (an example is provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form, that
+is based on (or derived from) the Work and for which the editorial revisions,
+annotations, elaborations, or other modifications represent, as a whole, an
+original work of authorship. For the purposes of this License, Derivative Works
+shall not include works that remain separable from, or merely link (or bind by
+name) to the interfaces of, the Work and Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original version
+of the Work and any modifications or additions to that Work or Derivative Works
+thereof, that is intentionally submitted to Licensor for inclusion in the Work
+by the copyright owner or by an individual or Legal Entity authorized to submit
+on behalf of the copyright owner. For the purposes of this definition,
+"submitted" means any form of electronic, verbal, or written communication sent
+to the Licensor or its representatives, including but not limited to
+communication on electronic mailing lists, source code control systems, and
+issue tracking systems that are managed by, or on behalf of, the Licensor for
+the purpose of discussing and improving the Work, but excluding communication
+that is conspicuously marked or otherwise designated in writing by the copyright
+owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
+of whom a Contribution has been received by Licensor and subsequently
+incorporated within the Work.
+
+2. Grant of Copyright License.
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
+irrevocable copyright license to reproduce, prepare Derivative Works of,
+publicly display, publicly perform, sublicense, and distribute the Work and such
+Derivative Works in Source or Object form.
+
+3. Grant of Patent License.
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
+irrevocable (except as stated in this section) patent license to make, have
+made, use, offer to sell, sell, import, and otherwise transfer the Work, where
+such license applies only to those patent claims licensable by such Contributor
+that are necessarily infringed by their Contribution(s) alone or by combination
+of their Contribution(s) with the Work to which such Contribution(s) was
+submitted. If You institute patent litigation against any entity (including a
+cross-claim or counterclaim in a lawsuit) alleging that the Work or a
+Contribution incorporated within the Work constitutes direct or contributory
+patent infringement, then any patent licenses granted to You under this License
+for that Work shall terminate as of the date such litigation is filed. Any
+patent license granted hereby with respect to contributions by an individual
+employed by an institution or organization is limited to patent claims where the
+individual that is the author of the Work is also the inventor of the patent
+claims licensed, and where the organization or institution has the right to
+grant such license under applicable grant and research funding agreements. No
+other express or implied licenses are granted.
+
+4. Redistribution.
+
+You may reproduce and distribute copies of the Work or Derivative Works thereof
+in any medium, with or without modifications, and in Source or Object form,
+provided that You meet the following conditions:
+
+ 1. You must give any other recipients of the Work or Derivative Works a copy
+of this License; and
+ 2. You must cause any modified files to carry prominent notices stating that
+You changed the files; and
+ 3. You must retain, in the Source form of any Derivative Works that You
+distribute, all copyright, patent, trademark, and attribution notices from
+the Source form of the Work, excluding those notices that do not pertain to
+any part of the Derivative Works; and
+ 4. If the Work includes a "NOTICE" text file as part of its distribution,
+then any Derivative Works that You distribute must include a readable copy of
+the attribution notices contained within such NOTICE file, excluding those
+notices that do not pertain to any part of the Derivative Works, in at least
+one of the following places: within a NOTICE text file distributed as part of
+the Derivative Works; within the Source form or documentation, if provided
+along with the Derivative Works; or, within a display generated by the
+Derivative Works, if and wherever such third-party notices normally appear.
+The contents of the NOTICE file are for informational purposes only and do
+not modify the License. You may add Your own attribution notices within
+Derivative Works that You distribute, alongside or as an addendum to the
+NOTICE text from the Work, provided that such additional attribution notices
+cannot be construed as modifying the License.
+
+You may add Your own copyright statement to Your modifications and may provide
+additional or different license terms and conditions for use, reproduction, or
+distribution of Your modifications, or for any such Derivative Works as a whole,
+provided Your use, reproduction, and distribution of the Work otherwise complies
+with the conditions stated in this License.
+
+5. Submission of Contributions.
+
+Unless You explicitly state otherwise, any Contribution intentionally submitted
+for inclusion in the Work by You to the Licensor shall be under the terms and
+conditions of this License, without any additional terms or conditions.
+Notwithstanding the above, nothing herein shall supersede or modify the terms of
+any separate license agreement you may have executed with Licensor regarding
+such Contributions.
+
+6. Trademarks.
+
+This License does not grant permission to use the trade names, trademarks,
+service marks, or product names of the Licensor, except as required for
+reasonable and customary use in describing the origin of the Work and
+reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty.
+
+Unless required by applicable law or agreed to in writing, Licensor provides the
+Work (and each Contributor provides its Contributions) on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
+including, without limitation, any warranties or conditions of TITLE,
+NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
+solely responsible for determining the appropriateness of using or
+redistributing the Work and assume any risks associated with Your exercise of
+permissions under this License.
+
+8. Limitation of Liability.
+
+In no event and under no legal theory, whether in tort (including negligence),
+contract, or otherwise, unless required by applicable law (such as deliberate
+and grossly negligent acts) or agreed to in writing, shall any Contributor be
+liable to You for damages, including any direct, indirect, special, incidental,
+or consequential damages of any character arising as a result of this License or
+out of the use or inability to use the Work (including but not limited to
+damages for loss of goodwill, work stoppage, computer failure or malfunction, or
+any and all other commercial damages or losses), even if such Contributor has
+been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability.
+
+While redistributing the Work or Derivative Works thereof, You may choose to
+offer, and charge a fee for, acceptance of support, warranty, indemnity, or
+other liability obligations and/or rights consistent with this License. However,
+in accepting such obligations, You may act only on Your own behalf and on Your
+sole responsibility, not on behalf of any other Contributor, and only if You
+agree to indemnify, defend, and hold each Contributor harmless for any liability
+incurred by, or claims asserted against, such Contributor by reason of your
+accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS FOR ECL 2.0
+
+The New BSD license
+**********************
+
+Copyright 2007 University of Toronto.
+
+All rights reserved.
+
+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.
+ * Neither the name of the University of Toronto nor the names of its
+contributors may be used to endorse or promote products derived from this
+software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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.
+
+END OF TERMS AND CONDITIONS FOR THE NEW BSD LICENSE
182 README.txt
@@ -0,0 +1,182 @@
+Fluid Infusion 1.2 Beta 1
+=========================
+Main Project Site: http://fluidproject.org
+Documentation: http://wiki.fluidproject.org/display/fluid/Infusion+Documentation
+
+What's New in 1.2 Beta 1
+========================
+
+
+
+What's in this Release
+======================
+
+
+Source Code
+-----------
+The organization of the full source code for the Infusion library is as follows:
+
+ components/
+ inlineEdit/
+ pager/
+ progress/
+ reorderer/
+ tableOfContents/
+ uiOptions/
+ undo/
+ uploader/
+ framework/
+ core/
+ fss/
+ renderer/
+ lib/
+ fastXmlPull/
+ jquery/
+ json/
+ swfobject/
+ swfupload/
+
+
+Demo Portal
+-----------
+The bundle now comes with a convenient one-stop-shop for seeing all components in action. It is organized as follows:
+
+ demos/
+ fss/
+ layout/
+ mobile/
+ reset/
+ text/
+ themes/
+ inlineEdit/
+ rich/
+ simple/
+ keyboard-a11y/
+ pager/
+ portal/
+ progress/
+ renderer/
+ reorderer/
+ gridReorderer/
+ imageReorderer/
+ layoutReorderer/
+ listReorderer/
+ uiOptions/
+ uploader/
+
+
+Other Examples and Sample Code
+------------------------------
+Sample code illustrating how Infusion components can be used:
+
+ integration-demos/
+ bspace/ (showcases: Inline Edit)
+ sakai/ (showcases: Inline Edit, Pager, UI Options, FSS)
+ uportal/ (showcases: Reorderer, UI Options, FSS)
+ standalone-demos/
+ keyboard-a11y/
+ lib/
+ pager/
+ renderer/
+ reorderer/
+ table-of-contents/
+
+Tests
+-----
+ tests/
+ component-tests/
+ escalated-tests/
+ framework-tests/
+ lib/
+ manual-tests/
+ test-core/
+
+License
+-------
+Fluid Infusion code is licensed under a dual ECL 2.0 / BSD license. The specific licenses can be
+found in the license file:
+ licenses/Infusion-LICENSE.txt
+
+Infusion also depends upon some third party open source modules. These are contained in their own
+folders, and their licenses are also present in
+ licenses/
+
+Third Party Software in Infusion
+--------------------------------
+This is a list of publicly available software that is included in the Fluid Infusion bundle, along
+with their licensing terms.
+
+ * jQuery javascript library v1.4.2: http://jquery.com/ (MIT and GPL licensed http://docs.jquery.com/Licensing)
+ * jQuery UI javascript widget library v1.8: http://ui.jquery.com/ (MIT and GPL licensed http://docs.jquery.com/Licensing)
+ * jQuery QUnit 2dbf603: http://docs.jquery.com/QUnit (MIT and GPL licensed http://docs.jquery.com/Licensing)
+ * jQuery Chili code highlighter http://code.google.com/p/jquery-chili-js/ (MIT licensed)
+ * Douglas Crockford's JSON parsing and stringifying methods (from 2007-11-06): http://www.json.org/ (Public Domain)
+ * SWFUpload v2.2.0.1: http://swfupload.org/ (MIT licensed http://www.opensource.org/licenses/mit-license.php)
+ * SWFObject v2.1: http://code.google.com/p/swfobject/ (MIT licensed http://www.opensource.org/licenses/mit-license.php)
+ * Sample markup and stylesheets from Sakai v2.5 (http://sakaiproject.org) and uPortal v2.6 (http://www.uportal.org/)
+
+Other third party software
+
+ * fastXmlPull is based on XML for Script's Fast Pull Parser v3.1
+ (see: http://wiki.fluidproject.org/display/fluid/Licensing+for+fastXmlPull.js )
+ * fluid.reset.css is based on YUI's CSS reset styling v2.5.2
+ see: http://developer.yahoo.com/yui/reset/ (BSD licensed http://developer.yahoo.com/yui/license.html)
+
+Readme
+------
+This file.
+ README.txt
+
+
+Documentation
+=============
+
+The Fluid Project uses a wiki for documentation and project collaboration: http://wiki.fluidproject.org.
+The main Infusion documentation can be found at:
+
+ http://wiki.fluidproject.org/display/fluid/Infusion+Documentation
+
+The documentation for Infusion consists of a number of information pages stored in the Fluid Wiki.
+The pages include tutorials, API descriptions, testing procedures, and data-gathering approaches. To make the
+manual pages easy to navigate we have added the following guides:
+
+ * The above-mentioned landing page, which links to all of our documentation.
+ * A link to the documentation appears at the top of the left-side wiki navigation
+ bar with the name "Infusion Documentation".
+
+
+Supported Browsers
+==================
+
+http://wiki.fluidproject.org/display/fluid/Browser+Support
+
+
+Status of Components and Framework Features
+===========================================
+
+Production: supports A-Grade browsers, stable for production usage across a wide range of
+applications and use cases
+ * Fluid Skinning System
+ * Infusion Framework Core
+ * Inline Edit: Simple Text
+ * Renderer
+ * Reorderer: List, Grid, Layout, Image
+ * Undo
+
+Preview: still growing, but with broad browser support. Expect new features in upcoming releases
+ * Pager
+ * Progress
+ * UI Options
+ * Uploader
+
+Sneak Peek: in development; APIs will change. Share your feedback, ideas, and code
+ * Inline Edit: Dropdown
+ * Inline Edit: Rich Text
+ * Table of Contents
+
+
+Known Issues
+============
+
+The Fluid Project uses a JIRA website to track bugs: http://issues.fluidproject.org.
+
354 build-scripts/build.js
@@ -0,0 +1,354 @@
+/*
+ * This is a minified version of Douglas Crockford's JSON2.js parser, release in the public domain.
+ * http://www.json.org/json2.js
+ */
+if(!this.JSON){JSON=function(){function f(n){return n<10?"0"+n:n}Date.prototype.toJSON=function(){return this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z"};var m={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};function stringify(value,whitelist){var a,i,k,l,r=/["\\\x00-\x1f\x7f-\x9f]/g,v;switch(typeof value){case"string":return r.test(value)?'"'+value.replace(r,function(a){var c=m[a];if(c){return c}c=a.charCodeAt();return"\\u00"+Math.floor(c/16).toString(16)+(c%16).toString(16)})+'"':'"'+value+'"';case"number":return isFinite(value)?String(value):"null";case"boolean":case"null":return String(value);case"object":if(!value){return"null"}if(typeof value.toJSON==="function"){return stringify(value.toJSON())}a=[];if(typeof value.length==="number"&&!(value.propertyIsEnumerable("length"))){l=value.length;for(i=0;i<l;i+=1){a.push(stringify(value[i],whitelist)||"null")}return"["+a.join(",")+"]"}if(whitelist){l=whitelist.length;for(i=0;i<l;i+=1){k=whitelist[i];if(typeof k==="string"){v=stringify(value[k],whitelist);if(v){a.push(stringify(k)+":"+v)}}}}else{for(k in value){if(typeof k==="string"){v=stringify(value[k],whitelist);if(v){a.push(stringify(k)+":"+v)}}}}return"{"+a.join(",")+"}"}}return{stringify:stringify,parse:function(text,filter){var j;function walk(k,v){var i,n;if(v&&typeof v==="object"){for(i in v){if(Object.prototype.hasOwnProperty.apply(v,[i])){n=walk(i,v[i]);if(n!==undefined){v[i]=n}}}}return filter(k,v)}if(/^[\],:{}\s]*$/.test(text.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(:?[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""))){j=eval("("+text+")");return typeof filter==="function"?walk("",j):j}throw new SyntaxError("parseJSON")}}}()};
+
+
+/*
+ * This is the Fluid Infusion dependency manager.
+ */
+
+/*global importClass, Packages */
+/*global java, File, BufferedReader, FileReader, LogLevel */
+
+importClass(java.io.BufferedReader);
+importClass(java.io.FileReader);
+importClass(java.io.File);
+importClass(Packages.org.apache.tools.ant.types.LogLevel);
+
+var fluid = fluid || {};
+var globalObj = this;
+
+(function () {
+ var modulePrefix = "module_";
+ var customJsFileName = "MyInfusion.js";
+ var allJsFileName = "InfusionAll.js";
+
+ /**
+ * Returns the filename for the concatenated javascript file based on whether a filename was passed in and
+ * whether a full build is or a custom build is done.
+ * @param {Object} nameArg
+ * @param {Object} includeArg
+ * @param {Object} excludeArg
+ */
+ var jsFileName = function (nameArg, includeArg, excludeArg) {
+ if (nameArg) {
+ return nameArg;
+ }
+
+ return (includeArg || excludeArg ? customJsFileName : allJsFileName);
+ };
+
+ var setProperty = function (name, value) {
+ globalObj.project.setProperty(name, value);
+ logInfo("Setting property " + name + " to " + value);
+ };
+
+ var modulePath = function (moduleName) {
+ return globalObj.project.getProperty(modulePrefix + moduleName);
+ };
+
+ /**
+ * Finds all the modules based on the convention of the module property prefix and
+ * returns them as a comma delimited string
+ */
+ var allModules = function () {
+ var str = "";
+ for (var name in globalObj) {
+ if (name.search(modulePrefix) === 0) {
+ str += name.slice(modulePrefix.length) + ",";
+ }
+ }
+ return str;
+ };
+
+ var logVerbose = function (str) {
+ globalObj.project.log(str, LogLevel.VERBOSE.getLevel());
+ };
+
+ var logInfo = function (str) {
+ globalObj.project.log(str, LogLevel.INFO.getLevel());
+ };
+
+ var logDebug = function (str) {
+ globalObj.project.log(str, LogLevel.DEBUG.getLevel());
+ };
+
+ /**
+ * Turns a comma delimitied string into an array
+ *
+ * @param {String} arg
+ */
+ var parseArgument = function (arg) {
+ var retArray = [];
+
+ var parsedArg = arg.split(",");
+ for (var i = 0; i < parsedArg.length; i++) {
+ var str = parsedArg[i].replace(/(^\s+)|(\s+$)/g, "");
+ if (str) {
+ retArray.push(str);
+ }
+ }
+ return retArray;
+ };
+
+ /**
+ * Turns a comma delimited string into an array of module names. Uses all modules if none are passed in.
+ *
+ * @param {String} includeArg
+ */
+ var parseModulesToInclude = function (includeArg) {
+ if (typeof(includeArg) === "undefined") {
+ includeArg = allModules();
+ }
+
+ logInfo("Including modules: " + includeArg);
+
+ return parseArgument(includeArg);
+ };
+
+ var isDependencyIncluded = function (name, array) {
+ for (var i = 0; i < array.length; i++) {
+ if (array[i] === name) {
+ return true;
+ }
+ }
+
+ return false;
+ };
+
+ /**
+ * Returns an array containing the value if it is a string or the value otherwise
+ *
+ * @param {Object} value
+ */
+ var asArray = function (value) {
+ if (value === undefined) {
+ return [];
+ } else if (typeof(value) === "string") {
+ return [value];
+ }
+
+ return value;
+ };
+
+ var normalizeDeclaration = function (declaration) {
+ declaration.files = asArray(declaration.files);
+ declaration.dependencies = asArray(declaration.dependencies);
+ };
+
+ /**
+ * Logs dependencies for the module
+ *
+ * @param {Object} moduleName
+ * @param {Object} moduleDependencies
+ */
+ var logDependencies = function (moduleName, moduleDependencies) {
+ logVerbose("Dependencies for " + moduleName + ": ");
+ for (var i = 0; i < moduleDependencies.length; i++) {
+ logVerbose(" * " + moduleDependencies[i]);
+ }
+ };
+
+ /**
+ * Builds the moduleJSFileTable, and the requiredModules list for the moduleName passed in
+ *
+ * @param {Object} that
+ * @param {Object} moduleName
+ * @param {Object} prefixStr
+ */
+ var assembleDependencyList = function (that, moduleName, prefixStr) {
+ logInfo(prefixStr + " Processing module: " + moduleName);
+ logDebug("Dependency order so far: " + that.requiredModules);
+
+ if (isDependencyIncluded(moduleName, that.requiredModules)) {
+ return;
+ }
+
+ var moduleInfo = that.loadDeclarationForModule(moduleName);
+ normalizeDeclaration(moduleInfo[moduleName]);
+ that.moduleJSFileTable[moduleName] = moduleInfo[moduleName].files;
+ var moduleDependencies = moduleInfo[moduleName].dependencies;
+ logDependencies(moduleName, moduleDependencies);
+
+ for (var i = 0; i < moduleDependencies.length; i++) {
+ assembleDependencyList(that, moduleDependencies[i], prefixStr + " ");
+ }
+
+ if (!isDependencyIncluded(moduleName, that.excludedModules)) {
+ that.requiredModules.push(moduleName);
+ }
+ };
+
+ /**
+ * Returns a comma delimited list of paths, including the specified directory, for the files related to the moduleName passed in.
+ *
+ * @param {Object} moduleName
+ * @param {Object} moduleFileTable
+ * @param {Object} dir
+ */
+ var pathsForModuleFiles = function (moduleName, moduleFileTable, dir) {
+ var pathsStr = "";
+ var filesForModule = moduleFileTable[moduleName];
+ for (var i = 0; i < filesForModule.length; i++) {
+ var path = modulePath(moduleName) + File.separator + dir + File.separator;
+ pathsStr += path + filesForModule[i] + ",";
+ }
+
+ return pathsStr;
+ };
+
+ /**
+ * Returns the list of all the files required (from requiredModules), as a comma delimited string.
+ * These files are scoped to the moduleFileTable passed, and the paths contain the directory specified.
+ *
+ * @param {Object} moduleFileTable
+ * @param {Object} dir
+ */
+ var getAllRequiredFiles = function (requiredModules, moduleFileTable, dir) {
+ var fileStr = "";
+ for (var i = 0; i < requiredModules.length; i++) {
+ var currentModule = requiredModules[i];
+ fileStr += pathsForModuleFiles(currentModule, moduleFileTable, dir);
+ }
+
+ logVerbose("*** All required files: " + fileStr);
+ return fileStr;
+ };
+
+ /**
+ * Builds up the regular expression to find the requiredModules from the moduleFileTable
+ *
+ * @param {Object} regExpStart
+ * @param {Object} regExpEnd
+ * @param {Object} requiredModules
+ * @param {Object} moduleFileTable
+ */
+ var buildRegExpression = function (regExpStart, regExpEnd, requiredModules, moduleFileTable) {
+ var regStart = regExpStart;
+ var regEnd = regExpEnd;
+ var regExpStr = "";
+ var convertedStr = "";
+ for (var i = 0; i < requiredModules.length; i++) {
+ var currentModule = requiredModules[i];
+ var currentFiles = moduleFileTable[currentModule];
+
+ for (var j = 0; j < currentFiles.length; j++) {
+ if (regExpStr) {
+ regExpStr += "|";
+ }
+ convertedStr = currentFiles[j].replace(/\./g, "\\."); //this is to escape the "." character which is a wildcard in ant regex.
+ regExpStr += (regStart + convertedStr + regEnd);
+ }
+ }
+ return regExpStr;
+ };
+
+ /**
+ * Resolves dependencies for the modules passed in.
+ * Uses the module properties from build.properties to find the dependency declarations for a module.
+ *
+ * @param {Array} modulesToInclude
+ * @param {Array} modulesToExclude
+ */
+ fluid.dependencyResolver = function (modulesToInclude, modulesToExclude) {
+ var that = {
+ requiredModules: [], // A list of modules to be included in dependency order
+ moduleJSFileTable: {}, // A map of the files related to modules
+ excludedModules: modulesToExclude
+ };
+
+ var resolve = function () {
+ for (var i = 0; i < modulesToInclude.length; i++) {
+ assembleDependencyList(that, modulesToInclude[i], " ");
+ }
+ };
+
+ /**
+ * Returns the list of all required module directories as a comma-delimited string of file selectors.
+ */
+ that.getRequiredDirectories = function () {
+ var dirs = "";
+ for (var i = 0; i < that.requiredModules.length; i++) {
+ dirs += modulePath(that.requiredModules[i]) +
+ File.separator + "**" + File.separator + "*,";
+ }
+
+ logVerbose("*** All required directories: " + dirs);
+ return dirs;
+ };
+
+ /**
+ * Returns the list of all the javascript files required as a comma delimited string.
+ */
+ that.getAllRequiredJSFiles = function () {
+ return getAllRequiredFiles(that.requiredModules, that.moduleJSFileTable, "js");
+ };
+
+ /**
+ * Builds up the regular expression needed to find the files that are included in single js file
+ */
+ that.buildJSRegExpression = function () {
+ var obj = globalObj.project;
+ return buildRegExpression(obj.getProperty("regexStartJS"), obj.getProperty("regexEndJS"), that.requiredModules, that.moduleJSFileTable);
+ };
+
+ /**
+ * Builds up the regular expression needed to find the files that are included in single js file, to replace the first occurence with the single js file
+ */
+ that.buildJSReplaceRegExpression = function () {
+ var obj = globalObj.project;
+ return buildRegExpression(obj.getProperty("replaceRegexStartJS"), obj.getProperty("replaceRegexEndJS"), that.requiredModules, that.moduleJSFileTable);
+ };
+
+ /**
+ * Fetches the dependency declaration for the given module name from the file system,
+ * parsing it into an object from JSON data.
+ *
+ * @param {String} the name of the module
+ * @return {Object} a dependency declaration object
+ */
+ that.loadDeclarationForModule = function (moduleName) {
+ var fullModulePath = globalObj.src + File.separator + modulePath(moduleName) +
+ File.separator + moduleName + "Dependencies.json";
+ logVerbose("Declaration file full path: " + fullModulePath);
+
+ var moduleInfo = "";
+ var rdr = new BufferedReader(new FileReader(new File(fullModulePath)));
+ var line = rdr.readLine();
+ while (line !== null) {
+ moduleInfo += line;
+ line = rdr.readLine();
+ }
+
+ logDebug("Unparsed JSON: " + moduleInfo);
+ return JSON.parse(moduleInfo);
+ };
+
+ resolve();
+ return that;
+ };
+
+ /**
+ * Kicks off dependency resolution
+ * Results in setting five ant properties: allRequiredFiles, requiredDirectoriesSelector, jsRegExp, jsReplaceRegExp, and jsfile
+ */
+ var resolveDependenciesFromArguments = function () {
+ var excludedFiles = (typeof(globalObj.exclude) === "undefined") ? [] : parseArgument(globalObj.exclude);
+ logInfo("Excluding modules: " + excludedFiles);
+
+ var resolver = fluid.dependencyResolver(parseModulesToInclude(globalObj.include), excludedFiles);
+
+ var jsFile = jsFileName(globalObj.jsfilename, globalObj.include, globalObj.exclude);
+
+ setProperty("allRequiredJSFiles", resolver.getAllRequiredJSFiles(resolver.moduleJSFileTable));
+ setProperty("requiredDirectoriesSelector", resolver.getRequiredDirectories());
+ setProperty("jsRegExp", resolver.buildJSRegExpression());
+ setProperty("jsReplaceRegExp", resolver.buildJSReplaceRegExpression());
+ setProperty("jsfile", jsFile);
+ };
+
+ // Run this immediately.
+ resolveDependenciesFromArguments();
+})();
80 build-scripts/build.properties
@@ -0,0 +1,80 @@
+<!-- the Fluid version number -->
+fluid_version = 1.2beta1
+
+
+<!-- Module Declaration Locations -->
+<!-- Note that every module must be listed here and the key must be module_{modulename} -->
+<!-- All javascript files related to the modules listed here will be included in the InfusionAll.js file
+ so we should only include the modules we want to ship -->
+
+<!-- Module Groups -->
+group_id=framework
+group_name-framework=Framework Modules
+group_description-framework=The core Infusion modules
+
+group_id=components
+group_name-components=Component Modules
+group_description-components=Fluid Infusion components
+
+group_id=lib
+group_name-lib=Third Party Modules
+group_description-lib=Third party javascript libraries required by Infusion components
+
+<!-- Infusion Framework Modules -->
+module_framework=framework/core
+module_fss=framework/fss
+module_fssReset=framework/fss
+module_fssLayout=framework/fss
+module_fssText=framework/fss
+module_fssThemes=framework/fss
+module_renderer=framework/renderer
+
+<!-- Infusion Component Modules -->
+module_inlineEdit=components/inlineEdit
+module_pager=components/pager
+module_progress=components/progress
+module_reorderer=components/reorderer
+module_tableOfContents=components/tableOfContents
+module_uiOptions=components/uiOptions
+module_undo=components/undo
+module_uploader=components/uploader
+
+<!-- Third Party Modules -->
+module_fastXmlPull=lib/fastXmlPull
+module_json=lib/json
+module_jQuery=lib/jquery/core
+module_jQueryUICore=lib/jquery/ui
+module_jQueryUIWidgets=lib/jquery/ui
+module_jQueryDelegatePlugin=lib/jquery/plugins/delegate
+module_jQueryTooltipPlugin=lib/jquery/plugins/tooltip
+module_jQuerybgiframePlugin=lib/jquery/plugins/bgiframe
+module_swfupload=lib/swfupload
+module_swfobject=lib/swfobject
+
+
+
+<!-- Dependency Locations -->
+yuicompressor=lib/yuicompressor-2.3.3.jar
+jslint=lib/jslint4java-1.1+rhino.jar
+
+
+<!-- Directories to exclude from JSLint validation -->
+excludeFromJSLint=**/lib*/
+
+<!-- set up directory locations -->
+products=${base-dir}/products
+build=${base-dir}/build
+pretreated=${build}/pretreated
+assembled=${build}/assembled
+licenses=${assembled}/licenses
+buildwar=${build}/war
+src=${base-dir}/src/webapp
+working=${build}/working
+web-inf=${base-dir}/src/webapp/WEB-INF
+lint=${src}
+
+<!-- the filename for the package to output -->
+zipfile=infusion-${fluid_version}
+
+<!-- the filename of the war file -->
+warfile=fluid-components-${fluid_version}.war
264 build-scripts/build.xml
@@ -0,0 +1,264 @@
+<project name="Fluid" default="releaseBuilds" basedir=".">
+ <description>
+ Build a distributable package of Fluid Infusion.
+
+ To build a distribution, type: ant
+ To jsLint all source code in the source directory, type: ant validate
+ To jsLint source code within a specific directory, type: ant validate -Dlint="../some/folder"
+ To create a custom build use the customBuild target.
+ Custom build has three optional parameters: 'include', 'exclude', and 'jsfilename'
+ e.g. ant customBuild -Dinclude="uiOptions, inlineEdit" -Dexclude="jQuery" -Djsfilename="MyInfusion.js"
+ To create an unminified package when using the customBuild, builderBuild and releaseBuild targets, use -DnoMinify="true"
+
+ </description>
+
+ <property name="base-dir" location=".." />
+ <property file="build.properties"/>
+ <!-- properties for URL rewriting - these should be moved to the build.properties file -->
+ <property name="regexStartJS" value="&lt;script{1,1}?.*" />
+ <property name="regexEndJS" value="{1,1}?.*script>" />
+ <property name="replaceRegexStartJS" value="[\/-z]*" />
+ <property name="replaceRegexEndJS" value="&quot;" />
+ <property name="fluidRegExp" value="framework/core/js/Fluid.js" />
+
+ <import file="buildutils.xml"/>
+
+ <!-- task definition for JSLint -->
+ <taskdef name="jslint"
+ classname="net.happygiraffe.jslint.ant.JSLintTask"
+ classpath="${jslint}" />
+
+ <target name="cleanExceptPretreat">
+ <delete dir="${assembled}" />
+ <delete dir="${products}" />
+ <delete dir="${buildwar}" />
+ <delete dir="${working}" />
+ </target>
+
+ <target name="cleanExceptProducts">
+ <delete dir="${build}"/>
+ </target>
+
+ <!-- Set up the build directory structure -->
+ <target name="init">
+ <mkdir dir="${products}" />
+ <mkdir dir="${pretreated}" />
+ <mkdir dir="${assembled}" />
+ <mkdir dir="${buildwar}" />
+ <mkdir dir="${licenses}" />
+ </target>
+
+ <!-- Set the pretreat property based on the value of noMinify -->
+ <target name="setPretreat">
+ <condition property="pretreat">
+ <not>
+ <equals arg1="true" arg2="${noMinify}" />
+ </not>
+ </condition>
+ </target>
+
+ <!-- Choose between the src and pretreated directories based on the value of pretreat -->
+ <target name="setSourceDir">
+ <condition property="sourceDir" value="${pretreated}">
+ <equals arg1="true" arg2="${pretreat}" />
+ </condition>
+ <condition property="sourceDir" value="${src}">
+ <not>
+ <equals arg1="true" arg2="${pretreat}" />
+ </not>
+ </condition>
+ </target>
+
+ <!-- This is the setup necessary for minifying the core files -->
+ <target name="copyCoreToWorkingAndSeedPretreated">
+ <copy todir="${working}">
+ <fileset dir="${src}">
+ <include name="components/**/*" />
+ <include name="framework/**/*" />
+ <include name="lib/**/*" />
+ </fileset>
+ </copy>
+
+ <copy todir="${pretreated}">
+ <fileset dir="${src}">
+ <exclude name="components/**/*.js" />
+ <exclude name="components/**/*.css" />
+ <exclude name="framework/**/*.js" />
+ <exclude name="framework/**/*.css" />
+ <exclude name="lib/**/*.js" />
+ <exclude name="lib/**/*.css" />
+ </fileset>
+ </copy>
+ </target>
+
+ <!-- Performs minification of javascript and CSS -->
+ <target name="alwaysMinify" depends="copyCoreToWorkingAndSeedPretreated">
+ <antcall target="minifyJsAndCss">
+ <param name="fromDir" value="${working}" />
+ <param name="toDir" value="${pretreated}" />
+ </antcall>
+ </target>
+
+ <!-- Kicks off minification based on the value of pretreat -->
+ <target name="maybeMinify" if="pretreat">
+ <antcall target="alwaysMinify" />
+ </target>
+
+ <!-- Runs the javascript dependency resolver which sets $jsfile, $requiredDirectoriesSelector, $jsRegExp, $jsReplaceRegExp and $allRequiredJSFiles -->
+ <target name="resolveDependencies">
+ <script language="javascript" src="${base-dir}/build-scripts/build.js" />
+ </target>
+
+ <!-- Assembles the core package -->
+ <target name="assemble" depends="concatJavaScript">
+ <echo> Coping from ${sourceDir} to ${assembled} </echo>
+ <copy todir="${assembled}">
+ <fileset dir="${sourceDir}" includes="${requiredDirectoriesSelector}">
+ <exclude name="**/*LICENSE.txt" />
+ <exclude name="**/*Dependencies.json" />
+ </fileset>
+ </copy>
+ <copy file="${base-dir}/README.txt" todir="${assembled}" />
+ <copy todir="${licenses}" flatten="true">
+ <fileset dir="${base-dir}">
+ <include name="**/*LICENSE.txt" />
+ <exclude name="${build}" />
+ <exclude name="${products}" />
+ </fileset>
+ </copy>
+ </target>
+
+ <!-- Assembles a package that includes demos and tests -->
+ <target name="assembleFull" depends="assemble">
+ <copy todir="${assembled}">
+ <fileset dir="${sourceDir}">
+ <include name="*demos/**" />
+ <include name="tests/**" />
+ </fileset>
+ </copy>
+ </target>
+
+ <target name="copyMavenWARFiles">
+ <copy todir="${buildwar}/src/webapp/WEB-INF" >
+ <fileset dir="${web-inf}"/>
+ </copy>
+
+ <copy todir="${buildwar}">
+ <fileset dir="${base-dir}">
+ <include name="pom.xml" />
+ <include name="project.xml" />
+ <include name="maven.xml" />
+ <include name="project.properties" />
+ </fileset>
+ </copy>
+ </target>
+
+ <!-- Copies the files required to build a war file containing Infusion. -->
+ <target name="copyCoreWARFiles" depends="copyMavenWARFiles">
+ <copy todir="${buildwar}/src/webapp/" >
+ <fileset dir="${assembled}">
+ <include name="components/**/*" />
+ <include name="framework/**/*" />
+ <include name="lib/**/*" />
+ </fileset>
+ </copy>
+ </target>
+
+ <!-- Builds the core Infusion WAR file. -->
+ <target name="buildCoreWAR" depends="copyCoreWARFiles">
+ <antcall target="buildWAR">
+ <param name="fromDir" value="${buildwar}" />
+ <param name="toFile" value="${assembled}/${warfile}" />
+ <param name="warFile" value="${warfile}" />
+ </antcall>
+ </target>
+
+ <!-- Builds a WAR file that includes everything that has been assembled -->
+ <target name="buildFullWAR" depends="copyMavenWARFiles">
+ <copy todir="${buildwar}/src/webapp/" >
+ <fileset dir="${assembled}" />
+ </copy>
+
+ <antcall target="buildWAR">
+ <param name="fromDir" value="${buildwar}" />
+ <param name="toFile" value="${assembled}/${warfile}" />
+ <param name="warFile" value="${warfile}" />
+ </antcall>
+ </target>
+
+ <!-- zips up the assembled package and puts it into the products directory -->
+ <target name="zip">
+ <echo>Zipping bundle to ${products}/${zipfile}</echo>
+ <zip destfile="${products}/${zipfile}.zip" basedir="${assembled}" includes="**/*" excludes="*.zip" />
+ </target>
+
+ <!-- Replaces the first occurence of a file that is in the single js file, with the reference to the single js file.
+ Works on files in the assembled directory -->
+ <target name="replaceJS">
+ <replaceregexp match="${jsReplaceRegExp}" replace="/${jsfile}&quot;" flags="i">
+ <fileset dir="${assembled}" includes="**/*.html" />
+ </replaceregexp>
+ </target>
+
+ <!-- Removes that <script> blocks pertaining to files included in the single js file -->
+ <target name="removeJS" depends="replaceJS">
+ <replaceregexp match="${jsRegExp}" replace="" flags="g">
+ <fileset dir="${assembled}" includes="**/*.html" />
+ </replaceregexp>
+ </target>
+
+
+
+ <!-- Top level targets -->
+
+ <target name="customBuild" depends="clean, init, setPretreat, setSourceDir, maybeMinify, resolveDependencies, assemble, buildCoreWAR, zip"
+ description="Builds a custom package of Infusion containing the modules specified as command line arguments.">
+ </target>
+
+ <target name="pretreatMinify" depends="clean, init, alwaysMinify"
+ description="Minifies everything to prepare for builds done from pretreated source">
+ </target>
+
+ <target name="builderBuild" depends="cleanExceptPretreat, init, setPretreat, setSourceDir, resolveDependencies, assemble, buildCoreWAR, zip"
+ description="Builds a custom package of Infusion containing the modules specified by the builder - expects pretreatMinify to have been run before.">
+ </target>
+
+ <!-- Although we don't have dependencies we use resolveDependencies because it creates a list of all the files to concatenate. -->
+ <target name="dailyBuild" depends="clean, init, setSourceDir, resolveDependencies, assembleFull, buildFullWAR"
+ description="Builds a WAR of Infusion along with tests and sample code, suitable for development testing or a daily build.">
+ <copy file="${assembled}/${warfile}" todir="${products}" />
+ </target>
+
+ <target name="releaseBuild" depends="cleanExceptProducts, init, setPretreat, setSourceDir, maybeMinify, resolveDependencies, assembleFull, buildCoreWAR, zip"
+ description="Builds and packages a release bundle of Infusion"/>
+
+ <target name="releaseBuilds" depends="clean"
+ description="Builds and packages minified and source release bundles of Infusion.">
+ <antcall target="releaseBuild">
+ <param name="noMinify" value="true" />
+ </antcall>
+ <copy file="${products}/${zipfile}.zip" tofile="${products}/${zipfile}-src.zip" />
+ <antcall target="releaseBuild" />
+ </target>
+
+ <target name="infusionAllBuild" depends="releaseBuild, removeJS"
+ description="Builds and packages a release bundle of Infusion which uses InfusionAll.js">
+ <antcall target="zip" />
+ </target>
+
+ <target name="infusionAllBuilds" depends="clean"
+ description="Builds and packages minified and source release bundles of Infusion which use InfusionAll.js">
+ <antcall target="infusionAllBuild">
+ <param name="noMinify" value="true" />
+ </antcall>
+ <copy file="${products}/${zipfile}.zip" tofile="${products}/${zipfile}-src.zip" />
+ <antcall target="infusionAllBuild" />
+ </target>
+
+ <target name="validate" description="Validates all JavaScript files using JSLint. To lint a specific folder use: -Dlint=../some/folder" >
+ <echo>Validating .JS files...</echo>
+ <jslint dir="${lint}" excludes="${excludeFromJSLint}" options="browser,eqeqeq,nomen,undef">
+ </jslint>
+ </target>
+
+</project>
88 build-scripts/buildutils.xml
@@ -0,0 +1,88 @@
+<project name="FluidBuildUtils">
+ <description>
+ Utilities used by the Infusion and Engage builds
+ </description>
+
+
+ <target name="clean" description="Cleans up all build-related artifacts and products.">
+ <delete dir="${build}" />
+ <delete dir="${products}" />
+ </target>
+
+ <target name="buildWAR" description="Builds a WAR file using maven given 3 parameters. toFile: the full path to the warfile to be created; fromDir: the directory containing the content to be placed in the war; warFile: the name of the warfile that is created from the maven task">
+ <condition property="isWindows">
+ <os family="windows" />
+ </condition>
+ <antcall target="invokeMavenForWAR" />
+ <antcall target="invokeMavenForWARWindows" />
+ <echo>Copying war file ...</echo>
+ <copy tofile="${toFile}" file="${fromDir}/target/${warFile}" />
+ </target>
+
+ <!-- Uses maven to create a WAR file on a non-Windows operating system. Expects 'fromDir' to be set. -->
+ <target name="invokeMavenForWAR" unless="isWindows">
+ <echo>Building war file... ${fromDir} </echo>
+ <apply executable="mvn" dir="${fromDir}" parallel="true">
+ <fileset dir=".">
+ <include name="pom.xml"/>
+ </fileset>
+ <arg value="install" />
+ </apply>
+ </target>
+
+ <!-- Uses maven to create a WAR file on a Windows operating system. Expects 'fromDir' to be set. -->
+ <target name="invokeMavenForWARWindows" if="isWindows">
+ <apply executable="cmd" dir="${fromDir}" parallel="true" vmlauncher="false">
+ <fileset dir=".">
+ <include name="pom.xml"/>
+ </fileset>
+ <arg value="/c mvn.bat install" />
+ </apply>
+ </target>
+
+ <!-- Expects toDir, fromDir, filePattern, lineBreakArg to be set -->
+ <target name="minify">
+ <echo> Going to minify from ${fromDir} to ${toDir} including ${filePattern} </echo>
+ <apply executable="java" dest="${toDir}" parallel="false">
+ <!-- The files to act upon. -->
+ <fileset dir="${fromDir}" casesensitive="no">
+ <include name="**/${filePattern}" />
+ <exclude name="**/test/*" />
+ </fileset>
+
+ <arg line="-jar" />
+ <arg path="${yuicompressor}" />
+ <srcfile/>
+ <arg line="--nomunge" />
+ <!-- -o option for YUI Compressor to output minified JS to a file instead of stdout. -->
+ <arg line="${lineBreakArg}" />
+ <arg line="--charset UTF-8" />
+ <arg line="-o" />
+ <mapper type="glob" from="${filePattern}" to="${filePattern}" />
+ <targetfile />
+ </apply>
+ </target>
+
+ <!-- Minifies javascript and css files. Expects fromDir and toDir to be set -->
+ <target name="minifyJsAndCss">
+ <echo>Minifying .JS files...</echo>
+ <antcall target="minify">
+ <param name="filePattern" value="*.js" />
+ <param name="lineBreakArg" value="" />
+ </antcall>
+
+ <antcall target="minify">
+ <param name="filePattern" value="*.css" />
+ <param name="lineBreakArg" value="--line-break 0" />
+ </antcall>
+ </target>
+
+ <!-- This target should be changed to use better named properties -->
+ <target name="concatJavaScript">
+ <echo> concat the javascript from ${sourceDir} </echo>
+ <concat destfile="${assembled}/${jsfile}" encoding="UTF-8" >
+ <filelist dir="${sourceDir}" files="${allRequiredJSFiles}" />
+ </concat>
+ </target>
+
+</project>
BIN  build-scripts/lib/jslint4java-1.1+rhino.jar
Binary file not shown
BIN  build-scripts/lib/yuicompressor-2.3.3.jar
Binary file not shown
46 maven.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- default goal for the project builds and installs the war in the local repository -->
+<project default="full" xmlns:j="jelly:core"
+ xmlns:maven="jelly:maven">
+
+ <!-- the common "full" goal invokes the default goal. Used in maven -Dgoal=full multiproject:goal from .. -->
+ <goal name="full">
+ <!--attainGoal name="dependencies" /-->
+ <attainGoal name="war:install" />
+ </goal>
+
+ <!-- Override jar:install goal to compose "partial WAR" strategy -->
+ <goal name="jar:install">
+ <attainGoal name="war:install"/>
+ </goal>
+
+<!-- This standard stanza is required for any webapps participating in the
+ "partial WAR" build strategy -->
+ <preGoal name="war:resources">
+ <echo>Expanding webapp dependencies</echo>
+
+ <mkdir dir="${maven.war.webapp.dir}" />
+ <j:forEach var="lib" items="${pom.artifacts}">
+ <j:set var="dep" value="${lib.dependency}" />
+ <j:if test="${dep.getProperty('explode') == 'true'}">
+ <j:if test="${dep.type =='war'}">
+ <unjar src="${lib.path}" dest="${maven.war.webapp.dir}" />
+ </j:if>
+ </j:if>
+ </j:forEach>
+ </preGoal>
+
+<!-- Do not deploy for now, will be folded into each deployed user
+ <goal name="deploy" prereqs="war:install">
+ <maven:property defaultValue="${pom.artifactId}" var="webappName"
+ name="deploy.webappname" />
+ <j:set var="destination"
+ value="${maven.tomcat.home}/webapps/${webappName}" />
+ <delete dir="${destination}"/>
+ <echo>Copying ${maven.war.build.dir}/${maven.war.final.name} to ${destination}.war</echo>
+ <copy file="${maven.war.build.dir}/${maven.war.final.name}"
+ tofile="${destination}.war"/>
+ </goal>
+-->
+</project>
32 pom.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+ http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <artifactId>fluid-components</artifactId>
+ <groupId>org.fluidproject</groupId>
+ <version>1.2beta1</version>
+
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+
+ <organization>
+ <name>Fluid Project</name>
+ <url>http://fluidproject.org</url>
+ </organization>
+ <inceptionYear>2007</inceptionYear>
+ <packaging>war</packaging>
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-war-plugin</artifactId>
+ <configuration>
+ <warSourceDirectory>src/webapp</warSourceDirectory>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
3  project.properties
@@ -0,0 +1,3 @@
+
+deploy.webappname=fluid-components
+
36 project.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <pomVersion>3</pomVersion>
+ <artifactId>fluid-components</artifactId>
+ <name>Fluid Infusion</name>
+ <groupId>org.fluidproject</groupId>
+ <currentVersion>1.2beta1</currentVersion>
+ <organization>
+ <name>Fluid Project</name>
+ <url>http://fluidproject.org</url>
+ </organization>
+ <inceptionYear>2007</inceptionYear>
+ <properties>
+ <!-- This project is NOT REALLY a JAR, but we want it not to deploy
+ to the server when invoked as a byproduct of a Sakai build. -->
+ <deploy.type>jar</deploy.type>
+ </properties>
+ <description>
+ Fluid Components package, packaged for a standard Servlet environment.
+ </description>
+ <dependencies>
+ </dependencies>
+ <repository>
+ <connection>scm:svn:https://source.sakaiproject.org/contrib/utoronto/fluid/components/trunk</connection>
+ </repository>
+ <build>
+ <sourceDirectory>src/java</sourceDirectory>
+ <unitTestSourceDirectory>src/test</unitTestSourceDirectory>
+ <unitTest>
+ <includes>
+ <include>**/*Test.java</include>
+ </includes>
+ </unitTest>
+ </build>
+</project>
+
8 src/webapp/WEB-INF/web.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<!DOCTYPE web-app PUBLIC
+ "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+ "http://java.sun.com/dtd/web-app_2_3.dtd">
+<web-app>
+<!-- This empty web.xml is required by the darn Maven 2 war plugin - it should
+never appear in an application -->
+</web-app>
33 src/webapp/components/inlineEdit/css/InlineEdit.css
@@ -0,0 +1,33 @@
+.fl-inlineEdit-edit {margin:-2px; padding:0;}
+
+
+/* Base Appearance & States Appearance */
+.fl-inlineEdit-tooltip {
+ position : absolute;
+ background : #CCC;
+ border : 1px solid #999;
+ font : normal 75% sans-serif;
+ padding : 3px 5px;
+}
+
+/* :hover */
+.fl-inlineEdit-invitation {
+ border : 1px solid #999;
+ background : lightyellow;
+ cursor : pointer;
+ /*margin : -1px;*/
+}
+
+.fl-inlineEdit-richText-invitation {
+ background : lightyellow;
+ cursor : pointer;
+}
+
+/* :focus */
+.fl-inlineEdit-focus{
+
+}
+
+
+/* Themed Appearance + Themed States */
+
7 src/webapp/components/inlineEdit/inlineEditDependencies.json
@@ -0,0 +1,7 @@
+{"inlineEdit": {
+ "name": "Inline Edit",
+ "description": "Edit text without changing context.",
+ "cssFiles": "InlineEdit.css",
+ "files": ["InlineEdit.js", "InlineEditIntegrations.js"],
+ "dependencies": ["jQuery", "jQueryUICore", "jQueryTooltipPlugin", "framework", "undo"]
+}}
684 src/webapp/components/inlineEdit/js/InlineEdit.js
@@ -0,0 +1,684 @@
+/*
+Copyright 2008-2009 University of Cambridge
+Copyright 2008-2009 University of Toronto
+Copyright 2008-2009 University of California, Berkeley
+
+Licensed under the Educational Community License (ECL), Version 2.0 or the New
+BSD license. You may not use this file except in compliance with one these
+Licenses.
+
+You may obtain a copy of the ECL 2.0 License and BSD License at
+https://source.fluidproject.org/svn/LICENSE.txt
+*/
+
+/*global jQuery*/
+/*global fluid_1_2*/
+
+fluid_1_2 = fluid_1_2 || {};
+
+(function ($, fluid) {
+
+ function sendKey(control, event, virtualCode, charCode) {
+ var kE = document.createEvent("KeyEvents");
+ kE.initKeyEvent(event, 1, 1, null, 0, 0, 0, 0, virtualCode, charCode);
+ control.dispatchEvent(kE);
+ }
+
+ /** Set the caret position to the end of a text field's value, also taking care
+ * to scroll the field so that this position is visible.
+ * @param {DOM node} control The control to be scrolled (input, or possibly textarea)
+ * @param value The current value of the control
+ */
+ fluid.setCaretToEnd = function (control, value) {
+ var pos = value? value.length : 0;
+
+ try {
+ control.focus();
+ // see http://www.quirksmode.org/dom/range_intro.html - in Opera, must detect setSelectionRange first,
+ // since its support for Microsoft TextRange is buggy
+ if (control.setSelectionRange) {
+
+ control.setSelectionRange(pos, pos);
+ if ($.browser.mozilla && pos > 0) {
+ // ludicrous fix for Firefox failure to scroll to selection position, inspired by
+ // http://bytes.com/forum/thread496726.html
+ sendKey(control, "keypress", 92, 92); // type in a junk character
+ sendKey(control, "keydown", 8, 0); // delete key must be dispatched exactly like this
+ sendKey(control, "keypress", 8, 0);
+ }
+ }
+
+ else if (control.createTextRange) {
+ var range = control.createTextRange();
+ range.move("character", pos);
+ range.select();
+ }
+ }
+ catch (e) {}
+ };
+
+ fluid.deadMansBlur = function (control, exclusions, handler) {
+ var blurPending = false;
+ $(control).blur(function () {
+ blurPending = true;
+ setTimeout(function () {
+ if (blurPending) {
+ handler(control);
+ }
+ }, 150);
+ });
+ var canceller = function () {blurPending = false; };
+ exclusions.focus(canceller);
+ exclusions.click(canceller);
+ };
+
+ var renderEditContainer = function (that, really) {
+ // If an edit container is found in the markup, use it. Otherwise generate one based on the view text.
+ that.editContainer = that.locate("editContainer");
+ that.editField = that.locate("edit");
+ if (that.editContainer.length !== 1) {
+ if (that.editField.length === 1) {
+ // if all the same we found a unique edit field, use it as both container and field (FLUID-844)
+ that.editContainer = that.editField;
+ }
+ else if (that.editContainer.length > 1) {
+ fluid.fail("InlineEdit did not find a unique container for selector " + that.options.selectors.editContainer +
+ ": " + fluid.dumpEl(that.editContainer));
+ }
+ }
+ if (that.editContainer.length === 1 && !that.editField) {
+ that.editField = that.locate("edit", that.editContainer);
+ }
+ if (!really) {return; } // do not invoke the renderer, unless this is the "final" effective time
+ var editElms = that.options.editModeRenderer(that);
+ if (editElms) {
+ that.editContainer = editElms.container;
+ that.editField = editElms.field;
+ }
+
+ if (that.editField.length === 0) {
+ fluid.fail("InlineEdit improperly initialised - editField could not be located (selector " + that.options.selectors.edit + ")");
+ }
+ };
+
+ var switchToViewMode = function (that) {
+ that.editContainer.hide();
+ that.viewEl.show();
+ };
+
+ var cancel = function (that) {
+ if (that.isEditing()) {
+ // Roll the edit field back to its old value and close it up.
+ // This setTimeout is necessary on Firefox, since any attempt to modify the
+ // input control value during the stack processing the ESCAPE key will be ignored.
+ setTimeout(function() {
+ that.editView.value(that.model.value)}, 1);
+ switchToViewMode(that);
+ that.events.afterFinishEdit.fire(that.model.value, that.model.value,
+ that.editField[0], that.viewEl[0]);
+ }
+ };
+
+ var finish = function (that) {
+ var newValue = that.editView.value();
+ var oldValue = that.model.value;
+
+ var viewNode = that.viewEl[0];
+ var editNode = that.editField[0];
+ var ret = that.events.onFinishEdit.fire(newValue, oldValue, editNode, viewNode);
+ if (ret === false) {
+ return;
+ }
+
+ that.updateModelValue(newValue);
+ that.events.afterFinishEdit.fire(newValue, oldValue, editNode, viewNode);
+
+ switchToViewMode(that);
+ };
+
+ var bindEditFinish = function (that) {
+ if (that.options.submitOnEnter === undefined) {
+ that.options.submitOnEnter = "textarea" !== fluid.unwrap(that.editField).nodeName.toLowerCase();
+ }
+ function keyCode(evt) {
+ // Fix for handling arrow key presses. See FLUID-760.
+ return evt.keyCode ? evt.keyCode : (evt.which ? evt.which : 0);
+ }
+ var escHandler = function (evt) {
+ var code = keyCode(evt);
+ if (code === $.ui.keyCode.ESCAPE) {
+ cancel(that);
+ return false;
+ }
+ };
+ var finishHandler = function (evt) {
+ var code = keyCode(evt);
+ if (code !== $.ui.keyCode.ENTER) {
+ return true;
+ }
+
+ finish(that);
+ that.viewEl.focus(); // Moved here from inside "finish" to fix FLUID-857
+ return false;
+ };
+ if (that.options.submitOnEnter) {
+ that.editContainer.keypress(finishHandler);
+ }
+ that.editContainer.keydown(escHandler);
+ };
+
+ var bindBlurHandler = function (that) {
+ if (that.options.blurHandlerBinder) {
+ that.options.blurHandlerBinder(that);
+ }
+ else {
+ var blurHandler = function (evt) {
+ if (that.isEditing()) {
+ finish(that);
+ }
+ return false;
+ };
+ that.editField.blur(blurHandler);
+ }
+ };
+
+ var initializeEditView = function (that, initial) {
+ if (!that.editInitialized) {
+ renderEditContainer(that, !that.options.lazyEditView || !initial);
+ if (!that.options.lazyEditView || !initial) {
+ that.editView = fluid.initSubcomponent(that, "editView", that.editField);
+
+ $.extend(true, that.editView, fluid.initSubcomponent(that, "editAccessor", that.editField));
+
+ bindEditFinish(that);
+ bindBlurHandler(that);
+ that.editView.refreshView(that);
+
+ that.editInitialized = true;
+ }
+ }
+ };
+
+ var edit = function (that) {
+ initializeEditView(that, false);
+
+ var viewEl = that.viewEl;
+ var displayText = that.displayView.value();
+ that.updateModelValue(that.model.value === "" ? "" : displayText);
+ if (that.options.applyEditPadding) {
+ that.editField.width(Math.max(viewEl.width() + that.options.paddings.edit, that.options.paddings.minimumEdit));
+ }
+
+ viewEl.removeClass(that.options.styles.invitation);
+ viewEl.removeClass(that.options.styles.focus);
+ viewEl.hide();
+ that.editContainer.show();
+ if (that.tooltipEnabled()) {
+ $("#" + that.options.tooltipId).hide();
+ }
+
+ // Work around for FLUID-726
+ // Without 'setTimeout' the finish handler gets called with the event and the edit field is inactivated.
+ setTimeout(function () {
+ that.editField.focus();
+ fluid.setCaretToEnd(that.editField[0], that.editView.value());
+ if (that.options.selectOnEdit) {
+ that.editField[0].select();
+ }
+ }, 0);
+ that.events.afterBeginEdit.fire();
+ };
+
+ var clearEmptyViewStyles = function (textEl, defaultViewStyle, originalViewPadding) {
+ textEl.removeClass(defaultViewStyle);
+ textEl.css('padding-right', originalViewPadding);
+ };
+
+ var showDefaultViewText = function (that) {
+ that.displayView.value(that.options.defaultViewText);
+ that.viewEl.css('padding-right', that.existingPadding);
+ that.viewEl.addClass(that.options.styles.defaultViewStyle);
+ };
+
+ var showNothing = function (that) {
+ that.displayView.value("");
+
+ // workaround for FLUID-938:
+ // IE can not style an empty inline element, so force element to be display: inline-block
+ if ($.browser.msie) {
+ if (that.viewEl.css('display') === 'inline') {
+ that.viewEl.css('display', "inline-block");
+ }
+ }
+ };
+
+ var showEditedText = function (that) {
+ that.displayView.value(that.model.value);
+ clearEmptyViewStyles(that.viewEl, that.options.styles.defaultViewStyle, that.existingPadding);
+ };
+
+ var refreshView = function (that, source) {
+ that.displayView.refreshView(that, source);
+ if (that.editView) {
+ that.editView.refreshView(that, source);
+ }
+ };
+
+ var initModel = function (that, value) {
+ that.model.value = value;
+ that.refreshView();
+ };
+
+ var updateModelValue = function (that, newValue, source) {
+ var comparator = that.options.modelComparator;
+ var unchanged = comparator? comparator(that.model.value, newValue) :
+ that.model.value === newValue;
+ if (!unchanged) {
+ var oldModel = $.extend(true, {}, that.model);
+ that.model.value = newValue;
+ that.events.modelChanged.fire(that.model, oldModel, source);
+ that.refreshView(source);
+ }
+ };
+
+ var bindHoverHandlers = function (viewEl, invitationStyle) {
+ var over = function (evt) {
+ viewEl.addClass(invitationStyle);
+ };
+ var out = function (evt) {
+ viewEl.removeClass(invitationStyle);
+ };
+
+ viewEl.hover(over, out);
+ };
+
+ var makeEditHandler = function (that) {
+ return function () {
+ var prevent = that.events.onBeginEdit.fire();
+ if (prevent === false) {
+ return false;
+ }
+ edit(that);
+
+ return true;
+ };
+ };
+
+ function makeEditTriggerGuard(that) {
+ var viewEl = fluid.unwrap(that.viewEl);
+ return function (event) {
+ // FLUID-2017 - avoid triggering edit mode when operating standard HTML controls. Ultimately this
+ // might need to be extensible, in more complex authouring scenarios.
+ var outer = fluid.findAncestor(event.target, function (elem) {
+ if (/input|select|textarea|button|a/i.test(elem.nodeName) || elem === viewEl) {return true; }
+ });
+ if (outer === viewEl) {
+ that.edit();
+ return false;
+ }
+ };
+ }
+
+ var bindMouseHandlers = function (that) {
+ bindHoverHandlers(that.viewEl, that.options.styles.invitation);
+ that.viewEl.click(makeEditTriggerGuard(that));
+ };
+
+ var bindHighlightHandler = function (viewEl, focusStyle, invitationStyle) {
+ var focusOn = function () {
+ viewEl.addClass(focusStyle);
+ viewEl.addClass(invitationStyle);
+ };
+ var focusOff = function () {
+ viewEl.removeClass(focusStyle);
+ viewEl.removeClass(invitationStyle);
+ };
+ viewEl.focus(focusOn);
+ viewEl.blur(focusOff);
+ };
+
+ var bindKeyboardHandlers = function (that) {
+ fluid.tabbable(that.viewEl);
+ var guard = makeEditTriggerGuard(that);
+ fluid.activatable(that.viewEl,
+ function (event) {
+ return guard(event);
+ });
+ };
+
+ var aria = function (viewEl, editContainer) {
+ viewEl.attr("role", "button");
+ };
+
+ var defaultEditModeRenderer = function (that) {
+ if (that.editContainer.length > 0 && that.editField.length > 0) {
+ return {
+ container: that.editContainer,
+ field: that.editField
+ };
+ }
+ // Template strings.
+ var editModeTemplate = "<span><input type='text' class='flc-inlineEdit-edit fl-inlineEdit-edit'/></span>";
+
+ // Create the edit container and pull out the textfield.
+ var editContainer = $(editModeTemplate);
+ var editField = $("input", editContainer);
+
+ var componentContainerId = that.container.attr("id");
+ // Give the container and textfield a reasonable set of ids if necessary.
+ if (componentContainerId) {
+ var editContainerId = componentContainerId + "-edit-container";
+ var editFieldId = componentContainerId + "-edit";
+ editContainer.attr("id", editContainerId);
+ editField.attr("id", editFieldId);
+ }
+
+ // Inject it into the DOM.
+ that.viewEl.after(editContainer);
+
+ // Package up the container and field for the component.
+ return {
+ container: editContainer,
+ field: editField
+ };
+ };
+
+ var makeIsEditing = function (that) {
+ var isEditing = false;
+ that.events.onBeginEdit.addListener(function () {isEditing = true; });
+ that.events.afterFinishEdit.addListener(function () {isEditing = false; });
+ return function () {return isEditing; };
+ };
+
+ var setupInlineEdit = function (componentContainer, that) {
+ var padding = that.viewEl.css("padding-right");
+ that.existingPadding = padding? parseFloat(padding) : 0;
+ initModel(that, that.displayView.value());
+
+ // Add event handlers.
+ bindMouseHandlers(that);
+ bindKeyboardHandlers(that);
+
+ bindHighlightHandler(that.viewEl, that.options.styles.focus, that.options.styles.invitation);
+
+ // Add ARIA support.
+ aria(that.viewEl);
+
+ // Hide the edit container to start
+ if (that.editContainer) {
+ that.editContainer.hide();
+ }
+
+ // Initialize the tooltip once the document is ready.
+ // For more details, see http://issues.fluidproject.org/browse/FLUID-1030
+ var initTooltip = function () {
+ // Add tooltip handler if required and available
+ if (that.tooltipEnabled()) {
+ that.viewEl.tooltip({
+ delay: that.options.tooltipDelay,
+ extraClass: that.options.styles.tooltip,
+ bodyHandler: function () {
+ return that.options.tooltipText;
+ },
+ id: that.options.tooltipId
+ });
+ }
+ };
+ $(initTooltip);
+
+ // Setup any registered decorators for the component.
+ that.decorators = fluid.initSubcomponents(that, "componentDecorators",
+ [that, fluid.COMPONENT_OPTIONS]);
+ };
+
+ /**
+ * Creates a whole list of inline editors.
+ */
+ var setupInlineEdits = function (editables, options) {
+ var editors = [];
+ editables.each(function (idx, editable) {
+ editors.push(fluid.inlineEdit($(editable), options));
+ });
+
+ return editors;
+ };
+
+ /**
+ * Instantiates a new Inline Edit component
+ *
+ * @param {Object} componentContainer a selector, jquery, or a dom element representing the component's container
+ * @param {Object} options a collection of options settings
+ */
+ fluid.inlineEdit = function (componentContainer, userOptions) {
+ var that = fluid.initView("inlineEdit", componentContainer, userOptions);
+
+ that.viewEl = that.locate("text");
+ that.displayView = fluid.initSubcomponent(that, "displayView", that.viewEl);
+ $.extend(true, that.displayView, fluid.initSubcomponent(that, "displayAccessor", that.viewEl));
+
+ /**
+ * The current value of the inline editable text. The "model" in MVC terms.
+ */
+ that.model = {value: ""};
+
+ /**
+ * Switches to edit mode.
+ */
+ that.edit = makeEditHandler(that);
+
+ /**
+ * Determines if the component is currently in edit mode.
+ *
+ * @return true if edit mode shown, false if view mode is shown
+ */
+ that.isEditing = makeIsEditing(that);
+
+ /**
+ * Finishes editing, switching back to view mode.
+ */
+ that.finish = function () {
+ finish(that);
+ };
+
+ /**
+ * Cancels the in-progress edit and switches back to view mode.
+ */
+ that.cancel = function () {
+ cancel(that);
+ };
+
+ /**
+ * Determines if the tooltip feature is enabled.
+ *
+ * @return true if the tooltip feature is turned on, false if not
+ */
+ that.tooltipEnabled = function () {
+ return that.options.useTooltip && $.fn.tooltip;
+ };
+
+ /**
+ * Updates the state of the inline editor in the DOM, based on changes that may have
+ * happened to the model.
+ *
+ * @param {Object} source
+ */
+ that.refreshView = function (source) {
+ refreshView(that, source);
+ };
+
+ /**
+ * Pushes external changes to the model into the inline editor, refreshing its
+ * rendering in the DOM. The modelChanged event will fire.
+ *
+ * @param {String} newValue The bare value of the model, that is, the string being edited
+ * @param {Object} source An optional "source" (perhaps a DOM element) which triggered this event
+ */
+ that.updateModelValue = function (newValue, source) {
+ updateModelValue(that, newValue, source);
+ };
+
+ /**
+ * Pushes external changes to the model into the inline editor, refreshing its
+ * rendering in the DOM. The modelChanged event will fire.
+ *
+ * @param {Object} newValue The full value of the new model, that is, a model object which contains the editable value as the element named "value"
+ * @param {Object} source An optional "source" (perhaps a DOM element) which triggered this event
+ */
+ that.updateModel = function (newModel, source) {
+ updateModelValue(that, newModel.value, source);
+ };
+
+ initializeEditView(that, true);
+ setupInlineEdit(componentContainer, that);
+ return that;
+ };
+
+
+ fluid.inlineEdit.standardAccessor = function (element) {
+ var nodeName = element.nodeName.toLowerCase();
+ var func = "input" === nodeName || "textarea" === nodeName? "val" : "text";
+ return {
+ value: function (newValue) {
+ return $(element)[func](newValue);
+ }
+ };
+ };
+
+ fluid.inlineEdit.richTextViewAccessor = function (element) {
+ return {
+ value: function (newValue) {
+ return $(element).html(newValue);
+ }
+ };
+ };
+
+ fluid.inlineEdit.standardDisplayView = function (viewEl) {
+ var that = {
+ refreshView: function (componentThat, source) {
+ if (componentThat.model.value) {
+ showEditedText(componentThat);
+ } else if (componentThat.options.defaultViewText) {
+ showDefaultViewText(componentThat);
+ } else {
+ showNothing(componentThat);
+ }
+ // If necessary, pad the view element enough that it will be evident to the user.
+ if (($.trim(componentThat.viewEl.text()).length === 0) &&
+ (componentThat.existingPadding < componentThat.options.paddings.minimumView)) {
+ componentThat.viewEl.css('padding-right', componentThat.options.paddings.minimumView);
+ }
+ }
+ };
+ return that;
+ };
+
+ fluid.inlineEdit.standardEditView = function (editField) {
+ var that = {
+ refreshView: function (componentThat, source) {
+ if (!source || componentThat.editField && componentThat.editField.index(source) === -1) {
+ componentThat.editView.value(componentThat.model.value);
+ }
+ }
+ };
+ $.extend(true, that, fluid.inlineEdit.standardAccessor(editField));
+ return that;
+ };
+
+ /**
+ * Instantiates a list of InlineEdit components.
+ *
+ * @param {Object} componentContainer the element containing the inline editors
+ * @param {Object} options configuration options for the components
+ */
+ fluid.inlineEdits = function (componentContainer, options) {
+ options = options || {};
+ var selectors = $.extend({}, fluid.defaults("inlineEdits").selectors, options.selectors);
+
+ // Bind to the DOM.
+ var container = fluid.container(componentContainer);
+ var editables = $(selectors.editables, container);
+
+ return setupInlineEdits(editables, options);
+ };
+
+ fluid.defaults("inlineEdit", {
+ selectors: {
+ text: ".flc-inlineEdit-text",
+ editContainer: ".flc-inlineEdit-editContainer",
+ edit: ".flc-inlineEdit-edit"
+ },
+
+ styles: {
+ text: "fl-inlineEdit-text",
+ edit: "fl-inlineEdit-edit",
+ invitation: "fl-inlineEdit-invitation",
+ defaultViewStyle: "fl-inlineEdit-invitation-text",
+ tooltip: "fl-inlineEdit-tooltip",
+ focus: "fl-inlineEdit-focus"
+ },
+
+ events: {
+ modelChanged: null,
+ onBeginEdit: "preventable",
+ afterBeginEdit: null,
+ onFinishEdit: "preventable",
+ afterFinishEdit: null,
+ afterInitEdit: null
+ },
+
+ paddings: {
+ edit: 10,
+ minimumEdit: 80,
+ minimumView: 60
+ },
+
+ applyEditPadding: true,
+
+ blurHandlerBinder: null,
+ // set this to true or false to cause unconditional submission, otherwise it will
+ // be inferred from the edit element tag type.
+ submitOnEnter: undefined,
+
+ modelComparator: null,
+
+ displayAccessor: {
+ type: "fluid.inlineEdit.standardAccessor"
+ },
+
+ displayView: {
+ type: "fluid.inlineEdit.standardDisplayView"
+ },
+
+ editAccessor: {
+ type: "fluid.inlineEdit.standardAccessor"
+ },
+
+ editView: {
+ type: "fluid.inlineEdit.standardEditView"
+ },
+
+ editModeRenderer: defaultEditModeRenderer,
+
+ lazyEditView: false,
+
+ defaultViewText: "Click here to edit",
+
+ tooltipText: "Click item to edit",
+
+ tooltipId: "tooltip",
+
+ useTooltip: false,
+
+ tooltipDelay: 1000,
+
+ selectOnEdit: false
+ });
+
+