platform 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (480) hide show
  1. data/.gitignore +21 -0
  2. data/.rspec +2 -0
  3. data/Gemfile +14 -0
  4. data/Gemfile.lock +191 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.rdoc +5 -0
  7. data/Rakefile +37 -0
  8. data/app/assets/images/platform/.gitkeep +0 -0
  9. data/app/assets/images/platform/accept.png +0 -0
  10. data/app/assets/images/platform/action_tab_bkgd.gif +0 -0
  11. data/app/assets/images/platform/action_tab_white_bkgd.gif +0 -0
  12. data/app/assets/images/platform/add.png +0 -0
  13. data/app/assets/images/platform/apps/app_icon.gif +0 -0
  14. data/app/assets/images/platform/apps/app_logo.gif +0 -0
  15. data/app/assets/images/platform/arrow_down.gif +0 -0
  16. data/app/assets/images/platform/arrow_down.png +0 -0
  17. data/app/assets/images/platform/arrow_down_grey.png +0 -0
  18. data/app/assets/images/platform/arrow_right.gif +0 -0
  19. data/app/assets/images/platform/arrow_up.png +0 -0
  20. data/app/assets/images/platform/arrow_up_grey.png +0 -0
  21. data/app/assets/images/platform/bullet_go.png +0 -0
  22. data/app/assets/images/platform/buttons.png +0 -0
  23. data/app/assets/images/platform/cancel.png +0 -0
  24. data/app/assets/images/platform/clipboard_icon.gif +0 -0
  25. data/app/assets/images/platform/close.gif +0 -0
  26. data/app/assets/images/platform/cross.png +0 -0
  27. data/app/assets/images/platform/default_app_icon.gif +0 -0
  28. data/app/assets/images/platform/default_app_logo.gif +0 -0
  29. data/app/assets/images/platform/delete.png +0 -0
  30. data/app/assets/images/platform/disk.png +0 -0
  31. data/app/assets/images/platform/exclamation.png +0 -0
  32. data/app/assets/images/platform/eye.png +0 -0
  33. data/app/assets/images/platform/eye_not.png +0 -0
  34. data/app/assets/images/platform/field_sprite.gif +0 -0
  35. data/app/assets/images/platform/find.png +0 -0
  36. data/app/assets/images/platform/globe.gif +0 -0
  37. data/app/assets/images/platform/help.png +0 -0
  38. data/app/assets/images/platform/help/app_reg.png +0 -0
  39. data/app/assets/images/platform/help/app_reg_ext.png +0 -0
  40. data/app/assets/images/platform/help/app_reg_web.png +0 -0
  41. data/app/assets/images/platform/help/auth_desktop.png +0 -0
  42. data/app/assets/images/platform/help/auth_iframe.png +0 -0
  43. data/app/assets/images/platform/help/auth_iphone.png +0 -0
  44. data/app/assets/images/platform/help/auth_web.png +0 -0
  45. data/app/assets/images/platform/help/authorize.png +0 -0
  46. data/app/assets/images/platform/help/ext.png +0 -0
  47. data/app/assets/images/platform/help/login.png +0 -0
  48. data/app/assets/images/platform/help/login_desktop.png +0 -0
  49. data/app/assets/images/platform/help/login_iphone.png +0 -0
  50. data/app/assets/images/platform/help/login_web.png +0 -0
  51. data/app/assets/images/platform/help2.png +0 -0
  52. data/app/assets/images/platform/information.png +0 -0
  53. data/app/assets/images/platform/keyboard.png +0 -0
  54. data/app/assets/images/platform/language_selector_arrow.gif +0 -0
  55. data/app/assets/images/platform/left_quote.png +0 -0
  56. data/app/assets/images/platform/lightning.png +0 -0
  57. data/app/assets/images/platform/loading.gif +0 -0
  58. data/app/assets/images/platform/loading2.gif +0 -0
  59. data/app/assets/images/platform/loading3.gif +0 -0
  60. data/app/assets/images/platform/loading_animation.gif +0 -0
  61. data/app/assets/images/platform/loading_large.gif +0 -0
  62. data/app/assets/images/platform/lock.png +0 -0
  63. data/app/assets/images/platform/lock_add.png +0 -0
  64. data/app/assets/images/platform/lock_delete.png +0 -0
  65. data/app/assets/images/platform/lock_open.png +0 -0
  66. data/app/assets/images/platform/medals/bronze.png +0 -0
  67. data/app/assets/images/platform/medals/gold.png +0 -0
  68. data/app/assets/images/platform/medals/runner.png +0 -0
  69. data/app/assets/images/platform/medals/silver.png +0 -0
  70. data/app/assets/images/platform/minus_node.png +0 -0
  71. data/app/assets/images/platform/oauth/perm_tile.gif +0 -0
  72. data/app/assets/images/platform/oauth/right_grey.png +0 -0
  73. data/app/assets/images/platform/pencil.png +0 -0
  74. data/app/assets/images/platform/photo_silhouette.gif +0 -0
  75. data/app/assets/images/platform/pixel.gif +0 -0
  76. data/app/assets/images/platform/platform.png +0 -0
  77. data/app/assets/images/platform/platform2.png +0 -0
  78. data/app/assets/images/platform/platform3.png +0 -0
  79. data/app/assets/images/platform/platform4.png +0 -0
  80. data/app/assets/images/platform/platform5.png +0 -0
  81. data/app/assets/images/platform/plus.png +0 -0
  82. data/app/assets/images/platform/plus_node.png +0 -0
  83. data/app/assets/images/platform/random.png +0 -0
  84. data/app/assets/images/platform/random2.png +0 -0
  85. data/app/assets/images/platform/rating_star0.png +0 -0
  86. data/app/assets/images/platform/rating_star05.png +0 -0
  87. data/app/assets/images/platform/rating_star1.png +0 -0
  88. data/app/assets/images/platform/rating_stars.gif +0 -0
  89. data/app/assets/images/platform/rating_stars.psd +0 -0
  90. data/app/assets/images/platform/reply.png +0 -0
  91. data/app/assets/images/platform/right_quote.png +0 -0
  92. data/app/assets/images/platform/rotating_world.gif +0 -0
  93. data/app/assets/images/platform/script.png +0 -0
  94. data/app/assets/images/platform/script_edit.png +0 -0
  95. data/app/assets/images/platform/script_gear.png +0 -0
  96. data/app/assets/images/platform/site_sprite.gif +0 -0
  97. data/app/assets/images/platform/spinner.gif +0 -0
  98. data/app/assets/images/platform/star.png +0 -0
  99. data/app/assets/images/platform/table_edit.png +0 -0
  100. data/app/assets/images/platform/table_gear.png +0 -0
  101. data/app/assets/images/platform/table_multiple.png +0 -0
  102. data/app/assets/images/platform/thumb_down.png +0 -0
  103. data/app/assets/images/platform/thumb_up.png +0 -0
  104. data/app/assets/images/platform/top_left_stem.png +0 -0
  105. data/app/assets/images/platform/top_right_stem.png +0 -0
  106. data/app/assets/images/platform/translate_icn.gif +0 -0
  107. data/app/assets/images/platform/treeview/diffDoc.gif +0 -0
  108. data/app/assets/images/platform/treeview/diffFolder.gif +0 -0
  109. data/app/assets/images/platform/treeview/ftv2blank.gif +0 -0
  110. data/app/assets/images/platform/treeview/ftv2doc.gif +0 -0
  111. data/app/assets/images/platform/treeview/ftv2folderclosed.gif +0 -0
  112. data/app/assets/images/platform/treeview/ftv2folderopen.gif +0 -0
  113. data/app/assets/images/platform/treeview/ftv2lastnode.gif +0 -0
  114. data/app/assets/images/platform/treeview/ftv2link.gif +0 -0
  115. data/app/assets/images/platform/treeview/ftv2mlastnode.gif +0 -0
  116. data/app/assets/images/platform/treeview/ftv2mnode.gif +0 -0
  117. data/app/assets/images/platform/treeview/ftv2node.gif +0 -0
  118. data/app/assets/images/platform/treeview/ftv2plastnode.gif +0 -0
  119. data/app/assets/images/platform/treeview/ftv2pnode.gif +0 -0
  120. data/app/assets/images/platform/treeview/ftv2vertline.gif +0 -0
  121. data/app/assets/images/platform/wizard.png +0 -0
  122. data/app/assets/images/platform/world_link.png +0 -0
  123. data/app/assets/javascripts/platform/api_explorer.js +628 -0
  124. data/app/assets/javascripts/platform/application.js +9 -0
  125. data/app/assets/javascripts/platform/ftiens4.js +1197 -0
  126. data/app/assets/javascripts/platform/jsdk.js +539 -0
  127. data/app/assets/javascripts/platform/platform.js +447 -0
  128. data/app/assets/javascripts/platform/shortcut.js +223 -0
  129. data/app/assets/javascripts/platform/ua.js +147 -0
  130. data/app/assets/stylesheets/platform/api_explorer.css.scss +140 -0
  131. data/app/assets/stylesheets/platform/application.css.scss +6 -0
  132. data/app/assets/stylesheets/platform/components.css.scss +208 -0
  133. data/app/assets/stylesheets/platform/layout.css.scss +119 -0
  134. data/app/assets/stylesheets/platform/oauth.css +51 -0
  135. data/app/assets/stylesheets/platform/platform.css.scss +311 -0
  136. data/app/controllers/platform/admin/apps_controller.rb +99 -0
  137. data/app/controllers/platform/admin/base_controller.rb +60 -0
  138. data/app/controllers/platform/admin/categories_controller.rb +132 -0
  139. data/app/controllers/platform/admin/clientsdk_controller.rb +30 -0
  140. data/app/controllers/platform/admin/developers_controller.rb +30 -0
  141. data/app/controllers/platform/admin/exceptions_controller.rb +30 -0
  142. data/app/controllers/platform/admin/forum_controller.rb +34 -0
  143. data/app/controllers/platform/admin/metrics_controller.rb +42 -0
  144. data/app/controllers/platform/api/apps_controller.rb +40 -0
  145. data/app/controllers/platform/api/base_controller.rb +541 -0
  146. data/app/controllers/platform/apps_controller.rb +142 -0
  147. data/app/controllers/platform/base_controller.rb +127 -0
  148. data/app/controllers/platform/developer/api_explorer_controller.rb +56 -0
  149. data/app/controllers/platform/developer/apps_controller.rb +161 -0
  150. data/app/controllers/platform/developer/base_controller.rb +51 -0
  151. data/app/controllers/platform/developer/blog_controller.rb +29 -0
  152. data/app/controllers/platform/developer/dashboard_controller.rb +63 -0
  153. data/app/controllers/platform/developer/forum_controller.rb +85 -0
  154. data/app/controllers/platform/developer/help_controller.rb +113 -0
  155. data/app/controllers/platform/developer/info_controller.rb +41 -0
  156. data/app/controllers/platform/developer/registration_controller.rb +39 -0
  157. data/app/controllers/platform/developer/resources_controller.rb +30 -0
  158. data/app/controllers/platform/forum_controller.rb +74 -0
  159. data/app/controllers/platform/oauth_controller.rb +421 -0
  160. data/app/controllers/platform/ratings_controller.rb +61 -0
  161. data/app/helpers/platform/admin/categories_helper.rb +54 -0
  162. data/app/helpers/platform/apps_helper.rb +26 -0
  163. data/app/helpers/platform/developer/dashboard_helper.rb +42 -0
  164. data/app/helpers/platform/developer/help_helper.rb +45 -0
  165. data/app/helpers/platform_helper.rb +26 -0
  166. data/app/models/platform/application.rb +394 -0
  167. data/app/models/platform/application_category.rb +34 -0
  168. data/app/models/platform/application_developer.rb +30 -0
  169. data/app/models/platform/application_filter.rb +30 -0
  170. data/app/models/platform/application_log.rb +32 -0
  171. data/app/models/platform/application_log_filter.rb +34 -0
  172. data/app/models/platform/application_metric.rb +58 -0
  173. data/app/models/platform/application_metric_filter.rb +34 -0
  174. data/app/models/platform/application_permission.rb +30 -0
  175. data/app/models/platform/application_permission_filter.rb +30 -0
  176. data/app/models/platform/application_usage_metric.rb +58 -0
  177. data/app/models/platform/application_usage_metric_filter.rb +34 -0
  178. data/app/models/platform/application_user.rb +45 -0
  179. data/app/models/platform/application_user_filter.rb +34 -0
  180. data/app/models/platform/base_filter.rb +46 -0
  181. data/app/models/platform/category.rb +64 -0
  182. data/app/models/platform/daily_application_metric.rb +31 -0
  183. data/app/models/platform/developer.rb +45 -0
  184. data/app/models/platform/developer_filter.rb +26 -0
  185. data/app/models/platform/forum_message.rb +35 -0
  186. data/app/models/platform/forum_message_filter.rb +26 -0
  187. data/app/models/platform/forum_topic.rb +38 -0
  188. data/app/models/platform/forum_topic_filter.rb +26 -0
  189. data/app/models/platform/logged_exception.rb +290 -0
  190. data/app/models/platform/logged_exception_filter.rb +58 -0
  191. data/app/models/platform/media/image.rb +26 -0
  192. data/app/models/platform/media/media.rb +58 -0
  193. data/app/models/platform/monthly_application_metric.rb +31 -0
  194. data/app/models/platform/oauth/access_token.rb +57 -0
  195. data/app/models/platform/oauth/client_token.rb +38 -0
  196. data/app/models/platform/oauth/oauth_model_methods.rb +41 -0
  197. data/app/models/platform/oauth/oauth_token.rb +57 -0
  198. data/app/models/platform/oauth/oauth_token_filter.rb +34 -0
  199. data/app/models/platform/oauth/refresh_token.rb +47 -0
  200. data/app/models/platform/oauth/request_token.rb +50 -0
  201. data/app/models/platform/permission.rb +27 -0
  202. data/app/models/platform/rating.rb +43 -0
  203. data/app/models/platform/rating_filter.rb +30 -0
  204. data/app/models/platform/rollup_log.rb +27 -0
  205. data/app/models/platform/rollup_log_filter.rb +30 -0
  206. data/app/models/platform/total_application_metric.rb +40 -0
  207. data/app/models/platform/weekly_application_metric.rb +31 -0
  208. data/app/views/platform/admin/apps/_categories.html.erb +17 -0
  209. data/app/views/platform/admin/apps/_categories_scripts.html.erb +17 -0
  210. data/app/views/platform/admin/apps/_tabs.html.erb +25 -0
  211. data/app/views/platform/admin/apps/index.html.erb +32 -0
  212. data/app/views/platform/admin/apps/permissions.html.erb +7 -0
  213. data/app/views/platform/admin/apps/ratings.html.erb +7 -0
  214. data/app/views/platform/admin/apps/tokens.html.erb +18 -0
  215. data/app/views/platform/admin/apps/users.html.erb +7 -0
  216. data/app/views/platform/admin/apps/view.html.erb +170 -0
  217. data/app/views/platform/admin/categories/_tabs.html.erb +22 -0
  218. data/app/views/platform/admin/categories/category_assigner.html.erb +9 -0
  219. data/app/views/platform/admin/categories/category_assigner_tree.html.erb +81 -0
  220. data/app/views/platform/admin/categories/index.html.erb +106 -0
  221. data/app/views/platform/admin/categories/items.html.erb +153 -0
  222. data/app/views/platform/admin/categories/lb_update_application_category.html.erb +54 -0
  223. data/app/views/platform/admin/categories/lb_update_category.html.erb +64 -0
  224. data/app/views/platform/admin/categories/tree.html.erb +64 -0
  225. data/app/views/platform/admin/clientsdk/index.html.erb +89 -0
  226. data/app/views/platform/admin/common/_footer.html.erb +1 -0
  227. data/app/views/platform/admin/common/_header.html.erb +32 -0
  228. data/app/views/platform/admin/common/_lightbox_buttons.html.erb +5 -0
  229. data/app/views/platform/admin/common/_paginator.html.erb +20 -0
  230. data/app/views/platform/admin/developers/_tabs.html.erb +22 -0
  231. data/app/views/platform/admin/developers/index.html.erb +7 -0
  232. data/app/views/platform/admin/exceptions/_tabs.html.erb +22 -0
  233. data/app/views/platform/admin/exceptions/index.html.erb +7 -0
  234. data/app/views/platform/admin/forum/_tabs.html.erb +22 -0
  235. data/app/views/platform/admin/forum/index.html.erb +7 -0
  236. data/app/views/platform/admin/forum/messages.html.erb +7 -0
  237. data/app/views/platform/admin/metrics/_tabs.html.erb +25 -0
  238. data/app/views/platform/admin/metrics/application_log.html.erb +7 -0
  239. data/app/views/platform/admin/metrics/index.html.erb +9 -0
  240. data/app/views/platform/admin/metrics/rollup_log.html.erb +7 -0
  241. data/app/views/platform/admin/metrics/usage.html.erb +7 -0
  242. data/app/views/platform/apps/_actions_module.html.erb +3 -0
  243. data/app/views/platform/apps/_app_footer.html.erb +8 -0
  244. data/app/views/platform/apps/_app_header.html.erb +25 -0
  245. data/app/views/platform/apps/_apps_module.html.erb +42 -0
  246. data/app/views/platform/apps/_authorize_form.html.erb +11 -0
  247. data/app/views/platform/apps/_categories_module.html.erb +11 -0
  248. data/app/views/platform/apps/_featured_apps_module.html.erb +40 -0
  249. data/app/views/platform/apps/_left.html.erb +20 -0
  250. data/app/views/platform/apps/_monthly_users_module.html.erb +8 -0
  251. data/app/views/platform/apps/_paginator.html.erb +13 -0
  252. data/app/views/platform/apps/_rank_module.html.erb +18 -0
  253. data/app/views/platform/apps/_search_apps_module.html.erb +35 -0
  254. data/app/views/platform/apps/canvas_app.html.erb +15 -0
  255. data/app/views/platform/apps/index.html.erb +86 -0
  256. data/app/views/platform/apps/view.html.erb +71 -0
  257. data/app/views/platform/apps/xd.html.erb +11 -0
  258. data/app/views/platform/common/_footer.html.erb +1 -0
  259. data/app/views/platform/common/_header.html.erb +4 -0
  260. data/app/views/platform/common/_paginator.html.erb +32 -0
  261. data/app/views/platform/common/_scripts.html.erb +7 -0
  262. data/app/views/platform/common/_user_login.html.erb +11 -0
  263. data/app/views/platform/developer/api_explorer/history.html.erb +31 -0
  264. data/app/views/platform/developer/api_explorer/index.html.erb +134 -0
  265. data/app/views/platform/developer/api_explorer/oauth_lander.html.erb +4 -0
  266. data/app/views/platform/developer/api_explorer/options.html.erb +44 -0
  267. data/app/views/platform/developer/apps/_form.html.erb +340 -0
  268. data/app/views/platform/developer/apps/create_version.html.erb +19 -0
  269. data/app/views/platform/developer/apps/edit.html.erb +21 -0
  270. data/app/views/platform/developer/apps/index.html.erb +375 -0
  271. data/app/views/platform/developer/apps/new.html.erb +20 -0
  272. data/app/views/platform/developer/blog/index.html.erb +7 -0
  273. data/app/views/platform/developer/common/_footer.html.erb +1 -0
  274. data/app/views/platform/developer/common/_header.html.erb +34 -0
  275. data/app/views/platform/developer/dashboard/_apps_info.html.erb +84 -0
  276. data/app/views/platform/developer/dashboard/_discussions.html.erb +68 -0
  277. data/app/views/platform/developer/dashboard/_header.html.erb +12 -0
  278. data/app/views/platform/developer/dashboard/_reviews.html.erb +53 -0
  279. data/app/views/platform/developer/dashboard/_statistics.html.erb +105 -0
  280. data/app/views/platform/developer/dashboard/index.html.erb +85 -0
  281. data/app/views/platform/developer/dashboard/settings.html.erb +23 -0
  282. data/app/views/platform/developer/forum/_message.html.erb +17 -0
  283. data/app/views/platform/developer/forum/_messages.html.erb +14 -0
  284. data/app/views/platform/developer/forum/_new_message.html.erb +28 -0
  285. data/app/views/platform/developer/forum/_new_topic.html.erb +39 -0
  286. data/app/views/platform/developer/forum/index.html.erb +89 -0
  287. data/app/views/platform/developer/forum/topic.html.erb +28 -0
  288. data/app/views/platform/developer/help/_footer.html.erb +4 -0
  289. data/app/views/platform/developer/help/_header.html.erb +95 -0
  290. data/app/views/platform/developer/help/_navigation.html.erb +99 -0
  291. data/app/views/platform/developer/help/api.html.erb +120 -0
  292. data/app/views/platform/developer/help/credits.html.erb +77 -0
  293. data/app/views/platform/developer/help/index.html.erb +19 -0
  294. data/app/views/platform/developer/help/license.html.erb +586 -0
  295. data/app/views/platform/developer/help/oauth_app_login.html.erb +177 -0
  296. data/app/views/platform/developer/help/oauth_client_side.html.erb +264 -0
  297. data/app/views/platform/developer/help/oauth_desktop.html.erb +191 -0
  298. data/app/views/platform/developer/help/oauth_extensions.html.erb +342 -0
  299. data/app/views/platform/developer/help/oauth_intro.html.erb +371 -0
  300. data/app/views/platform/developer/help/oauth_mobile.html.erb +292 -0
  301. data/app/views/platform/developer/help/oauth_server_side.html.erb +603 -0
  302. data/app/views/platform/developer/help/oauth_trusted_client.html.erb +202 -0
  303. data/app/views/platform/developer/help/reference.html.erb +42 -0
  304. data/app/views/platform/developer/help/sdk_ios.html.erb +31 -0
  305. data/app/views/platform/developer/help/sdk_js.html.erb +202 -0
  306. data/app/views/platform/developer/info/_basic_info.html.erb +74 -0
  307. data/app/views/platform/developer/info/_header.html.erb +12 -0
  308. data/app/views/platform/developer/info/index.html.erb +23 -0
  309. data/app/views/platform/developer/registration/index.html.erb +134 -0
  310. data/app/views/platform/developer/resources/index.html.erb +23 -0
  311. data/app/views/platform/forum/_message.html.erb +17 -0
  312. data/app/views/platform/forum/_messages.html.erb +14 -0
  313. data/app/views/platform/forum/_new_message.html.erb +26 -0
  314. data/app/views/platform/forum/_new_topic.html.erb +38 -0
  315. data/app/views/platform/forum/_topic.html.erb +18 -0
  316. data/app/views/platform/forum/_topics.html.erb +74 -0
  317. data/app/views/platform/login/index.html.erb +31 -0
  318. data/app/views/platform/login/register.html.erb +55 -0
  319. data/app/views/platform/oauth/_authorization_box.html.erb +75 -0
  320. data/app/views/platform/oauth/_authorization_popup.html.erb +38 -0
  321. data/app/views/platform/oauth/_authorize_form.html.erb +11 -0
  322. data/app/views/platform/oauth/auth_failed.html.erb +0 -0
  323. data/app/views/platform/oauth/auth_success.html.erb +0 -0
  324. data/app/views/platform/oauth/authorize_desktop.html.erb +76 -0
  325. data/app/views/platform/oauth/authorize_failure_iframe.html.erb +1 -0
  326. data/app/views/platform/oauth/authorize_failure_mobile.html.erb +24 -0
  327. data/app/views/platform/oauth/authorize_failure_popup.html.erb +24 -0
  328. data/app/views/platform/oauth/authorize_failure_web.html.erb +1 -0
  329. data/app/views/platform/oauth/authorize_iframe.html.erb +16 -0
  330. data/app/views/platform/oauth/authorize_mobile.html.erb +1 -0
  331. data/app/views/platform/oauth/authorize_popup.html.erb +1 -0
  332. data/app/views/platform/oauth/authorize_success_iframe.html.erb +1 -0
  333. data/app/views/platform/oauth/authorize_success_mobile.html.erb +24 -0
  334. data/app/views/platform/oauth/authorize_success_popup.html.erb +24 -0
  335. data/app/views/platform/oauth/authorize_success_web.html.erb +1 -0
  336. data/app/views/platform/oauth/authorize_web.html.erb +3 -0
  337. data/app/views/platform/oauth/xd.html.erb +13 -0
  338. data/app/views/platform/ratings/_list.html.erb +30 -0
  339. data/app/views/platform/ratings/_new.html.erb +70 -0
  340. data/app/views/platform/ratings/_rating.html.erb +17 -0
  341. data/config/platform/config.yml +133 -0
  342. data/config/platform/data/default_applications.yml +39 -0
  343. data/config/platform/data/default_categories.yml +56 -0
  344. data/config/platform/data/default_permissions.yml +0 -0
  345. data/config/platform/site/features.yml +66 -0
  346. data/config/routes.rb +59 -0
  347. data/db/migrate/20110602232141_create_platform_tables.rb +262 -0
  348. data/docs/Classes.graffle +7315 -0
  349. data/docs/Classes.pdf +0 -0
  350. data/lib/generators/platform/platform_generator.rb +56 -0
  351. data/lib/generators/platform/templates/db/create_platform_tables.rb +262 -0
  352. data/lib/generators/platform/templates/layouts/platform.html.erb +49 -0
  353. data/lib/generators/platform/templates/layouts/platform_admin.html.erb +60 -0
  354. data/lib/platform.rb +6 -0
  355. data/lib/platform/api/already_jsoned_string.rb +9 -0
  356. data/lib/platform/api/proxy.rb +45 -0
  357. data/lib/platform/api/proxy/base.rb +62 -0
  358. data/lib/platform/cache.rb +78 -0
  359. data/lib/platform/config.rb +666 -0
  360. data/lib/platform/engine.rb +5 -0
  361. data/lib/platform/exception.rb +27 -0
  362. data/lib/platform/extensions/action_controller_extension.rb +65 -0
  363. data/lib/platform/extensions/action_view_extension.rb +168 -0
  364. data/lib/platform/extensions/object_extension.rb +51 -0
  365. data/lib/platform/helper.rb +33 -0
  366. data/lib/platform/logger.rb +62 -0
  367. data/lib/platform/railtie.rb +52 -0
  368. data/lib/platform/random_password_generator.rb +76 -0
  369. data/lib/platform/simple_string_permissions.rb +40 -0
  370. data/lib/platform/version.rb +3 -0
  371. data/lib/tasks/platform.rake +119 -0
  372. data/platform.gemspec +45 -0
  373. data/script/rails +6 -0
  374. data/spec/config/config_spec.rb +10 -0
  375. data/spec/dummy_app.rb +52 -0
  376. data/spec/models/application_spec.rb +53 -0
  377. data/spec/models/developer_spec.rb +23 -0
  378. data/spec/spec_helper.rb +29 -0
  379. data/test/dummy/Rakefile +7 -0
  380. data/test/dummy/app/assets/javascripts/application.js +7 -0
  381. data/test/dummy/app/assets/stylesheets/admin.css +200 -0
  382. data/test/dummy/app/assets/stylesheets/application.css +47 -0
  383. data/test/dummy/app/assets/stylesheets/components.css.scss +211 -0
  384. data/test/dummy/app/assets/stylesheets/layout.css.scss +143 -0
  385. data/test/dummy/app/controllers/admin/admins_controller.rb +7 -0
  386. data/test/dummy/app/controllers/admin/base_controller.rb +12 -0
  387. data/test/dummy/app/controllers/admin/bookmarks_controller.rb +7 -0
  388. data/test/dummy/app/controllers/admin/users_controller.rb +19 -0
  389. data/test/dummy/app/controllers/api/base_controller.rb +5 -0
  390. data/test/dummy/app/controllers/api/bookmarks_controller.rb +35 -0
  391. data/test/dummy/app/controllers/api/users_controller.rb +19 -0
  392. data/test/dummy/app/controllers/application_controller.rb +31 -0
  393. data/test/dummy/app/controllers/home_controller.rb +7 -0
  394. data/test/dummy/app/controllers/login_controller.rb +65 -0
  395. data/test/dummy/app/helpers/application_helper.rb +9 -0
  396. data/test/dummy/app/helpers/home_helper.rb +2 -0
  397. data/test/dummy/app/mailers/.gitkeep +0 -0
  398. data/test/dummy/app/models/.gitkeep +0 -0
  399. data/test/dummy/app/models/admin.rb +4 -0
  400. data/test/dummy/app/models/admin_filter.rb +7 -0
  401. data/test/dummy/app/models/bookmark.rb +7 -0
  402. data/test/dummy/app/models/user.rb +34 -0
  403. data/test/dummy/app/views/admin/admins/index.html.erb +7 -0
  404. data/test/dummy/app/views/admin/bookmarks/index.html.erb +5 -0
  405. data/test/dummy/app/views/admin/users/index.html.erb +10 -0
  406. data/test/dummy/app/views/demo/index.rhtml +108 -0
  407. data/test/dummy/app/views/demo/tokens.rhtml +35 -0
  408. data/test/dummy/app/views/home/index.html.erb +43 -0
  409. data/test/dummy/app/views/layouts/_footer.html.erb +16 -0
  410. data/test/dummy/app/views/layouts/_header.html.erb +22 -0
  411. data/test/dummy/app/views/layouts/admin.html.erb +97 -0
  412. data/test/dummy/app/views/layouts/application.html.erb +25 -0
  413. data/test/dummy/app/views/layouts/minimal.html.erb +37 -0
  414. data/test/dummy/app/views/layouts/popup.html.erb +43 -0
  415. data/test/dummy/app/views/login/index.html.erb +34 -0
  416. data/test/dummy/app/views/login/register.html.erb +51 -0
  417. data/test/dummy/config.ru +4 -0
  418. data/test/dummy/config/application.rb +51 -0
  419. data/test/dummy/config/boot.rb +10 -0
  420. data/test/dummy/config/database.yml +25 -0
  421. data/test/dummy/config/environment.rb +5 -0
  422. data/test/dummy/config/environments/development.rb +30 -0
  423. data/test/dummy/config/environments/production.rb +60 -0
  424. data/test/dummy/config/environments/test.rb +42 -0
  425. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  426. data/test/dummy/config/initializers/inflections.rb +10 -0
  427. data/test/dummy/config/initializers/mime_types.rb +5 -0
  428. data/test/dummy/config/initializers/secret_token.rb +7 -0
  429. data/test/dummy/config/initializers/session_store.rb +8 -0
  430. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  431. data/test/dummy/config/locales/en.yml +5 -0
  432. data/test/dummy/config/platform/api/0/bookmark.yml +18 -0
  433. data/test/dummy/config/platform/api/0/user.yml +17 -0
  434. data/test/dummy/config/platform/api/1/bookmark.yml +58 -0
  435. data/test/dummy/config/platform/api/1/user.yml +36 -0
  436. data/test/dummy/config/platform/config.yml +135 -0
  437. data/test/dummy/config/platform/data/default_applications.yml +39 -0
  438. data/test/dummy/config/platform/data/default_categories.yml +56 -0
  439. data/test/dummy/config/platform/data/default_permissions.yml +0 -0
  440. data/test/dummy/config/platform/site/features.yml +66 -0
  441. data/test/dummy/config/platform/site/sample_apps.yml +100 -0
  442. data/test/dummy/config/routes.rb +30 -0
  443. data/test/dummy/config/tr8n/config.yml +247 -0
  444. data/test/dummy/config/tr8n/data/ip_locations.csv +93460 -0
  445. data/test/dummy/config/tr8n/rules/default_date_rules.yml +20 -0
  446. data/test/dummy/config/tr8n/rules/default_gender_list_rules.yml +82 -0
  447. data/test/dummy/config/tr8n/rules/default_gender_rules.yml +20 -0
  448. data/test/dummy/config/tr8n/rules/default_language_cases.yml +272 -0
  449. data/test/dummy/config/tr8n/rules/default_list_rules.yml +19 -0
  450. data/test/dummy/config/tr8n/rules/default_numeric_rules.yml +42 -0
  451. data/test/dummy/config/tr8n/rules/default_value_rules.yml +18 -0
  452. data/test/dummy/config/tr8n/site/default_glossary.yml +18 -0
  453. data/test/dummy/config/tr8n/site/default_languages.yml +1591 -0
  454. data/test/dummy/config/tr8n/site/features.yml +111 -0
  455. data/test/dummy/config/tr8n/site/shortcuts.yml +55 -0
  456. data/test/dummy/config/tr8n/site/sitemap.json +42 -0
  457. data/test/dummy/config/tr8n/tokens/data.yml +19 -0
  458. data/test/dummy/config/tr8n/tokens/decorations.yml +19 -0
  459. data/test/dummy/config/will_filter/config.yml +99 -0
  460. data/test/dummy/db/migrate/20101207014543_create_users.rb +23 -0
  461. data/test/dummy/db/migrate/20110113223509_create_admins.rb +15 -0
  462. data/test/dummy/db/migrate/20110930041143_create_will_filter_filters.rb +15 -0
  463. data/test/dummy/db/migrate/20110930041150_create_tr8n_tables.rb +350 -0
  464. data/test/dummy/db/migrate/20111004075531_create_platform_tables.rb +262 -0
  465. data/test/dummy/db/migrate/20111012055603_create_bookmarks.rb +10 -0
  466. data/test/dummy/db/schema.rb +683 -0
  467. data/test/dummy/lib/assets/.gitkeep +0 -0
  468. data/test/dummy/lib/platform/api/bookmark_proxy_0.rb +12 -0
  469. data/test/dummy/lib/platform/api/bookmark_proxy_1.rb +12 -0
  470. data/test/dummy/lib/platform/api/user_proxy_0.rb +12 -0
  471. data/test/dummy/lib/platform/api/user_proxy_1.rb +12 -0
  472. data/test/dummy/log/.gitkeep +0 -0
  473. data/test/dummy/public/404.html +26 -0
  474. data/test/dummy/public/422.html +26 -0
  475. data/test/dummy/public/500.html +26 -0
  476. data/test/dummy/public/favicon.ico +0 -0
  477. data/test/dummy/script/rails +6 -0
  478. data/test/dummy/test/fixtures/documents.yml +11 -0
  479. data/test/dummy/test/unit/document_test.rb +7 -0
  480. metadata +886 -0
