mcms_blog 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +3 -0
  3. data/Rakefile +40 -0
  4. data/app/assets/images/icons/accept.png +0 -0
  5. data/app/assets/images/icons/add.png +0 -0
  6. data/app/assets/images/icons/ajax-loader.gif +0 -0
  7. data/app/assets/images/icons/application_edit.png +0 -0
  8. data/app/assets/images/icons/application_go.png +0 -0
  9. data/app/assets/images/icons/arrow_left.png +0 -0
  10. data/app/assets/images/icons/arrow_switch.png +0 -0
  11. data/app/assets/images/icons/arrow_up.png +0 -0
  12. data/app/assets/images/icons/bin.png +0 -0
  13. data/app/assets/images/icons/bin_closed.png +0 -0
  14. data/app/assets/images/icons/cancel.png +0 -0
  15. data/app/assets/images/icons/cog_add.png +0 -0
  16. data/app/assets/images/icons/cog_edit.png +0 -0
  17. data/app/assets/images/icons/cross.png +0 -0
  18. data/app/assets/images/icons/delete.png +0 -0
  19. data/app/assets/images/icons/doc.png +0 -0
  20. data/app/assets/images/icons/down.gif +0 -0
  21. data/app/assets/images/icons/edit.png +0 -0
  22. data/app/assets/images/icons/email.png +0 -0
  23. data/app/assets/images/icons/email_edit.png +0 -0
  24. data/app/assets/images/icons/email_go.png +0 -0
  25. data/app/assets/images/icons/email_open.png +0 -0
  26. data/app/assets/images/icons/eye.png +0 -0
  27. data/app/assets/images/icons/folder_page_white.png +0 -0
  28. data/app/assets/images/icons/image_add.png +0 -0
  29. data/app/assets/images/icons/image_edit.png +0 -0
  30. data/app/assets/images/icons/img.png +0 -0
  31. data/app/assets/images/icons/information.png +0 -0
  32. data/app/assets/images/icons/layout_add.png +0 -0
  33. data/app/assets/images/icons/layout_edit.png +0 -0
  34. data/app/assets/images/icons/music.png +0 -0
  35. data/app/assets/images/icons/page_add.png +0 -0
  36. data/app/assets/images/icons/page_edit.png +0 -0
  37. data/app/assets/images/icons/page_white_edit.png +0 -0
  38. data/app/assets/images/icons/page_white_gear.png +0 -0
  39. data/app/assets/images/icons/page_white_put.png +0 -0
  40. data/app/assets/images/icons/pdf.png +0 -0
  41. data/app/assets/images/icons/ppt.png +0 -0
  42. data/app/assets/images/icons/star.png +0 -0
  43. data/app/assets/images/icons/tick.png +0 -0
  44. data/app/assets/images/icons/up.gif +0 -0
  45. data/app/assets/images/icons/user_add.png +0 -0
  46. data/app/assets/images/icons/user_comment.png +0 -0
  47. data/app/assets/images/icons/user_edit.png +0 -0
  48. data/app/assets/images/icons/xls.png +0 -0
  49. data/app/assets/images/icons/zip.png +0 -0
  50. data/app/assets/images/icons/zoom.png +0 -0
  51. data/app/assets/images/page_bg.png +0 -0
  52. data/app/assets/images/rails.png +0 -0
  53. data/app/assets/javascripts/admin/blog/mcms-blog-submenu.js +50 -0
  54. data/app/assets/javascripts/contrib/ui.core.js +519 -0
  55. data/app/assets/javascripts/contrib/ui.tabs.js +688 -0
  56. data/app/assets/javascripts/posts.js +3 -0
  57. data/app/assets/stylesheets/blog_global.css +1587 -0
  58. data/app/assets/stylesheets/blog_home.css +1432 -0
  59. data/app/assets/stylesheets/home.css +1429 -0
  60. data/app/assets/stylesheets/images/back_ui-bg_gloss-wave_55_5c9ccc_500x100.png +0 -0
  61. data/app/assets/stylesheets/images/spellayt.gif +0 -0
  62. data/app/assets/stylesheets/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  63. data/app/assets/stylesheets/images/ui-bg_flat_55_fbec88_40x100.png +0 -0
  64. data/app/assets/stylesheets/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  65. data/app/assets/stylesheets/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  66. data/app/assets/stylesheets/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  67. data/app/assets/stylesheets/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  68. data/app/assets/stylesheets/images/ui-bg_glass_75_d0e5f5_1x400.png +0 -0
  69. data/app/assets/stylesheets/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  70. data/app/assets/stylesheets/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  71. data/app/assets/stylesheets/images/ui-bg_glass_85_dfeffc_1x400.png +0 -0
  72. data/app/assets/stylesheets/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  73. data/app/assets/stylesheets/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png +0 -0
  74. data/app/assets/stylesheets/images/ui-bg_green.png +1 -0
  75. data/app/assets/stylesheets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  76. data/app/assets/stylesheets/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  77. data/app/assets/stylesheets/images/ui-bg_inset-hard_100_f5f8f9_1x100.png +0 -0
  78. data/app/assets/stylesheets/images/ui-bg_inset-hard_100_fcfdfd_1x100.png +0 -0
  79. data/app/assets/stylesheets/images/ui-icons_217bc0_256x240.png +0 -0
  80. data/app/assets/stylesheets/images/ui-icons_222222_256x240.png +0 -0
  81. data/app/assets/stylesheets/images/ui-icons_2e83ff_256x240.png +0 -0
  82. data/app/assets/stylesheets/images/ui-icons_454545_256x240.png +0 -0
  83. data/app/assets/stylesheets/images/ui-icons_469bdd_256x240.png +0 -0
  84. data/app/assets/stylesheets/images/ui-icons_6da8d5_256x240.png +0 -0
  85. data/app/assets/stylesheets/images/ui-icons_888888_256x240.png +0 -0
  86. data/app/assets/stylesheets/images/ui-icons_cd0a0a_256x240.png +0 -0
  87. data/app/assets/stylesheets/images/ui-icons_d8e7f3_256x240.png +0 -0
  88. data/app/assets/stylesheets/images/ui-icons_f9bd01_256x240.png +0 -0
  89. data/app/assets/stylesheets/jquery-ui-1.8.6.custom.css +572 -0
  90. data/app/assets/stylesheets/submenu.css.scss +32 -0
  91. data/app/controllers/admin/blog/categories_controller.rb +47 -0
  92. data/app/controllers/admin/blog/comments_controller.rb +64 -0
  93. data/app/controllers/admin/blog/posts_controller.rb +80 -0
  94. data/app/controllers/admin/blog/settings_controller.rb +67 -0
  95. data/app/controllers/application_controller.rb +29 -0
  96. data/app/controllers/blog/categories_controller.rb +34 -0
  97. data/app/controllers/blog/comments_controller.rb +34 -0
  98. data/app/controllers/blog/posts_controller.rb +123 -0
  99. data/app/controllers/blog_controller.rb +31 -0
  100. data/app/helpers/application_helper.rb +5 -0
  101. data/app/helpers/blog_helper.rb +66 -0
  102. data/app/helpers/notification_hepler.rb +5 -0
  103. data/app/helpers/settings_helper.rb +38 -0
  104. data/app/mailers/blog/comment_mailer.rb +12 -0
  105. data/app/models/blog_category.rb +29 -0
  106. data/app/models/blog_comment.rb +109 -0
  107. data/app/models/blog_post.rb +121 -0
  108. data/app/models/categorization.rb +16 -0
  109. data/app/models/ckeditor/asset.rb +6 -0
  110. data/app/models/ckeditor/attachment_file.rb +12 -0
  111. data/app/models/ckeditor/picture.rb +13 -0
  112. data/app/models/setting.rb +59 -0
  113. data/app/views/admin/blog/_submenu.html.erb +89 -0
  114. data/app/views/admin/blog/categories/_category.html.erb +20 -0
  115. data/app/views/admin/blog/categories/_form.html.erb +21 -0
  116. data/app/views/admin/blog/categories/_sortable_list.html.erb +3 -0
  117. data/app/views/admin/blog/categories/edit.html.erb +1 -0
  118. data/app/views/admin/blog/categories/index.html.erb +23 -0
  119. data/app/views/admin/blog/categories/new.html.erb +2 -0
  120. data/app/views/admin/blog/comments/_comment.html.erb +27 -0
  121. data/app/views/admin/blog/comments/_sortable_list.html.erb +11 -0
  122. data/app/views/admin/blog/comments/index.html.erb +12 -0
  123. data/app/views/admin/blog/comments/show.html.erb +70 -0
  124. data/app/views/admin/blog/posts/_form.css.erb +22 -0
  125. data/app/views/admin/blog/posts/_form.html.erb +92 -0
  126. data/app/views/admin/blog/posts/_form.js.erb +34 -0
  127. data/app/views/admin/blog/posts/_form_part.html.erb +10 -0
  128. data/app/views/admin/blog/posts/_post.html.erb +26 -0
  129. data/app/views/admin/blog/posts/_sortable_list.html.erb +3 -0
  130. data/app/views/admin/blog/posts/_teaser_part.html.erb +11 -0
  131. data/app/views/admin/blog/posts/edit.html.erb +1 -0
  132. data/app/views/admin/blog/posts/index.html.erb +29 -0
  133. data/app/views/admin/blog/posts/new.html.erb +13 -0
  134. data/app/views/admin/blog/settings/notification_recipients.html.erb +23 -0
  135. data/app/views/blog/categories/show.html.erb +17 -0
  136. data/app/views/blog/posts/_comment.html.erb +17 -0
  137. data/app/views/blog/posts/_nav.html.erb +18 -0
  138. data/app/views/blog/posts/_post.html.erb +25 -0
  139. data/app/views/blog/posts/archive.html.erb +17 -0
  140. data/app/views/blog/posts/index.html.erb +15 -0
  141. data/app/views/blog/posts/show.html.erb +64 -0
  142. data/app/views/blog/posts/tagged.html.erb +20 -0
  143. data/app/views/blog/shared/_categories.html.erb +19 -0
  144. data/app/views/blog/shared/_post.html.erb +34 -0
  145. data/app/views/blog/shared/_posts.html.erb +17 -0
  146. data/app/views/blog/shared/_rss_feed.html.erb +2 -0
  147. data/app/views/blog/shared/_tags.html.erb +17 -0
  148. data/app/views/layouts/_javascript.html.erb +3 -0
  149. data/app/views/layouts/_scripts.html.erb +6 -0
  150. data/app/views/layouts/_stylesheets.html.erb +6 -0
  151. data/app/views/layouts/admin.html.erb +25 -0
  152. data/app/views/layouts/application.html.erb +38 -0
  153. data/app/views/layouts/home.html.erb +38 -0
  154. data/app/views/shared/_footer.html.erb +3 -0
  155. data/app/views/shared/_head.html.erb +4 -0
  156. data/app/views/shared/_header.html.erb +7 -0
  157. data/app/views/shared/_javascripts.html.erb +3 -0
  158. data/app/views/shared/_menu.html.erb +9 -0
  159. data/app/views/shared/_stylesheets.html.erb +6 -0
  160. data/app/views/shared/admin/_error_messages.html.erb +16 -0
  161. data/app/views/shared/admin/_form_actions.html.erb +34 -0
  162. data/config/locales/en.yml +192 -0
  163. data/config/routes.rb +65 -0
  164. data/db/migrate/20120606150655_create_mcms_assets.rb +26 -0
  165. data/db/migrate/20120608071959_create_blog_categories.rb +9 -0
  166. data/db/migrate/20120608072013_create_blog_comments.rb +14 -0
  167. data/db/migrate/20120608072027_create_blog_posts.rb +16 -0
  168. data/db/migrate/20120612055745_create_categorizations.rb +9 -0
  169. data/db/migrate/20120618104134_add_index_in_blog_comments.rb +5 -0
  170. data/db/migrate/20120618105246_add_custom_index_in_mcms_blog_comments.rb +5 -0
  171. data/db/migrate/20120618105511_add_custom_index_in_mcms_blog_posts.rb +5 -0
  172. data/db/migrate/20120619094143_create_settings.rb +12 -0
  173. data/db/migrate/20120627063009_acts_as_taggable_on_migration.rb +28 -0
  174. data/db/migrate/20120629065434_add_slug_to_blog_post.rb +6 -0
  175. data/db/migrate/20120629113457_add_slug_to_mcms_blog_category.rb +6 -0
  176. data/db/seeds.rb +26 -0
  177. data/lib/generators/mcms_blog/USAGE +8 -0
  178. data/lib/generators/mcms_blog/mcms_blog_generator.rb +60 -0
  179. data/lib/generators/mcms_blog/templates/asset_manager.rb +107 -0
  180. data/lib/generators/mcms_blog/templates/ckeditor.rb +18 -0
  181. data/lib/mcms_blog/engine.rb +18 -0
  182. data/lib/mcms_blog/version.rb +3 -0
  183. data/lib/mcms_blog.rb +4 -0
  184. data/lib/tasks/mcms_blog_tasks.rake +4 -0
  185. data/test/dummy/README.rdoc +261 -0
  186. data/test/dummy/Rakefile +7 -0
  187. data/test/dummy/app/assets/javascripts/application.js +15 -0
  188. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  189. data/test/dummy/app/controllers/application_controller.rb +3 -0
  190. data/test/dummy/app/helpers/application_helper.rb +2 -0
  191. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  192. data/test/dummy/config/application.rb +59 -0
  193. data/test/dummy/config/boot.rb +10 -0
  194. data/test/dummy/config/database.yml +25 -0
  195. data/test/dummy/config/environment.rb +5 -0
  196. data/test/dummy/config/environments/development.rb +37 -0
  197. data/test/dummy/config/environments/production.rb +67 -0
  198. data/test/dummy/config/environments/test.rb +37 -0
  199. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  200. data/test/dummy/config/initializers/inflections.rb +15 -0
  201. data/test/dummy/config/initializers/mime_types.rb +5 -0
  202. data/test/dummy/config/initializers/secret_token.rb +7 -0
  203. data/test/dummy/config/initializers/session_store.rb +8 -0
  204. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  205. data/test/dummy/config/locales/en.yml +5 -0
  206. data/test/dummy/config/routes.rb +58 -0
  207. data/test/dummy/config.ru +4 -0
  208. data/test/dummy/public/404.html +26 -0
  209. data/test/dummy/public/422.html +26 -0
  210. data/test/dummy/public/500.html +25 -0
  211. data/test/dummy/public/favicon.ico +0 -0
  212. data/test/dummy/script/rails +6 -0
  213. data/test/integration/navigation_test.rb +10 -0
  214. data/test/mcms_blog_test.rb +7 -0
  215. data/test/test_helper.rb +15 -0
  216. metadata +403 -0
