joosy 0.1.0.RC3 → 0.1.0.alpha

Sign up to get free protection for your applications and to get access to all the features.
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