rademade_admin 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (270) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +34 -0
  4. data/app/assets/fonts/rademade_admin/glyphicons-halflings-regular.eot +0 -0
  5. data/app/assets/fonts/rademade_admin/glyphicons-halflings-regular.svg +228 -0
  6. data/app/assets/fonts/rademade_admin/glyphicons-halflings-regular.ttf +0 -0
  7. data/app/assets/fonts/rademade_admin/glyphicons-halflings-regular.woff +0 -0
  8. data/app/assets/images/rademade_admin/backgrounds/back-blue.jpg +0 -0
  9. data/app/assets/images/rademade_admin/backgrounds/back-green.jpg +0 -0
  10. data/app/assets/images/rademade_admin/backgrounds/back-orange.png +0 -0
  11. data/app/assets/images/rademade_admin/backgrounds/blueish.jpg +0 -0
  12. data/app/assets/images/rademade_admin/backgrounds/select-bg.png +0 -0
  13. data/app/assets/images/rademade_admin/datatables/back_disabled.png +0 -0
  14. data/app/assets/images/rademade_admin/datatables/back_enabled.png +0 -0
  15. data/app/assets/images/rademade_admin/datatables/back_enabled_hover.png +0 -0
  16. data/app/assets/images/rademade_admin/datatables/forward_disabled.png +0 -0
  17. data/app/assets/images/rademade_admin/datatables/forward_enabled.png +0 -0
  18. data/app/assets/images/rademade_admin/datatables/forward_enabled_hover.png +0 -0
  19. data/app/assets/images/rademade_admin/datatables/sort_asc.png +0 -0
  20. data/app/assets/images/rademade_admin/datatables/sort_asc_disabled.png +0 -0
  21. data/app/assets/images/rademade_admin/datatables/sort_both.png +0 -0
  22. data/app/assets/images/rademade_admin/datatables/sort_desc.png +0 -0
  23. data/app/assets/images/rademade_admin/datatables/sort_desc_disabled.png +0 -0
  24. data/app/assets/images/rademade_admin/icons/btn-attach.png +0 -0
  25. data/app/assets/images/rademade_admin/icons/btn-setting.png +0 -0
  26. data/app/assets/images/rademade_admin/icons/btn-shuffle.png +0 -0
  27. data/app/assets/images/rademade_admin/icons/btn-tool.png +0 -0
  28. data/app/assets/images/rademade_admin/icons/buble.png +0 -0
  29. data/app/assets/images/rademade_admin/icons/glyphicons-halflings-white.png +0 -0
  30. data/app/assets/images/rademade_admin/icons/glyphicons-halflings.png +0 -0
  31. data/app/assets/images/rademade_admin/icons/ico-arrow-black.png +0 -0
  32. data/app/assets/images/rademade_admin/icons/ico-gallery-edit.png +0 -0
  33. data/app/assets/images/rademade_admin/icons/ico-gallery-trash.png +0 -0
  34. data/app/assets/images/rademade_admin/icons/ico-mail.png +0 -0
  35. data/app/assets/images/rademade_admin/icons/ico-phone.png +0 -0
  36. data/app/assets/images/rademade_admin/icons/ico-table-delete.png +0 -0
  37. data/app/assets/images/rademade_admin/icons/ico-table-edit.png +0 -0
  38. data/app/assets/images/rademade_admin/icons/ico-table-new.png +0 -0
  39. data/app/assets/images/rademade_admin/icons/lens.png +0 -0
  40. data/app/assets/images/rademade_admin/icons/skin-nav-bullets.png +0 -0
  41. data/app/assets/images/rademade_admin/icons/table-icons.png +0 -0
  42. data/app/assets/images/rademade_admin/icons/table-img.png +0 -0
  43. data/app/assets/images/rademade_admin/jquery-ui/animated-overlay.gif +0 -0
  44. data/app/assets/images/rademade_admin/jquery-ui/slider-handler.png +0 -0
  45. data/app/assets/images/rademade_admin/jquery-ui/slider-handler2.png +0 -0
  46. data/app/assets/images/rademade_admin/jquery-ui/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  47. data/app/assets/images/rademade_admin/jquery-ui/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  48. data/app/assets/images/rademade_admin/jquery-ui/ui-bg_flat_10_000000_40x100.png +0 -0
  49. data/app/assets/images/rademade_admin/jquery-ui/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  50. data/app/assets/images/rademade_admin/jquery-ui/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  51. data/app/assets/images/rademade_admin/jquery-ui/ui-bg_glass_65_ffffff_1x400.png +0 -0
  52. data/app/assets/images/rademade_admin/jquery-ui/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  53. data/app/assets/images/rademade_admin/jquery-ui/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  54. data/app/assets/images/rademade_admin/jquery-ui/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  55. data/app/assets/images/rademade_admin/jquery-ui/ui-icons_222222_256x240.png +0 -0
  56. data/app/assets/images/rademade_admin/jquery-ui/ui-icons_228ef1_256x240.png +0 -0
  57. data/app/assets/images/rademade_admin/jquery-ui/ui-icons_ef8c08_256x240.png +0 -0
  58. data/app/assets/images/rademade_admin/jquery-ui/ui-icons_ffd27a_256x240.png +0 -0
  59. data/app/assets/images/rademade_admin/jquery-ui/ui-icons_ffffff_256x240.png +0 -0
  60. data/app/assets/images/rademade_admin/logos/logo-white.png +0 -0
  61. data/app/assets/images/rademade_admin/logos/logo.png +0 -0
  62. data/app/assets/images/rademade_admin/notifier-loader-clean.gif +0 -0
  63. data/app/assets/images/rademade_admin/notifier-loader-plastic.gif +0 -0
  64. data/app/assets/images/rademade_admin/placeholders/new-gallery-img.png +0 -0
  65. data/app/assets/images/rademade_admin/placeholders/no-img-gallery.png +0 -0
  66. data/app/assets/images/rademade_admin/select2/select2.png +0 -0
  67. data/app/assets/images/rademade_admin/select2/select2x2.png +0 -0
  68. data/app/assets/images/rademade_admin/select2/spinner.gif +0 -0
  69. data/app/assets/images/rademade_admin/uniform/bg-input-focus.png +0 -0
  70. data/app/assets/images/rademade_admin/uniform/bg-input.png +0 -0
  71. data/app/assets/images/rademade_admin/uniform/sprite.png +0 -0
  72. data/app/assets/javascripts/rademade_admin.coffee +14 -0
  73. data/app/assets/javascripts/rademade_admin/app/app.coffee +1 -0
  74. data/app/assets/javascripts/rademade_admin/app/common/dnd-sort.coffee +42 -0
  75. data/app/assets/javascripts/rademade_admin/app/common/pagination.coffee +6 -0
  76. data/app/assets/javascripts/rademade_admin/app/common/related-index.coffee +54 -0
  77. data/app/assets/javascripts/rademade_admin/app/common/relation-list.coffee +109 -0
  78. data/app/assets/javascripts/rademade_admin/app/common/sort-list.coffee +47 -0
  79. data/app/assets/javascripts/rademade_admin/app/common/uploader.coffee +53 -0
  80. data/app/assets/javascripts/rademade_admin/app/form-popup/collection.coffee +20 -0
  81. data/app/assets/javascripts/rademade_admin/app/form-popup/initializer.coffee +43 -0
  82. data/app/assets/javascripts/rademade_admin/app/form-popup/model.coffee +4 -0
  83. data/app/assets/javascripts/rademade_admin/app/form-popup/view.coffee +57 -0
  84. data/app/assets/javascripts/rademade_admin/app/forms/insert.coffee +7 -0
  85. data/app/assets/javascripts/rademade_admin/app/forms/login.coffee +4 -0
  86. data/app/assets/javascripts/rademade_admin/app/forms/remove.coffee +6 -0
  87. data/app/assets/javascripts/rademade_admin/app/notifier/initialize.js +31 -0
  88. data/app/assets/javascripts/rademade_admin/detail_admin/theme.js +56 -0
  89. data/app/assets/javascripts/rademade_admin/form/form-ajax-submit.coffee +153 -0
  90. data/app/assets/javascripts/rademade_admin/form/library/jquery.form-serialize.js +54 -0
  91. data/app/assets/javascripts/rademade_admin/form/library/jquery.form.js +1121 -0
  92. data/app/assets/javascripts/rademade_admin/form/library/jquery.formrestrict.js +27 -0
  93. data/app/assets/javascripts/rademade_admin/form/library/jquery.validate.js +1231 -0
  94. data/app/assets/javascripts/rademade_admin/form/library/jquery.validate.messages_ru.js +27 -0
  95. data/app/assets/javascripts/rademade_admin/library/backbone.js +1581 -0
  96. data/app/assets/javascripts/rademade_admin/library/bootstrap/bootstrap.datepicker.js +989 -0
  97. data/app/assets/javascripts/rademade_admin/library/bootstrap/bootstrap.js +1992 -0
  98. data/app/assets/javascripts/rademade_admin/library/ckeditor/config.js +12 -0
  99. data/app/assets/javascripts/rademade_admin/library/jquery/jquery-ui-1.10.4.custom.min.js +6 -0
  100. data/app/assets/javascripts/rademade_admin/library/jquery/jquery.dataTables.js +12099 -0
  101. data/app/assets/javascripts/rademade_admin/library/jquery/jquery.flot.js +2960 -0
  102. data/app/assets/javascripts/rademade_admin/library/jquery/jquery.flot.resize.js +60 -0
  103. data/app/assets/javascripts/rademade_admin/library/jquery/jquery.flot.stack.js +188 -0
  104. data/app/assets/javascripts/rademade_admin/library/jquery/jquery.knob.js +661 -0
  105. data/app/assets/javascripts/rademade_admin/library/jquery/jquery.tablednd.js +1 -0
  106. data/app/assets/javascripts/rademade_admin/library/jquery/jquery.uniform.min.js +1 -0
  107. data/app/assets/javascripts/rademade_admin/library/notifier.custom.js +431 -0
  108. data/app/assets/javascripts/rademade_admin/library/notifier.custom.min.js +15 -0
  109. data/app/assets/javascripts/rademade_admin/library/underscore.js +1276 -0
  110. data/app/assets/javascripts/rademade_admin/library/wysihtml5-0.3.0.js +9463 -0
  111. data/app/assets/stylesheets/rademade_admin.css +14 -0
  112. data/app/assets/stylesheets/rademade_admin/base.scss.erb +23 -0
  113. data/app/assets/stylesheets/rademade_admin/bootstrap/bootstrap-overrides.css.erb +341 -0
  114. data/app/assets/stylesheets/rademade_admin/bootstrap/bootstrap.css.erb +5911 -0
  115. data/app/assets/stylesheets/rademade_admin/bootstrap/main.scss.erb +78 -0
  116. data/app/assets/stylesheets/rademade_admin/detail_admin/chart-showcase.scss.erb +33 -0
  117. data/app/assets/stylesheets/rademade_admin/detail_admin/datatables.scss.erb +3 -0
  118. data/app/assets/stylesheets/rademade_admin/detail_admin/elements.scss.erb +665 -0
  119. data/app/assets/stylesheets/rademade_admin/detail_admin/error.scss.erb +19 -0
  120. data/app/assets/stylesheets/rademade_admin/detail_admin/form-showcase.scss.erb +87 -0
  121. data/app/assets/stylesheets/rademade_admin/detail_admin/form-wizard.scss.erb +261 -0
  122. data/app/assets/stylesheets/rademade_admin/detail_admin/gallery.scss.erb +106 -0
  123. data/app/assets/stylesheets/rademade_admin/detail_admin/grids.scss.erb +21 -0
  124. data/app/assets/stylesheets/rademade_admin/detail_admin/icons.scss.erb +115 -0
  125. data/app/assets/stylesheets/rademade_admin/detail_admin/index.scss.erb +290 -0
  126. data/app/assets/stylesheets/rademade_admin/detail_admin/layout.scss.erb +523 -0
  127. data/app/assets/stylesheets/rademade_admin/detail_admin/new-user.scss.erb +49 -0
  128. data/app/assets/stylesheets/rademade_admin/detail_admin/personal-info.scss.erb +144 -0
  129. data/app/assets/stylesheets/rademade_admin/detail_admin/popup.scss.erb +3 -0
  130. data/app/assets/stylesheets/rademade_admin/detail_admin/signin.scss.erb +128 -0
  131. data/app/assets/stylesheets/rademade_admin/detail_admin/tables.scss.erb +195 -0
  132. data/app/assets/stylesheets/rademade_admin/detail_admin/ui-elements.scss.erb +177 -0
  133. data/app/assets/stylesheets/rademade_admin/detail_admin/user-list.scss.erb +112 -0
  134. data/app/assets/stylesheets/rademade_admin/detail_admin/user-profile.scss.erb +169 -0
  135. data/app/assets/stylesheets/rademade_admin/detail_admin/web-app-icons.scss.erb +25 -0
  136. data/app/assets/stylesheets/rademade_admin/edit.css +7 -0
  137. data/app/assets/stylesheets/rademade_admin/file-upload.scss.erb +12 -0
  138. data/app/assets/stylesheets/rademade_admin/lib/bootstrap.datepicker.css.erb +302 -0
  139. data/app/assets/stylesheets/rademade_admin/lib/jquery-ui-1.10.2.custom.css.erb +544 -0
  140. data/app/assets/stylesheets/rademade_admin/lib/morris.css.erb +2 -0
  141. data/app/assets/stylesheets/rademade_admin/lib/select2.css.erb +513 -0
  142. data/app/assets/stylesheets/rademade_admin/lib/uniform.default.css.erb +366 -0
  143. data/app/assets/stylesheets/rademade_admin/notifier.custom.css.erb +661 -0
  144. data/app/assets/stylesheets/rademade_admin/scaffolds.scss.erb +32 -0
  145. data/app/controllers/rademade_admin/abstract_controller.rb +24 -0
  146. data/app/controllers/rademade_admin/admin_users_controller.rb +16 -0
  147. data/app/controllers/rademade_admin/application_controller.rb +7 -0
  148. data/app/controllers/rademade_admin/dashboard_controller.rb +16 -0
  149. data/app/controllers/rademade_admin/model_controller.rb +122 -0
  150. data/app/controllers/rademade_admin/sessions_controller.rb +22 -0
  151. data/app/helpers/rademade_admin/field_helper.rb +27 -0
  152. data/app/helpers/rademade_admin/form_helper.rb +63 -0
  153. data/app/helpers/rademade_admin/menu_helper.rb +45 -0
  154. data/app/helpers/rademade_admin/name_helper.rb +17 -0
  155. data/app/helpers/rademade_admin/upload_preview_helper.rb +59 -0
  156. data/app/helpers/rademade_admin/uri_helper.rb +104 -0
  157. data/app/inputs/rademade_admin/admin_file_input.rb +70 -0
  158. data/app/inputs/rademade_admin/admin_select_input.rb +81 -0
  159. data/app/inputs/rademade_admin/admin_textarea_input.rb +5 -0
  160. data/app/inputs/rademade_admin/boolean_input.rb +13 -0
  161. data/app/models/rademade_admin/ability.rb +39 -0
  162. data/app/models/rademade_admin/user.rb +6 -0
  163. data/app/serializers/autocomplete_serializer.rb +46 -0
  164. data/app/services/form_builder.rb +3 -0
  165. data/app/services/loader_service.rb +7 -0
  166. data/app/services/login.rb +18 -0
  167. data/app/services/login/error.rb +17 -0
  168. data/app/services/model_controller/instance_options.rb +38 -0
  169. data/app/services/model_controller/linker.rb +49 -0
  170. data/app/services/model_controller/model_options.rb +39 -0
  171. data/app/services/model_controller/notifier.rb +40 -0
  172. data/app/services/model_controller/templates.rb +27 -0
  173. data/app/services/saver.rb +69 -0
  174. data/app/services/search/conditions/abstract.rb +53 -0
  175. data/app/services/search/conditions/autocomplete.rb +44 -0
  176. data/app/services/search/conditions/list.rb +35 -0
  177. data/app/services/search/query_adapter/abstract.rb +54 -0
  178. data/app/services/search/query_adapter/active_record.rb +33 -0
  179. data/app/services/search/query_adapter/mongoid.rb +33 -0
  180. data/app/services/search/searcher.rb +19 -0
  181. data/app/services/sortable_service.rb +37 -0
  182. data/app/services/video_service.rb +22 -0
  183. data/app/views/layouts/rademade_admin.html.erb +13 -0
  184. data/app/views/rademade_admin/_blocks/_form_control.html.erb +5 -0
  185. data/app/views/rademade_admin/_blocks/_header.html.erb +30 -0
  186. data/app/views/rademade_admin/_blocks/_menu.html.erb +41 -0
  187. data/app/views/rademade_admin/_blocks/_pagination.html.erb +18 -0
  188. data/app/views/rademade_admin/_blocks/_sub_menu.html.erb +19 -0
  189. data/app/views/rademade_admin/_blocks/sub_menu/_link.html.erb +5 -0
  190. data/app/views/rademade_admin/_layouts/inner.html.erb +37 -0
  191. data/app/views/rademade_admin/_layouts/inner/form.html.erb +15 -0
  192. data/app/views/rademade_admin/_layouts/inner/index_table.html.erb +59 -0
  193. data/app/views/rademade_admin/_layouts/inner/related_index_table.html.erb +55 -0
  194. data/app/views/rademade_admin/abstract/_form.html.erb +10 -0
  195. data/app/views/rademade_admin/abstract/edit.html.erb +9 -0
  196. data/app/views/rademade_admin/abstract/form.html.erb +1 -0
  197. data/app/views/rademade_admin/abstract/index.html.erb +77 -0
  198. data/app/views/rademade_admin/abstract/new.html.erb +9 -0
  199. data/app/views/rademade_admin/abstract/related_index.html.erb +78 -0
  200. data/app/views/rademade_admin/dashboard/index.html.erb +9 -0
  201. data/app/views/rademade_admin/dashboard/login.html.erb +31 -0
  202. data/config/initializers/devise.rb +250 -0
  203. data/config/initializers/routes.rb +3 -0
  204. data/config/locales/devise.en.yml +59 -0
  205. data/config/routes.rb +17 -0
  206. data/lib/rademade_admin.rb +26 -0
  207. data/lib/rademade_admin/configuration.rb +17 -0
  208. data/lib/rademade_admin/engine.rb +22 -0
  209. data/lib/rademade_admin/file_info_formatter.rb +12 -0
  210. data/lib/rademade_admin/hrml_buffer.rb +14 -0
  211. data/lib/rademade_admin/model/configuration.rb +52 -0
  212. data/lib/rademade_admin/model/configuration/fields.rb +33 -0
  213. data/lib/rademade_admin/model/data_adapter.rb +59 -0
  214. data/lib/rademade_admin/model/data_adapter/active_record.rb +53 -0
  215. data/lib/rademade_admin/model/data_adapter/mongoid.rb +49 -0
  216. data/lib/rademade_admin/model/graph.rb +36 -0
  217. data/lib/rademade_admin/model/info.rb +106 -0
  218. data/lib/rademade_admin/model/reflection.rb +31 -0
  219. data/lib/rademade_admin/model/reflection/data.rb +47 -0
  220. data/lib/rademade_admin/model/reflection/uploader.rb +18 -0
  221. data/lib/rademade_admin/routing.rb +3 -0
  222. data/lib/rademade_admin/routing/mapper.rb +42 -0
  223. data/lib/rademade_admin/routing/resource.rb +6 -0
  224. data/lib/rademade_admin/sortable.rb +12 -0
  225. data/lib/rademade_admin/uploader/photo.rb +13 -0
  226. data/lib/rademade_admin/uploader/video.rb +11 -0
  227. data/lib/rademade_admin/user.rb +16 -0
  228. data/lib/rademade_admin/version.rb +3 -0
  229. data/lib/tasks/rademade_admin_tasks.rake +4 -0
  230. data/test/dummy/README.rdoc +28 -0
  231. data/test/dummy/Rakefile +6 -0
  232. data/test/dummy/app/assets/javascripts/application.js +13 -0
  233. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  234. data/test/dummy/app/controllers/application_controller.rb +5 -0
  235. data/test/dummy/app/controllers/rademade_admin/posts_controller.rb +9 -0
  236. data/test/dummy/app/controllers/rademade_admin/users_controller.rb +14 -0
  237. data/test/dummy/app/helpers/application_helper.rb +2 -0
  238. data/test/dummy/app/models/post.rb +9 -0
  239. data/test/dummy/app/models/user.rb +7 -0
  240. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  241. data/test/dummy/bin/bundle +3 -0
  242. data/test/dummy/bin/rails +4 -0
  243. data/test/dummy/bin/rake +4 -0
  244. data/test/dummy/config.ru +4 -0
  245. data/test/dummy/config/application.rb +29 -0
  246. data/test/dummy/config/boot.rb +5 -0
  247. data/test/dummy/config/environment.rb +5 -0
  248. data/test/dummy/config/environments/development.rb +29 -0
  249. data/test/dummy/config/environments/production.rb +80 -0
  250. data/test/dummy/config/environments/test.rb +36 -0
  251. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  252. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  253. data/test/dummy/config/initializers/inflections.rb +16 -0
  254. data/test/dummy/config/initializers/mime_types.rb +5 -0
  255. data/test/dummy/config/initializers/rademade_admin.rb +3 -0
  256. data/test/dummy/config/initializers/secret_token.rb +12 -0
  257. data/test/dummy/config/initializers/session_store.rb +3 -0
  258. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  259. data/test/dummy/config/locales/en.yml +23 -0
  260. data/test/dummy/config/mongoid.yml +6 -0
  261. data/test/dummy/config/routes.rb +8 -0
  262. data/test/dummy/db/development.sqlite3 +0 -0
  263. data/test/dummy/public/404.html +58 -0
  264. data/test/dummy/public/422.html +58 -0
  265. data/test/dummy/public/500.html +57 -0
  266. data/test/dummy/public/favicon.ico +0 -0
  267. data/test/integration/navigation_test.rb +10 -0
  268. data/test/rademade_admin_test.rb +7 -0
  269. data/test/test_helper.rb +15 -0
  270. metadata +691 -0
