wagn 1.12.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (875) hide show
  1. data/.gitignore +24 -0
  2. data/.rspec +4 -0
  3. data/CONTRIBUTING.rdoc +13 -0
  4. data/GPL +331 -0
  5. data/Gemfile +87 -0
  6. data/LICENSE +16 -0
  7. data/README.rdoc +103 -0
  8. data/Rakefile +7 -0
  9. data/VERSION +1 -0
  10. data/app/assets/images/body-bg.bmp +0 -0
  11. data/app/assets/images/body-bg.png +0 -0
  12. data/app/assets/images/external_link.png +0 -0
  13. data/app/assets/images/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  14. data/app/assets/images/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  15. data/app/assets/images/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  16. data/app/assets/images/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  17. data/app/assets/images/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  18. data/app/assets/images/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  19. data/app/assets/images/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  20. data/app/assets/images/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  21. data/app/assets/images/images/ui-icons_222222_256x240.png +0 -0
  22. data/app/assets/images/images/ui-icons_2e83ff_256x240.png +0 -0
  23. data/app/assets/images/images/ui-icons_454545_256x240.png +0 -0
  24. data/app/assets/images/images/ui-icons_888888_256x240.png +0 -0
  25. data/app/assets/images/images/ui-icons_cd0a0a_256x240.png +0 -0
  26. data/app/assets/javascripts/application.js +25 -0
  27. data/app/assets/javascripts/html5shiv-printshiv.js +499 -0
  28. data/app/assets/javascripts/jquery.autosize.js +254 -0
  29. data/app/assets/javascripts/jquery.fileupload.js +1111 -0
  30. data/app/assets/javascripts/jquery.iframe-transport.js +156 -0
  31. data/app/assets/javascripts/jquery.ui.autocomplete.html.js +40 -0
  32. data/app/assets/javascripts/wagn.js.coffee +288 -0
  33. data/app/assets/javascripts/wagn_menu.js +76 -0
  34. data/app/assets/javascripts/wagn_mod.js.coffee +401 -0
  35. data/app/controllers/account_controller.rb +67 -0
  36. data/app/controllers/admin_controller.rb +130 -0
  37. data/app/controllers/card_controller.rb +163 -0
  38. data/app/controllers/stub_card_controller.rb +9 -0
  39. data/app/controllers/wagn_controller.rb +123 -0
  40. data/app/mailers/.gitkeep +0 -0
  41. data/app/mailers/mailer.rb +108 -0
  42. data/app/models/.gitkeep +0 -0
  43. data/app/models/account.rb +196 -0
  44. data/app/models/card.rb +42 -0
  45. data/app/models/card/reference.rb +71 -0
  46. data/app/models/card/revision.rb +45 -0
  47. data/app/models/user.rb +123 -0
  48. data/app/views/mailer/account_info.text.erb +17 -0
  49. data/app/views/mailer/change_notice.html.erb +32 -0
  50. data/app/views/mailer/flexmail.html.erb +6 -0
  51. data/app/views/mailer/signup_alert.html.erb +14 -0
  52. data/bin/wagn +9 -0
  53. data/config.ru +4 -0
  54. data/config/application.rb +15 -0
  55. data/config/boot.rb +8 -0
  56. data/config/environment.rb +8 -0
  57. data/config/environments/cucumber.rb +30 -0
  58. data/config/environments/development.rb +59 -0
  59. data/config/environments/production.rb +65 -0
  60. data/config/environments/profile.rb +28 -0
  61. data/config/environments/test.rb +45 -0
  62. data/config/initializers/01_init_ruby_extensions.rb +76 -0
  63. data/config/initializers/airbrake.rb +10 -0
  64. data/config/initializers/backtrace_silencers.rb +8 -0
  65. data/config/initializers/inflections.rb +13 -0
  66. data/config/initializers/mime_types.rb +13 -0
  67. data/config/initializers/notification.rb +4 -0
  68. data/config/initializers/recaptcha.rb +6 -0
  69. data/config/initializers/schema_views.rb +59 -0
  70. data/config/initializers/secret_token.rb +9 -0
  71. data/config/initializers/session_store.rb +9 -0
  72. data/config/initializers/uuid_state_file.rb +2 -0
  73. data/config/initializers/wrap_parameters.rb +15 -0
  74. data/config/routes.rb +45 -0
  75. data/config/samples/asset_htaccess +9 -0
  76. data/config/samples/cucumber.yml +8 -0
  77. data/config/samples/database.yml.erb +34 -0
  78. data/config/samples/robots.txt +12 -0
  79. data/config/version.txt +1 -0
  80. data/config/version_cards.txt +1 -0
  81. data/db/bootstrap/card_references.yml +1478 -0
  82. data/db/bootstrap/card_revisions.yml +3561 -0
  83. data/db/bootstrap/cards.yml +7192 -0
  84. data/db/bootstrap/users.yml +29 -0
  85. data/db/migrate/20110511221913_require_earlier_migrations.rb +17 -0
  86. data/db/migrate/20120105203350_require_1_8_migrations.rb +15 -0
  87. data/db/migrate/20121111025347_require_1_10_migrations.rb +15 -0
  88. data/db/migrate/20121118114000_split_link_type.rb +16 -0
  89. data/db/migrate/20121118115000_update_link_type.rb +19 -0
  90. data/db/migrate/20130106052640_table_cleanup.rb +25 -0
  91. data/db/migrate/20130109015336_trunk_left.rb +14 -0
  92. data/db/migrate/20130411210957_update_codenames.rb +14 -0
  93. data/db/migrate_cards/20130411191151_renaming_for_menu.rb +56 -0
  94. data/db/migrate_cards/20130411211600_delete_old_related_tab_cards.rb +27 -0
  95. data/db/migrate_cards/20130419215612_import_help_text.rb +23 -0
  96. data/db/migrate_cards/20130823192433_add_style_cards.rb +95 -0
  97. data/db/migrate_cards/20130910183318_move_styles_to_content.rb +19 -0
  98. data/db/migrate_cards/20130920214038_jsonize_tinymce.rb +24 -0
  99. data/db/migrate_cards/20130920291703_update_stylesheets.rb +26 -0
  100. data/db/migrate_cards/20130927191728_account_events.rb +29 -0
  101. data/db/migrate_cards/20131016172445_common_css_patch.rb +21 -0
  102. data/db/migrate_cards/20140110193325_reset_account_request_type.rb +19 -0
  103. data/db/migrate_cards/data/1.11_help_text.json +410 -0
  104. data/db/migrate_cards/data/1.12_stylesheets/classic_cards.scss +101 -0
  105. data/db/migrate_cards/data/1.12_stylesheets/common.scss +226 -0
  106. data/db/migrate_cards/data/1.12_stylesheets/right_sidebar.scss +27 -0
  107. data/db/migrate_cards/data/1.12_stylesheets/traditional.scss +152 -0
  108. data/db/schema.rb +92 -0
  109. data/db/seeds.rb +8 -0
  110. data/features/account_requests.feature +22 -0
  111. data/features/autonaming.feature +21 -0
  112. data/features/content_settings.feature +44 -0
  113. data/features/flexmail.feature +54 -0
  114. data/features/google_maps.feature +31 -0
  115. data/features/hello_wagn.feature +29 -0
  116. data/features/layouts.feature +23 -0
  117. data/features/notifications.feature +31 -0
  118. data/features/pattern_settings.feature +43 -0
  119. data/features/pointer_inputs.feature +81 -0
  120. data/features/presetting_content.feature +12 -0
  121. data/features/step_definitions/email_steps.rb +183 -0
  122. data/features/step_definitions/notification_steps.rb +23 -0
  123. data/features/step_definitions/wagn_steps.rb +207 -0
  124. data/features/step_definitions/web_steps.rb +138 -0
  125. data/features/support/env.rb +58 -0
  126. data/features/support/paths.rb +58 -0
  127. data/features/support/scopes.rb +22 -0
  128. data/features/support/wag_env.rb +11 -0
  129. data/features/table_of_contents.feature +35 -0
  130. data/features/templates.feature +30 -0
  131. data/features/update_includers.feature +68 -0
  132. data/features/virtual_cards.feature +11 -0
  133. data/features/watch.feature +54 -0
  134. data/lib/active_record/foreign_keys.rb +80 -0
  135. data/lib/active_record/quoting_and_matching.rb +72 -0
  136. data/lib/card/chunk.rb +103 -0
  137. data/lib/card/codename.rb +47 -0
  138. data/lib/card/constant.rb +20 -0
  139. data/lib/card/content.rb +206 -0
  140. data/lib/card/diff.rb +317 -0
  141. data/lib/card/exceptions.rb +22 -0
  142. data/lib/card/flexmail.rb +47 -0
  143. data/lib/card/format.rb +541 -0
  144. data/lib/card/name.rb +39 -0
  145. data/lib/card/query.rb +81 -0
  146. data/lib/card/query/card_spec.rb +516 -0
  147. data/lib/card/query/ref_spec.rb +23 -0
  148. data/lib/card/query/spec.rb +21 -0
  149. data/lib/card/query/value_spec.rb +66 -0
  150. data/lib/card/set.rb +239 -0
  151. data/lib/card/set_pattern.rb +140 -0
  152. data/lib/generators/card_migration/USAGE +12 -0
  153. data/lib/generators/card_migration/card_migration_generator.rb +10 -0
  154. data/lib/generators/card_migration/templates/card_migration.erb +16 -0
  155. data/lib/generators/format/USAGE +9 -0
  156. data/lib/generators/format/format_generator.rb +8 -0
  157. data/lib/generators/format/templates/format_spec_template.erb +6 -0
  158. data/lib/generators/format/templates/format_template.erb +3 -0
  159. data/lib/generators/set/USAGE +9 -0
  160. data/lib/generators/set/set_generator.rb +14 -0
  161. data/lib/generators/set/templates/set_spec_template.erb +6 -0
  162. data/lib/generators/set/templates/set_template.erb +1 -0
  163. data/lib/generators/wagn/USAGE +8 -0
  164. data/lib/generators/wagn/templates/Gemfile +5 -0
  165. data/lib/generators/wagn/templates/Rakefile +7 -0
  166. data/lib/generators/wagn/templates/config.ru +5 -0
  167. data/lib/generators/wagn/templates/config/application.rb +47 -0
  168. data/lib/generators/wagn/templates/config/boot.rb +11 -0
  169. data/lib/generators/wagn/templates/config/database.yml +35 -0
  170. data/lib/generators/wagn/templates/config/databases/frontbase.yml +31 -0
  171. data/lib/generators/wagn/templates/config/databases/ibm_db.yml +86 -0
  172. data/lib/generators/wagn/templates/config/databases/jdbc.yml +62 -0
  173. data/lib/generators/wagn/templates/config/databases/jdbcmysql.yml +33 -0
  174. data/lib/generators/wagn/templates/config/databases/jdbcpostgresql.yml +43 -0
  175. data/lib/generators/wagn/templates/config/databases/jdbcsqlite3.yml +20 -0
  176. data/lib/generators/wagn/templates/config/databases/mysql.yml +54 -0
  177. data/lib/generators/wagn/templates/config/databases/oracle.yml +39 -0
  178. data/lib/generators/wagn/templates/config/databases/postgresql.yml +55 -0
  179. data/lib/generators/wagn/templates/config/databases/sqlite3.yml +25 -0
  180. data/lib/generators/wagn/templates/config/environment.rb +5 -0
  181. data/lib/generators/wagn/templates/gitignore +18 -0
  182. data/lib/generators/wagn/templates/script/wagn +5 -0
  183. data/lib/generators/wagn/wagn_generator.rb +127 -0
  184. data/lib/tasks/.gitkeep +0 -0
  185. data/lib/tasks/cucumber.rake +68 -0
  186. data/lib/tasks/db.rake +54 -0
  187. data/lib/tasks/test.rake +94 -0
  188. data/lib/tasks/wagn.rake +215 -0
  189. data/lib/wagn.rb +33 -0
  190. data/lib/wagn/all.rb +16 -0
  191. data/lib/wagn/application.rb +96 -0
  192. data/lib/wagn/authenticated_system.rb +38 -0
  193. data/lib/wagn/cache.rb +176 -0
  194. data/lib/wagn/cli.rb +17 -0
  195. data/lib/wagn/commands.rb +2 -0
  196. data/lib/wagn/commands/application.rb +10 -0
  197. data/lib/wagn/env.rb +42 -0
  198. data/lib/wagn/exceptions.rb +10 -0
  199. data/lib/wagn/loader.rb +135 -0
  200. data/lib/wagn/location.rb +88 -0
  201. data/lib/wagn/migration_helper.rb +32 -0
  202. data/lib/wagn/script_wagn_loader.rb +29 -0
  203. data/lib/wagn/spec_helper.rb +99 -0
  204. data/lib/wagn/version.rb +27 -0
  205. data/mods/core/chunks/literal.rb +24 -0
  206. data/mods/core/chunks/reference.rb +41 -0
  207. data/mods/core/chunks/uri.rb +135 -0
  208. data/mods/core/formats/data_format.rb +2 -0
  209. data/mods/core/formats/html_format.rb +319 -0
  210. data/mods/core/formats/text_format.rb +5 -0
  211. data/mods/core/layouts/blank.html +5 -0
  212. data/mods/core/layouts/default.html +20 -0
  213. data/mods/core/layouts/noside.html +16 -0
  214. data/mods/core/layouts/pre.html +2 -0
  215. data/mods/core/layouts/simple.html +5 -0
  216. data/mods/core/set_patterns/01_all.rb +12 -0
  217. data/mods/core/set_patterns/02_all_plus.rb +11 -0
  218. data/mods/core/set_patterns/03_type.rb +19 -0
  219. data/mods/core/set_patterns/04_star.rb +11 -0
  220. data/mods/core/set_patterns/05_rstar.rb +13 -0
  221. data/mods/core/set_patterns/06_right.rb +16 -0
  222. data/mods/core/set_patterns/07_type_plus_right.rb +19 -0
  223. data/mods/core/set_patterns/08_self.rb +15 -0
  224. data/mods/core/sets/all/active_card.rb +21 -0
  225. data/mods/core/sets/all/attribute_tracking.rb +85 -0
  226. data/mods/core/sets/all/collection.rb +46 -0
  227. data/mods/core/sets/all/content.rb +90 -0
  228. data/mods/core/sets/all/fetch.rb +198 -0
  229. data/mods/core/sets/all/initialize.rb +45 -0
  230. data/mods/core/sets/all/name.rb +266 -0
  231. data/mods/core/sets/all/pattern.rb +79 -0
  232. data/mods/core/sets/all/permissions.rb +218 -0
  233. data/mods/core/sets/all/phases.rb +159 -0
  234. data/mods/core/sets/all/references.rb +102 -0
  235. data/mods/core/sets/all/rules.rb +125 -0
  236. data/mods/core/sets/all/states.rb +16 -0
  237. data/mods/core/sets/all/templating.rb +118 -0
  238. data/mods/core/sets/all/tracked_attributes.rb +145 -0
  239. data/mods/core/sets/all/trash.rb +45 -0
  240. data/mods/core/sets/all/type.rb +70 -0
  241. data/mods/core/sets/all/utils.rb +91 -0
  242. data/mods/standard/chunks/include.rb +85 -0
  243. data/mods/standard/chunks/link.rb +84 -0
  244. data/mods/standard/formats/css_format.rb +3 -0
  245. data/mods/standard/formats/csv_format.rb +3 -0
  246. data/mods/standard/formats/email_html_format.rb +9 -0
  247. data/mods/standard/formats/file_format.rb +3 -0
  248. data/mods/standard/formats/json_format.rb +3 -0
  249. data/mods/standard/formats/kml_format.rb +3 -0
  250. data/mods/standard/formats/rss_format.rb +8 -0
  251. data/mods/standard/formats/xml_format.rb +3 -0
  252. data/mods/standard/lib/google_maps_addon.rb +30 -0
  253. data/mods/standard/lib/stylesheets/functional.scss +181 -0
  254. data/mods/standard/lib/stylesheets/jquery-ui-smoothness.css +474 -0
  255. data/mods/standard/lib/stylesheets/standard.scss +614 -0
  256. data/mods/standard/sets/all/account.rb +241 -0
  257. data/mods/standard/sets/all/admin.rb +53 -0
  258. data/mods/standard/sets/all/all_css.rb +39 -0
  259. data/mods/standard/sets/all/all_csv.rb +53 -0
  260. data/mods/standard/sets/all/attach.rb +143 -0
  261. data/mods/standard/sets/all/base.rb +136 -0
  262. data/mods/standard/sets/all/comment.rb +39 -0
  263. data/mods/standard/sets/all/email_html.rb +7 -0
  264. data/mods/standard/sets/all/file.rb +14 -0
  265. data/mods/standard/sets/all/flexmail.rb +3 -0
  266. data/mods/standard/sets/all/follow.rb +117 -0
  267. data/mods/standard/sets/all/geocode.rb +16 -0
  268. data/mods/standard/sets/all/history.rb +112 -0
  269. data/mods/standard/sets/all/json.rb +73 -0
  270. data/mods/standard/sets/all/kml.rb +48 -0
  271. data/mods/standard/sets/all/rich_html.rb +472 -0
  272. data/mods/standard/sets/all/rss.rb +66 -0
  273. data/mods/standard/sets/all/text.rb +9 -0
  274. data/mods/standard/sets/right/account.rb +1 -0
  275. data/mods/standard/sets/right/add_help.rb +1 -0
  276. data/mods/standard/sets/right/comment.rb +3 -0
  277. data/mods/standard/sets/right/create.rb +82 -0
  278. data/mods/standard/sets/right/crypted_password.rb +4 -0
  279. data/mods/standard/sets/right/default.rb +2 -0
  280. data/mods/standard/sets/right/delete.rb +3 -0
  281. data/mods/standard/sets/right/email.rb +5 -0
  282. data/mods/standard/sets/right/help.rb +1 -0
  283. data/mods/standard/sets/right/read.rb +3 -0
  284. data/mods/standard/sets/right/salt.rb +4 -0
  285. data/mods/standard/sets/right/structure.rb +11 -0
  286. data/mods/standard/sets/right/style.rb +67 -0
  287. data/mods/standard/sets/right/update.rb +3 -0
  288. data/mods/standard/sets/right/when_created.rb +5 -0
  289. data/mods/standard/sets/right/when_last_edited.rb +5 -0
  290. data/mods/standard/sets/rstar/rules.rb +235 -0
  291. data/mods/standard/sets/self/account_links.rb +30 -0
  292. data/mods/standard/sets/self/alerts.rb +6 -0
  293. data/mods/standard/sets/self/foot.rb +9 -0
  294. data/mods/standard/sets/self/head.rb +105 -0
  295. data/mods/standard/sets/self/navbox.rb +28 -0
  296. data/mods/standard/sets/self/now.rb +7 -0
  297. data/mods/standard/sets/self/recent.rb +45 -0
  298. data/mods/standard/sets/self/search.rb +37 -0
  299. data/mods/standard/sets/self/style_functional.rb +8 -0
  300. data/mods/standard/sets/self/style_jquery_ui_smoothness.rb +8 -0
  301. data/mods/standard/sets/self/style_standard.rb +8 -0
  302. data/mods/standard/sets/self/version.rb +8 -0
  303. data/mods/standard/sets/type/account_request.rb +81 -0
  304. data/mods/standard/sets/type/basic.rb +43 -0
  305. data/mods/standard/sets/type/cardtype.rb +32 -0
  306. data/mods/standard/sets/type/css.rb +17 -0
  307. data/mods/standard/sets/type/date.rb +9 -0
  308. data/mods/standard/sets/type/file.rb +87 -0
  309. data/mods/standard/sets/type/html.rb +17 -0
  310. data/mods/standard/sets/type/image.rb +67 -0
  311. data/mods/standard/sets/type/layout_type.rb +11 -0
  312. data/mods/standard/sets/type/number.rb +20 -0
  313. data/mods/standard/sets/type/phrase.rb +3 -0
  314. data/mods/standard/sets/type/plain_text.rb +10 -0
  315. data/mods/standard/sets/type/pointer.rb +219 -0
  316. data/mods/standard/sets/type/ruby_and_script.rb +31 -0
  317. data/mods/standard/sets/type/scss.rb +34 -0
  318. data/mods/standard/sets/type/search_type.rb +268 -0
  319. data/mods/standard/sets/type/set.rb +109 -0
  320. data/mods/standard/sets/type/setting.rb +88 -0
  321. data/mods/standard/sets/type/skin.rb +27 -0
  322. data/mods/standard/sets/type/toggle.rb +12 -0
  323. data/mods/standard/sets/type/user.rb +24 -0
  324. data/public/404.html +27 -0
  325. data/public/500.html +28 -0
  326. data/public/assets/application-7f1664ac8e65db8af0bfa6539e23c7df.js +103 -0
  327. data/public/assets/application-7f1664ac8e65db8af0bfa6539e23c7df.js.gz +0 -0
  328. data/public/assets/application.js +103 -0
  329. data/public/assets/application.js.gz +0 -0
  330. data/public/assets/body-bg-660b752b44b87594071f3d0851ac5360.png +0 -0
  331. data/public/assets/body-bg-d031f29b6ba7399a6862382c3552f44c.bmp +0 -0
  332. data/public/assets/body-bg.bmp +0 -0
  333. data/public/assets/body-bg.png +0 -0
  334. data/public/assets/external_link-b15ab5051b4ec6f32892ed80019405b5.png +0 -0
  335. data/public/assets/external_link.png +0 -0
  336. data/public/assets/html5shiv-printshiv-ad36fc7219f4aeaa275f9a7fe2383413.js +1 -0
  337. data/public/assets/html5shiv-printshiv-ad36fc7219f4aeaa275f9a7fe2383413.js.gz +0 -0
  338. data/public/assets/html5shiv-printshiv.js +1 -0
  339. data/public/assets/html5shiv-printshiv.js.gz +0 -0
  340. data/public/assets/images/ui-bg_flat_0_aaaaaa_40x100-7d1197a52442bc56fcad60d0390f4b32.png +0 -0
  341. data/public/assets/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  342. data/public/assets/images/ui-bg_flat_75_ffffff_40x100-3c4b974defa5e8bdaf8a603034c4435e.png +0 -0
  343. data/public/assets/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  344. data/public/assets/images/ui-bg_glass_55_fbf9ee_1x400-38c2dea4d046fd3f56cc3996e2e6018b.png +0 -0
  345. data/public/assets/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  346. data/public/assets/images/ui-bg_glass_65_ffffff_1x400-ddb7ee7527bff283054406c50e597e1e.png +0 -0
  347. data/public/assets/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  348. data/public/assets/images/ui-bg_glass_75_dadada_1x400-d618461418b1ebc6b7996979f4c3dc92.png +0 -0
  349. data/public/assets/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  350. data/public/assets/images/ui-bg_glass_75_e6e6e6_1x400-48d8d545f708e5870a965ce9df8b0e38.png +0 -0
  351. data/public/assets/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  352. data/public/assets/images/ui-bg_glass_95_fef1ec_1x400-f3526b8f82249928f0a6baf044204b15.png +0 -0
  353. data/public/assets/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  354. data/public/assets/images/ui-bg_highlight-soft_75_cccccc_1x100-cec5c56503b8480f834c3fce35dae8df.png +0 -0
  355. data/public/assets/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  356. data/public/assets/images/ui-icons_222222_256x240-66e635a2f90b9f90675d402617630b24.png +0 -0
  357. data/public/assets/images/ui-icons_222222_256x240.png +0 -0
  358. data/public/assets/images/ui-icons_2e83ff_256x240-2ea4c160a75c1992daa2eeac86255b99.png +0 -0
  359. data/public/assets/images/ui-icons_2e83ff_256x240.png +0 -0
  360. data/public/assets/images/ui-icons_454545_256x240-5c7f12676bcead9cb2d4cb8f23f16e95.png +0 -0
  361. data/public/assets/images/ui-icons_454545_256x240.png +0 -0
  362. data/public/assets/images/ui-icons_888888_256x240-95fd3047e1f7325d995a21c729b04125.png +0 -0
  363. data/public/assets/images/ui-icons_888888_256x240.png +0 -0
  364. data/public/assets/images/ui-icons_cd0a0a_256x240-c0c1ec6a8bcf48fec40303e975a4dfa6.png +0 -0
  365. data/public/assets/images/ui-icons_cd0a0a_256x240.png +0 -0
  366. data/public/assets/jquerymobile/ajax-loader-a8a4bc1c4b502e156ed451507987eed7.png +0 -0
  367. data/public/assets/jquerymobile/ajax-loader-cad1a448fe000d9643c57860e5493861.gif +0 -0
  368. data/public/assets/jquerymobile/ajax-loader.gif +0 -0
  369. data/public/assets/jquerymobile/ajax-loader.png +0 -0
  370. data/public/assets/jquerymobile/icons-18-black-b6e62647e8518462e73fd052bfe25d6c.png +0 -0
  371. data/public/assets/jquerymobile/icons-18-black.png +0 -0
  372. data/public/assets/jquerymobile/icons-18-white-f4ae730f6acc1e5b1781652e5d6973c7.png +0 -0
  373. data/public/assets/jquerymobile/icons-18-white.png +0 -0
  374. data/public/assets/jquerymobile/icons-36-black-13a52024f9a92e59a69dca49014d9292.png +0 -0
  375. data/public/assets/jquerymobile/icons-36-black.png +0 -0
  376. data/public/assets/jquerymobile/icons-36-white-3b109c0900c418fd2e5468dfb35b3f59.png +0 -0
  377. data/public/assets/jquerymobile/icons-36-white.png +0 -0
  378. data/public/assets/manifest.yml +395 -0
  379. data/public/assets/tinymce-22b5a139d9ff7df7643afae9ce205508.js +13 -0
  380. data/public/assets/tinymce-22b5a139d9ff7df7643afae9ce205508.js.gz +0 -0
  381. data/public/assets/tinymce.js +13 -0
  382. data/public/assets/tinymce.js.gz +0 -0
  383. data/public/assets/tinymce/jquery.tinymce.js +1 -0
  384. data/public/assets/tinymce/langs/en.js +1 -0
  385. data/public/assets/tinymce/license.txt +504 -0
  386. data/public/assets/tinymce/plugins/advhr/css/advhr.css +5 -0
  387. data/public/assets/tinymce/plugins/advhr/editor_plugin.js +1 -0
  388. data/public/assets/tinymce/plugins/advhr/editor_plugin_src.js +57 -0
  389. data/public/assets/tinymce/plugins/advhr/js/rule.js +43 -0
  390. data/public/assets/tinymce/plugins/advhr/langs/en_dlg.js +1 -0
  391. data/public/assets/tinymce/plugins/advhr/rule.htm +58 -0
  392. data/public/assets/tinymce/plugins/advimage/css/advimage.css +13 -0
  393. data/public/assets/tinymce/plugins/advimage/editor_plugin.js +1 -0
  394. data/public/assets/tinymce/plugins/advimage/editor_plugin_src.js +50 -0
  395. data/public/assets/tinymce/plugins/advimage/image.htm +235 -0
  396. data/public/assets/tinymce/plugins/advimage/img/sample.gif +0 -0
  397. data/public/assets/tinymce/plugins/advimage/js/image.js +464 -0
  398. data/public/assets/tinymce/plugins/advimage/langs/en_dlg.js +1 -0
  399. data/public/assets/tinymce/plugins/advlink/css/advlink.css +8 -0
  400. data/public/assets/tinymce/plugins/advlink/editor_plugin.js +1 -0
  401. data/public/assets/tinymce/plugins/advlink/editor_plugin_src.js +61 -0
  402. data/public/assets/tinymce/plugins/advlink/js/advlink.js +543 -0
  403. data/public/assets/tinymce/plugins/advlink/langs/en_dlg.js +1 -0
  404. data/public/assets/tinymce/plugins/advlink/link.htm +338 -0
  405. data/public/assets/tinymce/plugins/advlist/editor_plugin.js +1 -0
  406. data/public/assets/tinymce/plugins/advlist/editor_plugin_src.js +176 -0
  407. data/public/assets/tinymce/plugins/autolink/editor_plugin.js +1 -0
  408. data/public/assets/tinymce/plugins/autolink/editor_plugin_src.js +184 -0
  409. data/public/assets/tinymce/plugins/autoresize/editor_plugin.js +1 -0
  410. data/public/assets/tinymce/plugins/autoresize/editor_plugin_src.js +119 -0
  411. data/public/assets/tinymce/plugins/autosave/editor_plugin.js +1 -0
  412. data/public/assets/tinymce/plugins/autosave/editor_plugin_src.js +433 -0
  413. data/public/assets/tinymce/plugins/bbcode/editor_plugin.js +1 -0
  414. data/public/assets/tinymce/plugins/bbcode/editor_plugin_src.js +120 -0
  415. data/public/assets/tinymce/plugins/contextmenu/editor_plugin.js +1 -0
  416. data/public/assets/tinymce/plugins/contextmenu/editor_plugin_src.js +163 -0
  417. data/public/assets/tinymce/plugins/directionality/editor_plugin.js +1 -0
  418. data/public/assets/tinymce/plugins/directionality/editor_plugin_src.js +85 -0
  419. data/public/assets/tinymce/plugins/emotions/editor_plugin.js +1 -0
  420. data/public/assets/tinymce/plugins/emotions/editor_plugin_src.js +43 -0
  421. data/public/assets/tinymce/plugins/emotions/emotions.htm +42 -0
  422. data/public/assets/tinymce/plugins/emotions/img/smiley-cool.gif +0 -0
  423. data/public/assets/tinymce/plugins/emotions/img/smiley-cry.gif +0 -0
  424. data/public/assets/tinymce/plugins/emotions/img/smiley-embarassed.gif +0 -0
  425. data/public/assets/tinymce/plugins/emotions/img/smiley-foot-in-mouth.gif +0 -0
  426. data/public/assets/tinymce/plugins/emotions/img/smiley-frown.gif +0 -0
  427. data/public/assets/tinymce/plugins/emotions/img/smiley-innocent.gif +0 -0
  428. data/public/assets/tinymce/plugins/emotions/img/smiley-kiss.gif +0 -0
  429. data/public/assets/tinymce/plugins/emotions/img/smiley-laughing.gif +0 -0
  430. data/public/assets/tinymce/plugins/emotions/img/smiley-money-mouth.gif +0 -0
  431. data/public/assets/tinymce/plugins/emotions/img/smiley-sealed.gif +0 -0
  432. data/public/assets/tinymce/plugins/emotions/img/smiley-smile.gif +0 -0
  433. data/public/assets/tinymce/plugins/emotions/img/smiley-surprised.gif +0 -0
  434. data/public/assets/tinymce/plugins/emotions/img/smiley-tongue-out.gif +0 -0
  435. data/public/assets/tinymce/plugins/emotions/img/smiley-undecided.gif +0 -0
  436. data/public/assets/tinymce/plugins/emotions/img/smiley-wink.gif +0 -0
  437. data/public/assets/tinymce/plugins/emotions/img/smiley-yell.gif +0 -0
  438. data/public/assets/tinymce/plugins/emotions/js/emotions.js +43 -0
  439. data/public/assets/tinymce/plugins/emotions/langs/en_dlg.js +1 -0
  440. data/public/assets/tinymce/plugins/example/dialog.htm +22 -0
  441. data/public/assets/tinymce/plugins/example/editor_plugin.js +1 -0
  442. data/public/assets/tinymce/plugins/example/editor_plugin_src.js +84 -0
  443. data/public/assets/tinymce/plugins/example/img/example.gif +0 -0
  444. data/public/assets/tinymce/plugins/example/js/dialog.js +19 -0
  445. data/public/assets/tinymce/plugins/example/langs/en.js +3 -0
  446. data/public/assets/tinymce/plugins/example/langs/en_dlg.js +3 -0
  447. data/public/assets/tinymce/plugins/example_dependency/editor_plugin.js +1 -0
  448. data/public/assets/tinymce/plugins/example_dependency/editor_plugin_src.js +50 -0
  449. data/public/assets/tinymce/plugins/fullpage/css/fullpage.css +143 -0
  450. data/public/assets/tinymce/plugins/fullpage/editor_plugin.js +1 -0
  451. data/public/assets/tinymce/plugins/fullpage/editor_plugin_src.js +405 -0
  452. data/public/assets/tinymce/plugins/fullpage/fullpage.htm +259 -0
  453. data/public/assets/tinymce/plugins/fullpage/js/fullpage.js +232 -0
  454. data/public/assets/tinymce/plugins/fullpage/langs/en_dlg.js +1 -0
  455. data/public/assets/tinymce/plugins/fullscreen/editor_plugin.js +1 -0
  456. data/public/assets/tinymce/plugins/fullscreen/editor_plugin_src.js +234 -0
  457. data/public/assets/tinymce/plugins/fullscreen/fullscreen.htm +117 -0
  458. data/public/assets/tinymce/plugins/iespell/editor_plugin.js +1 -0
  459. data/public/assets/tinymce/plugins/iespell/editor_plugin_src.js +54 -0
  460. data/public/assets/tinymce/plugins/inlinepopups/editor_plugin.js +1 -0
  461. data/public/assets/tinymce/plugins/inlinepopups/editor_plugin_src.js +699 -0
  462. data/public/assets/tinymce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif +0 -0
  463. data/public/assets/tinymce/plugins/inlinepopups/skins/clearlooks2/img/button.gif +0 -0
  464. data/public/assets/tinymce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif +0 -0
  465. data/public/assets/tinymce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif +0 -0
  466. data/public/assets/tinymce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif +0 -0
  467. data/public/assets/tinymce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif +0 -0
  468. data/public/assets/tinymce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif +0 -0
  469. data/public/assets/tinymce/plugins/inlinepopups/skins/clearlooks2/window.css +90 -0
  470. data/public/assets/tinymce/plugins/inlinepopups/template.htm +387 -0
  471. data/public/assets/tinymce/plugins/insertdatetime/editor_plugin.js +1 -0
  472. data/public/assets/tinymce/plugins/insertdatetime/editor_plugin_src.js +83 -0
  473. data/public/assets/tinymce/plugins/layer/editor_plugin.js +1 -0
  474. data/public/assets/tinymce/plugins/layer/editor_plugin_src.js +262 -0
  475. data/public/assets/tinymce/plugins/legacyoutput/editor_plugin.js +1 -0
  476. data/public/assets/tinymce/plugins/legacyoutput/editor_plugin_src.js +139 -0
  477. data/public/assets/tinymce/plugins/lists/editor_plugin.js +1 -0
  478. data/public/assets/tinymce/plugins/lists/editor_plugin_src.js +955 -0
  479. data/public/assets/tinymce/plugins/media/css/media.css +17 -0
  480. data/public/assets/tinymce/plugins/media/editor_plugin.js +1 -0
  481. data/public/assets/tinymce/plugins/media/editor_plugin_src.js +898 -0
  482. data/public/assets/tinymce/plugins/media/js/embed.js +73 -0
  483. data/public/assets/tinymce/plugins/media/js/media.js +513 -0
  484. data/public/assets/tinymce/plugins/media/langs/en_dlg.js +1 -0
  485. data/public/assets/tinymce/plugins/media/media.htm +922 -0
  486. data/public/assets/tinymce/plugins/media/moxieplayer.swf +0 -0
  487. data/public/assets/tinymce/plugins/nonbreaking/editor_plugin.js +1 -0
  488. data/public/assets/tinymce/plugins/nonbreaking/editor_plugin_src.js +54 -0
  489. data/public/assets/tinymce/plugins/noneditable/editor_plugin.js +1 -0
  490. data/public/assets/tinymce/plugins/noneditable/editor_plugin_src.js +537 -0
  491. data/public/assets/tinymce/plugins/pagebreak/editor_plugin.js +1 -0
  492. data/public/assets/tinymce/plugins/pagebreak/editor_plugin_src.js +74 -0
  493. data/public/assets/tinymce/plugins/paste/editor_plugin.js +1 -0
  494. data/public/assets/tinymce/plugins/paste/editor_plugin_src.js +885 -0
  495. data/public/assets/tinymce/plugins/paste/js/pastetext.js +36 -0
  496. data/public/assets/tinymce/plugins/paste/js/pasteword.js +51 -0
  497. data/public/assets/tinymce/plugins/paste/langs/en_dlg.js +1 -0
  498. data/public/assets/tinymce/plugins/paste/pastetext.htm +27 -0
  499. data/public/assets/tinymce/plugins/paste/pasteword.htm +21 -0
  500. data/public/assets/tinymce/plugins/preview/editor_plugin.js +1 -0
  501. data/public/assets/tinymce/plugins/preview/editor_plugin_src.js +53 -0
  502. data/public/assets/tinymce/plugins/preview/example.html +28 -0
  503. data/public/assets/tinymce/plugins/preview/jscripts/embed.js +73 -0
  504. data/public/assets/tinymce/plugins/preview/preview.html +17 -0
  505. data/public/assets/tinymce/plugins/print/editor_plugin.js +1 -0
  506. data/public/assets/tinymce/plugins/print/editor_plugin_src.js +34 -0
  507. data/public/assets/tinymce/plugins/save/editor_plugin.js +1 -0
  508. data/public/assets/tinymce/plugins/save/editor_plugin_src.js +101 -0
  509. data/public/assets/tinymce/plugins/searchreplace/css/searchreplace.css +6 -0
  510. data/public/assets/tinymce/plugins/searchreplace/editor_plugin.js +1 -0
  511. data/public/assets/tinymce/plugins/searchreplace/editor_plugin_src.js +61 -0
  512. data/public/assets/tinymce/plugins/searchreplace/js/searchreplace.js +148 -0
  513. data/public/assets/tinymce/plugins/searchreplace/langs/en_dlg.js +1 -0
  514. data/public/assets/tinymce/plugins/searchreplace/searchreplace.htm +100 -0
  515. data/public/assets/tinymce/plugins/spellchecker/css/content.css +1 -0
  516. data/public/assets/tinymce/plugins/spellchecker/editor_plugin.js +1 -0
  517. data/public/assets/tinymce/plugins/spellchecker/editor_plugin_src.js +471 -0
  518. data/public/assets/tinymce/plugins/spellchecker/img/wline.gif +0 -0
  519. data/public/assets/tinymce/plugins/style/css/props.css +14 -0
  520. data/public/assets/tinymce/plugins/style/editor_plugin.js +1 -0
  521. data/public/assets/tinymce/plugins/style/editor_plugin_src.js +71 -0
  522. data/public/assets/tinymce/plugins/style/js/props.js +709 -0
  523. data/public/assets/tinymce/plugins/style/langs/en_dlg.js +1 -0
  524. data/public/assets/tinymce/plugins/style/props.htm +845 -0
  525. data/public/assets/tinymce/plugins/style/readme.txt +19 -0
  526. data/public/assets/tinymce/plugins/tabfocus/editor_plugin.js +1 -0
  527. data/public/assets/tinymce/plugins/tabfocus/editor_plugin_src.js +122 -0
  528. data/public/assets/tinymce/plugins/table/cell.htm +180 -0
  529. data/public/assets/tinymce/plugins/table/css/cell.css +17 -0
  530. data/public/assets/tinymce/plugins/table/css/row.css +25 -0
  531. data/public/assets/tinymce/plugins/table/css/table.css +13 -0
  532. data/public/assets/tinymce/plugins/table/editor_plugin.js +1 -0
  533. data/public/assets/tinymce/plugins/table/editor_plugin_src.js +1456 -0
  534. data/public/assets/tinymce/plugins/table/js/cell.js +319 -0
  535. data/public/assets/tinymce/plugins/table/js/merge_cells.js +27 -0
  536. data/public/assets/tinymce/plugins/table/js/row.js +254 -0
  537. data/public/assets/tinymce/plugins/table/js/table.js +501 -0
  538. data/public/assets/tinymce/plugins/table/langs/en_dlg.js +1 -0
  539. data/public/assets/tinymce/plugins/table/merge_cells.htm +32 -0
  540. data/public/assets/tinymce/plugins/table/row.htm +158 -0
  541. data/public/assets/tinymce/plugins/table/table.htm +188 -0
  542. data/public/assets/tinymce/plugins/template/blank.htm +12 -0
  543. data/public/assets/tinymce/plugins/template/css/template.css +23 -0
  544. data/public/assets/tinymce/plugins/template/editor_plugin.js +1 -0
  545. data/public/assets/tinymce/plugins/template/editor_plugin_src.js +159 -0
  546. data/public/assets/tinymce/plugins/template/js/template.js +106 -0
  547. data/public/assets/tinymce/plugins/template/langs/en_dlg.js +1 -0
  548. data/public/assets/tinymce/plugins/template/template.htm +31 -0
  549. data/public/assets/tinymce/plugins/visualblocks/css/visualblocks.css +21 -0
  550. data/public/assets/tinymce/plugins/visualblocks/editor_plugin.js +1 -0
  551. data/public/assets/tinymce/plugins/visualblocks/editor_plugin_src.js +63 -0
  552. data/public/assets/tinymce/plugins/visualchars/editor_plugin.js +1 -0
  553. data/public/assets/tinymce/plugins/visualchars/editor_plugin_src.js +83 -0
  554. data/public/assets/tinymce/plugins/wordcount/editor_plugin.js +1 -0
  555. data/public/assets/tinymce/plugins/wordcount/editor_plugin_src.js +122 -0
  556. data/public/assets/tinymce/plugins/xhtmlxtras/abbr.htm +142 -0
  557. data/public/assets/tinymce/plugins/xhtmlxtras/acronym.htm +142 -0
  558. data/public/assets/tinymce/plugins/xhtmlxtras/attributes.htm +149 -0
  559. data/public/assets/tinymce/plugins/xhtmlxtras/cite.htm +142 -0
  560. data/public/assets/tinymce/plugins/xhtmlxtras/css/attributes.css +11 -0
  561. data/public/assets/tinymce/plugins/xhtmlxtras/css/popup.css +9 -0
  562. data/public/assets/tinymce/plugins/xhtmlxtras/del.htm +162 -0
  563. data/public/assets/tinymce/plugins/xhtmlxtras/editor_plugin.js +1 -0
  564. data/public/assets/tinymce/plugins/xhtmlxtras/editor_plugin_src.js +132 -0
  565. data/public/assets/tinymce/plugins/xhtmlxtras/ins.htm +162 -0
  566. data/public/assets/tinymce/plugins/xhtmlxtras/js/abbr.js +28 -0
  567. data/public/assets/tinymce/plugins/xhtmlxtras/js/acronym.js +28 -0
  568. data/public/assets/tinymce/plugins/xhtmlxtras/js/attributes.js +111 -0
  569. data/public/assets/tinymce/plugins/xhtmlxtras/js/cite.js +28 -0
  570. data/public/assets/tinymce/plugins/xhtmlxtras/js/del.js +53 -0
  571. data/public/assets/tinymce/plugins/xhtmlxtras/js/element_common.js +229 -0
  572. data/public/assets/tinymce/plugins/xhtmlxtras/js/ins.js +53 -0
  573. data/public/assets/tinymce/plugins/xhtmlxtras/langs/en_dlg.js +1 -0
  574. data/public/assets/tinymce/themes/advanced/about.htm +52 -0
  575. data/public/assets/tinymce/themes/advanced/anchor.htm +26 -0
  576. data/public/assets/tinymce/themes/advanced/charmap.htm +55 -0
  577. data/public/assets/tinymce/themes/advanced/color_picker.htm +70 -0
  578. data/public/assets/tinymce/themes/advanced/editor_template.js +1 -0
  579. data/public/assets/tinymce/themes/advanced/editor_template_src.js +1490 -0
  580. data/public/assets/tinymce/themes/advanced/image.htm +80 -0
  581. data/public/assets/tinymce/themes/advanced/img/colorpicker.jpg +0 -0
  582. data/public/assets/tinymce/themes/advanced/img/flash.gif +0 -0
  583. data/public/assets/tinymce/themes/advanced/img/icons.gif +0 -0
  584. data/public/assets/tinymce/themes/advanced/img/iframe.gif +0 -0
  585. data/public/assets/tinymce/themes/advanced/img/pagebreak.gif +0 -0
  586. data/public/assets/tinymce/themes/advanced/img/quicktime.gif +0 -0
  587. data/public/assets/tinymce/themes/advanced/img/realmedia.gif +0 -0
  588. data/public/assets/tinymce/themes/advanced/img/shockwave.gif +0 -0
  589. data/public/assets/tinymce/themes/advanced/img/trans.gif +0 -0
  590. data/public/assets/tinymce/themes/advanced/img/video.gif +0 -0
  591. data/public/assets/tinymce/themes/advanced/img/windowsmedia.gif +0 -0
  592. data/public/assets/tinymce/themes/advanced/js/about.js +73 -0
  593. data/public/assets/tinymce/themes/advanced/js/anchor.js +56 -0
  594. data/public/assets/tinymce/themes/advanced/js/charmap.js +363 -0
  595. data/public/assets/tinymce/themes/advanced/js/color_picker.js +345 -0
  596. data/public/assets/tinymce/themes/advanced/js/image.js +253 -0
  597. data/public/assets/tinymce/themes/advanced/js/link.js +159 -0
  598. data/public/assets/tinymce/themes/advanced/js/source_editor.js +78 -0
  599. data/public/assets/tinymce/themes/advanced/langs/en.js +1 -0
  600. data/public/assets/tinymce/themes/advanced/langs/en_dlg.js +1 -0
  601. data/public/assets/tinymce/themes/advanced/link.htm +57 -0
  602. data/public/assets/tinymce/themes/advanced/shortcuts.htm +47 -0
  603. data/public/assets/tinymce/themes/advanced/skins/default/content.css +50 -0
  604. data/public/assets/tinymce/themes/advanced/skins/default/dialog.css +118 -0
  605. data/public/assets/tinymce/themes/advanced/skins/default/img/buttons.png +0 -0
  606. data/public/assets/tinymce/themes/advanced/skins/default/img/items.gif +0 -0
  607. data/public/assets/tinymce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
  608. data/public/assets/tinymce/themes/advanced/skins/default/img/menu_check.gif +0 -0
  609. data/public/assets/tinymce/themes/advanced/skins/default/img/progress.gif +0 -0
  610. data/public/assets/tinymce/themes/advanced/skins/default/img/tabs.gif +0 -0
  611. data/public/assets/tinymce/themes/advanced/skins/default/ui.css +219 -0
  612. data/public/assets/tinymce/themes/advanced/skins/highcontrast/content.css +24 -0
  613. data/public/assets/tinymce/themes/advanced/skins/highcontrast/dialog.css +106 -0
  614. data/public/assets/tinymce/themes/advanced/skins/highcontrast/ui.css +106 -0
  615. data/public/assets/tinymce/themes/advanced/skins/o2k7/content.css +48 -0
  616. data/public/assets/tinymce/themes/advanced/skins/o2k7/dialog.css +118 -0
  617. data/public/assets/tinymce/themes/advanced/skins/o2k7/img/button_bg.png +0 -0
  618. data/public/assets/tinymce/themes/advanced/skins/o2k7/img/button_bg_black.png +0 -0
  619. data/public/assets/tinymce/themes/advanced/skins/o2k7/img/button_bg_silver.png +0 -0
  620. data/public/assets/tinymce/themes/advanced/skins/o2k7/ui.css +222 -0
  621. data/public/assets/tinymce/themes/advanced/skins/o2k7/ui_black.css +8 -0
  622. data/public/assets/tinymce/themes/advanced/skins/o2k7/ui_silver.css +5 -0
  623. data/public/assets/tinymce/themes/advanced/source_editor.htm +25 -0
  624. data/public/assets/tinymce/themes/simple/editor_template.js +1 -0
  625. data/public/assets/tinymce/themes/simple/editor_template_src.js +84 -0
  626. data/public/assets/tinymce/themes/simple/img/icons.gif +0 -0
  627. data/public/assets/tinymce/themes/simple/langs/en.js +1 -0
  628. data/public/assets/tinymce/themes/simple/skins/default/content.css +25 -0
  629. data/public/assets/tinymce/themes/simple/skins/default/ui.css +32 -0
  630. data/public/assets/tinymce/themes/simple/skins/o2k7/content.css +17 -0
  631. data/public/assets/tinymce/themes/simple/skins/o2k7/img/button_bg.png +0 -0
  632. data/public/assets/tinymce/themes/simple/skins/o2k7/ui.css +35 -0
  633. data/public/assets/tinymce/tiny_mce.js +1 -0
  634. data/public/assets/tinymce/tiny_mce_jquery.js +1 -0
  635. data/public/assets/tinymce/tiny_mce_jquery_src.js +17913 -0
  636. data/public/assets/tinymce/tiny_mce_popup.js +5 -0
  637. data/public/assets/tinymce/tiny_mce_src.js +19127 -0
  638. data/public/assets/tinymce/utils/editable_selects.js +70 -0
  639. data/public/assets/tinymce/utils/form_utils.js +210 -0
  640. data/public/assets/tinymce/utils/mctabs.js +162 -0
  641. data/public/assets/tinymce/utils/validate.js +252 -0
  642. data/public/assets2bpacked/jstree/README.txt +10 -0
  643. data/public/assets2bpacked/jstree/_demo/_dump.sql +20 -0
  644. data/public/assets2bpacked/jstree/_demo/_inc/__mysql_errors.log +0 -0
  645. data/public/assets2bpacked/jstree/_demo/_inc/class._database.php +146 -0
  646. data/public/assets2bpacked/jstree/_demo/_inc/class._database_i.php +152 -0
  647. data/public/assets2bpacked/jstree/_demo/_inc/class.tree.php +602 -0
  648. data/public/assets2bpacked/jstree/_demo/_install.txt +6 -0
  649. data/public/assets2bpacked/jstree/_demo/config.php +14 -0
  650. data/public/assets2bpacked/jstree/_demo/file.png +0 -0
  651. data/public/assets2bpacked/jstree/_demo/folder.png +0 -0
  652. data/public/assets2bpacked/jstree/_demo/index.html +461 -0
  653. data/public/assets2bpacked/jstree/_demo/root.png +0 -0
  654. data/public/assets2bpacked/jstree/_demo/server.php +69 -0
  655. data/public/assets2bpacked/jstree/_docs/!style.css +48 -0
  656. data/public/assets2bpacked/jstree/_docs/_drive.png +0 -0
  657. data/public/assets2bpacked/jstree/_docs/_html_data.html +2 -0
  658. data/public/assets2bpacked/jstree/_docs/_json_data.json +4 -0
  659. data/public/assets2bpacked/jstree/_docs/_search_data.json +6 -0
  660. data/public/assets2bpacked/jstree/_docs/_search_result.json +1 -0
  661. data/public/assets2bpacked/jstree/_docs/_xml_flat.xml +12 -0
  662. data/public/assets2bpacked/jstree/_docs/_xml_nest.xml +18 -0
  663. data/public/assets2bpacked/jstree/_docs/checkbox.html +171 -0
  664. data/public/assets2bpacked/jstree/_docs/contextmenu.html +121 -0
  665. data/public/assets2bpacked/jstree/_docs/cookies.html +97 -0
  666. data/public/assets2bpacked/jstree/_docs/core.html +689 -0
  667. data/public/assets2bpacked/jstree/_docs/crrm.html +316 -0
  668. data/public/assets2bpacked/jstree/_docs/dnd.html +199 -0
  669. data/public/assets2bpacked/jstree/_docs/hotkeys.html +82 -0
  670. data/public/assets2bpacked/jstree/_docs/html_data.html +175 -0
  671. data/public/assets2bpacked/jstree/_docs/index.html +86 -0
  672. data/public/assets2bpacked/jstree/_docs/json_data.html +249 -0
  673. data/public/assets2bpacked/jstree/_docs/languages.html +152 -0
  674. data/public/assets2bpacked/jstree/_docs/logo.png +0 -0
  675. data/public/assets2bpacked/jstree/_docs/search.html +153 -0
  676. data/public/assets2bpacked/jstree/_docs/sort.html +85 -0
  677. data/public/assets2bpacked/jstree/_docs/syntax/!script.js +2232 -0
  678. data/public/assets2bpacked/jstree/_docs/syntax/!style.css +511 -0
  679. data/public/assets2bpacked/jstree/_docs/syntax/clipboard.swf +0 -0
  680. data/public/assets2bpacked/jstree/_docs/syntax/help.png +0 -0
  681. data/public/assets2bpacked/jstree/_docs/syntax/magnifier.png +0 -0
  682. data/public/assets2bpacked/jstree/_docs/syntax/page_white_code.png +0 -0
  683. data/public/assets2bpacked/jstree/_docs/syntax/page_white_copy.png +0 -0
  684. data/public/assets2bpacked/jstree/_docs/syntax/printer.png +0 -0
  685. data/public/assets2bpacked/jstree/_docs/syntax/wrapping.png +0 -0
  686. data/public/assets2bpacked/jstree/_docs/themeroller.html +107 -0
  687. data/public/assets2bpacked/jstree/_docs/themes.html +127 -0
  688. data/public/assets2bpacked/jstree/_docs/types.html +178 -0
  689. data/public/assets2bpacked/jstree/_docs/ui.html +197 -0
  690. data/public/assets2bpacked/jstree/_docs/unique.html +85 -0
  691. data/public/assets2bpacked/jstree/_docs/xml_data.html +218 -0
  692. data/public/assets2bpacked/jstree/_lib/jquery.cookie.js +96 -0
  693. data/public/assets2bpacked/jstree/_lib/jquery.hotkeys.js +99 -0
  694. data/public/assets2bpacked/jstree/_lib/jquery.js +5 -0
  695. data/public/assets2bpacked/jstree/jquery.jstree.js +4564 -0
  696. data/public/assets2bpacked/jstree/themes/apple/bg.jpg +0 -0
  697. data/public/assets2bpacked/jstree/themes/apple/d.png +0 -0
  698. data/public/assets2bpacked/jstree/themes/apple/dot_for_ie.gif +0 -0
  699. data/public/assets2bpacked/jstree/themes/apple/style.css +61 -0
  700. data/public/assets2bpacked/jstree/themes/apple/throbber.gif +0 -0
  701. data/public/assets2bpacked/jstree/themes/classic/d.gif +0 -0
  702. data/public/assets2bpacked/jstree/themes/classic/d.png +0 -0
  703. data/public/assets2bpacked/jstree/themes/classic/dot_for_ie.gif +0 -0
  704. data/public/assets2bpacked/jstree/themes/classic/style.css +77 -0
  705. data/public/assets2bpacked/jstree/themes/classic/throbber.gif +0 -0
  706. data/public/assets2bpacked/jstree/themes/default-rtl/d.gif +0 -0
  707. data/public/assets2bpacked/jstree/themes/default-rtl/d.png +0 -0
  708. data/public/assets2bpacked/jstree/themes/default-rtl/dots.gif +0 -0
  709. data/public/assets2bpacked/jstree/themes/default-rtl/style.css +84 -0
  710. data/public/assets2bpacked/jstree/themes/default-rtl/throbber.gif +0 -0
  711. data/public/assets2bpacked/jstree/themes/default/d.gif +0 -0
  712. data/public/assets2bpacked/jstree/themes/default/d.png +0 -0
  713. data/public/assets2bpacked/jstree/themes/default/style.css +74 -0
  714. data/public/assets2bpacked/jstree/themes/default/throbber.gif +0 -0
  715. data/public/favicon.ico +0 -0
  716. data/public/jasmine/card_form.html +13 -0
  717. data/public/robots.txt +12 -0
  718. data/script/autospec +4 -0
  719. data/script/rails +6 -0
  720. data/script/test_filter +25 -0
  721. data/script/wagn.rb +6 -0
  722. data/spec/controllers/account_controller_spec.rb +43 -0
  723. data/spec/controllers/admin_controller_spec.rb +23 -0
  724. data/spec/controllers/captcha_spec.rb +103 -0
  725. data/spec/controllers/card_controller_spec.rb +353 -0
  726. data/spec/controllers/location_spec.rb +49 -0
  727. data/spec/controllers/sets_spec.rb +97 -0
  728. data/spec/controllers/wagn_controller_spec.rb +5 -0
  729. data/spec/javascripts/helpers/.gitkeep +0 -0
  730. data/spec/javascripts/helpers/jasmine-config.js +2 -0
  731. data/spec/javascripts/helpers/jasmine-jquery-1.3.1.js +295 -0
  732. data/spec/javascripts/support/jasmine.yml +77 -0
  733. data/spec/javascripts/support/jasmine_config.rb +24 -0
  734. data/spec/javascripts/support/jasmine_runner.rb +21 -0
  735. data/spec/javascripts/wagn_spec.coffee +40 -0
  736. data/spec/lib/card/chunk_spec.rb +18 -0
  737. data/spec/lib/card/codename_spec.rb +30 -0
  738. data/spec/lib/card/content_spec.rb +293 -0
  739. data/spec/lib/card/diff_spec.rb +111 -0
  740. data/spec/lib/card/flexmail_spec.rb +209 -0
  741. data/spec/lib/card/format_spec.rb +173 -0
  742. data/spec/lib/card/name_spec.rb +275 -0
  743. data/spec/lib/card/query_spec.rb +456 -0
  744. data/spec/lib/card/set_pattern_spec.rb +40 -0
  745. data/spec/lib/card/set_spec.rb +84 -0
  746. data/spec/lib/wagn/cache_spec.rb +120 -0
  747. data/spec/lib/wagn/loader_spec.rb +33 -0
  748. data/spec/mailers/account_spec.rb +66 -0
  749. data/spec/mailers/mailer_spec.rb +57 -0
  750. data/spec/models/account_spec.rb +19 -0
  751. data/spec/models/card/cardtype_spec.rb +218 -0
  752. data/spec/models/card/comment_spec.rb +38 -0
  753. data/spec/models/card/create_spec.rb +83 -0
  754. data/spec/models/card/reference_spec.rb +214 -0
  755. data/spec/models/card/revision_spec.rb +58 -0
  756. data/spec/models/card/trash_spec.rb +258 -0
  757. data/spec/models/card/type_transition_spec.rb +162 -0
  758. data/spec/models/card/validation_spec.rb +37 -0
  759. data/spec/models/card_spec.rb +177 -0
  760. data/spec/models/user_spec.rb +95 -0
  761. data/spec/mods/core/chunks/literal_spec.rb +15 -0
  762. data/spec/mods/core/chunks/uri_spec.rb +293 -0
  763. data/spec/mods/core/formats/data_format_spec.rb +6 -0
  764. data/spec/mods/core/formats/html_format_spec.rb +165 -0
  765. data/spec/mods/core/formats/text_format_spec.rb +6 -0
  766. data/spec/mods/core/sets/all/active_card_spec.rb +6 -0
  767. data/spec/mods/core/sets/all/attribute_tracking_spec.rb +22 -0
  768. data/spec/mods/core/sets/all/collection_spec.rb +49 -0
  769. data/spec/mods/core/sets/all/content_spec.rb +15 -0
  770. data/spec/mods/core/sets/all/fetch_spec.rb +206 -0
  771. data/spec/mods/core/sets/all/initialize_spec.rb +59 -0
  772. data/spec/mods/core/sets/all/name_spec.rb +30 -0
  773. data/spec/mods/core/sets/all/pattern_spec.rb +93 -0
  774. data/spec/mods/core/sets/all/permissions_spec.rb +481 -0
  775. data/spec/mods/core/sets/all/phases_spec.rb +6 -0
  776. data/spec/mods/core/sets/all/references_spec.rb +9 -0
  777. data/spec/mods/core/sets/all/rules2_spec.rb +250 -0
  778. data/spec/mods/core/sets/all/rules_spec.rb +99 -0
  779. data/spec/mods/core/sets/all/states_spec.rb +6 -0
  780. data/spec/mods/core/sets/all/templating_spec.rb +105 -0
  781. data/spec/mods/core/sets/all/tracked_attributes_spec.rb +316 -0
  782. data/spec/mods/core/sets/all/type_spec.rb +49 -0
  783. data/spec/mods/core/sets/all/utils_spec.rb +6 -0
  784. data/spec/mods/standard/chunks/include_spec.rb +182 -0
  785. data/spec/mods/standard/chunks/link_spec.rb +60 -0
  786. data/spec/mods/standard/formats/css_format_spec.rb +6 -0
  787. data/spec/mods/standard/formats/csv_format_spec.rb +6 -0
  788. data/spec/mods/standard/formats/email_html_format_spec.rb +6 -0
  789. data/spec/mods/standard/formats/file_format_spec.rb +6 -0
  790. data/spec/mods/standard/formats/json_format_spec.rb +6 -0
  791. data/spec/mods/standard/formats/kml_format_spec.rb +6 -0
  792. data/spec/mods/standard/formats/rss_format_spec.rb +6 -0
  793. data/spec/mods/standard/formats/xml_format_spec.rb +6 -0
  794. data/spec/mods/standard/sets/all/account_spec.rb +117 -0
  795. data/spec/mods/standard/sets/all/admin_spec.rb +6 -0
  796. data/spec/mods/standard/sets/all/all_css_spec.rb +11 -0
  797. data/spec/mods/standard/sets/all/all_csv_spec.rb +10 -0
  798. data/spec/mods/standard/sets/all/attach_spec.rb +10 -0
  799. data/spec/mods/standard/sets/all/base_spec.rb +52 -0
  800. data/spec/mods/standard/sets/all/email_html_spec.rb +14 -0
  801. data/spec/mods/standard/sets/all/file_spec.rb +6 -0
  802. data/spec/mods/standard/sets/all/flexmail_spec.rb +6 -0
  803. data/spec/mods/standard/sets/all/follow_spec.rb +96 -0
  804. data/spec/mods/standard/sets/all/geocode_spec.rb +37 -0
  805. data/spec/mods/standard/sets/all/json_spec.rb +27 -0
  806. data/spec/mods/standard/sets/all/kml_spec.rb +6 -0
  807. data/spec/mods/standard/sets/all/rich_html_spec.rb +10 -0
  808. data/spec/mods/standard/sets/all/rss_spec.rb +6 -0
  809. data/spec/mods/standard/sets/all/text_spec.rb +6 -0
  810. data/spec/mods/standard/sets/right/account_spec.rb +6 -0
  811. data/spec/mods/standard/sets/right/add_help_spec.rb +6 -0
  812. data/spec/mods/standard/sets/right/comment_spec.rb +6 -0
  813. data/spec/mods/standard/sets/right/create_spec.rb +6 -0
  814. data/spec/mods/standard/sets/right/crypted_password_spec.rb +6 -0
  815. data/spec/mods/standard/sets/right/default_spec.rb +6 -0
  816. data/spec/mods/standard/sets/right/delete_spec.rb +6 -0
  817. data/spec/mods/standard/sets/right/email_spec.rb +27 -0
  818. data/spec/mods/standard/sets/right/help_spec.rb +6 -0
  819. data/spec/mods/standard/sets/right/read_spec.rb +6 -0
  820. data/spec/mods/standard/sets/right/salt_spec.rb +6 -0
  821. data/spec/mods/standard/sets/right/structure_spec.rb +10 -0
  822. data/spec/mods/standard/sets/right/style_spec.rb +6 -0
  823. data/spec/mods/standard/sets/right/update_spec.rb +6 -0
  824. data/spec/mods/standard/sets/right/when_created_spec.rb +8 -0
  825. data/spec/mods/standard/sets/right/when_last_edited_spec.rb +8 -0
  826. data/spec/mods/standard/sets/rstar/rules_spec.rb +26 -0
  827. data/spec/mods/standard/sets/self/account_links_spec.rb +10 -0
  828. data/spec/mods/standard/sets/self/alerts_spec.rb +6 -0
  829. data/spec/mods/standard/sets/self/foot_spec.rb +6 -0
  830. data/spec/mods/standard/sets/self/head_spec.rb +18 -0
  831. data/spec/mods/standard/sets/self/navbox_spec.rb +8 -0
  832. data/spec/mods/standard/sets/self/now_spec.rb +8 -0
  833. data/spec/mods/standard/sets/self/recent_spec.rb +6 -0
  834. data/spec/mods/standard/sets/self/search_spec.rb +6 -0
  835. data/spec/mods/standard/sets/self/style_functional_spec.rb +6 -0
  836. data/spec/mods/standard/sets/self/style_jquery_ui_smoothness_spec.rb +6 -0
  837. data/spec/mods/standard/sets/self/style_standard_spec.rb +6 -0
  838. data/spec/mods/standard/sets/self/version_spec.rb +8 -0
  839. data/spec/mods/standard/sets/type/account_request_spec.rb +160 -0
  840. data/spec/mods/standard/sets/type/basic_spec.rb +6 -0
  841. data/spec/mods/standard/sets/type/cardtype_spec.rb +6 -0
  842. data/spec/mods/standard/sets/type/css_spec.rb +6 -0
  843. data/spec/mods/standard/sets/type/date_spec.rb +8 -0
  844. data/spec/mods/standard/sets/type/file_spec.rb +6 -0
  845. data/spec/mods/standard/sets/type/html_spec.rb +24 -0
  846. data/spec/mods/standard/sets/type/image_spec.rb +17 -0
  847. data/spec/mods/standard/sets/type/layout_type_spec.rb +8 -0
  848. data/spec/mods/standard/sets/type/number_spec.rb +8 -0
  849. data/spec/mods/standard/sets/type/phrase_spec.rb +8 -0
  850. data/spec/mods/standard/sets/type/plain_text_spec.rb +12 -0
  851. data/spec/mods/standard/sets/type/pointer_spec.rb +74 -0
  852. data/spec/mods/standard/sets/type/ruby_and_script_spec.rb +6 -0
  853. data/spec/mods/standard/sets/type/scss_spec.rb +6 -0
  854. data/spec/mods/standard/sets/type/search_type_spec.rb +16 -0
  855. data/spec/mods/standard/sets/type/set_spec.rb +27 -0
  856. data/spec/mods/standard/sets/type/setting_spec.rb +6 -0
  857. data/spec/mods/standard/sets/type/skin_spec.rb +6 -0
  858. data/spec/mods/standard/sets/type/toggle_spec.rb +13 -0
  859. data/spec/mods/standard/sets/type/user_spec.rb +6 -0
  860. data/spec/spec.opts +6 -0
  861. data/test/fixtures/.gitkeep +0 -0
  862. data/test/fixtures/card_references.yml +1954 -0
  863. data/test/fixtures/card_revisions.yml +4499 -0
  864. data/test/fixtures/cards.yml +9419 -0
  865. data/test/fixtures/mao2.jpg +0 -0
  866. data/test/fixtures/rails.gif +0 -0
  867. data/test/fixtures/users.yml +169 -0
  868. data/test/performance/card_create_test.rb +22 -0
  869. data/test/performance/fetch_test.rb +9 -0
  870. data/test/performance/homepage_test.rb +9 -0
  871. data/test/performance/render_test.rb +10 -0
  872. data/test/seed.rb +192 -0
  873. data/test/test_helper.rb +123 -0
  874. data/wagn.gemspec +46 -0
  875. metadata +1307 -0
