##// END OF EJS Templates
Implemented preview for comments
marcink -
r3695:45df84d3 beta
parent child Browse files
Show More
@@ -1,656 +1,661 b''
1 """
1 """
2 Routes configuration
2 Routes configuration
3
3
4 The more specific and detailed routes should be defined first so they
4 The more specific and detailed routes should be defined first so they
5 may take precedent over the more generic routes. For more information
5 may take precedent over the more generic routes. For more information
6 refer to the routes manual at http://routes.groovie.org/docs/
6 refer to the routes manual at http://routes.groovie.org/docs/
7 """
7 """
8 from __future__ import with_statement
8 from __future__ import with_statement
9 from routes import Mapper
9 from routes import Mapper
10
10
11 # prefix for non repository related links needs to be prefixed with `/`
11 # prefix for non repository related links needs to be prefixed with `/`
12 ADMIN_PREFIX = '/_admin'
12 ADMIN_PREFIX = '/_admin'
13
13
14
14
15 def make_map(config):
15 def make_map(config):
16 """Create, configure and return the routes Mapper"""
16 """Create, configure and return the routes Mapper"""
17 rmap = Mapper(directory=config['pylons.paths']['controllers'],
17 rmap = Mapper(directory=config['pylons.paths']['controllers'],
18 always_scan=config['debug'])
18 always_scan=config['debug'])
19 rmap.minimization = False
19 rmap.minimization = False
20 rmap.explicit = False
20 rmap.explicit = False
21
21
22 from rhodecode.lib.utils import is_valid_repo
22 from rhodecode.lib.utils import is_valid_repo
23 from rhodecode.lib.utils import is_valid_repos_group
23 from rhodecode.lib.utils import is_valid_repos_group
24
24
25 def check_repo(environ, match_dict):
25 def check_repo(environ, match_dict):
26 """
26 """
27 check for valid repository for proper 404 handling
27 check for valid repository for proper 404 handling
28
28
29 :param environ:
29 :param environ:
30 :param match_dict:
30 :param match_dict:
31 """
31 """
32 from rhodecode.model.db import Repository
32 from rhodecode.model.db import Repository
33 repo_name = match_dict.get('repo_name')
33 repo_name = match_dict.get('repo_name')
34
34
35 if match_dict.get('f_path'):
35 if match_dict.get('f_path'):
36 #fix for multiple initial slashes that causes errors
36 #fix for multiple initial slashes that causes errors
37 match_dict['f_path'] = match_dict['f_path'].lstrip('/')
37 match_dict['f_path'] = match_dict['f_path'].lstrip('/')
38
38
39 try:
39 try:
40 by_id = repo_name.split('_')
40 by_id = repo_name.split('_')
41 if len(by_id) == 2 and by_id[1].isdigit() and by_id[0] == '':
41 if len(by_id) == 2 and by_id[1].isdigit() and by_id[0] == '':
42 repo_name = Repository.get(by_id[1]).repo_name
42 repo_name = Repository.get(by_id[1]).repo_name
43 match_dict['repo_name'] = repo_name
43 match_dict['repo_name'] = repo_name
44 except Exception:
44 except Exception:
45 pass
45 pass
46
46
47 return is_valid_repo(repo_name, config['base_path'])
47 return is_valid_repo(repo_name, config['base_path'])
48
48
49 def check_group(environ, match_dict):
49 def check_group(environ, match_dict):
50 """
50 """
51 check for valid repository group for proper 404 handling
51 check for valid repository group for proper 404 handling
52
52
53 :param environ:
53 :param environ:
54 :param match_dict:
54 :param match_dict:
55 """
55 """
56 repos_group_name = match_dict.get('group_name')
56 repos_group_name = match_dict.get('group_name')
57 return is_valid_repos_group(repos_group_name, config['base_path'])
57 return is_valid_repos_group(repos_group_name, config['base_path'])
58
58
59 def check_group_skip_path(environ, match_dict):
59 def check_group_skip_path(environ, match_dict):
60 """
60 """
61 check for valid repository group for proper 404 handling, but skips
61 check for valid repository group for proper 404 handling, but skips
62 verification of existing path
62 verification of existing path
63
63
64 :param environ:
64 :param environ:
65 :param match_dict:
65 :param match_dict:
66 """
66 """
67 repos_group_name = match_dict.get('group_name')
67 repos_group_name = match_dict.get('group_name')
68 return is_valid_repos_group(repos_group_name, config['base_path'],
68 return is_valid_repos_group(repos_group_name, config['base_path'],
69 skip_path_check=True)
69 skip_path_check=True)
70
70
71 def check_int(environ, match_dict):
71 def check_int(environ, match_dict):
72 return match_dict.get('id').isdigit()
72 return match_dict.get('id').isdigit()
73
73
74 # The ErrorController route (handles 404/500 error pages); it should
74 # The ErrorController route (handles 404/500 error pages); it should
75 # likely stay at the top, ensuring it can always be resolved
75 # likely stay at the top, ensuring it can always be resolved
76 rmap.connect('/error/{action}', controller='error')
76 rmap.connect('/error/{action}', controller='error')
77 rmap.connect('/error/{action}/{id}', controller='error')
77 rmap.connect('/error/{action}/{id}', controller='error')
78
78
79 #==========================================================================
79 #==========================================================================
80 # CUSTOM ROUTES HERE
80 # CUSTOM ROUTES HERE
81 #==========================================================================
81 #==========================================================================
82
82
83 #MAIN PAGE
83 #MAIN PAGE
84 rmap.connect('home', '/', controller='home', action='index')
84 rmap.connect('home', '/', controller='home', action='index')
85 rmap.connect('repo_switcher', '/repos', controller='home',
85 rmap.connect('repo_switcher', '/repos', controller='home',
86 action='repo_switcher')
86 action='repo_switcher')
87 rmap.connect('branch_tag_switcher', '/branches-tags/{repo_name:.*?}',
87 rmap.connect('branch_tag_switcher', '/branches-tags/{repo_name:.*?}',
88 controller='home', action='branch_tag_switcher')
88 controller='home', action='branch_tag_switcher')
89 rmap.connect('bugtracker',
89 rmap.connect('bugtracker',
90 "http://bitbucket.org/marcinkuzminski/rhodecode/issues",
90 "http://bitbucket.org/marcinkuzminski/rhodecode/issues",
91 _static=True)
91 _static=True)
92 rmap.connect('rst_help',
92 rmap.connect('rst_help',
93 "http://docutils.sourceforge.net/docs/user/rst/quickref.html",
93 "http://docutils.sourceforge.net/docs/user/rst/quickref.html",
94 _static=True)
94 _static=True)
95 rmap.connect('rhodecode_official', "http://rhodecode.org", _static=True)
95 rmap.connect('rhodecode_official', "http://rhodecode.org", _static=True)
96
96
97 #ADMIN REPOSITORY REST ROUTES
97 #ADMIN REPOSITORY REST ROUTES
98 with rmap.submapper(path_prefix=ADMIN_PREFIX,
98 with rmap.submapper(path_prefix=ADMIN_PREFIX,
99 controller='admin/repos') as m:
99 controller='admin/repos') as m:
100 m.connect("repos", "/repos",
100 m.connect("repos", "/repos",
101 action="create", conditions=dict(method=["POST"]))
101 action="create", conditions=dict(method=["POST"]))
102 m.connect("repos", "/repos",
102 m.connect("repos", "/repos",
103 action="index", conditions=dict(method=["GET"]))
103 action="index", conditions=dict(method=["GET"]))
104 m.connect("formatted_repos", "/repos.{format}",
104 m.connect("formatted_repos", "/repos.{format}",
105 action="index",
105 action="index",
106 conditions=dict(method=["GET"]))
106 conditions=dict(method=["GET"]))
107 m.connect("new_repo", "/create_repository",
107 m.connect("new_repo", "/create_repository",
108 action="create_repository", conditions=dict(method=["GET"]))
108 action="create_repository", conditions=dict(method=["GET"]))
109 m.connect("/repos/{repo_name:.*?}",
109 m.connect("/repos/{repo_name:.*?}",
110 action="update", conditions=dict(method=["PUT"],
110 action="update", conditions=dict(method=["PUT"],
111 function=check_repo))
111 function=check_repo))
112 m.connect("/repos/{repo_name:.*?}",
112 m.connect("/repos/{repo_name:.*?}",
113 action="delete", conditions=dict(method=["DELETE"],
113 action="delete", conditions=dict(method=["DELETE"],
114 function=check_repo))
114 function=check_repo))
115 m.connect("formatted_edit_repo", "/repos/{repo_name:.*?}.{format}/edit",
115 m.connect("formatted_edit_repo", "/repos/{repo_name:.*?}.{format}/edit",
116 action="edit", conditions=dict(method=["GET"],
116 action="edit", conditions=dict(method=["GET"],
117 function=check_repo))
117 function=check_repo))
118 m.connect("repo", "/repos/{repo_name:.*?}",
118 m.connect("repo", "/repos/{repo_name:.*?}",
119 action="show", conditions=dict(method=["GET"],
119 action="show", conditions=dict(method=["GET"],
120 function=check_repo))
120 function=check_repo))
121 m.connect("formatted_repo", "/repos/{repo_name:.*?}.{format}",
121 m.connect("formatted_repo", "/repos/{repo_name:.*?}.{format}",
122 action="show", conditions=dict(method=["GET"],
122 action="show", conditions=dict(method=["GET"],
123 function=check_repo))
123 function=check_repo))
124 #add repo perm member
124 #add repo perm member
125 m.connect('set_repo_perm_member', "/set_repo_perm_member/{repo_name:.*?}",
125 m.connect('set_repo_perm_member', "/set_repo_perm_member/{repo_name:.*?}",
126 action="set_repo_perm_member",
126 action="set_repo_perm_member",
127 conditions=dict(method=["POST"], function=check_repo))
127 conditions=dict(method=["POST"], function=check_repo))
128
128
129 #ajax delete repo perm user
129 #ajax delete repo perm user
130 m.connect('delete_repo_user', "/repos_delete_user/{repo_name:.*?}",
130 m.connect('delete_repo_user', "/repos_delete_user/{repo_name:.*?}",
131 action="delete_perm_user",
131 action="delete_perm_user",
132 conditions=dict(method=["DELETE"], function=check_repo))
132 conditions=dict(method=["DELETE"], function=check_repo))
133
133
134 #ajax delete repo perm users_group
134 #ajax delete repo perm users_group
135 m.connect('delete_repo_users_group',
135 m.connect('delete_repo_users_group',
136 "/repos_delete_users_group/{repo_name:.*?}",
136 "/repos_delete_users_group/{repo_name:.*?}",
137 action="delete_perm_users_group",
137 action="delete_perm_users_group",
138 conditions=dict(method=["DELETE"], function=check_repo))
138 conditions=dict(method=["DELETE"], function=check_repo))
139
139
140 #settings actions
140 #settings actions
141 m.connect('repo_stats', "/repos_stats/{repo_name:.*?}",
141 m.connect('repo_stats', "/repos_stats/{repo_name:.*?}",
142 action="repo_stats", conditions=dict(method=["DELETE"],
142 action="repo_stats", conditions=dict(method=["DELETE"],
143 function=check_repo))
143 function=check_repo))
144 m.connect('repo_cache', "/repos_cache/{repo_name:.*?}",
144 m.connect('repo_cache', "/repos_cache/{repo_name:.*?}",
145 action="repo_cache", conditions=dict(method=["DELETE"],
145 action="repo_cache", conditions=dict(method=["DELETE"],
146 function=check_repo))
146 function=check_repo))
147 m.connect('repo_public_journal', "/repos_public_journal/{repo_name:.*?}",
147 m.connect('repo_public_journal', "/repos_public_journal/{repo_name:.*?}",
148 action="repo_public_journal", conditions=dict(method=["PUT"],
148 action="repo_public_journal", conditions=dict(method=["PUT"],
149 function=check_repo))
149 function=check_repo))
150 m.connect('repo_pull', "/repo_pull/{repo_name:.*?}",
150 m.connect('repo_pull', "/repo_pull/{repo_name:.*?}",
151 action="repo_pull", conditions=dict(method=["PUT"],
151 action="repo_pull", conditions=dict(method=["PUT"],
152 function=check_repo))
152 function=check_repo))
153 m.connect('repo_as_fork', "/repo_as_fork/{repo_name:.*?}",
153 m.connect('repo_as_fork', "/repo_as_fork/{repo_name:.*?}",
154 action="repo_as_fork", conditions=dict(method=["PUT"],
154 action="repo_as_fork", conditions=dict(method=["PUT"],
155 function=check_repo))
155 function=check_repo))
156 m.connect('repo_locking', "/repo_locking/{repo_name:.*?}",
156 m.connect('repo_locking', "/repo_locking/{repo_name:.*?}",
157 action="repo_locking", conditions=dict(method=["PUT"],
157 action="repo_locking", conditions=dict(method=["PUT"],
158 function=check_repo))
158 function=check_repo))
159 m.connect('toggle_locking', "/locking_toggle/{repo_name:.*?}",
159 m.connect('toggle_locking', "/locking_toggle/{repo_name:.*?}",
160 action="toggle_locking", conditions=dict(method=["GET"],
160 action="toggle_locking", conditions=dict(method=["GET"],
161 function=check_repo))
161 function=check_repo))
162
162
163 #repo fields
163 #repo fields
164 m.connect('create_repo_fields', "/repo_fields/{repo_name:.*?}/new",
164 m.connect('create_repo_fields', "/repo_fields/{repo_name:.*?}/new",
165 action="create_repo_field", conditions=dict(method=["PUT"],
165 action="create_repo_field", conditions=dict(method=["PUT"],
166 function=check_repo))
166 function=check_repo))
167
167
168 m.connect('delete_repo_fields', "/repo_fields/{repo_name:.*?}/{field_id}",
168 m.connect('delete_repo_fields', "/repo_fields/{repo_name:.*?}/{field_id}",
169 action="delete_repo_field", conditions=dict(method=["DELETE"],
169 action="delete_repo_field", conditions=dict(method=["DELETE"],
170 function=check_repo))
170 function=check_repo))
171
171
172 with rmap.submapper(path_prefix=ADMIN_PREFIX,
172 with rmap.submapper(path_prefix=ADMIN_PREFIX,
173 controller='admin/repos_groups') as m:
173 controller='admin/repos_groups') as m:
174 m.connect("repos_groups", "/repos_groups",
174 m.connect("repos_groups", "/repos_groups",
175 action="create", conditions=dict(method=["POST"]))
175 action="create", conditions=dict(method=["POST"]))
176 m.connect("repos_groups", "/repos_groups",
176 m.connect("repos_groups", "/repos_groups",
177 action="index", conditions=dict(method=["GET"]))
177 action="index", conditions=dict(method=["GET"]))
178 m.connect("formatted_repos_groups", "/repos_groups.{format}",
178 m.connect("formatted_repos_groups", "/repos_groups.{format}",
179 action="index", conditions=dict(method=["GET"]))
179 action="index", conditions=dict(method=["GET"]))
180 m.connect("new_repos_group", "/repos_groups/new",
180 m.connect("new_repos_group", "/repos_groups/new",
181 action="new", conditions=dict(method=["GET"]))
181 action="new", conditions=dict(method=["GET"]))
182 m.connect("formatted_new_repos_group", "/repos_groups/new.{format}",
182 m.connect("formatted_new_repos_group", "/repos_groups/new.{format}",
183 action="new", conditions=dict(method=["GET"]))
183 action="new", conditions=dict(method=["GET"]))
184 m.connect("update_repos_group", "/repos_groups/{group_name:.*?}",
184 m.connect("update_repos_group", "/repos_groups/{group_name:.*?}",
185 action="update", conditions=dict(method=["PUT"],
185 action="update", conditions=dict(method=["PUT"],
186 function=check_group))
186 function=check_group))
187 m.connect("delete_repos_group", "/repos_groups/{group_name:.*?}",
187 m.connect("delete_repos_group", "/repos_groups/{group_name:.*?}",
188 action="delete", conditions=dict(method=["DELETE"],
188 action="delete", conditions=dict(method=["DELETE"],
189 function=check_group_skip_path))
189 function=check_group_skip_path))
190 m.connect("edit_repos_group", "/repos_groups/{group_name:.*?}/edit",
190 m.connect("edit_repos_group", "/repos_groups/{group_name:.*?}/edit",
191 action="edit", conditions=dict(method=["GET"],
191 action="edit", conditions=dict(method=["GET"],
192 function=check_group))
192 function=check_group))
193 m.connect("formatted_edit_repos_group",
193 m.connect("formatted_edit_repos_group",
194 "/repos_groups/{group_name:.*?}.{format}/edit",
194 "/repos_groups/{group_name:.*?}.{format}/edit",
195 action="edit", conditions=dict(method=["GET"],
195 action="edit", conditions=dict(method=["GET"],
196 function=check_group))
196 function=check_group))
197 m.connect("repos_group", "/repos_groups/{group_name:.*?}",
197 m.connect("repos_group", "/repos_groups/{group_name:.*?}",
198 action="show", conditions=dict(method=["GET"],
198 action="show", conditions=dict(method=["GET"],
199 function=check_group))
199 function=check_group))
200 m.connect("formatted_repos_group", "/repos_groups/{group_name:.*?}.{format}",
200 m.connect("formatted_repos_group", "/repos_groups/{group_name:.*?}.{format}",
201 action="show", conditions=dict(method=["GET"],
201 action="show", conditions=dict(method=["GET"],
202 function=check_group))
202 function=check_group))
203 # ajax delete repository group perm user
203 # ajax delete repository group perm user
204 m.connect('delete_repos_group_user_perm',
204 m.connect('delete_repos_group_user_perm',
205 "/delete_repos_group_user_perm/{group_name:.*?}",
205 "/delete_repos_group_user_perm/{group_name:.*?}",
206 action="delete_repos_group_user_perm",
206 action="delete_repos_group_user_perm",
207 conditions=dict(method=["DELETE"], function=check_group))
207 conditions=dict(method=["DELETE"], function=check_group))
208
208
209 # ajax delete repository group perm users_group
209 # ajax delete repository group perm users_group
210 m.connect('delete_repos_group_users_group_perm',
210 m.connect('delete_repos_group_users_group_perm',
211 "/delete_repos_group_users_group_perm/{group_name:.*?}",
211 "/delete_repos_group_users_group_perm/{group_name:.*?}",
212 action="delete_repos_group_users_group_perm",
212 action="delete_repos_group_users_group_perm",
213 conditions=dict(method=["DELETE"], function=check_group))
213 conditions=dict(method=["DELETE"], function=check_group))
214
214
215 #ADMIN USER REST ROUTES
215 #ADMIN USER REST ROUTES
216 with rmap.submapper(path_prefix=ADMIN_PREFIX,
216 with rmap.submapper(path_prefix=ADMIN_PREFIX,
217 controller='admin/users') as m:
217 controller='admin/users') as m:
218 m.connect("users", "/users",
218 m.connect("users", "/users",
219 action="create", conditions=dict(method=["POST"]))
219 action="create", conditions=dict(method=["POST"]))
220 m.connect("users", "/users",
220 m.connect("users", "/users",
221 action="index", conditions=dict(method=["GET"]))
221 action="index", conditions=dict(method=["GET"]))
222 m.connect("formatted_users", "/users.{format}",
222 m.connect("formatted_users", "/users.{format}",
223 action="index", conditions=dict(method=["GET"]))
223 action="index", conditions=dict(method=["GET"]))
224 m.connect("new_user", "/users/new",
224 m.connect("new_user", "/users/new",
225 action="new", conditions=dict(method=["GET"]))
225 action="new", conditions=dict(method=["GET"]))
226 m.connect("formatted_new_user", "/users/new.{format}",
226 m.connect("formatted_new_user", "/users/new.{format}",
227 action="new", conditions=dict(method=["GET"]))
227 action="new", conditions=dict(method=["GET"]))
228 m.connect("update_user", "/users/{id}",
228 m.connect("update_user", "/users/{id}",
229 action="update", conditions=dict(method=["PUT"]))
229 action="update", conditions=dict(method=["PUT"]))
230 m.connect("delete_user", "/users/{id}",
230 m.connect("delete_user", "/users/{id}",
231 action="delete", conditions=dict(method=["DELETE"]))
231 action="delete", conditions=dict(method=["DELETE"]))
232 m.connect("edit_user", "/users/{id}/edit",
232 m.connect("edit_user", "/users/{id}/edit",
233 action="edit", conditions=dict(method=["GET"]))
233 action="edit", conditions=dict(method=["GET"]))
234 m.connect("formatted_edit_user",
234 m.connect("formatted_edit_user",
235 "/users/{id}.{format}/edit",
235 "/users/{id}.{format}/edit",
236 action="edit", conditions=dict(method=["GET"]))
236 action="edit", conditions=dict(method=["GET"]))
237 m.connect("user", "/users/{id}",
237 m.connect("user", "/users/{id}",
238 action="show", conditions=dict(method=["GET"]))
238 action="show", conditions=dict(method=["GET"]))
239 m.connect("formatted_user", "/users/{id}.{format}",
239 m.connect("formatted_user", "/users/{id}.{format}",
240 action="show", conditions=dict(method=["GET"]))
240 action="show", conditions=dict(method=["GET"]))
241
241
242 #EXTRAS USER ROUTES
242 #EXTRAS USER ROUTES
243 m.connect("user_perm", "/users_perm/{id}",
243 m.connect("user_perm", "/users_perm/{id}",
244 action="update_perm", conditions=dict(method=["PUT"]))
244 action="update_perm", conditions=dict(method=["PUT"]))
245 m.connect("user_emails", "/users_emails/{id}",
245 m.connect("user_emails", "/users_emails/{id}",
246 action="add_email", conditions=dict(method=["PUT"]))
246 action="add_email", conditions=dict(method=["PUT"]))
247 m.connect("user_emails_delete", "/users_emails/{id}",
247 m.connect("user_emails_delete", "/users_emails/{id}",
248 action="delete_email", conditions=dict(method=["DELETE"]))
248 action="delete_email", conditions=dict(method=["DELETE"]))
249 m.connect("user_ips", "/users_ips/{id}",
249 m.connect("user_ips", "/users_ips/{id}",
250 action="add_ip", conditions=dict(method=["PUT"]))
250 action="add_ip", conditions=dict(method=["PUT"]))
251 m.connect("user_ips_delete", "/users_ips/{id}",
251 m.connect("user_ips_delete", "/users_ips/{id}",
252 action="delete_ip", conditions=dict(method=["DELETE"]))
252 action="delete_ip", conditions=dict(method=["DELETE"]))
253
253
254 #ADMIN USER GROUPS REST ROUTES
254 #ADMIN USER GROUPS REST ROUTES
255 with rmap.submapper(path_prefix=ADMIN_PREFIX,
255 with rmap.submapper(path_prefix=ADMIN_PREFIX,
256 controller='admin/users_groups') as m:
256 controller='admin/users_groups') as m:
257 m.connect("users_groups", "/users_groups",
257 m.connect("users_groups", "/users_groups",
258 action="create", conditions=dict(method=["POST"]))
258 action="create", conditions=dict(method=["POST"]))
259 m.connect("users_groups", "/users_groups",
259 m.connect("users_groups", "/users_groups",
260 action="index", conditions=dict(method=["GET"]))
260 action="index", conditions=dict(method=["GET"]))
261 m.connect("formatted_users_groups", "/users_groups.{format}",
261 m.connect("formatted_users_groups", "/users_groups.{format}",
262 action="index", conditions=dict(method=["GET"]))
262 action="index", conditions=dict(method=["GET"]))
263 m.connect("new_users_group", "/users_groups/new",
263 m.connect("new_users_group", "/users_groups/new",
264 action="new", conditions=dict(method=["GET"]))
264 action="new", conditions=dict(method=["GET"]))
265 m.connect("formatted_new_users_group", "/users_groups/new.{format}",
265 m.connect("formatted_new_users_group", "/users_groups/new.{format}",
266 action="new", conditions=dict(method=["GET"]))
266 action="new", conditions=dict(method=["GET"]))
267 m.connect("update_users_group", "/users_groups/{id}",
267 m.connect("update_users_group", "/users_groups/{id}",
268 action="update", conditions=dict(method=["PUT"]))
268 action="update", conditions=dict(method=["PUT"]))
269 m.connect("delete_users_group", "/users_groups/{id}",
269 m.connect("delete_users_group", "/users_groups/{id}",
270 action="delete", conditions=dict(method=["DELETE"]))
270 action="delete", conditions=dict(method=["DELETE"]))
271 m.connect("edit_users_group", "/users_groups/{id}/edit",
271 m.connect("edit_users_group", "/users_groups/{id}/edit",
272 action="edit", conditions=dict(method=["GET"]))
272 action="edit", conditions=dict(method=["GET"]))
273 m.connect("formatted_edit_users_group",
273 m.connect("formatted_edit_users_group",
274 "/users_groups/{id}.{format}/edit",
274 "/users_groups/{id}.{format}/edit",
275 action="edit", conditions=dict(method=["GET"]))
275 action="edit", conditions=dict(method=["GET"]))
276 m.connect("users_group", "/users_groups/{id}",
276 m.connect("users_group", "/users_groups/{id}",
277 action="show", conditions=dict(method=["GET"]))
277 action="show", conditions=dict(method=["GET"]))
278 m.connect("formatted_users_group", "/users_groups/{id}.{format}",
278 m.connect("formatted_users_group", "/users_groups/{id}.{format}",
279 action="show", conditions=dict(method=["GET"]))
279 action="show", conditions=dict(method=["GET"]))
280
280
281 #EXTRAS USER ROUTES
281 #EXTRAS USER ROUTES
282 m.connect("users_group_perm", "/users_groups_perm/{id}",
282 m.connect("users_group_perm", "/users_groups_perm/{id}",
283 action="update_perm", conditions=dict(method=["PUT"]))
283 action="update_perm", conditions=dict(method=["PUT"]))
284
284
285 #ADMIN GROUP REST ROUTES
285 #ADMIN GROUP REST ROUTES
286 rmap.resource('group', 'groups',
286 rmap.resource('group', 'groups',
287 controller='admin/groups', path_prefix=ADMIN_PREFIX)
287 controller='admin/groups', path_prefix=ADMIN_PREFIX)
288
288
289 #ADMIN PERMISSIONS REST ROUTES
289 #ADMIN PERMISSIONS REST ROUTES
290 rmap.resource('permission', 'permissions',
290 rmap.resource('permission', 'permissions',
291 controller='admin/permissions', path_prefix=ADMIN_PREFIX)
291 controller='admin/permissions', path_prefix=ADMIN_PREFIX)
292
292
293 #ADMIN DEFAULTS REST ROUTES
293 #ADMIN DEFAULTS REST ROUTES
294 rmap.resource('default', 'defaults',
294 rmap.resource('default', 'defaults',
295 controller='admin/defaults', path_prefix=ADMIN_PREFIX)
295 controller='admin/defaults', path_prefix=ADMIN_PREFIX)
296
296
297 ##ADMIN LDAP SETTINGS
297 ##ADMIN LDAP SETTINGS
298 rmap.connect('ldap_settings', '%s/ldap' % ADMIN_PREFIX,
298 rmap.connect('ldap_settings', '%s/ldap' % ADMIN_PREFIX,
299 controller='admin/ldap_settings', action='ldap_settings',
299 controller='admin/ldap_settings', action='ldap_settings',
300 conditions=dict(method=["POST"]))
300 conditions=dict(method=["POST"]))
301
301
302 rmap.connect('ldap_home', '%s/ldap' % ADMIN_PREFIX,
302 rmap.connect('ldap_home', '%s/ldap' % ADMIN_PREFIX,
303 controller='admin/ldap_settings')
303 controller='admin/ldap_settings')
304
304
305 #ADMIN SETTINGS REST ROUTES
305 #ADMIN SETTINGS REST ROUTES
306 with rmap.submapper(path_prefix=ADMIN_PREFIX,
306 with rmap.submapper(path_prefix=ADMIN_PREFIX,
307 controller='admin/settings') as m:
307 controller='admin/settings') as m:
308 m.connect("admin_settings", "/settings",
308 m.connect("admin_settings", "/settings",
309 action="create", conditions=dict(method=["POST"]))
309 action="create", conditions=dict(method=["POST"]))
310 m.connect("admin_settings", "/settings",
310 m.connect("admin_settings", "/settings",
311 action="index", conditions=dict(method=["GET"]))
311 action="index", conditions=dict(method=["GET"]))
312 m.connect("formatted_admin_settings", "/settings.{format}",
312 m.connect("formatted_admin_settings", "/settings.{format}",
313 action="index", conditions=dict(method=["GET"]))
313 action="index", conditions=dict(method=["GET"]))
314 m.connect("admin_new_setting", "/settings/new",
314 m.connect("admin_new_setting", "/settings/new",
315 action="new", conditions=dict(method=["GET"]))
315 action="new", conditions=dict(method=["GET"]))
316 m.connect("formatted_admin_new_setting", "/settings/new.{format}",
316 m.connect("formatted_admin_new_setting", "/settings/new.{format}",
317 action="new", conditions=dict(method=["GET"]))
317 action="new", conditions=dict(method=["GET"]))
318 m.connect("/settings/{setting_id}",
318 m.connect("/settings/{setting_id}",
319 action="update", conditions=dict(method=["PUT"]))
319 action="update", conditions=dict(method=["PUT"]))
320 m.connect("/settings/{setting_id}",
320 m.connect("/settings/{setting_id}",
321 action="delete", conditions=dict(method=["DELETE"]))
321 action="delete", conditions=dict(method=["DELETE"]))
322 m.connect("admin_edit_setting", "/settings/{setting_id}/edit",
322 m.connect("admin_edit_setting", "/settings/{setting_id}/edit",
323 action="edit", conditions=dict(method=["GET"]))
323 action="edit", conditions=dict(method=["GET"]))
324 m.connect("formatted_admin_edit_setting",
324 m.connect("formatted_admin_edit_setting",
325 "/settings/{setting_id}.{format}/edit",
325 "/settings/{setting_id}.{format}/edit",
326 action="edit", conditions=dict(method=["GET"]))
326 action="edit", conditions=dict(method=["GET"]))
327 m.connect("admin_setting", "/settings/{setting_id}",
327 m.connect("admin_setting", "/settings/{setting_id}",
328 action="show", conditions=dict(method=["GET"]))
328 action="show", conditions=dict(method=["GET"]))
329 m.connect("formatted_admin_setting", "/settings/{setting_id}.{format}",
329 m.connect("formatted_admin_setting", "/settings/{setting_id}.{format}",
330 action="show", conditions=dict(method=["GET"]))
330 action="show", conditions=dict(method=["GET"]))
331 m.connect("admin_settings_my_account", "/my_account",
331 m.connect("admin_settings_my_account", "/my_account",
332 action="my_account", conditions=dict(method=["GET"]))
332 action="my_account", conditions=dict(method=["GET"]))
333 m.connect("admin_settings_my_account_update", "/my_account_update",
333 m.connect("admin_settings_my_account_update", "/my_account_update",
334 action="my_account_update", conditions=dict(method=["PUT"]))
334 action="my_account_update", conditions=dict(method=["PUT"]))
335 m.connect("admin_settings_my_repos", "/my_account/repos",
335 m.connect("admin_settings_my_repos", "/my_account/repos",
336 action="my_account_my_repos", conditions=dict(method=["GET"]))
336 action="my_account_my_repos", conditions=dict(method=["GET"]))
337 m.connect("admin_settings_my_pullrequests", "/my_account/pull_requests",
337 m.connect("admin_settings_my_pullrequests", "/my_account/pull_requests",
338 action="my_account_my_pullrequests", conditions=dict(method=["GET"]))
338 action="my_account_my_pullrequests", conditions=dict(method=["GET"]))
339
339
340 #NOTIFICATION REST ROUTES
340 #NOTIFICATION REST ROUTES
341 with rmap.submapper(path_prefix=ADMIN_PREFIX,
341 with rmap.submapper(path_prefix=ADMIN_PREFIX,
342 controller='admin/notifications') as m:
342 controller='admin/notifications') as m:
343 m.connect("notifications", "/notifications",
343 m.connect("notifications", "/notifications",
344 action="create", conditions=dict(method=["POST"]))
344 action="create", conditions=dict(method=["POST"]))
345 m.connect("notifications", "/notifications",
345 m.connect("notifications", "/notifications",
346 action="index", conditions=dict(method=["GET"]))
346 action="index", conditions=dict(method=["GET"]))
347 m.connect("notifications_mark_all_read", "/notifications/mark_all_read",
347 m.connect("notifications_mark_all_read", "/notifications/mark_all_read",
348 action="mark_all_read", conditions=dict(method=["GET"]))
348 action="mark_all_read", conditions=dict(method=["GET"]))
349 m.connect("formatted_notifications", "/notifications.{format}",
349 m.connect("formatted_notifications", "/notifications.{format}",
350 action="index", conditions=dict(method=["GET"]))
350 action="index", conditions=dict(method=["GET"]))
351 m.connect("new_notification", "/notifications/new",
351 m.connect("new_notification", "/notifications/new",
352 action="new", conditions=dict(method=["GET"]))
352 action="new", conditions=dict(method=["GET"]))
353 m.connect("formatted_new_notification", "/notifications/new.{format}",
353 m.connect("formatted_new_notification", "/notifications/new.{format}",
354 action="new", conditions=dict(method=["GET"]))
354 action="new", conditions=dict(method=["GET"]))
355 m.connect("/notification/{notification_id}",
355 m.connect("/notification/{notification_id}",
356 action="update", conditions=dict(method=["PUT"]))
356 action="update", conditions=dict(method=["PUT"]))
357 m.connect("/notification/{notification_id}",
357 m.connect("/notification/{notification_id}",
358 action="delete", conditions=dict(method=["DELETE"]))
358 action="delete", conditions=dict(method=["DELETE"]))
359 m.connect("edit_notification", "/notification/{notification_id}/edit",
359 m.connect("edit_notification", "/notification/{notification_id}/edit",
360 action="edit", conditions=dict(method=["GET"]))
360 action="edit", conditions=dict(method=["GET"]))
361 m.connect("formatted_edit_notification",
361 m.connect("formatted_edit_notification",
362 "/notification/{notification_id}.{format}/edit",
362 "/notification/{notification_id}.{format}/edit",
363 action="edit", conditions=dict(method=["GET"]))
363 action="edit", conditions=dict(method=["GET"]))
364 m.connect("notification", "/notification/{notification_id}",
364 m.connect("notification", "/notification/{notification_id}",
365 action="show", conditions=dict(method=["GET"]))
365 action="show", conditions=dict(method=["GET"]))
366 m.connect("formatted_notification", "/notifications/{notification_id}.{format}",
366 m.connect("formatted_notification", "/notifications/{notification_id}.{format}",
367 action="show", conditions=dict(method=["GET"]))
367 action="show", conditions=dict(method=["GET"]))
368
368
369 #ADMIN MAIN PAGES
369 #ADMIN MAIN PAGES
370 with rmap.submapper(path_prefix=ADMIN_PREFIX,
370 with rmap.submapper(path_prefix=ADMIN_PREFIX,
371 controller='admin/admin') as m:
371 controller='admin/admin') as m:
372 m.connect('admin_home', '', action='index')
372 m.connect('admin_home', '', action='index')
373 m.connect('admin_add_repo', '/add_repo/{new_repo:[a-z0-9\. _-]*}',
373 m.connect('admin_add_repo', '/add_repo/{new_repo:[a-z0-9\. _-]*}',
374 action='add_repo')
374 action='add_repo')
375
375
376 #==========================================================================
376 #==========================================================================
377 # API V2
377 # API V2
378 #==========================================================================
378 #==========================================================================
379 with rmap.submapper(path_prefix=ADMIN_PREFIX,
379 with rmap.submapper(path_prefix=ADMIN_PREFIX,
380 controller='api/api') as m:
380 controller='api/api') as m:
381 m.connect('api', '/api')
381 m.connect('api', '/api')
382
382
383 #USER JOURNAL
383 #USER JOURNAL
384 rmap.connect('journal', '%s/journal' % ADMIN_PREFIX,
384 rmap.connect('journal', '%s/journal' % ADMIN_PREFIX,
385 controller='journal', action='index')
385 controller='journal', action='index')
386 rmap.connect('journal_rss', '%s/journal/rss' % ADMIN_PREFIX,
386 rmap.connect('journal_rss', '%s/journal/rss' % ADMIN_PREFIX,
387 controller='journal', action='journal_rss')
387 controller='journal', action='journal_rss')
388 rmap.connect('journal_atom', '%s/journal/atom' % ADMIN_PREFIX,
388 rmap.connect('journal_atom', '%s/journal/atom' % ADMIN_PREFIX,
389 controller='journal', action='journal_atom')
389 controller='journal', action='journal_atom')
390
390
391 rmap.connect('public_journal', '%s/public_journal' % ADMIN_PREFIX,
391 rmap.connect('public_journal', '%s/public_journal' % ADMIN_PREFIX,
392 controller='journal', action="public_journal")
392 controller='journal', action="public_journal")
393
393
394 rmap.connect('public_journal_rss', '%s/public_journal/rss' % ADMIN_PREFIX,
394 rmap.connect('public_journal_rss', '%s/public_journal/rss' % ADMIN_PREFIX,
395 controller='journal', action="public_journal_rss")
395 controller='journal', action="public_journal_rss")
396
396
397 rmap.connect('public_journal_rss_old', '%s/public_journal_rss' % ADMIN_PREFIX,
397 rmap.connect('public_journal_rss_old', '%s/public_journal_rss' % ADMIN_PREFIX,
398 controller='journal', action="public_journal_rss")
398 controller='journal', action="public_journal_rss")
399
399
400 rmap.connect('public_journal_atom',
400 rmap.connect('public_journal_atom',
401 '%s/public_journal/atom' % ADMIN_PREFIX, controller='journal',
401 '%s/public_journal/atom' % ADMIN_PREFIX, controller='journal',
402 action="public_journal_atom")
402 action="public_journal_atom")
403
403
404 rmap.connect('public_journal_atom_old',
404 rmap.connect('public_journal_atom_old',
405 '%s/public_journal_atom' % ADMIN_PREFIX, controller='journal',
405 '%s/public_journal_atom' % ADMIN_PREFIX, controller='journal',
406 action="public_journal_atom")
406 action="public_journal_atom")
407
407
408 rmap.connect('toggle_following', '%s/toggle_following' % ADMIN_PREFIX,
408 rmap.connect('toggle_following', '%s/toggle_following' % ADMIN_PREFIX,
409 controller='journal', action='toggle_following',
409 controller='journal', action='toggle_following',
410 conditions=dict(method=["POST"]))
410 conditions=dict(method=["POST"]))
411
411
412 #SEARCH
412 #SEARCH
413 rmap.connect('search', '%s/search' % ADMIN_PREFIX, controller='search',)
413 rmap.connect('search', '%s/search' % ADMIN_PREFIX, controller='search',)
414 rmap.connect('search_repo_admin', '%s/search/{repo_name:.*}' % ADMIN_PREFIX,
414 rmap.connect('search_repo_admin', '%s/search/{repo_name:.*}' % ADMIN_PREFIX,
415 controller='search',
415 controller='search',
416 conditions=dict(function=check_repo))
416 conditions=dict(function=check_repo))
417 rmap.connect('search_repo', '/{repo_name:.*?}/search',
417 rmap.connect('search_repo', '/{repo_name:.*?}/search',
418 controller='search',
418 controller='search',
419 conditions=dict(function=check_repo),
419 conditions=dict(function=check_repo),
420 )
420 )
421
421
422 #LOGIN/LOGOUT/REGISTER/SIGN IN
422 #LOGIN/LOGOUT/REGISTER/SIGN IN
423 rmap.connect('login_home', '%s/login' % ADMIN_PREFIX, controller='login')
423 rmap.connect('login_home', '%s/login' % ADMIN_PREFIX, controller='login')
424 rmap.connect('logout_home', '%s/logout' % ADMIN_PREFIX, controller='login',
424 rmap.connect('logout_home', '%s/logout' % ADMIN_PREFIX, controller='login',
425 action='logout')
425 action='logout')
426
426
427 rmap.connect('register', '%s/register' % ADMIN_PREFIX, controller='login',
427 rmap.connect('register', '%s/register' % ADMIN_PREFIX, controller='login',
428 action='register')
428 action='register')
429
429
430 rmap.connect('reset_password', '%s/password_reset' % ADMIN_PREFIX,
430 rmap.connect('reset_password', '%s/password_reset' % ADMIN_PREFIX,
431 controller='login', action='password_reset')
431 controller='login', action='password_reset')
432
432
433 rmap.connect('reset_password_confirmation',
433 rmap.connect('reset_password_confirmation',
434 '%s/password_reset_confirmation' % ADMIN_PREFIX,
434 '%s/password_reset_confirmation' % ADMIN_PREFIX,
435 controller='login', action='password_reset_confirmation')
435 controller='login', action='password_reset_confirmation')
436
436
437 #FEEDS
437 #FEEDS
438 rmap.connect('rss_feed_home', '/{repo_name:.*?}/feed/rss',
438 rmap.connect('rss_feed_home', '/{repo_name:.*?}/feed/rss',
439 controller='feed', action='rss',
439 controller='feed', action='rss',
440 conditions=dict(function=check_repo))
440 conditions=dict(function=check_repo))
441
441
442 rmap.connect('atom_feed_home', '/{repo_name:.*?}/feed/atom',
442 rmap.connect('atom_feed_home', '/{repo_name:.*?}/feed/atom',
443 controller='feed', action='atom',
443 controller='feed', action='atom',
444 conditions=dict(function=check_repo))
444 conditions=dict(function=check_repo))
445
445
446 #==========================================================================
446 #==========================================================================
447 # REPOSITORY ROUTES
447 # REPOSITORY ROUTES
448 #==========================================================================
448 #==========================================================================
449 rmap.connect('summary_home', '/{repo_name:.*?}',
449 rmap.connect('summary_home', '/{repo_name:.*?}',
450 controller='summary',
450 controller='summary',
451 conditions=dict(function=check_repo))
451 conditions=dict(function=check_repo))
452
452
453 rmap.connect('repo_size', '/{repo_name:.*?}/repo_size',
453 rmap.connect('repo_size', '/{repo_name:.*?}/repo_size',
454 controller='summary', action='repo_size',
454 controller='summary', action='repo_size',
455 conditions=dict(function=check_repo))
455 conditions=dict(function=check_repo))
456
456
457 rmap.connect('repos_group_home', '/{group_name:.*}',
457 rmap.connect('repos_group_home', '/{group_name:.*}',
458 controller='admin/repos_groups', action="show_by_name",
458 controller='admin/repos_groups', action="show_by_name",
459 conditions=dict(function=check_group))
459 conditions=dict(function=check_group))
460
460
461 rmap.connect('changeset_home', '/{repo_name:.*?}/changeset/{revision}',
461 rmap.connect('changeset_home', '/{repo_name:.*?}/changeset/{revision}',
462 controller='changeset', revision='tip',
462 controller='changeset', revision='tip',
463 conditions=dict(function=check_repo))
463 conditions=dict(function=check_repo))
464
464
465 # no longer user, but kept for routes to work
465 # no longer user, but kept for routes to work
466 rmap.connect("_edit_repo", "/{repo_name:.*?}/edit",
466 rmap.connect("_edit_repo", "/{repo_name:.*?}/edit",
467 controller='admin/repos', action="edit",
467 controller='admin/repos', action="edit",
468 conditions=dict(method=["GET"], function=check_repo)
468 conditions=dict(method=["GET"], function=check_repo)
469 )
469 )
470
470
471 rmap.connect("edit_repo", "/{repo_name:.*?}/settings",
471 rmap.connect("edit_repo", "/{repo_name:.*?}/settings",
472 controller='admin/repos', action="edit",
472 controller='admin/repos', action="edit",
473 conditions=dict(method=["GET"], function=check_repo)
473 conditions=dict(method=["GET"], function=check_repo)
474 )
474 )
475
475
476 #still working url for backward compat.
476 #still working url for backward compat.
477 rmap.connect('raw_changeset_home_depraced',
477 rmap.connect('raw_changeset_home_depraced',
478 '/{repo_name:.*?}/raw-changeset/{revision}',
478 '/{repo_name:.*?}/raw-changeset/{revision}',
479 controller='changeset', action='changeset_raw',
479 controller='changeset', action='changeset_raw',
480 revision='tip', conditions=dict(function=check_repo))
480 revision='tip', conditions=dict(function=check_repo))
481
481
482 ## new URLs
482 ## new URLs
483 rmap.connect('changeset_raw_home',
483 rmap.connect('changeset_raw_home',
484 '/{repo_name:.*?}/changeset-diff/{revision}',
484 '/{repo_name:.*?}/changeset-diff/{revision}',
485 controller='changeset', action='changeset_raw',
485 controller='changeset', action='changeset_raw',
486 revision='tip', conditions=dict(function=check_repo))
486 revision='tip', conditions=dict(function=check_repo))
487
487
488 rmap.connect('changeset_patch_home',
488 rmap.connect('changeset_patch_home',
489 '/{repo_name:.*?}/changeset-patch/{revision}',
489 '/{repo_name:.*?}/changeset-patch/{revision}',
490 controller='changeset', action='changeset_patch',
490 controller='changeset', action='changeset_patch',
491 revision='tip', conditions=dict(function=check_repo))
491 revision='tip', conditions=dict(function=check_repo))
492
492
493 rmap.connect('changeset_download_home',
493 rmap.connect('changeset_download_home',
494 '/{repo_name:.*?}/changeset-download/{revision}',
494 '/{repo_name:.*?}/changeset-download/{revision}',
495 controller='changeset', action='changeset_download',
495 controller='changeset', action='changeset_download',
496 revision='tip', conditions=dict(function=check_repo))
496 revision='tip', conditions=dict(function=check_repo))
497
497
498 rmap.connect('changeset_comment',
498 rmap.connect('changeset_comment',
499 '/{repo_name:.*?}/changeset/{revision}/comment',
499 '/{repo_name:.*?}/changeset/{revision}/comment',
500 controller='changeset', revision='tip', action='comment',
500 controller='changeset', revision='tip', action='comment',
501 conditions=dict(function=check_repo))
501 conditions=dict(function=check_repo))
502
502
503 rmap.connect('changeset_comment_preview',
504 '/{repo_name:.*?}/changeset/comment/preview',
505 controller='changeset', action='preview_comment',
506 conditions=dict(function=check_repo, method=["POST"]))
507
503 rmap.connect('changeset_comment_delete',
508 rmap.connect('changeset_comment_delete',
504 '/{repo_name:.*?}/changeset/comment/{comment_id}/delete',
509 '/{repo_name:.*?}/changeset/comment/{comment_id}/delete',
505 controller='changeset', action='delete_comment',
510 controller='changeset', action='delete_comment',
506 conditions=dict(function=check_repo, method=["DELETE"]))
511 conditions=dict(function=check_repo, method=["DELETE"]))
507
512
508 rmap.connect('changeset_info', '/changeset_info/{repo_name:.*?}/{revision}',
513 rmap.connect('changeset_info', '/changeset_info/{repo_name:.*?}/{revision}',
509 controller='changeset', action='changeset_info')
514 controller='changeset', action='changeset_info')
510
515
511 rmap.connect('compare_url',
516 rmap.connect('compare_url',
512 '/{repo_name:.*?}/compare/{org_ref_type}@{org_ref:.*?}...{other_ref_type}@{other_ref:.*?}',
517 '/{repo_name:.*?}/compare/{org_ref_type}@{org_ref:.*?}...{other_ref_type}@{other_ref:.*?}',
513 controller='compare', action='index',
518 controller='compare', action='index',
514 conditions=dict(function=check_repo),
519 conditions=dict(function=check_repo),
515 requirements=dict(
520 requirements=dict(
516 org_ref_type='(branch|book|tag|rev|__other_ref_type__)',
521 org_ref_type='(branch|book|tag|rev|__other_ref_type__)',
517 other_ref_type='(branch|book|tag|rev|__org_ref_type__)')
522 other_ref_type='(branch|book|tag|rev|__org_ref_type__)')
518 )
523 )
519
524
520 rmap.connect('pullrequest_home',
525 rmap.connect('pullrequest_home',
521 '/{repo_name:.*?}/pull-request/new', controller='pullrequests',
526 '/{repo_name:.*?}/pull-request/new', controller='pullrequests',
522 action='index', conditions=dict(function=check_repo,
527 action='index', conditions=dict(function=check_repo,
523 method=["GET"]))
528 method=["GET"]))
524
529
525 rmap.connect('pullrequest',
530 rmap.connect('pullrequest',
526 '/{repo_name:.*?}/pull-request/new', controller='pullrequests',
531 '/{repo_name:.*?}/pull-request/new', controller='pullrequests',
527 action='create', conditions=dict(function=check_repo,
532 action='create', conditions=dict(function=check_repo,
528 method=["POST"]))
533 method=["POST"]))
529
534
530 rmap.connect('pullrequest_show',
535 rmap.connect('pullrequest_show',
531 '/{repo_name:.*?}/pull-request/{pull_request_id}',
536 '/{repo_name:.*?}/pull-request/{pull_request_id}',
532 controller='pullrequests',
537 controller='pullrequests',
533 action='show', conditions=dict(function=check_repo,
538 action='show', conditions=dict(function=check_repo,
534 method=["GET"]))
539 method=["GET"]))
535 rmap.connect('pullrequest_update',
540 rmap.connect('pullrequest_update',
536 '/{repo_name:.*?}/pull-request/{pull_request_id}',
541 '/{repo_name:.*?}/pull-request/{pull_request_id}',
537 controller='pullrequests',
542 controller='pullrequests',
538 action='update', conditions=dict(function=check_repo,
543 action='update', conditions=dict(function=check_repo,
539 method=["PUT"]))
544 method=["PUT"]))
540 rmap.connect('pullrequest_delete',
545 rmap.connect('pullrequest_delete',
541 '/{repo_name:.*?}/pull-request/{pull_request_id}',
546 '/{repo_name:.*?}/pull-request/{pull_request_id}',
542 controller='pullrequests',
547 controller='pullrequests',
543 action='delete', conditions=dict(function=check_repo,
548 action='delete', conditions=dict(function=check_repo,
544 method=["DELETE"]))
549 method=["DELETE"]))
545
550
546 rmap.connect('pullrequest_show_all',
551 rmap.connect('pullrequest_show_all',
547 '/{repo_name:.*?}/pull-request',
552 '/{repo_name:.*?}/pull-request',
548 controller='pullrequests',
553 controller='pullrequests',
549 action='show_all', conditions=dict(function=check_repo,
554 action='show_all', conditions=dict(function=check_repo,
550 method=["GET"]))
555 method=["GET"]))
551
556
552 rmap.connect('pullrequest_comment',
557 rmap.connect('pullrequest_comment',
553 '/{repo_name:.*?}/pull-request-comment/{pull_request_id}',
558 '/{repo_name:.*?}/pull-request-comment/{pull_request_id}',
554 controller='pullrequests',
559 controller='pullrequests',
555 action='comment', conditions=dict(function=check_repo,
560 action='comment', conditions=dict(function=check_repo,
556 method=["POST"]))
561 method=["POST"]))
557
562
558 rmap.connect('pullrequest_comment_delete',
563 rmap.connect('pullrequest_comment_delete',
559 '/{repo_name:.*?}/pull-request-comment/{comment_id}/delete',
564 '/{repo_name:.*?}/pull-request-comment/{comment_id}/delete',
560 controller='pullrequests', action='delete_comment',
565 controller='pullrequests', action='delete_comment',
561 conditions=dict(function=check_repo, method=["DELETE"]))
566 conditions=dict(function=check_repo, method=["DELETE"]))
562
567
563 rmap.connect('summary_home_summary', '/{repo_name:.*?}/summary',
568 rmap.connect('summary_home_summary', '/{repo_name:.*?}/summary',
564 controller='summary', conditions=dict(function=check_repo))
569 controller='summary', conditions=dict(function=check_repo))
565
570
566 rmap.connect('shortlog_home', '/{repo_name:.*?}/shortlog',
571 rmap.connect('shortlog_home', '/{repo_name:.*?}/shortlog',
567 controller='shortlog', conditions=dict(function=check_repo))
572 controller='shortlog', conditions=dict(function=check_repo))
568
573
569 rmap.connect('shortlog_file_home', '/{repo_name:.*?}/shortlog/{revision}/{f_path:.*}',
574 rmap.connect('shortlog_file_home', '/{repo_name:.*?}/shortlog/{revision}/{f_path:.*}',
570 controller='shortlog', f_path=None,
575 controller='shortlog', f_path=None,
571 conditions=dict(function=check_repo))
576 conditions=dict(function=check_repo))
572
577
573 rmap.connect('branches_home', '/{repo_name:.*?}/branches',
578 rmap.connect('branches_home', '/{repo_name:.*?}/branches',
574 controller='branches', conditions=dict(function=check_repo))
579 controller='branches', conditions=dict(function=check_repo))
575
580
576 rmap.connect('tags_home', '/{repo_name:.*?}/tags',
581 rmap.connect('tags_home', '/{repo_name:.*?}/tags',
577 controller='tags', conditions=dict(function=check_repo))
582 controller='tags', conditions=dict(function=check_repo))
578
583
579 rmap.connect('bookmarks_home', '/{repo_name:.*?}/bookmarks',
584 rmap.connect('bookmarks_home', '/{repo_name:.*?}/bookmarks',
580 controller='bookmarks', conditions=dict(function=check_repo))
585 controller='bookmarks', conditions=dict(function=check_repo))
581
586
582 rmap.connect('changelog_home', '/{repo_name:.*?}/changelog',
587 rmap.connect('changelog_home', '/{repo_name:.*?}/changelog',
583 controller='changelog', conditions=dict(function=check_repo))
588 controller='changelog', conditions=dict(function=check_repo))
584
589
585 rmap.connect('changelog_details', '/{repo_name:.*?}/changelog_details/{cs}',
590 rmap.connect('changelog_details', '/{repo_name:.*?}/changelog_details/{cs}',
586 controller='changelog', action='changelog_details',
591 controller='changelog', action='changelog_details',
587 conditions=dict(function=check_repo))
592 conditions=dict(function=check_repo))
588
593
589 rmap.connect('files_home', '/{repo_name:.*?}/files/{revision}/{f_path:.*}',
594 rmap.connect('files_home', '/{repo_name:.*?}/files/{revision}/{f_path:.*}',
590 controller='files', revision='tip', f_path='',
595 controller='files', revision='tip', f_path='',
591 conditions=dict(function=check_repo))
596 conditions=dict(function=check_repo))
592
597
593 rmap.connect('files_home_nopath', '/{repo_name:.*?}/files/{revision}',
598 rmap.connect('files_home_nopath', '/{repo_name:.*?}/files/{revision}',
594 controller='files', revision='tip', f_path='',
599 controller='files', revision='tip', f_path='',
595 conditions=dict(function=check_repo))
600 conditions=dict(function=check_repo))
596
601
597 rmap.connect('files_history_home',
602 rmap.connect('files_history_home',
598 '/{repo_name:.*?}/history/{revision}/{f_path:.*}',
603 '/{repo_name:.*?}/history/{revision}/{f_path:.*}',
599 controller='files', action='history', revision='tip', f_path='',
604 controller='files', action='history', revision='tip', f_path='',
600 conditions=dict(function=check_repo))
605 conditions=dict(function=check_repo))
601
606
602 rmap.connect('files_diff_home', '/{repo_name:.*?}/diff/{f_path:.*}',
607 rmap.connect('files_diff_home', '/{repo_name:.*?}/diff/{f_path:.*}',
603 controller='files', action='diff', revision='tip', f_path='',
608 controller='files', action='diff', revision='tip', f_path='',
604 conditions=dict(function=check_repo))
609 conditions=dict(function=check_repo))
605
610
606 rmap.connect('files_rawfile_home',
611 rmap.connect('files_rawfile_home',
607 '/{repo_name:.*?}/rawfile/{revision}/{f_path:.*}',
612 '/{repo_name:.*?}/rawfile/{revision}/{f_path:.*}',
608 controller='files', action='rawfile', revision='tip',
613 controller='files', action='rawfile', revision='tip',
609 f_path='', conditions=dict(function=check_repo))
614 f_path='', conditions=dict(function=check_repo))
610
615
611 rmap.connect('files_raw_home',
616 rmap.connect('files_raw_home',
612 '/{repo_name:.*?}/raw/{revision}/{f_path:.*}',
617 '/{repo_name:.*?}/raw/{revision}/{f_path:.*}',
613 controller='files', action='raw', revision='tip', f_path='',
618 controller='files', action='raw', revision='tip', f_path='',
614 conditions=dict(function=check_repo))
619 conditions=dict(function=check_repo))
615
620
616 rmap.connect('files_annotate_home',
621 rmap.connect('files_annotate_home',
617 '/{repo_name:.*?}/annotate/{revision}/{f_path:.*}',
622 '/{repo_name:.*?}/annotate/{revision}/{f_path:.*}',
618 controller='files', action='index', revision='tip',
623 controller='files', action='index', revision='tip',
619 f_path='', annotate=True, conditions=dict(function=check_repo))
624 f_path='', annotate=True, conditions=dict(function=check_repo))
620
625
621 rmap.connect('files_edit_home',
626 rmap.connect('files_edit_home',
622 '/{repo_name:.*?}/edit/{revision}/{f_path:.*}',
627 '/{repo_name:.*?}/edit/{revision}/{f_path:.*}',
623 controller='files', action='edit', revision='tip',
628 controller='files', action='edit', revision='tip',
624 f_path='', conditions=dict(function=check_repo))
629 f_path='', conditions=dict(function=check_repo))
625
630
626 rmap.connect('files_add_home',
631 rmap.connect('files_add_home',
627 '/{repo_name:.*?}/add/{revision}/{f_path:.*}',
632 '/{repo_name:.*?}/add/{revision}/{f_path:.*}',
628 controller='files', action='add', revision='tip',
633 controller='files', action='add', revision='tip',
629 f_path='', conditions=dict(function=check_repo))
634 f_path='', conditions=dict(function=check_repo))
630
635
631 rmap.connect('files_archive_home', '/{repo_name:.*?}/archive/{fname}',
636 rmap.connect('files_archive_home', '/{repo_name:.*?}/archive/{fname}',
632 controller='files', action='archivefile',
637 controller='files', action='archivefile',
633 conditions=dict(function=check_repo))
638 conditions=dict(function=check_repo))
634
639
635 rmap.connect('files_nodelist_home',
640 rmap.connect('files_nodelist_home',
636 '/{repo_name:.*?}/nodelist/{revision}/{f_path:.*}',
641 '/{repo_name:.*?}/nodelist/{revision}/{f_path:.*}',
637 controller='files', action='nodelist',
642 controller='files', action='nodelist',
638 conditions=dict(function=check_repo))
643 conditions=dict(function=check_repo))
639
644
640 rmap.connect('repo_fork_create_home', '/{repo_name:.*?}/fork',
645 rmap.connect('repo_fork_create_home', '/{repo_name:.*?}/fork',
641 controller='forks', action='fork_create',
646 controller='forks', action='fork_create',
642 conditions=dict(function=check_repo, method=["POST"]))
647 conditions=dict(function=check_repo, method=["POST"]))
643
648
644 rmap.connect('repo_fork_home', '/{repo_name:.*?}/fork',
649 rmap.connect('repo_fork_home', '/{repo_name:.*?}/fork',
645 controller='forks', action='fork',
650 controller='forks', action='fork',
646 conditions=dict(function=check_repo))
651 conditions=dict(function=check_repo))
647
652
648 rmap.connect('repo_forks_home', '/{repo_name:.*?}/forks',
653 rmap.connect('repo_forks_home', '/{repo_name:.*?}/forks',
649 controller='forks', action='forks',
654 controller='forks', action='forks',
650 conditions=dict(function=check_repo))
655 conditions=dict(function=check_repo))
651
656
652 rmap.connect('repo_followers_home', '/{repo_name:.*?}/followers',
657 rmap.connect('repo_followers_home', '/{repo_name:.*?}/followers',
653 controller='followers', action='followers',
658 controller='followers', action='followers',
654 conditions=dict(function=check_repo))
659 conditions=dict(function=check_repo))
655
660
656 return rmap
661 return rmap
@@ -1,404 +1,416 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 rhodecode.controllers.changeset
3 rhodecode.controllers.changeset
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 changeset controller for pylons showoing changes beetween
6 changeset controller for pylons showoing changes beetween
7 revisions
7 revisions
8
8
9 :created_on: Apr 25, 2010
9 :created_on: Apr 25, 2010
10 :author: marcink
10 :author: marcink
11 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
11 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
12 :license: GPLv3, see COPYING for more details.
12 :license: GPLv3, see COPYING for more details.
13 """
13 """
14 # This program is free software: you can redistribute it and/or modify
14 # This program is free software: you can redistribute it and/or modify
15 # it under the terms of the GNU General Public License as published by
15 # it under the terms of the GNU General Public License as published by
16 # the Free Software Foundation, either version 3 of the License, or
16 # the Free Software Foundation, either version 3 of the License, or
17 # (at your option) any later version.
17 # (at your option) any later version.
18 #
18 #
19 # This program is distributed in the hope that it will be useful,
19 # This program is distributed in the hope that it will be useful,
20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 # GNU General Public License for more details.
22 # GNU General Public License for more details.
23 #
23 #
24 # You should have received a copy of the GNU General Public License
24 # You should have received a copy of the GNU General Public License
25 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25 # along with this program. If not, see <http://www.gnu.org/licenses/>.
26 import logging
26 import logging
27 import traceback
27 import traceback
28 from collections import defaultdict
28 from collections import defaultdict
29 from webob.exc import HTTPForbidden, HTTPBadRequest, HTTPNotFound
29 from webob.exc import HTTPForbidden, HTTPBadRequest, HTTPNotFound
30
30
31 from pylons import tmpl_context as c, url, request, response
31 from pylons import tmpl_context as c, url, request, response
32 from pylons.i18n.translation import _
32 from pylons.i18n.translation import _
33 from pylons.controllers.util import redirect
33 from pylons.controllers.util import redirect
34 from rhodecode.lib.utils import jsonify
34 from rhodecode.lib.utils import jsonify
35
35
36 from rhodecode.lib.vcs.exceptions import RepositoryError, \
36 from rhodecode.lib.vcs.exceptions import RepositoryError, \
37 ChangesetDoesNotExistError
37 ChangesetDoesNotExistError
38
38
39 import rhodecode.lib.helpers as h
39 import rhodecode.lib.helpers as h
40 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
40 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator,\
41 NotAnonymous
41 from rhodecode.lib.base import BaseRepoController, render
42 from rhodecode.lib.base import BaseRepoController, render
42 from rhodecode.lib.utils import action_logger
43 from rhodecode.lib.utils import action_logger
43 from rhodecode.lib.compat import OrderedDict
44 from rhodecode.lib.compat import OrderedDict
44 from rhodecode.lib import diffs
45 from rhodecode.lib import diffs
45 from rhodecode.model.db import ChangesetComment, ChangesetStatus
46 from rhodecode.model.db import ChangesetComment, ChangesetStatus
46 from rhodecode.model.comment import ChangesetCommentsModel
47 from rhodecode.model.comment import ChangesetCommentsModel
47 from rhodecode.model.changeset_status import ChangesetStatusModel
48 from rhodecode.model.changeset_status import ChangesetStatusModel
48 from rhodecode.model.meta import Session
49 from rhodecode.model.meta import Session
49 from rhodecode.model.repo import RepoModel
50 from rhodecode.model.repo import RepoModel
50 from rhodecode.lib.diffs import LimitedDiffContainer
51 from rhodecode.lib.diffs import LimitedDiffContainer
51 from rhodecode.lib.exceptions import StatusChangeOnClosedPullRequestError
52 from rhodecode.lib.exceptions import StatusChangeOnClosedPullRequestError
52 from rhodecode.lib.vcs.backends.base import EmptyChangeset
53 from rhodecode.lib.vcs.backends.base import EmptyChangeset
53 from rhodecode.lib.utils2 import safe_unicode
54 from rhodecode.lib.utils2 import safe_unicode
54
55
55 log = logging.getLogger(__name__)
56 log = logging.getLogger(__name__)
56
57
57
58
58 def _update_with_GET(params, GET):
59 def _update_with_GET(params, GET):
59 for k in ['diff1', 'diff2', 'diff']:
60 for k in ['diff1', 'diff2', 'diff']:
60 params[k] += GET.getall(k)
61 params[k] += GET.getall(k)
61
62
62
63
63 def anchor_url(revision, path, GET):
64 def anchor_url(revision, path, GET):
64 fid = h.FID(revision, path)
65 fid = h.FID(revision, path)
65 return h.url.current(anchor=fid, **dict(GET))
66 return h.url.current(anchor=fid, **dict(GET))
66
67
67
68
68 def get_ignore_ws(fid, GET):
69 def get_ignore_ws(fid, GET):
69 ig_ws_global = GET.get('ignorews')
70 ig_ws_global = GET.get('ignorews')
70 ig_ws = filter(lambda k: k.startswith('WS'), GET.getall(fid))
71 ig_ws = filter(lambda k: k.startswith('WS'), GET.getall(fid))
71 if ig_ws:
72 if ig_ws:
72 try:
73 try:
73 return int(ig_ws[0].split(':')[-1])
74 return int(ig_ws[0].split(':')[-1])
74 except Exception:
75 except Exception:
75 pass
76 pass
76 return ig_ws_global
77 return ig_ws_global
77
78
78
79
79 def _ignorews_url(GET, fileid=None):
80 def _ignorews_url(GET, fileid=None):
80 fileid = str(fileid) if fileid else None
81 fileid = str(fileid) if fileid else None
81 params = defaultdict(list)
82 params = defaultdict(list)
82 _update_with_GET(params, GET)
83 _update_with_GET(params, GET)
83 lbl = _('Show white space')
84 lbl = _('Show white space')
84 ig_ws = get_ignore_ws(fileid, GET)
85 ig_ws = get_ignore_ws(fileid, GET)
85 ln_ctx = get_line_ctx(fileid, GET)
86 ln_ctx = get_line_ctx(fileid, GET)
86 # global option
87 # global option
87 if fileid is None:
88 if fileid is None:
88 if ig_ws is None:
89 if ig_ws is None:
89 params['ignorews'] += [1]
90 params['ignorews'] += [1]
90 lbl = _('Ignore white space')
91 lbl = _('Ignore white space')
91 ctx_key = 'context'
92 ctx_key = 'context'
92 ctx_val = ln_ctx
93 ctx_val = ln_ctx
93 # per file options
94 # per file options
94 else:
95 else:
95 if ig_ws is None:
96 if ig_ws is None:
96 params[fileid] += ['WS:1']
97 params[fileid] += ['WS:1']
97 lbl = _('Ignore white space')
98 lbl = _('Ignore white space')
98
99
99 ctx_key = fileid
100 ctx_key = fileid
100 ctx_val = 'C:%s' % ln_ctx
101 ctx_val = 'C:%s' % ln_ctx
101 # if we have passed in ln_ctx pass it along to our params
102 # if we have passed in ln_ctx pass it along to our params
102 if ln_ctx:
103 if ln_ctx:
103 params[ctx_key] += [ctx_val]
104 params[ctx_key] += [ctx_val]
104
105
105 params['anchor'] = fileid
106 params['anchor'] = fileid
106 img = h.image(h.url('/images/icons/text_strikethrough.png'), lbl, class_='icon')
107 img = h.image(h.url('/images/icons/text_strikethrough.png'), lbl, class_='icon')
107 return h.link_to(img, h.url.current(**params), title=lbl, class_='tooltip')
108 return h.link_to(img, h.url.current(**params), title=lbl, class_='tooltip')
108
109
109
110
110 def get_line_ctx(fid, GET):
111 def get_line_ctx(fid, GET):
111 ln_ctx_global = GET.get('context')
112 ln_ctx_global = GET.get('context')
112 if fid:
113 if fid:
113 ln_ctx = filter(lambda k: k.startswith('C'), GET.getall(fid))
114 ln_ctx = filter(lambda k: k.startswith('C'), GET.getall(fid))
114 else:
115 else:
115 _ln_ctx = filter(lambda k: k.startswith('C'), GET)
116 _ln_ctx = filter(lambda k: k.startswith('C'), GET)
116 ln_ctx = GET.get(_ln_ctx[0]) if _ln_ctx else ln_ctx_global
117 ln_ctx = GET.get(_ln_ctx[0]) if _ln_ctx else ln_ctx_global
117 if ln_ctx:
118 if ln_ctx:
118 ln_ctx = [ln_ctx]
119 ln_ctx = [ln_ctx]
119
120
120 if ln_ctx:
121 if ln_ctx:
121 retval = ln_ctx[0].split(':')[-1]
122 retval = ln_ctx[0].split(':')[-1]
122 else:
123 else:
123 retval = ln_ctx_global
124 retval = ln_ctx_global
124
125
125 try:
126 try:
126 return int(retval)
127 return int(retval)
127 except Exception:
128 except Exception:
128 return 3
129 return 3
129
130
130
131
131 def _context_url(GET, fileid=None):
132 def _context_url(GET, fileid=None):
132 """
133 """
133 Generates url for context lines
134 Generates url for context lines
134
135
135 :param fileid:
136 :param fileid:
136 """
137 """
137
138
138 fileid = str(fileid) if fileid else None
139 fileid = str(fileid) if fileid else None
139 ig_ws = get_ignore_ws(fileid, GET)
140 ig_ws = get_ignore_ws(fileid, GET)
140 ln_ctx = (get_line_ctx(fileid, GET) or 3) * 2
141 ln_ctx = (get_line_ctx(fileid, GET) or 3) * 2
141
142
142 params = defaultdict(list)
143 params = defaultdict(list)
143 _update_with_GET(params, GET)
144 _update_with_GET(params, GET)
144
145
145 # global option
146 # global option
146 if fileid is None:
147 if fileid is None:
147 if ln_ctx > 0:
148 if ln_ctx > 0:
148 params['context'] += [ln_ctx]
149 params['context'] += [ln_ctx]
149
150
150 if ig_ws:
151 if ig_ws:
151 ig_ws_key = 'ignorews'
152 ig_ws_key = 'ignorews'
152 ig_ws_val = 1
153 ig_ws_val = 1
153
154
154 # per file option
155 # per file option
155 else:
156 else:
156 params[fileid] += ['C:%s' % ln_ctx]
157 params[fileid] += ['C:%s' % ln_ctx]
157 ig_ws_key = fileid
158 ig_ws_key = fileid
158 ig_ws_val = 'WS:%s' % 1
159 ig_ws_val = 'WS:%s' % 1
159
160
160 if ig_ws:
161 if ig_ws:
161 params[ig_ws_key] += [ig_ws_val]
162 params[ig_ws_key] += [ig_ws_val]
162
163
163 lbl = _('%s line context') % ln_ctx
164 lbl = _('%s line context') % ln_ctx
164
165
165 params['anchor'] = fileid
166 params['anchor'] = fileid
166 img = h.image(h.url('/images/icons/table_add.png'), lbl, class_='icon')
167 img = h.image(h.url('/images/icons/table_add.png'), lbl, class_='icon')
167 return h.link_to(img, h.url.current(**params), title=lbl, class_='tooltip')
168 return h.link_to(img, h.url.current(**params), title=lbl, class_='tooltip')
168
169
169
170
170 class ChangesetController(BaseRepoController):
171 class ChangesetController(BaseRepoController):
171
172
172 @LoginRequired()
173 @LoginRequired()
173 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
174 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
174 'repository.admin')
175 'repository.admin')
175 def __before__(self):
176 def __before__(self):
176 super(ChangesetController, self).__before__()
177 super(ChangesetController, self).__before__()
177 c.affected_files_cut_off = 60
178 c.affected_files_cut_off = 60
178 repo_model = RepoModel()
179 repo_model = RepoModel()
179 c.users_array = repo_model.get_users_js()
180 c.users_array = repo_model.get_users_js()
180 c.users_groups_array = repo_model.get_users_groups_js()
181 c.users_groups_array = repo_model.get_users_groups_js()
181
182
182 def index(self, revision, method='show'):
183 def index(self, revision, method='show'):
183 c.anchor_url = anchor_url
184 c.anchor_url = anchor_url
184 c.ignorews_url = _ignorews_url
185 c.ignorews_url = _ignorews_url
185 c.context_url = _context_url
186 c.context_url = _context_url
186 c.fulldiff = fulldiff = request.GET.get('fulldiff')
187 c.fulldiff = fulldiff = request.GET.get('fulldiff')
187 #get ranges of revisions if preset
188 #get ranges of revisions if preset
188 rev_range = revision.split('...')[:2]
189 rev_range = revision.split('...')[:2]
189 enable_comments = True
190 enable_comments = True
190 try:
191 try:
191 if len(rev_range) == 2:
192 if len(rev_range) == 2:
192 enable_comments = False
193 enable_comments = False
193 rev_start = rev_range[0]
194 rev_start = rev_range[0]
194 rev_end = rev_range[1]
195 rev_end = rev_range[1]
195 rev_ranges = c.rhodecode_repo.get_changesets(start=rev_start,
196 rev_ranges = c.rhodecode_repo.get_changesets(start=rev_start,
196 end=rev_end)
197 end=rev_end)
197 else:
198 else:
198 rev_ranges = [c.rhodecode_repo.get_changeset(revision)]
199 rev_ranges = [c.rhodecode_repo.get_changeset(revision)]
199
200
200 c.cs_ranges = list(rev_ranges)
201 c.cs_ranges = list(rev_ranges)
201 if not c.cs_ranges:
202 if not c.cs_ranges:
202 raise RepositoryError('Changeset range returned empty result')
203 raise RepositoryError('Changeset range returned empty result')
203
204
204 except (RepositoryError, ChangesetDoesNotExistError, Exception), e:
205 except (RepositoryError, ChangesetDoesNotExistError, Exception), e:
205 log.error(traceback.format_exc())
206 log.error(traceback.format_exc())
206 h.flash(str(e), category='error')
207 h.flash(str(e), category='error')
207 raise HTTPNotFound()
208 raise HTTPNotFound()
208
209
209 c.changes = OrderedDict()
210 c.changes = OrderedDict()
210
211
211 c.lines_added = 0 # count of lines added
212 c.lines_added = 0 # count of lines added
212 c.lines_deleted = 0 # count of lines removes
213 c.lines_deleted = 0 # count of lines removes
213
214
214 c.changeset_statuses = ChangesetStatus.STATUSES
215 c.changeset_statuses = ChangesetStatus.STATUSES
215 c.comments = []
216 c.comments = []
216 c.statuses = []
217 c.statuses = []
217 c.inline_comments = []
218 c.inline_comments = []
218 c.inline_cnt = 0
219 c.inline_cnt = 0
219
220
220 # Iterate over ranges (default changeset view is always one changeset)
221 # Iterate over ranges (default changeset view is always one changeset)
221 for changeset in c.cs_ranges:
222 for changeset in c.cs_ranges:
222 inlines = []
223 inlines = []
223 if method == 'show':
224 if method == 'show':
224 c.statuses.extend([ChangesetStatusModel().get_status(
225 c.statuses.extend([ChangesetStatusModel().get_status(
225 c.rhodecode_db_repo.repo_id, changeset.raw_id)])
226 c.rhodecode_db_repo.repo_id, changeset.raw_id)])
226
227
227 c.comments.extend(ChangesetCommentsModel()\
228 c.comments.extend(ChangesetCommentsModel()\
228 .get_comments(c.rhodecode_db_repo.repo_id,
229 .get_comments(c.rhodecode_db_repo.repo_id,
229 revision=changeset.raw_id))
230 revision=changeset.raw_id))
230
231
231 #comments from PR
232 #comments from PR
232 st = ChangesetStatusModel().get_statuses(
233 st = ChangesetStatusModel().get_statuses(
233 c.rhodecode_db_repo.repo_id, changeset.raw_id,
234 c.rhodecode_db_repo.repo_id, changeset.raw_id,
234 with_revisions=True)
235 with_revisions=True)
235 # from associated statuses, check the pull requests, and
236 # from associated statuses, check the pull requests, and
236 # show comments from them
237 # show comments from them
237
238
238 prs = set([x.pull_request for x in
239 prs = set([x.pull_request for x in
239 filter(lambda x: x.pull_request != None, st)])
240 filter(lambda x: x.pull_request != None, st)])
240
241
241 for pr in prs:
242 for pr in prs:
242 c.comments.extend(pr.comments)
243 c.comments.extend(pr.comments)
243 inlines = ChangesetCommentsModel()\
244 inlines = ChangesetCommentsModel()\
244 .get_inline_comments(c.rhodecode_db_repo.repo_id,
245 .get_inline_comments(c.rhodecode_db_repo.repo_id,
245 revision=changeset.raw_id)
246 revision=changeset.raw_id)
246 c.inline_comments.extend(inlines)
247 c.inline_comments.extend(inlines)
247
248
248 c.changes[changeset.raw_id] = []
249 c.changes[changeset.raw_id] = []
249
250
250 cs2 = changeset.raw_id
251 cs2 = changeset.raw_id
251 cs1 = changeset.parents[0].raw_id if changeset.parents else EmptyChangeset()
252 cs1 = changeset.parents[0].raw_id if changeset.parents else EmptyChangeset()
252 context_lcl = get_line_ctx('', request.GET)
253 context_lcl = get_line_ctx('', request.GET)
253 ign_whitespace_lcl = ign_whitespace_lcl = get_ignore_ws('', request.GET)
254 ign_whitespace_lcl = ign_whitespace_lcl = get_ignore_ws('', request.GET)
254
255
255 _diff = c.rhodecode_repo.get_diff(cs1, cs2,
256 _diff = c.rhodecode_repo.get_diff(cs1, cs2,
256 ignore_whitespace=ign_whitespace_lcl, context=context_lcl)
257 ignore_whitespace=ign_whitespace_lcl, context=context_lcl)
257 diff_limit = self.cut_off_limit if not fulldiff else None
258 diff_limit = self.cut_off_limit if not fulldiff else None
258 diff_processor = diffs.DiffProcessor(_diff,
259 diff_processor = diffs.DiffProcessor(_diff,
259 vcs=c.rhodecode_repo.alias,
260 vcs=c.rhodecode_repo.alias,
260 format='gitdiff',
261 format='gitdiff',
261 diff_limit=diff_limit)
262 diff_limit=diff_limit)
262 cs_changes = OrderedDict()
263 cs_changes = OrderedDict()
263 if method == 'show':
264 if method == 'show':
264 _parsed = diff_processor.prepare()
265 _parsed = diff_processor.prepare()
265 c.limited_diff = False
266 c.limited_diff = False
266 if isinstance(_parsed, LimitedDiffContainer):
267 if isinstance(_parsed, LimitedDiffContainer):
267 c.limited_diff = True
268 c.limited_diff = True
268 for f in _parsed:
269 for f in _parsed:
269 st = f['stats']
270 st = f['stats']
270 if st[0] != 'b':
271 if st[0] != 'b':
271 c.lines_added += st[0]
272 c.lines_added += st[0]
272 c.lines_deleted += st[1]
273 c.lines_deleted += st[1]
273 fid = h.FID(changeset.raw_id, f['filename'])
274 fid = h.FID(changeset.raw_id, f['filename'])
274 diff = diff_processor.as_html(enable_comments=enable_comments,
275 diff = diff_processor.as_html(enable_comments=enable_comments,
275 parsed_lines=[f])
276 parsed_lines=[f])
276 cs_changes[fid] = [cs1, cs2, f['operation'], f['filename'],
277 cs_changes[fid] = [cs1, cs2, f['operation'], f['filename'],
277 diff, st]
278 diff, st]
278 else:
279 else:
279 # downloads/raw we only need RAW diff nothing else
280 # downloads/raw we only need RAW diff nothing else
280 diff = diff_processor.as_raw()
281 diff = diff_processor.as_raw()
281 cs_changes[''] = [None, None, None, None, diff, None]
282 cs_changes[''] = [None, None, None, None, diff, None]
282 c.changes[changeset.raw_id] = cs_changes
283 c.changes[changeset.raw_id] = cs_changes
283
284
284 #sort comments by how they were generated
285 #sort comments by how they were generated
285 c.comments = sorted(c.comments, key=lambda x: x.comment_id)
286 c.comments = sorted(c.comments, key=lambda x: x.comment_id)
286
287
287 # count inline comments
288 # count inline comments
288 for __, lines in c.inline_comments:
289 for __, lines in c.inline_comments:
289 for comments in lines.values():
290 for comments in lines.values():
290 c.inline_cnt += len(comments)
291 c.inline_cnt += len(comments)
291
292
292 if len(c.cs_ranges) == 1:
293 if len(c.cs_ranges) == 1:
293 c.changeset = c.cs_ranges[0]
294 c.changeset = c.cs_ranges[0]
294 c.parent_tmpl = ''.join(['# Parent %s\n' % x.raw_id
295 c.parent_tmpl = ''.join(['# Parent %s\n' % x.raw_id
295 for x in c.changeset.parents])
296 for x in c.changeset.parents])
296 if method == 'download':
297 if method == 'download':
297 response.content_type = 'text/plain'
298 response.content_type = 'text/plain'
298 response.content_disposition = 'attachment; filename=%s.diff' \
299 response.content_disposition = 'attachment; filename=%s.diff' \
299 % revision[:12]
300 % revision[:12]
300 return diff
301 return diff
301 elif method == 'patch':
302 elif method == 'patch':
302 response.content_type = 'text/plain'
303 response.content_type = 'text/plain'
303 c.diff = safe_unicode(diff)
304 c.diff = safe_unicode(diff)
304 return render('changeset/patch_changeset.html')
305 return render('changeset/patch_changeset.html')
305 elif method == 'raw':
306 elif method == 'raw':
306 response.content_type = 'text/plain'
307 response.content_type = 'text/plain'
307 return diff
308 return diff
308 elif method == 'show':
309 elif method == 'show':
309 if len(c.cs_ranges) == 1:
310 if len(c.cs_ranges) == 1:
310 return render('changeset/changeset.html')
311 return render('changeset/changeset.html')
311 else:
312 else:
312 return render('changeset/changeset_range.html')
313 return render('changeset/changeset_range.html')
313
314
314 def changeset_raw(self, revision):
315 def changeset_raw(self, revision):
315 return self.index(revision, method='raw')
316 return self.index(revision, method='raw')
316
317
317 def changeset_patch(self, revision):
318 def changeset_patch(self, revision):
318 return self.index(revision, method='patch')
319 return self.index(revision, method='patch')
319
320
320 def changeset_download(self, revision):
321 def changeset_download(self, revision):
321 return self.index(revision, method='download')
322 return self.index(revision, method='download')
322
323
324 @NotAnonymous()
323 @jsonify
325 @jsonify
324 def comment(self, repo_name, revision):
326 def comment(self, repo_name, revision):
325 status = request.POST.get('changeset_status')
327 status = request.POST.get('changeset_status')
326 change_status = request.POST.get('change_changeset_status')
328 change_status = request.POST.get('change_changeset_status')
327 text = request.POST.get('text')
329 text = request.POST.get('text')
328 if status and change_status:
330 if status and change_status:
329 text = text or (_('Status change -> %s')
331 text = text or (_('Status change -> %s')
330 % ChangesetStatus.get_status_lbl(status))
332 % ChangesetStatus.get_status_lbl(status))
331
333
332 c.co = comm = ChangesetCommentsModel().create(
334 c.co = comm = ChangesetCommentsModel().create(
333 text=text,
335 text=text,
334 repo=c.rhodecode_db_repo.repo_id,
336 repo=c.rhodecode_db_repo.repo_id,
335 user=c.rhodecode_user.user_id,
337 user=c.rhodecode_user.user_id,
336 revision=revision,
338 revision=revision,
337 f_path=request.POST.get('f_path'),
339 f_path=request.POST.get('f_path'),
338 line_no=request.POST.get('line'),
340 line_no=request.POST.get('line'),
339 status_change=(ChangesetStatus.get_status_lbl(status)
341 status_change=(ChangesetStatus.get_status_lbl(status)
340 if status and change_status else None)
342 if status and change_status else None)
341 )
343 )
342
344
343 # get status if set !
345 # get status if set !
344 if status and change_status:
346 if status and change_status:
345 # if latest status was from pull request and it's closed
347 # if latest status was from pull request and it's closed
346 # disallow changing status !
348 # disallow changing status !
347 # dont_allow_on_closed_pull_request = True !
349 # dont_allow_on_closed_pull_request = True !
348
350
349 try:
351 try:
350 ChangesetStatusModel().set_status(
352 ChangesetStatusModel().set_status(
351 c.rhodecode_db_repo.repo_id,
353 c.rhodecode_db_repo.repo_id,
352 status,
354 status,
353 c.rhodecode_user.user_id,
355 c.rhodecode_user.user_id,
354 comm,
356 comm,
355 revision=revision,
357 revision=revision,
356 dont_allow_on_closed_pull_request=True
358 dont_allow_on_closed_pull_request=True
357 )
359 )
358 except StatusChangeOnClosedPullRequestError:
360 except StatusChangeOnClosedPullRequestError:
359 log.error(traceback.format_exc())
361 log.error(traceback.format_exc())
360 msg = _('Changing status on a changeset associated with '
362 msg = _('Changing status on a changeset associated with '
361 'a closed pull request is not allowed')
363 'a closed pull request is not allowed')
362 h.flash(msg, category='warning')
364 h.flash(msg, category='warning')
363 return redirect(h.url('changeset_home', repo_name=repo_name,
365 return redirect(h.url('changeset_home', repo_name=repo_name,
364 revision=revision))
366 revision=revision))
365 action_logger(self.rhodecode_user,
367 action_logger(self.rhodecode_user,
366 'user_commented_revision:%s' % revision,
368 'user_commented_revision:%s' % revision,
367 c.rhodecode_db_repo, self.ip_addr, self.sa)
369 c.rhodecode_db_repo, self.ip_addr, self.sa)
368
370
369 Session().commit()
371 Session().commit()
370
372
371 if not request.environ.get('HTTP_X_PARTIAL_XHR'):
373 if not request.environ.get('HTTP_X_PARTIAL_XHR'):
372 return redirect(h.url('changeset_home', repo_name=repo_name,
374 return redirect(h.url('changeset_home', repo_name=repo_name,
373 revision=revision))
375 revision=revision))
374 #only ajax below
376 #only ajax below
375 data = {
377 data = {
376 'target_id': h.safeid(h.safe_unicode(request.POST.get('f_path'))),
378 'target_id': h.safeid(h.safe_unicode(request.POST.get('f_path'))),
377 }
379 }
378 if comm:
380 if comm:
379 data.update(comm.get_dict())
381 data.update(comm.get_dict())
380 data.update({'rendered_text':
382 data.update({'rendered_text':
381 render('changeset/changeset_comment_block.html')})
383 render('changeset/changeset_comment_block.html')})
382
384
383 return data
385 return data
384
386
387 @NotAnonymous()
388 def preview_comment(self):
389 if not request.environ.get('HTTP_X_PARTIAL_XHR'):
390 raise HTTPBadRequest()
391 text = request.POST.get('text')
392 if text:
393 return h.rst_w_mentions(text)
394 return ''
395
396 @NotAnonymous()
385 @jsonify
397 @jsonify
386 def delete_comment(self, repo_name, comment_id):
398 def delete_comment(self, repo_name, comment_id):
387 co = ChangesetComment.get(comment_id)
399 co = ChangesetComment.get(comment_id)
388 owner = co.author.user_id == c.rhodecode_user.user_id
400 owner = co.author.user_id == c.rhodecode_user.user_id
389 if h.HasPermissionAny('hg.admin', 'repository.admin')() or owner:
401 if h.HasPermissionAny('hg.admin', 'repository.admin')() or owner:
390 ChangesetCommentsModel().delete(comment=co)
402 ChangesetCommentsModel().delete(comment=co)
391 Session().commit()
403 Session().commit()
392 return True
404 return True
393 else:
405 else:
394 raise HTTPForbidden()
406 raise HTTPForbidden()
395
407
396 @jsonify
408 @jsonify
397 def changeset_info(self, repo_name, revision):
409 def changeset_info(self, repo_name, revision):
398 if request.is_xhr:
410 if request.is_xhr:
399 try:
411 try:
400 return c.rhodecode_repo.get_changeset(revision)
412 return c.rhodecode_repo.get_changeset(revision)
401 except ChangesetDoesNotExistError, e:
413 except ChangesetDoesNotExistError, e:
402 return EmptyChangeset(message=str(e))
414 return EmptyChangeset(message=str(e))
403 else:
415 else:
404 raise HTTPBadRequest()
416 raise HTTPBadRequest()
@@ -1,4873 +1,4899 b''
1 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td {
1 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td {
2 border: 0;
2 border: 0;
3 outline: 0;
3 outline: 0;
4 font-size: 100%;
4 font-size: 100%;
5 vertical-align: baseline;
5 vertical-align: baseline;
6 background: transparent;
6 background: transparent;
7 margin: 0;
7 margin: 0;
8 padding: 0;
8 padding: 0;
9 }
9 }
10
10
11 body {
11 body {
12 line-height: 1;
12 line-height: 1;
13 height: 100%;
13 height: 100%;
14 background: url("../images/background.png") repeat scroll 0 0 #B0B0B0;
14 background: url("../images/background.png") repeat scroll 0 0 #B0B0B0;
15 font-family: Lucida Grande, Verdana, Lucida Sans Regular,
15 font-family: Lucida Grande, Verdana, Lucida Sans Regular,
16 Lucida Sans Unicode, Arial, sans-serif; font-size : 12px;
16 Lucida Sans Unicode, Arial, sans-serif; font-size : 12px;
17 color: #000;
17 color: #000;
18 margin: 0;
18 margin: 0;
19 padding: 0;
19 padding: 0;
20 font-size: 12px;
20 font-size: 12px;
21 }
21 }
22
22
23 ol, ul {
23 ol, ul {
24 list-style: none;
24 list-style: none;
25 }
25 }
26
26
27 blockquote, q {
27 blockquote, q {
28 quotes: none;
28 quotes: none;
29 }
29 }
30
30
31 blockquote:before, blockquote:after, q:before, q:after {
31 blockquote:before, blockquote:after, q:before, q:after {
32 content: none;
32 content: none;
33 }
33 }
34
34
35 :focus {
35 :focus {
36 outline: 0;
36 outline: 0;
37 }
37 }
38
38
39 del {
39 del {
40 text-decoration: line-through;
40 text-decoration: line-through;
41 }
41 }
42
42
43 table {
43 table {
44 border-collapse: collapse;
44 border-collapse: collapse;
45 border-spacing: 0;
45 border-spacing: 0;
46 }
46 }
47
47
48 html {
48 html {
49 height: 100%;
49 height: 100%;
50 }
50 }
51
51
52 a {
52 a {
53 color: #003367;
53 color: #003367;
54 text-decoration: none;
54 text-decoration: none;
55 cursor: pointer;
55 cursor: pointer;
56 }
56 }
57
57
58 a:hover {
58 a:hover {
59 color: #316293;
59 color: #316293;
60 text-decoration: underline;
60 text-decoration: underline;
61 }
61 }
62
62
63 h1, h2, h3, h4, h5, h6,
63 h1, h2, h3, h4, h5, h6,
64 div.h1, div.h2, div.h3, div.h4, div.h5, div.h6 {
64 div.h1, div.h2, div.h3, div.h4, div.h5, div.h6 {
65 color: #292929;
65 color: #292929;
66 font-weight: 700;
66 font-weight: 700;
67 }
67 }
68
68
69 h1, div.h1 {
69 h1, div.h1 {
70 font-size: 22px;
70 font-size: 22px;
71 }
71 }
72
72
73 h2, div.h2 {
73 h2, div.h2 {
74 font-size: 20px;
74 font-size: 20px;
75 }
75 }
76
76
77 h3, div.h3 {
77 h3, div.h3 {
78 font-size: 18px;
78 font-size: 18px;
79 }
79 }
80
80
81 h4, div.h4 {
81 h4, div.h4 {
82 font-size: 16px;
82 font-size: 16px;
83 }
83 }
84
84
85 h5, div.h5 {
85 h5, div.h5 {
86 font-size: 14px;
86 font-size: 14px;
87 }
87 }
88
88
89 h6, div.h6 {
89 h6, div.h6 {
90 font-size: 11px;
90 font-size: 11px;
91 }
91 }
92
92
93 ul.circle {
93 ul.circle {
94 list-style-type: circle;
94 list-style-type: circle;
95 }
95 }
96
96
97 ul.disc {
97 ul.disc {
98 list-style-type: disc;
98 list-style-type: disc;
99 }
99 }
100
100
101 ul.square {
101 ul.square {
102 list-style-type: square;
102 list-style-type: square;
103 }
103 }
104
104
105 ol.lower-roman {
105 ol.lower-roman {
106 list-style-type: lower-roman;
106 list-style-type: lower-roman;
107 }
107 }
108
108
109 ol.upper-roman {
109 ol.upper-roman {
110 list-style-type: upper-roman;
110 list-style-type: upper-roman;
111 }
111 }
112
112
113 ol.lower-alpha {
113 ol.lower-alpha {
114 list-style-type: lower-alpha;
114 list-style-type: lower-alpha;
115 }
115 }
116
116
117 ol.upper-alpha {
117 ol.upper-alpha {
118 list-style-type: upper-alpha;
118 list-style-type: upper-alpha;
119 }
119 }
120
120
121 ol.decimal {
121 ol.decimal {
122 list-style-type: decimal;
122 list-style-type: decimal;
123 }
123 }
124
124
125 div.color {
125 div.color {
126 clear: both;
126 clear: both;
127 overflow: hidden;
127 overflow: hidden;
128 position: absolute;
128 position: absolute;
129 background: #FFF;
129 background: #FFF;
130 margin: 7px 0 0 60px;
130 margin: 7px 0 0 60px;
131 padding: 1px 1px 1px 0;
131 padding: 1px 1px 1px 0;
132 }
132 }
133
133
134 div.color a {
134 div.color a {
135 width: 15px;
135 width: 15px;
136 height: 15px;
136 height: 15px;
137 display: block;
137 display: block;
138 float: left;
138 float: left;
139 margin: 0 0 0 1px;
139 margin: 0 0 0 1px;
140 padding: 0;
140 padding: 0;
141 }
141 }
142
142
143 div.options {
143 div.options {
144 clear: both;
144 clear: both;
145 overflow: hidden;
145 overflow: hidden;
146 position: absolute;
146 position: absolute;
147 background: #FFF;
147 background: #FFF;
148 margin: 7px 0 0 162px;
148 margin: 7px 0 0 162px;
149 padding: 0;
149 padding: 0;
150 }
150 }
151
151
152 div.options a {
152 div.options a {
153 height: 1%;
153 height: 1%;
154 display: block;
154 display: block;
155 text-decoration: none;
155 text-decoration: none;
156 margin: 0;
156 margin: 0;
157 padding: 3px 8px;
157 padding: 3px 8px;
158 }
158 }
159
159
160 .top-left-rounded-corner {
160 .top-left-rounded-corner {
161 -webkit-border-top-left-radius: 8px;
161 -webkit-border-top-left-radius: 8px;
162 -khtml-border-radius-topleft: 8px;
162 -khtml-border-radius-topleft: 8px;
163 border-top-left-radius: 8px;
163 border-top-left-radius: 8px;
164 }
164 }
165
165
166 .top-right-rounded-corner {
166 .top-right-rounded-corner {
167 -webkit-border-top-right-radius: 8px;
167 -webkit-border-top-right-radius: 8px;
168 -khtml-border-radius-topright: 8px;
168 -khtml-border-radius-topright: 8px;
169 border-top-right-radius: 8px;
169 border-top-right-radius: 8px;
170 }
170 }
171
171
172 .bottom-left-rounded-corner {
172 .bottom-left-rounded-corner {
173 -webkit-border-bottom-left-radius: 8px;
173 -webkit-border-bottom-left-radius: 8px;
174 -khtml-border-radius-bottomleft: 8px;
174 -khtml-border-radius-bottomleft: 8px;
175 border-bottom-left-radius: 8px;
175 border-bottom-left-radius: 8px;
176 }
176 }
177
177
178 .bottom-right-rounded-corner {
178 .bottom-right-rounded-corner {
179 -webkit-border-bottom-right-radius: 8px;
179 -webkit-border-bottom-right-radius: 8px;
180 -khtml-border-radius-bottomright: 8px;
180 -khtml-border-radius-bottomright: 8px;
181 border-bottom-right-radius: 8px;
181 border-bottom-right-radius: 8px;
182 }
182 }
183
183
184 .top-left-rounded-corner-mid {
184 .top-left-rounded-corner-mid {
185 -webkit-border-top-left-radius: 4px;
185 -webkit-border-top-left-radius: 4px;
186 -khtml-border-radius-topleft: 4px;
186 -khtml-border-radius-topleft: 4px;
187 border-top-left-radius: 4px;
187 border-top-left-radius: 4px;
188 }
188 }
189
189
190 .top-right-rounded-corner-mid {
190 .top-right-rounded-corner-mid {
191 -webkit-border-top-right-radius: 4px;
191 -webkit-border-top-right-radius: 4px;
192 -khtml-border-radius-topright: 4px;
192 -khtml-border-radius-topright: 4px;
193 border-top-right-radius: 4px;
193 border-top-right-radius: 4px;
194 }
194 }
195
195
196 .bottom-left-rounded-corner-mid {
196 .bottom-left-rounded-corner-mid {
197 -webkit-border-bottom-left-radius: 4px;
197 -webkit-border-bottom-left-radius: 4px;
198 -khtml-border-radius-bottomleft: 4px;
198 -khtml-border-radius-bottomleft: 4px;
199 border-bottom-left-radius: 4px;
199 border-bottom-left-radius: 4px;
200 }
200 }
201
201
202 .bottom-right-rounded-corner-mid {
202 .bottom-right-rounded-corner-mid {
203 -webkit-border-bottom-right-radius: 4px;
203 -webkit-border-bottom-right-radius: 4px;
204 -khtml-border-radius-bottomright: 4px;
204 -khtml-border-radius-bottomright: 4px;
205 border-bottom-right-radius: 4px;
205 border-bottom-right-radius: 4px;
206 }
206 }
207
207
208 .help-block {
208 .help-block {
209 color: #999999;
209 color: #999999;
210 display: block;
210 display: block;
211 margin-bottom: 0;
211 margin-bottom: 0;
212 margin-top: 5px;
212 margin-top: 5px;
213 }
213 }
214
214
215 .empty_data {
215 .empty_data {
216 color: #B9B9B9;
216 color: #B9B9B9;
217 }
217 }
218
218
219 a.permalink {
219 a.permalink {
220 visibility: hidden;
220 visibility: hidden;
221 position: absolute;
222 margin: 3px 4px;
221 }
223 }
222
224
223 a.permalink:hover {
225 a.permalink:hover {
224 text-decoration: none;
226 text-decoration: none;
225 }
227 }
226
228
227 h1:hover > a.permalink,
229 h1:hover > a.permalink,
228 h2:hover > a.permalink,
230 h2:hover > a.permalink,
229 h3:hover > a.permalink,
231 h3:hover > a.permalink,
230 h4:hover > a.permalink,
232 h4:hover > a.permalink,
231 h5:hover > a.permalink,
233 h5:hover > a.permalink,
232 h6:hover > a.permalink,
234 h6:hover > a.permalink,
233 div:hover > a.permalink {
235 div:hover > a.permalink {
234 visibility: visible;
236 visibility: visible;
235 }
237 }
236
238
237 #header {
239 #header {
238 }
240 }
239 #header ul#logged-user {
241 #header ul#logged-user {
240 margin-bottom: 5px !important;
242 margin-bottom: 5px !important;
241 -webkit-border-radius: 0px 0px 8px 8px;
243 -webkit-border-radius: 0px 0px 8px 8px;
242 -khtml-border-radius: 0px 0px 8px 8px;
244 -khtml-border-radius: 0px 0px 8px 8px;
243 border-radius: 0px 0px 8px 8px;
245 border-radius: 0px 0px 8px 8px;
244 height: 37px;
246 height: 37px;
245 background-color: #003B76;
247 background-color: #003B76;
246 background-repeat: repeat-x;
248 background-repeat: repeat-x;
247 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
249 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
248 background-image: -moz-linear-gradient(top, #003b76, #00376e);
250 background-image: -moz-linear-gradient(top, #003b76, #00376e);
249 background-image: -ms-linear-gradient(top, #003b76, #00376e);
251 background-image: -ms-linear-gradient(top, #003b76, #00376e);
250 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
252 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
251 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
253 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
252 background-image: -o-linear-gradient(top, #003b76, #00376e);
254 background-image: -o-linear-gradient(top, #003b76, #00376e);
253 background-image: linear-gradient(to bottom, #003b76, #00376e);
255 background-image: linear-gradient(to bottom, #003b76, #00376e);
254 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
256 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
255 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
257 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
256 }
258 }
257
259
258 #header ul#logged-user li {
260 #header ul#logged-user li {
259 list-style: none;
261 list-style: none;
260 float: left;
262 float: left;
261 margin: 8px 0 0;
263 margin: 8px 0 0;
262 padding: 4px 12px;
264 padding: 4px 12px;
263 border-left: 1px solid #316293;
265 border-left: 1px solid #316293;
264 }
266 }
265
267
266 #header ul#logged-user li.first {
268 #header ul#logged-user li.first {
267 border-left: none;
269 border-left: none;
268 margin: 4px;
270 margin: 4px;
269 }
271 }
270
272
271 #header ul#logged-user li.first div.gravatar {
273 #header ul#logged-user li.first div.gravatar {
272 margin-top: -2px;
274 margin-top: -2px;
273 }
275 }
274
276
275 #header ul#logged-user li.first div.account {
277 #header ul#logged-user li.first div.account {
276 padding-top: 4px;
278 padding-top: 4px;
277 float: left;
279 float: left;
278 }
280 }
279
281
280 #header ul#logged-user li.last {
282 #header ul#logged-user li.last {
281 border-right: none;
283 border-right: none;
282 }
284 }
283
285
284 #header ul#logged-user li a {
286 #header ul#logged-user li a {
285 color: #fff;
287 color: #fff;
286 font-weight: 700;
288 font-weight: 700;
287 text-decoration: none;
289 text-decoration: none;
288 }
290 }
289
291
290 #header ul#logged-user li a:hover {
292 #header ul#logged-user li a:hover {
291 text-decoration: underline;
293 text-decoration: underline;
292 }
294 }
293
295
294 #header ul#logged-user li.highlight a {
296 #header ul#logged-user li.highlight a {
295 color: #fff;
297 color: #fff;
296 }
298 }
297
299
298 #header ul#logged-user li.highlight a:hover {
300 #header ul#logged-user li.highlight a:hover {
299 color: #FFF;
301 color: #FFF;
300 }
302 }
301 #header-dd {
303 #header-dd {
302 clear: both;
304 clear: both;
303 position: fixed !important;
305 position: fixed !important;
304 background-color: #003B76;
306 background-color: #003B76;
305 opacity: 0.01;
307 opacity: 0.01;
306 cursor: pointer;
308 cursor: pointer;
307 min-height: 10px;
309 min-height: 10px;
308 width: 100% !important;
310 width: 100% !important;
309 -webkit-border-radius: 0px 0px 4px 4px;
311 -webkit-border-radius: 0px 0px 4px 4px;
310 -khtml-border-radius: 0px 0px 4px 4px;
312 -khtml-border-radius: 0px 0px 4px 4px;
311 border-radius: 0px 0px 4px 4px;
313 border-radius: 0px 0px 4px 4px;
312 }
314 }
313
315
314 #header-dd:hover {
316 #header-dd:hover {
315 opacity: 0.2;
317 opacity: 0.2;
316 -webkit-transition: opacity 0.5s ease-in-out;
318 -webkit-transition: opacity 0.5s ease-in-out;
317 -moz-transition: opacity 0.5s ease-in-out;
319 -moz-transition: opacity 0.5s ease-in-out;
318 transition: opacity 0.5s ease-in-out;
320 transition: opacity 0.5s ease-in-out;
319 }
321 }
320
322
321 #header #header-inner {
323 #header #header-inner {
322 min-height: 44px;
324 min-height: 44px;
323 clear: both;
325 clear: both;
324 position: relative;
326 position: relative;
325 background-color: #003B76;
327 background-color: #003B76;
326 background-repeat: repeat-x;
328 background-repeat: repeat-x;
327 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
329 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
328 background-image: -moz-linear-gradient(top, #003b76, #00376e);
330 background-image: -moz-linear-gradient(top, #003b76, #00376e);
329 background-image: -ms-linear-gradient(top, #003b76, #00376e);
331 background-image: -ms-linear-gradient(top, #003b76, #00376e);
330 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76),color-stop(100%, #00376e) );
332 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76),color-stop(100%, #00376e) );
331 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
333 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
332 background-image: -o-linear-gradient(top, #003b76, #00376e);
334 background-image: -o-linear-gradient(top, #003b76, #00376e);
333 background-image: linear-gradient(to bottom, #003b76, #00376e);
335 background-image: linear-gradient(to bottom, #003b76, #00376e);
334 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
336 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
335 margin: 0;
337 margin: 0;
336 padding: 0;
338 padding: 0;
337 display: block;
339 display: block;
338 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
340 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
339 -webkit-border-radius: 0px 0px 4px 4px;
341 -webkit-border-radius: 0px 0px 4px 4px;
340 -khtml-border-radius: 0px 0px 4px 4px;
342 -khtml-border-radius: 0px 0px 4px 4px;
341 border-radius: 0px 0px 4px 4px;
343 border-radius: 0px 0px 4px 4px;
342 }
344 }
343 #header #header-inner.hover {
345 #header #header-inner.hover {
344 width: 100% !important;
346 width: 100% !important;
345 -webkit-border-radius: 0px 0px 0px 0px;
347 -webkit-border-radius: 0px 0px 0px 0px;
346 -khtml-border-radius: 0px 0px 0px 0px;
348 -khtml-border-radius: 0px 0px 0px 0px;
347 border-radius: 0px 0px 0px 0px;
349 border-radius: 0px 0px 0px 0px;
348 position: fixed !important;
350 position: fixed !important;
349 z-index: 10000;
351 z-index: 10000;
350 }
352 }
351
353
352 .ie7 #header #header-inner.hover,
354 .ie7 #header #header-inner.hover,
353 .ie8 #header #header-inner.hover,
355 .ie8 #header #header-inner.hover,
354 .ie9 #header #header-inner.hover
356 .ie9 #header #header-inner.hover
355 {
357 {
356 z-index: auto !important;
358 z-index: auto !important;
357 }
359 }
358
360
359 .header-pos-fix, .anchor {
361 .header-pos-fix, .anchor {
360 margin-top: -46px;
362 margin-top: -46px;
361 padding-top: 46px;
363 padding-top: 46px;
362 }
364 }
363
365
364 #header #header-inner #home a {
366 #header #header-inner #home a {
365 height: 40px;
367 height: 40px;
366 width: 46px;
368 width: 46px;
367 display: block;
369 display: block;
368 background: url("../images/button_home.png");
370 background: url("../images/button_home.png");
369 background-position: 0 0;
371 background-position: 0 0;
370 margin: 0;
372 margin: 0;
371 padding: 0;
373 padding: 0;
372 }
374 }
373
375
374 #header #header-inner #home a:hover {
376 #header #header-inner #home a:hover {
375 background-position: 0 -40px;
377 background-position: 0 -40px;
376 }
378 }
377
379
378 #header #header-inner #logo {
380 #header #header-inner #logo {
379 float: left;
381 float: left;
380 position: absolute;
382 position: absolute;
381 }
383 }
382
384
383 #header #header-inner #logo h1 {
385 #header #header-inner #logo h1 {
384 color: #FFF;
386 color: #FFF;
385 font-size: 20px;
387 font-size: 20px;
386 margin: 12px 0 0 13px;
388 margin: 12px 0 0 13px;
387 padding: 0;
389 padding: 0;
388 }
390 }
389
391
390 #header #header-inner #logo a {
392 #header #header-inner #logo a {
391 color: #fff;
393 color: #fff;
392 text-decoration: none;
394 text-decoration: none;
393 }
395 }
394
396
395 #header #header-inner #logo a:hover {
397 #header #header-inner #logo a:hover {
396 color: #bfe3ff;
398 color: #bfe3ff;
397 }
399 }
398
400
399 #header #header-inner #quick {
401 #header #header-inner #quick {
400 position: relative;
402 position: relative;
401 float: right;
403 float: right;
402 list-style-type: none;
404 list-style-type: none;
403 list-style-position: outside;
405 list-style-position: outside;
404 margin: 4px 8px 0 0;
406 margin: 4px 8px 0 0;
405 padding: 0;
407 padding: 0;
406 border-radius: 4px;
408 border-radius: 4px;
407 }
409 }
408
410
409 #header #header-inner #quick li span.short {
411 #header #header-inner #quick li span.short {
410 padding: 9px 6px 8px 6px;
412 padding: 9px 6px 8px 6px;
411 }
413 }
412
414
413 #header #header-inner #quick li span {
415 #header #header-inner #quick li span {
414 display: inline;
416 display: inline;
415 margin: 0;
417 margin: 0;
416 }
418 }
417
419
418 #header #header-inner #quick li span.normal {
420 #header #header-inner #quick li span.normal {
419 border: none;
421 border: none;
420 padding: 10px 12px 8px;
422 padding: 10px 12px 8px;
421 }
423 }
422
424
423 #header #header-inner #quick li span.icon {
425 #header #header-inner #quick li span.icon {
424 border-left: none;
426 border-left: none;
425 padding-left: 10px;
427 padding-left: 10px;
426 }
428 }
427
429
428 #header #header-inner #quick li span.icon_short {
430 #header #header-inner #quick li span.icon_short {
429 top: 0;
431 top: 0;
430 left: 0;
432 left: 0;
431 border-left: none;
433 border-left: none;
432 border-right: 1px solid #2e5c89;
434 border-right: 1px solid #2e5c89;
433 padding: 8px 6px 4px;
435 padding: 8px 6px 4px;
434 }
436 }
435
437
436 #header #header-inner #quick li span.icon img, #header #header-inner #quick li span.icon_short img {
438 #header #header-inner #quick li span.icon img, #header #header-inner #quick li span.icon_short img {
437 vertical-align: middle;
439 vertical-align: middle;
438 margin-bottom: 2px;
440 margin-bottom: 2px;
439 }
441 }
440
442
441 #header #header-inner #quick ul.repo_switcher {
443 #header #header-inner #quick ul.repo_switcher {
442 max-height: 275px;
444 max-height: 275px;
443 overflow-x: hidden;
445 overflow-x: hidden;
444 overflow-y: auto;
446 overflow-y: auto;
445 }
447 }
446
448
447 #header #header-inner #quick ul.repo_switcher li.qfilter_rs {
449 #header #header-inner #quick ul.repo_switcher li.qfilter_rs {
448 padding: 2px 3px;
450 padding: 2px 3px;
449 padding-right: 17px;
451 padding-right: 17px;
450 }
452 }
451
453
452 #header #header-inner #quick ul.repo_switcher li.qfilter_rs input {
454 #header #header-inner #quick ul.repo_switcher li.qfilter_rs input {
453 width: 100%;
455 width: 100%;
454 border-radius: 10px;
456 border-radius: 10px;
455 padding: 2px 7px;
457 padding: 2px 7px;
456 }
458 }
457
459
458 #header #header-inner #quick .repo_switcher_type {
460 #header #header-inner #quick .repo_switcher_type {
459 position: absolute;
461 position: absolute;
460 left: 0;
462 left: 0;
461 top: 9px;
463 top: 9px;
462 margin: 0px 2px 0px 2px;
464 margin: 0px 2px 0px 2px;
463 }
465 }
464
466
465 #header #header-inner #quick li ul li a.journal, #header #header-inner #quick li ul li a.journal:hover {
467 #header #header-inner #quick li ul li a.journal, #header #header-inner #quick li ul li a.journal:hover {
466 background-image: url("../images/icons/book.png");
468 background-image: url("../images/icons/book.png");
467 }
469 }
468
470
469 #header #header-inner #quick li ul li a.private_repo, #header #header-inner #quick li ul li a.private_repo:hover {
471 #header #header-inner #quick li ul li a.private_repo, #header #header-inner #quick li ul li a.private_repo:hover {
470 background-image: url("../images/icons/lock.png")
472 background-image: url("../images/icons/lock.png")
471 }
473 }
472
474
473 #header #header-inner #quick li ul li a.public_repo, #header #header-inner #quick li ul li a.public_repo:hover {
475 #header #header-inner #quick li ul li a.public_repo, #header #header-inner #quick li ul li a.public_repo:hover {
474 background-image: url("../images/icons/lock_open.png");
476 background-image: url("../images/icons/lock_open.png");
475 }
477 }
476
478
477 #header #header-inner #quick li ul li a.hg, #header #header-inner #quick li ul li a.hg:hover {
479 #header #header-inner #quick li ul li a.hg, #header #header-inner #quick li ul li a.hg:hover {
478 background-image: url("../images/icons/hgicon.png");
480 background-image: url("../images/icons/hgicon.png");
479 padding-left: 42px;
481 padding-left: 42px;
480 background-position: 20px 9px;
482 background-position: 20px 9px;
481 }
483 }
482
484
483 #header #header-inner #quick li ul li a.git, #header #header-inner #quick li ul li a.git:hover {
485 #header #header-inner #quick li ul li a.git, #header #header-inner #quick li ul li a.git:hover {
484 background-image: url("../images/icons/giticon.png");
486 background-image: url("../images/icons/giticon.png");
485 padding-left: 42px;
487 padding-left: 42px;
486 background-position: 20px 9px;
488 background-position: 20px 9px;
487 }
489 }
488
490
489 #header #header-inner #quick li ul li a.repos, #header #header-inner #quick li ul li a.repos:hover {
491 #header #header-inner #quick li ul li a.repos, #header #header-inner #quick li ul li a.repos:hover {
490 background-image: url("../images/icons/database_edit.png");
492 background-image: url("../images/icons/database_edit.png");
491 }
493 }
492
494
493 #header #header-inner #quick li ul li a.repos_groups, #header #header-inner #quick li ul li a.repos_groups:hover {
495 #header #header-inner #quick li ul li a.repos_groups, #header #header-inner #quick li ul li a.repos_groups:hover {
494 background-image: url("../images/icons/database_link.png");
496 background-image: url("../images/icons/database_link.png");
495 }
497 }
496
498
497 #header #header-inner #quick li ul li a.users, #header #header-inner #quick li ul li a.users:hover {
499 #header #header-inner #quick li ul li a.users, #header #header-inner #quick li ul li a.users:hover {
498 background-image: url("../images/icons/user_edit.png");
500 background-image: url("../images/icons/user_edit.png");
499 }
501 }
500
502
501 #header #header-inner #quick li ul li a.groups, #header #header-inner #quick li ul li a.groups:hover {
503 #header #header-inner #quick li ul li a.groups, #header #header-inner #quick li ul li a.groups:hover {
502 background-image: url("../images/icons/group_edit.png");
504 background-image: url("../images/icons/group_edit.png");
503 }
505 }
504
506
505 #header #header-inner #quick li ul li a.defaults, #header #header-inner #quick li ul li a.defaults:hover {
507 #header #header-inner #quick li ul li a.defaults, #header #header-inner #quick li ul li a.defaults:hover {
506 background-image: url("../images/icons/wrench.png");
508 background-image: url("../images/icons/wrench.png");
507 }
509 }
508
510
509 #header #header-inner #quick li ul li a.settings, #header #header-inner #quick li ul li a.settings:hover {
511 #header #header-inner #quick li ul li a.settings, #header #header-inner #quick li ul li a.settings:hover {
510 background-image: url("../images/icons/cog.png");
512 background-image: url("../images/icons/cog.png");
511 }
513 }
512
514
513 #header #header-inner #quick li ul li a.permissions, #header #header-inner #quick li ul li a.permissions:hover {
515 #header #header-inner #quick li ul li a.permissions, #header #header-inner #quick li ul li a.permissions:hover {
514 background-image: url("../images/icons/key.png");
516 background-image: url("../images/icons/key.png");
515 }
517 }
516
518
517 #header #header-inner #quick li ul li a.ldap, #header #header-inner #quick li ul li a.ldap:hover {
519 #header #header-inner #quick li ul li a.ldap, #header #header-inner #quick li ul li a.ldap:hover {
518 background-image: url("../images/icons/server_key.png");
520 background-image: url("../images/icons/server_key.png");
519 }
521 }
520
522
521 #header #header-inner #quick li ul li a.fork, #header #header-inner #quick li ul li a.fork:hover {
523 #header #header-inner #quick li ul li a.fork, #header #header-inner #quick li ul li a.fork:hover {
522 background-image: url("../images/icons/arrow_divide.png");
524 background-image: url("../images/icons/arrow_divide.png");
523 }
525 }
524
526
525 #header #header-inner #quick li ul li a.locking_add, #header #header-inner #quick li ul li a.locking_add:hover {
527 #header #header-inner #quick li ul li a.locking_add, #header #header-inner #quick li ul li a.locking_add:hover {
526 background-image: url("../images/icons/lock_add.png");
528 background-image: url("../images/icons/lock_add.png");
527 }
529 }
528
530
529 #header #header-inner #quick li ul li a.locking_del, #header #header-inner #quick li ul li a.locking_del:hover {
531 #header #header-inner #quick li ul li a.locking_del, #header #header-inner #quick li ul li a.locking_del:hover {
530 background-image: url("../images/icons/lock_delete.png");
532 background-image: url("../images/icons/lock_delete.png");
531 }
533 }
532
534
533 #header #header-inner #quick li ul li a.pull_request, #header #header-inner #quick li ul li a.pull_request:hover {
535 #header #header-inner #quick li ul li a.pull_request, #header #header-inner #quick li ul li a.pull_request:hover {
534 background-image: url("../images/icons/arrow_join.png") ;
536 background-image: url("../images/icons/arrow_join.png") ;
535 }
537 }
536
538
537 #header #header-inner #quick li ul li a.compare_request, #header #header-inner #quick li ul li a.compare_request:hover {
539 #header #header-inner #quick li ul li a.compare_request, #header #header-inner #quick li ul li a.compare_request:hover {
538 background-image: url("../images/icons/arrow_inout.png");
540 background-image: url("../images/icons/arrow_inout.png");
539 }
541 }
540
542
541 #header #header-inner #quick li ul li a.search, #header #header-inner #quick li ul li a.search:hover {
543 #header #header-inner #quick li ul li a.search, #header #header-inner #quick li ul li a.search:hover {
542 background-image: url("../images/icons/search_16.png");
544 background-image: url("../images/icons/search_16.png");
543 }
545 }
544
546
545 #header #header-inner #quick li ul li a.shortlog, #header #header-inner #quick li ul li a.shortlog:hover {
547 #header #header-inner #quick li ul li a.shortlog, #header #header-inner #quick li ul li a.shortlog:hover {
546 background-image: url("../images/icons/clock_16.png");
548 background-image: url("../images/icons/clock_16.png");
547 }
549 }
548
550
549 #header #header-inner #quick li ul li a.delete, #header #header-inner #quick li ul li a.delete:hover {
551 #header #header-inner #quick li ul li a.delete, #header #header-inner #quick li ul li a.delete:hover {
550 background-image: url("../images/icons/delete.png");
552 background-image: url("../images/icons/delete.png");
551 }
553 }
552
554
553 #header #header-inner #quick li ul li a.branches, #header #header-inner #quick li ul li a.branches:hover {
555 #header #header-inner #quick li ul li a.branches, #header #header-inner #quick li ul li a.branches:hover {
554 background-image: url("../images/icons/arrow_branch.png");
556 background-image: url("../images/icons/arrow_branch.png");
555 }
557 }
556
558
557 #header #header-inner #quick li ul li a.tags,
559 #header #header-inner #quick li ul li a.tags,
558 #header #header-inner #quick li ul li a.tags:hover {
560 #header #header-inner #quick li ul li a.tags:hover {
559 background: #FFF url("../images/icons/tag_blue.png") no-repeat 4px 9px;
561 background: #FFF url("../images/icons/tag_blue.png") no-repeat 4px 9px;
560 width: 167px;
562 width: 167px;
561 margin: 0;
563 margin: 0;
562 padding: 12px 9px 7px 24px;
564 padding: 12px 9px 7px 24px;
563 }
565 }
564
566
565 #header #header-inner #quick li ul li a.bookmarks,
567 #header #header-inner #quick li ul li a.bookmarks,
566 #header #header-inner #quick li ul li a.bookmarks:hover {
568 #header #header-inner #quick li ul li a.bookmarks:hover {
567 background: #FFF url("../images/icons/tag_green.png") no-repeat 4px 9px;
569 background: #FFF url("../images/icons/tag_green.png") no-repeat 4px 9px;
568 width: 167px;
570 width: 167px;
569 margin: 0;
571 margin: 0;
570 padding: 12px 9px 7px 24px;
572 padding: 12px 9px 7px 24px;
571 }
573 }
572
574
573 #header #header-inner #quick li ul li a.admin,
575 #header #header-inner #quick li ul li a.admin,
574 #header #header-inner #quick li ul li a.admin:hover {
576 #header #header-inner #quick li ul li a.admin:hover {
575 background: #FFF url("../images/icons/cog_edit.png") no-repeat 4px 9px;
577 background: #FFF url("../images/icons/cog_edit.png") no-repeat 4px 9px;
576 width: 167px;
578 width: 167px;
577 margin: 0;
579 margin: 0;
578 padding: 12px 9px 7px 24px;
580 padding: 12px 9px 7px 24px;
579 }
581 }
580
582
581 .groups_breadcrumbs a {
583 .groups_breadcrumbs a {
582 color: #fff;
584 color: #fff;
583 }
585 }
584
586
585 .groups_breadcrumbs a:hover {
587 .groups_breadcrumbs a:hover {
586 color: #bfe3ff;
588 color: #bfe3ff;
587 text-decoration: none;
589 text-decoration: none;
588 }
590 }
589
591
590 td.quick_repo_menu {
592 td.quick_repo_menu {
591 background: #FFF url("../images/vertical-indicator.png") 8px 50% no-repeat !important;
593 background: #FFF url("../images/vertical-indicator.png") 8px 50% no-repeat !important;
592 cursor: pointer;
594 cursor: pointer;
593 width: 8px;
595 width: 8px;
594 border: 1px solid transparent;
596 border: 1px solid transparent;
595 }
597 }
596
598
597 td.quick_repo_menu.active {
599 td.quick_repo_menu.active {
598 background: url("../images/dt-arrow-dn.png") no-repeat scroll 5px 50% #FFFFFF !important;
600 background: url("../images/dt-arrow-dn.png") no-repeat scroll 5px 50% #FFFFFF !important;
599 border: 1px solid #003367;
601 border: 1px solid #003367;
600 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
602 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
601 cursor: pointer;
603 cursor: pointer;
602 }
604 }
603
605
604 td.quick_repo_menu .menu_items {
606 td.quick_repo_menu .menu_items {
605 margin-top: 10px;
607 margin-top: 10px;
606 margin-left: -6px;
608 margin-left: -6px;
607 width: 150px;
609 width: 150px;
608 position: absolute;
610 position: absolute;
609 background-color: #FFF;
611 background-color: #FFF;
610 background: none repeat scroll 0 0 #FFFFFF;
612 background: none repeat scroll 0 0 #FFFFFF;
611 border-color: #003367 #666666 #666666;
613 border-color: #003367 #666666 #666666;
612 border-right: 1px solid #666666;
614 border-right: 1px solid #666666;
613 border-style: solid;
615 border-style: solid;
614 border-width: 1px;
616 border-width: 1px;
615 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
617 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
616 border-top-style: none;
618 border-top-style: none;
617 }
619 }
618
620
619 td.quick_repo_menu .menu_items li {
621 td.quick_repo_menu .menu_items li {
620 padding: 0 !important;
622 padding: 0 !important;
621 }
623 }
622
624
623 td.quick_repo_menu .menu_items a {
625 td.quick_repo_menu .menu_items a {
624 display: block;
626 display: block;
625 padding: 4px 12px 4px 8px;
627 padding: 4px 12px 4px 8px;
626 }
628 }
627
629
628 td.quick_repo_menu .menu_items a:hover {
630 td.quick_repo_menu .menu_items a:hover {
629 background-color: #EEE;
631 background-color: #EEE;
630 text-decoration: none;
632 text-decoration: none;
631 }
633 }
632
634
633 td.quick_repo_menu .menu_items .icon img {
635 td.quick_repo_menu .menu_items .icon img {
634 margin-bottom: -2px;
636 margin-bottom: -2px;
635 }
637 }
636
638
637 td.quick_repo_menu .menu_items.hidden {
639 td.quick_repo_menu .menu_items.hidden {
638 display: none;
640 display: none;
639 }
641 }
640
642
641 .yui-dt-first th {
643 .yui-dt-first th {
642 text-align: left;
644 text-align: left;
643 }
645 }
644
646
645 /*
647 /*
646 Copyright (c) 2011, Yahoo! Inc. All rights reserved.
648 Copyright (c) 2011, Yahoo! Inc. All rights reserved.
647 Code licensed under the BSD License:
649 Code licensed under the BSD License:
648 http://developer.yahoo.com/yui/license.html
650 http://developer.yahoo.com/yui/license.html
649 version: 2.9.0
651 version: 2.9.0
650 */
652 */
651 .yui-skin-sam .yui-dt-mask {
653 .yui-skin-sam .yui-dt-mask {
652 position: absolute;
654 position: absolute;
653 z-index: 9500;
655 z-index: 9500;
654 }
656 }
655 .yui-dt-tmp {
657 .yui-dt-tmp {
656 position: absolute;
658 position: absolute;
657 left: -9000px;
659 left: -9000px;
658 }
660 }
659 .yui-dt-scrollable .yui-dt-bd { overflow: auto }
661 .yui-dt-scrollable .yui-dt-bd { overflow: auto }
660 .yui-dt-scrollable .yui-dt-hd {
662 .yui-dt-scrollable .yui-dt-hd {
661 overflow: hidden;
663 overflow: hidden;
662 position: relative;
664 position: relative;
663 }
665 }
664 .yui-dt-scrollable .yui-dt-bd thead tr,
666 .yui-dt-scrollable .yui-dt-bd thead tr,
665 .yui-dt-scrollable .yui-dt-bd thead th {
667 .yui-dt-scrollable .yui-dt-bd thead th {
666 position: absolute;
668 position: absolute;
667 left: -1500px;
669 left: -1500px;
668 }
670 }
669 .yui-dt-scrollable tbody { -moz-outline: 0 }
671 .yui-dt-scrollable tbody { -moz-outline: 0 }
670 .yui-skin-sam thead .yui-dt-sortable { cursor: pointer }
672 .yui-skin-sam thead .yui-dt-sortable { cursor: pointer }
671 .yui-skin-sam thead .yui-dt-draggable { cursor: move }
673 .yui-skin-sam thead .yui-dt-draggable { cursor: move }
672 .yui-dt-coltarget {
674 .yui-dt-coltarget {
673 position: absolute;
675 position: absolute;
674 z-index: 999;
676 z-index: 999;
675 }
677 }
676 .yui-dt-hd { zoom: 1 }
678 .yui-dt-hd { zoom: 1 }
677 th.yui-dt-resizeable .yui-dt-resizerliner { position: relative }
679 th.yui-dt-resizeable .yui-dt-resizerliner { position: relative }
678 .yui-dt-resizer {
680 .yui-dt-resizer {
679 position: absolute;
681 position: absolute;
680 right: 0;
682 right: 0;
681 bottom: 0;
683 bottom: 0;
682 height: 100%;
684 height: 100%;
683 cursor: e-resize;
685 cursor: e-resize;
684 cursor: col-resize;
686 cursor: col-resize;
685 background-color: #CCC;
687 background-color: #CCC;
686 opacity: 0;
688 opacity: 0;
687 filter: alpha(opacity=0);
689 filter: alpha(opacity=0);
688 }
690 }
689 .yui-dt-resizerproxy {
691 .yui-dt-resizerproxy {
690 visibility: hidden;
692 visibility: hidden;
691 position: absolute;
693 position: absolute;
692 z-index: 9000;
694 z-index: 9000;
693 background-color: #CCC;
695 background-color: #CCC;
694 opacity: 0;
696 opacity: 0;
695 filter: alpha(opacity=0);
697 filter: alpha(opacity=0);
696 }
698 }
697 th.yui-dt-hidden .yui-dt-liner,
699 th.yui-dt-hidden .yui-dt-liner,
698 td.yui-dt-hidden .yui-dt-liner,
700 td.yui-dt-hidden .yui-dt-liner,
699 th.yui-dt-hidden .yui-dt-resizer { display: none }
701 th.yui-dt-hidden .yui-dt-resizer { display: none }
700 .yui-dt-editor,
702 .yui-dt-editor,
701 .yui-dt-editor-shim {
703 .yui-dt-editor-shim {
702 position: absolute;
704 position: absolute;
703 z-index: 9000;
705 z-index: 9000;
704 }
706 }
705 .yui-skin-sam .yui-dt table {
707 .yui-skin-sam .yui-dt table {
706 margin: 0;
708 margin: 0;
707 padding: 0;
709 padding: 0;
708 font-family: arial;
710 font-family: arial;
709 font-size: inherit;
711 font-size: inherit;
710 border-collapse: separate;
712 border-collapse: separate;
711 *border-collapse: collapse;
713 *border-collapse: collapse;
712 border-spacing: 0;
714 border-spacing: 0;
713 border: 1px solid #7f7f7f;
715 border: 1px solid #7f7f7f;
714 }
716 }
715 .yui-skin-sam .yui-dt thead { border-spacing: 0 }
717 .yui-skin-sam .yui-dt thead { border-spacing: 0 }
716 .yui-skin-sam .yui-dt caption {
718 .yui-skin-sam .yui-dt caption {
717 color: #000;
719 color: #000;
718 font-size: 85%;
720 font-size: 85%;
719 font-weight: normal;
721 font-weight: normal;
720 font-style: italic;
722 font-style: italic;
721 line-height: 1;
723 line-height: 1;
722 padding: 1em 0;
724 padding: 1em 0;
723 text-align: center;
725 text-align: center;
724 }
726 }
725 .yui-skin-sam .yui-dt th { background: #d8d8da url(../images/sprite.png) repeat-x 0 0 }
727 .yui-skin-sam .yui-dt th { background: #d8d8da url(../images/sprite.png) repeat-x 0 0 }
726 .yui-skin-sam .yui-dt th,
728 .yui-skin-sam .yui-dt th,
727 .yui-skin-sam .yui-dt th a {
729 .yui-skin-sam .yui-dt th a {
728 font-weight: normal;
730 font-weight: normal;
729 text-decoration: none;
731 text-decoration: none;
730 color: #000;
732 color: #000;
731 vertical-align: bottom;
733 vertical-align: bottom;
732 }
734 }
733 .yui-skin-sam .yui-dt th {
735 .yui-skin-sam .yui-dt th {
734 margin: 0;
736 margin: 0;
735 padding: 0;
737 padding: 0;
736 border: 0;
738 border: 0;
737 border-right: 1px solid #cbcbcb;
739 border-right: 1px solid #cbcbcb;
738 }
740 }
739 .yui-skin-sam .yui-dt tr.yui-dt-first td { border-top: 1px solid #7f7f7f }
741 .yui-skin-sam .yui-dt tr.yui-dt-first td { border-top: 1px solid #7f7f7f }
740 .yui-skin-sam .yui-dt th .yui-dt-liner { white-space: nowrap }
742 .yui-skin-sam .yui-dt th .yui-dt-liner { white-space: nowrap }
741 .yui-skin-sam .yui-dt-liner {
743 .yui-skin-sam .yui-dt-liner {
742 margin: 0;
744 margin: 0;
743 padding: 0;
745 padding: 0;
744 }
746 }
745 .yui-skin-sam .yui-dt-coltarget {
747 .yui-skin-sam .yui-dt-coltarget {
746 width: 5px;
748 width: 5px;
747 background-color: red;
749 background-color: red;
748 }
750 }
749 .yui-skin-sam .yui-dt td {
751 .yui-skin-sam .yui-dt td {
750 margin: 0;
752 margin: 0;
751 padding: 0;
753 padding: 0;
752 border: 0;
754 border: 0;
753 border-right: 1px solid #cbcbcb;
755 border-right: 1px solid #cbcbcb;
754 text-align: left;
756 text-align: left;
755 }
757 }
756 .yui-skin-sam .yui-dt-list td { border-right: 0 }
758 .yui-skin-sam .yui-dt-list td { border-right: 0 }
757 .yui-skin-sam .yui-dt-resizer { width: 6px }
759 .yui-skin-sam .yui-dt-resizer { width: 6px }
758 .yui-skin-sam .yui-dt-mask {
760 .yui-skin-sam .yui-dt-mask {
759 background-color: #000;
761 background-color: #000;
760 opacity: .25;
762 opacity: .25;
761 filter: alpha(opacity=25);
763 filter: alpha(opacity=25);
762 }
764 }
763 .yui-skin-sam .yui-dt-message { background-color: #FFF }
765 .yui-skin-sam .yui-dt-message { background-color: #FFF }
764 .yui-skin-sam .yui-dt-scrollable table { border: 0 }
766 .yui-skin-sam .yui-dt-scrollable table { border: 0 }
765 .yui-skin-sam .yui-dt-scrollable .yui-dt-hd {
767 .yui-skin-sam .yui-dt-scrollable .yui-dt-hd {
766 border-left: 1px solid #7f7f7f;
768 border-left: 1px solid #7f7f7f;
767 border-top: 1px solid #7f7f7f;
769 border-top: 1px solid #7f7f7f;
768 border-right: 1px solid #7f7f7f;
770 border-right: 1px solid #7f7f7f;
769 }
771 }
770 .yui-skin-sam .yui-dt-scrollable .yui-dt-bd {
772 .yui-skin-sam .yui-dt-scrollable .yui-dt-bd {
771 border-left: 1px solid #7f7f7f;
773 border-left: 1px solid #7f7f7f;
772 border-bottom: 1px solid #7f7f7f;
774 border-bottom: 1px solid #7f7f7f;
773 border-right: 1px solid #7f7f7f;
775 border-right: 1px solid #7f7f7f;
774 background-color: #FFF;
776 background-color: #FFF;
775 }
777 }
776 .yui-skin-sam .yui-dt-scrollable .yui-dt-data tr.yui-dt-last td { border-bottom: 1px solid #7f7f7f }
778 .yui-skin-sam .yui-dt-scrollable .yui-dt-data tr.yui-dt-last td { border-bottom: 1px solid #7f7f7f }
777 .yui-skin-sam th.yui-dt-asc,
779 .yui-skin-sam th.yui-dt-asc,
778 .yui-skin-sam th.yui-dt-desc { background: url(../images/sprite.png) repeat-x 0 -100px }
780 .yui-skin-sam th.yui-dt-desc { background: url(../images/sprite.png) repeat-x 0 -100px }
779 .yui-skin-sam th.yui-dt-sortable .yui-dt-label { margin-right: 10px }
781 .yui-skin-sam th.yui-dt-sortable .yui-dt-label { margin-right: 10px }
780 .yui-skin-sam th.yui-dt-asc .yui-dt-liner { background: url(../images/dt-arrow-up.png) no-repeat right }
782 .yui-skin-sam th.yui-dt-asc .yui-dt-liner { background: url(../images/dt-arrow-up.png) no-repeat right }
781 .yui-skin-sam th.yui-dt-desc .yui-dt-liner { background: url(../images/dt-arrow-dn.png) no-repeat right }
783 .yui-skin-sam th.yui-dt-desc .yui-dt-liner { background: url(../images/dt-arrow-dn.png) no-repeat right }
782 tbody .yui-dt-editable { cursor: pointer }
784 tbody .yui-dt-editable { cursor: pointer }
783 .yui-dt-editor {
785 .yui-dt-editor {
784 text-align: left;
786 text-align: left;
785 background-color: #f2f2f2;
787 background-color: #f2f2f2;
786 border: 1px solid #808080;
788 border: 1px solid #808080;
787 padding: 6px;
789 padding: 6px;
788 }
790 }
789 .yui-dt-editor label {
791 .yui-dt-editor label {
790 padding-left: 4px;
792 padding-left: 4px;
791 padding-right: 6px;
793 padding-right: 6px;
792 }
794 }
793 .yui-dt-editor .yui-dt-button {
795 .yui-dt-editor .yui-dt-button {
794 padding-top: 6px;
796 padding-top: 6px;
795 text-align: right;
797 text-align: right;
796 }
798 }
797 .yui-dt-editor .yui-dt-button button {
799 .yui-dt-editor .yui-dt-button button {
798 background: url(../images/sprite.png) repeat-x 0 0;
800 background: url(../images/sprite.png) repeat-x 0 0;
799 border: 1px solid #999;
801 border: 1px solid #999;
800 width: 4em;
802 width: 4em;
801 height: 1.8em;
803 height: 1.8em;
802 margin-left: 6px;
804 margin-left: 6px;
803 }
805 }
804 .yui-dt-editor .yui-dt-button button.yui-dt-default {
806 .yui-dt-editor .yui-dt-button button.yui-dt-default {
805 background: url(../images/sprite.png) repeat-x 0 -1400px;
807 background: url(../images/sprite.png) repeat-x 0 -1400px;
806 background-color: #5584e0;
808 background-color: #5584e0;
807 border: 1px solid #304369;
809 border: 1px solid #304369;
808 color: #FFF;
810 color: #FFF;
809 }
811 }
810 .yui-dt-editor .yui-dt-button button:hover {
812 .yui-dt-editor .yui-dt-button button:hover {
811 background: url(../images/sprite.png) repeat-x 0 -1300px;
813 background: url(../images/sprite.png) repeat-x 0 -1300px;
812 color: #000;
814 color: #000;
813 }
815 }
814 .yui-dt-editor .yui-dt-button button:active {
816 .yui-dt-editor .yui-dt-button button:active {
815 background: url(../images/sprite.png) repeat-x 0 -1700px;
817 background: url(../images/sprite.png) repeat-x 0 -1700px;
816 color: #000;
818 color: #000;
817 }
819 }
818 .yui-skin-sam tr.yui-dt-even { background-color: #FFF }
820 .yui-skin-sam tr.yui-dt-even { background-color: #FFF }
819 .yui-skin-sam tr.yui-dt-odd { background-color: #edf5ff }
821 .yui-skin-sam tr.yui-dt-odd { background-color: #edf5ff }
820 .yui-skin-sam tr.yui-dt-even td.yui-dt-asc,
822 .yui-skin-sam tr.yui-dt-even td.yui-dt-asc,
821 .yui-skin-sam tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
823 .yui-skin-sam tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
822 .yui-skin-sam tr.yui-dt-odd td.yui-dt-asc,
824 .yui-skin-sam tr.yui-dt-odd td.yui-dt-asc,
823 .yui-skin-sam tr.yui-dt-odd td.yui-dt-desc { background-color: #dbeaff }
825 .yui-skin-sam tr.yui-dt-odd td.yui-dt-desc { background-color: #dbeaff }
824 .yui-skin-sam .yui-dt-list tr.yui-dt-even { background-color: #FFF }
826 .yui-skin-sam .yui-dt-list tr.yui-dt-even { background-color: #FFF }
825 .yui-skin-sam .yui-dt-list tr.yui-dt-odd { background-color: #FFF }
827 .yui-skin-sam .yui-dt-list tr.yui-dt-odd { background-color: #FFF }
826 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-asc,
828 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-asc,
827 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
829 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
828 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-asc,
830 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-asc,
829 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-desc { background-color: #edf5ff }
831 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-desc { background-color: #edf5ff }
830 .yui-skin-sam th.yui-dt-highlighted,
832 .yui-skin-sam th.yui-dt-highlighted,
831 .yui-skin-sam th.yui-dt-highlighted a { background-color: #b2d2ff }
833 .yui-skin-sam th.yui-dt-highlighted a { background-color: #b2d2ff }
832 .yui-skin-sam tr.yui-dt-highlighted,
834 .yui-skin-sam tr.yui-dt-highlighted,
833 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc,
835 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc,
834 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc,
836 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc,
835 .yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted,
837 .yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted,
836 .yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted {
838 .yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted {
837 cursor: pointer;
839 cursor: pointer;
838 background-color: #b2d2ff;
840 background-color: #b2d2ff;
839 }
841 }
840 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted,
842 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted,
841 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted a { background-color: #b2d2ff }
843 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted a { background-color: #b2d2ff }
842 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted,
844 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted,
843 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-asc,
845 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-asc,
844 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc,
846 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc,
845 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-highlighted,
847 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-highlighted,
846 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-highlighted {
848 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-highlighted {
847 cursor: pointer;
849 cursor: pointer;
848 background-color: #b2d2ff;
850 background-color: #b2d2ff;
849 }
851 }
850 .yui-skin-sam th.yui-dt-selected,
852 .yui-skin-sam th.yui-dt-selected,
851 .yui-skin-sam th.yui-dt-selected a { background-color: #446cd7 }
853 .yui-skin-sam th.yui-dt-selected a { background-color: #446cd7 }
852 .yui-skin-sam tr.yui-dt-selected td,
854 .yui-skin-sam tr.yui-dt-selected td,
853 .yui-skin-sam tr.yui-dt-selected td.yui-dt-asc,
855 .yui-skin-sam tr.yui-dt-selected td.yui-dt-asc,
854 .yui-skin-sam tr.yui-dt-selected td.yui-dt-desc {
856 .yui-skin-sam tr.yui-dt-selected td.yui-dt-desc {
855 background-color: #426fd9;
857 background-color: #426fd9;
856 color: #FFF;
858 color: #FFF;
857 }
859 }
858 .yui-skin-sam tr.yui-dt-even td.yui-dt-selected,
860 .yui-skin-sam tr.yui-dt-even td.yui-dt-selected,
859 .yui-skin-sam tr.yui-dt-odd td.yui-dt-selected {
861 .yui-skin-sam tr.yui-dt-odd td.yui-dt-selected {
860 background-color: #446cd7;
862 background-color: #446cd7;
861 color: #FFF;
863 color: #FFF;
862 }
864 }
863 .yui-skin-sam .yui-dt-list th.yui-dt-selected,
865 .yui-skin-sam .yui-dt-list th.yui-dt-selected,
864 .yui-skin-sam .yui-dt-list th.yui-dt-selected a { background-color: #446cd7 }
866 .yui-skin-sam .yui-dt-list th.yui-dt-selected a { background-color: #446cd7 }
865 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td,
867 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td,
866 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-asc,
868 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-asc,
867 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-desc {
869 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-desc {
868 background-color: #426fd9;
870 background-color: #426fd9;
869 color: #FFF;
871 color: #FFF;
870 }
872 }
871 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-selected,
873 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-selected,
872 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-selected {
874 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-selected {
873 background-color: #446cd7;
875 background-color: #446cd7;
874 color: #FFF;
876 color: #FFF;
875 }
877 }
876 .yui-skin-sam .yui-dt-paginator {
878 .yui-skin-sam .yui-dt-paginator {
877 display: block;
879 display: block;
878 margin: 6px 0;
880 margin: 6px 0;
879 white-space: nowrap;
881 white-space: nowrap;
880 }
882 }
881 .yui-skin-sam .yui-dt-paginator .yui-dt-first,
883 .yui-skin-sam .yui-dt-paginator .yui-dt-first,
882 .yui-skin-sam .yui-dt-paginator .yui-dt-last,
884 .yui-skin-sam .yui-dt-paginator .yui-dt-last,
883 .yui-skin-sam .yui-dt-paginator .yui-dt-selected { padding: 2px 6px }
885 .yui-skin-sam .yui-dt-paginator .yui-dt-selected { padding: 2px 6px }
884 .yui-skin-sam .yui-dt-paginator a.yui-dt-first,
886 .yui-skin-sam .yui-dt-paginator a.yui-dt-first,
885 .yui-skin-sam .yui-dt-paginator a.yui-dt-last { text-decoration: none }
887 .yui-skin-sam .yui-dt-paginator a.yui-dt-last { text-decoration: none }
886 .yui-skin-sam .yui-dt-paginator .yui-dt-previous,
888 .yui-skin-sam .yui-dt-paginator .yui-dt-previous,
887 .yui-skin-sam .yui-dt-paginator .yui-dt-next { display: none }
889 .yui-skin-sam .yui-dt-paginator .yui-dt-next { display: none }
888 .yui-skin-sam a.yui-dt-page {
890 .yui-skin-sam a.yui-dt-page {
889 border: 1px solid #cbcbcb;
891 border: 1px solid #cbcbcb;
890 padding: 2px 6px;
892 padding: 2px 6px;
891 text-decoration: none;
893 text-decoration: none;
892 background-color: #fff;
894 background-color: #fff;
893 }
895 }
894 .yui-skin-sam .yui-dt-selected {
896 .yui-skin-sam .yui-dt-selected {
895 border: 1px solid #fff;
897 border: 1px solid #fff;
896 background-color: #fff;
898 background-color: #fff;
897 }
899 }
898
900
899 #content #left {
901 #content #left {
900 left: 0;
902 left: 0;
901 width: 280px;
903 width: 280px;
902 position: absolute;
904 position: absolute;
903 }
905 }
904
906
905 #content #right {
907 #content #right {
906 margin: 0 60px 10px 290px;
908 margin: 0 60px 10px 290px;
907 }
909 }
908
910
909 #content div.box {
911 #content div.box {
910 clear: both;
912 clear: both;
911 background: #fff;
913 background: #fff;
912 margin: 0 0 10px;
914 margin: 0 0 10px;
913 padding: 0 0 10px;
915 padding: 0 0 10px;
914 -webkit-border-radius: 4px 4px 4px 4px;
916 -webkit-border-radius: 4px 4px 4px 4px;
915 -khtml-border-radius: 4px 4px 4px 4px;
917 -khtml-border-radius: 4px 4px 4px 4px;
916 border-radius: 4px 4px 4px 4px;
918 border-radius: 4px 4px 4px 4px;
917 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
919 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
918 }
920 }
919
921
920 #content div.box-left {
922 #content div.box-left {
921 width: 49%;
923 width: 49%;
922 clear: none;
924 clear: none;
923 float: left;
925 float: left;
924 margin: 0 0 10px;
926 margin: 0 0 10px;
925 }
927 }
926
928
927 #content div.box-right {
929 #content div.box-right {
928 width: 49%;
930 width: 49%;
929 clear: none;
931 clear: none;
930 float: right;
932 float: right;
931 margin: 0 0 10px;
933 margin: 0 0 10px;
932 }
934 }
933
935
934 #content div.box div.title {
936 #content div.box div.title {
935 clear: both;
937 clear: both;
936 overflow: hidden;
938 overflow: hidden;
937 background-color: #003B76;
939 background-color: #003B76;
938 background-repeat: repeat-x;
940 background-repeat: repeat-x;
939 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
941 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
940 background-image: -moz-linear-gradient(top, #003b76, #00376e);
942 background-image: -moz-linear-gradient(top, #003b76, #00376e);
941 background-image: -ms-linear-gradient(top, #003b76, #00376e);
943 background-image: -ms-linear-gradient(top, #003b76, #00376e);
942 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
944 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
943 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
945 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
944 background-image: -o-linear-gradient(top, #003b76, #00376e);
946 background-image: -o-linear-gradient(top, #003b76, #00376e);
945 background-image: linear-gradient(to bottom, #003b76, #00376e);
947 background-image: linear-gradient(to bottom, #003b76, #00376e);
946 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
948 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
947 margin: 0 0 20px;
949 margin: 0 0 20px;
948 padding: 0;
950 padding: 0;
949 border-radius: 4px 4px 0 0;
951 border-radius: 4px 4px 0 0;
950 }
952 }
951
953
952 #content div.box div.title h5 {
954 #content div.box div.title h5 {
953 float: left;
955 float: left;
954 border: none;
956 border: none;
955 color: #fff;
957 color: #fff;
956 margin: 0;
958 margin: 0;
957 padding: 11px 0 11px 10px;
959 padding: 11px 0 11px 10px;
958 }
960 }
959
961
960 #content div.box div.title .link-white {
962 #content div.box div.title .link-white {
961 color: #FFFFFF;
963 color: #FFFFFF;
962 }
964 }
963
965
964 #content div.box div.title .link-white.current {
966 #content div.box div.title .link-white.current {
965 color: #BFE3FF;
967 color: #BFE3FF;
966 }
968 }
967
969
968 #content div.box div.title ul.links li {
970 #content div.box div.title ul.links li {
969 list-style: none;
971 list-style: none;
970 float: left;
972 float: left;
971 margin: 0;
973 margin: 0;
972 padding: 0;
974 padding: 0;
973 }
975 }
974
976
975 #content div.box div.title ul.links li a {
977 #content div.box div.title ul.links li a {
976 border-left: 1px solid #316293;
978 border-left: 1px solid #316293;
977 color: #FFFFFF;
979 color: #FFFFFF;
978 display: block;
980 display: block;
979 float: left;
981 float: left;
980 font-size: 13px;
982 font-size: 13px;
981 font-weight: 700;
983 font-weight: 700;
982 height: 1%;
984 height: 1%;
983 margin: 0;
985 margin: 0;
984 padding: 11px 22px 12px;
986 padding: 11px 22px 12px;
985 text-decoration: none;
987 text-decoration: none;
986 }
988 }
987
989
988 #content div.box h1, #content div.box h2, #content div.box h3, #content div.box h4, #content div.box h5, #content div.box h6,
990 #content div.box h1, #content div.box h2, #content div.box h3, #content div.box h4, #content div.box h5, #content div.box h6,
989 #content div.box div.h1, #content div.box div.h2, #content div.box div.h3, #content div.box div.h4, #content div.box div.h5, #content div.box div.h6 {
991 #content div.box div.h1, #content div.box div.h2, #content div.box div.h3, #content div.box div.h4, #content div.box div.h5, #content div.box div.h6 {
990 clear: both;
992 clear: both;
991 overflow: hidden;
993 overflow: hidden;
992 border-bottom: 1px solid #DDD;
994 border-bottom: 1px solid #DDD;
993 margin: 10px 20px;
995 margin: 10px 20px;
994 padding: 0 0 15px;
996 padding: 0 0 15px;
995 }
997 }
996
998
997 #content div.box p {
999 #content div.box p {
998 color: #5f5f5f;
1000 color: #5f5f5f;
999 font-size: 12px;
1001 font-size: 12px;
1000 line-height: 150%;
1002 line-height: 150%;
1001 margin: 0 24px 10px;
1003 margin: 0 24px 10px;
1002 padding: 0;
1004 padding: 0;
1003 }
1005 }
1004
1006
1005 #content div.box blockquote {
1007 #content div.box blockquote {
1006 border-left: 4px solid #DDD;
1008 border-left: 4px solid #DDD;
1007 color: #5f5f5f;
1009 color: #5f5f5f;
1008 font-size: 11px;
1010 font-size: 11px;
1009 line-height: 150%;
1011 line-height: 150%;
1010 margin: 0 34px;
1012 margin: 0 34px;
1011 padding: 0 0 0 14px;
1013 padding: 0 0 0 14px;
1012 }
1014 }
1013
1015
1014 #content div.box blockquote p {
1016 #content div.box blockquote p {
1015 margin: 10px 0;
1017 margin: 10px 0;
1016 padding: 0;
1018 padding: 0;
1017 }
1019 }
1018
1020
1019 #content div.box dl {
1021 #content div.box dl {
1020 margin: 10px 0px;
1022 margin: 10px 0px;
1021 }
1023 }
1022
1024
1023 #content div.box dt {
1025 #content div.box dt {
1024 font-size: 12px;
1026 font-size: 12px;
1025 margin: 0;
1027 margin: 0;
1026 }
1028 }
1027
1029
1028 #content div.box dd {
1030 #content div.box dd {
1029 font-size: 12px;
1031 font-size: 12px;
1030 margin: 0;
1032 margin: 0;
1031 padding: 8px 0 8px 15px;
1033 padding: 8px 0 8px 15px;
1032 }
1034 }
1033
1035
1034 #content div.box li {
1036 #content div.box li {
1035 font-size: 12px;
1037 font-size: 12px;
1036 padding: 4px 0;
1038 padding: 4px 0;
1037 }
1039 }
1038
1040
1039 #content div.box ul.disc, #content div.box ul.circle {
1041 #content div.box ul.disc, #content div.box ul.circle {
1040 margin: 10px 24px 10px 38px;
1042 margin: 10px 24px 10px 38px;
1041 }
1043 }
1042
1044
1043 #content div.box ul.square {
1045 #content div.box ul.square {
1044 margin: 10px 24px 10px 40px;
1046 margin: 10px 24px 10px 40px;
1045 }
1047 }
1046
1048
1047 #content div.box img.left {
1049 #content div.box img.left {
1048 border: none;
1050 border: none;
1049 float: left;
1051 float: left;
1050 margin: 10px 10px 10px 0;
1052 margin: 10px 10px 10px 0;
1051 }
1053 }
1052
1054
1053 #content div.box img.right {
1055 #content div.box img.right {
1054 border: none;
1056 border: none;
1055 float: right;
1057 float: right;
1056 margin: 10px 0 10px 10px;
1058 margin: 10px 0 10px 10px;
1057 }
1059 }
1058
1060
1059 #content div.box div.messages {
1061 #content div.box div.messages {
1060 clear: both;
1062 clear: both;
1061 overflow: hidden;
1063 overflow: hidden;
1062 margin: 0 20px;
1064 margin: 0 20px;
1063 padding: 0;
1065 padding: 0;
1064 }
1066 }
1065
1067
1066 #content div.box div.message {
1068 #content div.box div.message {
1067 clear: both;
1069 clear: both;
1068 overflow: hidden;
1070 overflow: hidden;
1069 margin: 0;
1071 margin: 0;
1070 padding: 5px 0;
1072 padding: 5px 0;
1071 white-space: pre-wrap;
1073 white-space: pre-wrap;
1072 }
1074 }
1073 #content div.box div.expand {
1075 #content div.box div.expand {
1074 width: 110%;
1076 width: 110%;
1075 height: 14px;
1077 height: 14px;
1076 font-size: 10px;
1078 font-size: 10px;
1077 text-align: center;
1079 text-align: center;
1078 cursor: pointer;
1080 cursor: pointer;
1079 color: #666;
1081 color: #666;
1080
1082
1081 background: -webkit-gradient(linear,0% 50%,100% 50%,color-stop(0%,rgba(255,255,255,0)),color-stop(100%,rgba(64,96,128,0.1)));
1083 background: -webkit-gradient(linear,0% 50%,100% 50%,color-stop(0%,rgba(255,255,255,0)),color-stop(100%,rgba(64,96,128,0.1)));
1082 background: -webkit-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1084 background: -webkit-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1083 background: -moz-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1085 background: -moz-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1084 background: -o-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1086 background: -o-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1085 background: -ms-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1087 background: -ms-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1086 background: linear-gradient(to bottom,rgba(255,255,255,0),rgba(64,96,128,0.1));
1088 background: linear-gradient(to bottom,rgba(255,255,255,0),rgba(64,96,128,0.1));
1087
1089
1088 display: none;
1090 display: none;
1089 overflow: hidden;
1091 overflow: hidden;
1090 }
1092 }
1091 #content div.box div.expand .expandtext {
1093 #content div.box div.expand .expandtext {
1092 background-color: #ffffff;
1094 background-color: #ffffff;
1093 padding: 2px;
1095 padding: 2px;
1094 border-radius: 2px;
1096 border-radius: 2px;
1095 }
1097 }
1096
1098
1097 #content div.box div.message a {
1099 #content div.box div.message a {
1098 font-weight: 400 !important;
1100 font-weight: 400 !important;
1099 }
1101 }
1100
1102
1101 #content div.box div.message div.image {
1103 #content div.box div.message div.image {
1102 float: left;
1104 float: left;
1103 margin: 9px 0 0 5px;
1105 margin: 9px 0 0 5px;
1104 padding: 6px;
1106 padding: 6px;
1105 }
1107 }
1106
1108
1107 #content div.box div.message div.image img {
1109 #content div.box div.message div.image img {
1108 vertical-align: middle;
1110 vertical-align: middle;
1109 margin: 0;
1111 margin: 0;
1110 }
1112 }
1111
1113
1112 #content div.box div.message div.text {
1114 #content div.box div.message div.text {
1113 float: left;
1115 float: left;
1114 margin: 0;
1116 margin: 0;
1115 padding: 9px 6px;
1117 padding: 9px 6px;
1116 }
1118 }
1117
1119
1118 #content div.box div.message div.dismiss a {
1120 #content div.box div.message div.dismiss a {
1119 height: 16px;
1121 height: 16px;
1120 width: 16px;
1122 width: 16px;
1121 display: block;
1123 display: block;
1122 background: url("../images/icons/cross.png") no-repeat;
1124 background: url("../images/icons/cross.png") no-repeat;
1123 margin: 15px 14px 0 0;
1125 margin: 15px 14px 0 0;
1124 padding: 0;
1126 padding: 0;
1125 }
1127 }
1126
1128
1127 #content div.box div.message div.text h1, #content div.box div.message div.text h2, #content div.box div.message div.text h3, #content div.box div.message div.text h4, #content div.box div.message div.text h5, #content div.box div.message div.text h6 {
1129 #content div.box div.message div.text h1, #content div.box div.message div.text h2, #content div.box div.message div.text h3, #content div.box div.message div.text h4, #content div.box div.message div.text h5, #content div.box div.message div.text h6 {
1128 border: none;
1130 border: none;
1129 margin: 0;
1131 margin: 0;
1130 padding: 0;
1132 padding: 0;
1131 }
1133 }
1132
1134
1133 #content div.box div.message div.text span {
1135 #content div.box div.message div.text span {
1134 height: 1%;
1136 height: 1%;
1135 display: block;
1137 display: block;
1136 margin: 0;
1138 margin: 0;
1137 padding: 5px 0 0;
1139 padding: 5px 0 0;
1138 }
1140 }
1139
1141
1140 #content div.box div.message-error {
1142 #content div.box div.message-error {
1141 height: 1%;
1143 height: 1%;
1142 clear: both;
1144 clear: both;
1143 overflow: hidden;
1145 overflow: hidden;
1144 background: #FBE3E4;
1146 background: #FBE3E4;
1145 border: 1px solid #FBC2C4;
1147 border: 1px solid #FBC2C4;
1146 color: #860006;
1148 color: #860006;
1147 }
1149 }
1148
1150
1149 #content div.box div.message-error h6 {
1151 #content div.box div.message-error h6 {
1150 color: #860006;
1152 color: #860006;
1151 }
1153 }
1152
1154
1153 #content div.box div.message-warning {
1155 #content div.box div.message-warning {
1154 height: 1%;
1156 height: 1%;
1155 clear: both;
1157 clear: both;
1156 overflow: hidden;
1158 overflow: hidden;
1157 background: #FFF6BF;
1159 background: #FFF6BF;
1158 border: 1px solid #FFD324;
1160 border: 1px solid #FFD324;
1159 color: #5f5200;
1161 color: #5f5200;
1160 }
1162 }
1161
1163
1162 #content div.box div.message-warning h6 {
1164 #content div.box div.message-warning h6 {
1163 color: #5f5200;
1165 color: #5f5200;
1164 }
1166 }
1165
1167
1166 #content div.box div.message-notice {
1168 #content div.box div.message-notice {
1167 height: 1%;
1169 height: 1%;
1168 clear: both;
1170 clear: both;
1169 overflow: hidden;
1171 overflow: hidden;
1170 background: #8FBDE0;
1172 background: #8FBDE0;
1171 border: 1px solid #6BACDE;
1173 border: 1px solid #6BACDE;
1172 color: #003863;
1174 color: #003863;
1173 }
1175 }
1174
1176
1175 #content div.box div.message-notice h6 {
1177 #content div.box div.message-notice h6 {
1176 color: #003863;
1178 color: #003863;
1177 }
1179 }
1178
1180
1179 #content div.box div.message-success {
1181 #content div.box div.message-success {
1180 height: 1%;
1182 height: 1%;
1181 clear: both;
1183 clear: both;
1182 overflow: hidden;
1184 overflow: hidden;
1183 background: #E6EFC2;
1185 background: #E6EFC2;
1184 border: 1px solid #C6D880;
1186 border: 1px solid #C6D880;
1185 color: #4e6100;
1187 color: #4e6100;
1186 }
1188 }
1187
1189
1188 #content div.box div.message-success h6 {
1190 #content div.box div.message-success h6 {
1189 color: #4e6100;
1191 color: #4e6100;
1190 }
1192 }
1191
1193
1192 #content div.box div.form div.fields div.field {
1194 #content div.box div.form div.fields div.field {
1193 height: 1%;
1195 height: 1%;
1194 min-height: 12px;
1196 min-height: 12px;
1195 border-bottom: 1px solid #DDD;
1197 border-bottom: 1px solid #DDD;
1196 clear: both;
1198 clear: both;
1197 margin: 0;
1199 margin: 0;
1198 padding: 10px 0;
1200 padding: 10px 0;
1199 }
1201 }
1200
1202
1201 #content div.box div.form div.fields div.field-first {
1203 #content div.box div.form div.fields div.field-first {
1202 padding: 0 0 10px;
1204 padding: 0 0 10px;
1203 }
1205 }
1204
1206
1205 #content div.box div.form div.fields div.field-noborder {
1207 #content div.box div.form div.fields div.field-noborder {
1206 border-bottom: 0 !important;
1208 border-bottom: 0 !important;
1207 }
1209 }
1208
1210
1209 #content div.box div.form div.fields div.field span.error-message {
1211 #content div.box div.form div.fields div.field span.error-message {
1210 height: 1%;
1212 height: 1%;
1211 display: inline-block;
1213 display: inline-block;
1212 color: red;
1214 color: red;
1213 margin: 8px 0 0 4px;
1215 margin: 8px 0 0 4px;
1214 padding: 0;
1216 padding: 0;
1215 }
1217 }
1216
1218
1217 #content div.box div.form div.fields div.field span.success {
1219 #content div.box div.form div.fields div.field span.success {
1218 height: 1%;
1220 height: 1%;
1219 display: block;
1221 display: block;
1220 color: #316309;
1222 color: #316309;
1221 margin: 8px 0 0;
1223 margin: 8px 0 0;
1222 padding: 0;
1224 padding: 0;
1223 }
1225 }
1224
1226
1225 #content div.box div.form div.fields div.field div.label {
1227 #content div.box div.form div.fields div.field div.label {
1226 left: 70px;
1228 left: 70px;
1227 width: 155px;
1229 width: 155px;
1228 position: absolute;
1230 position: absolute;
1229 margin: 0;
1231 margin: 0;
1230 padding: 5px 0 0 0px;
1232 padding: 5px 0 0 0px;
1231 }
1233 }
1232
1234
1233 #content div.box div.form div.fields div.field div.label-summary {
1235 #content div.box div.form div.fields div.field div.label-summary {
1234 left: 30px;
1236 left: 30px;
1235 width: 155px;
1237 width: 155px;
1236 position: absolute;
1238 position: absolute;
1237 margin: 0;
1239 margin: 0;
1238 padding: 0px 0 0 0px;
1240 padding: 0px 0 0 0px;
1239 }
1241 }
1240
1242
1241 #content div.box-left div.form div.fields div.field div.label,
1243 #content div.box-left div.form div.fields div.field div.label,
1242 #content div.box-right div.form div.fields div.field div.label,
1244 #content div.box-right div.form div.fields div.field div.label,
1243 #content div.box-left div.form div.fields div.field div.label,
1245 #content div.box-left div.form div.fields div.field div.label,
1244 #content div.box-left div.form div.fields div.field div.label-summary,
1246 #content div.box-left div.form div.fields div.field div.label-summary,
1245 #content div.box-right div.form div.fields div.field div.label-summary,
1247 #content div.box-right div.form div.fields div.field div.label-summary,
1246 #content div.box-left div.form div.fields div.field div.label-summary {
1248 #content div.box-left div.form div.fields div.field div.label-summary {
1247 clear: both;
1249 clear: both;
1248 overflow: hidden;
1250 overflow: hidden;
1249 left: 0;
1251 left: 0;
1250 width: auto;
1252 width: auto;
1251 position: relative;
1253 position: relative;
1252 margin: 0;
1254 margin: 0;
1253 padding: 0 0 8px;
1255 padding: 0 0 8px;
1254 }
1256 }
1255
1257
1256 #content div.box div.form div.fields div.field div.label-select {
1258 #content div.box div.form div.fields div.field div.label-select {
1257 padding: 5px 0 0 5px;
1259 padding: 5px 0 0 5px;
1258 }
1260 }
1259
1261
1260 #content div.box-left div.form div.fields div.field div.label-select,
1262 #content div.box-left div.form div.fields div.field div.label-select,
1261 #content div.box-right div.form div.fields div.field div.label-select {
1263 #content div.box-right div.form div.fields div.field div.label-select {
1262 padding: 0 0 8px;
1264 padding: 0 0 8px;
1263 }
1265 }
1264
1266
1265 #content div.box-left div.form div.fields div.field div.label-textarea,
1267 #content div.box-left div.form div.fields div.field div.label-textarea,
1266 #content div.box-right div.form div.fields div.field div.label-textarea {
1268 #content div.box-right div.form div.fields div.field div.label-textarea {
1267 padding: 0 0 8px !important;
1269 padding: 0 0 8px !important;
1268 }
1270 }
1269
1271
1270 #content div.box div.form div.fields div.field div.label label, div.label label {
1272 #content div.box div.form div.fields div.field div.label label, div.label label {
1271 color: #393939;
1273 color: #393939;
1272 font-weight: 700;
1274 font-weight: 700;
1273 }
1275 }
1274 #content div.box div.form div.fields div.field div.label label, div.label-summary label {
1276 #content div.box div.form div.fields div.field div.label label, div.label-summary label {
1275 color: #393939;
1277 color: #393939;
1276 font-weight: 700;
1278 font-weight: 700;
1277 }
1279 }
1278 #content div.box div.form div.fields div.field div.input {
1280 #content div.box div.form div.fields div.field div.input {
1279 margin: 0 0 0 200px;
1281 margin: 0 0 0 200px;
1280 }
1282 }
1281
1283
1282 #content div.box div.form div.fields div.field div.input.summary {
1284 #content div.box div.form div.fields div.field div.input.summary {
1283 margin: 0 0 0 110px;
1285 margin: 0 0 0 110px;
1284 }
1286 }
1285 #content div.box div.form div.fields div.field div.input.summary-short {
1287 #content div.box div.form div.fields div.field div.input.summary-short {
1286 margin: 0 0 0 110px;
1288 margin: 0 0 0 110px;
1287 }
1289 }
1288 #content div.box div.form div.fields div.field div.file {
1290 #content div.box div.form div.fields div.field div.file {
1289 margin: 0 0 0 200px;
1291 margin: 0 0 0 200px;
1290 }
1292 }
1291
1293
1292 #content div.box-left div.form div.fields div.field div.input, #content div.box-right div.form div.fields div.field div.input {
1294 #content div.box-left div.form div.fields div.field div.input, #content div.box-right div.form div.fields div.field div.input {
1293 margin: 0 0 0 0px;
1295 margin: 0 0 0 0px;
1294 }
1296 }
1295
1297
1296 #content div.box div.form div.fields div.field div.input input,
1298 #content div.box div.form div.fields div.field div.input input,
1297 .reviewer_ac input {
1299 .reviewer_ac input {
1298 background: #FFF;
1300 background: #FFF;
1299 border-top: 1px solid #b3b3b3;
1301 border-top: 1px solid #b3b3b3;
1300 border-left: 1px solid #b3b3b3;
1302 border-left: 1px solid #b3b3b3;
1301 border-right: 1px solid #eaeaea;
1303 border-right: 1px solid #eaeaea;
1302 border-bottom: 1px solid #eaeaea;
1304 border-bottom: 1px solid #eaeaea;
1303 color: #000;
1305 color: #000;
1304 font-size: 11px;
1306 font-size: 11px;
1305 margin: 0;
1307 margin: 0;
1306 padding: 7px 7px 6px;
1308 padding: 7px 7px 6px;
1307 }
1309 }
1308
1310
1309 #content div.box div.form div.fields div.field div.input input#clone_url,
1311 #content div.box div.form div.fields div.field div.input input#clone_url,
1310 #content div.box div.form div.fields div.field div.input input#clone_url_id
1312 #content div.box div.form div.fields div.field div.input input#clone_url_id
1311 {
1313 {
1312 font-size: 16px;
1314 font-size: 16px;
1313 padding: 2px;
1315 padding: 2px;
1314 }
1316 }
1315
1317
1316 #content div.box div.form div.fields div.field div.file input {
1318 #content div.box div.form div.fields div.field div.file input {
1317 background: none repeat scroll 0 0 #FFFFFF;
1319 background: none repeat scroll 0 0 #FFFFFF;
1318 border-color: #B3B3B3 #EAEAEA #EAEAEA #B3B3B3;
1320 border-color: #B3B3B3 #EAEAEA #EAEAEA #B3B3B3;
1319 border-style: solid;
1321 border-style: solid;
1320 border-width: 1px;
1322 border-width: 1px;
1321 color: #000000;
1323 color: #000000;
1322 font-size: 11px;
1324 font-size: 11px;
1323 margin: 0;
1325 margin: 0;
1324 padding: 7px 7px 6px;
1326 padding: 7px 7px 6px;
1325 }
1327 }
1326
1328
1327 input.disabled {
1329 input.disabled {
1328 background-color: #F5F5F5 !important;
1330 background-color: #F5F5F5 !important;
1329 }
1331 }
1330 #content div.box div.form div.fields div.field div.input input.small {
1332 #content div.box div.form div.fields div.field div.input input.small {
1331 width: 30%;
1333 width: 30%;
1332 }
1334 }
1333
1335
1334 #content div.box div.form div.fields div.field div.input input.medium {
1336 #content div.box div.form div.fields div.field div.input input.medium {
1335 width: 55%;
1337 width: 55%;
1336 }
1338 }
1337
1339
1338 #content div.box div.form div.fields div.field div.input input.large {
1340 #content div.box div.form div.fields div.field div.input input.large {
1339 width: 85%;
1341 width: 85%;
1340 }
1342 }
1341
1343
1342 #content div.box div.form div.fields div.field div.input input.date {
1344 #content div.box div.form div.fields div.field div.input input.date {
1343 width: 177px;
1345 width: 177px;
1344 }
1346 }
1345
1347
1346 #content div.box div.form div.fields div.field div.input input.button {
1348 #content div.box div.form div.fields div.field div.input input.button {
1347 background: #D4D0C8;
1349 background: #D4D0C8;
1348 border-top: 1px solid #FFF;
1350 border-top: 1px solid #FFF;
1349 border-left: 1px solid #FFF;
1351 border-left: 1px solid #FFF;
1350 border-right: 1px solid #404040;
1352 border-right: 1px solid #404040;
1351 border-bottom: 1px solid #404040;
1353 border-bottom: 1px solid #404040;
1352 color: #000;
1354 color: #000;
1353 margin: 0;
1355 margin: 0;
1354 padding: 4px 8px;
1356 padding: 4px 8px;
1355 }
1357 }
1356
1358
1357 #content div.box div.form div.fields div.field div.textarea {
1359 #content div.box div.form div.fields div.field div.textarea {
1358 border-top: 1px solid #b3b3b3;
1360 border-top: 1px solid #b3b3b3;
1359 border-left: 1px solid #b3b3b3;
1361 border-left: 1px solid #b3b3b3;
1360 border-right: 1px solid #eaeaea;
1362 border-right: 1px solid #eaeaea;
1361 border-bottom: 1px solid #eaeaea;
1363 border-bottom: 1px solid #eaeaea;
1362 margin: 0 0 0 200px;
1364 margin: 0 0 0 200px;
1363 padding: 10px;
1365 padding: 10px;
1364 }
1366 }
1365
1367
1366 #content div.box div.form div.fields div.field div.textarea-editor {
1368 #content div.box div.form div.fields div.field div.textarea-editor {
1367 border: 1px solid #ddd;
1369 border: 1px solid #ddd;
1368 padding: 0;
1370 padding: 0;
1369 }
1371 }
1370
1372
1371 #content div.box div.form div.fields div.field div.textarea textarea {
1373 #content div.box div.form div.fields div.field div.textarea textarea {
1372 width: 100%;
1374 width: 100%;
1373 height: 220px;
1375 height: 220px;
1374 overflow: hidden;
1376 overflow: hidden;
1375 background: #FFF;
1377 background: #FFF;
1376 color: #000;
1378 color: #000;
1377 font-size: 11px;
1379 font-size: 11px;
1378 outline: none;
1380 outline: none;
1379 border-width: 0;
1381 border-width: 0;
1380 margin: 0;
1382 margin: 0;
1381 padding: 0;
1383 padding: 0;
1382 }
1384 }
1383
1385
1384 #content div.box-left div.form div.fields div.field div.textarea textarea, #content div.box-right div.form div.fields div.field div.textarea textarea {
1386 #content div.box-left div.form div.fields div.field div.textarea textarea, #content div.box-right div.form div.fields div.field div.textarea textarea {
1385 width: 100%;
1387 width: 100%;
1386 height: 100px;
1388 height: 100px;
1387 }
1389 }
1388
1390
1389 #content div.box div.form div.fields div.field div.textarea table {
1391 #content div.box div.form div.fields div.field div.textarea table {
1390 width: 100%;
1392 width: 100%;
1391 border: none;
1393 border: none;
1392 margin: 0;
1394 margin: 0;
1393 padding: 0;
1395 padding: 0;
1394 }
1396 }
1395
1397
1396 #content div.box div.form div.fields div.field div.textarea table td {
1398 #content div.box div.form div.fields div.field div.textarea table td {
1397 background: #DDD;
1399 background: #DDD;
1398 border: none;
1400 border: none;
1399 padding: 0;
1401 padding: 0;
1400 }
1402 }
1401
1403
1402 #content div.box div.form div.fields div.field div.textarea table td table {
1404 #content div.box div.form div.fields div.field div.textarea table td table {
1403 width: auto;
1405 width: auto;
1404 border: none;
1406 border: none;
1405 margin: 0;
1407 margin: 0;
1406 padding: 0;
1408 padding: 0;
1407 }
1409 }
1408
1410
1409 #content div.box div.form div.fields div.field div.textarea table td table td {
1411 #content div.box div.form div.fields div.field div.textarea table td table td {
1410 font-size: 11px;
1412 font-size: 11px;
1411 padding: 5px 5px 5px 0;
1413 padding: 5px 5px 5px 0;
1412 }
1414 }
1413
1415
1414 #content div.box div.form div.fields div.field input[type=text]:focus,
1416 #content div.box div.form div.fields div.field input[type=text]:focus,
1415 #content div.box div.form div.fields div.field input[type=password]:focus,
1417 #content div.box div.form div.fields div.field input[type=password]:focus,
1416 #content div.box div.form div.fields div.field input[type=file]:focus,
1418 #content div.box div.form div.fields div.field input[type=file]:focus,
1417 #content div.box div.form div.fields div.field textarea:focus,
1419 #content div.box div.form div.fields div.field textarea:focus,
1418 #content div.box div.form div.fields div.field select:focus,
1420 #content div.box div.form div.fields div.field select:focus,
1419 .reviewer_ac input:focus {
1421 .reviewer_ac input:focus {
1420 background: #f6f6f6;
1422 background: #f6f6f6;
1421 border-color: #666;
1423 border-color: #666;
1422 }
1424 }
1423
1425
1424 .reviewer_ac {
1426 .reviewer_ac {
1425 padding: 10px
1427 padding: 10px
1426 }
1428 }
1427
1429
1428 div.form div.fields div.field div.button {
1430 div.form div.fields div.field div.button {
1429 margin: 0;
1431 margin: 0;
1430 padding: 0 0 0 8px;
1432 padding: 0 0 0 8px;
1431 }
1433 }
1432 #content div.box table.noborder {
1434 #content div.box table.noborder {
1433 border: 1px solid transparent;
1435 border: 1px solid transparent;
1434 }
1436 }
1435
1437
1436 #content div.box table {
1438 #content div.box table {
1437 width: 100%;
1439 width: 100%;
1438 border-collapse: separate;
1440 border-collapse: separate;
1439 margin: 0;
1441 margin: 0;
1440 padding: 0;
1442 padding: 0;
1441 border: 1px solid #eee;
1443 border: 1px solid #eee;
1442 -webkit-border-radius: 4px;
1444 -webkit-border-radius: 4px;
1443 border-radius: 4px;
1445 border-radius: 4px;
1444 }
1446 }
1445
1447
1446 #content div.box table th {
1448 #content div.box table th {
1447 background: #eee;
1449 background: #eee;
1448 border-bottom: 1px solid #ddd;
1450 border-bottom: 1px solid #ddd;
1449 padding: 5px 0px 5px 5px;
1451 padding: 5px 0px 5px 5px;
1450 text-align: left;
1452 text-align: left;
1451 }
1453 }
1452
1454
1453 #content div.box table th.left {
1455 #content div.box table th.left {
1454 text-align: left;
1456 text-align: left;
1455 }
1457 }
1456
1458
1457 #content div.box table th.right {
1459 #content div.box table th.right {
1458 text-align: right;
1460 text-align: right;
1459 }
1461 }
1460
1462
1461 #content div.box table th.center {
1463 #content div.box table th.center {
1462 text-align: center;
1464 text-align: center;
1463 }
1465 }
1464
1466
1465 #content div.box table th.selected {
1467 #content div.box table th.selected {
1466 vertical-align: middle;
1468 vertical-align: middle;
1467 padding: 0;
1469 padding: 0;
1468 }
1470 }
1469
1471
1470 #content div.box table td {
1472 #content div.box table td {
1471 background: #fff;
1473 background: #fff;
1472 border-bottom: 1px solid #cdcdcd;
1474 border-bottom: 1px solid #cdcdcd;
1473 vertical-align: middle;
1475 vertical-align: middle;
1474 padding: 5px;
1476 padding: 5px;
1475 }
1477 }
1476
1478
1477 #content div.box table tr.selected td {
1479 #content div.box table tr.selected td {
1478 background: #FFC;
1480 background: #FFC;
1479 }
1481 }
1480
1482
1481 #content div.box table td.selected {
1483 #content div.box table td.selected {
1482 width: 3%;
1484 width: 3%;
1483 text-align: center;
1485 text-align: center;
1484 vertical-align: middle;
1486 vertical-align: middle;
1485 padding: 0;
1487 padding: 0;
1486 }
1488 }
1487
1489
1488 #content div.box table td.action {
1490 #content div.box table td.action {
1489 width: 45%;
1491 width: 45%;
1490 text-align: left;
1492 text-align: left;
1491 }
1493 }
1492
1494
1493 #content div.box table td.date {
1495 #content div.box table td.date {
1494 width: 33%;
1496 width: 33%;
1495 text-align: center;
1497 text-align: center;
1496 }
1498 }
1497
1499
1498 #content div.box div.action {
1500 #content div.box div.action {
1499 float: right;
1501 float: right;
1500 background: #FFF;
1502 background: #FFF;
1501 text-align: right;
1503 text-align: right;
1502 margin: 10px 0 0;
1504 margin: 10px 0 0;
1503 padding: 0;
1505 padding: 0;
1504 }
1506 }
1505
1507
1506 #content div.box div.action select {
1508 #content div.box div.action select {
1507 font-size: 11px;
1509 font-size: 11px;
1508 margin: 0;
1510 margin: 0;
1509 }
1511 }
1510
1512
1511 #content div.box div.action .ui-selectmenu {
1513 #content div.box div.action .ui-selectmenu {
1512 margin: 0;
1514 margin: 0;
1513 padding: 0;
1515 padding: 0;
1514 }
1516 }
1515
1517
1516 #content div.box div.pagination {
1518 #content div.box div.pagination {
1517 height: 1%;
1519 height: 1%;
1518 clear: both;
1520 clear: both;
1519 overflow: hidden;
1521 overflow: hidden;
1520 margin: 10px 0 0;
1522 margin: 10px 0 0;
1521 padding: 0;
1523 padding: 0;
1522 }
1524 }
1523
1525
1524 #content div.box div.pagination ul.pager {
1526 #content div.box div.pagination ul.pager {
1525 float: right;
1527 float: right;
1526 text-align: right;
1528 text-align: right;
1527 margin: 0;
1529 margin: 0;
1528 padding: 0;
1530 padding: 0;
1529 }
1531 }
1530
1532
1531 #content div.box div.pagination ul.pager li {
1533 #content div.box div.pagination ul.pager li {
1532 height: 1%;
1534 height: 1%;
1533 float: left;
1535 float: left;
1534 list-style: none;
1536 list-style: none;
1535 background: #ebebeb url("../images/pager.png") repeat-x;
1537 background: #ebebeb url("../images/pager.png") repeat-x;
1536 border-top: 1px solid #dedede;
1538 border-top: 1px solid #dedede;
1537 border-left: 1px solid #cfcfcf;
1539 border-left: 1px solid #cfcfcf;
1538 border-right: 1px solid #c4c4c4;
1540 border-right: 1px solid #c4c4c4;
1539 border-bottom: 1px solid #c4c4c4;
1541 border-bottom: 1px solid #c4c4c4;
1540 color: #4A4A4A;
1542 color: #4A4A4A;
1541 font-weight: 700;
1543 font-weight: 700;
1542 margin: 0 0 0 4px;
1544 margin: 0 0 0 4px;
1543 padding: 0;
1545 padding: 0;
1544 }
1546 }
1545
1547
1546 #content div.box div.pagination ul.pager li.separator {
1548 #content div.box div.pagination ul.pager li.separator {
1547 padding: 6px;
1549 padding: 6px;
1548 }
1550 }
1549
1551
1550 #content div.box div.pagination ul.pager li.current {
1552 #content div.box div.pagination ul.pager li.current {
1551 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1553 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1552 border-top: 1px solid #ccc;
1554 border-top: 1px solid #ccc;
1553 border-left: 1px solid #bebebe;
1555 border-left: 1px solid #bebebe;
1554 border-right: 1px solid #b1b1b1;
1556 border-right: 1px solid #b1b1b1;
1555 border-bottom: 1px solid #afafaf;
1557 border-bottom: 1px solid #afafaf;
1556 color: #515151;
1558 color: #515151;
1557 padding: 6px;
1559 padding: 6px;
1558 }
1560 }
1559
1561
1560 #content div.box div.pagination ul.pager li a {
1562 #content div.box div.pagination ul.pager li a {
1561 height: 1%;
1563 height: 1%;
1562 display: block;
1564 display: block;
1563 float: left;
1565 float: left;
1564 color: #515151;
1566 color: #515151;
1565 text-decoration: none;
1567 text-decoration: none;
1566 margin: 0;
1568 margin: 0;
1567 padding: 6px;
1569 padding: 6px;
1568 }
1570 }
1569
1571
1570 #content div.box div.pagination ul.pager li a:hover, #content div.box div.pagination ul.pager li a:active {
1572 #content div.box div.pagination ul.pager li a:hover, #content div.box div.pagination ul.pager li a:active {
1571 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1573 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1572 border-top: 1px solid #ccc;
1574 border-top: 1px solid #ccc;
1573 border-left: 1px solid #bebebe;
1575 border-left: 1px solid #bebebe;
1574 border-right: 1px solid #b1b1b1;
1576 border-right: 1px solid #b1b1b1;
1575 border-bottom: 1px solid #afafaf;
1577 border-bottom: 1px solid #afafaf;
1576 margin: -1px;
1578 margin: -1px;
1577 }
1579 }
1578
1580
1579 #content div.box div.pagination-wh {
1581 #content div.box div.pagination-wh {
1580 height: 1%;
1582 height: 1%;
1581 clear: both;
1583 clear: both;
1582 overflow: hidden;
1584 overflow: hidden;
1583 text-align: right;
1585 text-align: right;
1584 margin: 10px 0 0;
1586 margin: 10px 0 0;
1585 padding: 0;
1587 padding: 0;
1586 }
1588 }
1587
1589
1588 #content div.box div.pagination-right {
1590 #content div.box div.pagination-right {
1589 float: right;
1591 float: right;
1590 }
1592 }
1591
1593
1592 #content div.box div.pagination-wh a,
1594 #content div.box div.pagination-wh a,
1593 #content div.box div.pagination-wh span.pager_dotdot,
1595 #content div.box div.pagination-wh span.pager_dotdot,
1594 #content div.box div.pagination-wh span.yui-pg-previous,
1596 #content div.box div.pagination-wh span.yui-pg-previous,
1595 #content div.box div.pagination-wh span.yui-pg-last,
1597 #content div.box div.pagination-wh span.yui-pg-last,
1596 #content div.box div.pagination-wh span.yui-pg-next,
1598 #content div.box div.pagination-wh span.yui-pg-next,
1597 #content div.box div.pagination-wh span.yui-pg-first {
1599 #content div.box div.pagination-wh span.yui-pg-first {
1598 height: 1%;
1600 height: 1%;
1599 float: left;
1601 float: left;
1600 background: #ebebeb url("../images/pager.png") repeat-x;
1602 background: #ebebeb url("../images/pager.png") repeat-x;
1601 border-top: 1px solid #dedede;
1603 border-top: 1px solid #dedede;
1602 border-left: 1px solid #cfcfcf;
1604 border-left: 1px solid #cfcfcf;
1603 border-right: 1px solid #c4c4c4;
1605 border-right: 1px solid #c4c4c4;
1604 border-bottom: 1px solid #c4c4c4;
1606 border-bottom: 1px solid #c4c4c4;
1605 color: #4A4A4A;
1607 color: #4A4A4A;
1606 font-weight: 700;
1608 font-weight: 700;
1607 margin: 0 0 0 4px;
1609 margin: 0 0 0 4px;
1608 padding: 6px;
1610 padding: 6px;
1609 }
1611 }
1610
1612
1611 #content div.box div.pagination-wh span.pager_curpage {
1613 #content div.box div.pagination-wh span.pager_curpage {
1612 height: 1%;
1614 height: 1%;
1613 float: left;
1615 float: left;
1614 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1616 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1615 border-top: 1px solid #ccc;
1617 border-top: 1px solid #ccc;
1616 border-left: 1px solid #bebebe;
1618 border-left: 1px solid #bebebe;
1617 border-right: 1px solid #b1b1b1;
1619 border-right: 1px solid #b1b1b1;
1618 border-bottom: 1px solid #afafaf;
1620 border-bottom: 1px solid #afafaf;
1619 color: #515151;
1621 color: #515151;
1620 font-weight: 700;
1622 font-weight: 700;
1621 margin: 0 0 0 4px;
1623 margin: 0 0 0 4px;
1622 padding: 6px;
1624 padding: 6px;
1623 }
1625 }
1624
1626
1625 #content div.box div.pagination-wh a:hover, #content div.box div.pagination-wh a:active {
1627 #content div.box div.pagination-wh a:hover, #content div.box div.pagination-wh a:active {
1626 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1628 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1627 border-top: 1px solid #ccc;
1629 border-top: 1px solid #ccc;
1628 border-left: 1px solid #bebebe;
1630 border-left: 1px solid #bebebe;
1629 border-right: 1px solid #b1b1b1;
1631 border-right: 1px solid #b1b1b1;
1630 border-bottom: 1px solid #afafaf;
1632 border-bottom: 1px solid #afafaf;
1631 text-decoration: none;
1633 text-decoration: none;
1632 }
1634 }
1633
1635
1634 #content div.box div.traffic div.legend {
1636 #content div.box div.traffic div.legend {
1635 clear: both;
1637 clear: both;
1636 overflow: hidden;
1638 overflow: hidden;
1637 border-bottom: 1px solid #ddd;
1639 border-bottom: 1px solid #ddd;
1638 margin: 0 0 10px;
1640 margin: 0 0 10px;
1639 padding: 0 0 10px;
1641 padding: 0 0 10px;
1640 }
1642 }
1641
1643
1642 #content div.box div.traffic div.legend h6 {
1644 #content div.box div.traffic div.legend h6 {
1643 float: left;
1645 float: left;
1644 border: none;
1646 border: none;
1645 margin: 0;
1647 margin: 0;
1646 padding: 0;
1648 padding: 0;
1647 }
1649 }
1648
1650
1649 #content div.box div.traffic div.legend li {
1651 #content div.box div.traffic div.legend li {
1650 list-style: none;
1652 list-style: none;
1651 float: left;
1653 float: left;
1652 font-size: 11px;
1654 font-size: 11px;
1653 margin: 0;
1655 margin: 0;
1654 padding: 0 8px 0 4px;
1656 padding: 0 8px 0 4px;
1655 }
1657 }
1656
1658
1657 #content div.box div.traffic div.legend li.visits {
1659 #content div.box div.traffic div.legend li.visits {
1658 border-left: 12px solid #edc240;
1660 border-left: 12px solid #edc240;
1659 }
1661 }
1660
1662
1661 #content div.box div.traffic div.legend li.pageviews {
1663 #content div.box div.traffic div.legend li.pageviews {
1662 border-left: 12px solid #afd8f8;
1664 border-left: 12px solid #afd8f8;
1663 }
1665 }
1664
1666
1665 #content div.box div.traffic table {
1667 #content div.box div.traffic table {
1666 width: auto;
1668 width: auto;
1667 }
1669 }
1668
1670
1669 #content div.box div.traffic table td {
1671 #content div.box div.traffic table td {
1670 background: transparent;
1672 background: transparent;
1671 border: none;
1673 border: none;
1672 padding: 2px 3px 3px;
1674 padding: 2px 3px 3px;
1673 }
1675 }
1674
1676
1675 #content div.box div.traffic table td.legendLabel {
1677 #content div.box div.traffic table td.legendLabel {
1676 padding: 0 3px 2px;
1678 padding: 0 3px 2px;
1677 }
1679 }
1678
1680
1679 #content div.box #summary {
1681 #content div.box #summary {
1680 margin-right: 200px;
1682 margin-right: 200px;
1681 }
1683 }
1682
1684
1683 #summary-menu-stats {
1685 #summary-menu-stats {
1684 float: left;
1686 float: left;
1685 width: 180px;
1687 width: 180px;
1686 position: absolute;
1688 position: absolute;
1687 top: 0;
1689 top: 0;
1688 right: 0;
1690 right: 0;
1689 }
1691 }
1690
1692
1691 #summary-menu-stats ul {
1693 #summary-menu-stats ul {
1692 margin: 0 10px;
1694 margin: 0 10px;
1693 display: block;
1695 display: block;
1694 background-color: #f9f9f9;
1696 background-color: #f9f9f9;
1695 border: 1px solid #d1d1d1;
1697 border: 1px solid #d1d1d1;
1696 border-radius: 4px;
1698 border-radius: 4px;
1697 }
1699 }
1698
1700
1699 #content #summary-menu-stats li {
1701 #content #summary-menu-stats li {
1700 border-top: 1px solid #d1d1d1;
1702 border-top: 1px solid #d1d1d1;
1701 padding: 0;
1703 padding: 0;
1702 }
1704 }
1703
1705
1704 #content #summary-menu-stats li:hover {
1706 #content #summary-menu-stats li:hover {
1705 background: #f0f0f0;
1707 background: #f0f0f0;
1706 }
1708 }
1707
1709
1708 #content #summary-menu-stats li:first-child {
1710 #content #summary-menu-stats li:first-child {
1709 border-top: none;
1711 border-top: none;
1710 }
1712 }
1711
1713
1712 #summary-menu-stats a.followers { background-image: url('../images/icons/heart.png')}
1714 #summary-menu-stats a.followers { background-image: url('../images/icons/heart.png')}
1713 #summary-menu-stats a.forks { background-image: url('../images/icons/arrow_divide.png')}
1715 #summary-menu-stats a.forks { background-image: url('../images/icons/arrow_divide.png')}
1714 #summary-menu-stats a.settings { background-image: url('../images/icons/cog_edit.png')}
1716 #summary-menu-stats a.settings { background-image: url('../images/icons/cog_edit.png')}
1715 #summary-menu-stats a.feed { background-image: url('../images/icons/rss_16.png')}
1717 #summary-menu-stats a.feed { background-image: url('../images/icons/rss_16.png')}
1716 #summary-menu-stats a.repo-size { background-image: url('../images/icons/server.png')}
1718 #summary-menu-stats a.repo-size { background-image: url('../images/icons/server.png')}
1717
1719
1718 #summary-menu-stats a {
1720 #summary-menu-stats a {
1719 display: block;
1721 display: block;
1720 padding: 12px 30px;
1722 padding: 12px 30px;
1721 background-repeat: no-repeat;
1723 background-repeat: no-repeat;
1722 background-position: 10px 50%;
1724 background-position: 10px 50%;
1723 padding-right: 10px;
1725 padding-right: 10px;
1724 }
1726 }
1725
1727
1726 #repo_size_2.loaded {
1728 #repo_size_2.loaded {
1727 margin-left: 30px;
1729 margin-left: 30px;
1728 display: block;
1730 display: block;
1729 padding-right: 10px;
1731 padding-right: 10px;
1730 padding-bottom: 7px;
1732 padding-bottom: 7px;
1731 }
1733 }
1732
1734
1733 #summary-menu-stats a:hover {
1735 #summary-menu-stats a:hover {
1734 text-decoration: none;
1736 text-decoration: none;
1735 }
1737 }
1736
1738
1737 #summary-menu-stats a span {
1739 #summary-menu-stats a span {
1738 background-color: #DEDEDE;
1740 background-color: #DEDEDE;
1739 color: 888 !important;
1741 color: 888 !important;
1740 border-radius: 4px;
1742 border-radius: 4px;
1741 padding: 2px 4px;
1743 padding: 2px 4px;
1742 font-size: 10px;
1744 font-size: 10px;
1743 }
1745 }
1744
1746
1745 #summary .metatag {
1747 #summary .metatag {
1746 display: inline-block;
1748 display: inline-block;
1747 padding: 3px 5px;
1749 padding: 3px 5px;
1748 margin-bottom: 3px;
1750 margin-bottom: 3px;
1749 margin-right: 1px;
1751 margin-right: 1px;
1750 border-radius: 5px;
1752 border-radius: 5px;
1751 }
1753 }
1752
1754
1753 #content div.box #summary p {
1755 #content div.box #summary p {
1754 margin-bottom: -5px;
1756 margin-bottom: -5px;
1755 width: 600px;
1757 width: 600px;
1756 white-space: pre-wrap;
1758 white-space: pre-wrap;
1757 }
1759 }
1758
1760
1759 #content div.box #summary p:last-child {
1761 #content div.box #summary p:last-child {
1760 margin-bottom: 9px;
1762 margin-bottom: 9px;
1761 }
1763 }
1762
1764
1763 #content div.box #summary p:first-of-type {
1765 #content div.box #summary p:first-of-type {
1764 margin-top: 9px;
1766 margin-top: 9px;
1765 }
1767 }
1766
1768
1767 .metatag {
1769 .metatag {
1768 display: inline-block;
1770 display: inline-block;
1769 margin-right: 1px;
1771 margin-right: 1px;
1770 -webkit-border-radius: 4px 4px 4px 4px;
1772 -webkit-border-radius: 4px 4px 4px 4px;
1771 -khtml-border-radius: 4px 4px 4px 4px;
1773 -khtml-border-radius: 4px 4px 4px 4px;
1772 border-radius: 4px 4px 4px 4px;
1774 border-radius: 4px 4px 4px 4px;
1773
1775
1774 border: solid 1px #9CF;
1776 border: solid 1px #9CF;
1775 padding: 2px 3px 2px 3px !important;
1777 padding: 2px 3px 2px 3px !important;
1776 background-color: #DEF;
1778 background-color: #DEF;
1777 }
1779 }
1778
1780
1779 .metatag[tag="dead"] {
1781 .metatag[tag="dead"] {
1780 background-color: #E44;
1782 background-color: #E44;
1781 }
1783 }
1782
1784
1783 .metatag[tag="stale"] {
1785 .metatag[tag="stale"] {
1784 background-color: #EA4;
1786 background-color: #EA4;
1785 }
1787 }
1786
1788
1787 .metatag[tag="featured"] {
1789 .metatag[tag="featured"] {
1788 background-color: #AEA;
1790 background-color: #AEA;
1789 }
1791 }
1790
1792
1791 .metatag[tag="requires"] {
1793 .metatag[tag="requires"] {
1792 background-color: #9CF;
1794 background-color: #9CF;
1793 }
1795 }
1794
1796
1795 .metatag[tag="recommends"] {
1797 .metatag[tag="recommends"] {
1796 background-color: #BDF;
1798 background-color: #BDF;
1797 }
1799 }
1798
1800
1799 .metatag[tag="lang"] {
1801 .metatag[tag="lang"] {
1800 background-color: #FAF474;
1802 background-color: #FAF474;
1801 }
1803 }
1802
1804
1803 .metatag[tag="license"] {
1805 .metatag[tag="license"] {
1804 border: solid 1px #9CF;
1806 border: solid 1px #9CF;
1805 background-color: #DEF;
1807 background-color: #DEF;
1806 target-new: tab !important;
1808 target-new: tab !important;
1807 }
1809 }
1808 .metatag[tag="see"] {
1810 .metatag[tag="see"] {
1809 border: solid 1px #CBD;
1811 border: solid 1px #CBD;
1810 background-color: #EDF;
1812 background-color: #EDF;
1811 }
1813 }
1812
1814
1813 a.metatag[tag="license"]:hover {
1815 a.metatag[tag="license"]:hover {
1814 background-color: #003367;
1816 background-color: #003367;
1815 color: #FFF;
1817 color: #FFF;
1816 text-decoration: none;
1818 text-decoration: none;
1817 }
1819 }
1818
1820
1819 #summary .desc {
1821 #summary .desc {
1820 white-space: pre;
1822 white-space: pre;
1821 width: 100%;
1823 width: 100%;
1822 }
1824 }
1823
1825
1824 #summary .repo_name {
1826 #summary .repo_name {
1825 font-size: 1.6em;
1827 font-size: 1.6em;
1826 font-weight: bold;
1828 font-weight: bold;
1827 vertical-align: baseline;
1829 vertical-align: baseline;
1828 clear: right
1830 clear: right
1829 }
1831 }
1830
1832
1831 #footer {
1833 #footer {
1832 clear: both;
1834 clear: both;
1833 overflow: hidden;
1835 overflow: hidden;
1834 text-align: right;
1836 text-align: right;
1835 margin: 0;
1837 margin: 0;
1836 padding: 0 10px 4px;
1838 padding: 0 10px 4px;
1837 margin: -10px 0 0;
1839 margin: -10px 0 0;
1838 }
1840 }
1839
1841
1840 #footer div#footer-inner {
1842 #footer div#footer-inner {
1841 background-color: #003B76;
1843 background-color: #003B76;
1842 background-repeat: repeat-x;
1844 background-repeat: repeat-x;
1843 background-image: -khtml-gradient( linear, left top, left bottom, from(#003B76), to(#00376E));
1845 background-image: -khtml-gradient( linear, left top, left bottom, from(#003B76), to(#00376E));
1844 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1846 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1845 background-image: -ms-linear-gradient( top, #003b76, #00376e);
1847 background-image: -ms-linear-gradient( top, #003b76, #00376e);
1846 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1848 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1847 background-image: -webkit-linear-gradient( top, #003b76, #00376e));
1849 background-image: -webkit-linear-gradient( top, #003b76, #00376e));
1848 background-image: -o-linear-gradient( top, #003b76, #00376e));
1850 background-image: -o-linear-gradient( top, #003b76, #00376e));
1849 background-image: linear-gradient(to bottom, #003b76, #00376e);
1851 background-image: linear-gradient(to bottom, #003b76, #00376e);
1850 filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#003b76', endColorstr = '#00376e', GradientType = 0);
1852 filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#003b76', endColorstr = '#00376e', GradientType = 0);
1851 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1853 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1852 -webkit-border-radius: 4px 4px 4px 4px;
1854 -webkit-border-radius: 4px 4px 4px 4px;
1853 -khtml-border-radius: 4px 4px 4px 4px;
1855 -khtml-border-radius: 4px 4px 4px 4px;
1854 border-radius: 4px 4px 4px 4px;
1856 border-radius: 4px 4px 4px 4px;
1855 }
1857 }
1856
1858
1857 #footer div#footer-inner p {
1859 #footer div#footer-inner p {
1858 padding: 15px 25px 15px 0;
1860 padding: 15px 25px 15px 0;
1859 color: #FFF;
1861 color: #FFF;
1860 font-weight: 700;
1862 font-weight: 700;
1861 }
1863 }
1862
1864
1863 #footer div#footer-inner .footer-link {
1865 #footer div#footer-inner .footer-link {
1864 float: left;
1866 float: left;
1865 padding-left: 10px;
1867 padding-left: 10px;
1866 }
1868 }
1867
1869
1868 #footer div#footer-inner .footer-link a, #footer div#footer-inner .footer-link-right a {
1870 #footer div#footer-inner .footer-link a, #footer div#footer-inner .footer-link-right a {
1869 color: #FFF;
1871 color: #FFF;
1870 }
1872 }
1871
1873
1872 #login div.title {
1874 #login div.title {
1873 clear: both;
1875 clear: both;
1874 overflow: hidden;
1876 overflow: hidden;
1875 position: relative;
1877 position: relative;
1876 background-color: #003B76;
1878 background-color: #003B76;
1877 background-repeat: repeat-x;
1879 background-repeat: repeat-x;
1878 background-image: -khtml-gradient( linear, left top, left bottom, from(#003B76), to(#00376E));
1880 background-image: -khtml-gradient( linear, left top, left bottom, from(#003B76), to(#00376E));
1879 background-image: -moz-linear-gradient( top, #003b76, #00376e);
1881 background-image: -moz-linear-gradient( top, #003b76, #00376e);
1880 background-image: -ms-linear-gradient( top, #003b76, #00376e);
1882 background-image: -ms-linear-gradient( top, #003b76, #00376e);
1881 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1883 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1882 background-image: -webkit-linear-gradient( top, #003b76, #00376e));
1884 background-image: -webkit-linear-gradient( top, #003b76, #00376e));
1883 background-image: -o-linear-gradient( top, #003b76, #00376e));
1885 background-image: -o-linear-gradient( top, #003b76, #00376e));
1884 background-image: linear-gradient(to bottom, #003b76, #00376e);
1886 background-image: linear-gradient(to bottom, #003b76, #00376e);
1885 filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#003b76', endColorstr = '#00376e', GradientType = 0);
1887 filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#003b76', endColorstr = '#00376e', GradientType = 0);
1886 margin: 0 auto;
1888 margin: 0 auto;
1887 padding: 0;
1889 padding: 0;
1888 }
1890 }
1889
1891
1890 #login div.inner {
1892 #login div.inner {
1891 background: #FFF url("../images/login.png") no-repeat top left;
1893 background: #FFF url("../images/login.png") no-repeat top left;
1892 border-top: none;
1894 border-top: none;
1893 border-bottom: none;
1895 border-bottom: none;
1894 margin: 0 auto;
1896 margin: 0 auto;
1895 padding: 20px;
1897 padding: 20px;
1896 }
1898 }
1897
1899
1898 #login div.form div.fields div.field div.label {
1900 #login div.form div.fields div.field div.label {
1899 width: 173px;
1901 width: 173px;
1900 float: left;
1902 float: left;
1901 text-align: right;
1903 text-align: right;
1902 margin: 2px 10px 0 0;
1904 margin: 2px 10px 0 0;
1903 padding: 5px 0 0 5px;
1905 padding: 5px 0 0 5px;
1904 }
1906 }
1905
1907
1906 #login div.form div.fields div.field div.input input {
1908 #login div.form div.fields div.field div.input input {
1907 background: #FFF;
1909 background: #FFF;
1908 border-top: 1px solid #b3b3b3;
1910 border-top: 1px solid #b3b3b3;
1909 border-left: 1px solid #b3b3b3;
1911 border-left: 1px solid #b3b3b3;
1910 border-right: 1px solid #eaeaea;
1912 border-right: 1px solid #eaeaea;
1911 border-bottom: 1px solid #eaeaea;
1913 border-bottom: 1px solid #eaeaea;
1912 color: #000;
1914 color: #000;
1913 font-size: 11px;
1915 font-size: 11px;
1914 margin: 0;
1916 margin: 0;
1915 padding: 7px 7px 6px;
1917 padding: 7px 7px 6px;
1916 }
1918 }
1917
1919
1918 #login div.form div.fields div.buttons {
1920 #login div.form div.fields div.buttons {
1919 clear: both;
1921 clear: both;
1920 overflow: hidden;
1922 overflow: hidden;
1921 border-top: 1px solid #DDD;
1923 border-top: 1px solid #DDD;
1922 text-align: right;
1924 text-align: right;
1923 margin: 0;
1925 margin: 0;
1924 padding: 10px 0 0;
1926 padding: 10px 0 0;
1925 }
1927 }
1926
1928
1927 #login div.form div.links {
1929 #login div.form div.links {
1928 clear: both;
1930 clear: both;
1929 overflow: hidden;
1931 overflow: hidden;
1930 margin: 10px 0 0;
1932 margin: 10px 0 0;
1931 padding: 0 0 2px;
1933 padding: 0 0 2px;
1932 }
1934 }
1933
1935
1934 .user-menu {
1936 .user-menu {
1935 margin: 0px !important;
1937 margin: 0px !important;
1936 float: left;
1938 float: left;
1937 }
1939 }
1938
1940
1939 .user-menu .container {
1941 .user-menu .container {
1940 padding: 0px 4px 0px 4px;
1942 padding: 0px 4px 0px 4px;
1941 margin: 0px 0px 0px 0px;
1943 margin: 0px 0px 0px 0px;
1942 }
1944 }
1943
1945
1944 .user-menu .gravatar {
1946 .user-menu .gravatar {
1945 margin: 0px 0px 0px 0px;
1947 margin: 0px 0px 0px 0px;
1946 cursor: pointer;
1948 cursor: pointer;
1947 }
1949 }
1948 .user-menu .gravatar.enabled {
1950 .user-menu .gravatar.enabled {
1949 background-color: #FDF784 !important;
1951 background-color: #FDF784 !important;
1950 }
1952 }
1951 .user-menu .gravatar:hover {
1953 .user-menu .gravatar:hover {
1952 background-color: #FDF784 !important;
1954 background-color: #FDF784 !important;
1953 }
1955 }
1954 #quick_login {
1956 #quick_login {
1955 min-height: 110px;
1957 min-height: 110px;
1956 padding: 4px;
1958 padding: 4px;
1957 position: absolute;
1959 position: absolute;
1958 right: 0;
1960 right: 0;
1959 background-color: #003B76;
1961 background-color: #003B76;
1960 background-repeat: repeat-x;
1962 background-repeat: repeat-x;
1961 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
1963 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
1962 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1964 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1963 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1965 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1964 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1966 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1965 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1967 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1966 background-image: -o-linear-gradient(top, #003b76, #00376e);
1968 background-image: -o-linear-gradient(top, #003b76, #00376e);
1967 background-image: linear-gradient(to bottom, #003b76, #00376e);
1969 background-image: linear-gradient(to bottom, #003b76, #00376e);
1968 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
1970 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
1969
1971
1970 z-index: 999;
1972 z-index: 999;
1971 -webkit-border-radius: 0px 0px 4px 4px;
1973 -webkit-border-radius: 0px 0px 4px 4px;
1972 -khtml-border-radius: 0px 0px 4px 4px;
1974 -khtml-border-radius: 0px 0px 4px 4px;
1973 border-radius: 0px 0px 4px 4px;
1975 border-radius: 0px 0px 4px 4px;
1974 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1976 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1975
1977
1976 overflow: hidden;
1978 overflow: hidden;
1977 }
1979 }
1978 #quick_login h4 {
1980 #quick_login h4 {
1979 color: #fff;
1981 color: #fff;
1980 padding: 5px 0px 5px 14px;
1982 padding: 5px 0px 5px 14px;
1981 }
1983 }
1982
1984
1983 #quick_login .password_forgoten {
1985 #quick_login .password_forgoten {
1984 padding-right: 0px;
1986 padding-right: 0px;
1985 padding-top: 0px;
1987 padding-top: 0px;
1986 text-align: left;
1988 text-align: left;
1987 }
1989 }
1988
1990
1989 #quick_login .password_forgoten a {
1991 #quick_login .password_forgoten a {
1990 font-size: 10px;
1992 font-size: 10px;
1991 color: #fff;
1993 color: #fff;
1992 padding: 0px !important;
1994 padding: 0px !important;
1993 line-height: 20px !important;
1995 line-height: 20px !important;
1994 }
1996 }
1995
1997
1996 #quick_login .register {
1998 #quick_login .register {
1997 padding-right: 10px;
1999 padding-right: 10px;
1998 padding-top: 5px;
2000 padding-top: 5px;
1999 text-align: left;
2001 text-align: left;
2000 }
2002 }
2001
2003
2002 #quick_login .register a {
2004 #quick_login .register a {
2003 font-size: 10px;
2005 font-size: 10px;
2004 color: #fff;
2006 color: #fff;
2005 padding: 0px !important;
2007 padding: 0px !important;
2006 line-height: 20px !important;
2008 line-height: 20px !important;
2007 }
2009 }
2008
2010
2009 #quick_login .submit {
2011 #quick_login .submit {
2010 margin: -20px 0 0 0px;
2012 margin: -20px 0 0 0px;
2011 position: absolute;
2013 position: absolute;
2012 right: 15px;
2014 right: 15px;
2013 }
2015 }
2014
2016
2015 #quick_login .links_left {
2017 #quick_login .links_left {
2016 float: left;
2018 float: left;
2017 margin-right: 130px;
2019 margin-right: 130px;
2018 width: 170px;
2020 width: 170px;
2019 }
2021 }
2020 #quick_login .links_right {
2022 #quick_login .links_right {
2021
2023
2022 position: absolute;
2024 position: absolute;
2023 right: 0;
2025 right: 0;
2024 }
2026 }
2025 #quick_login .full_name {
2027 #quick_login .full_name {
2026 color: #FFFFFF;
2028 color: #FFFFFF;
2027 font-weight: bold;
2029 font-weight: bold;
2028 padding: 3px 3px 3px 6px;
2030 padding: 3px 3px 3px 6px;
2029 }
2031 }
2030 #quick_login .big_gravatar {
2032 #quick_login .big_gravatar {
2031 padding: 4px 0px 0px 6px;
2033 padding: 4px 0px 0px 6px;
2032 }
2034 }
2033 #quick_login .notifications {
2035 #quick_login .notifications {
2034 padding: 2px 0px 0px 6px;
2036 padding: 2px 0px 0px 6px;
2035 color: #FFFFFF;
2037 color: #FFFFFF;
2036 font-weight: bold;
2038 font-weight: bold;
2037 line-height: 10px !important;
2039 line-height: 10px !important;
2038 }
2040 }
2039 #quick_login .notifications a,
2041 #quick_login .notifications a,
2040 #quick_login .unread a {
2042 #quick_login .unread a {
2041 color: #FFFFFF;
2043 color: #FFFFFF;
2042 display: block;
2044 display: block;
2043 padding: 0px !important;
2045 padding: 0px !important;
2044 }
2046 }
2045 #quick_login .notifications a:hover,
2047 #quick_login .notifications a:hover,
2046 #quick_login .unread a:hover {
2048 #quick_login .unread a:hover {
2047 background-color: inherit !important;
2049 background-color: inherit !important;
2048 }
2050 }
2049 #quick_login .email, #quick_login .unread {
2051 #quick_login .email, #quick_login .unread {
2050 color: #FFFFFF;
2052 color: #FFFFFF;
2051 padding: 3px 3px 3px 6px;
2053 padding: 3px 3px 3px 6px;
2052 }
2054 }
2053 #quick_login .links .logout {
2055 #quick_login .links .logout {
2054 }
2056 }
2055
2057
2056 #quick_login div.form div.fields {
2058 #quick_login div.form div.fields {
2057 padding-top: 2px;
2059 padding-top: 2px;
2058 padding-left: 10px;
2060 padding-left: 10px;
2059 }
2061 }
2060
2062
2061 #quick_login div.form div.fields div.field {
2063 #quick_login div.form div.fields div.field {
2062 padding: 5px;
2064 padding: 5px;
2063 }
2065 }
2064
2066
2065 #quick_login div.form div.fields div.field div.label label {
2067 #quick_login div.form div.fields div.field div.label label {
2066 color: #fff;
2068 color: #fff;
2067 padding-bottom: 3px;
2069 padding-bottom: 3px;
2068 }
2070 }
2069
2071
2070 #quick_login div.form div.fields div.field div.input input {
2072 #quick_login div.form div.fields div.field div.input input {
2071 width: 236px;
2073 width: 236px;
2072 background: #FFF;
2074 background: #FFF;
2073 border-top: 1px solid #b3b3b3;
2075 border-top: 1px solid #b3b3b3;
2074 border-left: 1px solid #b3b3b3;
2076 border-left: 1px solid #b3b3b3;
2075 border-right: 1px solid #eaeaea;
2077 border-right: 1px solid #eaeaea;
2076 border-bottom: 1px solid #eaeaea;
2078 border-bottom: 1px solid #eaeaea;
2077 color: #000;
2079 color: #000;
2078 font-size: 11px;
2080 font-size: 11px;
2079 margin: 0;
2081 margin: 0;
2080 padding: 5px 7px 4px;
2082 padding: 5px 7px 4px;
2081 }
2083 }
2082
2084
2083 #quick_login div.form div.fields div.buttons {
2085 #quick_login div.form div.fields div.buttons {
2084 clear: both;
2086 clear: both;
2085 overflow: hidden;
2087 overflow: hidden;
2086 text-align: right;
2088 text-align: right;
2087 margin: 0;
2089 margin: 0;
2088 padding: 5px 14px 0px 5px;
2090 padding: 5px 14px 0px 5px;
2089 }
2091 }
2090
2092
2091 #quick_login div.form div.links {
2093 #quick_login div.form div.links {
2092 clear: both;
2094 clear: both;
2093 overflow: hidden;
2095 overflow: hidden;
2094 margin: 10px 0 0;
2096 margin: 10px 0 0;
2095 padding: 0 0 2px;
2097 padding: 0 0 2px;
2096 }
2098 }
2097
2099
2098 #quick_login ol.links {
2100 #quick_login ol.links {
2099 display: block;
2101 display: block;
2100 font-weight: bold;
2102 font-weight: bold;
2101 list-style: none outside none;
2103 list-style: none outside none;
2102 text-align: right;
2104 text-align: right;
2103 }
2105 }
2104 #quick_login ol.links li {
2106 #quick_login ol.links li {
2105 line-height: 27px;
2107 line-height: 27px;
2106 margin: 0;
2108 margin: 0;
2107 padding: 0;
2109 padding: 0;
2108 color: #fff;
2110 color: #fff;
2109 display: block;
2111 display: block;
2110 float: none !important;
2112 float: none !important;
2111 }
2113 }
2112
2114
2113 #quick_login ol.links li a {
2115 #quick_login ol.links li a {
2114 color: #fff;
2116 color: #fff;
2115 display: block;
2117 display: block;
2116 padding: 2px;
2118 padding: 2px;
2117 }
2119 }
2118 #quick_login ol.links li a:HOVER {
2120 #quick_login ol.links li a:HOVER {
2119 background-color: inherit !important;
2121 background-color: inherit !important;
2120 }
2122 }
2121
2123
2122 #register div.title {
2124 #register div.title {
2123 clear: both;
2125 clear: both;
2124 overflow: hidden;
2126 overflow: hidden;
2125 position: relative;
2127 position: relative;
2126 background-color: #003B76;
2128 background-color: #003B76;
2127 background-repeat: repeat-x;
2129 background-repeat: repeat-x;
2128 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
2130 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
2129 background-image: -moz-linear-gradient(top, #003b76, #00376e);
2131 background-image: -moz-linear-gradient(top, #003b76, #00376e);
2130 background-image: -ms-linear-gradient(top, #003b76, #00376e);
2132 background-image: -ms-linear-gradient(top, #003b76, #00376e);
2131 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
2133 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
2132 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
2134 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
2133 background-image: -o-linear-gradient(top, #003b76, #00376e);
2135 background-image: -o-linear-gradient(top, #003b76, #00376e);
2134 background-image: linear-gradient(to bottom, #003b76, #00376e);
2136 background-image: linear-gradient(to bottom, #003b76, #00376e);
2135 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
2137 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
2136 endColorstr='#00376e', GradientType=0 );
2138 endColorstr='#00376e', GradientType=0 );
2137 margin: 0 auto;
2139 margin: 0 auto;
2138 padding: 0;
2140 padding: 0;
2139 }
2141 }
2140
2142
2141 #register div.inner {
2143 #register div.inner {
2142 background: #FFF;
2144 background: #FFF;
2143 border-top: none;
2145 border-top: none;
2144 border-bottom: none;
2146 border-bottom: none;
2145 margin: 0 auto;
2147 margin: 0 auto;
2146 padding: 20px;
2148 padding: 20px;
2147 }
2149 }
2148
2150
2149 #register div.form div.fields div.field div.label {
2151 #register div.form div.fields div.field div.label {
2150 width: 135px;
2152 width: 135px;
2151 float: left;
2153 float: left;
2152 text-align: right;
2154 text-align: right;
2153 margin: 2px 10px 0 0;
2155 margin: 2px 10px 0 0;
2154 padding: 5px 0 0 5px;
2156 padding: 5px 0 0 5px;
2155 }
2157 }
2156
2158
2157 #register div.form div.fields div.field div.input input {
2159 #register div.form div.fields div.field div.input input {
2158 width: 300px;
2160 width: 300px;
2159 background: #FFF;
2161 background: #FFF;
2160 border-top: 1px solid #b3b3b3;
2162 border-top: 1px solid #b3b3b3;
2161 border-left: 1px solid #b3b3b3;
2163 border-left: 1px solid #b3b3b3;
2162 border-right: 1px solid #eaeaea;
2164 border-right: 1px solid #eaeaea;
2163 border-bottom: 1px solid #eaeaea;
2165 border-bottom: 1px solid #eaeaea;
2164 color: #000;
2166 color: #000;
2165 font-size: 11px;
2167 font-size: 11px;
2166 margin: 0;
2168 margin: 0;
2167 padding: 7px 7px 6px;
2169 padding: 7px 7px 6px;
2168 }
2170 }
2169
2171
2170 #register div.form div.fields div.buttons {
2172 #register div.form div.fields div.buttons {
2171 clear: both;
2173 clear: both;
2172 overflow: hidden;
2174 overflow: hidden;
2173 border-top: 1px solid #DDD;
2175 border-top: 1px solid #DDD;
2174 text-align: left;
2176 text-align: left;
2175 margin: 0;
2177 margin: 0;
2176 padding: 10px 0 0 150px;
2178 padding: 10px 0 0 150px;
2177 }
2179 }
2178
2180
2179 #register div.form div.activation_msg {
2181 #register div.form div.activation_msg {
2180 padding-top: 4px;
2182 padding-top: 4px;
2181 padding-bottom: 4px;
2183 padding-bottom: 4px;
2182 }
2184 }
2183
2185
2184 #journal .journal_day {
2186 #journal .journal_day {
2185 font-size: 20px;
2187 font-size: 20px;
2186 padding: 10px 0px;
2188 padding: 10px 0px;
2187 border-bottom: 2px solid #DDD;
2189 border-bottom: 2px solid #DDD;
2188 margin-left: 10px;
2190 margin-left: 10px;
2189 margin-right: 10px;
2191 margin-right: 10px;
2190 }
2192 }
2191
2193
2192 #journal .journal_container {
2194 #journal .journal_container {
2193 padding: 5px;
2195 padding: 5px;
2194 clear: both;
2196 clear: both;
2195 margin: 0px 5px 0px 10px;
2197 margin: 0px 5px 0px 10px;
2196 }
2198 }
2197
2199
2198 #journal .journal_action_container {
2200 #journal .journal_action_container {
2199 padding-left: 38px;
2201 padding-left: 38px;
2200 }
2202 }
2201
2203
2202 #journal .journal_user {
2204 #journal .journal_user {
2203 color: #747474;
2205 color: #747474;
2204 font-size: 14px;
2206 font-size: 14px;
2205 font-weight: bold;
2207 font-weight: bold;
2206 height: 30px;
2208 height: 30px;
2207 }
2209 }
2208
2210
2209 #journal .journal_user.deleted {
2211 #journal .journal_user.deleted {
2210 color: #747474;
2212 color: #747474;
2211 font-size: 14px;
2213 font-size: 14px;
2212 font-weight: normal;
2214 font-weight: normal;
2213 height: 30px;
2215 height: 30px;
2214 font-style: italic;
2216 font-style: italic;
2215 }
2217 }
2216
2218
2217
2219
2218 #journal .journal_icon {
2220 #journal .journal_icon {
2219 clear: both;
2221 clear: both;
2220 float: left;
2222 float: left;
2221 padding-right: 4px;
2223 padding-right: 4px;
2222 padding-top: 3px;
2224 padding-top: 3px;
2223 }
2225 }
2224
2226
2225 #journal .journal_action {
2227 #journal .journal_action {
2226 padding-top: 4px;
2228 padding-top: 4px;
2227 min-height: 2px;
2229 min-height: 2px;
2228 float: left
2230 float: left
2229 }
2231 }
2230
2232
2231 #journal .journal_action_params {
2233 #journal .journal_action_params {
2232 clear: left;
2234 clear: left;
2233 padding-left: 22px;
2235 padding-left: 22px;
2234 }
2236 }
2235
2237
2236 #journal .journal_repo {
2238 #journal .journal_repo {
2237 float: left;
2239 float: left;
2238 margin-left: 6px;
2240 margin-left: 6px;
2239 padding-top: 3px;
2241 padding-top: 3px;
2240 }
2242 }
2241
2243
2242 #journal .date {
2244 #journal .date {
2243 clear: both;
2245 clear: both;
2244 color: #777777;
2246 color: #777777;
2245 font-size: 11px;
2247 font-size: 11px;
2246 padding-left: 22px;
2248 padding-left: 22px;
2247 }
2249 }
2248
2250
2249 #journal .journal_repo .journal_repo_name {
2251 #journal .journal_repo .journal_repo_name {
2250 font-weight: bold;
2252 font-weight: bold;
2251 font-size: 1.1em;
2253 font-size: 1.1em;
2252 }
2254 }
2253
2255
2254 #journal .compare_view {
2256 #journal .compare_view {
2255 padding: 5px 0px 5px 0px;
2257 padding: 5px 0px 5px 0px;
2256 width: 95px;
2258 width: 95px;
2257 }
2259 }
2258
2260
2259 .journal_highlight {
2261 .journal_highlight {
2260 font-weight: bold;
2262 font-weight: bold;
2261 padding: 0 2px;
2263 padding: 0 2px;
2262 vertical-align: bottom;
2264 vertical-align: bottom;
2263 }
2265 }
2264
2266
2265 .trending_language_tbl, .trending_language_tbl td {
2267 .trending_language_tbl, .trending_language_tbl td {
2266 border: 0 !important;
2268 border: 0 !important;
2267 margin: 0 !important;
2269 margin: 0 !important;
2268 padding: 0 !important;
2270 padding: 0 !important;
2269 }
2271 }
2270
2272
2271 .trending_language_tbl, .trending_language_tbl tr {
2273 .trending_language_tbl, .trending_language_tbl tr {
2272 border-spacing: 1px;
2274 border-spacing: 1px;
2273 }
2275 }
2274
2276
2275 .trending_language {
2277 .trending_language {
2276 background-color: #003367;
2278 background-color: #003367;
2277 color: #FFF;
2279 color: #FFF;
2278 display: block;
2280 display: block;
2279 min-width: 20px;
2281 min-width: 20px;
2280 text-decoration: none;
2282 text-decoration: none;
2281 height: 12px;
2283 height: 12px;
2282 margin-bottom: 0px;
2284 margin-bottom: 0px;
2283 margin-left: 5px;
2285 margin-left: 5px;
2284 white-space: pre;
2286 white-space: pre;
2285 padding: 3px;
2287 padding: 3px;
2286 }
2288 }
2287
2289
2288 h3.files_location {
2290 h3.files_location {
2289 font-size: 1.8em;
2291 font-size: 1.8em;
2290 font-weight: 700;
2292 font-weight: 700;
2291 border-bottom: none !important;
2293 border-bottom: none !important;
2292 margin: 10px 0 !important;
2294 margin: 10px 0 !important;
2293 }
2295 }
2294
2296
2295 #files_data dl dt {
2297 #files_data dl dt {
2296 float: left;
2298 float: left;
2297 width: 60px;
2299 width: 60px;
2298 margin: 0 !important;
2300 margin: 0 !important;
2299 padding: 5px;
2301 padding: 5px;
2300 }
2302 }
2301
2303
2302 #files_data dl dd {
2304 #files_data dl dd {
2303 margin: 0 !important;
2305 margin: 0 !important;
2304 padding: 5px !important;
2306 padding: 5px !important;
2305 }
2307 }
2306
2308
2307 .file_history {
2309 .file_history {
2308 padding-top: 10px;
2310 padding-top: 10px;
2309 font-size: 16px;
2311 font-size: 16px;
2310 }
2312 }
2311 .file_author {
2313 .file_author {
2312 float: left;
2314 float: left;
2313 }
2315 }
2314
2316
2315 .file_author .item {
2317 .file_author .item {
2316 float: left;
2318 float: left;
2317 padding: 5px;
2319 padding: 5px;
2318 color: #888;
2320 color: #888;
2319 }
2321 }
2320
2322
2321 .tablerow0 {
2323 .tablerow0 {
2322 background-color: #F8F8F8;
2324 background-color: #F8F8F8;
2323 }
2325 }
2324
2326
2325 .tablerow1 {
2327 .tablerow1 {
2326 background-color: #FFFFFF;
2328 background-color: #FFFFFF;
2327 }
2329 }
2328
2330
2329 .changeset_id {
2331 .changeset_id {
2330 color: #666666;
2332 color: #666666;
2331 margin-right: -3px;
2333 margin-right: -3px;
2332 }
2334 }
2333
2335
2334 .changeset_hash {
2336 .changeset_hash {
2335 color: #000000;
2337 color: #000000;
2336 }
2338 }
2337
2339
2338 #changeset_content {
2340 #changeset_content {
2339 border-left: 1px solid #CCC;
2341 border-left: 1px solid #CCC;
2340 border-right: 1px solid #CCC;
2342 border-right: 1px solid #CCC;
2341 border-bottom: 1px solid #CCC;
2343 border-bottom: 1px solid #CCC;
2342 padding: 5px;
2344 padding: 5px;
2343 }
2345 }
2344
2346
2345 #changeset_compare_view_content {
2347 #changeset_compare_view_content {
2346 border: 1px solid #CCC;
2348 border: 1px solid #CCC;
2347 padding: 5px;
2349 padding: 5px;
2348 }
2350 }
2349
2351
2350 #changeset_content .container {
2352 #changeset_content .container {
2351 min-height: 100px;
2353 min-height: 100px;
2352 font-size: 1.2em;
2354 font-size: 1.2em;
2353 overflow: hidden;
2355 overflow: hidden;
2354 }
2356 }
2355
2357
2356 #changeset_compare_view_content .compare_view_commits {
2358 #changeset_compare_view_content .compare_view_commits {
2357 width: auto !important;
2359 width: auto !important;
2358 }
2360 }
2359
2361
2360 #changeset_compare_view_content .compare_view_commits td {
2362 #changeset_compare_view_content .compare_view_commits td {
2361 padding: 0px 0px 0px 12px !important;
2363 padding: 0px 0px 0px 12px !important;
2362 }
2364 }
2363
2365
2364 #changeset_content .container .right {
2366 #changeset_content .container .right {
2365 float: right;
2367 float: right;
2366 width: 20%;
2368 width: 20%;
2367 text-align: right;
2369 text-align: right;
2368 }
2370 }
2369
2371
2370 #changeset_content .container .message {
2372 #changeset_content .container .message {
2371 white-space: pre-wrap;
2373 white-space: pre-wrap;
2372 }
2374 }
2373 #changeset_content .container .message a:hover {
2375 #changeset_content .container .message a:hover {
2374 text-decoration: none;
2376 text-decoration: none;
2375 }
2377 }
2376 .cs_files .cur_cs {
2378 .cs_files .cur_cs {
2377 margin: 10px 2px;
2379 margin: 10px 2px;
2378 font-weight: bold;
2380 font-weight: bold;
2379 }
2381 }
2380
2382
2381 .cs_files .node {
2383 .cs_files .node {
2382 float: left;
2384 float: left;
2383 }
2385 }
2384
2386
2385 .cs_files .changes {
2387 .cs_files .changes {
2386 float: right;
2388 float: right;
2387 color: #003367;
2389 color: #003367;
2388 }
2390 }
2389
2391
2390 .cs_files .changes .added {
2392 .cs_files .changes .added {
2391 background-color: #BBFFBB;
2393 background-color: #BBFFBB;
2392 float: left;
2394 float: left;
2393 text-align: center;
2395 text-align: center;
2394 font-size: 9px;
2396 font-size: 9px;
2395 padding: 2px 0px 2px 0px;
2397 padding: 2px 0px 2px 0px;
2396 }
2398 }
2397
2399
2398 .cs_files .changes .deleted {
2400 .cs_files .changes .deleted {
2399 background-color: #FF8888;
2401 background-color: #FF8888;
2400 float: left;
2402 float: left;
2401 text-align: center;
2403 text-align: center;
2402 font-size: 9px;
2404 font-size: 9px;
2403 padding: 2px 0px 2px 0px;
2405 padding: 2px 0px 2px 0px;
2404 }
2406 }
2405 /*new binary*/
2407 /*new binary*/
2406 .cs_files .changes .bin1 {
2408 .cs_files .changes .bin1 {
2407 background-color: #BBFFBB;
2409 background-color: #BBFFBB;
2408 float: left;
2410 float: left;
2409 text-align: center;
2411 text-align: center;
2410 font-size: 9px;
2412 font-size: 9px;
2411 padding: 2px 0px 2px 0px;
2413 padding: 2px 0px 2px 0px;
2412 }
2414 }
2413
2415
2414 /*deleted binary*/
2416 /*deleted binary*/
2415 .cs_files .changes .bin2 {
2417 .cs_files .changes .bin2 {
2416 background-color: #FF8888;
2418 background-color: #FF8888;
2417 float: left;
2419 float: left;
2418 text-align: center;
2420 text-align: center;
2419 font-size: 9px;
2421 font-size: 9px;
2420 padding: 2px 0px 2px 0px;
2422 padding: 2px 0px 2px 0px;
2421 }
2423 }
2422
2424
2423 /*mod binary*/
2425 /*mod binary*/
2424 .cs_files .changes .bin3 {
2426 .cs_files .changes .bin3 {
2425 background-color: #DDDDDD;
2427 background-color: #DDDDDD;
2426 float: left;
2428 float: left;
2427 text-align: center;
2429 text-align: center;
2428 font-size: 9px;
2430 font-size: 9px;
2429 padding: 2px 0px 2px 0px;
2431 padding: 2px 0px 2px 0px;
2430 }
2432 }
2431
2433
2432 /*rename file*/
2434 /*rename file*/
2433 .cs_files .changes .bin4 {
2435 .cs_files .changes .bin4 {
2434 background-color: #6D99FF;
2436 background-color: #6D99FF;
2435 float: left;
2437 float: left;
2436 text-align: center;
2438 text-align: center;
2437 font-size: 9px;
2439 font-size: 9px;
2438 padding: 2px 0px 2px 0px;
2440 padding: 2px 0px 2px 0px;
2439 }
2441 }
2440
2442
2441
2443
2442 .cs_files .cs_added, .cs_files .cs_A {
2444 .cs_files .cs_added, .cs_files .cs_A {
2443 background: url("../images/icons/page_white_add.png") no-repeat scroll
2445 background: url("../images/icons/page_white_add.png") no-repeat scroll
2444 3px;
2446 3px;
2445 height: 16px;
2447 height: 16px;
2446 padding-left: 20px;
2448 padding-left: 20px;
2447 margin-top: 7px;
2449 margin-top: 7px;
2448 text-align: left;
2450 text-align: left;
2449 }
2451 }
2450
2452
2451 .cs_files .cs_changed, .cs_files .cs_M {
2453 .cs_files .cs_changed, .cs_files .cs_M {
2452 background: url("../images/icons/page_white_edit.png") no-repeat scroll
2454 background: url("../images/icons/page_white_edit.png") no-repeat scroll
2453 3px;
2455 3px;
2454 height: 16px;
2456 height: 16px;
2455 padding-left: 20px;
2457 padding-left: 20px;
2456 margin-top: 7px;
2458 margin-top: 7px;
2457 text-align: left;
2459 text-align: left;
2458 }
2460 }
2459
2461
2460 .cs_files .cs_removed, .cs_files .cs_D {
2462 .cs_files .cs_removed, .cs_files .cs_D {
2461 background: url("../images/icons/page_white_delete.png") no-repeat
2463 background: url("../images/icons/page_white_delete.png") no-repeat
2462 scroll 3px;
2464 scroll 3px;
2463 height: 16px;
2465 height: 16px;
2464 padding-left: 20px;
2466 padding-left: 20px;
2465 margin-top: 7px;
2467 margin-top: 7px;
2466 text-align: left;
2468 text-align: left;
2467 }
2469 }
2468
2470
2469 .table {
2471 .table {
2470 position: relative;
2472 position: relative;
2471 }
2473 }
2472
2474
2473 #graph {
2475 #graph {
2474 position: relative;
2476 position: relative;
2475 overflow: hidden;
2477 overflow: hidden;
2476 }
2478 }
2477
2479
2478 #graph_nodes {
2480 #graph_nodes {
2479 position: absolute;
2481 position: absolute;
2480 }
2482 }
2481
2483
2482 #graph_content,
2484 #graph_content,
2483 #graph .info_box,
2485 #graph .info_box,
2484 #graph .container_header {
2486 #graph .container_header {
2485 margin-left: 100px;
2487 margin-left: 100px;
2486 }
2488 }
2487
2489
2488 #graph_content {
2490 #graph_content {
2489 position: relative;
2491 position: relative;
2490 }
2492 }
2491
2493
2492 #graph .container_header {
2494 #graph .container_header {
2493 padding: 10px;
2495 padding: 10px;
2494 height: 25px;
2496 height: 25px;
2495 }
2497 }
2496
2498
2497 #graph_content #rev_range_container {
2499 #graph_content #rev_range_container {
2498 float: left;
2500 float: left;
2499 margin: 0px 0px 0px 3px;
2501 margin: 0px 0px 0px 3px;
2500 }
2502 }
2501
2503
2502 #graph_content #rev_range_clear {
2504 #graph_content #rev_range_clear {
2503 float: left;
2505 float: left;
2504 margin: 0px 0px 0px 3px;
2506 margin: 0px 0px 0px 3px;
2505 }
2507 }
2506
2508
2507 #graph_content #changesets {
2509 #graph_content #changesets {
2508 table-layout: fixed;
2510 table-layout: fixed;
2509 border-collapse: collapse;
2511 border-collapse: collapse;
2510 border-left: none;
2512 border-left: none;
2511 border-right: none;
2513 border-right: none;
2512 border-color: #cdcdcd;
2514 border-color: #cdcdcd;
2513 }
2515 }
2514
2516
2515 #graph_content #changesets td {
2517 #graph_content #changesets td {
2516 overflow: hidden;
2518 overflow: hidden;
2517 text-overflow: ellipsis;
2519 text-overflow: ellipsis;
2518 white-space: nowrap;
2520 white-space: nowrap;
2519 height: 31px;
2521 height: 31px;
2520 border-color: #cdcdcd;
2522 border-color: #cdcdcd;
2521 text-align: left;
2523 text-align: left;
2522 }
2524 }
2523
2525
2524 #graph_content .container .checkbox {
2526 #graph_content .container .checkbox {
2525 width: 12px;
2527 width: 12px;
2526 font-size: 0.85em;
2528 font-size: 0.85em;
2527 }
2529 }
2528
2530
2529 #graph_content .container .status {
2531 #graph_content .container .status {
2530 width: 14px;
2532 width: 14px;
2531 font-size: 0.85em;
2533 font-size: 0.85em;
2532 }
2534 }
2533
2535
2534 #graph_content .container .author {
2536 #graph_content .container .author {
2535 width: 105px;
2537 width: 105px;
2536 }
2538 }
2537
2539
2538 #graph_content .container .hash {
2540 #graph_content .container .hash {
2539 width: 100px;
2541 width: 100px;
2540 font-size: 0.85em;
2542 font-size: 0.85em;
2541 }
2543 }
2542
2544
2543 #graph_content #changesets .container .date {
2545 #graph_content #changesets .container .date {
2544 width: 76px;
2546 width: 76px;
2545 color: #666;
2547 color: #666;
2546 font-size: 10px;
2548 font-size: 10px;
2547 }
2549 }
2548
2550
2549 #graph_content #changesets .container .right {
2551 #graph_content #changesets .container .right {
2550 width: 120px;
2552 width: 120px;
2551 padding-right: 0px;
2553 padding-right: 0px;
2552 overflow: visible;
2554 overflow: visible;
2553 position: relative;
2555 position: relative;
2554 }
2556 }
2555
2557
2556 #graph_content .container .mid {
2558 #graph_content .container .mid {
2557 padding: 0;
2559 padding: 0;
2558 }
2560 }
2559
2561
2560 #graph_content .log-container {
2562 #graph_content .log-container {
2561 position: relative;
2563 position: relative;
2562 }
2564 }
2563
2565
2564 #graph_content .container .changeset_range {
2566 #graph_content .container .changeset_range {
2565 float: left;
2567 float: left;
2566 margin: 6px 3px;
2568 margin: 6px 3px;
2567 }
2569 }
2568
2570
2569 #graph_content .container .author img {
2571 #graph_content .container .author img {
2570 vertical-align: middle;
2572 vertical-align: middle;
2571 }
2573 }
2572
2574
2573 #graph_content .container .author .user {
2575 #graph_content .container .author .user {
2574 color: #444444;
2576 color: #444444;
2575 }
2577 }
2576
2578
2577 #graph_content .container .mid .message {
2579 #graph_content .container .mid .message {
2578 white-space: pre-wrap;
2580 white-space: pre-wrap;
2579 padding: 0;
2581 padding: 0;
2580 overflow: hidden;
2582 overflow: hidden;
2581 height: 1.1em;
2583 height: 1.1em;
2582 }
2584 }
2583
2585
2584 #graph_content .container .extra-container {
2586 #graph_content .container .extra-container {
2585 display: block;
2587 display: block;
2586 position: absolute;
2588 position: absolute;
2587 top: -15px;
2589 top: -15px;
2588 right: 0;
2590 right: 0;
2589 padding-left: 5px;
2591 padding-left: 5px;
2590 background: #FFFFFF;
2592 background: #FFFFFF;
2591 height: 41px;
2593 height: 41px;
2592 }
2594 }
2593
2595
2594 #graph_content .comments-container,
2596 #graph_content .comments-container,
2595 #graph_content .logtags {
2597 #graph_content .logtags {
2596 display: block;
2598 display: block;
2597 float: left;
2599 float: left;
2598 overflow: hidden;
2600 overflow: hidden;
2599 padding: 0;
2601 padding: 0;
2600 margin: 0;
2602 margin: 0;
2601 }
2603 }
2602
2604
2603 #graph_content .comments-container {
2605 #graph_content .comments-container {
2604 margin: 0.8em 0;
2606 margin: 0.8em 0;
2605 margin-right: 0.5em;
2607 margin-right: 0.5em;
2606 }
2608 }
2607
2609
2608 #graph_content .tagcontainer {
2610 #graph_content .tagcontainer {
2609 width: 80px;
2611 width: 80px;
2610 position: relative;
2612 position: relative;
2611 float: right;
2613 float: right;
2612 height: 100%;
2614 height: 100%;
2613 top: 7px;
2615 top: 7px;
2614 margin-left: 0.5em;
2616 margin-left: 0.5em;
2615 }
2617 }
2616
2618
2617 #graph_content .logtags {
2619 #graph_content .logtags {
2618 min-width: 80px;
2620 min-width: 80px;
2619 height: 1.1em;
2621 height: 1.1em;
2620 position: absolute;
2622 position: absolute;
2621 left: 0px;
2623 left: 0px;
2622 width: auto;
2624 width: auto;
2623 top: 0px;
2625 top: 0px;
2624 }
2626 }
2625
2627
2626 #graph_content .logtags.tags {
2628 #graph_content .logtags.tags {
2627 top: 14px;
2629 top: 14px;
2628 }
2630 }
2629
2631
2630 #graph_content .logtags:hover {
2632 #graph_content .logtags:hover {
2631 overflow: visible;
2633 overflow: visible;
2632 position: absolute;
2634 position: absolute;
2633 width: auto;
2635 width: auto;
2634 right: 0;
2636 right: 0;
2635 left: initial;
2637 left: initial;
2636 }
2638 }
2637
2639
2638 #graph_content .logtags .bookbook,
2640 #graph_content .logtags .bookbook,
2639 #graph_content .logtags .tagtag {
2641 #graph_content .logtags .tagtag {
2640 float: left;
2642 float: left;
2641 line-height: 1em;
2643 line-height: 1em;
2642 margin-bottom: 1px;
2644 margin-bottom: 1px;
2643 margin-right: 1px;
2645 margin-right: 1px;
2644 padding: 1px 3px;
2646 padding: 1px 3px;
2645 font-size: 10px;
2647 font-size: 10px;
2646 }
2648 }
2647
2649
2648 #graph_content .container .mid .message a:hover {
2650 #graph_content .container .mid .message a:hover {
2649 text-decoration: none;
2651 text-decoration: none;
2650 }
2652 }
2651
2653
2652 .revision-link {
2654 .revision-link {
2653 color: #3F6F9F;
2655 color: #3F6F9F;
2654 font-weight: bold !important;
2656 font-weight: bold !important;
2655 }
2657 }
2656
2658
2657 .issue-tracker-link {
2659 .issue-tracker-link {
2658 color: #3F6F9F;
2660 color: #3F6F9F;
2659 font-weight: bold !important;
2661 font-weight: bold !important;
2660 }
2662 }
2661
2663
2662 .changeset-status-container {
2664 .changeset-status-container {
2663 padding-right: 5px;
2665 padding-right: 5px;
2664 margin-top: 1px;
2666 margin-top: 1px;
2665 float: right;
2667 float: right;
2666 height: 14px;
2668 height: 14px;
2667 }
2669 }
2668 .code-header .changeset-status-container {
2670 .code-header .changeset-status-container {
2669 float: left;
2671 float: left;
2670 padding: 2px 0px 0px 2px;
2672 padding: 2px 0px 0px 2px;
2671 }
2673 }
2672 .changeset-status-container .changeset-status-lbl {
2674 .changeset-status-container .changeset-status-lbl {
2673 color: rgb(136, 136, 136);
2675 color: rgb(136, 136, 136);
2674 float: left;
2676 float: left;
2675 padding: 3px 4px 0px 0px
2677 padding: 3px 4px 0px 0px
2676 }
2678 }
2677 .code-header .changeset-status-container .changeset-status-lbl {
2679 .code-header .changeset-status-container .changeset-status-lbl {
2678 float: left;
2680 float: left;
2679 padding: 0px 4px 0px 0px;
2681 padding: 0px 4px 0px 0px;
2680 }
2682 }
2681 .changeset-status-container .changeset-status-ico {
2683 .changeset-status-container .changeset-status-ico {
2682 float: left;
2684 float: left;
2683 }
2685 }
2684 .code-header .changeset-status-container .changeset-status-ico, .container .changeset-status-ico {
2686 .code-header .changeset-status-container .changeset-status-ico, .container .changeset-status-ico {
2685 float: left;
2687 float: left;
2686 }
2688 }
2687
2689
2688 #graph_content .comments-cnt {
2690 #graph_content .comments-cnt {
2689 color: rgb(136, 136, 136);
2691 color: rgb(136, 136, 136);
2690 padding: 5px 0;
2692 padding: 5px 0;
2691 }
2693 }
2692
2694
2693 #graph_content .comments-cnt a {
2695 #graph_content .comments-cnt a {
2694 background-image: url('../images/icons/comments.png');
2696 background-image: url('../images/icons/comments.png');
2695 background-repeat: no-repeat;
2697 background-repeat: no-repeat;
2696 background-position: 100% 50%;
2698 background-position: 100% 50%;
2697 padding: 5px 0;
2699 padding: 5px 0;
2698 padding-right: 20px;
2700 padding-right: 20px;
2699 }
2701 }
2700
2702
2701 .right .changes {
2703 .right .changes {
2702 clear: both;
2704 clear: both;
2703 }
2705 }
2704
2706
2705 .right .changes .changed_total {
2707 .right .changes .changed_total {
2706 display: block;
2708 display: block;
2707 float: right;
2709 float: right;
2708 text-align: center;
2710 text-align: center;
2709 min-width: 45px;
2711 min-width: 45px;
2710 cursor: pointer;
2712 cursor: pointer;
2711 color: #444444;
2713 color: #444444;
2712 background: #FEA;
2714 background: #FEA;
2713 -webkit-border-radius: 0px 0px 0px 6px;
2715 -webkit-border-radius: 0px 0px 0px 6px;
2714 border-radius: 0px 0px 0px 6px;
2716 border-radius: 0px 0px 0px 6px;
2715 padding: 1px;
2717 padding: 1px;
2716 }
2718 }
2717
2719
2718 .right .changes .added, .changed, .removed {
2720 .right .changes .added, .changed, .removed {
2719 display: block;
2721 display: block;
2720 padding: 1px;
2722 padding: 1px;
2721 color: #444444;
2723 color: #444444;
2722 float: right;
2724 float: right;
2723 text-align: center;
2725 text-align: center;
2724 min-width: 15px;
2726 min-width: 15px;
2725 }
2727 }
2726
2728
2727 .right .changes .added {
2729 .right .changes .added {
2728 background: #CFC;
2730 background: #CFC;
2729 }
2731 }
2730
2732
2731 .right .changes .changed {
2733 .right .changes .changed {
2732 background: #FEA;
2734 background: #FEA;
2733 }
2735 }
2734
2736
2735 .right .changes .removed {
2737 .right .changes .removed {
2736 background: #FAA;
2738 background: #FAA;
2737 }
2739 }
2738
2740
2739 .right .merge {
2741 .right .merge {
2740 padding: 1px 3px 1px 3px;
2742 padding: 1px 3px 1px 3px;
2741 background-color: #fca062;
2743 background-color: #fca062;
2742 font-size: 10px;
2744 font-size: 10px;
2743 color: #ffffff;
2745 color: #ffffff;
2744 text-transform: uppercase;
2746 text-transform: uppercase;
2745 white-space: nowrap;
2747 white-space: nowrap;
2746 -webkit-border-radius: 3px;
2748 -webkit-border-radius: 3px;
2747 border-radius: 3px;
2749 border-radius: 3px;
2748 margin-right: 2px;
2750 margin-right: 2px;
2749 }
2751 }
2750
2752
2751 .right .parent {
2753 .right .parent {
2752 color: #666666;
2754 color: #666666;
2753 clear: both;
2755 clear: both;
2754 }
2756 }
2755 .right .logtags {
2757 .right .logtags {
2756 line-height: 2.2em;
2758 line-height: 2.2em;
2757 }
2759 }
2758 .branchtag, .logtags .tagtag, .logtags .booktag {
2760 .branchtag, .logtags .tagtag, .logtags .booktag {
2759 margin: 0px 2px;
2761 margin: 0px 2px;
2760 }
2762 }
2761
2763
2762 .branchtag,
2764 .branchtag,
2763 .tagtag,
2765 .tagtag,
2764 .bookbook,
2766 .bookbook,
2765 .spantag {
2767 .spantag {
2766 padding: 1px 3px 1px 3px;
2768 padding: 1px 3px 1px 3px;
2767 font-size: 10px;
2769 font-size: 10px;
2768 color: #336699;
2770 color: #336699;
2769 white-space: nowrap;
2771 white-space: nowrap;
2770 -webkit-border-radius: 4px;
2772 -webkit-border-radius: 4px;
2771 border-radius: 4px;
2773 border-radius: 4px;
2772 border: 1px solid #d9e8f8;
2774 border: 1px solid #d9e8f8;
2773 line-height: 1.5em;
2775 line-height: 1.5em;
2774 }
2776 }
2775
2777
2776 #graph_content .branchtag,
2778 #graph_content .branchtag,
2777 #graph_content .tagtag,
2779 #graph_content .tagtag,
2778 #graph_content .bookbook {
2780 #graph_content .bookbook {
2779 margin: 1.1em 0;
2781 margin: 1.1em 0;
2780 margin-right: 0.5em;
2782 margin-right: 0.5em;
2781 }
2783 }
2782
2784
2783 .branchtag,
2785 .branchtag,
2784 .tagtag,
2786 .tagtag,
2785 .bookbook {
2787 .bookbook {
2786 float: left;
2788 float: left;
2787 }
2789 }
2788
2790
2789 .right .logtags .branchtag,
2791 .right .logtags .branchtag,
2790 .logtags .tagtag,
2792 .logtags .tagtag,
2791 .right .merge {
2793 .right .merge {
2792 float: right;
2794 float: right;
2793 line-height: 1em;
2795 line-height: 1em;
2794 margin: 1px 1px !important;
2796 margin: 1px 1px !important;
2795 display: block;
2797 display: block;
2796 }
2798 }
2797
2799
2798 .bookbook {
2800 .bookbook {
2799 border-color: #46A546;
2801 border-color: #46A546;
2800 color: #46A546;
2802 color: #46A546;
2801 }
2803 }
2802
2804
2803 .tagtag {
2805 .tagtag {
2804 border-color: #62cffc;
2806 border-color: #62cffc;
2805 color: #62cffc;
2807 color: #62cffc;
2806 }
2808 }
2807
2809
2808 .logtags .branchtag a:hover,
2810 .logtags .branchtag a:hover,
2809 .logtags .branchtag a,
2811 .logtags .branchtag a,
2810 .branchtag a,
2812 .branchtag a,
2811 .branchtag a:hover {
2813 .branchtag a:hover {
2812 text-decoration: none;
2814 text-decoration: none;
2813 color: inherit;
2815 color: inherit;
2814 }
2816 }
2815 .logtags .tagtag {
2817 .logtags .tagtag {
2816 padding: 1px 3px 1px 3px;
2818 padding: 1px 3px 1px 3px;
2817 background-color: #62cffc;
2819 background-color: #62cffc;
2818 font-size: 10px;
2820 font-size: 10px;
2819 color: #ffffff;
2821 color: #ffffff;
2820 white-space: nowrap;
2822 white-space: nowrap;
2821 -webkit-border-radius: 3px;
2823 -webkit-border-radius: 3px;
2822 border-radius: 3px;
2824 border-radius: 3px;
2823 }
2825 }
2824
2826
2825 .tagtag a,
2827 .tagtag a,
2826 .tagtag a:hover,
2828 .tagtag a:hover,
2827 .logtags .tagtag a,
2829 .logtags .tagtag a,
2828 .logtags .tagtag a:hover {
2830 .logtags .tagtag a:hover {
2829 text-decoration: none;
2831 text-decoration: none;
2830 color: inherit;
2832 color: inherit;
2831 }
2833 }
2832 .logbooks .bookbook, .logbooks .bookbook, .logtags .bookbook, .logtags .bookbook {
2834 .logbooks .bookbook, .logbooks .bookbook, .logtags .bookbook, .logtags .bookbook {
2833 padding: 1px 3px 1px 3px;
2835 padding: 1px 3px 1px 3px;
2834 background-color: #46A546;
2836 background-color: #46A546;
2835 font-size: 10px;
2837 font-size: 10px;
2836 color: #ffffff;
2838 color: #ffffff;
2837 white-space: nowrap;
2839 white-space: nowrap;
2838 -webkit-border-radius: 3px;
2840 -webkit-border-radius: 3px;
2839 border-radius: 3px;
2841 border-radius: 3px;
2840 }
2842 }
2841 .logbooks .bookbook, .logbooks .bookbook a, .right .logtags .bookbook, .logtags .bookbook a {
2843 .logbooks .bookbook, .logbooks .bookbook a, .right .logtags .bookbook, .logtags .bookbook a {
2842 color: #ffffff;
2844 color: #ffffff;
2843 }
2845 }
2844
2846
2845 .logbooks .bookbook, .logbooks .bookbook a:hover,
2847 .logbooks .bookbook, .logbooks .bookbook a:hover,
2846 .logtags .bookbook, .logtags .bookbook a:hover,
2848 .logtags .bookbook, .logtags .bookbook a:hover,
2847 .bookbook a,
2849 .bookbook a,
2848 .bookbook a:hover {
2850 .bookbook a:hover {
2849 text-decoration: none;
2851 text-decoration: none;
2850 color: inherit;
2852 color: inherit;
2851 }
2853 }
2852 div.browserblock {
2854 div.browserblock {
2853 overflow: hidden;
2855 overflow: hidden;
2854 border: 1px solid #ccc;
2856 border: 1px solid #ccc;
2855 background: #f8f8f8;
2857 background: #f8f8f8;
2856 font-size: 100%;
2858 font-size: 100%;
2857 line-height: 125%;
2859 line-height: 125%;
2858 padding: 0;
2860 padding: 0;
2859 -webkit-border-radius: 6px 6px 0px 0px;
2861 -webkit-border-radius: 6px 6px 0px 0px;
2860 border-radius: 6px 6px 0px 0px;
2862 border-radius: 6px 6px 0px 0px;
2861 }
2863 }
2862
2864
2863 div.browserblock .browser-header {
2865 div.browserblock .browser-header {
2864 background: #FFF;
2866 background: #FFF;
2865 padding: 10px 0px 15px 0px;
2867 padding: 10px 0px 15px 0px;
2866 width: 100%;
2868 width: 100%;
2867 }
2869 }
2868
2870
2869 div.browserblock .browser-nav {
2871 div.browserblock .browser-nav {
2870 float: left
2872 float: left
2871 }
2873 }
2872
2874
2873 div.browserblock .browser-branch {
2875 div.browserblock .browser-branch {
2874 float: left;
2876 float: left;
2875 }
2877 }
2876
2878
2877 div.browserblock .browser-branch label {
2879 div.browserblock .browser-branch label {
2878 color: #4A4A4A;
2880 color: #4A4A4A;
2879 vertical-align: text-top;
2881 vertical-align: text-top;
2880 }
2882 }
2881
2883
2882 div.browserblock .browser-header span {
2884 div.browserblock .browser-header span {
2883 margin-left: 5px;
2885 margin-left: 5px;
2884 font-weight: 700;
2886 font-weight: 700;
2885 }
2887 }
2886
2888
2887 div.browserblock .browser-search {
2889 div.browserblock .browser-search {
2888 clear: both;
2890 clear: both;
2889 padding: 8px 8px 0px 5px;
2891 padding: 8px 8px 0px 5px;
2890 height: 20px;
2892 height: 20px;
2891 }
2893 }
2892
2894
2893 div.browserblock #node_filter_box {
2895 div.browserblock #node_filter_box {
2894 }
2896 }
2895
2897
2896 div.browserblock .search_activate {
2898 div.browserblock .search_activate {
2897 float: left
2899 float: left
2898 }
2900 }
2899
2901
2900 div.browserblock .add_node {
2902 div.browserblock .add_node {
2901 float: left;
2903 float: left;
2902 padding-left: 5px;
2904 padding-left: 5px;
2903 }
2905 }
2904
2906
2905 div.browserblock .search_activate a:hover, div.browserblock .add_node a:hover {
2907 div.browserblock .search_activate a:hover, div.browserblock .add_node a:hover {
2906 text-decoration: none !important;
2908 text-decoration: none !important;
2907 }
2909 }
2908
2910
2909 div.browserblock .browser-body {
2911 div.browserblock .browser-body {
2910 background: #EEE;
2912 background: #EEE;
2911 border-top: 1px solid #CCC;
2913 border-top: 1px solid #CCC;
2912 }
2914 }
2913
2915
2914 table.code-browser {
2916 table.code-browser {
2915 border-collapse: collapse;
2917 border-collapse: collapse;
2916 width: 100%;
2918 width: 100%;
2917 }
2919 }
2918
2920
2919 table.code-browser tr {
2921 table.code-browser tr {
2920 margin: 3px;
2922 margin: 3px;
2921 }
2923 }
2922
2924
2923 table.code-browser thead th {
2925 table.code-browser thead th {
2924 background-color: #EEE;
2926 background-color: #EEE;
2925 height: 20px;
2927 height: 20px;
2926 font-size: 1.1em;
2928 font-size: 1.1em;
2927 font-weight: 700;
2929 font-weight: 700;
2928 text-align: left;
2930 text-align: left;
2929 padding-left: 10px;
2931 padding-left: 10px;
2930 }
2932 }
2931
2933
2932 table.code-browser tbody td {
2934 table.code-browser tbody td {
2933 padding-left: 10px;
2935 padding-left: 10px;
2934 height: 20px;
2936 height: 20px;
2935 }
2937 }
2936
2938
2937 table.code-browser .browser-file {
2939 table.code-browser .browser-file {
2938 background: url("../images/icons/document_16.png") no-repeat scroll 3px;
2940 background: url("../images/icons/document_16.png") no-repeat scroll 3px;
2939 height: 16px;
2941 height: 16px;
2940 padding-left: 20px;
2942 padding-left: 20px;
2941 text-align: left;
2943 text-align: left;
2942 }
2944 }
2943 .diffblock .changeset_header {
2945 .diffblock .changeset_header {
2944 height: 16px;
2946 height: 16px;
2945 }
2947 }
2946 .diffblock .changeset_file {
2948 .diffblock .changeset_file {
2947 background: url("../images/icons/file.png") no-repeat scroll 3px;
2949 background: url("../images/icons/file.png") no-repeat scroll 3px;
2948 text-align: left;
2950 text-align: left;
2949 float: left;
2951 float: left;
2950 padding: 2px 0px 2px 22px;
2952 padding: 2px 0px 2px 22px;
2951 }
2953 }
2952 .diffblock .diff-menu-wrapper {
2954 .diffblock .diff-menu-wrapper {
2953 float: left;
2955 float: left;
2954 }
2956 }
2955
2957
2956 .diffblock .diff-menu {
2958 .diffblock .diff-menu {
2957 position: absolute;
2959 position: absolute;
2958 background: none repeat scroll 0 0 #FFFFFF;
2960 background: none repeat scroll 0 0 #FFFFFF;
2959 border-color: #003367 #666666 #666666;
2961 border-color: #003367 #666666 #666666;
2960 border-right: 1px solid #666666;
2962 border-right: 1px solid #666666;
2961 border-style: solid solid solid;
2963 border-style: solid solid solid;
2962 border-width: 1px;
2964 border-width: 1px;
2963 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
2965 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
2964 margin-top: 5px;
2966 margin-top: 5px;
2965 margin-left: 1px;
2967 margin-left: 1px;
2966
2968
2967 }
2969 }
2968 .diffblock .diff-actions {
2970 .diffblock .diff-actions {
2969 padding: 2px 0px 0px 2px;
2971 padding: 2px 0px 0px 2px;
2970 float: left;
2972 float: left;
2971 }
2973 }
2972 .diffblock .diff-menu ul li {
2974 .diffblock .diff-menu ul li {
2973 padding: 0px 0px 0px 0px !important;
2975 padding: 0px 0px 0px 0px !important;
2974 }
2976 }
2975 .diffblock .diff-menu ul li a {
2977 .diffblock .diff-menu ul li a {
2976 display: block;
2978 display: block;
2977 padding: 3px 8px 3px 8px !important;
2979 padding: 3px 8px 3px 8px !important;
2978 }
2980 }
2979 .diffblock .diff-menu ul li a:hover {
2981 .diffblock .diff-menu ul li a:hover {
2980 text-decoration: none;
2982 text-decoration: none;
2981 background-color: #EEEEEE;
2983 background-color: #EEEEEE;
2982 }
2984 }
2983 table.code-browser .browser-dir {
2985 table.code-browser .browser-dir {
2984 background: url("../images/icons/folder_16.png") no-repeat scroll 3px;
2986 background: url("../images/icons/folder_16.png") no-repeat scroll 3px;
2985 height: 16px;
2987 height: 16px;
2986 padding-left: 20px;
2988 padding-left: 20px;
2987 text-align: left;
2989 text-align: left;
2988 }
2990 }
2989
2991
2990 table.code-browser .submodule-dir {
2992 table.code-browser .submodule-dir {
2991 background: url("../images/icons/disconnect.png") no-repeat scroll 3px;
2993 background: url("../images/icons/disconnect.png") no-repeat scroll 3px;
2992 height: 16px;
2994 height: 16px;
2993 padding-left: 20px;
2995 padding-left: 20px;
2994 text-align: left;
2996 text-align: left;
2995 }
2997 }
2996
2998
2997
2999
2998 .box .search {
3000 .box .search {
2999 clear: both;
3001 clear: both;
3000 overflow: hidden;
3002 overflow: hidden;
3001 margin: 0;
3003 margin: 0;
3002 padding: 0 20px 10px;
3004 padding: 0 20px 10px;
3003 }
3005 }
3004
3006
3005 .box .search div.search_path {
3007 .box .search div.search_path {
3006 background: none repeat scroll 0 0 #EEE;
3008 background: none repeat scroll 0 0 #EEE;
3007 border: 1px solid #CCC;
3009 border: 1px solid #CCC;
3008 color: blue;
3010 color: blue;
3009 margin-bottom: 10px;
3011 margin-bottom: 10px;
3010 padding: 10px 0;
3012 padding: 10px 0;
3011 }
3013 }
3012
3014
3013 .box .search div.search_path div.link {
3015 .box .search div.search_path div.link {
3014 font-weight: 700;
3016 font-weight: 700;
3015 margin-left: 25px;
3017 margin-left: 25px;
3016 }
3018 }
3017
3019
3018 .box .search div.search_path div.link a {
3020 .box .search div.search_path div.link a {
3019 color: #003367;
3021 color: #003367;
3020 cursor: pointer;
3022 cursor: pointer;
3021 text-decoration: none;
3023 text-decoration: none;
3022 }
3024 }
3023
3025
3024 #path_unlock {
3026 #path_unlock {
3025 color: red;
3027 color: red;
3026 font-size: 1.2em;
3028 font-size: 1.2em;
3027 padding-left: 4px;
3029 padding-left: 4px;
3028 }
3030 }
3029
3031
3030 .info_box span {
3032 .info_box span {
3031 margin-left: 3px;
3033 margin-left: 3px;
3032 margin-right: 3px;
3034 margin-right: 3px;
3033 }
3035 }
3034
3036
3035 .info_box .rev {
3037 .info_box .rev {
3036 color: #003367;
3038 color: #003367;
3037 font-size: 1.6em;
3039 font-size: 1.6em;
3038 font-weight: bold;
3040 font-weight: bold;
3039 vertical-align: sub;
3041 vertical-align: sub;
3040 }
3042 }
3041
3043
3042 .info_box input#at_rev, .info_box input#size {
3044 .info_box input#at_rev, .info_box input#size {
3043 background: #FFF;
3045 background: #FFF;
3044 border-top: 1px solid #b3b3b3;
3046 border-top: 1px solid #b3b3b3;
3045 border-left: 1px solid #b3b3b3;
3047 border-left: 1px solid #b3b3b3;
3046 border-right: 1px solid #eaeaea;
3048 border-right: 1px solid #eaeaea;
3047 border-bottom: 1px solid #eaeaea;
3049 border-bottom: 1px solid #eaeaea;
3048 color: #000;
3050 color: #000;
3049 font-size: 12px;
3051 font-size: 12px;
3050 margin: 0;
3052 margin: 0;
3051 padding: 1px 5px 1px;
3053 padding: 1px 5px 1px;
3052 }
3054 }
3053
3055
3054 .info_box input#view {
3056 .info_box input#view {
3055 text-align: center;
3057 text-align: center;
3056 padding: 4px 3px 2px 2px;
3058 padding: 4px 3px 2px 2px;
3057 }
3059 }
3058
3060
3059 .yui-overlay, .yui-panel-container {
3061 .yui-overlay, .yui-panel-container {
3060 visibility: hidden;
3062 visibility: hidden;
3061 position: absolute;
3063 position: absolute;
3062 z-index: 2;
3064 z-index: 2;
3063 }
3065 }
3064
3066
3065 #tip-box {
3067 #tip-box {
3066 position: absolute;
3068 position: absolute;
3067
3069
3068 background-color: #FFF;
3070 background-color: #FFF;
3069 border: 2px solid #003367;
3071 border: 2px solid #003367;
3070 font: 100% sans-serif;
3072 font: 100% sans-serif;
3071 width: auto;
3073 width: auto;
3072 opacity: 1;
3074 opacity: 1;
3073 padding: 8px;
3075 padding: 8px;
3074
3076
3075 white-space: pre-wrap;
3077 white-space: pre-wrap;
3076 -webkit-border-radius: 8px 8px 8px 8px;
3078 -webkit-border-radius: 8px 8px 8px 8px;
3077 -khtml-border-radius: 8px 8px 8px 8px;
3079 -khtml-border-radius: 8px 8px 8px 8px;
3078 border-radius: 8px 8px 8px 8px;
3080 border-radius: 8px 8px 8px 8px;
3079 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3081 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3080 -webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3082 -webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3081 }
3083 }
3082
3084
3083 .hl-tip-box {
3085 .hl-tip-box {
3084 visibility: hidden;
3086 visibility: hidden;
3085 position: absolute;
3087 position: absolute;
3086 color: #666;
3088 color: #666;
3087 background-color: #FFF;
3089 background-color: #FFF;
3088 border: 2px solid #003367;
3090 border: 2px solid #003367;
3089 font: 100% sans-serif;
3091 font: 100% sans-serif;
3090 width: auto;
3092 width: auto;
3091 opacity: 1;
3093 opacity: 1;
3092 padding: 8px;
3094 padding: 8px;
3093 white-space: pre-wrap;
3095 white-space: pre-wrap;
3094 -webkit-border-radius: 8px 8px 8px 8px;
3096 -webkit-border-radius: 8px 8px 8px 8px;
3095 -khtml-border-radius: 8px 8px 8px 8px;
3097 -khtml-border-radius: 8px 8px 8px 8px;
3096 border-radius: 8px 8px 8px 8px;
3098 border-radius: 8px 8px 8px 8px;
3097 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3099 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3098 }
3100 }
3099
3101
3100
3102
3101 .mentions-container {
3103 .mentions-container {
3102 width: 90% !important;
3104 width: 90% !important;
3103 }
3105 }
3104 .mentions-container .yui-ac-content {
3106 .mentions-container .yui-ac-content {
3105 width: 100% !important;
3107 width: 100% !important;
3106 }
3108 }
3107
3109
3108 .ac {
3110 .ac {
3109 vertical-align: top;
3111 vertical-align: top;
3110 }
3112 }
3111
3113
3112 .ac .yui-ac {
3114 .ac .yui-ac {
3113 position: inherit;
3115 position: inherit;
3114 font-size: 100%;
3116 font-size: 100%;
3115 }
3117 }
3116
3118
3117 .ac .perm_ac {
3119 .ac .perm_ac {
3118 width: 20em;
3120 width: 20em;
3119 }
3121 }
3120
3122
3121 .ac .yui-ac-input {
3123 .ac .yui-ac-input {
3122 width: 100%;
3124 width: 100%;
3123 }
3125 }
3124
3126
3125 .ac .yui-ac-container {
3127 .ac .yui-ac-container {
3126 position: absolute;
3128 position: absolute;
3127 top: 1.6em;
3129 top: 1.6em;
3128 width: auto;
3130 width: auto;
3129 }
3131 }
3130
3132
3131 .ac .yui-ac-content {
3133 .ac .yui-ac-content {
3132 position: absolute;
3134 position: absolute;
3133 border: 1px solid gray;
3135 border: 1px solid gray;
3134 background: #fff;
3136 background: #fff;
3135 z-index: 9050;
3137 z-index: 9050;
3136 }
3138 }
3137
3139
3138 .ac .yui-ac-shadow {
3140 .ac .yui-ac-shadow {
3139 position: absolute;
3141 position: absolute;
3140 width: 100%;
3142 width: 100%;
3141 background: #000;
3143 background: #000;
3142 opacity: .10;
3144 opacity: .10;
3143 filter: alpha(opacity = 10);
3145 filter: alpha(opacity = 10);
3144 z-index: 9049;
3146 z-index: 9049;
3145 margin: .3em;
3147 margin: .3em;
3146 }
3148 }
3147
3149
3148 .ac .yui-ac-content ul {
3150 .ac .yui-ac-content ul {
3149 width: 100%;
3151 width: 100%;
3150 margin: 0;
3152 margin: 0;
3151 padding: 0;
3153 padding: 0;
3152 z-index: 9050;
3154 z-index: 9050;
3153 }
3155 }
3154
3156
3155 .ac .yui-ac-content li {
3157 .ac .yui-ac-content li {
3156 cursor: default;
3158 cursor: default;
3157 white-space: nowrap;
3159 white-space: nowrap;
3158 margin: 0;
3160 margin: 0;
3159 padding: 2px 5px;
3161 padding: 2px 5px;
3160 height: 18px;
3162 height: 18px;
3161 z-index: 9050;
3163 z-index: 9050;
3162 display: block;
3164 display: block;
3163 width: auto !important;
3165 width: auto !important;
3164 }
3166 }
3165
3167
3166 .ac .yui-ac-content li .ac-container-wrap {
3168 .ac .yui-ac-content li .ac-container-wrap {
3167 width: auto;
3169 width: auto;
3168 }
3170 }
3169
3171
3170 .ac .yui-ac-content li.yui-ac-prehighlight {
3172 .ac .yui-ac-content li.yui-ac-prehighlight {
3171 background: #B3D4FF;
3173 background: #B3D4FF;
3172 z-index: 9050;
3174 z-index: 9050;
3173 }
3175 }
3174
3176
3175 .ac .yui-ac-content li.yui-ac-highlight {
3177 .ac .yui-ac-content li.yui-ac-highlight {
3176 background: #556CB5;
3178 background: #556CB5;
3177 color: #FFF;
3179 color: #FFF;
3178 z-index: 9050;
3180 z-index: 9050;
3179 }
3181 }
3180 .ac .yui-ac-bd {
3182 .ac .yui-ac-bd {
3181 z-index: 9050;
3183 z-index: 9050;
3182 }
3184 }
3183
3185
3184 .reposize {
3186 .reposize {
3185 background: url("../images/icons/server.png") no-repeat scroll 3px;
3187 background: url("../images/icons/server.png") no-repeat scroll 3px;
3186 height: 16px;
3188 height: 16px;
3187 width: 20px;
3189 width: 20px;
3188 cursor: pointer;
3190 cursor: pointer;
3189 display: block;
3191 display: block;
3190 float: right;
3192 float: right;
3191 margin-top: 2px;
3193 margin-top: 2px;
3192 }
3194 }
3193
3195
3194 #repo_size {
3196 #repo_size {
3195 display: block;
3197 display: block;
3196 margin-top: 4px;
3198 margin-top: 4px;
3197 color: #666;
3199 color: #666;
3198 float: right;
3200 float: right;
3199 }
3201 }
3200
3202
3201 .locking_locked {
3203 .locking_locked {
3202 background: #FFF url("../images/icons/block_16.png") no-repeat scroll 3px;
3204 background: #FFF url("../images/icons/block_16.png") no-repeat scroll 3px;
3203 height: 16px;
3205 height: 16px;
3204 width: 20px;
3206 width: 20px;
3205 cursor: pointer;
3207 cursor: pointer;
3206 display: block;
3208 display: block;
3207 float: right;
3209 float: right;
3208 margin-top: 2px;
3210 margin-top: 2px;
3209 }
3211 }
3210
3212
3211 .locking_unlocked {
3213 .locking_unlocked {
3212 background: #FFF url("../images/icons/accept.png") no-repeat scroll 3px;
3214 background: #FFF url("../images/icons/accept.png") no-repeat scroll 3px;
3213 height: 16px;
3215 height: 16px;
3214 width: 20px;
3216 width: 20px;
3215 cursor: pointer;
3217 cursor: pointer;
3216 display: block;
3218 display: block;
3217 float: right;
3219 float: right;
3218 margin-top: 2px;
3220 margin-top: 2px;
3219 }
3221 }
3220
3222
3221 .currently_following {
3223 .currently_following {
3222 padding-left: 10px;
3224 padding-left: 10px;
3223 padding-bottom: 5px;
3225 padding-bottom: 5px;
3224 }
3226 }
3225
3227
3226 .add_icon {
3228 .add_icon {
3227 background: url("../images/icons/add.png") no-repeat scroll 3px;
3229 background: url("../images/icons/add.png") no-repeat scroll 3px;
3228 padding-left: 20px;
3230 padding-left: 20px;
3229 padding-top: 0px;
3231 padding-top: 0px;
3230 text-align: left;
3232 text-align: left;
3231 }
3233 }
3232
3234
3233 .accept_icon {
3235 .accept_icon {
3234 background: url("../images/icons/accept.png") no-repeat scroll 3px;
3236 background: url("../images/icons/accept.png") no-repeat scroll 3px;
3235 padding-left: 20px;
3237 padding-left: 20px;
3236 padding-top: 0px;
3238 padding-top: 0px;
3237 text-align: left;
3239 text-align: left;
3238 }
3240 }
3239
3241
3240 .edit_icon {
3242 .edit_icon {
3241 background: url("../images/icons/application_form_edit.png") no-repeat scroll 3px;
3243 background: url("../images/icons/application_form_edit.png") no-repeat scroll 3px;
3242 padding-left: 20px;
3244 padding-left: 20px;
3243 padding-top: 0px;
3245 padding-top: 0px;
3244 text-align: left;
3246 text-align: left;
3245 }
3247 }
3246
3248
3247 .delete_icon {
3249 .delete_icon {
3248 background: url("../images/icons/delete.png") no-repeat scroll 3px;
3250 background: url("../images/icons/delete.png") no-repeat scroll 3px;
3249 padding-left: 20px;
3251 padding-left: 20px;
3250 padding-top: 0px;
3252 padding-top: 0px;
3251 text-align: left;
3253 text-align: left;
3252 }
3254 }
3253
3255
3254 .refresh_icon {
3256 .refresh_icon {
3255 background: url("../images/icons/arrow_refresh.png") no-repeat scroll
3257 background: url("../images/icons/arrow_refresh.png") no-repeat scroll
3256 3px;
3258 3px;
3257 padding-left: 20px;
3259 padding-left: 20px;
3258 padding-top: 0px;
3260 padding-top: 0px;
3259 text-align: left;
3261 text-align: left;
3260 }
3262 }
3261
3263
3262 .pull_icon {
3264 .pull_icon {
3263 background: url("../images/icons/connect.png") no-repeat scroll 3px;
3265 background: url("../images/icons/connect.png") no-repeat scroll 3px;
3264 padding-left: 20px;
3266 padding-left: 20px;
3265 padding-top: 0px;
3267 padding-top: 0px;
3266 text-align: left;
3268 text-align: left;
3267 }
3269 }
3268
3270
3269 .rss_icon {
3271 .rss_icon {
3270 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
3272 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
3271 padding-left: 20px;
3273 padding-left: 20px;
3272 padding-top: 4px;
3274 padding-top: 4px;
3273 text-align: left;
3275 text-align: left;
3274 font-size: 8px
3276 font-size: 8px
3275 }
3277 }
3276
3278
3277 .atom_icon {
3279 .atom_icon {
3278 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
3280 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
3279 padding-left: 20px;
3281 padding-left: 20px;
3280 padding-top: 4px;
3282 padding-top: 4px;
3281 text-align: left;
3283 text-align: left;
3282 font-size: 8px
3284 font-size: 8px
3283 }
3285 }
3284
3286
3285 .archive_icon {
3287 .archive_icon {
3286 background: url("../images/icons/compress.png") no-repeat scroll 3px;
3288 background: url("../images/icons/compress.png") no-repeat scroll 3px;
3287 padding-left: 20px;
3289 padding-left: 20px;
3288 text-align: left;
3290 text-align: left;
3289 padding-top: 1px;
3291 padding-top: 1px;
3290 }
3292 }
3291
3293
3292 .start_following_icon {
3294 .start_following_icon {
3293 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
3295 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
3294 padding-left: 20px;
3296 padding-left: 20px;
3295 text-align: left;
3297 text-align: left;
3296 padding-top: 0px;
3298 padding-top: 0px;
3297 }
3299 }
3298
3300
3299 .stop_following_icon {
3301 .stop_following_icon {
3300 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
3302 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
3301 padding-left: 20px;
3303 padding-left: 20px;
3302 text-align: left;
3304 text-align: left;
3303 padding-top: 0px;
3305 padding-top: 0px;
3304 }
3306 }
3305
3307
3306 .action_button {
3308 .action_button {
3307 border: 0;
3309 border: 0;
3308 display: inline;
3310 display: inline;
3309 }
3311 }
3310
3312
3311 .action_button:hover {
3313 .action_button:hover {
3312 border: 0;
3314 border: 0;
3313 text-decoration: underline;
3315 text-decoration: underline;
3314 cursor: pointer;
3316 cursor: pointer;
3315 }
3317 }
3316
3318
3317 #switch_repos {
3319 #switch_repos {
3318 position: absolute;
3320 position: absolute;
3319 height: 25px;
3321 height: 25px;
3320 z-index: 1;
3322 z-index: 1;
3321 }
3323 }
3322
3324
3323 #switch_repos select {
3325 #switch_repos select {
3324 min-width: 150px;
3326 min-width: 150px;
3325 max-height: 250px;
3327 max-height: 250px;
3326 z-index: 1;
3328 z-index: 1;
3327 }
3329 }
3328
3330
3329 .breadcrumbs {
3331 .breadcrumbs {
3330 border: medium none;
3332 border: medium none;
3331 color: #FFF;
3333 color: #FFF;
3332 float: left;
3334 float: left;
3333 font-weight: 700;
3335 font-weight: 700;
3334 font-size: 14px;
3336 font-size: 14px;
3335 margin: 0;
3337 margin: 0;
3336 padding: 11px 0 11px 10px;
3338 padding: 11px 0 11px 10px;
3337 }
3339 }
3338
3340
3339 .breadcrumbs .hash {
3341 .breadcrumbs .hash {
3340 text-transform: none;
3342 text-transform: none;
3341 color: #fff;
3343 color: #fff;
3342 }
3344 }
3343
3345
3344 .breadcrumbs a {
3346 .breadcrumbs a {
3345 color: #FFF;
3347 color: #FFF;
3346 }
3348 }
3347
3349
3348 .flash_msg {
3350 .flash_msg {
3349 }
3351 }
3350
3352
3351 .flash_msg ul {
3353 .flash_msg ul {
3352 }
3354 }
3353
3355
3354 .error_red {
3356 .error_red {
3355 color: red;
3357 color: red;
3356 }
3358 }
3357
3359
3358 .error_msg {
3360 .error_msg {
3359 background-color: #c43c35;
3361 background-color: #c43c35;
3360 background-repeat: repeat-x;
3362 background-repeat: repeat-x;
3361 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35) );
3363 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35) );
3362 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3364 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3363 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3365 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3364 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35) );
3366 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35) );
3365 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3367 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3366 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3368 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3367 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3369 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3368 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b',endColorstr='#c43c35', GradientType=0 );
3370 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b',endColorstr='#c43c35', GradientType=0 );
3369 border-color: #c43c35 #c43c35 #882a25;
3371 border-color: #c43c35 #c43c35 #882a25;
3370 }
3372 }
3371
3373
3372 .error_msg a {
3374 .error_msg a {
3373 text-decoration: underline;
3375 text-decoration: underline;
3374 }
3376 }
3375
3377
3376 .warning_msg {
3378 .warning_msg {
3377 color: #404040 !important;
3379 color: #404040 !important;
3378 background-color: #eedc94;
3380 background-color: #eedc94;
3379 background-repeat: repeat-x;
3381 background-repeat: repeat-x;
3380 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94) );
3382 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94) );
3381 background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
3383 background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
3382 background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
3384 background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
3383 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94) );
3385 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94) );
3384 background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
3386 background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
3385 background-image: -o-linear-gradient(top, #fceec1, #eedc94);
3387 background-image: -o-linear-gradient(top, #fceec1, #eedc94);
3386 background-image: linear-gradient(to bottom, #fceec1, #eedc94);
3388 background-image: linear-gradient(to bottom, #fceec1, #eedc94);
3387 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0 );
3389 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0 );
3388 border-color: #eedc94 #eedc94 #e4c652;
3390 border-color: #eedc94 #eedc94 #e4c652;
3389 }
3391 }
3390
3392
3391 .warning_msg a {
3393 .warning_msg a {
3392 text-decoration: underline;
3394 text-decoration: underline;
3393 }
3395 }
3394
3396
3395 .success_msg {
3397 .success_msg {
3396 background-color: #57a957;
3398 background-color: #57a957;
3397 background-repeat: repeat-x !important;
3399 background-repeat: repeat-x !important;
3398 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957) );
3400 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957) );
3399 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3401 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3400 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3402 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3401 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957) );
3403 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957) );
3402 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3404 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3403 background-image: -o-linear-gradient(top, #62c462, #57a957);
3405 background-image: -o-linear-gradient(top, #62c462, #57a957);
3404 background-image: linear-gradient(to bottom, #62c462, #57a957);
3406 background-image: linear-gradient(to bottom, #62c462, #57a957);
3405 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0 );
3407 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0 );
3406 border-color: #57a957 #57a957 #3d773d;
3408 border-color: #57a957 #57a957 #3d773d;
3407 }
3409 }
3408
3410
3409 .success_msg a {
3411 .success_msg a {
3410 text-decoration: underline;
3412 text-decoration: underline;
3411 color: #FFF !important;
3413 color: #FFF !important;
3412 }
3414 }
3413
3415
3414 .notice_msg {
3416 .notice_msg {
3415 background-color: #339bb9;
3417 background-color: #339bb9;
3416 background-repeat: repeat-x;
3418 background-repeat: repeat-x;
3417 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9) );
3419 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9) );
3418 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3420 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3419 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3421 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3420 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9) );
3422 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9) );
3421 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3423 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3422 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3424 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3423 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3425 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3424 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0 );
3426 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0 );
3425 border-color: #339bb9 #339bb9 #22697d;
3427 border-color: #339bb9 #339bb9 #22697d;
3426 }
3428 }
3427
3429
3428 .notice_msg a {
3430 .notice_msg a {
3429 text-decoration: underline;
3431 text-decoration: underline;
3430 }
3432 }
3431
3433
3432 .success_msg, .error_msg, .notice_msg, .warning_msg {
3434 .success_msg, .error_msg, .notice_msg, .warning_msg {
3433 font-size: 12px;
3435 font-size: 12px;
3434 font-weight: 700;
3436 font-weight: 700;
3435 min-height: 14px;
3437 min-height: 14px;
3436 line-height: 14px;
3438 line-height: 14px;
3437 margin-bottom: 10px;
3439 margin-bottom: 10px;
3438 margin-top: 0;
3440 margin-top: 0;
3439 display: block;
3441 display: block;
3440 overflow: auto;
3442 overflow: auto;
3441 padding: 6px 10px 6px 10px;
3443 padding: 6px 10px 6px 10px;
3442 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3444 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3443 position: relative;
3445 position: relative;
3444 color: #FFF;
3446 color: #FFF;
3445 border-width: 1px;
3447 border-width: 1px;
3446 border-style: solid;
3448 border-style: solid;
3447 -webkit-border-radius: 4px;
3449 -webkit-border-radius: 4px;
3448 border-radius: 4px;
3450 border-radius: 4px;
3449 -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3451 -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3450 box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3452 box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3451 }
3453 }
3452
3454
3453 #msg_close {
3455 #msg_close {
3454 background: transparent url("../icons/cross_grey_small.png") no-repeat scroll 0 0;
3456 background: transparent url("../icons/cross_grey_small.png") no-repeat scroll 0 0;
3455 cursor: pointer;
3457 cursor: pointer;
3456 height: 16px;
3458 height: 16px;
3457 position: absolute;
3459 position: absolute;
3458 right: 5px;
3460 right: 5px;
3459 top: 5px;
3461 top: 5px;
3460 width: 16px;
3462 width: 16px;
3461 }
3463 }
3462 div#legend_data {
3464 div#legend_data {
3463 padding-left: 10px;
3465 padding-left: 10px;
3464 }
3466 }
3465 div#legend_container table {
3467 div#legend_container table {
3466 border: none !important;
3468 border: none !important;
3467 }
3469 }
3468 div#legend_container table, div#legend_choices table {
3470 div#legend_container table, div#legend_choices table {
3469 width: auto !important;
3471 width: auto !important;
3470 }
3472 }
3471
3473
3472 table#permissions_manage {
3474 table#permissions_manage {
3473 width: 0 !important;
3475 width: 0 !important;
3474 }
3476 }
3475
3477
3476 table#permissions_manage span.private_repo_msg {
3478 table#permissions_manage span.private_repo_msg {
3477 font-size: 0.8em;
3479 font-size: 0.8em;
3478 opacity: 0.6;
3480 opacity: 0.6;
3479 }
3481 }
3480
3482
3481 table#permissions_manage td.private_repo_msg {
3483 table#permissions_manage td.private_repo_msg {
3482 font-size: 0.8em;
3484 font-size: 0.8em;
3483 }
3485 }
3484
3486
3485 table#permissions_manage tr#add_perm_input td {
3487 table#permissions_manage tr#add_perm_input td {
3486 vertical-align: middle;
3488 vertical-align: middle;
3487 }
3489 }
3488
3490
3489 div.gravatar {
3491 div.gravatar {
3490 background-color: #FFF;
3492 background-color: #FFF;
3491 float: left;
3493 float: left;
3492 margin-right: 0.7em;
3494 margin-right: 0.7em;
3493 padding: 1px 1px 1px 1px;
3495 padding: 1px 1px 1px 1px;
3494 line-height: 0;
3496 line-height: 0;
3495 -webkit-border-radius: 3px;
3497 -webkit-border-radius: 3px;
3496 -khtml-border-radius: 3px;
3498 -khtml-border-radius: 3px;
3497 border-radius: 3px;
3499 border-radius: 3px;
3498 }
3500 }
3499
3501
3500 div.gravatar img {
3502 div.gravatar img {
3501 -webkit-border-radius: 2px;
3503 -webkit-border-radius: 2px;
3502 -khtml-border-radius: 2px;
3504 -khtml-border-radius: 2px;
3503 border-radius: 2px;
3505 border-radius: 2px;
3504 }
3506 }
3505
3507
3506 #header, #content, #footer {
3508 #header, #content, #footer {
3507 min-width: 978px;
3509 min-width: 978px;
3508 }
3510 }
3509
3511
3510 #content {
3512 #content {
3511 clear: both;
3513 clear: both;
3512 padding: 10px 10px 14px 10px;
3514 padding: 10px 10px 14px 10px;
3513 }
3515 }
3514
3516
3515 #content.hover {
3517 #content.hover {
3516 padding: 55px 10px 14px 10px !important;
3518 padding: 55px 10px 14px 10px !important;
3517 }
3519 }
3518
3520
3519 #content div.box div.title div.search {
3521 #content div.box div.title div.search {
3520 border-left: 1px solid #316293;
3522 border-left: 1px solid #316293;
3521 }
3523 }
3522
3524
3523 #content div.box div.title div.search div.input input {
3525 #content div.box div.title div.search div.input input {
3524 border: 1px solid #316293;
3526 border: 1px solid #316293;
3525 }
3527 }
3526
3528
3527 .ui-btn {
3529 .ui-btn {
3528 color: #515151;
3530 color: #515151;
3529 background-color: #DADADA;
3531 background-color: #DADADA;
3530 background-repeat: repeat-x;
3532 background-repeat: repeat-x;
3531 background-image: -khtml-gradient(linear, left top, left bottom, from(#F4F4F4),to(#DADADA) );
3533 background-image: -khtml-gradient(linear, left top, left bottom, from(#F4F4F4),to(#DADADA) );
3532 background-image: -moz-linear-gradient(top, #F4F4F4, #DADADA);
3534 background-image: -moz-linear-gradient(top, #F4F4F4, #DADADA);
3533 background-image: -ms-linear-gradient(top, #F4F4F4, #DADADA);
3535 background-image: -ms-linear-gradient(top, #F4F4F4, #DADADA);
3534 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #F4F4F4),color-stop(100%, #DADADA) );
3536 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #F4F4F4),color-stop(100%, #DADADA) );
3535 background-image: -webkit-linear-gradient(top, #F4F4F4, #DADADA) );
3537 background-image: -webkit-linear-gradient(top, #F4F4F4, #DADADA) );
3536 background-image: -o-linear-gradient(top, #F4F4F4, #DADADA) );
3538 background-image: -o-linear-gradient(top, #F4F4F4, #DADADA) );
3537 background-image: linear-gradient(to bottom, #F4F4F4, #DADADA);
3539 background-image: linear-gradient(to bottom, #F4F4F4, #DADADA);
3538 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F4F4F4', endColorstr='#DADADA', GradientType=0);
3540 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F4F4F4', endColorstr='#DADADA', GradientType=0);
3539
3541
3540 border-top: 1px solid #DDD;
3542 border-top: 1px solid #DDD;
3541 border-left: 1px solid #c6c6c6;
3543 border-left: 1px solid #c6c6c6;
3542 border-right: 1px solid #DDD;
3544 border-right: 1px solid #DDD;
3543 border-bottom: 1px solid #c6c6c6;
3545 border-bottom: 1px solid #c6c6c6;
3544 color: #515151;
3546 color: #515151;
3545 outline: none;
3547 outline: none;
3546 margin: 0px 3px 3px 0px;
3548 margin: 0px 3px 3px 0px;
3547 -webkit-border-radius: 4px 4px 4px 4px !important;
3549 -webkit-border-radius: 4px 4px 4px 4px !important;
3548 -khtml-border-radius: 4px 4px 4px 4px !important;
3550 -khtml-border-radius: 4px 4px 4px 4px !important;
3549 border-radius: 4px 4px 4px 4px !important;
3551 border-radius: 4px 4px 4px 4px !important;
3550 cursor: pointer !important;
3552 cursor: pointer !important;
3551 padding: 3px 3px 3px 3px;
3553 padding: 3px 3px 3px 3px;
3552 background-position: 0 -15px;
3554 background-position: 0 -15px;
3553
3555
3554 }
3556 }
3555
3557
3556 .ui-btn.disabled {
3558 .ui-btn.disabled {
3557 color: #999;
3559 color: #999;
3558 }
3560 }
3559
3561
3560 .ui-btn.xsmall {
3562 .ui-btn.xsmall {
3561 padding: 1px 2px 1px 1px;
3563 padding: 1px 2px 1px 1px;
3562 }
3564 }
3563
3565
3564 .ui-btn.large {
3566 .ui-btn.large {
3565 padding: 6px 12px;
3567 padding: 6px 12px;
3566 }
3568 }
3567
3569
3568 .ui-btn.clone {
3570 .ui-btn.clone {
3569 padding: 5px 2px 6px 1px;
3571 padding: 5px 2px 6px 1px;
3570 margin: 0px 0px 3px -4px;
3572 margin: 0px 0px 3px -4px;
3571 -webkit-border-radius: 0px 4px 4px 0px !important;
3573 -webkit-border-radius: 0px 4px 4px 0px !important;
3572 -khtml-border-radius: 0px 4px 4px 0px !important;
3574 -khtml-border-radius: 0px 4px 4px 0px !important;
3573 border-radius: 0px 4px 4px 0px !important;
3575 border-radius: 0px 4px 4px 0px !important;
3574 width: 100px;
3576 width: 100px;
3575 text-align: center;
3577 text-align: center;
3576 display: inline-block;
3578 display: inline-block;
3577 position: relative;
3579 position: relative;
3578 top: -2px;
3580 top: -2px;
3579 }
3581 }
3580 .ui-btn:focus {
3582 .ui-btn:focus {
3581 outline: none;
3583 outline: none;
3582 }
3584 }
3583 .ui-btn:hover {
3585 .ui-btn:hover {
3584 background-position: 0 -15px;
3586 background-position: 0 -15px;
3585 text-decoration: none;
3587 text-decoration: none;
3586 color: #515151;
3588 color: #515151;
3587 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 0 3px #FFFFFF !important;
3589 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 0 3px #FFFFFF !important;
3588 }
3590 }
3589
3591
3590 .ui-btn.disabled:hover {
3592 .ui-btn.disabled:hover {
3591 background-position: 0;
3593 background-position: 0;
3592 color: #999;
3594 color: #999;
3593 text-decoration: none;
3595 text-decoration: none;
3594 box-shadow: none !important;
3596 box-shadow: none !important;
3595 }
3597 }
3596
3598
3597 .ui-btn.red {
3599 .ui-btn.red {
3598 color: #fff;
3600 color: #fff;
3599 background-color: #c43c35;
3601 background-color: #c43c35;
3600 background-repeat: repeat-x;
3602 background-repeat: repeat-x;
3601 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
3603 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
3602 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3604 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3603 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3605 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3604 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
3606 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
3605 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3607 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3606 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3608 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3607 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3609 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3608 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
3610 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
3609 border-color: #c43c35 #c43c35 #882a25;
3611 border-color: #c43c35 #c43c35 #882a25;
3610 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3612 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3611 }
3613 }
3612
3614
3613
3615
3614 .ui-btn.blue {
3616 .ui-btn.blue {
3615 color: #fff;
3617 color: #fff;
3616 background-color: #339bb9;
3618 background-color: #339bb9;
3617 background-repeat: repeat-x;
3619 background-repeat: repeat-x;
3618 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
3620 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
3619 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3621 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3620 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3622 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3621 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
3623 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
3622 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3624 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3623 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3625 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3624 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3626 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3625 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
3627 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
3626 border-color: #339bb9 #339bb9 #22697d;
3628 border-color: #339bb9 #339bb9 #22697d;
3627 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3629 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3628 }
3630 }
3629
3631
3630 .ui-btn.green {
3632 .ui-btn.green {
3631 background-color: #57a957;
3633 background-color: #57a957;
3632 background-repeat: repeat-x;
3634 background-repeat: repeat-x;
3633 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
3635 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
3634 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3636 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3635 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3637 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3636 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
3638 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
3637 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3639 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3638 background-image: -o-linear-gradient(top, #62c462, #57a957);
3640 background-image: -o-linear-gradient(top, #62c462, #57a957);
3639 background-image: linear-gradient(to bottom, #62c462, #57a957);
3641 background-image: linear-gradient(to bottom, #62c462, #57a957);
3640 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
3642 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
3641 border-color: #57a957 #57a957 #3d773d;
3643 border-color: #57a957 #57a957 #3d773d;
3642 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3644 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3643 }
3645 }
3644
3646
3645 .ui-btn.blue.hidden {
3647 .ui-btn.blue.hidden {
3646 display: none;
3648 display: none;
3647 }
3649 }
3648
3650
3649 .ui-btn.active {
3651 .ui-btn.active {
3650 font-weight: bold;
3652 font-weight: bold;
3651 }
3653 }
3652
3654
3653 ins, div.options a:hover {
3655 ins, div.options a:hover {
3654 text-decoration: none;
3656 text-decoration: none;
3655 }
3657 }
3656
3658
3657 img,
3659 img,
3658 #header #header-inner #quick li a:hover span.normal,
3660 #header #header-inner #quick li a:hover span.normal,
3659 #content div.box div.form div.fields div.field div.textarea table td table td a,
3661 #content div.box div.form div.fields div.field div.textarea table td table td a,
3660 #clone_url,
3662 #clone_url,
3661 #clone_url_id
3663 #clone_url_id
3662 {
3664 {
3663 border: none;
3665 border: none;
3664 }
3666 }
3665
3667
3666 img.icon, .right .merge img {
3668 img.icon, .right .merge img {
3667 vertical-align: bottom;
3669 vertical-align: bottom;
3668 }
3670 }
3669
3671
3670 #header ul#logged-user, #content div.box div.title ul.links,
3672 #header ul#logged-user, #content div.box div.title ul.links,
3671 #content div.box div.message div.dismiss,
3673 #content div.box div.message div.dismiss,
3672 #content div.box div.traffic div.legend ul {
3674 #content div.box div.traffic div.legend ul {
3673 float: right;
3675 float: right;
3674 margin: 0;
3676 margin: 0;
3675 padding: 0;
3677 padding: 0;
3676 }
3678 }
3677
3679
3678 #header #header-inner #home, #header #header-inner #logo,
3680 #header #header-inner #home, #header #header-inner #logo,
3679 #content div.box ul.left, #content div.box ol.left,
3681 #content div.box ul.left, #content div.box ol.left,
3680 div#commit_history,
3682 div#commit_history,
3681 div#legend_data, div#legend_container, div#legend_choices {
3683 div#legend_data, div#legend_container, div#legend_choices {
3682 float: left;
3684 float: left;
3683 }
3685 }
3684
3686
3685 #header #header-inner #quick li #quick_login,
3687 #header #header-inner #quick li #quick_login,
3686 #header #header-inner #quick li:hover ul ul,
3688 #header #header-inner #quick li:hover ul ul,
3687 #header #header-inner #quick li:hover ul ul ul,
3689 #header #header-inner #quick li:hover ul ul ul,
3688 #header #header-inner #quick li:hover ul ul ul ul,
3690 #header #header-inner #quick li:hover ul ul ul ul,
3689 #content #left #menu ul.closed, #content #left #menu li ul.collapsed, .yui-tt-shadow {
3691 #content #left #menu ul.closed, #content #left #menu li ul.collapsed, .yui-tt-shadow {
3690 display: none;
3692 display: none;
3691 }
3693 }
3692
3694
3693 #header #header-inner #quick li:hover #quick_login,
3695 #header #header-inner #quick li:hover #quick_login,
3694 #header #header-inner #quick li:hover ul, #header #header-inner #quick li li:hover ul, #header #header-inner #quick li li li:hover ul, #header #header-inner #quick li li li li:hover ul, #content #left #menu ul.opened, #content #left #menu li ul.expanded {
3696 #header #header-inner #quick li:hover ul, #header #header-inner #quick li li:hover ul, #header #header-inner #quick li li li:hover ul, #header #header-inner #quick li li li li:hover ul, #content #left #menu ul.opened, #content #left #menu li ul.expanded {
3695 display: block;
3697 display: block;
3696 }
3698 }
3697
3699
3698 #content div.graph {
3700 #content div.graph {
3699 padding: 0 10px 10px;
3701 padding: 0 10px 10px;
3700 }
3702 }
3701
3703
3702 #content div.box div.title ul.links li a:hover,
3704 #content div.box div.title ul.links li a:hover,
3703 #content div.box div.title ul.links li.ui-tabs-selected a {
3705 #content div.box div.title ul.links li.ui-tabs-selected a {
3704
3706
3705 background: #6388ad; /* Old browsers */
3707 background: #6388ad; /* Old browsers */
3706 background: -moz-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* FF3.6+ */
3708 background: -moz-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* FF3.6+ */
3707 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,0.1)), color-stop(100%,rgba(255,255,255,0))); /* Chrome,Safari4+ */
3709 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,0.1)), color-stop(100%,rgba(255,255,255,0))); /* Chrome,Safari4+ */
3708 background: -webkit-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* Chrome10+,Safari5.1+ */
3710 background: -webkit-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* Chrome10+,Safari5.1+ */
3709 background: -o-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* Opera 11.10+ */
3711 background: -o-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* Opera 11.10+ */
3710 background: -ms-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* IE10+ */
3712 background: -ms-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* IE10+ */
3711 background: linear-gradient(to bottom, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* W3C */
3713 background: linear-gradient(to bottom, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* W3C */
3712 /*filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#88bfe8', endColorstr='#70b0e0',GradientType=0 ); /* IE6-9 */*/
3714 /*filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#88bfe8', endColorstr='#70b0e0',GradientType=0 ); /* IE6-9 */*/
3713 }
3715 }
3714
3716
3715 #content div.box ol.lower-roman, #content div.box ol.upper-roman, #content div.box ol.lower-alpha, #content div.box ol.upper-alpha, #content div.box ol.decimal {
3717 #content div.box ol.lower-roman, #content div.box ol.upper-roman, #content div.box ol.lower-alpha, #content div.box ol.upper-alpha, #content div.box ol.decimal {
3716 margin: 10px 24px 10px 44px;
3718 margin: 10px 24px 10px 44px;
3717 }
3719 }
3718
3720
3719 #content div.box div.form, #content div.box div.table, #content div.box div.traffic {
3721 #content div.box div.form, #content div.box div.table, #content div.box div.traffic {
3720 position: relative;
3722 position: relative;
3721 clear: both;
3723 clear: both;
3722 margin: 0;
3724 margin: 0;
3723 padding: 0 20px 10px;
3725 padding: 0 20px 10px;
3724 }
3726 }
3725
3727
3726 #content div.box div.form div.fields, #login div.form, #login div.form div.fields, #register div.form, #register div.form div.fields {
3728 #content div.box div.form div.fields, #login div.form, #login div.form div.fields, #register div.form, #register div.form div.fields {
3727 clear: both;
3729 clear: both;
3728 overflow: hidden;
3730 overflow: hidden;
3729 margin: 0;
3731 margin: 0;
3730 padding: 0;
3732 padding: 0;
3731 }
3733 }
3732
3734
3733 #content div.box div.form div.fields div.field div.label span, #login div.form div.fields div.field div.label span, #register div.form div.fields div.field div.label span {
3735 #content div.box div.form div.fields div.field div.label span, #login div.form div.fields div.field div.label span, #register div.form div.fields div.field div.label span {
3734 height: 1%;
3736 height: 1%;
3735 display: block;
3737 display: block;
3736 color: #363636;
3738 color: #363636;
3737 margin: 0;
3739 margin: 0;
3738 padding: 2px 0 0;
3740 padding: 2px 0 0;
3739 }
3741 }
3740
3742
3741 #content div.box div.form div.fields div.field div.input input.error, #login div.form div.fields div.field div.input input.error, #register div.form div.fields div.field div.input input.error {
3743 #content div.box div.form div.fields div.field div.input input.error, #login div.form div.fields div.field div.input input.error, #register div.form div.fields div.field div.input input.error {
3742 background: #FBE3E4;
3744 background: #FBE3E4;
3743 border-top: 1px solid #e1b2b3;
3745 border-top: 1px solid #e1b2b3;
3744 border-left: 1px solid #e1b2b3;
3746 border-left: 1px solid #e1b2b3;
3745 border-right: 1px solid #FBC2C4;
3747 border-right: 1px solid #FBC2C4;
3746 border-bottom: 1px solid #FBC2C4;
3748 border-bottom: 1px solid #FBC2C4;
3747 }
3749 }
3748
3750
3749 #content div.box div.form div.fields div.field div.input input.success, #login div.form div.fields div.field div.input input.success, #register div.form div.fields div.field div.input input.success {
3751 #content div.box div.form div.fields div.field div.input input.success, #login div.form div.fields div.field div.input input.success, #register div.form div.fields div.field div.input input.success {
3750 background: #E6EFC2;
3752 background: #E6EFC2;
3751 border-top: 1px solid #cebb98;
3753 border-top: 1px solid #cebb98;
3752 border-left: 1px solid #cebb98;
3754 border-left: 1px solid #cebb98;
3753 border-right: 1px solid #c6d880;
3755 border-right: 1px solid #c6d880;
3754 border-bottom: 1px solid #c6d880;
3756 border-bottom: 1px solid #c6d880;
3755 }
3757 }
3756
3758
3757 #content div.box-left div.form div.fields div.field div.textarea, #content div.box-right div.form div.fields div.field div.textarea, #content div.box div.form div.fields div.field div.select select, #content div.box table th.selected input, #content div.box table td.selected input {
3759 #content div.box-left div.form div.fields div.field div.textarea, #content div.box-right div.form div.fields div.field div.textarea, #content div.box div.form div.fields div.field div.select select, #content div.box table th.selected input, #content div.box table td.selected input {
3758 margin: 0;
3760 margin: 0;
3759 }
3761 }
3760
3762
3761 #content div.box-left div.form div.fields div.field div.select, #content div.box-left div.form div.fields div.field div.checkboxes, #content div.box-left div.form div.fields div.field div.radios, #content div.box-right div.form div.fields div.field div.select, #content div.box-right div.form div.fields div.field div.checkboxes, #content div.box-right div.form div.fields div.field div.radios {
3763 #content div.box-left div.form div.fields div.field div.select, #content div.box-left div.form div.fields div.field div.checkboxes, #content div.box-left div.form div.fields div.field div.radios, #content div.box-right div.form div.fields div.field div.select, #content div.box-right div.form div.fields div.field div.checkboxes, #content div.box-right div.form div.fields div.field div.radios {
3762 margin: 0 0 0 0px !important;
3764 margin: 0 0 0 0px !important;
3763 padding: 0;
3765 padding: 0;
3764 }
3766 }
3765
3767
3766 #content div.box div.form div.fields div.field div.select, #content div.box div.form div.fields div.field div.checkboxes, #content div.box div.form div.fields div.field div.radios {
3768 #content div.box div.form div.fields div.field div.select, #content div.box div.form div.fields div.field div.checkboxes, #content div.box div.form div.fields div.field div.radios {
3767 margin: 0 0 0 200px;
3769 margin: 0 0 0 200px;
3768 padding: 0;
3770 padding: 0;
3769 }
3771 }
3770
3772
3771 #content div.box div.form div.fields div.field div.select a:hover, #content div.box div.form div.fields div.field div.select a.ui-selectmenu:hover, #content div.box div.action a:hover {
3773 #content div.box div.form div.fields div.field div.select a:hover, #content div.box div.form div.fields div.field div.select a.ui-selectmenu:hover, #content div.box div.action a:hover {
3772 color: #000;
3774 color: #000;
3773 text-decoration: none;
3775 text-decoration: none;
3774 }
3776 }
3775
3777
3776 #content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus, #content div.box div.action a.ui-selectmenu-focus {
3778 #content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus, #content div.box div.action a.ui-selectmenu-focus {
3777 border: 1px solid #666;
3779 border: 1px solid #666;
3778 }
3780 }
3779
3781
3780 #content div.box div.form div.fields div.field div.checkboxes div.checkbox, #content div.box div.form div.fields div.field div.radios div.radio {
3782 #content div.box div.form div.fields div.field div.checkboxes div.checkbox, #content div.box div.form div.fields div.field div.radios div.radio {
3781 clear: both;
3783 clear: both;
3782 overflow: hidden;
3784 overflow: hidden;
3783 margin: 0;
3785 margin: 0;
3784 padding: 8px 0 2px;
3786 padding: 8px 0 2px;
3785 }
3787 }
3786
3788
3787 #content div.box div.form div.fields div.field div.checkboxes div.checkbox input, #content div.box div.form div.fields div.field div.radios div.radio input {
3789 #content div.box div.form div.fields div.field div.checkboxes div.checkbox input, #content div.box div.form div.fields div.field div.radios div.radio input {
3788 float: left;
3790 float: left;
3789 margin: 0;
3791 margin: 0;
3790 }
3792 }
3791
3793
3792 #content div.box div.form div.fields div.field div.checkboxes div.checkbox label, #content div.box div.form div.fields div.field div.radios div.radio label {
3794 #content div.box div.form div.fields div.field div.checkboxes div.checkbox label, #content div.box div.form div.fields div.field div.radios div.radio label {
3793 height: 1%;
3795 height: 1%;
3794 display: block;
3796 display: block;
3795 float: left;
3797 float: left;
3796 margin: 2px 0 0 4px;
3798 margin: 2px 0 0 4px;
3797 }
3799 }
3798
3800
3799 div.form div.fields div.field div.button input,
3801 div.form div.fields div.field div.button input,
3800 #content div.box div.form div.fields div.buttons input
3802 #content div.box div.form div.fields div.buttons input
3801 div.form div.fields div.buttons input,
3803 div.form div.fields div.buttons input,
3802 #content div.box div.action div.button input {
3804 #content div.box div.action div.button input {
3803 font-size: 11px;
3805 font-size: 11px;
3804 font-weight: 700;
3806 font-weight: 700;
3805 margin: 0;
3807 margin: 0;
3806 }
3808 }
3807
3809
3808 input.ui-button {
3810 input.ui-button {
3809 background: #e5e3e3 url("../images/button.png") repeat-x;
3811 background: #e5e3e3 url("../images/button.png") repeat-x;
3810 border-top: 1px solid #DDD;
3812 border-top: 1px solid #DDD;
3811 border-left: 1px solid #c6c6c6;
3813 border-left: 1px solid #c6c6c6;
3812 border-right: 1px solid #DDD;
3814 border-right: 1px solid #DDD;
3813 border-bottom: 1px solid #c6c6c6;
3815 border-bottom: 1px solid #c6c6c6;
3814 color: #515151 !important;
3816 color: #515151 !important;
3815 outline: none;
3817 outline: none;
3816 margin: 0;
3818 margin: 0;
3817 padding: 6px 12px;
3819 padding: 6px 12px;
3818 -webkit-border-radius: 4px 4px 4px 4px;
3820 -webkit-border-radius: 4px 4px 4px 4px;
3819 -khtml-border-radius: 4px 4px 4px 4px;
3821 -khtml-border-radius: 4px 4px 4px 4px;
3820 border-radius: 4px 4px 4px 4px;
3822 border-radius: 4px 4px 4px 4px;
3821 box-shadow: 0 1px 0 #ececec;
3823 box-shadow: 0 1px 0 #ececec;
3822 cursor: pointer;
3824 cursor: pointer;
3823 }
3825 }
3824
3826
3825 input.ui-button:hover {
3827 input.ui-button:hover {
3826 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3828 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3827 border-top: 1px solid #ccc;
3829 border-top: 1px solid #ccc;
3828 border-left: 1px solid #bebebe;
3830 border-left: 1px solid #bebebe;
3829 border-right: 1px solid #b1b1b1;
3831 border-right: 1px solid #b1b1b1;
3830 border-bottom: 1px solid #afafaf;
3832 border-bottom: 1px solid #afafaf;
3831 }
3833 }
3832
3834
3833 div.form div.fields div.field div.highlight, #content div.box div.form div.fields div.buttons div.highlight {
3835 div.form div.fields div.field div.highlight, #content div.box div.form div.fields div.buttons div.highlight {
3834 display: inline;
3836 display: inline;
3835 }
3837 }
3836
3838
3837 #content div.box div.form div.fields div.buttons, div.form div.fields div.buttons {
3839 #content div.box div.form div.fields div.buttons, div.form div.fields div.buttons {
3838 margin: 10px 0 0 200px;
3840 margin: 10px 0 0 200px;
3839 padding: 0;
3841 padding: 0;
3840 }
3842 }
3841
3843
3842 #content div.box-left div.form div.fields div.buttons, #content div.box-right div.form div.fields div.buttons, div.box-left div.form div.fields div.buttons, div.box-right div.form div.fields div.buttons {
3844 #content div.box-left div.form div.fields div.buttons, #content div.box-right div.form div.fields div.buttons, div.box-left div.form div.fields div.buttons, div.box-right div.form div.fields div.buttons {
3843 margin: 10px 0 0;
3845 margin: 10px 0 0;
3844 }
3846 }
3845
3847
3846 #content div.box table td.user, #content div.box table td.address {
3848 #content div.box table td.user, #content div.box table td.address {
3847 width: 10%;
3849 width: 10%;
3848 text-align: center;
3850 text-align: center;
3849 }
3851 }
3850
3852
3851 #content div.box div.action div.button, #login div.form div.fields div.field div.input div.link, #register div.form div.fields div.field div.input div.link {
3853 #content div.box div.action div.button, #login div.form div.fields div.field div.input div.link, #register div.form div.fields div.field div.input div.link {
3852 text-align: right;
3854 text-align: right;
3853 margin: 6px 0 0;
3855 margin: 6px 0 0;
3854 padding: 0;
3856 padding: 0;
3855 }
3857 }
3856
3858
3857 #content div.box div.action div.button input.ui-state-hover, #login div.form div.fields div.buttons input.ui-state-hover, #register div.form div.fields div.buttons input.ui-state-hover {
3859 #content div.box div.action div.button input.ui-state-hover, #login div.form div.fields div.buttons input.ui-state-hover, #register div.form div.fields div.buttons input.ui-state-hover {
3858 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3860 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3859 border-top: 1px solid #ccc;
3861 border-top: 1px solid #ccc;
3860 border-left: 1px solid #bebebe;
3862 border-left: 1px solid #bebebe;
3861 border-right: 1px solid #b1b1b1;
3863 border-right: 1px solid #b1b1b1;
3862 border-bottom: 1px solid #afafaf;
3864 border-bottom: 1px solid #afafaf;
3863 color: #515151;
3865 color: #515151;
3864 margin: 0;
3866 margin: 0;
3865 padding: 6px 12px;
3867 padding: 6px 12px;
3866 }
3868 }
3867
3869
3868 #content div.box div.pagination div.results, #content div.box div.pagination-wh div.results {
3870 #content div.box div.pagination div.results, #content div.box div.pagination-wh div.results {
3869 text-align: left;
3871 text-align: left;
3870 float: left;
3872 float: left;
3871 margin: 0;
3873 margin: 0;
3872 padding: 0;
3874 padding: 0;
3873 }
3875 }
3874
3876
3875 #content div.box div.pagination div.results span, #content div.box div.pagination-wh div.results span {
3877 #content div.box div.pagination div.results span, #content div.box div.pagination-wh div.results span {
3876 height: 1%;
3878 height: 1%;
3877 display: block;
3879 display: block;
3878 float: left;
3880 float: left;
3879 background: #ebebeb url("../images/pager.png") repeat-x;
3881 background: #ebebeb url("../images/pager.png") repeat-x;
3880 border-top: 1px solid #dedede;
3882 border-top: 1px solid #dedede;
3881 border-left: 1px solid #cfcfcf;
3883 border-left: 1px solid #cfcfcf;
3882 border-right: 1px solid #c4c4c4;
3884 border-right: 1px solid #c4c4c4;
3883 border-bottom: 1px solid #c4c4c4;
3885 border-bottom: 1px solid #c4c4c4;
3884 color: #4A4A4A;
3886 color: #4A4A4A;
3885 font-weight: 700;
3887 font-weight: 700;
3886 margin: 0;
3888 margin: 0;
3887 padding: 6px 8px;
3889 padding: 6px 8px;
3888 }
3890 }
3889
3891
3890 #content div.box div.pagination ul.pager li.disabled, #content div.box div.pagination-wh a.disabled {
3892 #content div.box div.pagination ul.pager li.disabled, #content div.box div.pagination-wh a.disabled {
3891 color: #B4B4B4;
3893 color: #B4B4B4;
3892 padding: 6px;
3894 padding: 6px;
3893 }
3895 }
3894
3896
3895 #login, #register {
3897 #login, #register {
3896 width: 520px;
3898 width: 520px;
3897 margin: 10% auto 0;
3899 margin: 10% auto 0;
3898 padding: 0;
3900 padding: 0;
3899 }
3901 }
3900
3902
3901 #login div.color, #register div.color {
3903 #login div.color, #register div.color {
3902 clear: both;
3904 clear: both;
3903 overflow: hidden;
3905 overflow: hidden;
3904 background: #FFF;
3906 background: #FFF;
3905 margin: 10px auto 0;
3907 margin: 10px auto 0;
3906 padding: 3px 3px 3px 0;
3908 padding: 3px 3px 3px 0;
3907 }
3909 }
3908
3910
3909 #login div.color a, #register div.color a {
3911 #login div.color a, #register div.color a {
3910 width: 20px;
3912 width: 20px;
3911 height: 20px;
3913 height: 20px;
3912 display: block;
3914 display: block;
3913 float: left;
3915 float: left;
3914 margin: 0 0 0 3px;
3916 margin: 0 0 0 3px;
3915 padding: 0;
3917 padding: 0;
3916 }
3918 }
3917
3919
3918 #login div.title h5, #register div.title h5 {
3920 #login div.title h5, #register div.title h5 {
3919 color: #fff;
3921 color: #fff;
3920 margin: 10px;
3922 margin: 10px;
3921 padding: 0;
3923 padding: 0;
3922 }
3924 }
3923
3925
3924 #login div.form div.fields div.field, #register div.form div.fields div.field {
3926 #login div.form div.fields div.field, #register div.form div.fields div.field {
3925 clear: both;
3927 clear: both;
3926 overflow: hidden;
3928 overflow: hidden;
3927 margin: 0;
3929 margin: 0;
3928 padding: 0 0 10px;
3930 padding: 0 0 10px;
3929 }
3931 }
3930
3932
3931 #login div.form div.fields div.field span.error-message, #register div.form div.fields div.field span.error-message {
3933 #login div.form div.fields div.field span.error-message, #register div.form div.fields div.field span.error-message {
3932 height: 1%;
3934 height: 1%;
3933 display: block;
3935 display: block;
3934 color: red;
3936 color: red;
3935 margin: 8px 0 0;
3937 margin: 8px 0 0;
3936 padding: 0;
3938 padding: 0;
3937 max-width: 320px;
3939 max-width: 320px;
3938 }
3940 }
3939
3941
3940 #login div.form div.fields div.field div.label label, #register div.form div.fields div.field div.label label {
3942 #login div.form div.fields div.field div.label label, #register div.form div.fields div.field div.label label {
3941 color: #000;
3943 color: #000;
3942 font-weight: 700;
3944 font-weight: 700;
3943 }
3945 }
3944
3946
3945 #login div.form div.fields div.field div.input, #register div.form div.fields div.field div.input {
3947 #login div.form div.fields div.field div.input, #register div.form div.fields div.field div.input {
3946 float: left;
3948 float: left;
3947 margin: 0;
3949 margin: 0;
3948 padding: 0;
3950 padding: 0;
3949 }
3951 }
3950
3952
3951 #login div.form div.fields div.field div.input input.large {
3953 #login div.form div.fields div.field div.input input.large {
3952 width: 250px;
3954 width: 250px;
3953 }
3955 }
3954
3956
3955 #login div.form div.fields div.field div.checkbox, #register div.form div.fields div.field div.checkbox {
3957 #login div.form div.fields div.field div.checkbox, #register div.form div.fields div.field div.checkbox {
3956 margin: 0 0 0 184px;
3958 margin: 0 0 0 184px;
3957 padding: 0;
3959 padding: 0;
3958 }
3960 }
3959
3961
3960 #login div.form div.fields div.field div.checkbox label, #register div.form div.fields div.field div.checkbox label {
3962 #login div.form div.fields div.field div.checkbox label, #register div.form div.fields div.field div.checkbox label {
3961 color: #565656;
3963 color: #565656;
3962 font-weight: 700;
3964 font-weight: 700;
3963 }
3965 }
3964
3966
3965 #login div.form div.fields div.buttons input, #register div.form div.fields div.buttons input {
3967 #login div.form div.fields div.buttons input, #register div.form div.fields div.buttons input {
3966 color: #000;
3968 color: #000;
3967 font-size: 1em;
3969 font-size: 1em;
3968 font-weight: 700;
3970 font-weight: 700;
3969 margin: 0;
3971 margin: 0;
3970 }
3972 }
3971
3973
3972 #changeset_content .container .wrapper, #graph_content .container .wrapper {
3974 #changeset_content .container .wrapper, #graph_content .container .wrapper {
3973 width: 600px;
3975 width: 600px;
3974 }
3976 }
3975
3977
3976 #changeset_content .container .date, .ac .match {
3978 #changeset_content .container .date, .ac .match {
3977 font-weight: 700;
3979 font-weight: 700;
3978 padding-top: 5px;
3980 padding-top: 5px;
3979 padding-bottom: 5px;
3981 padding-bottom: 5px;
3980 }
3982 }
3981
3983
3982 div#legend_container table td, div#legend_choices table td {
3984 div#legend_container table td, div#legend_choices table td {
3983 border: none !important;
3985 border: none !important;
3984 height: 20px !important;
3986 height: 20px !important;
3985 padding: 0 !important;
3987 padding: 0 !important;
3986 }
3988 }
3987
3989
3988 .q_filter_box {
3990 .q_filter_box {
3989 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
3991 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
3990 -webkit-border-radius: 4px;
3992 -webkit-border-radius: 4px;
3991 border-radius: 4px;
3993 border-radius: 4px;
3992 border: 0 none;
3994 border: 0 none;
3993 color: #AAAAAA;
3995 color: #AAAAAA;
3994 margin-bottom: -4px;
3996 margin-bottom: -4px;
3995 margin-top: -4px;
3997 margin-top: -4px;
3996 padding-left: 3px;
3998 padding-left: 3px;
3997 }
3999 }
3998
4000
3999 #node_filter {
4001 #node_filter {
4000 border: 0px solid #545454;
4002 border: 0px solid #545454;
4001 color: #AAAAAA;
4003 color: #AAAAAA;
4002 padding-left: 3px;
4004 padding-left: 3px;
4003 }
4005 }
4004
4006
4005
4007
4006 .group_members_wrap {
4008 .group_members_wrap {
4007 min-height: 85px;
4009 min-height: 85px;
4008 padding-left: 20px;
4010 padding-left: 20px;
4009 }
4011 }
4010
4012
4011 .group_members .group_member {
4013 .group_members .group_member {
4012 height: 30px;
4014 height: 30px;
4013 padding: 0px 0px 0px 0px;
4015 padding: 0px 0px 0px 0px;
4014 }
4016 }
4015
4017
4016 .reviewers_member {
4018 .reviewers_member {
4017 height: 15px;
4019 height: 15px;
4018 padding: 0px 0px 0px 10px;
4020 padding: 0px 0px 0px 10px;
4019 }
4021 }
4020
4022
4021 .emails_wrap {
4023 .emails_wrap {
4022 padding: 0px 20px;
4024 padding: 0px 20px;
4023 }
4025 }
4024
4026
4025 .emails_wrap .email_entry {
4027 .emails_wrap .email_entry {
4026 height: 30px;
4028 height: 30px;
4027 padding: 0px 0px 0px 10px;
4029 padding: 0px 0px 0px 10px;
4028 }
4030 }
4029 .emails_wrap .email_entry .email {
4031 .emails_wrap .email_entry .email {
4030 float: left
4032 float: left
4031 }
4033 }
4032 .emails_wrap .email_entry .email_action {
4034 .emails_wrap .email_entry .email_action {
4033 float: left
4035 float: left
4034 }
4036 }
4035
4037
4036 .ips_wrap {
4038 .ips_wrap {
4037 padding: 0px 20px;
4039 padding: 0px 20px;
4038 }
4040 }
4039
4041
4040 .ips_wrap .ip_entry {
4042 .ips_wrap .ip_entry {
4041 height: 30px;
4043 height: 30px;
4042 padding: 0px 0px 0px 10px;
4044 padding: 0px 0px 0px 10px;
4043 }
4045 }
4044 .ips_wrap .ip_entry .ip {
4046 .ips_wrap .ip_entry .ip {
4045 float: left
4047 float: left
4046 }
4048 }
4047 .ips_wrap .ip_entry .ip_action {
4049 .ips_wrap .ip_entry .ip_action {
4048 float: left
4050 float: left
4049 }
4051 }
4050
4052
4051
4053
4052 /*README STYLE*/
4054 /*README STYLE*/
4053
4055
4054 div.readme {
4056 div.readme {
4055 padding: 0px;
4057 padding: 0px;
4056 }
4058 }
4057
4059
4058 div.readme h2 {
4060 div.readme h2 {
4059 font-weight: normal;
4061 font-weight: normal;
4060 }
4062 }
4061
4063
4062 div.readme .readme_box {
4064 div.readme .readme_box {
4063 background-color: #fafafa;
4065 background-color: #fafafa;
4064 }
4066 }
4065
4067
4066 div.readme .readme_box {
4068 div.readme .readme_box {
4067 clear: both;
4069 clear: both;
4068 overflow: hidden;
4070 overflow: hidden;
4069 margin: 0;
4071 margin: 0;
4070 padding: 0 20px 10px;
4072 padding: 0 20px 10px;
4071 }
4073 }
4072
4074
4073 div.readme .readme_box h1, div.readme .readme_box h2, div.readme .readme_box h3, div.readme .readme_box h4, div.readme .readme_box h5, div.readme .readme_box h6 {
4075 div.readme .readme_box h1, div.readme .readme_box h2, div.readme .readme_box h3, div.readme .readme_box h4, div.readme .readme_box h5, div.readme .readme_box h6 {
4074 border-bottom: 0 !important;
4076 border-bottom: 0 !important;
4075 margin: 0 !important;
4077 margin: 0 !important;
4076 padding: 0 !important;
4078 padding: 0 !important;
4077 line-height: 1.5em !important;
4079 line-height: 1.5em !important;
4078 }
4080 }
4079
4081
4080
4082
4081 div.readme .readme_box h1:first-child {
4083 div.readme .readme_box h1:first-child {
4082 padding-top: .25em !important;
4084 padding-top: .25em !important;
4083 }
4085 }
4084
4086
4085 div.readme .readme_box h2, div.readme .readme_box h3 {
4087 div.readme .readme_box h2, div.readme .readme_box h3 {
4086 margin: 1em 0 !important;
4088 margin: 1em 0 !important;
4087 }
4089 }
4088
4090
4089 div.readme .readme_box h2 {
4091 div.readme .readme_box h2 {
4090 margin-top: 1.5em !important;
4092 margin-top: 1.5em !important;
4091 border-top: 4px solid #e0e0e0 !important;
4093 border-top: 4px solid #e0e0e0 !important;
4092 padding-top: .5em !important;
4094 padding-top: .5em !important;
4093 }
4095 }
4094
4096
4095 div.readme .readme_box p {
4097 div.readme .readme_box p {
4096 color: black !important;
4098 color: black !important;
4097 margin: 1em 0 !important;
4099 margin: 1em 0 !important;
4098 line-height: 1.5em !important;
4100 line-height: 1.5em !important;
4099 }
4101 }
4100
4102
4101 div.readme .readme_box ul {
4103 div.readme .readme_box ul {
4102 list-style: disc !important;
4104 list-style: disc !important;
4103 margin: 1em 0 1em 2em !important;
4105 margin: 1em 0 1em 2em !important;
4104 }
4106 }
4105
4107
4106 div.readme .readme_box ol {
4108 div.readme .readme_box ol {
4107 list-style: decimal;
4109 list-style: decimal;
4108 margin: 1em 0 1em 2em !important;
4110 margin: 1em 0 1em 2em !important;
4109 }
4111 }
4110
4112
4111 div.readme .readme_box pre, code {
4113 div.readme .readme_box pre, code {
4112 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
4114 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
4113 }
4115 }
4114
4116
4115 div.readme .readme_box code {
4117 div.readme .readme_box code {
4116 font-size: 12px !important;
4118 font-size: 12px !important;
4117 background-color: ghostWhite !important;
4119 background-color: ghostWhite !important;
4118 color: #444 !important;
4120 color: #444 !important;
4119 padding: 0 .2em !important;
4121 padding: 0 .2em !important;
4120 border: 1px solid #dedede !important;
4122 border: 1px solid #dedede !important;
4121 }
4123 }
4122
4124
4123 div.readme .readme_box pre code {
4125 div.readme .readme_box pre code {
4124 padding: 0 !important;
4126 padding: 0 !important;
4125 font-size: 12px !important;
4127 font-size: 12px !important;
4126 background-color: #eee !important;
4128 background-color: #eee !important;
4127 border: none !important;
4129 border: none !important;
4128 }
4130 }
4129
4131
4130 div.readme .readme_box pre {
4132 div.readme .readme_box pre {
4131 margin: 1em 0;
4133 margin: 1em 0;
4132 font-size: 12px;
4134 font-size: 12px;
4133 background-color: #eee;
4135 background-color: #eee;
4134 border: 1px solid #ddd;
4136 border: 1px solid #ddd;
4135 padding: 5px;
4137 padding: 5px;
4136 color: #444;
4138 color: #444;
4137 overflow: auto;
4139 overflow: auto;
4138 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4140 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4139 -webkit-border-radius: 3px;
4141 -webkit-border-radius: 3px;
4140 border-radius: 3px;
4142 border-radius: 3px;
4141 }
4143 }
4142
4144
4143 div.readme .readme_box table {
4145 div.readme .readme_box table {
4144 display: table;
4146 display: table;
4145 border-collapse: separate;
4147 border-collapse: separate;
4146 border-spacing: 2px;
4148 border-spacing: 2px;
4147 border-color: gray;
4149 border-color: gray;
4148 width: auto !important;
4150 width: auto !important;
4149 }
4151 }
4150
4152
4151
4153
4152 /** RST STYLE **/
4154 /** RST STYLE **/
4153
4155
4154
4156
4155 div.rst-block {
4157 div.rst-block {
4156 padding: 0px;
4158 padding: 0px;
4157 }
4159 }
4158
4160
4159 div.rst-block h2 {
4161 div.rst-block h2 {
4160 font-weight: normal;
4162 font-weight: normal;
4161 }
4163 }
4162
4164
4163 div.rst-block {
4165 div.rst-block {
4164 background-color: #fafafa;
4166 background-color: #fafafa;
4165 }
4167 }
4166
4168
4167 div.rst-block {
4169 div.rst-block {
4168 clear: both;
4170 clear: both;
4169 overflow: hidden;
4171 overflow: hidden;
4170 margin: 0;
4172 margin: 0;
4171 padding: 0 20px 10px;
4173 padding: 0 20px 10px;
4172 }
4174 }
4173
4175
4174 div.rst-block h1, div.rst-block h2, div.rst-block h3, div.rst-block h4, div.rst-block h5, div.rst-block h6 {
4176 div.rst-block h1, div.rst-block h2, div.rst-block h3, div.rst-block h4, div.rst-block h5, div.rst-block h6 {
4175 border-bottom: 0 !important;
4177 border-bottom: 0 !important;
4176 margin: 0 !important;
4178 margin: 0 !important;
4177 padding: 0 !important;
4179 padding: 0 !important;
4178 line-height: 1.5em !important;
4180 line-height: 1.5em !important;
4179 }
4181 }
4180
4182
4181
4183
4182 div.rst-block h1:first-child {
4184 div.rst-block h1:first-child {
4183 padding-top: .25em !important;
4185 padding-top: .25em !important;
4184 }
4186 }
4185
4187
4186 div.rst-block h2, div.rst-block h3 {
4188 div.rst-block h2, div.rst-block h3 {
4187 margin: 1em 0 !important;
4189 margin: 1em 0 !important;
4188 }
4190 }
4189
4191
4190 div.rst-block h2 {
4192 div.rst-block h2 {
4191 margin-top: 1.5em !important;
4193 margin-top: 1.5em !important;
4192 border-top: 4px solid #e0e0e0 !important;
4194 border-top: 4px solid #e0e0e0 !important;
4193 padding-top: .5em !important;
4195 padding-top: .5em !important;
4194 }
4196 }
4195
4197
4196 div.rst-block p {
4198 div.rst-block p {
4197 color: black !important;
4199 color: black !important;
4198 margin: 1em 0 !important;
4200 margin: 1em 0 !important;
4199 line-height: 1.5em !important;
4201 line-height: 1.5em !important;
4200 }
4202 }
4201
4203
4202 div.rst-block ul {
4204 div.rst-block ul {
4203 list-style: disc !important;
4205 list-style: disc !important;
4204 margin: 1em 0 1em 2em !important;
4206 margin: 1em 0 1em 2em !important;
4205 }
4207 }
4206
4208
4207 div.rst-block ol {
4209 div.rst-block ol {
4208 list-style: decimal;
4210 list-style: decimal;
4209 margin: 1em 0 1em 2em !important;
4211 margin: 1em 0 1em 2em !important;
4210 }
4212 }
4211
4213
4212 div.rst-block pre, code {
4214 div.rst-block pre, code {
4213 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
4215 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
4214 }
4216 }
4215
4217
4216 div.rst-block code {
4218 div.rst-block code {
4217 font-size: 12px !important;
4219 font-size: 12px !important;
4218 background-color: ghostWhite !important;
4220 background-color: ghostWhite !important;
4219 color: #444 !important;
4221 color: #444 !important;
4220 padding: 0 .2em !important;
4222 padding: 0 .2em !important;
4221 border: 1px solid #dedede !important;
4223 border: 1px solid #dedede !important;
4222 }
4224 }
4223
4225
4224 div.rst-block pre code {
4226 div.rst-block pre code {
4225 padding: 0 !important;
4227 padding: 0 !important;
4226 font-size: 12px !important;
4228 font-size: 12px !important;
4227 background-color: #eee !important;
4229 background-color: #eee !important;
4228 border: none !important;
4230 border: none !important;
4229 }
4231 }
4230
4232
4231 div.rst-block pre {
4233 div.rst-block pre {
4232 margin: 1em 0;
4234 margin: 1em 0;
4233 font-size: 12px;
4235 font-size: 12px;
4234 background-color: #eee;
4236 background-color: #eee;
4235 border: 1px solid #ddd;
4237 border: 1px solid #ddd;
4236 padding: 5px;
4238 padding: 5px;
4237 color: #444;
4239 color: #444;
4238 overflow: auto;
4240 overflow: auto;
4239 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4241 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4240 -webkit-border-radius: 3px;
4242 -webkit-border-radius: 3px;
4241 border-radius: 3px;
4243 border-radius: 3px;
4242 }
4244 }
4243
4245
4244
4246
4245 /** comment main **/
4247 /** comment main **/
4246 .comments {
4248 .comments {
4247 padding: 10px 20px;
4249 padding: 10px 20px;
4248 }
4250 }
4249
4251
4250 .comments .comment {
4252 .comments .comment {
4251 border: 1px solid #ddd;
4253 border: 1px solid #ddd;
4252 margin-top: 10px;
4254 margin-top: 10px;
4253 -webkit-border-radius: 4px;
4255 -webkit-border-radius: 4px;
4254 border-radius: 4px;
4256 border-radius: 4px;
4255 }
4257 }
4256
4258
4257 .comments .comment .meta {
4259 .comments .comment .meta {
4258 background: #f8f8f8;
4260 background: #f8f8f8;
4259 padding: 4px;
4261 padding: 4px;
4260 border-bottom: 1px solid #ddd;
4262 border-bottom: 1px solid #ddd;
4261 height: 18px;
4263 height: 18px;
4262 }
4264 }
4263
4265
4264 .comments .comment .meta img {
4266 .comments .comment .meta img {
4265 vertical-align: middle;
4267 vertical-align: middle;
4266 }
4268 }
4267
4269
4268 .comments .comment .meta .user {
4270 .comments .comment .meta .user {
4269 font-weight: bold;
4271 font-weight: bold;
4270 float: left;
4272 float: left;
4271 padding: 4px 2px 2px 2px;
4273 padding: 4px 2px 2px 2px;
4272 }
4274 }
4273
4275
4274 .comments .comment .meta .date {
4276 .comments .comment .meta .date {
4275 float: left;
4277 float: left;
4276 padding: 4px 4px 0px 4px;
4278 padding: 4px 4px 0px 4px;
4277 }
4279 }
4278
4280
4279 .comments .comment .text {
4281 .comments .comment .text {
4280 background-color: #FAFAFA;
4282 background-color: #FAFAFA;
4281 }
4283 }
4282 .comment .text div.rst-block p {
4284 .comment .text div.rst-block p {
4283 margin: 0.5em 0px !important;
4285 margin: 0.5em 0px !important;
4284 }
4286 }
4285
4287
4286 .comments .comments-number {
4288 .comments .comments-number {
4287 padding: 0px 0px 10px 0px;
4289 padding: 0px 0px 10px 0px;
4288 font-weight: bold;
4290 font-weight: bold;
4289 color: #666;
4291 color: #666;
4290 font-size: 16px;
4292 font-size: 16px;
4291 }
4293 }
4292
4294
4293 /** comment form **/
4295 /** comment form **/
4294
4296
4295 .status-block {
4297 .status-block {
4296 min-height: 80px;
4298 min-height: 80px;
4297 clear: both
4299 clear: both
4298 }
4300 }
4299
4301
4300 .comment-form .clearfix {
4301 background: #EEE;
4302 -webkit-border-radius: 4px;
4303 border-radius: 4px;
4304 padding: 10px;
4305 }
4306
4302
4307 div.comment-form {
4303 div.comment-form {
4308 margin-top: 20px;
4304 margin-top: 20px;
4309 }
4305 }
4310
4306
4311 .comment-form strong {
4307 .comment-form strong {
4312 display: block;
4308 display: block;
4313 margin-bottom: 15px;
4309 margin-bottom: 15px;
4314 }
4310 }
4315
4311
4316 .comment-form textarea {
4312 .comment-form textarea {
4317 width: 100%;
4313 width: 100%;
4318 height: 100px;
4314 height: 100px;
4319 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
4315 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
4320 }
4316 }
4321
4317
4322 form.comment-form {
4318 form.comment-form {
4323 margin-top: 10px;
4319 margin-top: 10px;
4324 margin-left: 10px;
4320 margin-left: 10px;
4325 }
4321 }
4326
4322
4323 .comment-inline-form .comment-block-ta,
4324 .comment-form .comment-block-ta {
4325 border: 1px solid #ccc;
4326 border-radius: 3px;
4327 box-sizing: border-box;
4328 }
4329
4327 .comment-form-submit {
4330 .comment-form-submit {
4328 margin-top: 5px;
4331 margin-top: 5px;
4329 margin-left: 525px;
4332 margin-left: 525px;
4330 }
4333 }
4331
4334
4332 .file-comments {
4335 .file-comments {
4333 display: none;
4336 display: none;
4334 }
4337 }
4335
4338
4336 .comment-form .comment {
4339 .comment-form .comment {
4337 margin-left: 10px;
4340 margin-left: 10px;
4338 }
4341 }
4339
4342
4340 .comment-form .comment-help {
4343 .comment-form .comment-help {
4341 padding: 0px 0px 5px 0px;
4344 padding: 5px 5px 5px 5px;
4342 color: #666;
4345 color: #666;
4343 }
4346 }
4347 .comment-form .comment-help .preview-btn,
4348 .comment-form .comment-help .edit-btn {
4349 float: right;
4350 margin: -6px 0px 0px 0px;
4351 }
4352
4353 .comment-form .preview-box.unloaded,
4354 .comment-inline-form .preview-box.unloaded {
4355 height: 50px;
4356 text-align: center;
4357 padding: 20px;
4358 background-color: #fafafa;
4359 }
4344
4360
4345 .comment-form .comment-button {
4361 .comment-form .comment-button {
4346 padding-top: 5px;
4362 padding-top: 5px;
4347 }
4363 }
4348
4364
4349 .add-another-button {
4365 .add-another-button {
4350 margin-left: 10px;
4366 margin-left: 10px;
4351 margin-top: 10px;
4367 margin-top: 10px;
4352 margin-bottom: 10px;
4368 margin-bottom: 10px;
4353 }
4369 }
4354
4370
4355 .comment .buttons {
4371 .comment .buttons {
4356 float: right;
4372 float: right;
4357 padding: 2px 2px 0px 0px;
4373 margin: -1px 0px 0px 0px;
4358 }
4374 }
4359
4375
4360
4376
4361 .show-inline-comments {
4377 .show-inline-comments {
4362 position: relative;
4378 position: relative;
4363 top: 1px
4379 top: 1px
4364 }
4380 }
4365
4381
4366 /** comment inline form **/
4382 /** comment inline form **/
4383 .comment-inline-form {
4384 margin: 4px;
4385 }
4367 .comment-inline-form .overlay {
4386 .comment-inline-form .overlay {
4368 display: none;
4387 display: none;
4369 }
4388 }
4370 .comment-inline-form .overlay.submitting {
4389 .comment-inline-form .overlay.submitting {
4371 display: block;
4390 display: block;
4372 background: none repeat scroll 0 0 white;
4391 background: none repeat scroll 0 0 white;
4373 font-size: 16px;
4392 font-size: 16px;
4374 opacity: 0.5;
4393 opacity: 0.5;
4375 position: absolute;
4394 position: absolute;
4376 text-align: center;
4395 text-align: center;
4377 vertical-align: top;
4396 vertical-align: top;
4378
4397
4379 }
4398 }
4380 .comment-inline-form .overlay.submitting .overlay-text {
4399 .comment-inline-form .overlay.submitting .overlay-text {
4381 width: 100%;
4400 width: 100%;
4382 margin-top: 5%;
4401 margin-top: 5%;
4383 }
4402 }
4384
4403
4385 .comment-inline-form .clearfix {
4404 .comment-inline-form .clearfix,
4405 .comment-form .clearfix {
4386 background: #EEE;
4406 background: #EEE;
4387 -webkit-border-radius: 4px;
4407 -webkit-border-radius: 4px;
4388 border-radius: 4px;
4408 border-radius: 4px;
4389 padding: 5px;
4409 padding: 5px;
4410 margin: 0px;
4390 }
4411 }
4391
4412
4392 div.comment-inline-form {
4413 div.comment-inline-form {
4393 padding: 4px 0px 6px 0px;
4414 padding: 4px 0px 6px 0px;
4394 }
4415 }
4395
4416
4396 .comment-inline-form strong {
4417 .comment-inline-form strong {
4397 display: block;
4418 display: block;
4398 margin-bottom: 15px;
4419 margin-bottom: 15px;
4399 }
4420 }
4400
4421
4401 .comment-inline-form textarea {
4422 .comment-inline-form textarea {
4402 width: 100%;
4423 width: 100%;
4403 height: 100px;
4424 height: 100px;
4404 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
4425 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
4405 }
4426 }
4406
4427
4407 form.comment-inline-form {
4428 form.comment-inline-form {
4408 margin-top: 10px;
4429 margin-top: 10px;
4409 margin-left: 10px;
4430 margin-left: 10px;
4410 }
4431 }
4411
4432
4412 .comment-inline-form-submit {
4433 .comment-inline-form-submit {
4413 margin-top: 5px;
4434 margin-top: 5px;
4414 margin-left: 525px;
4435 margin-left: 525px;
4415 }
4436 }
4416
4437
4417 .file-comments {
4438 .file-comments {
4418 display: none;
4439 display: none;
4419 }
4440 }
4420
4441
4421 .comment-inline-form .comment {
4442 .comment-inline-form .comment {
4422 margin-left: 10px;
4443 margin-left: 10px;
4423 }
4444 }
4424
4445
4425 .comment-inline-form .comment-help {
4446 .comment-inline-form .comment-help {
4426 padding: 0px 0px 2px 0px;
4447 padding: 5px 5px 5px 5px;
4427 color: #666666;
4448 color: #666;
4428 font-size: 10px;
4449 }
4450
4451 .comment-inline-form .comment-help .preview-btn,
4452 .comment-inline-form .comment-help .edit-btn {
4453 float: right;
4454 margin: -6px 0px 0px 0px;
4429 }
4455 }
4430
4456
4431 .comment-inline-form .comment-button {
4457 .comment-inline-form .comment-button {
4432 padding-top: 5px;
4458 padding-top: 5px;
4433 }
4459 }
4434
4460
4435 /** comment inline **/
4461 /** comment inline **/
4436 .inline-comments {
4462 .inline-comments {
4437 padding: 10px 20px;
4463 padding: 10px 20px;
4438 }
4464 }
4439
4465
4440 .inline-comments div.rst-block {
4466 .inline-comments div.rst-block {
4441 clear: both;
4467 clear: both;
4442 overflow: hidden;
4468 overflow: hidden;
4443 margin: 0;
4469 margin: 0;
4444 padding: 0 20px 0px;
4470 padding: 0 20px 0px;
4445 }
4471 }
4446 .inline-comments .comment {
4472 .inline-comments .comment {
4447 border: 1px solid #ddd;
4473 border: 1px solid #ddd;
4448 -webkit-border-radius: 4px;
4474 -webkit-border-radius: 4px;
4449 border-radius: 4px;
4475 border-radius: 4px;
4450 margin: 3px 3px 5px 5px;
4476 margin: 3px 3px 5px 5px;
4451 background-color: #FAFAFA;
4477 background-color: #FAFAFA;
4452 }
4478 }
4453 .inline-comments .add-comment {
4479 .inline-comments .add-comment {
4454 padding: 2px 4px 8px 5px;
4480 padding: 2px 4px 8px 5px;
4455 }
4481 }
4456
4482
4457 .inline-comments .comment-wrapp {
4483 .inline-comments .comment-wrapp {
4458 padding: 1px;
4484 padding: 1px;
4459 }
4485 }
4460 .inline-comments .comment .meta {
4486 .inline-comments .comment .meta {
4461 background: #f8f8f8;
4487 background: #f8f8f8;
4462 padding: 4px;
4488 padding: 4px;
4463 border-bottom: 1px solid #ddd;
4489 border-bottom: 1px solid #ddd;
4464 height: 20px;
4490 height: 20px;
4465 }
4491 }
4466
4492
4467 .inline-comments .comment .meta img {
4493 .inline-comments .comment .meta img {
4468 vertical-align: middle;
4494 vertical-align: middle;
4469 }
4495 }
4470
4496
4471 .inline-comments .comment .meta .user {
4497 .inline-comments .comment .meta .user {
4472 font-weight: bold;
4498 font-weight: bold;
4473 float: left;
4499 float: left;
4474 padding: 3px;
4500 padding: 3px;
4475 }
4501 }
4476
4502
4477 .inline-comments .comment .meta .date {
4503 .inline-comments .comment .meta .date {
4478 float: left;
4504 float: left;
4479 padding: 3px;
4505 padding: 3px;
4480 }
4506 }
4481
4507
4482 .inline-comments .comment .text {
4508 .inline-comments .comment .text {
4483 background-color: #FAFAFA;
4509 background-color: #FAFAFA;
4484 }
4510 }
4485
4511
4486 .inline-comments .comments-number {
4512 .inline-comments .comments-number {
4487 padding: 0px 0px 10px 0px;
4513 padding: 0px 0px 10px 0px;
4488 font-weight: bold;
4514 font-weight: bold;
4489 color: #666;
4515 color: #666;
4490 font-size: 16px;
4516 font-size: 16px;
4491 }
4517 }
4492 .inline-comments-button .add-comment {
4518 .inline-comments-button .add-comment {
4493 margin: 2px 0px 8px 5px !important
4519 margin: 2px 0px 8px 5px !important
4494 }
4520 }
4495
4521
4496 .notification-paginator {
4522 .notification-paginator {
4497 padding: 0px 0px 4px 16px;
4523 padding: 0px 0px 4px 16px;
4498 }
4524 }
4499
4525
4500 #context-pages .pull-request span,
4526 #context-pages .pull-request span,
4501 .menu_link_notifications {
4527 .menu_link_notifications {
4502 padding: 4px 4px !important;
4528 padding: 4px 4px !important;
4503 text-align: center;
4529 text-align: center;
4504 color: #888 !important;
4530 color: #888 !important;
4505 background-color: #DEDEDE !important;
4531 background-color: #DEDEDE !important;
4506 border-radius: 4px !important;
4532 border-radius: 4px !important;
4507 -webkit-border-radius: 4px !important;
4533 -webkit-border-radius: 4px !important;
4508 }
4534 }
4509
4535
4510 #context-pages .forks span,
4536 #context-pages .forks span,
4511 .menu_link_notifications {
4537 .menu_link_notifications {
4512 padding: 4px 4px !important;
4538 padding: 4px 4px !important;
4513 text-align: center;
4539 text-align: center;
4514 color: #888 !important;
4540 color: #888 !important;
4515 background-color: #DEDEDE !important;
4541 background-color: #DEDEDE !important;
4516 border-radius: 4px !important;
4542 border-radius: 4px !important;
4517 -webkit-border-radius: 4px !important;
4543 -webkit-border-radius: 4px !important;
4518 }
4544 }
4519
4545
4520
4546
4521 .notification-header {
4547 .notification-header {
4522 padding-top: 6px;
4548 padding-top: 6px;
4523 }
4549 }
4524 .notification-header .desc {
4550 .notification-header .desc {
4525 font-size: 16px;
4551 font-size: 16px;
4526 height: 24px;
4552 height: 24px;
4527 float: left
4553 float: left
4528 }
4554 }
4529 .notification-list .container.unread {
4555 .notification-list .container.unread {
4530 background: none repeat scroll 0 0 rgba(255, 255, 180, 0.6);
4556 background: none repeat scroll 0 0 rgba(255, 255, 180, 0.6);
4531 }
4557 }
4532 .notification-header .gravatar {
4558 .notification-header .gravatar {
4533 background: none repeat scroll 0 0 transparent;
4559 background: none repeat scroll 0 0 transparent;
4534 padding: 0px 0px 0px 8px;
4560 padding: 0px 0px 0px 8px;
4535 }
4561 }
4536 .notification-list .container .notification-header .desc {
4562 .notification-list .container .notification-header .desc {
4537 font-weight: bold;
4563 font-weight: bold;
4538 font-size: 17px;
4564 font-size: 17px;
4539 }
4565 }
4540 .notification-table {
4566 .notification-table {
4541 border: 1px solid #ccc;
4567 border: 1px solid #ccc;
4542 -webkit-border-radius: 6px 6px 6px 6px;
4568 -webkit-border-radius: 6px 6px 6px 6px;
4543 border-radius: 6px 6px 6px 6px;
4569 border-radius: 6px 6px 6px 6px;
4544 clear: both;
4570 clear: both;
4545 margin: 0px 20px 0px 20px;
4571 margin: 0px 20px 0px 20px;
4546 }
4572 }
4547 .notification-header .delete-notifications {
4573 .notification-header .delete-notifications {
4548 float: right;
4574 float: right;
4549 padding-top: 8px;
4575 padding-top: 8px;
4550 cursor: pointer;
4576 cursor: pointer;
4551 }
4577 }
4552 .notification-header .read-notifications {
4578 .notification-header .read-notifications {
4553 float: right;
4579 float: right;
4554 padding-top: 8px;
4580 padding-top: 8px;
4555 cursor: pointer;
4581 cursor: pointer;
4556 }
4582 }
4557 .notification-subject {
4583 .notification-subject {
4558 clear: both;
4584 clear: both;
4559 border-bottom: 1px solid #eee;
4585 border-bottom: 1px solid #eee;
4560 padding: 5px 0px 5px 38px;
4586 padding: 5px 0px 5px 38px;
4561 }
4587 }
4562
4588
4563 .notification-body {
4589 .notification-body {
4564 clear: both;
4590 clear: both;
4565 margin: 34px 2px 2px 8px
4591 margin: 34px 2px 2px 8px
4566 }
4592 }
4567
4593
4568 /****
4594 /****
4569 PULL REQUESTS
4595 PULL REQUESTS
4570 *****/
4596 *****/
4571 .pullrequests_section_head {
4597 .pullrequests_section_head {
4572 padding: 10px 10px 10px 0px;
4598 padding: 10px 10px 10px 0px;
4573 font-size: 16px;
4599 font-size: 16px;
4574 font-weight: bold;
4600 font-weight: bold;
4575 }
4601 }
4576
4602
4577 h3.closed,
4603 h3.closed,
4578 #pullrequests_container li.closed a
4604 #pullrequests_container li.closed a
4579 {
4605 {
4580 color: #555;
4606 color: #555;
4581 background: #eee;
4607 background: #eee;
4582 }
4608 }
4583
4609
4584 div.pr-title {
4610 div.pr-title {
4585 font-size: 1.6em;
4611 font-size: 1.6em;
4586 }
4612 }
4587
4613
4588 div.pr {
4614 div.pr {
4589 border-bottom: 1px solid #DDD;
4615 border-bottom: 1px solid #DDD;
4590 margin: 0px 20px;
4616 margin: 0px 20px;
4591 padding: 10px 4px;
4617 padding: 10px 4px;
4592 }
4618 }
4593 div.pr-closed {
4619 div.pr-closed {
4594 background-color: rgba(245,245,245,0.5);
4620 background-color: rgba(245,245,245,0.5);
4595 }
4621 }
4596
4622
4597 span.pr-closed-tag {
4623 span.pr-closed-tag {
4598 margin-bottom: 1px;
4624 margin-bottom: 1px;
4599 margin-right: 1px;
4625 margin-right: 1px;
4600 padding: 1px 3px;
4626 padding: 1px 3px;
4601 font-size: 10px;
4627 font-size: 10px;
4602 padding: 1px 3px 1px 3px;
4628 padding: 1px 3px 1px 3px;
4603 font-size: 10px;
4629 font-size: 10px;
4604 color: #336699;
4630 color: #336699;
4605 white-space: nowrap;
4631 white-space: nowrap;
4606 -webkit-border-radius: 4px;
4632 -webkit-border-radius: 4px;
4607 border-radius: 4px;
4633 border-radius: 4px;
4608 border: 1px solid #d9e8f8;
4634 border: 1px solid #d9e8f8;
4609 line-height: 1.5em;
4635 line-height: 1.5em;
4610 }
4636 }
4611
4637
4612 /****
4638 /****
4613 PERMS
4639 PERMS
4614 *****/
4640 *****/
4615 #perms .perms_section_head {
4641 #perms .perms_section_head {
4616 padding: 10px 10px 10px 0px;
4642 padding: 10px 10px 10px 0px;
4617 font-size: 16px;
4643 font-size: 16px;
4618 font-weight: bold;
4644 font-weight: bold;
4619 }
4645 }
4620
4646
4621 #perms .perm_tag {
4647 #perms .perm_tag {
4622 padding: 1px 3px 1px 3px;
4648 padding: 1px 3px 1px 3px;
4623 font-size: 10px;
4649 font-size: 10px;
4624 font-weight: bold;
4650 font-weight: bold;
4625 text-transform: uppercase;
4651 text-transform: uppercase;
4626 white-space: nowrap;
4652 white-space: nowrap;
4627 -webkit-border-radius: 3px;
4653 -webkit-border-radius: 3px;
4628 border-radius: 3px;
4654 border-radius: 3px;
4629 }
4655 }
4630
4656
4631 #perms .perm_tag.admin {
4657 #perms .perm_tag.admin {
4632 background-color: #B94A48;
4658 background-color: #B94A48;
4633 color: #ffffff;
4659 color: #ffffff;
4634 }
4660 }
4635
4661
4636 #perms .perm_tag.write {
4662 #perms .perm_tag.write {
4637 background-color: #DB7525;
4663 background-color: #DB7525;
4638 color: #ffffff;
4664 color: #ffffff;
4639 }
4665 }
4640
4666
4641 #perms .perm_tag.read {
4667 #perms .perm_tag.read {
4642 background-color: #468847;
4668 background-color: #468847;
4643 color: #ffffff;
4669 color: #ffffff;
4644 }
4670 }
4645
4671
4646 #perms .perm_tag.none {
4672 #perms .perm_tag.none {
4647 background-color: #bfbfbf;
4673 background-color: #bfbfbf;
4648 color: #ffffff;
4674 color: #ffffff;
4649 }
4675 }
4650
4676
4651 .perm-gravatar {
4677 .perm-gravatar {
4652 vertical-align: middle;
4678 vertical-align: middle;
4653 padding: 2px;
4679 padding: 2px;
4654 }
4680 }
4655 .perm-gravatar-ac {
4681 .perm-gravatar-ac {
4656 vertical-align: middle;
4682 vertical-align: middle;
4657 padding: 2px;
4683 padding: 2px;
4658 width: 14px;
4684 width: 14px;
4659 height: 14px;
4685 height: 14px;
4660 }
4686 }
4661
4687
4662 /*****************************************************************************
4688 /*****************************************************************************
4663 DIFFS CSS
4689 DIFFS CSS
4664 ******************************************************************************/
4690 ******************************************************************************/
4665 .diff-collapse {
4691 .diff-collapse {
4666 text-align: center;
4692 text-align: center;
4667 margin-bottom: -15px;
4693 margin-bottom: -15px;
4668 }
4694 }
4669 .diff-collapse-button {
4695 .diff-collapse-button {
4670 cursor: pointer;
4696 cursor: pointer;
4671 color: #666;
4697 color: #666;
4672 font-size: 16px;
4698 font-size: 16px;
4673 }
4699 }
4674 .diff-container {
4700 .diff-container {
4675
4701
4676 }
4702 }
4677
4703
4678 .diff-container.hidden {
4704 .diff-container.hidden {
4679 display: none;
4705 display: none;
4680 overflow: hidden;
4706 overflow: hidden;
4681 }
4707 }
4682
4708
4683
4709
4684 div.diffblock {
4710 div.diffblock {
4685 overflow: auto;
4711 overflow: auto;
4686 padding: 0px;
4712 padding: 0px;
4687 border: 1px solid #ccc;
4713 border: 1px solid #ccc;
4688 background: #f8f8f8;
4714 background: #f8f8f8;
4689 font-size: 100%;
4715 font-size: 100%;
4690 line-height: 100%;
4716 line-height: 100%;
4691 /* new */
4717 /* new */
4692 line-height: 125%;
4718 line-height: 125%;
4693 -webkit-border-radius: 6px 6px 0px 0px;
4719 -webkit-border-radius: 6px 6px 0px 0px;
4694 border-radius: 6px 6px 0px 0px;
4720 border-radius: 6px 6px 0px 0px;
4695 }
4721 }
4696 div.diffblock.margined {
4722 div.diffblock.margined {
4697 margin: 0px 20px 0px 20px;
4723 margin: 0px 20px 0px 20px;
4698 }
4724 }
4699 div.diffblock .code-header {
4725 div.diffblock .code-header {
4700 border-bottom: 1px solid #CCCCCC;
4726 border-bottom: 1px solid #CCCCCC;
4701 background: #EEEEEE;
4727 background: #EEEEEE;
4702 padding: 10px 0 10px 0;
4728 padding: 10px 0 10px 0;
4703 height: 14px;
4729 height: 14px;
4704 }
4730 }
4705
4731
4706 div.diffblock .code-header.banner {
4732 div.diffblock .code-header.banner {
4707 border-bottom: 1px solid #CCCCCC;
4733 border-bottom: 1px solid #CCCCCC;
4708 background: #EEEEEE;
4734 background: #EEEEEE;
4709 height: 14px;
4735 height: 14px;
4710 margin: 0px 95px 0px 95px;
4736 margin: 0px 95px 0px 95px;
4711 padding: 3px 3px 11px 3px;
4737 padding: 3px 3px 11px 3px;
4712 }
4738 }
4713
4739
4714 div.diffblock .code-header-title {
4740 div.diffblock .code-header-title {
4715 padding: 0px 0px 10px 5px !important;
4741 padding: 0px 0px 10px 5px !important;
4716 margin: 0 !important;
4742 margin: 0 !important;
4717 }
4743 }
4718 div.diffblock .code-header .hash {
4744 div.diffblock .code-header .hash {
4719 float: left;
4745 float: left;
4720 padding: 2px 0 0 2px;
4746 padding: 2px 0 0 2px;
4721 }
4747 }
4722 div.diffblock .code-header .date {
4748 div.diffblock .code-header .date {
4723 float: left;
4749 float: left;
4724 text-transform: uppercase;
4750 text-transform: uppercase;
4725 padding: 2px 0px 0px 2px;
4751 padding: 2px 0px 0px 2px;
4726 }
4752 }
4727 div.diffblock .code-header div {
4753 div.diffblock .code-header div {
4728 margin-left: 4px;
4754 margin-left: 4px;
4729 font-weight: bold;
4755 font-weight: bold;
4730 font-size: 14px;
4756 font-size: 14px;
4731 }
4757 }
4732
4758
4733 div.diffblock .parents {
4759 div.diffblock .parents {
4734 float: left;
4760 float: left;
4735 height: 26px;
4761 height: 26px;
4736 width: 100px;
4762 width: 100px;
4737 font-size: 10px;
4763 font-size: 10px;
4738 font-weight: 400;
4764 font-weight: 400;
4739 vertical-align: middle;
4765 vertical-align: middle;
4740 padding: 0px 2px 2px 2px;
4766 padding: 0px 2px 2px 2px;
4741 background-color: #eeeeee;
4767 background-color: #eeeeee;
4742 border-bottom: 1px solid #CCCCCC;
4768 border-bottom: 1px solid #CCCCCC;
4743 }
4769 }
4744
4770
4745 div.diffblock .children {
4771 div.diffblock .children {
4746 float: right;
4772 float: right;
4747 height: 26px;
4773 height: 26px;
4748 width: 100px;
4774 width: 100px;
4749 font-size: 10px;
4775 font-size: 10px;
4750 font-weight: 400;
4776 font-weight: 400;
4751 vertical-align: middle;
4777 vertical-align: middle;
4752 text-align: right;
4778 text-align: right;
4753 padding: 0px 2px 2px 2px;
4779 padding: 0px 2px 2px 2px;
4754 background-color: #eeeeee;
4780 background-color: #eeeeee;
4755 border-bottom: 1px solid #CCCCCC;
4781 border-bottom: 1px solid #CCCCCC;
4756 }
4782 }
4757
4783
4758 div.diffblock .code-body {
4784 div.diffblock .code-body {
4759 background: #FFFFFF;
4785 background: #FFFFFF;
4760 }
4786 }
4761 div.diffblock pre.raw {
4787 div.diffblock pre.raw {
4762 background: #FFFFFF;
4788 background: #FFFFFF;
4763 color: #000000;
4789 color: #000000;
4764 }
4790 }
4765 table.code-difftable {
4791 table.code-difftable {
4766 border-collapse: collapse;
4792 border-collapse: collapse;
4767 width: 99%;
4793 width: 99%;
4768 border-radius: 0px !important;
4794 border-radius: 0px !important;
4769 }
4795 }
4770 table.code-difftable td {
4796 table.code-difftable td {
4771 padding: 0 !important;
4797 padding: 0 !important;
4772 background: none !important;
4798 background: none !important;
4773 border: 0 !important;
4799 border: 0 !important;
4774 vertical-align: baseline !important
4800 vertical-align: baseline !important
4775 }
4801 }
4776 table.code-difftable .context {
4802 table.code-difftable .context {
4777 background: none repeat scroll 0 0 #DDE7EF;
4803 background: none repeat scroll 0 0 #DDE7EF;
4778 }
4804 }
4779 table.code-difftable .add {
4805 table.code-difftable .add {
4780 background: none repeat scroll 0 0 #DDFFDD;
4806 background: none repeat scroll 0 0 #DDFFDD;
4781 }
4807 }
4782 table.code-difftable .add ins {
4808 table.code-difftable .add ins {
4783 background: none repeat scroll 0 0 #AAFFAA;
4809 background: none repeat scroll 0 0 #AAFFAA;
4784 text-decoration: none;
4810 text-decoration: none;
4785 }
4811 }
4786 table.code-difftable .del {
4812 table.code-difftable .del {
4787 background: none repeat scroll 0 0 #FFDDDD;
4813 background: none repeat scroll 0 0 #FFDDDD;
4788 }
4814 }
4789 table.code-difftable .del del {
4815 table.code-difftable .del del {
4790 background: none repeat scroll 0 0 #FFAAAA;
4816 background: none repeat scroll 0 0 #FFAAAA;
4791 text-decoration: none;
4817 text-decoration: none;
4792 }
4818 }
4793
4819
4794 /** LINE NUMBERS **/
4820 /** LINE NUMBERS **/
4795 table.code-difftable .lineno {
4821 table.code-difftable .lineno {
4796
4822
4797 padding-left: 2px;
4823 padding-left: 2px;
4798 padding-right: 2px;
4824 padding-right: 2px;
4799 text-align: right;
4825 text-align: right;
4800 width: 32px;
4826 width: 32px;
4801 -moz-user-select: none;
4827 -moz-user-select: none;
4802 -webkit-user-select: none;
4828 -webkit-user-select: none;
4803 border-right: 1px solid #CCC !important;
4829 border-right: 1px solid #CCC !important;
4804 border-left: 0px solid #CCC !important;
4830 border-left: 0px solid #CCC !important;
4805 border-top: 0px solid #CCC !important;
4831 border-top: 0px solid #CCC !important;
4806 border-bottom: none !important;
4832 border-bottom: none !important;
4807 vertical-align: middle !important;
4833 vertical-align: middle !important;
4808
4834
4809 }
4835 }
4810 table.code-difftable .lineno.new {
4836 table.code-difftable .lineno.new {
4811 }
4837 }
4812 table.code-difftable .lineno.old {
4838 table.code-difftable .lineno.old {
4813 }
4839 }
4814 table.code-difftable .lineno a {
4840 table.code-difftable .lineno a {
4815 color: #747474 !important;
4841 color: #747474 !important;
4816 font: 11px "Bitstream Vera Sans Mono",Monaco,"Courier New",Courier,monospace !important;
4842 font: 11px "Bitstream Vera Sans Mono",Monaco,"Courier New",Courier,monospace !important;
4817 letter-spacing: -1px;
4843 letter-spacing: -1px;
4818 text-align: right;
4844 text-align: right;
4819 padding-right: 2px;
4845 padding-right: 2px;
4820 cursor: pointer;
4846 cursor: pointer;
4821 display: block;
4847 display: block;
4822 width: 32px;
4848 width: 32px;
4823 }
4849 }
4824
4850
4825 table.code-difftable .lineno-inline {
4851 table.code-difftable .lineno-inline {
4826 background: none repeat scroll 0 0 #FFF !important;
4852 background: none repeat scroll 0 0 #FFF !important;
4827 padding-left: 2px;
4853 padding-left: 2px;
4828 padding-right: 2px;
4854 padding-right: 2px;
4829 text-align: right;
4855 text-align: right;
4830 width: 30px;
4856 width: 30px;
4831 -moz-user-select: none;
4857 -moz-user-select: none;
4832 -webkit-user-select: none;
4858 -webkit-user-select: none;
4833 }
4859 }
4834
4860
4835 /** CODE **/
4861 /** CODE **/
4836 table.code-difftable .code {
4862 table.code-difftable .code {
4837 display: block;
4863 display: block;
4838 width: 100%;
4864 width: 100%;
4839 }
4865 }
4840 table.code-difftable .code td {
4866 table.code-difftable .code td {
4841 margin: 0;
4867 margin: 0;
4842 padding: 0;
4868 padding: 0;
4843 }
4869 }
4844 table.code-difftable .code pre {
4870 table.code-difftable .code pre {
4845 margin: 0;
4871 margin: 0;
4846 padding: 0;
4872 padding: 0;
4847 height: 17px;
4873 height: 17px;
4848 line-height: 17px;
4874 line-height: 17px;
4849 }
4875 }
4850
4876
4851
4877
4852 .diffblock.margined.comm .line .code:hover {
4878 .diffblock.margined.comm .line .code:hover {
4853 background-color: #FFFFCC !important;
4879 background-color: #FFFFCC !important;
4854 cursor: pointer !important;
4880 cursor: pointer !important;
4855 background-image: url("../images/icons/comment_add.png") !important;
4881 background-image: url("../images/icons/comment_add.png") !important;
4856 background-repeat: no-repeat !important;
4882 background-repeat: no-repeat !important;
4857 background-position: right !important;
4883 background-position: right !important;
4858 background-position: 0% 50% !important;
4884 background-position: 0% 50% !important;
4859 }
4885 }
4860 .diffblock.margined.comm .line .code.no-comment:hover {
4886 .diffblock.margined.comm .line .code.no-comment:hover {
4861 background-image: none !important;
4887 background-image: none !important;
4862 cursor: auto !important;
4888 cursor: auto !important;
4863 background-color: inherit !important;
4889 background-color: inherit !important;
4864 }
4890 }
4865
4891
4866 div.comment:target>.comment-wrapp {
4892 div.comment:target>.comment-wrapp {
4867 border: solid 2px #ee0 !important;
4893 border: solid 2px #ee0 !important;
4868 }
4894 }
4869
4895
4870 .lineno:target a {
4896 .lineno:target a {
4871 border: solid 2px #ee0 !important;
4897 border: solid 2px #ee0 !important;
4872 margin: -2px;
4898 margin: -2px;
4873 }
4899 }
@@ -1,2170 +1,2196 b''
1 /**
1 /**
2 RhodeCode JS Files
2 RhodeCode JS Files
3 **/
3 **/
4
4
5 if (typeof console == "undefined" || typeof console.log == "undefined"){
5 if (typeof console == "undefined" || typeof console.log == "undefined"){
6 console = { log: function() {} }
6 console = { log: function() {} }
7 }
7 }
8
8
9
9
10 var str_repeat = function(i, m) {
10 var str_repeat = function(i, m) {
11 for (var o = []; m > 0; o[--m] = i);
11 for (var o = []; m > 0; o[--m] = i);
12 return o.join('');
12 return o.join('');
13 };
13 };
14
14
15 /**
15 /**
16 * INJECT .format function into String
16 * INJECT .format function into String
17 * Usage: "My name is {0} {1}".format("Johny","Bravo")
17 * Usage: "My name is {0} {1}".format("Johny","Bravo")
18 * Return "My name is Johny Bravo"
18 * Return "My name is Johny Bravo"
19 * Inspired by https://gist.github.com/1049426
19 * Inspired by https://gist.github.com/1049426
20 */
20 */
21 String.prototype.format = function() {
21 String.prototype.format = function() {
22
22
23 function format() {
23 function format() {
24 var str = this;
24 var str = this;
25 var len = arguments.length+1;
25 var len = arguments.length+1;
26 var safe = undefined;
26 var safe = undefined;
27 var arg = undefined;
27 var arg = undefined;
28
28
29 // For each {0} {1} {n...} replace with the argument in that position. If
29 // For each {0} {1} {n...} replace with the argument in that position. If
30 // the argument is an object or an array it will be stringified to JSON.
30 // the argument is an object or an array it will be stringified to JSON.
31 for (var i=0; i < len; arg = arguments[i++]) {
31 for (var i=0; i < len; arg = arguments[i++]) {
32 safe = typeof arg === 'object' ? JSON.stringify(arg) : arg;
32 safe = typeof arg === 'object' ? JSON.stringify(arg) : arg;
33 str = str.replace(RegExp('\\{'+(i-1)+'\\}', 'g'), safe);
33 str = str.replace(RegExp('\\{'+(i-1)+'\\}', 'g'), safe);
34 }
34 }
35 return str;
35 return str;
36 }
36 }
37
37
38 // Save a reference of what may already exist under the property native.
38 // Save a reference of what may already exist under the property native.
39 // Allows for doing something like: if("".format.native) { /* use native */ }
39 // Allows for doing something like: if("".format.native) { /* use native */ }
40 format.native = String.prototype.format;
40 format.native = String.prototype.format;
41
41
42 // Replace the prototype property
42 // Replace the prototype property
43 return format;
43 return format;
44
44
45 }();
45 }();
46
46
47 String.prototype.strip = function(char) {
47 String.prototype.strip = function(char) {
48 if(char === undefined){
48 if(char === undefined){
49 char = '\\s';
49 char = '\\s';
50 }
50 }
51 return this.replace(new RegExp('^'+char+'+|'+char+'+$','g'), '');
51 return this.replace(new RegExp('^'+char+'+|'+char+'+$','g'), '');
52 }
52 }
53 String.prototype.lstrip = function(char) {
53 String.prototype.lstrip = function(char) {
54 if(char === undefined){
54 if(char === undefined){
55 char = '\\s';
55 char = '\\s';
56 }
56 }
57 return this.replace(new RegExp('^'+char+'+'),'');
57 return this.replace(new RegExp('^'+char+'+'),'');
58 }
58 }
59 String.prototype.rstrip = function(char) {
59 String.prototype.rstrip = function(char) {
60 if(char === undefined){
60 if(char === undefined){
61 char = '\\s';
61 char = '\\s';
62 }
62 }
63 return this.replace(new RegExp(''+char+'+$'),'');
63 return this.replace(new RegExp(''+char+'+$'),'');
64 }
64 }
65
65
66
66
67 if(!Array.prototype.indexOf) {
67 if(!Array.prototype.indexOf) {
68 Array.prototype.indexOf = function(needle) {
68 Array.prototype.indexOf = function(needle) {
69 for(var i = 0; i < this.length; i++) {
69 for(var i = 0; i < this.length; i++) {
70 if(this[i] === needle) {
70 if(this[i] === needle) {
71 return i;
71 return i;
72 }
72 }
73 }
73 }
74 return -1;
74 return -1;
75 };
75 };
76 }
76 }
77
77
78 // IE(CRAP) doesn't support previousElementSibling
78 // IE(CRAP) doesn't support previousElementSibling
79 var prevElementSibling = function( el ) {
79 var prevElementSibling = function( el ) {
80 if( el.previousElementSibling ) {
80 if( el.previousElementSibling ) {
81 return el.previousElementSibling;
81 return el.previousElementSibling;
82 } else {
82 } else {
83 while( el = el.previousSibling ) {
83 while( el = el.previousSibling ) {
84 if( el.nodeType === 1 ) return el;
84 if( el.nodeType === 1 ) return el;
85 }
85 }
86 }
86 }
87 }
87 }
88
88
89 /**
89 /**
90 * SmartColorGenerator
90 * SmartColorGenerator
91 *
91 *
92 *usage::
92 *usage::
93 * var CG = new ColorGenerator();
93 * var CG = new ColorGenerator();
94 * var col = CG.getColor(key); //returns array of RGB
94 * var col = CG.getColor(key); //returns array of RGB
95 * 'rgb({0})'.format(col.join(',')
95 * 'rgb({0})'.format(col.join(',')
96 *
96 *
97 * @returns {ColorGenerator}
97 * @returns {ColorGenerator}
98 */
98 */
99 var ColorGenerator = function(){
99 var ColorGenerator = function(){
100 this.GOLDEN_RATIO = 0.618033988749895;
100 this.GOLDEN_RATIO = 0.618033988749895;
101 this.CURRENT_RATIO = 0.22717784590367374 // this can be random
101 this.CURRENT_RATIO = 0.22717784590367374 // this can be random
102 this.HSV_1 = 0.75;//saturation
102 this.HSV_1 = 0.75;//saturation
103 this.HSV_2 = 0.95;
103 this.HSV_2 = 0.95;
104 this.color;
104 this.color;
105 this.cacheColorMap = {};
105 this.cacheColorMap = {};
106 };
106 };
107
107
108 ColorGenerator.prototype = {
108 ColorGenerator.prototype = {
109 getColor:function(key){
109 getColor:function(key){
110 if(this.cacheColorMap[key] !== undefined){
110 if(this.cacheColorMap[key] !== undefined){
111 return this.cacheColorMap[key];
111 return this.cacheColorMap[key];
112 }
112 }
113 else{
113 else{
114 this.cacheColorMap[key] = this.generateColor();
114 this.cacheColorMap[key] = this.generateColor();
115 return this.cacheColorMap[key];
115 return this.cacheColorMap[key];
116 }
116 }
117 },
117 },
118 _hsvToRgb:function(h,s,v){
118 _hsvToRgb:function(h,s,v){
119 if (s == 0.0)
119 if (s == 0.0)
120 return [v, v, v];
120 return [v, v, v];
121 i = parseInt(h * 6.0)
121 i = parseInt(h * 6.0)
122 f = (h * 6.0) - i
122 f = (h * 6.0) - i
123 p = v * (1.0 - s)
123 p = v * (1.0 - s)
124 q = v * (1.0 - s * f)
124 q = v * (1.0 - s * f)
125 t = v * (1.0 - s * (1.0 - f))
125 t = v * (1.0 - s * (1.0 - f))
126 i = i % 6
126 i = i % 6
127 if (i == 0)
127 if (i == 0)
128 return [v, t, p]
128 return [v, t, p]
129 if (i == 1)
129 if (i == 1)
130 return [q, v, p]
130 return [q, v, p]
131 if (i == 2)
131 if (i == 2)
132 return [p, v, t]
132 return [p, v, t]
133 if (i == 3)
133 if (i == 3)
134 return [p, q, v]
134 return [p, q, v]
135 if (i == 4)
135 if (i == 4)
136 return [t, p, v]
136 return [t, p, v]
137 if (i == 5)
137 if (i == 5)
138 return [v, p, q]
138 return [v, p, q]
139 },
139 },
140 generateColor:function(){
140 generateColor:function(){
141 this.CURRENT_RATIO = this.CURRENT_RATIO+this.GOLDEN_RATIO;
141 this.CURRENT_RATIO = this.CURRENT_RATIO+this.GOLDEN_RATIO;
142 this.CURRENT_RATIO = this.CURRENT_RATIO %= 1;
142 this.CURRENT_RATIO = this.CURRENT_RATIO %= 1;
143 HSV_tuple = [this.CURRENT_RATIO, this.HSV_1, this.HSV_2]
143 HSV_tuple = [this.CURRENT_RATIO, this.HSV_1, this.HSV_2]
144 RGB_tuple = this._hsvToRgb(HSV_tuple[0],HSV_tuple[1],HSV_tuple[2]);
144 RGB_tuple = this._hsvToRgb(HSV_tuple[0],HSV_tuple[1],HSV_tuple[2]);
145 function toRgb(v){
145 function toRgb(v){
146 return ""+parseInt(v*256)
146 return ""+parseInt(v*256)
147 }
147 }
148 return [toRgb(RGB_tuple[0]),toRgb(RGB_tuple[1]),toRgb(RGB_tuple[2])];
148 return [toRgb(RGB_tuple[0]),toRgb(RGB_tuple[1]),toRgb(RGB_tuple[2])];
149
149
150 }
150 }
151 }
151 }
152
152
153 /**
153 /**
154 * PyRoutesJS
154 * PyRoutesJS
155 *
155 *
156 * Usage pyroutes.url('mark_error_fixed',{"error_id":error_id}) // /mark_error_fixed/<error_id>
156 * Usage pyroutes.url('mark_error_fixed',{"error_id":error_id}) // /mark_error_fixed/<error_id>
157 */
157 */
158 var pyroutes = (function() {
158 var pyroutes = (function() {
159 // access global map defined in special file pyroutes
159 // access global map defined in special file pyroutes
160 var matchlist = PROUTES_MAP;
160 var matchlist = PROUTES_MAP;
161 var sprintf = (function() {
161 var sprintf = (function() {
162 function get_type(variable) {
162 function get_type(variable) {
163 return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();
163 return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();
164 }
164 }
165 function str_repeat(input, multiplier) {
165 function str_repeat(input, multiplier) {
166 for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */}
166 for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */}
167 return output.join('');
167 return output.join('');
168 }
168 }
169
169
170 var str_format = function() {
170 var str_format = function() {
171 if (!str_format.cache.hasOwnProperty(arguments[0])) {
171 if (!str_format.cache.hasOwnProperty(arguments[0])) {
172 str_format.cache[arguments[0]] = str_format.parse(arguments[0]);
172 str_format.cache[arguments[0]] = str_format.parse(arguments[0]);
173 }
173 }
174 return str_format.format.call(null, str_format.cache[arguments[0]], arguments);
174 return str_format.format.call(null, str_format.cache[arguments[0]], arguments);
175 };
175 };
176
176
177 str_format.format = function(parse_tree, argv) {
177 str_format.format = function(parse_tree, argv) {
178 var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;
178 var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;
179 for (i = 0; i < tree_length; i++) {
179 for (i = 0; i < tree_length; i++) {
180 node_type = get_type(parse_tree[i]);
180 node_type = get_type(parse_tree[i]);
181 if (node_type === 'string') {
181 if (node_type === 'string') {
182 output.push(parse_tree[i]);
182 output.push(parse_tree[i]);
183 }
183 }
184 else if (node_type === 'array') {
184 else if (node_type === 'array') {
185 match = parse_tree[i]; // convenience purposes only
185 match = parse_tree[i]; // convenience purposes only
186 if (match[2]) { // keyword argument
186 if (match[2]) { // keyword argument
187 arg = argv[cursor];
187 arg = argv[cursor];
188 for (k = 0; k < match[2].length; k++) {
188 for (k = 0; k < match[2].length; k++) {
189 if (!arg.hasOwnProperty(match[2][k])) {
189 if (!arg.hasOwnProperty(match[2][k])) {
190 throw(sprintf('[sprintf] property "%s" does not exist', match[2][k]));
190 throw(sprintf('[sprintf] property "%s" does not exist', match[2][k]));
191 }
191 }
192 arg = arg[match[2][k]];
192 arg = arg[match[2][k]];
193 }
193 }
194 }
194 }
195 else if (match[1]) { // positional argument (explicit)
195 else if (match[1]) { // positional argument (explicit)
196 arg = argv[match[1]];
196 arg = argv[match[1]];
197 }
197 }
198 else { // positional argument (implicit)
198 else { // positional argument (implicit)
199 arg = argv[cursor++];
199 arg = argv[cursor++];
200 }
200 }
201
201
202 if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {
202 if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {
203 throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)));
203 throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)));
204 }
204 }
205 switch (match[8]) {
205 switch (match[8]) {
206 case 'b': arg = arg.toString(2); break;
206 case 'b': arg = arg.toString(2); break;
207 case 'c': arg = String.fromCharCode(arg); break;
207 case 'c': arg = String.fromCharCode(arg); break;
208 case 'd': arg = parseInt(arg, 10); break;
208 case 'd': arg = parseInt(arg, 10); break;
209 case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;
209 case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;
210 case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;
210 case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;
211 case 'o': arg = arg.toString(8); break;
211 case 'o': arg = arg.toString(8); break;
212 case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;
212 case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;
213 case 'u': arg = Math.abs(arg); break;
213 case 'u': arg = Math.abs(arg); break;
214 case 'x': arg = arg.toString(16); break;
214 case 'x': arg = arg.toString(16); break;
215 case 'X': arg = arg.toString(16).toUpperCase(); break;
215 case 'X': arg = arg.toString(16).toUpperCase(); break;
216 }
216 }
217 arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);
217 arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);
218 pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';
218 pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';
219 pad_length = match[6] - String(arg).length;
219 pad_length = match[6] - String(arg).length;
220 pad = match[6] ? str_repeat(pad_character, pad_length) : '';
220 pad = match[6] ? str_repeat(pad_character, pad_length) : '';
221 output.push(match[5] ? arg + pad : pad + arg);
221 output.push(match[5] ? arg + pad : pad + arg);
222 }
222 }
223 }
223 }
224 return output.join('');
224 return output.join('');
225 };
225 };
226
226
227 str_format.cache = {};
227 str_format.cache = {};
228
228
229 str_format.parse = function(fmt) {
229 str_format.parse = function(fmt) {
230 var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;
230 var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;
231 while (_fmt) {
231 while (_fmt) {
232 if ((match = /^[^\x25]+/.exec(_fmt)) !== null) {
232 if ((match = /^[^\x25]+/.exec(_fmt)) !== null) {
233 parse_tree.push(match[0]);
233 parse_tree.push(match[0]);
234 }
234 }
235 else if ((match = /^\x25{2}/.exec(_fmt)) !== null) {
235 else if ((match = /^\x25{2}/.exec(_fmt)) !== null) {
236 parse_tree.push('%');
236 parse_tree.push('%');
237 }
237 }
238 else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {
238 else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {
239 if (match[2]) {
239 if (match[2]) {
240 arg_names |= 1;
240 arg_names |= 1;
241 var field_list = [], replacement_field = match[2], field_match = [];
241 var field_list = [], replacement_field = match[2], field_match = [];
242 if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
242 if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
243 field_list.push(field_match[1]);
243 field_list.push(field_match[1]);
244 while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
244 while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
245 if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
245 if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
246 field_list.push(field_match[1]);
246 field_list.push(field_match[1]);
247 }
247 }
248 else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) {
248 else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) {
249 field_list.push(field_match[1]);
249 field_list.push(field_match[1]);
250 }
250 }
251 else {
251 else {
252 throw('[sprintf] huh?');
252 throw('[sprintf] huh?');
253 }
253 }
254 }
254 }
255 }
255 }
256 else {
256 else {
257 throw('[sprintf] huh?');
257 throw('[sprintf] huh?');
258 }
258 }
259 match[2] = field_list;
259 match[2] = field_list;
260 }
260 }
261 else {
261 else {
262 arg_names |= 2;
262 arg_names |= 2;
263 }
263 }
264 if (arg_names === 3) {
264 if (arg_names === 3) {
265 throw('[sprintf] mixing positional and named placeholders is not (yet) supported');
265 throw('[sprintf] mixing positional and named placeholders is not (yet) supported');
266 }
266 }
267 parse_tree.push(match);
267 parse_tree.push(match);
268 }
268 }
269 else {
269 else {
270 throw('[sprintf] huh?');
270 throw('[sprintf] huh?');
271 }
271 }
272 _fmt = _fmt.substring(match[0].length);
272 _fmt = _fmt.substring(match[0].length);
273 }
273 }
274 return parse_tree;
274 return parse_tree;
275 };
275 };
276
276
277 return str_format;
277 return str_format;
278 })();
278 })();
279
279
280 var vsprintf = function(fmt, argv) {
280 var vsprintf = function(fmt, argv) {
281 argv.unshift(fmt);
281 argv.unshift(fmt);
282 return sprintf.apply(null, argv);
282 return sprintf.apply(null, argv);
283 };
283 };
284 return {
284 return {
285 'url': function(route_name, params) {
285 'url': function(route_name, params) {
286 var result = route_name;
286 var result = route_name;
287 if (typeof(params) != 'object'){
287 if (typeof(params) != 'object'){
288 params = {};
288 params = {};
289 }
289 }
290 if (matchlist.hasOwnProperty(route_name)) {
290 if (matchlist.hasOwnProperty(route_name)) {
291 var route = matchlist[route_name];
291 var route = matchlist[route_name];
292 // param substitution
292 // param substitution
293 for(var i=0; i < route[1].length; i++) {
293 for(var i=0; i < route[1].length; i++) {
294
294
295 if (!params.hasOwnProperty(route[1][i]))
295 if (!params.hasOwnProperty(route[1][i]))
296 throw new Error(route[1][i] + ' missing in "' + route_name + '" route generation');
296 throw new Error(route[1][i] + ' missing in "' + route_name + '" route generation');
297 }
297 }
298 result = sprintf(route[0], params);
298 result = sprintf(route[0], params);
299
299
300 var ret = [];
300 var ret = [];
301 //extra params => GET
301 //extra params => GET
302 for(param in params){
302 for(param in params){
303 if (route[1].indexOf(param) == -1){
303 if (route[1].indexOf(param) == -1){
304 ret.push(encodeURIComponent(param) + "=" + encodeURIComponent(params[param]));
304 ret.push(encodeURIComponent(param) + "=" + encodeURIComponent(params[param]));
305 }
305 }
306 }
306 }
307 var _parts = ret.join("&");
307 var _parts = ret.join("&");
308 if(_parts){
308 if(_parts){
309 result = result +'?'+ _parts
309 result = result +'?'+ _parts
310 }
310 }
311 }
311 }
312
312
313 return result;
313 return result;
314 },
314 },
315 'register': function(route_name, route_tmpl, req_params) {
315 'register': function(route_name, route_tmpl, req_params) {
316 if (typeof(req_params) != 'object') {
316 if (typeof(req_params) != 'object') {
317 req_params = [];
317 req_params = [];
318 }
318 }
319 //fix escape
319 //fix escape
320 route_tmpl = unescape(route_tmpl);
320 route_tmpl = unescape(route_tmpl);
321 keys = [];
321 keys = [];
322 for (o in req_params){
322 for (o in req_params){
323 keys.push(req_params[o])
323 keys.push(req_params[o])
324 }
324 }
325 matchlist[route_name] = [
325 matchlist[route_name] = [
326 route_tmpl,
326 route_tmpl,
327 keys
327 keys
328 ]
328 ]
329 },
329 },
330 '_routes': function(){
330 '_routes': function(){
331 return matchlist;
331 return matchlist;
332 }
332 }
333 }
333 }
334 })();
334 })();
335
335
336
336
337
337
338 /**
338 /**
339 * GLOBAL YUI Shortcuts
339 * GLOBAL YUI Shortcuts
340 */
340 */
341 var YUC = YAHOO.util.Connect;
341 var YUC = YAHOO.util.Connect;
342 var YUD = YAHOO.util.Dom;
342 var YUD = YAHOO.util.Dom;
343 var YUE = YAHOO.util.Event;
343 var YUE = YAHOO.util.Event;
344 var YUQ = YAHOO.util.Selector.query;
344 var YUQ = YAHOO.util.Selector.query;
345
345
346 // defines if push state is enabled for this browser ?
346 // defines if push state is enabled for this browser ?
347 var push_state_enabled = Boolean(
347 var push_state_enabled = Boolean(
348 window.history && window.history.pushState && window.history.replaceState
348 window.history && window.history.pushState && window.history.replaceState
349 && !( /* disable for versions of iOS before version 4.3 (8F190) */
349 && !( /* disable for versions of iOS before version 4.3 (8F190) */
350 (/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i).test(navigator.userAgent)
350 (/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i).test(navigator.userAgent)
351 /* disable for the mercury iOS browser, or at least older versions of the webkit engine */
351 /* disable for the mercury iOS browser, or at least older versions of the webkit engine */
352 || (/AppleWebKit\/5([0-2]|3[0-2])/i).test(navigator.userAgent)
352 || (/AppleWebKit\/5([0-2]|3[0-2])/i).test(navigator.userAgent)
353 )
353 )
354 );
354 );
355
355
356 var _run_callbacks = function(callbacks){
356 var _run_callbacks = function(callbacks){
357 if (callbacks !== undefined){
357 if (callbacks !== undefined){
358 var _l = callbacks.length;
358 var _l = callbacks.length;
359 for (var i=0;i<_l;i++){
359 for (var i=0;i<_l;i++){
360 var func = callbacks[i];
360 var func = callbacks[i];
361 if(typeof(func)=='function'){
361 if(typeof(func)=='function'){
362 try{
362 try{
363 func();
363 func();
364 }catch (err){};
364 }catch (err){};
365 }
365 }
366 }
366 }
367 }
367 }
368 }
368 }
369
369
370 /**
370 /**
371 * Partial Ajax Implementation
371 * Partial Ajax Implementation
372 *
372 *
373 * @param url: defines url to make partial request
373 * @param url: defines url to make partial request
374 * @param container: defines id of container to input partial result
374 * @param container: defines id of container to input partial result
375 * @param s_call: success callback function that takes o as arg
375 * @param s_call: success callback function that takes o as arg
376 * o.tId
376 * o.tId
377 * o.status
377 * o.status
378 * o.statusText
378 * o.statusText
379 * o.getResponseHeader[ ]
379 * o.getResponseHeader[ ]
380 * o.getAllResponseHeaders
380 * o.getAllResponseHeaders
381 * o.responseText
381 * o.responseText
382 * o.responseXML
382 * o.responseXML
383 * o.argument
383 * o.argument
384 * @param f_call: failure callback
384 * @param f_call: failure callback
385 * @param args arguments
385 * @param args arguments
386 */
386 */
387 function ypjax(url,container,s_call,f_call,args){
387 function ypjax(url,container,s_call,f_call,args){
388 var method='GET';
388 var method='GET';
389 if(args===undefined){
389 if(args===undefined){
390 args=null;
390 args=null;
391 }
391 }
392
392
393 // Set special header for partial ajax == HTTP_X_PARTIAL_XHR
393 // Set special header for partial ajax == HTTP_X_PARTIAL_XHR
394 YUC.initHeader('X-PARTIAL-XHR',true);
394 YUC.initHeader('X-PARTIAL-XHR',true);
395
395
396 // wrapper of passed callback
396 // wrapper of passed callback
397 var s_wrapper = (function(o){
397 var s_wrapper = (function(o){
398 return function(o){
398 return function(o){
399 YUD.get(container).innerHTML=o.responseText;
399 YUD.get(container).innerHTML=o.responseText;
400 YUD.setStyle(container,'opacity','1.0');
400 YUD.setStyle(container,'opacity','1.0');
401 //execute the given original callback
401 //execute the given original callback
402 if (s_call !== undefined){
402 if (s_call !== undefined){
403 s_call(o);
403 s_call(o);
404 }
404 }
405 }
405 }
406 })()
406 })()
407 YUD.setStyle(container,'opacity','0.3');
407 YUD.setStyle(container,'opacity','0.3');
408 YUC.asyncRequest(method,url,{
408 YUC.asyncRequest(method,url,{
409 success:s_wrapper,
409 success:s_wrapper,
410 failure:function(o){
410 failure:function(o){
411 console.log(o);
411 console.log(o);
412 YUD.get(container).innerHTML='<span class="error_red">ERROR: {0}</span>'.format(o.status);
412 YUD.get(container).innerHTML='<span class="error_red">ERROR: {0}</span>'.format(o.status);
413 YUD.setStyle(container,'opacity','1.0');
413 YUD.setStyle(container,'opacity','1.0');
414 },
414 },
415 cache:false
415 cache:false
416 },args);
416 },args);
417
417
418 };
418 };
419
419
420 var ajaxGET = function(url,success) {
420 var ajaxGET = function(url,success) {
421 // Set special header for ajax == HTTP_X_PARTIAL_XHR
421 // Set special header for ajax == HTTP_X_PARTIAL_XHR
422 YUC.initHeader('X-PARTIAL-XHR',true);
422 YUC.initHeader('X-PARTIAL-XHR',true);
423
423
424 var sUrl = url;
424 var sUrl = url;
425 var callback = {
425 var callback = {
426 success: success,
426 success: success,
427 failure: function (o) {
427 failure: function (o) {
428 if (o.status != 0) {
428 if (o.status != 0) {
429 alert("error: " + o.statusText);
429 alert("error: " + o.statusText);
430 };
430 };
431 },
431 },
432 };
432 };
433
433
434 var request = YAHOO.util.Connect.asyncRequest('GET', sUrl, callback);
434 var request = YAHOO.util.Connect.asyncRequest('GET', sUrl, callback);
435 return request;
435 return request;
436 };
436 };
437
437
438
438
439
439
440 var ajaxPOST = function(url,postData,success) {
440 var ajaxPOST = function(url,postData,success) {
441 // Set special header for ajax == HTTP_X_PARTIAL_XHR
441 // Set special header for ajax == HTTP_X_PARTIAL_XHR
442 YUC.initHeader('X-PARTIAL-XHR',true);
442 YUC.initHeader('X-PARTIAL-XHR',true);
443
443
444 var toQueryString = function(o) {
444 var toQueryString = function(o) {
445 if(typeof o !== 'object') {
445 if(typeof o !== 'object') {
446 return false;
446 return false;
447 }
447 }
448 var _p, _qs = [];
448 var _p, _qs = [];
449 for(_p in o) {
449 for(_p in o) {
450 _qs.push(encodeURIComponent(_p) + '=' + encodeURIComponent(o[_p]));
450 _qs.push(encodeURIComponent(_p) + '=' + encodeURIComponent(o[_p]));
451 }
451 }
452 return _qs.join('&');
452 return _qs.join('&');
453 };
453 };
454
454
455 var sUrl = url;
455 var sUrl = url;
456 var callback = {
456 var callback = {
457 success: success,
457 success: success,
458 failure: function (o) {
458 failure: function (o) {
459 alert("error");
459 alert("error");
460 },
460 },
461 };
461 };
462 var postData = toQueryString(postData);
462 var postData = toQueryString(postData);
463 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
463 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
464 return request;
464 return request;
465 };
465 };
466
466
467
467
468 /**
468 /**
469 * tooltip activate
469 * tooltip activate
470 */
470 */
471 var tooltip_activate = function(){
471 var tooltip_activate = function(){
472 yt = YAHOO.yuitip.main;
472 yt = YAHOO.yuitip.main;
473 YUE.onDOMReady(yt.init);
473 YUE.onDOMReady(yt.init);
474 };
474 };
475
475
476 /**
476 /**
477 * show more
477 * show more
478 */
478 */
479 var show_more_event = function(){
479 var show_more_event = function(){
480 YUE.on(YUD.getElementsByClassName('show_more'),'click',function(e){
480 YUE.on(YUD.getElementsByClassName('show_more'),'click',function(e){
481 var el = e.target;
481 var el = e.target;
482 YUD.setStyle(YUD.get(el.id.substring(1)),'display','');
482 YUD.setStyle(YUD.get(el.id.substring(1)),'display','');
483 YUD.setStyle(el.parentNode,'display','none');
483 YUD.setStyle(el.parentNode,'display','none');
484 });
484 });
485 };
485 };
486
486
487 /**
487 /**
488 * show changeset tooltip
488 * show changeset tooltip
489 */
489 */
490 var show_changeset_tooltip = function(){
490 var show_changeset_tooltip = function(){
491 YUE.on(YUD.getElementsByClassName('lazy-cs'), 'mouseover', function(e){
491 YUE.on(YUD.getElementsByClassName('lazy-cs'), 'mouseover', function(e){
492 var target = e.currentTarget;
492 var target = e.currentTarget;
493 var rid = YUD.getAttribute(target,'raw_id');
493 var rid = YUD.getAttribute(target,'raw_id');
494 var repo_name = YUD.getAttribute(target,'repo_name');
494 var repo_name = YUD.getAttribute(target,'repo_name');
495 var ttid = 'tt-'+rid;
495 var ttid = 'tt-'+rid;
496 var success = function(o){
496 var success = function(o){
497 var json = JSON.parse(o.responseText);
497 var json = JSON.parse(o.responseText);
498 YUD.addClass(target,'tooltip')
498 YUD.addClass(target,'tooltip')
499 YUD.setAttribute(target, 'title',json['message']);
499 YUD.setAttribute(target, 'title',json['message']);
500 YAHOO.yuitip.main.show_yuitip(e, target);
500 YAHOO.yuitip.main.show_yuitip(e, target);
501 }
501 }
502 if(rid && !YUD.hasClass(target, 'tooltip')){
502 if(rid && !YUD.hasClass(target, 'tooltip')){
503 YUD.setAttribute(target,'id',ttid);
503 YUD.setAttribute(target,'id',ttid);
504 YUD.setAttribute(target, 'title',_TM['loading...']);
504 YUD.setAttribute(target, 'title',_TM['loading...']);
505 YAHOO.yuitip.main.set_listeners(target);
505 YAHOO.yuitip.main.set_listeners(target);
506 YAHOO.yuitip.main.show_yuitip(e, target);
506 YAHOO.yuitip.main.show_yuitip(e, target);
507 var url = pyroutes.url('changeset_info', {"repo_name":repo_name, "revision": rid});
507 var url = pyroutes.url('changeset_info', {"repo_name":repo_name, "revision": rid});
508 ajaxGET(url, success)
508 ajaxGET(url, success)
509 }
509 }
510 });
510 });
511 };
511 };
512
512
513 var onSuccessFollow = function(target){
513 var onSuccessFollow = function(target){
514 var f = YUD.get(target);
514 var f = YUD.get(target);
515 var f_cnt = YUD.get('current_followers_count');
515 var f_cnt = YUD.get('current_followers_count');
516
516
517 if(YUD.hasClass(f, 'follow')){
517 if(YUD.hasClass(f, 'follow')){
518 f.setAttribute('class','following');
518 f.setAttribute('class','following');
519 f.setAttribute('title',_TM['Stop following this repository']);
519 f.setAttribute('title',_TM['Stop following this repository']);
520
520
521 if(f_cnt){
521 if(f_cnt){
522 var cnt = Number(f_cnt.innerHTML)+1;
522 var cnt = Number(f_cnt.innerHTML)+1;
523 f_cnt.innerHTML = cnt;
523 f_cnt.innerHTML = cnt;
524 }
524 }
525 }
525 }
526 else{
526 else{
527 f.setAttribute('class','follow');
527 f.setAttribute('class','follow');
528 f.setAttribute('title',_TM['Start following this repository']);
528 f.setAttribute('title',_TM['Start following this repository']);
529 if(f_cnt){
529 if(f_cnt){
530 var cnt = Number(f_cnt.innerHTML)-1;
530 var cnt = Number(f_cnt.innerHTML)-1;
531 f_cnt.innerHTML = cnt;
531 f_cnt.innerHTML = cnt;
532 }
532 }
533 }
533 }
534 }
534 }
535
535
536 var toggleFollowingUser = function(target,fallows_user_id,token,user_id){
536 var toggleFollowingUser = function(target,fallows_user_id,token,user_id){
537 args = 'follows_user_id='+fallows_user_id;
537 args = 'follows_user_id='+fallows_user_id;
538 args+= '&amp;auth_token='+token;
538 args+= '&amp;auth_token='+token;
539 if(user_id != undefined){
539 if(user_id != undefined){
540 args+="&amp;user_id="+user_id;
540 args+="&amp;user_id="+user_id;
541 }
541 }
542 YUC.asyncRequest('POST',TOGGLE_FOLLOW_URL,{
542 YUC.asyncRequest('POST',TOGGLE_FOLLOW_URL,{
543 success:function(o){
543 success:function(o){
544 onSuccessFollow(target);
544 onSuccessFollow(target);
545 }
545 }
546 },args);
546 },args);
547 return false;
547 return false;
548 }
548 }
549
549
550 var toggleFollowingRepo = function(target,fallows_repo_id,token,user_id){
550 var toggleFollowingRepo = function(target,fallows_repo_id,token,user_id){
551
551
552 args = 'follows_repo_id='+fallows_repo_id;
552 args = 'follows_repo_id='+fallows_repo_id;
553 args+= '&amp;auth_token='+token;
553 args+= '&amp;auth_token='+token;
554 if(user_id != undefined){
554 if(user_id != undefined){
555 args+="&amp;user_id="+user_id;
555 args+="&amp;user_id="+user_id;
556 }
556 }
557 YUC.asyncRequest('POST',TOGGLE_FOLLOW_URL,{
557 YUC.asyncRequest('POST',TOGGLE_FOLLOW_URL,{
558 success:function(o){
558 success:function(o){
559 onSuccessFollow(target);
559 onSuccessFollow(target);
560 }
560 }
561 },args);
561 },args);
562 return false;
562 return false;
563 }
563 }
564
564
565 var showRepoSize = function(target, repo_name, token){
565 var showRepoSize = function(target, repo_name, token){
566 var args= 'auth_token='+token;
566 var args= 'auth_token='+token;
567
567
568 if(!YUD.hasClass(target, 'loaded')){
568 if(!YUD.hasClass(target, 'loaded')){
569 YUD.get(target).innerHTML = _TM['Loading ...'];
569 YUD.get(target).innerHTML = _TM['Loading ...'];
570 var url = pyroutes.url('repo_size', {"repo_name":repo_name});
570 var url = pyroutes.url('repo_size', {"repo_name":repo_name});
571 YUC.asyncRequest('POST',url,{
571 YUC.asyncRequest('POST',url,{
572 success:function(o){
572 success:function(o){
573 YUD.get(target).innerHTML = JSON.parse(o.responseText);
573 YUD.get(target).innerHTML = JSON.parse(o.responseText);
574 YUD.addClass(target, 'loaded');
574 YUD.addClass(target, 'loaded');
575 }
575 }
576 },args);
576 },args);
577 }
577 }
578 return false;
578 return false;
579 }
579 }
580
580
581 /**
581 /**
582 * TOOLTIP IMPL.
582 * TOOLTIP IMPL.
583 */
583 */
584 YAHOO.namespace('yuitip');
584 YAHOO.namespace('yuitip');
585 YAHOO.yuitip.main = {
585 YAHOO.yuitip.main = {
586
586
587 $: YAHOO.util.Dom.get,
587 $: YAHOO.util.Dom.get,
588
588
589 bgColor: '#000',
589 bgColor: '#000',
590 speed: 0.3,
590 speed: 0.3,
591 opacity: 0.9,
591 opacity: 0.9,
592 offset: [15,15],
592 offset: [15,15],
593 useAnim: false,
593 useAnim: false,
594 maxWidth: 600,
594 maxWidth: 600,
595 add_links: false,
595 add_links: false,
596 yuitips: [],
596 yuitips: [],
597
597
598 set_listeners: function(tt){
598 set_listeners: function(tt){
599 YUE.on(tt, 'mouseover', yt.show_yuitip, tt);
599 YUE.on(tt, 'mouseover', yt.show_yuitip, tt);
600 YUE.on(tt, 'mousemove', yt.move_yuitip, tt);
600 YUE.on(tt, 'mousemove', yt.move_yuitip, tt);
601 YUE.on(tt, 'mouseout', yt.close_yuitip, tt);
601 YUE.on(tt, 'mouseout', yt.close_yuitip, tt);
602 },
602 },
603
603
604 init: function(){
604 init: function(){
605 yt.tipBox = yt.$('tip-box');
605 yt.tipBox = yt.$('tip-box');
606 if(!yt.tipBox){
606 if(!yt.tipBox){
607 yt.tipBox = document.createElement('div');
607 yt.tipBox = document.createElement('div');
608 document.body.appendChild(yt.tipBox);
608 document.body.appendChild(yt.tipBox);
609 yt.tipBox.id = 'tip-box';
609 yt.tipBox.id = 'tip-box';
610 }
610 }
611
611
612 YUD.setStyle(yt.tipBox, 'display', 'none');
612 YUD.setStyle(yt.tipBox, 'display', 'none');
613 YUD.setStyle(yt.tipBox, 'position', 'absolute');
613 YUD.setStyle(yt.tipBox, 'position', 'absolute');
614 if(yt.maxWidth !== null){
614 if(yt.maxWidth !== null){
615 YUD.setStyle(yt.tipBox, 'max-width', yt.maxWidth+'px');
615 YUD.setStyle(yt.tipBox, 'max-width', yt.maxWidth+'px');
616 }
616 }
617
617
618 var yuitips = YUD.getElementsByClassName('tooltip');
618 var yuitips = YUD.getElementsByClassName('tooltip');
619
619
620 if(yt.add_links === true){
620 if(yt.add_links === true){
621 var links = document.getElementsByTagName('a');
621 var links = document.getElementsByTagName('a');
622 var linkLen = links.length;
622 var linkLen = links.length;
623 for(i=0;i<linkLen;i++){
623 for(i=0;i<linkLen;i++){
624 yuitips.push(links[i]);
624 yuitips.push(links[i]);
625 }
625 }
626 }
626 }
627
627
628 var yuiLen = yuitips.length;
628 var yuiLen = yuitips.length;
629
629
630 for(i=0;i<yuiLen;i++){
630 for(i=0;i<yuiLen;i++){
631 yt.set_listeners(yuitips[i]);
631 yt.set_listeners(yuitips[i]);
632 }
632 }
633 },
633 },
634
634
635 show_yuitip: function(e, el){
635 show_yuitip: function(e, el){
636 YUE.stopEvent(e);
636 YUE.stopEvent(e);
637 if(el.tagName.toLowerCase() === 'img'){
637 if(el.tagName.toLowerCase() === 'img'){
638 yt.tipText = el.alt ? el.alt : '';
638 yt.tipText = el.alt ? el.alt : '';
639 } else {
639 } else {
640 yt.tipText = el.title ? el.title : '';
640 yt.tipText = el.title ? el.title : '';
641 }
641 }
642
642
643 if(yt.tipText !== ''){
643 if(yt.tipText !== ''){
644 // save org title
644 // save org title
645 YUD.setAttribute(el, 'tt_title', yt.tipText);
645 YUD.setAttribute(el, 'tt_title', yt.tipText);
646 // reset title to not show org tooltips
646 // reset title to not show org tooltips
647 YUD.setAttribute(el, 'title', '');
647 YUD.setAttribute(el, 'title', '');
648
648
649 yt.tipBox.innerHTML = yt.tipText;
649 yt.tipBox.innerHTML = yt.tipText;
650 YUD.setStyle(yt.tipBox, 'display', 'block');
650 YUD.setStyle(yt.tipBox, 'display', 'block');
651 if(yt.useAnim === true){
651 if(yt.useAnim === true){
652 YUD.setStyle(yt.tipBox, 'opacity', '0');
652 YUD.setStyle(yt.tipBox, 'opacity', '0');
653 var newAnim = new YAHOO.util.Anim(yt.tipBox,
653 var newAnim = new YAHOO.util.Anim(yt.tipBox,
654 {
654 {
655 opacity: { to: yt.opacity }
655 opacity: { to: yt.opacity }
656 }, yt.speed, YAHOO.util.Easing.easeOut
656 }, yt.speed, YAHOO.util.Easing.easeOut
657 );
657 );
658 newAnim.animate();
658 newAnim.animate();
659 }
659 }
660 }
660 }
661 },
661 },
662
662
663 move_yuitip: function(e, el){
663 move_yuitip: function(e, el){
664 YUE.stopEvent(e);
664 YUE.stopEvent(e);
665 var movePos = YUE.getXY(e);
665 var movePos = YUE.getXY(e);
666 YUD.setStyle(yt.tipBox, 'top', (movePos[1] + yt.offset[1]) + 'px');
666 YUD.setStyle(yt.tipBox, 'top', (movePos[1] + yt.offset[1]) + 'px');
667 YUD.setStyle(yt.tipBox, 'left', (movePos[0] + yt.offset[0]) + 'px');
667 YUD.setStyle(yt.tipBox, 'left', (movePos[0] + yt.offset[0]) + 'px');
668 },
668 },
669
669
670 close_yuitip: function(e, el){
670 close_yuitip: function(e, el){
671 YUE.stopEvent(e);
671 YUE.stopEvent(e);
672
672
673 if(yt.useAnim === true){
673 if(yt.useAnim === true){
674 var newAnim = new YAHOO.util.Anim(yt.tipBox,
674 var newAnim = new YAHOO.util.Anim(yt.tipBox,
675 {
675 {
676 opacity: { to: 0 }
676 opacity: { to: 0 }
677 }, yt.speed, YAHOO.util.Easing.easeOut
677 }, yt.speed, YAHOO.util.Easing.easeOut
678 );
678 );
679 newAnim.animate();
679 newAnim.animate();
680 } else {
680 } else {
681 YUD.setStyle(yt.tipBox, 'display', 'none');
681 YUD.setStyle(yt.tipBox, 'display', 'none');
682 }
682 }
683 YUD.setAttribute(el,'title', YUD.getAttribute(el, 'tt_title'));
683 YUD.setAttribute(el,'title', YUD.getAttribute(el, 'tt_title'));
684 }
684 }
685 }
685 }
686
686
687 /**
687 /**
688 * Quick filter widget
688 * Quick filter widget
689 *
689 *
690 * @param target: filter input target
690 * @param target: filter input target
691 * @param nodes: list of nodes in html we want to filter.
691 * @param nodes: list of nodes in html we want to filter.
692 * @param display_element function that takes current node from nodes and
692 * @param display_element function that takes current node from nodes and
693 * does hide or show based on the node
693 * does hide or show based on the node
694 *
694 *
695 */
695 */
696 var q_filter = function(target,nodes,display_element){
696 var q_filter = function(target,nodes,display_element){
697
697
698 var nodes = nodes;
698 var nodes = nodes;
699 var q_filter_field = YUD.get(target);
699 var q_filter_field = YUD.get(target);
700 var F = YAHOO.namespace(target);
700 var F = YAHOO.namespace(target);
701
701
702 YUE.on(q_filter_field,'keyup',function(e){
702 YUE.on(q_filter_field,'keyup',function(e){
703 clearTimeout(F.filterTimeout);
703 clearTimeout(F.filterTimeout);
704 F.filterTimeout = setTimeout(F.updateFilter,600);
704 F.filterTimeout = setTimeout(F.updateFilter,600);
705 });
705 });
706
706
707 F.filterTimeout = null;
707 F.filterTimeout = null;
708
708
709 var show_node = function(node){
709 var show_node = function(node){
710 YUD.setStyle(node,'display','')
710 YUD.setStyle(node,'display','')
711 }
711 }
712 var hide_node = function(node){
712 var hide_node = function(node){
713 YUD.setStyle(node,'display','none');
713 YUD.setStyle(node,'display','none');
714 }
714 }
715
715
716 F.updateFilter = function() {
716 F.updateFilter = function() {
717 // Reset timeout
717 // Reset timeout
718 F.filterTimeout = null;
718 F.filterTimeout = null;
719
719
720 var obsolete = [];
720 var obsolete = [];
721
721
722 var req = q_filter_field.value.toLowerCase();
722 var req = q_filter_field.value.toLowerCase();
723
723
724 var l = nodes.length;
724 var l = nodes.length;
725 var i;
725 var i;
726 var showing = 0;
726 var showing = 0;
727
727
728 for (i=0;i<l;i++ ){
728 for (i=0;i<l;i++ ){
729 var n = nodes[i];
729 var n = nodes[i];
730 var target_element = display_element(n)
730 var target_element = display_element(n)
731 if(req && n.innerHTML.toLowerCase().indexOf(req) == -1){
731 if(req && n.innerHTML.toLowerCase().indexOf(req) == -1){
732 hide_node(target_element);
732 hide_node(target_element);
733 }
733 }
734 else{
734 else{
735 show_node(target_element);
735 show_node(target_element);
736 showing+=1;
736 showing+=1;
737 }
737 }
738 }
738 }
739
739
740 // if repo_count is set update the number
740 // if repo_count is set update the number
741 var cnt = YUD.get('repo_count');
741 var cnt = YUD.get('repo_count');
742 if(cnt){
742 if(cnt){
743 YUD.get('repo_count').innerHTML = showing;
743 YUD.get('repo_count').innerHTML = showing;
744 }
744 }
745
745
746 }
746 }
747 };
747 };
748
748
749 var tableTr = function(cls, body){
749 var tableTr = function(cls, body){
750 var _el = document.createElement('div');
750 var _el = document.createElement('div');
751 var cont = new YAHOO.util.Element(body);
751 var cont = new YAHOO.util.Element(body);
752 var comment_id = fromHTML(body).children[0].id.split('comment-')[1];
752 var comment_id = fromHTML(body).children[0].id.split('comment-')[1];
753 var id = 'comment-tr-{0}'.format(comment_id);
753 var id = 'comment-tr-{0}'.format(comment_id);
754 var _html = ('<table><tbody><tr id="{0}" class="{1}">'+
754 var _html = ('<table><tbody><tr id="{0}" class="{1}">'+
755 '<td class="lineno-inline new-inline"></td>'+
755 '<td class="lineno-inline new-inline"></td>'+
756 '<td class="lineno-inline old-inline"></td>'+
756 '<td class="lineno-inline old-inline"></td>'+
757 '<td>{2}</td>'+
757 '<td>{2}</td>'+
758 '</tr></tbody></table>').format(id, cls, body);
758 '</tr></tbody></table>').format(id, cls, body);
759 _el.innerHTML = _html;
759 _el.innerHTML = _html;
760 return _el.children[0].children[0].children[0];
760 return _el.children[0].children[0].children[0];
761 };
761 };
762
762
763 /** comments **/
763 /** comments **/
764 var removeInlineForm = function(form) {
764 var removeInlineForm = function(form) {
765 form.parentNode.removeChild(form);
765 form.parentNode.removeChild(form);
766 };
766 };
767
767
768 var createInlineForm = function(parent_tr, f_path, line) {
768 var createInlineForm = function(parent_tr, f_path, line) {
769 var tmpl = YUD.get('comment-inline-form-template').innerHTML;
769 var tmpl = YUD.get('comment-inline-form-template').innerHTML;
770 tmpl = tmpl.format(f_path, line);
770 tmpl = tmpl.format(f_path, line);
771 var form = tableTr('comment-form-inline',tmpl)
771 var form = tableTr('comment-form-inline',tmpl)
772
772
773 // create event for hide button
773 // create event for hide button
774 form = new YAHOO.util.Element(form);
774 form = new YAHOO.util.Element(form);
775 var form_hide_button = new YAHOO.util.Element(YUD.getElementsByClassName('hide-inline-form',null,form)[0]);
775 var form_hide_button = new YAHOO.util.Element(YUD.getElementsByClassName('hide-inline-form',null,form)[0]);
776 form_hide_button.on('click', function(e) {
776 form_hide_button.on('click', function(e) {
777 var newtr = e.currentTarget.parentNode.parentNode.parentNode.parentNode.parentNode;
777 var newtr = e.currentTarget.parentNode.parentNode.parentNode.parentNode.parentNode;
778 if(YUD.hasClass(newtr.nextElementSibling,'inline-comments-button')){
778 if(YUD.hasClass(newtr.nextElementSibling,'inline-comments-button')){
779 YUD.setStyle(newtr.nextElementSibling,'display','');
779 YUD.setStyle(newtr.nextElementSibling,'display','');
780 }
780 }
781 removeInlineForm(newtr);
781 removeInlineForm(newtr);
782 YUD.removeClass(parent_tr, 'form-open');
782 YUD.removeClass(parent_tr, 'form-open');
783 YUD.removeClass(parent_tr, 'hl-comment');
783 YUD.removeClass(parent_tr, 'hl-comment');
784
784
785 });
785 });
786
786
787 return form
787 return form
788 };
788 };
789
789
790 /**
790 /**
791 * Inject inline comment for on given TR this tr should be always an .line
791 * Inject inline comment for on given TR this tr should be always an .line
792 * tr containing the line. Code will detect comment, and always put the comment
792 * tr containing the line. Code will detect comment, and always put the comment
793 * block at the very bottom
793 * block at the very bottom
794 */
794 */
795 var injectInlineForm = function(tr){
795 var injectInlineForm = function(tr){
796 if(!YUD.hasClass(tr, 'line')){
796 if(!YUD.hasClass(tr, 'line')){
797 return
797 return
798 }
798 }
799 var submit_url = AJAX_COMMENT_URL;
799 var submit_url = AJAX_COMMENT_URL;
800 var _td = YUD.getElementsByClassName('code',null,tr)[0];
800 var _td = YUD.getElementsByClassName('code',null,tr)[0];
801 if(YUD.hasClass(tr,'form-open') || YUD.hasClass(tr,'context') || YUD.hasClass(_td,'no-comment')){
801 if(YUD.hasClass(tr,'form-open') || YUD.hasClass(tr,'context') || YUD.hasClass(_td,'no-comment')){
802 return
802 return
803 }
803 }
804 YUD.addClass(tr,'form-open');
804 YUD.addClass(tr,'form-open');
805 YUD.addClass(tr,'hl-comment');
805 YUD.addClass(tr,'hl-comment');
806 var node = YUD.getElementsByClassName('full_f_path',null,tr.parentNode.parentNode.parentNode)[0];
806 var node = YUD.getElementsByClassName('full_f_path',null,tr.parentNode.parentNode.parentNode)[0];
807 var f_path = YUD.getAttribute(node,'path');
807 var f_path = YUD.getAttribute(node,'path');
808 var lineno = getLineNo(tr);
808 var lineno = getLineNo(tr);
809 var form = createInlineForm(tr, f_path, lineno, submit_url);
809 var form = createInlineForm(tr, f_path, lineno, submit_url);
810
810
811 var parent = tr;
811 var parent = tr;
812 while (1){
812 while (1){
813 var n = parent.nextElementSibling;
813 var n = parent.nextElementSibling;
814 // next element are comments !
814 // next element are comments !
815 if(YUD.hasClass(n,'inline-comments')){
815 if(YUD.hasClass(n,'inline-comments')){
816 parent = n;
816 parent = n;
817 }
817 }
818 else{
818 else{
819 break;
819 break;
820 }
820 }
821 }
821 }
822 YUD.insertAfter(form,parent);
822 YUD.insertAfter(form,parent);
823 var f = YUD.get(form);
823 var f = YUD.get(form);
824 var overlay = YUD.getElementsByClassName('overlay',null,f)[0];
824 var overlay = YUD.getElementsByClassName('overlay',null,f)[0];
825 var _form = YUD.getElementsByClassName('inline-form',null,f)[0];
825 var _form = YUD.getElementsByClassName('inline-form',null,f)[0];
826
826
827 YUE.on(YUD.get(_form), 'submit',function(e){
827 YUE.on(YUD.get(_form), 'submit',function(e){
828 YUE.preventDefault(e);
828 YUE.preventDefault(e);
829
829
830 //ajax submit
830 //ajax submit
831 var text = YUD.get('text_'+lineno).value;
831 var text = YUD.get('text_'+lineno).value;
832 var postData = {
832 var postData = {
833 'text':text,
833 'text':text,
834 'f_path':f_path,
834 'f_path':f_path,
835 'line':lineno
835 'line':lineno
836 };
836 };
837
837
838 if(lineno === undefined){
838 if(lineno === undefined){
839 alert('missing line !');
839 alert('missing line !');
840 return
840 return
841 }
841 }
842 if(f_path === undefined){
842 if(f_path === undefined){
843 alert('missing file path !');
843 alert('missing file path !');
844 return
844 return
845 }
845 }
846
846
847 if(text == ""){
847 if(text == ""){
848 return
848 return
849 }
849 }
850
850
851 var success = function(o){
851 var success = function(o){
852 YUD.removeClass(tr, 'form-open');
852 YUD.removeClass(tr, 'form-open');
853 removeInlineForm(f);
853 removeInlineForm(f);
854 var json_data = JSON.parse(o.responseText);
854 var json_data = JSON.parse(o.responseText);
855 renderInlineComment(json_data);
855 renderInlineComment(json_data);
856 };
856 };
857
857
858 if (YUD.hasClass(overlay,'overlay')){
858 if (YUD.hasClass(overlay,'overlay')){
859 var w = _form.offsetWidth;
859 var w = _form.offsetWidth;
860 var h = _form.offsetHeight;
860 var h = _form.offsetHeight;
861 YUD.setStyle(overlay,'width',w+'px');
861 YUD.setStyle(overlay,'width',w+'px');
862 YUD.setStyle(overlay,'height',h+'px');
862 YUD.setStyle(overlay,'height',h+'px');
863 }
863 }
864 YUD.addClass(overlay, 'submitting');
864 YUD.addClass(overlay, 'submitting');
865
865
866 ajaxPOST(submit_url, postData, success);
866 ajaxPOST(submit_url, postData, success);
867 });
867 });
868
869 YUE.on('preview-btn_'+lineno, 'click', function(e){
870 var _text = YUD.get('text_'+lineno).value;
871 if(!_text){
872 return
873 }
874 var post_data = {'text': _text};
875 YUD.addClass('preview-box_'+lineno, 'unloaded');
876 YUD.get('preview-box_'+lineno).innerHTML = _TM['Loading ...'];
877 YUD.setStyle('edit-container_'+lineno, 'display', 'none');
878 YUD.setStyle('preview-container_'+lineno, 'display', '');
879
880 var url = pyroutes.url('changeset_comment_preview', {'repo_name': REPO_NAME});
881 ajaxPOST(url,post_data,function(o){
882 YUD.get('preview-box_'+lineno).innerHTML = o.responseText;
883 YUD.removeClass('preview-box_'+lineno, 'unloaded');
884 })
885 })
886 YUE.on('edit-btn_'+lineno, 'click', function(e){
887 YUD.setStyle('edit-container_'+lineno, 'display', '');
888 YUD.setStyle('preview-container_'+lineno, 'display', 'none');
889 })
890
868
891
869 setTimeout(function(){
892 setTimeout(function(){
870 // callbacks
893 // callbacks
871 tooltip_activate();
894 tooltip_activate();
872 MentionsAutoComplete('text_'+lineno, 'mentions_container_'+lineno,
895 MentionsAutoComplete('text_'+lineno, 'mentions_container_'+lineno,
873 _USERS_AC_DATA, _GROUPS_AC_DATA);
896 _USERS_AC_DATA, _GROUPS_AC_DATA);
874 var _e = YUD.get('text_'+lineno);
897 var _e = YUD.get('text_'+lineno);
875 if(_e){
898 if(_e){
876 _e.focus();
899 _e.focus();
877 }
900 }
878 },10)
901 },10)
879 };
902 };
880
903
881 var deleteComment = function(comment_id){
904 var deleteComment = function(comment_id){
882 var url = AJAX_COMMENT_DELETE_URL.replace('__COMMENT_ID__',comment_id);
905 var url = AJAX_COMMENT_DELETE_URL.replace('__COMMENT_ID__',comment_id);
883 var postData = {'_method':'delete'};
906 var postData = {'_method':'delete'};
884 var success = function(o){
907 var success = function(o){
885 var n = YUD.get('comment-tr-'+comment_id);
908 var n = YUD.get('comment-tr-'+comment_id);
886 var root = prevElementSibling(prevElementSibling(n));
909 var root = prevElementSibling(prevElementSibling(n));
887 n.parentNode.removeChild(n);
910 n.parentNode.removeChild(n);
888
911
889 // scann nodes, and attach add button to last one
912 // scann nodes, and attach add button to last one only for TR
890 placeAddButton(root);
913 // which are the inline comments
914 if(root && root.tagName == 'TR'){
915 placeAddButton(root);
916 }
891 }
917 }
892 ajaxPOST(url,postData,success);
918 ajaxPOST(url,postData,success);
893 }
919 }
894
920
895 var createInlineAddButton = function(tr){
921 var createInlineAddButton = function(tr){
896
922
897 var label = TRANSLATION_MAP['Add another comment'];
923 var label = TRANSLATION_MAP['Add another comment'];
898
924
899 var html_el = document.createElement('div');
925 var html_el = document.createElement('div');
900 YUD.addClass(html_el, 'add-comment');
926 YUD.addClass(html_el, 'add-comment');
901 html_el.innerHTML = '<span class="ui-btn">{0}</span>'.format(label);
927 html_el.innerHTML = '<span class="ui-btn">{0}</span>'.format(label);
902
928
903 var add = new YAHOO.util.Element(html_el);
929 var add = new YAHOO.util.Element(html_el);
904 add.on('click', function(e) {
930 add.on('click', function(e) {
905 injectInlineForm(tr);
931 injectInlineForm(tr);
906 });
932 });
907 return add;
933 return add;
908 };
934 };
909
935
910 var getLineNo = function(tr) {
936 var getLineNo = function(tr) {
911 var line;
937 var line;
912 var o = tr.children[0].id.split('_');
938 var o = tr.children[0].id.split('_');
913 var n = tr.children[1].id.split('_');
939 var n = tr.children[1].id.split('_');
914
940
915 if (n.length >= 2) {
941 if (n.length >= 2) {
916 line = n[n.length-1];
942 line = n[n.length-1];
917 } else if (o.length >= 2) {
943 } else if (o.length >= 2) {
918 line = o[o.length-1];
944 line = o[o.length-1];
919 }
945 }
920
946
921 return line
947 return line
922 };
948 };
923
949
924 var placeAddButton = function(target_tr){
950 var placeAddButton = function(target_tr){
925 if(!target_tr){
951 if(!target_tr){
926 return
952 return
927 }
953 }
928 var last_node = target_tr;
954 var last_node = target_tr;
929 //scann
955 //scann
930 while (1){
956 while (1){
931 var n = last_node.nextElementSibling;
957 var n = last_node.nextElementSibling;
932 // next element are comments !
958 // next element are comments !
933 if(YUD.hasClass(n,'inline-comments')){
959 if(YUD.hasClass(n,'inline-comments')){
934 last_node = n;
960 last_node = n;
935 //also remove the comment button from previous
961 //also remove the comment button from previous
936 var comment_add_buttons = YUD.getElementsByClassName('add-comment',null,last_node);
962 var comment_add_buttons = YUD.getElementsByClassName('add-comment',null,last_node);
937 for(var i=0;i<comment_add_buttons.length;i++){
963 for(var i=0;i<comment_add_buttons.length;i++){
938 var b = comment_add_buttons[i];
964 var b = comment_add_buttons[i];
939 b.parentNode.removeChild(b);
965 b.parentNode.removeChild(b);
940 }
966 }
941 }
967 }
942 else{
968 else{
943 break;
969 break;
944 }
970 }
945 }
971 }
946
972
947 var add = createInlineAddButton(target_tr);
973 var add = createInlineAddButton(target_tr);
948 // get the comment div
974 // get the comment div
949 var comment_block = YUD.getElementsByClassName('comment',null,last_node)[0];
975 var comment_block = YUD.getElementsByClassName('comment',null,last_node)[0];
950 // attach add button
976 // attach add button
951 YUD.insertAfter(add,comment_block);
977 YUD.insertAfter(add,comment_block);
952 }
978 }
953
979
954 /**
980 /**
955 * Places the inline comment into the changeset block in proper line position
981 * Places the inline comment into the changeset block in proper line position
956 */
982 */
957 var placeInline = function(target_container,lineno,html){
983 var placeInline = function(target_container,lineno,html){
958 var lineid = "{0}_{1}".format(target_container,lineno);
984 var lineid = "{0}_{1}".format(target_container,lineno);
959 var target_line = YUD.get(lineid);
985 var target_line = YUD.get(lineid);
960 var comment = new YAHOO.util.Element(tableTr('inline-comments',html))
986 var comment = new YAHOO.util.Element(tableTr('inline-comments',html))
961
987
962 // check if there are comments already !
988 // check if there are comments already !
963 var parent = target_line.parentNode;
989 var parent = target_line.parentNode;
964 var root_parent = parent;
990 var root_parent = parent;
965 while (1){
991 while (1){
966 var n = parent.nextElementSibling;
992 var n = parent.nextElementSibling;
967 // next element are comments !
993 // next element are comments !
968 if(YUD.hasClass(n,'inline-comments')){
994 if(YUD.hasClass(n,'inline-comments')){
969 parent = n;
995 parent = n;
970 }
996 }
971 else{
997 else{
972 break;
998 break;
973 }
999 }
974 }
1000 }
975 // put in the comment at the bottom
1001 // put in the comment at the bottom
976 YUD.insertAfter(comment,parent);
1002 YUD.insertAfter(comment,parent);
977
1003
978 // scann nodes, and attach add button to last one
1004 // scann nodes, and attach add button to last one
979 placeAddButton(root_parent);
1005 placeAddButton(root_parent);
980
1006
981 return target_line;
1007 return target_line;
982 }
1008 }
983
1009
984 /**
1010 /**
985 * make a single inline comment and place it inside
1011 * make a single inline comment and place it inside
986 */
1012 */
987 var renderInlineComment = function(json_data){
1013 var renderInlineComment = function(json_data){
988 try{
1014 try{
989 var html = json_data['rendered_text'];
1015 var html = json_data['rendered_text'];
990 var lineno = json_data['line_no'];
1016 var lineno = json_data['line_no'];
991 var target_id = json_data['target_id'];
1017 var target_id = json_data['target_id'];
992 placeInline(target_id, lineno, html);
1018 placeInline(target_id, lineno, html);
993
1019
994 }catch(e){
1020 }catch(e){
995 console.log(e);
1021 console.log(e);
996 }
1022 }
997 }
1023 }
998
1024
999 /**
1025 /**
1000 * Iterates over all the inlines, and places them inside proper blocks of data
1026 * Iterates over all the inlines, and places them inside proper blocks of data
1001 */
1027 */
1002 var renderInlineComments = function(file_comments){
1028 var renderInlineComments = function(file_comments){
1003 for (f in file_comments){
1029 for (f in file_comments){
1004 // holding all comments for a FILE
1030 // holding all comments for a FILE
1005 var box = file_comments[f];
1031 var box = file_comments[f];
1006
1032
1007 var target_id = YUD.getAttribute(box,'target_id');
1033 var target_id = YUD.getAttribute(box,'target_id');
1008 // actually comments with line numbers
1034 // actually comments with line numbers
1009 var comments = box.children;
1035 var comments = box.children;
1010 for(var i=0; i<comments.length; i++){
1036 for(var i=0; i<comments.length; i++){
1011 var data = {
1037 var data = {
1012 'rendered_text': comments[i].outerHTML,
1038 'rendered_text': comments[i].outerHTML,
1013 'line_no': YUD.getAttribute(comments[i],'line'),
1039 'line_no': YUD.getAttribute(comments[i],'line'),
1014 'target_id': target_id
1040 'target_id': target_id
1015 }
1041 }
1016 renderInlineComment(data);
1042 renderInlineComment(data);
1017 }
1043 }
1018 }
1044 }
1019 }
1045 }
1020
1046
1021 var fileBrowserListeners = function(current_url, node_list_url, url_base){
1047 var fileBrowserListeners = function(current_url, node_list_url, url_base){
1022 var current_url_branch = +"?branch=__BRANCH__";
1048 var current_url_branch = +"?branch=__BRANCH__";
1023
1049
1024 YUE.on('stay_at_branch','click',function(e){
1050 YUE.on('stay_at_branch','click',function(e){
1025 if(e.target.checked){
1051 if(e.target.checked){
1026 var uri = current_url_branch;
1052 var uri = current_url_branch;
1027 uri = uri.replace('__BRANCH__',e.target.value);
1053 uri = uri.replace('__BRANCH__',e.target.value);
1028 window.location = uri;
1054 window.location = uri;
1029 }
1055 }
1030 else{
1056 else{
1031 window.location = current_url;
1057 window.location = current_url;
1032 }
1058 }
1033 })
1059 })
1034
1060
1035 var n_filter = YUD.get('node_filter');
1061 var n_filter = YUD.get('node_filter');
1036 var F = YAHOO.namespace('node_filter');
1062 var F = YAHOO.namespace('node_filter');
1037
1063
1038 F.filterTimeout = null;
1064 F.filterTimeout = null;
1039 var nodes = null;
1065 var nodes = null;
1040
1066
1041 F.initFilter = function(){
1067 F.initFilter = function(){
1042 YUD.setStyle('node_filter_box_loading','display','');
1068 YUD.setStyle('node_filter_box_loading','display','');
1043 YUD.setStyle('search_activate_id','display','none');
1069 YUD.setStyle('search_activate_id','display','none');
1044 YUD.setStyle('add_node_id','display','none');
1070 YUD.setStyle('add_node_id','display','none');
1045 YUC.initHeader('X-PARTIAL-XHR',true);
1071 YUC.initHeader('X-PARTIAL-XHR',true);
1046 YUC.asyncRequest('GET', node_list_url, {
1072 YUC.asyncRequest('GET', node_list_url, {
1047 success:function(o){
1073 success:function(o){
1048 nodes = JSON.parse(o.responseText).nodes;
1074 nodes = JSON.parse(o.responseText).nodes;
1049 YUD.setStyle('node_filter_box_loading','display','none');
1075 YUD.setStyle('node_filter_box_loading','display','none');
1050 YUD.setStyle('node_filter_box','display','');
1076 YUD.setStyle('node_filter_box','display','');
1051 n_filter.focus();
1077 n_filter.focus();
1052 if(YUD.hasClass(n_filter,'init')){
1078 if(YUD.hasClass(n_filter,'init')){
1053 n_filter.value = '';
1079 n_filter.value = '';
1054 YUD.removeClass(n_filter,'init');
1080 YUD.removeClass(n_filter,'init');
1055 }
1081 }
1056 },
1082 },
1057 failure:function(o){
1083 failure:function(o){
1058 console.log('failed to load');
1084 console.log('failed to load');
1059 }
1085 }
1060 },null);
1086 },null);
1061 }
1087 }
1062
1088
1063 F.updateFilter = function(e) {
1089 F.updateFilter = function(e) {
1064
1090
1065 return function(){
1091 return function(){
1066 // Reset timeout
1092 // Reset timeout
1067 F.filterTimeout = null;
1093 F.filterTimeout = null;
1068 var query = e.target.value.toLowerCase();
1094 var query = e.target.value.toLowerCase();
1069 var match = [];
1095 var match = [];
1070 var matches = 0;
1096 var matches = 0;
1071 var matches_max = 20;
1097 var matches_max = 20;
1072 if (query != ""){
1098 if (query != ""){
1073 for(var i=0;i<nodes.length;i++){
1099 for(var i=0;i<nodes.length;i++){
1074
1100
1075 var pos = nodes[i].name.toLowerCase().indexOf(query)
1101 var pos = nodes[i].name.toLowerCase().indexOf(query)
1076 if(query && pos != -1){
1102 if(query && pos != -1){
1077
1103
1078 matches++
1104 matches++
1079 //show only certain amount to not kill browser
1105 //show only certain amount to not kill browser
1080 if (matches > matches_max){
1106 if (matches > matches_max){
1081 break;
1107 break;
1082 }
1108 }
1083
1109
1084 var n = nodes[i].name;
1110 var n = nodes[i].name;
1085 var t = nodes[i].type;
1111 var t = nodes[i].type;
1086 var n_hl = n.substring(0,pos)
1112 var n_hl = n.substring(0,pos)
1087 +"<b>{0}</b>".format(n.substring(pos,pos+query.length))
1113 +"<b>{0}</b>".format(n.substring(pos,pos+query.length))
1088 +n.substring(pos+query.length)
1114 +n.substring(pos+query.length)
1089 var new_url = url_base.replace('__FPATH__',n);
1115 var new_url = url_base.replace('__FPATH__',n);
1090 match.push('<tr><td><a class="browser-{0}" href="{1}">{2}</a></td><td colspan="5"></td></tr>'.format(t,new_url,n_hl));
1116 match.push('<tr><td><a class="browser-{0}" href="{1}">{2}</a></td><td colspan="5"></td></tr>'.format(t,new_url,n_hl));
1091 }
1117 }
1092 if(match.length >= matches_max){
1118 if(match.length >= matches_max){
1093 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['Search truncated']));
1119 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['Search truncated']));
1094 }
1120 }
1095 }
1121 }
1096 }
1122 }
1097 if(query != ""){
1123 if(query != ""){
1098 YUD.setStyle('tbody','display','none');
1124 YUD.setStyle('tbody','display','none');
1099 YUD.setStyle('tbody_filtered','display','');
1125 YUD.setStyle('tbody_filtered','display','');
1100
1126
1101 if (match.length==0){
1127 if (match.length==0){
1102 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['No matching files']));
1128 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['No matching files']));
1103 }
1129 }
1104
1130
1105 YUD.get('tbody_filtered').innerHTML = match.join("");
1131 YUD.get('tbody_filtered').innerHTML = match.join("");
1106 }
1132 }
1107 else{
1133 else{
1108 YUD.setStyle('tbody','display','');
1134 YUD.setStyle('tbody','display','');
1109 YUD.setStyle('tbody_filtered','display','none');
1135 YUD.setStyle('tbody_filtered','display','none');
1110 }
1136 }
1111
1137
1112 }
1138 }
1113 };
1139 };
1114
1140
1115 YUE.on(YUD.get('filter_activate'),'click',function(){
1141 YUE.on(YUD.get('filter_activate'),'click',function(){
1116 F.initFilter();
1142 F.initFilter();
1117 })
1143 })
1118 YUE.on(n_filter,'click',function(){
1144 YUE.on(n_filter,'click',function(){
1119 if(YUD.hasClass(n_filter,'init')){
1145 if(YUD.hasClass(n_filter,'init')){
1120 n_filter.value = '';
1146 n_filter.value = '';
1121 YUD.removeClass(n_filter,'init');
1147 YUD.removeClass(n_filter,'init');
1122 }
1148 }
1123 });
1149 });
1124 YUE.on(n_filter,'keyup',function(e){
1150 YUE.on(n_filter,'keyup',function(e){
1125 clearTimeout(F.filterTimeout);
1151 clearTimeout(F.filterTimeout);
1126 F.filterTimeout = setTimeout(F.updateFilter(e),600);
1152 F.filterTimeout = setTimeout(F.updateFilter(e),600);
1127 });
1153 });
1128 };
1154 };
1129
1155
1130
1156
1131 var initCodeMirror = function(textAreadId,resetUrl){
1157 var initCodeMirror = function(textAreadId,resetUrl){
1132 var myCodeMirror = CodeMirror.fromTextArea(YUD.get(textAreadId),{
1158 var myCodeMirror = CodeMirror.fromTextArea(YUD.get(textAreadId),{
1133 mode: "null",
1159 mode: "null",
1134 lineNumbers:true
1160 lineNumbers:true
1135 });
1161 });
1136 YUE.on('reset','click',function(e){
1162 YUE.on('reset','click',function(e){
1137 window.location=resetUrl
1163 window.location=resetUrl
1138 });
1164 });
1139
1165
1140 YUE.on('file_enable','click',function(){
1166 YUE.on('file_enable','click',function(){
1141 YUD.setStyle('editor_container','display','');
1167 YUD.setStyle('editor_container','display','');
1142 YUD.setStyle('upload_file_container','display','none');
1168 YUD.setStyle('upload_file_container','display','none');
1143 YUD.setStyle('filename_container','display','');
1169 YUD.setStyle('filename_container','display','');
1144 });
1170 });
1145
1171
1146 YUE.on('upload_file_enable','click',function(){
1172 YUE.on('upload_file_enable','click',function(){
1147 YUD.setStyle('editor_container','display','none');
1173 YUD.setStyle('editor_container','display','none');
1148 YUD.setStyle('upload_file_container','display','');
1174 YUD.setStyle('upload_file_container','display','');
1149 YUD.setStyle('filename_container','display','none');
1175 YUD.setStyle('filename_container','display','none');
1150 });
1176 });
1151 };
1177 };
1152
1178
1153
1179
1154
1180
1155 var getIdentNode = function(n){
1181 var getIdentNode = function(n){
1156 //iterate thru nodes untill matched interesting node !
1182 //iterate thru nodes untill matched interesting node !
1157
1183
1158 if (typeof n == 'undefined'){
1184 if (typeof n == 'undefined'){
1159 return -1
1185 return -1
1160 }
1186 }
1161
1187
1162 if(typeof n.id != "undefined" && n.id.match('L[0-9]+')){
1188 if(typeof n.id != "undefined" && n.id.match('L[0-9]+')){
1163 return n
1189 return n
1164 }
1190 }
1165 else{
1191 else{
1166 return getIdentNode(n.parentNode);
1192 return getIdentNode(n.parentNode);
1167 }
1193 }
1168 };
1194 };
1169
1195
1170 var getSelectionLink = function(e) {
1196 var getSelectionLink = function(e) {
1171
1197
1172 //get selection from start/to nodes
1198 //get selection from start/to nodes
1173 if (typeof window.getSelection != "undefined") {
1199 if (typeof window.getSelection != "undefined") {
1174 s = window.getSelection();
1200 s = window.getSelection();
1175
1201
1176 from = getIdentNode(s.anchorNode);
1202 from = getIdentNode(s.anchorNode);
1177 till = getIdentNode(s.focusNode);
1203 till = getIdentNode(s.focusNode);
1178
1204
1179 f_int = parseInt(from.id.replace('L',''));
1205 f_int = parseInt(from.id.replace('L',''));
1180 t_int = parseInt(till.id.replace('L',''));
1206 t_int = parseInt(till.id.replace('L',''));
1181
1207
1182 if (f_int > t_int){
1208 if (f_int > t_int){
1183 //highlight from bottom
1209 //highlight from bottom
1184 offset = -35;
1210 offset = -35;
1185 ranges = [t_int,f_int];
1211 ranges = [t_int,f_int];
1186
1212
1187 }
1213 }
1188 else{
1214 else{
1189 //highligth from top
1215 //highligth from top
1190 offset = 35;
1216 offset = 35;
1191 ranges = [f_int,t_int];
1217 ranges = [f_int,t_int];
1192 }
1218 }
1193 // if we select more than 2 lines
1219 // if we select more than 2 lines
1194 if (ranges[0] != ranges[1]){
1220 if (ranges[0] != ranges[1]){
1195 if(YUD.get('linktt') == null){
1221 if(YUD.get('linktt') == null){
1196 hl_div = document.createElement('div');
1222 hl_div = document.createElement('div');
1197 hl_div.id = 'linktt';
1223 hl_div.id = 'linktt';
1198 }
1224 }
1199 hl_div.innerHTML = '';
1225 hl_div.innerHTML = '';
1200
1226
1201 anchor = '#L'+ranges[0]+'-'+ranges[1];
1227 anchor = '#L'+ranges[0]+'-'+ranges[1];
1202 var link = document.createElement('a');
1228 var link = document.createElement('a');
1203 link.href = location.href.substring(0,location.href.indexOf('#'))+anchor;
1229 link.href = location.href.substring(0,location.href.indexOf('#'))+anchor;
1204 link.innerHTML = _TM['Selection link'];
1230 link.innerHTML = _TM['Selection link'];
1205 hl_div.appendChild(link);
1231 hl_div.appendChild(link);
1206 YUD.get('body').appendChild(hl_div);
1232 YUD.get('body').appendChild(hl_div);
1207
1233
1208 xy = YUD.getXY(till.id);
1234 xy = YUD.getXY(till.id);
1209
1235
1210 YUD.addClass('linktt', 'hl-tip-box');
1236 YUD.addClass('linktt', 'hl-tip-box');
1211 YUD.setStyle('linktt','top',xy[1]+offset+'px');
1237 YUD.setStyle('linktt','top',xy[1]+offset+'px');
1212 YUD.setStyle('linktt','left',xy[0]+'px');
1238 YUD.setStyle('linktt','left',xy[0]+'px');
1213 YUD.setStyle('linktt','visibility','visible');
1239 YUD.setStyle('linktt','visibility','visible');
1214
1240
1215 }
1241 }
1216 else{
1242 else{
1217 YUD.setStyle('linktt','visibility','hidden');
1243 YUD.setStyle('linktt','visibility','hidden');
1218 }
1244 }
1219 }
1245 }
1220 };
1246 };
1221
1247
1222 var deleteNotification = function(url, notification_id,callbacks){
1248 var deleteNotification = function(url, notification_id,callbacks){
1223 var callback = {
1249 var callback = {
1224 success:function(o){
1250 success:function(o){
1225 var obj = YUD.get(String("notification_"+notification_id));
1251 var obj = YUD.get(String("notification_"+notification_id));
1226 if(obj.parentNode !== undefined){
1252 if(obj.parentNode !== undefined){
1227 obj.parentNode.removeChild(obj);
1253 obj.parentNode.removeChild(obj);
1228 }
1254 }
1229 _run_callbacks(callbacks);
1255 _run_callbacks(callbacks);
1230 },
1256 },
1231 failure:function(o){
1257 failure:function(o){
1232 alert("error");
1258 alert("error");
1233 },
1259 },
1234 };
1260 };
1235 var postData = '_method=delete';
1261 var postData = '_method=delete';
1236 var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
1262 var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
1237 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
1263 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
1238 callback, postData);
1264 callback, postData);
1239 };
1265 };
1240
1266
1241 var readNotification = function(url, notification_id,callbacks){
1267 var readNotification = function(url, notification_id,callbacks){
1242 var callback = {
1268 var callback = {
1243 success:function(o){
1269 success:function(o){
1244 var obj = YUD.get(String("notification_"+notification_id));
1270 var obj = YUD.get(String("notification_"+notification_id));
1245 YUD.removeClass(obj, 'unread');
1271 YUD.removeClass(obj, 'unread');
1246 var r_button = YUD.getElementsByClassName('read-notification',null,obj.children[0])[0];
1272 var r_button = YUD.getElementsByClassName('read-notification',null,obj.children[0])[0];
1247
1273
1248 if(r_button.parentNode !== undefined){
1274 if(r_button.parentNode !== undefined){
1249 r_button.parentNode.removeChild(r_button);
1275 r_button.parentNode.removeChild(r_button);
1250 }
1276 }
1251 _run_callbacks(callbacks);
1277 _run_callbacks(callbacks);
1252 },
1278 },
1253 failure:function(o){
1279 failure:function(o){
1254 alert("error");
1280 alert("error");
1255 },
1281 },
1256 };
1282 };
1257 var postData = '_method=put';
1283 var postData = '_method=put';
1258 var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
1284 var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
1259 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
1285 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
1260 callback, postData);
1286 callback, postData);
1261 };
1287 };
1262
1288
1263 /** MEMBERS AUTOCOMPLETE WIDGET **/
1289 /** MEMBERS AUTOCOMPLETE WIDGET **/
1264
1290
1265 var MembersAutoComplete = function (divid, cont, users_list, groups_list) {
1291 var MembersAutoComplete = function (divid, cont, users_list, groups_list) {
1266 var myUsers = users_list;
1292 var myUsers = users_list;
1267 var myGroups = groups_list;
1293 var myGroups = groups_list;
1268
1294
1269 // Define a custom search function for the DataSource of users
1295 // Define a custom search function for the DataSource of users
1270 var matchUsers = function (sQuery) {
1296 var matchUsers = function (sQuery) {
1271 // Case insensitive matching
1297 // Case insensitive matching
1272 var query = sQuery.toLowerCase();
1298 var query = sQuery.toLowerCase();
1273 var i = 0;
1299 var i = 0;
1274 var l = myUsers.length;
1300 var l = myUsers.length;
1275 var matches = [];
1301 var matches = [];
1276
1302
1277 // Match against each name of each contact
1303 // Match against each name of each contact
1278 for (; i < l; i++) {
1304 for (; i < l; i++) {
1279 contact = myUsers[i];
1305 contact = myUsers[i];
1280 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1306 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1281 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1307 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1282 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1308 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1283 matches[matches.length] = contact;
1309 matches[matches.length] = contact;
1284 }
1310 }
1285 }
1311 }
1286 return matches;
1312 return matches;
1287 };
1313 };
1288
1314
1289 // Define a custom search function for the DataSource of userGroups
1315 // Define a custom search function for the DataSource of userGroups
1290 var matchGroups = function (sQuery) {
1316 var matchGroups = function (sQuery) {
1291 // Case insensitive matching
1317 // Case insensitive matching
1292 var query = sQuery.toLowerCase();
1318 var query = sQuery.toLowerCase();
1293 var i = 0;
1319 var i = 0;
1294 var l = myGroups.length;
1320 var l = myGroups.length;
1295 var matches = [];
1321 var matches = [];
1296
1322
1297 // Match against each name of each contact
1323 // Match against each name of each contact
1298 for (; i < l; i++) {
1324 for (; i < l; i++) {
1299 matched_group = myGroups[i];
1325 matched_group = myGroups[i];
1300 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
1326 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
1301 matches[matches.length] = matched_group;
1327 matches[matches.length] = matched_group;
1302 }
1328 }
1303 }
1329 }
1304 return matches;
1330 return matches;
1305 };
1331 };
1306
1332
1307 //match all
1333 //match all
1308 var matchAll = function (sQuery) {
1334 var matchAll = function (sQuery) {
1309 u = matchUsers(sQuery);
1335 u = matchUsers(sQuery);
1310 g = matchGroups(sQuery);
1336 g = matchGroups(sQuery);
1311 return u.concat(g);
1337 return u.concat(g);
1312 };
1338 };
1313
1339
1314 // DataScheme for members
1340 // DataScheme for members
1315 var memberDS = new YAHOO.util.FunctionDataSource(matchAll);
1341 var memberDS = new YAHOO.util.FunctionDataSource(matchAll);
1316 memberDS.responseSchema = {
1342 memberDS.responseSchema = {
1317 fields: ["id", "fname", "lname", "nname", "grname", "grmembers", "gravatar_lnk"]
1343 fields: ["id", "fname", "lname", "nname", "grname", "grmembers", "gravatar_lnk"]
1318 };
1344 };
1319
1345
1320 // DataScheme for owner
1346 // DataScheme for owner
1321 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1347 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1322 ownerDS.responseSchema = {
1348 ownerDS.responseSchema = {
1323 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1349 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1324 };
1350 };
1325
1351
1326 // Instantiate AutoComplete for perms
1352 // Instantiate AutoComplete for perms
1327 var membersAC = new YAHOO.widget.AutoComplete(divid, cont, memberDS);
1353 var membersAC = new YAHOO.widget.AutoComplete(divid, cont, memberDS);
1328 membersAC.useShadow = false;
1354 membersAC.useShadow = false;
1329 membersAC.resultTypeList = false;
1355 membersAC.resultTypeList = false;
1330 membersAC.animVert = false;
1356 membersAC.animVert = false;
1331 membersAC.animHoriz = false;
1357 membersAC.animHoriz = false;
1332 membersAC.animSpeed = 0.1;
1358 membersAC.animSpeed = 0.1;
1333
1359
1334 // Instantiate AutoComplete for owner
1360 // Instantiate AutoComplete for owner
1335 var ownerAC = new YAHOO.widget.AutoComplete("user", "owner_container", ownerDS);
1361 var ownerAC = new YAHOO.widget.AutoComplete("user", "owner_container", ownerDS);
1336 ownerAC.useShadow = false;
1362 ownerAC.useShadow = false;
1337 ownerAC.resultTypeList = false;
1363 ownerAC.resultTypeList = false;
1338 ownerAC.animVert = false;
1364 ownerAC.animVert = false;
1339 ownerAC.animHoriz = false;
1365 ownerAC.animHoriz = false;
1340 ownerAC.animSpeed = 0.1;
1366 ownerAC.animSpeed = 0.1;
1341
1367
1342 // Helper highlight function for the formatter
1368 // Helper highlight function for the formatter
1343 var highlightMatch = function (full, snippet, matchindex) {
1369 var highlightMatch = function (full, snippet, matchindex) {
1344 return full.substring(0, matchindex)
1370 return full.substring(0, matchindex)
1345 + "<span class='match'>"
1371 + "<span class='match'>"
1346 + full.substr(matchindex, snippet.length)
1372 + full.substr(matchindex, snippet.length)
1347 + "</span>" + full.substring(matchindex + snippet.length);
1373 + "</span>" + full.substring(matchindex + snippet.length);
1348 };
1374 };
1349
1375
1350 // Custom formatter to highlight the matching letters
1376 // Custom formatter to highlight the matching letters
1351 var custom_formatter = function (oResultData, sQuery, sResultMatch) {
1377 var custom_formatter = function (oResultData, sQuery, sResultMatch) {
1352 var query = sQuery.toLowerCase();
1378 var query = sQuery.toLowerCase();
1353 var _gravatar = function(res, em, group){
1379 var _gravatar = function(res, em, group){
1354 if (group !== undefined){
1380 if (group !== undefined){
1355 em = '/images/icons/group.png'
1381 em = '/images/icons/group.png'
1356 }
1382 }
1357 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1383 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1358 return tmpl.format(em,res)
1384 return tmpl.format(em,res)
1359 }
1385 }
1360 // group
1386 // group
1361 if (oResultData.grname != undefined) {
1387 if (oResultData.grname != undefined) {
1362 var grname = oResultData.grname;
1388 var grname = oResultData.grname;
1363 var grmembers = oResultData.grmembers;
1389 var grmembers = oResultData.grmembers;
1364 var grnameMatchIndex = grname.toLowerCase().indexOf(query);
1390 var grnameMatchIndex = grname.toLowerCase().indexOf(query);
1365 var grprefix = "{0}: ".format(_TM['Group']);
1391 var grprefix = "{0}: ".format(_TM['Group']);
1366 var grsuffix = " (" + grmembers + " )";
1392 var grsuffix = " (" + grmembers + " )";
1367 var grsuffix = " ({0} {1})".format(grmembers, _TM['members']);
1393 var grsuffix = " ({0} {1})".format(grmembers, _TM['members']);
1368
1394
1369 if (grnameMatchIndex > -1) {
1395 if (grnameMatchIndex > -1) {
1370 return _gravatar(grprefix + highlightMatch(grname, query, grnameMatchIndex) + grsuffix,null,true);
1396 return _gravatar(grprefix + highlightMatch(grname, query, grnameMatchIndex) + grsuffix,null,true);
1371 }
1397 }
1372 return _gravatar(grprefix + oResultData.grname + grsuffix, null,true);
1398 return _gravatar(grprefix + oResultData.grname + grsuffix, null,true);
1373 // Users
1399 // Users
1374 } else if (oResultData.nname != undefined) {
1400 } else if (oResultData.nname != undefined) {
1375 var fname = oResultData.fname || "";
1401 var fname = oResultData.fname || "";
1376 var lname = oResultData.lname || "";
1402 var lname = oResultData.lname || "";
1377 var nname = oResultData.nname;
1403 var nname = oResultData.nname;
1378
1404
1379 // Guard against null value
1405 // Guard against null value
1380 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1406 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1381 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1407 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1382 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1408 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1383 displayfname, displaylname, displaynname;
1409 displayfname, displaylname, displaynname;
1384
1410
1385 if (fnameMatchIndex > -1) {
1411 if (fnameMatchIndex > -1) {
1386 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1412 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1387 } else {
1413 } else {
1388 displayfname = fname;
1414 displayfname = fname;
1389 }
1415 }
1390
1416
1391 if (lnameMatchIndex > -1) {
1417 if (lnameMatchIndex > -1) {
1392 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1418 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1393 } else {
1419 } else {
1394 displaylname = lname;
1420 displaylname = lname;
1395 }
1421 }
1396
1422
1397 if (nnameMatchIndex > -1) {
1423 if (nnameMatchIndex > -1) {
1398 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1424 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1399 } else {
1425 } else {
1400 displaynname = nname ? "(" + nname + ")" : "";
1426 displaynname = nname ? "(" + nname + ")" : "";
1401 }
1427 }
1402
1428
1403 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1429 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1404 } else {
1430 } else {
1405 return '';
1431 return '';
1406 }
1432 }
1407 };
1433 };
1408 membersAC.formatResult = custom_formatter;
1434 membersAC.formatResult = custom_formatter;
1409 ownerAC.formatResult = custom_formatter;
1435 ownerAC.formatResult = custom_formatter;
1410
1436
1411 var myHandler = function (sType, aArgs) {
1437 var myHandler = function (sType, aArgs) {
1412 var nextId = divid.split('perm_new_member_name_')[1];
1438 var nextId = divid.split('perm_new_member_name_')[1];
1413 var myAC = aArgs[0]; // reference back to the AC instance
1439 var myAC = aArgs[0]; // reference back to the AC instance
1414 var elLI = aArgs[1]; // reference to the selected LI element
1440 var elLI = aArgs[1]; // reference to the selected LI element
1415 var oData = aArgs[2]; // object literal of selected item's result data
1441 var oData = aArgs[2]; // object literal of selected item's result data
1416 //fill the autocomplete with value
1442 //fill the autocomplete with value
1417 if (oData.nname != undefined) {
1443 if (oData.nname != undefined) {
1418 //users
1444 //users
1419 myAC.getInputEl().value = oData.nname;
1445 myAC.getInputEl().value = oData.nname;
1420 YUD.get('perm_new_member_type_'+nextId).value = 'user';
1446 YUD.get('perm_new_member_type_'+nextId).value = 'user';
1421 } else {
1447 } else {
1422 //groups
1448 //groups
1423 myAC.getInputEl().value = oData.grname;
1449 myAC.getInputEl().value = oData.grname;
1424 YUD.get('perm_new_member_type_'+nextId).value = 'users_group';
1450 YUD.get('perm_new_member_type_'+nextId).value = 'users_group';
1425 }
1451 }
1426 };
1452 };
1427
1453
1428 membersAC.itemSelectEvent.subscribe(myHandler);
1454 membersAC.itemSelectEvent.subscribe(myHandler);
1429 if(ownerAC.itemSelectEvent){
1455 if(ownerAC.itemSelectEvent){
1430 ownerAC.itemSelectEvent.subscribe(myHandler);
1456 ownerAC.itemSelectEvent.subscribe(myHandler);
1431 }
1457 }
1432
1458
1433 return {
1459 return {
1434 memberDS: memberDS,
1460 memberDS: memberDS,
1435 ownerDS: ownerDS,
1461 ownerDS: ownerDS,
1436 membersAC: membersAC,
1462 membersAC: membersAC,
1437 ownerAC: ownerAC,
1463 ownerAC: ownerAC,
1438 };
1464 };
1439 }
1465 }
1440
1466
1441
1467
1442 var MentionsAutoComplete = function (divid, cont, users_list, groups_list) {
1468 var MentionsAutoComplete = function (divid, cont, users_list, groups_list) {
1443 var myUsers = users_list;
1469 var myUsers = users_list;
1444 var myGroups = groups_list;
1470 var myGroups = groups_list;
1445
1471
1446 // Define a custom search function for the DataSource of users
1472 // Define a custom search function for the DataSource of users
1447 var matchUsers = function (sQuery) {
1473 var matchUsers = function (sQuery) {
1448 var org_sQuery = sQuery;
1474 var org_sQuery = sQuery;
1449 if(this.mentionQuery == null){
1475 if(this.mentionQuery == null){
1450 return []
1476 return []
1451 }
1477 }
1452 sQuery = this.mentionQuery;
1478 sQuery = this.mentionQuery;
1453 // Case insensitive matching
1479 // Case insensitive matching
1454 var query = sQuery.toLowerCase();
1480 var query = sQuery.toLowerCase();
1455 var i = 0;
1481 var i = 0;
1456 var l = myUsers.length;
1482 var l = myUsers.length;
1457 var matches = [];
1483 var matches = [];
1458
1484
1459 // Match against each name of each contact
1485 // Match against each name of each contact
1460 for (; i < l; i++) {
1486 for (; i < l; i++) {
1461 contact = myUsers[i];
1487 contact = myUsers[i];
1462 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1488 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1463 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1489 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1464 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1490 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1465 matches[matches.length] = contact;
1491 matches[matches.length] = contact;
1466 }
1492 }
1467 }
1493 }
1468 return matches
1494 return matches
1469 };
1495 };
1470
1496
1471 //match all
1497 //match all
1472 var matchAll = function (sQuery) {
1498 var matchAll = function (sQuery) {
1473 u = matchUsers(sQuery);
1499 u = matchUsers(sQuery);
1474 return u
1500 return u
1475 };
1501 };
1476
1502
1477 // DataScheme for owner
1503 // DataScheme for owner
1478 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1504 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1479
1505
1480 ownerDS.responseSchema = {
1506 ownerDS.responseSchema = {
1481 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1507 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1482 };
1508 };
1483
1509
1484 // Instantiate AutoComplete for mentions
1510 // Instantiate AutoComplete for mentions
1485 var ownerAC = new YAHOO.widget.AutoComplete(divid, cont, ownerDS);
1511 var ownerAC = new YAHOO.widget.AutoComplete(divid, cont, ownerDS);
1486 ownerAC.useShadow = false;
1512 ownerAC.useShadow = false;
1487 ownerAC.resultTypeList = false;
1513 ownerAC.resultTypeList = false;
1488 ownerAC.suppressInputUpdate = true;
1514 ownerAC.suppressInputUpdate = true;
1489 ownerAC.animVert = false;
1515 ownerAC.animVert = false;
1490 ownerAC.animHoriz = false;
1516 ownerAC.animHoriz = false;
1491 ownerAC.animSpeed = 0.1;
1517 ownerAC.animSpeed = 0.1;
1492
1518
1493 // Helper highlight function for the formatter
1519 // Helper highlight function for the formatter
1494 var highlightMatch = function (full, snippet, matchindex) {
1520 var highlightMatch = function (full, snippet, matchindex) {
1495 return full.substring(0, matchindex)
1521 return full.substring(0, matchindex)
1496 + "<span class='match'>"
1522 + "<span class='match'>"
1497 + full.substr(matchindex, snippet.length)
1523 + full.substr(matchindex, snippet.length)
1498 + "</span>" + full.substring(matchindex + snippet.length);
1524 + "</span>" + full.substring(matchindex + snippet.length);
1499 };
1525 };
1500
1526
1501 // Custom formatter to highlight the matching letters
1527 // Custom formatter to highlight the matching letters
1502 ownerAC.formatResult = function (oResultData, sQuery, sResultMatch) {
1528 ownerAC.formatResult = function (oResultData, sQuery, sResultMatch) {
1503 var org_sQuery = sQuery;
1529 var org_sQuery = sQuery;
1504 if(this.dataSource.mentionQuery != null){
1530 if(this.dataSource.mentionQuery != null){
1505 sQuery = this.dataSource.mentionQuery;
1531 sQuery = this.dataSource.mentionQuery;
1506 }
1532 }
1507
1533
1508 var query = sQuery.toLowerCase();
1534 var query = sQuery.toLowerCase();
1509 var _gravatar = function(res, em, group){
1535 var _gravatar = function(res, em, group){
1510 if (group !== undefined){
1536 if (group !== undefined){
1511 em = '/images/icons/group.png'
1537 em = '/images/icons/group.png'
1512 }
1538 }
1513 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1539 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1514 return tmpl.format(em,res)
1540 return tmpl.format(em,res)
1515 }
1541 }
1516 if (oResultData.nname != undefined) {
1542 if (oResultData.nname != undefined) {
1517 var fname = oResultData.fname || "";
1543 var fname = oResultData.fname || "";
1518 var lname = oResultData.lname || "";
1544 var lname = oResultData.lname || "";
1519 var nname = oResultData.nname;
1545 var nname = oResultData.nname;
1520
1546
1521 // Guard against null value
1547 // Guard against null value
1522 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1548 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1523 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1549 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1524 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1550 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1525 displayfname, displaylname, displaynname;
1551 displayfname, displaylname, displaynname;
1526
1552
1527 if (fnameMatchIndex > -1) {
1553 if (fnameMatchIndex > -1) {
1528 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1554 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1529 } else {
1555 } else {
1530 displayfname = fname;
1556 displayfname = fname;
1531 }
1557 }
1532
1558
1533 if (lnameMatchIndex > -1) {
1559 if (lnameMatchIndex > -1) {
1534 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1560 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1535 } else {
1561 } else {
1536 displaylname = lname;
1562 displaylname = lname;
1537 }
1563 }
1538
1564
1539 if (nnameMatchIndex > -1) {
1565 if (nnameMatchIndex > -1) {
1540 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1566 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1541 } else {
1567 } else {
1542 displaynname = nname ? "(" + nname + ")" : "";
1568 displaynname = nname ? "(" + nname + ")" : "";
1543 }
1569 }
1544
1570
1545 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1571 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1546 } else {
1572 } else {
1547 return '';
1573 return '';
1548 }
1574 }
1549 };
1575 };
1550
1576
1551 if(ownerAC.itemSelectEvent){
1577 if(ownerAC.itemSelectEvent){
1552 ownerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
1578 ownerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
1553
1579
1554 var myAC = aArgs[0]; // reference back to the AC instance
1580 var myAC = aArgs[0]; // reference back to the AC instance
1555 var elLI = aArgs[1]; // reference to the selected LI element
1581 var elLI = aArgs[1]; // reference to the selected LI element
1556 var oData = aArgs[2]; // object literal of selected item's result data
1582 var oData = aArgs[2]; // object literal of selected item's result data
1557 //fill the autocomplete with value
1583 //fill the autocomplete with value
1558 if (oData.nname != undefined) {
1584 if (oData.nname != undefined) {
1559 //users
1585 //users
1560 //Replace the mention name with replaced
1586 //Replace the mention name with replaced
1561 var re = new RegExp();
1587 var re = new RegExp();
1562 var org = myAC.getInputEl().value;
1588 var org = myAC.getInputEl().value;
1563 var chunks = myAC.dataSource.chunks
1589 var chunks = myAC.dataSource.chunks
1564 // replace middle chunk(the search term) with actuall match
1590 // replace middle chunk(the search term) with actuall match
1565 chunks[1] = chunks[1].replace('@'+myAC.dataSource.mentionQuery,
1591 chunks[1] = chunks[1].replace('@'+myAC.dataSource.mentionQuery,
1566 '@'+oData.nname+' ');
1592 '@'+oData.nname+' ');
1567 myAC.getInputEl().value = chunks.join('')
1593 myAC.getInputEl().value = chunks.join('')
1568 YUD.get(myAC.getInputEl()).focus(); // Y U NO WORK !?
1594 YUD.get(myAC.getInputEl()).focus(); // Y U NO WORK !?
1569 } else {
1595 } else {
1570 //groups
1596 //groups
1571 myAC.getInputEl().value = oData.grname;
1597 myAC.getInputEl().value = oData.grname;
1572 YUD.get('perm_new_member_type').value = 'users_group';
1598 YUD.get('perm_new_member_type').value = 'users_group';
1573 }
1599 }
1574 });
1600 });
1575 }
1601 }
1576
1602
1577 // in this keybuffer we will gather current value of search !
1603 // in this keybuffer we will gather current value of search !
1578 // since we need to get this just when someone does `@` then we do the
1604 // since we need to get this just when someone does `@` then we do the
1579 // search
1605 // search
1580 ownerAC.dataSource.chunks = [];
1606 ownerAC.dataSource.chunks = [];
1581 ownerAC.dataSource.mentionQuery = null;
1607 ownerAC.dataSource.mentionQuery = null;
1582
1608
1583 ownerAC.get_mention = function(msg, max_pos) {
1609 ownerAC.get_mention = function(msg, max_pos) {
1584 var org = msg;
1610 var org = msg;
1585 var re = new RegExp('(?:^@|\s@)([a-zA-Z0-9]{1}[a-zA-Z0-9\-\_\.]+)$')
1611 var re = new RegExp('(?:^@|\s@)([a-zA-Z0-9]{1}[a-zA-Z0-9\-\_\.]+)$')
1586 var chunks = [];
1612 var chunks = [];
1587
1613
1588
1614
1589 // cut first chunk until curret pos
1615 // cut first chunk until curret pos
1590 var to_max = msg.substr(0, max_pos);
1616 var to_max = msg.substr(0, max_pos);
1591 var at_pos = Math.max(0,to_max.lastIndexOf('@')-1);
1617 var at_pos = Math.max(0,to_max.lastIndexOf('@')-1);
1592 var msg2 = to_max.substr(at_pos);
1618 var msg2 = to_max.substr(at_pos);
1593
1619
1594 chunks.push(org.substr(0,at_pos))// prefix chunk
1620 chunks.push(org.substr(0,at_pos))// prefix chunk
1595 chunks.push(msg2) // search chunk
1621 chunks.push(msg2) // search chunk
1596 chunks.push(org.substr(max_pos)) // postfix chunk
1622 chunks.push(org.substr(max_pos)) // postfix chunk
1597
1623
1598 // clean up msg2 for filtering and regex match
1624 // clean up msg2 for filtering and regex match
1599 var msg2 = msg2.lstrip(' ').lstrip('\n');
1625 var msg2 = msg2.lstrip(' ').lstrip('\n');
1600
1626
1601 if(re.test(msg2)){
1627 if(re.test(msg2)){
1602 var unam = re.exec(msg2)[1];
1628 var unam = re.exec(msg2)[1];
1603 return [unam, chunks];
1629 return [unam, chunks];
1604 }
1630 }
1605 return [null, null];
1631 return [null, null];
1606 };
1632 };
1607
1633
1608 if (ownerAC.textboxKeyUpEvent){
1634 if (ownerAC.textboxKeyUpEvent){
1609 ownerAC.textboxKeyUpEvent.subscribe(function(type, args){
1635 ownerAC.textboxKeyUpEvent.subscribe(function(type, args){
1610
1636
1611 var ac_obj = args[0];
1637 var ac_obj = args[0];
1612 var currentMessage = args[1];
1638 var currentMessage = args[1];
1613 var currentCaretPosition = args[0]._elTextbox.selectionStart;
1639 var currentCaretPosition = args[0]._elTextbox.selectionStart;
1614
1640
1615 var unam = ownerAC.get_mention(currentMessage, currentCaretPosition);
1641 var unam = ownerAC.get_mention(currentMessage, currentCaretPosition);
1616 var curr_search = null;
1642 var curr_search = null;
1617 if(unam[0]){
1643 if(unam[0]){
1618 curr_search = unam[0];
1644 curr_search = unam[0];
1619 }
1645 }
1620
1646
1621 ownerAC.dataSource.chunks = unam[1];
1647 ownerAC.dataSource.chunks = unam[1];
1622 ownerAC.dataSource.mentionQuery = curr_search;
1648 ownerAC.dataSource.mentionQuery = curr_search;
1623
1649
1624 })
1650 })
1625 }
1651 }
1626 return {
1652 return {
1627 ownerDS: ownerDS,
1653 ownerDS: ownerDS,
1628 ownerAC: ownerAC,
1654 ownerAC: ownerAC,
1629 };
1655 };
1630 }
1656 }
1631
1657
1632 var addReviewMember = function(id,fname,lname,nname,gravatar_link){
1658 var addReviewMember = function(id,fname,lname,nname,gravatar_link){
1633 var members = YUD.get('review_members');
1659 var members = YUD.get('review_members');
1634 var tmpl = '<li id="reviewer_{2}">'+
1660 var tmpl = '<li id="reviewer_{2}">'+
1635 '<div class="reviewers_member">'+
1661 '<div class="reviewers_member">'+
1636 '<div class="gravatar"><img alt="gravatar" src="{0}"/> </div>'+
1662 '<div class="gravatar"><img alt="gravatar" src="{0}"/> </div>'+
1637 '<div style="float:left">{1}</div>'+
1663 '<div style="float:left">{1}</div>'+
1638 '<input type="hidden" value="{2}" name="review_members" />'+
1664 '<input type="hidden" value="{2}" name="review_members" />'+
1639 '<span class="delete_icon action_button" onclick="removeReviewMember({2})"></span>'+
1665 '<span class="delete_icon action_button" onclick="removeReviewMember({2})"></span>'+
1640 '</div>'+
1666 '</div>'+
1641 '</li>' ;
1667 '</li>' ;
1642 var displayname = "{0} {1} ({2})".format(fname,lname,nname);
1668 var displayname = "{0} {1} ({2})".format(fname,lname,nname);
1643 var element = tmpl.format(gravatar_link,displayname,id);
1669 var element = tmpl.format(gravatar_link,displayname,id);
1644 // check if we don't have this ID already in
1670 // check if we don't have this ID already in
1645 var ids = [];
1671 var ids = [];
1646 var _els = YUQ('#review_members li');
1672 var _els = YUQ('#review_members li');
1647 for (el in _els){
1673 for (el in _els){
1648 ids.push(_els[el].id)
1674 ids.push(_els[el].id)
1649 }
1675 }
1650 if(ids.indexOf('reviewer_'+id) == -1){
1676 if(ids.indexOf('reviewer_'+id) == -1){
1651 //only add if it's not there
1677 //only add if it's not there
1652 members.innerHTML += element;
1678 members.innerHTML += element;
1653 }
1679 }
1654
1680
1655 }
1681 }
1656
1682
1657 var removeReviewMember = function(reviewer_id, repo_name, pull_request_id){
1683 var removeReviewMember = function(reviewer_id, repo_name, pull_request_id){
1658 var el = YUD.get('reviewer_{0}'.format(reviewer_id));
1684 var el = YUD.get('reviewer_{0}'.format(reviewer_id));
1659 if (el.parentNode !== undefined){
1685 if (el.parentNode !== undefined){
1660 el.parentNode.removeChild(el);
1686 el.parentNode.removeChild(el);
1661 }
1687 }
1662 }
1688 }
1663
1689
1664 var updateReviewers = function(reviewers_ids, repo_name, pull_request_id){
1690 var updateReviewers = function(reviewers_ids, repo_name, pull_request_id){
1665 if (reviewers_ids === undefined){
1691 if (reviewers_ids === undefined){
1666 var reviewers_ids = [];
1692 var reviewers_ids = [];
1667 var ids = YUQ('#review_members input');
1693 var ids = YUQ('#review_members input');
1668 for(var i=0; i<ids.length;i++){
1694 for(var i=0; i<ids.length;i++){
1669 var id = ids[i].value
1695 var id = ids[i].value
1670 reviewers_ids.push(id);
1696 reviewers_ids.push(id);
1671 }
1697 }
1672 }
1698 }
1673 var url = pyroutes.url('pullrequest_update', {"repo_name":repo_name,
1699 var url = pyroutes.url('pullrequest_update', {"repo_name":repo_name,
1674 "pull_request_id": pull_request_id});
1700 "pull_request_id": pull_request_id});
1675 var postData = {'_method':'put',
1701 var postData = {'_method':'put',
1676 'reviewers_ids': reviewers_ids};
1702 'reviewers_ids': reviewers_ids};
1677 var success = function(o){
1703 var success = function(o){
1678 window.location.reload();
1704 window.location.reload();
1679 }
1705 }
1680 ajaxPOST(url,postData,success);
1706 ajaxPOST(url,postData,success);
1681 }
1707 }
1682
1708
1683 var PullRequestAutoComplete = function (divid, cont, users_list, groups_list) {
1709 var PullRequestAutoComplete = function (divid, cont, users_list, groups_list) {
1684 var myUsers = users_list;
1710 var myUsers = users_list;
1685 var myGroups = groups_list;
1711 var myGroups = groups_list;
1686
1712
1687 // Define a custom search function for the DataSource of users
1713 // Define a custom search function for the DataSource of users
1688 var matchUsers = function (sQuery) {
1714 var matchUsers = function (sQuery) {
1689 // Case insensitive matching
1715 // Case insensitive matching
1690 var query = sQuery.toLowerCase();
1716 var query = sQuery.toLowerCase();
1691 var i = 0;
1717 var i = 0;
1692 var l = myUsers.length;
1718 var l = myUsers.length;
1693 var matches = [];
1719 var matches = [];
1694
1720
1695 // Match against each name of each contact
1721 // Match against each name of each contact
1696 for (; i < l; i++) {
1722 for (; i < l; i++) {
1697 contact = myUsers[i];
1723 contact = myUsers[i];
1698 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1724 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1699 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1725 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1700 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1726 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1701 matches[matches.length] = contact;
1727 matches[matches.length] = contact;
1702 }
1728 }
1703 }
1729 }
1704 return matches;
1730 return matches;
1705 };
1731 };
1706
1732
1707 // Define a custom search function for the DataSource of userGroups
1733 // Define a custom search function for the DataSource of userGroups
1708 var matchGroups = function (sQuery) {
1734 var matchGroups = function (sQuery) {
1709 // Case insensitive matching
1735 // Case insensitive matching
1710 var query = sQuery.toLowerCase();
1736 var query = sQuery.toLowerCase();
1711 var i = 0;
1737 var i = 0;
1712 var l = myGroups.length;
1738 var l = myGroups.length;
1713 var matches = [];
1739 var matches = [];
1714
1740
1715 // Match against each name of each contact
1741 // Match against each name of each contact
1716 for (; i < l; i++) {
1742 for (; i < l; i++) {
1717 matched_group = myGroups[i];
1743 matched_group = myGroups[i];
1718 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
1744 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
1719 matches[matches.length] = matched_group;
1745 matches[matches.length] = matched_group;
1720 }
1746 }
1721 }
1747 }
1722 return matches;
1748 return matches;
1723 };
1749 };
1724
1750
1725 //match all
1751 //match all
1726 var matchAll = function (sQuery) {
1752 var matchAll = function (sQuery) {
1727 u = matchUsers(sQuery);
1753 u = matchUsers(sQuery);
1728 return u
1754 return u
1729 };
1755 };
1730
1756
1731 // DataScheme for owner
1757 // DataScheme for owner
1732 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1758 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1733
1759
1734 ownerDS.responseSchema = {
1760 ownerDS.responseSchema = {
1735 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1761 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1736 };
1762 };
1737
1763
1738 // Instantiate AutoComplete for mentions
1764 // Instantiate AutoComplete for mentions
1739 var reviewerAC = new YAHOO.widget.AutoComplete(divid, cont, ownerDS);
1765 var reviewerAC = new YAHOO.widget.AutoComplete(divid, cont, ownerDS);
1740 reviewerAC.useShadow = false;
1766 reviewerAC.useShadow = false;
1741 reviewerAC.resultTypeList = false;
1767 reviewerAC.resultTypeList = false;
1742 reviewerAC.suppressInputUpdate = true;
1768 reviewerAC.suppressInputUpdate = true;
1743 reviewerAC.animVert = false;
1769 reviewerAC.animVert = false;
1744 reviewerAC.animHoriz = false;
1770 reviewerAC.animHoriz = false;
1745 reviewerAC.animSpeed = 0.1;
1771 reviewerAC.animSpeed = 0.1;
1746
1772
1747 // Helper highlight function for the formatter
1773 // Helper highlight function for the formatter
1748 var highlightMatch = function (full, snippet, matchindex) {
1774 var highlightMatch = function (full, snippet, matchindex) {
1749 return full.substring(0, matchindex)
1775 return full.substring(0, matchindex)
1750 + "<span class='match'>"
1776 + "<span class='match'>"
1751 + full.substr(matchindex, snippet.length)
1777 + full.substr(matchindex, snippet.length)
1752 + "</span>" + full.substring(matchindex + snippet.length);
1778 + "</span>" + full.substring(matchindex + snippet.length);
1753 };
1779 };
1754
1780
1755 // Custom formatter to highlight the matching letters
1781 // Custom formatter to highlight the matching letters
1756 reviewerAC.formatResult = function (oResultData, sQuery, sResultMatch) {
1782 reviewerAC.formatResult = function (oResultData, sQuery, sResultMatch) {
1757 var org_sQuery = sQuery;
1783 var org_sQuery = sQuery;
1758 if(this.dataSource.mentionQuery != null){
1784 if(this.dataSource.mentionQuery != null){
1759 sQuery = this.dataSource.mentionQuery;
1785 sQuery = this.dataSource.mentionQuery;
1760 }
1786 }
1761
1787
1762 var query = sQuery.toLowerCase();
1788 var query = sQuery.toLowerCase();
1763 var _gravatar = function(res, em, group){
1789 var _gravatar = function(res, em, group){
1764 if (group !== undefined){
1790 if (group !== undefined){
1765 em = '/images/icons/group.png'
1791 em = '/images/icons/group.png'
1766 }
1792 }
1767 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1793 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1768 return tmpl.format(em,res)
1794 return tmpl.format(em,res)
1769 }
1795 }
1770 if (oResultData.nname != undefined) {
1796 if (oResultData.nname != undefined) {
1771 var fname = oResultData.fname || "";
1797 var fname = oResultData.fname || "";
1772 var lname = oResultData.lname || "";
1798 var lname = oResultData.lname || "";
1773 var nname = oResultData.nname;
1799 var nname = oResultData.nname;
1774
1800
1775 // Guard against null value
1801 // Guard against null value
1776 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1802 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1777 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1803 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1778 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1804 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1779 displayfname, displaylname, displaynname;
1805 displayfname, displaylname, displaynname;
1780
1806
1781 if (fnameMatchIndex > -1) {
1807 if (fnameMatchIndex > -1) {
1782 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1808 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1783 } else {
1809 } else {
1784 displayfname = fname;
1810 displayfname = fname;
1785 }
1811 }
1786
1812
1787 if (lnameMatchIndex > -1) {
1813 if (lnameMatchIndex > -1) {
1788 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1814 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1789 } else {
1815 } else {
1790 displaylname = lname;
1816 displaylname = lname;
1791 }
1817 }
1792
1818
1793 if (nnameMatchIndex > -1) {
1819 if (nnameMatchIndex > -1) {
1794 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1820 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1795 } else {
1821 } else {
1796 displaynname = nname ? "(" + nname + ")" : "";
1822 displaynname = nname ? "(" + nname + ")" : "";
1797 }
1823 }
1798
1824
1799 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1825 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1800 } else {
1826 } else {
1801 return '';
1827 return '';
1802 }
1828 }
1803 };
1829 };
1804
1830
1805 //members cache to catch duplicates
1831 //members cache to catch duplicates
1806 reviewerAC.dataSource.cache = [];
1832 reviewerAC.dataSource.cache = [];
1807 // hack into select event
1833 // hack into select event
1808 if(reviewerAC.itemSelectEvent){
1834 if(reviewerAC.itemSelectEvent){
1809 reviewerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
1835 reviewerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
1810
1836
1811 var myAC = aArgs[0]; // reference back to the AC instance
1837 var myAC = aArgs[0]; // reference back to the AC instance
1812 var elLI = aArgs[1]; // reference to the selected LI element
1838 var elLI = aArgs[1]; // reference to the selected LI element
1813 var oData = aArgs[2]; // object literal of selected item's result data
1839 var oData = aArgs[2]; // object literal of selected item's result data
1814
1840
1815 //fill the autocomplete with value
1841 //fill the autocomplete with value
1816
1842
1817 if (oData.nname != undefined) {
1843 if (oData.nname != undefined) {
1818 addReviewMember(oData.id, oData.fname, oData.lname, oData.nname,
1844 addReviewMember(oData.id, oData.fname, oData.lname, oData.nname,
1819 oData.gravatar_lnk);
1845 oData.gravatar_lnk);
1820 myAC.dataSource.cache.push(oData.id);
1846 myAC.dataSource.cache.push(oData.id);
1821 YUD.get('user').value = ''
1847 YUD.get('user').value = ''
1822 }
1848 }
1823 });
1849 });
1824 }
1850 }
1825 return {
1851 return {
1826 ownerDS: ownerDS,
1852 ownerDS: ownerDS,
1827 reviewerAC: reviewerAC,
1853 reviewerAC: reviewerAC,
1828 };
1854 };
1829 }
1855 }
1830
1856
1831 /**
1857 /**
1832 * QUICK REPO MENU
1858 * QUICK REPO MENU
1833 */
1859 */
1834 var quick_repo_menu = function(){
1860 var quick_repo_menu = function(){
1835 YUE.on(YUQ('.quick_repo_menu'),'mouseenter',function(e){
1861 YUE.on(YUQ('.quick_repo_menu'),'mouseenter',function(e){
1836 var menu = e.currentTarget.firstElementChild.firstElementChild;
1862 var menu = e.currentTarget.firstElementChild.firstElementChild;
1837 if(YUD.hasClass(menu,'hidden')){
1863 if(YUD.hasClass(menu,'hidden')){
1838 YUD.replaceClass(e.currentTarget,'hidden', 'active');
1864 YUD.replaceClass(e.currentTarget,'hidden', 'active');
1839 YUD.replaceClass(menu, 'hidden', 'active');
1865 YUD.replaceClass(menu, 'hidden', 'active');
1840 }
1866 }
1841 })
1867 })
1842 YUE.on(YUQ('.quick_repo_menu'),'mouseleave',function(e){
1868 YUE.on(YUQ('.quick_repo_menu'),'mouseleave',function(e){
1843 var menu = e.currentTarget.firstElementChild.firstElementChild;
1869 var menu = e.currentTarget.firstElementChild.firstElementChild;
1844 if(YUD.hasClass(menu,'active')){
1870 if(YUD.hasClass(menu,'active')){
1845 YUD.replaceClass(e.currentTarget, 'active', 'hidden');
1871 YUD.replaceClass(e.currentTarget, 'active', 'hidden');
1846 YUD.replaceClass(menu, 'active', 'hidden');
1872 YUD.replaceClass(menu, 'active', 'hidden');
1847 }
1873 }
1848 })
1874 })
1849 };
1875 };
1850
1876
1851
1877
1852 /**
1878 /**
1853 * TABLE SORTING
1879 * TABLE SORTING
1854 */
1880 */
1855
1881
1856 // returns a node from given html;
1882 // returns a node from given html;
1857 var fromHTML = function(html){
1883 var fromHTML = function(html){
1858 var _html = document.createElement('element');
1884 var _html = document.createElement('element');
1859 _html.innerHTML = html;
1885 _html.innerHTML = html;
1860 return _html;
1886 return _html;
1861 }
1887 }
1862 var get_rev = function(node){
1888 var get_rev = function(node){
1863 var n = node.firstElementChild.firstElementChild;
1889 var n = node.firstElementChild.firstElementChild;
1864
1890
1865 if (n===null){
1891 if (n===null){
1866 return -1
1892 return -1
1867 }
1893 }
1868 else{
1894 else{
1869 out = n.firstElementChild.innerHTML.split(':')[0].replace('r','');
1895 out = n.firstElementChild.innerHTML.split(':')[0].replace('r','');
1870 return parseInt(out);
1896 return parseInt(out);
1871 }
1897 }
1872 }
1898 }
1873
1899
1874 var get_name = function(node){
1900 var get_name = function(node){
1875 var name = node.firstElementChild.children[2].innerHTML;
1901 var name = node.firstElementChild.children[2].innerHTML;
1876 return name
1902 return name
1877 }
1903 }
1878 var get_group_name = function(node){
1904 var get_group_name = function(node){
1879 var name = node.firstElementChild.children[1].innerHTML;
1905 var name = node.firstElementChild.children[1].innerHTML;
1880 return name
1906 return name
1881 }
1907 }
1882 var get_date = function(node){
1908 var get_date = function(node){
1883 var date_ = YUD.getAttribute(node.firstElementChild,'date');
1909 var date_ = YUD.getAttribute(node.firstElementChild,'date');
1884 return date_
1910 return date_
1885 }
1911 }
1886
1912
1887 var get_age = function(node){
1913 var get_age = function(node){
1888 return node
1914 return node
1889 }
1915 }
1890
1916
1891 var get_link = function(node){
1917 var get_link = function(node){
1892 return node.firstElementChild.text;
1918 return node.firstElementChild.text;
1893 }
1919 }
1894
1920
1895 var revisionSort = function(a, b, desc, field) {
1921 var revisionSort = function(a, b, desc, field) {
1896
1922
1897 var a_ = fromHTML(a.getData(field));
1923 var a_ = fromHTML(a.getData(field));
1898 var b_ = fromHTML(b.getData(field));
1924 var b_ = fromHTML(b.getData(field));
1899
1925
1900 // extract revisions from string nodes
1926 // extract revisions from string nodes
1901 a_ = get_rev(a_)
1927 a_ = get_rev(a_)
1902 b_ = get_rev(b_)
1928 b_ = get_rev(b_)
1903
1929
1904 var comp = YAHOO.util.Sort.compare;
1930 var comp = YAHOO.util.Sort.compare;
1905 var compState = comp(a_, b_, desc);
1931 var compState = comp(a_, b_, desc);
1906 return compState;
1932 return compState;
1907 };
1933 };
1908 var ageSort = function(a, b, desc, field) {
1934 var ageSort = function(a, b, desc, field) {
1909 var a_ = fromHTML(a.getData(field));
1935 var a_ = fromHTML(a.getData(field));
1910 var b_ = fromHTML(b.getData(field));
1936 var b_ = fromHTML(b.getData(field));
1911
1937
1912 // extract name from table
1938 // extract name from table
1913 a_ = get_date(a_)
1939 a_ = get_date(a_)
1914 b_ = get_date(b_)
1940 b_ = get_date(b_)
1915
1941
1916 var comp = YAHOO.util.Sort.compare;
1942 var comp = YAHOO.util.Sort.compare;
1917 var compState = comp(a_, b_, desc);
1943 var compState = comp(a_, b_, desc);
1918 return compState;
1944 return compState;
1919 };
1945 };
1920
1946
1921 var lastLoginSort = function(a, b, desc, field) {
1947 var lastLoginSort = function(a, b, desc, field) {
1922 var a_ = a.getData('last_login_raw') || 0;
1948 var a_ = a.getData('last_login_raw') || 0;
1923 var b_ = b.getData('last_login_raw') || 0;
1949 var b_ = b.getData('last_login_raw') || 0;
1924
1950
1925 var comp = YAHOO.util.Sort.compare;
1951 var comp = YAHOO.util.Sort.compare;
1926 var compState = comp(a_, b_, desc);
1952 var compState = comp(a_, b_, desc);
1927 return compState;
1953 return compState;
1928 };
1954 };
1929
1955
1930 var nameSort = function(a, b, desc, field) {
1956 var nameSort = function(a, b, desc, field) {
1931 var a_ = fromHTML(a.getData(field));
1957 var a_ = fromHTML(a.getData(field));
1932 var b_ = fromHTML(b.getData(field));
1958 var b_ = fromHTML(b.getData(field));
1933
1959
1934 // extract name from table
1960 // extract name from table
1935 a_ = get_name(a_)
1961 a_ = get_name(a_)
1936 b_ = get_name(b_)
1962 b_ = get_name(b_)
1937
1963
1938 var comp = YAHOO.util.Sort.compare;
1964 var comp = YAHOO.util.Sort.compare;
1939 var compState = comp(a_, b_, desc);
1965 var compState = comp(a_, b_, desc);
1940 return compState;
1966 return compState;
1941 };
1967 };
1942
1968
1943 var permNameSort = function(a, b, desc, field) {
1969 var permNameSort = function(a, b, desc, field) {
1944 var a_ = fromHTML(a.getData(field));
1970 var a_ = fromHTML(a.getData(field));
1945 var b_ = fromHTML(b.getData(field));
1971 var b_ = fromHTML(b.getData(field));
1946 // extract name from table
1972 // extract name from table
1947
1973
1948 a_ = a_.children[0].innerHTML;
1974 a_ = a_.children[0].innerHTML;
1949 b_ = b_.children[0].innerHTML;
1975 b_ = b_.children[0].innerHTML;
1950
1976
1951 var comp = YAHOO.util.Sort.compare;
1977 var comp = YAHOO.util.Sort.compare;
1952 var compState = comp(a_, b_, desc);
1978 var compState = comp(a_, b_, desc);
1953 return compState;
1979 return compState;
1954 };
1980 };
1955
1981
1956 var groupNameSort = function(a, b, desc, field) {
1982 var groupNameSort = function(a, b, desc, field) {
1957 var a_ = fromHTML(a.getData(field));
1983 var a_ = fromHTML(a.getData(field));
1958 var b_ = fromHTML(b.getData(field));
1984 var b_ = fromHTML(b.getData(field));
1959
1985
1960 // extract name from table
1986 // extract name from table
1961 a_ = get_group_name(a_)
1987 a_ = get_group_name(a_)
1962 b_ = get_group_name(b_)
1988 b_ = get_group_name(b_)
1963
1989
1964 var comp = YAHOO.util.Sort.compare;
1990 var comp = YAHOO.util.Sort.compare;
1965 var compState = comp(a_, b_, desc);
1991 var compState = comp(a_, b_, desc);
1966 return compState;
1992 return compState;
1967 };
1993 };
1968 var dateSort = function(a, b, desc, field) {
1994 var dateSort = function(a, b, desc, field) {
1969 var a_ = fromHTML(a.getData(field));
1995 var a_ = fromHTML(a.getData(field));
1970 var b_ = fromHTML(b.getData(field));
1996 var b_ = fromHTML(b.getData(field));
1971
1997
1972 // extract name from table
1998 // extract name from table
1973 a_ = get_date(a_)
1999 a_ = get_date(a_)
1974 b_ = get_date(b_)
2000 b_ = get_date(b_)
1975
2001
1976 var comp = YAHOO.util.Sort.compare;
2002 var comp = YAHOO.util.Sort.compare;
1977 var compState = comp(a_, b_, desc);
2003 var compState = comp(a_, b_, desc);
1978 return compState;
2004 return compState;
1979 };
2005 };
1980
2006
1981 var usernamelinkSort = function(a, b, desc, field) {
2007 var usernamelinkSort = function(a, b, desc, field) {
1982 var a_ = fromHTML(a.getData(field));
2008 var a_ = fromHTML(a.getData(field));
1983 var b_ = fromHTML(b.getData(field));
2009 var b_ = fromHTML(b.getData(field));
1984
2010
1985 // extract url text from string nodes
2011 // extract url text from string nodes
1986 a_ = get_link(a_)
2012 a_ = get_link(a_)
1987 b_ = get_link(b_)
2013 b_ = get_link(b_)
1988 var comp = YAHOO.util.Sort.compare;
2014 var comp = YAHOO.util.Sort.compare;
1989 var compState = comp(a_, b_, desc);
2015 var compState = comp(a_, b_, desc);
1990 return compState;
2016 return compState;
1991 }
2017 }
1992
2018
1993 var addPermAction = function(_html, users_list, groups_list){
2019 var addPermAction = function(_html, users_list, groups_list){
1994 var elmts = YUD.getElementsByClassName('last_new_member');
2020 var elmts = YUD.getElementsByClassName('last_new_member');
1995 var last_node = elmts[elmts.length-1];
2021 var last_node = elmts[elmts.length-1];
1996 if (last_node){
2022 if (last_node){
1997 var next_id = (YUD.getElementsByClassName('new_members')).length;
2023 var next_id = (YUD.getElementsByClassName('new_members')).length;
1998 _html = _html.format(next_id);
2024 _html = _html.format(next_id);
1999 last_node.innerHTML = _html;
2025 last_node.innerHTML = _html;
2000 YUD.setStyle(last_node, 'display', '');
2026 YUD.setStyle(last_node, 'display', '');
2001 YUD.removeClass(last_node, 'last_new_member');
2027 YUD.removeClass(last_node, 'last_new_member');
2002 MembersAutoComplete("perm_new_member_name_"+next_id,
2028 MembersAutoComplete("perm_new_member_name_"+next_id,
2003 "perm_container_"+next_id, users_list, groups_list);
2029 "perm_container_"+next_id, users_list, groups_list);
2004 //create new last NODE
2030 //create new last NODE
2005 var el = document.createElement('tr');
2031 var el = document.createElement('tr');
2006 el.id = 'add_perm_input';
2032 el.id = 'add_perm_input';
2007 YUD.addClass(el,'last_new_member');
2033 YUD.addClass(el,'last_new_member');
2008 YUD.addClass(el,'new_members');
2034 YUD.addClass(el,'new_members');
2009 YUD.insertAfter(el, last_node);
2035 YUD.insertAfter(el, last_node);
2010 }
2036 }
2011 }
2037 }
2012
2038
2013 /* Multi selectors */
2039 /* Multi selectors */
2014
2040
2015 var MultiSelectWidget = function(selected_id, available_id, form_id){
2041 var MultiSelectWidget = function(selected_id, available_id, form_id){
2016
2042
2017
2043
2018 //definition of containers ID's
2044 //definition of containers ID's
2019 var selected_container = selected_id;
2045 var selected_container = selected_id;
2020 var available_container = available_id;
2046 var available_container = available_id;
2021
2047
2022 //temp container for selected storage.
2048 //temp container for selected storage.
2023 var cache = new Array();
2049 var cache = new Array();
2024 var av_cache = new Array();
2050 var av_cache = new Array();
2025 var c = YUD.get(selected_container);
2051 var c = YUD.get(selected_container);
2026 var ac = YUD.get(available_container);
2052 var ac = YUD.get(available_container);
2027
2053
2028 //get only selected options for further fullfilment
2054 //get only selected options for further fullfilment
2029 for(var i = 0;node =c.options[i];i++){
2055 for(var i = 0;node =c.options[i];i++){
2030 if(node.selected){
2056 if(node.selected){
2031 //push selected to my temp storage left overs :)
2057 //push selected to my temp storage left overs :)
2032 cache.push(node);
2058 cache.push(node);
2033 }
2059 }
2034 }
2060 }
2035
2061
2036 //get all available options to cache
2062 //get all available options to cache
2037 for(var i = 0;node =ac.options[i];i++){
2063 for(var i = 0;node =ac.options[i];i++){
2038 //push selected to my temp storage left overs :)
2064 //push selected to my temp storage left overs :)
2039 av_cache.push(node);
2065 av_cache.push(node);
2040 }
2066 }
2041
2067
2042 //fill available only with those not in chosen
2068 //fill available only with those not in chosen
2043 ac.options.length=0;
2069 ac.options.length=0;
2044 tmp_cache = new Array();
2070 tmp_cache = new Array();
2045
2071
2046 for(var i = 0;node = av_cache[i];i++){
2072 for(var i = 0;node = av_cache[i];i++){
2047 var add = true;
2073 var add = true;
2048 for(var i2 = 0;node_2 = cache[i2];i2++){
2074 for(var i2 = 0;node_2 = cache[i2];i2++){
2049 if(node.value == node_2.value){
2075 if(node.value == node_2.value){
2050 add=false;
2076 add=false;
2051 break;
2077 break;
2052 }
2078 }
2053 }
2079 }
2054 if(add){
2080 if(add){
2055 tmp_cache.push(new Option(node.text, node.value, false, false));
2081 tmp_cache.push(new Option(node.text, node.value, false, false));
2056 }
2082 }
2057 }
2083 }
2058
2084
2059 for(var i = 0;node = tmp_cache[i];i++){
2085 for(var i = 0;node = tmp_cache[i];i++){
2060 ac.options[i] = node;
2086 ac.options[i] = node;
2061 }
2087 }
2062
2088
2063 function prompts_action_callback(e){
2089 function prompts_action_callback(e){
2064
2090
2065 var chosen = YUD.get(selected_container);
2091 var chosen = YUD.get(selected_container);
2066 var available = YUD.get(available_container);
2092 var available = YUD.get(available_container);
2067
2093
2068 //get checked and unchecked options from field
2094 //get checked and unchecked options from field
2069 function get_checked(from_field){
2095 function get_checked(from_field){
2070 //temp container for storage.
2096 //temp container for storage.
2071 var sel_cache = new Array();
2097 var sel_cache = new Array();
2072 var oth_cache = new Array();
2098 var oth_cache = new Array();
2073
2099
2074 for(var i = 0;node = from_field.options[i];i++){
2100 for(var i = 0;node = from_field.options[i];i++){
2075 if(node.selected){
2101 if(node.selected){
2076 //push selected fields :)
2102 //push selected fields :)
2077 sel_cache.push(node);
2103 sel_cache.push(node);
2078 }
2104 }
2079 else{
2105 else{
2080 oth_cache.push(node)
2106 oth_cache.push(node)
2081 }
2107 }
2082 }
2108 }
2083
2109
2084 return [sel_cache,oth_cache]
2110 return [sel_cache,oth_cache]
2085 }
2111 }
2086
2112
2087 //fill the field with given options
2113 //fill the field with given options
2088 function fill_with(field,options){
2114 function fill_with(field,options){
2089 //clear firtst
2115 //clear firtst
2090 field.options.length=0;
2116 field.options.length=0;
2091 for(var i = 0;node = options[i];i++){
2117 for(var i = 0;node = options[i];i++){
2092 field.options[i]=new Option(node.text, node.value,
2118 field.options[i]=new Option(node.text, node.value,
2093 false, false);
2119 false, false);
2094 }
2120 }
2095
2121
2096 }
2122 }
2097 //adds to current field
2123 //adds to current field
2098 function add_to(field,options){
2124 function add_to(field,options){
2099 for(var i = 0;node = options[i];i++){
2125 for(var i = 0;node = options[i];i++){
2100 field.appendChild(new Option(node.text, node.value,
2126 field.appendChild(new Option(node.text, node.value,
2101 false, false));
2127 false, false));
2102 }
2128 }
2103 }
2129 }
2104
2130
2105 // add action
2131 // add action
2106 if (this.id=='add_element'){
2132 if (this.id=='add_element'){
2107 var c = get_checked(available);
2133 var c = get_checked(available);
2108 add_to(chosen,c[0]);
2134 add_to(chosen,c[0]);
2109 fill_with(available,c[1]);
2135 fill_with(available,c[1]);
2110 }
2136 }
2111 // remove action
2137 // remove action
2112 if (this.id=='remove_element'){
2138 if (this.id=='remove_element'){
2113 var c = get_checked(chosen);
2139 var c = get_checked(chosen);
2114 add_to(available,c[0]);
2140 add_to(available,c[0]);
2115 fill_with(chosen,c[1]);
2141 fill_with(chosen,c[1]);
2116 }
2142 }
2117 // add all elements
2143 // add all elements
2118 if(this.id=='add_all_elements'){
2144 if(this.id=='add_all_elements'){
2119 for(var i=0; node = available.options[i];i++){
2145 for(var i=0; node = available.options[i];i++){
2120 chosen.appendChild(new Option(node.text,
2146 chosen.appendChild(new Option(node.text,
2121 node.value, false, false));
2147 node.value, false, false));
2122 }
2148 }
2123 available.options.length = 0;
2149 available.options.length = 0;
2124 }
2150 }
2125 //remove all elements
2151 //remove all elements
2126 if(this.id=='remove_all_elements'){
2152 if(this.id=='remove_all_elements'){
2127 for(var i=0; node = chosen.options[i];i++){
2153 for(var i=0; node = chosen.options[i];i++){
2128 available.appendChild(new Option(node.text,
2154 available.appendChild(new Option(node.text,
2129 node.value, false, false));
2155 node.value, false, false));
2130 }
2156 }
2131 chosen.options.length = 0;
2157 chosen.options.length = 0;
2132 }
2158 }
2133
2159
2134 }
2160 }
2135
2161
2136 YUE.addListener(['add_element','remove_element',
2162 YUE.addListener(['add_element','remove_element',
2137 'add_all_elements','remove_all_elements'],'click',
2163 'add_all_elements','remove_all_elements'],'click',
2138 prompts_action_callback)
2164 prompts_action_callback)
2139 if (form_id !== undefined) {
2165 if (form_id !== undefined) {
2140 YUE.addListener(form_id,'submit',function(){
2166 YUE.addListener(form_id,'submit',function(){
2141 var chosen = YUD.get(selected_container);
2167 var chosen = YUD.get(selected_container);
2142 for (var i = 0; i < chosen.options.length; i++) {
2168 for (var i = 0; i < chosen.options.length; i++) {
2143 chosen.options[i].selected = 'selected';
2169 chosen.options[i].selected = 'selected';
2144 }
2170 }
2145 });
2171 });
2146 }
2172 }
2147 }
2173 }
2148
2174
2149
2175
2150 // global hooks after DOM is loaded
2176 // global hooks after DOM is loaded
2151
2177
2152 YUE.onDOMReady(function(){
2178 YUE.onDOMReady(function(){
2153 YUE.on(YUQ('.diff-collapse-button'), 'click', function(e){
2179 YUE.on(YUQ('.diff-collapse-button'), 'click', function(e){
2154 var button = e.currentTarget;
2180 var button = e.currentTarget;
2155 var t = YUD.get(button).getAttribute('target');
2181 var t = YUD.get(button).getAttribute('target');
2156 console.log(t);
2182 console.log(t);
2157 if(YUD.hasClass(t, 'hidden')){
2183 if(YUD.hasClass(t, 'hidden')){
2158 YUD.removeClass(t, 'hidden');
2184 YUD.removeClass(t, 'hidden');
2159 YUD.get(button).innerHTML = "&uarr; {0} &uarr;".format(_TM['Collapse diff']);
2185 YUD.get(button).innerHTML = "&uarr; {0} &uarr;".format(_TM['Collapse diff']);
2160 }
2186 }
2161 else if(!YUD.hasClass(t, 'hidden')){
2187 else if(!YUD.hasClass(t, 'hidden')){
2162 YUD.addClass(t, 'hidden');
2188 YUD.addClass(t, 'hidden');
2163 YUD.get(button).innerHTML = "&darr; {0} &darr;".format(_TM['Expand diff']);
2189 YUD.get(button).innerHTML = "&darr; {0} &darr;".format(_TM['Expand diff']);
2164 }
2190 }
2165 });
2191 });
2166
2192
2167
2193
2168
2194
2169 });
2195 });
2170
2196
@@ -1,115 +1,120 b''
1 ## -*- coding: utf-8 -*-
1 ## -*- coding: utf-8 -*-
2 <!DOCTYPE html>
2 <!DOCTYPE html>
3 <html xmlns="http://www.w3.org/1999/xhtml">
3 <html xmlns="http://www.w3.org/1999/xhtml">
4 <head>
4 <head>
5 <title>${self.title()}</title>
5 <title>${self.title()}</title>
6 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
6 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
7 <meta name="robots" content="index, nofollow"/>
7 <meta name="robots" content="index, nofollow"/>
8 <link rel="icon" href="${h.url('/images/icons/database_gear.png')}" type="image/png" />
8 <link rel="icon" href="${h.url('/images/icons/database_gear.png')}" type="image/png" />
9
9
10 ## CSS ###
10 ## CSS ###
11 <%def name="css()">
11 <%def name="css()">
12 <link rel="stylesheet" type="text/css" href="${h.url('/css/style.css', ver=c.rhodecode_version)}" media="screen"/>
12 <link rel="stylesheet" type="text/css" href="${h.url('/css/style.css', ver=c.rhodecode_version)}" media="screen"/>
13 <link rel="stylesheet" type="text/css" href="${h.url('/css/pygments.css', ver=c.rhodecode_version)}"/>
13 <link rel="stylesheet" type="text/css" href="${h.url('/css/pygments.css', ver=c.rhodecode_version)}"/>
14 <link rel="stylesheet" type="text/css" href="${h.url('/css/contextbar.css', ver=c.rhodecode_version)}"/>
14 <link rel="stylesheet" type="text/css" href="${h.url('/css/contextbar.css', ver=c.rhodecode_version)}"/>
15 ## EXTRA FOR CSS
15 ## EXTRA FOR CSS
16 ${self.css_extra()}
16 ${self.css_extra()}
17 </%def>
17 </%def>
18 <%def name="css_extra()">
18 <%def name="css_extra()">
19 </%def>
19 </%def>
20
20
21 ${self.css()}
21 ${self.css()}
22
22
23 %if c.ga_code:
23 %if c.ga_code:
24 <!-- Analytics -->
24 <!-- Analytics -->
25 <script type="text/javascript">
25 <script type="text/javascript">
26 var _gaq = _gaq || [];
26 var _gaq = _gaq || [];
27 _gaq.push(['_setAccount', '${c.ga_code}']);
27 _gaq.push(['_setAccount', '${c.ga_code}']);
28 _gaq.push(['_trackPageview']);
28 _gaq.push(['_trackPageview']);
29
29
30 (function() {
30 (function() {
31 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
31 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
32 ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
32 ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
33 var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
33 var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
34 })();
34 })();
35 </script>
35 </script>
36 %endif
36 %endif
37
37
38 ## JAVASCRIPT ##
38 ## JAVASCRIPT ##
39 <%def name="js()">
39 <%def name="js()">
40 <script type="text/javascript">
40 <script type="text/javascript">
41 //JS translations map
41 //JS translations map
42 var TRANSLATION_MAP = {
42 var TRANSLATION_MAP = {
43 'Add another comment':'${_("Add another comment")}',
43 'Add another comment':'${_("Add another comment")}',
44 'Stop following this repository':"${_('Stop following this repository')}",
44 'Stop following this repository':"${_('Stop following this repository')}",
45 'Start following this repository':"${_('Start following this repository')}",
45 'Start following this repository':"${_('Start following this repository')}",
46 'Group':"${_('Group')}",
46 'Group':"${_('Group')}",
47 'members':"${_('members')}",
47 'members':"${_('members')}",
48 'Loading ...':"${_('Loading ...')}",
48 'Loading ...':"${_('Loading ...')}",
49 'Search truncated': "${_('Search truncated')}",
49 'Search truncated': "${_('Search truncated')}",
50 'No matching files': "${_('No matching files')}",
50 'No matching files': "${_('No matching files')}",
51 'Open new pull request': "${_('Open new pull request')}",
51 'Open new pull request': "${_('Open new pull request')}",
52 'Open new pull request for selected changesets': "${_('Open new pull request for selected changesets')}",
52 'Open new pull request for selected changesets': "${_('Open new pull request for selected changesets')}",
53 'Show selected changesets __S -> __E': "${_('Show selected changesets __S -> __E')}",
53 'Show selected changesets __S -> __E': "${_('Show selected changesets __S -> __E')}",
54 'Show selected changeset __S': "${_('Show selected changeset __S')}",
54 'Show selected changeset __S': "${_('Show selected changeset __S')}",
55 'Selection link': "${_('Selection link')}",
55 'Selection link': "${_('Selection link')}",
56 'Collapse diff': "${_('Collapse diff')}",
56 'Collapse diff': "${_('Collapse diff')}",
57 'Expand diff': "${_('Expand diff')}"
57 'Expand diff': "${_('Expand diff')}"
58 };
58 };
59 var _TM = TRANSLATION_MAP;
59 var _TM = TRANSLATION_MAP;
60
60
61 var TOGGLE_FOLLOW_URL = "${h.url('toggle_following')}";
61 var TOGGLE_FOLLOW_URL = "${h.url('toggle_following')}";
62
62
63 var REPO_NAME = "";
64 %if hasattr(c, 'repo_name'):
65 var REPO_NAME = "${c.repo_name}";
66 %endif
63 </script>
67 </script>
64 <script type="text/javascript" src="${h.url('/js/yui.2.9.js', ver=c.rhodecode_version)}"></script>
68 <script type="text/javascript" src="${h.url('/js/yui.2.9.js', ver=c.rhodecode_version)}"></script>
65 <!--[if lt IE 9]>
69 <!--[if lt IE 9]>
66 <script language="javascript" type="text/javascript" src="${h.url('/js/excanvas.min.js')}"></script>
70 <script language="javascript" type="text/javascript" src="${h.url('/js/excanvas.min.js')}"></script>
67 <![endif]-->
71 <![endif]-->
68 <script type="text/javascript" src="${h.url('/js/yui.flot.js', ver=c.rhodecode_version)}"></script>
72 <script type="text/javascript" src="${h.url('/js/yui.flot.js', ver=c.rhodecode_version)}"></script>
69 <script type="text/javascript" src="${h.url('/js/native.history.js', ver=c.rhodecode_version)}"></script>
73 <script type="text/javascript" src="${h.url('/js/native.history.js', ver=c.rhodecode_version)}"></script>
70 <script type="text/javascript" src="${h.url('/js/pyroutes_map.js', ver=c.rhodecode_version)}"></script>
74 <script type="text/javascript" src="${h.url('/js/pyroutes_map.js', ver=c.rhodecode_version)}"></script>
71 <script type="text/javascript" src="${h.url('/js/rhodecode.js', ver=c.rhodecode_version)}"></script>
75 <script type="text/javascript" src="${h.url('/js/rhodecode.js', ver=c.rhodecode_version)}"></script>
72 ## EXTRA FOR JS
76 ## EXTRA FOR JS
73 ${self.js_extra()}
77 ${self.js_extra()}
74 <script type="text/javascript">
78 <script type="text/javascript">
75 (function(window,undefined){
79 (function(window,undefined){
76 // Prepare
80 // Prepare
77 var History = window.History; // Note: We are using a capital H instead of a lower h
81 var History = window.History; // Note: We are using a capital H instead of a lower h
78 if ( !History.enabled ) {
82 if ( !History.enabled ) {
79 // History.js is disabled for this browser.
83 // History.js is disabled for this browser.
80 // This is because we can optionally choose to support HTML4 browsers or not.
84 // This is because we can optionally choose to support HTML4 browsers or not.
81 return false;
85 return false;
82 }
86 }
83 })(window);
87 })(window);
84
88
85 YUE.onDOMReady(function(){
89 YUE.onDOMReady(function(){
86 tooltip_activate();
90 tooltip_activate();
87 show_more_event();
91 show_more_event();
88 show_changeset_tooltip();
92 show_changeset_tooltip();
89 // routes registration
93 // routes registration
90 pyroutes.register('toggle_following', "${h.url('toggle_following')}");
94 pyroutes.register('toggle_following', "${h.url('toggle_following')}");
91 pyroutes.register('changeset_info', "${h.url('changeset_info', repo_name='%(repo_name)s', revision='%(revision)s')}", ['repo_name', 'revision']);
95 pyroutes.register('changeset_info', "${h.url('changeset_info', repo_name='%(repo_name)s', revision='%(revision)s')}", ['repo_name', 'revision']);
92 pyroutes.register('repo_size', "${h.url('repo_size', repo_name='%(repo_name)s')}", ['repo_name']);
96 pyroutes.register('repo_size', "${h.url('repo_size', repo_name='%(repo_name)s')}", ['repo_name']);
97 pyroutes.register('changeset_comment_preview', "${h.url('changeset_comment_preview', repo_name='%(repo_name)s')}", ['repo_name']);
93 })
98 })
94 </script>
99 </script>
95 </%def>
100 </%def>
96 <%def name="js_extra()"></%def>
101 <%def name="js_extra()"></%def>
97 ${self.js()}
102 ${self.js()}
98 <%def name="head_extra()"></%def>
103 <%def name="head_extra()"></%def>
99 ${self.head_extra()}
104 ${self.head_extra()}
100 </head>
105 </head>
101 <body id="body">
106 <body id="body">
102 ## IE hacks
107 ## IE hacks
103 <!--[if IE 7]>
108 <!--[if IE 7]>
104 <script>YUD.addClass(document.body,'ie7')</script>
109 <script>YUD.addClass(document.body,'ie7')</script>
105 <![endif]-->
110 <![endif]-->
106 <!--[if IE 8]>
111 <!--[if IE 8]>
107 <script>YUD.addClass(document.body,'ie8')</script>
112 <script>YUD.addClass(document.body,'ie8')</script>
108 <![endif]-->
113 <![endif]-->
109 <!--[if IE 9]>
114 <!--[if IE 9]>
110 <script>YUD.addClass(document.body,'ie9')</script>
115 <script>YUD.addClass(document.body,'ie9')</script>
111 <![endif]-->
116 <![endif]-->
112
117
113 ${next.body()}
118 ${next.body()}
114 </body>
119 </body>
115 </html>
120 </html>
@@ -1,191 +1,228 b''
1 ## -*- coding: utf-8 -*-
1 ## -*- coding: utf-8 -*-
2 ## usage:
2 ## usage:
3 ## <%namespace name="comment" file="/changeset/changeset_file_comment.html"/>
3 ## <%namespace name="comment" file="/changeset/changeset_file_comment.html"/>
4 ## ${comment.comment_block(co)}
4 ## ${comment.comment_block(co)}
5 ##
5 ##
6 <%def name="comment_block(co)">
6 <%def name="comment_block(co)">
7 <div class="comment" id="comment-${co.comment_id}" line="${co.line_no}">
7 <div class="comment" id="comment-${co.comment_id}" line="${co.line_no}">
8 <div class="comment-wrapp">
8 <div class="comment-wrapp">
9 <div class="meta">
9 <div class="meta">
10 <div style="float:left"> <img src="${h.gravatar_url(co.author.email, 20)}" /> </div>
10 <div style="float:left"> <img src="${h.gravatar_url(co.author.email, 20)}" /> </div>
11 <div class="user">
11 <div class="user">
12 ${co.author.username}
12 ${co.author.username}
13 </div>
13 </div>
14 <div class="date">
14 <div class="date">
15 ${h.age(co.modified_at)} <a class="permalink" href="#comment-${co.comment_id}">&para;</a>
15 ${h.age(co.modified_at)}
16 </div>
16 </div>
17 %if co.status_change:
17 %if co.status_change:
18 <div style="float:left" class="changeset-status-container">
18 <div style="float:left" class="changeset-status-container">
19 <div style="float:left;padding:0px 2px 0px 2px"><span style="font-size: 18px;">&rsaquo;</span></div>
19 <div style="float:left;padding:0px 2px 0px 2px"><span style="font-size: 18px;">&rsaquo;</span></div>
20 <div title="${_('Changeset status')}" class="changeset-status-lbl"> ${co.status_change[0].status_lbl}</div>
20 <div title="${_('Changeset status')}" class="changeset-status-lbl"> ${co.status_change[0].status_lbl}</div>
21 <div class="changeset-status-ico"><img src="${h.url(str('/images/icons/flag_status_%s.png' % co.status_change[0].status))}" /></div>
21 <div class="changeset-status-ico"><img src="${h.url(str('/images/icons/flag_status_%s.png' % co.status_change[0].status))}" /></div>
22 </div>
22 </div>
23 %endif
23 %endif
24
24
25 <div style="float:left;padding:3px 0px 0px 5px">
25 <div style="float:left;padding:4px 0px 0px 5px">
26 <span class="">
26 <span class="">
27 %if co.pull_request:
27 %if co.pull_request:
28 <a href="${h.url('pullrequest_show',repo_name=co.pull_request.other_repo.repo_name,pull_request_id=co.pull_request.pull_request_id)}">
28 <a href="${h.url('pullrequest_show',repo_name=co.pull_request.other_repo.repo_name,pull_request_id=co.pull_request.pull_request_id)}">
29 %if co.status_change:
29 %if co.status_change:
30 ${_('Status change on pull request #%s') % co.pull_request.pull_request_id}
30 ${_('Status change on pull request #%s') % co.pull_request.pull_request_id}
31 %else:
31 %else:
32 ${_('Comment on pull request #%s') % co.pull_request.pull_request_id}
32 ${_('Comment on pull request #%s') % co.pull_request.pull_request_id}
33 %endif
33 %endif
34 </a>
34 </a>
35 %endif
35 %endif
36 </span>
36 </span>
37 </div>
37 </div>
38
38 <a class="permalink" href="#comment-${co.comment_id}">&para;</a>
39 %if h.HasPermissionAny('hg.admin', 'repository.admin')() or co.author.user_id == c.rhodecode_user.user_id:
39 %if h.HasPermissionAny('hg.admin', 'repository.admin')() or co.author.user_id == c.rhodecode_user.user_id:
40 <div class="buttons">
40 <div onClick="deleteComment(${co.comment_id})" class="buttons delete-comment ui-btn small">${_('Delete')}</div>
41 <span onClick="deleteComment(${co.comment_id})" class="delete-comment ui-btn">${_('Delete')}</span>
42 </div>
43 %endif
41 %endif
44 </div>
42 </div>
45 <div class="text">
43 <div class="text">
46 ${h.rst_w_mentions(co.text)|n}
44 ${h.rst_w_mentions(co.text)|n}
47 </div>
45 </div>
48 </div>
46 </div>
49 </div>
47 </div>
50 </%def>
48 </%def>
51
49
52
50
53 <%def name="comment_inline_form()">
51 <%def name="comment_inline_form()">
54 <div id='comment-inline-form-template' style="display:none">
52 <div id='comment-inline-form-template' style="display:none">
55 <div class="comment-inline-form ac">
53 <div class="comment-inline-form ac">
56 %if c.rhodecode_user.username != 'default':
54 %if c.rhodecode_user.username != 'default':
57 <div class="overlay"><div class="overlay-text">${_('Submitting...')}</div></div>
55 <div class="overlay"><div class="overlay-text">${_('Submitting...')}</div></div>
58 ${h.form('#', class_='inline-form')}
56 ${h.form('#', class_='inline-form')}
59 <div class="clearfix">
57 <div id="edit-container_{1}" class="clearfix">
60 <div class="comment-help">${_('Commenting on line {1}.')}
58 <div class="comment-help">${_('Commenting on line {1}.')}
61 ${(_('Comments parsed using %s syntax with %s support.') % (
59 ${(_('Comments parsed using %s syntax with %s support.') % (
62 ('<a href="%s">RST</a>' % h.url('rst_help')),
60 ('<a href="%s">RST</a>' % h.url('rst_help')),
63 ('<span style="color:#003367" class="tooltip" title="%s">@mention</span>' % _('Use @username inside this text to send notification to this RhodeCode user'))
61 ('<span style="color:#003367" class="tooltip" title="%s">@mention</span>' % _('Use @username inside this text to send notification to this RhodeCode user'))
64 )
62 )
65 )|n
63 )|n
66 }
64 }
65 <div id="preview-btn_{1}" class="preview-btn ui-btn small">${_('preview')}</div>
67 </div>
66 </div>
68 <div class="mentions-container" id="mentions_container_{1}"></div>
67 <div class="mentions-container" id="mentions_container_{1}"></div>
69 <textarea id="text_{1}" name="text" class="yui-ac-input"></textarea>
68 <textarea id="text_{1}" name="text" class="comment-block-ta yui-ac-input"></textarea>
69 </div>
70 <div id="preview-container_{1}" class="clearfix" style="display:none">
71 <div class="comment-help">
72 ${_('Comment Preview')}
73 <div id="edit-btn_{1}" class="edit-btn ui-btn small">${_('edit')}</div>
74 </div>
75 <div id="preview-box_{1}" class="preview-box"></div>
70 </div>
76 </div>
71 <div class="comment-button">
77 <div class="comment-button">
72 <input type="hidden" name="f_path" value="{0}">
78 <input type="hidden" name="f_path" value="{0}">
73 <input type="hidden" name="line" value="{1}">
79 <input type="hidden" name="line" value="{1}">
74 ${h.submit('save', _('Comment'), class_='ui-btn save-inline-form')}
80 ${h.submit('save', _('Comment'), class_='ui-btn save-inline-form')}
75 ${h.reset('hide-inline-form', _('Cancel'), class_='ui-btn hide-inline-form')}
81 ${h.reset('hide-inline-form', _('Cancel'), class_='ui-btn hide-inline-form')}
76 </div>
82 </div>
77 ${h.end_form()}
83 ${h.end_form()}
78 %else:
84 %else:
79 ${h.form('')}
85 ${h.form('')}
80 <div class="clearfix">
86 <div class="clearfix">
81 <div class="comment-help">
87 <div class="comment-help">
82 ${_('You need to be logged in to comment.')} <a href="${h.url('login_home',came_from=h.url.current())}">${_('Login now')}</a>
88 ${_('You need to be logged in to comment.')} <a href="${h.url('login_home',came_from=h.url.current())}">${_('Login now')}</a>
83 </div>
89 </div>
84 </div>
90 </div>
85 <div class="comment-button">
91 <div class="comment-button">
86 ${h.reset('hide-inline-form', _('Hide'), class_='ui-btn hide-inline-form')}
92 ${h.reset('hide-inline-form', _('Hide'), class_='ui-btn hide-inline-form')}
87 </div>
93 </div>
88 ${h.end_form()}
94 ${h.end_form()}
89 %endif
95 %endif
90 </div>
96 </div>
91 </div>
97 </div>
92 </%def>
98 </%def>
93
99
94
100
95 ## generates inlines taken from c.comments var
101 ## generates inlines taken from c.comments var
96 <%def name="inlines()">
102 <%def name="inlines()">
97 <div class="comments-number">${ungettext("%d comment", "%d comments", len(c.comments)) % len(c.comments)} ${ungettext("(%d inline)", "(%d inline)", c.inline_cnt) % c.inline_cnt}</div>
103 <div class="comments-number">${ungettext("%d comment", "%d comments", len(c.comments)) % len(c.comments)} ${ungettext("(%d inline)", "(%d inline)", c.inline_cnt) % c.inline_cnt}</div>
98 %for path, lines in c.inline_comments:
104 %for path, lines in c.inline_comments:
99 % for line,comments in lines.iteritems():
105 % for line,comments in lines.iteritems():
100 <div style="display:none" class="inline-comment-placeholder" path="${path}" target_id="${h.safeid(h.safe_unicode(path))}">
106 <div style="display:none" class="inline-comment-placeholder" path="${path}" target_id="${h.safeid(h.safe_unicode(path))}">
101 %for co in comments:
107 %for co in comments:
102 ${comment_block(co)}
108 ${comment_block(co)}
103 %endfor
109 %endfor
104 </div>
110 </div>
105 %endfor
111 %endfor
106 %endfor
112 %endfor
107
113
108 </%def>
114 </%def>
109
115
110 ## generate inline comments and the main ones
116 ## generate inline comments and the main ones
111 <%def name="generate_comments(include_pr=False)">
117 <%def name="generate_comments(include_pr=False)">
112 <div class="comments">
118 <div class="comments">
113 <div id="inline-comments-container">
119 <div id="inline-comments-container">
114 ## generate inlines for this changeset
120 ## generate inlines for this changeset
115 ${inlines()}
121 ${inlines()}
116 </div>
122 </div>
117
123
118 %for co in c.comments:
124 %for co in c.comments:
119 <div id="comment-tr-${co.comment_id}">
125 <div id="comment-tr-${co.comment_id}">
120 ## only render comments that are not from pull request, or from
126 ## only render comments that are not from pull request, or from
121 ## pull request and a status change
127 ## pull request and a status change
122 %if not co.pull_request or (co.pull_request and co.status_change) or include_pr:
128 %if not co.pull_request or (co.pull_request and co.status_change) or include_pr:
123 ${comment_block(co)}
129 ${comment_block(co)}
124 %endif
130 %endif
125 </div>
131 </div>
126 %endfor
132 %endfor
127 </div>
133 </div>
128 </%def>
134 </%def>
129
135
130 ## MAIN COMMENT FORM
136 ## MAIN COMMENT FORM
131 <%def name="comments(post_url, cur_status, close_btn=False, change_status=True)">
137 <%def name="comments(post_url, cur_status, close_btn=False, change_status=True)">
132
138
133 <div class="comments">
139 <div class="comments">
134 %if c.rhodecode_user.username != 'default':
140 %if c.rhodecode_user.username != 'default':
135 <div class="comment-form ac">
141 <div class="comment-form ac">
136 ${h.form(post_url)}
142 ${h.form(post_url)}
137 <div class="clearfix">
143 <div id="edit-container" class="clearfix">
138 <div class="comment-help">
144 <div class="comment-help">
139 ${(_('Comments parsed using %s syntax with %s support.') % (('<a href="%s">RST</a>' % h.url('rst_help')),
145 ${(_('Comments parsed using %s syntax with %s support.') % (('<a href="%s">RST</a>' % h.url('rst_help')),
140 '<span style="color:#003367" class="tooltip" title="%s">@mention</span>' %
146 '<span style="color:#003367" class="tooltip" title="%s">@mention</span>' %
141 _('Use @username inside this text to send notification to this RhodeCode user')))|n}
147 _('Use @username inside this text to send notification to this RhodeCode user')))|n}
142 %if change_status:
148 %if change_status:
143 | <a id="show_changeset_link" onClick="change_status_show();"> ${_('Change status')}</a>
149 | <a id="show_changeset_link" onClick="change_status_show();"> ${_('Change status')}</a>
144 <input id="show_changeset_status_box" type="checkbox" name="change_changeset_status" style="display: none;" />
150 <input id="show_changeset_status_box" type="checkbox" name="change_changeset_status" style="display: none;" />
145 %endif
151 %endif
152 <div id="preview-btn" class="preview-btn ui-btn small">${_('preview')}</div>
146 </div>
153 </div>
147 %if change_status:
154 %if change_status:
148 <div id="status_block_container" class="status-block" style="display:none">
155 <div id="status_block_container" class="status-block" style="display:none">
149 %for status,lbl in c.changeset_statuses:
156 %for status,lbl in c.changeset_statuses:
150 <div class="">
157 <div class="">
151 <img src="${h.url('/images/icons/flag_status_%s.png' % status)}" /> <input ${'checked="checked"' if status == cur_status else ''}" type="radio" class="status_change_radio" name="changeset_status" id="${status}" value="${status}">
158 <img src="${h.url('/images/icons/flag_status_%s.png' % status)}" /> <input ${'checked="checked"' if status == cur_status else ''}" type="radio" class="status_change_radio" name="changeset_status" id="${status}" value="${status}">
152 <label for="${status}">${lbl}</label>
159 <label for="${status}">${lbl}</label>
153 </div>
160 </div>
154 %endfor
161 %endfor
155 </div>
162 </div>
156 %endif
163 %endif
157 <div class="mentions-container" id="mentions_container"></div>
164 <div class="mentions-container" id="mentions_container"></div>
158 ${h.textarea('text')}
165 ${h.textarea('text', class_="comment-block-ta")}
159 </div>
166 </div>
167
168 <div id="preview-container" class="clearfix" style="display:none">
169 <div class="comment-help">
170 ${_('Comment Preview')}
171 <div id="edit-btn" class="edit-btn ui-btn small">${_('edit')}</div>
172 </div>
173 <div id="preview-box" class="preview-box"></div>
174 </div>
175
160 <div class="comment-button">
176 <div class="comment-button">
161 ${h.submit('save', _('Comment'), class_="ui-btn large")}
177 ${h.submit('save', _('Comment'), class_="ui-btn large")}
162 %if close_btn and change_status:
178 %if close_btn and change_status:
163 ${h.submit('save_close', _('Comment and close'), class_='ui-btn blue large %s' % ('hidden' if cur_status in ['not_reviewed','under_review'] else ''))}
179 ${h.submit('save_close', _('Comment and close'), class_='ui-btn blue large %s' % ('hidden' if cur_status in ['not_reviewed','under_review'] else ''))}
164 %endif
180 %endif
165 </div>
181 </div>
166 ${h.end_form()}
182 ${h.end_form()}
167 </div>
183 </div>
168 %endif
184 %endif
169 </div>
185 </div>
170 <script>
186 <script>
171 var change_status_show = function(){
187 var change_status_show = function(){
172 var show = ! YUD.get('show_changeset_status_box').checked;
188 var show = ! YUD.get('show_changeset_status_box').checked;
173 YUD.get('show_changeset_status_box').checked = show;
189 YUD.get('show_changeset_status_box').checked = show;
174 YUD.setStyle('status_block_container', 'display', show?'':'none');
190 YUD.setStyle('status_block_container', 'display', show?'':'none');
175 };
191 };
176
192
177 YUE.onDOMReady(function () {
193 YUE.onDOMReady(function () {
178 MentionsAutoComplete('text', 'mentions_container', _USERS_AC_DATA, _GROUPS_AC_DATA);
194 MentionsAutoComplete('text', 'mentions_container', _USERS_AC_DATA, _GROUPS_AC_DATA);
179
195
180 YUE.on(YUQ('.status_change_radio'), 'change',function(e){
196 YUE.on(YUQ('.status_change_radio'), 'change',function(e){
181 var val = e.currentTarget.value;
197 var val = e.currentTarget.value;
182 if (val == 'approved' || val == 'rejected') {
198 if (val == 'approved' || val == 'rejected') {
183 YUD.removeClass('save_close', 'hidden');
199 YUD.removeClass('save_close', 'hidden');
184 }else{
200 }else{
185 YUD.addClass('save_close', 'hidden');
201 YUD.addClass('save_close', 'hidden');
186 }
202 }
187 })
203 })
204 YUE.on('preview-btn', 'click', function(e){
205 var _text = YUD.get('text').value;
206 if(!_text){
207 return
208 }
209 var post_data = {'text': _text};
210 YUD.addClass('preview-box', 'unloaded');
211 YUD.get('preview-box').innerHTML = _TM['Loading ...'];
212 YUD.setStyle('edit-container', 'display', 'none');
213 YUD.setStyle('preview-container', 'display', '');
214
215 var url = pyroutes.url('changeset_comment_preview', {'repo_name': '${c.repo_name}'});
216 ajaxPOST(url,post_data,function(o){
217 YUD.get('preview-box').innerHTML = o.responseText;
218 YUD.removeClass('preview-box', 'unloaded');
219 })
220 })
221 YUE.on('edit-btn', 'click', function(e){
222 YUD.setStyle('edit-container', 'display', '');
223 YUD.setStyle('preview-container', 'display', 'none');
224 })
188
225
189 });
226 });
190 </script>
227 </script>
191 </%def>
228 </%def>
General Comments 0
You need to be logged in to leave comments. Login now