tr8n 3.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (751) hide show
  1. data/.project +18 -0
  2. data/Gemfile +34 -0
  3. data/Gemfile.lock +79 -0
  4. data/LICENSE +18 -0
  5. data/README.rdoc +116 -0
  6. data/Rakefile +29 -0
  7. data/VERSION +1 -0
  8. data/app/controllers/application_controller.rb +28 -0
  9. data/app/controllers/tr8n/admin/base_controller.rb +65 -0
  10. data/app/controllers/tr8n/admin/clientsdk_controller.rb +34 -0
  11. data/app/controllers/tr8n/admin/domain_controller.rb +77 -0
  12. data/app/controllers/tr8n/admin/forum_controller.rb +58 -0
  13. data/app/controllers/tr8n/admin/glossary_controller.rb +56 -0
  14. data/app/controllers/tr8n/admin/language_controller.rb +129 -0
  15. data/app/controllers/tr8n/admin/translation_controller.rb +64 -0
  16. data/app/controllers/tr8n/admin/translation_key_controller.rb +157 -0
  17. data/app/controllers/tr8n/admin/translator_controller.rb +119 -0
  18. data/app/controllers/tr8n/api/v1/base_controller.rb +81 -0
  19. data/app/controllers/tr8n/api/v1/language_controller.rb +107 -0
  20. data/app/controllers/tr8n/api/v1/translation_controller.rb +75 -0
  21. data/app/controllers/tr8n/api/v1/translator_controller.rb +34 -0
  22. data/app/controllers/tr8n/awards_controller.rb +43 -0
  23. data/app/controllers/tr8n/base_controller.rb +206 -0
  24. data/app/controllers/tr8n/dashboard_controller.rb +32 -0
  25. data/app/controllers/tr8n/forum_controller.rb +100 -0
  26. data/app/controllers/tr8n/glossary_controller.rb +40 -0
  27. data/app/controllers/tr8n/help_controller.rb +40 -0
  28. data/app/controllers/tr8n/home_controller.rb +51 -0
  29. data/app/controllers/tr8n/language_cases_controller.rb +82 -0
  30. data/app/controllers/tr8n/language_controller.rb +372 -0
  31. data/app/controllers/tr8n/login_controller.rb +86 -0
  32. data/app/controllers/tr8n/phrases_controller.rb +293 -0
  33. data/app/controllers/tr8n/translations_controller.rb +194 -0
  34. data/app/controllers/tr8n/translator_controller.rb +83 -0
  35. data/app/helpers/application_helper.rb +27 -0
  36. data/app/helpers/tr8n/admin/base_helper.rb +84 -0
  37. data/app/helpers/tr8n/base_helper.rb +44 -0
  38. data/app/helpers/tr8n/dashboard_helper.rb +43 -0
  39. data/app/models/tr8n/base_filter.rb +68 -0
  40. data/app/models/tr8n/daily_language_metric.rb +42 -0
  41. data/app/models/tr8n/date_rule.rb +123 -0
  42. data/app/models/tr8n/gender_list_rule.rb +247 -0
  43. data/app/models/tr8n/gender_rule.rb +140 -0
  44. data/app/models/tr8n/glossary.rb +27 -0
  45. data/app/models/tr8n/glossary_filter.rb +33 -0
  46. data/app/models/tr8n/integration/ru/russian_gender_list_rule.rb +60 -0
  47. data/app/models/tr8n/integration/ru/russian_numeric_rule.rb +64 -0
  48. data/app/models/tr8n/ip_location.rb +74 -0
  49. data/app/models/tr8n/ip_location_filter.rb +34 -0
  50. data/app/models/tr8n/language.rb +318 -0
  51. data/app/models/tr8n/language_case.rb +141 -0
  52. data/app/models/tr8n/language_case_filter.rb +30 -0
  53. data/app/models/tr8n/language_case_rule.rb +187 -0
  54. data/app/models/tr8n/language_case_rule_filter.rb +30 -0
  55. data/app/models/tr8n/language_case_value_map.rb +100 -0
  56. data/app/models/tr8n/language_case_value_map_filter.rb +41 -0
  57. data/app/models/tr8n/language_filter.rb +75 -0
  58. data/app/models/tr8n/language_forum_abuse_report.rb +33 -0
  59. data/app/models/tr8n/language_forum_abuse_report_filter.rb +30 -0
  60. data/app/models/tr8n/language_forum_message.rb +46 -0
  61. data/app/models/tr8n/language_forum_message_filter.rb +34 -0
  62. data/app/models/tr8n/language_forum_topic.rb +41 -0
  63. data/app/models/tr8n/language_forum_topic_filter.rb +34 -0
  64. data/app/models/tr8n/language_metric.rb +91 -0
  65. data/app/models/tr8n/language_metric_filter.rb +63 -0
  66. data/app/models/tr8n/language_rule.rb +117 -0
  67. data/app/models/tr8n/language_rule_filter.rb +45 -0
  68. data/app/models/tr8n/language_user.rb +61 -0
  69. data/app/models/tr8n/language_user_filter.rb +34 -0
  70. data/app/models/tr8n/list_rule.rb +118 -0
  71. data/app/models/tr8n/monthly_language_metric.rb +34 -0
  72. data/app/models/tr8n/numeric_rule.rb +175 -0
  73. data/app/models/tr8n/total_language_metric.rb +59 -0
  74. data/app/models/tr8n/translation.rb +299 -0
  75. data/app/models/tr8n/translation_domain.rb +48 -0
  76. data/app/models/tr8n/translation_domain_filter.rb +26 -0
  77. data/app/models/tr8n/translation_filter.rb +34 -0
  78. data/app/models/tr8n/translation_key.rb +625 -0
  79. data/app/models/tr8n/translation_key_comment.rb +37 -0
  80. data/app/models/tr8n/translation_key_comment_filter.rb +30 -0
  81. data/app/models/tr8n/translation_key_filter.rb +45 -0
  82. data/app/models/tr8n/translation_key_lock.rb +59 -0
  83. data/app/models/tr8n/translation_key_lock_filter.rb +30 -0
  84. data/app/models/tr8n/translation_key_source.rb +58 -0
  85. data/app/models/tr8n/translation_key_source_filter.rb +30 -0
  86. data/app/models/tr8n/translation_source.rb +52 -0
  87. data/app/models/tr8n/translation_source_filter.rb +30 -0
  88. data/app/models/tr8n/translation_vote.rb +36 -0
  89. data/app/models/tr8n/translation_vote_filter.rb +34 -0
  90. data/app/models/tr8n/translator.rb +301 -0
  91. data/app/models/tr8n/translator_filter.rb +46 -0
  92. data/app/models/tr8n/translator_following.rb +38 -0
  93. data/app/models/tr8n/translator_following_filter.rb +34 -0
  94. data/app/models/tr8n/translator_log.rb +120 -0
  95. data/app/models/tr8n/translator_log_filter.rb +49 -0
  96. data/app/models/tr8n/translator_metric.rb +83 -0
  97. data/app/models/tr8n/translator_metric_filter.rb +38 -0
  98. data/app/models/tr8n/translator_report.rb +82 -0
  99. data/app/models/tr8n/translator_report_filter.rb +30 -0
  100. data/app/models/tr8n/value_rule.rb +117 -0
  101. data/app/views/layouts/_footer.html.erb +15 -0
  102. data/app/views/layouts/_header.html.erb +12 -0
  103. data/app/views/layouts/_html_head.html.erb +5 -0
  104. data/app/views/layouts/tr8n.html.erb +21 -0
  105. data/app/views/layouts/tr8n_admin.html.erb +33 -0
  106. data/app/views/tr8n/admin/clientsdk/index.html.erb +133 -0
  107. data/app/views/tr8n/admin/clientsdk/lb_samples.html.erb +54 -0
  108. data/app/views/tr8n/admin/common/_footer.html.erb +1 -0
  109. data/app/views/tr8n/admin/common/_header.html.erb +30 -0
  110. data/app/views/tr8n/admin/common/_lightbox_buttons.html.erb +5 -0
  111. data/app/views/tr8n/admin/common/_paginator.html.erb +20 -0
  112. data/app/views/tr8n/admin/domain/_tabs.html.erb +23 -0
  113. data/app/views/tr8n/admin/domain/index.html.erb +33 -0
  114. data/app/views/tr8n/admin/domain/key_sources.rhtml +53 -0
  115. data/app/views/tr8n/admin/domain/lb_caller.html.erb +35 -0
  116. data/app/views/tr8n/admin/domain/sources.html.erb +35 -0
  117. data/app/views/tr8n/admin/forum/_tabs.html.erb +22 -0
  118. data/app/views/tr8n/admin/forum/index.html.erb +34 -0
  119. data/app/views/tr8n/admin/forum/messages.html.erb +33 -0
  120. data/app/views/tr8n/admin/forum/reports.html.erb +50 -0
  121. data/app/views/tr8n/admin/glossary/index.html.erb +22 -0
  122. data/app/views/tr8n/admin/glossary/lb_update.html.erb +26 -0
  123. data/app/views/tr8n/admin/language/_rules.html.erb +22 -0
  124. data/app/views/tr8n/admin/language/_tabs.html.erb +27 -0
  125. data/app/views/tr8n/admin/language/_users.html.erb +40 -0
  126. data/app/views/tr8n/admin/language/case_rules.html.erb +24 -0
  127. data/app/views/tr8n/admin/language/case_values.html.erb +25 -0
  128. data/app/views/tr8n/admin/language/cases.html.erb +24 -0
  129. data/app/views/tr8n/admin/language/charts.html.erb +35 -0
  130. data/app/views/tr8n/admin/language/index.html.erb +99 -0
  131. data/app/views/tr8n/admin/language/lb_update.html.erb +76 -0
  132. data/app/views/tr8n/admin/language/lb_value_map.html.erb +42 -0
  133. data/app/views/tr8n/admin/language/metrics.rhtml +16 -0
  134. data/app/views/tr8n/admin/language/rules.html.erb +24 -0
  135. data/app/views/tr8n/admin/language/users.rhtml +31 -0
  136. data/app/views/tr8n/admin/language/view.html.erb +106 -0
  137. data/app/views/tr8n/admin/translation/_tabs.html.erb +21 -0
  138. data/app/views/tr8n/admin/translation/index.html.erb +75 -0
  139. data/app/views/tr8n/admin/translation/view.html.erb +142 -0
  140. data/app/views/tr8n/admin/translation/votes.rhtml +81 -0
  141. data/app/views/tr8n/admin/translation_key/_tabs.html.erb +22 -0
  142. data/app/views/tr8n/admin/translation_key/comments.html.erb +49 -0
  143. data/app/views/tr8n/admin/translation_key/index.html.erb +79 -0
  144. data/app/views/tr8n/admin/translation_key/lb_merge.html.erb +43 -0
  145. data/app/views/tr8n/admin/translation_key/lb_update.html.erb +44 -0
  146. data/app/views/tr8n/admin/translation_key/locks.html.erb +51 -0
  147. data/app/views/tr8n/admin/translation_key/view.html.erb +192 -0
  148. data/app/views/tr8n/admin/translator/_list.html.erb +51 -0
  149. data/app/views/tr8n/admin/translator/_tabs.html.erb +26 -0
  150. data/app/views/tr8n/admin/translator/following.html.erb +20 -0
  151. data/app/views/tr8n/admin/translator/index.html.erb +77 -0
  152. data/app/views/tr8n/admin/translator/ip_locations.html.erb +9 -0
  153. data/app/views/tr8n/admin/translator/lb_register.html.erb +18 -0
  154. data/app/views/tr8n/admin/translator/log.html.erb +27 -0
  155. data/app/views/tr8n/admin/translator/metrics.html.erb +25 -0
  156. data/app/views/tr8n/admin/translator/reports.html.erb +22 -0
  157. data/app/views/tr8n/admin/translator/view.html.erb +228 -0
  158. data/app/views/tr8n/awards/_list.html.erb +46 -0
  159. data/app/views/tr8n/awards/index.html.erb +42 -0
  160. data/app/views/tr8n/common/_flashes.html.erb +39 -0
  161. data/app/views/tr8n/common/_footer.html.erb +1 -0
  162. data/app/views/tr8n/common/_header.html.erb +5 -0
  163. data/app/views/tr8n/common/_language_selector.html.erb +8 -0
  164. data/app/views/tr8n/common/_language_strip.html.erb +29 -0
  165. data/app/views/tr8n/common/_language_table.html.erb +13 -0
  166. data/app/views/tr8n/common/_paginator.html.erb +8 -0
  167. data/app/views/tr8n/common/_permutations.html.erb +37 -0
  168. data/app/views/tr8n/common/_scripts.html.erb +49 -0
  169. data/app/views/tr8n/common/_splash_screen.html.erb +9 -0
  170. data/app/views/tr8n/common/_splash_screen_legacy.html.erb +4 -0
  171. data/app/views/tr8n/common/_tabs.html.erb +39 -0
  172. data/app/views/tr8n/common/_translation_votes.html.erb +41 -0
  173. data/app/views/tr8n/common/_translator_login.html.erb +11 -0
  174. data/app/views/tr8n/dashboard/_forum.html.erb +25 -0
  175. data/app/views/tr8n/dashboard/_language_metric.html.erb +49 -0
  176. data/app/views/tr8n/dashboard/_statistics.html.erb +35 -0
  177. data/app/views/tr8n/dashboard/_translations.html.erb +24 -0
  178. data/app/views/tr8n/dashboard/_translator_metric.html.erb +68 -0
  179. data/app/views/tr8n/dashboard/_votes.html.erb +76 -0
  180. data/app/views/tr8n/dashboard/index.rhtml +115 -0
  181. data/app/views/tr8n/forum/_message.html.erb +17 -0
  182. data/app/views/tr8n/forum/_messages.html.erb +21 -0
  183. data/app/views/tr8n/forum/_new_message.html.erb +28 -0
  184. data/app/views/tr8n/forum/_new_topic.html.erb +49 -0
  185. data/app/views/tr8n/forum/index.html.erb +84 -0
  186. data/app/views/tr8n/forum/topic.html.erb +36 -0
  187. data/app/views/tr8n/glossary/index.html.erb +42 -0
  188. data/app/views/tr8n/help/_navigation.html.erb +127 -0
  189. data/app/views/tr8n/help/awards.html.erb +13 -0
  190. data/app/views/tr8n/help/basic_information.html.erb +13 -0
  191. data/app/views/tr8n/help/context_rules.html.erb +13 -0
  192. data/app/views/tr8n/help/creating_translations.html.erb +16 -0
  193. data/app/views/tr8n/help/dashboard.html.erb +13 -0
  194. data/app/views/tr8n/help/direction.html.erb +13 -0
  195. data/app/views/tr8n/help/discussions.html.erb +13 -0
  196. data/app/views/tr8n/help/enter_translation.html.erb +13 -0
  197. data/app/views/tr8n/help/fallback_language.html.erb +13 -0
  198. data/app/views/tr8n/help/generate_context_rules.html.erb +17 -0
  199. data/app/views/tr8n/help/index.html.erb +18 -0
  200. data/app/views/tr8n/help/inline_translations.html.erb +28 -0
  201. data/app/views/tr8n/help/language_dashboard.html.erb +21 -0
  202. data/app/views/tr8n/help/language_phrases.html.erb +17 -0
  203. data/app/views/tr8n/help/language_selector.html.erb +13 -0
  204. data/app/views/tr8n/help/language_statistics.html.erb +13 -0
  205. data/app/views/tr8n/help/lb_credits.html.erb +9 -0
  206. data/app/views/tr8n/help/lb_shortcuts.html.erb +26 -0
  207. data/app/views/tr8n/help/manage.html.erb +13 -0
  208. data/app/views/tr8n/help/manage_language.html.erb +13 -0
  209. data/app/views/tr8n/help/native_name.html.erb +13 -0
  210. data/app/views/tr8n/help/original_phrase.html.erb +13 -0
  211. data/app/views/tr8n/help/other_languages.html.erb +15 -0
  212. data/app/views/tr8n/help/other_translatable_resources.html.erb +13 -0
  213. data/app/views/tr8n/help/phrases.html.erb +19 -0
  214. data/app/views/tr8n/help/phrases_with_translations.html.erb +21 -0
  215. data/app/views/tr8n/help/phrases_without_translations.html.erb +15 -0
  216. data/app/views/tr8n/help/prohibited_words.html.erb +13 -0
  217. data/app/views/tr8n/help/rank.html.erb +13 -0
  218. data/app/views/tr8n/help/recent_discussions.html.erb +13 -0
  219. data/app/views/tr8n/help/recent_translation_votes.html.erb +13 -0
  220. data/app/views/tr8n/help/recent_translations.html.erb +13 -0
  221. data/app/views/tr8n/help/site_map.html.erb +17 -0
  222. data/app/views/tr8n/help/site_sections.html.erb +13 -0
  223. data/app/views/tr8n/help/suggested_translation.html.erb +13 -0
  224. data/app/views/tr8n/help/translating_inline.html.erb +30 -0
  225. data/app/views/tr8n/help/translation_context_rules.html.erb +16 -0
  226. data/app/views/tr8n/help/translation_rank.html.erb +17 -0
  227. data/app/views/tr8n/help/translation_tokens.html.erb +13 -0
  228. data/app/views/tr8n/help/translation_tools.html.erb +13 -0
  229. data/app/views/tr8n/help/translations.html.erb +13 -0
  230. data/app/views/tr8n/help/user_rank.html.erb +13 -0
  231. data/app/views/tr8n/help/using_translation_tools.html.erb +13 -0
  232. data/app/views/tr8n/help/voting_on_translations.html.erb +13 -0
  233. data/app/views/tr8n/help/your_dashboard.html.erb +17 -0
  234. data/app/views/tr8n/help/your_languages.html.erb +19 -0
  235. data/app/views/tr8n/help/your_translations.html.erb +17 -0
  236. data/app/views/tr8n/home/credits.html.erb +102 -0
  237. data/app/views/tr8n/home/docs.html.erb +3 -0
  238. data/app/views/tr8n/home/index.html.erb +37 -0
  239. data/app/views/tr8n/home/integration.html.erb +564 -0
  240. data/app/views/tr8n/home/languages.html.erb +7 -0
  241. data/app/views/tr8n/home/license.html.erb +586 -0
  242. data/app/views/tr8n/home/rules.html.erb +668 -0
  243. data/app/views/tr8n/home/tokens.html.erb +324 -0
  244. data/app/views/tr8n/language/_basic_info.html.erb +53 -0
  245. data/app/views/tr8n/language/_edit_language_case_rules.html.erb +51 -0
  246. data/app/views/tr8n/language/_edit_language_cases.html.erb +68 -0
  247. data/app/views/tr8n/language/_edit_rules.html.erb +46 -0
  248. data/app/views/tr8n/language/_grammar.html.erb +84 -0
  249. data/app/views/tr8n/language/_header.html.erb +14 -0
  250. data/app/views/tr8n/language/_language_cases.html.erb +196 -0
  251. data/app/views/tr8n/language/_lists.html.erb +56 -0
  252. data/app/views/tr8n/language/_prohibited_words.html.erb +16 -0
  253. data/app/views/tr8n/language/_translator_dependencies.html.erb +27 -0
  254. data/app/views/tr8n/language/_translator_header.html.erb +19 -0
  255. data/app/views/tr8n/language/_translator_submit.html.erb +141 -0
  256. data/app/views/tr8n/language/_translator_votes.html.erb +27 -0
  257. data/app/views/tr8n/language/index.html.erb +54 -0
  258. data/app/views/tr8n/language/lb_language_case_rule.html.erb +94 -0
  259. data/app/views/tr8n/language/rules/_date_rule.html.erb +3 -0
  260. data/app/views/tr8n/language/rules/_gender_list_rule.html.erb +23 -0
  261. data/app/views/tr8n/language/rules/_gender_rule.html.erb +3 -0
  262. data/app/views/tr8n/language/rules/_list_rule.html.erb +3 -0
  263. data/app/views/tr8n/language/rules/_number_rule.html.erb +24 -0
  264. data/app/views/tr8n/language/rules/_value_rule.html.erb +3 -0
  265. data/app/views/tr8n/language/select.html.erb +72 -0
  266. data/app/views/tr8n/language/table.html.erb +32 -0
  267. data/app/views/tr8n/language/translator.html.erb +18 -0
  268. data/app/views/tr8n/language_cases/_gender_based.html.erb +32 -0
  269. data/app/views/tr8n/language_cases/_gender_neutral.html.erb +25 -0
  270. data/app/views/tr8n/language_cases/_manager_header.html.erb +18 -0
  271. data/app/views/tr8n/language_cases/index.html.erb +54 -0
  272. data/app/views/tr8n/language_cases/manager.html.erb +60 -0
  273. data/app/views/tr8n/login/index.html.erb +33 -0
  274. data/app/views/tr8n/login/register.html.erb +57 -0
  275. data/app/views/tr8n/phrases/_breadcrumb.html.erb +11 -0
  276. data/app/views/tr8n/phrases/_comment.html.erb +17 -0
  277. data/app/views/tr8n/phrases/_comments_module.html.erb +37 -0
  278. data/app/views/tr8n/phrases/_dictionary.rhtml +29 -0
  279. data/app/views/tr8n/phrases/_header.html.erb +24 -0
  280. data/app/views/tr8n/phrases/_new_comment.html.erb +31 -0
  281. data/app/views/tr8n/phrases/_permutations_module.html.erb +30 -0
  282. data/app/views/tr8n/phrases/_tokens.html.erb +122 -0
  283. data/app/views/tr8n/phrases/_toolbar.html.erb +33 -0
  284. data/app/views/tr8n/phrases/_translation_module.html.erb +127 -0
  285. data/app/views/tr8n/phrases/_translations_module.html.erb +70 -0
  286. data/app/views/tr8n/phrases/index.html.erb +90 -0
  287. data/app/views/tr8n/phrases/lb_sources.html.erb +51 -0
  288. data/app/views/tr8n/phrases/map.html.erb +42 -0
  289. data/app/views/tr8n/phrases/view.html.erb +77 -0
  290. data/app/views/tr8n/translations/_list.html.erb +71 -0
  291. data/app/views/tr8n/translations/_original_phrase.html.erb +11 -0
  292. data/app/views/tr8n/translations/_translation.html.erb +80 -0
  293. data/app/views/tr8n/translations/index.html.erb +30 -0
  294. data/app/views/tr8n/translator/_basic_info.html.erb +95 -0
  295. data/app/views/tr8n/translator/_header.html.erb +12 -0
  296. data/app/views/tr8n/translator/_header_key_report.html.erb +12 -0
  297. data/app/views/tr8n/translator/index.html.erb +25 -0
  298. data/app/views/tr8n/translator/lb_report.html.erb +113 -0
  299. data/config.ru +4 -0
  300. data/config/application.rb +65 -0
  301. data/config/boot.rb +6 -0
  302. data/config/database.yml +13 -0
  303. data/config/environment.rb +46 -0
  304. data/config/environments/development.rb +25 -0
  305. data/config/environments/test.rb +35 -0
  306. data/config/routes.rb +47 -0
  307. data/config/tr8n/config.yml +247 -0
  308. data/config/tr8n/data/ip_locations.csv +93460 -0
  309. data/config/tr8n/rules/default_cases.yml +141 -0
  310. data/config/tr8n/rules/default_date_rules.yml +20 -0
  311. data/config/tr8n/rules/default_gender_list_rules.yml +82 -0
  312. data/config/tr8n/rules/default_gender_rules.yml +20 -0
  313. data/config/tr8n/rules/default_list_rules.yml +19 -0
  314. data/config/tr8n/rules/default_numeric_rules.yml +42 -0
  315. data/config/tr8n/rules/default_value_rules.yml +18 -0
  316. data/config/tr8n/site/default_glossary.yml +18 -0
  317. data/config/tr8n/site/default_languages.yml +1591 -0
  318. data/config/tr8n/site/features.yml +111 -0
  319. data/config/tr8n/site/shortcuts.yml +55 -0
  320. data/config/tr8n/site/sitemap.json +42 -0
  321. data/config/tr8n/tokens/data.yml +19 -0
  322. data/config/tr8n/tokens/decorations.yml +16 -0
  323. data/config/will_filter/config.yml +97 -0
  324. data/db/extras/20100511185330_create_test_users.rb +43 -0
  325. data/db/migrate/20090730070119_create_will_filter_tables.rb +19 -0
  326. data/db/migrate/20100405201417_create_tr8n_tables.rb +350 -0
  327. data/db/seeds.rb +7 -0
  328. data/doc/README_FOR_APP +2 -0
  329. data/doc/cheat sheet.docx +0 -0
  330. data/doc/cheat sheet.pdf +0 -0
  331. data/doc/classes.graffle +12555 -0
  332. data/doc/classes.pdf +0 -0
  333. data/doc/client sdk sequence.graffle +2768 -0
  334. data/doc/integration.doc +0 -0
  335. data/doc/integration.docx +0 -0
  336. data/doc/pixel client sdk.graffle +1454 -0
  337. data/lib/application_controller.rb +38 -0
  338. data/lib/application_helper.rb +336 -0
  339. data/lib/core_ext/array.rb +61 -0
  340. data/lib/core_ext/date.rb +76 -0
  341. data/lib/core_ext/fixnum.rb +35 -0
  342. data/lib/core_ext/hash.rb +60 -0
  343. data/lib/core_ext/string.rb +49 -0
  344. data/lib/core_ext/time.rb +83 -0
  345. data/lib/generators/tr8n/templates/create_tr8n_tables.rb +350 -0
  346. data/lib/generators/tr8n/tr8n_generator.rb +49 -0
  347. data/lib/tasks/.gitkeep +0 -0
  348. data/lib/tasks/tr8n_tasks.rake +99 -0
  349. data/lib/tr8n.rb +3 -0
  350. data/lib/tr8n/active_dumper.rb +49 -0
  351. data/lib/tr8n/cache.rb +57 -0
  352. data/lib/tr8n/common_methods.rb +61 -0
  353. data/lib/tr8n/config.rb +719 -0
  354. data/lib/tr8n/controller_methods.rb +112 -0
  355. data/lib/tr8n/dictionary.rb +53 -0
  356. data/lib/tr8n/engine.rb +29 -0
  357. data/lib/tr8n/exception.rb +26 -0
  358. data/lib/tr8n/extender.rb +34 -0
  359. data/lib/tr8n/helper_methods.rb +304 -0
  360. data/lib/tr8n/ip_address.rb +52 -0
  361. data/lib/tr8n/key_registration_exception.rb +26 -0
  362. data/lib/tr8n/keyboard_mapping.rb +174 -0
  363. data/lib/tr8n/logger.rb +60 -0
  364. data/lib/tr8n/site_map.rb +85 -0
  365. data/lib/tr8n/site_map_section.rb +108 -0
  366. data/lib/tr8n/token.rb +438 -0
  367. data/lib/tr8n/token_exception.rb +26 -0
  368. data/lib/tr8n/tokenized_label.rb +141 -0
  369. data/lib/tr8n/tokens/data_token.rb +52 -0
  370. data/lib/tr8n/tokens/decoration_token.rb +124 -0
  371. data/lib/tr8n/tokens/hidden_token.rb +87 -0
  372. data/lib/tr8n/tokens/method_token.rb +60 -0
  373. data/lib/tr8n/tokens/transform_token.rb +131 -0
  374. data/public/404.html +26 -0
  375. data/public/422.html +26 -0
  376. data/public/500.html +26 -0
  377. data/public/favicon.ico +0 -0
  378. data/public/robots.txt +5 -0
  379. data/public/tr8n/images/accept.png +0 -0
  380. data/public/tr8n/images/action_tab_bkgd.gif +0 -0
  381. data/public/tr8n/images/action_tab_white_bkgd.gif +0 -0
  382. data/public/tr8n/images/add.png +0 -0
  383. data/public/tr8n/images/arrow_down.gif +0 -0
  384. data/public/tr8n/images/arrow_down.png +0 -0
  385. data/public/tr8n/images/arrow_down_grey.png +0 -0
  386. data/public/tr8n/images/arrow_right.gif +0 -0
  387. data/public/tr8n/images/arrow_up.png +0 -0
  388. data/public/tr8n/images/arrow_up_grey.png +0 -0
  389. data/public/tr8n/images/bullet_go.png +0 -0
  390. data/public/tr8n/images/buttons.png +0 -0
  391. data/public/tr8n/images/cancel.png +0 -0
  392. data/public/tr8n/images/close.gif +0 -0
  393. data/public/tr8n/images/cross.png +0 -0
  394. data/public/tr8n/images/delete.png +0 -0
  395. data/public/tr8n/images/disk.png +0 -0
  396. data/public/tr8n/images/examples/context_rules_1.png +0 -0
  397. data/public/tr8n/images/examples/context_rules_2.png +0 -0
  398. data/public/tr8n/images/examples/date_rules_1.png +0 -0
  399. data/public/tr8n/images/examples/date_rules_2.png +0 -0
  400. data/public/tr8n/images/examples/date_rules_3.png +0 -0
  401. data/public/tr8n/images/examples/gender_rules_1.png +0 -0
  402. data/public/tr8n/images/examples/gender_rules_2.png +0 -0
  403. data/public/tr8n/images/examples/gender_rules_3.png +0 -0
  404. data/public/tr8n/images/examples/language_manager_1.png +0 -0
  405. data/public/tr8n/images/examples/list_rules_1.png +0 -0
  406. data/public/tr8n/images/examples/list_rules_2.png +0 -0
  407. data/public/tr8n/images/examples/list_rules_3.png +0 -0
  408. data/public/tr8n/images/examples/numeric_rules_1.png +0 -0
  409. data/public/tr8n/images/examples/numeric_rules_2.png +0 -0
  410. data/public/tr8n/images/examples/numeric_rules_3.png +0 -0
  411. data/public/tr8n/images/examples/numeric_rules_4.png +0 -0
  412. data/public/tr8n/images/exclamation.png +0 -0
  413. data/public/tr8n/images/eye.png +0 -0
  414. data/public/tr8n/images/eye_not.png +0 -0
  415. data/public/tr8n/images/facebook/connect_light_medium_long.gif +0 -0
  416. data/public/tr8n/images/field_sprite.gif +0 -0
  417. data/public/tr8n/images/find.png +0 -0
  418. data/public/tr8n/images/flags/.DS_Store +0 -0
  419. data/public/tr8n/images/flags/ab.png +0 -0
  420. data/public/tr8n/images/flags/ach.png +0 -0
  421. data/public/tr8n/images/flags/af.png +0 -0
  422. data/public/tr8n/images/flags/ak.png +0 -0
  423. data/public/tr8n/images/flags/am.png +0 -0
  424. data/public/tr8n/images/flags/an.png +0 -0
  425. data/public/tr8n/images/flags/ar-AE.png +0 -0
  426. data/public/tr8n/images/flags/ar-BH.png +0 -0
  427. data/public/tr8n/images/flags/ar-DZ.png +0 -0
  428. data/public/tr8n/images/flags/ar-EG.png +0 -0
  429. data/public/tr8n/images/flags/ar-IQ.png +0 -0
  430. data/public/tr8n/images/flags/ar-JO.png +0 -0
  431. data/public/tr8n/images/flags/ar-KW.png +0 -0
  432. data/public/tr8n/images/flags/ar-LB.png +0 -0
  433. data/public/tr8n/images/flags/ar-LY.png +0 -0
  434. data/public/tr8n/images/flags/ar-MA.png +0 -0
  435. data/public/tr8n/images/flags/ar-OM.png +0 -0
  436. data/public/tr8n/images/flags/ar-QA.png +0 -0
  437. data/public/tr8n/images/flags/ar-SA.png +0 -0
  438. data/public/tr8n/images/flags/ar-SY.png +0 -0
  439. data/public/tr8n/images/flags/ar-TN.png +0 -0
  440. data/public/tr8n/images/flags/ar-YE.png +0 -0
  441. data/public/tr8n/images/flags/ar.png +0 -0
  442. data/public/tr8n/images/flags/as.png +0 -0
  443. data/public/tr8n/images/flags/ast.png +0 -0
  444. data/public/tr8n/images/flags/ay.png +0 -0
  445. data/public/tr8n/images/flags/az.png +0 -0
  446. data/public/tr8n/images/flags/ba.png +0 -0
  447. data/public/tr8n/images/flags/be.png +0 -0
  448. data/public/tr8n/images/flags/bg.png +0 -0
  449. data/public/tr8n/images/flags/bh.png +0 -0
  450. data/public/tr8n/images/flags/bn.png +0 -0
  451. data/public/tr8n/images/flags/bo.png +0 -0
  452. data/public/tr8n/images/flags/br.png +0 -0
  453. data/public/tr8n/images/flags/bs.png +0 -0
  454. data/public/tr8n/images/flags/ca.png +0 -0
  455. data/public/tr8n/images/flags/cb.png +0 -0
  456. data/public/tr8n/images/flags/ce.png +0 -0
  457. data/public/tr8n/images/flags/ch.png +0 -0
  458. data/public/tr8n/images/flags/ck-US.png +0 -0
  459. data/public/tr8n/images/flags/co.png +0 -0
  460. data/public/tr8n/images/flags/cr.png +0 -0
  461. data/public/tr8n/images/flags/cs.png +0 -0
  462. data/public/tr8n/images/flags/cv.png +0 -0
  463. data/public/tr8n/images/flags/cy.png +0 -0
  464. data/public/tr8n/images/flags/da.png +0 -0
  465. data/public/tr8n/images/flags/de-AT.png +0 -0
  466. data/public/tr8n/images/flags/de-CH.png +0 -0
  467. data/public/tr8n/images/flags/de-DE.png +0 -0
  468. data/public/tr8n/images/flags/de-LI.png +0 -0
  469. data/public/tr8n/images/flags/de-LU.png +0 -0
  470. data/public/tr8n/images/flags/de.png +0 -0
  471. data/public/tr8n/images/flags/el.png +0 -0
  472. data/public/tr8n/images/flags/en-AU.png +0 -0
  473. data/public/tr8n/images/flags/en-BZ.png +0 -0
  474. data/public/tr8n/images/flags/en-CA.png +0 -0
  475. data/public/tr8n/images/flags/en-IE.png +0 -0
  476. data/public/tr8n/images/flags/en-JM.png +0 -0
  477. data/public/tr8n/images/flags/en-NZ.png +0 -0
  478. data/public/tr8n/images/flags/en-PH.png +0 -0
  479. data/public/tr8n/images/flags/en-PI.png +0 -0
  480. data/public/tr8n/images/flags/en-SC.png +0 -0
  481. data/public/tr8n/images/flags/en-UK.png +0 -0
  482. data/public/tr8n/images/flags/en-US.png +0 -0
  483. data/public/tr8n/images/flags/en-ZA.png +0 -0
  484. data/public/tr8n/images/flags/en-ZW.png +0 -0
  485. data/public/tr8n/images/flags/en.png +0 -0
  486. data/public/tr8n/images/flags/eo.png +0 -0
  487. data/public/tr8n/images/flags/es-AR.png +0 -0
  488. data/public/tr8n/images/flags/es-BO.png +0 -0
  489. data/public/tr8n/images/flags/es-CL.png +0 -0
  490. data/public/tr8n/images/flags/es-CO.png +0 -0
  491. data/public/tr8n/images/flags/es-CR.png +0 -0
  492. data/public/tr8n/images/flags/es-DO.png +0 -0
  493. data/public/tr8n/images/flags/es-EC.png +0 -0
  494. data/public/tr8n/images/flags/es-ES.png +0 -0
  495. data/public/tr8n/images/flags/es-GT.png +0 -0
  496. data/public/tr8n/images/flags/es-HN.png +0 -0
  497. data/public/tr8n/images/flags/es-MX.png +0 -0
  498. data/public/tr8n/images/flags/es-NI.png +0 -0
  499. data/public/tr8n/images/flags/es-PA.png +0 -0
  500. data/public/tr8n/images/flags/es-PE.png +0 -0
  501. data/public/tr8n/images/flags/es-PR.png +0 -0
  502. data/public/tr8n/images/flags/es-PY.png +0 -0
  503. data/public/tr8n/images/flags/es-SV.png +0 -0
  504. data/public/tr8n/images/flags/es-UY.png +0 -0
  505. data/public/tr8n/images/flags/es-VE.png +0 -0
  506. data/public/tr8n/images/flags/es.png +0 -0
  507. data/public/tr8n/images/flags/et.png +0 -0
  508. data/public/tr8n/images/flags/eu.png +0 -0
  509. data/public/tr8n/images/flags/fa-IR.png +0 -0
  510. data/public/tr8n/images/flags/fa.png +0 -0
  511. data/public/tr8n/images/flags/fb-LT.png +0 -0
  512. data/public/tr8n/images/flags/fi.png +0 -0
  513. data/public/tr8n/images/flags/fj.png +0 -0
  514. data/public/tr8n/images/flags/fo.png +0 -0
  515. data/public/tr8n/images/flags/fr-BE.png +0 -0
  516. data/public/tr8n/images/flags/fr-CA.png +0 -0
  517. data/public/tr8n/images/flags/fr-CH.png +0 -0
  518. data/public/tr8n/images/flags/fr-FR.png +0 -0
  519. data/public/tr8n/images/flags/fr-LU.png +0 -0
  520. data/public/tr8n/images/flags/fr-MC.png +0 -0
  521. data/public/tr8n/images/flags/fr.png +0 -0
  522. data/public/tr8n/images/flags/fur.png +0 -0
  523. data/public/tr8n/images/flags/fy.png +0 -0
  524. data/public/tr8n/images/flags/ga.png +0 -0
  525. data/public/tr8n/images/flags/gd.png +0 -0
  526. data/public/tr8n/images/flags/gl.png +0 -0
  527. data/public/tr8n/images/flags/gn.png +0 -0
  528. data/public/tr8n/images/flags/gu.png +0 -0
  529. data/public/tr8n/images/flags/gv.png +0 -0
  530. data/public/tr8n/images/flags/ha.png +0 -0
  531. data/public/tr8n/images/flags/haw.png +0 -0
  532. data/public/tr8n/images/flags/he.png +0 -0
  533. data/public/tr8n/images/flags/hi.png +0 -0
  534. data/public/tr8n/images/flags/hr.png +0 -0
  535. data/public/tr8n/images/flags/hsb.png +0 -0
  536. data/public/tr8n/images/flags/ht.png +0 -0
  537. data/public/tr8n/images/flags/hu.png +0 -0
  538. data/public/tr8n/images/flags/hy.png +0 -0
  539. data/public/tr8n/images/flags/ia.png +0 -0
  540. data/public/tr8n/images/flags/id.png +0 -0
  541. data/public/tr8n/images/flags/ie.png +0 -0
  542. data/public/tr8n/images/flags/ig.png +0 -0
  543. data/public/tr8n/images/flags/is.png +0 -0
  544. data/public/tr8n/images/flags/it-CH.png +0 -0
  545. data/public/tr8n/images/flags/it.png +0 -0
  546. data/public/tr8n/images/flags/iu.png +0 -0
  547. data/public/tr8n/images/flags/ja.png +0 -0
  548. data/public/tr8n/images/flags/jw.png +0 -0
  549. data/public/tr8n/images/flags/ka.png +0 -0
  550. data/public/tr8n/images/flags/kk.png +0 -0
  551. data/public/tr8n/images/flags/kl.png +0 -0
  552. data/public/tr8n/images/flags/km.png +0 -0
  553. data/public/tr8n/images/flags/kn.png +0 -0
  554. data/public/tr8n/images/flags/ko-KP.png +0 -0
  555. data/public/tr8n/images/flags/ko-KR.png +0 -0
  556. data/public/tr8n/images/flags/ko.png +0 -0
  557. data/public/tr8n/images/flags/kok.png +0 -0
  558. data/public/tr8n/images/flags/ks.png +0 -0
  559. data/public/tr8n/images/flags/ku.png +0 -0
  560. data/public/tr8n/images/flags/ky.png +0 -0
  561. data/public/tr8n/images/flags/la.png +0 -0
  562. data/public/tr8n/images/flags/lb.png +0 -0
  563. data/public/tr8n/images/flags/lg.png +0 -0
  564. data/public/tr8n/images/flags/li-NL.png +0 -0
  565. data/public/tr8n/images/flags/ln.png +0 -0
  566. data/public/tr8n/images/flags/lo.png +0 -0
  567. data/public/tr8n/images/flags/lt.png +0 -0
  568. data/public/tr8n/images/flags/lv.png +0 -0
  569. data/public/tr8n/images/flags/md.png +0 -0
  570. data/public/tr8n/images/flags/mfe.png +0 -0
  571. data/public/tr8n/images/flags/mg.png +0 -0
  572. data/public/tr8n/images/flags/mh.png +0 -0
  573. data/public/tr8n/images/flags/mi.png +0 -0
  574. data/public/tr8n/images/flags/mk.png +0 -0
  575. data/public/tr8n/images/flags/ml.png +0 -0
  576. data/public/tr8n/images/flags/mn.png +0 -0
  577. data/public/tr8n/images/flags/mo.png +0 -0
  578. data/public/tr8n/images/flags/mr.png +0 -0
  579. data/public/tr8n/images/flags/ms.png +0 -0
  580. data/public/tr8n/images/flags/mt.png +0 -0
  581. data/public/tr8n/images/flags/my.png +0 -0
  582. data/public/tr8n/images/flags/na.png +0 -0
  583. data/public/tr8n/images/flags/nb.png +0 -0
  584. data/public/tr8n/images/flags/nd.png +0 -0
  585. data/public/tr8n/images/flags/ne.png +0 -0
  586. data/public/tr8n/images/flags/ng.png +0 -0
  587. data/public/tr8n/images/flags/nl-NE.png +0 -0
  588. data/public/tr8n/images/flags/nl.png +0 -0
  589. data/public/tr8n/images/flags/nn.png +0 -0
  590. data/public/tr8n/images/flags/no.png +0 -0
  591. data/public/tr8n/images/flags/nr.png +0 -0
  592. data/public/tr8n/images/flags/nso.png +0 -0
  593. data/public/tr8n/images/flags/nv.png +0 -0
  594. data/public/tr8n/images/flags/ny.png +0 -0
  595. data/public/tr8n/images/flags/nyn.png +0 -0
  596. data/public/tr8n/images/flags/oc.png +0 -0
  597. data/public/tr8n/images/flags/om.png +0 -0
  598. data/public/tr8n/images/flags/or.png +0 -0
  599. data/public/tr8n/images/flags/pa-IN.png +0 -0
  600. data/public/tr8n/images/flags/pa-PK.png +0 -0
  601. data/public/tr8n/images/flags/pa.png +0 -0
  602. data/public/tr8n/images/flags/pf.png +0 -0
  603. data/public/tr8n/images/flags/pl.png +0 -0
  604. data/public/tr8n/images/flags/pp.png +0 -0
  605. data/public/tr8n/images/flags/ps.png +0 -0
  606. data/public/tr8n/images/flags/pt-BZ.png +0 -0
  607. data/public/tr8n/images/flags/pt.png +0 -0
  608. data/public/tr8n/images/flags/qu-PE.png +0 -0
  609. data/public/tr8n/images/flags/qu.png +0 -0
  610. data/public/tr8n/images/flags/rj.png +0 -0
  611. data/public/tr8n/images/flags/rm.png +0 -0
  612. data/public/tr8n/images/flags/rn.png +0 -0
  613. data/public/tr8n/images/flags/ro-MD.png +0 -0
  614. data/public/tr8n/images/flags/ro-RO.png +0 -0
  615. data/public/tr8n/images/flags/ro.png +0 -0
  616. data/public/tr8n/images/flags/ru.png +0 -0
  617. data/public/tr8n/images/flags/rw.png +0 -0
  618. data/public/tr8n/images/flags/sa.png +0 -0
  619. data/public/tr8n/images/flags/sc.png +0 -0
  620. data/public/tr8n/images/flags/sd.png +0 -0
  621. data/public/tr8n/images/flags/se-NO.png +0 -0
  622. data/public/tr8n/images/flags/sg.png +0 -0
  623. data/public/tr8n/images/flags/sh.png +0 -0
  624. data/public/tr8n/images/flags/si.png +0 -0
  625. data/public/tr8n/images/flags/sk.png +0 -0
  626. data/public/tr8n/images/flags/sl.png +0 -0
  627. data/public/tr8n/images/flags/sm.png +0 -0
  628. data/public/tr8n/images/flags/sn.png +0 -0
  629. data/public/tr8n/images/flags/so.png +0 -0
  630. data/public/tr8n/images/flags/sq.png +0 -0
  631. data/public/tr8n/images/flags/sr-me.png +0 -0
  632. data/public/tr8n/images/flags/sr.png +0 -0
  633. data/public/tr8n/images/flags/ss.png +0 -0
  634. data/public/tr8n/images/flags/st.png +0 -0
  635. data/public/tr8n/images/flags/su.png +0 -0
  636. data/public/tr8n/images/flags/sv-FI.png +0 -0
  637. data/public/tr8n/images/flags/sv-SE.png +0 -0
  638. data/public/tr8n/images/flags/sv.png +0 -0
  639. data/public/tr8n/images/flags/sw.png +0 -0
  640. data/public/tr8n/images/flags/ta.png +0 -0
  641. data/public/tr8n/images/flags/te.png +0 -0
  642. data/public/tr8n/images/flags/tg.png +0 -0
  643. data/public/tr8n/images/flags/th.png +0 -0
  644. data/public/tr8n/images/flags/ti.png +0 -0
  645. data/public/tr8n/images/flags/tig.png +0 -0
  646. data/public/tr8n/images/flags/tk.png +0 -0
  647. data/public/tr8n/images/flags/tl.png +0 -0
  648. data/public/tr8n/images/flags/tlh.png +0 -0
  649. data/public/tr8n/images/flags/tn.png +0 -0
  650. data/public/tr8n/images/flags/to.png +0 -0
  651. data/public/tr8n/images/flags/tr.png +0 -0
  652. data/public/tr8n/images/flags/ts.png +0 -0
  653. data/public/tr8n/images/flags/tt.png +0 -0
  654. data/public/tr8n/images/flags/tw.png +0 -0
  655. data/public/tr8n/images/flags/ug.png +0 -0
  656. data/public/tr8n/images/flags/uk.png +0 -0
  657. data/public/tr8n/images/flags/ur.png +0 -0
  658. data/public/tr8n/images/flags/uz.png +0 -0
  659. data/public/tr8n/images/flags/ve.png +0 -0
  660. data/public/tr8n/images/flags/vi.png +0 -0
  661. data/public/tr8n/images/flags/vo.png +0 -0
  662. data/public/tr8n/images/flags/wa.png +0 -0
  663. data/public/tr8n/images/flags/wo.png +0 -0
  664. data/public/tr8n/images/flags/xh.png +0 -0
  665. data/public/tr8n/images/flags/yi.png +0 -0
  666. data/public/tr8n/images/flags/yo.png +0 -0
  667. data/public/tr8n/images/flags/zh-CN.png +0 -0
  668. data/public/tr8n/images/flags/zh-HK.png +0 -0
  669. data/public/tr8n/images/flags/zh-SG.png +0 -0
  670. data/public/tr8n/images/flags/zh-TW.png +0 -0
  671. data/public/tr8n/images/flags/zh.png +0 -0
  672. data/public/tr8n/images/flags/zu.png +0 -0
  673. data/public/tr8n/images/globe.gif +0 -0
  674. data/public/tr8n/images/help.png +0 -0
  675. data/public/tr8n/images/help/color_coding.png +0 -0
  676. data/public/tr8n/images/help/language_selector.png +0 -0
  677. data/public/tr8n/images/help/language_selector_default.png +0 -0
  678. data/public/tr8n/images/help/languages_disabled.png +0 -0
  679. data/public/tr8n/images/help/translator.png +0 -0
  680. data/public/tr8n/images/help2.png +0 -0
  681. data/public/tr8n/images/information.png +0 -0
  682. data/public/tr8n/images/keyboard.png +0 -0
  683. data/public/tr8n/images/language_selector_arrow.gif +0 -0
  684. data/public/tr8n/images/left_quote.png +0 -0
  685. data/public/tr8n/images/lightning.png +0 -0
  686. data/public/tr8n/images/loading.gif +0 -0
  687. data/public/tr8n/images/loading2.gif +0 -0
  688. data/public/tr8n/images/loading3.gif +0 -0
  689. data/public/tr8n/images/loading_large.gif +0 -0
  690. data/public/tr8n/images/lock.png +0 -0
  691. data/public/tr8n/images/lock_add.png +0 -0
  692. data/public/tr8n/images/lock_delete.png +0 -0
  693. data/public/tr8n/images/lock_open.png +0 -0
  694. data/public/tr8n/images/medals/bronze.png +0 -0
  695. data/public/tr8n/images/medals/gold.png +0 -0
  696. data/public/tr8n/images/medals/runner.png +0 -0
  697. data/public/tr8n/images/medals/silver.png +0 -0
  698. data/public/tr8n/images/pencil.png +0 -0
  699. data/public/tr8n/images/photo_silhouette.gif +0 -0
  700. data/public/tr8n/images/plus.png +0 -0
  701. data/public/tr8n/images/random.png +0 -0
  702. data/public/tr8n/images/random2.png +0 -0
  703. data/public/tr8n/images/rating_star0.png +0 -0
  704. data/public/tr8n/images/rating_star05.png +0 -0
  705. data/public/tr8n/images/rating_star1.png +0 -0
  706. data/public/tr8n/images/rating_stars.gif +0 -0
  707. data/public/tr8n/images/rating_stars.psd +0 -0
  708. data/public/tr8n/images/reply.png +0 -0
  709. data/public/tr8n/images/right_quote.png +0 -0
  710. data/public/tr8n/images/rotating_world.gif +0 -0
  711. data/public/tr8n/images/script.png +0 -0
  712. data/public/tr8n/images/script_edit.png +0 -0
  713. data/public/tr8n/images/script_gear.png +0 -0
  714. data/public/tr8n/images/site_sprite.gif +0 -0
  715. data/public/tr8n/images/spinner.gif +0 -0
  716. data/public/tr8n/images/star.png +0 -0
  717. data/public/tr8n/images/table_edit.png +0 -0
  718. data/public/tr8n/images/table_gear.png +0 -0
  719. data/public/tr8n/images/table_multiple.png +0 -0
  720. data/public/tr8n/images/thumb_down.png +0 -0
  721. data/public/tr8n/images/thumb_up.png +0 -0
  722. data/public/tr8n/images/toolbar_bg.gif +0 -0
  723. data/public/tr8n/images/top_left_stem.png +0 -0
  724. data/public/tr8n/images/top_right_stem.png +0 -0
  725. data/public/tr8n/images/tr8n_loading.gif +0 -0
  726. data/public/tr8n/images/tr8n_logo.jpg +0 -0
  727. data/public/tr8n/images/tr8n_logo.png +0 -0
  728. data/public/tr8n/images/tr8n_logo2.gif +0 -0
  729. data/public/tr8n/images/tr8n_logo2.png +0 -0
  730. data/public/tr8n/images/tr8n_logo_wiki.png +0 -0
  731. data/public/tr8n/images/tr8n_logo_wiki2.png +0 -0
  732. data/public/tr8n/images/translate_icn.gif +0 -0
  733. data/public/tr8n/images/wizard.png +0 -0
  734. data/public/tr8n/javascripts/jsDraw2D.js +24 -0
  735. data/public/tr8n/javascripts/keyboard_1_36.js +1214 -0
  736. data/public/tr8n/javascripts/keyboard_1_44.js +1735 -0
  737. data/public/tr8n/javascripts/shortcut.js +223 -0
  738. data/public/tr8n/javascripts/tr8n.js +904 -0
  739. data/public/tr8n/javascripts/tr8n_client_sdk.js +1182 -0
  740. data/public/tr8n/javascripts/tr8n_prototype_effects.js +65 -0
  741. data/public/tr8n/stylesheets/components.css +208 -0
  742. data/public/tr8n/stylesheets/keyboard_1_36.css +185 -0
  743. data/public/tr8n/stylesheets/keyboard_1_44.css +268 -0
  744. data/public/tr8n/stylesheets/layout.css +119 -0
  745. data/public/tr8n/stylesheets/tr8n.css +201 -0
  746. data/rails/init.rb +53 -0
  747. data/script/rails +6 -0
  748. data/test/performance/browsing_test.rb +9 -0
  749. data/test/test_helper.rb +13 -0
  750. data/tr8n.gemspec +40 -0
  751. metadata +865 -0
