OSDN Git Service

v07
[pettanr/pettanr.git] / app / assets / javascripts / routes.js.coffee
1 class Pettanr.BeforeUnload\r
2   \r
3   constructor: (options) ->\r
4   \r
5   test: () ->\r
6     if @is_lock()\r
7       if confirm('leave? edit data unsaved')\r
8         return 1\r
9       else\r
10         return -1\r
11     0\r
12   \r
13   is_lock: () ->\r
14     if @params\r
15       true\r
16     else\r
17       false\r
18   \r
19   lock: (params, form) ->\r
20     @form = form\r
21     @params = params\r
22   \r
23   unlock: () ->\r
24     @form.quit()\r
25     @params = null\r
26   \r
27   url: () ->\r
28     Pettanr.params_to_url(@params)\r
29   \r
30 class Pettanr.Router extends Backbone.Router\r
31   \r
32   initialize: (options) ->\r
33     super()\r
34     _.extend(this, Backbone.Events)\r
35   \r
36   parse_query_string: (query_string) ->\r
37     params = {}\r
38     if query_string\r
39       ary = _.map decodeURI(query_string).split(/&/g), (el, i) ->\r
40         aux = el.split('=')\r
41         o = {}\r
42         if aux.length >= 1\r
43           val = undefined\r
44           if aux.length == 2\r
45             val = aux[1]\r
46           o[aux[0]] = val\r
47           o\r
48       _.each ary, (o) -> \r
49         _.extend(params, o)\r
50     params\r
51   \r
52   peta_routes: () ->\r
53     [\r
54       {route: '', callback: 'home'}, \r
55       {route: 'top/:action', callback: 'top_a'}, \r
56       {route: 'home/:action', callback: 'home_a'}, \r
57       {route: 'users/:action', callback: 'users_a'},   # no manifest route\r
58       {route: 'user_sessions/:action', callback: 'user_sessions_a'},    # no manifest route\r
59       {route: ':controller/:id/:action?*query_string', callback: 'c_i_a'}, \r
60       {route: ':controller/:id/:action', callback: 'c_i_a'}, \r
61       {route: ':controller/:id?*query_string', callback: 'c_i'}, \r
62       {route: ':controller/:id', callback: 'c_i'}, \r
63       {route: ':controller?*query_string', callback: 'c'}, \r
64       {route: ':controller', callback: 'c'}, \r
65     ]\r
66   \r
67   find_route: (url) ->\r
68     r = null\r
69     _.any @peta_routes(), (route) =>\r
70       route.regex = @_routeToRegExp(route.route)\r
71       if route.regex.test(url)\r
72         r = route\r
73     r\r
74   \r
75   url_to_params: (url) ->\r
76     if route = @find_route(url)\r
77       args = @_extractParameters(route.regex, url)\r
78       n = route.callback  # callback function name by string\r
79       this[n + '_params'].apply(this, args)  # call to c_i_a_params, c_i_params, c_params\r
80     else\r
81       {}\r
82   \r
83   # render App(render:all)\r
84   home: () ->\r
85     params = @home_params()\r
86     @trigger('go', params)\r
87   \r
88   home_params: () ->\r
89     params = {}\r
90     params['controller'] = 'folders'\r
91     params['action'] = 'root'\r
92     params\r
93   \r
94   # controller/id/action case\r
95   # ex) scrolls/3/edit\r
96   c_i_a: (controller, id, action, query_string, form) ->\r
97     params = @c_i_a_params(controller, id, action, query_string)\r
98     @trigger('go', params, form)\r
99   \r
100   c_i_a_params: (controller, id, action, query_string) ->\r
101     params = @parse_query_string(query_string)\r
102     params['controller'] = controller\r
103     params['format'] = 'html'\r
104     t = id.split('.')\r
105     if t.length > 1\r
106       params['format'] = t[1]\r
107       id = t[0]\r
108     t = action.split('.')\r
109     if t.length > 1\r
110       params['format'] = t[1]\r
111       action = t[0]\r
112     if Pettanr.is_number(action)\r
113       params['action'] = id\r
114       params['id'] = action\r
115     else\r
116       params['action'] = action\r
117       params['id'] = id\r
118     params\r
119   \r
120   # controller and id case\r
121   # ex) scrolls/3\r
122   c_i: (controller, id, query_string, form) ->\r
123     params = @c_i_params(controller, id, query_string)\r
124     @trigger('go', params, form)\r
125   \r
126   c_i_params: (controller, id, query_string) ->\r
127     params = @parse_query_string(query_string)\r
128     params['controller'] = controller\r
129     params['format'] = 'html'\r
130     t = id.split('.')\r
131     if t.length > 1\r
132       params['format'] = t[1]\r
133       id = t[0]\r
134     if Pettanr.is_number(id)\r
135       params['action'] = 'show'\r
136       params['id'] = id\r
137     else\r
138       if id\r
139         params['action'] = id\r
140       else\r
141         params['action'] = 'index'\r
142     params\r
143   \r
144   # controller only case\r
145   # ex) scrolls\r
146   c: (controller, query_string, form) ->\r
147     params = @c_params(controller, query_string)\r
148     @trigger('go', params, form)\r
149   \r
150   c_params: (controller, query_string) ->\r
151     params = @parse_query_string(query_string)\r
152     params['controller'] = controller\r
153     params['format'] = 'html'\r
154     params['action'] = 'index'\r
155     params\r
156   \r
157   top_a: (action, query_string, form) ->\r
158     params = @users_a_params(action, query_string)\r
159     @trigger('go', params, form)\r
160   \r
161   top_a_params: (action, query_string) ->\r
162     params = @parse_query_string(query_string)\r
163     params['controller'] = 'top'\r
164     params['format'] = 'html'\r
165     params['action'] = action\r
166     params\r
167   \r
168   home_a: (action, query_string, form) ->\r
169     params = @home_a_params(action, query_string)\r
170     @trigger('go', params, form)\r
171   \r
172   home_a_params: (action, query_string) ->\r
173     params = @parse_query_string(query_string)\r
174     params['controller'] = 'home'\r
175     params['format'] = 'html'\r
176     params['action'] = action\r
177     params\r
178   \r
179   user_sessions_a: (action, query_string, form) ->\r
180     params = @user_sessions_a_params(action, query_string)\r
181     @trigger('go', params, form)\r
182   \r
183   user_sessions_a_params: (action, query_string) ->\r
184     params = @parse_query_string(query_string)\r
185     params['controller'] = 'user_sessions'\r
186     params['format'] = 'html'\r
187     params['action'] = action\r
188     params\r
189   \r
190   users_a: (action, query_string, form) ->\r
191     params = @users_a_params(action, query_string)\r
192     @trigger('go', params, form)\r
193   \r
194   users_a_params: (action, query_string) ->\r
195     params = @parse_query_string(query_string)\r
196     params['controller'] = 'users'\r
197     params['format'] = 'html'\r
198     params['action'] = action\r
199     params\r
200 \r
201 class Pettanr.GlobalRouter extends Pettanr.Router\r
202   \r
203   initialize: (options) ->\r
204     super(options)\r
205     _.each @peta_routes(), (r) =>\r
206       @route(r.route, r.callback)\r
207   \r
208 class Pettanr.LocalRouter extends Pettanr.Router\r
209   \r
210   initialize: (options) ->\r
211     super(options)\r
212   \r
213   # selfish navigate\r
214   navigate: (url, form) ->\r
215     if route = @find_route(url)\r
216       args = @_extractParameters(route.regex, url)\r
217       args.push(form)\r
218       n = route.callback  # callback function name by string\r
219       this[n].apply(this, args)  # call to c_i_a, c_i, c\r
220   \r