@@ -0,0 +1,519 @@
1
+ /*
2
+ * jQuery UI 1.7.1
3
+ *
4
+ * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
5
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
6
+ * and GPL (GPL-LICENSE.txt) licenses.
7
+ *
8
+ * http://docs.jquery.com/UI
9
+ */
10
+ ;jQuery.ui || (function($) {
11
+
12
+ var _remove = $.fn.remove,
13
+ isFF2 = $.browser.mozilla && (parseFloat($.browser.version) < 1.9);
14
+
15
+ //Helper functions and ui object
16
+ $.ui = {
17
+ version: "1.7.1",
18
+
19
+ // $.ui.plugin is deprecated. Use the proxy pattern instead.
20
+ plugin: {
21
+ add: function(module, option, set) {
22
+ var proto = $.ui[module].prototype;
23
+ for(var i in set) {
24
+ proto.plugins[i] = proto.plugins[i] || [];
25
+ proto.plugins[i].push([option, set[i]]);
26
+ }
27
+ },
28
+ call: function(instance, name, args) {
29
+ var set = instance.plugins[name];
30
+ if(!set || !instance.element[0].parentNode) { return; }
31
+
32
+ for (var i = 0; i < set.length; i++) {
33
+ if (instance.options[set[i][0]]) {
34
+ set[i][1].apply(instance.element, args);
35
+ }
36
+ }
37
+ }
38
+ },
39
+
40
+ contains: function(a, b) {
41
+ return document.compareDocumentPosition
42
+ ? a.compareDocumentPosition(b) & 16
43
+ : a !== b && a.contains(b);
44
+ },
45
+
46
+ hasScroll: function(el, a) {
47
+
48
+ //If overflow is hidden, the element might have extra content, but the user wants to hide it
49
+ if ($(el).css('overflow') == 'hidden') { return false; }
50
+
51
+ var scroll = (a && a == 'left') ? 'scrollLeft' : 'scrollTop',
52
+ has = false;
53
+
54
+ if (el[scroll] > 0) { return true; }
55
+
56
+ // TODO: determine which cases actually cause this to happen
57
+ // if the element doesn't have the scroll set, see if it's possible to
58
+ // set the scroll
59
+ el[scroll] = 1;
60
+ has = (el[scroll] > 0);
61
+ el[scroll] = 0;
62
+ return has;
63
+ },
64
+
65
+ isOverAxis: function(x, reference, size) {
66
+ //Determines when x coordinate is over "b" element axis
67
+ return (x > reference) && (x < (reference + size));
68
+ },
69
+
70
+ isOver: function(y, x, top, left, height, width) {
71
+ //Determines when x, y coordinates is over "b" element
72
+ return $.ui.isOverAxis(y, top, height) && $.ui.isOverAxis(x, left, width);
73
+ },
74
+
75
+ keyCode: {
76
+ BACKSPACE: 8,
77
+ CAPS_LOCK: 20,
78
+ COMMA: 188,
79
+ CONTROL: 17,
80
+ DELETE: 46,
81
+ DOWN: 40,
82
+ END: 35,
83
+ ENTER: 13,
84
+ ESCAPE: 27,
85
+ HOME: 36,
86
+ INSERT: 45,
87
+ LEFT: 37,
88
+ NUMPAD_ADD: 107,
89
+ NUMPAD_DECIMAL: 110,
90
+ NUMPAD_DIVIDE: 111,
91
+ NUMPAD_ENTER: 108,
92
+ NUMPAD_MULTIPLY: 106,
93
+ NUMPAD_SUBTRACT: 109,
94
+ PAGE_DOWN: 34,
95
+ PAGE_UP: 33,
96
+ PERIOD: 190,
97
+ RIGHT: 39,
98
+ SHIFT: 16,
99
+ SPACE: 32,
100
+ TAB: 9,
101
+ UP: 38
102
+ }
103
+ };
104
+
105
+ // WAI-ARIA normalization
106
+ if (isFF2) {
107
+ var attr = $.attr,
108
+ removeAttr = $.fn.removeAttr,
109
+ ariaNS = "http://www.w3.org/2005/07/aaa",
110
+ ariaState = /^aria-/,
111
+ ariaRole = /^wairole:/;
112
+
113
+ $.attr = function(elem, name, value) {
114
+ var set = value !== undefined;
115
+
116
+ return (name == 'role'
117
+ ? (set
118
+ ? attr.call(this, elem, name, "wairole:" + value)
119
+ : (attr.apply(this, arguments) || "").replace(ariaRole, ""))
120
+ : (ariaState.test(name)
121
+ ? (set
122
+ ? elem.setAttributeNS(ariaNS,
123
+ name.replace(ariaState, "aaa:"), value)
124
+ : attr.call(this, elem, name.replace(ariaState, "aaa:")))
125
+ : attr.apply(this, arguments)));
126
+ };
127
+
128
+ $.fn.removeAttr = function(name) {
129
+ return (ariaState.test(name)
130
+ ? this.each(function() {
131
+ this.removeAttributeNS(ariaNS, name.replace(ariaState, ""));
132
+ }) : removeAttr.call(this, name));
133
+ };
134
+ }
135
+
136
+ //jQuery plugins
137
+ $.fn.extend({
138
+ remove: function() {
139
+ // Safari has a native remove event which actually removes DOM elements,
140
+ // so we have to use triggerHandler instead of trigger (#3037).
141
+ $("*", this).add(this).each(function() {
142
+ $(this).triggerHandler("remove");
143
+ });
144
+ return _remove.apply(this, arguments );
145
+ },
146
+
147
+ enableSelection: function() {
148
+ return this
149
+ .attr('unselectable', 'off')
150
+ .css('MozUserSelect', '')
151
+ .unbind('selectstart.ui');
152
+ },
153
+
154
+ disableSelection: function() {
155
+ return this
156
+ .attr('unselectable', 'on')
157
+ .css('MozUserSelect', 'none')
158
+ .bind('selectstart.ui', function() { return false; });
159
+ },
160
+
161
+ scrollParent: function() {
162
+ var scrollParent;
163
+ if(($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
164
+ scrollParent = this.parents().filter(function() {
165
+ return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
166
+ }).eq(0);
167
+ } else {
168
+ scrollParent = this.parents().filter(function() {
169
+ return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
170
+ }).eq(0);
171
+ }
172
+
173
+ return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
174
+ }
175
+ });
176
+
177
+
178
+ //Additional selectors
179
+ $.extend($.expr[':'], {
180
+ data: function(elem, i, match) {
181
+ return !!$.data(elem, match[3]);
182
+ },
183
+
184
+ focusable: function(element) {
185
+ var nodeName = element.nodeName.toLowerCase(),
186
+ tabIndex = $.attr(element, 'tabindex');
187
+ return (/input|select|textarea|button|object/.test(nodeName)
188
+ ? !element.disabled
189
+ : 'a' == nodeName || 'area' == nodeName
190
+ ? element.href || !isNaN(tabIndex)
191
+ : !isNaN(tabIndex))
192
+ // the element and all of its ancestors must be visible
193
+ // the browser may report that the area is hidden
194
+ && !$(element)['area' == nodeName ? 'parents' : 'closest'](':hidden').length;
195
+ },
196
+
197
+ tabbable: function(element) {
198
+ var tabIndex = $.attr(element, 'tabindex');
199
+ return (isNaN(tabIndex) || tabIndex >= 0) && $(element).is(':focusable');
200
+ }
201
+ });
202
+
203
+
204
+ // $.widget is a factory to create jQuery plugins
205
+ // taking some boilerplate code out of the plugin code
206
+ function getter(namespace, plugin, method, args) {
207
+ function getMethods(type) {
208
+ var methods = $[namespace][plugin][type] || [];
209
+ return (typeof methods == 'string' ? methods.split(/,?\s+/) : methods);
210
+ }
211
+
212
+ var methods = getMethods('getter');
213
+ if (args.length == 1 && typeof args[0] == 'string') {
214
+ methods = methods.concat(getMethods('getterSetter'));
215
+ }
216
+ return ($.inArray(method, methods) != -1);
217
+ }
218
+
219
+ $.widget = function(name, prototype) {
220
+ var namespace = name.split(".")[0];
221
+ name = name.split(".")[1];
222
+
223
+ // create plugin method
224
+ $.fn[name] = function(options) {
225
+ var isMethodCall = (typeof options == 'string'),
226
+ args = Array.prototype.slice.call(arguments, 1);
227
+
228
+ // prevent calls to internal methods
229
+ if (isMethodCall && options.substring(0, 1) == '_') {
230
+ return this;
231
+ }
232
+
233
+ // handle getter methods
234
+ if (isMethodCall && getter(namespace, name, options, args)) {
235
+ var instance = $.data(this[0], name);
236
+ return (instance ? instance[options].apply(instance, args)
237
+ : undefined);
238
+ }
239
+
240
+ // handle initialization and non-getter methods
241
+ return this.each(function() {
242
+ var instance = $.data(this, name);
243
+
244
+ // constructor
245
+ (!instance && !isMethodCall &&
246
+ $.data(this, name, new $[namespace][name](this, options))._init());
247
+
248
+ // method call
249
+ (instance && isMethodCall && $.isFunction(instance[options]) &&
250
+ instance[options].apply(instance, args));
251
+ });
252
+ };
253
+
254
+ // create widget constructor
255
+ $[namespace] = $[namespace] || {};
256
+ $[namespace][name] = function(element, options) {
257
+ var self = this;
258
+
259
+ this.namespace = namespace;
260
+ this.widgetName = name;
261
+ this.widgetEventPrefix = $[namespace][name].eventPrefix || name;
262
+ this.widgetBaseClass = namespace + '-' + name;
263
+
264
+ this.options = $.extend({},
265
+ $.widget.defaults,
266
+ $[namespace][name].defaults,
267
+ $.metadata && $.metadata.get(element)[name],
268
+ options);
269
+
270
+ this.element = $(element)
271
+ .bind('setData.' + name, function(event, key, value) {
272
+ if (event.target == element) {
273
+ return self._setData(key, value);
274
+ }
275
+ })
276
+ .bind('getData.' + name, function(event, key) {
277
+ if (event.target == element) {
278
+ return self._getData(key);
279
+ }
280
+ })
281
+ .bind('remove', function() {
282
+ return self.destroy();
283
+ });
284
+ };
285
+
286
+ // add widget prototype
287
+ $[namespace][name].prototype = $.extend({}, $.widget.prototype, prototype);
288
+
289
+ // TODO: merge getter and getterSetter properties from widget prototype
290
+ // and plugin prototype
291
+ $[namespace][name].getterSetter = 'option';
292
+ };
293
+
294
+ $.widget.prototype = {
295
+ _init: function() {},
296
+ destroy: function() {
297
+ this.element.removeData(this.widgetName)
298
+ .removeClass(this.widgetBaseClass + '-disabled' + ' ' + this.namespace + '-state-disabled')
299
+ .removeAttr('aria-disabled');
300
+ },
301
+
302
+ option: function(key, value) {
303
+ var options = key,
304
+ self = this;
305
+
306
+ if (typeof key == "string") {
307
+ if (value === undefined) {
308
+ return this._getData(key);
309
+ }
310
+ options = {};
311
+ options[key] = value;
312
+ }
313
+
314
+ $.each(options, function(key, value) {
315
+ self._setData(key, value);
316
+ });
317
+ },
318
+ _getData: function(key) {
319
+ return this.options[key];
320
+ },
321
+ _setData: function(key, value) {
322
+ this.options[key] = value;
323
+
324
+ if (key == 'disabled') {
325
+ this.element
326
+ [value ? 'addClass' : 'removeClass'](
327
+ this.widgetBaseClass + '-disabled' + ' ' +
328
+ this.namespace + '-state-disabled')
329
+ .attr("aria-disabled", value);
330
+ }
331
+ },
332
+
333
+ enable: function() {
334
+ this._setData('disabled', false);
335
+ },
336
+ disable: function() {
337
+ this._setData('disabled', true);
338
+ },
339
+
340
+ _trigger: function(type, event, data) {
341
+ var callback = this.options[type],
342
+ eventName = (type == this.widgetEventPrefix
343
+ ? type : this.widgetEventPrefix + type);
344
+
345
+ event = $.Event(event);
346
+ event.type = eventName;
347
+
348
+ // copy original event properties over to the new event
349
+ // this would happen if we could call $.event.fix instead of $.Event
350
+ // but we don't have a way to force an event to be fixed multiple times
351
+ if (event.originalEvent) {
352
+ for (var i = $.event.props.length, prop; i;) {
353
+ prop = $.event.props[--i];
354
+ event[prop] = event.originalEvent[prop];
355
+ }
356
+ }
357
+
358
+ this.element.trigger(event, data);
359
+
360
+ return !($.isFunction(callback) && callback.call(this.element[0], event, data) === false
361
+ || event.isDefaultPrevented());
362
+ }
363
+ };
364
+
365
+ $.widget.defaults = {
366
+ disabled: false
367
+ };
368
+
369
+
370
+ /** Mouse Interaction Plugin **/
371
+
372
+ $.ui.mouse = {
373
+ _mouseInit: function() {
374
+ var self = this;
375
+
376
+ this.element
377
+ .bind('mousedown.'+this.widgetName, function(event) {
378
+ return self._mouseDown(event);
379
+ })
380
+ .bind('click.'+this.widgetName, function(event) {
381
+ if(self._preventClickEvent) {
382
+ self._preventClickEvent = false;
383
+ event.stopImmediatePropagation();
384
+ return false;
385
+ }
386
+ });
387
+
388
+ // Prevent text selection in IE
389
+ if ($.browser.msie) {
390
+ this._mouseUnselectable = this.element.attr('unselectable');
391
+ this.element.attr('unselectable', 'on');
392
+ }
393
+
394
+ this.started = false;
395
+ },
396
+
397
+ // TODO: make sure destroying one instance of mouse doesn't mess with
398
+ // other instances of mouse
399
+ _mouseDestroy: function() {
400
+ this.element.unbind('.'+this.widgetName);
401
+
402
+ // Restore text selection in IE
403
+ ($.browser.msie
404
+ && this.element.attr('unselectable', this._mouseUnselectable));
405
+ },
406
+
407
+ _mouseDown: function(event) {
408
+ // don't let more than one widget handle mouseStart
409
+ // TODO: figure out why we have to use originalEvent
410
+ event.originalEvent = event.originalEvent || {};
411
+ if (event.originalEvent.mouseHandled) { return; }
412
+
413
+ // we may have missed mouseup (out of window)
414
+ (this._mouseStarted && this._mouseUp(event));
415
+
416
+ this._mouseDownEvent = event;
417
+
418
+ var self = this,
419
+ btnIsLeft = (event.which == 1),
420
+ elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false);
421
+ if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
422
+ return true;
423
+ }
424
+
425
+ this.mouseDelayMet = !this.options.delay;
426
+ if (!this.mouseDelayMet) {
427
+ this._mouseDelayTimer = setTimeout(function() {
428
+ self.mouseDelayMet = true;
429
+ }, this.options.delay);
430
+ }
431
+
432
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
433
+ this._mouseStarted = (this._mouseStart(event) !== false);
434
+ if (!this._mouseStarted) {
435
+ event.preventDefault();
436
+ return true;
437
+ }
438
+ }
439
+
440
+ // these delegates are required to keep context
441
+ this._mouseMoveDelegate = function(event) {
442
+ return self._mouseMove(event);
443
+ };
444
+ this._mouseUpDelegate = function(event) {
445
+ return self._mouseUp(event);
446
+ };
447
+ $(document)
448
+ .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
449
+ .bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
450
+
451
+ // preventDefault() is used to prevent the selection of text here -
452
+ // however, in Safari, this causes select boxes not to be selectable
453
+ // anymore, so this fix is needed
454
+ ($.browser.safari || event.preventDefault());
455
+
456
+ event.originalEvent.mouseHandled = true;
457
+ return true;
458
+ },
459
+
460
+ _mouseMove: function(event) {
461
+ // IE mouseup check - mouseup happened when mouse was out of window
462
+ if ($.browser.msie && !event.button) {
463
+ return this._mouseUp(event);
464
+ }
465
+
466
+ if (this._mouseStarted) {
467
+ this._mouseDrag(event);
468
+ return event.preventDefault();
469
+ }
470
+
471
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
472
+ this._mouseStarted =
473
+ (this._mouseStart(this._mouseDownEvent, event) !== false);
474
+ (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
475
+ }
476
+
477
+ return !this._mouseStarted;
478
+ },
479
+
480
+ _mouseUp: function(event) {
481
+ $(document)
482
+ .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
483
+ .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
484
+
485
+ if (this._mouseStarted) {
486
+ this._mouseStarted = false;
487
+ this._preventClickEvent = (event.target == this._mouseDownEvent.target);
488
+ this._mouseStop(event);
489
+ }
490
+
491
+ return false;
492
+ },
493
+
494
+ _mouseDistanceMet: function(event) {
495
+ return (Math.max(
496
+ Math.abs(this._mouseDownEvent.pageX - event.pageX),
497
+ Math.abs(this._mouseDownEvent.pageY - event.pageY)
498
+ ) >= this.options.distance
499
+ );
500
+ },
501
+
502
+ _mouseDelayMet: function(event) {
503
+ return this.mouseDelayMet;
504
+ },
505
+
506
+ // These are placeholder methods, to be overriden by extending plugin
507
+ _mouseStart: function(event) {},
508
+ _mouseDrag: function(event) {},
509
+ _mouseStop: function(event) {},
510
+ _mouseCapture: function(event) { return true; }
511
+ };
512
+
513
+ $.ui.mouse.defaults = {
514
+ cancel: null,
515
+ distance: 1,
516
+ delay: 0
517
+ };
518
+
519
+ })(jQuery);