@@ -0,0 +1,10 @@
1
+ jsTree pre1.0
2
+ http://jstree.com/
3
+
4
+ Copyright (c) 2011 Ivan Bozhanov (vakata.com)
5
+
6
+ Dual licensed under the MIT and GPL licenses:
7
+ http://www.opensource.org/licenses/mit-license.php
8
+ http://www.gnu.org/licenses/gpl.html
9
+
10
+ This is the latest stable version before switching from GoogleCode to GitHub.
@@ -0,0 +1,20 @@
1
+ CREATE TABLE IF NOT EXISTS `tree` (
2
+ `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
3
+ `parent_id` bigint(20) unsigned NOT NULL,
4
+ `position` bigint(20) unsigned NOT NULL,
5
+ `left` bigint(20) unsigned NOT NULL,
6
+ `right` bigint(20) unsigned NOT NULL,
7
+ `level` bigint(20) unsigned NOT NULL,
8
+ `title` text CHARACTER SET utf8 COLLATE utf8_unicode_ci,
9
+ `type` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
10
+ PRIMARY KEY (`id`)
11
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=13 ;
12
+
13
+ INSERT INTO `tree` (`id`, `parent_id`, `position`, `left`, `right`, `level`, `title`, `type`) VALUES
14
+ (1, 0, 2, 1, 14, 0, 'ROOT', ''),
15
+ (2, 1, 0, 2, 11, 1, 'C:', 'drive'),
16
+ (3, 2, 0, 3, 6, 2, '_demo', 'folder'),
17
+ (4, 3, 0, 4, 5, 3, 'index.html', 'default'),
18
+ (5, 2, 1, 7, 10, 2, '_docs', 'folder'),
19
+ (6, 1, 1, 12, 13, 1, 'D:', 'drive'),
20
+ (12, 5, 0, 8, 9, 3, 'zmei.html', 'default');
@@ -0,0 +1,146 @@
1
+ <?php
2
+ class _database {
3
+ private $link = false;
4
+ private $result = false;
5
+ private $row = false;
6
+
7
+ public $settings = array(
8
+ "servername"=> "localhost",
9
+ "serverport"=> "3306",
10
+ "username" => false,
11
+ "password" => false,
12
+ "database" => false,
13
+ "persist" => false,
14
+ "dieonerror"=> false,
15
+ "showerror" => false,
16
+ "error_file"=> true
17
+ );
18
+
19
+ function __construct() {
20
+ global $db_config;
21
+ $this->settings = array_merge($this->settings, $db_config);
22
+ if($this->settings["error_file"] === true) $this->settings["error_file"] = dirname(__FILE__)."/__mysql_errors.log";
23
+ }
24
+
25
+ function connect() {
26
+ if (!$this->link) {
27
+ $this->link = ($this->settings["persist"]) ?
28
+ mysql_pconnect(
29
+ $this->settings["servername"].":".$this->settings["serverport"],
30
+ $this->settings["username"],
31
+ $this->settings["password"]
32
+ ) :
33
+ mysql_connect(
34
+ $this->settings["servername"].":".$this->settings["serverport"],
35
+ $this->settings["username"],
36
+ $this->settings["password"]
37
+ ) or $this->error();
38
+ }
39
+ if (!mysql_select_db($this->settings["database"], $this->link)) $this->error();
40
+ if($this->link) mysql_query("SET NAMES 'utf8'");
41
+ return ($this->link) ? true : false;
42
+ }
43
+
44
+ function query($sql) {
45
+ if (!$this->link && !$this->connect()) $this->error();
46
+ if (!($this->result = mysql_query($sql, $this->link))) $this->error($sql);
47
+ return ($this->result) ? true : false;
48
+ }
49
+
50
+ function nextr() {
51
+ if(!$this->result) {
52
+ $this->error("No query pending");
53
+ return false;
54
+ }
55
+ unset($this->row);
56
+ $this->row = mysql_fetch_array($this->result, MYSQL_BOTH);
57
+ return ($this->row) ? true : false ;
58
+ }
59
+
60
+ function get_row($mode = "both") {
61
+ if(!$this->row) return false;
62
+
63
+ $return = array();
64
+ switch($mode) {
65
+ case "assoc":
66
+ foreach($this->row as $k => $v) {
67
+ if(!is_int($k)) $return[$k] = $v;
68
+ }
69
+ break;
70
+ case "num":
71
+ foreach($this->row as $k => $v) {
72
+ if(is_int($k)) $return[$k] = $v;
73
+ }
74
+ break;
75
+ default:
76
+ $return = $this->row;
77
+ break;
78
+ }
79
+ return array_map("stripslashes",$return);
80
+ }
81
+
82
+ function get_all($mode = "both", $key = false) {
83
+ if(!$this->result) {
84
+ $this->error("No query pending");
85
+ return false;
86
+ }
87
+ $return = array();
88
+ while($this->nextr()) {
89
+ if($key !== false) $return[$this->f($key)] = $this->get_row($mode);
90
+ else $return[] = $this->get_row($mode);
91
+ }
92
+ return $return;
93
+ }
94
+
95
+ function f($index) {
96
+ return stripslashes($this->row[$index]);
97
+ }
98
+
99
+ function go_to($row) {
100
+ if(!$this->result) {
101
+ $this->error("No query pending");
102
+ return false;
103
+ }
104
+ if(!mysql_data_seek($this->result, $row)) $this->error();
105
+ }
106
+
107
+ function nf() {
108
+ if ($numb = mysql_num_rows($this->result) === false) $this->error();
109
+ return mysql_num_rows($this->result);
110
+ }
111
+ function af() {
112
+ return mysql_affected_rows();
113
+ }
114
+ function error($string="") {
115
+ $error = mysql_error();
116
+ if($this->settings["show_error"]) echo $error;
117
+ if($this->settings["error_file"] !== false) {
118
+ $handle = @fopen($this->settings["error_file"], "a+");
119
+ if($handle) {
120
+ @fwrite($handle, "[".date("Y-m-d H:i:s")."] ".$string." <".$error.">\n");
121
+ @fclose($handle);
122
+ }
123
+ }
124
+ if($this->settings["dieonerror"]) {
125
+ if(isset($this->result)) mysql_free_result($this->result);
126
+ mysql_close($this->link);
127
+ die();
128
+ }
129
+ }
130
+ function insert_id() {
131
+ if(!$this->link) return false;
132
+ return mysql_insert_id();
133
+ }
134
+ function escape($string){
135
+ if(!$this->link) return addslashes($string);
136
+ return mysql_real_escape_string($string);
137
+ }
138
+
139
+ function destroy(){
140
+ if (isset($this->result)) mysql_free_result($this->result);
141
+ if (isset($this->link)) mysql_close($this->link);
142
+ }
143
+
144
+
145
+ }
146
+ ?>
@@ -0,0 +1,152 @@
1
+ <?php
2
+ class _database {
3
+ private $data = false;
4
+ private $result = false;
5
+ private $row = false;
6
+
7
+ public $settings = array(
8
+ "servername"=> "localhost",
9
+ "serverport"=> "3306",
10
+ "username" => false,
11
+ "password" => false,
12
+ "database" => false,
13
+ "persist" => false,
14
+ "dieonerror"=> false,
15
+ "showerror" => false,
16
+ "error_file"=> true
17
+ );
18
+
19
+ function __construct() {
20
+ global $db_config;
21
+ $this->settings = array_merge($this->settings, $db_config);
22
+ if($this->settings["error_file"] === true) $this->settings["error_file"] = dirname(__FILE__)."/__mysql_errors.log";
23
+ }
24
+
25
+ function connect() {
26
+ $this->data = new mysqli(
27
+ $this->settings["servername"],
28
+ $this->settings["username"],
29
+ $this->settings["password"],
30
+ $this->settings["database"],
31
+ $this->settings["serverport"]
32
+ );
33
+
34
+ if(mysqli_connect_errno()) {
35
+ $this->error("Connection error: ".mysqli_connect_error() );
36
+ return false;
37
+ }
38
+ if(!$this->data->set_charset("utf8")) {
39
+ $this->error("Error loading character set utf8");
40
+ return false;
41
+ }
42
+ return true;
43
+ }
44
+
45
+ function query($sql) {
46
+ if(!$this->data && !$this->connect()) {
47
+ $this->error("Could node connect for query: ".$sql);
48
+ return false;
49
+ }
50
+ //echo $sql."<br />:";
51
+ if(!($this->result = $this->data->query($sql))) $this->error($sql);
52
+ return ($this->result) ? true : false;
53
+ }
54
+
55
+ function nextr(){
56
+ if(!$this->result) {
57
+ $this->error("No query pending");
58
+ return false;
59
+ }
60
+ unset($this->row);
61
+ $this->row = $this->result->fetch_array(MYSQL_BOTH);
62
+ return ($this->row) ? true : false ;
63
+ }
64
+
65
+ function get_row($mode = "both") {
66
+ if(!$this->row) return false;
67
+
68
+ $return = array();
69
+ switch($mode) {
70
+ case "assoc":
71
+ foreach($this->row as $k => $v) {
72
+ if(!is_int($k)) $return[$k] = $v;
73
+ }
74
+ break;
75
+ case "num":
76
+ foreach($this->row as $k => $v) {
77
+ if(is_int($k)) $return[$k] = $v;
78
+ }
79
+ break;
80
+ default:
81
+ $return = $this->row;
82
+ break;
83
+ }
84
+ return array_map("stripslashes",$return);
85
+ }
86
+
87
+ function get_all($mode = "both", $key = false) {
88
+ if(!$this->result) {
89
+ $this->error("No query pending");
90
+ return false;
91
+ }
92
+ $return = array();
93
+ while($this->nextr()) {
94
+ if($key !== false) $return[$this->f($key)] = $this->get_row($mode);
95
+ else $return[] = $this->get_row($mode);
96
+ }
97
+ return $return;
98
+ }
99
+
100
+ function f($index) {
101
+ return stripslashes($this->row[$index]);
102
+ }
103
+
104
+ function go_to($row) {
105
+ if(!$this->result) {
106
+ $this->error("No query pending");
107
+ return false;
108
+ }
109
+ if(!$this->data->data_seek($row)) $this->error();
110
+ }
111
+
112
+ function nf() {
113
+ if (!$this->result) {
114
+ $this->error("nf: no result set");
115
+ return false;
116
+ }
117
+ return $this->result->num_rows;
118
+ }
119
+ function af() {
120
+ return $this->data->affected_rows;
121
+ }
122
+ function error($string = "") {
123
+ $error = $this->data->error;
124
+ if($this->settings["show_error"]) echo $error;
125
+ if($this->settings["error_file"] !== false) {
126
+ $handle = @fopen($this->settings["error_file"], "a+");
127
+ if($handle) {
128
+ @fwrite($handle, "[".date("Y-m-d H:i:s")."] ".$string." <".$error.">\n");
129
+ @fclose($handle);
130
+ }
131
+ }
132
+ if($this->settings["dieonerror"]) {
133
+ if(isset($this->result)) $this->result->free();
134
+ @$this->data->close();
135
+ die();
136
+ }
137
+ }
138
+ function insert_id() {
139
+ return $this->data->insert_id;
140
+ }
141
+ function escape($string) {
142
+ if(!$this->data) return addslashes($string);
143
+ return $this->data->escape_string($string);
144
+ }
145
+
146
+ function destroy() {
147
+ if(isset($this->result)) $this->result->free();
148
+ if($this->data) $this->data->close();
149
+ }
150
+
151
+
152
+ }
@@ -0,0 +1,602 @@
1
+ <?php
2
+ class _tree_struct {
3
+ // Structure table and fields
4
+ protected $table = "";
5
+ protected $fields = array(
6
+ "id" => false,
7
+ "parent_id" => false,
8
+ "position" => false,
9
+ "left" => false,
10
+ "right" => false,
11
+ "level" => false
12
+ );
13
+
14
+ // Constructor
15
+ function __construct($table = "tree", $fields = array()) {
16
+ $this->table = $table;
17
+ if(!count($fields)) {
18
+ foreach($this->fields as $k => &$v) { $v = $k; }
19
+ }
20
+ else {
21
+ foreach($fields as $key => $field) {
22
+ switch($key) {
23
+ case "id":
24
+ case "parent_id":
25
+ case "position":
26
+ case "left":
27
+ case "right":
28
+ case "level":
29
+ $this->fields[$key] = $field;
30
+ break;
31
+ }
32
+ }
33
+ }
34
+ // Database
35
+ $this->db = new _database;
36
+ }
37
+
38
+ function _get_node($id) {
39
+ $this->db->query("SELECT `".implode("` , `", $this->fields)."` FROM `".$this->table."` WHERE `".$this->fields["id"]."` = ".(int) $id);
40
+ $this->db->nextr();
41
+ return $this->db->nf() === 0 ? false : $this->db->get_row("assoc");
42
+ }
43
+ function _get_children($id, $recursive = false) {
44
+ $children = array();
45
+ if($recursive) {
46
+ $node = $this->_get_node($id);
47
+ $this->db->query("SELECT `".implode("` , `", $this->fields)."` FROM `".$this->table."` WHERE `".$this->fields["left"]."` >= ".(int) $node[$this->fields["left"]]." AND `".$this->fields["right"]."` <= ".(int) $node[$this->fields["right"]]." ORDER BY `".$this->fields["left"]."` ASC");
48
+ }
49
+ else {
50
+ $this->db->query("SELECT `".implode("` , `", $this->fields)."` FROM `".$this->table."` WHERE `".$this->fields["parent_id"]."` = ".(int) $id." ORDER BY `".$this->fields["position"]."` ASC");
51
+ }
52
+ while($this->db->nextr()) $children[$this->db->f($this->fields["id"])] = $this->db->get_row("assoc");
53
+ return $children;
54
+ }
55
+ function _get_path($id) {
56
+ $node = $this->_get_node($id);
57
+ $path = array();
58
+ if(!$node === false) return false;
59
+ $this->db->query("SELECT `".implode("` , `", $this->fields)."` FROM `".$this->table."` WHERE `".$this->fields["left"]."` <= ".(int) $node[$this->fields["left"]]." AND `".$this->fields["right"]."` >= ".(int) $node[$this->fields["right"]]);
60
+ while($this->db->nextr()) $path[$this->db->f($this->fields["id"])] = $this->db->get_row("assoc");
61
+ return $path;
62
+ }
63
+
64
+ function _create($parent, $position) {
65
+ return $this->_move(0, $parent, $position);
66
+ }
67
+ function _remove($id) {
68
+ if((int)$id === 1) { return false; }
69
+ $data = $this->_get_node($id);
70
+ $lft = (int)$data[$this->fields["left"]];
71
+ $rgt = (int)$data[$this->fields["right"]];
72
+ $dif = $rgt - $lft + 1;
73
+
74
+ // deleting node and its children
75
+ $this->db->query("" .
76
+ "DELETE FROM `".$this->table."` " .
77
+ "WHERE `".$this->fields["left"]."` >= ".$lft." AND `".$this->fields["right"]."` <= ".$rgt
78
+ );
79
+ // shift left indexes of nodes right of the node
80
+ $this->db->query("".
81
+ "UPDATE `".$this->table."` " .
82
+ "SET `".$this->fields["left"]."` = `".$this->fields["left"]."` - ".$dif." " .
83
+ "WHERE `".$this->fields["left"]."` > ".$rgt
84
+ );
85
+ // shift right indexes of nodes right of the node and the node's parents
86
+ $this->db->query("" .
87
+ "UPDATE `".$this->table."` " .
88
+ "SET `".$this->fields["right"]."` = `".$this->fields["right"]."` - ".$dif." " .
89
+ "WHERE `".$this->fields["right"]."` > ".$lft
90
+ );
91
+
92
+ $pid = (int)$data[$this->fields["parent_id"]];
93
+ $pos = (int)$data[$this->fields["position"]];
94
+
95
+ // Update position of siblings below the deleted node
96
+ $this->db->query("" .
97
+ "UPDATE `".$this->table."` " .
98
+ "SET `".$this->fields["position"]."` = `".$this->fields["position"]."` - 1 " .
99
+ "WHERE `".$this->fields["parent_id"]."` = ".$pid." AND `".$this->fields["position"]."` > ".$pos
100
+ );
101
+ return true;
102
+ }
103
+ function _move($id, $ref_id, $position = 0, $is_copy = false) {
104
+ if((int)$ref_id === 0 || (int)$id === 1) { return false; }
105
+ $sql = array(); // Queries executed at the end
106
+ $node = $this->_get_node($id); // Node data
107
+ $nchildren = $this->_get_children($id); // Node children
108
+ $ref_node = $this->_get_node($ref_id); // Ref node data
109
+ $rchildren = $this->_get_children($ref_id);// Ref node children
110
+
111
+ $ndif = 2;
112
+ $node_ids = array(-1);
113
+ if($node !== false) {
114
+ $node_ids = array_keys($this->_get_children($id, true));
115
+ // TODO: should be !$is_copy && , but if copied to self - screws some right indexes
116
+ if(in_array($ref_id, $node_ids)) return false;
117
+ $ndif = $node[$this->fields["right"]] - $node[$this->fields["left"]] + 1;
118
+ }
119
+ if($position >= count($rchildren)) {
120
+ $position = count($rchildren);
121
+ }
122
+
123
+ // Not creating or copying - old parent is cleaned
124
+ if($node !== false && $is_copy == false) {
125
+ $sql[] = "" .
126
+ "UPDATE `".$this->table."` " .
127
+ "SET `".$this->fields["position"]."` = `".$this->fields["position"]."` - 1 " .
128
+ "WHERE " .
129
+ "`".$this->fields["parent_id"]."` = ".$node[$this->fields["parent_id"]]." AND " .
130
+ "`".$this->fields["position"]."` > ".$node[$this->fields["position"]];
131
+ $sql[] = "" .
132
+ "UPDATE `".$this->table."` " .
133
+ "SET `".$this->fields["left"]."` = `".$this->fields["left"]."` - ".$ndif." " .
134
+ "WHERE `".$this->fields["left"]."` > ".$node[$this->fields["right"]];
135
+ $sql[] = "" .
136
+ "UPDATE `".$this->table."` " .
137
+ "SET `".$this->fields["right"]."` = `".$this->fields["right"]."` - ".$ndif." " .
138
+ "WHERE " .
139
+ "`".$this->fields["right"]."` > ".$node[$this->fields["left"]]." AND " .
140
+ "`".$this->fields["id"]."` NOT IN (".implode(",", $node_ids).") ";
141
+ }
142
+ // Preparing new parent
143
+ $sql[] = "" .
144
+ "UPDATE `".$this->table."` " .
145
+ "SET `".$this->fields["position"]."` = `".$this->fields["position"]."` + 1 " .
146
+ "WHERE " .
147
+ "`".$this->fields["parent_id"]."` = ".$ref_id." AND " .
148
+ "`".$this->fields["position"]."` >= ".$position." " .
149
+ ( $is_copy ? "" : " AND `".$this->fields["id"]."` NOT IN (".implode(",", $node_ids).") ");
150
+
151
+ $ref_ind = $ref_id === 0 ? (int)$rchildren[count($rchildren) - 1][$this->fields["right"]] + 1 : (int)$ref_node[$this->fields["right"]];
152
+ $ref_ind = max($ref_ind, 1);
153
+
154
+ $self = ($node !== false && !$is_copy && (int)$node[$this->fields["parent_id"]] == $ref_id && $position > $node[$this->fields["position"]]) ? 1 : 0;
155
+ foreach($rchildren as $k => $v) {
156
+ if($v[$this->fields["position"]] - $self == $position) {
157
+ $ref_ind = (int)$v[$this->fields["left"]];
158
+ break;
159
+ }
160
+ }
161
+ if($node !== false && !$is_copy && $node[$this->fields["left"]] < $ref_ind) {
162
+ $ref_ind -= $ndif;
163
+ }
164
+
165
+ $sql[] = "" .
166
+ "UPDATE `".$this->table."` " .
167
+ "SET `".$this->fields["left"]."` = `".$this->fields["left"]."` + ".$ndif." " .
168
+ "WHERE " .
169
+ "`".$this->fields["left"]."` >= ".$ref_ind." " .
170
+ ( $is_copy ? "" : " AND `".$this->fields["id"]."` NOT IN (".implode(",", $node_ids).") ");
171
+ $sql[] = "" .
172
+ "UPDATE `".$this->table."` " .
173
+ "SET `".$this->fields["right"]."` = `".$this->fields["right"]."` + ".$ndif." " .
174
+ "WHERE " .
175
+ "`".$this->fields["right"]."` >= ".$ref_ind." " .
176
+ ( $is_copy ? "" : " AND `".$this->fields["id"]."` NOT IN (".implode(",", $node_ids).") ");
177
+
178
+ $ldif = $ref_id == 0 ? 0 : $ref_node[$this->fields["level"]] + 1;
179
+ $idif = $ref_ind;
180
+ if($node !== false) {
181
+ $ldif = $node[$this->fields["level"]] - ($ref_node[$this->fields["level"]] + 1);
182
+ $idif = $node[$this->fields["left"]] - $ref_ind;
183
+ if($is_copy) {
184
+ $sql[] = "" .
185
+ "INSERT INTO `".$this->table."` (" .
186
+ "`".$this->fields["parent_id"]."`, " .
187
+ "`".$this->fields["position"]."`, " .
188
+ "`".$this->fields["left"]."`, " .
189
+ "`".$this->fields["right"]."`, " .
190
+ "`".$this->fields["level"]."`" .
191
+ ") " .
192
+ "SELECT " .
193
+ "".$ref_id.", " .
194
+ "`".$this->fields["position"]."`, " .
195
+ "`".$this->fields["left"]."` - (".($idif + ($node[$this->fields["left"]] >= $ref_ind ? $ndif : 0))."), " .
196
+ "`".$this->fields["right"]."` - (".($idif + ($node[$this->fields["left"]] >= $ref_ind ? $ndif : 0))."), " .
197
+ "`".$this->fields["level"]."` - (".$ldif.") " .
198
+ "FROM `".$this->table."` " .
199
+ "WHERE " .
200
+ "`".$this->fields["id"]."` IN (".implode(",", $node_ids).") " .
201
+ "ORDER BY `".$this->fields["level"]."` ASC";
202
+ }
203
+ else {
204
+ $sql[] = "" .
205
+ "UPDATE `".$this->table."` SET " .
206
+ "`".$this->fields["parent_id"]."` = ".$ref_id.", " .
207
+ "`".$this->fields["position"]."` = ".$position." " .
208
+ "WHERE " .
209
+ "`".$this->fields["id"]."` = ".$id;
210
+ $sql[] = "" .
211
+ "UPDATE `".$this->table."` SET " .
212
+ "`".$this->fields["left"]."` = `".$this->fields["left"]."` - (".$idif."), " .
213
+ "`".$this->fields["right"]."` = `".$this->fields["right"]."` - (".$idif."), " .
214
+ "`".$this->fields["level"]."` = `".$this->fields["level"]."` - (".$ldif.") " .
215
+ "WHERE " .
216
+ "`".$this->fields["id"]."` IN (".implode(",", $node_ids).") ";
217
+ }
218
+ }
219
+ else {
220
+ $sql[] = "" .
221
+ "INSERT INTO `".$this->table."` (" .
222
+ "`".$this->fields["parent_id"]."`, " .
223
+ "`".$this->fields["position"]."`, " .
224
+ "`".$this->fields["left"]."`, " .
225
+ "`".$this->fields["right"]."`, " .
226
+ "`".$this->fields["level"]."` " .
227
+ ") " .
228
+ "VALUES (" .
229
+ $ref_id.", " .
230
+ $position.", " .
231
+ $idif.", " .
232
+ ($idif + 1).", " .
233
+ $ldif.
234
+ ")";
235
+ }
236
+ foreach($sql as $q) { $this->db->query($q); }
237
+ $ind = $this->db->insert_id();
238
+ if($is_copy) $this->_fix_copy($ind, $position);
239
+ return $node === false || $is_copy ? $ind : true;
240
+ }
241
+ function _fix_copy($id, $position) {
242
+ $node = $this->_get_node($id);
243
+ $children = $this->_get_children($id, true);
244
+
245
+ $map = array();
246
+ for($i = $node[$this->fields["left"]] + 1; $i < $node[$this->fields["right"]]; $i++) {
247
+ $map[$i] = $id;
248
+ }
249
+ foreach($children as $cid => $child) {
250
+ if((int)$cid == (int)$id) {
251
+ $this->db->query("UPDATE `".$this->table."` SET `".$this->fields["position"]."` = ".$position." WHERE `".$this->fields["id"]."` = ".$cid);
252
+ continue;
253
+ }
254
+ $this->db->query("UPDATE `".$this->table."` SET `".$this->fields["parent_id"]."` = ".$map[(int)$child[$this->fields["left"]]]." WHERE `".$this->fields["id"]."` = ".$cid);
255
+ for($i = $child[$this->fields["left"]] + 1; $i < $child[$this->fields["right"]]; $i++) {
256
+ $map[$i] = $cid;
257
+ }
258
+ }
259
+ }
260
+
261
+ function _reconstruct() {
262
+ $this->db->query("" .
263
+ "CREATE TEMPORARY TABLE `temp_tree` (" .
264
+ "`".$this->fields["id"]."` INTEGER NOT NULL, " .
265
+ "`".$this->fields["parent_id"]."` INTEGER NOT NULL, " .
266
+ "`". $this->fields["position"]."` INTEGER NOT NULL" .
267
+ ") type=HEAP"
268
+ );
269
+ $this->db->query("" .
270
+ "INSERT INTO `temp_tree` " .
271
+ "SELECT " .
272
+ "`".$this->fields["id"]."`, " .
273
+ "`".$this->fields["parent_id"]."`, " .
274
+ "`".$this->fields["position"]."` " .
275
+ "FROM `".$this->table."`"
276
+ );
277
+
278
+ $this->db->query("" .
279
+ "CREATE TEMPORARY TABLE `temp_stack` (" .
280
+ "`".$this->fields["id"]."` INTEGER NOT NULL, " .
281
+ "`".$this->fields["left"]."` INTEGER, " .
282
+ "`".$this->fields["right"]."` INTEGER, " .
283
+ "`".$this->fields["level"]."` INTEGER, " .
284
+ "`stack_top` INTEGER NOT NULL, " .
285
+ "`".$this->fields["parent_id"]."` INTEGER, " .
286
+ "`".$this->fields["position"]."` INTEGER " .
287
+ ") type=HEAP"
288
+ );
289
+ $counter = 2;
290
+ $this->db->query("SELECT COUNT(*) FROM temp_tree");
291
+ $this->db->nextr();
292
+ $maxcounter = (int) $this->db->f(0) * 2;
293
+ $currenttop = 1;
294
+ $this->db->query("" .
295
+ "INSERT INTO `temp_stack` " .
296
+ "SELECT " .
297
+ "`".$this->fields["id"]."`, " .
298
+ "1, " .
299
+ "NULL, " .
300
+ "0, " .
301
+ "1, " .
302
+ "`".$this->fields["parent_id"]."`, " .
303
+ "`".$this->fields["position"]."` " .
304
+ "FROM `temp_tree` " .
305
+ "WHERE `".$this->fields["parent_id"]."` = 0"
306
+ );
307
+ $this->db->query("DELETE FROM `temp_tree` WHERE `".$this->fields["parent_id"]."` = 0");
308
+
309
+ while ($counter <= $maxcounter) {
310
+ $this->db->query("" .
311
+ "SELECT " .
312
+ "`temp_tree`.`".$this->fields["id"]."` AS tempmin, " .
313
+ "`temp_tree`.`".$this->fields["parent_id"]."` AS pid, " .
314
+ "`temp_tree`.`".$this->fields["position"]."` AS lid " .
315
+ "FROM `temp_stack`, `temp_tree` " .
316
+ "WHERE " .
317
+ "`temp_stack`.`".$this->fields["id"]."` = `temp_tree`.`".$this->fields["parent_id"]."` AND " .
318
+ "`temp_stack`.`stack_top` = ".$currenttop." " .
319
+ "ORDER BY `temp_tree`.`".$this->fields["position"]."` ASC LIMIT 1"
320
+ );
321
+
322
+ if ($this->db->nextr()) {
323
+ $tmp = $this->db->f("tempmin");
324
+
325
+ $q = "INSERT INTO temp_stack (stack_top, `".$this->fields["id"]."`, `".$this->fields["left"]."`, `".$this->fields["right"]."`, `".$this->fields["level"]."`, `".$this->fields["parent_id"]."`, `".$this->fields["position"]."`) VALUES(".($currenttop + 1).", ".$tmp.", ".$counter.", NULL, ".$currenttop.", ".$this->db->f("pid").", ".$this->db->f("lid").")";
326
+ $this->db->query($q);
327
+ $this->db->query("DELETE FROM `temp_tree` WHERE `".$this->fields["id"]."` = ".$tmp);
328
+ $counter++;
329
+ $currenttop++;
330
+ }
331
+ else {
332
+ $this->db->query("" .
333
+ "UPDATE temp_stack SET " .
334
+ "`".$this->fields["right"]."` = ".$counter.", " .
335
+ "`stack_top` = -`stack_top` " .
336
+ "WHERE `stack_top` = ".$currenttop
337
+ );
338
+ $counter++;
339
+ $currenttop--;
340
+ }
341
+ }
342
+
343
+ $temp_fields = $this->fields;
344
+ unset($temp_fields["parent_id"]);
345
+ unset($temp_fields["position"]);
346
+ unset($temp_fields["left"]);
347
+ unset($temp_fields["right"]);
348
+ unset($temp_fields["level"]);
349
+ if(count($temp_fields) > 1) {
350
+ $this->db->query("" .
351
+ "CREATE TEMPORARY TABLE `temp_tree2` " .
352
+ "SELECT `".implode("`, `", $temp_fields)."` FROM `".$this->table."` "
353
+ );
354
+ }
355
+ $this->db->query("TRUNCATE TABLE `".$this->table."`");
356
+ $this->db->query("" .
357
+ "INSERT INTO ".$this->table." (" .
358
+ "`".$this->fields["id"]."`, " .
359
+ "`".$this->fields["parent_id"]."`, " .
360
+ "`".$this->fields["position"]."`, " .
361
+ "`".$this->fields["left"]."`, " .
362
+ "`".$this->fields["right"]."`, " .
363
+ "`".$this->fields["level"]."` " .
364
+ ") " .
365
+ "SELECT " .
366
+ "`".$this->fields["id"]."`, " .
367
+ "`".$this->fields["parent_id"]."`, " .
368
+ "`".$this->fields["position"]."`, " .
369
+ "`".$this->fields["left"]."`, " .
370
+ "`".$this->fields["right"]."`, " .
371
+ "`".$this->fields["level"]."` " .
372
+ "FROM temp_stack " .
373
+ "ORDER BY `".$this->fields["id"]."`"
374
+ );
375
+ if(count($temp_fields) > 1) {
376
+ $sql = "" .
377
+ "UPDATE `".$this->table."` v, `temp_tree2` SET v.`".$this->fields["id"]."` = v.`".$this->fields["id"]."` ";
378
+ foreach($temp_fields as $k => $v) {
379
+ if($k == "id") continue;
380
+ $sql .= ", v.`".$v."` = `temp_tree2`.`".$v."` ";
381
+ }
382
+ $sql .= " WHERE v.`".$this->fields["id"]."` = `temp_tree2`.`".$this->fields["id"]."` ";
383
+ $this->db->query($sql);
384
+ }
385
+ }
386
+
387
+ function _analyze() {
388
+ $report = array();
389
+
390
+ $this->db->query("" .
391
+ "SELECT " .
392
+ "`".$this->fields["left"]."` FROM `".$this->table."` s " .
393
+ "WHERE " .
394
+ "`".$this->fields["parent_id"]."` = 0 "
395
+ );
396
+ $this->db->nextr();
397
+ if($this->db->nf() == 0) {
398
+ $report[] = "[FAIL]\tNo root node.";
399
+ }
400
+ else {
401
+ $report[] = ($this->db->nf() > 1) ? "[FAIL]\tMore than one root node." : "[OK]\tJust one root node.";
402
+ }
403
+ $report[] = ($this->db->f(0) != 1) ? "[FAIL]\tRoot node's left index is not 1." : "[OK]\tRoot node's left index is 1.";
404
+
405
+ $this->db->query("" .
406
+ "SELECT " .
407
+ "COUNT(*) FROM `".$this->table."` s " .
408
+ "WHERE " .
409
+ "`".$this->fields["parent_id"]."` != 0 AND " .
410
+ "(SELECT COUNT(*) FROM `".$this->table."` WHERE `".$this->fields["id"]."` = s.`".$this->fields["parent_id"]."`) = 0 ");
411
+ $this->db->nextr();
412
+ $report[] = ($this->db->f(0) > 0) ? "[FAIL]\tMissing parents." : "[OK]\tNo missing parents.";
413
+
414
+ $this->db->query("SELECT MAX(`".$this->fields["right"]."`) FROM `".$this->table."`");
415
+ $this->db->nextr();
416
+ $n = $this->db->f(0);
417
+ $this->db->query("SELECT COUNT(*) FROM `".$this->table."`");
418
+ $this->db->nextr();
419
+ $c = $this->db->f(0);
420
+ $report[] = ($n/2 != $c) ? "[FAIL]\tRight index does not match node count." : "[OK]\tRight index matches count.";
421
+
422
+ $this->db->query("" .
423
+ "SELECT COUNT(`".$this->fields["id"]."`) FROM `".$this->table."` s " .
424
+ "WHERE " .
425
+ "(SELECT COUNT(*) FROM `".$this->table."` WHERE " .
426
+ "`".$this->fields["right"]."` < s.`".$this->fields["right"]."` AND " .
427
+ "`".$this->fields["left"]."` > s.`".$this->fields["left"]."` AND " .
428
+ "`".$this->fields["level"]."` = s.`".$this->fields["level"]."` + 1" .
429
+ ") != " .
430
+ "(SELECT COUNT(*) FROM `".$this->table."` WHERE " .
431
+ "`".$this->fields["parent_id"]."` = s.`".$this->fields["id"]."`" .
432
+ ") "
433
+ );
434
+ $this->db->nextr();
435
+ $report[] = ($this->db->f(0) > 0) ? "[FAIL]\tAdjacency and nested set do not match." : "[OK]\tNS and AJ match";
436
+
437
+ return implode("<br />",$report);
438
+ }
439
+
440
+ function _dump($output = false) {
441
+ $nodes = array();
442
+ $this->db->query("SELECT * FROM ".$this->table." ORDER BY `".$this->fields["left"]."`");
443
+ while($this->db->nextr()) $nodes[] = $this->db->get_row("assoc");
444
+ if($output) {
445
+ echo "<pre>";
446
+ foreach($nodes as $node) {
447
+ echo str_repeat("&#160;",(int)$node[$this->fields["level"]] * 2);
448
+ echo $node[$this->fields["id"]]." (".$node[$this->fields["left"]].",".$node[$this->fields["right"]].",".$node[$this->fields["level"]].",".$node[$this->fields["parent_id"]].",".$node[$this->fields["position"]].")<br />";
449
+ }
450
+ echo str_repeat("-",40);
451
+ echo "</pre>";
452
+ }
453
+ return $nodes;
454
+ }
455
+ function _drop() {
456
+ $this->db->query("TRUNCATE TABLE `".$this->table."`");
457
+ $this->db->query("" .
458
+ "INSERT INTO `".$this->table."` (" .
459
+ "`".$this->fields["id"]."`, " .
460
+ "`".$this->fields["parent_id"]."`, " .
461
+ "`".$this->fields["position"]."`, " .
462
+ "`".$this->fields["left"]."`, " .
463
+ "`".$this->fields["right"]."`, " .
464
+ "`".$this->fields["level"]."` " .
465
+ ") " .
466
+ "VALUES (" .
467
+ "1, " .
468
+ "0, " .
469
+ "0, " .
470
+ "1, " .
471
+ "2, " .
472
+ "0 ".
473
+ ")");
474
+ }
475
+ }
476
+
477
+ class json_tree extends _tree_struct {
478
+ function __construct($table = "tree", $fields = array(), $add_fields = array("title" => "title", "type" => "type")) {
479
+ parent::__construct($table, $fields);
480
+ $this->fields = array_merge($this->fields, $add_fields);
481
+ $this->add_fields = $add_fields;
482
+ }
483
+
484
+ function create_node($data) {
485
+ $id = parent::_create((int)$data[$this->fields["id"]], (int)$data[$this->fields["position"]]);
486
+ if($id) {
487
+ $data["id"] = $id;
488
+ $this->set_data($data);
489
+ return "{ \"status\" : 1, \"id\" : ".(int)$id." }";
490
+ }
491
+ return "{ \"status\" : 0 }";
492
+ }
493
+ function set_data($data) {
494
+ if(count($this->add_fields) == 0) { return "{ \"status\" : 1 }"; }
495
+ $s = "UPDATE `".$this->table."` SET `".$this->fields["id"]."` = `".$this->fields["id"]."` ";
496
+ foreach($this->add_fields as $k => $v) {
497
+ if(isset($data[$k])) $s .= ", `".$this->fields[$v]."` = \"".$this->db->escape($data[$k])."\" ";
498
+ else $s .= ", `".$this->fields[$v]."` = `".$this->fields[$v]."` ";
499
+ }
500
+ $s .= "WHERE `".$this->fields["id"]."` = ".(int)$data["id"];
501
+ $this->db->query($s);
502
+ return "{ \"status\" : 1 }";
503
+ }
504
+ function rename_node($data) { return $this->set_data($data); }
505
+
506
+ function move_node($data) {
507
+ $id = parent::_move((int)$data["id"], (int)$data["ref"], (int)$data["position"], (int)$data["copy"]);
508
+ if(!$id) return "{ \"status\" : 0 }";
509
+ if((int)$data["copy"] && count($this->add_fields)) {
510
+ $ids = array_keys($this->_get_children($id, true));
511
+ $data = $this->_get_children((int)$data["id"], true);
512
+
513
+ $i = 0;
514
+ foreach($data as $dk => $dv) {
515
+ $s = "UPDATE `".$this->table."` SET `".$this->fields["id"]."` = `".$this->fields["id"]."` ";
516
+ foreach($this->add_fields as $k => $v) {
517
+ if(isset($dv[$k])) $s .= ", `".$this->fields[$v]."` = \"".$this->db->escape($dv[$k])."\" ";
518
+ else $s .= ", `".$this->fields[$v]."` = `".$this->fields[$v]."` ";
519
+ }
520
+ $s .= "WHERE `".$this->fields["id"]."` = ".$ids[$i];
521
+ $this->db->query($s);
522
+ $i++;
523
+ }
524
+ }
525
+ return "{ \"status\" : 1, \"id\" : ".$id." }";
526
+ }
527
+ function remove_node($data) {
528
+ $id = parent::_remove((int)$data["id"]);
529
+ return "{ \"status\" : 1 }";
530
+ }
531
+ function get_children($data) {
532
+ $tmp = $this->_get_children((int)$data["id"]);
533
+ if((int)$data["id"] === 1 && count($tmp) === 0) {
534
+ $this->_create_default();
535
+ $tmp = $this->_get_children((int)$data["id"]);
536
+ }
537
+ $result = array();
538
+ if((int)$data["id"] === 0) return json_encode($result);
539
+ foreach($tmp as $k => $v) {
540
+ $result[] = array(
541
+ "attr" => array("id" => "node_".$k, "rel" => $v[$this->fields["type"]]),
542
+ "data" => $v[$this->fields["title"]],
543
+ "state" => ((int)$v[$this->fields["right"]] - (int)$v[$this->fields["left"]] > 1) ? "closed" : ""
544
+ );
545
+ }
546
+ return json_encode($result);
547
+ }
548
+ function search($data) {
549
+ $this->db->query("SELECT `".$this->fields["left"]."`, `".$this->fields["right"]."` FROM `".$this->table."` WHERE `".$this->fields["title"]."` LIKE '%".$this->db->escape($data["search_str"])."%'");
550
+ if($this->db->nf() === 0) return "[]";
551
+ $q = "SELECT DISTINCT `".$this->fields["id"]."` FROM `".$this->table."` WHERE 0 ";
552
+ while($this->db->nextr()) {
553
+ $q .= " OR (`".$this->fields["left"]."` < ".(int)$this->db->f(0)." AND `".$this->fields["right"]."` > ".(int)$this->db->f(1).") ";
554
+ }
555
+ $result = array();
556
+ $this->db->query($q);
557
+ while($this->db->nextr()) { $result[] = "#node_".$this->db->f(0); }
558
+ return json_encode($result);
559
+ }
560
+
561
+ function _create_default() {
562
+ $this->_drop();
563
+ $this->create_node(array(
564
+ "id" => 1,
565
+ "position" => 0,
566
+ "title" => "C:",
567
+ "type" => "drive"
568
+ ));
569
+ $this->create_node(array(
570
+ "id" => 1,
571
+ "position" => 1,
572
+ "title" => "D:",
573
+ "type" => "drive"
574
+ ));
575
+ $this->create_node(array(
576
+ "id" => 2,
577
+ "position" => 0,
578
+ "title" => "_demo",
579
+ "type" => "folder"
580
+ ));
581
+ $this->create_node(array(
582
+ "id" => 2,
583
+ "position" => 1,
584
+ "title" => "_docs",
585
+ "type" => "folder"
586
+ ));
587
+ $this->create_node(array(
588
+ "id" => 4,
589
+ "position" => 0,
590
+ "title" => "index.html",
591
+ "type" => "default"
592
+ ));
593
+ $this->create_node(array(
594
+ "id" => 5,
595
+ "position" => 1,
596
+ "title" => "doc.html",
597
+ "type" => "default"
598
+ ));
599
+ }
600
+ }
601
+
602
+ ?>