messaging_4 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +39 -0
  4. data/app/assets/javascripts/messaging/adapt.js +135 -0
  5. data/app/assets/javascripts/messaging/application.js +10 -0
  6. data/app/assets/javascripts/messaging/messages.coffee +33 -0
  7. data/app/assets/stylesheets/messaging/1200.css +357 -0
  8. data/app/assets/stylesheets/messaging/1560.css +357 -0
  9. data/app/assets/stylesheets/messaging/1920.css +358 -0
  10. data/app/assets/stylesheets/messaging/2520.css +359 -0
  11. data/app/assets/stylesheets/messaging/720.css +357 -0
  12. data/app/assets/stylesheets/messaging/960.css +357 -0
  13. data/app/assets/stylesheets/messaging/application.css +8 -0
  14. data/app/assets/stylesheets/messaging/messages.sass +225 -0
  15. data/app/assets/stylesheets/messaging/mobile.css +26 -0
  16. data/app/assets/stylesheets/messaging/reset.css +48 -0
  17. data/app/controllers/messaging/application_controller.rb +9 -0
  18. data/app/controllers/messaging/messages_controller.rb +71 -0
  19. data/app/helpers/messaging/application_helper.rb +4 -0
  20. data/app/models/messaging/message.rb +35 -0
  21. data/app/views/layouts/messaging/application.html.haml +62 -0
  22. data/app/views/messaging/messages/index.html.haml +28 -0
  23. data/app/views/messaging/messages/new.html.haml +11 -0
  24. data/app/views/messaging/messages/show.html.haml +23 -0
  25. data/config/routes.rb +13 -0
  26. data/lib/generators/messaging/devise/devise_generator.rb +34 -0
  27. data/lib/generators/messaging/devise/templates/messaging_user.rb.erb +23 -0
  28. data/lib/generators/messaging/install/install_generator.rb +12 -0
  29. data/lib/messaging.rb +9 -0
  30. data/lib/messaging/engine.rb +5 -0
  31. data/lib/messaging/version.rb +3 -0
  32. data/lib/tasks/messaging_tasks.rake +4 -0
  33. data/test/dummy/Rakefile +7 -0
  34. data/test/dummy/app/assets/javascripts/application.js +9 -0
  35. data/test/dummy/app/assets/stylesheets/application.css +7 -0
  36. data/test/dummy/app/controllers/application_controller.rb +3 -0
  37. data/test/dummy/app/controllers/home_controller.rb +9 -0
  38. data/test/dummy/app/helpers/application_helper.rb +2 -0
  39. data/test/dummy/app/models/messaging_user.rb +23 -0
  40. data/test/dummy/app/models/user.rb +23 -0
  41. data/test/dummy/app/views/layouts/application.html.haml +11 -0
  42. data/test/dummy/config.ru +4 -0
  43. data/test/dummy/config/application.rb +45 -0
  44. data/test/dummy/config/boot.rb +10 -0
  45. data/test/dummy/config/database.yml +25 -0
  46. data/test/dummy/config/environment.rb +5 -0
  47. data/test/dummy/config/environments/development.rb +32 -0
  48. data/test/dummy/config/environments/production.rb +60 -0
  49. data/test/dummy/config/environments/test.rb +39 -0
  50. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  51. data/test/dummy/config/initializers/devise.rb +209 -0
  52. data/test/dummy/config/initializers/inflections.rb +10 -0
  53. data/test/dummy/config/initializers/mailboxer.rb +12 -0
  54. data/test/dummy/config/initializers/mime_types.rb +5 -0
  55. data/test/dummy/config/initializers/secret_token.rb +7 -0
  56. data/test/dummy/config/initializers/session_store.rb +8 -0
  57. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  58. data/test/dummy/config/locales/devise.en.yml +58 -0
  59. data/test/dummy/config/locales/en.yml +5 -0
  60. data/test/dummy/config/routes.rb +10 -0
  61. data/test/dummy/db/migrate/20111204041734_devise_create_users.rb +25 -0
  62. data/test/dummy/db/migrate/20111204042609_create_mailboxer.rb +61 -0
  63. data/test/dummy/db/migrate/20111204042610_add_notified_object.rb +17 -0
  64. data/test/dummy/db/migrate/20111204042611_add_notification_code.rb +13 -0
  65. data/test/dummy/db/migrate/20111205020919_add_attachments.rb +5 -0
  66. data/test/dummy/db/migrate/20111213052240_devise_create_messaging_users.rb +25 -0
  67. data/test/dummy/db/schema.rb +99 -0
  68. data/test/dummy/public/404.html +26 -0
  69. data/test/dummy/public/422.html +26 -0
  70. data/test/dummy/public/500.html +26 -0
  71. data/test/dummy/public/favicon.ico +0 -0
  72. data/test/dummy/script/rails +6 -0
  73. data/test/dummy/test/fixtures/messaging_users.yml +11 -0
  74. data/test/dummy/test/fixtures/users.yml +11 -0
  75. data/test/dummy/test/unit/messaging_user_test.rb +7 -0
  76. data/test/dummy/test/unit/user_test.rb +7 -0
  77. data/test/integration/navigation_test.rb +10 -0
  78. data/test/messaging_test.rb +7 -0
  79. data/test/test_helper.rb +10 -0
  80. metadata +281 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8c1035e44fb872136e3fbd4dcc3766216891fc0d
