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.
- data/.gitignore +0 -2
- data/Gemfile +2 -13
- data/Gemfile.lock +62 -80
- data/Guardfile +15 -21
- data/MIT-LICENSE +2 -2
- data/README.rdoc +3 -0
- data/app/helpers/joosy/sprockets_helper.rb +11 -23
- data/joosy.gemspec +3 -3
- data/lib/joosy/forms.rb +12 -2
- data/lib/joosy/rails/engine.rb +1 -9
- data/lib/joosy/rails/version.rb +2 -2
- data/lib/joosy-rails.rb +5 -0
- data/lib/rails/generators/joosy/application_generator.rb +3 -13
- data/lib/rails/generators/joosy/joosy_base.rb +2 -2
- data/lib/rails/generators/joosy/layout_generator.rb +1 -8
- data/lib/rails/generators/joosy/page_generator.rb +6 -21
- data/lib/rails/generators/joosy/preloader_generator.rb +7 -14
- data/lib/rails/generators/joosy/templates/app/layouts/application.js.coffee +0 -1
- data/lib/rails/generators/joosy/templates/app/layouts/template.js.coffee +1 -1
- data/lib/rails/generators/joosy/templates/app/pages/application.js.coffee +1 -1
- data/lib/rails/generators/joosy/templates/app/pages/template.js.coffee +3 -3
- data/lib/rails/generators/joosy/templates/app/routes.js.coffee +1 -7
- data/lib/rails/generators/joosy/templates/app/widgets/template.js.coffee +2 -2
- data/lib/rails/generators/joosy/templates/app.js.coffee +0 -3
- data/lib/rails/generators/joosy/templates/app_preloader.js.coffee.erb +12 -9
- data/lib/rails/generators/joosy/templates/preload.html.erb +6 -5
- data/lib/rails/generators/joosy/templates/preload.html.haml +5 -3
- data/lib/rails/generators/joosy/templates/preload.html.slim +21 -0
- data/lib/rails/generators/joosy/widget_generator.rb +1 -8
- data/spec/javascripts/helpers/spec_helper.js.coffee +0 -20
- data/spec/javascripts/joosy/core/modules/container_spec.js.coffee +27 -24
- data/spec/javascripts/joosy/core/modules/events_spec.js.coffee +18 -42
- data/spec/javascripts/joosy/core/modules/filters_spec.js.coffee +27 -27
- data/spec/javascripts/joosy/core/modules/log_spec.js.coffee +3 -3
- data/spec/javascripts/joosy/core/modules/module_spec.js.coffee +15 -6
- data/spec/javascripts/joosy/core/modules/time_manager_spec.js.coffee +7 -12
- data/spec/javascripts/joosy/core/modules/widget_manager_spec.js.coffee +17 -31
- data/tmp/javascripts/.gitignore +1 -0
- data/tmp/spec/javascripts/helpers/.gitignore +1 -0
- data/vendor/assets/javascripts/base64.js +135 -0
- data/vendor/assets/javascripts/joosy/core/application.js.coffee +26 -0
- data/vendor/assets/javascripts/joosy/core/form.js.coffee +87 -0
- data/vendor/assets/javascripts/joosy/core/joosy.js.coffee +62 -0
- data/vendor/assets/javascripts/joosy/core/layout.js.coffee +38 -0
- data/vendor/assets/javascripts/joosy/core/modules/container.js.coffee +51 -0
- data/vendor/assets/javascripts/joosy/core/modules/events.js.coffee +17 -0
- data/vendor/assets/javascripts/joosy/core/modules/filters.js.coffee +39 -0
- data/vendor/assets/javascripts/joosy/core/modules/log.js.coffee +12 -0
- data/vendor/assets/javascripts/joosy/core/modules/module.js.coffee +28 -0
- data/vendor/assets/javascripts/joosy/core/modules/time_manager.js.coffee +23 -0
- data/vendor/assets/javascripts/joosy/core/modules/widgets_manager.js.coffee +45 -0
- data/vendor/assets/javascripts/joosy/core/page.js.coffee +136 -0
- data/vendor/assets/javascripts/joosy/core/resource/rest.js.coffee +69 -0
- data/vendor/assets/javascripts/joosy/core/resource/rest_collection.js.coffee +42 -0
- data/vendor/assets/javascripts/joosy/core/router.js.coffee +75 -0
- data/vendor/assets/javascripts/joosy/core/widget.js.coffee +35 -0
- data/vendor/assets/javascripts/joosy/preloader/development.js.coffee +27 -0
- data/vendor/assets/javascripts/joosy/preloader/production.js.coffee +84 -0
- data/{app → vendor}/assets/javascripts/joosy.js.coffee +0 -0
- data/vendor/assets/javascripts/jquery.form.js +963 -978
- data/vendor/assets/javascripts/sugar.js +1 -1
- metadata +48 -77
- data/.codoopts +0 -5
- data/README.md +0 -95
- data/app/assets/javascripts/joosy/core/application.js.coffee +0 -50
- data/app/assets/javascripts/joosy/core/form.js.coffee +0 -304
- data/app/assets/javascripts/joosy/core/helpers/view.js.coffee +0 -30
- data/app/assets/javascripts/joosy/core/joosy.js.coffee +0 -129
- data/app/assets/javascripts/joosy/core/layout.js.coffee +0 -162
- data/app/assets/javascripts/joosy/core/modules/container.js.coffee +0 -104
- data/app/assets/javascripts/joosy/core/modules/events.js.coffee +0 -123
- data/app/assets/javascripts/joosy/core/modules/filters.js.coffee +0 -67
- data/app/assets/javascripts/joosy/core/modules/log.js.coffee +0 -36
- data/app/assets/javascripts/joosy/core/modules/module.js.coffee +0 -105
- data/app/assets/javascripts/joosy/core/modules/renderer.js.coffee +0 -195
- data/app/assets/javascripts/joosy/core/modules/time_manager.js.coffee +0 -46
- data/app/assets/javascripts/joosy/core/modules/widgets_manager.js.coffee +0 -84
- data/app/assets/javascripts/joosy/core/page.js.coffee +0 -375
- data/app/assets/javascripts/joosy/core/preloader.js.coffee +0 -13
- data/app/assets/javascripts/joosy/core/resource/collection.js.coffee +0 -174
- data/app/assets/javascripts/joosy/core/resource/generic.js.coffee +0 -254
- data/app/assets/javascripts/joosy/core/resource/rest.js.coffee +0 -197
- data/app/assets/javascripts/joosy/core/resource/rest_collection.js.coffee +0 -125
- data/app/assets/javascripts/joosy/core/router.js.coffee +0 -163
- data/app/assets/javascripts/joosy/core/templaters/rails_jst.js.coffee +0 -36
- data/app/assets/javascripts/joosy/core/widget.js.coffee +0 -80
- data/app/assets/javascripts/joosy/preloaders/caching.js.coffee +0 -169
- data/app/assets/javascripts/joosy/preloaders/inline.js.coffee +0 -56
- data/lib/joosy.rb +0 -9
- data/lib/rails/generators/joosy/resource_generator.rb +0 -29
- data/lib/rails/generators/joosy/templates/app/helpers/application.js.coffee +0 -4
- data/lib/rails/generators/joosy/templates/app/pages/welcome/index.js.coffee +0 -22
- data/lib/rails/generators/joosy/templates/app/resources/template.js.coffee +0 -2
- data/lib/rails/generators/joosy/templates/app/templates/layouts/application.jst.hamlc +0 -2
- data/lib/rails/generators/joosy/templates/app/templates/pages/welcome/index.jst.hamlc +0 -7
- data/spec/javascripts/joosy/core/application_spec.js.coffee +0 -40
- data/spec/javascripts/joosy/core/form_spec.js.coffee +0 -184
- data/spec/javascripts/joosy/core/joosy_spec.js.coffee +0 -72
- data/spec/javascripts/joosy/core/layout_spec.js.coffee +0 -50
- data/spec/javascripts/joosy/core/modules/renderer_spec.js.coffee +0 -185
- data/spec/javascripts/joosy/core/page_spec.js.coffee +0 -178
- data/spec/javascripts/joosy/core/resource/collection_spec.js.coffee +0 -84
- data/spec/javascripts/joosy/core/resource/generic_spec.js.coffee +0 -118
- data/spec/javascripts/joosy/core/resource/rest_collection_spec.js.coffee +0 -58
- data/spec/javascripts/joosy/core/resource/rest_spec.js.coffee +0 -129
- data/spec/javascripts/joosy/core/router_spec.js.coffee +0 -123
- data/spec/javascripts/joosy/core/templaters/rails_jst_spec.js.coffee +0 -25
- data/spec/javascripts/joosy/core/widget_spec.js.coffee +0 -40
- data/spec/javascripts/joosy/preloaders/caching_spec.js.coffee +0 -36
- data/spec/javascripts/joosy/preloaders/inline_spec.js.coffee +0 -16
- data/spec/javascripts/support/assets/coolface.jpg +0 -0
- data/spec/javascripts/support/assets/okay.jpg +0 -0
- data/spec/javascripts/support/assets/test.js +0 -1
- data/spec/javascripts/support/sinon-ie-1.3.1.js +0 -82
- 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
|