joosy 0.1.0.RC3 → 0.1.0.alpha

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 (115) hide show
  1. data/.gitignore +0 -2
  2. data/Gemfile +2 -13
  3. data/Gemfile.lock +62 -80
  4. data/Guardfile +15 -21
  5. data/MIT-LICENSE +2 -2
  6. data/README.rdoc +3 -0
  7. data/app/helpers/joosy/sprockets_helper.rb +11 -23
  8. data/joosy.gemspec +3 -3
  9. data/lib/joosy/forms.rb +12 -2
  10. data/lib/joosy/rails/engine.rb +1 -9
  11. data/lib/joosy/rails/version.rb +2 -2
  12. data/lib/joosy-rails.rb +5 -0
  13. data/lib/rails/generators/joosy/application_generator.rb +3 -13
  14. data/lib/rails/generators/joosy/joosy_base.rb +2 -2
  15. data/lib/rails/generators/joosy/layout_generator.rb +1 -8
  16. data/lib/rails/generators/joosy/page_generator.rb +6 -21
  17. data/lib/rails/generators/joosy/preloader_generator.rb +7 -14
  18. data/lib/rails/generators/joosy/templates/app/layouts/application.js.coffee +0 -1
  19. data/lib/rails/generators/joosy/templates/app/layouts/template.js.coffee +1 -1
  20. data/lib/rails/generators/joosy/templates/app/pages/application.js.coffee +1 -1
  21. data/lib/rails/generators/joosy/templates/app/pages/template.js.coffee +3 -3
  22. data/lib/rails/generators/joosy/templates/app/routes.js.coffee +1 -7
  23. data/lib/rails/generators/joosy/templates/app/widgets/template.js.coffee +2 -2
  24. data/lib/rails/generators/joosy/templates/app.js.coffee +0 -3
  25. data/lib/rails/generators/joosy/templates/app_preloader.js.coffee.erb +12 -9
  26. data/lib/rails/generators/joosy/templates/preload.html.erb +6 -5
  27. data/lib/rails/generators/joosy/templates/preload.html.haml +5 -3
  28. data/lib/rails/generators/joosy/templates/preload.html.slim +21 -0
  29. data/lib/rails/generators/joosy/widget_generator.rb +1 -8
  30. data/spec/javascripts/helpers/spec_helper.js.coffee +0 -20
  31. data/spec/javascripts/joosy/core/modules/container_spec.js.coffee +27 -24
  32. data/spec/javascripts/joosy/core/modules/events_spec.js.coffee +18 -42
  33. data/spec/javascripts/joosy/core/modules/filters_spec.js.coffee +27 -27
  34. data/spec/javascripts/joosy/core/modules/log_spec.js.coffee +3 -3
  35. data/spec/javascripts/joosy/core/modules/module_spec.js.coffee +15 -6
  36. data/spec/javascripts/joosy/core/modules/time_manager_spec.js.coffee +7 -12
  37. data/spec/javascripts/joosy/core/modules/widget_manager_spec.js.coffee +17 -31
  38. data/tmp/javascripts/.gitignore +1 -0
  39. data/tmp/spec/javascripts/helpers/.gitignore +1 -0
  40. data/vendor/assets/javascripts/base64.js +135 -0
  41. data/vendor/assets/javascripts/joosy/core/application.js.coffee +26 -0
  42. data/vendor/assets/javascripts/joosy/core/form.js.coffee +87 -0
  43. data/vendor/assets/javascripts/joosy/core/joosy.js.coffee +62 -0
  44. data/vendor/assets/javascripts/joosy/core/layout.js.coffee +38 -0
  45. data/vendor/assets/javascripts/joosy/core/modules/container.js.coffee +51 -0
  46. data/vendor/assets/javascripts/joosy/core/modules/events.js.coffee +17 -0
  47. data/vendor/assets/javascripts/joosy/core/modules/filters.js.coffee +39 -0
  48. data/vendor/assets/javascripts/joosy/core/modules/log.js.coffee +12 -0
  49. data/vendor/assets/javascripts/joosy/core/modules/module.js.coffee +28 -0
  50. data/vendor/assets/javascripts/joosy/core/modules/time_manager.js.coffee +23 -0
  51. data/vendor/assets/javascripts/joosy/core/modules/widgets_manager.js.coffee +45 -0
  52. data/vendor/assets/javascripts/joosy/core/page.js.coffee +136 -0
  53. data/vendor/assets/javascripts/joosy/core/resource/rest.js.coffee +69 -0
  54. data/vendor/assets/javascripts/joosy/core/resource/rest_collection.js.coffee +42 -0
  55. data/vendor/assets/javascripts/joosy/core/router.js.coffee +75 -0
  56. data/vendor/assets/javascripts/joosy/core/widget.js.coffee +35 -0
  57. data/vendor/assets/javascripts/joosy/preloader/development.js.coffee +27 -0
  58. data/vendor/assets/javascripts/joosy/preloader/production.js.coffee +84 -0
  59. data/{app → vendor}/assets/javascripts/joosy.js.coffee +0 -0
  60. data/vendor/assets/javascripts/jquery.form.js +963 -978
  61. data/vendor/assets/javascripts/sugar.js +1 -1
  62. metadata +48 -77
  63. data/.codoopts +0 -5
  64. data/README.md +0 -95
  65. data/app/assets/javascripts/joosy/core/application.js.coffee +0 -50
  66. data/app/assets/javascripts/joosy/core/form.js.coffee +0 -304
  67. data/app/assets/javascripts/joosy/core/helpers/view.js.coffee +0 -30
  68. data/app/assets/javascripts/joosy/core/joosy.js.coffee +0 -129
  69. data/app/assets/javascripts/joosy/core/layout.js.coffee +0 -162
  70. data/app/assets/javascripts/joosy/core/modules/container.js.coffee +0 -104
  71. data/app/assets/javascripts/joosy/core/modules/events.js.coffee +0 -123
  72. data/app/assets/javascripts/joosy/core/modules/filters.js.coffee +0 -67
  73. data/app/assets/javascripts/joosy/core/modules/log.js.coffee +0 -36
  74. data/app/assets/javascripts/joosy/core/modules/module.js.coffee +0 -105
  75. data/app/assets/javascripts/joosy/core/modules/renderer.js.coffee +0 -195
  76. data/app/assets/javascripts/joosy/core/modules/time_manager.js.coffee +0 -46
  77. data/app/assets/javascripts/joosy/core/modules/widgets_manager.js.coffee +0 -84
  78. data/app/assets/javascripts/joosy/core/page.js.coffee +0 -375
  79. data/app/assets/javascripts/joosy/core/preloader.js.coffee +0 -13
  80. data/app/assets/javascripts/joosy/core/resource/collection.js.coffee +0 -174
  81. data/app/assets/javascripts/joosy/core/resource/generic.js.coffee +0 -254
  82. data/app/assets/javascripts/joosy/core/resource/rest.js.coffee +0 -197
  83. data/app/assets/javascripts/joosy/core/resource/rest_collection.js.coffee +0 -125
  84. data/app/assets/javascripts/joosy/core/router.js.coffee +0 -163
  85. data/app/assets/javascripts/joosy/core/templaters/rails_jst.js.coffee +0 -36
  86. data/app/assets/javascripts/joosy/core/widget.js.coffee +0 -80
  87. data/app/assets/javascripts/joosy/preloaders/caching.js.coffee +0 -169
  88. data/app/assets/javascripts/joosy/preloaders/inline.js.coffee +0 -56
  89. data/lib/joosy.rb +0 -9
  90. data/lib/rails/generators/joosy/resource_generator.rb +0 -29
  91. data/lib/rails/generators/joosy/templates/app/helpers/application.js.coffee +0 -4
  92. data/lib/rails/generators/joosy/templates/app/pages/welcome/index.js.coffee +0 -22
  93. data/lib/rails/generators/joosy/templates/app/resources/template.js.coffee +0 -2
  94. data/lib/rails/generators/joosy/templates/app/templates/layouts/application.jst.hamlc +0 -2
  95. data/lib/rails/generators/joosy/templates/app/templates/pages/welcome/index.jst.hamlc +0 -7
  96. data/spec/javascripts/joosy/core/application_spec.js.coffee +0 -40
  97. data/spec/javascripts/joosy/core/form_spec.js.coffee +0 -184
  98. data/spec/javascripts/joosy/core/joosy_spec.js.coffee +0 -72
  99. data/spec/javascripts/joosy/core/layout_spec.js.coffee +0 -50
  100. data/spec/javascripts/joosy/core/modules/renderer_spec.js.coffee +0 -185
  101. data/spec/javascripts/joosy/core/page_spec.js.coffee +0 -178
  102. data/spec/javascripts/joosy/core/resource/collection_spec.js.coffee +0 -84
  103. data/spec/javascripts/joosy/core/resource/generic_spec.js.coffee +0 -118
  104. data/spec/javascripts/joosy/core/resource/rest_collection_spec.js.coffee +0 -58
  105. data/spec/javascripts/joosy/core/resource/rest_spec.js.coffee +0 -129
  106. data/spec/javascripts/joosy/core/router_spec.js.coffee +0 -123
  107. data/spec/javascripts/joosy/core/templaters/rails_jst_spec.js.coffee +0 -25
  108. data/spec/javascripts/joosy/core/widget_spec.js.coffee +0 -40
  109. data/spec/javascripts/joosy/preloaders/caching_spec.js.coffee +0 -36
  110. data/spec/javascripts/joosy/preloaders/inline_spec.js.coffee +0 -16
  111. data/spec/javascripts/support/assets/coolface.jpg +0 -0
  112. data/spec/javascripts/support/assets/okay.jpg +0 -0
  113. data/spec/javascripts/support/assets/test.js +0 -1
  114. data/spec/javascripts/support/sinon-ie-1.3.1.js +0 -82
  115. data/vendor/assets/javascripts/metamorph.js +0 -409
