##// END OF EJS Templates
Added gravatars into permissions view and permissions autocomplete
marcink -
r2142:a21eab6f beta
parent child Browse files
Show More
@@ -1,597 +1,598 b''
1 .. _changelog:
1 .. _changelog:
2
2
3 =========
3 =========
4 Changelog
4 Changelog
5 =========
5 =========
6
6
7
7
8 1.3.4 (**2012-XX-XX**)
8 1.3.4 (**2012-XX-XX**)
9 ----------------------
9 ----------------------
10
10
11 :status: in-progress
11 :status: in-progress
12 :branch: beta
12 :branch: beta
13
13
14 news
14 news
15 ++++
15 ++++
16
16
17 - Whoosh logging is now controlled by the .ini files logging setup
17 - Whoosh logging is now controlled by the .ini files logging setup
18 - added clone-url into edit form on /settings page
18 - added clone-url into edit form on /settings page
19 - added help text into repo add/edit forms
19 - added help text into repo add/edit forms
20 - created rcextensions module with additional mappings (ref #322) and
20 - created rcextensions module with additional mappings (ref #322) and
21 post push/pull/create repo hooks callbacks
21 post push/pull/create repo hooks callbacks
22 - implemented #377 Users view for his own permissions on account page
22 - implemented #377 Users view for his own permissions on account page
23 - #399 added inheritance of permissions for users group on repos groups
23 - #399 added inheritance of permissions for users group on repos groups
24 - #401 repository group is automatically pre-selected when adding repos
24 - #401 repository group is automatically pre-selected when adding repos
25 inside a repository group
25 inside a repository group
26 - added alternative HTTP 403 response when client failed to authenticate. Helps
26 - added alternative HTTP 403 response when client failed to authenticate. Helps
27 solving issues with Mercurial and LDAP
27 solving issues with Mercurial and LDAP
28 - #402 removed group prefix from repository name when listing repositories
28 - #402 removed group prefix from repository name when listing repositories
29 inside a group
29 inside a group
30 - added gravatars into permission view and permissions autocomplete
30
31
31 fixes
32 fixes
32 +++++
33 +++++
33
34
34 - fixed #390 cache invalidation problems on repos inside group
35 - fixed #390 cache invalidation problems on repos inside group
35 - fixed #385 clone by ID url was loosing proxy prefix in URL
36 - fixed #385 clone by ID url was loosing proxy prefix in URL
36 - fixed some unicode problems with waitress
37 - fixed some unicode problems with waitress
37 - fixed issue with escaping < and > in changeset commits
38 - fixed issue with escaping < and > in changeset commits
38 - fixed error occurring during recursive group creation in API
39 - fixed error occurring during recursive group creation in API
39 create_repo function
40 create_repo function
40 - fixed #393 py2.5 fixes for routes url generator
41 - fixed #393 py2.5 fixes for routes url generator
41 - fixed #397 Private repository groups shows up before login
42 - fixed #397 Private repository groups shows up before login
42 - fixed #396 fixed problems with revoking users in nested groups
43 - fixed #396 fixed problems with revoking users in nested groups
43
44
44 1.3.3 (**2012-03-02**)
45 1.3.3 (**2012-03-02**)
45 ----------------------
46 ----------------------
46
47
47 news
48 news
48 ++++
49 ++++
49
50
50
51
51 fixes
52 fixes
52 +++++
53 +++++
53
54
54 - fixed some python2.5 compatibility issues
55 - fixed some python2.5 compatibility issues
55 - fixed issues with removed repos was accidentally added as groups, after
56 - fixed issues with removed repos was accidentally added as groups, after
56 full rescan of paths
57 full rescan of paths
57 - fixes #376 Cannot edit user (using container auth)
58 - fixes #376 Cannot edit user (using container auth)
58 - fixes #378 Invalid image urls on changeset screen with proxy-prefix
59 - fixes #378 Invalid image urls on changeset screen with proxy-prefix
59 configuration
60 configuration
60 - fixed initial sorting of repos inside repo group
61 - fixed initial sorting of repos inside repo group
61 - fixes issue when user tried to resubmit same permission into user/user_groups
62 - fixes issue when user tried to resubmit same permission into user/user_groups
62 - bumped beaker version that fixes #375 leap error bug
63 - bumped beaker version that fixes #375 leap error bug
63 - fixed raw_changeset for git. It was generated with hg patch headers
64 - fixed raw_changeset for git. It was generated with hg patch headers
64 - fixed vcs issue with last_changeset for filenodes
65 - fixed vcs issue with last_changeset for filenodes
65 - fixed missing commit after hook delete
66 - fixed missing commit after hook delete
66 - fixed #372 issues with git operation detection that caused a security issue
67 - fixed #372 issues with git operation detection that caused a security issue
67 for git repos
68 for git repos
68
69
69 1.3.2 (**2012-02-28**)
70 1.3.2 (**2012-02-28**)
70 ----------------------
71 ----------------------
71
72
72 news
73 news
73 ++++
74 ++++
74
75
75
76
76 fixes
77 fixes
77 +++++
78 +++++
78
79
79 - fixed git protocol issues with repos-groups
80 - fixed git protocol issues with repos-groups
80 - fixed git remote repos validator that prevented from cloning remote git repos
81 - fixed git remote repos validator that prevented from cloning remote git repos
81 - fixes #370 ending slashes fixes for repo and groups
82 - fixes #370 ending slashes fixes for repo and groups
82 - fixes #368 improved git-protocol detection to handle other clients
83 - fixes #368 improved git-protocol detection to handle other clients
83 - fixes #366 When Setting Repository Group To Blank Repo Group Wont Be
84 - fixes #366 When Setting Repository Group To Blank Repo Group Wont Be
84 Moved To Root
85 Moved To Root
85 - fixes #371 fixed issues with beaker/sqlalchemy and non-ascii cache keys
86 - fixes #371 fixed issues with beaker/sqlalchemy and non-ascii cache keys
86 - fixed #373 missing cascade drop on user_group_to_perm table
87 - fixed #373 missing cascade drop on user_group_to_perm table
87
88
88 1.3.1 (**2012-02-27**)
89 1.3.1 (**2012-02-27**)
89 ----------------------
90 ----------------------
90
91
91 news
92 news
92 ++++
93 ++++
93
94
94
95
95 fixes
96 fixes
96 +++++
97 +++++
97
98
98 - redirection loop occurs when remember-me wasn't checked during login
99 - redirection loop occurs when remember-me wasn't checked during login
99 - fixes issues with git blob history generation
100 - fixes issues with git blob history generation
100 - don't fetch branch for git in file history dropdown. Causes unneeded slowness
101 - don't fetch branch for git in file history dropdown. Causes unneeded slowness
101
102
102 1.3.0 (**2012-02-26**)
103 1.3.0 (**2012-02-26**)
103 ----------------------
104 ----------------------
104
105
105 news
106 news
106 ++++
107 ++++
107
108
108 - code review, inspired by github code-comments
109 - code review, inspired by github code-comments
109 - #215 rst and markdown README files support
110 - #215 rst and markdown README files support
110 - #252 Container-based and proxy pass-through authentication support
111 - #252 Container-based and proxy pass-through authentication support
111 - #44 branch browser. Filtering of changelog by branches
112 - #44 branch browser. Filtering of changelog by branches
112 - mercurial bookmarks support
113 - mercurial bookmarks support
113 - new hover top menu, optimized to add maximum size for important views
114 - new hover top menu, optimized to add maximum size for important views
114 - configurable clone url template with possibility to specify protocol like
115 - configurable clone url template with possibility to specify protocol like
115 ssh:// or http:// and also manually alter other parts of clone_url.
116 ssh:// or http:// and also manually alter other parts of clone_url.
116 - enabled largefiles extension by default
117 - enabled largefiles extension by default
117 - optimized summary file pages and saved a lot of unused space in them
118 - optimized summary file pages and saved a lot of unused space in them
118 - #239 option to manually mark repository as fork
119 - #239 option to manually mark repository as fork
119 - #320 mapping of commit authors to RhodeCode users
120 - #320 mapping of commit authors to RhodeCode users
120 - #304 hashes are displayed using monospace font
121 - #304 hashes are displayed using monospace font
121 - diff configuration, toggle white lines and context lines
122 - diff configuration, toggle white lines and context lines
122 - #307 configurable diffs, whitespace toggle, increasing context lines
123 - #307 configurable diffs, whitespace toggle, increasing context lines
123 - sorting on branches, tags and bookmarks using YUI datatable
124 - sorting on branches, tags and bookmarks using YUI datatable
124 - improved file filter on files page
125 - improved file filter on files page
125 - implements #330 api method for listing nodes ar particular revision
126 - implements #330 api method for listing nodes ar particular revision
126 - #73 added linking issues in commit messages to chosen issue tracker url
127 - #73 added linking issues in commit messages to chosen issue tracker url
127 based on user defined regular expression
128 based on user defined regular expression
128 - added linking of changesets in commit messages
129 - added linking of changesets in commit messages
129 - new compact changelog with expandable commit messages
130 - new compact changelog with expandable commit messages
130 - firstname and lastname are optional in user creation
131 - firstname and lastname are optional in user creation
131 - #348 added post-create repository hook
132 - #348 added post-create repository hook
132 - #212 global encoding settings is now configurable from .ini files
133 - #212 global encoding settings is now configurable from .ini files
133 - #227 added repository groups permissions
134 - #227 added repository groups permissions
134 - markdown gets codehilite extensions
135 - markdown gets codehilite extensions
135 - new API methods, delete_repositories, grante/revoke permissions for groups
136 - new API methods, delete_repositories, grante/revoke permissions for groups
136 and repos
137 and repos
137
138
138
139
139 fixes
140 fixes
140 +++++
141 +++++
141
142
142 - rewrote dbsession management for atomic operations, and better error handling
143 - rewrote dbsession management for atomic operations, and better error handling
143 - fixed sorting of repo tables
144 - fixed sorting of repo tables
144 - #326 escape of special html entities in diffs
145 - #326 escape of special html entities in diffs
145 - normalized user_name => username in api attributes
146 - normalized user_name => username in api attributes
146 - fixes #298 ldap created users with mixed case emails created conflicts
147 - fixes #298 ldap created users with mixed case emails created conflicts
147 on saving a form
148 on saving a form
148 - fixes issue when owner of a repo couldn't revoke permissions for users
149 - fixes issue when owner of a repo couldn't revoke permissions for users
149 and groups
150 and groups
150 - fixes #271 rare JSON serialization problem with statistics
151 - fixes #271 rare JSON serialization problem with statistics
151 - fixes #337 missing validation check for conflicting names of a group with a
152 - fixes #337 missing validation check for conflicting names of a group with a
152 repositories group
153 repositories group
153 - #340 fixed session problem for mysql and celery tasks
154 - #340 fixed session problem for mysql and celery tasks
154 - fixed #331 RhodeCode mangles repository names if the a repository group
155 - fixed #331 RhodeCode mangles repository names if the a repository group
155 contains the "full path" to the repositories
156 contains the "full path" to the repositories
156 - #355 RhodeCode doesn't store encrypted LDAP passwords
157 - #355 RhodeCode doesn't store encrypted LDAP passwords
157
158
158 1.2.5 (**2012-01-28**)
159 1.2.5 (**2012-01-28**)
159 ----------------------
160 ----------------------
160
161
161 news
162 news
162 ++++
163 ++++
163
164
164 fixes
165 fixes
165 +++++
166 +++++
166
167
167 - #340 Celery complains about MySQL server gone away, added session cleanup
168 - #340 Celery complains about MySQL server gone away, added session cleanup
168 for celery tasks
169 for celery tasks
169 - #341 "scanning for repositories in None" log message during Rescan was missing
170 - #341 "scanning for repositories in None" log message during Rescan was missing
170 a parameter
171 a parameter
171 - fixed creating archives with subrepos. Some hooks were triggered during that
172 - fixed creating archives with subrepos. Some hooks were triggered during that
172 operation leading to crash.
173 operation leading to crash.
173 - fixed missing email in account page.
174 - fixed missing email in account page.
174 - Reverted Mercurial to 2.0.1 for windows due to bug in Mercurial that makes
175 - Reverted Mercurial to 2.0.1 for windows due to bug in Mercurial that makes
175 forking on windows impossible
176 forking on windows impossible
176
177
177 1.2.4 (**2012-01-19**)
178 1.2.4 (**2012-01-19**)
178 ----------------------
179 ----------------------
179
180
180 news
181 news
181 ++++
182 ++++
182
183
183 - RhodeCode is bundled with mercurial series 2.0.X by default, with
184 - RhodeCode is bundled with mercurial series 2.0.X by default, with
184 full support to largefiles extension. Enabled by default in new installations
185 full support to largefiles extension. Enabled by default in new installations
185 - #329 Ability to Add/Remove Groups to/from a Repository via AP
186 - #329 Ability to Add/Remove Groups to/from a Repository via AP
186 - added requires.txt file with requirements
187 - added requires.txt file with requirements
187
188
188 fixes
189 fixes
189 +++++
190 +++++
190
191
191 - fixes db session issues with celery when emailing admins
192 - fixes db session issues with celery when emailing admins
192 - #331 RhodeCode mangles repository names if the a repository group
193 - #331 RhodeCode mangles repository names if the a repository group
193 contains the "full path" to the repositories
194 contains the "full path" to the repositories
194 - #298 Conflicting e-mail addresses for LDAP and RhodeCode users
195 - #298 Conflicting e-mail addresses for LDAP and RhodeCode users
195 - DB session cleanup after hg protocol operations, fixes issues with
196 - DB session cleanup after hg protocol operations, fixes issues with
196 `mysql has gone away` errors
197 `mysql has gone away` errors
197 - #333 doc fixes for get_repo api function
198 - #333 doc fixes for get_repo api function
198 - #271 rare JSON serialization problem with statistics enabled
199 - #271 rare JSON serialization problem with statistics enabled
199 - #337 Fixes issues with validation of repository name conflicting with
200 - #337 Fixes issues with validation of repository name conflicting with
200 a group name. A proper message is now displayed.
201 a group name. A proper message is now displayed.
201 - #292 made ldap_dn in user edit readonly, to get rid of confusion that field
202 - #292 made ldap_dn in user edit readonly, to get rid of confusion that field
202 doesn't work
203 doesn't work
203 - #316 fixes issues with web description in hgrc files
204 - #316 fixes issues with web description in hgrc files
204
205
205 1.2.3 (**2011-11-02**)
206 1.2.3 (**2011-11-02**)
206 ----------------------
207 ----------------------
207
208
208 news
209 news
209 ++++
210 ++++
210
211
211 - added option to manage repos group for non admin users
212 - added option to manage repos group for non admin users
212 - added following API methods for get_users, create_user, get_users_groups,
213 - added following API methods for get_users, create_user, get_users_groups,
213 get_users_group, create_users_group, add_user_to_users_groups, get_repos,
214 get_users_group, create_users_group, add_user_to_users_groups, get_repos,
214 get_repo, create_repo, add_user_to_repo
215 get_repo, create_repo, add_user_to_repo
215 - implements #237 added password confirmation for my account
216 - implements #237 added password confirmation for my account
216 and admin edit user.
217 and admin edit user.
217 - implements #291 email notification for global events are now sent to all
218 - implements #291 email notification for global events are now sent to all
218 administrator users, and global config email.
219 administrator users, and global config email.
219
220
220 fixes
221 fixes
221 +++++
222 +++++
222
223
223 - added option for passing auth method for smtp mailer
224 - added option for passing auth method for smtp mailer
224 - #276 issue with adding a single user with id>10 to usergroups
225 - #276 issue with adding a single user with id>10 to usergroups
225 - #277 fixes windows LDAP settings in which missing values breaks the ldap auth
226 - #277 fixes windows LDAP settings in which missing values breaks the ldap auth
226 - #288 fixes managing of repos in a group for non admin user
227 - #288 fixes managing of repos in a group for non admin user
227
228
228 1.2.2 (**2011-10-17**)
229 1.2.2 (**2011-10-17**)
229 ----------------------
230 ----------------------
230
231
231 news
232 news
232 ++++
233 ++++
233
234
234 - #226 repo groups are available by path instead of numerical id
235 - #226 repo groups are available by path instead of numerical id
235
236
236 fixes
237 fixes
237 +++++
238 +++++
238
239
239 - #259 Groups with the same name but with different parent group
240 - #259 Groups with the same name but with different parent group
240 - #260 Put repo in group, then move group to another group -> repo becomes unavailable
241 - #260 Put repo in group, then move group to another group -> repo becomes unavailable
241 - #258 RhodeCode 1.2 assumes egg folder is writable (lockfiles problems)
242 - #258 RhodeCode 1.2 assumes egg folder is writable (lockfiles problems)
242 - #265 ldap save fails sometimes on converting attributes to booleans,
243 - #265 ldap save fails sometimes on converting attributes to booleans,
243 added getter and setter into model that will prevent from this on db model level
244 added getter and setter into model that will prevent from this on db model level
244 - fixed problems with timestamps issues #251 and #213
245 - fixed problems with timestamps issues #251 and #213
245 - fixes #266 RhodeCode allows to create repo with the same name and in
246 - fixes #266 RhodeCode allows to create repo with the same name and in
246 the same parent as group
247 the same parent as group
247 - fixes #245 Rescan of the repositories on Windows
248 - fixes #245 Rescan of the repositories on Windows
248 - fixes #248 cannot edit repos inside a group on windows
249 - fixes #248 cannot edit repos inside a group on windows
249 - fixes #219 forking problems on windows
250 - fixes #219 forking problems on windows
250
251
251 1.2.1 (**2011-10-08**)
252 1.2.1 (**2011-10-08**)
252 ----------------------
253 ----------------------
253
254
254 news
255 news
255 ++++
256 ++++
256
257
257
258
258 fixes
259 fixes
259 +++++
260 +++++
260
261
261 - fixed problems with basic auth and push problems
262 - fixed problems with basic auth and push problems
262 - gui fixes
263 - gui fixes
263 - fixed logger
264 - fixed logger
264
265
265 1.2.0 (**2011-10-07**)
266 1.2.0 (**2011-10-07**)
266 ----------------------
267 ----------------------
267
268
268 news
269 news
269 ++++
270 ++++
270
271
271 - implemented #47 repository groups
272 - implemented #47 repository groups
272 - implemented #89 Can setup google analytics code from settings menu
273 - implemented #89 Can setup google analytics code from settings menu
273 - implemented #91 added nicer looking archive urls with more download options
274 - implemented #91 added nicer looking archive urls with more download options
274 like tags, branches
275 like tags, branches
275 - implemented #44 into file browsing, and added follow branch option
276 - implemented #44 into file browsing, and added follow branch option
276 - implemented #84 downloads can be enabled/disabled for each repository
277 - implemented #84 downloads can be enabled/disabled for each repository
277 - anonymous repository can be cloned without having to pass default:default
278 - anonymous repository can be cloned without having to pass default:default
278 into clone url
279 into clone url
279 - fixed #90 whoosh indexer can index chooses repositories passed in command
280 - fixed #90 whoosh indexer can index chooses repositories passed in command
280 line
281 line
281 - extended journal with day aggregates and paging
282 - extended journal with day aggregates and paging
282 - implemented #107 source code lines highlight ranges
283 - implemented #107 source code lines highlight ranges
283 - implemented #93 customizable changelog on combined revision ranges -
284 - implemented #93 customizable changelog on combined revision ranges -
284 equivalent of githubs compare view
285 equivalent of githubs compare view
285 - implemented #108 extended and more powerful LDAP configuration
286 - implemented #108 extended and more powerful LDAP configuration
286 - implemented #56 users groups
287 - implemented #56 users groups
287 - major code rewrites optimized codes for speed and memory usage
288 - major code rewrites optimized codes for speed and memory usage
288 - raw and diff downloads are now in git format
289 - raw and diff downloads are now in git format
289 - setup command checks for write access to given path
290 - setup command checks for write access to given path
290 - fixed many issues with international characters and unicode. It uses utf8
291 - fixed many issues with international characters and unicode. It uses utf8
291 decode with replace to provide less errors even with non utf8 encoded strings
292 decode with replace to provide less errors even with non utf8 encoded strings
292 - #125 added API KEY access to feeds
293 - #125 added API KEY access to feeds
293 - #109 Repository can be created from external Mercurial link (aka. remote
294 - #109 Repository can be created from external Mercurial link (aka. remote
294 repository, and manually updated (via pull) from admin panel
295 repository, and manually updated (via pull) from admin panel
295 - beta git support - push/pull server + basic view for git repos
296 - beta git support - push/pull server + basic view for git repos
296 - added followers page and forks page
297 - added followers page and forks page
297 - server side file creation (with binary file upload interface)
298 - server side file creation (with binary file upload interface)
298 and edition with commits powered by codemirror
299 and edition with commits powered by codemirror
299 - #111 file browser file finder, quick lookup files on whole file tree
300 - #111 file browser file finder, quick lookup files on whole file tree
300 - added quick login sliding menu into main page
301 - added quick login sliding menu into main page
301 - changelog uses lazy loading of affected files details, in some scenarios
302 - changelog uses lazy loading of affected files details, in some scenarios
302 this can improve speed of changelog page dramatically especially for
303 this can improve speed of changelog page dramatically especially for
303 larger repositories.
304 larger repositories.
304 - implements #214 added support for downloading subrepos in download menu.
305 - implements #214 added support for downloading subrepos in download menu.
305 - Added basic API for direct operations on rhodecode via JSON
306 - Added basic API for direct operations on rhodecode via JSON
306 - Implemented advanced hook management
307 - Implemented advanced hook management
307
308
308 fixes
309 fixes
309 +++++
310 +++++
310
311
311 - fixed file browser bug, when switching into given form revision the url was
312 - fixed file browser bug, when switching into given form revision the url was
312 not changing
313 not changing
313 - fixed propagation to error controller on simplehg and simplegit middlewares
314 - fixed propagation to error controller on simplehg and simplegit middlewares
314 - fixed error when trying to make a download on empty repository
315 - fixed error when trying to make a download on empty repository
315 - fixed problem with '[' chars in commit messages in journal
316 - fixed problem with '[' chars in commit messages in journal
316 - fixed #99 Unicode errors, on file node paths with non utf-8 characters
317 - fixed #99 Unicode errors, on file node paths with non utf-8 characters
317 - journal fork fixes
318 - journal fork fixes
318 - removed issue with space inside renamed repository after deletion
319 - removed issue with space inside renamed repository after deletion
319 - fixed strange issue on formencode imports
320 - fixed strange issue on formencode imports
320 - fixed #126 Deleting repository on Windows, rename used incompatible chars.
321 - fixed #126 Deleting repository on Windows, rename used incompatible chars.
321 - #150 fixes for errors on repositories mapped in db but corrupted in
322 - #150 fixes for errors on repositories mapped in db but corrupted in
322 filesystem
323 filesystem
323 - fixed problem with ascendant characters in realm #181
324 - fixed problem with ascendant characters in realm #181
324 - fixed problem with sqlite file based database connection pool
325 - fixed problem with sqlite file based database connection pool
325 - whoosh indexer and code stats share the same dynamic extensions map
326 - whoosh indexer and code stats share the same dynamic extensions map
326 - fixes #188 - relationship delete of repo_to_perm entry on user removal
327 - fixes #188 - relationship delete of repo_to_perm entry on user removal
327 - fixes issue #189 Trending source files shows "show more" when no more exist
328 - fixes issue #189 Trending source files shows "show more" when no more exist
328 - fixes issue #197 Relative paths for pidlocks
329 - fixes issue #197 Relative paths for pidlocks
329 - fixes issue #198 password will require only 3 chars now for login form
330 - fixes issue #198 password will require only 3 chars now for login form
330 - fixes issue #199 wrong redirection for non admin users after creating a repository
331 - fixes issue #199 wrong redirection for non admin users after creating a repository
331 - fixes issues #202, bad db constraint made impossible to attach same group
332 - fixes issues #202, bad db constraint made impossible to attach same group
332 more than one time. Affects only mysql/postgres
333 more than one time. Affects only mysql/postgres
333 - fixes #218 os.kill patch for windows was missing sig param
334 - fixes #218 os.kill patch for windows was missing sig param
334 - improved rendering of dag (they are not trimmed anymore when number of
335 - improved rendering of dag (they are not trimmed anymore when number of
335 heads exceeds 5)
336 heads exceeds 5)
336
337
337 1.1.8 (**2011-04-12**)
338 1.1.8 (**2011-04-12**)
338 ----------------------
339 ----------------------
339
340
340 news
341 news
341 ++++
342 ++++
342
343
343 - improved windows support
344 - improved windows support
344
345
345 fixes
346 fixes
346 +++++
347 +++++
347
348
348 - fixed #140 freeze of python dateutil library, since new version is python2.x
349 - fixed #140 freeze of python dateutil library, since new version is python2.x
349 incompatible
350 incompatible
350 - setup-app will check for write permission in given path
351 - setup-app will check for write permission in given path
351 - cleaned up license info issue #149
352 - cleaned up license info issue #149
352 - fixes for issues #137,#116 and problems with unicode and accented characters.
353 - fixes for issues #137,#116 and problems with unicode and accented characters.
353 - fixes crashes on gravatar, when passed in email as unicode
354 - fixes crashes on gravatar, when passed in email as unicode
354 - fixed tooltip flickering problems
355 - fixed tooltip flickering problems
355 - fixed came_from redirection on windows
356 - fixed came_from redirection on windows
356 - fixed logging modules, and sql formatters
357 - fixed logging modules, and sql formatters
357 - windows fixes for os.kill issue #133
358 - windows fixes for os.kill issue #133
358 - fixes path splitting for windows issues #148
359 - fixes path splitting for windows issues #148
359 - fixed issue #143 wrong import on migration to 1.1.X
360 - fixed issue #143 wrong import on migration to 1.1.X
360 - fixed problems with displaying binary files, thanks to Thomas Waldmann
361 - fixed problems with displaying binary files, thanks to Thomas Waldmann
361 - removed name from archive files since it's breaking ui for long repo names
362 - removed name from archive files since it's breaking ui for long repo names
362 - fixed issue with archive headers sent to browser, thanks to Thomas Waldmann
363 - fixed issue with archive headers sent to browser, thanks to Thomas Waldmann
363 - fixed compatibility for 1024px displays, and larger dpi settings, thanks to
364 - fixed compatibility for 1024px displays, and larger dpi settings, thanks to
364 Thomas Waldmann
365 Thomas Waldmann
365 - fixed issue #166 summary pager was skipping 10 revisions on second page
366 - fixed issue #166 summary pager was skipping 10 revisions on second page
366
367
367
368
368 1.1.7 (**2011-03-23**)
369 1.1.7 (**2011-03-23**)
369 ----------------------
370 ----------------------
370
371
371 news
372 news
372 ++++
373 ++++
373
374
374 fixes
375 fixes
375 +++++
376 +++++
376
377
377 - fixed (again) #136 installation support for FreeBSD
378 - fixed (again) #136 installation support for FreeBSD
378
379
379
380
380 1.1.6 (**2011-03-21**)
381 1.1.6 (**2011-03-21**)
381 ----------------------
382 ----------------------
382
383
383 news
384 news
384 ++++
385 ++++
385
386
386 fixes
387 fixes
387 +++++
388 +++++
388
389
389 - fixed #136 installation support for FreeBSD
390 - fixed #136 installation support for FreeBSD
390 - RhodeCode will check for python version during installation
391 - RhodeCode will check for python version during installation
391
392
392 1.1.5 (**2011-03-17**)
393 1.1.5 (**2011-03-17**)
393 ----------------------
394 ----------------------
394
395
395 news
396 news
396 ++++
397 ++++
397
398
398 - basic windows support, by exchanging pybcrypt into sha256 for windows only
399 - basic windows support, by exchanging pybcrypt into sha256 for windows only
399 highly inspired by idea of mantis406
400 highly inspired by idea of mantis406
400
401
401 fixes
402 fixes
402 +++++
403 +++++
403
404
404 - fixed sorting by author in main page
405 - fixed sorting by author in main page
405 - fixed crashes with diffs on binary files
406 - fixed crashes with diffs on binary files
406 - fixed #131 problem with boolean values for LDAP
407 - fixed #131 problem with boolean values for LDAP
407 - fixed #122 mysql problems thanks to striker69
408 - fixed #122 mysql problems thanks to striker69
408 - fixed problem with errors on calling raw/raw_files/annotate functions
409 - fixed problem with errors on calling raw/raw_files/annotate functions
409 with unknown revisions
410 with unknown revisions
410 - fixed returned rawfiles attachment names with international character
411 - fixed returned rawfiles attachment names with international character
411 - cleaned out docs, big thanks to Jason Harris
412 - cleaned out docs, big thanks to Jason Harris
412
413
413 1.1.4 (**2011-02-19**)
414 1.1.4 (**2011-02-19**)
414 ----------------------
415 ----------------------
415
416
416 news
417 news
417 ++++
418 ++++
418
419
419 fixes
420 fixes
420 +++++
421 +++++
421
422
422 - fixed formencode import problem on settings page, that caused server crash
423 - fixed formencode import problem on settings page, that caused server crash
423 when that page was accessed as first after server start
424 when that page was accessed as first after server start
424 - journal fixes
425 - journal fixes
425 - fixed option to access repository just by entering http://server/<repo_name>
426 - fixed option to access repository just by entering http://server/<repo_name>
426
427
427 1.1.3 (**2011-02-16**)
428 1.1.3 (**2011-02-16**)
428 ----------------------
429 ----------------------
429
430
430 news
431 news
431 ++++
432 ++++
432
433
433 - implemented #102 allowing the '.' character in username
434 - implemented #102 allowing the '.' character in username
434 - added option to access repository just by entering http://server/<repo_name>
435 - added option to access repository just by entering http://server/<repo_name>
435 - celery task ignores result for better performance
436 - celery task ignores result for better performance
436
437
437 fixes
438 fixes
438 +++++
439 +++++
439
440
440 - fixed ehlo command and non auth mail servers on smtp_lib. Thanks to
441 - fixed ehlo command and non auth mail servers on smtp_lib. Thanks to
441 apollo13 and Johan Walles
442 apollo13 and Johan Walles
442 - small fixes in journal
443 - small fixes in journal
443 - fixed problems with getting setting for celery from .ini files
444 - fixed problems with getting setting for celery from .ini files
444 - registration, password reset and login boxes share the same title as main
445 - registration, password reset and login boxes share the same title as main
445 application now
446 application now
446 - fixed #113: to high permissions to fork repository
447 - fixed #113: to high permissions to fork repository
447 - fixed problem with '[' chars in commit messages in journal
448 - fixed problem with '[' chars in commit messages in journal
448 - removed issue with space inside renamed repository after deletion
449 - removed issue with space inside renamed repository after deletion
449 - db transaction fixes when filesystem repository creation failed
450 - db transaction fixes when filesystem repository creation failed
450 - fixed #106 relation issues on databases different than sqlite
451 - fixed #106 relation issues on databases different than sqlite
451 - fixed static files paths links to use of url() method
452 - fixed static files paths links to use of url() method
452
453
453 1.1.2 (**2011-01-12**)
454 1.1.2 (**2011-01-12**)
454 ----------------------
455 ----------------------
455
456
456 news
457 news
457 ++++
458 ++++
458
459
459
460
460 fixes
461 fixes
461 +++++
462 +++++
462
463
463 - fixes #98 protection against float division of percentage stats
464 - fixes #98 protection against float division of percentage stats
464 - fixed graph bug
465 - fixed graph bug
465 - forced webhelpers version since it was making troubles during installation
466 - forced webhelpers version since it was making troubles during installation
466
467
467 1.1.1 (**2011-01-06**)
468 1.1.1 (**2011-01-06**)
468 ----------------------
469 ----------------------
469
470
470 news
471 news
471 ++++
472 ++++
472
473
473 - added force https option into ini files for easier https usage (no need to
474 - added force https option into ini files for easier https usage (no need to
474 set server headers with this options)
475 set server headers with this options)
475 - small css updates
476 - small css updates
476
477
477 fixes
478 fixes
478 +++++
479 +++++
479
480
480 - fixed #96 redirect loop on files view on repositories without changesets
481 - fixed #96 redirect loop on files view on repositories without changesets
481 - fixed #97 unicode string passed into server header in special cases (mod_wsgi)
482 - fixed #97 unicode string passed into server header in special cases (mod_wsgi)
482 and server crashed with errors
483 and server crashed with errors
483 - fixed large tooltips problems on main page
484 - fixed large tooltips problems on main page
484 - fixed #92 whoosh indexer is more error proof
485 - fixed #92 whoosh indexer is more error proof
485
486
486 1.1.0 (**2010-12-18**)
487 1.1.0 (**2010-12-18**)
487 ----------------------
488 ----------------------
488
489
489 news
490 news
490 ++++
491 ++++
491
492
492 - rewrite of internals for vcs >=0.1.10
493 - rewrite of internals for vcs >=0.1.10
493 - uses mercurial 1.7 with dotencode disabled for maintaining compatibility
494 - uses mercurial 1.7 with dotencode disabled for maintaining compatibility
494 with older clients
495 with older clients
495 - anonymous access, authentication via ldap
496 - anonymous access, authentication via ldap
496 - performance upgrade for cached repos list - each repository has its own
497 - performance upgrade for cached repos list - each repository has its own
497 cache that's invalidated when needed.
498 cache that's invalidated when needed.
498 - performance upgrades on repositories with large amount of commits (20K+)
499 - performance upgrades on repositories with large amount of commits (20K+)
499 - main page quick filter for filtering repositories
500 - main page quick filter for filtering repositories
500 - user dashboards with ability to follow chosen repositories actions
501 - user dashboards with ability to follow chosen repositories actions
501 - sends email to admin on new user registration
502 - sends email to admin on new user registration
502 - added cache/statistics reset options into repository settings
503 - added cache/statistics reset options into repository settings
503 - more detailed action logger (based on hooks) with pushed changesets lists
504 - more detailed action logger (based on hooks) with pushed changesets lists
504 and options to disable those hooks from admin panel
505 and options to disable those hooks from admin panel
505 - introduced new enhanced changelog for merges that shows more accurate results
506 - introduced new enhanced changelog for merges that shows more accurate results
506 - new improved and faster code stats (based on pygments lexers mapping tables,
507 - new improved and faster code stats (based on pygments lexers mapping tables,
507 showing up to 10 trending sources for each repository. Additionally stats
508 showing up to 10 trending sources for each repository. Additionally stats
508 can be disabled in repository settings.
509 can be disabled in repository settings.
509 - gui optimizations, fixed application width to 1024px
510 - gui optimizations, fixed application width to 1024px
510 - added cut off (for large files/changesets) limit into config files
511 - added cut off (for large files/changesets) limit into config files
511 - whoosh, celeryd, upgrade moved to paster command
512 - whoosh, celeryd, upgrade moved to paster command
512 - other than sqlite database backends can be used
513 - other than sqlite database backends can be used
513
514
514 fixes
515 fixes
515 +++++
516 +++++
516
517
517 - fixes #61 forked repo was showing only after cache expired
518 - fixes #61 forked repo was showing only after cache expired
518 - fixes #76 no confirmation on user deletes
519 - fixes #76 no confirmation on user deletes
519 - fixes #66 Name field misspelled
520 - fixes #66 Name field misspelled
520 - fixes #72 block user removal when he owns repositories
521 - fixes #72 block user removal when he owns repositories
521 - fixes #69 added password confirmation fields
522 - fixes #69 added password confirmation fields
522 - fixes #87 RhodeCode crashes occasionally on updating repository owner
523 - fixes #87 RhodeCode crashes occasionally on updating repository owner
523 - fixes #82 broken annotations on files with more than 1 blank line at the end
524 - fixes #82 broken annotations on files with more than 1 blank line at the end
524 - a lot of fixes and tweaks for file browser
525 - a lot of fixes and tweaks for file browser
525 - fixed detached session issues
526 - fixed detached session issues
526 - fixed when user had no repos he would see all repos listed in my account
527 - fixed when user had no repos he would see all repos listed in my account
527 - fixed ui() instance bug when global hgrc settings was loaded for server
528 - fixed ui() instance bug when global hgrc settings was loaded for server
528 instance and all hgrc options were merged with our db ui() object
529 instance and all hgrc options were merged with our db ui() object
529 - numerous small bugfixes
530 - numerous small bugfixes
530
531
531 (special thanks for TkSoh for detailed feedback)
532 (special thanks for TkSoh for detailed feedback)
532
533
533
534
534 1.0.2 (**2010-11-12**)
535 1.0.2 (**2010-11-12**)
535 ----------------------
536 ----------------------
536
537
537 news
538 news
538 ++++
539 ++++
539
540
540 - tested under python2.7
541 - tested under python2.7
541 - bumped sqlalchemy and celery versions
542 - bumped sqlalchemy and celery versions
542
543
543 fixes
544 fixes
544 +++++
545 +++++
545
546
546 - fixed #59 missing graph.js
547 - fixed #59 missing graph.js
547 - fixed repo_size crash when repository had broken symlinks
548 - fixed repo_size crash when repository had broken symlinks
548 - fixed python2.5 crashes.
549 - fixed python2.5 crashes.
549
550
550
551
551 1.0.1 (**2010-11-10**)
552 1.0.1 (**2010-11-10**)
552 ----------------------
553 ----------------------
553
554
554 news
555 news
555 ++++
556 ++++
556
557
557 - small css updated
558 - small css updated
558
559
559 fixes
560 fixes
560 +++++
561 +++++
561
562
562 - fixed #53 python2.5 incompatible enumerate calls
563 - fixed #53 python2.5 incompatible enumerate calls
563 - fixed #52 disable mercurial extension for web
564 - fixed #52 disable mercurial extension for web
564 - fixed #51 deleting repositories don't delete it's dependent objects
565 - fixed #51 deleting repositories don't delete it's dependent objects
565
566
566
567
567 1.0.0 (**2010-11-02**)
568 1.0.0 (**2010-11-02**)
568 ----------------------
569 ----------------------
569
570
570 - security bugfix simplehg wasn't checking for permissions on commands
571 - security bugfix simplehg wasn't checking for permissions on commands
571 other than pull or push.
572 other than pull or push.
572 - fixed doubled messages after push or pull in admin journal
573 - fixed doubled messages after push or pull in admin journal
573 - templating and css corrections, fixed repo switcher on chrome, updated titles
574 - templating and css corrections, fixed repo switcher on chrome, updated titles
574 - admin menu accessible from options menu on repository view
575 - admin menu accessible from options menu on repository view
575 - permissions cached queries
576 - permissions cached queries
576
577
577 1.0.0rc4 (**2010-10-12**)
578 1.0.0rc4 (**2010-10-12**)
578 --------------------------
579 --------------------------
579
580
580 - fixed python2.5 missing simplejson imports (thanks to Jens BΓ€ckman)
581 - fixed python2.5 missing simplejson imports (thanks to Jens BΓ€ckman)
581 - removed cache_manager settings from sqlalchemy meta
582 - removed cache_manager settings from sqlalchemy meta
582 - added sqlalchemy cache settings to ini files
583 - added sqlalchemy cache settings to ini files
583 - validated password length and added second try of failure on paster setup-app
584 - validated password length and added second try of failure on paster setup-app
584 - fixed setup database destroy prompt even when there was no db
585 - fixed setup database destroy prompt even when there was no db
585
586
586
587
587 1.0.0rc3 (**2010-10-11**)
588 1.0.0rc3 (**2010-10-11**)
588 -------------------------
589 -------------------------
589
590
590 - fixed i18n during installation.
591 - fixed i18n during installation.
591
592
592 1.0.0rc2 (**2010-10-11**)
593 1.0.0rc2 (**2010-10-11**)
593 -------------------------
594 -------------------------
594
595
595 - Disabled dirsize in file browser, it's causing nasty bug when dir renames
596 - Disabled dirsize in file browser, it's causing nasty bug when dir renames
596 occure. After vcs is fixed it'll be put back again.
597 occure. After vcs is fixed it'll be put back again.
597 - templating/css rewrites, optimized css. No newline at end of file
598 - templating/css rewrites, optimized css.
@@ -1,433 +1,432 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 rhodecode.controllers.admin.repos
3 rhodecode.controllers.admin.repos
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 Repositories controller for RhodeCode
6 Repositories controller for RhodeCode
7
7
8 :created_on: Apr 7, 2010
8 :created_on: Apr 7, 2010
9 :author: marcink
9 :author: marcink
10 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
11 :license: GPLv3, see COPYING for more details.
12 """
12 """
13 # This program is free software: you can redistribute it and/or modify
13 # This program is free software: you can redistribute it and/or modify
14 # it under the terms of the GNU General Public License as published by
14 # it under the terms of the GNU General Public License as published by
15 # the Free Software Foundation, either version 3 of the License, or
15 # the Free Software Foundation, either version 3 of the License, or
16 # (at your option) any later version.
16 # (at your option) any later version.
17 #
17 #
18 # This program is distributed in the hope that it will be useful,
18 # This program is distributed in the hope that it will be useful,
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 # GNU General Public License for more details.
21 # GNU General Public License for more details.
22 #
22 #
23 # You should have received a copy of the GNU General Public License
23 # You should have received a copy of the GNU General Public License
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25
25
26 import logging
26 import logging
27 import traceback
27 import traceback
28 import formencode
28 import formencode
29 from formencode import htmlfill
29 from formencode import htmlfill
30
30
31 from paste.httpexceptions import HTTPInternalServerError
31 from paste.httpexceptions import HTTPInternalServerError
32 from pylons import request, session, tmpl_context as c, url
32 from pylons import request, session, tmpl_context as c, url
33 from pylons.controllers.util import redirect
33 from pylons.controllers.util import redirect
34 from pylons.i18n.translation import _
34 from pylons.i18n.translation import _
35 from sqlalchemy.exc import IntegrityError
35 from sqlalchemy.exc import IntegrityError
36
36
37 from rhodecode.lib import helpers as h
37 from rhodecode.lib import helpers as h
38 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, \
38 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, \
39 HasPermissionAnyDecorator, HasRepoPermissionAllDecorator
39 HasPermissionAnyDecorator, HasRepoPermissionAllDecorator
40 from rhodecode.lib.base import BaseController, render
40 from rhodecode.lib.base import BaseController, render
41 from rhodecode.lib.utils import invalidate_cache, action_logger, repo_name_slug
41 from rhodecode.lib.utils import invalidate_cache, action_logger, repo_name_slug
42 from rhodecode.lib.helpers import get_token
42 from rhodecode.lib.helpers import get_token
43 from rhodecode.model.meta import Session
43 from rhodecode.model.meta import Session
44 from rhodecode.model.db import User, Repository, UserFollowing, RepoGroup
44 from rhodecode.model.db import User, Repository, UserFollowing, RepoGroup
45 from rhodecode.model.forms import RepoForm
45 from rhodecode.model.forms import RepoForm
46 from rhodecode.model.scm import ScmModel
46 from rhodecode.model.scm import ScmModel
47 from rhodecode.model.repo import RepoModel
47 from rhodecode.model.repo import RepoModel
48
48
49 log = logging.getLogger(__name__)
49 log = logging.getLogger(__name__)
50
50
51
51
52 class ReposController(BaseController):
52 class ReposController(BaseController):
53 """
53 """
54 REST Controller styled on the Atom Publishing Protocol"""
54 REST Controller styled on the Atom Publishing Protocol"""
55 # To properly map this controller, ensure your config/routing.py
55 # To properly map this controller, ensure your config/routing.py
56 # file has a resource setup:
56 # file has a resource setup:
57 # map.resource('repo', 'repos')
57 # map.resource('repo', 'repos')
58
58
59 @LoginRequired()
59 @LoginRequired()
60 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
60 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
61 def __before__(self):
61 def __before__(self):
62 c.admin_user = session.get('admin_user')
62 c.admin_user = session.get('admin_user')
63 c.admin_username = session.get('admin_username')
63 c.admin_username = session.get('admin_username')
64 super(ReposController, self).__before__()
64 super(ReposController, self).__before__()
65
65
66 def __load_defaults(self):
66 def __load_defaults(self):
67 c.repo_groups = RepoGroup.groups_choices()
67 c.repo_groups = RepoGroup.groups_choices()
68 c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
68 c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
69
69
70 repo_model = RepoModel()
70 repo_model = RepoModel()
71 c.users_array = repo_model.get_users_js()
71 c.users_array = repo_model.get_users_js()
72 c.users_groups_array = repo_model.get_users_groups_js()
72 c.users_groups_array = repo_model.get_users_groups_js()
73
73
74 def __load_data(self, repo_name=None):
74 def __load_data(self, repo_name=None):
75 """
75 """
76 Load defaults settings for edit, and update
76 Load defaults settings for edit, and update
77
77
78 :param repo_name:
78 :param repo_name:
79 """
79 """
80 self.__load_defaults()
80 self.__load_defaults()
81
81
82 c.repo_info = db_repo = Repository.get_by_repo_name(repo_name)
82 c.repo_info = db_repo = Repository.get_by_repo_name(repo_name)
83 repo = db_repo.scm_instance
83 repo = db_repo.scm_instance
84
84
85 if c.repo_info is None:
85 if c.repo_info is None:
86 h.flash(_('%s repository is not mapped to db perhaps'
86 h.flash(_('%s repository is not mapped to db perhaps'
87 ' it was created or renamed from the filesystem'
87 ' it was created or renamed from the filesystem'
88 ' please run the application again'
88 ' please run the application again'
89 ' in order to rescan repositories') % repo_name,
89 ' in order to rescan repositories') % repo_name,
90 category='error')
90 category='error')
91
91
92 return redirect(url('repos'))
92 return redirect(url('repos'))
93
93
94 c.default_user_id = User.get_by_username('default').user_id
94 c.default_user_id = User.get_by_username('default').user_id
95 c.in_public_journal = UserFollowing.query()\
95 c.in_public_journal = UserFollowing.query()\
96 .filter(UserFollowing.user_id == c.default_user_id)\
96 .filter(UserFollowing.user_id == c.default_user_id)\
97 .filter(UserFollowing.follows_repository == c.repo_info).scalar()
97 .filter(UserFollowing.follows_repository == c.repo_info).scalar()
98
98
99 if c.repo_info.stats:
99 if c.repo_info.stats:
100 # this is on what revision we ended up so we add +1 for count
100 # this is on what revision we ended up so we add +1 for count
101 last_rev = c.repo_info.stats.stat_on_revision + 1
101 last_rev = c.repo_info.stats.stat_on_revision + 1
102 else:
102 else:
103 last_rev = 0
103 last_rev = 0
104 c.stats_revision = last_rev
104 c.stats_revision = last_rev
105
105
106 c.repo_last_rev = repo.count() if repo.revisions else 0
106 c.repo_last_rev = repo.count() if repo.revisions else 0
107
107
108 if last_rev == 0 or c.repo_last_rev == 0:
108 if last_rev == 0 or c.repo_last_rev == 0:
109 c.stats_percentage = 0
109 c.stats_percentage = 0
110 else:
110 else:
111 c.stats_percentage = '%.2f' % ((float((last_rev)) /
111 c.stats_percentage = '%.2f' % ((float((last_rev)) /
112 c.repo_last_rev) * 100)
112 c.repo_last_rev) * 100)
113
113
114 defaults = RepoModel()._get_defaults(repo_name)
114 defaults = RepoModel()._get_defaults(repo_name)
115
115
116 c.repos_list = [('', _('--REMOVE FORK--'))]
116 c.repos_list = [('', _('--REMOVE FORK--'))]
117 c.repos_list += [(x.repo_id, x.repo_name) for x in
117 c.repos_list += [(x.repo_id, x.repo_name) for x in
118 Repository.query().order_by(Repository.repo_name).all()]
118 Repository.query().order_by(Repository.repo_name).all()]
119 return defaults
119 return defaults
120
120
121 @HasPermissionAllDecorator('hg.admin')
121 @HasPermissionAllDecorator('hg.admin')
122 def index(self, format='html'):
122 def index(self, format='html'):
123 """GET /repos: All items in the collection"""
123 """GET /repos: All items in the collection"""
124 # url('repos')
124 # url('repos')
125
125
126 c.repos_list = ScmModel().get_repos(Repository.query()
126 c.repos_list = ScmModel().get_repos(Repository.query()
127 .order_by(Repository.repo_name)
127 .order_by(Repository.repo_name)
128 .all(), sort_key='name_sort')
128 .all(), sort_key='name_sort')
129 return render('admin/repos/repos.html')
129 return render('admin/repos/repos.html')
130
130
131 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
131 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
132 def create(self):
132 def create(self):
133 """
133 """
134 POST /repos: Create a new item"""
134 POST /repos: Create a new item"""
135 # url('repos')
135 # url('repos')
136
136
137 self.__load_defaults()
137 self.__load_defaults()
138 form_result = {}
138 form_result = {}
139 try:
139 try:
140 form_result = RepoForm(repo_groups=c.repo_groups_choices)()\
140 form_result = RepoForm(repo_groups=c.repo_groups_choices)()\
141 .to_python(dict(request.POST))
141 .to_python(dict(request.POST))
142 RepoModel().create(form_result, self.rhodecode_user)
142 RepoModel().create(form_result, self.rhodecode_user)
143 if form_result['clone_uri']:
143 if form_result['clone_uri']:
144 h.flash(_('created repository %s from %s') \
144 h.flash(_('created repository %s from %s') \
145 % (form_result['repo_name'], form_result['clone_uri']),
145 % (form_result['repo_name'], form_result['clone_uri']),
146 category='success')
146 category='success')
147 else:
147 else:
148 h.flash(_('created repository %s') % form_result['repo_name'],
148 h.flash(_('created repository %s') % form_result['repo_name'],
149 category='success')
149 category='success')
150
150
151 if request.POST.get('user_created'):
151 if request.POST.get('user_created'):
152 # created by regular non admin user
152 # created by regular non admin user
153 action_logger(self.rhodecode_user, 'user_created_repo',
153 action_logger(self.rhodecode_user, 'user_created_repo',
154 form_result['repo_name_full'], '', self.sa)
154 form_result['repo_name_full'], '', self.sa)
155 else:
155 else:
156 action_logger(self.rhodecode_user, 'admin_created_repo',
156 action_logger(self.rhodecode_user, 'admin_created_repo',
157 form_result['repo_name_full'], '', self.sa)
157 form_result['repo_name_full'], '', self.sa)
158 Session.commit()
158 Session.commit()
159 except formencode.Invalid, errors:
159 except formencode.Invalid, errors:
160
160
161 c.new_repo = errors.value['repo_name']
161 c.new_repo = errors.value['repo_name']
162
162
163 if request.POST.get('user_created'):
163 if request.POST.get('user_created'):
164 r = render('admin/repos/repo_add_create_repository.html')
164 r = render('admin/repos/repo_add_create_repository.html')
165 else:
165 else:
166 r = render('admin/repos/repo_add.html')
166 r = render('admin/repos/repo_add.html')
167
167
168 return htmlfill.render(
168 return htmlfill.render(
169 r,
169 r,
170 defaults=errors.value,
170 defaults=errors.value,
171 errors=errors.error_dict or {},
171 errors=errors.error_dict or {},
172 prefix_error=False,
172 prefix_error=False,
173 encoding="UTF-8")
173 encoding="UTF-8")
174
174
175 except Exception:
175 except Exception:
176 log.error(traceback.format_exc())
176 log.error(traceback.format_exc())
177 msg = _('error occurred during creation of repository %s') \
177 msg = _('error occurred during creation of repository %s') \
178 % form_result.get('repo_name')
178 % form_result.get('repo_name')
179 h.flash(msg, category='error')
179 h.flash(msg, category='error')
180 if request.POST.get('user_created'):
180 if request.POST.get('user_created'):
181 return redirect(url('home'))
181 return redirect(url('home'))
182 return redirect(url('repos'))
182 return redirect(url('repos'))
183
183
184 @HasPermissionAllDecorator('hg.admin')
184 @HasPermissionAllDecorator('hg.admin')
185 def new(self, format='html'):
185 def new(self, format='html'):
186 """GET /repos/new: Form to create a new item"""
186 """GET /repos/new: Form to create a new item"""
187 new_repo = request.GET.get('repo', '')
187 new_repo = request.GET.get('repo', '')
188 c.new_repo = repo_name_slug(new_repo)
188 c.new_repo = repo_name_slug(new_repo)
189 self.__load_defaults()
189 self.__load_defaults()
190 return render('admin/repos/repo_add.html')
190 return render('admin/repos/repo_add.html')
191
191
192 @HasPermissionAllDecorator('hg.admin')
192 @HasPermissionAllDecorator('hg.admin')
193 def update(self, repo_name):
193 def update(self, repo_name):
194 """
194 """
195 PUT /repos/repo_name: Update an existing item"""
195 PUT /repos/repo_name: Update an existing item"""
196 # Forms posted to this method should contain a hidden field:
196 # Forms posted to this method should contain a hidden field:
197 # <input type="hidden" name="_method" value="PUT" />
197 # <input type="hidden" name="_method" value="PUT" />
198 # Or using helpers:
198 # Or using helpers:
199 # h.form(url('repo', repo_name=ID),
199 # h.form(url('repo', repo_name=ID),
200 # method='put')
200 # method='put')
201 # url('repo', repo_name=ID)
201 # url('repo', repo_name=ID)
202 self.__load_defaults()
202 self.__load_defaults()
203 repo_model = RepoModel()
203 repo_model = RepoModel()
204 changed_name = repo_name
204 changed_name = repo_name
205 _form = RepoForm(edit=True, old_data={'repo_name': repo_name},
205 _form = RepoForm(edit=True, old_data={'repo_name': repo_name},
206 repo_groups=c.repo_groups_choices)()
206 repo_groups=c.repo_groups_choices)()
207 try:
207 try:
208 form_result = _form.to_python(dict(request.POST))
208 form_result = _form.to_python(dict(request.POST))
209 repo = repo_model.update(repo_name, form_result)
209 repo = repo_model.update(repo_name, form_result)
210 invalidate_cache('get_repo_cached_%s' % repo_name)
210 invalidate_cache('get_repo_cached_%s' % repo_name)
211 h.flash(_('Repository %s updated successfully' % repo_name),
211 h.flash(_('Repository %s updated successfully' % repo_name),
212 category='success')
212 category='success')
213 changed_name = repo.repo_name
213 changed_name = repo.repo_name
214 action_logger(self.rhodecode_user, 'admin_updated_repo',
214 action_logger(self.rhodecode_user, 'admin_updated_repo',
215 changed_name, '', self.sa)
215 changed_name, '', self.sa)
216 Session.commit()
216 Session.commit()
217 except formencode.Invalid, errors:
217 except formencode.Invalid, errors:
218 defaults = self.__load_data(repo_name)
218 defaults = self.__load_data(repo_name)
219 defaults.update(errors.value)
219 defaults.update(errors.value)
220 return htmlfill.render(
220 return htmlfill.render(
221 render('admin/repos/repo_edit.html'),
221 render('admin/repos/repo_edit.html'),
222 defaults=defaults,
222 defaults=defaults,
223 errors=errors.error_dict or {},
223 errors=errors.error_dict or {},
224 prefix_error=False,
224 prefix_error=False,
225 encoding="UTF-8")
225 encoding="UTF-8")
226
226
227 except Exception:
227 except Exception:
228 log.error(traceback.format_exc())
228 log.error(traceback.format_exc())
229 h.flash(_('error occurred during update of repository %s') \
229 h.flash(_('error occurred during update of repository %s') \
230 % repo_name, category='error')
230 % repo_name, category='error')
231 return redirect(url('edit_repo', repo_name=changed_name))
231 return redirect(url('edit_repo', repo_name=changed_name))
232
232
233 @HasPermissionAllDecorator('hg.admin')
233 @HasPermissionAllDecorator('hg.admin')
234 def delete(self, repo_name):
234 def delete(self, repo_name):
235 """
235 """
236 DELETE /repos/repo_name: Delete an existing item"""
236 DELETE /repos/repo_name: Delete an existing item"""
237 # Forms posted to this method should contain a hidden field:
237 # Forms posted to this method should contain a hidden field:
238 # <input type="hidden" name="_method" value="DELETE" />
238 # <input type="hidden" name="_method" value="DELETE" />
239 # Or using helpers:
239 # Or using helpers:
240 # h.form(url('repo', repo_name=ID),
240 # h.form(url('repo', repo_name=ID),
241 # method='delete')
241 # method='delete')
242 # url('repo', repo_name=ID)
242 # url('repo', repo_name=ID)
243
243
244 repo_model = RepoModel()
244 repo_model = RepoModel()
245 repo = repo_model.get_by_repo_name(repo_name)
245 repo = repo_model.get_by_repo_name(repo_name)
246 if not repo:
246 if not repo:
247 h.flash(_('%s repository is not mapped to db perhaps'
247 h.flash(_('%s repository is not mapped to db perhaps'
248 ' it was moved or renamed from the filesystem'
248 ' it was moved or renamed from the filesystem'
249 ' please run the application again'
249 ' please run the application again'
250 ' in order to rescan repositories') % repo_name,
250 ' in order to rescan repositories') % repo_name,
251 category='error')
251 category='error')
252
252
253 return redirect(url('repos'))
253 return redirect(url('repos'))
254 try:
254 try:
255 action_logger(self.rhodecode_user, 'admin_deleted_repo',
255 action_logger(self.rhodecode_user, 'admin_deleted_repo',
256 repo_name, '', self.sa)
256 repo_name, '', self.sa)
257 repo_model.delete(repo)
257 repo_model.delete(repo)
258 invalidate_cache('get_repo_cached_%s' % repo_name)
258 invalidate_cache('get_repo_cached_%s' % repo_name)
259 h.flash(_('deleted repository %s') % repo_name, category='success')
259 h.flash(_('deleted repository %s') % repo_name, category='success')
260 Session.commit()
260 Session.commit()
261 except IntegrityError, e:
261 except IntegrityError, e:
262 if e.message.find('repositories_fork_id_fkey') != -1:
262 if e.message.find('repositories_fork_id_fkey') != -1:
263 log.error(traceback.format_exc())
263 log.error(traceback.format_exc())
264 h.flash(_('Cannot delete %s it still contains attached '
264 h.flash(_('Cannot delete %s it still contains attached '
265 'forks') % repo_name,
265 'forks') % repo_name,
266 category='warning')
266 category='warning')
267 else:
267 else:
268 log.error(traceback.format_exc())
268 log.error(traceback.format_exc())
269 h.flash(_('An error occurred during '
269 h.flash(_('An error occurred during '
270 'deletion of %s') % repo_name,
270 'deletion of %s') % repo_name,
271 category='error')
271 category='error')
272
272
273 except Exception, e:
273 except Exception, e:
274 log.error(traceback.format_exc())
274 log.error(traceback.format_exc())
275 h.flash(_('An error occurred during deletion of %s') % repo_name,
275 h.flash(_('An error occurred during deletion of %s') % repo_name,
276 category='error')
276 category='error')
277
277
278 return redirect(url('repos'))
278 return redirect(url('repos'))
279
279
280 @HasRepoPermissionAllDecorator('repository.admin')
280 @HasRepoPermissionAllDecorator('repository.admin')
281 def delete_perm_user(self, repo_name):
281 def delete_perm_user(self, repo_name):
282 """
282 """
283 DELETE an existing repository permission user
283 DELETE an existing repository permission user
284
284
285 :param repo_name:
285 :param repo_name:
286 """
286 """
287
288 try:
287 try:
289 RepoModel().revoke_user_permission(repo=repo_name,
288 RepoModel().revoke_user_permission(repo=repo_name,
290 user=request.POST['user_id'])
289 user=request.POST['user_id'])
291 Session.commit()
290 Session.commit()
292 except Exception:
291 except Exception:
293 log.error(traceback.format_exc())
292 log.error(traceback.format_exc())
294 h.flash(_('An error occurred during deletion of repository user'),
293 h.flash(_('An error occurred during deletion of repository user'),
295 category='error')
294 category='error')
296 raise HTTPInternalServerError()
295 raise HTTPInternalServerError()
297
296
298 @HasRepoPermissionAllDecorator('repository.admin')
297 @HasRepoPermissionAllDecorator('repository.admin')
299 def delete_perm_users_group(self, repo_name):
298 def delete_perm_users_group(self, repo_name):
300 """
299 """
301 DELETE an existing repository permission users group
300 DELETE an existing repository permission users group
302
301
303 :param repo_name:
302 :param repo_name:
304 """
303 """
305
304
306 try:
305 try:
307 RepoModel().revoke_users_group_permission(
306 RepoModel().revoke_users_group_permission(
308 repo=repo_name, group_name=request.POST['users_group_id']
307 repo=repo_name, group_name=request.POST['users_group_id']
309 )
308 )
310 Session.commit()
309 Session.commit()
311 except Exception:
310 except Exception:
312 log.error(traceback.format_exc())
311 log.error(traceback.format_exc())
313 h.flash(_('An error occurred during deletion of repository'
312 h.flash(_('An error occurred during deletion of repository'
314 ' users groups'),
313 ' users groups'),
315 category='error')
314 category='error')
316 raise HTTPInternalServerError()
315 raise HTTPInternalServerError()
317
316
318 @HasPermissionAllDecorator('hg.admin')
317 @HasPermissionAllDecorator('hg.admin')
319 def repo_stats(self, repo_name):
318 def repo_stats(self, repo_name):
320 """
319 """
321 DELETE an existing repository statistics
320 DELETE an existing repository statistics
322
321
323 :param repo_name:
322 :param repo_name:
324 """
323 """
325
324
326 try:
325 try:
327 RepoModel().delete_stats(repo_name)
326 RepoModel().delete_stats(repo_name)
328 Session.commit()
327 Session.commit()
329 except Exception, e:
328 except Exception, e:
330 h.flash(_('An error occurred during deletion of repository stats'),
329 h.flash(_('An error occurred during deletion of repository stats'),
331 category='error')
330 category='error')
332 return redirect(url('edit_repo', repo_name=repo_name))
331 return redirect(url('edit_repo', repo_name=repo_name))
333
332
334 @HasPermissionAllDecorator('hg.admin')
333 @HasPermissionAllDecorator('hg.admin')
335 def repo_cache(self, repo_name):
334 def repo_cache(self, repo_name):
336 """
335 """
337 INVALIDATE existing repository cache
336 INVALIDATE existing repository cache
338
337
339 :param repo_name:
338 :param repo_name:
340 """
339 """
341
340
342 try:
341 try:
343 ScmModel().mark_for_invalidation(repo_name)
342 ScmModel().mark_for_invalidation(repo_name)
344 Session.commit()
343 Session.commit()
345 except Exception, e:
344 except Exception, e:
346 h.flash(_('An error occurred during cache invalidation'),
345 h.flash(_('An error occurred during cache invalidation'),
347 category='error')
346 category='error')
348 return redirect(url('edit_repo', repo_name=repo_name))
347 return redirect(url('edit_repo', repo_name=repo_name))
349
348
350 @HasPermissionAllDecorator('hg.admin')
349 @HasPermissionAllDecorator('hg.admin')
351 def repo_public_journal(self, repo_name):
350 def repo_public_journal(self, repo_name):
352 """
351 """
353 Set's this repository to be visible in public journal,
352 Set's this repository to be visible in public journal,
354 in other words assing default user to follow this repo
353 in other words assing default user to follow this repo
355
354
356 :param repo_name:
355 :param repo_name:
357 """
356 """
358
357
359 cur_token = request.POST.get('auth_token')
358 cur_token = request.POST.get('auth_token')
360 token = get_token()
359 token = get_token()
361 if cur_token == token:
360 if cur_token == token:
362 try:
361 try:
363 repo_id = Repository.get_by_repo_name(repo_name).repo_id
362 repo_id = Repository.get_by_repo_name(repo_name).repo_id
364 user_id = User.get_by_username('default').user_id
363 user_id = User.get_by_username('default').user_id
365 self.scm_model.toggle_following_repo(repo_id, user_id)
364 self.scm_model.toggle_following_repo(repo_id, user_id)
366 h.flash(_('Updated repository visibility in public journal'),
365 h.flash(_('Updated repository visibility in public journal'),
367 category='success')
366 category='success')
368 Session.commit()
367 Session.commit()
369 except:
368 except:
370 h.flash(_('An error occurred during setting this'
369 h.flash(_('An error occurred during setting this'
371 ' repository in public journal'),
370 ' repository in public journal'),
372 category='error')
371 category='error')
373
372
374 else:
373 else:
375 h.flash(_('Token mismatch'), category='error')
374 h.flash(_('Token mismatch'), category='error')
376 return redirect(url('edit_repo', repo_name=repo_name))
375 return redirect(url('edit_repo', repo_name=repo_name))
377
376
378 @HasPermissionAllDecorator('hg.admin')
377 @HasPermissionAllDecorator('hg.admin')
379 def repo_pull(self, repo_name):
378 def repo_pull(self, repo_name):
380 """
379 """
381 Runs task to update given repository with remote changes,
380 Runs task to update given repository with remote changes,
382 ie. make pull on remote location
381 ie. make pull on remote location
383
382
384 :param repo_name:
383 :param repo_name:
385 """
384 """
386 try:
385 try:
387 ScmModel().pull_changes(repo_name, self.rhodecode_user.username)
386 ScmModel().pull_changes(repo_name, self.rhodecode_user.username)
388 h.flash(_('Pulled from remote location'), category='success')
387 h.flash(_('Pulled from remote location'), category='success')
389 except Exception, e:
388 except Exception, e:
390 h.flash(_('An error occurred during pull from remote location'),
389 h.flash(_('An error occurred during pull from remote location'),
391 category='error')
390 category='error')
392
391
393 return redirect(url('edit_repo', repo_name=repo_name))
392 return redirect(url('edit_repo', repo_name=repo_name))
394
393
395 @HasPermissionAllDecorator('hg.admin')
394 @HasPermissionAllDecorator('hg.admin')
396 def repo_as_fork(self, repo_name):
395 def repo_as_fork(self, repo_name):
397 """
396 """
398 Mark given repository as a fork of another
397 Mark given repository as a fork of another
399
398
400 :param repo_name:
399 :param repo_name:
401 """
400 """
402 try:
401 try:
403 fork_id = request.POST.get('id_fork_of')
402 fork_id = request.POST.get('id_fork_of')
404 repo = ScmModel().mark_as_fork(repo_name, fork_id,
403 repo = ScmModel().mark_as_fork(repo_name, fork_id,
405 self.rhodecode_user.username)
404 self.rhodecode_user.username)
406 fork = repo.fork.repo_name if repo.fork else _('Nothing')
405 fork = repo.fork.repo_name if repo.fork else _('Nothing')
407 Session.commit()
406 Session.commit()
408 h.flash(_('Marked repo %s as fork of %s' % (repo_name,fork)),
407 h.flash(_('Marked repo %s as fork of %s' % (repo_name,fork)),
409 category='success')
408 category='success')
410 except Exception, e:
409 except Exception, e:
411 raise
410 raise
412 h.flash(_('An error occurred during this operation'),
411 h.flash(_('An error occurred during this operation'),
413 category='error')
412 category='error')
414
413
415 return redirect(url('edit_repo', repo_name=repo_name))
414 return redirect(url('edit_repo', repo_name=repo_name))
416
415
417 @HasPermissionAllDecorator('hg.admin')
416 @HasPermissionAllDecorator('hg.admin')
418 def show(self, repo_name, format='html'):
417 def show(self, repo_name, format='html'):
419 """GET /repos/repo_name: Show a specific item"""
418 """GET /repos/repo_name: Show a specific item"""
420 # url('repo', repo_name=ID)
419 # url('repo', repo_name=ID)
421
420
422 @HasPermissionAllDecorator('hg.admin')
421 @HasPermissionAllDecorator('hg.admin')
423 def edit(self, repo_name, format='html'):
422 def edit(self, repo_name, format='html'):
424 """GET /repos/repo_name/edit: Form to edit an existing item"""
423 """GET /repos/repo_name/edit: Form to edit an existing item"""
425 # url('edit_repo', repo_name=ID)
424 # url('edit_repo', repo_name=ID)
426 defaults = self.__load_data(repo_name)
425 defaults = self.__load_data(repo_name)
427
426
428 return htmlfill.render(
427 return htmlfill.render(
429 render('admin/repos/repo_edit.html'),
428 render('admin/repos/repo_edit.html'),
430 defaults=defaults,
429 defaults=defaults,
431 encoding="UTF-8",
430 encoding="UTF-8",
432 force_defaults=False
431 force_defaults=False
433 )
432 )
@@ -1,494 +1,499 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 rhodecode.model.repo
3 rhodecode.model.repo
4 ~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~
5
5
6 Repository model for rhodecode
6 Repository model for rhodecode
7
7
8 :created_on: Jun 5, 2010
8 :created_on: Jun 5, 2010
9 :author: marcink
9 :author: marcink
10 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
11 :license: GPLv3, see COPYING for more details.
12 """
12 """
13 # This program is free software: you can redistribute it and/or modify
13 # This program is free software: you can redistribute it and/or modify
14 # it under the terms of the GNU General Public License as published by
14 # it under the terms of the GNU General Public License as published by
15 # the Free Software Foundation, either version 3 of the License, or
15 # the Free Software Foundation, either version 3 of the License, or
16 # (at your option) any later version.
16 # (at your option) any later version.
17 #
17 #
18 # This program is distributed in the hope that it will be useful,
18 # This program is distributed in the hope that it will be useful,
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 # GNU General Public License for more details.
21 # GNU General Public License for more details.
22 #
22 #
23 # You should have received a copy of the GNU General Public License
23 # You should have received a copy of the GNU General Public License
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25 import os
25 import os
26 import shutil
26 import shutil
27 import logging
27 import logging
28 import traceback
28 import traceback
29 from datetime import datetime
29 from datetime import datetime
30
30
31 from rhodecode.lib.vcs.backends import get_backend
31 from rhodecode.lib.vcs.backends import get_backend
32
32 from rhodecode.lib.compat import json
33 from rhodecode.lib.utils2 import LazyProperty, safe_str, safe_unicode
33 from rhodecode.lib.utils2 import LazyProperty, safe_str, safe_unicode
34 from rhodecode.lib.caching_query import FromCache
34 from rhodecode.lib.caching_query import FromCache
35 from rhodecode.lib.hooks import log_create_repository
35 from rhodecode.lib.hooks import log_create_repository
36
36
37 from rhodecode.model import BaseModel
37 from rhodecode.model import BaseModel
38 from rhodecode.model.db import Repository, UserRepoToPerm, User, Permission, \
38 from rhodecode.model.db import Repository, UserRepoToPerm, User, Permission, \
39 Statistics, UsersGroup, UsersGroupRepoToPerm, RhodeCodeUi, RepoGroup
39 Statistics, UsersGroup, UsersGroupRepoToPerm, RhodeCodeUi, RepoGroup
40 from rhodecode.lib import helpers as h
40
41
41
42
42 log = logging.getLogger(__name__)
43 log = logging.getLogger(__name__)
43
44
44
45
45 class RepoModel(BaseModel):
46 class RepoModel(BaseModel):
46
47
47 def __get_user(self, user):
48 def __get_user(self, user):
48 return self._get_instance(User, user, callback=User.get_by_username)
49 return self._get_instance(User, user, callback=User.get_by_username)
49
50
50 def __get_users_group(self, users_group):
51 def __get_users_group(self, users_group):
51 return self._get_instance(UsersGroup, users_group,
52 return self._get_instance(UsersGroup, users_group,
52 callback=UsersGroup.get_by_group_name)
53 callback=UsersGroup.get_by_group_name)
53
54
54 def __get_repos_group(self, repos_group):
55 def __get_repos_group(self, repos_group):
55 return self._get_instance(RepoGroup, repos_group,
56 return self._get_instance(RepoGroup, repos_group,
56 callback=RepoGroup.get_by_group_name)
57 callback=RepoGroup.get_by_group_name)
57
58
58 def __get_repo(self, repository):
59 def __get_repo(self, repository):
59 return self._get_instance(Repository, repository,
60 return self._get_instance(Repository, repository,
60 callback=Repository.get_by_repo_name)
61 callback=Repository.get_by_repo_name)
61
62
62 def __get_perm(self, permission):
63 def __get_perm(self, permission):
63 return self._get_instance(Permission, permission,
64 return self._get_instance(Permission, permission,
64 callback=Permission.get_by_key)
65 callback=Permission.get_by_key)
65
66
66 @LazyProperty
67 @LazyProperty
67 def repos_path(self):
68 def repos_path(self):
68 """
69 """
69 Get's the repositories root path from database
70 Get's the repositories root path from database
70 """
71 """
71
72
72 q = self.sa.query(RhodeCodeUi).filter(RhodeCodeUi.ui_key == '/').one()
73 q = self.sa.query(RhodeCodeUi).filter(RhodeCodeUi.ui_key == '/').one()
73 return q.ui_value
74 return q.ui_value
74
75
75 def get(self, repo_id, cache=False):
76 def get(self, repo_id, cache=False):
76 repo = self.sa.query(Repository)\
77 repo = self.sa.query(Repository)\
77 .filter(Repository.repo_id == repo_id)
78 .filter(Repository.repo_id == repo_id)
78
79
79 if cache:
80 if cache:
80 repo = repo.options(FromCache("sql_cache_short",
81 repo = repo.options(FromCache("sql_cache_short",
81 "get_repo_%s" % repo_id))
82 "get_repo_%s" % repo_id))
82 return repo.scalar()
83 return repo.scalar()
83
84
84 def get_repo(self, repository):
85 def get_repo(self, repository):
85 return self.__get_repo(repository)
86 return self.__get_repo(repository)
86
87
87 def get_by_repo_name(self, repo_name, cache=False):
88 def get_by_repo_name(self, repo_name, cache=False):
88 repo = self.sa.query(Repository)\
89 repo = self.sa.query(Repository)\
89 .filter(Repository.repo_name == repo_name)
90 .filter(Repository.repo_name == repo_name)
90
91
91 if cache:
92 if cache:
92 repo = repo.options(FromCache("sql_cache_short",
93 repo = repo.options(FromCache("sql_cache_short",
93 "get_repo_%s" % repo_name))
94 "get_repo_%s" % repo_name))
94 return repo.scalar()
95 return repo.scalar()
95
96
96 def get_users_js(self):
97 def get_users_js(self):
97
98 users = self.sa.query(User).filter(User.active == True).all()
98 users = self.sa.query(User).filter(User.active == True).all()
99 u_tmpl = '''{id:%s, fname:"%s", lname:"%s", nname:"%s"},'''
99 return json.dumps([
100 users_array = '[%s]' % '\n'.join([u_tmpl % (u.user_id, u.name,
100 {
101 u.lastname, u.username)
101 'id': u.user_id,
102 for u in users])
102 'fname': u.name,
103 return users_array
103 'lname': u.lastname,
104 'nname': u.username,
105 'gravatar_lnk': h.gravatar_url(u.email, 14)
106 } for u in users]
107 )
104
108
105 def get_users_groups_js(self):
109 def get_users_groups_js(self):
106 users_groups = self.sa.query(UsersGroup)\
110 users_groups = self.sa.query(UsersGroup)\
107 .filter(UsersGroup.users_group_active == True).all()
111 .filter(UsersGroup.users_group_active == True).all()
108
112
109 g_tmpl = '''{id:%s, grname:"%s",grmembers:"%s"},'''
113 return json.dumps([
110
114 {
111 users_groups_array = '[%s]' % '\n'.join([g_tmpl % \
115 'id': gr.users_group_id,
112 (gr.users_group_id, gr.users_group_name,
116 'grname': gr.users_group_name,
113 len(gr.members))
117 'grmembers': len(gr.members),
114 for gr in users_groups])
118 } for gr in users_groups]
115 return users_groups_array
119 )
116
120
117 def _get_defaults(self, repo_name):
121 def _get_defaults(self, repo_name):
118 """
122 """
119 Get's information about repository, and returns a dict for
123 Get's information about repository, and returns a dict for
120 usage in forms
124 usage in forms
121
125
122 :param repo_name:
126 :param repo_name:
123 """
127 """
124
128
125 repo_info = Repository.get_by_repo_name(repo_name)
129 repo_info = Repository.get_by_repo_name(repo_name)
126
130
127 if repo_info is None:
131 if repo_info is None:
128 return None
132 return None
129
133
130 defaults = repo_info.get_dict()
134 defaults = repo_info.get_dict()
131 group, repo_name = repo_info.groups_and_repo
135 group, repo_name = repo_info.groups_and_repo
132 defaults['repo_name'] = repo_name
136 defaults['repo_name'] = repo_name
133 defaults['repo_group'] = getattr(group[-1] if group else None,
137 defaults['repo_group'] = getattr(group[-1] if group else None,
134 'group_id', None)
138 'group_id', None)
135
139
136 # fill owner
140 # fill owner
137 if repo_info.user:
141 if repo_info.user:
138 defaults.update({'user': repo_info.user.username})
142 defaults.update({'user': repo_info.user.username})
139 else:
143 else:
140 replacement_user = User.query().filter(User.admin ==
144 replacement_user = User.query().filter(User.admin ==
141 True).first().username
145 True).first().username
142 defaults.update({'user': replacement_user})
146 defaults.update({'user': replacement_user})
143
147
144 # fill repository users
148 # fill repository users
145 for p in repo_info.repo_to_perm:
149 for p in repo_info.repo_to_perm:
146 defaults.update({'u_perm_%s' % p.user.username:
150 defaults.update({'u_perm_%s' % p.user.username:
147 p.permission.permission_name})
151 p.permission.permission_name})
148
152
149 # fill repository groups
153 # fill repository groups
150 for p in repo_info.users_group_to_perm:
154 for p in repo_info.users_group_to_perm:
151 defaults.update({'g_perm_%s' % p.users_group.users_group_name:
155 defaults.update({'g_perm_%s' % p.users_group.users_group_name:
152 p.permission.permission_name})
156 p.permission.permission_name})
153
157
154 return defaults
158 return defaults
155
159
156 def update(self, repo_name, form_data):
160 def update(self, repo_name, form_data):
157 try:
161 try:
158 cur_repo = self.get_by_repo_name(repo_name, cache=False)
162 cur_repo = self.get_by_repo_name(repo_name, cache=False)
159
163
160 # update permissions
164 # update permissions
161 for member, perm, member_type in form_data['perms_updates']:
165 for member, perm, member_type in form_data['perms_updates']:
162 if member_type == 'user':
166 if member_type == 'user':
163 # this updates existing one
167 # this updates existing one
164 RepoModel().grant_user_permission(
168 RepoModel().grant_user_permission(
165 repo=cur_repo, user=member, perm=perm
169 repo=cur_repo, user=member, perm=perm
166 )
170 )
167 else:
171 else:
168 RepoModel().grant_users_group_permission(
172 RepoModel().grant_users_group_permission(
169 repo=cur_repo, group_name=member, perm=perm
173 repo=cur_repo, group_name=member, perm=perm
170 )
174 )
171 # set new permissions
175 # set new permissions
172 for member, perm, member_type in form_data['perms_new']:
176 for member, perm, member_type in form_data['perms_new']:
173 if member_type == 'user':
177 if member_type == 'user':
174 RepoModel().grant_user_permission(
178 RepoModel().grant_user_permission(
175 repo=cur_repo, user=member, perm=perm
179 repo=cur_repo, user=member, perm=perm
176 )
180 )
177 else:
181 else:
178 RepoModel().grant_users_group_permission(
182 RepoModel().grant_users_group_permission(
179 repo=cur_repo, group_name=member, perm=perm
183 repo=cur_repo, group_name=member, perm=perm
180 )
184 )
181
185
182 # update current repo
186 # update current repo
183 for k, v in form_data.items():
187 for k, v in form_data.items():
184 if k == 'user':
188 if k == 'user':
185 cur_repo.user = User.get_by_username(v)
189 cur_repo.user = User.get_by_username(v)
186 elif k == 'repo_name':
190 elif k == 'repo_name':
187 pass
191 pass
188 elif k == 'repo_group':
192 elif k == 'repo_group':
189 cur_repo.group = RepoGroup.get(v)
193 cur_repo.group = RepoGroup.get(v)
190
194
191 else:
195 else:
192 setattr(cur_repo, k, v)
196 setattr(cur_repo, k, v)
193
197
194 new_name = cur_repo.get_new_name(form_data['repo_name'])
198 new_name = cur_repo.get_new_name(form_data['repo_name'])
195 cur_repo.repo_name = new_name
199 cur_repo.repo_name = new_name
196
200
197 self.sa.add(cur_repo)
201 self.sa.add(cur_repo)
198
202
199 if repo_name != new_name:
203 if repo_name != new_name:
200 # rename repository
204 # rename repository
201 self.__rename_repo(old=repo_name, new=new_name)
205 self.__rename_repo(old=repo_name, new=new_name)
202
206
203 return cur_repo
207 return cur_repo
204 except:
208 except:
205 log.error(traceback.format_exc())
209 log.error(traceback.format_exc())
206 raise
210 raise
207
211
208 def create(self, form_data, cur_user, just_db=False, fork=False):
212 def create(self, form_data, cur_user, just_db=False, fork=False):
209 from rhodecode.model.scm import ScmModel
213 from rhodecode.model.scm import ScmModel
210
214
211 try:
215 try:
212 if fork:
216 if fork:
213 fork_parent_id = form_data['fork_parent_id']
217 fork_parent_id = form_data['fork_parent_id']
214
218
215 # repo name is just a name of repository
219 # repo name is just a name of repository
216 # while repo_name_full is a full qualified name that is combined
220 # while repo_name_full is a full qualified name that is combined
217 # with name and path of group
221 # with name and path of group
218 repo_name = form_data['repo_name']
222 repo_name = form_data['repo_name']
219 repo_name_full = form_data['repo_name_full']
223 repo_name_full = form_data['repo_name_full']
220
224
221 new_repo = Repository()
225 new_repo = Repository()
222 new_repo.enable_statistics = False
226 new_repo.enable_statistics = False
223
227
224 for k, v in form_data.items():
228 for k, v in form_data.items():
225 if k == 'repo_name':
229 if k == 'repo_name':
226 v = repo_name_full
230 v = repo_name_full
227 if k == 'repo_group':
231 if k == 'repo_group':
228 k = 'group_id'
232 k = 'group_id'
229 if k == 'description':
233 if k == 'description':
230 v = v or repo_name
234 v = v or repo_name
231
235
232 setattr(new_repo, k, v)
236 setattr(new_repo, k, v)
233
237
234 if fork:
238 if fork:
235 parent_repo = Repository.get(fork_parent_id)
239 parent_repo = Repository.get(fork_parent_id)
236 new_repo.fork = parent_repo
240 new_repo.fork = parent_repo
237
241
238 new_repo.user_id = cur_user.user_id
242 new_repo.user_id = cur_user.user_id
239 self.sa.add(new_repo)
243 self.sa.add(new_repo)
240
244
241 def _create_default_perms():
245 def _create_default_perms():
242 # create default permission
246 # create default permission
243 repo_to_perm = UserRepoToPerm()
247 repo_to_perm = UserRepoToPerm()
244 default = 'repository.read'
248 default = 'repository.read'
245 for p in User.get_by_username('default').user_perms:
249 for p in User.get_by_username('default').user_perms:
246 if p.permission.permission_name.startswith('repository.'):
250 if p.permission.permission_name.startswith('repository.'):
247 default = p.permission.permission_name
251 default = p.permission.permission_name
248 break
252 break
249
253
250 default_perm = 'repository.none' if form_data['private'] else default
254 default_perm = 'repository.none' if form_data['private'] else default
251
255
252 repo_to_perm.permission_id = self.sa.query(Permission)\
256 repo_to_perm.permission_id = self.sa.query(Permission)\
253 .filter(Permission.permission_name == default_perm)\
257 .filter(Permission.permission_name == default_perm)\
254 .one().permission_id
258 .one().permission_id
255
259
256 repo_to_perm.repository = new_repo
260 repo_to_perm.repository = new_repo
257 repo_to_perm.user_id = User.get_by_username('default').user_id
261 repo_to_perm.user_id = User.get_by_username('default').user_id
258
262
259 self.sa.add(repo_to_perm)
263 self.sa.add(repo_to_perm)
260
264
261 if fork:
265 if fork:
262 if form_data.get('copy_permissions'):
266 if form_data.get('copy_permissions'):
263 repo = Repository.get(fork_parent_id)
267 repo = Repository.get(fork_parent_id)
264 user_perms = UserRepoToPerm.query()\
268 user_perms = UserRepoToPerm.query()\
265 .filter(UserRepoToPerm.repository == repo).all()
269 .filter(UserRepoToPerm.repository == repo).all()
266 group_perms = UsersGroupRepoToPerm.query()\
270 group_perms = UsersGroupRepoToPerm.query()\
267 .filter(UsersGroupRepoToPerm.repository == repo).all()
271 .filter(UsersGroupRepoToPerm.repository == repo).all()
268
272
269 for perm in user_perms:
273 for perm in user_perms:
270 UserRepoToPerm.create(perm.user, new_repo,
274 UserRepoToPerm.create(perm.user, new_repo,
271 perm.permission)
275 perm.permission)
272
276
273 for perm in group_perms:
277 for perm in group_perms:
274 UsersGroupRepoToPerm.create(perm.users_group, new_repo,
278 UsersGroupRepoToPerm.create(perm.users_group, new_repo,
275 perm.permission)
279 perm.permission)
276 else:
280 else:
277 _create_default_perms()
281 _create_default_perms()
278 else:
282 else:
279 _create_default_perms()
283 _create_default_perms()
280
284
281 if not just_db:
285 if not just_db:
282 self.__create_repo(repo_name, form_data['repo_type'],
286 self.__create_repo(repo_name, form_data['repo_type'],
283 form_data['repo_group'],
287 form_data['repo_group'],
284 form_data['clone_uri'])
288 form_data['clone_uri'])
285
289
286 # now automatically start following this repository as owner
290 # now automatically start following this repository as owner
287 ScmModel(self.sa).toggle_following_repo(new_repo.repo_id,
291 ScmModel(self.sa).toggle_following_repo(new_repo.repo_id,
288 cur_user.user_id)
292 cur_user.user_id)
289 log_create_repository(new_repo.get_dict(),
293 log_create_repository(new_repo.get_dict(),
290 created_by=cur_user.username)
294 created_by=cur_user.username)
291 return new_repo
295 return new_repo
292 except:
296 except:
293 log.error(traceback.format_exc())
297 log.error(traceback.format_exc())
294 raise
298 raise
295
299
296 def create_fork(self, form_data, cur_user):
300 def create_fork(self, form_data, cur_user):
297 """
301 """
298 Simple wrapper into executing celery task for fork creation
302 Simple wrapper into executing celery task for fork creation
299
303
300 :param form_data:
304 :param form_data:
301 :param cur_user:
305 :param cur_user:
302 """
306 """
303 from rhodecode.lib.celerylib import tasks, run_task
307 from rhodecode.lib.celerylib import tasks, run_task
304 run_task(tasks.create_repo_fork, form_data, cur_user)
308 run_task(tasks.create_repo_fork, form_data, cur_user)
305
309
306 def delete(self, repo):
310 def delete(self, repo):
307 repo = self.__get_repo(repo)
311 repo = self.__get_repo(repo)
308 try:
312 try:
309 self.sa.delete(repo)
313 self.sa.delete(repo)
310 self.__delete_repo(repo)
314 self.__delete_repo(repo)
311 except:
315 except:
312 log.error(traceback.format_exc())
316 log.error(traceback.format_exc())
313 raise
317 raise
314
318
315 def grant_user_permission(self, repo, user, perm):
319 def grant_user_permission(self, repo, user, perm):
316 """
320 """
317 Grant permission for user on given repository, or update existing one
321 Grant permission for user on given repository, or update existing one
318 if found
322 if found
319
323
320 :param repo: Instance of Repository, repository_id, or repository name
324 :param repo: Instance of Repository, repository_id, or repository name
321 :param user: Instance of User, user_id or username
325 :param user: Instance of User, user_id or username
322 :param perm: Instance of Permission, or permission_name
326 :param perm: Instance of Permission, or permission_name
323 """
327 """
324 user = self.__get_user(user)
328 user = self.__get_user(user)
325 repo = self.__get_repo(repo)
329 repo = self.__get_repo(repo)
326 permission = self.__get_perm(perm)
330 permission = self.__get_perm(perm)
327
331
328 # check if we have that permission already
332 # check if we have that permission already
329 obj = self.sa.query(UserRepoToPerm)\
333 obj = self.sa.query(UserRepoToPerm)\
330 .filter(UserRepoToPerm.user == user)\
334 .filter(UserRepoToPerm.user == user)\
331 .filter(UserRepoToPerm.repository == repo)\
335 .filter(UserRepoToPerm.repository == repo)\
332 .scalar()
336 .scalar()
333 if obj is None:
337 if obj is None:
334 # create new !
338 # create new !
335 obj = UserRepoToPerm()
339 obj = UserRepoToPerm()
336 obj.repository = repo
340 obj.repository = repo
337 obj.user = user
341 obj.user = user
338 obj.permission = permission
342 obj.permission = permission
339 self.sa.add(obj)
343 self.sa.add(obj)
340
344
341 def revoke_user_permission(self, repo, user):
345 def revoke_user_permission(self, repo, user):
342 """
346 """
343 Revoke permission for user on given repository
347 Revoke permission for user on given repository
344
348
345 :param repo: Instance of Repository, repository_id, or repository name
349 :param repo: Instance of Repository, repository_id, or repository name
346 :param user: Instance of User, user_id or username
350 :param user: Instance of User, user_id or username
347 """
351 """
352
348 user = self.__get_user(user)
353 user = self.__get_user(user)
349 repo = self.__get_repo(repo)
354 repo = self.__get_repo(repo)
350
355
351 obj = self.sa.query(UserRepoToPerm)\
356 obj = self.sa.query(UserRepoToPerm)\
352 .filter(UserRepoToPerm.repository == repo)\
357 .filter(UserRepoToPerm.repository == repo)\
353 .filter(UserRepoToPerm.user == user)\
358 .filter(UserRepoToPerm.user == user)\
354 .one()
359 .one()
355 self.sa.delete(obj)
360 self.sa.delete(obj)
356
361
357 def grant_users_group_permission(self, repo, group_name, perm):
362 def grant_users_group_permission(self, repo, group_name, perm):
358 """
363 """
359 Grant permission for users group on given repository, or update
364 Grant permission for users group on given repository, or update
360 existing one if found
365 existing one if found
361
366
362 :param repo: Instance of Repository, repository_id, or repository name
367 :param repo: Instance of Repository, repository_id, or repository name
363 :param group_name: Instance of UserGroup, users_group_id,
368 :param group_name: Instance of UserGroup, users_group_id,
364 or users group name
369 or users group name
365 :param perm: Instance of Permission, or permission_name
370 :param perm: Instance of Permission, or permission_name
366 """
371 """
367 repo = self.__get_repo(repo)
372 repo = self.__get_repo(repo)
368 group_name = self.__get_users_group(group_name)
373 group_name = self.__get_users_group(group_name)
369 permission = self.__get_perm(perm)
374 permission = self.__get_perm(perm)
370
375
371 # check if we have that permission already
376 # check if we have that permission already
372 obj = self.sa.query(UsersGroupRepoToPerm)\
377 obj = self.sa.query(UsersGroupRepoToPerm)\
373 .filter(UsersGroupRepoToPerm.users_group == group_name)\
378 .filter(UsersGroupRepoToPerm.users_group == group_name)\
374 .filter(UsersGroupRepoToPerm.repository == repo)\
379 .filter(UsersGroupRepoToPerm.repository == repo)\
375 .scalar()
380 .scalar()
376
381
377 if obj is None:
382 if obj is None:
378 # create new
383 # create new
379 obj = UsersGroupRepoToPerm()
384 obj = UsersGroupRepoToPerm()
380
385
381 obj.repository = repo
386 obj.repository = repo
382 obj.users_group = group_name
387 obj.users_group = group_name
383 obj.permission = permission
388 obj.permission = permission
384 self.sa.add(obj)
389 self.sa.add(obj)
385
390
386 def revoke_users_group_permission(self, repo, group_name):
391 def revoke_users_group_permission(self, repo, group_name):
387 """
392 """
388 Revoke permission for users group on given repository
393 Revoke permission for users group on given repository
389
394
390 :param repo: Instance of Repository, repository_id, or repository name
395 :param repo: Instance of Repository, repository_id, or repository name
391 :param group_name: Instance of UserGroup, users_group_id,
396 :param group_name: Instance of UserGroup, users_group_id,
392 or users group name
397 or users group name
393 """
398 """
394 repo = self.__get_repo(repo)
399 repo = self.__get_repo(repo)
395 group_name = self.__get_users_group(group_name)
400 group_name = self.__get_users_group(group_name)
396
401
397 obj = self.sa.query(UsersGroupRepoToPerm)\
402 obj = self.sa.query(UsersGroupRepoToPerm)\
398 .filter(UsersGroupRepoToPerm.repository == repo)\
403 .filter(UsersGroupRepoToPerm.repository == repo)\
399 .filter(UsersGroupRepoToPerm.users_group == group_name)\
404 .filter(UsersGroupRepoToPerm.users_group == group_name)\
400 .one()
405 .one()
401 self.sa.delete(obj)
406 self.sa.delete(obj)
402
407
403 def delete_stats(self, repo_name):
408 def delete_stats(self, repo_name):
404 """
409 """
405 removes stats for given repo
410 removes stats for given repo
406
411
407 :param repo_name:
412 :param repo_name:
408 """
413 """
409 try:
414 try:
410 obj = self.sa.query(Statistics)\
415 obj = self.sa.query(Statistics)\
411 .filter(Statistics.repository ==
416 .filter(Statistics.repository ==
412 self.get_by_repo_name(repo_name))\
417 self.get_by_repo_name(repo_name))\
413 .one()
418 .one()
414 self.sa.delete(obj)
419 self.sa.delete(obj)
415 except:
420 except:
416 log.error(traceback.format_exc())
421 log.error(traceback.format_exc())
417 raise
422 raise
418
423
419 def __create_repo(self, repo_name, alias, new_parent_id, clone_uri=False):
424 def __create_repo(self, repo_name, alias, new_parent_id, clone_uri=False):
420 """
425 """
421 makes repository on filesystem. It's group aware means it'll create
426 makes repository on filesystem. It's group aware means it'll create
422 a repository within a group, and alter the paths accordingly of
427 a repository within a group, and alter the paths accordingly of
423 group location
428 group location
424
429
425 :param repo_name:
430 :param repo_name:
426 :param alias:
431 :param alias:
427 :param parent_id:
432 :param parent_id:
428 :param clone_uri:
433 :param clone_uri:
429 """
434 """
430 from rhodecode.lib.utils import is_valid_repo, is_valid_repos_group
435 from rhodecode.lib.utils import is_valid_repo, is_valid_repos_group
431
436
432 if new_parent_id:
437 if new_parent_id:
433 paths = RepoGroup.get(new_parent_id)\
438 paths = RepoGroup.get(new_parent_id)\
434 .full_path.split(RepoGroup.url_sep())
439 .full_path.split(RepoGroup.url_sep())
435 new_parent_path = os.sep.join(paths)
440 new_parent_path = os.sep.join(paths)
436 else:
441 else:
437 new_parent_path = ''
442 new_parent_path = ''
438
443
439 # we need to make it str for mercurial
444 # we need to make it str for mercurial
440 repo_path = os.path.join(*map(lambda x: safe_str(x),
445 repo_path = os.path.join(*map(lambda x: safe_str(x),
441 [self.repos_path, new_parent_path, repo_name]))
446 [self.repos_path, new_parent_path, repo_name]))
442
447
443 # check if this path is not a repository
448 # check if this path is not a repository
444 if is_valid_repo(repo_path, self.repos_path):
449 if is_valid_repo(repo_path, self.repos_path):
445 raise Exception('This path %s is a valid repository' % repo_path)
450 raise Exception('This path %s is a valid repository' % repo_path)
446
451
447 # check if this path is a group
452 # check if this path is a group
448 if is_valid_repos_group(repo_path, self.repos_path):
453 if is_valid_repos_group(repo_path, self.repos_path):
449 raise Exception('This path %s is a valid group' % repo_path)
454 raise Exception('This path %s is a valid group' % repo_path)
450
455
451 log.info('creating repo %s in %s @ %s' % (
456 log.info('creating repo %s in %s @ %s' % (
452 repo_name, safe_unicode(repo_path), clone_uri
457 repo_name, safe_unicode(repo_path), clone_uri
453 )
458 )
454 )
459 )
455 backend = get_backend(alias)
460 backend = get_backend(alias)
456
461
457 backend(repo_path, create=True, src_url=clone_uri)
462 backend(repo_path, create=True, src_url=clone_uri)
458
463
459 def __rename_repo(self, old, new):
464 def __rename_repo(self, old, new):
460 """
465 """
461 renames repository on filesystem
466 renames repository on filesystem
462
467
463 :param old: old name
468 :param old: old name
464 :param new: new name
469 :param new: new name
465 """
470 """
466 log.info('renaming repo from %s to %s' % (old, new))
471 log.info('renaming repo from %s to %s' % (old, new))
467
472
468 old_path = os.path.join(self.repos_path, old)
473 old_path = os.path.join(self.repos_path, old)
469 new_path = os.path.join(self.repos_path, new)
474 new_path = os.path.join(self.repos_path, new)
470 if os.path.isdir(new_path):
475 if os.path.isdir(new_path):
471 raise Exception(
476 raise Exception(
472 'Was trying to rename to already existing dir %s' % new_path
477 'Was trying to rename to already existing dir %s' % new_path
473 )
478 )
474 shutil.move(old_path, new_path)
479 shutil.move(old_path, new_path)
475
480
476 def __delete_repo(self, repo):
481 def __delete_repo(self, repo):
477 """
482 """
478 removes repo from filesystem, the removal is acctually made by
483 removes repo from filesystem, the removal is acctually made by
479 added rm__ prefix into dir, and rename internat .hg/.git dirs so this
484 added rm__ prefix into dir, and rename internat .hg/.git dirs so this
480 repository is no longer valid for rhodecode, can be undeleted later on
485 repository is no longer valid for rhodecode, can be undeleted later on
481 by reverting the renames on this repository
486 by reverting the renames on this repository
482
487
483 :param repo: repo object
488 :param repo: repo object
484 """
489 """
485 rm_path = os.path.join(self.repos_path, repo.repo_name)
490 rm_path = os.path.join(self.repos_path, repo.repo_name)
486 log.info("Removing %s" % (rm_path))
491 log.info("Removing %s" % (rm_path))
487 # disable hg/git
492 # disable hg/git
488 alias = repo.repo_type
493 alias = repo.repo_type
489 shutil.move(os.path.join(rm_path, '.%s' % alias),
494 shutil.move(os.path.join(rm_path, '.%s' % alias),
490 os.path.join(rm_path, 'rm__.%s' % alias))
495 os.path.join(rm_path, 'rm__.%s' % alias))
491 # disable repo
496 # disable repo
492 _d = 'rm__%s__%s' % (datetime.now().strftime('%Y%m%d_%H%M%S_%f'),
497 _d = 'rm__%s__%s' % (datetime.now().strftime('%Y%m%d_%H%M%S_%f'),
493 repo.repo_name)
498 repo.repo_name)
494 shutil.move(rm_path, os.path.join(self.repos_path, _d))
499 shutil.move(rm_path, os.path.join(self.repos_path, _d))
@@ -1,4353 +1,4360 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 {
2 {
3 border: 0;
3 border: 0;
4 outline: 0;
4 outline: 0;
5 font-size: 100%;
5 font-size: 100%;
6 vertical-align: baseline;
6 vertical-align: baseline;
7 background: transparent;
7 background: transparent;
8 margin: 0;
8 margin: 0;
9 padding: 0;
9 padding: 0;
10 }
10 }
11
11
12 body {
12 body {
13 line-height: 1;
13 line-height: 1;
14 height: 100%;
14 height: 100%;
15 background: url("../images/background.png") repeat scroll 0 0 #B0B0B0;
15 background: url("../images/background.png") repeat scroll 0 0 #B0B0B0;
16 font-family: Lucida Grande, Verdana, Lucida Sans Regular,
16 font-family: Lucida Grande, Verdana, Lucida Sans Regular,
17 Lucida Sans Unicode, Arial, sans-serif; font-size : 12px;
17 Lucida Sans Unicode, Arial, sans-serif; font-size : 12px;
18 color: #000;
18 color: #000;
19 margin: 0;
19 margin: 0;
20 padding: 0;
20 padding: 0;
21 font-size: 12px;
21 font-size: 12px;
22 }
22 }
23
23
24 ol,ul {
24 ol,ul {
25 list-style: none;
25 list-style: none;
26 }
26 }
27
27
28 blockquote,q {
28 blockquote,q {
29 quotes: none;
29 quotes: none;
30 }
30 }
31
31
32 blockquote:before,blockquote:after,q:before,q:after {
32 blockquote:before,blockquote:after,q:before,q:after {
33 content: none;
33 content: none;
34 }
34 }
35
35
36 :focus {
36 :focus {
37 outline: 0;
37 outline: 0;
38 }
38 }
39
39
40 del {
40 del {
41 text-decoration: line-through;
41 text-decoration: line-through;
42 }
42 }
43
43
44 table {
44 table {
45 border-collapse: collapse;
45 border-collapse: collapse;
46 border-spacing: 0;
46 border-spacing: 0;
47 }
47 }
48
48
49 html {
49 html {
50 height: 100%;
50 height: 100%;
51 }
51 }
52
52
53 a {
53 a {
54 color: #003367;
54 color: #003367;
55 text-decoration: none;
55 text-decoration: none;
56 cursor: pointer;
56 cursor: pointer;
57 }
57 }
58
58
59 a:hover {
59 a:hover {
60 color: #316293;
60 color: #316293;
61 text-decoration: underline;
61 text-decoration: underline;
62 }
62 }
63
63
64 h1,h2,h3,h4,h5,h6 {
64 h1,h2,h3,h4,h5,h6 {
65 color: #292929;
65 color: #292929;
66 font-weight: 700;
66 font-weight: 700;
67 }
67 }
68
68
69 h1 {
69 h1 {
70 font-size: 22px;
70 font-size: 22px;
71 }
71 }
72
72
73 h2 {
73 h2 {
74 font-size: 20px;
74 font-size: 20px;
75 }
75 }
76
76
77 h3 {
77 h3 {
78 font-size: 18px;
78 font-size: 18px;
79 }
79 }
80
80
81 h4 {
81 h4 {
82 font-size: 16px;
82 font-size: 16px;
83 }
83 }
84
84
85 h5 {
85 h5 {
86 font-size: 14px;
86 font-size: 14px;
87 }
87 }
88
88
89 h6 {
89 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 -moz-border-radius-topleft: 8px;
163 -moz-border-radius-topleft: 8px;
164 border-top-left-radius: 8px;
164 border-top-left-radius: 8px;
165 }
165 }
166
166
167 .top-right-rounded-corner {
167 .top-right-rounded-corner {
168 -webkit-border-top-right-radius: 8px;
168 -webkit-border-top-right-radius: 8px;
169 -khtml-border-radius-topright: 8px;
169 -khtml-border-radius-topright: 8px;
170 -moz-border-radius-topright: 8px;
170 -moz-border-radius-topright: 8px;
171 border-top-right-radius: 8px;
171 border-top-right-radius: 8px;
172 }
172 }
173
173
174 .bottom-left-rounded-corner {
174 .bottom-left-rounded-corner {
175 -webkit-border-bottom-left-radius: 8px;
175 -webkit-border-bottom-left-radius: 8px;
176 -khtml-border-radius-bottomleft: 8px;
176 -khtml-border-radius-bottomleft: 8px;
177 -moz-border-radius-bottomleft: 8px;
177 -moz-border-radius-bottomleft: 8px;
178 border-bottom-left-radius: 8px;
178 border-bottom-left-radius: 8px;
179 }
179 }
180
180
181 .bottom-right-rounded-corner {
181 .bottom-right-rounded-corner {
182 -webkit-border-bottom-right-radius: 8px;
182 -webkit-border-bottom-right-radius: 8px;
183 -khtml-border-radius-bottomright: 8px;
183 -khtml-border-radius-bottomright: 8px;
184 -moz-border-radius-bottomright: 8px;
184 -moz-border-radius-bottomright: 8px;
185 border-bottom-right-radius: 8px;
185 border-bottom-right-radius: 8px;
186 }
186 }
187
187
188 .top-left-rounded-corner-mid {
188 .top-left-rounded-corner-mid {
189 -webkit-border-top-left-radius: 4px;
189 -webkit-border-top-left-radius: 4px;
190 -khtml-border-radius-topleft: 4px;
190 -khtml-border-radius-topleft: 4px;
191 -moz-border-radius-topleft: 4px;
191 -moz-border-radius-topleft: 4px;
192 border-top-left-radius: 4px;
192 border-top-left-radius: 4px;
193 }
193 }
194
194
195 .top-right-rounded-corner-mid {
195 .top-right-rounded-corner-mid {
196 -webkit-border-top-right-radius: 4px;
196 -webkit-border-top-right-radius: 4px;
197 -khtml-border-radius-topright: 4px;
197 -khtml-border-radius-topright: 4px;
198 -moz-border-radius-topright: 4px;
198 -moz-border-radius-topright: 4px;
199 border-top-right-radius: 4px;
199 border-top-right-radius: 4px;
200 }
200 }
201
201
202 .bottom-left-rounded-corner-mid {
202 .bottom-left-rounded-corner-mid {
203 -webkit-border-bottom-left-radius: 4px;
203 -webkit-border-bottom-left-radius: 4px;
204 -khtml-border-radius-bottomleft: 4px;
204 -khtml-border-radius-bottomleft: 4px;
205 -moz-border-radius-bottomleft: 4px;
205 -moz-border-radius-bottomleft: 4px;
206 border-bottom-left-radius: 4px;
206 border-bottom-left-radius: 4px;
207 }
207 }
208
208
209 .bottom-right-rounded-corner-mid {
209 .bottom-right-rounded-corner-mid {
210 -webkit-border-bottom-right-radius: 4px;
210 -webkit-border-bottom-right-radius: 4px;
211 -khtml-border-radius-bottomright: 4px;
211 -khtml-border-radius-bottomright: 4px;
212 -moz-border-radius-bottomright: 4px;
212 -moz-border-radius-bottomright: 4px;
213 border-bottom-right-radius: 4px;
213 border-bottom-right-radius: 4px;
214 }
214 }
215
215
216 .help-block {
216 .help-block {
217 color: #999999;
217 color: #999999;
218 display: block;
218 display: block;
219 margin-bottom: 0;
219 margin-bottom: 0;
220 margin-top: 5px;
220 margin-top: 5px;
221 }
221 }
222
222
223 #header {
223 #header {
224 margin: 0;
224 margin: 0;
225 padding: 0 10px;
225 padding: 0 10px;
226 }
226 }
227
227
228 #header ul#logged-user {
228 #header ul#logged-user {
229 margin-bottom: 5px !important;
229 margin-bottom: 5px !important;
230 -webkit-border-radius: 0px 0px 8px 8px;
230 -webkit-border-radius: 0px 0px 8px 8px;
231 -khtml-border-radius: 0px 0px 8px 8px;
231 -khtml-border-radius: 0px 0px 8px 8px;
232 -moz-border-radius: 0px 0px 8px 8px;
232 -moz-border-radius: 0px 0px 8px 8px;
233 border-radius: 0px 0px 8px 8px;
233 border-radius: 0px 0px 8px 8px;
234 height: 37px;
234 height: 37px;
235 background-color: #eedc94;
235 background-color: #eedc94;
236 background-repeat: repeat-x;
236 background-repeat: repeat-x;
237 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),
237 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),
238 to(#eedc94) );
238 to(#eedc94) );
239 background-image: -moz-linear-gradient(top, #003b76, #00376e);
239 background-image: -moz-linear-gradient(top, #003b76, #00376e);
240 background-image: -ms-linear-gradient(top, #003b76, #00376e);
240 background-image: -ms-linear-gradient(top, #003b76, #00376e);
241 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
241 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
242 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
242 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
243 background-image: -o-linear-gradient(top, #003b76, #00376e);
243 background-image: -o-linear-gradient(top, #003b76, #00376e);
244 background-image: linear-gradient(top, #003b76, #00376e);
244 background-image: linear-gradient(top, #003b76, #00376e);
245 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
245 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
246 endColorstr='#00376e', GradientType=0 );
246 endColorstr='#00376e', GradientType=0 );
247 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
247 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
248 }
248 }
249
249
250 #header ul#logged-user li {
250 #header ul#logged-user li {
251 list-style: none;
251 list-style: none;
252 float: left;
252 float: left;
253 margin: 8px 0 0;
253 margin: 8px 0 0;
254 padding: 4px 12px;
254 padding: 4px 12px;
255 border-left: 1px solid #316293;
255 border-left: 1px solid #316293;
256 }
256 }
257
257
258 #header ul#logged-user li.first {
258 #header ul#logged-user li.first {
259 border-left: none;
259 border-left: none;
260 margin: 4px;
260 margin: 4px;
261 }
261 }
262
262
263 #header ul#logged-user li.first div.gravatar {
263 #header ul#logged-user li.first div.gravatar {
264 margin-top: -2px;
264 margin-top: -2px;
265 }
265 }
266
266
267 #header ul#logged-user li.first div.account {
267 #header ul#logged-user li.first div.account {
268 padding-top: 4px;
268 padding-top: 4px;
269 float: left;
269 float: left;
270 }
270 }
271
271
272 #header ul#logged-user li.last {
272 #header ul#logged-user li.last {
273 border-right: none;
273 border-right: none;
274 }
274 }
275
275
276 #header ul#logged-user li a {
276 #header ul#logged-user li a {
277 color: #fff;
277 color: #fff;
278 font-weight: 700;
278 font-weight: 700;
279 text-decoration: none;
279 text-decoration: none;
280 }
280 }
281
281
282 #header ul#logged-user li a:hover {
282 #header ul#logged-user li a:hover {
283 text-decoration: underline;
283 text-decoration: underline;
284 }
284 }
285
285
286 #header ul#logged-user li.highlight a {
286 #header ul#logged-user li.highlight a {
287 color: #fff;
287 color: #fff;
288 }
288 }
289
289
290 #header ul#logged-user li.highlight a:hover {
290 #header ul#logged-user li.highlight a:hover {
291 color: #FFF;
291 color: #FFF;
292 }
292 }
293
293
294 #header #header-inner {
294 #header #header-inner {
295 min-height: 44px;
295 min-height: 44px;
296 clear: both;
296 clear: both;
297 position: relative;
297 position: relative;
298 background-color: #eedc94;
298 background-color: #eedc94;
299 background-repeat: repeat-x;
299 background-repeat: repeat-x;
300 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),to(#eedc94) );
300 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),to(#eedc94) );
301 background-image: -moz-linear-gradient(top, #003b76, #00376e);
301 background-image: -moz-linear-gradient(top, #003b76, #00376e);
302 background-image: -ms-linear-gradient(top, #003b76, #00376e);
302 background-image: -ms-linear-gradient(top, #003b76, #00376e);
303 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76),color-stop(100%, #00376e) );
303 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76),color-stop(100%, #00376e) );
304 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
304 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
305 background-image: -o-linear-gradient(top, #003b76, #00376e);
305 background-image: -o-linear-gradient(top, #003b76, #00376e);
306 background-image: linear-gradient(top, #003b76, #00376e);
306 background-image: linear-gradient(top, #003b76, #00376e);
307 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
307 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
308 margin: 0;
308 margin: 0;
309 padding: 0;
309 padding: 0;
310 display: block;
310 display: block;
311 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
311 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
312 -webkit-border-radius: 4px 4px 4px 4px;
312 -webkit-border-radius: 4px 4px 4px 4px;
313 -khtml-border-radius: 4px 4px 4px 4px;
313 -khtml-border-radius: 4px 4px 4px 4px;
314 -moz-border-radius: 4px 4px 4px 4px;
314 -moz-border-radius: 4px 4px 4px 4px;
315 border-radius: 4px 4px 4px 4px;
315 border-radius: 4px 4px 4px 4px;
316 }
316 }
317 #header #header-inner.hover{
317 #header #header-inner.hover{
318 position: fixed !important;
318 position: fixed !important;
319 width: 100% !important;
319 width: 100% !important;
320 margin-left: -10px !important;
320 margin-left: -10px !important;
321 z-index: 10000;
321 z-index: 10000;
322 -webkit-border-radius: 0px 0px 0px 0px;
322 -webkit-border-radius: 0px 0px 0px 0px;
323 -khtml-border-radius: 0px 0px 0px 0px;
323 -khtml-border-radius: 0px 0px 0px 0px;
324 -moz-border-radius: 0px 0px 0px 0px;
324 -moz-border-radius: 0px 0px 0px 0px;
325 border-radius: 0px 0px 0px 0px;
325 border-radius: 0px 0px 0px 0px;
326 }
326 }
327 #header #header-inner #home a {
327 #header #header-inner #home a {
328 height: 40px;
328 height: 40px;
329 width: 46px;
329 width: 46px;
330 display: block;
330 display: block;
331 background: url("../images/button_home.png");
331 background: url("../images/button_home.png");
332 background-position: 0 0;
332 background-position: 0 0;
333 margin: 0;
333 margin: 0;
334 padding: 0;
334 padding: 0;
335 }
335 }
336
336
337 #header #header-inner #home a:hover {
337 #header #header-inner #home a:hover {
338 background-position: 0 -40px;
338 background-position: 0 -40px;
339 }
339 }
340
340
341 #header #header-inner #logo {
341 #header #header-inner #logo {
342 float: left;
342 float: left;
343 position: absolute;
343 position: absolute;
344 }
344 }
345
345
346 #header #header-inner #logo h1 {
346 #header #header-inner #logo h1 {
347 color: #FFF;
347 color: #FFF;
348 font-size: 20px;
348 font-size: 20px;
349 margin: 12px 0 0 13px;
349 margin: 12px 0 0 13px;
350 padding: 0;
350 padding: 0;
351 }
351 }
352
352
353 #header #header-inner #logo a {
353 #header #header-inner #logo a {
354 color: #fff;
354 color: #fff;
355 text-decoration: none;
355 text-decoration: none;
356 }
356 }
357
357
358 #header #header-inner #logo a:hover {
358 #header #header-inner #logo a:hover {
359 color: #bfe3ff;
359 color: #bfe3ff;
360 }
360 }
361
361
362 #header #header-inner #quick,#header #header-inner #quick ul {
362 #header #header-inner #quick,#header #header-inner #quick ul {
363 position: relative;
363 position: relative;
364 float: right;
364 float: right;
365 list-style-type: none;
365 list-style-type: none;
366 list-style-position: outside;
366 list-style-position: outside;
367 margin: 8px 8px 0 0;
367 margin: 8px 8px 0 0;
368 padding: 0;
368 padding: 0;
369 }
369 }
370
370
371 #header #header-inner #quick li {
371 #header #header-inner #quick li {
372 position: relative;
372 position: relative;
373 float: left;
373 float: left;
374 margin: 0 5px 0 0;
374 margin: 0 5px 0 0;
375 padding: 0;
375 padding: 0;
376 }
376 }
377
377
378 #header #header-inner #quick li a.menu_link {
378 #header #header-inner #quick li a.menu_link {
379 top: 0;
379 top: 0;
380 left: 0;
380 left: 0;
381 height: 1%;
381 height: 1%;
382 display: block;
382 display: block;
383 clear: both;
383 clear: both;
384 overflow: hidden;
384 overflow: hidden;
385 color: #FFF;
385 color: #FFF;
386 font-weight: 700;
386 font-weight: 700;
387 text-decoration: none;
387 text-decoration: none;
388 background: #369;
388 background: #369;
389 padding: 0;
389 padding: 0;
390 -webkit-border-radius: 4px 4px 4px 4px;
390 -webkit-border-radius: 4px 4px 4px 4px;
391 -khtml-border-radius: 4px 4px 4px 4px;
391 -khtml-border-radius: 4px 4px 4px 4px;
392 -moz-border-radius: 4px 4px 4px 4px;
392 -moz-border-radius: 4px 4px 4px 4px;
393 border-radius: 4px 4px 4px 4px;
393 border-radius: 4px 4px 4px 4px;
394 }
394 }
395
395
396 #header #header-inner #quick li span.short {
396 #header #header-inner #quick li span.short {
397 padding: 9px 6px 8px 6px;
397 padding: 9px 6px 8px 6px;
398 }
398 }
399
399
400 #header #header-inner #quick li span {
400 #header #header-inner #quick li span {
401 top: 0;
401 top: 0;
402 right: 0;
402 right: 0;
403 height: 1%;
403 height: 1%;
404 display: block;
404 display: block;
405 float: left;
405 float: left;
406 border-left: 1px solid #3f6f9f;
406 border-left: 1px solid #3f6f9f;
407 margin: 0;
407 margin: 0;
408 padding: 10px 12px 8px 10px;
408 padding: 10px 12px 8px 10px;
409 }
409 }
410
410
411 #header #header-inner #quick li span.normal {
411 #header #header-inner #quick li span.normal {
412 border: none;
412 border: none;
413 padding: 10px 12px 8px;
413 padding: 10px 12px 8px;
414 }
414 }
415
415
416 #header #header-inner #quick li span.icon {
416 #header #header-inner #quick li span.icon {
417 top: 0;
417 top: 0;
418 left: 0;
418 left: 0;
419 border-left: none;
419 border-left: none;
420 border-right: 1px solid #2e5c89;
420 border-right: 1px solid #2e5c89;
421 padding: 8px 6px 4px;
421 padding: 8px 6px 4px;
422 }
422 }
423
423
424 #header #header-inner #quick li span.icon_short {
424 #header #header-inner #quick li span.icon_short {
425 top: 0;
425 top: 0;
426 left: 0;
426 left: 0;
427 border-left: none;
427 border-left: none;
428 border-right: 1px solid #2e5c89;
428 border-right: 1px solid #2e5c89;
429 padding: 8px 6px 4px;
429 padding: 8px 6px 4px;
430 }
430 }
431
431
432 #header #header-inner #quick li span.icon img,#header #header-inner #quick li span.icon_short img
432 #header #header-inner #quick li span.icon img,#header #header-inner #quick li span.icon_short img
433 {
433 {
434 margin: 0px -2px 0px 0px;
434 margin: 0px -2px 0px 0px;
435 }
435 }
436
436
437 #header #header-inner #quick li a:hover {
437 #header #header-inner #quick li a:hover {
438 background: #4e4e4e no-repeat top left;
438 background: #4e4e4e no-repeat top left;
439 }
439 }
440
440
441 #header #header-inner #quick li a:hover span {
441 #header #header-inner #quick li a:hover span {
442 border-left: 1px solid #545454;
442 border-left: 1px solid #545454;
443 }
443 }
444
444
445 #header #header-inner #quick li a:hover span.icon,#header #header-inner #quick li a:hover span.icon_short
445 #header #header-inner #quick li a:hover span.icon,#header #header-inner #quick li a:hover span.icon_short
446 {
446 {
447 border-left: none;
447 border-left: none;
448 border-right: 1px solid #464646;
448 border-right: 1px solid #464646;
449 }
449 }
450
450
451 #header #header-inner #quick ul {
451 #header #header-inner #quick ul {
452 top: 29px;
452 top: 29px;
453 right: 0;
453 right: 0;
454 min-width: 200px;
454 min-width: 200px;
455 display: none;
455 display: none;
456 position: absolute;
456 position: absolute;
457 background: #FFF;
457 background: #FFF;
458 border: 1px solid #666;
458 border: 1px solid #666;
459 border-top: 1px solid #003367;
459 border-top: 1px solid #003367;
460 z-index: 100;
460 z-index: 100;
461 margin: 0px 0px 0px 0px;
461 margin: 0px 0px 0px 0px;
462 padding: 0;
462 padding: 0;
463 }
463 }
464
464
465 #header #header-inner #quick ul.repo_switcher {
465 #header #header-inner #quick ul.repo_switcher {
466 max-height: 275px;
466 max-height: 275px;
467 overflow-x: hidden;
467 overflow-x: hidden;
468 overflow-y: auto;
468 overflow-y: auto;
469 }
469 }
470
470
471 #header #header-inner #quick ul.repo_switcher li.qfilter_rs {
471 #header #header-inner #quick ul.repo_switcher li.qfilter_rs {
472 float: none;
472 float: none;
473 margin: 0;
473 margin: 0;
474 border-bottom: 2px solid #003367;
474 border-bottom: 2px solid #003367;
475 }
475 }
476
476
477 #header #header-inner #quick .repo_switcher_type {
477 #header #header-inner #quick .repo_switcher_type {
478 position: absolute;
478 position: absolute;
479 left: 0;
479 left: 0;
480 top: 9px;
480 top: 9px;
481 }
481 }
482
482
483 #header #header-inner #quick li ul li {
483 #header #header-inner #quick li ul li {
484 border-bottom: 1px solid #ddd;
484 border-bottom: 1px solid #ddd;
485 }
485 }
486
486
487 #header #header-inner #quick li ul li a {
487 #header #header-inner #quick li ul li a {
488 width: 182px;
488 width: 182px;
489 height: auto;
489 height: auto;
490 display: block;
490 display: block;
491 float: left;
491 float: left;
492 background: #FFF;
492 background: #FFF;
493 color: #003367;
493 color: #003367;
494 font-weight: 400;
494 font-weight: 400;
495 margin: 0;
495 margin: 0;
496 padding: 7px 9px;
496 padding: 7px 9px;
497 }
497 }
498
498
499 #header #header-inner #quick li ul li a:hover {
499 #header #header-inner #quick li ul li a:hover {
500 color: #000;
500 color: #000;
501 background: #FFF;
501 background: #FFF;
502 }
502 }
503
503
504 #header #header-inner #quick ul ul {
504 #header #header-inner #quick ul ul {
505 top: auto;
505 top: auto;
506 }
506 }
507
507
508 #header #header-inner #quick li ul ul {
508 #header #header-inner #quick li ul ul {
509 right: 200px;
509 right: 200px;
510 max-height: 275px;
510 max-height: 275px;
511 overflow: auto;
511 overflow: auto;
512 overflow-x: hidden;
512 overflow-x: hidden;
513 white-space: normal;
513 white-space: normal;
514 }
514 }
515
515
516 #header #header-inner #quick li ul li a.journal,#header #header-inner #quick li ul li a.journal:hover
516 #header #header-inner #quick li ul li a.journal,#header #header-inner #quick li ul li a.journal:hover
517 {
517 {
518 background: url("../images/icons/book.png") no-repeat scroll 4px 9px
518 background: url("../images/icons/book.png") no-repeat scroll 4px 9px
519 #FFF;
519 #FFF;
520 width: 167px;
520 width: 167px;
521 margin: 0;
521 margin: 0;
522 padding: 12px 9px 7px 24px;
522 padding: 12px 9px 7px 24px;
523 }
523 }
524
524
525 #header #header-inner #quick li ul li a.private_repo,#header #header-inner #quick li ul li a.private_repo:hover
525 #header #header-inner #quick li ul li a.private_repo,#header #header-inner #quick li ul li a.private_repo:hover
526 {
526 {
527 background: url("../images/icons/lock.png") no-repeat scroll 4px 9px
527 background: url("../images/icons/lock.png") no-repeat scroll 4px 9px
528 #FFF;
528 #FFF;
529 min-width: 167px;
529 min-width: 167px;
530 margin: 0;
530 margin: 0;
531 padding: 12px 9px 7px 24px;
531 padding: 12px 9px 7px 24px;
532 }
532 }
533
533
534 #header #header-inner #quick li ul li a.public_repo,#header #header-inner #quick li ul li a.public_repo:hover
534 #header #header-inner #quick li ul li a.public_repo,#header #header-inner #quick li ul li a.public_repo:hover
535 {
535 {
536 background: url("../images/icons/lock_open.png") no-repeat scroll 4px
536 background: url("../images/icons/lock_open.png") no-repeat scroll 4px
537 9px #FFF;
537 9px #FFF;
538 min-width: 167px;
538 min-width: 167px;
539 margin: 0;
539 margin: 0;
540 padding: 12px 9px 7px 24px;
540 padding: 12px 9px 7px 24px;
541 }
541 }
542
542
543 #header #header-inner #quick li ul li a.hg,#header #header-inner #quick li ul li a.hg:hover
543 #header #header-inner #quick li ul li a.hg,#header #header-inner #quick li ul li a.hg:hover
544 {
544 {
545 background: url("../images/icons/hgicon.png") no-repeat scroll 4px 9px
545 background: url("../images/icons/hgicon.png") no-repeat scroll 4px 9px
546 #FFF;
546 #FFF;
547 min-width: 167px;
547 min-width: 167px;
548 margin: 0 0 0 14px;
548 margin: 0 0 0 14px;
549 padding: 12px 9px 7px 24px;
549 padding: 12px 9px 7px 24px;
550 }
550 }
551
551
552 #header #header-inner #quick li ul li a.git,#header #header-inner #quick li ul li a.git:hover
552 #header #header-inner #quick li ul li a.git,#header #header-inner #quick li ul li a.git:hover
553 {
553 {
554 background: url("../images/icons/giticon.png") no-repeat scroll 4px 9px
554 background: url("../images/icons/giticon.png") no-repeat scroll 4px 9px
555 #FFF;
555 #FFF;
556 min-width: 167px;
556 min-width: 167px;
557 margin: 0 0 0 14px;
557 margin: 0 0 0 14px;
558 padding: 12px 9px 7px 24px;
558 padding: 12px 9px 7px 24px;
559 }
559 }
560
560
561 #header #header-inner #quick li ul li a.repos,#header #header-inner #quick li ul li a.repos:hover
561 #header #header-inner #quick li ul li a.repos,#header #header-inner #quick li ul li a.repos:hover
562 {
562 {
563 background: url("../images/icons/database_edit.png") no-repeat scroll
563 background: url("../images/icons/database_edit.png") no-repeat scroll
564 4px 9px #FFF;
564 4px 9px #FFF;
565 width: 167px;
565 width: 167px;
566 margin: 0;
566 margin: 0;
567 padding: 12px 9px 7px 24px;
567 padding: 12px 9px 7px 24px;
568 }
568 }
569
569
570 #header #header-inner #quick li ul li a.repos_groups,#header #header-inner #quick li ul li a.repos_groups:hover
570 #header #header-inner #quick li ul li a.repos_groups,#header #header-inner #quick li ul li a.repos_groups:hover
571 {
571 {
572 background: url("../images/icons/database_link.png") no-repeat scroll
572 background: url("../images/icons/database_link.png") no-repeat scroll
573 4px 9px #FFF;
573 4px 9px #FFF;
574 width: 167px;
574 width: 167px;
575 margin: 0;
575 margin: 0;
576 padding: 12px 9px 7px 24px;
576 padding: 12px 9px 7px 24px;
577 }
577 }
578
578
579 #header #header-inner #quick li ul li a.users,#header #header-inner #quick li ul li a.users:hover
579 #header #header-inner #quick li ul li a.users,#header #header-inner #quick li ul li a.users:hover
580 {
580 {
581 background: #FFF url("../images/icons/user_edit.png") no-repeat 4px 9px;
581 background: #FFF url("../images/icons/user_edit.png") no-repeat 4px 9px;
582 width: 167px;
582 width: 167px;
583 margin: 0;
583 margin: 0;
584 padding: 12px 9px 7px 24px;
584 padding: 12px 9px 7px 24px;
585 }
585 }
586
586
587 #header #header-inner #quick li ul li a.groups,#header #header-inner #quick li ul li a.groups:hover
587 #header #header-inner #quick li ul li a.groups,#header #header-inner #quick li ul li a.groups:hover
588 {
588 {
589 background: #FFF url("../images/icons/group_edit.png") no-repeat 4px 9px;
589 background: #FFF url("../images/icons/group_edit.png") no-repeat 4px 9px;
590 width: 167px;
590 width: 167px;
591 margin: 0;
591 margin: 0;
592 padding: 12px 9px 7px 24px;
592 padding: 12px 9px 7px 24px;
593 }
593 }
594
594
595 #header #header-inner #quick li ul li a.settings,#header #header-inner #quick li ul li a.settings:hover
595 #header #header-inner #quick li ul li a.settings,#header #header-inner #quick li ul li a.settings:hover
596 {
596 {
597 background: #FFF url("../images/icons/cog.png") no-repeat 4px 9px;
597 background: #FFF url("../images/icons/cog.png") no-repeat 4px 9px;
598 width: 167px;
598 width: 167px;
599 margin: 0;
599 margin: 0;
600 padding: 12px 9px 7px 24px;
600 padding: 12px 9px 7px 24px;
601 }
601 }
602
602
603 #header #header-inner #quick li ul li a.permissions,#header #header-inner #quick li ul li a.permissions:hover
603 #header #header-inner #quick li ul li a.permissions,#header #header-inner #quick li ul li a.permissions:hover
604 {
604 {
605 background: #FFF url("../images/icons/key.png") no-repeat 4px 9px;
605 background: #FFF url("../images/icons/key.png") no-repeat 4px 9px;
606 width: 167px;
606 width: 167px;
607 margin: 0;
607 margin: 0;
608 padding: 12px 9px 7px 24px;
608 padding: 12px 9px 7px 24px;
609 }
609 }
610
610
611 #header #header-inner #quick li ul li a.ldap,#header #header-inner #quick li ul li a.ldap:hover
611 #header #header-inner #quick li ul li a.ldap,#header #header-inner #quick li ul li a.ldap:hover
612 {
612 {
613 background: #FFF url("../images/icons/server_key.png") no-repeat 4px 9px;
613 background: #FFF url("../images/icons/server_key.png") no-repeat 4px 9px;
614 width: 167px;
614 width: 167px;
615 margin: 0;
615 margin: 0;
616 padding: 12px 9px 7px 24px;
616 padding: 12px 9px 7px 24px;
617 }
617 }
618
618
619 #header #header-inner #quick li ul li a.fork,#header #header-inner #quick li ul li a.fork:hover
619 #header #header-inner #quick li ul li a.fork,#header #header-inner #quick li ul li a.fork:hover
620 {
620 {
621 background: #FFF url("../images/icons/arrow_divide.png") no-repeat 4px
621 background: #FFF url("../images/icons/arrow_divide.png") no-repeat 4px
622 9px;
622 9px;
623 width: 167px;
623 width: 167px;
624 margin: 0;
624 margin: 0;
625 padding: 12px 9px 7px 24px;
625 padding: 12px 9px 7px 24px;
626 }
626 }
627
627
628 #header #header-inner #quick li ul li a.search,#header #header-inner #quick li ul li a.search:hover
628 #header #header-inner #quick li ul li a.search,#header #header-inner #quick li ul li a.search:hover
629 {
629 {
630 background: #FFF url("../images/icons/search_16.png") no-repeat 4px 9px;
630 background: #FFF url("../images/icons/search_16.png") no-repeat 4px 9px;
631 width: 167px;
631 width: 167px;
632 margin: 0;
632 margin: 0;
633 padding: 12px 9px 7px 24px;
633 padding: 12px 9px 7px 24px;
634 }
634 }
635
635
636 #header #header-inner #quick li ul li a.delete,#header #header-inner #quick li ul li a.delete:hover
636 #header #header-inner #quick li ul li a.delete,#header #header-inner #quick li ul li a.delete:hover
637 {
637 {
638 background: #FFF url("../images/icons/delete.png") no-repeat 4px 9px;
638 background: #FFF url("../images/icons/delete.png") no-repeat 4px 9px;
639 width: 167px;
639 width: 167px;
640 margin: 0;
640 margin: 0;
641 padding: 12px 9px 7px 24px;
641 padding: 12px 9px 7px 24px;
642 }
642 }
643
643
644 #header #header-inner #quick li ul li a.branches,#header #header-inner #quick li ul li a.branches:hover
644 #header #header-inner #quick li ul li a.branches,#header #header-inner #quick li ul li a.branches:hover
645 {
645 {
646 background: #FFF url("../images/icons/arrow_branch.png") no-repeat 4px
646 background: #FFF url("../images/icons/arrow_branch.png") no-repeat 4px
647 9px;
647 9px;
648 width: 167px;
648 width: 167px;
649 margin: 0;
649 margin: 0;
650 padding: 12px 9px 7px 24px;
650 padding: 12px 9px 7px 24px;
651 }
651 }
652
652
653 #header #header-inner #quick li ul li a.tags,
653 #header #header-inner #quick li ul li a.tags,
654 #header #header-inner #quick li ul li a.tags:hover{
654 #header #header-inner #quick li ul li a.tags:hover{
655 background: #FFF url("../images/icons/tag_blue.png") no-repeat 4px 9px;
655 background: #FFF url("../images/icons/tag_blue.png") no-repeat 4px 9px;
656 width: 167px;
656 width: 167px;
657 margin: 0;
657 margin: 0;
658 padding: 12px 9px 7px 24px;
658 padding: 12px 9px 7px 24px;
659 }
659 }
660
660
661 #header #header-inner #quick li ul li a.bookmarks,
661 #header #header-inner #quick li ul li a.bookmarks,
662 #header #header-inner #quick li ul li a.bookmarks:hover{
662 #header #header-inner #quick li ul li a.bookmarks:hover{
663 background: #FFF url("../images/icons/tag_green.png") no-repeat 4px 9px;
663 background: #FFF url("../images/icons/tag_green.png") no-repeat 4px 9px;
664 width: 167px;
664 width: 167px;
665 margin: 0;
665 margin: 0;
666 padding: 12px 9px 7px 24px;
666 padding: 12px 9px 7px 24px;
667 }
667 }
668
668
669 #header #header-inner #quick li ul li a.admin,
669 #header #header-inner #quick li ul li a.admin,
670 #header #header-inner #quick li ul li a.admin:hover{
670 #header #header-inner #quick li ul li a.admin:hover{
671 background: #FFF url("../images/icons/cog_edit.png") no-repeat 4px 9px;
671 background: #FFF url("../images/icons/cog_edit.png") no-repeat 4px 9px;
672 width: 167px;
672 width: 167px;
673 margin: 0;
673 margin: 0;
674 padding: 12px 9px 7px 24px;
674 padding: 12px 9px 7px 24px;
675 }
675 }
676
676
677 .groups_breadcrumbs a {
677 .groups_breadcrumbs a {
678 color: #fff;
678 color: #fff;
679 }
679 }
680
680
681 .groups_breadcrumbs a:hover {
681 .groups_breadcrumbs a:hover {
682 color: #bfe3ff;
682 color: #bfe3ff;
683 text-decoration: none;
683 text-decoration: none;
684 }
684 }
685
685
686 td.quick_repo_menu {
686 td.quick_repo_menu {
687 background: #FFF url("../images/vertical-indicator.png") 8px 50% no-repeat !important;
687 background: #FFF url("../images/vertical-indicator.png") 8px 50% no-repeat !important;
688 cursor: pointer;
688 cursor: pointer;
689 width: 8px;
689 width: 8px;
690 border: 1px solid transparent;
690 border: 1px solid transparent;
691 }
691 }
692
692
693 td.quick_repo_menu.active {
693 td.quick_repo_menu.active {
694 background: url("../images/dt-arrow-dn.png") no-repeat scroll 5px 50% #FFFFFF !important;
694 background: url("../images/dt-arrow-dn.png") no-repeat scroll 5px 50% #FFFFFF !important;
695 border: 1px solid #003367;
695 border: 1px solid #003367;
696 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
696 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
697 cursor: pointer;
697 cursor: pointer;
698 }
698 }
699
699
700 td.quick_repo_menu .menu_items {
700 td.quick_repo_menu .menu_items {
701 margin-top: 10px;
701 margin-top: 10px;
702 margin-left:-6px;
702 margin-left:-6px;
703 width: 150px;
703 width: 150px;
704 position: absolute;
704 position: absolute;
705 background-color: #FFF;
705 background-color: #FFF;
706 background: none repeat scroll 0 0 #FFFFFF;
706 background: none repeat scroll 0 0 #FFFFFF;
707 border-color: #003367 #666666 #666666;
707 border-color: #003367 #666666 #666666;
708 border-right: 1px solid #666666;
708 border-right: 1px solid #666666;
709 border-style: solid;
709 border-style: solid;
710 border-width: 1px;
710 border-width: 1px;
711 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
711 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
712 border-top-style: none;
712 border-top-style: none;
713 }
713 }
714
714
715 td.quick_repo_menu .menu_items li {
715 td.quick_repo_menu .menu_items li {
716 padding: 0 !important;
716 padding: 0 !important;
717 }
717 }
718
718
719 td.quick_repo_menu .menu_items a {
719 td.quick_repo_menu .menu_items a {
720 display: block;
720 display: block;
721 padding: 4px 12px 4px 8px;
721 padding: 4px 12px 4px 8px;
722 }
722 }
723
723
724 td.quick_repo_menu .menu_items a:hover {
724 td.quick_repo_menu .menu_items a:hover {
725 background-color: #EEE;
725 background-color: #EEE;
726 text-decoration: none;
726 text-decoration: none;
727 }
727 }
728
728
729 td.quick_repo_menu .menu_items .icon img {
729 td.quick_repo_menu .menu_items .icon img {
730 margin-bottom: -2px;
730 margin-bottom: -2px;
731 }
731 }
732
732
733 td.quick_repo_menu .menu_items.hidden {
733 td.quick_repo_menu .menu_items.hidden {
734 display: none;
734 display: none;
735 }
735 }
736
736
737 .yui-dt-first th {
737 .yui-dt-first th {
738 text-align: left;
738 text-align: left;
739 }
739 }
740
740
741 /*
741 /*
742 Copyright (c) 2011, Yahoo! Inc. All rights reserved.
742 Copyright (c) 2011, Yahoo! Inc. All rights reserved.
743 Code licensed under the BSD License:
743 Code licensed under the BSD License:
744 http://developer.yahoo.com/yui/license.html
744 http://developer.yahoo.com/yui/license.html
745 version: 2.9.0
745 version: 2.9.0
746 */
746 */
747 .yui-skin-sam .yui-dt-mask {
747 .yui-skin-sam .yui-dt-mask {
748 position: absolute;
748 position: absolute;
749 z-index: 9500;
749 z-index: 9500;
750 }
750 }
751 .yui-dt-tmp {
751 .yui-dt-tmp {
752 position: absolute;
752 position: absolute;
753 left: -9000px;
753 left: -9000px;
754 }
754 }
755 .yui-dt-scrollable .yui-dt-bd { overflow: auto }
755 .yui-dt-scrollable .yui-dt-bd { overflow: auto }
756 .yui-dt-scrollable .yui-dt-hd {
756 .yui-dt-scrollable .yui-dt-hd {
757 overflow: hidden;
757 overflow: hidden;
758 position: relative;
758 position: relative;
759 }
759 }
760 .yui-dt-scrollable .yui-dt-bd thead tr,
760 .yui-dt-scrollable .yui-dt-bd thead tr,
761 .yui-dt-scrollable .yui-dt-bd thead th {
761 .yui-dt-scrollable .yui-dt-bd thead th {
762 position: absolute;
762 position: absolute;
763 left: -1500px;
763 left: -1500px;
764 }
764 }
765 .yui-dt-scrollable tbody { -moz-outline: 0 }
765 .yui-dt-scrollable tbody { -moz-outline: 0 }
766 .yui-skin-sam thead .yui-dt-sortable { cursor: pointer }
766 .yui-skin-sam thead .yui-dt-sortable { cursor: pointer }
767 .yui-skin-sam thead .yui-dt-draggable { cursor: move }
767 .yui-skin-sam thead .yui-dt-draggable { cursor: move }
768 .yui-dt-coltarget {
768 .yui-dt-coltarget {
769 position: absolute;
769 position: absolute;
770 z-index: 999;
770 z-index: 999;
771 }
771 }
772 .yui-dt-hd { zoom: 1 }
772 .yui-dt-hd { zoom: 1 }
773 th.yui-dt-resizeable .yui-dt-resizerliner { position: relative }
773 th.yui-dt-resizeable .yui-dt-resizerliner { position: relative }
774 .yui-dt-resizer {
774 .yui-dt-resizer {
775 position: absolute;
775 position: absolute;
776 right: 0;
776 right: 0;
777 bottom: 0;
777 bottom: 0;
778 height: 100%;
778 height: 100%;
779 cursor: e-resize;
779 cursor: e-resize;
780 cursor: col-resize;
780 cursor: col-resize;
781 background-color: #CCC;
781 background-color: #CCC;
782 opacity: 0;
782 opacity: 0;
783 filter: alpha(opacity=0);
783 filter: alpha(opacity=0);
784 }
784 }
785 .yui-dt-resizerproxy {
785 .yui-dt-resizerproxy {
786 visibility: hidden;
786 visibility: hidden;
787 position: absolute;
787 position: absolute;
788 z-index: 9000;
788 z-index: 9000;
789 background-color: #CCC;
789 background-color: #CCC;
790 opacity: 0;
790 opacity: 0;
791 filter: alpha(opacity=0);
791 filter: alpha(opacity=0);
792 }
792 }
793 th.yui-dt-hidden .yui-dt-liner,
793 th.yui-dt-hidden .yui-dt-liner,
794 td.yui-dt-hidden .yui-dt-liner,
794 td.yui-dt-hidden .yui-dt-liner,
795 th.yui-dt-hidden .yui-dt-resizer { display: none }
795 th.yui-dt-hidden .yui-dt-resizer { display: none }
796 .yui-dt-editor,
796 .yui-dt-editor,
797 .yui-dt-editor-shim {
797 .yui-dt-editor-shim {
798 position: absolute;
798 position: absolute;
799 z-index: 9000;
799 z-index: 9000;
800 }
800 }
801 .yui-skin-sam .yui-dt table {
801 .yui-skin-sam .yui-dt table {
802 margin: 0;
802 margin: 0;
803 padding: 0;
803 padding: 0;
804 font-family: arial;
804 font-family: arial;
805 font-size: inherit;
805 font-size: inherit;
806 border-collapse: separate;
806 border-collapse: separate;
807 *border-collapse: collapse;
807 *border-collapse: collapse;
808 border-spacing: 0;
808 border-spacing: 0;
809 border: 1px solid #7f7f7f;
809 border: 1px solid #7f7f7f;
810 }
810 }
811 .yui-skin-sam .yui-dt thead { border-spacing: 0 }
811 .yui-skin-sam .yui-dt thead { border-spacing: 0 }
812 .yui-skin-sam .yui-dt caption {
812 .yui-skin-sam .yui-dt caption {
813 color: #000;
813 color: #000;
814 font-size: 85%;
814 font-size: 85%;
815 font-weight: normal;
815 font-weight: normal;
816 font-style: italic;
816 font-style: italic;
817 line-height: 1;
817 line-height: 1;
818 padding: 1em 0;
818 padding: 1em 0;
819 text-align: center;
819 text-align: center;
820 }
820 }
821 .yui-skin-sam .yui-dt th { background: #d8d8da url(../images/sprite.png) repeat-x 0 0 }
821 .yui-skin-sam .yui-dt th { background: #d8d8da url(../images/sprite.png) repeat-x 0 0 }
822 .yui-skin-sam .yui-dt th,
822 .yui-skin-sam .yui-dt th,
823 .yui-skin-sam .yui-dt th a {
823 .yui-skin-sam .yui-dt th a {
824 font-weight: normal;
824 font-weight: normal;
825 text-decoration: none;
825 text-decoration: none;
826 color: #000;
826 color: #000;
827 vertical-align: bottom;
827 vertical-align: bottom;
828 }
828 }
829 .yui-skin-sam .yui-dt th {
829 .yui-skin-sam .yui-dt th {
830 margin: 0;
830 margin: 0;
831 padding: 0;
831 padding: 0;
832 border: 0;
832 border: 0;
833 border-right: 1px solid #cbcbcb;
833 border-right: 1px solid #cbcbcb;
834 }
834 }
835 .yui-skin-sam .yui-dt tr.yui-dt-first td { border-top: 1px solid #7f7f7f }
835 .yui-skin-sam .yui-dt tr.yui-dt-first td { border-top: 1px solid #7f7f7f }
836 .yui-skin-sam .yui-dt th .yui-dt-liner { white-space: nowrap }
836 .yui-skin-sam .yui-dt th .yui-dt-liner { white-space: nowrap }
837 .yui-skin-sam .yui-dt-liner {
837 .yui-skin-sam .yui-dt-liner {
838 margin: 0;
838 margin: 0;
839 padding: 0;
839 padding: 0;
840 }
840 }
841 .yui-skin-sam .yui-dt-coltarget {
841 .yui-skin-sam .yui-dt-coltarget {
842 width: 5px;
842 width: 5px;
843 background-color: red;
843 background-color: red;
844 }
844 }
845 .yui-skin-sam .yui-dt td {
845 .yui-skin-sam .yui-dt td {
846 margin: 0;
846 margin: 0;
847 padding: 0;
847 padding: 0;
848 border: 0;
848 border: 0;
849 border-right: 1px solid #cbcbcb;
849 border-right: 1px solid #cbcbcb;
850 text-align: left;
850 text-align: left;
851 }
851 }
852 .yui-skin-sam .yui-dt-list td { border-right: 0 }
852 .yui-skin-sam .yui-dt-list td { border-right: 0 }
853 .yui-skin-sam .yui-dt-resizer { width: 6px }
853 .yui-skin-sam .yui-dt-resizer { width: 6px }
854 .yui-skin-sam .yui-dt-mask {
854 .yui-skin-sam .yui-dt-mask {
855 background-color: #000;
855 background-color: #000;
856 opacity: .25;
856 opacity: .25;
857 filter: alpha(opacity=25);
857 filter: alpha(opacity=25);
858 }
858 }
859 .yui-skin-sam .yui-dt-message { background-color: #FFF }
859 .yui-skin-sam .yui-dt-message { background-color: #FFF }
860 .yui-skin-sam .yui-dt-scrollable table { border: 0 }
860 .yui-skin-sam .yui-dt-scrollable table { border: 0 }
861 .yui-skin-sam .yui-dt-scrollable .yui-dt-hd {
861 .yui-skin-sam .yui-dt-scrollable .yui-dt-hd {
862 border-left: 1px solid #7f7f7f;
862 border-left: 1px solid #7f7f7f;
863 border-top: 1px solid #7f7f7f;
863 border-top: 1px solid #7f7f7f;
864 border-right: 1px solid #7f7f7f;
864 border-right: 1px solid #7f7f7f;
865 }
865 }
866 .yui-skin-sam .yui-dt-scrollable .yui-dt-bd {
866 .yui-skin-sam .yui-dt-scrollable .yui-dt-bd {
867 border-left: 1px solid #7f7f7f;
867 border-left: 1px solid #7f7f7f;
868 border-bottom: 1px solid #7f7f7f;
868 border-bottom: 1px solid #7f7f7f;
869 border-right: 1px solid #7f7f7f;
869 border-right: 1px solid #7f7f7f;
870 background-color: #FFF;
870 background-color: #FFF;
871 }
871 }
872 .yui-skin-sam .yui-dt-scrollable .yui-dt-data tr.yui-dt-last td { border-bottom: 1px solid #7f7f7f }
872 .yui-skin-sam .yui-dt-scrollable .yui-dt-data tr.yui-dt-last td { border-bottom: 1px solid #7f7f7f }
873 .yui-skin-sam th.yui-dt-asc,
873 .yui-skin-sam th.yui-dt-asc,
874 .yui-skin-sam th.yui-dt-desc { background: url(../images/sprite.png) repeat-x 0 -100px }
874 .yui-skin-sam th.yui-dt-desc { background: url(../images/sprite.png) repeat-x 0 -100px }
875 .yui-skin-sam th.yui-dt-sortable .yui-dt-label { margin-right: 10px }
875 .yui-skin-sam th.yui-dt-sortable .yui-dt-label { margin-right: 10px }
876 .yui-skin-sam th.yui-dt-asc .yui-dt-liner { background: url(../images/dt-arrow-up.png) no-repeat right }
876 .yui-skin-sam th.yui-dt-asc .yui-dt-liner { background: url(../images/dt-arrow-up.png) no-repeat right }
877 .yui-skin-sam th.yui-dt-desc .yui-dt-liner { background: url(../images/dt-arrow-dn.png) no-repeat right }
877 .yui-skin-sam th.yui-dt-desc .yui-dt-liner { background: url(../images/dt-arrow-dn.png) no-repeat right }
878 tbody .yui-dt-editable { cursor: pointer }
878 tbody .yui-dt-editable { cursor: pointer }
879 .yui-dt-editor {
879 .yui-dt-editor {
880 text-align: left;
880 text-align: left;
881 background-color: #f2f2f2;
881 background-color: #f2f2f2;
882 border: 1px solid #808080;
882 border: 1px solid #808080;
883 padding: 6px;
883 padding: 6px;
884 }
884 }
885 .yui-dt-editor label {
885 .yui-dt-editor label {
886 padding-left: 4px;
886 padding-left: 4px;
887 padding-right: 6px;
887 padding-right: 6px;
888 }
888 }
889 .yui-dt-editor .yui-dt-button {
889 .yui-dt-editor .yui-dt-button {
890 padding-top: 6px;
890 padding-top: 6px;
891 text-align: right;
891 text-align: right;
892 }
892 }
893 .yui-dt-editor .yui-dt-button button {
893 .yui-dt-editor .yui-dt-button button {
894 background: url(../images/sprite.png) repeat-x 0 0;
894 background: url(../images/sprite.png) repeat-x 0 0;
895 border: 1px solid #999;
895 border: 1px solid #999;
896 width: 4em;
896 width: 4em;
897 height: 1.8em;
897 height: 1.8em;
898 margin-left: 6px;
898 margin-left: 6px;
899 }
899 }
900 .yui-dt-editor .yui-dt-button button.yui-dt-default {
900 .yui-dt-editor .yui-dt-button button.yui-dt-default {
901 background: url(../images/sprite.png) repeat-x 0 -1400px;
901 background: url(../images/sprite.png) repeat-x 0 -1400px;
902 background-color: #5584e0;
902 background-color: #5584e0;
903 border: 1px solid #304369;
903 border: 1px solid #304369;
904 color: #FFF;
904 color: #FFF;
905 }
905 }
906 .yui-dt-editor .yui-dt-button button:hover {
906 .yui-dt-editor .yui-dt-button button:hover {
907 background: url(../images/sprite.png) repeat-x 0 -1300px;
907 background: url(../images/sprite.png) repeat-x 0 -1300px;
908 color: #000;
908 color: #000;
909 }
909 }
910 .yui-dt-editor .yui-dt-button button:active {
910 .yui-dt-editor .yui-dt-button button:active {
911 background: url(../images/sprite.png) repeat-x 0 -1700px;
911 background: url(../images/sprite.png) repeat-x 0 -1700px;
912 color: #000;
912 color: #000;
913 }
913 }
914 .yui-skin-sam tr.yui-dt-even { background-color: #FFF }
914 .yui-skin-sam tr.yui-dt-even { background-color: #FFF }
915 .yui-skin-sam tr.yui-dt-odd { background-color: #edf5ff }
915 .yui-skin-sam tr.yui-dt-odd { background-color: #edf5ff }
916 .yui-skin-sam tr.yui-dt-even td.yui-dt-asc,
916 .yui-skin-sam tr.yui-dt-even td.yui-dt-asc,
917 .yui-skin-sam tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
917 .yui-skin-sam tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
918 .yui-skin-sam tr.yui-dt-odd td.yui-dt-asc,
918 .yui-skin-sam tr.yui-dt-odd td.yui-dt-asc,
919 .yui-skin-sam tr.yui-dt-odd td.yui-dt-desc { background-color: #dbeaff }
919 .yui-skin-sam tr.yui-dt-odd td.yui-dt-desc { background-color: #dbeaff }
920 .yui-skin-sam .yui-dt-list tr.yui-dt-even { background-color: #FFF }
920 .yui-skin-sam .yui-dt-list tr.yui-dt-even { background-color: #FFF }
921 .yui-skin-sam .yui-dt-list tr.yui-dt-odd { background-color: #FFF }
921 .yui-skin-sam .yui-dt-list tr.yui-dt-odd { background-color: #FFF }
922 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-asc,
922 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-asc,
923 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
923 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
924 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-asc,
924 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-asc,
925 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-desc { background-color: #edf5ff }
925 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-desc { background-color: #edf5ff }
926 .yui-skin-sam th.yui-dt-highlighted,
926 .yui-skin-sam th.yui-dt-highlighted,
927 .yui-skin-sam th.yui-dt-highlighted a { background-color: #b2d2ff }
927 .yui-skin-sam th.yui-dt-highlighted a { background-color: #b2d2ff }
928 .yui-skin-sam tr.yui-dt-highlighted,
928 .yui-skin-sam tr.yui-dt-highlighted,
929 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc,
929 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc,
930 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc,
930 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc,
931 .yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted,
931 .yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted,
932 .yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted {
932 .yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted {
933 cursor: pointer;
933 cursor: pointer;
934 background-color: #b2d2ff;
934 background-color: #b2d2ff;
935 }
935 }
936 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted,
936 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted,
937 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted a { background-color: #b2d2ff }
937 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted a { background-color: #b2d2ff }
938 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted,
938 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted,
939 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-asc,
939 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-asc,
940 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc,
940 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc,
941 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-highlighted,
941 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-highlighted,
942 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-highlighted {
942 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-highlighted {
943 cursor: pointer;
943 cursor: pointer;
944 background-color: #b2d2ff;
944 background-color: #b2d2ff;
945 }
945 }
946 .yui-skin-sam th.yui-dt-selected,
946 .yui-skin-sam th.yui-dt-selected,
947 .yui-skin-sam th.yui-dt-selected a { background-color: #446cd7 }
947 .yui-skin-sam th.yui-dt-selected a { background-color: #446cd7 }
948 .yui-skin-sam tr.yui-dt-selected td,
948 .yui-skin-sam tr.yui-dt-selected td,
949 .yui-skin-sam tr.yui-dt-selected td.yui-dt-asc,
949 .yui-skin-sam tr.yui-dt-selected td.yui-dt-asc,
950 .yui-skin-sam tr.yui-dt-selected td.yui-dt-desc {
950 .yui-skin-sam tr.yui-dt-selected td.yui-dt-desc {
951 background-color: #426fd9;
951 background-color: #426fd9;
952 color: #FFF;
952 color: #FFF;
953 }
953 }
954 .yui-skin-sam tr.yui-dt-even td.yui-dt-selected,
954 .yui-skin-sam tr.yui-dt-even td.yui-dt-selected,
955 .yui-skin-sam tr.yui-dt-odd td.yui-dt-selected {
955 .yui-skin-sam tr.yui-dt-odd td.yui-dt-selected {
956 background-color: #446cd7;
956 background-color: #446cd7;
957 color: #FFF;
957 color: #FFF;
958 }
958 }
959 .yui-skin-sam .yui-dt-list th.yui-dt-selected,
959 .yui-skin-sam .yui-dt-list th.yui-dt-selected,
960 .yui-skin-sam .yui-dt-list th.yui-dt-selected a { background-color: #446cd7 }
960 .yui-skin-sam .yui-dt-list th.yui-dt-selected a { background-color: #446cd7 }
961 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td,
961 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td,
962 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-asc,
962 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-asc,
963 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-desc {
963 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-desc {
964 background-color: #426fd9;
964 background-color: #426fd9;
965 color: #FFF;
965 color: #FFF;
966 }
966 }
967 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-selected,
967 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-selected,
968 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-selected {
968 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-selected {
969 background-color: #446cd7;
969 background-color: #446cd7;
970 color: #FFF;
970 color: #FFF;
971 }
971 }
972 .yui-skin-sam .yui-dt-paginator {
972 .yui-skin-sam .yui-dt-paginator {
973 display: block;
973 display: block;
974 margin: 6px 0;
974 margin: 6px 0;
975 white-space: nowrap;
975 white-space: nowrap;
976 }
976 }
977 .yui-skin-sam .yui-dt-paginator .yui-dt-first,
977 .yui-skin-sam .yui-dt-paginator .yui-dt-first,
978 .yui-skin-sam .yui-dt-paginator .yui-dt-last,
978 .yui-skin-sam .yui-dt-paginator .yui-dt-last,
979 .yui-skin-sam .yui-dt-paginator .yui-dt-selected { padding: 2px 6px }
979 .yui-skin-sam .yui-dt-paginator .yui-dt-selected { padding: 2px 6px }
980 .yui-skin-sam .yui-dt-paginator a.yui-dt-first,
980 .yui-skin-sam .yui-dt-paginator a.yui-dt-first,
981 .yui-skin-sam .yui-dt-paginator a.yui-dt-last { text-decoration: none }
981 .yui-skin-sam .yui-dt-paginator a.yui-dt-last { text-decoration: none }
982 .yui-skin-sam .yui-dt-paginator .yui-dt-previous,
982 .yui-skin-sam .yui-dt-paginator .yui-dt-previous,
983 .yui-skin-sam .yui-dt-paginator .yui-dt-next { display: none }
983 .yui-skin-sam .yui-dt-paginator .yui-dt-next { display: none }
984 .yui-skin-sam a.yui-dt-page {
984 .yui-skin-sam a.yui-dt-page {
985 border: 1px solid #cbcbcb;
985 border: 1px solid #cbcbcb;
986 padding: 2px 6px;
986 padding: 2px 6px;
987 text-decoration: none;
987 text-decoration: none;
988 background-color: #fff;
988 background-color: #fff;
989 }
989 }
990 .yui-skin-sam .yui-dt-selected {
990 .yui-skin-sam .yui-dt-selected {
991 border: 1px solid #fff;
991 border: 1px solid #fff;
992 background-color: #fff;
992 background-color: #fff;
993 }
993 }
994
994
995 #content #left {
995 #content #left {
996 left: 0;
996 left: 0;
997 width: 280px;
997 width: 280px;
998 position: absolute;
998 position: absolute;
999 }
999 }
1000
1000
1001 #content #right {
1001 #content #right {
1002 margin: 0 60px 10px 290px;
1002 margin: 0 60px 10px 290px;
1003 }
1003 }
1004
1004
1005 #content div.box {
1005 #content div.box {
1006 clear: both;
1006 clear: both;
1007 overflow: hidden;
1007 overflow: hidden;
1008 background: #fff;
1008 background: #fff;
1009 margin: 0 0 10px;
1009 margin: 0 0 10px;
1010 padding: 0 0 10px;
1010 padding: 0 0 10px;
1011 -webkit-border-radius: 4px 4px 4px 4px;
1011 -webkit-border-radius: 4px 4px 4px 4px;
1012 -khtml-border-radius: 4px 4px 4px 4px;
1012 -khtml-border-radius: 4px 4px 4px 4px;
1013 -moz-border-radius: 4px 4px 4px 4px;
1013 -moz-border-radius: 4px 4px 4px 4px;
1014 border-radius: 4px 4px 4px 4px;
1014 border-radius: 4px 4px 4px 4px;
1015 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1015 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1016 }
1016 }
1017
1017
1018 #content div.box-left {
1018 #content div.box-left {
1019 width: 49%;
1019 width: 49%;
1020 clear: none;
1020 clear: none;
1021 float: left;
1021 float: left;
1022 margin: 0 0 10px;
1022 margin: 0 0 10px;
1023 }
1023 }
1024
1024
1025 #content div.box-right {
1025 #content div.box-right {
1026 width: 49%;
1026 width: 49%;
1027 clear: none;
1027 clear: none;
1028 float: right;
1028 float: right;
1029 margin: 0 0 10px;
1029 margin: 0 0 10px;
1030 }
1030 }
1031
1031
1032 #content div.box div.title {
1032 #content div.box div.title {
1033 clear: both;
1033 clear: both;
1034 overflow: hidden;
1034 overflow: hidden;
1035 background-color: #eedc94;
1035 background-color: #eedc94;
1036 background-repeat: repeat-x;
1036 background-repeat: repeat-x;
1037 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94) );
1037 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94) );
1038 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1038 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1039 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1039 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1040 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1040 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1041 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1041 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1042 background-image: -o-linear-gradient(top, #003b76, #00376e);
1042 background-image: -o-linear-gradient(top, #003b76, #00376e);
1043 background-image: linear-gradient(top, #003b76, #00376e);
1043 background-image: linear-gradient(top, #003b76, #00376e);
1044 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
1044 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
1045 margin: 0 0 20px;
1045 margin: 0 0 20px;
1046 padding: 0;
1046 padding: 0;
1047 }
1047 }
1048
1048
1049 #content div.box div.title h5 {
1049 #content div.box div.title h5 {
1050 float: left;
1050 float: left;
1051 border: none;
1051 border: none;
1052 color: #fff;
1052 color: #fff;
1053 text-transform: uppercase;
1053 text-transform: uppercase;
1054 margin: 0;
1054 margin: 0;
1055 padding: 11px 0 11px 10px;
1055 padding: 11px 0 11px 10px;
1056 }
1056 }
1057
1057
1058 #content div.box div.title .link-white{
1058 #content div.box div.title .link-white{
1059 color: #FFFFFF;
1059 color: #FFFFFF;
1060 }
1060 }
1061
1061
1062 #content div.box div.title ul.links li {
1062 #content div.box div.title ul.links li {
1063 list-style: none;
1063 list-style: none;
1064 float: left;
1064 float: left;
1065 margin: 0;
1065 margin: 0;
1066 padding: 0;
1066 padding: 0;
1067 }
1067 }
1068
1068
1069 #content div.box div.title ul.links li a {
1069 #content div.box div.title ul.links li a {
1070 border-left: 1px solid #316293;
1070 border-left: 1px solid #316293;
1071 color: #FFFFFF;
1071 color: #FFFFFF;
1072 display: block;
1072 display: block;
1073 float: left;
1073 float: left;
1074 font-size: 13px;
1074 font-size: 13px;
1075 font-weight: 700;
1075 font-weight: 700;
1076 height: 1%;
1076 height: 1%;
1077 margin: 0;
1077 margin: 0;
1078 padding: 11px 22px 12px;
1078 padding: 11px 22px 12px;
1079 text-decoration: none;
1079 text-decoration: none;
1080 }
1080 }
1081
1081
1082 #content div.box h1,#content div.box h2,#content div.box h3,#content div.box h4,#content div.box h5,#content div.box h6
1082 #content div.box h1,#content div.box h2,#content div.box h3,#content div.box h4,#content div.box h5,#content div.box h6
1083 {
1083 {
1084 clear: both;
1084 clear: both;
1085 overflow: hidden;
1085 overflow: hidden;
1086 border-bottom: 1px solid #DDD;
1086 border-bottom: 1px solid #DDD;
1087 margin: 10px 20px;
1087 margin: 10px 20px;
1088 padding: 0 0 15px;
1088 padding: 0 0 15px;
1089 }
1089 }
1090
1090
1091 #content div.box p {
1091 #content div.box p {
1092 color: #5f5f5f;
1092 color: #5f5f5f;
1093 font-size: 12px;
1093 font-size: 12px;
1094 line-height: 150%;
1094 line-height: 150%;
1095 margin: 0 24px 10px;
1095 margin: 0 24px 10px;
1096 padding: 0;
1096 padding: 0;
1097 }
1097 }
1098
1098
1099 #content div.box blockquote {
1099 #content div.box blockquote {
1100 border-left: 4px solid #DDD;
1100 border-left: 4px solid #DDD;
1101 color: #5f5f5f;
1101 color: #5f5f5f;
1102 font-size: 11px;
1102 font-size: 11px;
1103 line-height: 150%;
1103 line-height: 150%;
1104 margin: 0 34px;
1104 margin: 0 34px;
1105 padding: 0 0 0 14px;
1105 padding: 0 0 0 14px;
1106 }
1106 }
1107
1107
1108 #content div.box blockquote p {
1108 #content div.box blockquote p {
1109 margin: 10px 0;
1109 margin: 10px 0;
1110 padding: 0;
1110 padding: 0;
1111 }
1111 }
1112
1112
1113 #content div.box dl {
1113 #content div.box dl {
1114 margin: 10px 0px;
1114 margin: 10px 0px;
1115 }
1115 }
1116
1116
1117 #content div.box dt {
1117 #content div.box dt {
1118 font-size: 12px;
1118 font-size: 12px;
1119 margin: 0;
1119 margin: 0;
1120 }
1120 }
1121
1121
1122 #content div.box dd {
1122 #content div.box dd {
1123 font-size: 12px;
1123 font-size: 12px;
1124 margin: 0;
1124 margin: 0;
1125 padding: 8px 0 8px 15px;
1125 padding: 8px 0 8px 15px;
1126 }
1126 }
1127
1127
1128 #content div.box li {
1128 #content div.box li {
1129 font-size: 12px;
1129 font-size: 12px;
1130 padding: 4px 0;
1130 padding: 4px 0;
1131 }
1131 }
1132
1132
1133 #content div.box ul.disc,#content div.box ul.circle {
1133 #content div.box ul.disc,#content div.box ul.circle {
1134 margin: 10px 24px 10px 38px;
1134 margin: 10px 24px 10px 38px;
1135 }
1135 }
1136
1136
1137 #content div.box ul.square {
1137 #content div.box ul.square {
1138 margin: 10px 24px 10px 40px;
1138 margin: 10px 24px 10px 40px;
1139 }
1139 }
1140
1140
1141 #content div.box img.left {
1141 #content div.box img.left {
1142 border: none;
1142 border: none;
1143 float: left;
1143 float: left;
1144 margin: 10px 10px 10px 0;
1144 margin: 10px 10px 10px 0;
1145 }
1145 }
1146
1146
1147 #content div.box img.right {
1147 #content div.box img.right {
1148 border: none;
1148 border: none;
1149 float: right;
1149 float: right;
1150 margin: 10px 0 10px 10px;
1150 margin: 10px 0 10px 10px;
1151 }
1151 }
1152
1152
1153 #content div.box div.messages {
1153 #content div.box div.messages {
1154 clear: both;
1154 clear: both;
1155 overflow: hidden;
1155 overflow: hidden;
1156 margin: 0 20px;
1156 margin: 0 20px;
1157 padding: 0;
1157 padding: 0;
1158 }
1158 }
1159
1159
1160 #content div.box div.message {
1160 #content div.box div.message {
1161 clear: both;
1161 clear: both;
1162 overflow: hidden;
1162 overflow: hidden;
1163 margin: 0;
1163 margin: 0;
1164 padding: 5px 0;
1164 padding: 5px 0;
1165 white-space: pre-wrap;
1165 white-space: pre-wrap;
1166 }
1166 }
1167 #content div.box div.expand {
1167 #content div.box div.expand {
1168 width: 110%;
1168 width: 110%;
1169 height:14px;
1169 height:14px;
1170 font-size:10px;
1170 font-size:10px;
1171 text-align:center;
1171 text-align:center;
1172 cursor: pointer;
1172 cursor: pointer;
1173 color:#666;
1173 color:#666;
1174
1174
1175 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)));
1175 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)));
1176 background:-webkit-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1176 background:-webkit-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1177 background:-moz-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1177 background:-moz-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1178 background:-o-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1178 background:-o-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1179 background:-ms-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1179 background:-ms-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1180 background:linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1180 background:linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1181
1181
1182 display: none;
1182 display: none;
1183 }
1183 }
1184 #content div.box div.expand .expandtext {
1184 #content div.box div.expand .expandtext {
1185 background-color: #ffffff;
1185 background-color: #ffffff;
1186 padding: 2px;
1186 padding: 2px;
1187 border-radius: 2px;
1187 border-radius: 2px;
1188 }
1188 }
1189
1189
1190 #content div.box div.message a {
1190 #content div.box div.message a {
1191 font-weight: 400 !important;
1191 font-weight: 400 !important;
1192 }
1192 }
1193
1193
1194 #content div.box div.message div.image {
1194 #content div.box div.message div.image {
1195 float: left;
1195 float: left;
1196 margin: 9px 0 0 5px;
1196 margin: 9px 0 0 5px;
1197 padding: 6px;
1197 padding: 6px;
1198 }
1198 }
1199
1199
1200 #content div.box div.message div.image img {
1200 #content div.box div.message div.image img {
1201 vertical-align: middle;
1201 vertical-align: middle;
1202 margin: 0;
1202 margin: 0;
1203 }
1203 }
1204
1204
1205 #content div.box div.message div.text {
1205 #content div.box div.message div.text {
1206 float: left;
1206 float: left;
1207 margin: 0;
1207 margin: 0;
1208 padding: 9px 6px;
1208 padding: 9px 6px;
1209 }
1209 }
1210
1210
1211 #content div.box div.message div.dismiss a {
1211 #content div.box div.message div.dismiss a {
1212 height: 16px;
1212 height: 16px;
1213 width: 16px;
1213 width: 16px;
1214 display: block;
1214 display: block;
1215 background: url("../images/icons/cross.png") no-repeat;
1215 background: url("../images/icons/cross.png") no-repeat;
1216 margin: 15px 14px 0 0;
1216 margin: 15px 14px 0 0;
1217 padding: 0;
1217 padding: 0;
1218 }
1218 }
1219
1219
1220 #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
1220 #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
1221 {
1221 {
1222 border: none;
1222 border: none;
1223 margin: 0;
1223 margin: 0;
1224 padding: 0;
1224 padding: 0;
1225 }
1225 }
1226
1226
1227 #content div.box div.message div.text span {
1227 #content div.box div.message div.text span {
1228 height: 1%;
1228 height: 1%;
1229 display: block;
1229 display: block;
1230 margin: 0;
1230 margin: 0;
1231 padding: 5px 0 0;
1231 padding: 5px 0 0;
1232 }
1232 }
1233
1233
1234 #content div.box div.message-error {
1234 #content div.box div.message-error {
1235 height: 1%;
1235 height: 1%;
1236 clear: both;
1236 clear: both;
1237 overflow: hidden;
1237 overflow: hidden;
1238 background: #FBE3E4;
1238 background: #FBE3E4;
1239 border: 1px solid #FBC2C4;
1239 border: 1px solid #FBC2C4;
1240 color: #860006;
1240 color: #860006;
1241 }
1241 }
1242
1242
1243 #content div.box div.message-error h6 {
1243 #content div.box div.message-error h6 {
1244 color: #860006;
1244 color: #860006;
1245 }
1245 }
1246
1246
1247 #content div.box div.message-warning {
1247 #content div.box div.message-warning {
1248 height: 1%;
1248 height: 1%;
1249 clear: both;
1249 clear: both;
1250 overflow: hidden;
1250 overflow: hidden;
1251 background: #FFF6BF;
1251 background: #FFF6BF;
1252 border: 1px solid #FFD324;
1252 border: 1px solid #FFD324;
1253 color: #5f5200;
1253 color: #5f5200;
1254 }
1254 }
1255
1255
1256 #content div.box div.message-warning h6 {
1256 #content div.box div.message-warning h6 {
1257 color: #5f5200;
1257 color: #5f5200;
1258 }
1258 }
1259
1259
1260 #content div.box div.message-notice {
1260 #content div.box div.message-notice {
1261 height: 1%;
1261 height: 1%;
1262 clear: both;
1262 clear: both;
1263 overflow: hidden;
1263 overflow: hidden;
1264 background: #8FBDE0;
1264 background: #8FBDE0;
1265 border: 1px solid #6BACDE;
1265 border: 1px solid #6BACDE;
1266 color: #003863;
1266 color: #003863;
1267 }
1267 }
1268
1268
1269 #content div.box div.message-notice h6 {
1269 #content div.box div.message-notice h6 {
1270 color: #003863;
1270 color: #003863;
1271 }
1271 }
1272
1272
1273 #content div.box div.message-success {
1273 #content div.box div.message-success {
1274 height: 1%;
1274 height: 1%;
1275 clear: both;
1275 clear: both;
1276 overflow: hidden;
1276 overflow: hidden;
1277 background: #E6EFC2;
1277 background: #E6EFC2;
1278 border: 1px solid #C6D880;
1278 border: 1px solid #C6D880;
1279 color: #4e6100;
1279 color: #4e6100;
1280 }
1280 }
1281
1281
1282 #content div.box div.message-success h6 {
1282 #content div.box div.message-success h6 {
1283 color: #4e6100;
1283 color: #4e6100;
1284 }
1284 }
1285
1285
1286 #content div.box div.form div.fields div.field {
1286 #content div.box div.form div.fields div.field {
1287 height: 1%;
1287 height: 1%;
1288 border-bottom: 1px solid #DDD;
1288 border-bottom: 1px solid #DDD;
1289 clear: both;
1289 clear: both;
1290 margin: 0;
1290 margin: 0;
1291 padding: 10px 0;
1291 padding: 10px 0;
1292 }
1292 }
1293
1293
1294 #content div.box div.form div.fields div.field-first {
1294 #content div.box div.form div.fields div.field-first {
1295 padding: 0 0 10px;
1295 padding: 0 0 10px;
1296 }
1296 }
1297
1297
1298 #content div.box div.form div.fields div.field-noborder {
1298 #content div.box div.form div.fields div.field-noborder {
1299 border-bottom: 0 !important;
1299 border-bottom: 0 !important;
1300 }
1300 }
1301
1301
1302 #content div.box div.form div.fields div.field span.error-message {
1302 #content div.box div.form div.fields div.field span.error-message {
1303 height: 1%;
1303 height: 1%;
1304 display: inline-block;
1304 display: inline-block;
1305 color: red;
1305 color: red;
1306 margin: 8px 0 0 4px;
1306 margin: 8px 0 0 4px;
1307 padding: 0;
1307 padding: 0;
1308 }
1308 }
1309
1309
1310 #content div.box div.form div.fields div.field span.success {
1310 #content div.box div.form div.fields div.field span.success {
1311 height: 1%;
1311 height: 1%;
1312 display: block;
1312 display: block;
1313 color: #316309;
1313 color: #316309;
1314 margin: 8px 0 0;
1314 margin: 8px 0 0;
1315 padding: 0;
1315 padding: 0;
1316 }
1316 }
1317
1317
1318 #content div.box div.form div.fields div.field div.label {
1318 #content div.box div.form div.fields div.field div.label {
1319 left: 70px;
1319 left: 70px;
1320 width: 155px;
1320 width: 155px;
1321 position: absolute;
1321 position: absolute;
1322 margin: 0;
1322 margin: 0;
1323 padding: 5px 0 0 0px;
1323 padding: 5px 0 0 0px;
1324 }
1324 }
1325
1325
1326 #content div.box div.form div.fields div.field div.label-summary {
1326 #content div.box div.form div.fields div.field div.label-summary {
1327 left: 30px;
1327 left: 30px;
1328 width: 155px;
1328 width: 155px;
1329 position: absolute;
1329 position: absolute;
1330 margin: 0;
1330 margin: 0;
1331 padding: 0px 0 0 0px;
1331 padding: 0px 0 0 0px;
1332 }
1332 }
1333
1333
1334 #content div.box-left div.form div.fields div.field div.label,
1334 #content div.box-left div.form div.fields div.field div.label,
1335 #content div.box-right div.form div.fields div.field div.label,
1335 #content div.box-right div.form div.fields div.field div.label,
1336 #content div.box-left div.form div.fields div.field div.label,
1336 #content div.box-left div.form div.fields div.field div.label,
1337 #content div.box-left div.form div.fields div.field div.label-summary,
1337 #content div.box-left div.form div.fields div.field div.label-summary,
1338 #content div.box-right div.form div.fields div.field div.label-summary,
1338 #content div.box-right div.form div.fields div.field div.label-summary,
1339 #content div.box-left div.form div.fields div.field div.label-summary
1339 #content div.box-left div.form div.fields div.field div.label-summary
1340 {
1340 {
1341 clear: both;
1341 clear: both;
1342 overflow: hidden;
1342 overflow: hidden;
1343 left: 0;
1343 left: 0;
1344 width: auto;
1344 width: auto;
1345 position: relative;
1345 position: relative;
1346 margin: 0;
1346 margin: 0;
1347 padding: 0 0 8px;
1347 padding: 0 0 8px;
1348 }
1348 }
1349
1349
1350 #content div.box div.form div.fields div.field div.label-select {
1350 #content div.box div.form div.fields div.field div.label-select {
1351 padding: 5px 0 0 5px;
1351 padding: 5px 0 0 5px;
1352 }
1352 }
1353
1353
1354 #content div.box-left div.form div.fields div.field div.label-select,
1354 #content div.box-left div.form div.fields div.field div.label-select,
1355 #content div.box-right div.form div.fields div.field div.label-select
1355 #content div.box-right div.form div.fields div.field div.label-select
1356 {
1356 {
1357 padding: 0 0 8px;
1357 padding: 0 0 8px;
1358 }
1358 }
1359
1359
1360 #content div.box-left div.form div.fields div.field div.label-textarea,
1360 #content div.box-left div.form div.fields div.field div.label-textarea,
1361 #content div.box-right div.form div.fields div.field div.label-textarea
1361 #content div.box-right div.form div.fields div.field div.label-textarea
1362 {
1362 {
1363 padding: 0 0 8px !important;
1363 padding: 0 0 8px !important;
1364 }
1364 }
1365
1365
1366 #content div.box div.form div.fields div.field div.label label,div.label label
1366 #content div.box div.form div.fields div.field div.label label,div.label label
1367 {
1367 {
1368 color: #393939;
1368 color: #393939;
1369 font-weight: 700;
1369 font-weight: 700;
1370 }
1370 }
1371 #content div.box div.form div.fields div.field div.label label,div.label-summary label
1371 #content div.box div.form div.fields div.field div.label label,div.label-summary label
1372 {
1372 {
1373 color: #393939;
1373 color: #393939;
1374 font-weight: 700;
1374 font-weight: 700;
1375 }
1375 }
1376 #content div.box div.form div.fields div.field div.input {
1376 #content div.box div.form div.fields div.field div.input {
1377 margin: 0 0 0 200px;
1377 margin: 0 0 0 200px;
1378 }
1378 }
1379
1379
1380 #content div.box div.form div.fields div.field div.input.summary {
1380 #content div.box div.form div.fields div.field div.input.summary {
1381 margin: 0 0 0 110px;
1381 margin: 0 0 0 110px;
1382 }
1382 }
1383 #content div.box div.form div.fields div.field div.input.summary-short {
1383 #content div.box div.form div.fields div.field div.input.summary-short {
1384 margin: 0 0 0 110px;
1384 margin: 0 0 0 110px;
1385 }
1385 }
1386 #content div.box div.form div.fields div.field div.file {
1386 #content div.box div.form div.fields div.field div.file {
1387 margin: 0 0 0 200px;
1387 margin: 0 0 0 200px;
1388 }
1388 }
1389
1389
1390 #content div.box-left div.form div.fields div.field div.input,#content div.box-right div.form div.fields div.field div.input
1390 #content div.box-left div.form div.fields div.field div.input,#content div.box-right div.form div.fields div.field div.input
1391 {
1391 {
1392 margin: 0 0 0 0px;
1392 margin: 0 0 0 0px;
1393 }
1393 }
1394
1394
1395 #content div.box div.form div.fields div.field div.input input {
1395 #content div.box div.form div.fields div.field div.input input {
1396 background: #FFF;
1396 background: #FFF;
1397 border-top: 1px solid #b3b3b3;
1397 border-top: 1px solid #b3b3b3;
1398 border-left: 1px solid #b3b3b3;
1398 border-left: 1px solid #b3b3b3;
1399 border-right: 1px solid #eaeaea;
1399 border-right: 1px solid #eaeaea;
1400 border-bottom: 1px solid #eaeaea;
1400 border-bottom: 1px solid #eaeaea;
1401 color: #000;
1401 color: #000;
1402 font-size: 11px;
1402 font-size: 11px;
1403 margin: 0;
1403 margin: 0;
1404 padding: 7px 7px 6px;
1404 padding: 7px 7px 6px;
1405 }
1405 }
1406
1406
1407 #content div.box div.form div.fields div.field div.input input#clone_url,
1407 #content div.box div.form div.fields div.field div.input input#clone_url,
1408 #content div.box div.form div.fields div.field div.input input#clone_url_id
1408 #content div.box div.form div.fields div.field div.input input#clone_url_id
1409 {
1409 {
1410 font-size: 16px;
1410 font-size: 16px;
1411 padding: 2px;
1411 padding: 2px;
1412 }
1412 }
1413
1413
1414 #content div.box div.form div.fields div.field div.file input {
1414 #content div.box div.form div.fields div.field div.file input {
1415 background: none repeat scroll 0 0 #FFFFFF;
1415 background: none repeat scroll 0 0 #FFFFFF;
1416 border-color: #B3B3B3 #EAEAEA #EAEAEA #B3B3B3;
1416 border-color: #B3B3B3 #EAEAEA #EAEAEA #B3B3B3;
1417 border-style: solid;
1417 border-style: solid;
1418 border-width: 1px;
1418 border-width: 1px;
1419 color: #000000;
1419 color: #000000;
1420 font-size: 11px;
1420 font-size: 11px;
1421 margin: 0;
1421 margin: 0;
1422 padding: 7px 7px 6px;
1422 padding: 7px 7px 6px;
1423 }
1423 }
1424
1424
1425 input.disabled {
1425 input.disabled {
1426 background-color: #F5F5F5 !important;
1426 background-color: #F5F5F5 !important;
1427 }
1427 }
1428 #content div.box div.form div.fields div.field div.input input.small {
1428 #content div.box div.form div.fields div.field div.input input.small {
1429 width: 30%;
1429 width: 30%;
1430 }
1430 }
1431
1431
1432 #content div.box div.form div.fields div.field div.input input.medium {
1432 #content div.box div.form div.fields div.field div.input input.medium {
1433 width: 55%;
1433 width: 55%;
1434 }
1434 }
1435
1435
1436 #content div.box div.form div.fields div.field div.input input.large {
1436 #content div.box div.form div.fields div.field div.input input.large {
1437 width: 85%;
1437 width: 85%;
1438 }
1438 }
1439
1439
1440 #content div.box div.form div.fields div.field div.input input.date {
1440 #content div.box div.form div.fields div.field div.input input.date {
1441 width: 177px;
1441 width: 177px;
1442 }
1442 }
1443
1443
1444 #content div.box div.form div.fields div.field div.input input.button {
1444 #content div.box div.form div.fields div.field div.input input.button {
1445 background: #D4D0C8;
1445 background: #D4D0C8;
1446 border-top: 1px solid #FFF;
1446 border-top: 1px solid #FFF;
1447 border-left: 1px solid #FFF;
1447 border-left: 1px solid #FFF;
1448 border-right: 1px solid #404040;
1448 border-right: 1px solid #404040;
1449 border-bottom: 1px solid #404040;
1449 border-bottom: 1px solid #404040;
1450 color: #000;
1450 color: #000;
1451 margin: 0;
1451 margin: 0;
1452 padding: 4px 8px;
1452 padding: 4px 8px;
1453 }
1453 }
1454
1454
1455 #content div.box div.form div.fields div.field div.textarea {
1455 #content div.box div.form div.fields div.field div.textarea {
1456 border-top: 1px solid #b3b3b3;
1456 border-top: 1px solid #b3b3b3;
1457 border-left: 1px solid #b3b3b3;
1457 border-left: 1px solid #b3b3b3;
1458 border-right: 1px solid #eaeaea;
1458 border-right: 1px solid #eaeaea;
1459 border-bottom: 1px solid #eaeaea;
1459 border-bottom: 1px solid #eaeaea;
1460 margin: 0 0 0 200px;
1460 margin: 0 0 0 200px;
1461 padding: 10px;
1461 padding: 10px;
1462 }
1462 }
1463
1463
1464 #content div.box div.form div.fields div.field div.textarea-editor {
1464 #content div.box div.form div.fields div.field div.textarea-editor {
1465 border: 1px solid #ddd;
1465 border: 1px solid #ddd;
1466 padding: 0;
1466 padding: 0;
1467 }
1467 }
1468
1468
1469 #content div.box div.form div.fields div.field div.textarea textarea {
1469 #content div.box div.form div.fields div.field div.textarea textarea {
1470 width: 100%;
1470 width: 100%;
1471 height: 220px;
1471 height: 220px;
1472 overflow: hidden;
1472 overflow: hidden;
1473 background: #FFF;
1473 background: #FFF;
1474 color: #000;
1474 color: #000;
1475 font-size: 11px;
1475 font-size: 11px;
1476 outline: none;
1476 outline: none;
1477 border-width: 0;
1477 border-width: 0;
1478 margin: 0;
1478 margin: 0;
1479 padding: 0;
1479 padding: 0;
1480 }
1480 }
1481
1481
1482 #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
1482 #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
1483 {
1483 {
1484 width: 100%;
1484 width: 100%;
1485 height: 100px;
1485 height: 100px;
1486 }
1486 }
1487
1487
1488 #content div.box div.form div.fields div.field div.textarea table {
1488 #content div.box div.form div.fields div.field div.textarea table {
1489 width: 100%;
1489 width: 100%;
1490 border: none;
1490 border: none;
1491 margin: 0;
1491 margin: 0;
1492 padding: 0;
1492 padding: 0;
1493 }
1493 }
1494
1494
1495 #content div.box div.form div.fields div.field div.textarea table td {
1495 #content div.box div.form div.fields div.field div.textarea table td {
1496 background: #DDD;
1496 background: #DDD;
1497 border: none;
1497 border: none;
1498 padding: 0;
1498 padding: 0;
1499 }
1499 }
1500
1500
1501 #content div.box div.form div.fields div.field div.textarea table td table
1501 #content div.box div.form div.fields div.field div.textarea table td table
1502 {
1502 {
1503 width: auto;
1503 width: auto;
1504 border: none;
1504 border: none;
1505 margin: 0;
1505 margin: 0;
1506 padding: 0;
1506 padding: 0;
1507 }
1507 }
1508
1508
1509 #content div.box div.form div.fields div.field div.textarea table td table td
1509 #content div.box div.form div.fields div.field div.textarea table td table td
1510 {
1510 {
1511 font-size: 11px;
1511 font-size: 11px;
1512 padding: 5px 5px 5px 0;
1512 padding: 5px 5px 5px 0;
1513 }
1513 }
1514
1514
1515 #content div.box div.form div.fields div.field input[type=text]:focus,#content div.box div.form div.fields div.field input[type=password]:focus,#content div.box div.form div.fields div.field input[type=file]:focus,#content div.box div.form div.fields div.field textarea:focus,#content div.box div.form div.fields div.field select:focus
1515 #content div.box div.form div.fields div.field input[type=text]:focus,#content div.box div.form div.fields div.field input[type=password]:focus,#content div.box div.form div.fields div.field input[type=file]:focus,#content div.box div.form div.fields div.field textarea:focus,#content div.box div.form div.fields div.field select:focus
1516 {
1516 {
1517 background: #f6f6f6;
1517 background: #f6f6f6;
1518 border-color: #666;
1518 border-color: #666;
1519 }
1519 }
1520
1520
1521 div.form div.fields div.field div.button {
1521 div.form div.fields div.field div.button {
1522 margin: 0;
1522 margin: 0;
1523 padding: 0 0 0 8px;
1523 padding: 0 0 0 8px;
1524 }
1524 }
1525 #content div.box table.noborder {
1525 #content div.box table.noborder {
1526 border: 1px solid transparent;
1526 border: 1px solid transparent;
1527 }
1527 }
1528
1528
1529 #content div.box table {
1529 #content div.box table {
1530 width: 100%;
1530 width: 100%;
1531 border-collapse: separate;
1531 border-collapse: separate;
1532 margin: 0;
1532 margin: 0;
1533 padding: 0;
1533 padding: 0;
1534 border: 1px solid #eee;
1534 border: 1px solid #eee;
1535 -webkit-border-radius: 4px;
1535 -webkit-border-radius: 4px;
1536 -moz-border-radius: 4px;
1536 -moz-border-radius: 4px;
1537 border-radius: 4px;
1537 border-radius: 4px;
1538 }
1538 }
1539
1539
1540 #content div.box table th {
1540 #content div.box table th {
1541 background: #eee;
1541 background: #eee;
1542 border-bottom: 1px solid #ddd;
1542 border-bottom: 1px solid #ddd;
1543 padding: 5px 0px 5px 5px;
1543 padding: 5px 0px 5px 5px;
1544 }
1544 }
1545
1545
1546 #content div.box table th.left {
1546 #content div.box table th.left {
1547 text-align: left;
1547 text-align: left;
1548 }
1548 }
1549
1549
1550 #content div.box table th.right {
1550 #content div.box table th.right {
1551 text-align: right;
1551 text-align: right;
1552 }
1552 }
1553
1553
1554 #content div.box table th.center {
1554 #content div.box table th.center {
1555 text-align: center;
1555 text-align: center;
1556 }
1556 }
1557
1557
1558 #content div.box table th.selected {
1558 #content div.box table th.selected {
1559 vertical-align: middle;
1559 vertical-align: middle;
1560 padding: 0;
1560 padding: 0;
1561 }
1561 }
1562
1562
1563 #content div.box table td {
1563 #content div.box table td {
1564 background: #fff;
1564 background: #fff;
1565 border-bottom: 1px solid #cdcdcd;
1565 border-bottom: 1px solid #cdcdcd;
1566 vertical-align: middle;
1566 vertical-align: middle;
1567 padding: 5px;
1567 padding: 5px;
1568 }
1568 }
1569
1569
1570 #content div.box table tr.selected td {
1570 #content div.box table tr.selected td {
1571 background: #FFC;
1571 background: #FFC;
1572 }
1572 }
1573
1573
1574 #content div.box table td.selected {
1574 #content div.box table td.selected {
1575 width: 3%;
1575 width: 3%;
1576 text-align: center;
1576 text-align: center;
1577 vertical-align: middle;
1577 vertical-align: middle;
1578 padding: 0;
1578 padding: 0;
1579 }
1579 }
1580
1580
1581 #content div.box table td.action {
1581 #content div.box table td.action {
1582 width: 45%;
1582 width: 45%;
1583 text-align: left;
1583 text-align: left;
1584 }
1584 }
1585
1585
1586 #content div.box table td.date {
1586 #content div.box table td.date {
1587 width: 33%;
1587 width: 33%;
1588 text-align: center;
1588 text-align: center;
1589 }
1589 }
1590
1590
1591 #content div.box div.action {
1591 #content div.box div.action {
1592 float: right;
1592 float: right;
1593 background: #FFF;
1593 background: #FFF;
1594 text-align: right;
1594 text-align: right;
1595 margin: 10px 0 0;
1595 margin: 10px 0 0;
1596 padding: 0;
1596 padding: 0;
1597 }
1597 }
1598
1598
1599 #content div.box div.action select {
1599 #content div.box div.action select {
1600 font-size: 11px;
1600 font-size: 11px;
1601 margin: 0;
1601 margin: 0;
1602 }
1602 }
1603
1603
1604 #content div.box div.action .ui-selectmenu {
1604 #content div.box div.action .ui-selectmenu {
1605 margin: 0;
1605 margin: 0;
1606 padding: 0;
1606 padding: 0;
1607 }
1607 }
1608
1608
1609 #content div.box div.pagination {
1609 #content div.box div.pagination {
1610 height: 1%;
1610 height: 1%;
1611 clear: both;
1611 clear: both;
1612 overflow: hidden;
1612 overflow: hidden;
1613 margin: 10px 0 0;
1613 margin: 10px 0 0;
1614 padding: 0;
1614 padding: 0;
1615 }
1615 }
1616
1616
1617 #content div.box div.pagination ul.pager {
1617 #content div.box div.pagination ul.pager {
1618 float: right;
1618 float: right;
1619 text-align: right;
1619 text-align: right;
1620 margin: 0;
1620 margin: 0;
1621 padding: 0;
1621 padding: 0;
1622 }
1622 }
1623
1623
1624 #content div.box div.pagination ul.pager li {
1624 #content div.box div.pagination ul.pager li {
1625 height: 1%;
1625 height: 1%;
1626 float: left;
1626 float: left;
1627 list-style: none;
1627 list-style: none;
1628 background: #ebebeb url("../images/pager.png") repeat-x;
1628 background: #ebebeb url("../images/pager.png") repeat-x;
1629 border-top: 1px solid #dedede;
1629 border-top: 1px solid #dedede;
1630 border-left: 1px solid #cfcfcf;
1630 border-left: 1px solid #cfcfcf;
1631 border-right: 1px solid #c4c4c4;
1631 border-right: 1px solid #c4c4c4;
1632 border-bottom: 1px solid #c4c4c4;
1632 border-bottom: 1px solid #c4c4c4;
1633 color: #4A4A4A;
1633 color: #4A4A4A;
1634 font-weight: 700;
1634 font-weight: 700;
1635 margin: 0 0 0 4px;
1635 margin: 0 0 0 4px;
1636 padding: 0;
1636 padding: 0;
1637 }
1637 }
1638
1638
1639 #content div.box div.pagination ul.pager li.separator {
1639 #content div.box div.pagination ul.pager li.separator {
1640 padding: 6px;
1640 padding: 6px;
1641 }
1641 }
1642
1642
1643 #content div.box div.pagination ul.pager li.current {
1643 #content div.box div.pagination ul.pager li.current {
1644 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1644 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1645 border-top: 1px solid #ccc;
1645 border-top: 1px solid #ccc;
1646 border-left: 1px solid #bebebe;
1646 border-left: 1px solid #bebebe;
1647 border-right: 1px solid #b1b1b1;
1647 border-right: 1px solid #b1b1b1;
1648 border-bottom: 1px solid #afafaf;
1648 border-bottom: 1px solid #afafaf;
1649 color: #515151;
1649 color: #515151;
1650 padding: 6px;
1650 padding: 6px;
1651 }
1651 }
1652
1652
1653 #content div.box div.pagination ul.pager li a {
1653 #content div.box div.pagination ul.pager li a {
1654 height: 1%;
1654 height: 1%;
1655 display: block;
1655 display: block;
1656 float: left;
1656 float: left;
1657 color: #515151;
1657 color: #515151;
1658 text-decoration: none;
1658 text-decoration: none;
1659 margin: 0;
1659 margin: 0;
1660 padding: 6px;
1660 padding: 6px;
1661 }
1661 }
1662
1662
1663 #content div.box div.pagination ul.pager li a:hover,#content div.box div.pagination ul.pager li a:active
1663 #content div.box div.pagination ul.pager li a:hover,#content div.box div.pagination ul.pager li a:active
1664 {
1664 {
1665 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1665 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1666 border-top: 1px solid #ccc;
1666 border-top: 1px solid #ccc;
1667 border-left: 1px solid #bebebe;
1667 border-left: 1px solid #bebebe;
1668 border-right: 1px solid #b1b1b1;
1668 border-right: 1px solid #b1b1b1;
1669 border-bottom: 1px solid #afafaf;
1669 border-bottom: 1px solid #afafaf;
1670 margin: -1px;
1670 margin: -1px;
1671 }
1671 }
1672
1672
1673 #content div.box div.pagination-wh {
1673 #content div.box div.pagination-wh {
1674 height: 1%;
1674 height: 1%;
1675 clear: both;
1675 clear: both;
1676 overflow: hidden;
1676 overflow: hidden;
1677 text-align: right;
1677 text-align: right;
1678 margin: 10px 0 0;
1678 margin: 10px 0 0;
1679 padding: 0;
1679 padding: 0;
1680 }
1680 }
1681
1681
1682 #content div.box div.pagination-right {
1682 #content div.box div.pagination-right {
1683 float: right;
1683 float: right;
1684 }
1684 }
1685
1685
1686 #content div.box div.pagination-wh a,#content div.box div.pagination-wh span.pager_dotdot
1686 #content div.box div.pagination-wh a,#content div.box div.pagination-wh span.pager_dotdot
1687 {
1687 {
1688 height: 1%;
1688 height: 1%;
1689 float: left;
1689 float: left;
1690 background: #ebebeb url("../images/pager.png") repeat-x;
1690 background: #ebebeb url("../images/pager.png") repeat-x;
1691 border-top: 1px solid #dedede;
1691 border-top: 1px solid #dedede;
1692 border-left: 1px solid #cfcfcf;
1692 border-left: 1px solid #cfcfcf;
1693 border-right: 1px solid #c4c4c4;
1693 border-right: 1px solid #c4c4c4;
1694 border-bottom: 1px solid #c4c4c4;
1694 border-bottom: 1px solid #c4c4c4;
1695 color: #4A4A4A;
1695 color: #4A4A4A;
1696 font-weight: 700;
1696 font-weight: 700;
1697 margin: 0 0 0 4px;
1697 margin: 0 0 0 4px;
1698 padding: 6px;
1698 padding: 6px;
1699 }
1699 }
1700
1700
1701 #content div.box div.pagination-wh span.pager_curpage {
1701 #content div.box div.pagination-wh span.pager_curpage {
1702 height: 1%;
1702 height: 1%;
1703 float: left;
1703 float: left;
1704 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1704 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1705 border-top: 1px solid #ccc;
1705 border-top: 1px solid #ccc;
1706 border-left: 1px solid #bebebe;
1706 border-left: 1px solid #bebebe;
1707 border-right: 1px solid #b1b1b1;
1707 border-right: 1px solid #b1b1b1;
1708 border-bottom: 1px solid #afafaf;
1708 border-bottom: 1px solid #afafaf;
1709 color: #515151;
1709 color: #515151;
1710 font-weight: 700;
1710 font-weight: 700;
1711 margin: 0 0 0 4px;
1711 margin: 0 0 0 4px;
1712 padding: 6px;
1712 padding: 6px;
1713 }
1713 }
1714
1714
1715 #content div.box div.pagination-wh a:hover,#content div.box div.pagination-wh a:active
1715 #content div.box div.pagination-wh a:hover,#content div.box div.pagination-wh a:active
1716 {
1716 {
1717 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1717 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1718 border-top: 1px solid #ccc;
1718 border-top: 1px solid #ccc;
1719 border-left: 1px solid #bebebe;
1719 border-left: 1px solid #bebebe;
1720 border-right: 1px solid #b1b1b1;
1720 border-right: 1px solid #b1b1b1;
1721 border-bottom: 1px solid #afafaf;
1721 border-bottom: 1px solid #afafaf;
1722 text-decoration: none;
1722 text-decoration: none;
1723 }
1723 }
1724
1724
1725 #content div.box div.traffic div.legend {
1725 #content div.box div.traffic div.legend {
1726 clear: both;
1726 clear: both;
1727 overflow: hidden;
1727 overflow: hidden;
1728 border-bottom: 1px solid #ddd;
1728 border-bottom: 1px solid #ddd;
1729 margin: 0 0 10px;
1729 margin: 0 0 10px;
1730 padding: 0 0 10px;
1730 padding: 0 0 10px;
1731 }
1731 }
1732
1732
1733 #content div.box div.traffic div.legend h6 {
1733 #content div.box div.traffic div.legend h6 {
1734 float: left;
1734 float: left;
1735 border: none;
1735 border: none;
1736 margin: 0;
1736 margin: 0;
1737 padding: 0;
1737 padding: 0;
1738 }
1738 }
1739
1739
1740 #content div.box div.traffic div.legend li {
1740 #content div.box div.traffic div.legend li {
1741 list-style: none;
1741 list-style: none;
1742 float: left;
1742 float: left;
1743 font-size: 11px;
1743 font-size: 11px;
1744 margin: 0;
1744 margin: 0;
1745 padding: 0 8px 0 4px;
1745 padding: 0 8px 0 4px;
1746 }
1746 }
1747
1747
1748 #content div.box div.traffic div.legend li.visits {
1748 #content div.box div.traffic div.legend li.visits {
1749 border-left: 12px solid #edc240;
1749 border-left: 12px solid #edc240;
1750 }
1750 }
1751
1751
1752 #content div.box div.traffic div.legend li.pageviews {
1752 #content div.box div.traffic div.legend li.pageviews {
1753 border-left: 12px solid #afd8f8;
1753 border-left: 12px solid #afd8f8;
1754 }
1754 }
1755
1755
1756 #content div.box div.traffic table {
1756 #content div.box div.traffic table {
1757 width: auto;
1757 width: auto;
1758 }
1758 }
1759
1759
1760 #content div.box div.traffic table td {
1760 #content div.box div.traffic table td {
1761 background: transparent;
1761 background: transparent;
1762 border: none;
1762 border: none;
1763 padding: 2px 3px 3px;
1763 padding: 2px 3px 3px;
1764 }
1764 }
1765
1765
1766 #content div.box div.traffic table td.legendLabel {
1766 #content div.box div.traffic table td.legendLabel {
1767 padding: 0 3px 2px;
1767 padding: 0 3px 2px;
1768 }
1768 }
1769
1769
1770 #summary {
1770 #summary {
1771
1771
1772 }
1772 }
1773
1773
1774 #summary .desc {
1774 #summary .desc {
1775 white-space: pre;
1775 white-space: pre;
1776 width: 100%;
1776 width: 100%;
1777 }
1777 }
1778
1778
1779 #summary .repo_name {
1779 #summary .repo_name {
1780 font-size: 1.6em;
1780 font-size: 1.6em;
1781 font-weight: bold;
1781 font-weight: bold;
1782 vertical-align: baseline;
1782 vertical-align: baseline;
1783 clear: right
1783 clear: right
1784 }
1784 }
1785
1785
1786 #footer {
1786 #footer {
1787 clear: both;
1787 clear: both;
1788 overflow: hidden;
1788 overflow: hidden;
1789 text-align: right;
1789 text-align: right;
1790 margin: 0;
1790 margin: 0;
1791 padding: 0 10px 4px;
1791 padding: 0 10px 4px;
1792 margin: -10px 0 0;
1792 margin: -10px 0 0;
1793 }
1793 }
1794
1794
1795 #footer div#footer-inner {
1795 #footer div#footer-inner {
1796 background-color: #eedc94; background-repeat : repeat-x;
1796 background-color: #eedc94; background-repeat : repeat-x;
1797 background-image : -khtml-gradient( linear, left top, left bottom,
1797 background-image : -khtml-gradient( linear, left top, left bottom,
1798 from( #fceec1), to( #eedc94)); background-image : -moz-linear-gradient(
1798 from( #fceec1), to( #eedc94)); background-image : -moz-linear-gradient(
1799 top, #003b76, #00376e); background-image : -ms-linear-gradient( top,
1799 top, #003b76, #00376e); background-image : -ms-linear-gradient( top,
1800 #003b76, #00376e); background-image : -webkit-gradient( linear, left
1800 #003b76, #00376e); background-image : -webkit-gradient( linear, left
1801 top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1801 top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1802 background-image : -webkit-linear-gradient( top, #003b76, #00376e));
1802 background-image : -webkit-linear-gradient( top, #003b76, #00376e));
1803 background-image : -o-linear-gradient( top, #003b76, #00376e));
1803 background-image : -o-linear-gradient( top, #003b76, #00376e));
1804 background-image : linear-gradient( top, #003b76, #00376e); filter :
1804 background-image : linear-gradient( top, #003b76, #00376e); filter :
1805 progid : DXImageTransform.Microsoft.gradient ( startColorstr =
1805 progid : DXImageTransform.Microsoft.gradient ( startColorstr =
1806 '#003b76', endColorstr = '#00376e', GradientType = 0);
1806 '#003b76', endColorstr = '#00376e', GradientType = 0);
1807 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1807 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1808 -webkit-border-radius: 4px 4px 4px 4px;
1808 -webkit-border-radius: 4px 4px 4px 4px;
1809 -khtml-border-radius: 4px 4px 4px 4px;
1809 -khtml-border-radius: 4px 4px 4px 4px;
1810 -moz-border-radius: 4px 4px 4px 4px;
1810 -moz-border-radius: 4px 4px 4px 4px;
1811 border-radius: 4px 4px 4px 4px;
1811 border-radius: 4px 4px 4px 4px;
1812 background-repeat: repeat-x;
1812 background-repeat: repeat-x;
1813 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),
1813 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),
1814 to(#eedc94) );
1814 to(#eedc94) );
1815 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1815 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1816 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1816 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1817 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1817 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1818 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1818 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1819 background-image: -o-linear-gradient(top, #003b76, #00376e);
1819 background-image: -o-linear-gradient(top, #003b76, #00376e);
1820 background-image: linear-gradient(top, #003b76, #00376e);
1820 background-image: linear-gradient(top, #003b76, #00376e);
1821 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
1821 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
1822 endColorstr='#00376e', GradientType=0 );
1822 endColorstr='#00376e', GradientType=0 );
1823 }
1823 }
1824
1824
1825 #footer div#footer-inner p {
1825 #footer div#footer-inner p {
1826 padding: 15px 25px 15px 0;
1826 padding: 15px 25px 15px 0;
1827 color: #FFF;
1827 color: #FFF;
1828 font-weight: 700;
1828 font-weight: 700;
1829 }
1829 }
1830
1830
1831 #footer div#footer-inner .footer-link {
1831 #footer div#footer-inner .footer-link {
1832 float: left;
1832 float: left;
1833 padding-left: 10px;
1833 padding-left: 10px;
1834 }
1834 }
1835
1835
1836 #footer div#footer-inner .footer-link a,#footer div#footer-inner .footer-link-right a
1836 #footer div#footer-inner .footer-link a,#footer div#footer-inner .footer-link-right a
1837 {
1837 {
1838 color: #FFF;
1838 color: #FFF;
1839 }
1839 }
1840
1840
1841 #login div.title {
1841 #login div.title {
1842 width: 420px;
1842 width: 420px;
1843 clear: both;
1843 clear: both;
1844 overflow: hidden;
1844 overflow: hidden;
1845 position: relative;
1845 position: relative;
1846 background-color: #eedc94; background-repeat : repeat-x;
1846 background-color: #eedc94; background-repeat : repeat-x;
1847 background-image : -khtml-gradient( linear, left top, left bottom,
1847 background-image : -khtml-gradient( linear, left top, left bottom,
1848 from( #fceec1), to( #eedc94)); background-image : -moz-linear-gradient(
1848 from( #fceec1), to( #eedc94)); background-image : -moz-linear-gradient(
1849 top, #003b76, #00376e); background-image : -ms-linear-gradient( top,
1849 top, #003b76, #00376e); background-image : -ms-linear-gradient( top,
1850 #003b76, #00376e); background-image : -webkit-gradient( linear, left
1850 #003b76, #00376e); background-image : -webkit-gradient( linear, left
1851 top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1851 top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1852 background-image : -webkit-linear-gradient( top, #003b76, #00376e));
1852 background-image : -webkit-linear-gradient( top, #003b76, #00376e));
1853 background-image : -o-linear-gradient( top, #003b76, #00376e));
1853 background-image : -o-linear-gradient( top, #003b76, #00376e));
1854 background-image : linear-gradient( top, #003b76, #00376e); filter :
1854 background-image : linear-gradient( top, #003b76, #00376e); filter :
1855 progid : DXImageTransform.Microsoft.gradient ( startColorstr =
1855 progid : DXImageTransform.Microsoft.gradient ( startColorstr =
1856 '#003b76', endColorstr = '#00376e', GradientType = 0);
1856 '#003b76', endColorstr = '#00376e', GradientType = 0);
1857 margin: 0 auto;
1857 margin: 0 auto;
1858 padding: 0;
1858 padding: 0;
1859 background-repeat: repeat-x;
1859 background-repeat: repeat-x;
1860 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),
1860 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),
1861 to(#eedc94) );
1861 to(#eedc94) );
1862 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1862 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1863 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1863 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1864 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1864 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1865 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1865 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1866 background-image: -o-linear-gradient(top, #003b76, #00376e);
1866 background-image: -o-linear-gradient(top, #003b76, #00376e);
1867 background-image: linear-gradient(top, #003b76, #00376e);
1867 background-image: linear-gradient(top, #003b76, #00376e);
1868 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
1868 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
1869 endColorstr='#00376e', GradientType=0 );
1869 endColorstr='#00376e', GradientType=0 );
1870 }
1870 }
1871
1871
1872 #login div.inner {
1872 #login div.inner {
1873 width: 380px;
1873 width: 380px;
1874 background: #FFF url("../images/login.png") no-repeat top left;
1874 background: #FFF url("../images/login.png") no-repeat top left;
1875 border-top: none;
1875 border-top: none;
1876 border-bottom: none;
1876 border-bottom: none;
1877 margin: 0 auto;
1877 margin: 0 auto;
1878 padding: 20px;
1878 padding: 20px;
1879 }
1879 }
1880
1880
1881 #login div.form div.fields div.field div.label {
1881 #login div.form div.fields div.field div.label {
1882 width: 173px;
1882 width: 173px;
1883 float: left;
1883 float: left;
1884 text-align: right;
1884 text-align: right;
1885 margin: 2px 10px 0 0;
1885 margin: 2px 10px 0 0;
1886 padding: 5px 0 0 5px;
1886 padding: 5px 0 0 5px;
1887 }
1887 }
1888
1888
1889 #login div.form div.fields div.field div.input input {
1889 #login div.form div.fields div.field div.input input {
1890 width: 176px;
1890 width: 176px;
1891 background: #FFF;
1891 background: #FFF;
1892 border-top: 1px solid #b3b3b3;
1892 border-top: 1px solid #b3b3b3;
1893 border-left: 1px solid #b3b3b3;
1893 border-left: 1px solid #b3b3b3;
1894 border-right: 1px solid #eaeaea;
1894 border-right: 1px solid #eaeaea;
1895 border-bottom: 1px solid #eaeaea;
1895 border-bottom: 1px solid #eaeaea;
1896 color: #000;
1896 color: #000;
1897 font-size: 11px;
1897 font-size: 11px;
1898 margin: 0;
1898 margin: 0;
1899 padding: 7px 7px 6px;
1899 padding: 7px 7px 6px;
1900 }
1900 }
1901
1901
1902 #login div.form div.fields div.buttons {
1902 #login div.form div.fields div.buttons {
1903 clear: both;
1903 clear: both;
1904 overflow: hidden;
1904 overflow: hidden;
1905 border-top: 1px solid #DDD;
1905 border-top: 1px solid #DDD;
1906 text-align: right;
1906 text-align: right;
1907 margin: 0;
1907 margin: 0;
1908 padding: 10px 0 0;
1908 padding: 10px 0 0;
1909 }
1909 }
1910
1910
1911 #login div.form div.links {
1911 #login div.form div.links {
1912 clear: both;
1912 clear: both;
1913 overflow: hidden;
1913 overflow: hidden;
1914 margin: 10px 0 0;
1914 margin: 10px 0 0;
1915 padding: 0 0 2px;
1915 padding: 0 0 2px;
1916 }
1916 }
1917
1917
1918 .user-menu{
1918 .user-menu{
1919 margin: 0px !important;
1919 margin: 0px !important;
1920 float: left;
1920 float: left;
1921 }
1921 }
1922
1922
1923 .user-menu .container{
1923 .user-menu .container{
1924 padding:0px 4px 0px 4px;
1924 padding:0px 4px 0px 4px;
1925 margin: 0px 0px 0px 0px;
1925 margin: 0px 0px 0px 0px;
1926 }
1926 }
1927
1927
1928 .user-menu .gravatar{
1928 .user-menu .gravatar{
1929 margin: 0px 0px 0px 0px;
1929 margin: 0px 0px 0px 0px;
1930 cursor: pointer;
1930 cursor: pointer;
1931 }
1931 }
1932 .user-menu .gravatar.enabled{
1932 .user-menu .gravatar.enabled{
1933 background-color: #FDF784 !important;
1933 background-color: #FDF784 !important;
1934 }
1934 }
1935 .user-menu .gravatar:hover{
1935 .user-menu .gravatar:hover{
1936 background-color: #FDF784 !important;
1936 background-color: #FDF784 !important;
1937 }
1937 }
1938 #quick_login{
1938 #quick_login{
1939 min-height: 80px;
1939 min-height: 80px;
1940 margin: 37px 0 0 -251px;
1940 margin: 37px 0 0 -251px;
1941 padding: 4px;
1941 padding: 4px;
1942 position: absolute;
1942 position: absolute;
1943 width: 278px;
1943 width: 278px;
1944
1944
1945 background-repeat: repeat-x;
1945 background-repeat: repeat-x;
1946 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),
1946 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),
1947 to(#eedc94) );
1947 to(#eedc94) );
1948 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1948 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1949 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1949 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1950 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1950 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1951 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1951 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1952 background-image: -o-linear-gradient(top, #003b76, #00376e);
1952 background-image: -o-linear-gradient(top, #003b76, #00376e);
1953 background-image: linear-gradient(top, #003b76, #00376e);
1953 background-image: linear-gradient(top, #003b76, #00376e);
1954 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
1954 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
1955 endColorstr='#00376e', GradientType=0 );
1955 endColorstr='#00376e', GradientType=0 );
1956
1956
1957 z-index: 999;
1957 z-index: 999;
1958 -webkit-border-radius: 0px 0px 4px 4px;
1958 -webkit-border-radius: 0px 0px 4px 4px;
1959 -khtml-border-radius: 0px 0px 4px 4px;
1959 -khtml-border-radius: 0px 0px 4px 4px;
1960 -moz-border-radius: 0px 0px 4px 4px;
1960 -moz-border-radius: 0px 0px 4px 4px;
1961 border-radius: 0px 0px 4px 4px;
1961 border-radius: 0px 0px 4px 4px;
1962 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1962 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1963 }
1963 }
1964 #quick_login h4{
1964 #quick_login h4{
1965 color: #fff;
1965 color: #fff;
1966 padding: 5px 0px 5px 14px;
1966 padding: 5px 0px 5px 14px;
1967 }
1967 }
1968
1968
1969 #quick_login .password_forgoten {
1969 #quick_login .password_forgoten {
1970 padding-right: 10px;
1970 padding-right: 10px;
1971 padding-top: 0px;
1971 padding-top: 0px;
1972 text-align: left;
1972 text-align: left;
1973 }
1973 }
1974
1974
1975 #quick_login .password_forgoten a {
1975 #quick_login .password_forgoten a {
1976 font-size: 10px;
1976 font-size: 10px;
1977 color: #fff;
1977 color: #fff;
1978 }
1978 }
1979
1979
1980 #quick_login .register {
1980 #quick_login .register {
1981 padding-right: 10px;
1981 padding-right: 10px;
1982 padding-top: 5px;
1982 padding-top: 5px;
1983 text-align: left;
1983 text-align: left;
1984 }
1984 }
1985
1985
1986 #quick_login .register a {
1986 #quick_login .register a {
1987 font-size: 10px;
1987 font-size: 10px;
1988 color: #fff;
1988 color: #fff;
1989 }
1989 }
1990
1990
1991 #quick_login .submit {
1991 #quick_login .submit {
1992 margin: -20px 0 0 0px;
1992 margin: -20px 0 0 0px;
1993 position: absolute;
1993 position: absolute;
1994 right: 15px;
1994 right: 15px;
1995 }
1995 }
1996
1996
1997 #quick_login .links_left{
1997 #quick_login .links_left{
1998 float: left;
1998 float: left;
1999 }
1999 }
2000 #quick_login .links_right{
2000 #quick_login .links_right{
2001 float: right;
2001 float: right;
2002 }
2002 }
2003 #quick_login .full_name{
2003 #quick_login .full_name{
2004 color: #FFFFFF;
2004 color: #FFFFFF;
2005 font-weight: bold;
2005 font-weight: bold;
2006 padding: 3px;
2006 padding: 3px;
2007 }
2007 }
2008 #quick_login .big_gravatar{
2008 #quick_login .big_gravatar{
2009 padding:4px 0px 0px 6px;
2009 padding:4px 0px 0px 6px;
2010 }
2010 }
2011 #quick_login .inbox{
2011 #quick_login .inbox{
2012 padding:4px 0px 0px 6px;
2012 padding:4px 0px 0px 6px;
2013 color: #FFFFFF;
2013 color: #FFFFFF;
2014 font-weight: bold;
2014 font-weight: bold;
2015 }
2015 }
2016 #quick_login .inbox a{
2016 #quick_login .inbox a{
2017 color: #FFFFFF;
2017 color: #FFFFFF;
2018 }
2018 }
2019 #quick_login .email,#quick_login .email a{
2019 #quick_login .email,#quick_login .email a{
2020 color: #FFFFFF;
2020 color: #FFFFFF;
2021 padding: 3px;
2021 padding: 3px;
2022
2022
2023 }
2023 }
2024 #quick_login .links .logout{
2024 #quick_login .links .logout{
2025
2025
2026 }
2026 }
2027
2027
2028 #quick_login div.form div.fields {
2028 #quick_login div.form div.fields {
2029 padding-top: 2px;
2029 padding-top: 2px;
2030 padding-left: 10px;
2030 padding-left: 10px;
2031 }
2031 }
2032
2032
2033 #quick_login div.form div.fields div.field {
2033 #quick_login div.form div.fields div.field {
2034 padding: 5px;
2034 padding: 5px;
2035 }
2035 }
2036
2036
2037 #quick_login div.form div.fields div.field div.label label {
2037 #quick_login div.form div.fields div.field div.label label {
2038 color: #fff;
2038 color: #fff;
2039 padding-bottom: 3px;
2039 padding-bottom: 3px;
2040 }
2040 }
2041
2041
2042 #quick_login div.form div.fields div.field div.input input {
2042 #quick_login div.form div.fields div.field div.input input {
2043 width: 236px;
2043 width: 236px;
2044 background: #FFF;
2044 background: #FFF;
2045 border-top: 1px solid #b3b3b3;
2045 border-top: 1px solid #b3b3b3;
2046 border-left: 1px solid #b3b3b3;
2046 border-left: 1px solid #b3b3b3;
2047 border-right: 1px solid #eaeaea;
2047 border-right: 1px solid #eaeaea;
2048 border-bottom: 1px solid #eaeaea;
2048 border-bottom: 1px solid #eaeaea;
2049 color: #000;
2049 color: #000;
2050 font-size: 11px;
2050 font-size: 11px;
2051 margin: 0;
2051 margin: 0;
2052 padding: 5px 7px 4px;
2052 padding: 5px 7px 4px;
2053 }
2053 }
2054
2054
2055 #quick_login div.form div.fields div.buttons {
2055 #quick_login div.form div.fields div.buttons {
2056 clear: both;
2056 clear: both;
2057 overflow: hidden;
2057 overflow: hidden;
2058 text-align: right;
2058 text-align: right;
2059 margin: 0;
2059 margin: 0;
2060 padding: 5px 14px 0px 5px;
2060 padding: 5px 14px 0px 5px;
2061 }
2061 }
2062
2062
2063 #quick_login div.form div.links {
2063 #quick_login div.form div.links {
2064 clear: both;
2064 clear: both;
2065 overflow: hidden;
2065 overflow: hidden;
2066 margin: 10px 0 0;
2066 margin: 10px 0 0;
2067 padding: 0 0 2px;
2067 padding: 0 0 2px;
2068 }
2068 }
2069
2069
2070 #quick_login ol.links{
2070 #quick_login ol.links{
2071 display: block;
2071 display: block;
2072 font-weight: bold;
2072 font-weight: bold;
2073 list-style: none outside none;
2073 list-style: none outside none;
2074 text-align: right;
2074 text-align: right;
2075 }
2075 }
2076 #quick_login ol.links li{
2076 #quick_login ol.links li{
2077 line-height: 27px;
2077 line-height: 27px;
2078 margin: 0;
2078 margin: 0;
2079 padding: 0;
2079 padding: 0;
2080 color: #fff;
2080 color: #fff;
2081 display: block;
2081 display: block;
2082 float:none !important;
2082 float:none !important;
2083 }
2083 }
2084
2084
2085 #quick_login ol.links li a{
2085 #quick_login ol.links li a{
2086 color: #fff;
2086 color: #fff;
2087 display: block;
2087 display: block;
2088 padding: 2px;
2088 padding: 2px;
2089 }
2089 }
2090 #quick_login ol.links li a:HOVER{
2090 #quick_login ol.links li a:HOVER{
2091 background-color: inherit !important;
2091 background-color: inherit !important;
2092 }
2092 }
2093
2093
2094 #register div.title {
2094 #register div.title {
2095 clear: both;
2095 clear: both;
2096 overflow: hidden;
2096 overflow: hidden;
2097 position: relative;
2097 position: relative;
2098 background-color: #eedc94;
2098 background-color: #eedc94;
2099 background-repeat: repeat-x;
2099 background-repeat: repeat-x;
2100 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),
2100 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),
2101 to(#eedc94) );
2101 to(#eedc94) );
2102 background-image: -moz-linear-gradient(top, #003b76, #00376e);
2102 background-image: -moz-linear-gradient(top, #003b76, #00376e);
2103 background-image: -ms-linear-gradient(top, #003b76, #00376e);
2103 background-image: -ms-linear-gradient(top, #003b76, #00376e);
2104 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
2104 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
2105 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
2105 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
2106 background-image: -o-linear-gradient(top, #003b76, #00376e);
2106 background-image: -o-linear-gradient(top, #003b76, #00376e);
2107 background-image: linear-gradient(top, #003b76, #00376e);
2107 background-image: linear-gradient(top, #003b76, #00376e);
2108 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
2108 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
2109 endColorstr='#00376e', GradientType=0 );
2109 endColorstr='#00376e', GradientType=0 );
2110 margin: 0 auto;
2110 margin: 0 auto;
2111 padding: 0;
2111 padding: 0;
2112 }
2112 }
2113
2113
2114 #register div.inner {
2114 #register div.inner {
2115 background: #FFF;
2115 background: #FFF;
2116 border-top: none;
2116 border-top: none;
2117 border-bottom: none;
2117 border-bottom: none;
2118 margin: 0 auto;
2118 margin: 0 auto;
2119 padding: 20px;
2119 padding: 20px;
2120 }
2120 }
2121
2121
2122 #register div.form div.fields div.field div.label {
2122 #register div.form div.fields div.field div.label {
2123 width: 135px;
2123 width: 135px;
2124 float: left;
2124 float: left;
2125 text-align: right;
2125 text-align: right;
2126 margin: 2px 10px 0 0;
2126 margin: 2px 10px 0 0;
2127 padding: 5px 0 0 5px;
2127 padding: 5px 0 0 5px;
2128 }
2128 }
2129
2129
2130 #register div.form div.fields div.field div.input input {
2130 #register div.form div.fields div.field div.input input {
2131 width: 300px;
2131 width: 300px;
2132 background: #FFF;
2132 background: #FFF;
2133 border-top: 1px solid #b3b3b3;
2133 border-top: 1px solid #b3b3b3;
2134 border-left: 1px solid #b3b3b3;
2134 border-left: 1px solid #b3b3b3;
2135 border-right: 1px solid #eaeaea;
2135 border-right: 1px solid #eaeaea;
2136 border-bottom: 1px solid #eaeaea;
2136 border-bottom: 1px solid #eaeaea;
2137 color: #000;
2137 color: #000;
2138 font-size: 11px;
2138 font-size: 11px;
2139 margin: 0;
2139 margin: 0;
2140 padding: 7px 7px 6px;
2140 padding: 7px 7px 6px;
2141 }
2141 }
2142
2142
2143 #register div.form div.fields div.buttons {
2143 #register div.form div.fields div.buttons {
2144 clear: both;
2144 clear: both;
2145 overflow: hidden;
2145 overflow: hidden;
2146 border-top: 1px solid #DDD;
2146 border-top: 1px solid #DDD;
2147 text-align: left;
2147 text-align: left;
2148 margin: 0;
2148 margin: 0;
2149 padding: 10px 0 0 150px;
2149 padding: 10px 0 0 150px;
2150 }
2150 }
2151
2151
2152 #register div.form div.activation_msg {
2152 #register div.form div.activation_msg {
2153 padding-top: 4px;
2153 padding-top: 4px;
2154 padding-bottom: 4px;
2154 padding-bottom: 4px;
2155 }
2155 }
2156
2156
2157 #journal .journal_day {
2157 #journal .journal_day {
2158 font-size: 20px;
2158 font-size: 20px;
2159 padding: 10px 0px;
2159 padding: 10px 0px;
2160 border-bottom: 2px solid #DDD;
2160 border-bottom: 2px solid #DDD;
2161 margin-left: 10px;
2161 margin-left: 10px;
2162 margin-right: 10px;
2162 margin-right: 10px;
2163 }
2163 }
2164
2164
2165 #journal .journal_container {
2165 #journal .journal_container {
2166 padding: 5px;
2166 padding: 5px;
2167 clear: both;
2167 clear: both;
2168 margin: 0px 5px 0px 10px;
2168 margin: 0px 5px 0px 10px;
2169 }
2169 }
2170
2170
2171 #journal .journal_action_container {
2171 #journal .journal_action_container {
2172 padding-left: 38px;
2172 padding-left: 38px;
2173 }
2173 }
2174
2174
2175 #journal .journal_user {
2175 #journal .journal_user {
2176 color: #747474;
2176 color: #747474;
2177 font-size: 14px;
2177 font-size: 14px;
2178 font-weight: bold;
2178 font-weight: bold;
2179 height: 30px;
2179 height: 30px;
2180 }
2180 }
2181
2181
2182 #journal .journal_icon {
2182 #journal .journal_icon {
2183 clear: both;
2183 clear: both;
2184 float: left;
2184 float: left;
2185 padding-right: 4px;
2185 padding-right: 4px;
2186 padding-top: 3px;
2186 padding-top: 3px;
2187 }
2187 }
2188
2188
2189 #journal .journal_action {
2189 #journal .journal_action {
2190 padding-top: 4px;
2190 padding-top: 4px;
2191 min-height: 2px;
2191 min-height: 2px;
2192 float: left
2192 float: left
2193 }
2193 }
2194
2194
2195 #journal .journal_action_params {
2195 #journal .journal_action_params {
2196 clear: left;
2196 clear: left;
2197 padding-left: 22px;
2197 padding-left: 22px;
2198 }
2198 }
2199
2199
2200 #journal .journal_repo {
2200 #journal .journal_repo {
2201 float: left;
2201 float: left;
2202 margin-left: 6px;
2202 margin-left: 6px;
2203 padding-top: 3px;
2203 padding-top: 3px;
2204 }
2204 }
2205
2205
2206 #journal .date {
2206 #journal .date {
2207 clear: both;
2207 clear: both;
2208 color: #777777;
2208 color: #777777;
2209 font-size: 11px;
2209 font-size: 11px;
2210 padding-left: 22px;
2210 padding-left: 22px;
2211 }
2211 }
2212
2212
2213 #journal .journal_repo .journal_repo_name {
2213 #journal .journal_repo .journal_repo_name {
2214 font-weight: bold;
2214 font-weight: bold;
2215 font-size: 1.1em;
2215 font-size: 1.1em;
2216 }
2216 }
2217
2217
2218 #journal .compare_view {
2218 #journal .compare_view {
2219 padding: 5px 0px 5px 0px;
2219 padding: 5px 0px 5px 0px;
2220 width: 95px;
2220 width: 95px;
2221 }
2221 }
2222
2222
2223 .journal_highlight {
2223 .journal_highlight {
2224 font-weight: bold;
2224 font-weight: bold;
2225 padding: 0 2px;
2225 padding: 0 2px;
2226 vertical-align: bottom;
2226 vertical-align: bottom;
2227 }
2227 }
2228
2228
2229 .trending_language_tbl,.trending_language_tbl td {
2229 .trending_language_tbl,.trending_language_tbl td {
2230 border: 0 !important;
2230 border: 0 !important;
2231 margin: 0 !important;
2231 margin: 0 !important;
2232 padding: 0 !important;
2232 padding: 0 !important;
2233 }
2233 }
2234
2234
2235 .trending_language_tbl,.trending_language_tbl tr {
2235 .trending_language_tbl,.trending_language_tbl tr {
2236 border-spacing: 1px;
2236 border-spacing: 1px;
2237 }
2237 }
2238
2238
2239 .trending_language {
2239 .trending_language {
2240 background-color: #003367;
2240 background-color: #003367;
2241 color: #FFF;
2241 color: #FFF;
2242 display: block;
2242 display: block;
2243 min-width: 20px;
2243 min-width: 20px;
2244 text-decoration: none;
2244 text-decoration: none;
2245 height: 12px;
2245 height: 12px;
2246 margin-bottom: 0px;
2246 margin-bottom: 0px;
2247 margin-left: 5px;
2247 margin-left: 5px;
2248 white-space: pre;
2248 white-space: pre;
2249 padding: 3px;
2249 padding: 3px;
2250 }
2250 }
2251
2251
2252 h3.files_location {
2252 h3.files_location {
2253 font-size: 1.8em;
2253 font-size: 1.8em;
2254 font-weight: 700;
2254 font-weight: 700;
2255 border-bottom: none !important;
2255 border-bottom: none !important;
2256 margin: 10px 0 !important;
2256 margin: 10px 0 !important;
2257 }
2257 }
2258
2258
2259 #files_data dl dt {
2259 #files_data dl dt {
2260 float: left;
2260 float: left;
2261 width: 60px;
2261 width: 60px;
2262 margin: 0 !important;
2262 margin: 0 !important;
2263 padding: 5px;
2263 padding: 5px;
2264 }
2264 }
2265
2265
2266 #files_data dl dd {
2266 #files_data dl dd {
2267 margin: 0 !important;
2267 margin: 0 !important;
2268 padding: 5px !important;
2268 padding: 5px !important;
2269 }
2269 }
2270
2270
2271 .tablerow0 {
2271 .tablerow0 {
2272 background-color: #F8F8F8;
2272 background-color: #F8F8F8;
2273 }
2273 }
2274
2274
2275 .tablerow1 {
2275 .tablerow1 {
2276 background-color: #FFFFFF;
2276 background-color: #FFFFFF;
2277 }
2277 }
2278
2278
2279 .changeset_id {
2279 .changeset_id {
2280 font-family: monospace;
2280 font-family: monospace;
2281 color: #666666;
2281 color: #666666;
2282 }
2282 }
2283
2283
2284 .changeset_hash {
2284 .changeset_hash {
2285 color: #000000;
2285 color: #000000;
2286 }
2286 }
2287
2287
2288 #changeset_content {
2288 #changeset_content {
2289 border-left: 1px solid #CCC;
2289 border-left: 1px solid #CCC;
2290 border-right: 1px solid #CCC;
2290 border-right: 1px solid #CCC;
2291 border-bottom: 1px solid #CCC;
2291 border-bottom: 1px solid #CCC;
2292 padding: 5px;
2292 padding: 5px;
2293 }
2293 }
2294
2294
2295 #changeset_compare_view_content {
2295 #changeset_compare_view_content {
2296 border: 1px solid #CCC;
2296 border: 1px solid #CCC;
2297 padding: 5px;
2297 padding: 5px;
2298 }
2298 }
2299
2299
2300 #changeset_content .container {
2300 #changeset_content .container {
2301 min-height: 100px;
2301 min-height: 100px;
2302 font-size: 1.2em;
2302 font-size: 1.2em;
2303 overflow: hidden;
2303 overflow: hidden;
2304 }
2304 }
2305
2305
2306 #changeset_compare_view_content .compare_view_commits {
2306 #changeset_compare_view_content .compare_view_commits {
2307 width: auto !important;
2307 width: auto !important;
2308 }
2308 }
2309
2309
2310 #changeset_compare_view_content .compare_view_commits td {
2310 #changeset_compare_view_content .compare_view_commits td {
2311 padding: 0px 0px 0px 12px !important;
2311 padding: 0px 0px 0px 12px !important;
2312 }
2312 }
2313
2313
2314 #changeset_content .container .right {
2314 #changeset_content .container .right {
2315 float: right;
2315 float: right;
2316 width: 20%;
2316 width: 20%;
2317 text-align: right;
2317 text-align: right;
2318 }
2318 }
2319
2319
2320 #changeset_content .container .left .message {
2320 #changeset_content .container .left .message {
2321 white-space: pre-wrap;
2321 white-space: pre-wrap;
2322 }
2322 }
2323 #changeset_content .container .left .message a:hover {
2323 #changeset_content .container .left .message a:hover {
2324 text-decoration: none;
2324 text-decoration: none;
2325 }
2325 }
2326 .cs_files .cur_cs {
2326 .cs_files .cur_cs {
2327 margin: 10px 2px;
2327 margin: 10px 2px;
2328 font-weight: bold;
2328 font-weight: bold;
2329 }
2329 }
2330
2330
2331 .cs_files .node {
2331 .cs_files .node {
2332 float: left;
2332 float: left;
2333 }
2333 }
2334
2334
2335 .cs_files .changes {
2335 .cs_files .changes {
2336 float: right;
2336 float: right;
2337 color:#003367;
2337 color:#003367;
2338
2338
2339 }
2339 }
2340
2340
2341 .cs_files .changes .added {
2341 .cs_files .changes .added {
2342 background-color: #BBFFBB;
2342 background-color: #BBFFBB;
2343 float: left;
2343 float: left;
2344 text-align: center;
2344 text-align: center;
2345 font-size: 9px;
2345 font-size: 9px;
2346 padding: 2px 0px 2px 0px;
2346 padding: 2px 0px 2px 0px;
2347 }
2347 }
2348
2348
2349 .cs_files .changes .deleted {
2349 .cs_files .changes .deleted {
2350 background-color: #FF8888;
2350 background-color: #FF8888;
2351 float: left;
2351 float: left;
2352 text-align: center;
2352 text-align: center;
2353 font-size: 9px;
2353 font-size: 9px;
2354 padding: 2px 0px 2px 0px;
2354 padding: 2px 0px 2px 0px;
2355 }
2355 }
2356
2356
2357 .cs_files .cs_added {
2357 .cs_files .cs_added {
2358 background: url("../images/icons/page_white_add.png") no-repeat scroll
2358 background: url("../images/icons/page_white_add.png") no-repeat scroll
2359 3px;
2359 3px;
2360 height: 16px;
2360 height: 16px;
2361 padding-left: 20px;
2361 padding-left: 20px;
2362 margin-top: 7px;
2362 margin-top: 7px;
2363 text-align: left;
2363 text-align: left;
2364 }
2364 }
2365
2365
2366 .cs_files .cs_changed {
2366 .cs_files .cs_changed {
2367 background: url("../images/icons/page_white_edit.png") no-repeat scroll
2367 background: url("../images/icons/page_white_edit.png") no-repeat scroll
2368 3px;
2368 3px;
2369 height: 16px;
2369 height: 16px;
2370 padding-left: 20px;
2370 padding-left: 20px;
2371 margin-top: 7px;
2371 margin-top: 7px;
2372 text-align: left;
2372 text-align: left;
2373 }
2373 }
2374
2374
2375 .cs_files .cs_removed {
2375 .cs_files .cs_removed {
2376 background: url("../images/icons/page_white_delete.png") no-repeat
2376 background: url("../images/icons/page_white_delete.png") no-repeat
2377 scroll 3px;
2377 scroll 3px;
2378 height: 16px;
2378 height: 16px;
2379 padding-left: 20px;
2379 padding-left: 20px;
2380 margin-top: 7px;
2380 margin-top: 7px;
2381 text-align: left;
2381 text-align: left;
2382 }
2382 }
2383
2383
2384 #graph {
2384 #graph {
2385 overflow: hidden;
2385 overflow: hidden;
2386 }
2386 }
2387
2387
2388 #graph_nodes {
2388 #graph_nodes {
2389 float: left;
2389 float: left;
2390 margin-right: -6px;
2390 margin-right: -6px;
2391 margin-top: 0px;
2391 margin-top: 0px;
2392 }
2392 }
2393
2393
2394 #graph_content {
2394 #graph_content {
2395 width: 80%;
2395 width: 80%;
2396 float: left;
2396 float: left;
2397 }
2397 }
2398
2398
2399 #graph_content .container_header {
2399 #graph_content .container_header {
2400 border-bottom: 1px solid #DDD;
2400 border-bottom: 1px solid #DDD;
2401 padding: 10px;
2401 padding: 10px;
2402 height: 25px;
2402 height: 25px;
2403 }
2403 }
2404
2404
2405 #graph_content #rev_range_container {
2405 #graph_content #rev_range_container {
2406 padding: 7px 20px;
2406 padding: 7px 20px;
2407 float: left;
2407 float: left;
2408 }
2408 }
2409
2409
2410 #graph_content .container {
2410 #graph_content .container {
2411 border-bottom: 1px solid #DDD;
2411 border-bottom: 1px solid #DDD;
2412 height: 56px;
2412 height: 56px;
2413 overflow: hidden;
2413 overflow: hidden;
2414 }
2414 }
2415
2415
2416 #graph_content .container .right {
2416 #graph_content .container .right {
2417 float: right;
2417 float: right;
2418 width: 23%;
2418 width: 23%;
2419 text-align: right;
2419 text-align: right;
2420 }
2420 }
2421
2421
2422 #graph_content .container .left {
2422 #graph_content .container .left {
2423 float: left;
2423 float: left;
2424 width: 25%;
2424 width: 25%;
2425 padding-left: 5px;
2425 padding-left: 5px;
2426 }
2426 }
2427
2427
2428 #graph_content .container .mid {
2428 #graph_content .container .mid {
2429 float: left;
2429 float: left;
2430 width: 49%;
2430 width: 49%;
2431 }
2431 }
2432
2432
2433
2433
2434 #graph_content .container .left .date {
2434 #graph_content .container .left .date {
2435 color: #666;
2435 color: #666;
2436 padding-left: 22px;
2436 padding-left: 22px;
2437 font-size: 10px;
2437 font-size: 10px;
2438 }
2438 }
2439
2439
2440 #graph_content .container .left .author {
2440 #graph_content .container .left .author {
2441 height: 22px;
2441 height: 22px;
2442 }
2442 }
2443
2443
2444 #graph_content .container .left .author .user {
2444 #graph_content .container .left .author .user {
2445 color: #444444;
2445 color: #444444;
2446 float: left;
2446 float: left;
2447 margin-left: -4px;
2447 margin-left: -4px;
2448 margin-top: 4px;
2448 margin-top: 4px;
2449 }
2449 }
2450
2450
2451 #graph_content .container .mid .message {
2451 #graph_content .container .mid .message {
2452 white-space: pre-wrap;
2452 white-space: pre-wrap;
2453 }
2453 }
2454
2454
2455 #graph_content .container .mid .message a:hover{
2455 #graph_content .container .mid .message a:hover{
2456 text-decoration: none;
2456 text-decoration: none;
2457 }
2457 }
2458 #content #graph_content .message .revision-link,
2458 #content #graph_content .message .revision-link,
2459 #changeset_content .container .message .revision-link
2459 #changeset_content .container .message .revision-link
2460 {
2460 {
2461 color:#3F6F9F;
2461 color:#3F6F9F;
2462 font-weight: bold !important;
2462 font-weight: bold !important;
2463 }
2463 }
2464
2464
2465 #content #graph_content .message .issue-tracker-link,
2465 #content #graph_content .message .issue-tracker-link,
2466 #changeset_content .container .message .issue-tracker-link{
2466 #changeset_content .container .message .issue-tracker-link{
2467 color:#3F6F9F;
2467 color:#3F6F9F;
2468 font-weight: bold !important;
2468 font-weight: bold !important;
2469 }
2469 }
2470
2470
2471 .right .comments-container{
2471 .right .comments-container{
2472 padding-right: 5px;
2472 padding-right: 5px;
2473 margin-top:1px;
2473 margin-top:1px;
2474 float:right;
2474 float:right;
2475 height:14px;
2475 height:14px;
2476 }
2476 }
2477
2477
2478 .right .comments-cnt{
2478 .right .comments-cnt{
2479 float: left;
2479 float: left;
2480 color: rgb(136, 136, 136);
2480 color: rgb(136, 136, 136);
2481 padding-right: 2px;
2481 padding-right: 2px;
2482 }
2482 }
2483
2483
2484 .right .changes{
2484 .right .changes{
2485 clear: both;
2485 clear: both;
2486 }
2486 }
2487
2487
2488 .right .changes .changed_total {
2488 .right .changes .changed_total {
2489 display: block;
2489 display: block;
2490 float: right;
2490 float: right;
2491 text-align: center;
2491 text-align: center;
2492 min-width: 45px;
2492 min-width: 45px;
2493 cursor: pointer;
2493 cursor: pointer;
2494 color: #444444;
2494 color: #444444;
2495 background: #FEA;
2495 background: #FEA;
2496 -webkit-border-radius: 0px 0px 0px 6px;
2496 -webkit-border-radius: 0px 0px 0px 6px;
2497 -moz-border-radius: 0px 0px 0px 6px;
2497 -moz-border-radius: 0px 0px 0px 6px;
2498 border-radius: 0px 0px 0px 6px;
2498 border-radius: 0px 0px 0px 6px;
2499 padding: 1px;
2499 padding: 1px;
2500 }
2500 }
2501
2501
2502 .right .changes .added,.changed,.removed {
2502 .right .changes .added,.changed,.removed {
2503 display: block;
2503 display: block;
2504 padding: 1px;
2504 padding: 1px;
2505 color: #444444;
2505 color: #444444;
2506 float: right;
2506 float: right;
2507 text-align: center;
2507 text-align: center;
2508 min-width: 15px;
2508 min-width: 15px;
2509 }
2509 }
2510
2510
2511 .right .changes .added {
2511 .right .changes .added {
2512 background: #CFC;
2512 background: #CFC;
2513 }
2513 }
2514
2514
2515 .right .changes .changed {
2515 .right .changes .changed {
2516 background: #FEA;
2516 background: #FEA;
2517 }
2517 }
2518
2518
2519 .right .changes .removed {
2519 .right .changes .removed {
2520 background: #FAA;
2520 background: #FAA;
2521 }
2521 }
2522
2522
2523 .right .merge {
2523 .right .merge {
2524 padding: 1px 3px 1px 3px;
2524 padding: 1px 3px 1px 3px;
2525 background-color: #fca062;
2525 background-color: #fca062;
2526 font-size: 10px;
2526 font-size: 10px;
2527 font-weight: bold;
2527 font-weight: bold;
2528 color: #ffffff;
2528 color: #ffffff;
2529 text-transform: uppercase;
2529 text-transform: uppercase;
2530 white-space: nowrap;
2530 white-space: nowrap;
2531 -webkit-border-radius: 3px;
2531 -webkit-border-radius: 3px;
2532 -moz-border-radius: 3px;
2532 -moz-border-radius: 3px;
2533 border-radius: 3px;
2533 border-radius: 3px;
2534 margin-right: 2px;
2534 margin-right: 2px;
2535 }
2535 }
2536
2536
2537 .right .parent {
2537 .right .parent {
2538 color: #666666;
2538 color: #666666;
2539 clear:both;
2539 clear:both;
2540 }
2540 }
2541 .right .logtags{
2541 .right .logtags{
2542 padding: 2px 2px 2px 2px;
2542 padding: 2px 2px 2px 2px;
2543 }
2543 }
2544 .right .logtags .branchtag,.logtags .branchtag {
2544 .right .logtags .branchtag,.logtags .branchtag {
2545 padding: 1px 3px 1px 3px;
2545 padding: 1px 3px 1px 3px;
2546 background-color: #bfbfbf;
2546 background-color: #bfbfbf;
2547 font-size: 10px;
2547 font-size: 10px;
2548 font-weight: bold;
2548 font-weight: bold;
2549 color: #ffffff;
2549 color: #ffffff;
2550 text-transform: uppercase;
2550 text-transform: uppercase;
2551 white-space: nowrap;
2551 white-space: nowrap;
2552 -webkit-border-radius: 3px;
2552 -webkit-border-radius: 3px;
2553 -moz-border-radius: 3px;
2553 -moz-border-radius: 3px;
2554 border-radius: 3px;
2554 border-radius: 3px;
2555 }
2555 }
2556 .right .logtags .branchtag a:hover,.logtags .branchtag a{
2556 .right .logtags .branchtag a:hover,.logtags .branchtag a{
2557 color: #ffffff;
2557 color: #ffffff;
2558 }
2558 }
2559 .right .logtags .branchtag a:hover,.logtags .branchtag a:hover{
2559 .right .logtags .branchtag a:hover,.logtags .branchtag a:hover{
2560 text-decoration: none;
2560 text-decoration: none;
2561 color: #ffffff;
2561 color: #ffffff;
2562 }
2562 }
2563 .right .logtags .tagtag,.logtags .tagtag {
2563 .right .logtags .tagtag,.logtags .tagtag {
2564 padding: 1px 3px 1px 3px;
2564 padding: 1px 3px 1px 3px;
2565 background-color: #62cffc;
2565 background-color: #62cffc;
2566 font-size: 10px;
2566 font-size: 10px;
2567 font-weight: bold;
2567 font-weight: bold;
2568 color: #ffffff;
2568 color: #ffffff;
2569 text-transform: uppercase;
2569 text-transform: uppercase;
2570 white-space: nowrap;
2570 white-space: nowrap;
2571 -webkit-border-radius: 3px;
2571 -webkit-border-radius: 3px;
2572 -moz-border-radius: 3px;
2572 -moz-border-radius: 3px;
2573 border-radius: 3px;
2573 border-radius: 3px;
2574 }
2574 }
2575 .right .logtags .tagtag a:hover,.logtags .tagtag a{
2575 .right .logtags .tagtag a:hover,.logtags .tagtag a{
2576 color: #ffffff;
2576 color: #ffffff;
2577 }
2577 }
2578 .right .logtags .tagtag a:hover,.logtags .tagtag a:hover{
2578 .right .logtags .tagtag a:hover,.logtags .tagtag a:hover{
2579 text-decoration: none;
2579 text-decoration: none;
2580 color: #ffffff;
2580 color: #ffffff;
2581 }
2581 }
2582 .right .logbooks .bookbook,.logbooks .bookbook {
2582 .right .logbooks .bookbook,.logbooks .bookbook {
2583 padding: 1px 3px 2px;
2583 padding: 1px 3px 2px;
2584 background-color: #46A546;
2584 background-color: #46A546;
2585 font-size: 9.75px;
2585 font-size: 9.75px;
2586 font-weight: bold;
2586 font-weight: bold;
2587 color: #ffffff;
2587 color: #ffffff;
2588 text-transform: uppercase;
2588 text-transform: uppercase;
2589 white-space: nowrap;
2589 white-space: nowrap;
2590 -webkit-border-radius: 3px;
2590 -webkit-border-radius: 3px;
2591 -moz-border-radius: 3px;
2591 -moz-border-radius: 3px;
2592 border-radius: 3px;
2592 border-radius: 3px;
2593 }
2593 }
2594 .right .logbooks .bookbook,.logbooks .bookbook a{
2594 .right .logbooks .bookbook,.logbooks .bookbook a{
2595 color: #ffffff;
2595 color: #ffffff;
2596 }
2596 }
2597 .right .logbooks .bookbook,.logbooks .bookbook a:hover{
2597 .right .logbooks .bookbook,.logbooks .bookbook a:hover{
2598 text-decoration: none;
2598 text-decoration: none;
2599 color: #ffffff;
2599 color: #ffffff;
2600 }
2600 }
2601 div.browserblock {
2601 div.browserblock {
2602 overflow: hidden;
2602 overflow: hidden;
2603 border: 1px solid #ccc;
2603 border: 1px solid #ccc;
2604 background: #f8f8f8;
2604 background: #f8f8f8;
2605 font-size: 100%;
2605 font-size: 100%;
2606 line-height: 125%;
2606 line-height: 125%;
2607 padding: 0;
2607 padding: 0;
2608 -webkit-border-radius: 6px 6px 0px 0px;
2608 -webkit-border-radius: 6px 6px 0px 0px;
2609 -moz-border-radius: 6px 6px 0px 0px;
2609 -moz-border-radius: 6px 6px 0px 0px;
2610 border-radius: 6px 6px 0px 0px;
2610 border-radius: 6px 6px 0px 0px;
2611 }
2611 }
2612
2612
2613 div.browserblock .browser-header {
2613 div.browserblock .browser-header {
2614 background: #FFF;
2614 background: #FFF;
2615 padding: 10px 0px 15px 0px;
2615 padding: 10px 0px 15px 0px;
2616 width: 100%;
2616 width: 100%;
2617 }
2617 }
2618
2618
2619 div.browserblock .browser-nav {
2619 div.browserblock .browser-nav {
2620 float: left
2620 float: left
2621 }
2621 }
2622
2622
2623 div.browserblock .browser-branch {
2623 div.browserblock .browser-branch {
2624 float: left;
2624 float: left;
2625 }
2625 }
2626
2626
2627 div.browserblock .browser-branch label {
2627 div.browserblock .browser-branch label {
2628 color: #4A4A4A;
2628 color: #4A4A4A;
2629 vertical-align: text-top;
2629 vertical-align: text-top;
2630 }
2630 }
2631
2631
2632 div.browserblock .browser-header span {
2632 div.browserblock .browser-header span {
2633 margin-left: 5px;
2633 margin-left: 5px;
2634 font-weight: 700;
2634 font-weight: 700;
2635 }
2635 }
2636
2636
2637 div.browserblock .browser-search {
2637 div.browserblock .browser-search {
2638 clear: both;
2638 clear: both;
2639 padding: 8px 8px 0px 5px;
2639 padding: 8px 8px 0px 5px;
2640 height: 20px;
2640 height: 20px;
2641 }
2641 }
2642
2642
2643 div.browserblock #node_filter_box {
2643 div.browserblock #node_filter_box {
2644
2644
2645 }
2645 }
2646
2646
2647 div.browserblock .search_activate {
2647 div.browserblock .search_activate {
2648 float: left
2648 float: left
2649 }
2649 }
2650
2650
2651 div.browserblock .add_node {
2651 div.browserblock .add_node {
2652 float: left;
2652 float: left;
2653 padding-left: 5px;
2653 padding-left: 5px;
2654 }
2654 }
2655
2655
2656 div.browserblock .search_activate a:hover,div.browserblock .add_node a:hover
2656 div.browserblock .search_activate a:hover,div.browserblock .add_node a:hover
2657 {
2657 {
2658 text-decoration: none !important;
2658 text-decoration: none !important;
2659 }
2659 }
2660
2660
2661 div.browserblock .browser-body {
2661 div.browserblock .browser-body {
2662 background: #EEE;
2662 background: #EEE;
2663 border-top: 1px solid #CCC;
2663 border-top: 1px solid #CCC;
2664 }
2664 }
2665
2665
2666 table.code-browser {
2666 table.code-browser {
2667 border-collapse: collapse;
2667 border-collapse: collapse;
2668 width: 100%;
2668 width: 100%;
2669 }
2669 }
2670
2670
2671 table.code-browser tr {
2671 table.code-browser tr {
2672 margin: 3px;
2672 margin: 3px;
2673 }
2673 }
2674
2674
2675 table.code-browser thead th {
2675 table.code-browser thead th {
2676 background-color: #EEE;
2676 background-color: #EEE;
2677 height: 20px;
2677 height: 20px;
2678 font-size: 1.1em;
2678 font-size: 1.1em;
2679 font-weight: 700;
2679 font-weight: 700;
2680 text-align: left;
2680 text-align: left;
2681 padding-left: 10px;
2681 padding-left: 10px;
2682 }
2682 }
2683
2683
2684 table.code-browser tbody td {
2684 table.code-browser tbody td {
2685 padding-left: 10px;
2685 padding-left: 10px;
2686 height: 20px;
2686 height: 20px;
2687 }
2687 }
2688
2688
2689 table.code-browser .browser-file {
2689 table.code-browser .browser-file {
2690 background: url("../images/icons/document_16.png") no-repeat scroll 3px;
2690 background: url("../images/icons/document_16.png") no-repeat scroll 3px;
2691 height: 16px;
2691 height: 16px;
2692 padding-left: 20px;
2692 padding-left: 20px;
2693 text-align: left;
2693 text-align: left;
2694 }
2694 }
2695 .diffblock .changeset_header {
2695 .diffblock .changeset_header {
2696 height: 16px;
2696 height: 16px;
2697 }
2697 }
2698 .diffblock .changeset_file {
2698 .diffblock .changeset_file {
2699 background: url("../images/icons/file.png") no-repeat scroll 3px;
2699 background: url("../images/icons/file.png") no-repeat scroll 3px;
2700 text-align: left;
2700 text-align: left;
2701 float: left;
2701 float: left;
2702 padding: 2px 0px 2px 22px;
2702 padding: 2px 0px 2px 22px;
2703 }
2703 }
2704 .diffblock .diff-menu-wrapper{
2704 .diffblock .diff-menu-wrapper{
2705 float: left;
2705 float: left;
2706 }
2706 }
2707
2707
2708 .diffblock .diff-menu{
2708 .diffblock .diff-menu{
2709 position: absolute;
2709 position: absolute;
2710 background: none repeat scroll 0 0 #FFFFFF;
2710 background: none repeat scroll 0 0 #FFFFFF;
2711 border-color: #003367 #666666 #666666;
2711 border-color: #003367 #666666 #666666;
2712 border-right: 1px solid #666666;
2712 border-right: 1px solid #666666;
2713 border-style: solid solid solid;
2713 border-style: solid solid solid;
2714 border-width: 1px;
2714 border-width: 1px;
2715 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
2715 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
2716 margin-top:5px;
2716 margin-top:5px;
2717 margin-left:1px;
2717 margin-left:1px;
2718
2718
2719 }
2719 }
2720 .diffblock .diff-actions {
2720 .diffblock .diff-actions {
2721 padding: 2px 0px 0px 2px;
2721 padding: 2px 0px 0px 2px;
2722 float: left;
2722 float: left;
2723 }
2723 }
2724 .diffblock .diff-menu ul li {
2724 .diffblock .diff-menu ul li {
2725 padding: 0px 0px 0px 0px !important;
2725 padding: 0px 0px 0px 0px !important;
2726 }
2726 }
2727 .diffblock .diff-menu ul li a{
2727 .diffblock .diff-menu ul li a{
2728 display: block;
2728 display: block;
2729 padding: 3px 8px 3px 8px !important;
2729 padding: 3px 8px 3px 8px !important;
2730 }
2730 }
2731 .diffblock .diff-menu ul li a:hover{
2731 .diffblock .diff-menu ul li a:hover{
2732 text-decoration: none;
2732 text-decoration: none;
2733 background-color: #EEEEEE;
2733 background-color: #EEEEEE;
2734 }
2734 }
2735 table.code-browser .browser-dir {
2735 table.code-browser .browser-dir {
2736 background: url("../images/icons/folder_16.png") no-repeat scroll 3px;
2736 background: url("../images/icons/folder_16.png") no-repeat scroll 3px;
2737 height: 16px;
2737 height: 16px;
2738 padding-left: 20px;
2738 padding-left: 20px;
2739 text-align: left;
2739 text-align: left;
2740 }
2740 }
2741
2741
2742 .box .search {
2742 .box .search {
2743 clear: both;
2743 clear: both;
2744 overflow: hidden;
2744 overflow: hidden;
2745 margin: 0;
2745 margin: 0;
2746 padding: 0 20px 10px;
2746 padding: 0 20px 10px;
2747 }
2747 }
2748
2748
2749 .box .search div.search_path {
2749 .box .search div.search_path {
2750 background: none repeat scroll 0 0 #EEE;
2750 background: none repeat scroll 0 0 #EEE;
2751 border: 1px solid #CCC;
2751 border: 1px solid #CCC;
2752 color: blue;
2752 color: blue;
2753 margin-bottom: 10px;
2753 margin-bottom: 10px;
2754 padding: 10px 0;
2754 padding: 10px 0;
2755 }
2755 }
2756
2756
2757 .box .search div.search_path div.link {
2757 .box .search div.search_path div.link {
2758 font-weight: 700;
2758 font-weight: 700;
2759 margin-left: 25px;
2759 margin-left: 25px;
2760 }
2760 }
2761
2761
2762 .box .search div.search_path div.link a {
2762 .box .search div.search_path div.link a {
2763 color: #003367;
2763 color: #003367;
2764 cursor: pointer;
2764 cursor: pointer;
2765 text-decoration: none;
2765 text-decoration: none;
2766 }
2766 }
2767
2767
2768 #path_unlock {
2768 #path_unlock {
2769 color: red;
2769 color: red;
2770 font-size: 1.2em;
2770 font-size: 1.2em;
2771 padding-left: 4px;
2771 padding-left: 4px;
2772 }
2772 }
2773
2773
2774 .info_box span {
2774 .info_box span {
2775 margin-left: 3px;
2775 margin-left: 3px;
2776 margin-right: 3px;
2776 margin-right: 3px;
2777 }
2777 }
2778
2778
2779 .info_box .rev {
2779 .info_box .rev {
2780 color: #003367;
2780 color: #003367;
2781 font-size: 1.6em;
2781 font-size: 1.6em;
2782 font-weight: bold;
2782 font-weight: bold;
2783 vertical-align: sub;
2783 vertical-align: sub;
2784 }
2784 }
2785
2785
2786 .info_box input#at_rev,.info_box input#size {
2786 .info_box input#at_rev,.info_box input#size {
2787 background: #FFF;
2787 background: #FFF;
2788 border-top: 1px solid #b3b3b3;
2788 border-top: 1px solid #b3b3b3;
2789 border-left: 1px solid #b3b3b3;
2789 border-left: 1px solid #b3b3b3;
2790 border-right: 1px solid #eaeaea;
2790 border-right: 1px solid #eaeaea;
2791 border-bottom: 1px solid #eaeaea;
2791 border-bottom: 1px solid #eaeaea;
2792 color: #000;
2792 color: #000;
2793 font-size: 12px;
2793 font-size: 12px;
2794 margin: 0;
2794 margin: 0;
2795 padding: 1px 5px 1px;
2795 padding: 1px 5px 1px;
2796 }
2796 }
2797
2797
2798 .info_box input#view {
2798 .info_box input#view {
2799 text-align: center;
2799 text-align: center;
2800 padding: 4px 3px 2px 2px;
2800 padding: 4px 3px 2px 2px;
2801 }
2801 }
2802
2802
2803 .yui-overlay,.yui-panel-container {
2803 .yui-overlay,.yui-panel-container {
2804 visibility: hidden;
2804 visibility: hidden;
2805 position: absolute;
2805 position: absolute;
2806 z-index: 2;
2806 z-index: 2;
2807 }
2807 }
2808
2808
2809 .yui-tt {
2809 .yui-tt {
2810 visibility: hidden;
2810 visibility: hidden;
2811 position: absolute;
2811 position: absolute;
2812 color: #666;
2812 color: #666;
2813 background-color: #FFF;
2813 background-color: #FFF;
2814 border: 2px solid #003367;
2814 border: 2px solid #003367;
2815 font: 100% sans-serif;
2815 font: 100% sans-serif;
2816 width: auto;
2816 width: auto;
2817 opacity: 1px;
2817 opacity: 1px;
2818 padding: 8px;
2818 padding: 8px;
2819 white-space: pre-wrap;
2819 white-space: pre-wrap;
2820 -webkit-border-radius: 8px 8px 8px 8px;
2820 -webkit-border-radius: 8px 8px 8px 8px;
2821 -khtml-border-radius: 8px 8px 8px 8px;
2821 -khtml-border-radius: 8px 8px 8px 8px;
2822 -moz-border-radius: 8px 8px 8px 8px;
2822 -moz-border-radius: 8px 8px 8px 8px;
2823 border-radius: 8px 8px 8px 8px;
2823 border-radius: 8px 8px 8px 8px;
2824 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
2824 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
2825 }
2825 }
2826
2826
2827 .ac {
2827 .ac {
2828 vertical-align: top;
2828 vertical-align: top;
2829 }
2829 }
2830
2830
2831 .ac .yui-ac {
2831 .ac .yui-ac {
2832 position: relative;
2832 position: relative;
2833 font-size: 100%;
2833 font-size: 100%;
2834 }
2834 }
2835
2835
2836 .ac .perm_ac {
2836 .ac .perm_ac {
2837 width: 20em;
2837 width: 20em;
2838 }
2838 }
2839
2839
2840 .ac .yui-ac-input {
2840 .ac .yui-ac-input {
2841 width: 100%;
2841 width: 100%;
2842 }
2842 }
2843
2843
2844 .ac .yui-ac-container {
2844 .ac .yui-ac-container {
2845 position: absolute;
2845 position: absolute;
2846 top: 1.6em;
2846 top: 1.6em;
2847 width: 100%;
2847 width: 100%;
2848 }
2848 }
2849
2849
2850 .ac .yui-ac-content {
2850 .ac .yui-ac-content {
2851 position: absolute;
2851 position: absolute;
2852 width: 100%;
2852 width: 100%;
2853 border: 1px solid gray;
2853 border: 1px solid gray;
2854 background: #fff;
2854 background: #fff;
2855 overflow: hidden;
2855 overflow: hidden;
2856 z-index: 9050;
2856 z-index: 9050;
2857 }
2857 }
2858
2858
2859 .ac .yui-ac-shadow {
2859 .ac .yui-ac-shadow {
2860 position: absolute;
2860 position: absolute;
2861 width: 100%;
2861 width: 100%;
2862 background: #000;
2862 background: #000;
2863 -moz-opacity: 0.1px;
2863 -moz-opacity: 0.1px;
2864 opacity: .10;
2864 opacity: .10;
2865 filter: alpha(opacity = 10);
2865 filter: alpha(opacity = 10);
2866 z-index: 9049;
2866 z-index: 9049;
2867 margin: .3em;
2867 margin: .3em;
2868 }
2868 }
2869
2869
2870 .ac .yui-ac-content ul {
2870 .ac .yui-ac-content ul {
2871 width: 100%;
2871 width: 100%;
2872 margin: 0;
2872 margin: 0;
2873 padding: 0;
2873 padding: 0;
2874 }
2874 }
2875
2875
2876 .ac .yui-ac-content li {
2876 .ac .yui-ac-content li {
2877 cursor: default;
2877 cursor: default;
2878 white-space: nowrap;
2878 white-space: nowrap;
2879 margin: 0;
2879 margin: 0;
2880 padding: 2px 5px;
2880 padding: 2px 5px;
2881 }
2881 }
2882
2882
2883 .ac .yui-ac-content li.yui-ac-prehighlight {
2883 .ac .yui-ac-content li.yui-ac-prehighlight {
2884 background: #B3D4FF;
2884 background: #B3D4FF;
2885 }
2885 }
2886
2886
2887 .ac .yui-ac-content li.yui-ac-highlight {
2887 .ac .yui-ac-content li.yui-ac-highlight {
2888 background: #556CB5;
2888 background: #556CB5;
2889 color: #FFF;
2889 color: #FFF;
2890 }
2890 }
2891
2891
2892 .follow {
2892 .follow {
2893 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
2893 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
2894 height: 16px;
2894 height: 16px;
2895 width: 20px;
2895 width: 20px;
2896 cursor: pointer;
2896 cursor: pointer;
2897 display: block;
2897 display: block;
2898 float: right;
2898 float: right;
2899 margin-top: 2px;
2899 margin-top: 2px;
2900 }
2900 }
2901
2901
2902 .following {
2902 .following {
2903 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
2903 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
2904 height: 16px;
2904 height: 16px;
2905 width: 20px;
2905 width: 20px;
2906 cursor: pointer;
2906 cursor: pointer;
2907 display: block;
2907 display: block;
2908 float: right;
2908 float: right;
2909 margin-top: 2px;
2909 margin-top: 2px;
2910 }
2910 }
2911
2911
2912 .currently_following {
2912 .currently_following {
2913 padding-left: 10px;
2913 padding-left: 10px;
2914 padding-bottom: 5px;
2914 padding-bottom: 5px;
2915 }
2915 }
2916
2916
2917 .add_icon {
2917 .add_icon {
2918 background: url("../images/icons/add.png") no-repeat scroll 3px;
2918 background: url("../images/icons/add.png") no-repeat scroll 3px;
2919 padding-left: 20px;
2919 padding-left: 20px;
2920 padding-top: 0px;
2920 padding-top: 0px;
2921 text-align: left;
2921 text-align: left;
2922 }
2922 }
2923
2923
2924 .edit_icon {
2924 .edit_icon {
2925 background: url("../images/icons/folder_edit.png") no-repeat scroll 3px;
2925 background: url("../images/icons/folder_edit.png") no-repeat scroll 3px;
2926 padding-left: 20px;
2926 padding-left: 20px;
2927 padding-top: 0px;
2927 padding-top: 0px;
2928 text-align: left;
2928 text-align: left;
2929 }
2929 }
2930
2930
2931 .delete_icon {
2931 .delete_icon {
2932 background: url("../images/icons/delete.png") no-repeat scroll 3px;
2932 background: url("../images/icons/delete.png") no-repeat scroll 3px;
2933 padding-left: 20px;
2933 padding-left: 20px;
2934 padding-top: 0px;
2934 padding-top: 0px;
2935 text-align: left;
2935 text-align: left;
2936 }
2936 }
2937
2937
2938 .refresh_icon {
2938 .refresh_icon {
2939 background: url("../images/icons/arrow_refresh.png") no-repeat scroll
2939 background: url("../images/icons/arrow_refresh.png") no-repeat scroll
2940 3px;
2940 3px;
2941 padding-left: 20px;
2941 padding-left: 20px;
2942 padding-top: 0px;
2942 padding-top: 0px;
2943 text-align: left;
2943 text-align: left;
2944 }
2944 }
2945
2945
2946 .pull_icon {
2946 .pull_icon {
2947 background: url("../images/icons/connect.png") no-repeat scroll 3px;
2947 background: url("../images/icons/connect.png") no-repeat scroll 3px;
2948 padding-left: 20px;
2948 padding-left: 20px;
2949 padding-top: 0px;
2949 padding-top: 0px;
2950 text-align: left;
2950 text-align: left;
2951 }
2951 }
2952
2952
2953 .rss_icon {
2953 .rss_icon {
2954 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
2954 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
2955 padding-left: 20px;
2955 padding-left: 20px;
2956 padding-top: 4px;
2956 padding-top: 4px;
2957 text-align: left;
2957 text-align: left;
2958 font-size: 8px
2958 font-size: 8px
2959 }
2959 }
2960
2960
2961 .atom_icon {
2961 .atom_icon {
2962 background: url("../images/icons/atom.png") no-repeat scroll 3px;
2962 background: url("../images/icons/atom.png") no-repeat scroll 3px;
2963 padding-left: 20px;
2963 padding-left: 20px;
2964 padding-top: 4px;
2964 padding-top: 4px;
2965 text-align: left;
2965 text-align: left;
2966 font-size: 8px
2966 font-size: 8px
2967 }
2967 }
2968
2968
2969 .archive_icon {
2969 .archive_icon {
2970 background: url("../images/icons/compress.png") no-repeat scroll 3px;
2970 background: url("../images/icons/compress.png") no-repeat scroll 3px;
2971 padding-left: 20px;
2971 padding-left: 20px;
2972 text-align: left;
2972 text-align: left;
2973 padding-top: 1px;
2973 padding-top: 1px;
2974 }
2974 }
2975
2975
2976 .start_following_icon {
2976 .start_following_icon {
2977 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
2977 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
2978 padding-left: 20px;
2978 padding-left: 20px;
2979 text-align: left;
2979 text-align: left;
2980 padding-top: 0px;
2980 padding-top: 0px;
2981 }
2981 }
2982
2982
2983 .stop_following_icon {
2983 .stop_following_icon {
2984 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
2984 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
2985 padding-left: 20px;
2985 padding-left: 20px;
2986 text-align: left;
2986 text-align: left;
2987 padding-top: 0px;
2987 padding-top: 0px;
2988 }
2988 }
2989
2989
2990 .action_button {
2990 .action_button {
2991 border: 0;
2991 border: 0;
2992 display: inline;
2992 display: inline;
2993 }
2993 }
2994
2994
2995 .action_button:hover {
2995 .action_button:hover {
2996 border: 0;
2996 border: 0;
2997 text-decoration: underline;
2997 text-decoration: underline;
2998 cursor: pointer;
2998 cursor: pointer;
2999 }
2999 }
3000
3000
3001 #switch_repos {
3001 #switch_repos {
3002 position: absolute;
3002 position: absolute;
3003 height: 25px;
3003 height: 25px;
3004 z-index: 1;
3004 z-index: 1;
3005 }
3005 }
3006
3006
3007 #switch_repos select {
3007 #switch_repos select {
3008 min-width: 150px;
3008 min-width: 150px;
3009 max-height: 250px;
3009 max-height: 250px;
3010 z-index: 1;
3010 z-index: 1;
3011 }
3011 }
3012
3012
3013 .breadcrumbs {
3013 .breadcrumbs {
3014 border: medium none;
3014 border: medium none;
3015 color: #FFF;
3015 color: #FFF;
3016 float: left;
3016 float: left;
3017 text-transform: uppercase;
3017 text-transform: uppercase;
3018 font-weight: 700;
3018 font-weight: 700;
3019 font-size: 14px;
3019 font-size: 14px;
3020 margin: 0;
3020 margin: 0;
3021 padding: 11px 0 11px 10px;
3021 padding: 11px 0 11px 10px;
3022 }
3022 }
3023
3023
3024 .breadcrumbs .hash {
3024 .breadcrumbs .hash {
3025 text-transform: none;
3025 text-transform: none;
3026 color: #fff;
3026 color: #fff;
3027 }
3027 }
3028
3028
3029 .breadcrumbs a {
3029 .breadcrumbs a {
3030 color: #FFF;
3030 color: #FFF;
3031 }
3031 }
3032
3032
3033 .flash_msg {
3033 .flash_msg {
3034
3034
3035 }
3035 }
3036
3036
3037 .flash_msg ul {
3037 .flash_msg ul {
3038
3038
3039 }
3039 }
3040
3040
3041 .error_msg {
3041 .error_msg {
3042 background-color: #c43c35;
3042 background-color: #c43c35;
3043 background-repeat: repeat-x;
3043 background-repeat: repeat-x;
3044 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b),
3044 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b),
3045 to(#c43c35) );
3045 to(#c43c35) );
3046 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3046 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3047 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3047 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3048 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b),
3048 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b),
3049 color-stop(100%, #c43c35) );
3049 color-stop(100%, #c43c35) );
3050 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3050 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3051 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3051 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3052 background-image: linear-gradient(top, #ee5f5b, #c43c35);
3052 background-image: linear-gradient(top, #ee5f5b, #c43c35);
3053 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b',
3053 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b',
3054 endColorstr='#c43c35', GradientType=0 );
3054 endColorstr='#c43c35', GradientType=0 );
3055 border-color: #c43c35 #c43c35 #882a25;
3055 border-color: #c43c35 #c43c35 #882a25;
3056 }
3056 }
3057
3057
3058 .warning_msg {
3058 .warning_msg {
3059 color: #404040 !important;
3059 color: #404040 !important;
3060 background-color: #eedc94;
3060 background-color: #eedc94;
3061 background-repeat: repeat-x;
3061 background-repeat: repeat-x;
3062 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),
3062 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),
3063 to(#eedc94) );
3063 to(#eedc94) );
3064 background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
3064 background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
3065 background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
3065 background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
3066 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1),
3066 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1),
3067 color-stop(100%, #eedc94) );
3067 color-stop(100%, #eedc94) );
3068 background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
3068 background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
3069 background-image: -o-linear-gradient(top, #fceec1, #eedc94);
3069 background-image: -o-linear-gradient(top, #fceec1, #eedc94);
3070 background-image: linear-gradient(top, #fceec1, #eedc94);
3070 background-image: linear-gradient(top, #fceec1, #eedc94);
3071 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1',
3071 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1',
3072 endColorstr='#eedc94', GradientType=0 );
3072 endColorstr='#eedc94', GradientType=0 );
3073 border-color: #eedc94 #eedc94 #e4c652;
3073 border-color: #eedc94 #eedc94 #e4c652;
3074 }
3074 }
3075
3075
3076 .success_msg {
3076 .success_msg {
3077 background-color: #57a957;
3077 background-color: #57a957;
3078 background-repeat: repeat-x !important;
3078 background-repeat: repeat-x !important;
3079 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462),
3079 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462),
3080 to(#57a957) );
3080 to(#57a957) );
3081 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3081 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3082 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3082 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3083 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462),
3083 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462),
3084 color-stop(100%, #57a957) );
3084 color-stop(100%, #57a957) );
3085 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3085 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3086 background-image: -o-linear-gradient(top, #62c462, #57a957);
3086 background-image: -o-linear-gradient(top, #62c462, #57a957);
3087 background-image: linear-gradient(top, #62c462, #57a957);
3087 background-image: linear-gradient(top, #62c462, #57a957);
3088 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462',
3088 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462',
3089 endColorstr='#57a957', GradientType=0 );
3089 endColorstr='#57a957', GradientType=0 );
3090 border-color: #57a957 #57a957 #3d773d;
3090 border-color: #57a957 #57a957 #3d773d;
3091 }
3091 }
3092
3092
3093 .notice_msg {
3093 .notice_msg {
3094 background-color: #339bb9;
3094 background-color: #339bb9;
3095 background-repeat: repeat-x;
3095 background-repeat: repeat-x;
3096 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de),
3096 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de),
3097 to(#339bb9) );
3097 to(#339bb9) );
3098 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3098 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3099 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3099 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3100 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de),
3100 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de),
3101 color-stop(100%, #339bb9) );
3101 color-stop(100%, #339bb9) );
3102 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3102 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3103 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3103 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3104 background-image: linear-gradient(top, #5bc0de, #339bb9);
3104 background-image: linear-gradient(top, #5bc0de, #339bb9);
3105 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de',
3105 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de',
3106 endColorstr='#339bb9', GradientType=0 );
3106 endColorstr='#339bb9', GradientType=0 );
3107 border-color: #339bb9 #339bb9 #22697d;
3107 border-color: #339bb9 #339bb9 #22697d;
3108 }
3108 }
3109
3109
3110 .success_msg,.error_msg,.notice_msg,.warning_msg {
3110 .success_msg,.error_msg,.notice_msg,.warning_msg {
3111 font-size: 12px;
3111 font-size: 12px;
3112 font-weight: 700;
3112 font-weight: 700;
3113 min-height: 14px;
3113 min-height: 14px;
3114 line-height: 14px;
3114 line-height: 14px;
3115 margin-bottom: 10px;
3115 margin-bottom: 10px;
3116 margin-top: 0;
3116 margin-top: 0;
3117 display: block;
3117 display: block;
3118 overflow: auto;
3118 overflow: auto;
3119 padding: 6px 10px 6px 10px;
3119 padding: 6px 10px 6px 10px;
3120 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3120 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3121 position: relative;
3121 position: relative;
3122 color: #FFF;
3122 color: #FFF;
3123 border-width: 1px;
3123 border-width: 1px;
3124 border-style: solid;
3124 border-style: solid;
3125 -webkit-border-radius: 4px;
3125 -webkit-border-radius: 4px;
3126 -moz-border-radius: 4px;
3126 -moz-border-radius: 4px;
3127 border-radius: 4px;
3127 border-radius: 4px;
3128 -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3128 -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3129 -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3129 -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3130 box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3130 box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3131 }
3131 }
3132
3132
3133 #msg_close {
3133 #msg_close {
3134 background: transparent url("../icons/cross_grey_small.png") no-repeat
3134 background: transparent url("../icons/cross_grey_small.png") no-repeat
3135 scroll 0 0;
3135 scroll 0 0;
3136 cursor: pointer;
3136 cursor: pointer;
3137 height: 16px;
3137 height: 16px;
3138 position: absolute;
3138 position: absolute;
3139 right: 5px;
3139 right: 5px;
3140 top: 5px;
3140 top: 5px;
3141 width: 16px;
3141 width: 16px;
3142 }
3142 }
3143 div#legend_data{
3143 div#legend_data{
3144 padding-left:10px;
3144 padding-left:10px;
3145 }
3145 }
3146 div#legend_container table{
3146 div#legend_container table{
3147 border: none !important;
3147 border: none !important;
3148 }
3148 }
3149 div#legend_container table,div#legend_choices table {
3149 div#legend_container table,div#legend_choices table {
3150 width: auto !important;
3150 width: auto !important;
3151 }
3151 }
3152
3152
3153 table#permissions_manage {
3153 table#permissions_manage {
3154 width: 0 !important;
3154 width: 0 !important;
3155 }
3155 }
3156
3156
3157 table#permissions_manage span.private_repo_msg {
3157 table#permissions_manage span.private_repo_msg {
3158 font-size: 0.8em;
3158 font-size: 0.8em;
3159 opacity: 0.6px;
3159 opacity: 0.6px;
3160 }
3160 }
3161
3161
3162 table#permissions_manage td.private_repo_msg {
3162 table#permissions_manage td.private_repo_msg {
3163 font-size: 0.8em;
3163 font-size: 0.8em;
3164 }
3164 }
3165
3165
3166 table#permissions_manage tr#add_perm_input td {
3166 table#permissions_manage tr#add_perm_input td {
3167 vertical-align: middle;
3167 vertical-align: middle;
3168 }
3168 }
3169
3169
3170 div.gravatar {
3170 div.gravatar {
3171 background-color: #FFF;
3171 background-color: #FFF;
3172 float: left;
3172 float: left;
3173 margin-right: 0.7em;
3173 margin-right: 0.7em;
3174 padding: 1px 1px 1px 1px;
3174 padding: 1px 1px 1px 1px;
3175 line-height:0;
3175 line-height:0;
3176 -webkit-border-radius: 3px;
3176 -webkit-border-radius: 3px;
3177 -khtml-border-radius: 3px;
3177 -khtml-border-radius: 3px;
3178 -moz-border-radius: 3px;
3178 -moz-border-radius: 3px;
3179 border-radius: 3px;
3179 border-radius: 3px;
3180 }
3180 }
3181
3181
3182 div.gravatar img {
3182 div.gravatar img {
3183 -webkit-border-radius: 2px;
3183 -webkit-border-radius: 2px;
3184 -khtml-border-radius: 2px;
3184 -khtml-border-radius: 2px;
3185 -moz-border-radius: 2px;
3185 -moz-border-radius: 2px;
3186 border-radius: 2px;
3186 border-radius: 2px;
3187 }
3187 }
3188
3188
3189 #header,#content,#footer {
3189 #header,#content,#footer {
3190 min-width: 978px;
3190 min-width: 978px;
3191 }
3191 }
3192
3192
3193 #content {
3193 #content {
3194 clear: both;
3194 clear: both;
3195 overflow: hidden;
3195 overflow: hidden;
3196 padding: 54px 10px 14px 10px;
3196 padding: 54px 10px 14px 10px;
3197 }
3197 }
3198
3198
3199 #content div.box div.title div.search {
3199 #content div.box div.title div.search {
3200
3200
3201 border-left: 1px solid #316293;
3201 border-left: 1px solid #316293;
3202 }
3202 }
3203
3203
3204 #content div.box div.title div.search div.input input {
3204 #content div.box div.title div.search div.input input {
3205 border: 1px solid #316293;
3205 border: 1px solid #316293;
3206 }
3206 }
3207
3207
3208 .ui-btn{
3208 .ui-btn{
3209 color: #515151;
3209 color: #515151;
3210 background-color: #DADADA;
3210 background-color: #DADADA;
3211 background-repeat: repeat-x;
3211 background-repeat: repeat-x;
3212 background-image: -khtml-gradient(linear, left top, left bottom, from(#F4F4F4),to(#DADADA) );
3212 background-image: -khtml-gradient(linear, left top, left bottom, from(#F4F4F4),to(#DADADA) );
3213 background-image: -moz-linear-gradient(top, #F4F4F4, #DADADA);
3213 background-image: -moz-linear-gradient(top, #F4F4F4, #DADADA);
3214 background-image: -ms-linear-gradient(top, #F4F4F4, #DADADA);
3214 background-image: -ms-linear-gradient(top, #F4F4F4, #DADADA);
3215 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #F4F4F4),color-stop(100%, #DADADA) );
3215 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #F4F4F4),color-stop(100%, #DADADA) );
3216 background-image: -webkit-linear-gradient(top, #F4F4F4, #DADADA) );
3216 background-image: -webkit-linear-gradient(top, #F4F4F4, #DADADA) );
3217 background-image: -o-linear-gradient(top, #F4F4F4, #DADADA) );
3217 background-image: -o-linear-gradient(top, #F4F4F4, #DADADA) );
3218 background-image: linear-gradient(top, #F4F4F4, #DADADA);
3218 background-image: linear-gradient(top, #F4F4F4, #DADADA);
3219 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F4F4F4', endColorstr='#DADADA', GradientType=0);
3219 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F4F4F4', endColorstr='#DADADA', GradientType=0);
3220
3220
3221 border-top: 1px solid #DDD;
3221 border-top: 1px solid #DDD;
3222 border-left: 1px solid #c6c6c6;
3222 border-left: 1px solid #c6c6c6;
3223 border-right: 1px solid #DDD;
3223 border-right: 1px solid #DDD;
3224 border-bottom: 1px solid #c6c6c6;
3224 border-bottom: 1px solid #c6c6c6;
3225 color: #515151;
3225 color: #515151;
3226 outline: none;
3226 outline: none;
3227 margin: 0px 3px 3px 0px;
3227 margin: 0px 3px 3px 0px;
3228 -webkit-border-radius: 4px 4px 4px 4px !important;
3228 -webkit-border-radius: 4px 4px 4px 4px !important;
3229 -khtml-border-radius: 4px 4px 4px 4px !important;
3229 -khtml-border-radius: 4px 4px 4px 4px !important;
3230 -moz-border-radius: 4px 4px 4px 4px !important;
3230 -moz-border-radius: 4px 4px 4px 4px !important;
3231 border-radius: 4px 4px 4px 4px !important;
3231 border-radius: 4px 4px 4px 4px !important;
3232 cursor: pointer !important;
3232 cursor: pointer !important;
3233 padding: 3px 3px 3px 3px;
3233 padding: 3px 3px 3px 3px;
3234 background-position: 0 -15px;
3234 background-position: 0 -15px;
3235
3235
3236 }
3236 }
3237 .ui-btn.xsmall{
3237 .ui-btn.xsmall{
3238 padding: 1px 2px 1px 1px;
3238 padding: 1px 2px 1px 1px;
3239 }
3239 }
3240 .ui-btn.clone{
3240 .ui-btn.clone{
3241 padding: 5px 2px 6px 1px;
3241 padding: 5px 2px 6px 1px;
3242 margin: 0px -4px 3px 0px;
3242 margin: 0px -4px 3px 0px;
3243 -webkit-border-radius: 4px 0px 0px 4px !important;
3243 -webkit-border-radius: 4px 0px 0px 4px !important;
3244 -khtml-border-radius: 4px 0px 0px 4px !important;
3244 -khtml-border-radius: 4px 0px 0px 4px !important;
3245 -moz-border-radius: 4px 0px 0px 4px !important;
3245 -moz-border-radius: 4px 0px 0px 4px !important;
3246 border-radius: 4px 0px 0px 4px !important;
3246 border-radius: 4px 0px 0px 4px !important;
3247 width: 100px;
3247 width: 100px;
3248 text-align: center;
3248 text-align: center;
3249 float: left;
3249 float: left;
3250 position: absolute;
3250 position: absolute;
3251 }
3251 }
3252 .ui-btn:focus {
3252 .ui-btn:focus {
3253 outline: none;
3253 outline: none;
3254 }
3254 }
3255 .ui-btn:hover{
3255 .ui-btn:hover{
3256 background-position: 0 0px;
3256 background-position: 0 0px;
3257 text-decoration: none;
3257 text-decoration: none;
3258 color: #515151;
3258 color: #515151;
3259 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 0 3px #FFFFFF !important;
3259 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 0 3px #FFFFFF !important;
3260 }
3260 }
3261
3261
3262 .ui-btn.red{
3262 .ui-btn.red{
3263 color:#fff;
3263 color:#fff;
3264 background-color: #c43c35;
3264 background-color: #c43c35;
3265 background-repeat: repeat-x;
3265 background-repeat: repeat-x;
3266 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
3266 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
3267 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3267 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3268 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3268 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3269 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
3269 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
3270 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3270 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3271 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3271 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3272 background-image: linear-gradient(top, #ee5f5b, #c43c35);
3272 background-image: linear-gradient(top, #ee5f5b, #c43c35);
3273 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
3273 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
3274 border-color: #c43c35 #c43c35 #882a25;
3274 border-color: #c43c35 #c43c35 #882a25;
3275 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3275 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3276 }
3276 }
3277
3277
3278
3278
3279 .ui-btn.blue{
3279 .ui-btn.blue{
3280 background-color: #339bb9;
3280 background-color: #339bb9;
3281 background-repeat: repeat-x;
3281 background-repeat: repeat-x;
3282 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
3282 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
3283 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3283 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3284 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3284 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3285 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
3285 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
3286 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3286 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3287 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3287 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3288 background-image: linear-gradient(top, #5bc0de, #339bb9);
3288 background-image: linear-gradient(top, #5bc0de, #339bb9);
3289 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
3289 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
3290 border-color: #339bb9 #339bb9 #22697d;
3290 border-color: #339bb9 #339bb9 #22697d;
3291 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3291 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3292 }
3292 }
3293
3293
3294 .ui-btn.green{
3294 .ui-btn.green{
3295 background-color: #57a957;
3295 background-color: #57a957;
3296 background-repeat: repeat-x;
3296 background-repeat: repeat-x;
3297 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
3297 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
3298 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3298 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3299 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3299 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3300 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
3300 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
3301 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3301 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3302 background-image: -o-linear-gradient(top, #62c462, #57a957);
3302 background-image: -o-linear-gradient(top, #62c462, #57a957);
3303 background-image: linear-gradient(top, #62c462, #57a957);
3303 background-image: linear-gradient(top, #62c462, #57a957);
3304 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
3304 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
3305 border-color: #57a957 #57a957 #3d773d;
3305 border-color: #57a957 #57a957 #3d773d;
3306 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3306 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3307 }
3307 }
3308
3308
3309 ins,div.options a:hover {
3309 ins,div.options a:hover {
3310 text-decoration: none;
3310 text-decoration: none;
3311 }
3311 }
3312
3312
3313 img,
3313 img,
3314 #header #header-inner #quick li a:hover span.normal,
3314 #header #header-inner #quick li a:hover span.normal,
3315 #header #header-inner #quick li ul li.last,
3315 #header #header-inner #quick li ul li.last,
3316 #content div.box div.form div.fields div.field div.textarea table td table td a,
3316 #content div.box div.form div.fields div.field div.textarea table td table td a,
3317 #clone_url,
3317 #clone_url,
3318 #clone_url_id
3318 #clone_url_id
3319 {
3319 {
3320 border: none;
3320 border: none;
3321 }
3321 }
3322
3322
3323 img.icon,.right .merge img {
3323 img.icon,.right .merge img {
3324 vertical-align: bottom;
3324 vertical-align: bottom;
3325 }
3325 }
3326
3326
3327 #header ul#logged-user,#content div.box div.title ul.links,
3327 #header ul#logged-user,#content div.box div.title ul.links,
3328 #content div.box div.message div.dismiss,
3328 #content div.box div.message div.dismiss,
3329 #content div.box div.traffic div.legend ul
3329 #content div.box div.traffic div.legend ul
3330 {
3330 {
3331 float: right;
3331 float: right;
3332 margin: 0;
3332 margin: 0;
3333 padding: 0;
3333 padding: 0;
3334 }
3334 }
3335
3335
3336 #header #header-inner #home,#header #header-inner #logo,
3336 #header #header-inner #home,#header #header-inner #logo,
3337 #content div.box ul.left,#content div.box ol.left,
3337 #content div.box ul.left,#content div.box ol.left,
3338 #content div.box div.pagination-left,div#commit_history,
3338 #content div.box div.pagination-left,div#commit_history,
3339 div#legend_data,div#legend_container,div#legend_choices
3339 div#legend_data,div#legend_container,div#legend_choices
3340 {
3340 {
3341 float: left;
3341 float: left;
3342 }
3342 }
3343
3343
3344 #header #header-inner #quick li:hover ul ul,
3344 #header #header-inner #quick li:hover ul ul,
3345 #header #header-inner #quick li:hover ul ul ul,
3345 #header #header-inner #quick li:hover ul ul ul,
3346 #header #header-inner #quick li:hover ul ul ul ul,
3346 #header #header-inner #quick li:hover ul ul ul ul,
3347 #content #left #menu ul.closed,#content #left #menu li ul.collapsed,.yui-tt-shadow
3347 #content #left #menu ul.closed,#content #left #menu li ul.collapsed,.yui-tt-shadow
3348 {
3348 {
3349 display: none;
3349 display: none;
3350 }
3350 }
3351
3351
3352 #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
3352 #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
3353 {
3353 {
3354 display: block;
3354 display: block;
3355 }
3355 }
3356
3356
3357 #content div.graph {
3357 #content div.graph {
3358 padding: 0 10px 10px;
3358 padding: 0 10px 10px;
3359 }
3359 }
3360
3360
3361 #content div.box div.title ul.links li a:hover,#content div.box div.title ul.links li.ui-tabs-selected a
3361 #content div.box div.title ul.links li a:hover,#content div.box div.title ul.links li.ui-tabs-selected a
3362 {
3362 {
3363 color: #bfe3ff;
3363 color: #bfe3ff;
3364 }
3364 }
3365
3365
3366 #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
3366 #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
3367 {
3367 {
3368 margin: 10px 24px 10px 44px;
3368 margin: 10px 24px 10px 44px;
3369 }
3369 }
3370
3370
3371 #content div.box div.form,#content div.box div.table,#content div.box div.traffic
3371 #content div.box div.form,#content div.box div.table,#content div.box div.traffic
3372 {
3372 {
3373 clear: both;
3373 clear: both;
3374 overflow: hidden;
3374 overflow: hidden;
3375 margin: 0;
3375 margin: 0;
3376 padding: 0 20px 10px;
3376 padding: 0 20px 10px;
3377 }
3377 }
3378
3378
3379 #content div.box div.form div.fields,#login div.form,#login div.form div.fields,#register div.form,#register div.form div.fields
3379 #content div.box div.form div.fields,#login div.form,#login div.form div.fields,#register div.form,#register div.form div.fields
3380 {
3380 {
3381 clear: both;
3381 clear: both;
3382 overflow: hidden;
3382 overflow: hidden;
3383 margin: 0;
3383 margin: 0;
3384 padding: 0;
3384 padding: 0;
3385 }
3385 }
3386
3386
3387 #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
3387 #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
3388 {
3388 {
3389 height: 1%;
3389 height: 1%;
3390 display: block;
3390 display: block;
3391 color: #363636;
3391 color: #363636;
3392 margin: 0;
3392 margin: 0;
3393 padding: 2px 0 0;
3393 padding: 2px 0 0;
3394 }
3394 }
3395
3395
3396 #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
3396 #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
3397 {
3397 {
3398 background: #FBE3E4;
3398 background: #FBE3E4;
3399 border-top: 1px solid #e1b2b3;
3399 border-top: 1px solid #e1b2b3;
3400 border-left: 1px solid #e1b2b3;
3400 border-left: 1px solid #e1b2b3;
3401 border-right: 1px solid #FBC2C4;
3401 border-right: 1px solid #FBC2C4;
3402 border-bottom: 1px solid #FBC2C4;
3402 border-bottom: 1px solid #FBC2C4;
3403 }
3403 }
3404
3404
3405 #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
3405 #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
3406 {
3406 {
3407 background: #E6EFC2;
3407 background: #E6EFC2;
3408 border-top: 1px solid #cebb98;
3408 border-top: 1px solid #cebb98;
3409 border-left: 1px solid #cebb98;
3409 border-left: 1px solid #cebb98;
3410 border-right: 1px solid #c6d880;
3410 border-right: 1px solid #c6d880;
3411 border-bottom: 1px solid #c6d880;
3411 border-bottom: 1px solid #c6d880;
3412 }
3412 }
3413
3413
3414 #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
3414 #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
3415 {
3415 {
3416 margin: 0;
3416 margin: 0;
3417 }
3417 }
3418
3418
3419 #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
3419 #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
3420 {
3420 {
3421 margin: 0 0 0 0px !important;
3421 margin: 0 0 0 0px !important;
3422 padding: 0;
3422 padding: 0;
3423 }
3423 }
3424
3424
3425 #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
3425 #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
3426 {
3426 {
3427 margin: 0 0 0 200px;
3427 margin: 0 0 0 200px;
3428 padding: 0;
3428 padding: 0;
3429 }
3429 }
3430
3430
3431 #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
3431 #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
3432 {
3432 {
3433 color: #000;
3433 color: #000;
3434 text-decoration: none;
3434 text-decoration: none;
3435 }
3435 }
3436
3436
3437 #content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus,#content div.box div.action a.ui-selectmenu-focus
3437 #content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus,#content div.box div.action a.ui-selectmenu-focus
3438 {
3438 {
3439 border: 1px solid #666;
3439 border: 1px solid #666;
3440 }
3440 }
3441
3441
3442 #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
3442 #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
3443 {
3443 {
3444 clear: both;
3444 clear: both;
3445 overflow: hidden;
3445 overflow: hidden;
3446 margin: 0;
3446 margin: 0;
3447 padding: 8px 0 2px;
3447 padding: 8px 0 2px;
3448 }
3448 }
3449
3449
3450 #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
3450 #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
3451 {
3451 {
3452 float: left;
3452 float: left;
3453 margin: 0;
3453 margin: 0;
3454 }
3454 }
3455
3455
3456 #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
3456 #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
3457 {
3457 {
3458 height: 1%;
3458 height: 1%;
3459 display: block;
3459 display: block;
3460 float: left;
3460 float: left;
3461 margin: 2px 0 0 4px;
3461 margin: 2px 0 0 4px;
3462 }
3462 }
3463
3463
3464 div.form div.fields div.field div.button input,#content div.box div.form div.fields div.buttons input,div.form div.fields div.buttons input,#content div.box div.action div.button input
3464 div.form div.fields div.field div.button input,#content div.box div.form div.fields div.buttons input,div.form div.fields div.buttons input,#content div.box div.action div.button input
3465 {
3465 {
3466 color: #000;
3466 color: #000;
3467 font-size: 11px;
3467 font-size: 11px;
3468 font-weight: 700;
3468 font-weight: 700;
3469 margin: 0;
3469 margin: 0;
3470 }
3470 }
3471
3471
3472 input.ui-button {
3472 input.ui-button {
3473 background: #e5e3e3 url("../images/button.png") repeat-x;
3473 background: #e5e3e3 url("../images/button.png") repeat-x;
3474 border-top: 1px solid #DDD;
3474 border-top: 1px solid #DDD;
3475 border-left: 1px solid #c6c6c6;
3475 border-left: 1px solid #c6c6c6;
3476 border-right: 1px solid #DDD;
3476 border-right: 1px solid #DDD;
3477 border-bottom: 1px solid #c6c6c6;
3477 border-bottom: 1px solid #c6c6c6;
3478 color: #515151 !important;
3478 color: #515151 !important;
3479 outline: none;
3479 outline: none;
3480 margin: 0;
3480 margin: 0;
3481 padding: 6px 12px;
3481 padding: 6px 12px;
3482 -webkit-border-radius: 4px 4px 4px 4px;
3482 -webkit-border-radius: 4px 4px 4px 4px;
3483 -khtml-border-radius: 4px 4px 4px 4px;
3483 -khtml-border-radius: 4px 4px 4px 4px;
3484 -moz-border-radius: 4px 4px 4px 4px;
3484 -moz-border-radius: 4px 4px 4px 4px;
3485 border-radius: 4px 4px 4px 4px;
3485 border-radius: 4px 4px 4px 4px;
3486 box-shadow: 0 1px 0 #ececec;
3486 box-shadow: 0 1px 0 #ececec;
3487 cursor: pointer;
3487 cursor: pointer;
3488 }
3488 }
3489
3489
3490 input.ui-button:hover {
3490 input.ui-button:hover {
3491 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3491 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3492 border-top: 1px solid #ccc;
3492 border-top: 1px solid #ccc;
3493 border-left: 1px solid #bebebe;
3493 border-left: 1px solid #bebebe;
3494 border-right: 1px solid #b1b1b1;
3494 border-right: 1px solid #b1b1b1;
3495 border-bottom: 1px solid #afafaf;
3495 border-bottom: 1px solid #afafaf;
3496 }
3496 }
3497
3497
3498 div.form div.fields div.field div.highlight,#content div.box div.form div.fields div.buttons div.highlight
3498 div.form div.fields div.field div.highlight,#content div.box div.form div.fields div.buttons div.highlight
3499 {
3499 {
3500 display: inline;
3500 display: inline;
3501 }
3501 }
3502
3502
3503 #content div.box div.form div.fields div.buttons,div.form div.fields div.buttons
3503 #content div.box div.form div.fields div.buttons,div.form div.fields div.buttons
3504 {
3504 {
3505 margin: 10px 0 0 200px;
3505 margin: 10px 0 0 200px;
3506 padding: 0;
3506 padding: 0;
3507 }
3507 }
3508
3508
3509 #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
3509 #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
3510 {
3510 {
3511 margin: 10px 0 0;
3511 margin: 10px 0 0;
3512 }
3512 }
3513
3513
3514 #content div.box table td.user,#content div.box table td.address {
3514 #content div.box table td.user,#content div.box table td.address {
3515 width: 10%;
3515 width: 10%;
3516 text-align: center;
3516 text-align: center;
3517 }
3517 }
3518
3518
3519 #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
3519 #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
3520 {
3520 {
3521 text-align: right;
3521 text-align: right;
3522 margin: 6px 0 0;
3522 margin: 6px 0 0;
3523 padding: 0;
3523 padding: 0;
3524 }
3524 }
3525
3525
3526 #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
3526 #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
3527 {
3527 {
3528 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3528 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3529 border-top: 1px solid #ccc;
3529 border-top: 1px solid #ccc;
3530 border-left: 1px solid #bebebe;
3530 border-left: 1px solid #bebebe;
3531 border-right: 1px solid #b1b1b1;
3531 border-right: 1px solid #b1b1b1;
3532 border-bottom: 1px solid #afafaf;
3532 border-bottom: 1px solid #afafaf;
3533 color: #515151;
3533 color: #515151;
3534 margin: 0;
3534 margin: 0;
3535 padding: 6px 12px;
3535 padding: 6px 12px;
3536 }
3536 }
3537
3537
3538 #content div.box div.pagination div.results,#content div.box div.pagination-wh div.results
3538 #content div.box div.pagination div.results,#content div.box div.pagination-wh div.results
3539 {
3539 {
3540 text-align: left;
3540 text-align: left;
3541 float: left;
3541 float: left;
3542 margin: 0;
3542 margin: 0;
3543 padding: 0;
3543 padding: 0;
3544 }
3544 }
3545
3545
3546 #content div.box div.pagination div.results span,#content div.box div.pagination-wh div.results span
3546 #content div.box div.pagination div.results span,#content div.box div.pagination-wh div.results span
3547 {
3547 {
3548 height: 1%;
3548 height: 1%;
3549 display: block;
3549 display: block;
3550 float: left;
3550 float: left;
3551 background: #ebebeb url("../images/pager.png") repeat-x;
3551 background: #ebebeb url("../images/pager.png") repeat-x;
3552 border-top: 1px solid #dedede;
3552 border-top: 1px solid #dedede;
3553 border-left: 1px solid #cfcfcf;
3553 border-left: 1px solid #cfcfcf;
3554 border-right: 1px solid #c4c4c4;
3554 border-right: 1px solid #c4c4c4;
3555 border-bottom: 1px solid #c4c4c4;
3555 border-bottom: 1px solid #c4c4c4;
3556 color: #4A4A4A;
3556 color: #4A4A4A;
3557 font-weight: 700;
3557 font-weight: 700;
3558 margin: 0;
3558 margin: 0;
3559 padding: 6px 8px;
3559 padding: 6px 8px;
3560 }
3560 }
3561
3561
3562 #content div.box div.pagination ul.pager li.disabled,#content div.box div.pagination-wh a.disabled
3562 #content div.box div.pagination ul.pager li.disabled,#content div.box div.pagination-wh a.disabled
3563 {
3563 {
3564 color: #B4B4B4;
3564 color: #B4B4B4;
3565 padding: 6px;
3565 padding: 6px;
3566 }
3566 }
3567
3567
3568 #login,#register {
3568 #login,#register {
3569 width: 520px;
3569 width: 520px;
3570 margin: 10% auto 0;
3570 margin: 10% auto 0;
3571 padding: 0;
3571 padding: 0;
3572 }
3572 }
3573
3573
3574 #login div.color,#register div.color {
3574 #login div.color,#register div.color {
3575 clear: both;
3575 clear: both;
3576 overflow: hidden;
3576 overflow: hidden;
3577 background: #FFF;
3577 background: #FFF;
3578 margin: 10px auto 0;
3578 margin: 10px auto 0;
3579 padding: 3px 3px 3px 0;
3579 padding: 3px 3px 3px 0;
3580 }
3580 }
3581
3581
3582 #login div.color a,#register div.color a {
3582 #login div.color a,#register div.color a {
3583 width: 20px;
3583 width: 20px;
3584 height: 20px;
3584 height: 20px;
3585 display: block;
3585 display: block;
3586 float: left;
3586 float: left;
3587 margin: 0 0 0 3px;
3587 margin: 0 0 0 3px;
3588 padding: 0;
3588 padding: 0;
3589 }
3589 }
3590
3590
3591 #login div.title h5,#register div.title h5 {
3591 #login div.title h5,#register div.title h5 {
3592 color: #fff;
3592 color: #fff;
3593 margin: 10px;
3593 margin: 10px;
3594 padding: 0;
3594 padding: 0;
3595 }
3595 }
3596
3596
3597 #login div.form div.fields div.field,#register div.form div.fields div.field
3597 #login div.form div.fields div.field,#register div.form div.fields div.field
3598 {
3598 {
3599 clear: both;
3599 clear: both;
3600 overflow: hidden;
3600 overflow: hidden;
3601 margin: 0;
3601 margin: 0;
3602 padding: 0 0 10px;
3602 padding: 0 0 10px;
3603 }
3603 }
3604
3604
3605 #login div.form div.fields div.field span.error-message,#register div.form div.fields div.field span.error-message
3605 #login div.form div.fields div.field span.error-message,#register div.form div.fields div.field span.error-message
3606 {
3606 {
3607 height: 1%;
3607 height: 1%;
3608 display: block;
3608 display: block;
3609 color: red;
3609 color: red;
3610 margin: 8px 0 0;
3610 margin: 8px 0 0;
3611 padding: 0;
3611 padding: 0;
3612 max-width: 320px;
3612 max-width: 320px;
3613 }
3613 }
3614
3614
3615 #login div.form div.fields div.field div.label label,#register div.form div.fields div.field div.label label
3615 #login div.form div.fields div.field div.label label,#register div.form div.fields div.field div.label label
3616 {
3616 {
3617 color: #000;
3617 color: #000;
3618 font-weight: 700;
3618 font-weight: 700;
3619 }
3619 }
3620
3620
3621 #login div.form div.fields div.field div.input,#register div.form div.fields div.field div.input
3621 #login div.form div.fields div.field div.input,#register div.form div.fields div.field div.input
3622 {
3622 {
3623 float: left;
3623 float: left;
3624 margin: 0;
3624 margin: 0;
3625 padding: 0;
3625 padding: 0;
3626 }
3626 }
3627
3627
3628 #login div.form div.fields div.field div.checkbox,#register div.form div.fields div.field div.checkbox
3628 #login div.form div.fields div.field div.checkbox,#register div.form div.fields div.field div.checkbox
3629 {
3629 {
3630 margin: 0 0 0 184px;
3630 margin: 0 0 0 184px;
3631 padding: 0;
3631 padding: 0;
3632 }
3632 }
3633
3633
3634 #login div.form div.fields div.field div.checkbox label,#register div.form div.fields div.field div.checkbox label
3634 #login div.form div.fields div.field div.checkbox label,#register div.form div.fields div.field div.checkbox label
3635 {
3635 {
3636 color: #565656;
3636 color: #565656;
3637 font-weight: 700;
3637 font-weight: 700;
3638 }
3638 }
3639
3639
3640 #login div.form div.fields div.buttons input,#register div.form div.fields div.buttons input
3640 #login div.form div.fields div.buttons input,#register div.form div.fields div.buttons input
3641 {
3641 {
3642 color: #000;
3642 color: #000;
3643 font-size: 1em;
3643 font-size: 1em;
3644 font-weight: 700;
3644 font-weight: 700;
3645 margin: 0;
3645 margin: 0;
3646 }
3646 }
3647
3647
3648 #changeset_content .container .wrapper,#graph_content .container .wrapper
3648 #changeset_content .container .wrapper,#graph_content .container .wrapper
3649 {
3649 {
3650 width: 600px;
3650 width: 600px;
3651 }
3651 }
3652
3652
3653 #changeset_content .container .left {
3653 #changeset_content .container .left {
3654 float: left;
3654 float: left;
3655 width: 75%;
3655 width: 75%;
3656 padding-left: 5px;
3656 padding-left: 5px;
3657 }
3657 }
3658
3658
3659 #changeset_content .container .left .date,.ac .match {
3659 #changeset_content .container .left .date,.ac .match {
3660 font-weight: 700;
3660 font-weight: 700;
3661 padding-top: 5px;
3661 padding-top: 5px;
3662 padding-bottom: 5px;
3662 padding-bottom: 5px;
3663 }
3663 }
3664
3664
3665 div#legend_container table td,div#legend_choices table td {
3665 div#legend_container table td,div#legend_choices table td {
3666 border: none !important;
3666 border: none !important;
3667 height: 20px !important;
3667 height: 20px !important;
3668 padding: 0 !important;
3668 padding: 0 !important;
3669 }
3669 }
3670
3670
3671 .q_filter_box {
3671 .q_filter_box {
3672 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
3672 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
3673 -webkit-border-radius: 4px;
3673 -webkit-border-radius: 4px;
3674 -moz-border-radius: 4px;
3674 -moz-border-radius: 4px;
3675 border-radius: 4px;
3675 border-radius: 4px;
3676 border: 0 none;
3676 border: 0 none;
3677 color: #AAAAAA;
3677 color: #AAAAAA;
3678 margin-bottom: -4px;
3678 margin-bottom: -4px;
3679 margin-top: -4px;
3679 margin-top: -4px;
3680 padding-left: 3px;
3680 padding-left: 3px;
3681 }
3681 }
3682
3682
3683 #node_filter {
3683 #node_filter {
3684 border: 0px solid #545454;
3684 border: 0px solid #545454;
3685 color: #AAAAAA;
3685 color: #AAAAAA;
3686 padding-left: 3px;
3686 padding-left: 3px;
3687 }
3687 }
3688
3688
3689
3689
3690 .group_members_wrap{
3690 .group_members_wrap{
3691
3691
3692 }
3692 }
3693
3693
3694 .group_members .group_member{
3694 .group_members .group_member{
3695 height: 30px;
3695 height: 30px;
3696 padding:0px 0px 0px 10px;
3696 padding:0px 0px 0px 10px;
3697 }
3697 }
3698
3698
3699 /*README STYLE*/
3699 /*README STYLE*/
3700
3700
3701 div.readme {
3701 div.readme {
3702 padding:0px;
3702 padding:0px;
3703 }
3703 }
3704
3704
3705 div.readme h2 {
3705 div.readme h2 {
3706 font-weight: normal;
3706 font-weight: normal;
3707 }
3707 }
3708
3708
3709 div.readme .readme_box {
3709 div.readme .readme_box {
3710 background-color: #fafafa;
3710 background-color: #fafafa;
3711 }
3711 }
3712
3712
3713 div.readme .readme_box {
3713 div.readme .readme_box {
3714 clear:both;
3714 clear:both;
3715 overflow:hidden;
3715 overflow:hidden;
3716 margin:0;
3716 margin:0;
3717 padding:0 20px 10px;
3717 padding:0 20px 10px;
3718 }
3718 }
3719
3719
3720 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 {
3720 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 {
3721 border-bottom: 0 !important;
3721 border-bottom: 0 !important;
3722 margin: 0 !important;
3722 margin: 0 !important;
3723 padding: 0 !important;
3723 padding: 0 !important;
3724 line-height: 1.5em !important;
3724 line-height: 1.5em !important;
3725 }
3725 }
3726
3726
3727
3727
3728 div.readme .readme_box h1:first-child {
3728 div.readme .readme_box h1:first-child {
3729 padding-top: .25em !important;
3729 padding-top: .25em !important;
3730 }
3730 }
3731
3731
3732 div.readme .readme_box h2, div.readme .readme_box h3 {
3732 div.readme .readme_box h2, div.readme .readme_box h3 {
3733 margin: 1em 0 !important;
3733 margin: 1em 0 !important;
3734 }
3734 }
3735
3735
3736 div.readme .readme_box h2 {
3736 div.readme .readme_box h2 {
3737 margin-top: 1.5em !important;
3737 margin-top: 1.5em !important;
3738 border-top: 4px solid #e0e0e0 !important;
3738 border-top: 4px solid #e0e0e0 !important;
3739 padding-top: .5em !important;
3739 padding-top: .5em !important;
3740 }
3740 }
3741
3741
3742 div.readme .readme_box p {
3742 div.readme .readme_box p {
3743 color: black !important;
3743 color: black !important;
3744 margin: 1em 0 !important;
3744 margin: 1em 0 !important;
3745 line-height: 1.5em !important;
3745 line-height: 1.5em !important;
3746 }
3746 }
3747
3747
3748 div.readme .readme_box ul {
3748 div.readme .readme_box ul {
3749 list-style: disc !important;
3749 list-style: disc !important;
3750 margin: 1em 0 1em 2em !important;
3750 margin: 1em 0 1em 2em !important;
3751 }
3751 }
3752
3752
3753 div.readme .readme_box ol {
3753 div.readme .readme_box ol {
3754 list-style: decimal;
3754 list-style: decimal;
3755 margin: 1em 0 1em 2em !important;
3755 margin: 1em 0 1em 2em !important;
3756 }
3756 }
3757
3757
3758 div.readme .readme_box pre, code {
3758 div.readme .readme_box pre, code {
3759 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
3759 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
3760 }
3760 }
3761
3761
3762 div.readme .readme_box code {
3762 div.readme .readme_box code {
3763 font-size: 12px !important;
3763 font-size: 12px !important;
3764 background-color: ghostWhite !important;
3764 background-color: ghostWhite !important;
3765 color: #444 !important;
3765 color: #444 !important;
3766 padding: 0 .2em !important;
3766 padding: 0 .2em !important;
3767 border: 1px solid #dedede !important;
3767 border: 1px solid #dedede !important;
3768 }
3768 }
3769
3769
3770 div.readme .readme_box pre code {
3770 div.readme .readme_box pre code {
3771 padding: 0 !important;
3771 padding: 0 !important;
3772 font-size: 12px !important;
3772 font-size: 12px !important;
3773 background-color: #eee !important;
3773 background-color: #eee !important;
3774 border: none !important;
3774 border: none !important;
3775 }
3775 }
3776
3776
3777 div.readme .readme_box pre {
3777 div.readme .readme_box pre {
3778 margin: 1em 0;
3778 margin: 1em 0;
3779 font-size: 12px;
3779 font-size: 12px;
3780 background-color: #eee;
3780 background-color: #eee;
3781 border: 1px solid #ddd;
3781 border: 1px solid #ddd;
3782 padding: 5px;
3782 padding: 5px;
3783 color: #444;
3783 color: #444;
3784 overflow: auto;
3784 overflow: auto;
3785 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
3785 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
3786 -webkit-border-radius: 3px;
3786 -webkit-border-radius: 3px;
3787 -moz-border-radius: 3px;
3787 -moz-border-radius: 3px;
3788 border-radius: 3px;
3788 border-radius: 3px;
3789 }
3789 }
3790
3790
3791
3791
3792 /** RST STYLE **/
3792 /** RST STYLE **/
3793
3793
3794
3794
3795 div.rst-block {
3795 div.rst-block {
3796 padding:0px;
3796 padding:0px;
3797 }
3797 }
3798
3798
3799 div.rst-block h2 {
3799 div.rst-block h2 {
3800 font-weight: normal;
3800 font-weight: normal;
3801 }
3801 }
3802
3802
3803 div.rst-block {
3803 div.rst-block {
3804 background-color: #fafafa;
3804 background-color: #fafafa;
3805 }
3805 }
3806
3806
3807 div.rst-block {
3807 div.rst-block {
3808 clear:both;
3808 clear:both;
3809 overflow:hidden;
3809 overflow:hidden;
3810 margin:0;
3810 margin:0;
3811 padding:0 20px 10px;
3811 padding:0 20px 10px;
3812 }
3812 }
3813
3813
3814 div.rst-block h1, div.rst-block h2, div.rst-block h3, div.rst-block h4, div.rst-block h5, div.rst-block h6 {
3814 div.rst-block h1, div.rst-block h2, div.rst-block h3, div.rst-block h4, div.rst-block h5, div.rst-block h6 {
3815 border-bottom: 0 !important;
3815 border-bottom: 0 !important;
3816 margin: 0 !important;
3816 margin: 0 !important;
3817 padding: 0 !important;
3817 padding: 0 !important;
3818 line-height: 1.5em !important;
3818 line-height: 1.5em !important;
3819 }
3819 }
3820
3820
3821
3821
3822 div.rst-block h1:first-child {
3822 div.rst-block h1:first-child {
3823 padding-top: .25em !important;
3823 padding-top: .25em !important;
3824 }
3824 }
3825
3825
3826 div.rst-block h2, div.rst-block h3 {
3826 div.rst-block h2, div.rst-block h3 {
3827 margin: 1em 0 !important;
3827 margin: 1em 0 !important;
3828 }
3828 }
3829
3829
3830 div.rst-block h2 {
3830 div.rst-block h2 {
3831 margin-top: 1.5em !important;
3831 margin-top: 1.5em !important;
3832 border-top: 4px solid #e0e0e0 !important;
3832 border-top: 4px solid #e0e0e0 !important;
3833 padding-top: .5em !important;
3833 padding-top: .5em !important;
3834 }
3834 }
3835
3835
3836 div.rst-block p {
3836 div.rst-block p {
3837 color: black !important;
3837 color: black !important;
3838 margin: 1em 0 !important;
3838 margin: 1em 0 !important;
3839 line-height: 1.5em !important;
3839 line-height: 1.5em !important;
3840 }
3840 }
3841
3841
3842 div.rst-block ul {
3842 div.rst-block ul {
3843 list-style: disc !important;
3843 list-style: disc !important;
3844 margin: 1em 0 1em 2em !important;
3844 margin: 1em 0 1em 2em !important;
3845 }
3845 }
3846
3846
3847 div.rst-block ol {
3847 div.rst-block ol {
3848 list-style: decimal;
3848 list-style: decimal;
3849 margin: 1em 0 1em 2em !important;
3849 margin: 1em 0 1em 2em !important;
3850 }
3850 }
3851
3851
3852 div.rst-block pre, code {
3852 div.rst-block pre, code {
3853 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
3853 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
3854 }
3854 }
3855
3855
3856 div.rst-block code {
3856 div.rst-block code {
3857 font-size: 12px !important;
3857 font-size: 12px !important;
3858 background-color: ghostWhite !important;
3858 background-color: ghostWhite !important;
3859 color: #444 !important;
3859 color: #444 !important;
3860 padding: 0 .2em !important;
3860 padding: 0 .2em !important;
3861 border: 1px solid #dedede !important;
3861 border: 1px solid #dedede !important;
3862 }
3862 }
3863
3863
3864 div.rst-block pre code {
3864 div.rst-block pre code {
3865 padding: 0 !important;
3865 padding: 0 !important;
3866 font-size: 12px !important;
3866 font-size: 12px !important;
3867 background-color: #eee !important;
3867 background-color: #eee !important;
3868 border: none !important;
3868 border: none !important;
3869 }
3869 }
3870
3870
3871 div.rst-block pre {
3871 div.rst-block pre {
3872 margin: 1em 0;
3872 margin: 1em 0;
3873 font-size: 12px;
3873 font-size: 12px;
3874 background-color: #eee;
3874 background-color: #eee;
3875 border: 1px solid #ddd;
3875 border: 1px solid #ddd;
3876 padding: 5px;
3876 padding: 5px;
3877 color: #444;
3877 color: #444;
3878 overflow: auto;
3878 overflow: auto;
3879 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
3879 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
3880 -webkit-border-radius: 3px;
3880 -webkit-border-radius: 3px;
3881 -moz-border-radius: 3px;
3881 -moz-border-radius: 3px;
3882 border-radius: 3px;
3882 border-radius: 3px;
3883 }
3883 }
3884
3884
3885
3885
3886 /** comment main **/
3886 /** comment main **/
3887 .comments {
3887 .comments {
3888 padding:10px 20px;
3888 padding:10px 20px;
3889 }
3889 }
3890
3890
3891 .comments .comment {
3891 .comments .comment {
3892 border: 1px solid #ddd;
3892 border: 1px solid #ddd;
3893 margin-top: 10px;
3893 margin-top: 10px;
3894 -webkit-border-radius: 4px;
3894 -webkit-border-radius: 4px;
3895 -moz-border-radius: 4px;
3895 -moz-border-radius: 4px;
3896 border-radius: 4px;
3896 border-radius: 4px;
3897 }
3897 }
3898
3898
3899 .comments .comment .meta {
3899 .comments .comment .meta {
3900 background: #f8f8f8;
3900 background: #f8f8f8;
3901 padding: 4px;
3901 padding: 4px;
3902 border-bottom: 1px solid #ddd;
3902 border-bottom: 1px solid #ddd;
3903 }
3903 }
3904
3904
3905 .comments .comment .meta img {
3905 .comments .comment .meta img {
3906 vertical-align: middle;
3906 vertical-align: middle;
3907 }
3907 }
3908
3908
3909 .comments .comment .meta .user {
3909 .comments .comment .meta .user {
3910 font-weight: bold;
3910 font-weight: bold;
3911 }
3911 }
3912
3912
3913 .comments .comment .meta .date {
3913 .comments .comment .meta .date {
3914 }
3914 }
3915
3915
3916 .comments .comment .text {
3916 .comments .comment .text {
3917 background-color: #FAFAFA;
3917 background-color: #FAFAFA;
3918 }
3918 }
3919 .comment .text div.rst-block p {
3919 .comment .text div.rst-block p {
3920 margin: 0.5em 0px !important;
3920 margin: 0.5em 0px !important;
3921 }
3921 }
3922
3922
3923 .comments .comments-number{
3923 .comments .comments-number{
3924 padding:0px 0px 10px 0px;
3924 padding:0px 0px 10px 0px;
3925 font-weight: bold;
3925 font-weight: bold;
3926 color: #666;
3926 color: #666;
3927 font-size: 16px;
3927 font-size: 16px;
3928 }
3928 }
3929
3929
3930 /** comment form **/
3930 /** comment form **/
3931
3931
3932 .comment-form .clearfix{
3932 .comment-form .clearfix{
3933 background: #EEE;
3933 background: #EEE;
3934 -webkit-border-radius: 4px;
3934 -webkit-border-radius: 4px;
3935 -moz-border-radius: 4px;
3935 -moz-border-radius: 4px;
3936 border-radius: 4px;
3936 border-radius: 4px;
3937 padding: 10px;
3937 padding: 10px;
3938 }
3938 }
3939
3939
3940 div.comment-form {
3940 div.comment-form {
3941 margin-top: 20px;
3941 margin-top: 20px;
3942 }
3942 }
3943
3943
3944 .comment-form strong {
3944 .comment-form strong {
3945 display: block;
3945 display: block;
3946 margin-bottom: 15px;
3946 margin-bottom: 15px;
3947 }
3947 }
3948
3948
3949 .comment-form textarea {
3949 .comment-form textarea {
3950 width: 100%;
3950 width: 100%;
3951 height: 100px;
3951 height: 100px;
3952 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
3952 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
3953 }
3953 }
3954
3954
3955 form.comment-form {
3955 form.comment-form {
3956 margin-top: 10px;
3956 margin-top: 10px;
3957 margin-left: 10px;
3957 margin-left: 10px;
3958 }
3958 }
3959
3959
3960 .comment-form-submit {
3960 .comment-form-submit {
3961 margin-top: 5px;
3961 margin-top: 5px;
3962 margin-left: 525px;
3962 margin-left: 525px;
3963 }
3963 }
3964
3964
3965 .file-comments {
3965 .file-comments {
3966 display: none;
3966 display: none;
3967 }
3967 }
3968
3968
3969 .comment-form .comment {
3969 .comment-form .comment {
3970 margin-left: 10px;
3970 margin-left: 10px;
3971 }
3971 }
3972
3972
3973 .comment-form .comment-help{
3973 .comment-form .comment-help{
3974 padding: 0px 0px 5px 0px;
3974 padding: 0px 0px 5px 0px;
3975 color: #666;
3975 color: #666;
3976 }
3976 }
3977
3977
3978 .comment-form .comment-button{
3978 .comment-form .comment-button{
3979 padding-top:5px;
3979 padding-top:5px;
3980 }
3980 }
3981
3981
3982 .add-another-button {
3982 .add-another-button {
3983 margin-left: 10px;
3983 margin-left: 10px;
3984 margin-top: 10px;
3984 margin-top: 10px;
3985 margin-bottom: 10px;
3985 margin-bottom: 10px;
3986 }
3986 }
3987
3987
3988 .comment .buttons {
3988 .comment .buttons {
3989 float: right;
3989 float: right;
3990 }
3990 }
3991
3991
3992
3992
3993 .show-inline-comments{
3993 .show-inline-comments{
3994 position: relative;
3994 position: relative;
3995 top:1px
3995 top:1px
3996 }
3996 }
3997
3997
3998 /** comment inline form **/
3998 /** comment inline form **/
3999
3999
4000 .comment-inline-form .clearfix{
4000 .comment-inline-form .clearfix{
4001 background: #EEE;
4001 background: #EEE;
4002 -webkit-border-radius: 4px;
4002 -webkit-border-radius: 4px;
4003 -moz-border-radius: 4px;
4003 -moz-border-radius: 4px;
4004 border-radius: 4px;
4004 border-radius: 4px;
4005 padding: 5px;
4005 padding: 5px;
4006 }
4006 }
4007
4007
4008 div.comment-inline-form {
4008 div.comment-inline-form {
4009 margin-top: 5px;
4009 margin-top: 5px;
4010 padding:2px 6px 8px 6px;
4010 padding:2px 6px 8px 6px;
4011 }
4011 }
4012
4012
4013 .comment-inline-form strong {
4013 .comment-inline-form strong {
4014 display: block;
4014 display: block;
4015 margin-bottom: 15px;
4015 margin-bottom: 15px;
4016 }
4016 }
4017
4017
4018 .comment-inline-form textarea {
4018 .comment-inline-form textarea {
4019 width: 100%;
4019 width: 100%;
4020 height: 100px;
4020 height: 100px;
4021 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
4021 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
4022 }
4022 }
4023
4023
4024 form.comment-inline-form {
4024 form.comment-inline-form {
4025 margin-top: 10px;
4025 margin-top: 10px;
4026 margin-left: 10px;
4026 margin-left: 10px;
4027 }
4027 }
4028
4028
4029 .comment-inline-form-submit {
4029 .comment-inline-form-submit {
4030 margin-top: 5px;
4030 margin-top: 5px;
4031 margin-left: 525px;
4031 margin-left: 525px;
4032 }
4032 }
4033
4033
4034 .file-comments {
4034 .file-comments {
4035 display: none;
4035 display: none;
4036 }
4036 }
4037
4037
4038 .comment-inline-form .comment {
4038 .comment-inline-form .comment {
4039 margin-left: 10px;
4039 margin-left: 10px;
4040 }
4040 }
4041
4041
4042 .comment-inline-form .comment-help{
4042 .comment-inline-form .comment-help{
4043 padding: 0px 0px 2px 0px;
4043 padding: 0px 0px 2px 0px;
4044 color: #666666;
4044 color: #666666;
4045 font-size: 10px;
4045 font-size: 10px;
4046 }
4046 }
4047
4047
4048 .comment-inline-form .comment-button{
4048 .comment-inline-form .comment-button{
4049 padding-top:5px;
4049 padding-top:5px;
4050 }
4050 }
4051
4051
4052 /** comment inline **/
4052 /** comment inline **/
4053 .inline-comments {
4053 .inline-comments {
4054 padding:10px 20px;
4054 padding:10px 20px;
4055 }
4055 }
4056
4056
4057 .inline-comments div.rst-block {
4057 .inline-comments div.rst-block {
4058 clear:both;
4058 clear:both;
4059 overflow:hidden;
4059 overflow:hidden;
4060 margin:0;
4060 margin:0;
4061 padding:0 20px 0px;
4061 padding:0 20px 0px;
4062 }
4062 }
4063 .inline-comments .comment {
4063 .inline-comments .comment {
4064 border: 1px solid #ddd;
4064 border: 1px solid #ddd;
4065 -webkit-border-radius: 4px;
4065 -webkit-border-radius: 4px;
4066 -moz-border-radius: 4px;
4066 -moz-border-radius: 4px;
4067 border-radius: 4px;
4067 border-radius: 4px;
4068 margin: 3px 3px 5px 5px;
4068 margin: 3px 3px 5px 5px;
4069 background-color: #FAFAFA;
4069 background-color: #FAFAFA;
4070 }
4070 }
4071 .inline-comments .comment-wrapp{
4071 .inline-comments .comment-wrapp{
4072 padding:1px;
4072 padding:1px;
4073 }
4073 }
4074 .inline-comments .comment .meta {
4074 .inline-comments .comment .meta {
4075 background: #f8f8f8;
4075 background: #f8f8f8;
4076 padding: 4px;
4076 padding: 4px;
4077 border-bottom: 1px solid #ddd;
4077 border-bottom: 1px solid #ddd;
4078 }
4078 }
4079
4079
4080 .inline-comments .comment .meta img {
4080 .inline-comments .comment .meta img {
4081 vertical-align: middle;
4081 vertical-align: middle;
4082 }
4082 }
4083
4083
4084 .inline-comments .comment .meta .user {
4084 .inline-comments .comment .meta .user {
4085 font-weight: bold;
4085 font-weight: bold;
4086 }
4086 }
4087
4087
4088 .inline-comments .comment .meta .date {
4088 .inline-comments .comment .meta .date {
4089 }
4089 }
4090
4090
4091 .inline-comments .comment .text {
4091 .inline-comments .comment .text {
4092 background-color: #FAFAFA;
4092 background-color: #FAFAFA;
4093 }
4093 }
4094
4094
4095 .inline-comments .comments-number{
4095 .inline-comments .comments-number{
4096 padding:0px 0px 10px 0px;
4096 padding:0px 0px 10px 0px;
4097 font-weight: bold;
4097 font-weight: bold;
4098 color: #666;
4098 color: #666;
4099 font-size: 16px;
4099 font-size: 16px;
4100 }
4100 }
4101 .inline-comments-button .add-comment{
4101 .inline-comments-button .add-comment{
4102 margin:10px 5px !important;
4102 margin:10px 5px !important;
4103 }
4103 }
4104 .notifications{
4104 .notifications{
4105 border-radius: 4px 4px 4px 4px;
4105 border-radius: 4px 4px 4px 4px;
4106 -webkit-border-radius: 4px;
4106 -webkit-border-radius: 4px;
4107 -moz-border-radius: 4px;
4107 -moz-border-radius: 4px;
4108 float: right;
4108 float: right;
4109 margin: 20px 0px 0px 0px;
4109 margin: 20px 0px 0px 0px;
4110 position: absolute;
4110 position: absolute;
4111 text-align: center;
4111 text-align: center;
4112 width: 26px;
4112 width: 26px;
4113 z-index: 1000;
4113 z-index: 1000;
4114 }
4114 }
4115 .notifications a{
4115 .notifications a{
4116 color:#888 !important;
4116 color:#888 !important;
4117 display: block;
4117 display: block;
4118 font-size: 10px;
4118 font-size: 10px;
4119 background-color: #DEDEDE !important;
4119 background-color: #DEDEDE !important;
4120 border-radius: 2px !important;
4120 border-radius: 2px !important;
4121 -webkit-border-radius: 2px !important;
4121 -webkit-border-radius: 2px !important;
4122 -moz-border-radius: 2px !important;
4122 -moz-border-radius: 2px !important;
4123 }
4123 }
4124 .notifications a:hover{
4124 .notifications a:hover{
4125 text-decoration: none !important;
4125 text-decoration: none !important;
4126 background-color: #EEEFFF !important;
4126 background-color: #EEEFFF !important;
4127 }
4127 }
4128 .notification-header{
4128 .notification-header{
4129 padding-top:6px;
4129 padding-top:6px;
4130 }
4130 }
4131 .notification-header .desc{
4131 .notification-header .desc{
4132 font-size: 16px;
4132 font-size: 16px;
4133 height: 24px;
4133 height: 24px;
4134 float: left
4134 float: left
4135 }
4135 }
4136 .notification-list .container.unread{
4136 .notification-list .container.unread{
4137
4137
4138 }
4138 }
4139 .notification-header .gravatar{
4139 .notification-header .gravatar{
4140
4140
4141 }
4141 }
4142 .notification-header .desc.unread{
4142 .notification-header .desc.unread{
4143 font-weight: bold;
4143 font-weight: bold;
4144 font-size: 17px;
4144 font-size: 17px;
4145 }
4145 }
4146
4146
4147 .notification-header .delete-notifications{
4147 .notification-header .delete-notifications{
4148 float: right;
4148 float: right;
4149 padding-top: 8px;
4149 padding-top: 8px;
4150 cursor: pointer;
4150 cursor: pointer;
4151 }
4151 }
4152 .notification-subject{
4152 .notification-subject{
4153 clear:both;
4153 clear:both;
4154 border-bottom: 1px solid #eee;
4154 border-bottom: 1px solid #eee;
4155 padding:5px 0px 5px 38px;
4155 padding:5px 0px 5px 38px;
4156 }
4156 }
4157
4157
4158 /****
4158 /****
4159 PERMS
4159 PERMS
4160 *****/
4160 *****/
4161 #perms .perms_section_head {
4161 #perms .perms_section_head {
4162 padding:10px 10px 10px 0px;
4162 padding:10px 10px 10px 0px;
4163 font-size:16px;
4163 font-size:16px;
4164 font-weight: bold;
4164 font-weight: bold;
4165 }
4165 }
4166
4166
4167 #perms .perm_tag{
4167 #perms .perm_tag{
4168 padding: 1px 3px 1px 3px;
4168 padding: 1px 3px 1px 3px;
4169 font-size: 10px;
4169 font-size: 10px;
4170 font-weight: bold;
4170 font-weight: bold;
4171 text-transform: uppercase;
4171 text-transform: uppercase;
4172 white-space: nowrap;
4172 white-space: nowrap;
4173 -webkit-border-radius: 3px;
4173 -webkit-border-radius: 3px;
4174 -moz-border-radius: 3px;
4174 -moz-border-radius: 3px;
4175 border-radius: 3px;
4175 border-radius: 3px;
4176 }
4176 }
4177
4177
4178 #perms .perm_tag.admin{
4178 #perms .perm_tag.admin{
4179 background-color: #B94A48;
4179 background-color: #B94A48;
4180 color: #ffffff;
4180 color: #ffffff;
4181 }
4181 }
4182
4182
4183 #perms .perm_tag.write{
4183 #perms .perm_tag.write{
4184 background-color: #B94A48;
4184 background-color: #B94A48;
4185 color: #ffffff;
4185 color: #ffffff;
4186 }
4186 }
4187
4187
4188 #perms .perm_tag.read{
4188 #perms .perm_tag.read{
4189 background-color: #468847;
4189 background-color: #468847;
4190 color: #ffffff;
4190 color: #ffffff;
4191 }
4191 }
4192
4192
4193 #perms .perm_tag.none{
4193 #perms .perm_tag.none{
4194 background-color: #bfbfbf;
4194 background-color: #bfbfbf;
4195 color: #ffffff;
4195 color: #ffffff;
4196 }
4196 }
4197
4197
4198
4198 .perm-gravatar{
4199 vertical-align:middle;
4200 padding:2px;
4201 }
4202 .perm-gravatar-ac{
4203 vertical-align:middle;
4204 padding:2px;
4205 }
4199
4206
4200 /*****************************************************************************
4207 /*****************************************************************************
4201 DIFFS CSS
4208 DIFFS CSS
4202 ******************************************************************************/
4209 ******************************************************************************/
4203
4210
4204 div.diffblock {
4211 div.diffblock {
4205 overflow: auto;
4212 overflow: auto;
4206 padding: 0px;
4213 padding: 0px;
4207 border: 1px solid #ccc;
4214 border: 1px solid #ccc;
4208 background: #f8f8f8;
4215 background: #f8f8f8;
4209 font-size: 100%;
4216 font-size: 100%;
4210 line-height: 100%;
4217 line-height: 100%;
4211 /* new */
4218 /* new */
4212 line-height: 125%;
4219 line-height: 125%;
4213 -webkit-border-radius: 6px 6px 0px 0px;
4220 -webkit-border-radius: 6px 6px 0px 0px;
4214 -moz-border-radius: 6px 6px 0px 0px;
4221 -moz-border-radius: 6px 6px 0px 0px;
4215 border-radius: 6px 6px 0px 0px;
4222 border-radius: 6px 6px 0px 0px;
4216 }
4223 }
4217 div.diffblock.margined{
4224 div.diffblock.margined{
4218 margin: 0px 20px 0px 20px;
4225 margin: 0px 20px 0px 20px;
4219 }
4226 }
4220 div.diffblock .code-header{
4227 div.diffblock .code-header{
4221 border-bottom: 1px solid #CCCCCC;
4228 border-bottom: 1px solid #CCCCCC;
4222 background: #EEEEEE;
4229 background: #EEEEEE;
4223 padding:10px 0 10px 0;
4230 padding:10px 0 10px 0;
4224 height: 14px;
4231 height: 14px;
4225 }
4232 }
4226 div.diffblock .code-header.cv{
4233 div.diffblock .code-header.cv{
4227 height: 34px;
4234 height: 34px;
4228 }
4235 }
4229 div.diffblock .code-header-title{
4236 div.diffblock .code-header-title{
4230 padding: 0px 0px 10px 5px !important;
4237 padding: 0px 0px 10px 5px !important;
4231 margin: 0 !important;
4238 margin: 0 !important;
4232 }
4239 }
4233 div.diffblock .code-header .hash{
4240 div.diffblock .code-header .hash{
4234 float: left;
4241 float: left;
4235 padding: 2px 0 0 2px;
4242 padding: 2px 0 0 2px;
4236 }
4243 }
4237 div.diffblock .code-header .date{
4244 div.diffblock .code-header .date{
4238 float:left;
4245 float:left;
4239 text-transform: uppercase;
4246 text-transform: uppercase;
4240 padding: 2px 0px 0px 2px;
4247 padding: 2px 0px 0px 2px;
4241 }
4248 }
4242 div.diffblock .code-header div{
4249 div.diffblock .code-header div{
4243 margin-left:4px;
4250 margin-left:4px;
4244 font-weight: bold;
4251 font-weight: bold;
4245 font-size: 14px;
4252 font-size: 14px;
4246 }
4253 }
4247 div.diffblock .code-body{
4254 div.diffblock .code-body{
4248 background: #FFFFFF;
4255 background: #FFFFFF;
4249 }
4256 }
4250 div.diffblock pre.raw{
4257 div.diffblock pre.raw{
4251 background: #FFFFFF;
4258 background: #FFFFFF;
4252 color:#000000;
4259 color:#000000;
4253 }
4260 }
4254 table.code-difftable{
4261 table.code-difftable{
4255 border-collapse: collapse;
4262 border-collapse: collapse;
4256 width: 99%;
4263 width: 99%;
4257 }
4264 }
4258 table.code-difftable td {
4265 table.code-difftable td {
4259 padding: 0 !important;
4266 padding: 0 !important;
4260 background: none !important;
4267 background: none !important;
4261 border:0 !important;
4268 border:0 !important;
4262 vertical-align: none !important;
4269 vertical-align: none !important;
4263 }
4270 }
4264 table.code-difftable .context{
4271 table.code-difftable .context{
4265 background:none repeat scroll 0 0 #DDE7EF;
4272 background:none repeat scroll 0 0 #DDE7EF;
4266 }
4273 }
4267 table.code-difftable .add{
4274 table.code-difftable .add{
4268 background:none repeat scroll 0 0 #DDFFDD;
4275 background:none repeat scroll 0 0 #DDFFDD;
4269 }
4276 }
4270 table.code-difftable .add ins{
4277 table.code-difftable .add ins{
4271 background:none repeat scroll 0 0 #AAFFAA;
4278 background:none repeat scroll 0 0 #AAFFAA;
4272 text-decoration:none;
4279 text-decoration:none;
4273 }
4280 }
4274 table.code-difftable .del{
4281 table.code-difftable .del{
4275 background:none repeat scroll 0 0 #FFDDDD;
4282 background:none repeat scroll 0 0 #FFDDDD;
4276 }
4283 }
4277 table.code-difftable .del del{
4284 table.code-difftable .del del{
4278 background:none repeat scroll 0 0 #FFAAAA;
4285 background:none repeat scroll 0 0 #FFAAAA;
4279 text-decoration:none;
4286 text-decoration:none;
4280 }
4287 }
4281
4288
4282 /** LINE NUMBERS **/
4289 /** LINE NUMBERS **/
4283 table.code-difftable .lineno{
4290 table.code-difftable .lineno{
4284
4291
4285 padding-left:2px;
4292 padding-left:2px;
4286 padding-right:2px;
4293 padding-right:2px;
4287 text-align:right;
4294 text-align:right;
4288 width:32px;
4295 width:32px;
4289 -moz-user-select:none;
4296 -moz-user-select:none;
4290 -webkit-user-select: none;
4297 -webkit-user-select: none;
4291 border-right: 1px solid #CCC !important;
4298 border-right: 1px solid #CCC !important;
4292 border-left: 0px solid #CCC !important;
4299 border-left: 0px solid #CCC !important;
4293 border-top: 0px solid #CCC !important;
4300 border-top: 0px solid #CCC !important;
4294 border-bottom: none !important;
4301 border-bottom: none !important;
4295 vertical-align: middle !important;
4302 vertical-align: middle !important;
4296
4303
4297 }
4304 }
4298 table.code-difftable .lineno.new {
4305 table.code-difftable .lineno.new {
4299 }
4306 }
4300 table.code-difftable .lineno.old {
4307 table.code-difftable .lineno.old {
4301 }
4308 }
4302 table.code-difftable .lineno a{
4309 table.code-difftable .lineno a{
4303 color:#747474 !important;
4310 color:#747474 !important;
4304 font:11px "Bitstream Vera Sans Mono",Monaco,"Courier New",Courier,monospace !important;
4311 font:11px "Bitstream Vera Sans Mono",Monaco,"Courier New",Courier,monospace !important;
4305 letter-spacing:-1px;
4312 letter-spacing:-1px;
4306 text-align:right;
4313 text-align:right;
4307 padding-right: 2px;
4314 padding-right: 2px;
4308 cursor: pointer;
4315 cursor: pointer;
4309 display: block;
4316 display: block;
4310 width: 32px;
4317 width: 32px;
4311 }
4318 }
4312
4319
4313 table.code-difftable .lineno-inline{
4320 table.code-difftable .lineno-inline{
4314 background:none repeat scroll 0 0 #FFF !important;
4321 background:none repeat scroll 0 0 #FFF !important;
4315 padding-left:2px;
4322 padding-left:2px;
4316 padding-right:2px;
4323 padding-right:2px;
4317 text-align:right;
4324 text-align:right;
4318 width:30px;
4325 width:30px;
4319 -moz-user-select:none;
4326 -moz-user-select:none;
4320 -webkit-user-select: none;
4327 -webkit-user-select: none;
4321 }
4328 }
4322
4329
4323 /** CODE **/
4330 /** CODE **/
4324 table.code-difftable .code {
4331 table.code-difftable .code {
4325 display: block;
4332 display: block;
4326 width: 100%;
4333 width: 100%;
4327 }
4334 }
4328 table.code-difftable .code td{
4335 table.code-difftable .code td{
4329 margin:0;
4336 margin:0;
4330 padding:0;
4337 padding:0;
4331 }
4338 }
4332 table.code-difftable .code pre{
4339 table.code-difftable .code pre{
4333 margin:0;
4340 margin:0;
4334 padding:0;
4341 padding:0;
4335 height: 17px;
4342 height: 17px;
4336 line-height: 17px;
4343 line-height: 17px;
4337 }
4344 }
4338
4345
4339
4346
4340 .diffblock.margined.comm .line .code:hover{
4347 .diffblock.margined.comm .line .code:hover{
4341 background-color:#FFFFCC !important;
4348 background-color:#FFFFCC !important;
4342 cursor: pointer !important;
4349 cursor: pointer !important;
4343 background-image:url("../images/icons/comment_add.png") !important;
4350 background-image:url("../images/icons/comment_add.png") !important;
4344 background-repeat:no-repeat !important;
4351 background-repeat:no-repeat !important;
4345 background-position: right !important;
4352 background-position: right !important;
4346 background-position: 0% 50% !important;
4353 background-position: 0% 50% !important;
4347 }
4354 }
4348 .diffblock.margined.comm .line .code.no-comment:hover{
4355 .diffblock.margined.comm .line .code.no-comment:hover{
4349 background-image: none !important;
4356 background-image: none !important;
4350 cursor: auto !important;
4357 cursor: auto !important;
4351 background-color: inherit !important;
4358 background-color: inherit !important;
4352
4359
4353 }
4360 }
@@ -1,739 +1,911 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
47
48 /**
48 /**
49 * SmartColorGenerator
49 * SmartColorGenerator
50 *
50 *
51 *usage::
51 *usage::
52 * var CG = new ColorGenerator();
52 * var CG = new ColorGenerator();
53 * var col = CG.getColor(key); //returns array of RGB
53 * var col = CG.getColor(key); //returns array of RGB
54 * 'rgb({0})'.format(col.join(',')
54 * 'rgb({0})'.format(col.join(',')
55 *
55 *
56 * @returns {ColorGenerator}
56 * @returns {ColorGenerator}
57 */
57 */
58 var ColorGenerator = function(){
58 var ColorGenerator = function(){
59 this.GOLDEN_RATIO = 0.618033988749895;
59 this.GOLDEN_RATIO = 0.618033988749895;
60 this.CURRENT_RATIO = 0.22717784590367374 // this can be random
60 this.CURRENT_RATIO = 0.22717784590367374 // this can be random
61 this.HSV_1 = 0.75;//saturation
61 this.HSV_1 = 0.75;//saturation
62 this.HSV_2 = 0.95;
62 this.HSV_2 = 0.95;
63 this.color;
63 this.color;
64 this.cacheColorMap = {};
64 this.cacheColorMap = {};
65 };
65 };
66
66
67 ColorGenerator.prototype = {
67 ColorGenerator.prototype = {
68 getColor:function(key){
68 getColor:function(key){
69 if(this.cacheColorMap[key] !== undefined){
69 if(this.cacheColorMap[key] !== undefined){
70 return this.cacheColorMap[key];
70 return this.cacheColorMap[key];
71 }
71 }
72 else{
72 else{
73 this.cacheColorMap[key] = this.generateColor();
73 this.cacheColorMap[key] = this.generateColor();
74 return this.cacheColorMap[key];
74 return this.cacheColorMap[key];
75 }
75 }
76 },
76 },
77 _hsvToRgb:function(h,s,v){
77 _hsvToRgb:function(h,s,v){
78 if (s == 0.0)
78 if (s == 0.0)
79 return [v, v, v];
79 return [v, v, v];
80 i = parseInt(h * 6.0)
80 i = parseInt(h * 6.0)
81 f = (h * 6.0) - i
81 f = (h * 6.0) - i
82 p = v * (1.0 - s)
82 p = v * (1.0 - s)
83 q = v * (1.0 - s * f)
83 q = v * (1.0 - s * f)
84 t = v * (1.0 - s * (1.0 - f))
84 t = v * (1.0 - s * (1.0 - f))
85 i = i % 6
85 i = i % 6
86 if (i == 0)
86 if (i == 0)
87 return [v, t, p]
87 return [v, t, p]
88 if (i == 1)
88 if (i == 1)
89 return [q, v, p]
89 return [q, v, p]
90 if (i == 2)
90 if (i == 2)
91 return [p, v, t]
91 return [p, v, t]
92 if (i == 3)
92 if (i == 3)
93 return [p, q, v]
93 return [p, q, v]
94 if (i == 4)
94 if (i == 4)
95 return [t, p, v]
95 return [t, p, v]
96 if (i == 5)
96 if (i == 5)
97 return [v, p, q]
97 return [v, p, q]
98 },
98 },
99 generateColor:function(){
99 generateColor:function(){
100 this.CURRENT_RATIO = this.CURRENT_RATIO+this.GOLDEN_RATIO;
100 this.CURRENT_RATIO = this.CURRENT_RATIO+this.GOLDEN_RATIO;
101 this.CURRENT_RATIO = this.CURRENT_RATIO %= 1;
101 this.CURRENT_RATIO = this.CURRENT_RATIO %= 1;
102 HSV_tuple = [this.CURRENT_RATIO, this.HSV_1, this.HSV_2]
102 HSV_tuple = [this.CURRENT_RATIO, this.HSV_1, this.HSV_2]
103 RGB_tuple = this._hsvToRgb(HSV_tuple[0],HSV_tuple[1],HSV_tuple[2]);
103 RGB_tuple = this._hsvToRgb(HSV_tuple[0],HSV_tuple[1],HSV_tuple[2]);
104 function toRgb(v){
104 function toRgb(v){
105 return ""+parseInt(v*256)
105 return ""+parseInt(v*256)
106 }
106 }
107 return [toRgb(RGB_tuple[0]),toRgb(RGB_tuple[1]),toRgb(RGB_tuple[2])];
107 return [toRgb(RGB_tuple[0]),toRgb(RGB_tuple[1]),toRgb(RGB_tuple[2])];
108
108
109 }
109 }
110 }
110 }
111
111
112
112
113
113
114
114
115
115
116 /**
116 /**
117 * GLOBAL YUI Shortcuts
117 * GLOBAL YUI Shortcuts
118 */
118 */
119 var YUC = YAHOO.util.Connect;
119 var YUC = YAHOO.util.Connect;
120 var YUD = YAHOO.util.Dom;
120 var YUD = YAHOO.util.Dom;
121 var YUE = YAHOO.util.Event;
121 var YUE = YAHOO.util.Event;
122 var YUQ = YAHOO.util.Selector.query;
122 var YUQ = YAHOO.util.Selector.query;
123
123
124 // defines if push state is enabled for this browser ?
124 // defines if push state is enabled for this browser ?
125 var push_state_enabled = Boolean(
125 var push_state_enabled = Boolean(
126 window.history && window.history.pushState && window.history.replaceState
126 window.history && window.history.pushState && window.history.replaceState
127 && !( /* disable for versions of iOS before version 4.3 (8F190) */
127 && !( /* disable for versions of iOS before version 4.3 (8F190) */
128 (/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i).test(navigator.userAgent)
128 (/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i).test(navigator.userAgent)
129 /* disable for the mercury iOS browser, or at least older versions of the webkit engine */
129 /* disable for the mercury iOS browser, or at least older versions of the webkit engine */
130 || (/AppleWebKit\/5([0-2]|3[0-2])/i).test(navigator.userAgent)
130 || (/AppleWebKit\/5([0-2]|3[0-2])/i).test(navigator.userAgent)
131 )
131 )
132 );
132 );
133
133
134 var _run_callbacks = function(callbacks){
134 var _run_callbacks = function(callbacks){
135 if (callbacks !== undefined){
135 if (callbacks !== undefined){
136 var _l = callbacks.length;
136 var _l = callbacks.length;
137 for (var i=0;i<_l;i++){
137 for (var i=0;i<_l;i++){
138 var func = callbacks[i];
138 var func = callbacks[i];
139 if(typeof(func)=='function'){
139 if(typeof(func)=='function'){
140 try{
140 try{
141 func();
141 func();
142 }catch (err){};
142 }catch (err){};
143 }
143 }
144 }
144 }
145 }
145 }
146 }
146 }
147
147
148 /**
148 /**
149 * Partial Ajax Implementation
149 * Partial Ajax Implementation
150 *
150 *
151 * @param url: defines url to make partial request
151 * @param url: defines url to make partial request
152 * @param container: defines id of container to input partial result
152 * @param container: defines id of container to input partial result
153 * @param s_call: success callback function that takes o as arg
153 * @param s_call: success callback function that takes o as arg
154 * o.tId
154 * o.tId
155 * o.status
155 * o.status
156 * o.statusText
156 * o.statusText
157 * o.getResponseHeader[ ]
157 * o.getResponseHeader[ ]
158 * o.getAllResponseHeaders
158 * o.getAllResponseHeaders
159 * o.responseText
159 * o.responseText
160 * o.responseXML
160 * o.responseXML
161 * o.argument
161 * o.argument
162 * @param f_call: failure callback
162 * @param f_call: failure callback
163 * @param args arguments
163 * @param args arguments
164 */
164 */
165 function ypjax(url,container,s_call,f_call,args){
165 function ypjax(url,container,s_call,f_call,args){
166 var method='GET';
166 var method='GET';
167 if(args===undefined){
167 if(args===undefined){
168 args=null;
168 args=null;
169 }
169 }
170
170
171 // Set special header for partial ajax == HTTP_X_PARTIAL_XHR
171 // Set special header for partial ajax == HTTP_X_PARTIAL_XHR
172 YUC.initHeader('X-PARTIAL-XHR',true);
172 YUC.initHeader('X-PARTIAL-XHR',true);
173
173
174 // wrapper of passed callback
174 // wrapper of passed callback
175 var s_wrapper = (function(o){
175 var s_wrapper = (function(o){
176 return function(o){
176 return function(o){
177 YUD.get(container).innerHTML=o.responseText;
177 YUD.get(container).innerHTML=o.responseText;
178 YUD.setStyle(container,'opacity','1.0');
178 YUD.setStyle(container,'opacity','1.0');
179 //execute the given original callback
179 //execute the given original callback
180 if (s_call !== undefined){
180 if (s_call !== undefined){
181 s_call(o);
181 s_call(o);
182 }
182 }
183 }
183 }
184 })()
184 })()
185 YUD.setStyle(container,'opacity','0.3');
185 YUD.setStyle(container,'opacity','0.3');
186 YUC.asyncRequest(method,url,{
186 YUC.asyncRequest(method,url,{
187 success:s_wrapper,
187 success:s_wrapper,
188 failure:function(o){
188 failure:function(o){
189 console.log(o);
189 console.log(o);
190 YUD.get(container).innerHTML='ERROR';
190 YUD.get(container).innerHTML='ERROR';
191 YUD.setStyle(container,'opacity','1.0');
191 YUD.setStyle(container,'opacity','1.0');
192 YUD.setStyle(container,'color','red');
192 YUD.setStyle(container,'color','red');
193 }
193 }
194 },args);
194 },args);
195
195
196 };
196 };
197
197
198 /**
198 /**
199 * tooltip activate
199 * tooltip activate
200 */
200 */
201 var tooltip_activate = function(){
201 var tooltip_activate = function(){
202 function toolTipsId(){
202 function toolTipsId(){
203 var ids = [];
203 var ids = [];
204 var tts = YUQ('.tooltip');
204 var tts = YUQ('.tooltip');
205 for (var i = 0; i < tts.length; i++) {
205 for (var i = 0; i < tts.length; i++) {
206 // if element doesn't not have and id
206 // if element doesn't not have and id
207 // autogenerate one for tooltip
207 // autogenerate one for tooltip
208 if (!tts[i].id){
208 if (!tts[i].id){
209 tts[i].id='tt'+((i*100)+tts.length);
209 tts[i].id='tt'+((i*100)+tts.length);
210 }
210 }
211 ids.push(tts[i].id);
211 ids.push(tts[i].id);
212 }
212 }
213 return ids
213 return ids
214 };
214 };
215 var myToolTips = new YAHOO.widget.Tooltip("tooltip", {
215 var myToolTips = new YAHOO.widget.Tooltip("tooltip", {
216 context: [[toolTipsId()],"tl","bl",null,[0,5]],
216 context: [[toolTipsId()],"tl","bl",null,[0,5]],
217 monitorresize:false,
217 monitorresize:false,
218 xyoffset :[0,0],
218 xyoffset :[0,0],
219 autodismissdelay:300000,
219 autodismissdelay:300000,
220 hidedelay:5,
220 hidedelay:5,
221 showdelay:20,
221 showdelay:20,
222 });
222 });
223 };
223 };
224
224
225 /**
225 /**
226 * show more
226 * show more
227 */
227 */
228 var show_more_event = function(){
228 var show_more_event = function(){
229 YUE.on(YUD.getElementsByClassName('show_more'),'click',function(e){
229 YUE.on(YUD.getElementsByClassName('show_more'),'click',function(e){
230 var el = e.target;
230 var el = e.target;
231 YUD.setStyle(YUD.get(el.id.substring(1)),'display','');
231 YUD.setStyle(YUD.get(el.id.substring(1)),'display','');
232 YUD.setStyle(el.parentNode,'display','none');
232 YUD.setStyle(el.parentNode,'display','none');
233 });
233 });
234 };
234 };
235
235
236
236
237 /**
237 /**
238 * Quick filter widget
238 * Quick filter widget
239 *
239 *
240 * @param target: filter input target
240 * @param target: filter input target
241 * @param nodes: list of nodes in html we want to filter.
241 * @param nodes: list of nodes in html we want to filter.
242 * @param display_element function that takes current node from nodes and
242 * @param display_element function that takes current node from nodes and
243 * does hide or show based on the node
243 * does hide or show based on the node
244 *
244 *
245 */
245 */
246 var q_filter = function(target,nodes,display_element){
246 var q_filter = function(target,nodes,display_element){
247
247
248 var nodes = nodes;
248 var nodes = nodes;
249 var q_filter_field = YUD.get(target);
249 var q_filter_field = YUD.get(target);
250 var F = YAHOO.namespace(target);
250 var F = YAHOO.namespace(target);
251
251
252 YUE.on(q_filter_field,'click',function(){
252 YUE.on(q_filter_field,'click',function(){
253 q_filter_field.value = '';
253 q_filter_field.value = '';
254 });
254 });
255
255
256 YUE.on(q_filter_field,'keyup',function(e){
256 YUE.on(q_filter_field,'keyup',function(e){
257 clearTimeout(F.filterTimeout);
257 clearTimeout(F.filterTimeout);
258 F.filterTimeout = setTimeout(F.updateFilter,600);
258 F.filterTimeout = setTimeout(F.updateFilter,600);
259 });
259 });
260
260
261 F.filterTimeout = null;
261 F.filterTimeout = null;
262
262
263 var show_node = function(node){
263 var show_node = function(node){
264 YUD.setStyle(node,'display','')
264 YUD.setStyle(node,'display','')
265 }
265 }
266 var hide_node = function(node){
266 var hide_node = function(node){
267 YUD.setStyle(node,'display','none');
267 YUD.setStyle(node,'display','none');
268 }
268 }
269
269
270 F.updateFilter = function() {
270 F.updateFilter = function() {
271 // Reset timeout
271 // Reset timeout
272 F.filterTimeout = null;
272 F.filterTimeout = null;
273
273
274 var obsolete = [];
274 var obsolete = [];
275
275
276 var req = q_filter_field.value.toLowerCase();
276 var req = q_filter_field.value.toLowerCase();
277
277
278 var l = nodes.length;
278 var l = nodes.length;
279 var i;
279 var i;
280 var showing = 0;
280 var showing = 0;
281
281
282 for (i=0;i<l;i++ ){
282 for (i=0;i<l;i++ ){
283 var n = nodes[i];
283 var n = nodes[i];
284 var target_element = display_element(n)
284 var target_element = display_element(n)
285 if(req && n.innerHTML.toLowerCase().indexOf(req) == -1){
285 if(req && n.innerHTML.toLowerCase().indexOf(req) == -1){
286 hide_node(target_element);
286 hide_node(target_element);
287 }
287 }
288 else{
288 else{
289 show_node(target_element);
289 show_node(target_element);
290 showing+=1;
290 showing+=1;
291 }
291 }
292 }
292 }
293
293
294 // if repo_count is set update the number
294 // if repo_count is set update the number
295 var cnt = YUD.get('repo_count');
295 var cnt = YUD.get('repo_count');
296 if(cnt){
296 if(cnt){
297 YUD.get('repo_count').innerHTML = showing;
297 YUD.get('repo_count').innerHTML = showing;
298 }
298 }
299
299
300 }
300 }
301 };
301 };
302
302
303 var ajaxPOST = function(url,postData,success) {
303 var ajaxPOST = function(url,postData,success) {
304 var sUrl = url;
304 var sUrl = url;
305 var callback = {
305 var callback = {
306 success: success,
306 success: success,
307 failure: function (o) {
307 failure: function (o) {
308 alert("error");
308 alert("error");
309 },
309 },
310 };
310 };
311 var postData = postData;
311 var postData = postData;
312 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
312 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
313 };
313 };
314
314
315
315
316 /** comments **/
316 /** comments **/
317 var removeInlineForm = function(form) {
317 var removeInlineForm = function(form) {
318 form.parentNode.removeChild(form);
318 form.parentNode.removeChild(form);
319 };
319 };
320
320
321 var tableTr = function(cls,body){
321 var tableTr = function(cls,body){
322 var form = document.createElement('tr');
322 var form = document.createElement('tr');
323 YUD.addClass(form, cls);
323 YUD.addClass(form, cls);
324 form.innerHTML = '<td class="lineno-inline new-inline"></td>'+
324 form.innerHTML = '<td class="lineno-inline new-inline"></td>'+
325 '<td class="lineno-inline old-inline"></td>'+
325 '<td class="lineno-inline old-inline"></td>'+
326 '<td>{0}</td>'.format(body);
326 '<td>{0}</td>'.format(body);
327 return form;
327 return form;
328 };
328 };
329
329
330 var createInlineForm = function(parent_tr, f_path, line) {
330 var createInlineForm = function(parent_tr, f_path, line) {
331 var tmpl = YUD.get('comment-inline-form-template').innerHTML;
331 var tmpl = YUD.get('comment-inline-form-template').innerHTML;
332 tmpl = tmpl.format(f_path, line);
332 tmpl = tmpl.format(f_path, line);
333 var form = tableTr('comment-form-inline',tmpl)
333 var form = tableTr('comment-form-inline',tmpl)
334
334
335 // create event for hide button
335 // create event for hide button
336 form = new YAHOO.util.Element(form);
336 form = new YAHOO.util.Element(form);
337 var form_hide_button = new YAHOO.util.Element(form.getElementsByClassName('hide-inline-form')[0]);
337 var form_hide_button = new YAHOO.util.Element(form.getElementsByClassName('hide-inline-form')[0]);
338 form_hide_button.on('click', function(e) {
338 form_hide_button.on('click', function(e) {
339 var newtr = e.currentTarget.parentNode.parentNode.parentNode.parentNode.parentNode;
339 var newtr = e.currentTarget.parentNode.parentNode.parentNode.parentNode.parentNode;
340 removeInlineForm(newtr);
340 removeInlineForm(newtr);
341 YUD.removeClass(parent_tr, 'form-open');
341 YUD.removeClass(parent_tr, 'form-open');
342 });
342 });
343 return form
343 return form
344 };
344 };
345 var injectInlineForm = function(tr){
345 var injectInlineForm = function(tr){
346 if(YUD.hasClass(tr,'form-open') || YUD.hasClass(tr,'context') || YUD.hasClass(tr,'no-comment')){
346 if(YUD.hasClass(tr,'form-open') || YUD.hasClass(tr,'context') || YUD.hasClass(tr,'no-comment')){
347 return
347 return
348 }
348 }
349 YUD.addClass(tr,'form-open');
349 YUD.addClass(tr,'form-open');
350 var node = tr.parentNode.parentNode.parentNode.getElementsByClassName('full_f_path')[0];
350 var node = tr.parentNode.parentNode.parentNode.getElementsByClassName('full_f_path')[0];
351 var f_path = YUD.getAttribute(node,'path');
351 var f_path = YUD.getAttribute(node,'path');
352 var lineno = getLineNo(tr);
352 var lineno = getLineNo(tr);
353 var form = createInlineForm(tr, f_path, lineno);
353 var form = createInlineForm(tr, f_path, lineno);
354 var target_tr = tr;
354 var target_tr = tr;
355 if(YUD.hasClass(YUD.getNextSibling(tr),'inline-comments')){
355 if(YUD.hasClass(YUD.getNextSibling(tr),'inline-comments')){
356 target_tr = YUD.getNextSibling(tr);
356 target_tr = YUD.getNextSibling(tr);
357 }
357 }
358 YUD.insertAfter(form,target_tr);
358 YUD.insertAfter(form,target_tr);
359 YUD.get('text_'+lineno).focus();
359 YUD.get('text_'+lineno).focus();
360 tooltip_activate();
360 tooltip_activate();
361 };
361 };
362
362
363 var createInlineAddButton = function(tr,label){
363 var createInlineAddButton = function(tr,label){
364 var html = '<div class="add-comment"><span class="ui-btn">{0}</span></div>'.format(label);
364 var html = '<div class="add-comment"><span class="ui-btn">{0}</span></div>'.format(label);
365
365
366 var add = new YAHOO.util.Element(tableTr('inline-comments-button',html));
366 var add = new YAHOO.util.Element(tableTr('inline-comments-button',html));
367 add.on('click', function(e) {
367 add.on('click', function(e) {
368 injectInlineForm(tr);
368 injectInlineForm(tr);
369 });
369 });
370 return add;
370 return add;
371 };
371 };
372
372
373 var getLineNo = function(tr) {
373 var getLineNo = function(tr) {
374 var line;
374 var line;
375 var o = tr.children[0].id.split('_');
375 var o = tr.children[0].id.split('_');
376 var n = tr.children[1].id.split('_');
376 var n = tr.children[1].id.split('_');
377
377
378 if (n.length >= 2) {
378 if (n.length >= 2) {
379 line = n[n.length-1];
379 line = n[n.length-1];
380 } else if (o.length >= 2) {
380 } else if (o.length >= 2) {
381 line = o[o.length-1];
381 line = o[o.length-1];
382 }
382 }
383
383
384 return line
384 return line
385 };
385 };
386
386
387
387
388 var fileBrowserListeners = function(current_url, node_list_url, url_base,
388 var fileBrowserListeners = function(current_url, node_list_url, url_base,
389 truncated_lbl, nomatch_lbl){
389 truncated_lbl, nomatch_lbl){
390 var current_url_branch = +"?branch=__BRANCH__";
390 var current_url_branch = +"?branch=__BRANCH__";
391 var url = url_base;
391 var url = url_base;
392 var node_url = node_list_url;
392 var node_url = node_list_url;
393
393
394 YUE.on('stay_at_branch','click',function(e){
394 YUE.on('stay_at_branch','click',function(e){
395 if(e.target.checked){
395 if(e.target.checked){
396 var uri = current_url_branch;
396 var uri = current_url_branch;
397 uri = uri.replace('__BRANCH__',e.target.value);
397 uri = uri.replace('__BRANCH__',e.target.value);
398 window.location = uri;
398 window.location = uri;
399 }
399 }
400 else{
400 else{
401 window.location = current_url;
401 window.location = current_url;
402 }
402 }
403 })
403 })
404
404
405 var n_filter = YUD.get('node_filter');
405 var n_filter = YUD.get('node_filter');
406 var F = YAHOO.namespace('node_filter');
406 var F = YAHOO.namespace('node_filter');
407
407
408 F.filterTimeout = null;
408 F.filterTimeout = null;
409 var nodes = null;
409 var nodes = null;
410
410
411 F.initFilter = function(){
411 F.initFilter = function(){
412 YUD.setStyle('node_filter_box_loading','display','');
412 YUD.setStyle('node_filter_box_loading','display','');
413 YUD.setStyle('search_activate_id','display','none');
413 YUD.setStyle('search_activate_id','display','none');
414 YUD.setStyle('add_node_id','display','none');
414 YUD.setStyle('add_node_id','display','none');
415 YUC.initHeader('X-PARTIAL-XHR',true);
415 YUC.initHeader('X-PARTIAL-XHR',true);
416 YUC.asyncRequest('GET',url,{
416 YUC.asyncRequest('GET',url,{
417 success:function(o){
417 success:function(o){
418 nodes = JSON.parse(o.responseText);
418 nodes = JSON.parse(o.responseText);
419 YUD.setStyle('node_filter_box_loading','display','none');
419 YUD.setStyle('node_filter_box_loading','display','none');
420 YUD.setStyle('node_filter_box','display','');
420 YUD.setStyle('node_filter_box','display','');
421 n_filter.focus();
421 n_filter.focus();
422 if(YUD.hasClass(n_filter,'init')){
422 if(YUD.hasClass(n_filter,'init')){
423 n_filter.value = '';
423 n_filter.value = '';
424 YUD.removeClass(n_filter,'init');
424 YUD.removeClass(n_filter,'init');
425 }
425 }
426 },
426 },
427 failure:function(o){
427 failure:function(o){
428 console.log('failed to load');
428 console.log('failed to load');
429 }
429 }
430 },null);
430 },null);
431 }
431 }
432
432
433 F.updateFilter = function(e) {
433 F.updateFilter = function(e) {
434
434
435 return function(){
435 return function(){
436 // Reset timeout
436 // Reset timeout
437 F.filterTimeout = null;
437 F.filterTimeout = null;
438 var query = e.target.value.toLowerCase();
438 var query = e.target.value.toLowerCase();
439 var match = [];
439 var match = [];
440 var matches = 0;
440 var matches = 0;
441 var matches_max = 20;
441 var matches_max = 20;
442 if (query != ""){
442 if (query != ""){
443 for(var i=0;i<nodes.length;i++){
443 for(var i=0;i<nodes.length;i++){
444
444
445 var pos = nodes[i].name.toLowerCase().indexOf(query)
445 var pos = nodes[i].name.toLowerCase().indexOf(query)
446 if(query && pos != -1){
446 if(query && pos != -1){
447
447
448 matches++
448 matches++
449 //show only certain amount to not kill browser
449 //show only certain amount to not kill browser
450 if (matches > matches_max){
450 if (matches > matches_max){
451 break;
451 break;
452 }
452 }
453
453
454 var n = nodes[i].name;
454 var n = nodes[i].name;
455 var t = nodes[i].type;
455 var t = nodes[i].type;
456 var n_hl = n.substring(0,pos)
456 var n_hl = n.substring(0,pos)
457 +"<b>{0}</b>".format(n.substring(pos,pos+query.length))
457 +"<b>{0}</b>".format(n.substring(pos,pos+query.length))
458 +n.substring(pos+query.length)
458 +n.substring(pos+query.length)
459 match.push('<tr><td><a class="browser-{0}" href="{1}">{2}</a></td><td colspan="5"></td></tr>'.format(t,node_url.replace('__FPATH__',n),n_hl));
459 match.push('<tr><td><a class="browser-{0}" href="{1}">{2}</a></td><td colspan="5"></td></tr>'.format(t,node_url.replace('__FPATH__',n),n_hl));
460 }
460 }
461 if(match.length >= matches_max){
461 if(match.length >= matches_max){
462 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(truncated_lbl));
462 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(truncated_lbl));
463 }
463 }
464
464
465 }
465 }
466 }
466 }
467 if(query != ""){
467 if(query != ""){
468 YUD.setStyle('tbody','display','none');
468 YUD.setStyle('tbody','display','none');
469 YUD.setStyle('tbody_filtered','display','');
469 YUD.setStyle('tbody_filtered','display','');
470
470
471 if (match.length==0){
471 if (match.length==0){
472 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(nomatch_lbl));
472 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(nomatch_lbl));
473 }
473 }
474
474
475 YUD.get('tbody_filtered').innerHTML = match.join("");
475 YUD.get('tbody_filtered').innerHTML = match.join("");
476 }
476 }
477 else{
477 else{
478 YUD.setStyle('tbody','display','');
478 YUD.setStyle('tbody','display','');
479 YUD.setStyle('tbody_filtered','display','none');
479 YUD.setStyle('tbody_filtered','display','none');
480 }
480 }
481
481
482 }
482 }
483 };
483 };
484
484
485 YUE.on(YUD.get('filter_activate'),'click',function(){
485 YUE.on(YUD.get('filter_activate'),'click',function(){
486 F.initFilter();
486 F.initFilter();
487 })
487 })
488 YUE.on(n_filter,'click',function(){
488 YUE.on(n_filter,'click',function(){
489 if(YUD.hasClass(n_filter,'init')){
489 if(YUD.hasClass(n_filter,'init')){
490 n_filter.value = '';
490 n_filter.value = '';
491 YUD.removeClass(n_filter,'init');
491 YUD.removeClass(n_filter,'init');
492 }
492 }
493 });
493 });
494 YUE.on(n_filter,'keyup',function(e){
494 YUE.on(n_filter,'keyup',function(e){
495 clearTimeout(F.filterTimeout);
495 clearTimeout(F.filterTimeout);
496 F.filterTimeout = setTimeout(F.updateFilter(e),600);
496 F.filterTimeout = setTimeout(F.updateFilter(e),600);
497 });
497 });
498 };
498 };
499
499
500
500
501 var initCodeMirror = function(textAreadId,resetUrl){
501 var initCodeMirror = function(textAreadId,resetUrl){
502 var myCodeMirror = CodeMirror.fromTextArea(YUD.get(textAreadId),{
502 var myCodeMirror = CodeMirror.fromTextArea(YUD.get(textAreadId),{
503 mode: "null",
503 mode: "null",
504 lineNumbers:true
504 lineNumbers:true
505 });
505 });
506 YUE.on('reset','click',function(e){
506 YUE.on('reset','click',function(e){
507 window.location=resetUrl
507 window.location=resetUrl
508 });
508 });
509
509
510 YUE.on('file_enable','click',function(){
510 YUE.on('file_enable','click',function(){
511 YUD.setStyle('editor_container','display','');
511 YUD.setStyle('editor_container','display','');
512 YUD.setStyle('upload_file_container','display','none');
512 YUD.setStyle('upload_file_container','display','none');
513 YUD.setStyle('filename_container','display','');
513 YUD.setStyle('filename_container','display','');
514 });
514 });
515
515
516 YUE.on('upload_file_enable','click',function(){
516 YUE.on('upload_file_enable','click',function(){
517 YUD.setStyle('editor_container','display','none');
517 YUD.setStyle('editor_container','display','none');
518 YUD.setStyle('upload_file_container','display','');
518 YUD.setStyle('upload_file_container','display','');
519 YUD.setStyle('filename_container','display','none');
519 YUD.setStyle('filename_container','display','none');
520 });
520 });
521 };
521 };
522
522
523
523
524
524
525 var getIdentNode = function(n){
525 var getIdentNode = function(n){
526 //iterate thru nodes untill matched interesting node !
526 //iterate thru nodes untill matched interesting node !
527
527
528 if (typeof n == 'undefined'){
528 if (typeof n == 'undefined'){
529 return -1
529 return -1
530 }
530 }
531
531
532 if(typeof n.id != "undefined" && n.id.match('L[0-9]+')){
532 if(typeof n.id != "undefined" && n.id.match('L[0-9]+')){
533 return n
533 return n
534 }
534 }
535 else{
535 else{
536 return getIdentNode(n.parentNode);
536 return getIdentNode(n.parentNode);
537 }
537 }
538 };
538 };
539
539
540 var getSelectionLink = function(selection_link_label) {
540 var getSelectionLink = function(selection_link_label) {
541 return function(){
541 return function(){
542 //get selection from start/to nodes
542 //get selection from start/to nodes
543 if (typeof window.getSelection != "undefined") {
543 if (typeof window.getSelection != "undefined") {
544 s = window.getSelection();
544 s = window.getSelection();
545
545
546 from = getIdentNode(s.anchorNode);
546 from = getIdentNode(s.anchorNode);
547 till = getIdentNode(s.focusNode);
547 till = getIdentNode(s.focusNode);
548
548
549 f_int = parseInt(from.id.replace('L',''));
549 f_int = parseInt(from.id.replace('L',''));
550 t_int = parseInt(till.id.replace('L',''));
550 t_int = parseInt(till.id.replace('L',''));
551
551
552 if (f_int > t_int){
552 if (f_int > t_int){
553 //highlight from bottom
553 //highlight from bottom
554 offset = -35;
554 offset = -35;
555 ranges = [t_int,f_int];
555 ranges = [t_int,f_int];
556
556
557 }
557 }
558 else{
558 else{
559 //highligth from top
559 //highligth from top
560 offset = 35;
560 offset = 35;
561 ranges = [f_int,t_int];
561 ranges = [f_int,t_int];
562 }
562 }
563
563
564 if (ranges[0] != ranges[1]){
564 if (ranges[0] != ranges[1]){
565 if(YUD.get('linktt') == null){
565 if(YUD.get('linktt') == null){
566 hl_div = document.createElement('div');
566 hl_div = document.createElement('div');
567 hl_div.id = 'linktt';
567 hl_div.id = 'linktt';
568 }
568 }
569 anchor = '#L'+ranges[0]+'-'+ranges[1];
569 anchor = '#L'+ranges[0]+'-'+ranges[1];
570 hl_div.innerHTML = '';
570 hl_div.innerHTML = '';
571 l = document.createElement('a');
571 l = document.createElement('a');
572 l.href = location.href.substring(0,location.href.indexOf('#'))+anchor;
572 l.href = location.href.substring(0,location.href.indexOf('#'))+anchor;
573 l.innerHTML = selection_link_label;
573 l.innerHTML = selection_link_label;
574 hl_div.appendChild(l);
574 hl_div.appendChild(l);
575
575
576 YUD.get('body').appendChild(hl_div);
576 YUD.get('body').appendChild(hl_div);
577
577
578 xy = YUD.getXY(till.id);
578 xy = YUD.getXY(till.id);
579
579
580 YUD.addClass('linktt','yui-tt');
580 YUD.addClass('linktt','yui-tt');
581 YUD.setStyle('linktt','top',xy[1]+offset+'px');
581 YUD.setStyle('linktt','top',xy[1]+offset+'px');
582 YUD.setStyle('linktt','left',xy[0]+'px');
582 YUD.setStyle('linktt','left',xy[0]+'px');
583 YUD.setStyle('linktt','visibility','visible');
583 YUD.setStyle('linktt','visibility','visible');
584 }
584 }
585 else{
585 else{
586 YUD.setStyle('linktt','visibility','hidden');
586 YUD.setStyle('linktt','visibility','hidden');
587 }
587 }
588 }
588 }
589 }
589 }
590 };
590 };
591
591
592 var deleteNotification = function(url, notification_id,callbacks){
592 var deleteNotification = function(url, notification_id,callbacks){
593 var callback = {
593 var callback = {
594 success:function(o){
594 success:function(o){
595 var obj = YUD.get(String("notification_"+notification_id));
595 var obj = YUD.get(String("notification_"+notification_id));
596 if(obj.parentNode !== undefined){
596 if(obj.parentNode !== undefined){
597 obj.parentNode.removeChild(obj);
597 obj.parentNode.removeChild(obj);
598 }
598 }
599 _run_callbacks(callbacks);
599 _run_callbacks(callbacks);
600 },
600 },
601 failure:function(o){
601 failure:function(o){
602 alert("error");
602 alert("error");
603 },
603 },
604 };
604 };
605 var postData = '_method=delete';
605 var postData = '_method=delete';
606 var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
606 var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
607 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
607 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
608 callback, postData);
608 callback, postData);
609 };
609 };
610
610
611
611
612 /** MEMBERS AUTOCOMPLETE WIDGET **/
613
614 var MembersAutoComplete = function (users_list, groups_list, group_lbl, members_lbl) {
615 var myUsers = users_list;
616 var myGroups = groups_list;
617
618 // Define a custom search function for the DataSource of users
619 var matchUsers = function (sQuery) {
620 // Case insensitive matching
621 var query = sQuery.toLowerCase();
622 var i = 0;
623 var l = myUsers.length;
624 var matches = [];
625
626 // Match against each name of each contact
627 for (; i < l; i++) {
628 contact = myUsers[i];
629 if ((contact.fname.toLowerCase().indexOf(query) > -1) || (contact.lname.toLowerCase().indexOf(query) > -1) || (contact.nname && (contact.nname.toLowerCase().indexOf(query) > -1))) {
630 matches[matches.length] = contact;
631 }
632 }
633 return matches;
634 };
635
636 // Define a custom search function for the DataSource of usersGroups
637 var matchGroups = function (sQuery) {
638 // Case insensitive matching
639 var query = sQuery.toLowerCase();
640 var i = 0;
641 var l = myGroups.length;
642 var matches = [];
643
644 // Match against each name of each contact
645 for (; i < l; i++) {
646 matched_group = myGroups[i];
647 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
648 matches[matches.length] = matched_group;
649 }
650 }
651 return matches;
652 };
653
654 //match all
655 var matchAll = function (sQuery) {
656 u = matchUsers(sQuery);
657 g = matchGroups(sQuery);
658 return u.concat(g);
659 };
660
661 // DataScheme for members
662 var memberDS = new YAHOO.util.FunctionDataSource(matchAll);
663 memberDS.responseSchema = {
664 fields: ["id", "fname", "lname", "nname", "grname", "grmembers", "gravatar_lnk"]
665 };
666
667 // DataScheme for owner
668 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
669 ownerDS.responseSchema = {
670 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
671 };
672
673 // Instantiate AutoComplete for perms
674 var membersAC = new YAHOO.widget.AutoComplete("perm_new_member_name", "perm_container", memberDS);
675 membersAC.useShadow = false;
676 membersAC.resultTypeList = false;
677
678 // Instantiate AutoComplete for owner
679 var ownerAC = new YAHOO.widget.AutoComplete("user", "owner_container", ownerDS);
680 ownerAC.useShadow = false;
681 ownerAC.resultTypeList = false;
682
683
684 // Helper highlight function for the formatter
685 var highlightMatch = function (full, snippet, matchindex) {
686 return full.substring(0, matchindex)
687 + "<span class='match'>"
688 + full.substr(matchindex, snippet.length)
689 + "</span>" + full.substring(matchindex + snippet.length);
690 };
691
692 // Custom formatter to highlight the matching letters
693 var custom_formatter = function (oResultData, sQuery, sResultMatch) {
694 var query = sQuery.toLowerCase();
695 var _gravatar = function(res, em, group){
696 if (group !== undefined){
697 em = '/images/icons/group.png'
698 }
699 tmpl = '<img class="perm-gravatar-ac" src="{0}"/>{1}'
700 return tmpl.format(em,res)
701 }
702 // group
703 if (oResultData.grname != undefined) {
704 var grname = oResultData.grname;
705 var grmembers = oResultData.grmembers;
706 var grnameMatchIndex = grname.toLowerCase().indexOf(query);
707 var grprefix = "{0}: ".format(group_lbl);
708 var grsuffix = " (" + grmembers + " )";
709 var grsuffix = " ({0} {1})".format(grmembers, members_lbl);
710
711 if (grnameMatchIndex > -1) {
712 return _gravatar(grprefix + highlightMatch(grname, query, grnameMatchIndex) + grsuffix,null,true);
713 }
714 return _gravatar(grprefix + oResultData.grname + grsuffix, null,true);
715 // Users
716 } else if (oResultData.fname != undefined) {
717 var fname = oResultData.fname,
718 lname = oResultData.lname,
719 nname = oResultData.nname || "",
720 // Guard against null value
721 fnameMatchIndex = fname.toLowerCase().indexOf(query),
722 lnameMatchIndex = lname.toLowerCase().indexOf(query),
723 nnameMatchIndex = nname.toLowerCase().indexOf(query),
724 displayfname, displaylname, displaynname;
725
726 if (fnameMatchIndex > -1) {
727 displayfname = highlightMatch(fname, query, fnameMatchIndex);
728 } else {
729 displayfname = fname;
730 }
731
732 if (lnameMatchIndex > -1) {
733 displaylname = highlightMatch(lname, query, lnameMatchIndex);
734 } else {
735 displaylname = lname;
736 }
737
738 if (nnameMatchIndex > -1) {
739 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
740 } else {
741 displaynname = nname ? "(" + nname + ")" : "";
742 }
743
744 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
745 } else {
746 return '';
747 }
748 };
749 membersAC.formatResult = custom_formatter;
750 ownerAC.formatResult = custom_formatter;
751
752 var myHandler = function (sType, aArgs) {
753
754 var myAC = aArgs[0]; // reference back to the AC instance
755 var elLI = aArgs[1]; // reference to the selected LI element
756 var oData = aArgs[2]; // object literal of selected item's result data
757 //fill the autocomplete with value
758 if (oData.nname != undefined) {
759 //users
760 myAC.getInputEl().value = oData.nname;
761 YUD.get('perm_new_member_type').value = 'user';
762 } else {
763 //groups
764 myAC.getInputEl().value = oData.grname;
765 YUD.get('perm_new_member_type').value = 'users_group';
766 }
767 };
768
769 membersAC.itemSelectEvent.subscribe(myHandler);
770 if(ownerAC.itemSelectEvent){
771 ownerAC.itemSelectEvent.subscribe(myHandler);
772 }
773
774 return {
775 memberDS: memberDS,
776 ownerDS: ownerDS,
777 membersAC: membersAC,
778 ownerAC: ownerAC,
779 };
780 }
781
782
783
612 /**
784 /**
613 * QUICK REPO MENU
785 * QUICK REPO MENU
614 */
786 */
615 var quick_repo_menu = function(){
787 var quick_repo_menu = function(){
616 YUE.on(YUQ('.quick_repo_menu'),'mouseenter',function(e){
788 YUE.on(YUQ('.quick_repo_menu'),'mouseenter',function(e){
617 var menu = e.currentTarget.firstElementChild.firstElementChild;
789 var menu = e.currentTarget.firstElementChild.firstElementChild;
618 if(YUD.hasClass(menu,'hidden')){
790 if(YUD.hasClass(menu,'hidden')){
619 YUD.replaceClass(e.currentTarget,'hidden', 'active');
791 YUD.replaceClass(e.currentTarget,'hidden', 'active');
620 YUD.replaceClass(menu, 'hidden', 'active');
792 YUD.replaceClass(menu, 'hidden', 'active');
621 }
793 }
622 })
794 })
623 YUE.on(YUQ('.quick_repo_menu'),'mouseleave',function(e){
795 YUE.on(YUQ('.quick_repo_menu'),'mouseleave',function(e){
624 var menu = e.currentTarget.firstElementChild.firstElementChild;
796 var menu = e.currentTarget.firstElementChild.firstElementChild;
625 if(YUD.hasClass(menu,'active')){
797 if(YUD.hasClass(menu,'active')){
626 YUD.replaceClass(e.currentTarget, 'active', 'hidden');
798 YUD.replaceClass(e.currentTarget, 'active', 'hidden');
627 YUD.replaceClass(menu, 'active', 'hidden');
799 YUD.replaceClass(menu, 'active', 'hidden');
628 }
800 }
629 })
801 })
630 };
802 };
631
803
632
804
633 /**
805 /**
634 * TABLE SORTING
806 * TABLE SORTING
635 */
807 */
636
808
637 // returns a node from given html;
809 // returns a node from given html;
638 var fromHTML = function(html){
810 var fromHTML = function(html){
639 var _html = document.createElement('element');
811 var _html = document.createElement('element');
640 _html.innerHTML = html;
812 _html.innerHTML = html;
641 return _html;
813 return _html;
642 }
814 }
643 var get_rev = function(node){
815 var get_rev = function(node){
644 var n = node.firstElementChild.firstElementChild;
816 var n = node.firstElementChild.firstElementChild;
645
817
646 if (n===null){
818 if (n===null){
647 return -1
819 return -1
648 }
820 }
649 else{
821 else{
650 out = n.firstElementChild.innerHTML.split(':')[0].replace('r','');
822 out = n.firstElementChild.innerHTML.split(':')[0].replace('r','');
651 return parseInt(out);
823 return parseInt(out);
652 }
824 }
653 }
825 }
654
826
655 var get_name = function(node){
827 var get_name = function(node){
656 var name = node.firstElementChild.children[2].innerHTML;
828 var name = node.firstElementChild.children[2].innerHTML;
657 return name
829 return name
658 }
830 }
659 var get_group_name = function(node){
831 var get_group_name = function(node){
660 var name = node.firstElementChild.children[1].innerHTML;
832 var name = node.firstElementChild.children[1].innerHTML;
661 return name
833 return name
662 }
834 }
663 var get_date = function(node){
835 var get_date = function(node){
664 var date_ = node.firstElementChild.innerHTML;
836 var date_ = node.firstElementChild.innerHTML;
665 return date_
837 return date_
666 }
838 }
667
839
668 var revisionSort = function(a, b, desc, field) {
840 var revisionSort = function(a, b, desc, field) {
669
841
670 var a_ = fromHTML(a.getData(field));
842 var a_ = fromHTML(a.getData(field));
671 var b_ = fromHTML(b.getData(field));
843 var b_ = fromHTML(b.getData(field));
672
844
673 // extract revisions from string nodes
845 // extract revisions from string nodes
674 a_ = get_rev(a_)
846 a_ = get_rev(a_)
675 b_ = get_rev(b_)
847 b_ = get_rev(b_)
676
848
677 var comp = YAHOO.util.Sort.compare;
849 var comp = YAHOO.util.Sort.compare;
678 var compState = comp(a_, b_, desc);
850 var compState = comp(a_, b_, desc);
679 return compState;
851 return compState;
680 };
852 };
681 var ageSort = function(a, b, desc, field) {
853 var ageSort = function(a, b, desc, field) {
682 var a_ = a.getData(field);
854 var a_ = a.getData(field);
683 var b_ = b.getData(field);
855 var b_ = b.getData(field);
684
856
685 var comp = YAHOO.util.Sort.compare;
857 var comp = YAHOO.util.Sort.compare;
686 var compState = comp(a_, b_, desc);
858 var compState = comp(a_, b_, desc);
687 return compState;
859 return compState;
688 };
860 };
689
861
690 var nameSort = function(a, b, desc, field) {
862 var nameSort = function(a, b, desc, field) {
691 var a_ = fromHTML(a.getData(field));
863 var a_ = fromHTML(a.getData(field));
692 var b_ = fromHTML(b.getData(field));
864 var b_ = fromHTML(b.getData(field));
693
865
694 // extract name from table
866 // extract name from table
695 a_ = get_name(a_)
867 a_ = get_name(a_)
696 b_ = get_name(b_)
868 b_ = get_name(b_)
697
869
698 var comp = YAHOO.util.Sort.compare;
870 var comp = YAHOO.util.Sort.compare;
699 var compState = comp(a_, b_, desc);
871 var compState = comp(a_, b_, desc);
700 return compState;
872 return compState;
701 };
873 };
702
874
703 var permNameSort = function(a, b, desc, field) {
875 var permNameSort = function(a, b, desc, field) {
704 var a_ = fromHTML(a.getData(field));
876 var a_ = fromHTML(a.getData(field));
705 var b_ = fromHTML(b.getData(field));
877 var b_ = fromHTML(b.getData(field));
706 // extract name from table
878 // extract name from table
707
879
708 a_ = a_.children[0].innerHTML;
880 a_ = a_.children[0].innerHTML;
709 b_ = b_.children[0].innerHTML;
881 b_ = b_.children[0].innerHTML;
710
882
711 var comp = YAHOO.util.Sort.compare;
883 var comp = YAHOO.util.Sort.compare;
712 var compState = comp(a_, b_, desc);
884 var compState = comp(a_, b_, desc);
713 return compState;
885 return compState;
714 };
886 };
715
887
716 var groupNameSort = function(a, b, desc, field) {
888 var groupNameSort = function(a, b, desc, field) {
717 var a_ = fromHTML(a.getData(field));
889 var a_ = fromHTML(a.getData(field));
718 var b_ = fromHTML(b.getData(field));
890 var b_ = fromHTML(b.getData(field));
719
891
720 // extract name from table
892 // extract name from table
721 a_ = get_group_name(a_)
893 a_ = get_group_name(a_)
722 b_ = get_group_name(b_)
894 b_ = get_group_name(b_)
723
895
724 var comp = YAHOO.util.Sort.compare;
896 var comp = YAHOO.util.Sort.compare;
725 var compState = comp(a_, b_, desc);
897 var compState = comp(a_, b_, desc);
726 return compState;
898 return compState;
727 };
899 };
728 var dateSort = function(a, b, desc, field) {
900 var dateSort = function(a, b, desc, field) {
729 var a_ = fromHTML(a.getData(field));
901 var a_ = fromHTML(a.getData(field));
730 var b_ = fromHTML(b.getData(field));
902 var b_ = fromHTML(b.getData(field));
731
903
732 // extract name from table
904 // extract name from table
733 a_ = get_date(a_)
905 a_ = get_date(a_)
734 b_ = get_date(b_)
906 b_ = get_date(b_)
735
907
736 var comp = YAHOO.util.Sort.compare;
908 var comp = YAHOO.util.Sort.compare;
737 var compState = comp(a_, b_, desc);
909 var compState = comp(a_, b_, desc);
738 return compState;
910 return compState;
739 }; No newline at end of file
911 };
@@ -1,281 +1,128 b''
1 <table id="permissions_manage" class="noborder">
1 <table id="permissions_manage" class="noborder">
2 <tr>
2 <tr>
3 <td>${_('none')}</td>
3 <td>${_('none')}</td>
4 <td>${_('read')}</td>
4 <td>${_('read')}</td>
5 <td>${_('write')}</td>
5 <td>${_('write')}</td>
6 <td>${_('admin')}</td>
6 <td>${_('admin')}</td>
7 <td>${_('member')}</td>
7 <td>${_('member')}</td>
8 <td></td>
8 <td></td>
9 </tr>
9 </tr>
10 ## USERS
10 ## USERS
11 %for r2p in c.repo_info.repo_to_perm:
11 %for r2p in c.repo_info.repo_to_perm:
12 %if r2p.user.username =='default' and c.repo_info.private:
12 %if r2p.user.username =='default' and c.repo_info.private:
13 <tr>
13 <tr>
14 <td colspan="4">
14 <td colspan="4">
15 <span class="private_repo_msg">
15 <span class="private_repo_msg">
16 ${_('private repository')}
16 ${_('private repository')}
17 </span>
17 </span>
18 </td>
18 </td>
19 <td class="private_repo_msg"><img style="vertical-align:bottom" src="${h.url('/images/icons/user.png')}"/>${r2p.user.username}</td>
19 <td class="private_repo_msg"><img style="vertical-align:bottom" src="${h.url('/images/icons/user.png')}"/>${r2p.user.username}</td>
20 </tr>
20 </tr>
21 %else:
21 %else:
22 <tr id="id${id(r2p.user.username)}">
22 <tr id="id${id(r2p.user.username)}">
23 <td>${h.radio('u_perm_%s' % r2p.user.username,'repository.none')}</td>
23 <td>${h.radio('u_perm_%s' % r2p.user.username,'repository.none')}</td>
24 <td>${h.radio('u_perm_%s' % r2p.user.username,'repository.read')}</td>
24 <td>${h.radio('u_perm_%s' % r2p.user.username,'repository.read')}</td>
25 <td>${h.radio('u_perm_%s' % r2p.user.username,'repository.write')}</td>
25 <td>${h.radio('u_perm_%s' % r2p.user.username,'repository.write')}</td>
26 <td>${h.radio('u_perm_%s' % r2p.user.username,'repository.admin')}</td>
26 <td>${h.radio('u_perm_%s' % r2p.user.username,'repository.admin')}</td>
27 <td style="white-space: nowrap;">
27 <td style="white-space: nowrap;">
28 <img style="vertical-align:bottom" src="${h.url('/images/icons/user.png')}"/>${r2p.user.username}
28 <img class="perm-gravatar" src="${h.gravatar_url(r2p.user.email,14)}"/>${r2p.user.username}
29 </td>
29 </td>
30 <td>
30 <td>
31 %if r2p.user.username !='default':
31 %if r2p.user.username !='default':
32 <span class="delete_icon action_button" onclick="ajaxActionUser(${r2p.user.user_id},'${'id%s'%id(r2p.user.username)}')">
32 <span class="delete_icon action_button" onclick="ajaxActionUser(${r2p.user.user_id},'${'id%s'%id(r2p.user.username)}')">
33 ${_('revoke')}
33 ${_('revoke')}
34 </span>
34 </span>
35 %endif
35 %endif
36 </td>
36 </td>
37 </tr>
37 </tr>
38 %endif
38 %endif
39 %endfor
39 %endfor
40
40
41 ## USERS GROUPS
41 ## USERS GROUPS
42 %for g2p in c.repo_info.users_group_to_perm:
42 %for g2p in c.repo_info.users_group_to_perm:
43 <tr id="id${id(g2p.users_group.users_group_name)}">
43 <tr id="id${id(g2p.users_group.users_group_name)}">
44 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'repository.none')}</td>
44 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'repository.none')}</td>
45 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'repository.read')}</td>
45 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'repository.read')}</td>
46 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'repository.write')}</td>
46 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'repository.write')}</td>
47 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'repository.admin')}</td>
47 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'repository.admin')}</td>
48 <td style="white-space: nowrap;">
48 <td style="white-space: nowrap;">
49 <img style="vertical-align:bottom" src="${h.url('/images/icons/group.png')}"/>${g2p.users_group.users_group_name}
49 <img class="perm-gravatar" src="${h.url('/images/icons/group.png')}"/>${g2p.users_group.users_group_name}
50 </td>
50 </td>
51 <td>
51 <td>
52 <span class="delete_icon action_button" onclick="ajaxActionUsersGroup(${g2p.users_group.users_group_id},'${'id%s'%id(g2p.users_group.users_group_name)}')">
52 <span class="delete_icon action_button" onclick="ajaxActionUsersGroup(${g2p.users_group.users_group_id},'${'id%s'%id(g2p.users_group.users_group_name)}')">
53 ${_('revoke')}
53 ${_('revoke')}
54 </span>
54 </span>
55 </td>
55 </td>
56 </tr>
56 </tr>
57 %endfor
57 %endfor
58 <tr id="add_perm_input">
58 <tr id="add_perm_input">
59 <td>${h.radio('perm_new_member','repository.none')}</td>
59 <td>${h.radio('perm_new_member','repository.none')}</td>
60 <td>${h.radio('perm_new_member','repository.read')}</td>
60 <td>${h.radio('perm_new_member','repository.read')}</td>
61 <td>${h.radio('perm_new_member','repository.write')}</td>
61 <td>${h.radio('perm_new_member','repository.write')}</td>
62 <td>${h.radio('perm_new_member','repository.admin')}</td>
62 <td>${h.radio('perm_new_member','repository.admin')}</td>
63 <td class='ac'>
63 <td class='ac'>
64 <div class="perm_ac" id="perm_ac">
64 <div class="perm_ac" id="perm_ac">
65 ${h.text('perm_new_member_name',class_='yui-ac-input')}
65 ${h.text('perm_new_member_name',class_='yui-ac-input')}
66 ${h.hidden('perm_new_member_type')}
66 ${h.hidden('perm_new_member_type')}
67 <div id="perm_container"></div>
67 <div id="perm_container"></div>
68 </div>
68 </div>
69 </td>
69 </td>
70 <td></td>
70 <td></td>
71 </tr>
71 </tr>
72 <tr>
72 <tr>
73 <td colspan="6">
73 <td colspan="6">
74 <span id="add_perm" class="add_icon" style="cursor: pointer;">
74 <span id="add_perm" class="add_icon" style="cursor: pointer;">
75 ${_('Add another member')}
75 ${_('Add another member')}
76 </span>
76 </span>
77 </td>
77 </td>
78 </tr>
78 </tr>
79 </table>
79 </table>
80 <script type="text/javascript">
80 <script type="text/javascript">
81 function ajaxActionUser(user_id, field_id) {
81 function ajaxActionUser(user_id, field_id) {
82 var sUrl = "${h.url('delete_repo_user',repo_name=c.repo_name)}";
82 var sUrl = "${h.url('delete_repo_user',repo_name=c.repo_name)}";
83 var callback = {
83 var callback = {
84 success: function (o) {
84 success: function (o) {
85 var tr = YUD.get(String(field_id));
85 var tr = YUD.get(String(field_id));
86 tr.parentNode.removeChild(tr);
86 tr.parentNode.removeChild(tr);
87 },
87 },
88 failure: function (o) {
88 failure: function (o) {
89 alert("${_('Failed to remove user')}");
89 alert("${_('Failed to remove user')}");
90 },
90 },
91 };
91 };
92 var postData = '_method=delete&user_id=' + user_id;
92 var postData = '_method=delete&user_id=' + user_id;
93 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
93 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
94 };
94 };
95
95
96 function ajaxActionUsersGroup(users_group_id,field_id){
96 function ajaxActionUsersGroup(users_group_id,field_id){
97 var sUrl = "${h.url('delete_repo_users_group',repo_name=c.repo_name)}";
97 var sUrl = "${h.url('delete_repo_users_group',repo_name=c.repo_name)}";
98 var callback = {
98 var callback = {
99 success:function(o){
99 success:function(o){
100 var tr = YUD.get(String(field_id));
100 var tr = YUD.get(String(field_id));
101 tr.parentNode.removeChild(tr);
101 tr.parentNode.removeChild(tr);
102 },
102 },
103 failure:function(o){
103 failure:function(o){
104 alert("${_('Failed to remove users group')}");
104 alert("${_('Failed to remove users group')}");
105 },
105 },
106 };
106 };
107 var postData = '_method=delete&users_group_id='+users_group_id;
107 var postData = '_method=delete&users_group_id='+users_group_id;
108 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
108 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
109 };
109 };
110
110
111 YUE.onDOMReady(function () {
111 YUE.onDOMReady(function () {
112 if (!YUD.hasClass('perm_new_member_name', 'error')) {
112 if (!YUD.hasClass('perm_new_member_name', 'error')) {
113 YUD.setStyle('add_perm_input', 'display', 'none');
113 YUD.setStyle('add_perm_input', 'display', 'none');
114 }
114 }
115 YAHOO.util.Event.addListener('add_perm', 'click', function () {
115 YAHOO.util.Event.addListener('add_perm', 'click', function () {
116 YUD.setStyle('add_perm_input', 'display', '');
116 YUD.setStyle('add_perm_input', 'display', '');
117 YUD.setStyle('add_perm', 'opacity', '0.6');
117 YUD.setStyle('add_perm', 'opacity', '0.6');
118 YUD.setStyle('add_perm', 'cursor', 'default');
118 YUD.setStyle('add_perm', 'cursor', 'default');
119 });
119 });
120 MembersAutoComplete(
121 ${c.users_array|n},
122 ${c.users_groups_array|n},
123 "${_('Group')}",
124 "${_('members')}"
125 );
120 });
126 });
121
127
122 YAHOO.example.FnMultipleFields = function () {
123 var myUsers = ${c.users_array|n};
124 var myGroups = ${c.users_groups_array|n};
125
126 // Define a custom search function for the DataSource of users
127 var matchUsers = function (sQuery) {
128 // Case insensitive matching
129 var query = sQuery.toLowerCase();
130 var i = 0;
131 var l = myUsers.length;
132 var matches = [];
133
134 // Match against each name of each contact
135 for (; i < l; i++) {
136 contact = myUsers[i];
137 if ((contact.fname.toLowerCase().indexOf(query) > -1) || (contact.lname.toLowerCase().indexOf(query) > -1) || (contact.nname && (contact.nname.toLowerCase().indexOf(query) > -1))) {
138 matches[matches.length] = contact;
139 }
140 }
141 return matches;
142 };
143
144 // Define a custom search function for the DataSource of usersGroups
145 var matchGroups = function (sQuery) {
146 // Case insensitive matching
147 var query = sQuery.toLowerCase();
148 var i = 0;
149 var l = myGroups.length;
150 var matches = [];
151
152 // Match against each name of each contact
153 for (; i < l; i++) {
154 matched_group = myGroups[i];
155 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
156 matches[matches.length] = matched_group;
157 }
158 }
159 return matches;
160 };
161
162 //match all
163 var matchAll = function (sQuery) {
164 u = matchUsers(sQuery);
165 g = matchGroups(sQuery);
166 return u.concat(g);
167 };
168
169 // DataScheme for members
170 var memberDS = new YAHOO.util.FunctionDataSource(matchAll);
171 memberDS.responseSchema = {
172 fields: ["id", "fname", "lname", "nname", "grname", "grmembers"]
173 };
174
175 // DataScheme for owner
176 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
177 ownerDS.responseSchema = {
178 fields: ["id", "fname", "lname", "nname"]
179 };
180
181 // Instantiate AutoComplete for perms
182 var membersAC = new YAHOO.widget.AutoComplete("perm_new_member_name", "perm_container", memberDS);
183 membersAC.useShadow = false;
184 membersAC.resultTypeList = false;
185
186 // Instantiate AutoComplete for owner
187 var ownerAC = new YAHOO.widget.AutoComplete("user", "owner_container", ownerDS);
188 ownerAC.useShadow = false;
189 ownerAC.resultTypeList = false;
190
191
192 // Helper highlight function for the formatter
193 var highlightMatch = function (full, snippet, matchindex) {
194 return full.substring(0, matchindex) + "<span class='match'>" + full.substr(matchindex, snippet.length) + "</span>" + full.substring(matchindex + snippet.length);
195 };
196
197 // Custom formatter to highlight the matching letters
198 var custom_formatter = function (oResultData, sQuery, sResultMatch) {
199 var query = sQuery.toLowerCase();
200
201 if (oResultData.grname != undefined) {
202 var grname = oResultData.grname;
203 var grmembers = oResultData.grmembers;
204 var grnameMatchIndex = grname.toLowerCase().indexOf(query);
205 var grprefix = "${_('Group')}: ";
206 var grsuffix = " (" + grmembers + " ${_('members')})";
207
208 if (grnameMatchIndex > -1) {
209 return grprefix + highlightMatch(grname, query, grnameMatchIndex) + grsuffix;
210 }
211
212 return grprefix + oResultData.grname + grsuffix;
213 } else if (oResultData.fname != undefined) {
214
215 var fname = oResultData.fname,
216 lname = oResultData.lname,
217 nname = oResultData.nname || "",
218 // Guard against null value
219 fnameMatchIndex = fname.toLowerCase().indexOf(query),
220 lnameMatchIndex = lname.toLowerCase().indexOf(query),
221 nnameMatchIndex = nname.toLowerCase().indexOf(query),
222 displayfname, displaylname, displaynname;
223
224 if (fnameMatchIndex > -1) {
225 displayfname = highlightMatch(fname, query, fnameMatchIndex);
226 } else {
227 displayfname = fname;
228 }
229
230 if (lnameMatchIndex > -1) {
231 displaylname = highlightMatch(lname, query, lnameMatchIndex);
232 } else {
233 displaylname = lname;
234 }
235
236 if (nnameMatchIndex > -1) {
237 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
238 } else {
239 displaynname = nname ? "(" + nname + ")" : "";
240 }
241
242 return displayfname + " " + displaylname + " " + displaynname;
243 } else {
244 return '';
245 }
246 };
247 membersAC.formatResult = custom_formatter;
248 ownerAC.formatResult = custom_formatter;
249
250 var myHandler = function (sType, aArgs) {
251
252 var myAC = aArgs[0]; // reference back to the AC instance
253 var elLI = aArgs[1]; // reference to the selected LI element
254 var oData = aArgs[2]; // object literal of selected item's result data
255 //fill the autocomplete with value
256 if (oData.nname != undefined) {
257 //users
258 myAC.getInputEl().value = oData.nname;
259 YUD.get('perm_new_member_type').value = 'user';
260 } else {
261 //groups
262 myAC.getInputEl().value = oData.grname;
263 YUD.get('perm_new_member_type').value = 'users_group';
264 }
265
266 };
267
268 membersAC.itemSelectEvent.subscribe(myHandler);
269 if(ownerAC.itemSelectEvent){
270 ownerAC.itemSelectEvent.subscribe(myHandler);
271 }
272
273 return {
274 memberDS: memberDS,
275 ownerDS: ownerDS,
276 membersAC: membersAC,
277 ownerAC: ownerAC,
278 };
279 }();
280
281 </script>
128 </script>
@@ -1,270 +1,117 b''
1 <table id="permissions_manage" class="noborder">
1 <table id="permissions_manage" class="noborder">
2 <tr>
2 <tr>
3 <td>${_('none')}</td>
3 <td>${_('none')}</td>
4 <td>${_('read')}</td>
4 <td>${_('read')}</td>
5 <td>${_('write')}</td>
5 <td>${_('write')}</td>
6 <td>${_('admin')}</td>
6 <td>${_('admin')}</td>
7 <td>${_('member')}</td>
7 <td>${_('member')}</td>
8 <td></td>
8 <td></td>
9 </tr>
9 </tr>
10 ## USERS
10 ## USERS
11 %for r2p in c.repos_group.repo_group_to_perm:
11 %for r2p in c.repos_group.repo_group_to_perm:
12 <tr id="id${id(r2p.user.username)}">
12 <tr id="id${id(r2p.user.username)}">
13 <td>${h.radio('u_perm_%s' % r2p.user.username,'group.none')}</td>
13 <td>${h.radio('u_perm_%s' % r2p.user.username,'group.none')}</td>
14 <td>${h.radio('u_perm_%s' % r2p.user.username,'group.read')}</td>
14 <td>${h.radio('u_perm_%s' % r2p.user.username,'group.read')}</td>
15 <td>${h.radio('u_perm_%s' % r2p.user.username,'group.write')}</td>
15 <td>${h.radio('u_perm_%s' % r2p.user.username,'group.write')}</td>
16 <td>${h.radio('u_perm_%s' % r2p.user.username,'group.admin')}</td>
16 <td>${h.radio('u_perm_%s' % r2p.user.username,'group.admin')}</td>
17 <td style="white-space: nowrap;">
17 <td style="white-space: nowrap;">
18 <img style="vertical-align:bottom" src="${h.url('/images/icons/user.png')}"/>${r2p.user.username}
18 <img class="perm-gravatar" src="${h.gravatar_url(r2p.user.email,14)}"/>${r2p.user.username}
19 </td>
19 </td>
20 <td>
20 <td>
21 %if r2p.user.username !='default':
21 %if r2p.user.username !='default':
22 <span class="delete_icon action_button" onclick="ajaxActionUser(${r2p.user.user_id},'${'id%s'%id(r2p.user.username)}')">
22 <span class="delete_icon action_button" onclick="ajaxActionUser(${r2p.user.user_id},'${'id%s'%id(r2p.user.username)}')">
23 ${_('revoke')}
23 ${_('revoke')}
24 </span>
24 </span>
25 %endif
25 %endif
26 </td>
26 </td>
27 </tr>
27 </tr>
28 %endfor
28 %endfor
29
29
30 ## USERS GROUPS
30 ## USERS GROUPS
31 %for g2p in c.repos_group.users_group_to_perm:
31 %for g2p in c.repos_group.users_group_to_perm:
32 <tr id="id${id(g2p.users_group.users_group_name)}">
32 <tr id="id${id(g2p.users_group.users_group_name)}">
33 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'group.none')}</td>
33 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'group.none')}</td>
34 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'group.read')}</td>
34 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'group.read')}</td>
35 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'group.write')}</td>
35 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'group.write')}</td>
36 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'group.admin')}</td>
36 <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'group.admin')}</td>
37 <td style="white-space: nowrap;">
37 <td style="white-space: nowrap;">
38 <img style="vertical-align:bottom" src="${h.url('/images/icons/group.png')}"/>${g2p.users_group.users_group_name}
38 <img class="perm-gravatar" src="${h.url('/images/icons/group.png')}"/>${g2p.users_group.users_group_name}
39 </td>
39 </td>
40 <td>
40 <td>
41 <span class="delete_icon action_button" onclick="ajaxActionUsersGroup(${g2p.users_group.users_group_id},'${'id%s'%id(g2p.users_group.users_group_name)}')">
41 <span class="delete_icon action_button" onclick="ajaxActionUsersGroup(${g2p.users_group.users_group_id},'${'id%s'%id(g2p.users_group.users_group_name)}')">
42 ${_('revoke')}
42 ${_('revoke')}
43 </span>
43 </span>
44 </td>
44 </td>
45 </tr>
45 </tr>
46 %endfor
46 %endfor
47 <tr id="add_perm_input">
47 <tr id="add_perm_input">
48 <td>${h.radio('perm_new_member','group.none')}</td>
48 <td>${h.radio('perm_new_member','group.none')}</td>
49 <td>${h.radio('perm_new_member','group.read')}</td>
49 <td>${h.radio('perm_new_member','group.read')}</td>
50 <td>${h.radio('perm_new_member','group.write')}</td>
50 <td>${h.radio('perm_new_member','group.write')}</td>
51 <td>${h.radio('perm_new_member','group.admin')}</td>
51 <td>${h.radio('perm_new_member','group.admin')}</td>
52 <td class='ac'>
52 <td class='ac'>
53 <div class="perm_ac" id="perm_ac">
53 <div class="perm_ac" id="perm_ac">
54 ${h.text('perm_new_member_name',class_='yui-ac-input')}
54 ${h.text('perm_new_member_name',class_='yui-ac-input')}
55 ${h.hidden('perm_new_member_type')}
55 ${h.hidden('perm_new_member_type')}
56 <div id="perm_container"></div>
56 <div id="perm_container"></div>
57 </div>
57 </div>
58 </td>
58 </td>
59 <td></td>
59 <td></td>
60 </tr>
60 </tr>
61 <tr>
61 <tr>
62 <td colspan="6">
62 <td colspan="6">
63 <span id="add_perm" class="add_icon" style="cursor: pointer;">
63 <span id="add_perm" class="add_icon" style="cursor: pointer;">
64 ${_('Add another member')}
64 ${_('Add another member')}
65 </span>
65 </span>
66 </td>
66 </td>
67 </tr>
67 </tr>
68 </table>
68 </table>
69 <script type="text/javascript">
69 <script type="text/javascript">
70 function ajaxActionUser(user_id, field_id) {
70 function ajaxActionUser(user_id, field_id) {
71 var sUrl = "${h.url('delete_repos_group_user_perm',group_name=c.repos_group.group_name)}";
71 var sUrl = "${h.url('delete_repos_group_user_perm',group_name=c.repos_group.group_name)}";
72 var callback = {
72 var callback = {
73 success: function (o) {
73 success: function (o) {
74 var tr = YUD.get(String(field_id));
74 var tr = YUD.get(String(field_id));
75 tr.parentNode.removeChild(tr);
75 tr.parentNode.removeChild(tr);
76 },
76 },
77 failure: function (o) {
77 failure: function (o) {
78 alert("${_('Failed to remove user')}");
78 alert("${_('Failed to remove user')}");
79 },
79 },
80 };
80 };
81 var postData = '_method=delete&user_id=' + user_id;
81 var postData = '_method=delete&user_id=' + user_id;
82 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
82 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
83 };
83 };
84
84
85 function ajaxActionUsersGroup(users_group_id,field_id){
85 function ajaxActionUsersGroup(users_group_id,field_id){
86 var sUrl = "${h.url('delete_repos_group_users_group_perm',group_name=c.repos_group.group_name)}";
86 var sUrl = "${h.url('delete_repos_group_users_group_perm',group_name=c.repos_group.group_name)}";
87 var callback = {
87 var callback = {
88 success:function(o){
88 success:function(o){
89 var tr = YUD.get(String(field_id));
89 var tr = YUD.get(String(field_id));
90 tr.parentNode.removeChild(tr);
90 tr.parentNode.removeChild(tr);
91 },
91 },
92 failure:function(o){
92 failure:function(o){
93 alert("${_('Failed to remove users group')}");
93 alert("${_('Failed to remove users group')}");
94 },
94 },
95 };
95 };
96 var postData = '_method=delete&users_group_id='+users_group_id;
96 var postData = '_method=delete&users_group_id='+users_group_id;
97 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
97 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
98 };
98 };
99
99
100 YUE.onDOMReady(function () {
100 YUE.onDOMReady(function () {
101 if (!YUD.hasClass('perm_new_member_name', 'error')) {
101 if (!YUD.hasClass('perm_new_member_name', 'error')) {
102 YUD.setStyle('add_perm_input', 'display', 'none');
102 YUD.setStyle('add_perm_input', 'display', 'none');
103 }
103 }
104 YAHOO.util.Event.addListener('add_perm', 'click', function () {
104 YAHOO.util.Event.addListener('add_perm', 'click', function () {
105 YUD.setStyle('add_perm_input', 'display', '');
105 YUD.setStyle('add_perm_input', 'display', '');
106 YUD.setStyle('add_perm', 'opacity', '0.6');
106 YUD.setStyle('add_perm', 'opacity', '0.6');
107 YUD.setStyle('add_perm', 'cursor', 'default');
107 YUD.setStyle('add_perm', 'cursor', 'default');
108 });
108 });
109 MembersAutoComplete(
110 ${c.users_array|n},
111 ${c.users_groups_array|n},
112 "${_('Group')}",
113 "${_('members')}"
114 );
109 });
115 });
110
116
111 YAHOO.example.FnMultipleFields = function () {
112 var myUsers = ${c.users_array|n};
113 var myGroups = ${c.users_groups_array|n};
114
115 // Define a custom search function for the DataSource of users
116 var matchUsers = function (sQuery) {
117 // Case insensitive matching
118 var query = sQuery.toLowerCase();
119 var i = 0;
120 var l = myUsers.length;
121 var matches = [];
122
123 // Match against each name of each contact
124 for (; i < l; i++) {
125 contact = myUsers[i];
126 if ((contact.fname.toLowerCase().indexOf(query) > -1) || (contact.lname.toLowerCase().indexOf(query) > -1) || (contact.nname && (contact.nname.toLowerCase().indexOf(query) > -1))) {
127 matches[matches.length] = contact;
128 }
129 }
130 return matches;
131 };
132
133 // Define a custom search function for the DataSource of usersGroups
134 var matchGroups = function (sQuery) {
135 // Case insensitive matching
136 var query = sQuery.toLowerCase();
137 var i = 0;
138 var l = myGroups.length;
139 var matches = [];
140
141 // Match against each name of each contact
142 for (; i < l; i++) {
143 matched_group = myGroups[i];
144 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
145 matches[matches.length] = matched_group;
146 }
147 }
148 return matches;
149 };
150
151 //match all
152 var matchAll = function (sQuery) {
153 u = matchUsers(sQuery);
154 g = matchGroups(sQuery);
155 return u.concat(g);
156 };
157
158 // DataScheme for members
159 var memberDS = new YAHOO.util.FunctionDataSource(matchAll);
160 memberDS.responseSchema = {
161 fields: ["id", "fname", "lname", "nname", "grname", "grmembers"]
162 };
163
164 // DataScheme for owner
165 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
166 ownerDS.responseSchema = {
167 fields: ["id", "fname", "lname", "nname"]
168 };
169
170 // Instantiate AutoComplete for perms
171 var membersAC = new YAHOO.widget.AutoComplete("perm_new_member_name", "perm_container", memberDS);
172 membersAC.useShadow = false;
173 membersAC.resultTypeList = false;
174
175 // Instantiate AutoComplete for owner
176 var ownerAC = new YAHOO.widget.AutoComplete("user", "owner_container", ownerDS);
177 ownerAC.useShadow = false;
178 ownerAC.resultTypeList = false;
179
180
181 // Helper highlight function for the formatter
182 var highlightMatch = function (full, snippet, matchindex) {
183 return full.substring(0, matchindex) + "<span class='match'>" + full.substr(matchindex, snippet.length) + "</span>" + full.substring(matchindex + snippet.length);
184 };
185
186 // Custom formatter to highlight the matching letters
187 var custom_formatter = function (oResultData, sQuery, sResultMatch) {
188 var query = sQuery.toLowerCase();
189
190 if (oResultData.grname != undefined) {
191 var grname = oResultData.grname;
192 var grmembers = oResultData.grmembers;
193 var grnameMatchIndex = grname.toLowerCase().indexOf(query);
194 var grprefix = "${_('Group')}: ";
195 var grsuffix = " (" + grmembers + " ${_('members')})";
196
197 if (grnameMatchIndex > -1) {
198 return grprefix + highlightMatch(grname, query, grnameMatchIndex) + grsuffix;
199 }
200
201 return grprefix + oResultData.grname + grsuffix;
202 } else if (oResultData.fname != undefined) {
203
204 var fname = oResultData.fname,
205 lname = oResultData.lname,
206 nname = oResultData.nname || "",
207 // Guard against null value
208 fnameMatchIndex = fname.toLowerCase().indexOf(query),
209 lnameMatchIndex = lname.toLowerCase().indexOf(query),
210 nnameMatchIndex = nname.toLowerCase().indexOf(query),
211 displayfname, displaylname, displaynname;
212
213 if (fnameMatchIndex > -1) {
214 displayfname = highlightMatch(fname, query, fnameMatchIndex);
215 } else {
216 displayfname = fname;
217 }
218
219 if (lnameMatchIndex > -1) {
220 displaylname = highlightMatch(lname, query, lnameMatchIndex);
221 } else {
222 displaylname = lname;
223 }
224
225 if (nnameMatchIndex > -1) {
226 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
227 } else {
228 displaynname = nname ? "(" + nname + ")" : "";
229 }
230
231 return displayfname + " " + displaylname + " " + displaynname;
232 } else {
233 return '';
234 }
235 };
236 membersAC.formatResult = custom_formatter;
237 ownerAC.formatResult = custom_formatter;
238
239 var myHandler = function (sType, aArgs) {
240
241 var myAC = aArgs[0]; // reference back to the AC instance
242 var elLI = aArgs[1]; // reference to the selected LI element
243 var oData = aArgs[2]; // object literal of selected item's result data
244 //fill the autocomplete with value
245 if (oData.nname != undefined) {
246 //users
247 myAC.getInputEl().value = oData.nname;
248 YUD.get('perm_new_member_type').value = 'user';
249 } else {
250 //groups
251 myAC.getInputEl().value = oData.grname;
252 YUD.get('perm_new_member_type').value = 'users_group';
253 }
254
255 };
256
257 membersAC.itemSelectEvent.subscribe(myHandler);
258 if(ownerAC.itemSelectEvent){
259 ownerAC.itemSelectEvent.subscribe(myHandler);
260 }
261
262 return {
263 memberDS: memberDS,
264 ownerDS: ownerDS,
265 membersAC: membersAC,
266 ownerAC: ownerAC,
267 };
268 }();
269
270 </script>
117 </script>
General Comments 0
You need to be logged in to leave comments. Login now