@@ -0,0 +1,9 @@
1
+ // This is a manifest file that'll be compiled into including all the files listed below.
2
+ // Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
3
+ // be included in the compiled file accessible from http://example.com/assets/application.js
4
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
5
+ // the compiled file.
6
+ //
7
+ //= require jquery
8
+ //= require jquery_ujs
9
+ //= require_tree .
@@ -0,0 +1,1197 @@
1
+ //****************************************************************
2
+ // You must keep this copyright notice:
3
+ //
4
+ // This script is Copyright (c) 2006 by Conor O'Mahony.
5
+ // For inquiries, please email GubuSoft@GubuSoft.com.
6
+ // GubuSoft is owned and operated by Conor O'Mahony.
7
+ // Original author of TreeView script is Marcelino Martins.
8
+ //
9
+ // Do not download the script's files from here. For a free
10
+ // download and full instructions go to the following site:
11
+ // http://www.TreeView.net
12
+ //****************************************************************
13
+
14
+ // Log of changes:
15
+ // 26 Sep 06 - Updated preLoadIcons function;
16
+ // Fix small bugs or typos (in the Folder, InitializeFolder,
17
+ // and blockStartHTML functions)
18
+ // 14 Feb 06 - Re-brand as GubuSoft
19
+ // 08 Jun 04 - Very small change to one error message
20
+ // 21 Mar 04 - Support for folder.addChildren allows for much bigger trees
21
+ // 12 May 03 - Support for Safari Beta 3
22
+ // 01 Mar 03 - VERSION 4.3 - Support for checkboxes
23
+ // 21 Feb 03 - Added support for Opera 7
24
+ // 22 Sep 02 - Added maySelect member for node-by-node control
25
+ // of selection and highlight
26
+ // 21 Sep 02 - Cookie values are now separated by cookieCutter
27
+ // 12 Sep 02 - VERSION 4.2 - Can highlight Selected Nodes and
28
+ // can preserve state through external (DB) IDs
29
+ // 29 Aug 02 - Fine tune 'supportDeferral' for IE4 and IE Mac
30
+ // 25 Aug 02 - Fixes: STARTALLOPEN, and multi-page frameless
31
+ // 09 Aug 02 - Fix repeated folder on Mozilla 1.x
32
+ // 31 Jul 02 - VERSION 4.1 - Dramatic speed increase for trees
33
+ // with hundreds or thousands of nodes; changes to the control
34
+ // flags of the gLnk function
35
+ // 18 Jul 02 - Changes in pre-load images function
36
+ // 13 Jun 02 - Add ICONPATH var to allow for gif subdir
37
+ // 20 Apr 02 - Improve support for frame-less layout
38
+ // 07 Apr 02 - Minor changes to support server-side dynamic feeding
39
+ // (example: FavoritesManagerASP)
40
+
41
+
42
+ // Definition of class Folder
43
+ // *****************************************************************
44
+ function Folder(folderDescription, hreference) //constructor
45
+ {
46
+ //constant data
47
+ this.desc = folderDescription;
48
+ this.hreference = hreference;
49
+ this.id = -1;
50
+ this.navObj = 0;
51
+ this.iconImg = 0;
52
+ this.nodeImg = 0;
53
+ this.iconSrc = ICONPATH + "ftv2folderopen.gif";
54
+ this.iconSrcClosed = ICONPATH + "ftv2folderclosed.gif";
55
+ this.children = new Array;
56
+ this.nChildren = 0;
57
+ this.level = 0;
58
+ this.leftSideCoded = "";
59
+ this.isLastNode=false;
60
+ this.parentObj = null;
61
+ this.maySelect=true;
62
+ this.prependHTML = ""
63
+
64
+ //dynamic data
65
+ this.isOpen = false
66
+ this.isLastOpenedFolder = false
67
+ this.isRendered = 0
68
+
69
+ //methods
70
+ this.initialize = initializeFolder
71
+ this.setState = setStateFolder
72
+ this.addChild = addChild
73
+ this.addChildren = addChildren
74
+ this.createIndex = createEntryIndex
75
+ this.escondeBlock = escondeBlock
76
+ this.esconde = escondeFolder
77
+ this.folderMstr = folderMstr
78
+ this.renderOb = drawFolder
79
+ this.totalHeight = totalHeight
80
+ this.subEntries = folderSubEntries
81
+ this.linkHTML = linkFolderHTML
82
+ this.blockStartHTML = blockStartHTML
83
+ this.blockEndHTML = blockEndHTML
84
+ this.nodeImageSrc = nodeImageSrc
85
+ this.iconImageSrc = iconImageSrc
86
+ this.getID = getID
87
+ this.forceOpeningOfAncestorFolders = forceOpeningOfAncestorFolders
88
+ }
89
+
90
+ function initializeFolder(level, lastNode, leftSide)
91
+ {
92
+ var i=0
93
+ nc = this.nChildren
94
+
95
+ this.createIndex()
96
+ this.level = level
97
+ this.leftSideCoded = leftSide
98
+
99
+ if (browserVersion == 0 || STARTALLOPEN==1)
100
+ this.isOpen=true;
101
+
102
+ if (level>0)
103
+ if (lastNode) //the last child in the children array
104
+ leftSide = leftSide + "0"
105
+ else
106
+ leftSide = leftSide + "1"
107
+
108
+ this.isLastNode = lastNode
109
+
110
+ if (nc > 0)
111
+ {
112
+ level = level + 1
113
+ for (i=0 ; i < this.nChildren; i++)
114
+ {
115
+ if (typeof this.children[i].initialize == 'undefined') //document node was specified using the addChildren function
116
+ {
117
+ if (typeof this.children[i][0] == 'undefined' || typeof this.children[i] == 'string')
118
+ {
119
+ this.children[i] = ["item incorrectly defined", ""];
120
+ }
121
+
122
+ //Basic initialization of the Item object
123
+ //These members or methods are needed even before the Item is rendered
124
+ this.children[i].initialize=initializeItem;
125
+ this.children[i].createIndex=createEntryIndex;
126
+ if (typeof this.children[i].maySelect == 'undefined')
127
+ this.children[i].maySelect=true
128
+ this.children[i].forceOpeningOfAncestorFolders = forceOpeningOfAncestorFolders
129
+ }
130
+ if (i == this.nChildren-1)
131
+ this.children[i].initialize(level, 1, leftSide)
132
+ else
133
+ this.children[i].initialize(level, 0, leftSide)
134
+ }
135
+ }
136
+ }
137
+
138
+ function drawFolder(insertAtObj)
139
+ {
140
+ var nodeName = ""
141
+ var auxEv = ""
142
+ var docW = ""
143
+ var i=0
144
+
145
+ finalizeCreationOfChildDocs(this)
146
+
147
+ var leftSide = leftSideHTML(this.leftSideCoded)
148
+
149
+ if (browserVersion > 0)
150
+ auxEv = "<a href='javascript:clickOnNode(\""+this.getID()+"\")'>"
151
+ else
152
+ auxEv = "<a>"
153
+
154
+ nodeName = this.nodeImageSrc()
155
+
156
+ if (this.level>0) {
157
+ if (this.isLastNode) //the last child in the children array
158
+ leftSide = leftSide + "<td valign=top>" + auxEv + "<img name='nodeIcon" + this.id + "' id='nodeIcon" + this.id + "' src='" + nodeName + "' width=16 height=22 border=0></a></td>"
159
+ else
160
+ leftSide = leftSide + "<td valign=top background=" + ICONPATH + "ftv2vertline.gif>" + auxEv + "<img name='nodeIcon" + this.id + "' id='nodeIcon" + this.id + "' src='" + nodeName + "' width=16 height=22 border=0></a></td>"
161
+ }
162
+
163
+ this.isRendered = 1
164
+
165
+ if (browserVersion == 2) {
166
+ if (!doc.yPos)
167
+ doc.yPos=20
168
+ }
169
+
170
+ docW = this.blockStartHTML("folder");
171
+
172
+ if (foldersTree.xID == this.xID && DISPLAYROOT==0) {
173
+ docW = docW + "<tr style='display:none'>";
174
+ } else {
175
+ docW = docW + "<tr>";
176
+ }
177
+
178
+ docW = docW + leftSide + "<td valign=top>";
179
+
180
+ if (USEICONS)
181
+ {
182
+ docW = docW + this.linkHTML(false)
183
+ docW = docW + "<img id='folderIcon" + this.id + "' name='folderIcon" + this.id + "' src='" + this.iconImageSrc() + "' border=0></a>"
184
+ }
185
+ else
186
+ {
187
+ if (this.prependHTML == "")
188
+ docW = docW + "<img src=" + ICONPATH + "ftv2blank.gif height=2 width=2>"
189
+ }
190
+ if (WRAPTEXT)
191
+ docW = docW + "</td>"+this.prependHTML+"<td valign=middle width=100%>"
192
+ else
193
+ docW = docW + "</td>"+this.prependHTML+"<td valign=middle nowrap width=100%>"
194
+ if (USETEXTLINKS)
195
+ {
196
+ docW = docW + this.linkHTML(true)
197
+ docW = docW + this.desc + "</a>"
198
+ }
199
+ else
200
+ docW = docW + this.desc
201
+ docW = docW + "</td>"
202
+
203
+ docW = docW + this.blockEndHTML()
204
+
205
+ if (insertAtObj == null)
206
+ {
207
+ if (supportsDeferral) {
208
+ doc.write("<div id=domRoot></div>") //transition between regular flow HTML, and node-insert DOM DHTML
209
+ insertAtObj = getElById("domRoot")
210
+ insertAtObj.insertAdjacentHTML("beforeEnd", docW)
211
+ }
212
+ else
213
+ doc.write(docW)
214
+ }
215
+ else
216
+ {
217
+ insertAtObj.insertAdjacentHTML("afterEnd", docW)
218
+ }
219
+
220
+ if (browserVersion == 2)
221
+ {
222
+ this.navObj = doc.layers["folder"+this.id]
223
+ if (USEICONS)
224
+ this.iconImg = this.navObj.document.images["folderIcon"+this.id]
225
+ this.nodeImg = this.navObj.document.images["nodeIcon"+this.id]
226
+ doc.yPos=doc.yPos+this.navObj.clip.height
227
+ }
228
+ else if (browserVersion != 0)
229
+ {
230
+ this.navObj = getElById("folder"+this.id)
231
+ if (USEICONS)
232
+ this.iconImg = getElById("folderIcon"+this.id)
233
+ this.nodeImg = getElById("nodeIcon"+this.id)
234
+ }
235
+ }
236
+
237
+ function setStateFolder(isOpen)
238
+ {
239
+ var subEntries
240
+ var totalHeight
241
+ var fIt = 0
242
+ var i=0
243
+ var currentOpen
244
+
245
+ if (isOpen == this.isOpen)
246
+ return
247
+
248
+ if (browserVersion == 2)
249
+ {
250
+ totalHeight = 0
251
+ for (i=0; i < this.nChildren; i++)
252
+ totalHeight = totalHeight + this.children[i].navObj.clip.height
253
+ subEntries = this.subEntries()
254
+ if (this.isOpen)
255
+ totalHeight = 0 - totalHeight
256
+ for (fIt = this.id + subEntries + 1; fIt < nEntries; fIt++)
257
+ indexOfEntries[fIt].navObj.moveBy(0, totalHeight)
258
+ }
259
+ this.isOpen = isOpen;
260
+
261
+ if (this.getID()!=foldersTree.getID() && PRESERVESTATE && !this.isOpen) //closing
262
+ {
263
+ currentOpen = GetCookie("clickedFolder")
264
+ if (currentOpen != null) {
265
+ currentOpen = currentOpen.replace(this.getID()+cookieCutter, "")
266
+ SetCookie("clickedFolder", currentOpen)
267
+ }
268
+ }
269
+
270
+ if (!this.isOpen && this.isLastOpenedfolder)
271
+ {
272
+ lastOpenedFolder = null;
273
+ this.isLastOpenedfolder = false;
274
+ }
275
+ propagateChangesInState(this)
276
+ }
277
+
278
+ function propagateChangesInState(folder)
279
+ {
280
+ var i=0
281
+
282
+ //Change icon
283
+ if (folder.nChildren > 0 && folder.level>0) //otherwise the one given at render stays
284
+ folder.nodeImg.src = folder.nodeImageSrc()
285
+
286
+ //Change node
287
+ if (USEICONS)
288
+ folder.iconImg.src = folder.iconImageSrc()
289
+
290
+ //Propagate changes
291
+ for (i=folder.nChildren-1; i>=0; i--) {
292
+ if (folder.isOpen)
293
+ folder.children[i].folderMstr(folder.navObj)
294
+ else
295
+ folder.children[i].esconde()
296
+ }
297
+ }
298
+
299
+ function escondeFolder()
300
+ {
301
+ this.escondeBlock()
302
+
303
+ this.setState(0)
304
+ }
305
+
306
+ function linkFolderHTML(isTextLink)
307
+ {
308
+ var docW = "";
309
+
310
+ if (this.hreference)
311
+ {
312
+ if (USEFRAMES)
313
+ docW = docW + "<a href='" + this.hreference + "' TARGET=\"basefrm\" "
314
+ else
315
+ docW = docW + "<a href='" + this.hreference + "' TARGET=_top "
316
+
317
+ if (isTextLink) {
318
+ docW += "id=\"itemTextLink"+this.id+"\" ";
319
+ }
320
+
321
+ if (browserVersion > 0)
322
+ docW = docW + "onClick='javascript:clickOnFolder(\""+this.getID()+"\")'"
323
+
324
+ docW = docW + ">"
325
+ }
326
+ else
327
+ docW = docW + "<a>"
328
+
329
+ return docW;
330
+ }
331
+
332
+ function addChild(childNode)
333
+ {
334
+ this.children[this.nChildren] = childNode
335
+ childNode.parentObj = this
336
+ this.nChildren++
337
+ return childNode
338
+ }
339
+
340
+ //The list can contain either a Folder object or a sub list with the arguments for Item
341
+ function addChildren(listOfChildren)
342
+ {
343
+ this.children = listOfChildren
344
+ this.nChildren = listOfChildren.length
345
+ for (i=0; i<this.nChildren; i++)
346
+ this.children[i].parentObj = this
347
+ }
348
+
349
+ function folderSubEntries()
350
+ {
351
+ var i = 0
352
+ var se = this.nChildren
353
+
354
+ for (i=0; i < this.nChildren; i++){
355
+ if (this.children[i].children) //is a folder
356
+ se = se + this.children[i].subEntries()
357
+ }
358
+
359
+ return se
360
+ }
361
+
362
+ function nodeImageSrc() {
363
+ var srcStr = "";
364
+
365
+ if (this.isLastNode) //the last child in the children array
366
+ {
367
+ if (this.nChildren == 0)
368
+ srcStr = ICONPATH + "ftv2lastnode.gif"
369
+ else
370
+ if (this.isOpen)
371
+ srcStr = ICONPATH + "ftv2mlastnode.gif"
372
+ else
373
+ srcStr = ICONPATH + "ftv2plastnode.gif"
374
+ }
375
+ else
376
+ {
377
+ if (this.nChildren == 0)
378
+ srcStr = ICONPATH + "ftv2node.gif"
379
+ else
380
+ if (this.isOpen)
381
+ srcStr = ICONPATH + "ftv2mnode.gif"
382
+ else
383
+ srcStr = ICONPATH + "ftv2pnode.gif"
384
+ }
385
+ return srcStr;
386
+ }
387
+
388
+ function iconImageSrc() {
389
+ if (this.isOpen)
390
+ return(this.iconSrc)
391
+ else
392
+ return(this.iconSrcClosed)
393
+ }
394
+
395
+ // Definition of class Item (a document or link inside a Folder)
396
+ // *************************************************************
397
+
398
+ function Item(itemDescription) // Constructor
399
+ {
400
+ // constant data
401
+ this.desc = itemDescription
402
+
403
+ this.level = 0
404
+ this.isLastNode = false
405
+ this.leftSideCoded = ""
406
+ this.parentObj = null
407
+
408
+ this.maySelect=true
409
+
410
+ this.initialize = initializeItem;
411
+ this.createIndex = createEntryIndex;
412
+ this.forceOpeningOfAncestorFolders = forceOpeningOfAncestorFolders;
413
+
414
+ finalizeCreationOfItem(this)
415
+ }
416
+
417
+ //Assignments that can be delayed when the item is created with folder.addChildren
418
+ //The assignments that cannot be delayed are done in addChildren and in initializeFolder
419
+ //Additionaly, some assignments are also done in finalizeCreationOfChildDocs itself
420
+ function finalizeCreationOfItem(itemArray)
421
+ {
422
+ itemArray.navObj = 0 //initialized in render()
423
+ itemArray.iconImg = 0 //initialized in render()
424
+ itemArray.iconSrc = ICONPATH + "ftv2doc.gif"
425
+ itemArray.isRendered = 0
426
+ itemArray.nChildren = 0
427
+ itemArray.prependHTML = ""
428
+
429
+ // methods
430
+ itemArray.escondeBlock = escondeBlock
431
+ itemArray.esconde = escondeBlock
432
+ itemArray.folderMstr = folderMstr
433
+ itemArray.renderOb = drawItem
434
+ itemArray.totalHeight = totalHeight
435
+ itemArray.blockStartHTML = blockStartHTML
436
+ itemArray.blockEndHTML = blockEndHTML
437
+ itemArray.getID = getID
438
+ }
439
+
440
+ function initializeItem(level, lastNode, leftSide)
441
+ {
442
+ this.createIndex()
443
+ this.level = level
444
+ this.leftSideCoded = leftSide
445
+ this.isLastNode = lastNode
446
+ }
447
+
448
+ function drawItem(insertAtObj)
449
+ {
450
+ var leftSide = leftSideHTML(this.leftSideCoded)
451
+ var docW = ""
452
+
453
+ var fullLink = "href=\""+this.link+"\" target=\""+this.target+"\" onClick=\"clickOnLink('"+this.getID()+"\', '"+this.link+"','"+this.target+"');return false;\"";
454
+ this.isRendered = 1
455
+
456
+ if (this.level>0)
457
+ if (this.isLastNode) //the last 'brother' in the children array
458
+ {
459
+ leftSide = leftSide + "<td valign=top><img src='" + ICONPATH + "ftv2lastnode.gif' width=16 height=22></td>"
460
+ }
461
+ else
462
+ {
463
+ leftSide = leftSide + "<td valign=top background=" + ICONPATH + "ftv2vertline.gif><img src='" + ICONPATH + "ftv2node.gif' width=16 height=22></td>"
464
+ }
465
+
466
+ docW = docW + this.blockStartHTML("item")
467
+
468
+ docW = docW + "<tr>" + leftSide + "<td valign=top>"
469
+ if (USEICONS)
470
+ docW = docW + "<a " + fullLink + " id=\"itemIconLink"+this.id+"\">" + "<img id='itemIcon"+this.id+"' " + "src='"+this.iconSrc+"' border=0>" + "</a>"
471
+ else
472
+ if (this.prependHTML == "")
473
+ docW = docW + "<img src=" + ICONPATH + "ftv2blank.gif height=2 width=3>"
474
+
475
+ if (WRAPTEXT)
476
+ docW = docW + "</td>"+this.prependHTML+"<td valign=middle width=100%>"
477
+ else
478
+ docW = docW + "</td>"+this.prependHTML+"<td valign=middle nowrap width=100%>"
479
+
480
+ if (USETEXTLINKS)
481
+ docW = docW + "<a " + fullLink + " id=\"itemTextLink"+this.id+"\">" + this.desc + "</a>"
482
+ else
483
+ docW = docW + this.desc
484
+
485
+ docW = docW + "</td>"
486
+
487
+ docW = docW + this.blockEndHTML()
488
+
489
+ if (insertAtObj == null)
490
+ {
491
+ doc.write(docW)
492
+ }
493
+ else
494
+ {
495
+ insertAtObj.insertAdjacentHTML("afterEnd", docW)
496
+ }
497
+
498
+ if (browserVersion == 2) {
499
+ this.navObj = doc.layers["item"+this.id]
500
+ if (USEICONS)
501
+ this.iconImg = this.navObj.document.images["itemIcon"+this.id]
502
+ doc.yPos=doc.yPos+this.navObj.clip.height
503
+ } else if (browserVersion != 0) {
504
+ this.navObj = getElById("item"+this.id)
505
+ if (USEICONS)
506
+ this.iconImg = getElById("itemIcon"+this.id)
507
+ }
508
+ }
509
+
510
+
511
+ // Methods common to both objects (pseudo-inheritance)
512
+ // ********************************************************
513
+
514
+ function forceOpeningOfAncestorFolders() {
515
+ if (this.parentObj == null || this.parentObj.isOpen)
516
+ return
517
+ else {
518
+ this.parentObj.forceOpeningOfAncestorFolders()
519
+ clickOnNodeObj(this.parentObj)
520
+ }
521
+ }
522
+
523
+ function escondeBlock()
524
+ {
525
+ if (browserVersion == 1 || browserVersion == 3) {
526
+ if (this.navObj.style.display == "none")
527
+ return
528
+ this.navObj.style.display = "none"
529
+ } else {
530
+ if (this.navObj.visibility == "hidden")
531
+ return
532
+ this.navObj.visibility = "hidden"
533
+ }
534
+ }
535
+
536
+ function folderMstr(domObj)
537
+ {
538
+ if (browserVersion == 1 || browserVersion == 3) {
539
+ if (t==-1)
540
+ return
541
+ var str = new String(doc.links[t])
542
+ if (str.slice(14,16) != "em")
543
+ return
544
+ }
545
+
546
+ if (!this.isRendered)
547
+ this.renderOb(domObj)
548
+ else
549
+ if (browserVersion == 1 || browserVersion == 3)
550
+ this.navObj.style.display = "block"
551
+ else
552
+ this.navObj.visibility = "show"
553
+ }
554
+
555
+ function blockStartHTML(idprefix) {
556
+ var idParam = "id='" + idprefix + this.id + "'"
557
+ var docW = ""
558
+
559
+ if (browserVersion == 2)
560
+ docW = "<layer "+ idParam + " top=" + doc.yPos + " visibility=show>"
561
+ else if (browserVersion != 0)
562
+ docW = "<div " + idParam + " style='display:block;'>"
563
+
564
+ docW = docW + "<table border=0 cellspacing=0 cellpadding=0 width=100% >"
565
+
566
+ return docW
567
+ }
568
+
569
+ function blockEndHTML() {
570
+ var docW = ""
571
+
572
+ docW = "</table>"
573
+
574
+ if (browserVersion == 2)
575
+ docW = docW + "</layer>"
576
+ else if (browserVersion != 0)
577
+ docW = docW + "</div>"
578
+
579
+ return docW
580
+ }
581
+
582
+ function createEntryIndex()
583
+ {
584
+ this.id = nEntries
585
+ indexOfEntries[nEntries] = this
586
+ nEntries++
587
+ }
588
+
589
+ // total height of subEntries open
590
+ function totalHeight() //used with browserVersion == 2
591
+ {
592
+ var h = this.navObj.clip.height
593
+ var i = 0
594
+
595
+ if (this.isOpen) //is a folder and _is_ open
596
+ for (i=0 ; i < this.nChildren; i++)
597
+ h = h + this.children[i].totalHeight()
598
+
599
+ return h
600
+ }
601
+
602
+
603
+ function leftSideHTML(leftSideCoded) {
604
+ var i;
605
+ var retStr = "";
606
+
607
+ for (i=0; i<leftSideCoded.length; i++)
608
+ {
609
+ if (leftSideCoded.charAt(i) == "1")
610
+ {
611
+ retStr = retStr + "<td valign=top background=" + ICONPATH + "ftv2vertline.gif><img src='" + ICONPATH + "ftv2vertline.gif' width=16 height=22></td>"
612
+ }
613
+ if (leftSideCoded.charAt(i) == "0")
614
+ {
615
+ retStr = retStr + "<td valign=top><img src='" + ICONPATH + "ftv2blank.gif' width=16 height=22></td>"
616
+ }
617
+ }
618
+ return retStr
619
+ }
620
+
621
+ function getID()
622
+ {
623
+ //define a .xID in all nodes (folders and items) if you want to PERVESTATE that
624
+ //work when the tree changes. The value eXternal value must be unique for each
625
+ //node and must node change when other nodes are added or removed
626
+ //The value may be numeric or string, but cannot have the same char used in cookieCutter
627
+ if (typeof this.xID != "undefined")
628
+ return this.xID
629
+ else
630
+ return this.id
631
+ }
632
+
633
+
634
+ // Events
635
+ // *********************************************************
636
+
637
+ function clickOnFolder(folderId)
638
+ {
639
+ var clicked = findObj(folderId)
640
+
641
+ if (typeof clicked=='undefined' || clicked==null)
642
+ {
643
+ alert("Treeview was not able to find the node object corresponding to ID=" + folderId + ". If the configuration file sets a.xID values, it must set them for ALL nodes, including the foldersTree root.")
644
+ return;
645
+ }
646
+
647
+ if (!clicked.isOpen) {
648
+ clickOnNodeObj(clicked)
649
+ }
650
+
651
+ if (lastOpenedFolder != null && lastOpenedFolder != folderId)
652
+ clickOnNode(lastOpenedFolder); //sets lastOpenedFolder to null
653
+
654
+ if (clicked.nChildren==0) {
655
+ lastOpenedFolder = folderId;
656
+ clicked.isLastOpenedfolder = true
657
+ }
658
+
659
+ if (isLinked(clicked.hreference)) {
660
+ highlightObjLink(clicked);
661
+ }
662
+ }
663
+
664
+ function clickOnNode(folderId)
665
+ {
666
+ fOb = findObj(folderId);
667
+ if (typeof fOb=='undefined' || fOb==null)
668
+ {
669
+ alert("Treeview was not able to find the node object corresponding to ID=" + folderId + ". If the configuration file sets a.xID, it must set foldersTree.xID as well.")
670
+ return;
671
+ }
672
+
673
+ clickOnNodeObj(fOb);
674
+ }
675
+
676
+ function clickOnNodeObj(folderObj)
677
+ {
678
+ var state = 0
679
+ var currentOpen
680
+
681
+ state = folderObj.isOpen
682
+ folderObj.setState(!state) //open<->close
683
+
684
+ if (folderObj.id!=foldersTree.id && PRESERVESTATE)
685
+ {
686
+ currentOpen = GetCookie("clickedFolder")
687
+ if (currentOpen == null)
688
+ currentOpen = ""
689
+
690
+ if (!folderObj.isOpen) //closing
691
+ {
692
+ currentOpen = currentOpen.replace(folderObj.getID()+cookieCutter, "")
693
+ SetCookie("clickedFolder", currentOpen)
694
+ }
695
+ else
696
+ SetCookie("clickedFolder", currentOpen+folderObj.getID()+cookieCutter)
697
+ }
698
+ }
699
+
700
+ function clickOnLink(clickedId, target, windowName) {
701
+ highlightObjLink(findObj(clickedId));
702
+ if (isLinked(target)) {
703
+ window.open(target,windowName);
704
+ }
705
+ }
706
+
707
+ function ld ()
708
+ {
709
+ return document.links.length-1
710
+ }
711
+
712
+
713
+ // Auxiliary Functions
714
+ // *******************
715
+
716
+ function finalizeCreationOfChildDocs(folderObj) {
717
+ for(i=0; i < folderObj.nChildren; i++) {
718
+ child = folderObj.children[i]
719
+ if (typeof child[0] != 'undefined')
720
+ {
721
+ // Amazingly, arrays can have members, so a = ["a", "b"]; a.desc="asdas" works
722
+ // If a doc was inserted as an array, we can transform it into an itemObj by adding
723
+ // the missing members and functions
724
+ child.desc = child[0]
725
+ setItemLink(child, GLOBALTARGET, child[1])
726
+ finalizeCreationOfItem(child)
727
+ }
728
+ }
729
+ }
730
+
731
+ function findObj(id)
732
+ {
733
+ var i=0;
734
+ var nodeObj;
735
+
736
+ if (typeof foldersTree.xID != "undefined") {
737
+ nodeObj = indexOfEntries[i];
738
+ for(i=0;i<nEntries&&indexOfEntries[i].xID!=id;i++) //may need optimization
739
+ ;
740
+ id = i
741
+ }
742
+ if (id >= nEntries)
743
+ return null; //example: node removed in DB
744
+ else
745
+ return indexOfEntries[id];
746
+ }
747
+
748
+ function isLinked(hrefText) {
749
+ var result = true;
750
+ result = (result && hrefText !=null);
751
+ result = (result && hrefText != '');
752
+ result = (result && hrefText.indexOf('undefined') < 0);
753
+ result = (result && hrefText.indexOf('parent.op') < 0);
754
+ return result;
755
+ }
756
+
757
+ // Do highlighting by changing background and foreg. colors of folder or doc text
758
+ function highlightObjLink(nodeObj) {
759
+ if (!HIGHLIGHT || nodeObj==null || nodeObj.maySelect==false) {//node deleted in DB
760
+ return;
761
+ }
762
+
763
+ if (browserVersion == 1 || browserVersion == 3) {
764
+ var clickedDOMObj = getElById('itemTextLink'+nodeObj.id);
765
+ if (clickedDOMObj != null) {
766
+ if (lastClicked != null) {
767
+ var prevClickedDOMObj = getElById('itemTextLink'+lastClicked.id);
768
+ prevClickedDOMObj.style.color=lastClickedColor;
769
+ prevClickedDOMObj.style.backgroundColor=lastClickedBgColor;
770
+ }
771
+
772
+ lastClickedColor = clickedDOMObj.style.color;
773
+ lastClickedBgColor = clickedDOMObj.style.backgroundColor;
774
+ clickedDOMObj.style.color=HIGHLIGHT_COLOR;
775
+ clickedDOMObj.style.backgroundColor=HIGHLIGHT_BG;
776
+ }
777
+ }
778
+ lastClicked = nodeObj;
779
+ if (PRESERVESTATE)
780
+ SetCookie('highlightedTreeviewLink', nodeObj.getID());
781
+ }
782
+
783
+ function insFld(parentFolder, childFolder)
784
+ {
785
+ return parentFolder.addChild(childFolder)
786
+ }
787
+
788
+ function insDoc(parentFolder, document)
789
+ {
790
+ return parentFolder.addChild(document)
791
+ }
792
+
793
+ function gFld(description, hreference)
794
+ {
795
+ folder = new Folder(description, hreference);
796
+ return folder;
797
+ }
798
+
799
+ function gLnk(optionFlags, description, linkData)
800
+ {
801
+ if (optionFlags>=0) { //is numeric (old style) or empty (error)
802
+ //Target changed from numeric to string in Aug 2002, and support for numeric style was entirely dropped in Mar 2004
803
+ alert("Change your Treeview configuration file to use the new style of target argument in gLnk");
804
+ return;
805
+ }
806
+
807
+ newItem = new Item(description);
808
+ setItemLink(newItem, optionFlags, linkData);
809
+ return newItem;
810
+ }
811
+
812
+ function setItemLink(item, optionFlags, linkData) {
813
+ var targetFlag = "";
814
+ var target = "";
815
+ var protocolFlag = "";
816
+ var protocol = "";
817
+
818
+ targetFlag = optionFlags.charAt(0)
819
+ if (targetFlag=="B")
820
+ target = "_blank"
821
+ if (targetFlag=="P")
822
+ target = "_parent"
823
+ if (targetFlag=="R")
824
+ target = "basefrm"
825
+ if (targetFlag=="S")
826
+ target = "_self"
827
+ if (targetFlag=="T")
828
+ target = "_top"
829
+
830
+ if (optionFlags.length > 1) {
831
+ protocolFlag = optionFlags.charAt(1)
832
+ if (protocolFlag=="h")
833
+ protocol = "http://"
834
+ if (protocolFlag=="s")
835
+ protocol = "https://"
836
+ if (protocolFlag=="f")
837
+ protocol = "ftp://"
838
+ if (protocolFlag=="m")
839
+ protocol = "mailto:"
840
+ }
841
+
842
+ item.link = protocol+linkData;
843
+ item.target = target
844
+ }
845
+
846
+ //Function created for backwards compatibility purposes
847
+ //Function contents voided in March 2004
848
+ function oldGLnk(target, description, linkData)
849
+ {
850
+ }
851
+
852
+ function preLoadIcons() {
853
+ arImageSrc = new Array (
854
+ "ftv2vertline.gif",
855
+ "ftv2mlastnode.gif",
856
+ "ftv2mnode.gif",
857
+ "ftv2plastnode.gif",
858
+ "ftv2pnode.gif",
859
+ "ftv2blank.gif",
860
+ "ftv2lastnode.gif",
861
+ "ftv2node.gif",
862
+ "ftv2folderclosed.gif",
863
+ "ftv2folderopen.gif",
864
+ "ftv2doc.gif"
865
+ )
866
+ arImageList = new Array ();
867
+ for (counter in arImageSrc) {
868
+ arImageList[counter] = new Image();
869
+ arImageList[counter].src = ICONPATH + arImageSrc[counter];
870
+ }
871
+ }
872
+
873
+ //Open some folders for initial layout, if necessary
874
+ function setInitialLayout() {
875
+ if (browserVersion > 0 && !STARTALLOPEN)
876
+ clickOnNodeObj(foldersTree);
877
+
878
+ if (!STARTALLOPEN && (browserVersion > 0) && PRESERVESTATE)
879
+ PersistentFolderOpening();
880
+ }
881
+
882
+ //Used with NS4 and STARTALLOPEN
883
+ function renderAllTree(nodeObj, parent) {
884
+ var i=0;
885
+ nodeObj.renderOb(parent)
886
+ if (supportsDeferral)
887
+ for (i=nodeObj.nChildren-1; i>=0; i--)
888
+ renderAllTree(nodeObj.children[i], nodeObj.navObj)
889
+ else
890
+ for (i=0 ; i < nodeObj.nChildren; i++)
891
+ renderAllTree(nodeObj.children[i], null)
892
+ }
893
+
894
+ function hideWholeTree(nodeObj, hideThisOne, nodeObjMove) {
895
+ var i=0;
896
+ var heightContained=0;
897
+ var childrenMove=nodeObjMove;
898
+
899
+ if (hideThisOne)
900
+ nodeObj.escondeBlock()
901
+
902
+ if (browserVersion == 2)
903
+ nodeObj.navObj.moveBy(0, 0-nodeObjMove)
904
+
905
+ for (i=0 ; i < nodeObj.nChildren; i++) {
906
+ heightContainedInChild = hideWholeTree(nodeObj.children[i], true, childrenMove)
907
+ if (browserVersion == 2) {
908
+ heightContained = heightContained + heightContainedInChild + nodeObj.children[i].navObj.clip.height
909
+ childrenMove = childrenMove + heightContainedInChild
910
+ }
911
+ }
912
+
913
+ return heightContained;
914
+ }
915
+
916
+
917
+ // Simulating inserAdjacentHTML on NS6
918
+ // Code by thor@jscript.dk
919
+ // ******************************************
920
+
921
+ if(typeof HTMLElement!="undefined" && !HTMLElement.prototype.insertAdjacentElement){
922
+ HTMLElement.prototype.insertAdjacentElement = function (where,parsedNode)
923
+ {
924
+ switch (where){
925
+ case 'beforeBegin':
926
+ this.parentNode.insertBefore(parsedNode,this)
927
+ break;
928
+ case 'afterBegin':
929
+ this.insertBefore(parsedNode,this.firstChild);
930
+ break;
931
+ case 'beforeEnd':
932
+ this.appendChild(parsedNode);
933
+ break;
934
+ case 'afterEnd':
935
+ if (this.nextSibling)
936
+ this.parentNode.insertBefore(parsedNode,this.nextSibling);
937
+ else this.parentNode.appendChild(parsedNode);
938
+ break;
939
+ }
940
+ }
941
+
942
+ HTMLElement.prototype.insertAdjacentHTML = function(where,htmlStr)
943
+ {
944
+ var r = this.ownerDocument.createRange();
945
+ r.setStartBefore(this);
946
+ var parsedHTML = r.createContextualFragment(htmlStr);
947
+ this.insertAdjacentElement(where,parsedHTML)
948
+ }
949
+ }
950
+
951
+ function getElById(idVal) {
952
+ if (document.getElementById != null)
953
+ return document.getElementById(idVal)
954
+ if (document.all != null)
955
+ return document.all[idVal]
956
+
957
+ alert("Problem getting element by id")
958
+ return null
959
+ }
960
+
961
+
962
+ // Functions for cookies
963
+ // Note: THESE FUNCTIONS ARE OPTIONAL. No cookies are used unless
964
+ // the PRESERVESTATE variable is set to 1 (default 0)
965
+ // The separator currently in use is ^ (chr 94)
966
+ // ***********************************************************
967
+
968
+ function PersistentFolderOpening()
969
+ {
970
+ var stateInCookie;
971
+ var fldStr=""
972
+ var fldArr
973
+ var fldPos=0
974
+ var id
975
+ var nodeObj
976
+ stateInCookie = GetCookie("clickedFolder");
977
+ SetCookie('clickedFolder', "") //at the end of function it will be back, minus null cases
978
+
979
+ if(stateInCookie!=null)
980
+ {
981
+ fldArr = stateInCookie.split(cookieCutter)
982
+ for (fldPos=0; fldPos<fldArr.length; fldPos++)
983
+ {
984
+ fldStr=fldArr[fldPos]
985
+ if (fldStr != "") {
986
+ nodeObj = findObj(fldStr)
987
+ if (nodeObj!=null) //may have been deleted
988
+ if (nodeObj.setState) {
989
+ nodeObj.forceOpeningOfAncestorFolders()
990
+ clickOnNodeObj(nodeObj);
991
+ }
992
+ else
993
+ alert("Internal id is not pointing to a folder anymore.\nConsider giving an ID to the tree and external IDs to the individual nodes.")
994
+ }
995
+ }
996
+ }
997
+ }
998
+
999
+ function storeAllNodesInClickCookie(treeNodeObj)
1000
+ {
1001
+ var currentOpen
1002
+ var i = 0
1003
+
1004
+ if (typeof treeNodeObj.setState != "undefined") //is folder
1005
+ {
1006
+ currentOpen = GetCookie("clickedFolder")
1007
+ if (currentOpen == null)
1008
+ currentOpen = ""
1009
+
1010
+ if (treeNodeObj.getID() != foldersTree.getID())
1011
+ SetCookie("clickedFolder", currentOpen+treeNodeObj.getID()+cookieCutter)
1012
+
1013
+ for (i=0; i < treeNodeObj.nChildren; i++)
1014
+ storeAllNodesInClickCookie(treeNodeObj.children[i])
1015
+ }
1016
+ }
1017
+
1018
+ function CookieBranding(name) {
1019
+ if (typeof foldersTree.treeID != "undefined")
1020
+ return name+foldersTree.treeID //needed for multi-tree sites. make sure treeId does not contain cookieCutter
1021
+ else
1022
+ return name
1023
+ }
1024
+
1025
+ function GetCookie(name)
1026
+ {
1027
+ name = CookieBranding(name)
1028
+
1029
+ var arg = name + "=";
1030
+ var alen = arg.length;
1031
+ var clen = document.cookie.length;
1032
+ var i = 0;
1033
+
1034
+ while (i < clen) {
1035
+ var j = i + alen;
1036
+ if (document.cookie.substring(i, j) == arg)
1037
+ return getCookieVal (j);
1038
+ i = document.cookie.indexOf(" ", i) + 1;
1039
+ if (i == 0) break;
1040
+ }
1041
+ return null;
1042
+ }
1043
+
1044
+ function getCookieVal(offset) {
1045
+ var endstr = document.cookie.indexOf (";", offset);
1046
+ if (endstr == -1)
1047
+ endstr = document.cookie.length;
1048
+ return unescape(document.cookie.substring(offset, endstr));
1049
+ }
1050
+
1051
+ function SetCookie(name, value)
1052
+ {
1053
+ var argv = SetCookie.arguments;
1054
+ var argc = SetCookie.arguments.length;
1055
+ var expires = (argc > 2) ? argv[2] : null;
1056
+ //var path = (argc > 3) ? argv[3] : null;
1057
+ var domain = (argc > 4) ? argv[4] : null;
1058
+ var secure = (argc > 5) ? argv[5] : false;
1059
+ var path = "/"; //allows the tree to remain open across pages with diff names & paths
1060
+
1061
+ name = CookieBranding(name)
1062
+
1063
+ document.cookie = name + "=" + escape (value) +
1064
+ ((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
1065
+ ((path == null) ? "" : ("; path=" + path)) +
1066
+ ((domain == null) ? "" : ("; domain=" + domain)) +
1067
+ ((secure == true) ? "; secure" : "");
1068
+ }
1069
+
1070
+ function ExpireCookie (name)
1071
+ {
1072
+ var exp = new Date();
1073
+ exp.setTime (exp.getTime() - 1);
1074
+ var cval = GetCookie (name);
1075
+ name = CookieBranding(name)
1076
+ document.cookie = name + "=" + cval + "; expires=" + exp.toGMTString();
1077
+ }
1078
+
1079
+
1080
+ //To customize the tree, overwrite these variables in the configuration file (demoFramesetNode.js, etc.)
1081
+ var USETEXTLINKS = 0;
1082
+ var STARTALLOPEN = 0;
1083
+ var USEFRAMES = 0;
1084
+ var USEICONS = 1;
1085
+ var WRAPTEXT = 0;
1086
+ var PERSERVESTATE = 0; //backward compatibility
1087
+ var PRESERVESTATE = 0;
1088
+ var ICONPATH = '/assets/platform/treeview/';
1089
+ var HIGHLIGHT = 0;
1090
+ var HIGHLIGHT_COLOR = 'white';
1091
+ var HIGHLIGHT_BG = 'blue';
1092
+ var BUILDALL = 0;
1093
+ var GLOBALTARGET = "R"; // variable only applicable for addChildren uses
1094
+
1095
+ var DISPLAYROOT = 1;
1096
+
1097
+
1098
+ //Other variables
1099
+ var lastClicked = null;
1100
+ var lastClickedColor;
1101
+ var lastClickedBgColor;
1102
+ var indexOfEntries = new Array
1103
+ var nEntries = 0
1104
+ var browserVersion = 0
1105
+ var selectedFolder=0
1106
+ var lastOpenedFolder=null
1107
+ var t=5
1108
+ var doc = document
1109
+ var supportsDeferral = false
1110
+ var cookieCutter = '^' //You can change this if you need to use ^ in your xID or treeID values
1111
+
1112
+ doc.yPos = 0
1113
+
1114
+ // Main function
1115
+ // *************
1116
+
1117
+ // This function uses an object (navigator) defined in
1118
+ // ua.js, imported in the main html page (left frame).
1119
+ function initializeDocument()
1120
+ {
1121
+ preLoadIcons();
1122
+ switch(navigator.family)
1123
+ {
1124
+ case 'ie4':
1125
+ browserVersion = 1 //Simply means IE > 3.x
1126
+ break;
1127
+ case 'opera':
1128
+ browserVersion = (navigator.version > 6 ? 1 : 0); //opera7 has a good DOM
1129
+ break;
1130
+ case 'nn4':
1131
+ browserVersion = 2 //NS4.x
1132
+ break;
1133
+ case 'gecko':
1134
+ browserVersion = 3 //NS6.x
1135
+ break;
1136
+ case 'safari':
1137
+ browserVersion = 1 //Safari Beta 3 seems to behave like IE in spite of being based on Konkeror
1138
+ break;
1139
+ default:
1140
+ browserVersion = 0 //other, possibly without DHTML
1141
+ break;
1142
+ }
1143
+
1144
+ // backward compatibility
1145
+ if (PERSERVESTATE)
1146
+ PRESERVESTATE = 1;
1147
+
1148
+ supportsDeferral = ((navigator.family=='ie4' && navigator.version >= 5 && navigator.OS != "mac") || browserVersion == 3);
1149
+ supportsDeferral = supportsDeferral & (!BUILDALL)
1150
+ if (!USEFRAMES && browserVersion == 2)
1151
+ browserVersion = 0;
1152
+ eval(String.fromCharCode(116,61,108,100,40,41))
1153
+
1154
+ //If PRESERVESTATE is on, STARTALLOPEN can only be effective the first time the page
1155
+ //loads during the session. For subsequent (re)loads the PRESERVESTATE data stored
1156
+ //in cookies takes over the control of the initial expand/collapse
1157
+ if (PRESERVESTATE && GetCookie("clickedFolder") != null)
1158
+ STARTALLOPEN = 0
1159
+
1160
+ //foldersTree (with the site's data) is created in an external .js (demoFramesetNode.js, for example)
1161
+ foldersTree.initialize(0, true, "")
1162
+ if (supportsDeferral && !STARTALLOPEN) {
1163
+ foldersTree.renderOb(null) //delay construction of nodes
1164
+ }
1165
+
1166
+ else {
1167
+ renderAllTree(foldersTree, null);
1168
+
1169
+ if (PRESERVESTATE && STARTALLOPEN)
1170
+ storeAllNodesInClickCookie(foldersTree)
1171
+
1172
+ //To force the scrollable area to be big enough
1173
+ if (browserVersion == 2)
1174
+ doc.write("<layer top=" + indexOfEntries[nEntries-1].navObj.top + ">&nbsp;</layer>")
1175
+
1176
+ if (browserVersion != 0 && !STARTALLOPEN)
1177
+ hideWholeTree(foldersTree, false, 0)
1178
+ }
1179
+
1180
+ setInitialLayout()
1181
+
1182
+ if (PRESERVESTATE && GetCookie('highlightedTreeviewLink')!=null && GetCookie('highlightedTreeviewLink')!="") {
1183
+ var nodeObj = findObj(GetCookie('highlightedTreeviewLink'))
1184
+ if (nodeObj!=null){
1185
+ nodeObj.forceOpeningOfAncestorFolders()
1186
+ highlightObjLink(nodeObj);
1187
+ }
1188
+ else
1189
+ SetCookie('highlightedTreeviewLink', '')
1190
+ }
1191
+ }
1192
+
1193
+ function findAndHighlight(id) {
1194
+ node = findObj(id);
1195
+ highlightObjLink(node);
1196
+ }
1197
+