joosy 0.1.0.RC1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. data/.gitignore +5 -0
  2. data/Gemfile +14 -0
  3. data/Gemfile.lock +159 -0
  4. data/Guardfile +30 -0
  5. data/MIT-LICENSE +21 -0
  6. data/README.rdoc +3 -0
  7. data/Rakefile +14 -0
  8. data/app/assets/javascripts/joosy.js.coffee +7 -0
  9. data/app/assets/javascripts/joosy/core/application.js.coffee +28 -0
  10. data/app/assets/javascripts/joosy/core/form.js.coffee +87 -0
  11. data/app/assets/javascripts/joosy/core/helpers.js.coffee +6 -0
  12. data/app/assets/javascripts/joosy/core/joosy.js.coffee +65 -0
  13. data/app/assets/javascripts/joosy/core/layout.js.coffee +47 -0
  14. data/app/assets/javascripts/joosy/core/modules/container.js.coffee +59 -0
  15. data/app/assets/javascripts/joosy/core/modules/events.js.coffee +35 -0
  16. data/app/assets/javascripts/joosy/core/modules/filters.js.coffee +39 -0
  17. data/app/assets/javascripts/joosy/core/modules/log.js.coffee +15 -0
  18. data/app/assets/javascripts/joosy/core/modules/module.js.coffee +43 -0
  19. data/app/assets/javascripts/joosy/core/modules/renderer.js.coffee +116 -0
  20. data/app/assets/javascripts/joosy/core/modules/time_manager.js.coffee +25 -0
  21. data/app/assets/javascripts/joosy/core/modules/widgets_manager.js.coffee +58 -0
  22. data/app/assets/javascripts/joosy/core/page.js.coffee +156 -0
  23. data/app/assets/javascripts/joosy/core/preloader.js.coffee +5 -0
  24. data/app/assets/javascripts/joosy/core/resource/generic.js.coffee +61 -0
  25. data/app/assets/javascripts/joosy/core/resource/rest.js.coffee +76 -0
  26. data/app/assets/javascripts/joosy/core/resource/rest_collection.js.coffee +48 -0
  27. data/app/assets/javascripts/joosy/core/router.js.coffee +89 -0
  28. data/app/assets/javascripts/joosy/core/templaters/rails_jst.js.coffee +20 -0
  29. data/app/assets/javascripts/joosy/core/widget.js.coffee +41 -0
  30. data/app/assets/javascripts/joosy/preloaders/caching.js.coffee +94 -0
  31. data/app/assets/javascripts/joosy/preloaders/inline.js.coffee +55 -0
  32. data/app/helpers/joosy/sprockets_helper.rb +23 -0
  33. data/app/views/layouts/json_wrapper.json.erb +1 -0
  34. data/joosy.gemspec +25 -0
  35. data/lib/joosy.rb +9 -0
  36. data/lib/joosy/forms.rb +47 -0
  37. data/lib/joosy/rails/engine.rb +17 -0
  38. data/lib/joosy/rails/version.rb +5 -0
  39. data/lib/rails/generators/joosy/application_generator.rb +41 -0
  40. data/lib/rails/generators/joosy/joosy_base.rb +30 -0
  41. data/lib/rails/generators/joosy/layout_generator.rb +32 -0
  42. data/lib/rails/generators/joosy/page_generator.rb +44 -0
  43. data/lib/rails/generators/joosy/preloader_generator.rb +32 -0
  44. data/lib/rails/generators/joosy/resource_generator.rb +29 -0
  45. data/lib/rails/generators/joosy/templates/app.js.coffee +10 -0
  46. data/lib/rails/generators/joosy/templates/app/helpers/application.js.coffee +4 -0
  47. data/lib/rails/generators/joosy/templates/app/layouts/application.js.coffee +2 -0
  48. data/lib/rails/generators/joosy/templates/app/layouts/template.js.coffee +2 -0
  49. data/lib/rails/generators/joosy/templates/app/pages/application.js.coffee +1 -0
  50. data/lib/rails/generators/joosy/templates/app/pages/template.js.coffee +5 -0
  51. data/lib/rails/generators/joosy/templates/app/pages/welcome/index.js.coffee +22 -0
  52. data/lib/rails/generators/joosy/templates/app/resources/template.js.coffee +2 -0
  53. data/lib/rails/generators/joosy/templates/app/routes.js.coffee +8 -0
  54. data/lib/rails/generators/joosy/templates/app/templates/layouts/application.jst.hamlc +2 -0
  55. data/lib/rails/generators/joosy/templates/app/templates/pages/welcome/index.jst.hamlc +7 -0
  56. data/lib/rails/generators/joosy/templates/app/widgets/template.js.coffee +2 -0
  57. data/lib/rails/generators/joosy/templates/app_controller.rb +9 -0
  58. data/lib/rails/generators/joosy/templates/app_preloader.js.coffee.erb +13 -0
  59. data/lib/rails/generators/joosy/templates/preload.html.erb +26 -0
  60. data/lib/rails/generators/joosy/templates/preload.html.haml +19 -0
  61. data/lib/rails/generators/joosy/widget_generator.rb +32 -0
  62. data/spec/javascripts/helpers/spec_helper.js.coffee +44 -0
  63. data/spec/javascripts/joosy/core/application_spec.js.coffee +40 -0
  64. data/spec/javascripts/joosy/core/form_spec.js.coffee +141 -0
  65. data/spec/javascripts/joosy/core/joosy_spec.js.coffee +72 -0
  66. data/spec/javascripts/joosy/core/layout_spec.js.coffee +50 -0
  67. data/spec/javascripts/joosy/core/modules/container_spec.js.coffee +92 -0
  68. data/spec/javascripts/joosy/core/modules/events_spec.js.coffee +53 -0
  69. data/spec/javascripts/joosy/core/modules/filters_spec.js.coffee +71 -0
  70. data/spec/javascripts/joosy/core/modules/log_spec.js.coffee +15 -0
  71. data/spec/javascripts/joosy/core/modules/module_spec.js.coffee +47 -0
  72. data/spec/javascripts/joosy/core/modules/renderer_spec.js.coffee +149 -0
  73. data/spec/javascripts/joosy/core/modules/time_manager_spec.js.coffee +25 -0
  74. data/spec/javascripts/joosy/core/modules/widget_manager_spec.js.coffee +75 -0
  75. data/spec/javascripts/joosy/core/page_spec.js.coffee +175 -0
  76. data/spec/javascripts/joosy/core/resource/generic_spec.js.coffee +35 -0
  77. data/spec/javascripts/joosy/core/resource/rest_collection_spec.js.coffee +65 -0
  78. data/spec/javascripts/joosy/core/resource/rest_spec.js.coffee +108 -0
  79. data/spec/javascripts/joosy/core/router_spec.js.coffee +123 -0
  80. data/spec/javascripts/joosy/core/templaters/rails_jst_spec.js.coffee +25 -0
  81. data/spec/javascripts/joosy/core/widget_spec.js.coffee +51 -0
  82. data/spec/javascripts/joosy/preloaders/caching_spec.js.coffee +36 -0
  83. data/spec/javascripts/joosy/preloaders/inline_spec.js.coffee +16 -0
  84. data/spec/javascripts/support/assets/coolface.jpg +0 -0
  85. data/spec/javascripts/support/assets/okay.jpg +0 -0
  86. data/spec/javascripts/support/assets/test.js +1 -0
  87. data/spec/javascripts/support/jasmine.yml +74 -0
  88. data/spec/javascripts/support/jasmine_config.rb +23 -0
  89. data/spec/javascripts/support/jasmine_runner.rb +32 -0
  90. data/spec/javascripts/support/sinon-1.3.1.js +3469 -0
  91. data/spec/javascripts/support/sinon-ie-1.3.1.js +82 -0
  92. data/vendor/assets/javascripts/base64.js +135 -0
  93. data/vendor/assets/javascripts/inflection.js +656 -0
  94. data/vendor/assets/javascripts/jquery.form.js +980 -0
  95. data/vendor/assets/javascripts/jquery.hashchange.js +390 -0
  96. data/vendor/assets/javascripts/metamorph.js +409 -0
  97. data/vendor/assets/javascripts/sugar.js +6040 -0
  98. metadata +232 -0
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ .idea/
2
+ .bundle/
3
+ log/*.log
4
+ pkg/
5
+ tmp/
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in joosy.gemspec
4
+ gemspec
5
+
6
+ gem 'jasmine', :git => 'git://github.com/pivotal/jasmine-gem.git'
7
+ gem 'guard-sprockets', :git => 'git://github.com/roundlake/guard-sprockets.git'
8
+
9
+ group :test do
10
+ if RUBY_PLATFORM =~ /linux/
11
+ gem 'rb-inotify'
12
+ gem 'libnotify'
13
+ end
14
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,159 @@
1
+ GIT
2
+ remote: git://github.com/pivotal/jasmine-gem.git
3
+ revision: 953d17dff4b4adba79b2a808b55cf33f4ff93af7
4
+ specs:
5
+ jasmine (1.2.0.rc2)
6
+ jasmine-core (>= 1.2.0.rc1)
7
+ rack (>= 1.1)
8
+ rspec (>= 1.3.1)
9
+ selenium-webdriver (>= 0.1.3)
10
+
11
+ GIT
12
+ remote: git://github.com/roundlake/guard-sprockets.git
13
+ revision: ba7574363f41b2c2c950f095b3b5cfc08762a6cc
14
+ specs:
15
+ guard-sprockets (0.2.0)
16
+ guard (>= 0.2.2)
17
+ sprockets (~> 2)
18
+
19
+ PATH
20
+ remote: .
21
+ specs:
22
+ joosy (0.1.0.alpha)
23
+ coffee-rails
24
+ haml_coffee_assets
25
+ jquery-rails
26
+ rails (>= 3.1.0)
27
+
28
+ GEM
29
+ remote: http://rubygems.org/
30
+ specs:
31
+ actionmailer (3.2.1)
32
+ actionpack (= 3.2.1)
33
+ mail (~> 2.4.0)
34
+ actionpack (3.2.1)
35
+ activemodel (= 3.2.1)
36
+ activesupport (= 3.2.1)
37
+ builder (~> 3.0.0)
38
+ erubis (~> 2.7.0)
39
+ journey (~> 1.0.1)
40
+ rack (~> 1.4.0)
41
+ rack-cache (~> 1.1)
42
+ rack-test (~> 0.6.1)
43
+ sprockets (~> 2.1.2)
44
+ activemodel (3.2.1)
45
+ activesupport (= 3.2.1)
46
+ builder (~> 3.0.0)
47
+ activerecord (3.2.1)
48
+ activemodel (= 3.2.1)
49
+ activesupport (= 3.2.1)
50
+ arel (~> 3.0.0)
51
+ tzinfo (~> 0.3.29)
52
+ activeresource (3.2.1)
53
+ activemodel (= 3.2.1)
54
+ activesupport (= 3.2.1)
55
+ activesupport (3.2.1)
56
+ i18n (~> 0.6)
57
+ multi_json (~> 1.0)
58
+ arel (3.0.0)
59
+ builder (3.0.0)
60
+ childprocess (0.3.0)
61
+ ffi (~> 1.0.6)
62
+ coffee-rails (3.2.2)
63
+ coffee-script (>= 2.2.0)
64
+ railties (~> 3.2.0)
65
+ coffee-script (2.2.0)
66
+ coffee-script-source
67
+ execjs
68
+ coffee-script-source (1.2.0)
69
+ diff-lcs (1.1.3)
70
+ erubis (2.7.0)
71
+ execjs (1.3.0)
72
+ multi_json (~> 1.0)
73
+ ffi (1.0.11)
74
+ ffi (1.0.11-java)
75
+ guard (1.0.0)
76
+ ffi (>= 0.5.0)
77
+ thor (~> 0.14.6)
78
+ guard-coffeescript (0.5.4)
79
+ coffee-script (>= 2.2.0)
80
+ guard (>= 0.8.3)
81
+ haml_coffee_assets (0.7.1)
82
+ execjs (>= 1.2.9)
83
+ sprockets (>= 2.0.3)
84
+ tilt (>= 1.3.3)
85
+ hike (1.2.1)
86
+ i18n (0.6.0)
87
+ jasmine-core (1.2.0.rc1)
88
+ journey (1.0.1)
89
+ jquery-rails (2.0.0)
90
+ railties (>= 3.2.0.beta, < 5.0)
91
+ thor (~> 0.14)
92
+ json (1.6.5)
93
+ mail (2.4.1)
94
+ i18n (>= 0.4.0)
95
+ mime-types (~> 1.16)
96
+ treetop (~> 1.4.8)
97
+ mime-types (1.17.2)
98
+ multi_json (1.0.4)
99
+ polyglot (0.3.3)
100
+ rack (1.4.1)
101
+ rack-cache (1.1)
102
+ rack (>= 0.4)
103
+ rack-ssl (1.3.2)
104
+ rack
105
+ rack-test (0.6.1)
106
+ rack (>= 1.0)
107
+ rails (3.2.1)
108
+ actionmailer (= 3.2.1)
109
+ actionpack (= 3.2.1)
110
+ activerecord (= 3.2.1)
111
+ activeresource (= 3.2.1)
112
+ activesupport (= 3.2.1)
113
+ bundler (~> 1.0)
114
+ railties (= 3.2.1)
115
+ railties (3.2.1)
116
+ actionpack (= 3.2.1)
117
+ activesupport (= 3.2.1)
118
+ rack-ssl (~> 1.3.2)
119
+ rake (>= 0.8.7)
120
+ rdoc (~> 3.4)
121
+ thor (~> 0.14.6)
122
+ rake (0.9.2.2)
123
+ rdoc (3.12)
124
+ json (~> 1.4)
125
+ rspec (2.8.0)
126
+ rspec-core (~> 2.8.0)
127
+ rspec-expectations (~> 2.8.0)
128
+ rspec-mocks (~> 2.8.0)
129
+ rspec-core (2.8.0)
130
+ rspec-expectations (2.8.0)
131
+ diff-lcs (~> 1.1.2)
132
+ rspec-mocks (2.8.0)
133
+ rubyzip (0.9.5)
134
+ selenium-webdriver (2.17.0)
135
+ childprocess (>= 0.2.5)
136
+ ffi (~> 1.0.9)
137
+ multi_json (~> 1.0.4)
138
+ rubyzip
139
+ sprockets (2.1.2)
140
+ hike (~> 1.2)
141
+ rack (~> 1.0)
142
+ tilt (~> 1.1, != 1.3.0)
143
+ thor (0.14.6)
144
+ tilt (1.3.3)
145
+ treetop (1.4.10)
146
+ polyglot
147
+ polyglot (>= 0.3.1)
148
+ tzinfo (0.3.31)
149
+
150
+ PLATFORMS
151
+ java
152
+ ruby
153
+
154
+ DEPENDENCIES
155
+ guard
156
+ guard-coffeescript
157
+ guard-sprockets!
158
+ jasmine!
159
+ joosy!
data/Guardfile ADDED
@@ -0,0 +1,30 @@
1
+ guard 'coffeescript', :output => 'tmp/spec/javascripts' do
2
+ watch(%r{^spec/javascripts/(.+)[sS]pec\.js\.coffee$})
3
+ end
4
+
5
+ guard 'coffeescript', :output => 'tmp/spec/javascripts/helpers' do
6
+ watch(%r{^spec/javascripts/helpers/(.+)\.js\.coffee$})
7
+ end
8
+
9
+ jquery_path = File.join(Gem.loaded_specs['jquery-rails'].full_gem_path, 'vendor/assets/javascripts')
10
+
11
+ guard 'sprockets', :destination => 'tmp/javascripts',
12
+ :asset_paths => ['app/assets/javascripts', 'vendor/assets/javascripts', jquery_path],
13
+ :root_file => 'app/assets/javascripts/joosy.js.coffee' do
14
+ watch %r{^app/assets/javascripts/joosy/core.+\.js}
15
+ watch 'app/assets/javascripts/joosy.js.coffee'
16
+ end
17
+
18
+ guard 'sprockets', :destination => 'tmp/javascripts',
19
+ :asset_paths => ['app/assets/javascripts', 'vendor/assets/javascripts', jquery_path],
20
+ :root_file => 'app/assets/javascripts/joosy/preloaders/caching.js.coffee' do
21
+ watch 'app/assets/javascripts/joosy/preloaders/caching.js.coffee'
22
+ end
23
+
24
+ guard 'sprockets', :destination => 'tmp/javascripts',
25
+ :asset_paths => ['app/assets/javascripts', 'vendor/assets/javascripts', jquery_path],
26
+ :root_file => 'app/assets/javascripts/joosy/preloaders/inline.js.coffee' do
27
+ watch 'app/assets/javascripts/joosy/preloaders/inline.js.coffee'
28
+ end
29
+
30
+ puts 'HI! Hit <Enter> to generate all stuff.'
data/MIT-LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ Copyright (C) 2011 by Boris Staal <boris@roundlake.ru>,
2
+ Peter Zotov <p.zotov@roundlake.ru>.
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining
5
+ a copy of this software and associated documentation files (the
6
+ "Software"), to deal in the Software without restriction, including
7
+ without limitation the rights to use, copy, modify, merge, publish,
8
+ distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so, subject to
10
+ the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,3 @@
1
+ = Joosy on Rails
2
+
3
+ $ rails generate joosy_boilerplate yourapp
data/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ begin
4
+ require 'jasmine'
5
+ load 'jasmine/tasks/jasmine.rake'
6
+ rescue LoadError
7
+ task :jasmine do
8
+ abort "Jasmine is not available. In order to run jasmine, you must: (sudo) gem install jasmine"
9
+ end
10
+ end
11
+
12
+ task :guard do
13
+ `bundle exec guard`
14
+ end
@@ -0,0 +1,7 @@
1
+ #= require jquery
2
+ #= require jquery_ujs
3
+ #= require jquery.hashchange
4
+ #= require jquery.form
5
+ #= require sugar
6
+ #= require inflection
7
+ #= require_tree ./joosy/core
@@ -0,0 +1,28 @@
1
+ #= require joosy/core/joosy
2
+
3
+ Joosy.Application =
4
+ Pages: {}
5
+ Layouts: {}
6
+ Controls: {}
7
+
8
+ selector: false
9
+
10
+ initialize: (@name, @selector, options={}) ->
11
+ @[key] = value for key, value of options
12
+ @templater = new Joosy.Templaters.RailsJST(@name)
13
+
14
+ Joosy.Router.setupRoutes()
15
+
16
+ @sandboxSelector = Joosy.uuid()
17
+ @content().after("<div id='#{@sandboxSelector}' style='display:none'></div>")
18
+ @sandboxSelector = '#' + @sandboxSelector
19
+
20
+ content: ->
21
+ $(@selector)
22
+
23
+ sandbox: ->
24
+ $(@sandboxSelector)
25
+
26
+ setCurrentPage: (page, params) ->
27
+ #if @page not instanceof page
28
+ @page = new page(params, @page)
@@ -0,0 +1,87 @@
1
+ #= require joosy/core/joosy
2
+ #= require joosy/core/modules/module
3
+ #= require joosy/core/modules/log
4
+ #= require joosy/core/modules/events
5
+ #= require joosy/core/modules/container
6
+
7
+ class Joosy.Form extends Joosy.Module
8
+ @include Joosy.Modules.Log
9
+ @include Joosy.Modules.Events
10
+ @include Joosy.Modules.Container
11
+
12
+ invalidationClass: 'field_with_errors'
13
+ substitutions: {}
14
+
15
+ elements:
16
+ 'fields': 'input,select,textarea'
17
+
18
+ constructor: (form, opts={}) ->
19
+ if Object.isFunction opts
20
+ @success = opts
21
+ else
22
+ Object.extended(opts).each (key, value) =>
23
+ @[key] = value
24
+
25
+ @container = $(form)
26
+ @refreshElements()
27
+ @__delegateEvents()
28
+
29
+ if (method = @container.get(0).getAttribute('method')?.toLowerCase()) && !['get', 'post'].has(method)
30
+ @__markMethod method
31
+ @container.attr 'method', 'POST'
32
+
33
+ @container.ajaxForm
34
+ dataType: 'json'
35
+ beforeSend: => @__before(arguments...)
36
+ success: => @__success(arguments...)
37
+ error: => @__error(arguments...)
38
+ xhr: =>
39
+ xhr = $.ajaxSettings.xhr()
40
+ if xhr.upload? && @progress
41
+ xhr.upload.onprogress = (event) =>
42
+ @progress (event.position/event.total*100).round(2) if event.lengthComputable
43
+ xhr
44
+
45
+ fill: (resource, decorator) ->
46
+ e = if decorator? then decorator(resource.e) else resource.e
47
+ Object.each e, (key, val) =>
48
+ key = resource.constructor.entityName()+"[#{key}]"
49
+ @fields.filter("[name='#{key.underscore()}']:not(:file),[name='#{key.camelize(false)}']:not(:file)").val(val)
50
+
51
+ @container.attr 'action', resource.constructor.__buildSource(extension: resource.id)
52
+ @__markMethod() if resource.id
53
+ @container.attr 'method', 'POST'
54
+
55
+ __success: (response, status, xhr) ->
56
+ if xhr
57
+ @success(response)
58
+ else if response.status == 200
59
+ @success(response.json)
60
+ else
61
+ @__error(response.json)
62
+
63
+ __before: (xhr, settings) ->
64
+ if !@before? || @before(arguments...) is true
65
+ @fields.removeClass(@invalidationClass)
66
+
67
+ __error: (data) ->
68
+ errors = if data.responseText
69
+ try
70
+ Object.extended(jQuery.parseJSON(data.responseText))
71
+ catch error
72
+ Object.extended()
73
+ else
74
+ Object.extended(data)
75
+
76
+ if !@error? || @error(errors) is true
77
+ errors.each (field, notifications) =>
78
+ field = @substitutions[field] if @substitutions[field]?
79
+ input = @fields.filter("[name='#{field}']").addClass(@invalidationClass)
80
+ @notification?(input, notifications)
81
+
82
+ __markMethod: (method='PUT') ->
83
+ method = $ '<input/>',
84
+ type: 'hidden'
85
+ name: '_method'
86
+ value: method
87
+ @container.append(method)
@@ -0,0 +1,6 @@
1
+ #= require joosy/core/joosy
2
+
3
+ Joosy.helpers 'Application', ->
4
+
5
+ @nl2br = (text) ->
6
+ text.toString().replace(/\n/g, '<br/>')
@@ -0,0 +1,65 @@
1
+ @Joosy = Object.extended(if @Joosy? then @Joosy else {})
2
+
3
+ @Joosy.merge
4
+ debug: false
5
+ Modules: {}
6
+ Resource: {}
7
+ Templaters: {}
8
+
9
+ Joosy.namespace = (name, generator=false) ->
10
+ name = name.split('.')
11
+ space = window
12
+ space = space[part] ?= {} for part in name
13
+
14
+ generator = generator.apply(space) if generator
15
+ for key, klass of space
16
+ if space.hasOwnProperty(key) &&
17
+ Joosy.Module.hasAncestor(klass, Joosy.Module)
18
+ klass.__namespace__ = name
19
+
20
+ Joosy.helpers = (name, generator) ->
21
+ Joosy.namespace("Joosy.Helpers.#{name}", generator)
22
+
23
+ Joosy.test = ->
24
+ text = "Hi :). I'm Joosy. And everything is just fine!"
25
+
26
+ if console
27
+ console.log text
28
+ else
29
+ alert text
30
+
31
+ Joosy.uuid = ->
32
+ 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace /[xy]/g, (c) ->
33
+ r = Math.random() * 16 | 0
34
+ v = if c is 'x' then r else r & 3 | 8
35
+ v.toString 16
36
+ .toUpperCase()
37
+
38
+ Joosy.preloadImages = (images, callback) ->
39
+ images = [images] if !Object.isArray(images)
40
+ callback() if images.length == 0
41
+
42
+ ticks = images.length
43
+ result = []
44
+ checker = ->
45
+ callback?() if (ticks -= 1) == 0
46
+
47
+ for p in images
48
+ result.push $('<img/>').load(checker).attr('src', p)
49
+
50
+ result
51
+
52
+ Joosy.buildUrl = (url, params) ->
53
+ paramsString = []
54
+
55
+ Object.each params, (key, value) ->
56
+ paramsString.push("#{key}=#{value}")
57
+
58
+ hash = url.match(/(\#.*)?$/)[0]
59
+ url = url.replace(/\#.*$/, '')
60
+ url = url + "?" if !paramsString.isEmpty() && !url.has(/\?/)
61
+
62
+ paramsString = paramsString.join('&')
63
+ paramsString = '&' + paramsString if paramsString != '' && url.last() != '?'
64
+
65
+ url + paramsString + hash