@@ -0,0 +1,136 @@
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
+ #= require joosy/core/modules/time_manager
7
+ #= require joosy/core/modules/widgets_manager
8
+ #= require joosy/core/modules/filters
9
+
10
+ class Joosy.Page extends Joosy.Module
11
+ @include Joosy.Modules.Log
12
+ @include Joosy.Modules.Events
13
+ @include Joosy.Modules.Container
14
+ @include Joosy.Modules.TimeManager
15
+ @include Joosy.Modules.WidgetsManager
16
+ @include Joosy.Modules.Filters
17
+
18
+ layout: false
19
+ previous: false
20
+ params: false
21
+ source: false
22
+ data: false
23
+
24
+ @fetch: (callback) -> @::__fetch = callback
25
+ @scroll: (element, options={}) ->
26
+ @::__scrollElement = element
27
+ @::__scrollSpeed = options.speed || 500
28
+ @::__scrollMargin = options.margin || 0
29
+
30
+ @beforePageRender: (callback) -> @::__beforePageRender = callback
31
+ @afterPageRender: (callback) -> @::__afterPageRender = callback
32
+ @onPageRender: (callback) -> @::__onPageRender = callback
33
+
34
+ @beforeLayoutRender: (callback) -> @::__beforeLayoutRender = callback
35
+ @afterLayoutRender: (callback) -> @::__afterLayoutRender = callback
36
+ @onLayoutRender: (callback) -> @::__onLayoutRender = callback
37
+
38
+ constructor: (@params, @previous) ->
39
+ @layout ||= ApplicationLayout
40
+
41
+ if @__runBeforeLoads(@params, @previous)
42
+ if @previous?.layout not instanceof @layout
43
+ @__renderLayout()
44
+ else
45
+ @__render()
46
+
47
+ navigate: (args...) -> Joosy.Router.navigate(args...)
48
+
49
+ __load: ->
50
+ @refreshElements()
51
+ @__delegateEvents()
52
+ @__setupWidgets()
53
+ @__runAfterLoads(@params, @previous)
54
+ if @__scrollElement
55
+ scroll = $(@__extractSelector(@__scrollElement)).offset()?.top + @__scrollMargin
56
+ $('html, body').animate({scrollTop: scroll}, @__scrollSpeed)
57
+
58
+ __unload: ->
59
+ @clearTime()
60
+ @__unloadWidgets()
61
+ @__runAfterUnloads(@params, @previous)
62
+
63
+ __render: ->
64
+ @layout = @previous.layout
65
+
66
+ @wait "stageClear dataReceived", =>
67
+ @previous?.__unload()
68
+
69
+ render = =>
70
+ @swapContainer @layout.content(), @view(@data)
71
+ @container = @layout.content()
72
+
73
+ @__load()
74
+ Joosy.Beautifier.go()
75
+
76
+ if @__afterPageRender?
77
+ @__afterPageRender @layout.content()
78
+
79
+ return @layout.content()
80
+
81
+ if @__onPageRender?
82
+ @__onPageRender @layout.content(), render
83
+ else
84
+ render()
85
+
86
+ if @__beforePageRender?
87
+ @__beforePageRender @layout.content(), =>
88
+ @trigger 'stageClear'
89
+ else
90
+ @trigger 'stageClear'
91
+
92
+ if @__fetch?
93
+ @__fetch =>
94
+ @trigger 'dataReceived'
95
+ else
96
+ @trigger 'dataReceived'
97
+
98
+ __renderLayout: ->
99
+ @layout = new @layout
100
+
101
+ @wait "stageClear dataReceived", =>
102
+
103
+ @previous?.layout?.__unload?()
104
+ @previous?.__unload()
105
+
106
+ render = =>
107
+ @swapContainer Joosy.Application.content(), @layout.view(@data)
108
+ @swapContainer @layout.content(), @view(@data)
109
+ @container = @layout.content()
110
+
111
+ @layout.__load Joosy.Application.content()
112
+ @__load()
113
+ Joosy.Beautifier.go()
114
+
115
+ if @__afterLayoutRender?
116
+ @__afterLayoutRender Joosy.Application.content()
117
+
118
+ return Joosy.Application.content()
119
+
120
+ if @__onLayoutRender?
121
+ @__onLayoutRender Joosy.Application.content(), render
122
+ else
123
+ render()
124
+
125
+
126
+ if @__beforeLayoutRender?
127
+ @__beforeLayoutRender Joosy.Application.content(), =>
128
+ @trigger 'stageClear'
129
+ else
130
+ @trigger 'stageClear'
131
+
132
+ if @__fetch?
133
+ @__fetch =>
134
+ @trigger 'dataReceived'
135
+ else
136
+ @trigger 'dataReceived'
@@ -0,0 +1,69 @@
1
+ #= require ./rest_collection
2
+
3
+ class Joosy.Resource.REST extends Joosy.Module
4
+ @include Joosy.Modules.Log
5
+ @include Joosy.Modules.Events
6
+
7
+ __primaryKey: 'id'
8
+
9
+ @entity: (name) -> @__entityName = name
10
+ @primary: (primary) -> @::__primaryKey = primary
11
+ @source: (source) -> @__source = source
12
+ @beforeLoad: (action) -> @::__beforeLoad = action
13
+
14
+ constructor: (description) ->
15
+ if @constructor.__isId(description)
16
+ @id = description
17
+ else
18
+ @__fillData(description)
19
+ @id = @e[@__primaryKey]
20
+
21
+ @entityName: -> @__entityName ?= @name.underscore()
22
+
23
+ # Returns single entity if int/string given
24
+ # Returns collection if no value or Object (with parameters) given
25
+ @find: (description, callback, options) ->
26
+ if @__isId(description)
27
+ resource = new @(description)
28
+ resource.fetch callback, options
29
+ resource
30
+ else
31
+ resources = new Joosy.Resource.RESTCollection(@, description)
32
+ resources.fetch callback, options
33
+ resources
34
+
35
+ fetch: (callback, options) ->
36
+ @constructor.__ajax 'get', @constructor.__buildSource(extension: @id), options, (e) =>
37
+ @__fillData(e)
38
+ callback?(@)
39
+ @
40
+
41
+ save: ->
42
+
43
+ destroy: (callback, options) ->
44
+ @constructor.__ajax 'delete', @constructor.__buildSource(extension: @id), options, (e) =>
45
+ callback?(@)
46
+ @
47
+
48
+ @__isId: (something) -> Object.isNumber(something) || Object.isString(something)
49
+
50
+ @__ajax: (method, url, options={}, callback) ->
51
+ $.ajax url, Object.extended(
52
+ type: method
53
+ success: callback
54
+ cache: false
55
+ dataType: 'json'
56
+ ).merge options
57
+
58
+ @__buildSource: (options) ->
59
+ @__source ?= "/"+@entityName().pluralize()
60
+ source = Joosy.buildUrl("#{@__source}/#{options.extension || ''}", options.params)
61
+
62
+ __fillData: (data) ->
63
+ data = Object.extended(data)
64
+ data = @__beforeLoad(data) if @__beforeLoad?
65
+
66
+ @e = if Object.isObject(data) && data[@constructor.entityName()] && data.keys().length == 1
67
+ data[@constructor.entityName()]
68
+ else
69
+ data
@@ -0,0 +1,42 @@
1
+ class Joosy.Resource.RESTCollection extends Joosy.Module
2
+ @include Joosy.Modules.Log
3
+ @include Joosy.Modules.Events
4
+
5
+ data: []
6
+ pages: Object.extended()
7
+
8
+ constructor: (@model, params={}) -> @params = Object.extended(params)
9
+
10
+ # Clears the storage and atempts to import given JSON
11
+ reset: (entities) ->
12
+ @data = data = @modelize entities
13
+ @pages = Object.extended().merge 1: data
14
+ @
15
+
16
+ # Clears the storage and gets new data from server
17
+ fetch: (callback, options) ->
18
+ @model.__ajax 'get', @model.__buildSource(params: @params), options, (data) =>
19
+ @reset(data)
20
+ callback?(@)
21
+ @
22
+
23
+ # Returns the subset for requested page. Requests with &page=x if not found localy.
24
+ page: (number, callback=false) ->
25
+ if @pages[number]?
26
+ callback?(@pages[number])
27
+ return @
28
+
29
+ @model.__ajax 'get', @model.__buildSource(params: @params.merge(page: number)), (data) =>
30
+ @pages[number] = @modelize data
31
+
32
+ @data = []
33
+ @pages.keys().sort().each (x) => @data.add @pages[x]
34
+
35
+ callback?(@pages[number])
36
+ @
37
+
38
+ modelize: (collection) ->
39
+ if collection instanceof Array
40
+ collection.map (x) => new @model(x)
41
+ else
42
+ []
@@ -0,0 +1,75 @@
1
+ #= require joosy/core/joosy
2
+
3
+ Joosy.Router =
4
+ rawRoutes: Object.extended()
5
+ routes: Object.extended()
6
+
7
+ map: (routes) ->
8
+ @rawRoutes.merge routes
9
+
10
+ setupRoutes: ->
11
+ @prepareRoutes @rawRoutes
12
+
13
+ @respondRoute(location.hash)
14
+ $(window).hashchange => @respondRoute(location.hash)
15
+
16
+ prepareRoutes: (routes, namespace='') ->
17
+ if !namespace && routes[404]
18
+ @wildcardAction = routes[404]
19
+ delete routes[404]
20
+ routes.each (path, response) =>
21
+ path = (namespace+path).replace(/\/{2,}/, '/')
22
+ if response && (typeof(response) == 'function' || response.prototype?)
23
+ @prepareRoute path, response
24
+ else
25
+ @prepareRoutes Object.extended(response), path
26
+
27
+ prepareRoute: (path, response) ->
28
+ matchPath = path.replace(/\/:([^\/]+)/g, '/([^/]+)').replace(/^\/?/, '^/?').replace(/\/?$/, '/?$')
29
+ @routes[matchPath] =
30
+ capture : (path.match(/\/:[^\/]+/g) || []).map((str) -> str.substr(2))
31
+ action : response
32
+
33
+ respondRoute: (hash) ->
34
+ fullPath = hash.replace(/^#!?/, '')
35
+
36
+ if @currentPath != fullPath
37
+ @currentPath = fullPath
38
+ found = false
39
+
40
+ paramStr = fullPath.split('&')
41
+ path = paramStr.shift()
42
+ urlParams = @getUrlParams(paramStr)
43
+
44
+ for regex, route of @routes when @routes.hasOwnProperty(regex)
45
+ if vals = path.match(new RegExp(regex))
46
+ params = @getRouteParams(vals, route).merge urlParams
47
+
48
+ if !Joosy.Module.hasAncestor(route.action, Joosy.Page)
49
+ route.action.call(this, params)
50
+ else
51
+ Joosy.Application.setCurrentPage(route.action, params)
52
+ found = true
53
+ break
54
+
55
+ if !found && @wildcardAction
56
+ @wildcardAction(path, urlParams)
57
+
58
+ getRouteParams: (vals, route) ->
59
+ params = Object.extended()
60
+ vals.shift()
61
+ for param in route.capture
62
+ params[param] = vals.shift()
63
+ return params
64
+
65
+ getUrlParams: (paramStr) ->
66
+ params = {}
67
+ if paramStr
68
+ $.each paramStr, () ->
69
+ if @ != ''
70
+ pair = @.split '='
71
+ params[pair[0]] = pair[1]
72
+ return params
73
+
74
+ navigate: (to) ->
75
+ location.hash = '!'+to
@@ -0,0 +1,35 @@
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
+ #= require joosy/core/modules/filters
7
+
8
+ class Joosy.Widget extends Joosy.Module
9
+ @include Joosy.Modules.Log
10
+ @include Joosy.Modules.Events
11
+ @include Joosy.Modules.Container
12
+ @include Joosy.Modules.Filters
13
+
14
+ __render: false
15
+
16
+ @render: (callback) ->
17
+ @::__render = callback
18
+
19
+ setInterval: (args...) ->
20
+ @parent.setInterval(args...)
21
+
22
+ setTimeout: (args...) ->
23
+ @parent.setTimeout(args...)
24
+
25
+ navigate: (args...) -> Joosy.Router.navigate(args...)
26
+
27
+ __load: (@parent, @container) ->
28
+ @__render?()
29
+ @refreshElements()
30
+ @__delegateEvents()
31
+ @__runAfterLoads()
32
+ return @
33
+
34
+ __unload: ->
35
+ @__runAfterUnloads()
@@ -0,0 +1,27 @@
1
+ @Preloader =
2
+ receive: (url, callback) ->
3
+ head = document.getElementsByTagName("head")[0]
4
+ script = document.createElement("script")
5
+ script.src = url# + (if url.match(/\?/) then '&' else '?') + "rand=" + Math.random()
6
+
7
+ done = false
8
+
9
+ proceed = ->
10
+ if ( !done && (!this.readyState ||
11
+ this.readyState == "loaded" || this.readyState == "complete") )
12
+
13
+ done = true and callback() if callback
14
+ script.onload = script.onreadystatechange = null
15
+
16
+ script.onload = script.onreadystatechange = proceed
17
+
18
+ head.appendChild(script)
19
+ return undefined
20
+
21
+ load: (libraries) ->
22
+ @start?.call window
23
+
24
+ if libraries.length > 0
25
+ @receive libraries.shift()[0], => @load(libraries)
26
+ else
27
+ @complete?.call window
@@ -0,0 +1,84 @@
1
+ #= require base64
2
+
3
+ window.globalEval = (src) ->
4
+ if window.execScript
5
+ window.execScript src
6
+ else
7
+ fn = ->
8
+ window.eval.call window,src
9
+ fn()
10
+
11
+ @Preloader =
12
+ force: false
13
+ prefix: "cache:"
14
+
15
+ libraries: []
16
+ counter: 0
17
+
18
+ complete: false
19
+
20
+ ajax: (url, size, callback) ->
21
+ x = this.ActiveXObject
22
+ x = new (if x then x else XMLHttpRequest)('Microsoft.XMLHTTP')
23
+
24
+ x.open('GET', url, 1)
25
+ x.setRequestHeader('Content-type','application/x-www-form-urlencoded')
26
+
27
+ if @progress
28
+ x.onprogress = (event) =>
29
+ total = if size then size else event.total
30
+ @progress.call window, Math.round(event.loaded / total * 100 * @counter / @libraries.length), event
31
+
32
+ x.onreadystatechange = () -> callback(x) if callback? && x.readyState > 3
33
+ x.send()
34
+
35
+ restore: ->
36
+ for name, i in @libraries
37
+ code = window.localStorage.getItem(name)
38
+ window.globalEval if window.navigator.appName == "Microsoft Internet Explorer" then Base64.decode(code) else code
39
+ @complete?.call window, (true)
40
+
41
+ download: (libraries) ->
42
+ if libraries.length > 0
43
+ @counter += 1
44
+
45
+ lib = libraries.shift()
46
+ url = lib[0]
47
+ size = lib[1]
48
+
49
+ @ajax url, size, (xhr) =>
50
+ code = xhr.responseText
51
+ window.localStorage.setItem @prefix+url, (if window.navigator.appName == "Microsoft Internet Explorer" then Base64.encode(code) else code)
52
+ window.globalEval xhr.responseText
53
+ @download(libraries)
54
+ else
55
+ @clean()
56
+ @complete?.call window, false
57
+
58
+ load: (libraries) ->
59
+ @libraries = libraries.slice()
60
+
61
+ for lib, i in @libraries
62
+ @libraries[i] = @prefix+lib[0]
63
+
64
+ if !@force && @check()
65
+ @restore()
66
+ else
67
+ @start?.call window
68
+ @download(libraries)
69
+
70
+ check: ->
71
+ flag = true
72
+ for name, i in @libraries
73
+ flag &&= window.localStorage.getItem(name)?
74
+ flag
75
+
76
+ clean: ->
77
+ removed = 0
78
+
79
+ for element, i in window.localStorage
80
+ key = window.localStorage.key(i-removed)
81
+
82
+ if key.indexOf(@prefix) == 0 && @libraries.indexOf(key) < 0
83
+ window.localStorage.removeItem(key)
84
+ removed += 1
File without changes