@@ -0,0 +1 @@
1
+ var hasTouch='ontouchstart'in document.documentElement,startEvent=hasTouch?'touchstart':'mousedown',moveEvent=hasTouch?'touchmove':'mousemove',endEvent=hasTouch?'touchend':'mouseup';if(hasTouch){$.each("touchstart touchmove touchend".split(" "),function(i,name){jQuery.event.fixHooks[name]=jQuery.event.mouseHooks});alert("has Touch")}jQuery.tableDnD={currentTable:null,dragObject:null,mouseOffset:null,oldY:0,build:function(options){this.each(function(){this.tableDnDConfig=jQuery.extend({onDragStyle:null,onDropStyle:null,onDragClass:"tDnD_whileDrag",onDrop:null,onDragStart:null,scrollAmount:5,serializeRegexp:/[^\-]*$/,serializeParamName:null,dragHandle:null},options||{});jQuery.tableDnD.makeDraggable(this)});return this},makeDraggable:function(table){var config=table.tableDnDConfig;if(config.dragHandle){var cells=jQuery(table.tableDnDConfig.dragHandle,table);cells.each(function(){jQuery(this).bind(startEvent,function(ev){jQuery.tableDnD.initialiseDrag(jQuery(this).parents('tr')[0],table,this,ev,config);return false})})}else{var rows=jQuery("tr",table);rows.each(function(){var row=jQuery(this);if(!row.hasClass("nodrag")){row.bind(startEvent,function(ev){if(ev.target.tagName=="TD"){jQuery.tableDnD.initialiseDrag(this,table,this,ev,config);return false}}).css("cursor","move")}})}},initialiseDrag:function(dragObject,table,target,evnt,config){jQuery.tableDnD.dragObject=dragObject;jQuery.tableDnD.currentTable=table;jQuery.tableDnD.mouseOffset=jQuery.tableDnD.getMouseOffset(target,evnt);jQuery.tableDnD.originalOrder=jQuery.tableDnD.serialize();jQuery(document).bind(moveEvent,jQuery.tableDnD.mousemove).bind(endEvent,jQuery.tableDnD.mouseup);if(config.onDragStart){config.onDragStart(table,target)}},updateTables:function(){this.each(function(){if(this.tableDnDConfig){jQuery.tableDnD.makeDraggable(this)}})},mouseCoords:function(ev){if(ev.pageX||ev.pageY){return{x:ev.pageX,y:ev.pageY}}return{x:ev.clientX+document.body.scrollLeft-document.body.clientLeft,y:ev.clientY+document.body.scrollTop-document.body.clientTop}},getMouseOffset:function(target,ev){ev=ev||window.event;var docPos=this.getPosition(target);var mousePos=this.mouseCoords(ev);return{x:mousePos.x-docPos.x,y:mousePos.y-docPos.y}},getPosition:function(e){var left=0;var top=0;if(e.offsetHeight==0){e=e.firstChild}while(e.offsetParent){left+=e.offsetLeft;top+=e.offsetTop;e=e.offsetParent}left+=e.offsetLeft;top+=e.offsetTop;return{x:left,y:top}},mousemove:function(ev){if(jQuery.tableDnD.dragObject==null){return}if(ev.type=='touchmove'){event.preventDefault()}var dragObj=jQuery(jQuery.tableDnD.dragObject);var config=jQuery.tableDnD.currentTable.tableDnDConfig;var mousePos=jQuery.tableDnD.mouseCoords(ev);var y=mousePos.y-jQuery.tableDnD.mouseOffset.y;var yOffset=window.pageYOffset;if(document.all){if(typeof document.compatMode!='undefined'&&document.compatMode!='BackCompat'){yOffset=document.documentElement.scrollTop}else if(typeof document.body!='undefined'){yOffset=document.body.scrollTop}}if(mousePos.y-yOffset<config.scrollAmount){window.scrollBy(0,-config.scrollAmount)}else{var windowHeight=window.innerHeight?window.innerHeight:document.documentElement.clientHeight?document.documentElement.clientHeight:document.body.clientHeight;if(windowHeight-(mousePos.y-yOffset)<config.scrollAmount){window.scrollBy(0,config.scrollAmount)}}if(y!=jQuery.tableDnD.oldY){var movingDown=y>jQuery.tableDnD.oldY;jQuery.tableDnD.oldY=y;if(config.onDragClass){dragObj.addClass(config.onDragClass)}else{dragObj.css(config.onDragStyle)}var currentRow=jQuery.tableDnD.findDropTargetRow(dragObj,y);if(currentRow){if(movingDown&&jQuery.tableDnD.dragObject!=currentRow){jQuery.tableDnD.dragObject.parentNode.insertBefore(jQuery.tableDnD.dragObject,currentRow.nextSibling)}else if(!movingDown&&jQuery.tableDnD.dragObject!=currentRow){jQuery.tableDnD.dragObject.parentNode.insertBefore(jQuery.tableDnD.dragObject,currentRow)}}}return false},findDropTargetRow:function(draggedRow,y){var rows=jQuery.tableDnD.currentTable.rows;for(var i=0;i<rows.length;i++){var row=rows[i];var rowY=this.getPosition(row).y;var rowHeight=parseInt(row.offsetHeight)/2;if(row.offsetHeight==0){rowY=this.getPosition(row.firstChild).y;rowHeight=parseInt(row.firstChild.offsetHeight)/2}if((y>rowY-rowHeight)&&(y<(rowY+rowHeight))){if(row==draggedRow){return null}var config=jQuery.tableDnD.currentTable.tableDnDConfig;if(config.onAllowDrop){if(config.onAllowDrop(draggedRow,row)){return row}else{return null}}else{var nodrop=jQuery(row).hasClass("nodrop");if(!nodrop){return row}else{return null}}return row}}return null},mouseup:function(e){if(jQuery.tableDnD.currentTable&&jQuery.tableDnD.dragObject){jQuery(document).unbind(moveEvent,jQuery.tableDnD.mousemove).unbind(endEvent,jQuery.tableDnD.mouseup);var droppedRow=jQuery.tableDnD.dragObject;var config=jQuery.tableDnD.currentTable.tableDnDConfig;if(config.onDragClass){jQuery(droppedRow).removeClass(config.onDragClass)}else{jQuery(droppedRow).css(config.onDropStyle)}jQuery.tableDnD.dragObject=null;var newOrder=jQuery.tableDnD.serialize();if(config.onDrop&&(jQuery.tableDnD.originalOrder!=newOrder)){config.onDrop(jQuery.tableDnD.currentTable,droppedRow)}jQuery.tableDnD.currentTable=null}},serialize:function(){if(jQuery.tableDnD.currentTable){return jQuery.tableDnD.serializeTable(jQuery.tableDnD.currentTable)}else{return"Error: No Table id set, you need to set an id on your table and every row"}},serializeTable:function(table){var result="";var tableId=table.id;var rows=table.rows;for(var i=0;i<rows.length;i++){if(result.length>0)result+="&";var rowId=rows[i].id;if(rowId&&rowId&&table.tableDnDConfig&&table.tableDnDConfig.serializeRegexp){rowId=rowId.match(table.tableDnDConfig.serializeRegexp)[0]}result+=tableId+'[]='+rowId}return result},serializeTables:function(){var result="";this.each(function(){result+=jQuery.tableDnD.serializeTable(this)});return result}};jQuery.fn.extend({tableDnD:jQuery.tableDnD.build,tableDnDUpdate:jQuery.tableDnD.updateTables,tableDnDSerialize:jQuery.tableDnD.serializeTables});
@@ -0,0 +1 @@
1
+ (function(e,t){"use strict";function n(e){var t=Array.prototype.slice.call(arguments,1);return e.prop?e.prop.apply(e,t):e.attr.apply(e,t)}function s(e,t,n){var s,a;for(s in n)n.hasOwnProperty(s)&&(a=s.replace(/ |$/g,t.eventNamespace),e.bind(a,n[s]))}function a(e,t,n){s(e,n,{focus:function(){t.addClass(n.focusClass)},blur:function(){t.removeClass(n.focusClass),t.removeClass(n.activeClass)},mouseenter:function(){t.addClass(n.hoverClass)},mouseleave:function(){t.removeClass(n.hoverClass),t.removeClass(n.activeClass)},"mousedown touchbegin":function(){e.is(":disabled")||t.addClass(n.activeClass)},"mouseup touchend":function(){t.removeClass(n.activeClass)}})}function i(e,t){e.removeClass(t.hoverClass+" "+t.focusClass+" "+t.activeClass)}function r(e,t,n){n?e.addClass(t):e.removeClass(t)}function l(e,t,n){var s="checked",a=t.is(":"+s);t.prop?t.prop(s,a):a?t.attr(s,s):t.removeAttr(s),r(e,n.checkedClass,a)}function u(e,t,n){r(e,n.disabledClass,t.is(":disabled"))}function o(e,t,n){switch(n){case"after":return e.after(t),e.next();case"before":return e.before(t),e.prev();case"wrap":return e.wrap(t),e.parent()}return null}function c(t,s,a){var i,r,l;return a||(a={}),a=e.extend({bind:{},divClass:null,divWrap:"wrap",spanClass:null,spanHtml:null,spanWrap:"wrap"},a),i=e("<div />"),r=e("<span />"),s.autoHide&&t.is(":hidden")&&"none"===t.css("display")&&i.hide(),a.divClass&&i.addClass(a.divClass),s.wrapperClass&&i.addClass(s.wrapperClass),a.spanClass&&r.addClass(a.spanClass),l=n(t,"id"),s.useID&&l&&n(i,"id",s.idPrefix+"-"+l),a.spanHtml&&r.html(a.spanHtml),i=o(t,i,a.divWrap),r=o(t,r,a.spanWrap),u(i,t,s),{div:i,span:r}}function d(t,n){var s;return n.wrapperClass?(s=e("<span />").addClass(n.wrapperClass),s=o(t,s,"wrap")):null}function f(){var t,n,s,a;return a="rgb(120,2,153)",n=e('<div style="width:0;height:0;color:'+a+'">'),e("body").append(n),s=n.get(0),t=window.getComputedStyle?window.getComputedStyle(s,"").color:(s.currentStyle||s.style||{}).color,n.remove(),t.replace(/ /g,"")!==a}function p(t){return t?e("<span />").text(t).html():""}function m(){return navigator.cpuClass&&!navigator.product}function v(){return window.XMLHttpRequest!==void 0?!0:!1}function h(e){var t;return e[0].multiple?!0:(t=n(e,"size"),!t||1>=t?!1:!0)}function C(){return!1}function w(e,t){var n="none";s(e,t,{"selectstart dragstart mousedown":C}),e.css({MozUserSelect:n,msUserSelect:n,webkitUserSelect:n,userSelect:n})}function b(e,t,n){var s=e.val();""===s?s=n.fileDefaultHtml:(s=s.split(/[\/\\]+/),s=s[s.length-1]),t.text(s)}function y(e,t,n){var s,a;for(s=[],e.each(function(){var e;for(e in t)Object.prototype.hasOwnProperty.call(t,e)&&(s.push({el:this,name:e,old:this.style[e]}),this.style[e]=t[e])}),n();s.length;)a=s.pop(),a.el.style[a.name]=a.old}function g(e,t){var n;n=e.parents(),n.push(e[0]),n=n.not(":visible"),y(n,{visibility:"hidden",display:"block",position:"absolute"},t)}function k(e,t){return function(){e.unwrap().unwrap().unbind(t.eventNamespace)}}var H=!0,x=!1,A=[{match:function(e){return e.is("a, button, :submit, :reset, input[type='button']")},apply:function(e,t){var r,l,o,d,f;return l=t.submitDefaultHtml,e.is(":reset")&&(l=t.resetDefaultHtml),d=e.is("a, button")?function(){return e.html()||l}:function(){return p(n(e,"value"))||l},o=c(e,t,{divClass:t.buttonClass,spanHtml:d()}),r=o.div,a(e,r,t),f=!1,s(r,t,{"click touchend":function(){var t,s,a,i;f||e.is(":disabled")||(f=!0,e[0].dispatchEvent?(t=document.createEvent("MouseEvents"),t.initEvent("click",!0,!0),s=e[0].dispatchEvent(t),e.is("a")&&s&&(a=n(e,"target"),i=n(e,"href"),a&&"_self"!==a?window.open(i,a):document.location.href=i)):e.click(),f=!1)}}),w(r,t),{remove:function(){return r.after(e),r.remove(),e.unbind(t.eventNamespace),e},update:function(){i(r,t),u(r,e,t),e.detach(),o.span.html(d()).append(e)}}}},{match:function(e){return e.is(":checkbox")},apply:function(e,t){var n,r,o;return n=c(e,t,{divClass:t.checkboxClass}),r=n.div,o=n.span,a(e,r,t),s(e,t,{"click touchend":function(){l(o,e,t)}}),l(o,e,t),{remove:k(e,t),update:function(){i(r,t),o.removeClass(t.checkedClass),l(o,e,t),u(r,e,t)}}}},{match:function(e){return e.is(":file")},apply:function(t,r){function l(){b(t,p,r)}var d,f,p,v;return d=c(t,r,{divClass:r.fileClass,spanClass:r.fileButtonClass,spanHtml:r.fileButtonHtml,spanWrap:"after"}),f=d.div,v=d.span,p=e("<span />").html(r.fileDefaultHtml),p.addClass(r.filenameClass),p=o(t,p,"after"),n(t,"size")||n(t,"size",f.width()/10),a(t,f,r),l(),m()?s(t,r,{click:function(){t.trigger("change"),setTimeout(l,0)}}):s(t,r,{change:l}),w(p,r),w(v,r),{remove:function(){return p.remove(),v.remove(),t.unwrap().unbind(r.eventNamespace)},update:function(){i(f,r),b(t,p,r),u(f,t,r)}}}},{match:function(e){if(e.is("input")){var t=(" "+n(e,"type")+" ").toLowerCase(),s=" color date datetime datetime-local email month number password search tel text time url week ";return s.indexOf(t)>=0}return!1},apply:function(e,t){var s,i;return s=n(e,"type"),e.addClass(t.inputClass),i=d(e,t),a(e,e,t),t.inputAddTypeAsClass&&e.addClass(s),{remove:function(){e.removeClass(t.inputClass),t.inputAddTypeAsClass&&e.removeClass(s),i&&e.unwrap()},update:C}}},{match:function(e){return e.is(":radio")},apply:function(t,r){var o,d,f;return o=c(t,r,{divClass:r.radioClass}),d=o.div,f=o.span,a(t,d,r),s(t,r,{"click touchend":function(){e.uniform.update(e(':radio[name="'+n(t,"name")+'"]'))}}),l(f,t,r),{remove:k(t,r),update:function(){i(d,r),l(f,t,r),u(d,t,r)}}}},{match:function(e){return e.is("select")&&!h(e)?!0:!1},apply:function(t,n){var r,l,o,d;return n.selectAutoWidth&&g(t,function(){d=t.width()}),r=c(t,n,{divClass:n.selectClass,spanHtml:(t.find(":selected:first")||t.find("option:first")).html(),spanWrap:"before"}),l=r.div,o=r.span,n.selectAutoWidth?g(t,function(){y(e([o[0],l[0]]),{display:"block"},function(){var e;e=o.outerWidth()-o.width(),l.width(d+e),o.width(d)})}):l.addClass("fixedWidth"),a(t,l,n),s(t,n,{change:function(){o.html(t.find(":selected").html()),l.removeClass(n.activeClass)},"click touchend":function(){var e=t.find(":selected").html();o.html()!==e&&t.trigger("change")},keyup:function(){o.html(t.find(":selected").html())}}),w(o,n),{remove:function(){return o.remove(),t.unwrap().unbind(n.eventNamespace),t},update:function(){n.selectAutoWidth?(e.uniform.restore(t),t.uniform(n)):(i(l,n),o.html(t.find(":selected").html()),u(l,t,n))}}}},{match:function(e){return e.is("select")&&h(e)?!0:!1},apply:function(e,t){var n;return e.addClass(t.selectMultiClass),n=d(e,t),a(e,e,t),{remove:function(){e.removeClass(t.selectMultiClass),n&&e.unwrap()},update:C}}},{match:function(e){return e.is("textarea")},apply:function(e,t){var n;return e.addClass(t.textareaClass),n=d(e,t),a(e,e,t),{remove:function(){e.removeClass(t.textareaClass),n&&e.unwrap()},update:C}}}];m()&&!v()&&(H=!1),e.uniform={defaults:{activeClass:"active",autoHide:!0,buttonClass:"button",checkboxClass:"checker",checkedClass:"checked",disabledClass:"disabled",eventNamespace:".uniform",fileButtonClass:"action",fileButtonHtml:"Choose File",fileClass:"uploader",fileDefaultHtml:"No file selected",filenameClass:"filename",focusClass:"focus",hoverClass:"hover",idPrefix:"uniform",inputAddTypeAsClass:!0,inputClass:"uniform-input",radioClass:"radio",resetDefaultHtml:"Reset",resetSelector:!1,selectAutoWidth:!0,selectClass:"selector",selectMultiClass:"uniform-multiselect",submitDefaultHtml:"Submit",textareaClass:"uniform",useID:!0,wrapperClass:null},elements:[]},e.fn.uniform=function(t){var n=this;return t=e.extend({},e.uniform.defaults,t),x||(x=!0,f()&&(H=!1)),H?(t.resetSelector&&e(t.resetSelector).mouseup(function(){window.setTimeout(function(){e.uniform.update(n)},10)}),this.each(function(){var n,s,a,i=e(this);if(i.data("uniformed"))return e.uniform.update(i),void 0;for(n=0;A.length>n;n+=1)if(s=A[n],s.match(i,t))return a=s.apply(i,t),i.data("uniformed",a),e.uniform.elements.push(i.get(0)),void 0})):this},e.uniform.restore=e.fn.uniform.restore=function(n){n===t&&(n=e.uniform.elements),e(n).each(function(){var t,n,s=e(this);n=s.data("uniformed"),n&&(n.remove(),t=e.inArray(this,e.uniform.elements),t>=0&&e.uniform.elements.splice(t,1),s.removeData("uniformed"))})},e.uniform.update=e.fn.uniform.update=function(n){n===t&&(n=e.uniform.elements),e(n).each(function(){var t,n=e(this);t=n.data("uniformed"),t&&t.update(n,t.options)})}})(jQuery);
@@ -0,0 +1,431 @@
1
+ /*!
2
+ * Backbone.Notifier.js v0.2.5
3
+ * Copyright 2012, Eyal Weiss
4
+ * Backbone.Notifier.js may be freely distributed under the MIT license.
5
+ */
6
+ (function ($, Backbone, _) {
7
+ var emptyFn = function () {},
8
+ Notifier = Backbone.Notifier = Backbone.Model.extend({
9
+ defaults: {
10
+ 'baseCls': 'notifier',
11
+ 'types': ['warning', 'error', 'info', 'success'], // available notification styles
12
+ 'dialog': false, // whether display the notification with a title bar and a dialog style (sets 'hideOnClick' to false, unless defined)
13
+ 'theme': 'plastic', // default theme for notifications (currently available: 'plastic' / 'clean').
14
+ 'message': '', // message content
15
+ 'closeBtn': false,
16
+ 'title': undefined, // notification title, if defined causes the notification to be 'dialog' (unless dialog is 'false')
17
+ 'hideOnClick': true, // whether to hide the notifications on mouse click
18
+ 'type': null, // default notification style (null / 'warning' / 'error' / 'info' / 'success')
19
+ 'cls': null, // additional css class
20
+ 'ms': 10000, // milliseconds before hiding
21
+ 'loader': false, // whether to display loader animation in notifactions
22
+ 'destroy': false, // notification or selector of nofications to hide on show
23
+ 'modal': false, // whether to dark and block the UI behind the nofication
24
+ 'opacity': 1, // opacity of nofications
25
+ 'offsetY': 0, // distance between the notifications and the top/bottom edge
26
+ 'fadeInMs': 500, // duration (milliseconds) of notification's fade-in effect
27
+ 'fadeOutMs': 500, // duration (milliseconds) of notification's fade-out effect
28
+ 'position': 'top', // default notifications position ('top' / 'center' / 'bottom')
29
+ 'screenOpacity': .65, // opacity of dark screen background that goes behind for modals (between 0 to 1)
30
+ 'zIndex': 10000, // minimal z-index for notifications
31
+ 'width': undefined, // notification's width
32
+ 'modules': undefined // modules to register immediately
33
+ },
34
+ transitions: {
35
+ top: {
36
+ 'in': function (el, inner, options, duration, callback) {
37
+ el.css({display: 'block', top: -1000});
38
+ el.css({top: -inner.innerHeight()})
39
+ .animate({top: options.offsetY, opacity: options.opacity}, duration, callback || emptyFn);
40
+ },
41
+ 'out': function (el, inner, options, duration, callback) {
42
+ el.animate({top: -inner.innerHeight(), opacity: 0}, duration, callback || emptyFn);
43
+ }
44
+ },
45
+ center: {
46
+ 'in': function (el, inner, options, duration, callback) {
47
+ el.css({top: options.offsetY - 40, display: 'block'})
48
+ .animate({ top: '50%', marginTop: -inner.innerHeight() / 2, opacity: options.opacity}, duration, callback || emptyFn);
49
+ },
50
+ 'out': function (el, inner, options, duration, callback) {
51
+ el.animate({top: '0%', opacity: 0}, duration, callback || emptyFn);
52
+ }
53
+ },
54
+ bottom: {
55
+ 'in': function (el, inner, options, duration, callback) {
56
+ el.css({bottom: options.offsetY - 40, top: 'auto', display: 'block'})
57
+ .animate({bottom: inner.innerHeight() + options.offsetY, opacity: options.opacity}, duration, callback || emptyFn);
58
+ },
59
+ 'out': function (el, inner, options, duration, callback) {
60
+ el.animate({bottom: -inner.height(), opacity: 0}, duration, callback || emptyFn);
61
+ }
62
+ }
63
+ },
64
+ template: function (settings) { //function(settings){ ... return html; }
65
+ var strBuilder = [
66
+ '<div class="' + settings.wrapperCls + '">',
67
+ '<div class="' + settings.innerCls + '">',
68
+ (settings.title ? '<div class="' + settings.baseCls + '-title">' + settings.title + '</div>' : ''),
69
+ (settings.closeBtn ? '<button class="' + settings.baseCls + '-close" data-handler="destroy"><span>x</span></button>' : '')
70
+ ];
71
+ if (settings.dialog) {
72
+ strBuilder.push(
73
+ '<div class="' + settings.baseCls + '-message">' + settings.message +
74
+ (settings.loader ? '<div class="' + settings.baseCls + '-loader"></div>' : '') +
75
+ '</div>'
76
+ );
77
+ } else {
78
+ strBuilder.push(
79
+ '<div class="' + settings.baseCls + '-message">' + settings.message + '</div>',
80
+ (settings.loader ? '<div class="' + settings.baseCls + '-loader"></div>' : '')
81
+ );
82
+ }
83
+ if (settings.buttons) {
84
+ var btnPh = $('<div />');
85
+ _.each(settings.buttons, function (btn) {
86
+ btnPh.append($('<button/>', btn));
87
+ });
88
+ strBuilder.push('<div class="' + settings.baseCls + '-btns">' + btnPh.html() + '</div>');
89
+ }
90
+ strBuilder.push('</div></div>');
91
+ return strBuilder.join('');
92
+ },
93
+ initEl: function () {
94
+ var el = this.el ? this.el : 'body',
95
+ $el = _.isObject(el) ? el : $(el);
96
+ if (!$el.length) {
97
+ return $($.proxy(this.initEl, this));
98
+ }
99
+ this.$el = $el;
100
+ this._cssPos = ($el.get(0) === document.body) ? 'fixed' : 'absolute';
101
+ ($el.get(0) !== document.body) && $el.css('position', 'relative');
102
+ if (this._cssPos === 'absolute') {
103
+ $el.css('overflow', 'hidden');
104
+ }
105
+ },
106
+ initialize: function (options) {
107
+ var scope = this;
108
+ this.el = options && options.el;
109
+ this.initEl.call(this, options && options.el);
110
+
111
+ this.current = {};
112
+ scope.NotificationView = Backbone.View.extend({
113
+ defaults: scope.attributes,
114
+ on: function (eventName, handler) {
115
+ var fn = handler,
116
+ view = this;
117
+ if (_.isString(handler)) {
118
+ fn = function () {
119
+ view[handler].apply(view, arguments);
120
+ };
121
+ }
122
+ return Backbone.View.prototype.on.call(this, eventName, fn);
123
+ }
124
+ });
125
+
126
+ var notifyFn = function (type, opts) {
127
+ if (_.isString(opts)) {
128
+ opts = {message: opts};
129
+ }
130
+ var o = _.extend({}, {'type': ''}, opts);
131
+ o.type = o.type ? type + ' ' + o.type : type;
132
+ return scope.notify(o);
133
+ };
134
+
135
+ var createNotifyFn = function (type) {
136
+ scope[type] = scope[type] || function (opts) {
137
+ return notifyFn(type, opts);
138
+ };
139
+ };
140
+
141
+ _.each(scope.attributes.types, function (type) {
142
+ createNotifyFn(type);
143
+ });
144
+
145
+ if (scope.attributes) {
146
+ var initialModules = this.attributes.modules;
147
+ initialModules && $.each(initialModules, function (mName, m) {
148
+ m.name = _.isArray(initialModules) ? m.name : mName;
149
+ Notifier.regModule(m);
150
+ });
151
+ scope.attributes.modules = undefined;
152
+ }
153
+ },
154
+ calcZIndex: function () {
155
+ if (this._cssPos === 'absolute') {
156
+ return this.attributes.zIndex;
157
+ }
158
+ var z = this.attributes.zIndex + 1,
159
+ scope = this;
160
+ _.each(scope.current, function (view) {
161
+ z = view.zIndex > z ? view.zIndex : z;
162
+ });
163
+ return ++z;
164
+ },
165
+ destroyAll: function (keyFilter, valueFilter) {
166
+ var i = 0,
167
+ scope = this;
168
+ if (_.isFunction(keyFilter)) {
169
+ _.each(scope.current, function (view) {
170
+ if (keyFilter(view)) {
171
+ view.destroy.call(view);
172
+ i++;
173
+ }
174
+ });
175
+ } else if (keyFilter !== undefined) {
176
+ _.each(scope.current, function (view) {
177
+ if (view.settings[keyFilter] === valueFilter) {
178
+ view.destroy.call(view);
179
+ i++;
180
+ }
181
+ });
182
+ } else {
183
+ _.each(scope.current, function (view) {
184
+ view.destroy.call(view);
185
+ i++;
186
+ });
187
+ }
188
+ return i;
189
+ },
190
+ getWrapperCls: function (settings) {
191
+ var c = (settings.baseCls + ' ') +
192
+ (settings.type ? settings.type + ' ' : '') +
193
+ ('theme-' + settings.theme + ' ') +
194
+ (settings.dialog ? 'dialog ' : '') +
195
+ ('pos-' + settings.position + ' ') +
196
+ (settings.buttons ? 'with-buttons ' : '') +
197
+ (settings.loader ? 'with-loader ' : '') +
198
+ (settings.closeBtn ? 'with-close-btn ' : '');
199
+ return $.trim(c).split(' ').join(' ' + settings.baseCls + '-') +
200
+ ' ' + (settings.cls || '');
201
+ },
202
+ getSettings: function (options) {
203
+ if (_.isString(options)) {
204
+ options = {message: options};
205
+ }
206
+ var settings = $.extend({}, this.attributes, options);
207
+ if (settings.title && options.dialog === undefined) {
208
+ settings.dialog = true;
209
+ }
210
+ if ((settings.modal || settings.dialog) && options.hideOnClick === undefined) {
211
+ settings.hideOnClick = false;
212
+ }
213
+ if (settings.dialog && options.ms === undefined) {
214
+ settings.ms = null;
215
+ }
216
+ if (settings.dialog && options.position === undefined) {
217
+ settings.position = 'center';
218
+ }
219
+ return settings;
220
+ },
221
+ notify: function (options) {
222
+ options = options || {};
223
+ if (options.el) {
224
+ this.el = options && options.el;
225
+ this.initEl.call(this, options && options.el);
226
+ }
227
+ var scope = this,
228
+ settings = this.getSettings(options);
229
+ if (_.isObject(settings.destroy)) {
230
+ if (settings.destroy instanceof scope.NotificationView) {
231
+ settings.destroy.destroy();
232
+ } else {
233
+ scope.destroyAll.apply(scope, _.isArray(settings.destroy) ? settings.destroy : [settings.destroy]);
234
+ }
235
+ } else if (settings.destroy === true) {
236
+ scope.destroyAll();
237
+ }
238
+ var zIndex = options.zIndex || scope.calcZIndex.call(scope);
239
+
240
+ settings.wrapperCls = scope.getWrapperCls(settings);
241
+ settings.innerCls = settings.baseCls + '-inner';
242
+
243
+ var msgEl = $(scope.template(settings)),
244
+ msgInner = msgEl.find('.' + settings.innerCls);
245
+ settings.width && msgInner.css({width: settings.width});
246
+ Notifier._modulesBinder.trigger('beforeAppendMsgEl', scope, settings, msgEl, msgInner);
247
+ msgEl.css({display: 'none', opacity: 0, position: scope._cssPos, zIndex: settings.modal ? ++zIndex : zIndex}).prependTo(scope.$el);
248
+ var msgView = new scope.NotificationView({
249
+ el: msgEl
250
+ });
251
+ msgView.settings = settings;
252
+
253
+ if (settings.buttons || msgInner.find('button').length) {
254
+ msgInner.on('click', 'button[data-handler]', function () {
255
+ var handler = $(this).data('handler'),
256
+ fn = _.isFunction(handler) ? handler : msgView[handler];
257
+ fn.apply(msgView, arguments);
258
+ });
259
+ msgInner.on('button click', function (e) {
260
+ msgView.trigger('click:' + $(e.target).data('role'));
261
+ });
262
+ }
263
+
264
+ var removeFn = msgView.destroy = function (e) {
265
+ if (_.isObject(e) && e.preventDefault) {
266
+ e.preventDefault();
267
+ e.stopPropagation();
268
+ }
269
+ msgView.trigger('beforeHide', msgView, msgEl);
270
+ settings.modal && msgView.screenEl.fadeOut(300, function () {
271
+ msgView.trigger('screenHide', msgView, msgEl);
272
+ msgView.screenEl.remove();
273
+ });
274
+
275
+ Notifier._modulesBinder.trigger('beforeHideMsgEl', scope, settings, msgEl, msgInner, msgView);
276
+ var outAnimFn = $.isFunction(settings.out) ? settings.out : scope.transitions[settings.position].out;
277
+ outAnimFn.call(scope, msgEl, msgInner, settings, settings.fadeOutMs, function () {
278
+ msgView.remove();
279
+ msgView.trigger('destroy', msgView, msgEl);
280
+ Notifier._modulesBinder.trigger('afterDestroyMsgEl', scope, settings, msgEl, msgInner, msgView);
281
+ _.isFunction(e) && e.call(msgView, msgView, msgEl);
282
+ });
283
+ if (msgView.timeoutId) {
284
+ clearTimeout(msgView.timeoutId);
285
+ }
286
+ delete msgView.timeoutId;
287
+ delete scope.current[msgView.cid];
288
+ };
289
+
290
+ var preventDefaultFn = function (e) {
291
+ if (e) {
292
+ e.preventDefault();
293
+ e.stopPropagation();
294
+ }
295
+ };
296
+
297
+ if (settings.modal) {
298
+ msgView.screenEl = $('<div/>', {
299
+ 'class': settings.baseCls + '-screen ' + settings.baseCls + '-theme-' + settings.theme,
300
+ css: { position: scope._cssPos, top: 0, left: 0, width: '100%', height: '100%', opacity: 0, zIndex: zIndex - 1 }
301
+ }).prependTo(scope.$el)
302
+ .click(function (e) {
303
+ e.preventDefault();
304
+ e.stopPropagation();
305
+ return false;
306
+ }).fadeTo(300, settings.screenOpacity);
307
+
308
+ }
309
+
310
+ if (settings.ms > 0 || settings.ms === 0) {
311
+ msgView.timeoutId = setTimeout(function () {
312
+ msgView.trigger('timeout', msgView, msgEl);
313
+ removeFn();
314
+ }, settings.ms);
315
+ }
316
+
317
+ msgInner.click(settings.hideOnClick ? removeFn : preventDefaultFn);
318
+
319
+ settings.css && msgInner.css(settings.css);
320
+ var animateFn = $.isFunction(settings['in']) ? settings['in'] : scope.transitions[settings.position]['in'];
321
+ scope.current[msgView.cid] = msgView;
322
+ msgView.zIndex = zIndex;
323
+
324
+ Notifier._modulesBinder.trigger('beforeAnimateInMsgEl', scope, settings, msgEl, msgInner, msgView);
325
+ animateFn.call(scope, msgEl, msgInner, settings, settings.fadeInMs, function () {
326
+ Notifier._modulesBinder.trigger('afterAnimateInMsgEl', scope, settings, msgEl, msgInner, msgView);
327
+ });
328
+ return msgView;
329
+ }
330
+ });
331
+
332
+
333
+ // ====================== Modules mechanism ======================
334
+ Notifier.getModule = function (moduleName) {
335
+ return (_.isObject(moduleName)) ? moduleName : Notifier.modules[moduleName];
336
+ };
337
+
338
+ var modulesBinder = {},
339
+ shift = Array.prototype.shift;
340
+ _.extend(modulesBinder, Backbone.Events);
341
+ Notifier._modulesBinder = modulesBinder;
342
+
343
+ Notifier.regModule = function (moduleName, m) {
344
+ if (arguments.length === 1) {
345
+ m = $.isFunction(moduleName) ? moduleName() : moduleName;
346
+ moduleName = m.name;
347
+ } else {
348
+ m = $.isFunction(m) ? m() : m;
349
+ m.name = moduleName;
350
+ }
351
+ if (!moduleName) {
352
+ throw('module name is not defined.');
353
+ }
354
+ if (m.extend) {
355
+ $.each(m.extend, function (k, v) {
356
+ var orig = Notifier.prototype[k];
357
+ if (_.isFunction(v) || orig === undefined) {
358
+ Notifier.prototype[k] = function () {
359
+ return v.apply({scope: this, supr: orig, module: m}, arguments);
360
+ };
361
+ } else if (!_.isObject(v)) {
362
+ Notifier.prototype[k] = v;
363
+ } else {
364
+ Notifier.prototype[k] = $.extend(true, {}, orig, v);
365
+ }
366
+ });
367
+ }
368
+ (Notifier.modules = Notifier.modules || {})[moduleName] = m;
369
+ $.isFunction(m.register) && m.register.call(m, Notifier);
370
+ m.enabled && Notifier.enableModule(m);
371
+ return m;
372
+ };
373
+
374
+ Notifier.enableModule = function (moduleName) {
375
+ var m = Notifier.getModule(moduleName);
376
+ if (m) {
377
+ m._handlers = m._handlers || {};
378
+ m.events && $.each(m.events, function (k, fn) {
379
+ var handler = m._handlers[k] = function () {
380
+ var notifier = shift.call(arguments);
381
+ fn.apply({module: m, scope: notifier}, arguments);
382
+ };
383
+ Notifier._modulesBinder.on(k, handler);
384
+ });
385
+ m.enabled = true;
386
+ $.isFunction(m.enable) && m.enable.call(m, Notifier);
387
+ return m;
388
+ }
389
+
390
+ // console.log('module "' + moduleName + '" is not registered.');
391
+ return false;
392
+ };
393
+
394
+ Notifier.disableModule = function (moduleName) {
395
+ var m = Notifier.getModule(moduleName);
396
+ if (m) {
397
+ $.each(m._handlers, function (k, fn) {
398
+ Notifier._modulesBinder.off(k, fn);
399
+ });
400
+ m.enabled = false;
401
+ $.isFunction(m.disable) && m.disable.call(m, Notifier);
402
+ return m;
403
+ }
404
+ // console.log('module "' + moduleName + '" is not registered.');
405
+ return false;
406
+ };
407
+
408
+ })(jQuery, Backbone, _);
409
+
410
+ /*!
411
+ * Backbone.Notifier Template Module v0.0.1
412
+ * Copyright 2012, Eyal Weiss
413
+ * Backbone.Notifier Template Module be freely distributed under the MIT license.
414
+ */
415
+ (function(Notifier, $, _){
416
+
417
+ Notifier.regModule({
418
+ name: 'template',
419
+ enabled: true,
420
+ extend: {
421
+ template: function(settings){
422
+ if (settings.data) {
423
+ var compiled = _.template(settings.message);
424
+ settings.message = compiled(settings.data);
425
+ }
426
+ return this.supr.call(this.scope, settings);
427
+ }
428
+ }
429
+ });
430
+
431
+ })(Backbone.Notifier, jQuery, _);
@@ -0,0 +1,15 @@
1
+ (function(f,j,i){var k=function(){},h=j.Notifier=j.Model.extend({defaults:{baseCls:"notifier",types:["warning","error","info","success"],dialog:!1,theme:"plastic",message:"",closeBtn:!1,title:void 0,hideOnClick:!0,type:null,cls:null,ms:1E4,loader:!1,destroy:!1,modal:!1,opacity:1,offsetY:0,fadeInMs:500,fadeOutMs:500,position:"top",screenOpacity:0.65,zIndex:1E4,width:void 0,modules:void 0},transitions:{top:{"in":function(a,b,c,d,g){a.css({display:"block",top:-1E3});a.css({top:-b.innerHeight()}).animate({top:c.offsetY,
2
+ opacity:c.opacity},d,g||k)},out:function(a,b,c,d,g){a.animate({top:-b.innerHeight(),opacity:0},d,g||k)}},center:{"in":function(a,b,c,d,g){a.css({top:c.offsetY-40,display:"block"}).animate({top:"50%",marginTop:-b.innerHeight()/2,opacity:c.opacity},d,g||k)},out:function(a,b,c,d,g){a.animate({top:"0%",opacity:0},d,g||k)}},bottom:{"in":function(a,b,c,d,g){a.css({bottom:c.offsetY-40,top:"auto",display:"block"}).animate({bottom:b.innerHeight()+c.offsetY,opacity:c.opacity},d,g||k)},out:function(a,b,c,d,
3
+ g){a.animate({bottom:-b.height(),opacity:0},d,g||k)}}},template:function(a){var b=['<div class="'+a.wrapperCls+'">','<div class="'+a.innerCls+'">',a.title?'<div class="'+a.baseCls+'-title">'+a.title+"</div>":"",a.closeBtn?'<button class="'+a.baseCls+'-close" data-handler="destroy"><span>x</span></button>':""];a.dialog?b.push('<div class="'+a.baseCls+'-message">'+a.message+(a.loader?'<div class="'+a.baseCls+'-loader"></div>':"")+"</div>"):b.push('<div class="'+a.baseCls+'-message">'+a.message+"</div>",
4
+ a.loader?'<div class="'+a.baseCls+'-loader"></div>':"");if(a.buttons){var c=f("<div />");i.each(a.buttons,function(a){c.append(f("<button/>",a))});b.push('<div class="'+a.baseCls+'-btns">'+c.html()+"</div>")}b.push("</div></div>");return b.join("")},initEl:function(){var a=this.el?this.el:"body",a=i.isObject(a)?a:f(a);if(!a.length)return f(f.proxy(this.initEl,this));this.$el=a;this._cssPos=a.get(0)===document.body?"fixed":"absolute";a.get(0)!==document.body&&a.css("position","relative");"absolute"===
5
+ this._cssPos&&a.css("overflow","hidden")},initialize:function(a){var b=this;this.el=a&&a.el;this.initEl.call(this,a&&a.el);this.current={};b.NotificationView=j.View.extend({defaults:b.attributes,on:function(a,b){var c=b,d=this;i.isString(b)&&(c=function(){d[b].apply(d,arguments)});return j.View.prototype.on.call(this,a,c)}});var c=function(a){b[a]=b[a]||function(c){i.isString(c)&&(c={message:c});c=i.extend({},{type:""},c);c.type=c.type?a+" "+c.type:a;return b.notify(c)}};i.each(b.attributes.types,
6
+ function(a){c(a)});if(b.attributes){var d=this.attributes.modules;d&&f.each(d,function(a,b){b.name=i.isArray(d)?b.name:a;h.regModule(b)});b.attributes.modules=void 0}},calcZIndex:function(){if("absolute"===this._cssPos)return this.attributes.zIndex;var a=this.attributes.zIndex+1;i.each(this.current,function(b){a=b.zIndex>a?b.zIndex:a});return++a},destroyAll:function(a,b){var c=0;i.isFunction(a)?i.each(this.current,function(b){a(b)&&(b.destroy.call(b),c++)}):void 0!==a?i.each(this.current,function(d){d.settings[a]===
7
+ b&&(d.destroy.call(d),c++)}):i.each(this.current,function(a){a.destroy.call(a);c++});return c},getWrapperCls:function(a){return f.trim(a.baseCls+" "+(a.type?a.type+" ":"")+("theme-"+a.theme+" ")+(a.dialog?"dialog ":"")+("pos-"+a.position+" ")+(a.buttons?"with-buttons ":"")+(a.loader?"with-loader ":"")+(a.closeBtn?"with-close-btn ":"")).split(" ").join(" "+a.baseCls+"-")+" "+(a.cls||"")},getSettings:function(a){i.isString(a)&&(a={message:a});var b=f.extend({},this.attributes,a);b.title&&void 0===a.dialog&&
8
+ (b.dialog=!0);if((b.modal||b.dialog)&&void 0===a.hideOnClick)b.hideOnClick=!1;b.dialog&&void 0===a.ms&&(b.ms=null);b.dialog&&void 0===a.position&&(b.position="center");return b},notify:function(a){a=a||{};a.el&&(this.el=a&&a.el,this.initEl.call(this,a&&a.el));var b=this,c=this.getSettings(a);i.isObject(c.destroy)?c.destroy instanceof b.NotificationView?c.destroy.destroy():b.destroyAll.apply(b,i.isArray(c.destroy)?c.destroy:[c.destroy]):!0===c.destroy&&b.destroyAll();a=a.zIndex||b.calcZIndex.call(b);
9
+ c.wrapperCls=b.getWrapperCls(c);c.innerCls=c.baseCls+"-inner";var d=f(b.template(c)),g=d.find("."+c.innerCls);c.width&&g.css({width:c.width});h._modulesBinder.trigger("beforeAppendMsgEl",b,c,d,g);d.css({display:"none",opacity:0,position:b._cssPos,zIndex:c.modal?++a:a}).prependTo(b.$el);var e=new b.NotificationView({el:d});e.settings=c;if(c.buttons||g.find("button").length)g.on("click","button[data-handler]",function(){var a=f(this).data("handler");(i.isFunction(a)?a:e[a]).apply(e,arguments)}),g.on("button click",
10
+ function(a){e.trigger("click:"+f(a.target).data("role"))});var k=e.destroy=function(a){if(i.isObject(a)&&a.preventDefault){a.preventDefault();a.stopPropagation()}e.trigger("beforeHide",e,d);c.modal&&e.screenEl.fadeOut(300,function(){e.trigger("screenHide",e,d);e.screenEl.remove()});h._modulesBinder.trigger("beforeHideMsgEl",b,c,d,g,e);(f.isFunction(c.out)?c.out:b.transitions[c.position].out).call(b,d,g,c,c.fadeOutMs,function(){e.remove();e.trigger("destroy",e,d);h._modulesBinder.trigger("afterDestroyMsgEl",
11
+ b,c,d,g,e);i.isFunction(a)&&a.call(e,e,d)});e.timeoutId&&clearTimeout(e.timeoutId);delete e.timeoutId;delete b.current[e.cid]},j=function(a){if(a){a.preventDefault();a.stopPropagation()}};c.modal&&(e.screenEl=f("<div/>",{"class":c.baseCls+"-screen "+c.baseCls+"-theme-"+c.theme,css:{position:b._cssPos,top:0,left:0,width:"100%",height:"100%",opacity:0,zIndex:a-1}}).prependTo(b.$el).click(function(a){a.preventDefault();a.stopPropagation();return false}).fadeTo(300,c.screenOpacity));if(0<c.ms||0===c.ms)e.timeoutId=
12
+ setTimeout(function(){e.trigger("timeout",e,d);k()},c.ms);g.click(c.hideOnClick?k:j);c.css&&g.css(c.css);j=f.isFunction(c["in"])?c["in"]:b.transitions[c.position]["in"];b.current[e.cid]=e;e.zIndex=a;h._modulesBinder.trigger("beforeAnimateInMsgEl",b,c,d,g,e);j.call(b,d,g,c,c.fadeInMs,function(){h._modulesBinder.trigger("afterAnimateInMsgEl",b,c,d,g,e)});return e}});h.getModule=function(a){return i.isObject(a)?a:h.modules[a]};var l={},m=Array.prototype.shift;i.extend(l,j.Events);h._modulesBinder=l;
13
+ h.regModule=function(a,b){1===arguments.length?(b=f.isFunction(a)?a():a,a=b.name):(b=f.isFunction(b)?b():b,b.name=a);if(!a)throw"module name is not defined.";b.extend&&f.each(b.extend,function(a,d){var g=h.prototype[a];h.prototype[a]=i.isFunction(d)||g===void 0?function(){return d.apply({scope:this,supr:g,module:b},arguments)}:i.isObject(d)?f.extend(true,{},g,d):d});(h.modules=h.modules||{})[a]=b;f.isFunction(b.register)&&b.register.call(b,h);b.enabled&&h.enableModule(b);return b};h.enableModule=
14
+ function(a){var b=h.getModule(a);return b?(b._handlers=b._handlers||{},b.events&&f.each(b.events,function(a,d){var g=b._handlers[a]=function(){var a=m.call(arguments);d.apply({module:b,scope:a},arguments)};h._modulesBinder.on(a,g)}),b.enabled=!0,f.isFunction(b.enable)&&b.enable.call(b,h),b):!1};h.disableModule=function(a){return(a=h.getModule(a))?(f.each(a._handlers,function(a,c){h._modulesBinder.off(a,c)}),a.enabled=!1,f.isFunction(a.disable)&&a.disable.call(a,h),a):!1}})(jQuery,Backbone,_);
15
+ (function(f,j,i){f.regModule({name:"template",enabled:!0,extend:{template:function(f){if(f.data){var h=i.template(f.message);f.message=h(f.data)}return this.supr.call(this.scope,f)}}})})(Backbone.Notifier,jQuery,_);