4
+ data.tar.gz: b890bac96109933037be0c5098a5787dcbaed29b
5
+ SHA512:
6
+ metadata.gz: 74d1281e81959cf49534ab01b605f41dbd839610f718e72cad84b8c4772bd9e2a061a2a08cd35c7e2c21dfac448b26f0a84ced44ed61cb03c5d63657e06f9ce1
7
+ data.tar.gz: 75d25ce5a003e8d5faba17fb01c08b52553815ee6cd31f61defc5553d0688fd65072a13aceb9ca7297c8ec088db9c64f5ce806968c27b6d5504f6fd83128240c
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2011 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'Messaging'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+ APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
24
+ load 'rails/tasks/engine.rake'
25
+
26
+
27
+ Bundler::GemHelper.install_tasks
28
+
29
+ require 'rake/testtask'
30
+
31
+ Rake::TestTask.new(:test) do |t|
32
+ t.libs << 'lib'
33
+ t.libs << 'test'
34
+ t.pattern = 'test/**/*_test.rb'
35
+ t.verbose = false
36
+ end
37
+
38
+
39
+ task :default => :test
@@ -0,0 +1,135 @@
1
+ /*
2
+ Adapt.js licensed under GPL and MIT.
3
+
4
+ Read more here: http://adapt.960.gs
5
+ */
6
+
7
+ // Closure.
8
+ (function(w, d, config, undefined) {
9
+ // If no config, exit.
10
+ if (!config) {
11
+ return;
12
+ }
13
+
14
+ // Empty vars to use later.
15
+ var url, url_old, timer;
16
+
17
+ // Alias config values.
18
+ var callback = typeof config.callback === 'function' ? config.callback : undefined;
19
+ var path = config.path ? config.path : '';
20
+ var range = config.range;
21
+ var range_len = range.length;
22
+
23
+ // Create empty link tag:
24
+ // <link rel="stylesheet" />
25
+ var css = d.createElement('link');
26
+ css.rel = 'stylesheet';
27
+
28
+ // Called from within adapt().
29
+ function change(i, width) {
30
+ // Set the URL.
31
+ css.href = url;
32
+ url_old = url;
33
+
34
+ // Call callback, if defined.
35
+ callback && callback(i, width);
36
+ }
37
+
38
+ // Adapt to width.
39
+ function adapt() {
40
+ // This clearTimeout is for IE.
41
+ // Really it belongs in react(),
42
+ // but doesn't do any harm here.
43
+ clearTimeout(timer);
44
+
45
+ // Parse browser width.
46
+ var width = w.innerWidth || d.documentElement.clientWidth || d.body.clientWidth || 0;
47
+
48
+ // While loop vars.
49
+ var arr, arr_0, val_1, val_2, is_range, file;
50
+
51
+ // How many ranges?
52
+ var i = range_len;
53
+ var last = range_len - 1;
54
+
55
+ while (i--) {
56
+ // Turn string into array.
57
+ arr = range[i].split('=');
58
+
59
+ // Width is to the left of "=".
60
+ arr_0 = arr[0];
61
+
62
+ // File name is to the right of "=".
63
+ // Presuppoes a file with no spaces.
64
+ // If no file specified, assign [i].
65
+ file = arr[1] ? arr[1].replace(/\s/g, '') : i;
66
+
67
+ // Assume min/max if "to" isn't present.
68
+ is_range = arr_0.match('to');
69
+
70
+ // If it's a range, split left/right sides of "to",
71
+ // and then convert each one into numerical values.
72
+ // If it's not a range, turn maximum into a number.
73
+ val_1 = is_range ? parseInt(arr_0.split('to')[0], 10) : parseInt(arr_0, 10);
74
+ val_2 = is_range ? parseInt(arr_0.split('to')[1], 10) : undefined;
75
+
76
+ // Check for maxiumum or range.
77
+ if ((!val_2 && i === last && width > val_1) || (width > val_1 && width <= val_2)) {
78
+ // Built full URL to CSS file.
79
+ url = path + file;
80
+ break;
81
+ }
82
+ else {
83
+ // Blank if no conditions met.
84
+ url = '';
85
+ }
86
+ }
87
+
88
+ // Was it created yet?
89
+ if (!url_old) {
90
+ // Apply changes.
91
+ change(i, width);
92
+
93
+ // Add the CSS, only if path is defined.
94
+ // Use faster document.head if possible.
95
+ path && (d.head || d.getElementsByTagName('head')[0]).appendChild(css);
96
+ }
97
+ else if (url_old !== url) {
98
+ // Apply changes.
99
+ change(i, width);
100
+ }
101
+ }
102
+
103
+ // Fire off once.
104
+ adapt();
105
+
106
+ // Slight delay.
107
+ function react() {
108
+ // Clear the timer as window resize fires,
109
+ // so that it only calls adapt() when the
110
+ // user has finished resizing the window.
111
+ clearTimeout(timer);
112
+ timer = setTimeout(adapt, 100);
113
+ }
114
+
115
+ // Do we want to watch for
116
+ // resize and device tilt?
117
+ if (config.dynamic) {
118
+ // Event listener for window resize,
119
+ // also triggered by phone rotation.
120
+ if (w.addEventListener) {
121
+ // Good browsers.
122
+ w.addEventListener('resize', react, false);
123
+ }
124
+ else if (w.attachEvent) {
125
+ // Legacy IE support.
126
+ w.attachEvent('onresize', react);
127
+ }
128
+ else {
129
+ // Old-school fallback.
130
+ w.onresize = react;
131
+ }
132
+ }
133
+
134
+ // Pass in window, document, config, undefined.
135
+ })(this, this.document, ADAPT_CONFIG);
@@ -0,0 +1,10 @@
1
+ // This is a manifest file that'll be compiled into including all the files listed below.
2
+ // Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
3
+ // be included in the compiled file accessible from http://example.com/assets/application.js
4
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
5
+ // the compiled file.
6
+ //
7
+ //= require jquery
8
+ //= require jquery-ui
9
+ //= require jquery_ujs
10
+ //= require_tree .
@@ -0,0 +1,33 @@
1
+ split = (val) ->
2
+ val.split /,\s*/
3
+
4
+ extractLast = (term) ->
5
+ split(term).pop()
6
+
7
+ $ ->
8
+
9
+ recipients = $('#message_recipients').data('autocomplete-source')
10
+
11
+ # don't navigate away from the field on tab when selecting an item
12
+ $('#message_recipients').bind "keydown", (event) ->
13
+ if event.keyCode == $.ui.keyCode.TAB and $(@).data("autocomplete").menu.active then event.preventDefault()
14
+ $('#message_recipients').autocomplete
15
+ minLength: 0
16
+ source: (request, response) ->
17
+ # delegate back to autocomplete, but extract the last term
18
+ recipients = $('#message_recipients').data('autocomplete-source')
19
+ response $.ui.autocomplete.filter(recipients, extractLast(request.term))
20
+ focus: -> return false # prevent last value inserted on focus
21
+ select: (event, ui) ->
22
+ terms = split(@value)
23
+ # remove the current input
24
+ terms.pop()
25
+ # add the selected item
26
+ terms.push ui.item.value
27
+ # add placeholder to get the comma-and-space at the end
28
+ terms.push ""
29
+ @value = terms.join ", "
30
+ return false
31
+
32
+ $('#delete_multiple_button').hide()
33
+ $('.delete_multiple_checkbox').click -> $('#delete_multiple_button').fadeIn()
@@ -0,0 +1,357 @@
1
+ /*
2
+ 960 Grid System ~ Core CSS.
3
+ Learn more ~ http://960.gs/
4
+
5
+ Licensed under GPL and MIT.
6
+ */
7
+
8
+ /*
9
+ Forces backgrounds to span full width,
10
+ even if there is horizontal scrolling.
11
+ Increase this if your layout is wider.
12
+
13
+ Note: IE6 works fine without this fix.
14
+ */
15
+
16
+ body {
17
+ min-width: 1200px;
18
+ }
19
+
20
+ /* `Containers
21
+ ----------------------------------------------------------------------------------------------------*/
22
+
23
+ .container_12 {
24
+ margin-left: auto;
25
+ margin-right: auto;
26
+ width: 1200px;
27
+ }
28
+
29
+ /* `Grid >> Global
30
+ ----------------------------------------------------------------------------------------------------*/
31
+
32
+ .grid_1,
33
+ .grid_2,
34
+ .grid_3,
35
+ .grid_4,
36
+ .grid_5,
37
+ .grid_6,
38
+ .grid_7,
39
+ .grid_8,
40
+ .grid_9,
41
+ .grid_10,
42
+ .grid_11,
43
+ .grid_12 {
44
+ display: inline;
45
+ float: left;
46
+ margin-left: 10px;
47
+ margin-right: 10px;
48
+ }
49
+
50
+ .push_1, .pull_1,
51
+ .push_2, .pull_2,
52
+ .push_3, .pull_3,
53
+ .push_4, .pull_4,
54
+ .push_5, .pull_5,
55
+ .push_6, .pull_6,
56
+ .push_7, .pull_7,
57
+ .push_8, .pull_8,
58
+ .push_9, .pull_9,
59
+ .push_10, .pull_10,
60
+ .push_11, .pull_11 {
61
+ position: relative;
62
+ }
63
+
64
+ /* `Grid >> Children (Alpha ~ First, Omega ~ Last)
65
+ ----------------------------------------------------------------------------------------------------*/
66
+
67
+ .alpha {
68
+ margin-left: 0;
69
+ }
70
+
71
+ .omega {
72
+ margin-right: 0;
73
+ }
74
+
75
+ /* `Grid >> 12 Columns
76
+ ----------------------------------------------------------------------------------------------------*/
77
+
78
+ .container_12 .grid_1 {
79
+ width: 80px;
80
+ }
81
+
82
+ .container_12 .grid_2 {
83
+ width: 180px;
84
+ }
85
+
86
+ .container_12 .grid_3 {
87
+ width: 280px;
88
+ }
89
+
90
+ .container_12 .grid_4 {
91
+ width: 380px;
92
+ }
93
+
94
+ .container_12 .grid_5 {
95
+ width: 480px;
96
+ }
97
+
98
+ .container_12 .grid_6 {
99
+ width: 580px;
100
+ }
101
+
102
+ .container_12 .grid_7 {
103
+ width: 680px;
104
+ }
105
+
106
+ .container_12 .grid_8 {
107
+ width: 780px;
108
+ }
109
+
110
+ .container_12 .grid_9 {
111
+ width: 880px;
112
+ }
113
+
114
+ .container_12 .grid_10 {
115
+ width: 980px;
116
+ }
117
+
118
+ .container_12 .grid_11 {
119
+ width: 1080px;
120
+ }
121
+
122
+ .container_12 .grid_12 {
123
+ width: 1180px;
124
+ }
125
+
126
+ /* `Prefix Extra Space >> 12 Columns
127
+ ----------------------------------------------------------------------------------------------------*/
128
+
129
+ .container_12 .prefix_1 {
130
+ padding-left: 100px;
131
+ }
132
+
133
+ .container_12 .prefix_2 {
134
+ padding-left: 200px;
135
+ }
136
+
137
+ .container_12 .prefix_3 {
138
+ padding-left: 300px;
139
+ }
140
+
141
+ .container_12 .prefix_4 {
142
+ padding-left: 400px;
143
+ }
144
+
145
+ .container_12 .prefix_5 {
146
+ padding-left: 500px;
147
+ }
148
+
149
+ .container_12 .prefix_6 {
150
+ padding-left: 600px;
151
+ }
152
+
153
+ .container_12 .prefix_7 {
154
+ padding-left: 700px;
155
+ }
156
+
157
+ .container_12 .prefix_8 {
158
+ padding-left: 800px;
159
+ }
160
+
161
+ .container_12 .prefix_9 {
162
+ padding-left: 900px;
163
+ }
164
+
165
+ .container_12 .prefix_10 {
166
+ padding-left: 1000px;
167
+ }
168
+
169
+ .container_12 .prefix_11 {
170
+ padding-left: 1100px;
171
+ }
172
+
173
+ /* `Suffix Extra Space >> 12 Columns
174
+ ----------------------------------------------------------------------------------------------------*/
175
+
176
+ .container_12 .suffix_1 {
177
+ padding-right: 100px;
178
+ }
179
+
180
+ .container_12 .suffix_2 {
181
+ padding-right: 200px;
182
+ }
183
+
184
+ .container_12 .suffix_3 {
185
+ padding-right: 300px;
186
+ }
187
+
188
+ .container_12 .suffix_4 {
189
+ padding-right: 400px;
190
+ }
191
+
192
+ .container_12 .suffix_5 {
193
+ padding-right: 500px;
194
+ }
195
+
196
+ .container_12 .suffix_6 {
197
+ padding-right: 600px;
198
+ }
199
+
200
+ .container_12 .suffix_7 {
201
+ padding-right: 700px;
202
+ }
203
+
204
+ .container_12 .suffix_8 {
205
+ padding-right: 800px;
206
+ }
207
+
208
+ .container_12 .suffix_9 {
209
+ padding-right: 900px;
210
+ }
211
+
212
+ .container_12 .suffix_10 {
213
+ padding-right: 1000px;
214
+ }
215
+
216
+ .container_12 .suffix_11 {
217
+ padding-right: 1100px;
218
+ }
219
+
220
+ /* `Push Space >> 12 Columns
221
+ ----------------------------------------------------------------------------------------------------*/
222
+
223
+ .container_12 .push_1 {
224
+ left: 100px;
225
+ }
226
+
227
+ .container_12 .push_2 {
228
+ left: 200px;
229
+ }
230
+
231
+ .container_12 .push_3 {
232
+ left: 300px;
233
+ }
234
+
235
+ .container_12 .push_4 {
236
+ left: 400px;
237
+ }
238
+
239
+ .container_12 .push_5 {
240
+ left: 500px;
241
+ }
242
+
243
+ .container_12 .push_6 {
244
+ left: 600px;
245
+ }
246
+
247
+ .container_12 .push_7 {
248
+ left: 700px;
249
+ }
250
+
251
+ .container_12 .push_8 {
252
+ left: 800px;
253
+ }
254
+
255
+ .container_12 .push_9 {
256
+ left: 900px;
257
+ }
258
+
259
+ .container_12 .push_10 {
260
+ left: 1000px;
261
+ }
262
+
263
+ .container_12 .push_11 {
264
+ left: 1100px;
265
+ }
266
+
267
+ /* `Pull Space >> 12 Columns
268
+ ----------------------------------------------------------------------------------------------------*/
269
+
270
+ .container_12 .pull_1 {
271
+ left: -100px;
272
+ }
273
+
274
+ .container_12 .pull_2 {
275
+ left: -200px;
276
+ }
277
+
278
+ .container_12 .pull_3 {
279
+ left: -300px;
280
+ }
281
+
282
+ .container_12 .pull_4 {
283
+ left: -400px;
284
+ }
285
+
286
+ .container_12 .pull_5 {
287
+ left: -500px;
288
+ }
289
+
290
+ .container_12 .pull_6 {
291
+ left: -600px;
292
+ }
293
+
294
+ .container_12 .pull_7 {
295
+ left: -700px;
296
+ }
297
+
298
+ .container_12 .pull_8 {
299
+ left: -800px;
300
+ }
301
+
302
+ .container_12 .pull_9 {
303
+ left: -900px;
304
+ }
305
+
306
+ .container_12 .pull_10 {
307
+ left: -1000px;
308
+ }
309
+
310
+ .container_12 .pull_11 {
311
+ left: -1100px;
312
+ }
313
+
314
+ /* `Clear Floated Elements
315
+ ----------------------------------------------------------------------------------------------------*/
316
+
317
+ /* http://sonspring.com/journal/clearing-floats */
318
+
319
+ .clear {
320
+ clear: both;
321
+ display: block;
322
+ overflow: hidden;
323
+ visibility: hidden;
324
+ width: 0;
325
+ height: 0;
326
+ }
327
+
328
+ /* http://www.yuiblog.com/blog/2010/09/27/clearfix-reloaded-overflowhidden-demystified */
329
+
330
+ .clearfix:before,
331
+ .clearfix:after,
332
+ .container_12:before,
333
+ .container_12:after {
334
+ content: '.';
335
+ display: block;
336
+ overflow: hidden;
337
+ visibility: hidden;
338
+ font-size: 0;
339
+ line-height: 0;
340
+ width: 0;
341
+ height: 0;
342
+ }
343
+
344
+ .clearfix:after,
345
+ .container_12:after {
346
+ clear: both;
347
+ }
348
+
349
+ /*
350
+ The following zoom:1 rule is specifically for IE6 + IE7.
351
+ Move to separate stylesheet if invalid CSS is a problem.
352
+ */
353
+
354
+ .clearfix,
355
+ .container_12 {
356
+ zoom: 1;
357
+ }