platform 3.1.1

Sign up to get free protection for your applications and to get access to all the features.
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
+