@@ -0,0 +1,1182 @@
1
+ /****************************************************************************
2
+ Copyright (c) 2010 Michael Berkovich, Geni Inc
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining
5
+ a copy of this software and associated documentation files (the
6
+ "Software"), to deal in the Software without restriction, including
7
+ without limitation the rights to use, copy, modify, merge, publish,
8
+ distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so, subject to
10
+ the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ ****************************************************************************/
23
+
24
+ /****************************************************************************
25
+ ****
26
+ **** This JavaScript Client SDK supports English as the native site language.
27
+ **** If your site native language is other than English, please read
28
+ **** the integration guide for details on how to make the SDK work with
29
+ **** your native language.
30
+ ****
31
+ ****************************************************************************/
32
+
33
+ var Tr8n = Tr8n || {
34
+ element:function(element_id) {
35
+ if (typeof element_id == 'string') return document.getElementById(element_id);
36
+ return element_id;
37
+ },
38
+ value:function(element_id) {
39
+ return Tr8n.element(element_id).value;
40
+ }
41
+ };
42
+
43
+ /****************************************************************************
44
+ **** Tr8n Proxy
45
+ ****************************************************************************/
46
+
47
+ Tr8n.Proxy = function(options) {
48
+ var self = this;
49
+ this.options = options;
50
+ this.options['url'] = this.options['url'] || '/tr8n/api/v1/language/translate';
51
+ this.options['scheduler_interval'] = this.options['scheduler_interval'] || 20000;
52
+ this.logger_enabled = true;
53
+
54
+ this.logger = new Tr8n.Proxy.Logger({
55
+ 'proxy': self,
56
+ 'element_id': options['debugger']
57
+ });
58
+
59
+ this.language = new Tr8n.Proxy.Language({
60
+ 'proxy': self
61
+ });
62
+
63
+ this.initTranslations();
64
+ this.runScheduledTasks();
65
+ }
66
+
67
+ Tr8n.Proxy.prototype = {
68
+ log: function(msg) {
69
+ this.logger.debug(msg);
70
+ },
71
+ disableLogger: function() {
72
+ this.logger_enabled = false;
73
+ },
74
+ enableLogger: function() {
75
+ this.logger_enabled = true;
76
+ },
77
+ debug: function(msg) {
78
+ this.logger.debug(msg);
79
+ },
80
+ error: function(msg) {
81
+ this.logger.error(msg);
82
+ },
83
+ translate: function(label, description, tokens, options) {
84
+ return this.language.translate(label, description, tokens, options);
85
+ },
86
+ tr: function(label, description, tokens, options) {
87
+ return this.translate(label, description, tokens, options);
88
+ },
89
+ getTranslations: function() {
90
+ if (!this.translations) return {};
91
+ return this.translations;
92
+ },
93
+ getDecorationFor: function(decoration_name) {
94
+ if (!this.options['decorations'])
95
+ return null;
96
+ return this.options['decorations'][decoration_name];
97
+ },
98
+ getLanguageRuleForType: function(rule_type) {
99
+ // modify this section to add more rules
100
+ if (rule_type == 'number') return 'Tr8n.Proxy.NumericRule';
101
+ if (rule_type == 'gender') return 'Tr8n.Proxy.GenderRule';
102
+ if (rule_type == 'date') return 'Tr8n.Proxy.DateRule';
103
+ if (rule_type == 'list') return 'Tr8n.Proxy.ListRule';
104
+ if (rule_type == 'gender_list') return 'Tr8n.Proxy.GenderListRule';
105
+ return null;
106
+ },
107
+ getLanguageRuleForTokenSuffix: function(token_suffix) {
108
+ if (!this.options['rules']) return null;
109
+
110
+ for (rule_type in this.options['rules']) {
111
+ var suffixes = this.options['rules'][rule_type]['token_suffixes'];
112
+ if (!suffixes) continue;
113
+
114
+ if (Tr8n.Proxy.Utils.indexOf(suffixes, token_suffix) != -1 )
115
+ return this.getLanguageRuleForType(rule_type);
116
+ }
117
+ return null;
118
+ },
119
+
120
+ registerMissingTranslationKey: function(translation_key) {
121
+ this.missing_translation_keys = this.missing_translation_keys || {};
122
+ if (!this.missing_translation_keys[translation_key.key]) {
123
+ this.missing_translation_keys[translation_key.key] = translation_key;
124
+ }
125
+ },
126
+
127
+ registerTranslationKeys: function(translations) {
128
+ this.log("Found " + translations.length + " phrases");
129
+ for (i = 0; i < translations.length; i++) {
130
+ this.log("Registering " + translations[i]['key']);
131
+ this.translations[translations[i]['key']] = translations[i];
132
+ }
133
+ },
134
+
135
+ submitMissingTranslationKeys: function() {
136
+ if (!this.missing_translation_keys) {
137
+ this.log('No missing translation keys to submit...');
138
+ return;
139
+ }
140
+
141
+ var phrases = "[";
142
+ for (var key in this.missing_translation_keys) {
143
+ var translation_key = this.missing_translation_keys[key];
144
+ if (phrases!="[") phrases = phrases + ",";
145
+ phrases = phrases + "{";
146
+ phrases = phrases + '"label":"' + translation_key.label + '", ';
147
+ phrases = phrases + '"description":"' + translation_key.description + '"';
148
+ phrases = phrases + "}";
149
+ }
150
+ phrases = phrases + "]";
151
+ this.missing_translation_keys = null;
152
+
153
+ var self = this;
154
+ this.debug('Submitting missing translation keys: ' + phrases);
155
+ Tr8n.Proxy.Utils.ajax(this.options['url'], {
156
+ method: 'put',
157
+ parameters: {'source': self.options['source'], 'phrases': phrases},
158
+ onSuccess: function(response) {
159
+ self.log("Received response from the server");
160
+ self.log(response.responseText);
161
+ self.registerTranslationKeys(eval("[" + response.responseText + "]")[0]['phrases']);
162
+ }
163
+ });
164
+ },
165
+
166
+ initTranslations: function(forced) {
167
+ if (!forced && this.translations) return;
168
+
169
+ var self = this;
170
+ self.log("Fetching translations from the server...");
171
+ self.translations = {};
172
+ Tr8n.Proxy.Utils.ajax(this.options['url'], {
173
+ method: 'get',
174
+ parameters: {'batch': true, 'source': self.options['source']},
175
+ onSuccess: function(response) {
176
+ self.log("Received response from the server");
177
+ self.log(response.responseText);
178
+ self.registerTranslationKeys(eval("[" + response.responseText + "]")[0]['phrases']);
179
+ }
180
+ });
181
+ },
182
+
183
+ runScheduledTasks: function() {
184
+ var self = this;
185
+
186
+ this.log("Running scheduled tasks...");
187
+ this.submitMissingTranslationKeys();
188
+
189
+ window.setTimeout(function() {
190
+ self.runScheduledTasks();
191
+ }, this.options['scheduler_interval']);
192
+ },
193
+ }
194
+
195
+ /****************************************************************************
196
+ **** Tr8n Proxy Language
197
+ ****************************************************************************/
198
+
199
+ Tr8n.Proxy.Language = function(options) {
200
+ this.options = options;
201
+ }
202
+
203
+ Tr8n.Proxy.Language.prototype = {
204
+ getProxy: function() {
205
+ return this.options['proxy'];
206
+ },
207
+ getLogger: function() {
208
+ return this.getProxy().logger;
209
+ },
210
+ translate: function(label, description, tokens, options) {
211
+ return (new Tr8n.Proxy.TranslationKey(label, description, {'proxy': this.getProxy()}).translate(this, tokens, options));
212
+ }
213
+ }
214
+
215
+ /****************************************************************************
216
+ **** Tr8n Proxy TranslationKey
217
+ ****************************************************************************/
218
+
219
+ Tr8n.Proxy.TranslationKey = function(label, description, options) {
220
+ this.label = label;
221
+ this.description = description;
222
+ this.options = options;
223
+ this.generateKey();
224
+ }
225
+
226
+ Tr8n.Proxy.TranslationKey.prototype = {
227
+ getProxy: function() {
228
+ return this.options['proxy'];
229
+ },
230
+ getLogger: function() {
231
+ return this.getProxy().logger;
232
+ },
233
+ findFirstAcceptableTranslation: function(translations, token_values) {
234
+ // check for a single translation case - no context rules
235
+ if (translations['label']!=null) {
236
+ this.getLogger().debug('Found a single translation: ' + translations['label']);
237
+ return translations;
238
+ }
239
+
240
+ translations = translations['labels'];
241
+ if (!translations) {
242
+ this.getLogger().error("Translations are in a weid form...");
243
+ return null;
244
+ }
245
+
246
+ this.getLogger().debug('Found translations: ' + translations.length);
247
+ for (var i=0; i<translations.length; i++) {
248
+ this.getLogger().debug("Checking context rules for:" + translations[i]['label']);
249
+
250
+ if (!translations[i]['context']) return translations[i];
251
+ var valid_context = true;
252
+
253
+ for (var token in translations[i]['context']) {
254
+ if (!valid_context) continue;
255
+ var token_context = translations[i]['context'][token];
256
+ var rule_name = this.getProxy().getLanguageRuleForType(token_context['type']);
257
+ this.getLogger().debug("Evaluating rule:" + rule_name);
258
+ var options = {'proxy': this.getProxy()};
259
+ var rule = eval("new " + rule_name + "(token_context, options)");
260
+ valid_context = valid_context && rule.evaluate(token, token_values);
261
+ }
262
+
263
+ if (valid_context) return translations[i];
264
+ }
265
+
266
+ this.getLogger().debug('No acceptable ranslations found');
267
+ return null;
268
+ },
269
+ translate: function(language, token_values, options) {
270
+ if (!this.label) {
271
+ this.getLogger().error('Label must always be provided for the translate method');
272
+ return '';
273
+ }
274
+
275
+ var translations = this.getProxy().getTranslations();
276
+ if (translations[this.key]) {
277
+ var translation = this.findFirstAcceptableTranslation(translations[this.key], token_values);
278
+ if (!translation) return this.substituteTokens(this.label, token_values, options);
279
+ return this.substituteTokens(translation['label'], token_values, options);
280
+ }
281
+
282
+ this.getProxy().registerMissingTranslationKey(this);
283
+ this.getLogger().debug('No translation found. Using default...');
284
+ return this.substituteTokens(this.label, token_values, options);
285
+ },
286
+
287
+ generateKey: function() {
288
+ this.key = this.label + ";;;";
289
+ if (this.description) this.key = this.key + this.description;
290
+
291
+ this.getLogger().debug('Preparing label signature: ' + this.key);
292
+ this.key = MD5(this.key);
293
+ this.getLogger().debug('Label signature: ' + this.key);
294
+ },
295
+
296
+ registerDataTokens: function(label) {
297
+ this.data_tokens = [];
298
+ this.data_tokens = this.data_tokens.concat(Tr8n.Proxy.DataToken.parse(label, {'key': this, 'proxy':this.getProxy()}));
299
+ this.data_tokens = this.data_tokens.concat(Tr8n.Proxy.TransformToken.parse(label, {'key': this, 'proxy':this.getProxy()}));
300
+ },
301
+
302
+ registerDecorationTokens: function(label) {
303
+ this.decoration_tokens = [];
304
+ this.decoration_tokens = this.decoration_tokens.concat(Tr8n.Proxy.DecorationToken.parse(label, {'key': this, 'proxy':this.getProxy()}));
305
+ },
306
+
307
+ substituteTokens: function(label, token_values, options) {
308
+ this.registerDataTokens(label);
309
+ if (!this.data_tokens) return label;
310
+ for (var i = 0; i < this.data_tokens.length; i++) {
311
+ label = this.data_tokens[i].substitute(label, token_values || {});
312
+ }
313
+
314
+ this.registerDecorationTokens(label);
315
+ if (!this.decoration_tokens) return label;
316
+ for (var i = 0; i < this.decoration_tokens.length; i++) {
317
+ label = this.decoration_tokens[i].substitute(label, token_values || {});
318
+ }
319
+
320
+ return label;
321
+ }
322
+ }
323
+
324
+ /****************************************************************************
325
+ **** Tr8n Proxy LanguageRule
326
+ ****************************************************************************/
327
+
328
+ Tr8n.Proxy.LanguageRule = function() {}
329
+
330
+ Tr8n.Proxy.LanguageRule.prototype = {
331
+ getProxy: function() {
332
+ return this.options['proxy'];
333
+ },
334
+ getLogger: function() {
335
+ return this.getProxy().logger;
336
+ },
337
+ getTokenValue: function(token_name, token_values) {
338
+ var object = token_values[token_name];
339
+ if (!object) {
340
+ this.getLogger().error("Invalid token value for token: " + token_name);
341
+ }
342
+
343
+ return object;
344
+ }
345
+ }
346
+
347
+ /****************************************************************************
348
+ **** Tr8n Proxy NumericRule
349
+ ****************************************************************************/
350
+
351
+ Tr8n.Proxy.NumericRule = function(definition, options) {
352
+ this.definition = definition;
353
+ this.options = options;
354
+ }
355
+
356
+ Tr8n.Proxy.NumericRule.prototype = new Tr8n.Proxy.LanguageRule();
357
+
358
+ // English based transform method
359
+ // FORM: [singular, plural]
360
+ // {count | message, messages}
361
+ // {count | person, people}
362
+ Tr8n.Proxy.NumericRule.transform = function(count, values) {
363
+ if (count == 1) return values[0];
364
+ return values[1];
365
+ }
366
+
367
+ Tr8n.Proxy.NumericRule.prototype.evaluate = function(token_name, token_values){
368
+ // "count":{"value1":"2,3,4","operator":"and","type":"number","multipart":true,"part2":"does_not_end_in","value2":"12,13,14","part1":"ends_in"}
369
+ var object = this.getTokenValue(token_name, token_values);
370
+ if (!object) return false;
371
+
372
+ var token_value = null;
373
+ if (typeof object == 'string' || typeof object == 'number') {
374
+ token_value = "" + object;
375
+ } else if (typeof object == 'object' && object['subject']) {
376
+ token_value = "" + object['subject'];
377
+ } else {
378
+ this.getLogger().error("Invalid token value for numeric token: " + token_name);
379
+ return false;
380
+ }
381
+
382
+ var result1 = this.evaluatePartialRule(token_value, this.definition['part1'], this.definition['value1'].split(','));
383
+ if (!this.definition['multipart']) return result1;
384
+
385
+ var result2 = this.evaluatePartialRule(token_value, this.definition['part2'], this.definition['value2'].split(','));
386
+ if (this.definition['operator'] == "or") return (result1 || result2);
387
+ return (result1 && result2);
388
+ }
389
+
390
+
391
+ Tr8n.Proxy.NumericRule.prototype.evaluatePartialRule = function(token_value, name, values) {
392
+ if (name == 'is') {
393
+ if (Tr8n.Proxy.Utils.indexOf(values, token_value)!=-1) return true;
394
+ return false
395
+ }
396
+ if (name == 'is_not') {
397
+ if (Tr8n.Proxy.Utils.indexOf(values, token_value)==-1) return true;
398
+ return false
399
+ }
400
+ if (name == 'ends_in') {
401
+ for(var i=0; i<values.length; i++) {
402
+ if (token_value.match(values[i] + "$")) return true;
403
+ }
404
+ return false;
405
+ }
406
+ if (name == 'does_not_end_in') {
407
+ for(var i=0; i<values.length; i++) {
408
+ if (token_value.match(values[i] + "$")) return false;
409
+ }
410
+ return true;
411
+ }
412
+ return false;
413
+ }
414
+
415
+
416
+ /****************************************************************************
417
+ **** Tr8n Proxy GenderRule
418
+ ****************************************************************************/
419
+
420
+ Tr8n.Proxy.GenderRule = function(definition, options) {
421
+ this.definition = definition;
422
+ this.options = options;
423
+ }
424
+
425
+ Tr8n.Proxy.GenderRule.prototype = new Tr8n.Proxy.LanguageRule();
426
+
427
+ // FORM: [male, female, unknown]
428
+ // {user | registered on}
429
+ // {user | he, she}
430
+ // {user | he, she, he/she}
431
+ Tr8n.Proxy.GenderRule.transform = function(object, values) {
432
+ if (values.length == 1) return values[0];
433
+
434
+ if (typeof object == 'string') {
435
+ if (object == 'male') return values[0];
436
+ if (object == 'female') return values[1];
437
+ } else if (typeof object == 'object') {
438
+ if (object['gender'] == 'male') return values[0];
439
+ if (object['gender'] == 'female') return values[1];
440
+ }
441
+
442
+ if (values.length == 3) return values[2];
443
+ return values[0] + "/" + values[1];
444
+ }
445
+
446
+ Tr8n.Proxy.GenderRule.prototype.evaluate = function(token_name, token_values) {
447
+
448
+ var object = this.getTokenValue(token_name, token_values);
449
+ if (!object) return false;
450
+
451
+ var gender = "";
452
+
453
+ if (typeof object != 'object') {
454
+ this.getLogger().error("Invalid token value for gender based token: " + token_name + ". Token value must be an object.");
455
+ return false;
456
+ }
457
+
458
+ if (!object['subject']) {
459
+ this.getLogger().error("Invalid token subject for gender based token: " + token_name + ". Token value must contain a subject. Subject can be a string or an object with a gender.");
460
+ return false;
461
+ }
462
+
463
+ if (typeof object['subject'] == 'string') {
464
+ gender = object['subject'];
465
+ } else if (typeof object['subject'] == 'object') {
466
+ gender = object['subject']['gender'];
467
+ if (!gender) {
468
+ this.getLogger().error("Cannot determine gender for token subject: " + token_name);
469
+ return false;
470
+ }
471
+ } else {
472
+ this.getLogger().error("Invalid token subject for gender based token: " + token_name + ". Subject does not have a gender.");
473
+ return false;
474
+ }
475
+
476
+ if (this.definition['operator'] == "is") {
477
+ return (gender == this.definition['value']);
478
+ } else if (this.definition['operator'] == "is_not") {
479
+ return (gender != this.definition['value']);
480
+ }
481
+
482
+ return false;
483
+ }
484
+
485
+ /****************************************************************************
486
+ **** Tr8n Proxy ListRule
487
+ ****************************************************************************/
488
+
489
+ Tr8n.Proxy.ListRule = function(definition, options) {
490
+ this.definition = definition;
491
+ this.options = options;
492
+ }
493
+
494
+ Tr8n.Proxy.ListRule.prototype = new Tr8n.Proxy.LanguageRule();
495
+
496
+ Tr8n.Proxy.ListRule.transform = function(object, values) {
497
+ return "";
498
+ }
499
+
500
+ Tr8n.Proxy.ListRule.prototype.evaluate = function(token, token_values) {
501
+ return true;
502
+ }
503
+
504
+ /****************************************************************************
505
+ **** Tr8n Proxy GenderListRule
506
+ ****************************************************************************/
507
+
508
+ Tr8n.Proxy.GenderListRule = function(definition, options) {
509
+ this.definition = definition;
510
+ this.options = options;
511
+ }
512
+
513
+ Tr8n.Proxy.GenderListRule.prototype = new Tr8n.Proxy.LanguageRule();
514
+
515
+ Tr8n.Proxy.GenderListRule.transform = function(object, values) {
516
+ return "";
517
+ }
518
+
519
+ Tr8n.Proxy.GenderListRule.prototype.evaluate = function(token, token_values) {
520
+ return true;
521
+ }
522
+
523
+ /****************************************************************************
524
+ **** Tr8n Proxy DateRule
525
+ ****************************************************************************/
526
+
527
+ Tr8n.Proxy.DateRule = function(definition, options) {
528
+ this.definition = definition;
529
+ this.options = options;
530
+ }
531
+
532
+ Tr8n.Proxy.DateRule.prototype = new Tr8n.Proxy.LanguageRule();
533
+
534
+ Tr8n.Proxy.DateRule.transform = function(object, values) {
535
+ return "";
536
+ }
537
+
538
+ Tr8n.Proxy.DateRule.prototype.evaluate = function(token, token_values) {
539
+ return true;
540
+ }
541
+
542
+ /****************************************************************************
543
+ **** Tr8n Proxy Token
544
+ ****************************************************************************/
545
+
546
+ Tr8n.Proxy.Token = function() {}
547
+
548
+ Tr8n.Proxy.Token.prototype = {
549
+ getProxy: function() {
550
+ return this.options['proxy'];
551
+ },
552
+ getLogger: function() {
553
+ return this.getProxy().logger;
554
+ },
555
+ getExpression: function() {
556
+ // must be implemented by the extending class
557
+ return null;
558
+ },
559
+ register: function(label, options) {
560
+ if (this.getExpression() == null)
561
+ alert("Expression must be provided");
562
+
563
+ var tokens = label.match(this.getExpression());
564
+ if (!tokens) return [];
565
+
566
+ var objects = [];
567
+ var uniq = {};
568
+ for(i=0; i<tokens.length; i++) {
569
+ if (uniq[tokens[i]]) continue;
570
+ options['proxy'].debug("Registering data token: " + tokens[i]);
571
+ objects.push(new Tr8n.Proxy.TransformToken(label, tokens[i], options));
572
+ uniq[tokens[i]] = true;
573
+ }
574
+ return objects;
575
+ },
576
+ getFullName: function() {
577
+ return this.full_name;
578
+ },
579
+ getDeclaredName: function() {
580
+ if (!this.declared_name) {
581
+ this.declared_name = this.getFullName().replace(/[{}\[\]]/g, '');
582
+ }
583
+ return this.declared_name;
584
+ },
585
+ getName: function() {
586
+ if (!this.name) {
587
+ this.name = Tr8n.Proxy.Utils.trim(this.getDeclaredName().split(':')[0]);
588
+ }
589
+ return this.name;
590
+ },
591
+ getLanguageRule: function() {
592
+
593
+ return null;
594
+ },
595
+ substitute: function(label, token_values) {
596
+ var value = token_values[this.getName()];
597
+
598
+ if (value == null) {
599
+ this.getLogger().error("Value for token: " + this.getFullName() + " was not provided");
600
+ return label;
601
+ }
602
+
603
+ return Tr8n.Proxy.Utils.replaceAll(label, this.getFullName(), this.getTokenValue(value));
604
+ },
605
+ getTokenValue: function(token_value) {
606
+ if (typeof token_value == 'string') return token_value;
607
+ if (typeof token_value == 'number') return token_value;
608
+ return token_value['value'];
609
+ },
610
+ getTokenObject: function(token_value) {
611
+ if (typeof token_value == 'string') return token_value;
612
+ if (typeof token_value == 'number') return token_value;
613
+ return token_value['subject'];
614
+ },
615
+ getType: function() {
616
+ if (this.getDeclaredName().indexOf(':') == -1)
617
+ return null;
618
+
619
+ if (!this.type) {
620
+ this.type = this.getDeclaredName().split('|')[0].split(':');
621
+ this.type = this.type[this.type.length - 1];
622
+ }
623
+
624
+ return this.type;
625
+ },
626
+ getSuffix: function() {
627
+ if (!this.suffix) {
628
+ this.suffix = this.getName().split('_');
629
+ this.suffix = this.suffix[this.suffix.length - 1];
630
+ }
631
+ return this.suffix;
632
+ },
633
+ getLanguageRule: function() {
634
+ if (!this.language_rule) {
635
+ if (this.getType()) {
636
+ this.language_rule = this.getProxy().getLanguageRuleForType(this.getType());
637
+ } else {
638
+ this.language_rule = this.getProxy().getLanguageRuleForTokenSuffix(this.getSuffix());
639
+ }
640
+ }
641
+ return this.language_rule;
642
+ }
643
+ }
644
+
645
+ /****************************************************************************
646
+ **** Tr8n Proxy Data Token
647
+ ****************************************************************************/
648
+
649
+ Tr8n.Proxy.DataToken = function(label, token, options) {
650
+ this.label = label;
651
+ this.full_name = token;
652
+ this.options = options;
653
+ }
654
+
655
+ Tr8n.Proxy.DataToken.prototype = new Tr8n.Proxy.Token();
656
+
657
+ Tr8n.Proxy.DataToken.parse = function(label, options) {
658
+ var tokens = label.match(/(\{[^_][\w]+(:[\w]+)?\})/g);
659
+ if (!tokens) return [];
660
+
661
+ var objects = [];
662
+ var uniq = {};
663
+ for(i=0; i<tokens.length; i++) {
664
+ if (uniq[tokens[i]]) continue;
665
+ options['proxy'].debug("Registering data token: " + tokens[i]);
666
+ objects.push(new Tr8n.Proxy.DataToken(label, tokens[i], options));
667
+ uniq[tokens[i]] = true;
668
+ }
669
+ return objects;
670
+ }
671
+
672
+ /****************************************************************************
673
+ **** Tr8n Proxy Transform Token
674
+ ****************************************************************************/
675
+
676
+ Tr8n.Proxy.TransformToken = function(label, token, options) {
677
+ this.label = label;
678
+ this.full_name = token;
679
+ this.options = options;
680
+ }
681
+
682
+ Tr8n.Proxy.TransformToken.prototype = new Tr8n.Proxy.Token();
683
+
684
+ Tr8n.Proxy.TransformToken.parse = function(label, options) {
685
+ var tokens = label.match(/(\{[^_][\w]+(:[\w]+)?\s*\|\|?[^{^}]+\})/g);
686
+ if (!tokens) return [];
687
+
688
+ var objects = [];
689
+ var uniq = {};
690
+ for(i=0; i<tokens.length; i++) {
691
+ if (uniq[tokens[i]]) continue;
692
+ options['proxy'].debug("Registering transform token: " + tokens[i]);
693
+ objects.push(new Tr8n.Proxy.TransformToken(label, tokens[i], options));
694
+ uniq[tokens[i]] = true;
695
+ }
696
+ return objects;
697
+ }
698
+
699
+ Tr8n.Proxy.TransformToken.prototype.getName = function() {
700
+ if (!this.name) {
701
+ this.name = Tr8n.Proxy.Utils.trim(this.getDeclaredName().split('|')[0].split(':')[0]);
702
+ }
703
+ return this.name;
704
+ }
705
+
706
+ Tr8n.Proxy.TransformToken.prototype.getPipedParams = function() {
707
+ if (!this.piped_params) {
708
+ var temp = this.getDeclaredName().split('|');
709
+ temp = temp[temp.length - 1].split(",");
710
+ this.piped_params = [];
711
+ for (i=0; i<temp.length; i++) {
712
+ this.piped_params.push(Tr8n.Proxy.Utils.trim(temp[i]));
713
+ }
714
+ }
715
+ return this.piped_params;
716
+ }
717
+
718
+ Tr8n.Proxy.TransformToken.prototype.substitute = function(label, token_values) {
719
+ var object = token_values[this.getName()];
720
+ if (object == null) {
721
+ this.getLogger().error("Value for token: " + this.getFullName() + " was not provided");
722
+ return label;
723
+ }
724
+
725
+ var token_object = this.getTokenObject(object);
726
+ this.getLogger().debug("Registered " + this.getPipedParams().length + " piped params");
727
+
728
+ var lang_rule_name = this.getLanguageRule();
729
+
730
+ if (!lang_rule_name) {
731
+ this.getLogger().error("Rule type cannot be determined for the transform token: " + this.getFullName());
732
+ return label;
733
+ } else {
734
+ this.getLogger().debug("Transform token uses rule: " + lang_rule_name);
735
+ }
736
+
737
+ var transform_value = eval(lang_rule_name).transform(token_object, this.getPipedParams());
738
+ this.getLogger().debug("Registered transform value: " + transform_value);
739
+
740
+ // for double pipes - show the actual value as well
741
+ if (this.isAllowedInTranslation()) {
742
+ var token_value = this.getTokenValue(object);
743
+ transform_value = token_value + " " + transform_value;
744
+ }
745
+
746
+ return Tr8n.Proxy.Utils.replaceAll(label, this.getFullName(), transform_value);
747
+ }
748
+
749
+ Tr8n.Proxy.TransformToken.prototype.getPipedSeparator = function() {
750
+ if (!this.piped_separator) {
751
+ this.piped_separator = (this.getFullName().indexOf("||") != -1 ? "||" : "|");
752
+ }
753
+ return this.piped_separator;
754
+ }
755
+
756
+ Tr8n.Proxy.TransformToken.prototype.isAllowedInTranslation = function(){
757
+ return this.getPipedSeparator() == "||";
758
+ }
759
+
760
+ /****************************************************************************
761
+ **** Tr8n Proxy Decoration Token
762
+ ****************************************************************************/
763
+
764
+ Tr8n.Proxy.DecorationToken = function(label, token, options) {
765
+ this.label = label;
766
+ this.full_name = token;
767
+ this.options = options;
768
+ }
769
+
770
+ Tr8n.Proxy.DecorationToken.prototype = new Tr8n.Proxy.Token();
771
+
772
+ Tr8n.Proxy.DecorationToken.parse = function(label, options) {
773
+ var tokens = label.match(/(\[\w+:[^\]]+\])/g);
774
+ if (!tokens) return [];
775
+
776
+ var objects = [];
777
+ var uniq = {};
778
+ for(i=0; i<tokens.length; i++) {
779
+ if (uniq[tokens[i]]) continue;
780
+ options['proxy'].debug("Registering decoration token: " + tokens[i]);
781
+ objects.push(new Tr8n.Proxy.DecorationToken(label, tokens[i], options));
782
+ uniq[tokens[i]] = true;
783
+ }
784
+ return objects;
785
+ }
786
+
787
+ Tr8n.Proxy.DecorationToken.prototype.getDecoratedValue = function() {
788
+ if (!this.decorated_value) {
789
+ var value = this.getFullName().replace(/[\]]/g, '');
790
+ value = value.substring(value.indexOf(':') + 1, value.length);
791
+ this.decorated_value = Tr8n.Proxy.Utils.trim(value);
792
+ }
793
+ return this.decorated_value;
794
+ }
795
+
796
+ Tr8n.Proxy.DecorationToken.prototype.substitute = function(label, token_values) {
797
+ var object = token_values[this.getName()];
798
+ var decoration = object;
799
+
800
+ if (!object || typeof object == 'object') {
801
+ // look for the default decoration
802
+ decoration = this.getProxy().getDecorationFor(this.getName());
803
+ if (!decoration) {
804
+ this.getLogger().error("Default decoration is not defined for token " + this.getName());
805
+ return label;
806
+ }
807
+
808
+ decoration = Tr8n.Proxy.Utils.replaceAll(decoration, '{$0}', this.getDecoratedValue());
809
+ if (object) {
810
+ for (var key in object) {
811
+ decoration = Tr8n.Proxy.Utils.replaceAll(decoration, '{$' + key + '}', object[key]);
812
+ }
813
+ }
814
+ } else if (typeof object == 'string') {
815
+ decoration = Tr8n.Proxy.Utils.replaceAll(decoration, '{$0}', this.getDecoratedValue());
816
+ } else {
817
+ this.getLogger().error("Unknown type of decoration token " + this.getFullName());
818
+ return label;
819
+ }
820
+
821
+ return Tr8n.Proxy.Utils.replaceAll(label, this.getFullName(), decoration);
822
+ }
823
+
824
+ /****************************************************************************
825
+ **** Tr8n Proxy Logger
826
+ ****************************************************************************/
827
+
828
+ Tr8n.Proxy.Logger = function(options) {
829
+ this.options = options;
830
+ }
831
+
832
+ Tr8n.Proxy.Logger.prototype = {
833
+ log: function(msg) {
834
+ if (!this.options['proxy'].logger_enabled) return;
835
+ if (!this.options['element_id']) return;
836
+
837
+ var str = Tr8n.Proxy.Utils.element(this.options['element_id']).innerHTML;
838
+ var now = new Date();
839
+ str = "<span style='color:#ccc;'>" + (now.toLocaleDateString() + " " + now.toLocaleTimeString()) + "</span>: " + msg + "<br>" + str;
840
+ Tr8n.Proxy.Utils.element(this.options['element_id']).innerHTML = str;
841
+ },
842
+ debug: function(msg) {
843
+ this.log("<span style='color:grey'>" + msg + "</span>");
844
+ },
845
+ error: function(msg) {
846
+ this.log("<span style='color:red'>" + msg + "</span>");
847
+ }
848
+ }
849
+
850
+ /****************************************************************************
851
+ **** Tr8n Proxy Utils
852
+ ****************************************************************************/
853
+
854
+ Tr8n.Proxy.Utils = {
855
+
856
+ element:function(element_id) {
857
+ if (typeof element_id == 'string') return document.getElementById(element_id);
858
+ return element_id;
859
+ },
860
+
861
+ indexOf: function(array, item, i) {
862
+ i || (i = 0);
863
+ var length = array.length;
864
+ if (i < 0) i = length + i;
865
+ for (; i < length; i++)
866
+ if (array[i] === item) return i;
867
+ return -1;
868
+ },
869
+
870
+ replaceAll: function(label, key, value) {
871
+ while (label.indexOf(key) != -1) {
872
+ label = label.replace(key, value);
873
+ }
874
+ return label;
875
+ },
876
+
877
+ trim: function(string) {
878
+ return string.replace(/^\s+|\s+$/g,"");
879
+ },
880
+
881
+ ltrim: function(string) {
882
+ return string.replace(/^\s+/,"");
883
+ },
884
+
885
+ rtrim: function(string) {
886
+ return string.replace(/\s+$/,"");
887
+ },
888
+
889
+ addEvent: function(elm, evType, fn, useCapture) {
890
+ useCapture = useCapture || false;
891
+ if (elm.addEventListener) {
892
+ elm.addEventListener(evType, fn, useCapture);
893
+ return true;
894
+ } else if (elm.attachEvent) {
895
+ var r = elm.attachEvent('on' + evType, fn);
896
+ return r;
897
+ } else {
898
+ elm['on' + evType] = fn;
899
+ }
900
+ },
901
+
902
+ toQueryParams: function (obj) {
903
+ if (typeof obj == 'undefined' || obj == null) return "";
904
+ if (typeof obj == 'string') return obj;
905
+
906
+ var qs = [];
907
+ for(p in obj) {
908
+ qs.push(p + "=" + encodeURIComponent(obj[p]))
909
+ }
910
+ return qs.join("&")
911
+ },
912
+
913
+ getRequest: function() {
914
+ var factories = [
915
+ function() { return new ActiveXObject("Msxml2.XMLHTTP"); },
916
+ function() { return new XMLHttpRequest(); },
917
+ function() { return new ActiveXObject("Microsoft.XMLHTTP"); }
918
+ ];
919
+ for(var i = 0; i < factories.length; i++) {
920
+ try {
921
+ var request = factories[i]();
922
+ if (request != null) return request;
923
+ } catch(e) {continue;}
924
+ }
925
+ },
926
+
927
+ ajax: function(url, options) {
928
+ options = options || {};
929
+ options.parameters = Tr8n.Proxy.Utils.toQueryParams(options.parameters);
930
+ options.method = options.method || 'get';
931
+
932
+ var self=this;
933
+ if (options.method == 'get' && options.parameters != '') {
934
+ url = url + (url.indexOf('?') == -1 ? '?' : '&') + options.parameters;
935
+ }
936
+
937
+ var request = this.getRequest();
938
+
939
+ request.onreadystatechange = function() {
940
+ if(request.readyState == 4) {
941
+ if (request.status == 200) {
942
+ if(options.onSuccess) options.onSuccess(request);
943
+ if(options.onComplete) options.onComplete(request);
944
+ if(options.evalScripts) self.evalScripts(request.responseText);
945
+ } else {
946
+ if(options.onFailure) options.onFailure(request)
947
+ if(options.onComplete) options.onComplete(request)
948
+ }
949
+ }
950
+ }
951
+
952
+ request.open(options.method, url, true);
953
+ request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
954
+ request.setRequestHeader('Accept', 'text/javascript, text/html, application/xml, text/xml, */*');
955
+ request.send(options.parameters);
956
+ }
957
+ }
958
+
959
+ /****************************************************************************
960
+ **** Tr8n Proxy Initialization
961
+ ****************************************************************************/
962
+ //var tr8nProxy;
963
+ //
964
+ //function initializeTr8nClientSDK(source, debugger) {
965
+ // tr8nProxy = tr8nProxy || new Tr8n.Proxy({
966
+ // "source": source,
967
+ // "debugger": debugger,
968
+ // "decorations": {"bold": "<strong>{$0}</strong>", "italic": "<i>{$0}</i>", "link": "<a href='{$href}'>{$0}</a>"},
969
+ // "rules": {"number":{"token_suffixes":["count", "num"]},
970
+ // "gender":{"token_suffixes":["user", "profile", "actor", "target"]},
971
+ // "list":{"token_suffixes":["list"]}, "date":{"token_suffixes":["date"]}
972
+ // }
973
+ // });
974
+ //}
975
+
976
+ /****************************************************************************
977
+ ***
978
+ *** MD5 (Message-Digest Algorithm)
979
+ *** http://www.webtoolkit.info/
980
+ ***
981
+ ****************************************************************************/
982
+
983
+ var MD5 = function (string) {
984
+
985
+ function RotateLeft(lValue, iShiftBits) {
986
+ return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
987
+ }
988
+
989
+ function AddUnsigned(lX,lY) {
990
+ var lX4,lY4,lX8,lY8,lResult;
991
+ lX8 = (lX & 0x80000000);
992
+ lY8 = (lY & 0x80000000);
993
+ lX4 = (lX & 0x40000000);
994
+ lY4 = (lY & 0x40000000);
995
+ lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
996
+ if (lX4 & lY4) {
997
+ return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
998
+ }
999
+ if (lX4 | lY4) {
1000
+ if (lResult & 0x40000000) {
1001
+ return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
1002
+ } else {
1003
+ return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
1004
+ }
1005
+ } else {
1006
+ return (lResult ^ lX8 ^ lY8);
1007
+ }
1008
+ }
1009
+
1010
+ function F(x,y,z) { return (x & y) | ((~x) & z); }
1011
+ function G(x,y,z) { return (x & z) | (y & (~z)); }
1012
+ function H(x,y,z) { return (x ^ y ^ z); }
1013
+ function I(x,y,z) { return (y ^ (x | (~z))); }
1014
+
1015
+ function FF(a,b,c,d,x,s,ac) {
1016
+ a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
1017
+ return AddUnsigned(RotateLeft(a, s), b);
1018
+ };
1019
+
1020
+ function GG(a,b,c,d,x,s,ac) {
1021
+ a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
1022
+ return AddUnsigned(RotateLeft(a, s), b);
1023
+ };
1024
+
1025
+ function HH(a,b,c,d,x,s,ac) {
1026
+ a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
1027
+ return AddUnsigned(RotateLeft(a, s), b);
1028
+ };
1029
+
1030
+ function II(a,b,c,d,x,s,ac) {
1031
+ a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
1032
+ return AddUnsigned(RotateLeft(a, s), b);
1033
+ };
1034
+
1035
+ function ConvertToWordArray(string) {
1036
+ var lWordCount;
1037
+ var lMessageLength = string.length;
1038
+ var lNumberOfWords_temp1=lMessageLength + 8;
1039
+ var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
1040
+ var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
1041
+ var lWordArray=Array(lNumberOfWords-1);
1042
+ var lBytePosition = 0;
1043
+ var lByteCount = 0;
1044
+ while ( lByteCount < lMessageLength ) {
1045
+ lWordCount = (lByteCount-(lByteCount % 4))/4;
1046
+ lBytePosition = (lByteCount % 4)*8;
1047
+ lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount)<<lBytePosition));
1048
+ lByteCount++;
1049
+ }
1050
+ lWordCount = (lByteCount-(lByteCount % 4))/4;
1051
+ lBytePosition = (lByteCount % 4)*8;
1052
+ lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
1053
+ lWordArray[lNumberOfWords-2] = lMessageLength<<3;
1054
+ lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
1055
+ return lWordArray;
1056
+ };
1057
+
1058
+ function WordToHex(lValue) {
1059
+ var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
1060
+ for (lCount = 0;lCount<=3;lCount++) {
1061
+ lByte = (lValue>>>(lCount*8)) & 255;
1062
+ WordToHexValue_temp = "0" + lByte.toString(16);
1063
+ WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
1064
+ }
1065
+ return WordToHexValue;
1066
+ };
1067
+
1068
+ function Utf8Encode(string) {
1069
+ string = string.replace(/\r\n/g,"\n");
1070
+ var utftext = "";
1071
+
1072
+ for (var n = 0; n < string.length; n++) {
1073
+
1074
+ var c = string.charCodeAt(n);
1075
+
1076
+ if (c < 128) {
1077
+ utftext += String.fromCharCode(c);
1078
+ }
1079
+ else if((c > 127) && (c < 2048)) {
1080
+ utftext += String.fromCharCode((c >> 6) | 192);
1081
+ utftext += String.fromCharCode((c & 63) | 128);
1082
+ }
1083
+ else {
1084
+ utftext += String.fromCharCode((c >> 12) | 224);
1085
+ utftext += String.fromCharCode(((c >> 6) & 63) | 128);
1086
+ utftext += String.fromCharCode((c & 63) | 128);
1087
+ }
1088
+
1089
+ }
1090
+
1091
+ return utftext;
1092
+ };
1093
+
1094
+ var x=Array();
1095
+ var k,AA,BB,CC,DD,a,b,c,d;
1096
+ var S11=7, S12=12, S13=17, S14=22;
1097
+ var S21=5, S22=9 , S23=14, S24=20;
1098
+ var S31=4, S32=11, S33=16, S34=23;
1099
+ var S41=6, S42=10, S43=15, S44=21;
1100
+
1101
+ string = Utf8Encode(string);
1102
+
1103
+ x = ConvertToWordArray(string);
1104
+
1105
+ a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;
1106
+
1107
+ for (k=0;k<x.length;k+=16) {
1108
+ AA=a; BB=b; CC=c; DD=d;
1109
+ a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
1110
+ d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
1111
+ c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
1112
+ b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
1113
+ a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
1114
+ d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
1115
+ c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
1116
+ b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
1117
+ a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
1118
+ d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
1119
+ c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
1120
+ b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
1121
+ a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
1122
+ d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
1123
+ c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
1124
+ b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
1125
+ a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
1126
+ d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
1127
+ c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
1128
+ b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
1129
+ a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
1130
+ d=GG(d,a,b,c,x[k+10],S22,0x2441453);
1131
+ c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
1132
+ b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
1133
+ a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
1134
+ d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
1135
+ c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
1136
+ b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
1137
+ a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
1138
+ d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
1139
+ c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
1140
+ b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
1141
+ a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
1142
+ d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
1143
+ c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
1144
+ b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
1145
+ a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
1146
+ d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
1147
+ c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
1148
+ b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
1149
+ a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
1150
+ d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
1151
+ c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
1152
+ b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
1153
+ a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
1154
+ d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
1155
+ c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
1156
+ b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
1157
+ a=II(a,b,c,d,x[k+0], S41,0xF4292244);
1158
+ d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
1159
+ c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
1160
+ b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
1161
+ a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
1162
+ d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
1163
+ c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
1164
+ b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
1165
+ a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
1166
+ d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
1167
+ c=II(c,d,a,b,x[k+6], S43,0xA3014314);
1168
+ b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
1169
+ a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
1170
+ d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
1171
+ c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
1172
+ b=II(b,c,d,a,x[k+9], S44,0xEB86D391);
1173
+ a=AddUnsigned(a,AA);
1174
+ b=AddUnsigned(b,BB);
1175
+ c=AddUnsigned(c,CC);
1176
+ d=AddUnsigned(d,DD);
1177
+ }
1178
+
1179
+ var temp = WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);
1180
+
1181
+ return temp.toLowerCase();
1182
+ }