##// END OF EJS Templates
Stylistic cleanup - mostly formatting
Mads Kiilerich -
r3552:7967d00e beta
parent child Browse files
Show More
@@ -1,339 +1,338 b''
1 """The base Controller API
1 """The base Controller API
2
2
3 Provides the BaseController class for subclassing.
3 Provides the BaseController class for subclassing.
4 """
4 """
5 import logging
5 import logging
6 import time
6 import time
7 import traceback
7 import traceback
8
8
9 from paste.auth.basic import AuthBasicAuthenticator
9 from paste.auth.basic import AuthBasicAuthenticator
10 from paste.httpexceptions import HTTPUnauthorized, HTTPForbidden
10 from paste.httpexceptions import HTTPUnauthorized, HTTPForbidden
11 from paste.httpheaders import WWW_AUTHENTICATE, AUTHORIZATION
11 from paste.httpheaders import WWW_AUTHENTICATE, AUTHORIZATION
12
12
13 from pylons import config, tmpl_context as c, request, session, url
13 from pylons import config, tmpl_context as c, request, session, url
14 from pylons.controllers import WSGIController
14 from pylons.controllers import WSGIController
15 from pylons.controllers.util import redirect
15 from pylons.controllers.util import redirect
16 from pylons.templating import render_mako as render
16 from pylons.templating import render_mako as render
17
17
18 from rhodecode import __version__, BACKENDS
18 from rhodecode import __version__, BACKENDS
19
19
20 from rhodecode.lib.utils2 import str2bool, safe_unicode, AttributeDict,\
20 from rhodecode.lib.utils2 import str2bool, safe_unicode, AttributeDict,\
21 safe_str, safe_int
21 safe_str, safe_int
22 from rhodecode.lib.auth import AuthUser, get_container_username, authfunc,\
22 from rhodecode.lib.auth import AuthUser, get_container_username, authfunc,\
23 HasPermissionAnyMiddleware, CookieStoreWrapper
23 HasPermissionAnyMiddleware, CookieStoreWrapper
24 from rhodecode.lib.utils import get_repo_slug, invalidate_cache
24 from rhodecode.lib.utils import get_repo_slug, invalidate_cache
25 from rhodecode.model import meta
25 from rhodecode.model import meta
26
26
27 from rhodecode.model.db import Repository, RhodeCodeUi, User, RhodeCodeSetting
27 from rhodecode.model.db import Repository, RhodeCodeUi, User, RhodeCodeSetting
28 from rhodecode.model.notification import NotificationModel
28 from rhodecode.model.notification import NotificationModel
29 from rhodecode.model.scm import ScmModel
29 from rhodecode.model.scm import ScmModel
30 from rhodecode.model.meta import Session
30 from rhodecode.model.meta import Session
31
31
32 log = logging.getLogger(__name__)
32 log = logging.getLogger(__name__)
33
33
34
34
35 def _get_ip_addr(environ):
35 def _get_ip_addr(environ):
36 proxy_key = 'HTTP_X_REAL_IP'
36 proxy_key = 'HTTP_X_REAL_IP'
37 proxy_key2 = 'HTTP_X_FORWARDED_FOR'
37 proxy_key2 = 'HTTP_X_FORWARDED_FOR'
38 def_key = 'REMOTE_ADDR'
38 def_key = 'REMOTE_ADDR'
39
39
40 ip = environ.get(proxy_key)
40 ip = environ.get(proxy_key)
41 if ip:
41 if ip:
42 return ip
42 return ip
43
43
44 ip = environ.get(proxy_key2)
44 ip = environ.get(proxy_key2)
45 if ip:
45 if ip:
46 return ip
46 return ip
47
47
48 ip = environ.get(def_key, '0.0.0.0')
48 ip = environ.get(def_key, '0.0.0.0')
49
49
50 # HEADERS can have mutliple ips inside
50 # HEADERS can have mutliple ips inside
51 # the left-most being the original client, and each successive proxy
51 # the left-most being the original client, and each successive proxy
52 # that passed the request adding the IP address where it received the
52 # that passed the request adding the IP address where it received the
53 # request from.
53 # request from.
54 if ',' in ip:
54 if ',' in ip:
55 ip = ip.split(',')[0].strip()
55 ip = ip.split(',')[0].strip()
56
56
57 return ip
57 return ip
58
58
59
59
60 def _get_access_path(environ):
60 def _get_access_path(environ):
61 path = environ.get('PATH_INFO')
61 path = environ.get('PATH_INFO')
62 org_req = environ.get('pylons.original_request')
62 org_req = environ.get('pylons.original_request')
63 if org_req:
63 if org_req:
64 path = org_req.environ.get('PATH_INFO')
64 path = org_req.environ.get('PATH_INFO')
65 return path
65 return path
66
66
67
67
68 class BasicAuth(AuthBasicAuthenticator):
68 class BasicAuth(AuthBasicAuthenticator):
69
69
70 def __init__(self, realm, authfunc, auth_http_code=None):
70 def __init__(self, realm, authfunc, auth_http_code=None):
71 self.realm = realm
71 self.realm = realm
72 self.authfunc = authfunc
72 self.authfunc = authfunc
73 self._rc_auth_http_code = auth_http_code
73 self._rc_auth_http_code = auth_http_code
74
74
75 def build_authentication(self):
75 def build_authentication(self):
76 head = WWW_AUTHENTICATE.tuples('Basic realm="%s"' % self.realm)
76 head = WWW_AUTHENTICATE.tuples('Basic realm="%s"' % self.realm)
77 if self._rc_auth_http_code and self._rc_auth_http_code == '403':
77 if self._rc_auth_http_code and self._rc_auth_http_code == '403':
78 # return 403 if alternative http return code is specified in
78 # return 403 if alternative http return code is specified in
79 # RhodeCode config
79 # RhodeCode config
80 return HTTPForbidden(headers=head)
80 return HTTPForbidden(headers=head)
81 return HTTPUnauthorized(headers=head)
81 return HTTPUnauthorized(headers=head)
82
82
83 def authenticate(self, environ):
83 def authenticate(self, environ):
84 authorization = AUTHORIZATION(environ)
84 authorization = AUTHORIZATION(environ)
85 if not authorization:
85 if not authorization:
86 return self.build_authentication()
86 return self.build_authentication()
87 (authmeth, auth) = authorization.split(' ', 1)
87 (authmeth, auth) = authorization.split(' ', 1)
88 if 'basic' != authmeth.lower():
88 if 'basic' != authmeth.lower():
89 return self.build_authentication()
89 return self.build_authentication()
90 auth = auth.strip().decode('base64')
90 auth = auth.strip().decode('base64')
91 _parts = auth.split(':', 1)
91 _parts = auth.split(':', 1)
92 if len(_parts) == 2:
92 if len(_parts) == 2:
93 username, password = _parts
93 username, password = _parts
94 if self.authfunc(environ, username, password):
94 if self.authfunc(environ, username, password):
95 return username
95 return username
96 return self.build_authentication()
96 return self.build_authentication()
97
97
98 __call__ = authenticate
98 __call__ = authenticate
99
99
100
100
101 class BaseVCSController(object):
101 class BaseVCSController(object):
102
102
103 def __init__(self, application, config):
103 def __init__(self, application, config):
104 self.application = application
104 self.application = application
105 self.config = config
105 self.config = config
106 # base path of repo locations
106 # base path of repo locations
107 self.basepath = self.config['base_path']
107 self.basepath = self.config['base_path']
108 #authenticate this mercurial request using authfunc
108 #authenticate this mercurial request using authfunc
109 self.authenticate = BasicAuth('', authfunc,
109 self.authenticate = BasicAuth('', authfunc,
110 config.get('auth_ret_code'))
110 config.get('auth_ret_code'))
111 self.ip_addr = '0.0.0.0'
111 self.ip_addr = '0.0.0.0'
112
112
113 def _handle_request(self, environ, start_response):
113 def _handle_request(self, environ, start_response):
114 raise NotImplementedError()
114 raise NotImplementedError()
115
115
116 def _get_by_id(self, repo_name):
116 def _get_by_id(self, repo_name):
117 """
117 """
118 Get's a special pattern _<ID> from clone url and tries to replace it
118 Get's a special pattern _<ID> from clone url and tries to replace it
119 with a repository_name for support of _<ID> non changable urls
119 with a repository_name for support of _<ID> non changable urls
120
120
121 :param repo_name:
121 :param repo_name:
122 """
122 """
123 try:
123 try:
124 data = repo_name.split('/')
124 data = repo_name.split('/')
125 if len(data) >= 2:
125 if len(data) >= 2:
126 by_id = data[1].split('_')
126 by_id = data[1].split('_')
127 if len(by_id) == 2 and by_id[1].isdigit():
127 if len(by_id) == 2 and by_id[1].isdigit():
128 _repo_name = Repository.get(by_id[1]).repo_name
128 _repo_name = Repository.get(by_id[1]).repo_name
129 data[1] = _repo_name
129 data[1] = _repo_name
130 except:
130 except:
131 log.debug('Failed to extract repo_name from id %s' % (
131 log.debug('Failed to extract repo_name from id %s' % (
132 traceback.format_exc()
132 traceback.format_exc()
133 )
133 )
134 )
134 )
135
135
136 return '/'.join(data)
136 return '/'.join(data)
137
137
138 def _invalidate_cache(self, repo_name):
138 def _invalidate_cache(self, repo_name):
139 """
139 """
140 Set's cache for this repository for invalidation on next access
140 Set's cache for this repository for invalidation on next access
141
141
142 :param repo_name: full repo name, also a cache key
142 :param repo_name: full repo name, also a cache key
143 """
143 """
144 invalidate_cache('get_repo_cached_%s' % repo_name)
144 invalidate_cache('get_repo_cached_%s' % repo_name)
145
145
146 def _check_permission(self, action, user, repo_name, ip_addr=None):
146 def _check_permission(self, action, user, repo_name, ip_addr=None):
147 """
147 """
148 Checks permissions using action (push/pull) user and repository
148 Checks permissions using action (push/pull) user and repository
149 name
149 name
150
150
151 :param action: push or pull action
151 :param action: push or pull action
152 :param user: user instance
152 :param user: user instance
153 :param repo_name: repository name
153 :param repo_name: repository name
154 """
154 """
155 #check IP
155 #check IP
156 authuser = AuthUser(user_id=user.user_id, ip_addr=ip_addr)
156 authuser = AuthUser(user_id=user.user_id, ip_addr=ip_addr)
157 if not authuser.ip_allowed:
157 if not authuser.ip_allowed:
158 return False
158 return False
159 else:
159 else:
160 log.info('Access for IP:%s allowed' % (ip_addr))
160 log.info('Access for IP:%s allowed' % (ip_addr))
161 if action == 'push':
161 if action == 'push':
162 if not HasPermissionAnyMiddleware('repository.write',
162 if not HasPermissionAnyMiddleware('repository.write',
163 'repository.admin')(user,
163 'repository.admin')(user,
164 repo_name):
164 repo_name):
165 return False
165 return False
166
166
167 else:
167 else:
168 #any other action need at least read permission
168 #any other action need at least read permission
169 if not HasPermissionAnyMiddleware('repository.read',
169 if not HasPermissionAnyMiddleware('repository.read',
170 'repository.write',
170 'repository.write',
171 'repository.admin')(user,
171 'repository.admin')(user,
172 repo_name):
172 repo_name):
173 return False
173 return False
174
174
175 return True
175 return True
176
176
177 def _get_ip_addr(self, environ):
177 def _get_ip_addr(self, environ):
178 return _get_ip_addr(environ)
178 return _get_ip_addr(environ)
179
179
180 def _check_ssl(self, environ, start_response):
180 def _check_ssl(self, environ, start_response):
181 """
181 """
182 Checks the SSL check flag and returns False if SSL is not present
182 Checks the SSL check flag and returns False if SSL is not present
183 and required True otherwise
183 and required True otherwise
184 """
184 """
185 org_proto = environ['wsgi._org_proto']
185 org_proto = environ['wsgi._org_proto']
186 #check if we have SSL required ! if not it's a bad request !
186 #check if we have SSL required ! if not it's a bad request !
187 require_ssl = str2bool(RhodeCodeUi.get_by_key('push_ssl').ui_value)
187 require_ssl = str2bool(RhodeCodeUi.get_by_key('push_ssl').ui_value)
188 if require_ssl and org_proto == 'http':
188 if require_ssl and org_proto == 'http':
189 log.debug('proto is %s and SSL is required BAD REQUEST !'
189 log.debug('proto is %s and SSL is required BAD REQUEST !'
190 % org_proto)
190 % org_proto)
191 return False
191 return False
192 return True
192 return True
193
193
194 def _check_locking_state(self, environ, action, repo, user_id):
194 def _check_locking_state(self, environ, action, repo, user_id):
195 """
195 """
196 Checks locking on this repository, if locking is enabled and lock is
196 Checks locking on this repository, if locking is enabled and lock is
197 present returns a tuple of make_lock, locked, locked_by.
197 present returns a tuple of make_lock, locked, locked_by.
198 make_lock can have 3 states None (do nothing) True, make lock
198 make_lock can have 3 states None (do nothing) True, make lock
199 False release lock, This value is later propagated to hooks, which
199 False release lock, This value is later propagated to hooks, which
200 do the locking. Think about this as signals passed to hooks what to do.
200 do the locking. Think about this as signals passed to hooks what to do.
201
201
202 """
202 """
203 locked = False # defines that locked error should be thrown to user
203 locked = False # defines that locked error should be thrown to user
204 make_lock = None
204 make_lock = None
205 repo = Repository.get_by_repo_name(repo)
205 repo = Repository.get_by_repo_name(repo)
206 user = User.get(user_id)
206 user = User.get(user_id)
207
207
208 # this is kind of hacky, but due to how mercurial handles client-server
208 # this is kind of hacky, but due to how mercurial handles client-server
209 # server see all operation on changeset; bookmarks, phases and
209 # server see all operation on changeset; bookmarks, phases and
210 # obsolescence marker in different transaction, we don't want to check
210 # obsolescence marker in different transaction, we don't want to check
211 # locking on those
211 # locking on those
212 obsolete_call = environ['QUERY_STRING'] in ['cmd=listkeys',]
212 obsolete_call = environ['QUERY_STRING'] in ['cmd=listkeys',]
213 locked_by = repo.locked
213 locked_by = repo.locked
214 if repo and repo.enable_locking and not obsolete_call:
214 if repo and repo.enable_locking and not obsolete_call:
215 if action == 'push':
215 if action == 'push':
216 #check if it's already locked !, if it is compare users
216 #check if it's already locked !, if it is compare users
217 user_id, _date = repo.locked
217 user_id, _date = repo.locked
218 if user.user_id == user_id:
218 if user.user_id == user_id:
219 log.debug('Got push from user %s, now unlocking' % (user))
219 log.debug('Got push from user %s, now unlocking' % (user))
220 # unlock if we have push from user who locked
220 # unlock if we have push from user who locked
221 make_lock = False
221 make_lock = False
222 else:
222 else:
223 # we're not the same user who locked, ban with 423 !
223 # we're not the same user who locked, ban with 423 !
224 locked = True
224 locked = True
225 if action == 'pull':
225 if action == 'pull':
226 if repo.locked[0] and repo.locked[1]:
226 if repo.locked[0] and repo.locked[1]:
227 locked = True
227 locked = True
228 else:
228 else:
229 log.debug('Setting lock on repo %s by %s' % (repo, user))
229 log.debug('Setting lock on repo %s by %s' % (repo, user))
230 make_lock = True
230 make_lock = True
231
231
232 else:
232 else:
233 log.debug('Repository %s do not have locking enabled' % (repo))
233 log.debug('Repository %s do not have locking enabled' % (repo))
234 log.debug('FINAL locking values make_lock:%s,locked:%s,locked_by:%s'
234 log.debug('FINAL locking values make_lock:%s,locked:%s,locked_by:%s'
235 % (make_lock, locked, locked_by))
235 % (make_lock, locked, locked_by))
236 return make_lock, locked, locked_by
236 return make_lock, locked, locked_by
237
237
238 def __call__(self, environ, start_response):
238 def __call__(self, environ, start_response):
239 start = time.time()
239 start = time.time()
240 try:
240 try:
241 return self._handle_request(environ, start_response)
241 return self._handle_request(environ, start_response)
242 finally:
242 finally:
243 log = logging.getLogger('rhodecode.' + self.__class__.__name__)
243 log = logging.getLogger('rhodecode.' + self.__class__.__name__)
244 log.debug('Request time: %.3fs' % (time.time() - start))
244 log.debug('Request time: %.3fs' % (time.time() - start))
245 meta.Session.remove()
245 meta.Session.remove()
246
246
247
247
248 class BaseController(WSGIController):
248 class BaseController(WSGIController):
249
249
250 def __before__(self):
250 def __before__(self):
251 """
251 """
252 __before__ is called before controller methods and after __call__
252 __before__ is called before controller methods and after __call__
253 """
253 """
254 c.rhodecode_version = __version__
254 c.rhodecode_version = __version__
255 c.rhodecode_instanceid = config.get('instance_id')
255 c.rhodecode_instanceid = config.get('instance_id')
256 c.rhodecode_name = config.get('rhodecode_title')
256 c.rhodecode_name = config.get('rhodecode_title')
257 c.use_gravatar = str2bool(config.get('use_gravatar'))
257 c.use_gravatar = str2bool(config.get('use_gravatar'))
258 c.ga_code = config.get('rhodecode_ga_code')
258 c.ga_code = config.get('rhodecode_ga_code')
259 # Visual options
259 # Visual options
260 c.visual = AttributeDict({})
260 c.visual = AttributeDict({})
261 rc_config = RhodeCodeSetting.get_app_settings()
261 rc_config = RhodeCodeSetting.get_app_settings()
262
262
263 c.visual.show_public_icon = str2bool(rc_config.get('rhodecode_show_public_icon'))
263 c.visual.show_public_icon = str2bool(rc_config.get('rhodecode_show_public_icon'))
264 c.visual.show_private_icon = str2bool(rc_config.get('rhodecode_show_private_icon'))
264 c.visual.show_private_icon = str2bool(rc_config.get('rhodecode_show_private_icon'))
265 c.visual.stylify_metatags = str2bool(rc_config.get('rhodecode_stylify_metatags'))
265 c.visual.stylify_metatags = str2bool(rc_config.get('rhodecode_stylify_metatags'))
266 c.visual.lightweight_dashboard = str2bool(rc_config.get('rhodecode_lightweight_dashboard'))
266 c.visual.lightweight_dashboard = str2bool(rc_config.get('rhodecode_lightweight_dashboard'))
267 c.visual.lightweight_dashboard_items = safe_int(config.get('dashboard_items', 100))
267 c.visual.lightweight_dashboard_items = safe_int(config.get('dashboard_items', 100))
268 c.visual.repository_fields = str2bool(rc_config.get('rhodecode_repository_fields'))
268 c.visual.repository_fields = str2bool(rc_config.get('rhodecode_repository_fields'))
269
269
270 c.repo_name = get_repo_slug(request)
270 c.repo_name = get_repo_slug(request)
271 c.backends = BACKENDS.keys()
271 c.backends = BACKENDS.keys()
272 c.unread_notifications = NotificationModel()\
272 c.unread_notifications = NotificationModel()\
273 .get_unread_cnt_for_user(c.rhodecode_user.user_id)
273 .get_unread_cnt_for_user(c.rhodecode_user.user_id)
274 self.cut_off_limit = int(config.get('cut_off_limit'))
274 self.cut_off_limit = int(config.get('cut_off_limit'))
275
275
276 self.sa = meta.Session
276 self.sa = meta.Session
277 self.scm_model = ScmModel(self.sa)
277 self.scm_model = ScmModel(self.sa)
278
278
279 def __call__(self, environ, start_response):
279 def __call__(self, environ, start_response):
280 """Invoke the Controller"""
280 """Invoke the Controller"""
281 # WSGIController.__call__ dispatches to the Controller method
281 # WSGIController.__call__ dispatches to the Controller method
282 # the request is routed to. This routing information is
282 # the request is routed to. This routing information is
283 # available in environ['pylons.routes_dict']
283 # available in environ['pylons.routes_dict']
284 try:
284 try:
285 self.ip_addr = _get_ip_addr(environ)
285 self.ip_addr = _get_ip_addr(environ)
286 # make sure that we update permissions each time we call controller
286 # make sure that we update permissions each time we call controller
287 api_key = request.GET.get('api_key')
287 api_key = request.GET.get('api_key')
288 cookie_store = CookieStoreWrapper(session.get('rhodecode_user'))
288 cookie_store = CookieStoreWrapper(session.get('rhodecode_user'))
289 user_id = cookie_store.get('user_id', None)
289 user_id = cookie_store.get('user_id', None)
290 username = get_container_username(environ, config)
290 username = get_container_username(environ, config)
291 auth_user = AuthUser(user_id, api_key, username, self.ip_addr)
291 auth_user = AuthUser(user_id, api_key, username, self.ip_addr)
292 request.user = auth_user
292 request.user = auth_user
293 self.rhodecode_user = c.rhodecode_user = auth_user
293 self.rhodecode_user = c.rhodecode_user = auth_user
294 if not self.rhodecode_user.is_authenticated and \
294 if not self.rhodecode_user.is_authenticated and \
295 self.rhodecode_user.user_id is not None:
295 self.rhodecode_user.user_id is not None:
296 self.rhodecode_user.set_authenticated(
296 self.rhodecode_user.set_authenticated(
297 cookie_store.get('is_authenticated')
297 cookie_store.get('is_authenticated')
298 )
298 )
299 log.info('IP: %s User: %s accessed %s' % (
299 log.info('IP: %s User: %s accessed %s' % (
300 self.ip_addr, auth_user, safe_unicode(_get_access_path(environ)))
300 self.ip_addr, auth_user, safe_unicode(_get_access_path(environ)))
301 )
301 )
302 return WSGIController.__call__(self, environ, start_response)
302 return WSGIController.__call__(self, environ, start_response)
303 finally:
303 finally:
304 meta.Session.remove()
304 meta.Session.remove()
305
305
306
306
307 class BaseRepoController(BaseController):
307 class BaseRepoController(BaseController):
308 """
308 """
309 Base class for controllers responsible for loading all needed data for
309 Base class for controllers responsible for loading all needed data for
310 repository loaded items are
310 repository loaded items are
311
311
312 c.rhodecode_repo: instance of scm repository
312 c.rhodecode_repo: instance of scm repository
313 c.rhodecode_db_repo: instance of db
313 c.rhodecode_db_repo: instance of db
314 c.repository_followers: number of followers
314 c.repository_followers: number of followers
315 c.repository_forks: number of forks
315 c.repository_forks: number of forks
316 c.repository_following: weather the current user is following the current repo
316 c.repository_following: weather the current user is following the current repo
317
318 """
317 """
319
318
320 def __before__(self):
319 def __before__(self):
321 super(BaseRepoController, self).__before__()
320 super(BaseRepoController, self).__before__()
322 if c.repo_name:
321 if c.repo_name:
323
322
324 dbr = c.rhodecode_db_repo = Repository.get_by_repo_name(c.repo_name)
323 dbr = c.rhodecode_db_repo = Repository.get_by_repo_name(c.repo_name)
325 c.rhodecode_repo = c.rhodecode_db_repo.scm_instance
324 c.rhodecode_repo = c.rhodecode_db_repo.scm_instance
326 # update last change according to VCS data
325 # update last change according to VCS data
327 dbr.update_changeset_cache(dbr.get_changeset())
326 dbr.update_changeset_cache(dbr.get_changeset())
328 if c.rhodecode_repo is None:
327 if c.rhodecode_repo is None:
329 log.error('%s this repository is present in database but it '
328 log.error('%s this repository is present in database but it '
330 'cannot be created as an scm instance', c.repo_name)
329 'cannot be created as an scm instance', c.repo_name)
331
330
332 redirect(url('home'))
331 redirect(url('home'))
333
332
334 # some globals counter for menu
333 # some globals counter for menu
335 c.repository_followers = self.scm_model.get_followers(dbr)
334 c.repository_followers = self.scm_model.get_followers(dbr)
336 c.repository_forks = self.scm_model.get_forks(dbr)
335 c.repository_forks = self.scm_model.get_forks(dbr)
337 c.repository_pull_requests = self.scm_model.get_pull_requests(dbr)
336 c.repository_pull_requests = self.scm_model.get_pull_requests(dbr)
338 c.repository_following = self.scm_model.is_following_repo(c.repo_name,
337 c.repository_following = self.scm_model.is_following_repo(c.repo_name,
339 self.rhodecode_user.user_id)
338 self.rhodecode_user.user_id)
@@ -1,581 +1,580 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 rhodecode.lib.utils
3 rhodecode.lib.utils
4 ~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~
5
5
6 Some simple helper functions
6 Some simple helper functions
7
7
8 :created_on: Jan 5, 2011
8 :created_on: Jan 5, 2011
9 :author: marcink
9 :author: marcink
10 :copyright: (C) 2011-2012 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2011-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 re
26 import re
27 import time
27 import time
28 import datetime
28 import datetime
29 import webob
29 import webob
30
30
31 from pylons.i18n.translation import _, ungettext
31 from pylons.i18n.translation import _, ungettext
32 from rhodecode.lib.vcs.utils.lazy import LazyProperty
32 from rhodecode.lib.vcs.utils.lazy import LazyProperty
33
33
34
34
35 def __get_lem():
35 def __get_lem():
36 """
36 """
37 Get language extension map based on what's inside pygments lexers
37 Get language extension map based on what's inside pygments lexers
38 """
38 """
39 from pygments import lexers
39 from pygments import lexers
40 from string import lower
40 from string import lower
41 from collections import defaultdict
41 from collections import defaultdict
42
42
43 d = defaultdict(lambda: [])
43 d = defaultdict(lambda: [])
44
44
45 def __clean(s):
45 def __clean(s):
46 s = s.lstrip('*')
46 s = s.lstrip('*')
47 s = s.lstrip('.')
47 s = s.lstrip('.')
48
48
49 if s.find('[') != -1:
49 if s.find('[') != -1:
50 exts = []
50 exts = []
51 start, stop = s.find('['), s.find(']')
51 start, stop = s.find('['), s.find(']')
52
52
53 for suffix in s[start + 1:stop]:
53 for suffix in s[start + 1:stop]:
54 exts.append(s[:s.find('[')] + suffix)
54 exts.append(s[:s.find('[')] + suffix)
55 return map(lower, exts)
55 return map(lower, exts)
56 else:
56 else:
57 return map(lower, [s])
57 return map(lower, [s])
58
58
59 for lx, t in sorted(lexers.LEXERS.items()):
59 for lx, t in sorted(lexers.LEXERS.items()):
60 m = map(__clean, t[-2])
60 m = map(__clean, t[-2])
61 if m:
61 if m:
62 m = reduce(lambda x, y: x + y, m)
62 m = reduce(lambda x, y: x + y, m)
63 for ext in m:
63 for ext in m:
64 desc = lx.replace('Lexer', '')
64 desc = lx.replace('Lexer', '')
65 d[ext].append(desc)
65 d[ext].append(desc)
66
66
67 return dict(d)
67 return dict(d)
68
68
69
69
70 def str2bool(_str):
70 def str2bool(_str):
71 """
71 """
72 returs True/False value from given string, it tries to translate the
72 returs True/False value from given string, it tries to translate the
73 string into boolean
73 string into boolean
74
74
75 :param _str: string value to translate into boolean
75 :param _str: string value to translate into boolean
76 :rtype: boolean
76 :rtype: boolean
77 :returns: boolean from given string
77 :returns: boolean from given string
78 """
78 """
79 if _str is None:
79 if _str is None:
80 return False
80 return False
81 if _str in (True, False):
81 if _str in (True, False):
82 return _str
82 return _str
83 _str = str(_str).strip().lower()
83 _str = str(_str).strip().lower()
84 return _str in ('t', 'true', 'y', 'yes', 'on', '1')
84 return _str in ('t', 'true', 'y', 'yes', 'on', '1')
85
85
86
86
87 def aslist(obj, sep=None, strip=True):
87 def aslist(obj, sep=None, strip=True):
88 """
88 """
89 Returns given string separated by sep as list
89 Returns given string separated by sep as list
90
90
91 :param obj:
91 :param obj:
92 :param sep:
92 :param sep:
93 :param strip:
93 :param strip:
94 """
94 """
95 if isinstance(obj, (basestring)):
95 if isinstance(obj, (basestring)):
96 lst = obj.split(sep)
96 lst = obj.split(sep)
97 if strip:
97 if strip:
98 lst = [v.strip() for v in lst]
98 lst = [v.strip() for v in lst]
99 return lst
99 return lst
100 elif isinstance(obj, (list, tuple)):
100 elif isinstance(obj, (list, tuple)):
101 return obj
101 return obj
102 elif obj is None:
102 elif obj is None:
103 return []
103 return []
104 else:
104 else:
105 return [obj]
105 return [obj]
106
106
107
107
108 def convert_line_endings(line, mode):
108 def convert_line_endings(line, mode):
109 """
109 """
110 Converts a given line "line end" accordingly to given mode
110 Converts a given line "line end" accordingly to given mode
111
111
112 Available modes are::
112 Available modes are::
113 0 - Unix
113 0 - Unix
114 1 - Mac
114 1 - Mac
115 2 - DOS
115 2 - DOS
116
116
117 :param line: given line to convert
117 :param line: given line to convert
118 :param mode: mode to convert to
118 :param mode: mode to convert to
119 :rtype: str
119 :rtype: str
120 :return: converted line according to mode
120 :return: converted line according to mode
121 """
121 """
122 from string import replace
122 from string import replace
123
123
124 if mode == 0:
124 if mode == 0:
125 line = replace(line, '\r\n', '\n')
125 line = replace(line, '\r\n', '\n')
126 line = replace(line, '\r', '\n')
126 line = replace(line, '\r', '\n')
127 elif mode == 1:
127 elif mode == 1:
128 line = replace(line, '\r\n', '\r')
128 line = replace(line, '\r\n', '\r')
129 line = replace(line, '\n', '\r')
129 line = replace(line, '\n', '\r')
130 elif mode == 2:
130 elif mode == 2:
131 line = re.sub("\r(?!\n)|(?<!\r)\n", "\r\n", line)
131 line = re.sub("\r(?!\n)|(?<!\r)\n", "\r\n", line)
132 return line
132 return line
133
133
134
134
135 def detect_mode(line, default):
135 def detect_mode(line, default):
136 """
136 """
137 Detects line break for given line, if line break couldn't be found
137 Detects line break for given line, if line break couldn't be found
138 given default value is returned
138 given default value is returned
139
139
140 :param line: str line
140 :param line: str line
141 :param default: default
141 :param default: default
142 :rtype: int
142 :rtype: int
143 :return: value of line end on of 0 - Unix, 1 - Mac, 2 - DOS
143 :return: value of line end on of 0 - Unix, 1 - Mac, 2 - DOS
144 """
144 """
145 if line.endswith('\r\n'):
145 if line.endswith('\r\n'):
146 return 2
146 return 2
147 elif line.endswith('\n'):
147 elif line.endswith('\n'):
148 return 0
148 return 0
149 elif line.endswith('\r'):
149 elif line.endswith('\r'):
150 return 1
150 return 1
151 else:
151 else:
152 return default
152 return default
153
153
154
154
155 def generate_api_key(username, salt=None):
155 def generate_api_key(username, salt=None):
156 """
156 """
157 Generates unique API key for given username, if salt is not given
157 Generates unique API key for given username, if salt is not given
158 it'll be generated from some random string
158 it'll be generated from some random string
159
159
160 :param username: username as string
160 :param username: username as string
161 :param salt: salt to hash generate KEY
161 :param salt: salt to hash generate KEY
162 :rtype: str
162 :rtype: str
163 :returns: sha1 hash from username+salt
163 :returns: sha1 hash from username+salt
164 """
164 """
165 from tempfile import _RandomNameSequence
165 from tempfile import _RandomNameSequence
166 import hashlib
166 import hashlib
167
167
168 if salt is None:
168 if salt is None:
169 salt = _RandomNameSequence().next()
169 salt = _RandomNameSequence().next()
170
170
171 return hashlib.sha1(username + salt).hexdigest()
171 return hashlib.sha1(username + salt).hexdigest()
172
172
173
173
174 def safe_int(val, default=None):
174 def safe_int(val, default=None):
175 """
175 """
176 Returns int() of val if val is not convertable to int use default
176 Returns int() of val if val is not convertable to int use default
177 instead
177 instead
178
178
179 :param val:
179 :param val:
180 :param default:
180 :param default:
181 """
181 """
182
182
183 try:
183 try:
184 val = int(val)
184 val = int(val)
185 except (ValueError, TypeError):
185 except (ValueError, TypeError):
186 val = default
186 val = default
187
187
188 return val
188 return val
189
189
190
190
191 def safe_unicode(str_, from_encoding=None):
191 def safe_unicode(str_, from_encoding=None):
192 """
192 """
193 safe unicode function. Does few trick to turn str_ into unicode
193 safe unicode function. Does few trick to turn str_ into unicode
194
194
195 In case of UnicodeDecode error we try to return it with encoding detected
195 In case of UnicodeDecode error we try to return it with encoding detected
196 by chardet library if it fails fallback to unicode with errors replaced
196 by chardet library if it fails fallback to unicode with errors replaced
197
197
198 :param str_: string to decode
198 :param str_: string to decode
199 :rtype: unicode
199 :rtype: unicode
200 :returns: unicode object
200 :returns: unicode object
201 """
201 """
202 if isinstance(str_, unicode):
202 if isinstance(str_, unicode):
203 return str_
203 return str_
204
204
205 if not from_encoding:
205 if not from_encoding:
206 import rhodecode
206 import rhodecode
207 DEFAULT_ENCODINGS = aslist(rhodecode.CONFIG.get('default_encoding',
207 DEFAULT_ENCODINGS = aslist(rhodecode.CONFIG.get('default_encoding',
208 'utf8'), sep=',')
208 'utf8'), sep=',')
209 from_encoding = DEFAULT_ENCODINGS
209 from_encoding = DEFAULT_ENCODINGS
210
210
211 if not isinstance(from_encoding, (list, tuple)):
211 if not isinstance(from_encoding, (list, tuple)):
212 from_encoding = [from_encoding]
212 from_encoding = [from_encoding]
213
213
214 try:
214 try:
215 return unicode(str_)
215 return unicode(str_)
216 except UnicodeDecodeError:
216 except UnicodeDecodeError:
217 pass
217 pass
218
218
219 for enc in from_encoding:
219 for enc in from_encoding:
220 try:
220 try:
221 return unicode(str_, enc)
221 return unicode(str_, enc)
222 except UnicodeDecodeError:
222 except UnicodeDecodeError:
223 pass
223 pass
224
224
225 try:
225 try:
226 import chardet
226 import chardet
227 encoding = chardet.detect(str_)['encoding']
227 encoding = chardet.detect(str_)['encoding']
228 if encoding is None:
228 if encoding is None:
229 raise Exception()
229 raise Exception()
230 return str_.decode(encoding)
230 return str_.decode(encoding)
231 except (ImportError, UnicodeDecodeError, Exception):
231 except (ImportError, UnicodeDecodeError, Exception):
232 return unicode(str_, from_encoding[0], 'replace')
232 return unicode(str_, from_encoding[0], 'replace')
233
233
234
234
235 def safe_str(unicode_, to_encoding=None):
235 def safe_str(unicode_, to_encoding=None):
236 """
236 """
237 safe str function. Does few trick to turn unicode_ into string
237 safe str function. Does few trick to turn unicode_ into string
238
238
239 In case of UnicodeEncodeError we try to return it with encoding detected
239 In case of UnicodeEncodeError we try to return it with encoding detected
240 by chardet library if it fails fallback to string with errors replaced
240 by chardet library if it fails fallback to string with errors replaced
241
241
242 :param unicode_: unicode to encode
242 :param unicode_: unicode to encode
243 :rtype: str
243 :rtype: str
244 :returns: str object
244 :returns: str object
245 """
245 """
246
246
247 # if it's not basestr cast to str
247 # if it's not basestr cast to str
248 if not isinstance(unicode_, basestring):
248 if not isinstance(unicode_, basestring):
249 return str(unicode_)
249 return str(unicode_)
250
250
251 if isinstance(unicode_, str):
251 if isinstance(unicode_, str):
252 return unicode_
252 return unicode_
253
253
254 if not to_encoding:
254 if not to_encoding:
255 import rhodecode
255 import rhodecode
256 DEFAULT_ENCODINGS = aslist(rhodecode.CONFIG.get('default_encoding',
256 DEFAULT_ENCODINGS = aslist(rhodecode.CONFIG.get('default_encoding',
257 'utf8'), sep=',')
257 'utf8'), sep=',')
258 to_encoding = DEFAULT_ENCODINGS
258 to_encoding = DEFAULT_ENCODINGS
259
259
260 if not isinstance(to_encoding, (list, tuple)):
260 if not isinstance(to_encoding, (list, tuple)):
261 to_encoding = [to_encoding]
261 to_encoding = [to_encoding]
262
262
263 for enc in to_encoding:
263 for enc in to_encoding:
264 try:
264 try:
265 return unicode_.encode(enc)
265 return unicode_.encode(enc)
266 except UnicodeEncodeError:
266 except UnicodeEncodeError:
267 pass
267 pass
268
268
269 try:
269 try:
270 import chardet
270 import chardet
271 encoding = chardet.detect(unicode_)['encoding']
271 encoding = chardet.detect(unicode_)['encoding']
272 if encoding is None:
272 if encoding is None:
273 raise UnicodeEncodeError()
273 raise UnicodeEncodeError()
274
274
275 return unicode_.encode(encoding)
275 return unicode_.encode(encoding)
276 except (ImportError, UnicodeEncodeError):
276 except (ImportError, UnicodeEncodeError):
277 return unicode_.encode(to_encoding[0], 'replace')
277 return unicode_.encode(to_encoding[0], 'replace')
278
278
279 return safe_str
279 return safe_str
280
280
281
281
282 def remove_suffix(s, suffix):
282 def remove_suffix(s, suffix):
283 if s.endswith(suffix):
283 if s.endswith(suffix):
284 s = s[:-1 * len(suffix)]
284 s = s[:-1 * len(suffix)]
285 return s
285 return s
286
286
287
287
288 def remove_prefix(s, prefix):
288 def remove_prefix(s, prefix):
289 if s.startswith(prefix):
289 if s.startswith(prefix):
290 s = s[len(prefix):]
290 s = s[len(prefix):]
291 return s
291 return s
292
292
293
293
294 def engine_from_config(configuration, prefix='sqlalchemy.', **kwargs):
294 def engine_from_config(configuration, prefix='sqlalchemy.', **kwargs):
295 """
295 """
296 Custom engine_from_config functions that makes sure we use NullPool for
296 Custom engine_from_config functions that makes sure we use NullPool for
297 file based sqlite databases. This prevents errors on sqlite. This only
297 file based sqlite databases. This prevents errors on sqlite. This only
298 applies to sqlalchemy versions < 0.7.0
298 applies to sqlalchemy versions < 0.7.0
299
299
300 """
300 """
301 import sqlalchemy
301 import sqlalchemy
302 from sqlalchemy import engine_from_config as efc
302 from sqlalchemy import engine_from_config as efc
303 import logging
303 import logging
304
304
305 if int(sqlalchemy.__version__.split('.')[1]) < 7:
305 if int(sqlalchemy.__version__.split('.')[1]) < 7:
306
306
307 # This solution should work for sqlalchemy < 0.7.0, and should use
307 # This solution should work for sqlalchemy < 0.7.0, and should use
308 # proxy=TimerProxy() for execution time profiling
308 # proxy=TimerProxy() for execution time profiling
309
309
310 from sqlalchemy.pool import NullPool
310 from sqlalchemy.pool import NullPool
311 url = configuration[prefix + 'url']
311 url = configuration[prefix + 'url']
312
312
313 if url.startswith('sqlite'):
313 if url.startswith('sqlite'):
314 kwargs.update({'poolclass': NullPool})
314 kwargs.update({'poolclass': NullPool})
315 return efc(configuration, prefix, **kwargs)
315 return efc(configuration, prefix, **kwargs)
316 else:
316 else:
317 import time
317 import time
318 from sqlalchemy import event
318 from sqlalchemy import event
319 from sqlalchemy.engine import Engine
319 from sqlalchemy.engine import Engine
320
320
321 log = logging.getLogger('sqlalchemy.engine')
321 log = logging.getLogger('sqlalchemy.engine')
322 BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = xrange(30, 38)
322 BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = xrange(30, 38)
323 engine = efc(configuration, prefix, **kwargs)
323 engine = efc(configuration, prefix, **kwargs)
324
324
325 def color_sql(sql):
325 def color_sql(sql):
326 COLOR_SEQ = "\033[1;%dm"
326 COLOR_SEQ = "\033[1;%dm"
327 COLOR_SQL = YELLOW
327 COLOR_SQL = YELLOW
328 normal = '\x1b[0m'
328 normal = '\x1b[0m'
329 return ''.join([COLOR_SEQ % COLOR_SQL, sql, normal])
329 return ''.join([COLOR_SEQ % COLOR_SQL, sql, normal])
330
330
331 if configuration['debug']:
331 if configuration['debug']:
332 #attach events only for debug configuration
332 #attach events only for debug configuration
333
333
334 def before_cursor_execute(conn, cursor, statement,
334 def before_cursor_execute(conn, cursor, statement,
335 parameters, context, executemany):
335 parameters, context, executemany):
336 context._query_start_time = time.time()
336 context._query_start_time = time.time()
337 log.info(color_sql(">>>>> STARTING QUERY >>>>>"))
337 log.info(color_sql(">>>>> STARTING QUERY >>>>>"))
338
338
339 def after_cursor_execute(conn, cursor, statement,
339 def after_cursor_execute(conn, cursor, statement,
340 parameters, context, executemany):
340 parameters, context, executemany):
341 total = time.time() - context._query_start_time
341 total = time.time() - context._query_start_time
342 log.info(color_sql("<<<<< TOTAL TIME: %f <<<<<" % total))
342 log.info(color_sql("<<<<< TOTAL TIME: %f <<<<<" % total))
343
343
344 event.listen(engine, "before_cursor_execute",
344 event.listen(engine, "before_cursor_execute",
345 before_cursor_execute)
345 before_cursor_execute)
346 event.listen(engine, "after_cursor_execute",
346 event.listen(engine, "after_cursor_execute",
347 after_cursor_execute)
347 after_cursor_execute)
348
348
349 return engine
349 return engine
350
350
351
351
352 def age(prevdate, show_short_version=False):
352 def age(prevdate, show_short_version=False):
353 """
353 """
354 turns a datetime into an age string.
354 turns a datetime into an age string.
355 If show_short_version is True, then it will generate a not so accurate but shorter string,
355 If show_short_version is True, then it will generate a not so accurate but shorter string,
356 example: 2days ago, instead of 2 days and 23 hours ago.
356 example: 2days ago, instead of 2 days and 23 hours ago.
357
357
358
359 :param prevdate: datetime object
358 :param prevdate: datetime object
360 :param show_short_version: if it should aproximate the date and return a shorter string
359 :param show_short_version: if it should aproximate the date and return a shorter string
361 :rtype: unicode
360 :rtype: unicode
362 :returns: unicode words describing age
361 :returns: unicode words describing age
363 """
362 """
364 now = datetime.datetime.now()
363 now = datetime.datetime.now()
365 now = now.replace(microsecond=0)
364 now = now.replace(microsecond=0)
366 order = ['year', 'month', 'day', 'hour', 'minute', 'second']
365 order = ['year', 'month', 'day', 'hour', 'minute', 'second']
367 deltas = {}
366 deltas = {}
368 future = False
367 future = False
369
368
370 if prevdate > now:
369 if prevdate > now:
371 now, prevdate = prevdate, now
370 now, prevdate = prevdate, now
372 future = True
371 future = True
373
372
374 # Get date parts deltas
373 # Get date parts deltas
375 for part in order:
374 for part in order:
376 if future:
375 if future:
377 from dateutil import relativedelta
376 from dateutil import relativedelta
378 d = relativedelta.relativedelta(now, prevdate)
377 d = relativedelta.relativedelta(now, prevdate)
379 deltas[part] = getattr(d, part + 's')
378 deltas[part] = getattr(d, part + 's')
380 else:
379 else:
381 deltas[part] = getattr(now, part) - getattr(prevdate, part)
380 deltas[part] = getattr(now, part) - getattr(prevdate, part)
382
381
383 # Fix negative offsets (there is 1 second between 10:59:59 and 11:00:00,
382 # Fix negative offsets (there is 1 second between 10:59:59 and 11:00:00,
384 # not 1 hour, -59 minutes and -59 seconds)
383 # not 1 hour, -59 minutes and -59 seconds)
385 for num, length in [(5, 60), (4, 60), (3, 24)]: # seconds, minutes, hours
384 for num, length in [(5, 60), (4, 60), (3, 24)]: # seconds, minutes, hours
386 part = order[num]
385 part = order[num]
387 carry_part = order[num - 1]
386 carry_part = order[num - 1]
388
387
389 if deltas[part] < 0:
388 if deltas[part] < 0:
390 deltas[part] += length
389 deltas[part] += length
391 deltas[carry_part] -= 1
390 deltas[carry_part] -= 1
392
391
393 # Same thing for days except that the increment depends on the (variable)
392 # Same thing for days except that the increment depends on the (variable)
394 # number of days in the month
393 # number of days in the month
395 month_lengths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
394 month_lengths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
396 if deltas['day'] < 0:
395 if deltas['day'] < 0:
397 if prevdate.month == 2 and (prevdate.year % 4 == 0 and
396 if prevdate.month == 2 and (prevdate.year % 4 == 0 and
398 (prevdate.year % 100 != 0 or prevdate.year % 400 == 0)):
397 (prevdate.year % 100 != 0 or prevdate.year % 400 == 0)):
399 deltas['day'] += 29
398 deltas['day'] += 29
400 else:
399 else:
401 deltas['day'] += month_lengths[prevdate.month - 1]
400 deltas['day'] += month_lengths[prevdate.month - 1]
402
401
403 deltas['month'] -= 1
402 deltas['month'] -= 1
404
403
405 if deltas['month'] < 0:
404 if deltas['month'] < 0:
406 deltas['month'] += 12
405 deltas['month'] += 12
407 deltas['year'] -= 1
406 deltas['year'] -= 1
408
407
409 # Format the result
408 # Format the result
410 fmt_funcs = {
409 fmt_funcs = {
411 'year': lambda d: ungettext(u'%d year', '%d years', d) % d,
410 'year': lambda d: ungettext(u'%d year', '%d years', d) % d,
412 'month': lambda d: ungettext(u'%d month', '%d months', d) % d,
411 'month': lambda d: ungettext(u'%d month', '%d months', d) % d,
413 'day': lambda d: ungettext(u'%d day', '%d days', d) % d,
412 'day': lambda d: ungettext(u'%d day', '%d days', d) % d,
414 'hour': lambda d: ungettext(u'%d hour', '%d hours', d) % d,
413 'hour': lambda d: ungettext(u'%d hour', '%d hours', d) % d,
415 'minute': lambda d: ungettext(u'%d minute', '%d minutes', d) % d,
414 'minute': lambda d: ungettext(u'%d minute', '%d minutes', d) % d,
416 'second': lambda d: ungettext(u'%d second', '%d seconds', d) % d,
415 'second': lambda d: ungettext(u'%d second', '%d seconds', d) % d,
417 }
416 }
418
417
419 for i, part in enumerate(order):
418 for i, part in enumerate(order):
420 value = deltas[part]
419 value = deltas[part]
421 if value == 0:
420 if value == 0:
422 continue
421 continue
423
422
424 if i < 5:
423 if i < 5:
425 sub_part = order[i + 1]
424 sub_part = order[i + 1]
426 sub_value = deltas[sub_part]
425 sub_value = deltas[sub_part]
427 else:
426 else:
428 sub_value = 0
427 sub_value = 0
429
428
430 if sub_value == 0 or show_short_version:
429 if sub_value == 0 or show_short_version:
431 if future:
430 if future:
432 return _(u'in %s') % fmt_funcs[part](value)
431 return _(u'in %s') % fmt_funcs[part](value)
433 else:
432 else:
434 return _(u'%s ago') % fmt_funcs[part](value)
433 return _(u'%s ago') % fmt_funcs[part](value)
435 if future:
434 if future:
436 return _(u'in %s and %s') % (fmt_funcs[part](value),
435 return _(u'in %s and %s') % (fmt_funcs[part](value),
437 fmt_funcs[sub_part](sub_value))
436 fmt_funcs[sub_part](sub_value))
438 else:
437 else:
439 return _(u'%s and %s ago') % (fmt_funcs[part](value),
438 return _(u'%s and %s ago') % (fmt_funcs[part](value),
440 fmt_funcs[sub_part](sub_value))
439 fmt_funcs[sub_part](sub_value))
441
440
442 return _(u'just now')
441 return _(u'just now')
443
442
444
443
445 def uri_filter(uri):
444 def uri_filter(uri):
446 """
445 """
447 Removes user:password from given url string
446 Removes user:password from given url string
448
447
449 :param uri:
448 :param uri:
450 :rtype: unicode
449 :rtype: unicode
451 :returns: filtered list of strings
450 :returns: filtered list of strings
452 """
451 """
453 if not uri:
452 if not uri:
454 return ''
453 return ''
455
454
456 proto = ''
455 proto = ''
457
456
458 for pat in ('https://', 'http://'):
457 for pat in ('https://', 'http://'):
459 if uri.startswith(pat):
458 if uri.startswith(pat):
460 uri = uri[len(pat):]
459 uri = uri[len(pat):]
461 proto = pat
460 proto = pat
462 break
461 break
463
462
464 # remove passwords and username
463 # remove passwords and username
465 uri = uri[uri.find('@') + 1:]
464 uri = uri[uri.find('@') + 1:]
466
465
467 # get the port
466 # get the port
468 cred_pos = uri.find(':')
467 cred_pos = uri.find(':')
469 if cred_pos == -1:
468 if cred_pos == -1:
470 host, port = uri, None
469 host, port = uri, None
471 else:
470 else:
472 host, port = uri[:cred_pos], uri[cred_pos + 1:]
471 host, port = uri[:cred_pos], uri[cred_pos + 1:]
473
472
474 return filter(None, [proto, host, port])
473 return filter(None, [proto, host, port])
475
474
476
475
477 def credentials_filter(uri):
476 def credentials_filter(uri):
478 """
477 """
479 Returns a url with removed credentials
478 Returns a url with removed credentials
480
479
481 :param uri:
480 :param uri:
482 """
481 """
483
482
484 uri = uri_filter(uri)
483 uri = uri_filter(uri)
485 #check if we have port
484 #check if we have port
486 if len(uri) > 2 and uri[2]:
485 if len(uri) > 2 and uri[2]:
487 uri[2] = ':' + uri[2]
486 uri[2] = ':' + uri[2]
488
487
489 return ''.join(uri)
488 return ''.join(uri)
490
489
491
490
492 def get_changeset_safe(repo, rev):
491 def get_changeset_safe(repo, rev):
493 """
492 """
494 Safe version of get_changeset if this changeset doesn't exists for a
493 Safe version of get_changeset if this changeset doesn't exists for a
495 repo it returns a Dummy one instead
494 repo it returns a Dummy one instead
496
495
497 :param repo:
496 :param repo:
498 :param rev:
497 :param rev:
499 """
498 """
500 from rhodecode.lib.vcs.backends.base import BaseRepository
499 from rhodecode.lib.vcs.backends.base import BaseRepository
501 from rhodecode.lib.vcs.exceptions import RepositoryError
500 from rhodecode.lib.vcs.exceptions import RepositoryError
502 from rhodecode.lib.vcs.backends.base import EmptyChangeset
501 from rhodecode.lib.vcs.backends.base import EmptyChangeset
503 if not isinstance(repo, BaseRepository):
502 if not isinstance(repo, BaseRepository):
504 raise Exception('You must pass an Repository '
503 raise Exception('You must pass an Repository '
505 'object as first argument got %s', type(repo))
504 'object as first argument got %s', type(repo))
506
505
507 try:
506 try:
508 cs = repo.get_changeset(rev)
507 cs = repo.get_changeset(rev)
509 except RepositoryError:
508 except RepositoryError:
510 cs = EmptyChangeset(requested_revision=rev)
509 cs = EmptyChangeset(requested_revision=rev)
511 return cs
510 return cs
512
511
513
512
514 def datetime_to_time(dt):
513 def datetime_to_time(dt):
515 if dt:
514 if dt:
516 return time.mktime(dt.timetuple())
515 return time.mktime(dt.timetuple())
517
516
518
517
519 def time_to_datetime(tm):
518 def time_to_datetime(tm):
520 if tm:
519 if tm:
521 if isinstance(tm, basestring):
520 if isinstance(tm, basestring):
522 try:
521 try:
523 tm = float(tm)
522 tm = float(tm)
524 except ValueError:
523 except ValueError:
525 return
524 return
526 return datetime.datetime.fromtimestamp(tm)
525 return datetime.datetime.fromtimestamp(tm)
527
526
528 MENTIONS_REGEX = r'(?:^@|\s@)([a-zA-Z0-9]{1}[a-zA-Z0-9\-\_\.]+)(?:\s{1})'
527 MENTIONS_REGEX = r'(?:^@|\s@)([a-zA-Z0-9]{1}[a-zA-Z0-9\-\_\.]+)(?:\s{1})'
529
528
530
529
531 def extract_mentioned_users(s):
530 def extract_mentioned_users(s):
532 """
531 """
533 Returns unique usernames from given string s that have @mention
532 Returns unique usernames from given string s that have @mention
534
533
535 :param s: string to get mentions
534 :param s: string to get mentions
536 """
535 """
537 usrs = set()
536 usrs = set()
538 for username in re.findall(MENTIONS_REGEX, s):
537 for username in re.findall(MENTIONS_REGEX, s):
539 usrs.add(username)
538 usrs.add(username)
540
539
541 return sorted(list(usrs), key=lambda k: k.lower())
540 return sorted(list(usrs), key=lambda k: k.lower())
542
541
543
542
544 class AttributeDict(dict):
543 class AttributeDict(dict):
545 def __getattr__(self, attr):
544 def __getattr__(self, attr):
546 return self.get(attr, None)
545 return self.get(attr, None)
547 __setattr__ = dict.__setitem__
546 __setattr__ = dict.__setitem__
548 __delattr__ = dict.__delitem__
547 __delattr__ = dict.__delitem__
549
548
550
549
551 def fix_PATH(os_=None):
550 def fix_PATH(os_=None):
552 """
551 """
553 Get current active python path, and append it to PATH variable to fix issues
552 Get current active python path, and append it to PATH variable to fix issues
554 of subprocess calls and different python versions
553 of subprocess calls and different python versions
555 """
554 """
556 import sys
555 import sys
557 if os_ is None:
556 if os_ is None:
558 import os
557 import os
559 else:
558 else:
560 os = os_
559 os = os_
561
560
562 cur_path = os.path.split(sys.executable)[0]
561 cur_path = os.path.split(sys.executable)[0]
563 if not os.environ['PATH'].startswith(cur_path):
562 if not os.environ['PATH'].startswith(cur_path):
564 os.environ['PATH'] = '%s:%s' % (cur_path, os.environ['PATH'])
563 os.environ['PATH'] = '%s:%s' % (cur_path, os.environ['PATH'])
565
564
566
565
567 def obfuscate_url_pw(engine):
566 def obfuscate_url_pw(engine):
568 _url = engine or ''
567 _url = engine or ''
569 from sqlalchemy.engine import url as sa_url
568 from sqlalchemy.engine import url as sa_url
570 try:
569 try:
571 _url = sa_url.make_url(engine)
570 _url = sa_url.make_url(engine)
572 if _url.password:
571 if _url.password:
573 _url.password = 'XXXXX'
572 _url.password = 'XXXXX'
574 except:
573 except:
575 pass
574 pass
576 return str(_url)
575 return str(_url)
577
576
578
577
579 def get_server_url(environ):
578 def get_server_url(environ):
580 req = webob.Request(environ)
579 req = webob.Request(environ)
581 return req.host_url + req.script_name
580 return req.host_url + req.script_name
@@ -1,367 +1,368 b''
1 /**
1 /**
2 * Stylesheets for the context bar
2 * Stylesheets for the context bar
3 */
3 */
4
4
5 #quick .repo_switcher { background-image: url("../images/icons/database.png"); }
5 #quick .repo_switcher { background-image: url("../images/icons/database.png"); }
6 #quick .journal { background-image: url("../images/icons/book.png"); }
6 #quick .journal { background-image: url("../images/icons/book.png"); }
7 #quick .search { background-image: url("../images/icons/search_16.png"); }
7 #quick .search { background-image: url("../images/icons/search_16.png"); }
8 #quick .admin { background-image: url("../images/icons/cog_edit.png"); }
8 #quick .admin { background-image: url("../images/icons/cog_edit.png"); }
9
9
10 #context-bar button.follow { background-image: url("../images/icons/heart.png"); }
10 #context-bar button.follow { background-image: url("../images/icons/heart.png"); }
11 #context-bar button.following { background-image: url("../images/icons/heart_delete.png"); }
11 #context-bar button.following { background-image: url("../images/icons/heart_delete.png"); }
12 #context-bar a.fork { background-image: url("../images/icons/arrow_divide.png"); }
12 #context-bar a.fork { background-image: url("../images/icons/arrow_divide.png"); }
13 #context-bar a.summary { background-image: url("../images/icons/clipboard_16.png"); }
13 #context-bar a.summary { background-image: url("../images/icons/clipboard_16.png"); }
14 #context-bar a.changelogs { background-image: url("../images/icons/time.png"); }
14 #context-bar a.changelogs { background-image: url("../images/icons/time.png"); }
15 #context-bar a.files { background-image: url("../images/icons/file.png"); }
15 #context-bar a.files { background-image: url("../images/icons/file.png"); }
16 #context-bar a.switch-to { background-image: url("../images/icons/arrow_switch.png"); }
16 #context-bar a.switch-to { background-image: url("../images/icons/arrow_switch.png"); }
17 #context-bar a.options { background-image: url("../images/icons/table_gear.png"); }
17 #context-bar a.options { background-image: url("../images/icons/table_gear.png"); }
18 #context-bar a.pull-request { background-image: url("../images/icons/arrow_join.png"); }
18 #context-bar a.pull-request { background-image: url("../images/icons/arrow_join.png"); }
19 #context-bar a.branches { background-image: url("../images/icons/arrow_branch.png"); }
19 #context-bar a.branches { background-image: url("../images/icons/arrow_branch.png"); }
20 #context-bar a.tags { background-image: url("../images/icons/tag_blue.png"); }
20 #context-bar a.tags { background-image: url("../images/icons/tag_blue.png"); }
21 #context-bar a.bookmarks { background-image: url("../images/icons/tag_green.png"); }
21 #context-bar a.bookmarks { background-image: url("../images/icons/tag_green.png"); }
22 #context-bar a.settings { background-image: url("../images/icons/cog.png"); }
22 #context-bar a.settings { background-image: url("../images/icons/cog.png"); }
23 #context-bar a.shortlog { background-image: url("../images/icons/time.png"); }
23 #context-bar a.shortlog { background-image: url("../images/icons/time.png"); }
24 #context-bar a.search { background-image: url("../images/icons/search_16.png"); }
24 #context-bar a.search { background-image: url("../images/icons/search_16.png"); }
25 #context-bar a.admin { background-image: url("../images/icons/cog_edit.png"); }
25 #context-bar a.admin { background-image: url("../images/icons/cog_edit.png"); }
26
26
27 #context-bar a.journal { background-image: url("../images/icons/book.png"); }
27 #context-bar a.journal { background-image: url("../images/icons/book.png"); }
28 #context-bar a.repos { background-image: url("../images/icons/database_edit.png"); }
28 #context-bar a.repos { background-image: url("../images/icons/database_edit.png"); }
29 #context-bar a.repos_groups { background-image: url("../images/icons/database_link.png"); }
29 #context-bar a.repos_groups { background-image: url("../images/icons/database_link.png"); }
30 #context-bar a.users { background-image: url("../images/icons/user_edit.png"); }
30 #context-bar a.users { background-image: url("../images/icons/user_edit.png"); }
31 #context-bar a.groups { background-image: url("../images/icons/group_edit.png"); }
31 #context-bar a.groups { background-image: url("../images/icons/group_edit.png"); }
32 #context-bar a.permissions { background-image: url("../images/icons/key.png"); }
32 #context-bar a.permissions { background-image: url("../images/icons/key.png"); }
33 #context-bar a.ldap { background-image: url("../images/icons/server_key.png"); }
33 #context-bar a.ldap { background-image: url("../images/icons/server_key.png"); }
34 #context-bar a.defaults { background-image: url("../images/icons/wrench.png"); }
34 #context-bar a.defaults { background-image: url("../images/icons/wrench.png"); }
35 #context-bar a.settings { background-image: url("../images/icons/cog_edit.png"); }
35 #context-bar a.settings { background-image: url("../images/icons/cog_edit.png"); }
36 #context-bar a.compare_request { background-image: url('../images/icons/arrow_inout.png')}
36 #context-bar a.compare_request { background-image: url('../images/icons/arrow_inout.png')}
37 #context-bar a.locking_del { background-image: url('../images/icons/lock_delete.png')}
37 #context-bar a.locking_del { background-image: url('../images/icons/lock_delete.png')}
38 #context-bar a.locking_add { background-image: url('../images/icons/lock_add.png')}
38 #context-bar a.locking_add { background-image: url('../images/icons/lock_add.png')}
39
39
40 #content #context-bar {
40 #content #context-bar {
41 position: relative;
41 position: relative;
42 background-color: #003B76 !important;
42 background-color: #003B76 !important;
43 padding: 0px;
43 padding: 0px;
44 overflow: visible;
44 overflow: visible;
45 }
45 }
46
46
47 #header #header-inner #quick a,
47 #header #header-inner #quick a,
48 #content #context-bar,
48 #content #context-bar,
49 #content #context-bar a,
49 #content #context-bar a,
50 #content #context-bar button {
50 #content #context-bar button {
51 color: #FFFFFF;
51 color: #FFFFFF;
52 }
52 }
53
53
54 #header #header-inner #quick a:hover,
54 #header #header-inner #quick a:hover,
55 #content #context-bar a:hover,
55 #content #context-bar a:hover,
56 #content #context-bar button:hover {
56 #content #context-bar button:hover {
57 text-decoration: none;
57 text-decoration: none;
58 }
58 }
59
59
60 #content #context-bar .icon {
60 #content #context-bar .icon {
61 display: inline-block;
61 display: inline-block;
62 width: 16px;
62 width: 16px;
63 height: 16px;
63 height: 16px;
64 vertical-align: text-bottom;
64 vertical-align: text-bottom;
65 }
65 }
66
66
67 ul.horizontal-list {
67 ul.horizontal-list {
68 display: block;
68 display: block;
69 }
69 }
70
70
71 ul.horizontal-list > li {
71 ul.horizontal-list > li {
72 float: left;
72 float: left;
73 position: relative;
73 position: relative;
74 }
74 }
75
75
76 #header #header-inner #quick ul,
76 #header #header-inner #quick ul,
77 ul.horizontal-list > li ul {
77 ul.horizontal-list > li ul {
78 position: absolute;
78 position: absolute;
79 display: none;
79 display: none;
80 right: 0;
80 right: 0;
81 z-index: 999;
81 z-index: 999;
82 }
82 }
83
83
84 #header #header-inner #quick li:hover > ul,
84 #header #header-inner #quick li:hover > ul,
85 ul.horizontal-list li:hover > ul {
85 ul.horizontal-list li:hover > ul {
86 display: block;
86 display: block;
87 }
87 }
88
88
89 #header #header-inner #quick li ul li,
89 #header #header-inner #quick li ul li,
90 ul.horizontal-list ul li {
90 ul.horizontal-list ul li {
91 position: relative;
91 position: relative;
92 border-bottom: 1px solid rgba(0,0,0,0.1);
92 border-bottom: 1px solid rgba(0,0,0,0.1);
93 border-top: 1px solid rgba(255,255,255,0.1);
93 border-top: 1px solid rgba(255,255,255,0.1);
94 }
94 }
95
95
96 ul.horizontal-list > li ul ul {
96 ul.horizontal-list > li ul ul {
97 position: absolute;
97 position: absolute;
98 right: 100%;
98 right: 100%;
99 top: -1px;
99 top: -1px;
100 min-width: 200px;
100 min-width: 200px;
101 max-height: 400px;
101 max-height: 400px;
102 overflow-x: hidden;
102 overflow-x: hidden;
103 overflow-y: auto;
103 overflow-y: auto;
104 }
104 }
105
105
106 #header #header-inner #quick ul a,
106 #header #header-inner #quick ul a,
107 ul.horizontal-list li a {
107 ul.horizontal-list li a {
108 white-space: nowrap;
108 white-space: nowrap;
109 }
109 }
110
110
111 #breadcrumbs {
111 #breadcrumbs {
112 float: left;
112 float: left;
113 padding: 5px 0;
113 padding: 5px 0;
114 padding-left: 5px;
114 padding-left: 5px;
115 font-weight: bold;
115 font-weight: bold;
116 font-size: 14px;
116 font-size: 14px;
117 }
117 }
118
118
119 #breadcrumbs span {
119 #breadcrumbs span {
120 font-weight: bold;
120 font-weight: bold;
121 font-size: 1.8em;
121 font-size: 1.8em;
122 }
122 }
123
123
124 #context-top {
124 #context-top {
125 position: relative;
125 position: relative;
126 overflow: hidden;
126 overflow: hidden;
127 border-bottom: 1px solid #003162;
127 border-bottom: 1px solid #003162;
128 padding: 5px;
128 padding: 5px;
129 }
129 }
130
130
131 #header #header-inner #quick ul,
131 #header #header-inner #quick ul,
132 #revision-changer,
132 #revision-changer,
133 #context-pages,
133 #context-pages,
134 #context-pages ul {
134 #context-pages ul {
135 background: #3b6998; /* Old browsers */
135 background: #3b6998; /* Old browsers */
136 background: -moz-linear-gradient(top, #4574a2 0%, #2f5d8b 100%); /* FF3.6+ */
136 background: -moz-linear-gradient(top, #4574a2 0%, #2f5d8b 100%); /* FF3.6+ */
137 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#4574a2), color-stop(100%,#2f5d8b)); /* Chrome,Safari4+ */
137 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#4574a2), color-stop(100%,#2f5d8b)); /* Chrome,Safari4+ */
138 background: -webkit-linear-gradient(top, #4574a2 0%, #2f5d8b 100%); /* Chrome10+,Safari5.1+ */
138 background: -webkit-linear-gradient(top, #4574a2 0%, #2f5d8b 100%); /* Chrome10+,Safari5.1+ */
139 background: -o-linear-gradient(top, #4574a2 0%, #2f5d8b 100%); /* Opera 11.10+ */
139 background: -o-linear-gradient(top, #4574a2 0%, #2f5d8b 100%); /* Opera 11.10+ */
140 background: -ms-linear-gradient(top, #4574a2 0%, #2f5d8b 100%); /* IE10+ */
140 background: -ms-linear-gradient(top, #4574a2 0%, #2f5d8b 100%); /* IE10+ */
141 background: linear-gradient(to bottom, #4574a2 0%, #2f5d8b 100%); /* W3C */
141 background: linear-gradient(to bottom, #4574a2 0%, #2f5d8b 100%); /* W3C */
142 /*Filter on IE will also use overflow:hidden implicitly, and that would clip our inner menus.*/
142 /*Filter on IE will also use overflow:hidden implicitly, and that would clip our inner menus.*/
143 /*filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#4574a2', endColorstr='#2f5d8b',GradientType=0 ); /* IE6-9 */*/
143 /*filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#4574a2', endColorstr='#2f5d8b',GradientType=0 ); /* IE6-9 */*/
144 }
144 }
145
145
146 #header #header-inner #quick a,
146 #header #header-inner #quick a,
147 #context-actions a,
147 #context-actions a,
148 #context-pages a {
148 #context-pages a {
149 background-repeat: no-repeat;
149 background-repeat: no-repeat;
150 background-position: 10px 50%;
150 background-position: 10px 50%;
151 padding-left: 30px;
151 padding-left: 30px;
152 }
152 }
153
153
154 #quick a,
154 #quick a,
155 #context-pages ul ul a {
155 #context-pages ul ul a {
156 padding-left: 10px;
156 padding-left: 10px;
157 }
157 }
158
158
159 ul#context-actions {
159 ul#context-actions {
160 display: inline-block;
160 display: inline-block;
161 float: right;
161 float: right;
162 border-radius: 4px;
162 border-radius: 4px;
163 background-image: linear-gradient(top, #4574a2 0%, #2f5d8b 100%);
163 background-image: linear-gradient(top, #4574a2 0%, #2f5d8b 100%);
164 }
164 }
165
165 #content ul#context-actions li {
166 #content ul#context-actions li {
166 padding: 0px;
167 padding: 0px;
167 border-right: 1px solid rgba(0,0,0,0.1);
168 border-right: 1px solid rgba(0,0,0,0.1);
168 border-left: 1px solid rgba(255,255,255,0.1);
169 border-left: 1px solid rgba(255,255,255,0.1);
169 }
170 }
170
171
171 #context-actions button,
172 #context-actions button,
172 #context-actions a {
173 #context-actions a {
173 display: block;
174 display: block;
174 cursor: pointer;
175 cursor: pointer;
175 background: none;
176 background: none;
176 border: none;
177 border: none;
177 margin: 0px;
178 margin: 0px;
178 height: auto;
179 height: auto;
179 padding: 10px 10px 10px 30px;
180 padding: 10px 10px 10px 30px;
180 background-repeat: no-repeat;
181 background-repeat: no-repeat;
181 background-position: 10px 50%;
182 background-position: 10px 50%;
182 font-size: 1em;
183 font-size: 1em;
183 }
184 }
184
185
185 #context-actions a {
186 #context-actions a {
186 padding: 11px 10px 12px 30px;
187 padding: 11px 10px 12px 30px;
187 }
188 }
188
189
189 #header #header-inner #quick li:hover,
190 #header #header-inner #quick li:hover,
190 #revision-changer:hover,
191 #revision-changer:hover,
191 #context-pages li:hover,
192 #context-pages li:hover,
192 #context-actions li:hover,
193 #context-actions li:hover,
193 #content #context-actions li:hover,
194 #content #context-actions li:hover,
194 #header #header-inner #quick li.current,
195 #header #header-inner #quick li.current,
195 #context-pages li.current {
196 #context-pages li.current {
196 background: #6388ad; /* Old browsers */
197 background: #6388ad; /* Old browsers */
197 background: -moz-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* FF3.6+ */
198 background: -moz-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* FF3.6+ */
198 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,0.1)), color-stop(100%,rgba(255,255,255,0))); /* Chrome,Safari4+ */
199 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,0.1)), color-stop(100%,rgba(255,255,255,0))); /* Chrome,Safari4+ */
199 background: -webkit-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* Chrome10+,Safari5.1+ */
200 background: -webkit-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* Chrome10+,Safari5.1+ */
200 background: -o-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* Opera 11.10+ */
201 background: -o-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* Opera 11.10+ */
201 background: -ms-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* IE10+ */
202 background: -ms-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* IE10+ */
202 background: linear-gradient(to bottom, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* W3C */
203 background: linear-gradient(to bottom, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* W3C */
203 /*filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#88bfe8', endColorstr='#70b0e0',GradientType=0 ); /* IE6-9 */*/
204 /*filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#88bfe8', endColorstr='#70b0e0',GradientType=0 ); /* IE6-9 */*/
204 }
205 }
205
206
206
207
207 #content #context-actions li:first-child {
208 #content #context-actions li:first-child {
208 border-left: none;
209 border-left: none;
209 border-radius: 4px 0 0px 4px;
210 border-radius: 4px 0 0px 4px;
210 }
211 }
211
212
212 #content #context-actions li:last-child {
213 #content #context-actions li:last-child {
213 border-right: none;
214 border-right: none;
214 border-radius: 0 4px 4px 0;
215 border-radius: 0 4px 4px 0;
215 }
216 }
216
217
217 #content #context-actions .icon {
218 #content #context-actions .icon {
218 margin: auto;
219 margin: auto;
219 margin-bottom: 5px;
220 margin-bottom: 5px;
220 display: block;
221 display: block;
221 clear: both;
222 clear: both;
222 float: none;
223 float: none;
223 }
224 }
224
225
225 #content #context-actions button.follow,
226 #content #context-actions button.follow,
226 #content #context-actions button.following {
227 #content #context-actions button.following {
227 width: auto;
228 width: auto;
228 float: none;
229 float: none;
229 }
230 }
230
231
231 #content #context-actions button .show-following,
232 #content #context-actions button .show-following,
232 #content #context-actions button .show-follow {
233 #content #context-actions button .show-follow {
233 display: none;
234 display: none;
234 }
235 }
235
236
236 #content #context-bar #context-actions button.follow .show-follow {
237 #content #context-bar #context-actions button.follow .show-follow {
237 display: block;
238 display: block;
238 }
239 }
239
240
240 #content #context-bar #context-actions button.following .show-following {
241 #content #context-bar #context-actions button.following .show-following {
241 display: block;
242 display: block;
242 }
243 }
243
244
244 #context-state {
245 #context-state {
245 background-color: #336699;
246 background-color: #336699;
246 border-top: 1px solid #517da8;
247 border-top: 1px solid #517da8;
247 min-height: 36px;
248 min-height: 36px;
248 }
249 }
249
250
250 #context-pages {
251 #context-pages {
251 float: right;
252 float: right;
252 border-left: 1px solid rgba(0,0,0,0.1);
253 border-left: 1px solid rgba(0,0,0,0.1);
253 }
254 }
254
255
255 #context-pages li.curreasdnt {
256 #context-pages li.current {
256 background: #535353; /* Old browsers */
257 background: #535353; /* Old browsers */
257 background: -moz-linear-gradient(top, #5d5d5d 0%, #484848 100%); /* FF3.6+ */
258 background: -moz-linear-gradient(top, #5d5d5d 0%, #484848 100%); /* FF3.6+ */
258 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#5d5d5d), color-stop(100%,#484848)); /* Chrome,Safari4+ */
259 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#5d5d5d), color-stop(100%,#484848)); /* Chrome,Safari4+ */
259 background: -webkit-linear-gradient(top, #5d5d5d 0%, #484848 100%); /* Chrome10+,Safari5.1+ */
260 background: -webkit-linear-gradient(top, #5d5d5d 0%, #484848 100%); /* Chrome10+,Safari5.1+ */
260 background: -o-linear-gradient(top, #5d5d5d 0%, #484848 100%); /* Opera 11.10+ */
261 background: -o-linear-gradient(top, #5d5d5d 0%, #484848 100%); /* Opera 11.10+ */
261 background: -ms-linear-gradient(top, #5d5d5d 0%, #484848 100%); /* IE10+ */
262 background: -ms-linear-gradient(top, #5d5d5d 0%, #484848 100%); /* IE10+ */
262 background: linear-gradient(to bottom, #5d5d5d 0%, #484848 100%); /* W3C */
263 background: linear-gradient(to bottom, #5d5d5d 0%, #484848 100%); /* W3C */
263 }
264 }
264
265
265 #content #context-pages .icon {
266 #content #context-pages .icon {
266 margin-right: 5px;
267 margin-right: 5px;
267 }
268 }
268
269
269 #header #header-inner #quick li,
270 #header #header-inner #quick li,
270 #content #context-pages li {
271 #content #context-pages li {
271 border-right: 1px solid rgba(0,0,0,0.1);
272 border-right: 1px solid rgba(0,0,0,0.1);
272 border-left: 1px solid rgba(255,255,255,0.1);
273 border-left: 1px solid rgba(255,255,255,0.1);
273 padding: 0;
274 padding: 0;
274 }
275 }
275 #header #header-inner #quick li:last-child,
276 #header #header-inner #quick li:last-child,
276 #content #context-pages li:last-child {
277 #content #context-pages li:last-child {
277 border-right: none;
278 border-right: none;
278 }
279 }
279
280
280 #header #header-inner #quick > li:first-child {
281 #header #header-inner #quick > li:first-child {
281 border-left: none;
282 border-left: none;
282 }
283 }
283
284
284 #header #header-inner #quick > li:first-child > a {
285 #header #header-inner #quick > li:first-child > a {
285 border-radius: 4px 0 0 4px;
286 border-radius: 4px 0 0 4px;
286 }
287 }
287
288
288 #header #header-inner #quick a,
289 #header #header-inner #quick a,
289 #context-pages a,
290 #context-pages a,
290 #context-pages .admin_menu a {
291 #context-pages .admin_menu a {
291 display: block;
292 display: block;
292 padding: 0px 10px 1px 30px;
293 padding: 0px 10px 1px 30px;
293 padding-left: 30px;
294 padding-left: 30px;
294 line-height: 35px;
295 line-height: 35px;
295 }
296 }
296
297
297 #header #header-inner #quick a.thin,
298 #header #header-inner #quick a.thin,
298 #context-pages a.thin,
299 #context-pages a.thin,
299 #context-pages .admin_menu a.thin {
300 #context-pages .admin_menu a.thin {
300 line-height: 28px !important;
301 line-height: 28px !important;
301 }
302 }
302
303
303 #header #header-inner #quick a#quick_login_link {
304 #header #header-inner #quick a#quick_login_link {
304 padding-left: 0px;
305 padding-left: 0px;
305 }
306 }
306
307
307 #header #header-inner #quick a {
308 #header #header-inner #quick a {
308 overflow: hidden;
309 overflow: hidden;
309 }
310 }
310 #quick a.childs:after,
311 #quick a.childs:after,
311 #revision-changer:before,
312 #revision-changer:before,
312 #context-pages a.childs:after,
313 #context-pages a.childs:after,
313 #context-pages a.dropdown:after {
314 #context-pages a.dropdown:after {
314 content: ' \25BE';
315 content: ' \25BE';
315 }
316 }
316 #context-pages a.childs {
317 #context-pages a.childs {
317 padding-right: 30px;
318 padding-right: 30px;
318 }
319 }
319 #context-pages a.childs:after {
320 #context-pages a.childs:after {
320 position: absolute;
321 position: absolute;
321 float: right;
322 float: right;
322 padding-left: 5px;
323 padding-left: 5px;
323 padding-right: 5px;
324 padding-right: 5px;
324 }
325 }
325
326
326 #revision-changer:before {
327 #revision-changer:before {
327 position: absolute;
328 position: absolute;
328 top: 0px;
329 top: 0px;
329 right: 0px;
330 right: 0px;
330 border-right: 1px solid rgba(0,0,0,0.1);
331 border-right: 1px solid rgba(0,0,0,0.1);
331 height: 25px;
332 height: 25px;
332 padding-top: 10px;
333 padding-top: 10px;
333 padding-right: 10px;
334 padding-right: 10px;
334 }
335 }
335
336
336 #context-pages li:last-child a {
337 #context-pages li:last-child a {
337 padding-right: 10px;
338 padding-right: 10px;
338 }
339 }
339
340
340 #context-bar #revision-changer {
341 #context-bar #revision-changer {
341 position: relative;
342 position: relative;
342 cursor: pointer;
343 cursor: pointer;
343 border: none;
344 border: none;
344 padding: 0;
345 padding: 0;
345 margin: 0;
346 margin: 0;
346 color: #FFFFFF;
347 color: #FFFFFF;
347 font-size: 0.85em;
348 font-size: 0.85em;
348 padding: 2px 15px;
349 padding: 2px 15px;
349 padding-bottom: 3px;
350 padding-bottom: 3px;
350 padding-right: 30px;
351 padding-right: 30px;
351 border-right: 1px solid rgba(255,255,255,0.1);
352 border-right: 1px solid rgba(255,255,255,0.1);
352 }
353 }
353
354
354 #revision-changer .branch-name,
355 #revision-changer .branch-name,
355 #revision-changer .revision {
356 #revision-changer .revision {
356 display: block;
357 display: block;
357 text-align: center;
358 text-align: center;
358 line-height: 1.5em;
359 line-height: 1.5em;
359 }
360 }
360
361
361 #revision-changer .branch-name {
362 #revision-changer .branch-name {
362 font-weight: bold;
363 font-weight: bold;
363 }
364 }
364
365
365 #revision-changer .revision {
366 #revision-changer .revision {
366 text-transform: uppercase;
367 text-transform: uppercase;
367 }
368 }
@@ -1,4852 +1,4846 b''
1 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td {
1 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td {
2 border: 0;
2 border: 0;
3 outline: 0;
3 outline: 0;
4 font-size: 100%;
4 font-size: 100%;
5 vertical-align: baseline;
5 vertical-align: baseline;
6 background: transparent;
6 background: transparent;
7 margin: 0;
7 margin: 0;
8 padding: 0;
8 padding: 0;
9 }
9 }
10
10
11 body {
11 body {
12 line-height: 1;
12 line-height: 1;
13 height: 100%;
13 height: 100%;
14 background: url("../images/background.png") repeat scroll 0 0 #B0B0B0;
14 background: url("../images/background.png") repeat scroll 0 0 #B0B0B0;
15 font-family: Lucida Grande, Verdana, Lucida Sans Regular,
15 font-family: Lucida Grande, Verdana, Lucida Sans Regular,
16 Lucida Sans Unicode, Arial, sans-serif; font-size : 12px;
16 Lucida Sans Unicode, Arial, sans-serif; font-size : 12px;
17 color: #000;
17 color: #000;
18 margin: 0;
18 margin: 0;
19 padding: 0;
19 padding: 0;
20 font-size: 12px;
20 font-size: 12px;
21 }
21 }
22
22
23 ol, ul {
23 ol, ul {
24 list-style: none;
24 list-style: none;
25 }
25 }
26
26
27 blockquote, q {
27 blockquote, q {
28 quotes: none;
28 quotes: none;
29 }
29 }
30
30
31 blockquote:before, blockquote:after, q:before, q:after {
31 blockquote:before, blockquote:after, q:before, q:after {
32 content: none;
32 content: none;
33 }
33 }
34
34
35 :focus {
35 :focus {
36 outline: 0;
36 outline: 0;
37 }
37 }
38
38
39 del {
39 del {
40 text-decoration: line-through;
40 text-decoration: line-through;
41 }
41 }
42
42
43 table {
43 table {
44 border-collapse: collapse;
44 border-collapse: collapse;
45 border-spacing: 0;
45 border-spacing: 0;
46 }
46 }
47
47
48 html {
48 html {
49 height: 100%;
49 height: 100%;
50 }
50 }
51
51
52 a {
52 a {
53 color: #003367;
53 color: #003367;
54 text-decoration: none;
54 text-decoration: none;
55 cursor: pointer;
55 cursor: pointer;
56 }
56 }
57
57
58 a:hover {
58 a:hover {
59 color: #316293;
59 color: #316293;
60 text-decoration: underline;
60 text-decoration: underline;
61 }
61 }
62
62
63 h1, h2, h3, h4, h5, h6,
63 h1, h2, h3, h4, h5, h6,
64 div.h1, div.h2, div.h3, div.h4, div.h5, div.h6 {
64 div.h1, div.h2, div.h3, div.h4, div.h5, div.h6 {
65 color: #292929;
65 color: #292929;
66 font-weight: 700;
66 font-weight: 700;
67 }
67 }
68
68
69 h1, div.h1 {
69 h1, div.h1 {
70 font-size: 22px;
70 font-size: 22px;
71 }
71 }
72
72
73 h2, div.h2 {
73 h2, div.h2 {
74 font-size: 20px;
74 font-size: 20px;
75 }
75 }
76
76
77 h3, div.h3 {
77 h3, div.h3 {
78 font-size: 18px;
78 font-size: 18px;
79 }
79 }
80
80
81 h4, div.h4 {
81 h4, div.h4 {
82 font-size: 16px;
82 font-size: 16px;
83 }
83 }
84
84
85 h5, div.h5 {
85 h5, div.h5 {
86 font-size: 14px;
86 font-size: 14px;
87 }
87 }
88
88
89 h6, div.h6 {
89 h6, div.h6 {
90 font-size: 11px;
90 font-size: 11px;
91 }
91 }
92
92
93 ul.circle {
93 ul.circle {
94 list-style-type: circle;
94 list-style-type: circle;
95 }
95 }
96
96
97 ul.disc {
97 ul.disc {
98 list-style-type: disc;
98 list-style-type: disc;
99 }
99 }
100
100
101 ul.square {
101 ul.square {
102 list-style-type: square;
102 list-style-type: square;
103 }
103 }
104
104
105 ol.lower-roman {
105 ol.lower-roman {
106 list-style-type: lower-roman;
106 list-style-type: lower-roman;
107 }
107 }
108
108
109 ol.upper-roman {
109 ol.upper-roman {
110 list-style-type: upper-roman;
110 list-style-type: upper-roman;
111 }
111 }
112
112
113 ol.lower-alpha {
113 ol.lower-alpha {
114 list-style-type: lower-alpha;
114 list-style-type: lower-alpha;
115 }
115 }
116
116
117 ol.upper-alpha {
117 ol.upper-alpha {
118 list-style-type: upper-alpha;
118 list-style-type: upper-alpha;
119 }
119 }
120
120
121 ol.decimal {
121 ol.decimal {
122 list-style-type: decimal;
122 list-style-type: decimal;
123 }
123 }
124
124
125 div.color {
125 div.color {
126 clear: both;
126 clear: both;
127 overflow: hidden;
127 overflow: hidden;
128 position: absolute;
128 position: absolute;
129 background: #FFF;
129 background: #FFF;
130 margin: 7px 0 0 60px;
130 margin: 7px 0 0 60px;
131 padding: 1px 1px 1px 0;
131 padding: 1px 1px 1px 0;
132 }
132 }
133
133
134 div.color a {
134 div.color a {
135 width: 15px;
135 width: 15px;
136 height: 15px;
136 height: 15px;
137 display: block;
137 display: block;
138 float: left;
138 float: left;
139 margin: 0 0 0 1px;
139 margin: 0 0 0 1px;
140 padding: 0;
140 padding: 0;
141 }
141 }
142
142
143 div.options {
143 div.options {
144 clear: both;
144 clear: both;
145 overflow: hidden;
145 overflow: hidden;
146 position: absolute;
146 position: absolute;
147 background: #FFF;
147 background: #FFF;
148 margin: 7px 0 0 162px;
148 margin: 7px 0 0 162px;
149 padding: 0;
149 padding: 0;
150 }
150 }
151
151
152 div.options a {
152 div.options a {
153 height: 1%;
153 height: 1%;
154 display: block;
154 display: block;
155 text-decoration: none;
155 text-decoration: none;
156 margin: 0;
156 margin: 0;
157 padding: 3px 8px;
157 padding: 3px 8px;
158 }
158 }
159
159
160 .top-left-rounded-corner {
160 .top-left-rounded-corner {
161 -webkit-border-top-left-radius: 8px;
161 -webkit-border-top-left-radius: 8px;
162 -khtml-border-radius-topleft: 8px;
162 -khtml-border-radius-topleft: 8px;
163 border-top-left-radius: 8px;
163 border-top-left-radius: 8px;
164 }
164 }
165
165
166 .top-right-rounded-corner {
166 .top-right-rounded-corner {
167 -webkit-border-top-right-radius: 8px;
167 -webkit-border-top-right-radius: 8px;
168 -khtml-border-radius-topright: 8px;
168 -khtml-border-radius-topright: 8px;
169 border-top-right-radius: 8px;
169 border-top-right-radius: 8px;
170 }
170 }
171
171
172 .bottom-left-rounded-corner {
172 .bottom-left-rounded-corner {
173 -webkit-border-bottom-left-radius: 8px;
173 -webkit-border-bottom-left-radius: 8px;
174 -khtml-border-radius-bottomleft: 8px;
174 -khtml-border-radius-bottomleft: 8px;
175 border-bottom-left-radius: 8px;
175 border-bottom-left-radius: 8px;
176 }
176 }
177
177
178 .bottom-right-rounded-corner {
178 .bottom-right-rounded-corner {
179 -webkit-border-bottom-right-radius: 8px;
179 -webkit-border-bottom-right-radius: 8px;
180 -khtml-border-radius-bottomright: 8px;
180 -khtml-border-radius-bottomright: 8px;
181 border-bottom-right-radius: 8px;
181 border-bottom-right-radius: 8px;
182 }
182 }
183
183
184 .top-left-rounded-corner-mid {
184 .top-left-rounded-corner-mid {
185 -webkit-border-top-left-radius: 4px;
185 -webkit-border-top-left-radius: 4px;
186 -khtml-border-radius-topleft: 4px;
186 -khtml-border-radius-topleft: 4px;
187 border-top-left-radius: 4px;
187 border-top-left-radius: 4px;
188 }
188 }
189
189
190 .top-right-rounded-corner-mid {
190 .top-right-rounded-corner-mid {
191 -webkit-border-top-right-radius: 4px;
191 -webkit-border-top-right-radius: 4px;
192 -khtml-border-radius-topright: 4px;
192 -khtml-border-radius-topright: 4px;
193 border-top-right-radius: 4px;
193 border-top-right-radius: 4px;
194 }
194 }
195
195
196 .bottom-left-rounded-corner-mid {
196 .bottom-left-rounded-corner-mid {
197 -webkit-border-bottom-left-radius: 4px;
197 -webkit-border-bottom-left-radius: 4px;
198 -khtml-border-radius-bottomleft: 4px;
198 -khtml-border-radius-bottomleft: 4px;
199 border-bottom-left-radius: 4px;
199 border-bottom-left-radius: 4px;
200 }
200 }
201
201
202 .bottom-right-rounded-corner-mid {
202 .bottom-right-rounded-corner-mid {
203 -webkit-border-bottom-right-radius: 4px;
203 -webkit-border-bottom-right-radius: 4px;
204 -khtml-border-radius-bottomright: 4px;
204 -khtml-border-radius-bottomright: 4px;
205 border-bottom-right-radius: 4px;
205 border-bottom-right-radius: 4px;
206 }
206 }
207
207
208 .help-block {
208 .help-block {
209 color: #999999;
209 color: #999999;
210 display: block;
210 display: block;
211 margin-bottom: 0;
211 margin-bottom: 0;
212 margin-top: 5px;
212 margin-top: 5px;
213 }
213 }
214
214
215 .empty_data {
215 .empty_data {
216 color: #B9B9B9;
216 color: #B9B9B9;
217 }
217 }
218
218
219 a.permalink {
219 a.permalink {
220 visibility: hidden;
220 visibility: hidden;
221 }
221 }
222
222
223 a.permalink:hover {
223 a.permalink:hover {
224 text-decoration: none;
224 text-decoration: none;
225 }
225 }
226
226
227 h1:hover > a.permalink,
227 h1:hover > a.permalink,
228 h2:hover > a.permalink,
228 h2:hover > a.permalink,
229 h3:hover > a.permalink,
229 h3:hover > a.permalink,
230 h4:hover > a.permalink,
230 h4:hover > a.permalink,
231 h5:hover > a.permalink,
231 h5:hover > a.permalink,
232 h6:hover > a.permalink,
232 h6:hover > a.permalink,
233 div:hover > a.permalink {
233 div:hover > a.permalink {
234 visibility: visible;
234 visibility: visible;
235 }
235 }
236
236
237 #header {
237 #header {
238 }
238 }
239 #header ul#logged-user {
239 #header ul#logged-user {
240 margin-bottom: 5px !important;
240 margin-bottom: 5px !important;
241 -webkit-border-radius: 0px 0px 8px 8px;
241 -webkit-border-radius: 0px 0px 8px 8px;
242 -khtml-border-radius: 0px 0px 8px 8px;
242 -khtml-border-radius: 0px 0px 8px 8px;
243 border-radius: 0px 0px 8px 8px;
243 border-radius: 0px 0px 8px 8px;
244 height: 37px;
244 height: 37px;
245 background-color: #003B76;
245 background-color: #003B76;
246 background-repeat: repeat-x;
246 background-repeat: repeat-x;
247 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
247 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
248 background-image: -moz-linear-gradient(top, #003b76, #00376e);
248 background-image: -moz-linear-gradient(top, #003b76, #00376e);
249 background-image: -ms-linear-gradient(top, #003b76, #00376e);
249 background-image: -ms-linear-gradient(top, #003b76, #00376e);
250 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
250 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
251 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
251 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
252 background-image: -o-linear-gradient(top, #003b76, #00376e);
252 background-image: -o-linear-gradient(top, #003b76, #00376e);
253 background-image: linear-gradient(to bottom, #003b76, #00376e);
253 background-image: linear-gradient(to bottom, #003b76, #00376e);
254 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
254 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
255 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
255 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
256 }
256 }
257
257
258 #header ul#logged-user li {
258 #header ul#logged-user li {
259 list-style: none;
259 list-style: none;
260 float: left;
260 float: left;
261 margin: 8px 0 0;
261 margin: 8px 0 0;
262 padding: 4px 12px;
262 padding: 4px 12px;
263 border-left: 1px solid #316293;
263 border-left: 1px solid #316293;
264 }
264 }
265
265
266 #header ul#logged-user li.first {
266 #header ul#logged-user li.first {
267 border-left: none;
267 border-left: none;
268 margin: 4px;
268 margin: 4px;
269 }
269 }
270
270
271 #header ul#logged-user li.first div.gravatar {
271 #header ul#logged-user li.first div.gravatar {
272 margin-top: -2px;
272 margin-top: -2px;
273 }
273 }
274
274
275 #header ul#logged-user li.first div.account {
275 #header ul#logged-user li.first div.account {
276 padding-top: 4px;
276 padding-top: 4px;
277 float: left;
277 float: left;
278 }
278 }
279
279
280 #header ul#logged-user li.last {
280 #header ul#logged-user li.last {
281 border-right: none;
281 border-right: none;
282 }
282 }
283
283
284 #header ul#logged-user li a {
284 #header ul#logged-user li a {
285 color: #fff;
285 color: #fff;
286 font-weight: 700;
286 font-weight: 700;
287 text-decoration: none;
287 text-decoration: none;
288 }
288 }
289
289
290 #header ul#logged-user li a:hover {
290 #header ul#logged-user li a:hover {
291 text-decoration: underline;
291 text-decoration: underline;
292 }
292 }
293
293
294 #header ul#logged-user li.highlight a {
294 #header ul#logged-user li.highlight a {
295 color: #fff;
295 color: #fff;
296 }
296 }
297
297
298 #header ul#logged-user li.highlight a:hover {
298 #header ul#logged-user li.highlight a:hover {
299 color: #FFF;
299 color: #FFF;
300 }
300 }
301 #header-dd {
301 #header-dd {
302 clear: both;
302 clear: both;
303 position: fixed !important;
303 position: fixed !important;
304 background-color: #003B76;
304 background-color: #003B76;
305 opacity: 0.01;
305 opacity: 0.01;
306 cursor: pointer;
306 cursor: pointer;
307 min-height: 10px;
307 min-height: 10px;
308 width: 100% !important;
308 width: 100% !important;
309 -webkit-border-radius: 0px 0px 4px 4px;
309 -webkit-border-radius: 0px 0px 4px 4px;
310 -khtml-border-radius: 0px 0px 4px 4px;
310 -khtml-border-radius: 0px 0px 4px 4px;
311 border-radius: 0px 0px 4px 4px;
311 border-radius: 0px 0px 4px 4px;
312 }
312 }
313
313
314 #header-dd:hover {
314 #header-dd:hover {
315 opacity: 0.2;
315 opacity: 0.2;
316 -webkit-transition: opacity 0.5s ease-in-out;
316 -webkit-transition: opacity 0.5s ease-in-out;
317 -moz-transition: opacity 0.5s ease-in-out;
317 -moz-transition: opacity 0.5s ease-in-out;
318 transition: opacity 0.5s ease-in-out;
318 transition: opacity 0.5s ease-in-out;
319 }
319 }
320
320
321 #header #header-inner {
321 #header #header-inner {
322 min-height: 44px;
322 min-height: 44px;
323 clear: both;
323 clear: both;
324 position: relative;
324 position: relative;
325 background-color: #003B76;
325 background-color: #003B76;
326 background-repeat: repeat-x;
326 background-repeat: repeat-x;
327 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
327 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
328 background-image: -moz-linear-gradient(top, #003b76, #00376e);
328 background-image: -moz-linear-gradient(top, #003b76, #00376e);
329 background-image: -ms-linear-gradient(top, #003b76, #00376e);
329 background-image: -ms-linear-gradient(top, #003b76, #00376e);
330 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76),color-stop(100%, #00376e) );
330 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76),color-stop(100%, #00376e) );
331 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
331 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
332 background-image: -o-linear-gradient(top, #003b76, #00376e);
332 background-image: -o-linear-gradient(top, #003b76, #00376e);
333 background-image: linear-gradient(to bottom, #003b76, #00376e);
333 background-image: linear-gradient(to bottom, #003b76, #00376e);
334 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
334 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
335 margin: 0;
335 margin: 0;
336 padding: 0;
336 padding: 0;
337 display: block;
337 display: block;
338 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
338 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
339 -webkit-border-radius: 0px 0px 4px 4px;
339 -webkit-border-radius: 0px 0px 4px 4px;
340 -khtml-border-radius: 0px 0px 4px 4px;
340 -khtml-border-radius: 0px 0px 4px 4px;
341 border-radius: 0px 0px 4px 4px;
341 border-radius: 0px 0px 4px 4px;
342 }
342 }
343 #header #header-inner.hover {
343 #header #header-inner.hover {
344 width: 100% !important;
344 width: 100% !important;
345 -webkit-border-radius: 0px 0px 0px 0px;
345 -webkit-border-radius: 0px 0px 0px 0px;
346 -khtml-border-radius: 0px 0px 0px 0px;
346 -khtml-border-radius: 0px 0px 0px 0px;
347 border-radius: 0px 0px 0px 0px;
347 border-radius: 0px 0px 0px 0px;
348 position: fixed !important;
348 position: fixed !important;
349 z-index: 10000;
349 z-index: 10000;
350 }
350 }
351
351
352 .ie7 #header #header-inner.hover,
352 .ie7 #header #header-inner.hover,
353 .ie8 #header #header-inner.hover,
353 .ie8 #header #header-inner.hover,
354 .ie9 #header #header-inner.hover
354 .ie9 #header #header-inner.hover
355 {
355 {
356 z-index: auto !important;
356 z-index: auto !important;
357 }
357 }
358
358
359 .header-pos-fix, .anchor {
359 .header-pos-fix, .anchor {
360 margin-top: -46px;
360 margin-top: -46px;
361 padding-top: 46px;
361 padding-top: 46px;
362 }
362 }
363
363
364 #header #header-inner #home a {
364 #header #header-inner #home a {
365 height: 40px;
365 height: 40px;
366 width: 46px;
366 width: 46px;
367 display: block;
367 display: block;
368 background: url("../images/button_home.png");
368 background: url("../images/button_home.png");
369 background-position: 0 0;
369 background-position: 0 0;
370 margin: 0;
370 margin: 0;
371 padding: 0;
371 padding: 0;
372 }
372 }
373
373
374 #header #header-inner #home a:hover {
374 #header #header-inner #home a:hover {
375 background-position: 0 -40px;
375 background-position: 0 -40px;
376 }
376 }
377
377
378 #header #header-inner #logo {
378 #header #header-inner #logo {
379 float: left;
379 float: left;
380 position: absolute;
380 position: absolute;
381 }
381 }
382
382
383 #header #header-inner #logo h1 {
383 #header #header-inner #logo h1 {
384 color: #FFF;
384 color: #FFF;
385 font-size: 20px;
385 font-size: 20px;
386 margin: 12px 0 0 13px;
386 margin: 12px 0 0 13px;
387 padding: 0;
387 padding: 0;
388 }
388 }
389
389
390 #header #header-inner #logo a {
390 #header #header-inner #logo a {
391 color: #fff;
391 color: #fff;
392 text-decoration: none;
392 text-decoration: none;
393 }
393 }
394
394
395 #header #header-inner #logo a:hover {
395 #header #header-inner #logo a:hover {
396 color: #bfe3ff;
396 color: #bfe3ff;
397 }
397 }
398
398
399 #header #header-inner #quick {
399 #header #header-inner #quick {
400 position: relative;
400 position: relative;
401 float: right;
401 float: right;
402 list-style-type: none;
402 list-style-type: none;
403 list-style-position: outside;
403 list-style-position: outside;
404 margin: 4px 8px 0 0;
404 margin: 4px 8px 0 0;
405 padding: 0;
405 padding: 0;
406 border-radius: 4px;
406 border-radius: 4px;
407 }
407 }
408
408
409 #header #header-inner #quick li span.short {
409 #header #header-inner #quick li span.short {
410 padding: 9px 6px 8px 6px;
410 padding: 9px 6px 8px 6px;
411 }
411 }
412
412
413 #header #header-inner #quick li span {
413 #header #header-inner #quick li span {
414 display: inline;
414 display: inline;
415 margin: 0;
415 margin: 0;
416 }
416 }
417
417
418 #header #header-inner #quick li span.normal {
418 #header #header-inner #quick li span.normal {
419 border: none;
419 border: none;
420 padding: 10px 12px 8px;
420 padding: 10px 12px 8px;
421 }
421 }
422
422
423 #header #header-inner #quick li span.icon {
423 #header #header-inner #quick li span.icon {
424
425 border-left: none;
424 border-left: none;
426 padding-left: 10px ;
425 padding-left: 10px;
427 }
426 }
428
427
429 #header #header-inner #quick li span.icon_short {
428 #header #header-inner #quick li span.icon_short {
430 top: 0;
429 top: 0;
431 left: 0;
430 left: 0;
432 border-left: none;
431 border-left: none;
433 border-right: 1px solid #2e5c89;
432 border-right: 1px solid #2e5c89;
434 padding: 8px 6px 4px;
433 padding: 8px 6px 4px;
435 }
434 }
436
435
437 #header #header-inner #quick li span.icon img, #header #header-inner #quick li span.icon_short img {
436 #header #header-inner #quick li span.icon img, #header #header-inner #quick li span.icon_short img {
438 vertical-align: middle;
437 vertical-align: middle;
439 margin-bottom: 2px;
438 margin-bottom: 2px;
440 }
439 }
441
440
442 #header #header-inner #quick ul.repo_switcher {
441 #header #header-inner #quick ul.repo_switcher {
443 max-height: 275px;
442 max-height: 275px;
444 overflow-x: hidden;
443 overflow-x: hidden;
445 overflow-y: auto;
444 overflow-y: auto;
446 }
445 }
447
446
448 #header #header-inner #quick ul.repo_switcher li.qfilter_rs {
447 #header #header-inner #quick ul.repo_switcher li.qfilter_rs {
449 padding: 2px 3px;
448 padding: 2px 3px;
450 padding-right: 17px;
449 padding-right: 17px;
451 }
450 }
452
451
453 #header #header-inner #quick ul.repo_switcher li.qfilter_rs input {
452 #header #header-inner #quick ul.repo_switcher li.qfilter_rs input {
454 width: 100%;
453 width: 100%;
455 border-radius: 10px;
454 border-radius: 10px;
456 padding: 2px 7px;
455 padding: 2px 7px;
457 }
456 }
458
457
459 #header #header-inner #quick .repo_switcher_type {
458 #header #header-inner #quick .repo_switcher_type {
460 position: absolute;
459 position: absolute;
461 left: 0;
460 left: 0;
462 top: 9px;
461 top: 9px;
463 margin: 0px 2px 0px 2px;
462 margin: 0px 2px 0px 2px;
464 }
463 }
465
464
466 #header #header-inner #quick li ul li a.journal, #header #header-inner #quick li ul li a.journal:hover {
465 #header #header-inner #quick li ul li a.journal, #header #header-inner #quick li ul li a.journal:hover {
467 background-image: url("../images/icons/book.png");
466 background-image: url("../images/icons/book.png");
468 }
467 }
469
468
470 #header #header-inner #quick li ul li a.private_repo, #header #header-inner #quick li ul li a.private_repo:hover {
469 #header #header-inner #quick li ul li a.private_repo, #header #header-inner #quick li ul li a.private_repo:hover {
471 background-image: url("../images/icons/lock.png")
470 background-image: url("../images/icons/lock.png")
472 }
471 }
473
472
474 #header #header-inner #quick li ul li a.public_repo, #header #header-inner #quick li ul li a.public_repo:hover {
473 #header #header-inner #quick li ul li a.public_repo, #header #header-inner #quick li ul li a.public_repo:hover {
475 background-image: url("../images/icons/lock_open.png");
474 background-image: url("../images/icons/lock_open.png");
476 }
475 }
477
476
478 #header #header-inner #quick li ul li a.hg, #header #header-inner #quick li ul li a.hg:hover {
477 #header #header-inner #quick li ul li a.hg, #header #header-inner #quick li ul li a.hg:hover {
479 background-image: url("../images/icons/hgicon.png");
478 background-image: url("../images/icons/hgicon.png");
480 padding-left: 42px;
479 padding-left: 42px;
481 background-position: 20px 9px;
480 background-position: 20px 9px;
482 }
481 }
483
482
484 #header #header-inner #quick li ul li a.git, #header #header-inner #quick li ul li a.git:hover {
483 #header #header-inner #quick li ul li a.git, #header #header-inner #quick li ul li a.git:hover {
485 background-image: url("../images/icons/giticon.png");
484 background-image: url("../images/icons/giticon.png");
486 padding-left: 42px;
485 padding-left: 42px;
487 background-position: 20px 9px;
486 background-position: 20px 9px;
488 }
487 }
489
488
490 #header #header-inner #quick li ul li a.repos, #header #header-inner #quick li ul li a.repos:hover {
489 #header #header-inner #quick li ul li a.repos, #header #header-inner #quick li ul li a.repos:hover {
491 background-image: url("../images/icons/database_edit.png");
490 background-image: url("../images/icons/database_edit.png");
492 }
491 }
493
492
494 #header #header-inner #quick li ul li a.repos_groups, #header #header-inner #quick li ul li a.repos_groups:hover {
493 #header #header-inner #quick li ul li a.repos_groups, #header #header-inner #quick li ul li a.repos_groups:hover {
495 background-image: url("../images/icons/database_link.png");
494 background-image: url("../images/icons/database_link.png");
496 }
495 }
497
496
498 #header #header-inner #quick li ul li a.users, #header #header-inner #quick li ul li a.users:hover {
497 #header #header-inner #quick li ul li a.users, #header #header-inner #quick li ul li a.users:hover {
499 background-image: url("../images/icons/user_edit.png");
498 background-image: url("../images/icons/user_edit.png");
500 }
499 }
501
500
502 #header #header-inner #quick li ul li a.groups, #header #header-inner #quick li ul li a.groups:hover {
501 #header #header-inner #quick li ul li a.groups, #header #header-inner #quick li ul li a.groups:hover {
503 background-image: url("../images/icons/group_edit.png");
502 background-image: url("../images/icons/group_edit.png");
504 }
503 }
505
504
506 #header #header-inner #quick li ul li a.defaults, #header #header-inner #quick li ul li a.defaults:hover {
505 #header #header-inner #quick li ul li a.defaults, #header #header-inner #quick li ul li a.defaults:hover {
507 background-image: url("../images/icons/wrench.png");
506 background-image: url("../images/icons/wrench.png");
508 }
507 }
509
508
510 #header #header-inner #quick li ul li a.settings, #header #header-inner #quick li ul li a.settings:hover {
509 #header #header-inner #quick li ul li a.settings, #header #header-inner #quick li ul li a.settings:hover {
511 background-image: url("../images/icons/cog.png");
510 background-image: url("../images/icons/cog.png");
512 }
511 }
513
512
514 #header #header-inner #quick li ul li a.permissions, #header #header-inner #quick li ul li a.permissions:hover {
513 #header #header-inner #quick li ul li a.permissions, #header #header-inner #quick li ul li a.permissions:hover {
515 background-image: url("../images/icons/key.png");
514 background-image: url("../images/icons/key.png");
516 }
515 }
517
516
518 #header #header-inner #quick li ul li a.ldap, #header #header-inner #quick li ul li a.ldap:hover {
517 #header #header-inner #quick li ul li a.ldap, #header #header-inner #quick li ul li a.ldap:hover {
519 background-image: url("../images/icons/server_key.png");
518 background-image: url("../images/icons/server_key.png");
520 }
519 }
521
520
522 #header #header-inner #quick li ul li a.fork, #header #header-inner #quick li ul li a.fork:hover {
521 #header #header-inner #quick li ul li a.fork, #header #header-inner #quick li ul li a.fork:hover {
523 background-image: url("../images/icons/arrow_divide.png");
522 background-image: url("../images/icons/arrow_divide.png");
524 }
523 }
525
524
526 #header #header-inner #quick li ul li a.locking_add, #header #header-inner #quick li ul li a.locking_add:hover {
525 #header #header-inner #quick li ul li a.locking_add, #header #header-inner #quick li ul li a.locking_add:hover {
527 background-image: url("../images/icons/lock_add.png");
526 background-image: url("../images/icons/lock_add.png");
528 }
527 }
529
528
530 #header #header-inner #quick li ul li a.locking_del, #header #header-inner #quick li ul li a.locking_del:hover {
529 #header #header-inner #quick li ul li a.locking_del, #header #header-inner #quick li ul li a.locking_del:hover {
531 background-image: url("../images/icons/lock_delete.png");
530 background-image: url("../images/icons/lock_delete.png");
532 }
531 }
533
532
534 #header #header-inner #quick li ul li a.pull_request, #header #header-inner #quick li ul li a.pull_request:hover {
533 #header #header-inner #quick li ul li a.pull_request, #header #header-inner #quick li ul li a.pull_request:hover {
535 background-image: url("../images/icons/arrow_join.png") ;
534 background-image: url("../images/icons/arrow_join.png") ;
536 }
535 }
537
536
538 #header #header-inner #quick li ul li a.compare_request, #header #header-inner #quick li ul li a.compare_request:hover {
537 #header #header-inner #quick li ul li a.compare_request, #header #header-inner #quick li ul li a.compare_request:hover {
539 background-image: url("../images/icons/arrow_inout.png");
538 background-image: url("../images/icons/arrow_inout.png");
540 }
539 }
541
540
542 #header #header-inner #quick li ul li a.search, #header #header-inner #quick li ul li a.search:hover {
541 #header #header-inner #quick li ul li a.search, #header #header-inner #quick li ul li a.search:hover {
543 background-image: url("../images/icons/search_16.png");
542 background-image: url("../images/icons/search_16.png");
544 }
543 }
545
544
546 #header #header-inner #quick li ul li a.shortlog, #header #header-inner #quick li ul li a.shortlog:hover {
545 #header #header-inner #quick li ul li a.shortlog, #header #header-inner #quick li ul li a.shortlog:hover {
547 background-image: url("../images/icons/clock_16.png");
546 background-image: url("../images/icons/clock_16.png");
548 }
547 }
549
548
550 #header #header-inner #quick li ul li a.delete, #header #header-inner #quick li ul li a.delete:hover {
549 #header #header-inner #quick li ul li a.delete, #header #header-inner #quick li ul li a.delete:hover {
551 background-image: url("../images/icons/delete.png");
550 background-image: url("../images/icons/delete.png");
552 }
551 }
553
552
554 #header #header-inner #quick li ul li a.branches, #header #header-inner #quick li ul li a.branches:hover {
553 #header #header-inner #quick li ul li a.branches, #header #header-inner #quick li ul li a.branches:hover {
555 background-image: url("../images/icons/arrow_branch.png");
554 background-image: url("../images/icons/arrow_branch.png");
556 }
555 }
557
556
558 #header #header-inner #quick li ul li a.tags,
557 #header #header-inner #quick li ul li a.tags,
559 #header #header-inner #quick li ul li a.tags:hover {
558 #header #header-inner #quick li ul li a.tags:hover {
560 background: #FFF url("../images/icons/tag_blue.png") no-repeat 4px 9px;
559 background: #FFF url("../images/icons/tag_blue.png") no-repeat 4px 9px;
561 width: 167px;
560 width: 167px;
562 margin: 0;
561 margin: 0;
563 padding: 12px 9px 7px 24px;
562 padding: 12px 9px 7px 24px;
564 }
563 }
565
564
566 #header #header-inner #quick li ul li a.bookmarks,
565 #header #header-inner #quick li ul li a.bookmarks,
567 #header #header-inner #quick li ul li a.bookmarks:hover {
566 #header #header-inner #quick li ul li a.bookmarks:hover {
568 background: #FFF url("../images/icons/tag_green.png") no-repeat 4px 9px;
567 background: #FFF url("../images/icons/tag_green.png") no-repeat 4px 9px;
569 width: 167px;
568 width: 167px;
570 margin: 0;
569 margin: 0;
571 padding: 12px 9px 7px 24px;
570 padding: 12px 9px 7px 24px;
572 }
571 }
573
572
574 #header #header-inner #quick li ul li a.admin,
573 #header #header-inner #quick li ul li a.admin,
575 #header #header-inner #quick li ul li a.admin:hover {
574 #header #header-inner #quick li ul li a.admin:hover {
576 background: #FFF url("../images/icons/cog_edit.png") no-repeat 4px 9px;
575 background: #FFF url("../images/icons/cog_edit.png") no-repeat 4px 9px;
577 width: 167px;
576 width: 167px;
578 margin: 0;
577 margin: 0;
579 padding: 12px 9px 7px 24px;
578 padding: 12px 9px 7px 24px;
580 }
579 }
581
580
582 .groups_breadcrumbs a {
581 .groups_breadcrumbs a {
583 color: #fff;
582 color: #fff;
584 }
583 }
585
584
586 .groups_breadcrumbs a:hover {
585 .groups_breadcrumbs a:hover {
587 color: #bfe3ff;
586 color: #bfe3ff;
588 text-decoration: none;
587 text-decoration: none;
589 }
588 }
590
589
591 td.quick_repo_menu {
590 td.quick_repo_menu {
592 background: #FFF url("../images/vertical-indicator.png") 8px 50% no-repeat !important;
591 background: #FFF url("../images/vertical-indicator.png") 8px 50% no-repeat !important;
593 cursor: pointer;
592 cursor: pointer;
594 width: 8px;
593 width: 8px;
595 border: 1px solid transparent;
594 border: 1px solid transparent;
596 }
595 }
597
596
598 td.quick_repo_menu.active {
597 td.quick_repo_menu.active {
599 background: url("../images/dt-arrow-dn.png") no-repeat scroll 5px 50% #FFFFFF !important;
598 background: url("../images/dt-arrow-dn.png") no-repeat scroll 5px 50% #FFFFFF !important;
600 border: 1px solid #003367;
599 border: 1px solid #003367;
601 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
600 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
602 cursor: pointer;
601 cursor: pointer;
603 }
602 }
604
603
605 td.quick_repo_menu .menu_items {
604 td.quick_repo_menu .menu_items {
606 margin-top: 10px;
605 margin-top: 10px;
607 margin-left: -6px;
606 margin-left: -6px;
608 width: 150px;
607 width: 150px;
609 position: absolute;
608 position: absolute;
610 background-color: #FFF;
609 background-color: #FFF;
611 background: none repeat scroll 0 0 #FFFFFF;
610 background: none repeat scroll 0 0 #FFFFFF;
612 border-color: #003367 #666666 #666666;
611 border-color: #003367 #666666 #666666;
613 border-right: 1px solid #666666;
612 border-right: 1px solid #666666;
614 border-style: solid;
613 border-style: solid;
615 border-width: 1px;
614 border-width: 1px;
616 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
615 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
617 border-top-style: none;
616 border-top-style: none;
618 }
617 }
619
618
620 td.quick_repo_menu .menu_items li {
619 td.quick_repo_menu .menu_items li {
621 padding: 0 !important;
620 padding: 0 !important;
622 }
621 }
623
622
624 td.quick_repo_menu .menu_items a {
623 td.quick_repo_menu .menu_items a {
625 display: block;
624 display: block;
626 padding: 4px 12px 4px 8px;
625 padding: 4px 12px 4px 8px;
627 }
626 }
628
627
629 td.quick_repo_menu .menu_items a:hover {
628 td.quick_repo_menu .menu_items a:hover {
630 background-color: #EEE;
629 background-color: #EEE;
631 text-decoration: none;
630 text-decoration: none;
632 }
631 }
633
632
634 td.quick_repo_menu .menu_items .icon img {
633 td.quick_repo_menu .menu_items .icon img {
635 margin-bottom: -2px;
634 margin-bottom: -2px;
636 }
635 }
637
636
638 td.quick_repo_menu .menu_items.hidden {
637 td.quick_repo_menu .menu_items.hidden {
639 display: none;
638 display: none;
640 }
639 }
641
640
642 .yui-dt-first th {
641 .yui-dt-first th {
643 text-align: left;
642 text-align: left;
644 }
643 }
645
644
646 /*
645 /*
647 Copyright (c) 2011, Yahoo! Inc. All rights reserved.
646 Copyright (c) 2011, Yahoo! Inc. All rights reserved.
648 Code licensed under the BSD License:
647 Code licensed under the BSD License:
649 http://developer.yahoo.com/yui/license.html
648 http://developer.yahoo.com/yui/license.html
650 version: 2.9.0
649 version: 2.9.0
651 */
650 */
652 .yui-skin-sam .yui-dt-mask {
651 .yui-skin-sam .yui-dt-mask {
653 position: absolute;
652 position: absolute;
654 z-index: 9500;
653 z-index: 9500;
655 }
654 }
656 .yui-dt-tmp {
655 .yui-dt-tmp {
657 position: absolute;
656 position: absolute;
658 left: -9000px;
657 left: -9000px;
659 }
658 }
660 .yui-dt-scrollable .yui-dt-bd { overflow: auto }
659 .yui-dt-scrollable .yui-dt-bd { overflow: auto }
661 .yui-dt-scrollable .yui-dt-hd {
660 .yui-dt-scrollable .yui-dt-hd {
662 overflow: hidden;
661 overflow: hidden;
663 position: relative;
662 position: relative;
664 }
663 }
665 .yui-dt-scrollable .yui-dt-bd thead tr,
664 .yui-dt-scrollable .yui-dt-bd thead tr,
666 .yui-dt-scrollable .yui-dt-bd thead th {
665 .yui-dt-scrollable .yui-dt-bd thead th {
667 position: absolute;
666 position: absolute;
668 left: -1500px;
667 left: -1500px;
669 }
668 }
670 .yui-dt-scrollable tbody { -moz-outline: 0 }
669 .yui-dt-scrollable tbody { -moz-outline: 0 }
671 .yui-skin-sam thead .yui-dt-sortable { cursor: pointer }
670 .yui-skin-sam thead .yui-dt-sortable { cursor: pointer }
672 .yui-skin-sam thead .yui-dt-draggable { cursor: move }
671 .yui-skin-sam thead .yui-dt-draggable { cursor: move }
673 .yui-dt-coltarget {
672 .yui-dt-coltarget {
674 position: absolute;
673 position: absolute;
675 z-index: 999;
674 z-index: 999;
676 }
675 }
677 .yui-dt-hd { zoom: 1 }
676 .yui-dt-hd { zoom: 1 }
678 th.yui-dt-resizeable .yui-dt-resizerliner { position: relative }
677 th.yui-dt-resizeable .yui-dt-resizerliner { position: relative }
679 .yui-dt-resizer {
678 .yui-dt-resizer {
680 position: absolute;
679 position: absolute;
681 right: 0;
680 right: 0;
682 bottom: 0;
681 bottom: 0;
683 height: 100%;
682 height: 100%;
684 cursor: e-resize;
683 cursor: e-resize;
685 cursor: col-resize;
684 cursor: col-resize;
686 background-color: #CCC;
685 background-color: #CCC;
687 opacity: 0;
686 opacity: 0;
688 filter: alpha(opacity=0);
687 filter: alpha(opacity=0);
689 }
688 }
690 .yui-dt-resizerproxy {
689 .yui-dt-resizerproxy {
691 visibility: hidden;
690 visibility: hidden;
692 position: absolute;
691 position: absolute;
693 z-index: 9000;
692 z-index: 9000;
694 background-color: #CCC;
693 background-color: #CCC;
695 opacity: 0;
694 opacity: 0;
696 filter: alpha(opacity=0);
695 filter: alpha(opacity=0);
697 }
696 }
698 th.yui-dt-hidden .yui-dt-liner,
697 th.yui-dt-hidden .yui-dt-liner,
699 td.yui-dt-hidden .yui-dt-liner,
698 td.yui-dt-hidden .yui-dt-liner,
700 th.yui-dt-hidden .yui-dt-resizer { display: none }
699 th.yui-dt-hidden .yui-dt-resizer { display: none }
701 .yui-dt-editor,
700 .yui-dt-editor,
702 .yui-dt-editor-shim {
701 .yui-dt-editor-shim {
703 position: absolute;
702 position: absolute;
704 z-index: 9000;
703 z-index: 9000;
705 }
704 }
706 .yui-skin-sam .yui-dt table {
705 .yui-skin-sam .yui-dt table {
707 margin: 0;
706 margin: 0;
708 padding: 0;
707 padding: 0;
709 font-family: arial;
708 font-family: arial;
710 font-size: inherit;
709 font-size: inherit;
711 border-collapse: separate;
710 border-collapse: separate;
712 *border-collapse: collapse;
711 *border-collapse: collapse;
713 border-spacing: 0;
712 border-spacing: 0;
714 border: 1px solid #7f7f7f;
713 border: 1px solid #7f7f7f;
715 }
714 }
716 .yui-skin-sam .yui-dt thead { border-spacing: 0 }
715 .yui-skin-sam .yui-dt thead { border-spacing: 0 }
717 .yui-skin-sam .yui-dt caption {
716 .yui-skin-sam .yui-dt caption {
718 color: #000;
717 color: #000;
719 font-size: 85%;
718 font-size: 85%;
720 font-weight: normal;
719 font-weight: normal;
721 font-style: italic;
720 font-style: italic;
722 line-height: 1;
721 line-height: 1;
723 padding: 1em 0;
722 padding: 1em 0;
724 text-align: center;
723 text-align: center;
725 }
724 }
726 .yui-skin-sam .yui-dt th { background: #d8d8da url(../images/sprite.png) repeat-x 0 0 }
725 .yui-skin-sam .yui-dt th { background: #d8d8da url(../images/sprite.png) repeat-x 0 0 }
727 .yui-skin-sam .yui-dt th,
726 .yui-skin-sam .yui-dt th,
728 .yui-skin-sam .yui-dt th a {
727 .yui-skin-sam .yui-dt th a {
729 font-weight: normal;
728 font-weight: normal;
730 text-decoration: none;
729 text-decoration: none;
731 color: #000;
730 color: #000;
732 vertical-align: bottom;
731 vertical-align: bottom;
733 }
732 }
734 .yui-skin-sam .yui-dt th {
733 .yui-skin-sam .yui-dt th {
735 margin: 0;
734 margin: 0;
736 padding: 0;
735 padding: 0;
737 border: 0;
736 border: 0;
738 border-right: 1px solid #cbcbcb;
737 border-right: 1px solid #cbcbcb;
739 }
738 }
740 .yui-skin-sam .yui-dt tr.yui-dt-first td { border-top: 1px solid #7f7f7f }
739 .yui-skin-sam .yui-dt tr.yui-dt-first td { border-top: 1px solid #7f7f7f }
741 .yui-skin-sam .yui-dt th .yui-dt-liner { white-space: nowrap }
740 .yui-skin-sam .yui-dt th .yui-dt-liner { white-space: nowrap }
742 .yui-skin-sam .yui-dt-liner {
741 .yui-skin-sam .yui-dt-liner {
743 margin: 0;
742 margin: 0;
744 padding: 0;
743 padding: 0;
745 }
744 }
746 .yui-skin-sam .yui-dt-coltarget {
745 .yui-skin-sam .yui-dt-coltarget {
747 width: 5px;
746 width: 5px;
748 background-color: red;
747 background-color: red;
749 }
748 }
750 .yui-skin-sam .yui-dt td {
749 .yui-skin-sam .yui-dt td {
751 margin: 0;
750 margin: 0;
752 padding: 0;
751 padding: 0;
753 border: 0;
752 border: 0;
754 border-right: 1px solid #cbcbcb;
753 border-right: 1px solid #cbcbcb;
755 text-align: left;
754 text-align: left;
756 }
755 }
757 .yui-skin-sam .yui-dt-list td { border-right: 0 }
756 .yui-skin-sam .yui-dt-list td { border-right: 0 }
758 .yui-skin-sam .yui-dt-resizer { width: 6px }
757 .yui-skin-sam .yui-dt-resizer { width: 6px }
759 .yui-skin-sam .yui-dt-mask {
758 .yui-skin-sam .yui-dt-mask {
760 background-color: #000;
759 background-color: #000;
761 opacity: .25;
760 opacity: .25;
762 filter: alpha(opacity=25);
761 filter: alpha(opacity=25);
763 }
762 }
764 .yui-skin-sam .yui-dt-message { background-color: #FFF }
763 .yui-skin-sam .yui-dt-message { background-color: #FFF }
765 .yui-skin-sam .yui-dt-scrollable table { border: 0 }
764 .yui-skin-sam .yui-dt-scrollable table { border: 0 }
766 .yui-skin-sam .yui-dt-scrollable .yui-dt-hd {
765 .yui-skin-sam .yui-dt-scrollable .yui-dt-hd {
767 border-left: 1px solid #7f7f7f;
766 border-left: 1px solid #7f7f7f;
768 border-top: 1px solid #7f7f7f;
767 border-top: 1px solid #7f7f7f;
769 border-right: 1px solid #7f7f7f;
768 border-right: 1px solid #7f7f7f;
770 }
769 }
771 .yui-skin-sam .yui-dt-scrollable .yui-dt-bd {
770 .yui-skin-sam .yui-dt-scrollable .yui-dt-bd {
772 border-left: 1px solid #7f7f7f;
771 border-left: 1px solid #7f7f7f;
773 border-bottom: 1px solid #7f7f7f;
772 border-bottom: 1px solid #7f7f7f;
774 border-right: 1px solid #7f7f7f;
773 border-right: 1px solid #7f7f7f;
775 background-color: #FFF;
774 background-color: #FFF;
776 }
775 }
777 .yui-skin-sam .yui-dt-scrollable .yui-dt-data tr.yui-dt-last td { border-bottom: 1px solid #7f7f7f }
776 .yui-skin-sam .yui-dt-scrollable .yui-dt-data tr.yui-dt-last td { border-bottom: 1px solid #7f7f7f }
778 .yui-skin-sam th.yui-dt-asc,
777 .yui-skin-sam th.yui-dt-asc,
779 .yui-skin-sam th.yui-dt-desc { background: url(../images/sprite.png) repeat-x 0 -100px }
778 .yui-skin-sam th.yui-dt-desc { background: url(../images/sprite.png) repeat-x 0 -100px }
780 .yui-skin-sam th.yui-dt-sortable .yui-dt-label { margin-right: 10px }
779 .yui-skin-sam th.yui-dt-sortable .yui-dt-label { margin-right: 10px }
781 .yui-skin-sam th.yui-dt-asc .yui-dt-liner { background: url(../images/dt-arrow-up.png) no-repeat right }
780 .yui-skin-sam th.yui-dt-asc .yui-dt-liner { background: url(../images/dt-arrow-up.png) no-repeat right }
782 .yui-skin-sam th.yui-dt-desc .yui-dt-liner { background: url(../images/dt-arrow-dn.png) no-repeat right }
781 .yui-skin-sam th.yui-dt-desc .yui-dt-liner { background: url(../images/dt-arrow-dn.png) no-repeat right }
783 tbody .yui-dt-editable { cursor: pointer }
782 tbody .yui-dt-editable { cursor: pointer }
784 .yui-dt-editor {
783 .yui-dt-editor {
785 text-align: left;
784 text-align: left;
786 background-color: #f2f2f2;
785 background-color: #f2f2f2;
787 border: 1px solid #808080;
786 border: 1px solid #808080;
788 padding: 6px;
787 padding: 6px;
789 }
788 }
790 .yui-dt-editor label {
789 .yui-dt-editor label {
791 padding-left: 4px;
790 padding-left: 4px;
792 padding-right: 6px;
791 padding-right: 6px;
793 }
792 }
794 .yui-dt-editor .yui-dt-button {
793 .yui-dt-editor .yui-dt-button {
795 padding-top: 6px;
794 padding-top: 6px;
796 text-align: right;
795 text-align: right;
797 }
796 }
798 .yui-dt-editor .yui-dt-button button {
797 .yui-dt-editor .yui-dt-button button {
799 background: url(../images/sprite.png) repeat-x 0 0;
798 background: url(../images/sprite.png) repeat-x 0 0;
800 border: 1px solid #999;
799 border: 1px solid #999;
801 width: 4em;
800 width: 4em;
802 height: 1.8em;
801 height: 1.8em;
803 margin-left: 6px;
802 margin-left: 6px;
804 }
803 }
805 .yui-dt-editor .yui-dt-button button.yui-dt-default {
804 .yui-dt-editor .yui-dt-button button.yui-dt-default {
806 background: url(../images/sprite.png) repeat-x 0 -1400px;
805 background: url(../images/sprite.png) repeat-x 0 -1400px;
807 background-color: #5584e0;
806 background-color: #5584e0;
808 border: 1px solid #304369;
807 border: 1px solid #304369;
809 color: #FFF;
808 color: #FFF;
810 }
809 }
811 .yui-dt-editor .yui-dt-button button:hover {
810 .yui-dt-editor .yui-dt-button button:hover {
812 background: url(../images/sprite.png) repeat-x 0 -1300px;
811 background: url(../images/sprite.png) repeat-x 0 -1300px;
813 color: #000;
812 color: #000;
814 }
813 }
815 .yui-dt-editor .yui-dt-button button:active {
814 .yui-dt-editor .yui-dt-button button:active {
816 background: url(../images/sprite.png) repeat-x 0 -1700px;
815 background: url(../images/sprite.png) repeat-x 0 -1700px;
817 color: #000;
816 color: #000;
818 }
817 }
819 .yui-skin-sam tr.yui-dt-even { background-color: #FFF }
818 .yui-skin-sam tr.yui-dt-even { background-color: #FFF }
820 .yui-skin-sam tr.yui-dt-odd { background-color: #edf5ff }
819 .yui-skin-sam tr.yui-dt-odd { background-color: #edf5ff }
821 .yui-skin-sam tr.yui-dt-even td.yui-dt-asc,
820 .yui-skin-sam tr.yui-dt-even td.yui-dt-asc,
822 .yui-skin-sam tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
821 .yui-skin-sam tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
823 .yui-skin-sam tr.yui-dt-odd td.yui-dt-asc,
822 .yui-skin-sam tr.yui-dt-odd td.yui-dt-asc,
824 .yui-skin-sam tr.yui-dt-odd td.yui-dt-desc { background-color: #dbeaff }
823 .yui-skin-sam tr.yui-dt-odd td.yui-dt-desc { background-color: #dbeaff }
825 .yui-skin-sam .yui-dt-list tr.yui-dt-even { background-color: #FFF }
824 .yui-skin-sam .yui-dt-list tr.yui-dt-even { background-color: #FFF }
826 .yui-skin-sam .yui-dt-list tr.yui-dt-odd { background-color: #FFF }
825 .yui-skin-sam .yui-dt-list tr.yui-dt-odd { background-color: #FFF }
827 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-asc,
826 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-asc,
828 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
827 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
829 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-asc,
828 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-asc,
830 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-desc { background-color: #edf5ff }
829 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-desc { background-color: #edf5ff }
831 .yui-skin-sam th.yui-dt-highlighted,
830 .yui-skin-sam th.yui-dt-highlighted,
832 .yui-skin-sam th.yui-dt-highlighted a { background-color: #b2d2ff }
831 .yui-skin-sam th.yui-dt-highlighted a { background-color: #b2d2ff }
833 .yui-skin-sam tr.yui-dt-highlighted,
832 .yui-skin-sam tr.yui-dt-highlighted,
834 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc,
833 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc,
835 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc,
834 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc,
836 .yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted,
835 .yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted,
837 .yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted {
836 .yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted {
838 cursor: pointer;
837 cursor: pointer;
839 background-color: #b2d2ff;
838 background-color: #b2d2ff;
840 }
839 }
841 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted,
840 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted,
842 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted a { background-color: #b2d2ff }
841 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted a { background-color: #b2d2ff }
843 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted,
842 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted,
844 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-asc,
843 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-asc,
845 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc,
844 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc,
846 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-highlighted,
845 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-highlighted,
847 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-highlighted {
846 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-highlighted {
848 cursor: pointer;
847 cursor: pointer;
849 background-color: #b2d2ff;
848 background-color: #b2d2ff;
850 }
849 }
851 .yui-skin-sam th.yui-dt-selected,
850 .yui-skin-sam th.yui-dt-selected,
852 .yui-skin-sam th.yui-dt-selected a { background-color: #446cd7 }
851 .yui-skin-sam th.yui-dt-selected a { background-color: #446cd7 }
853 .yui-skin-sam tr.yui-dt-selected td,
852 .yui-skin-sam tr.yui-dt-selected td,
854 .yui-skin-sam tr.yui-dt-selected td.yui-dt-asc,
853 .yui-skin-sam tr.yui-dt-selected td.yui-dt-asc,
855 .yui-skin-sam tr.yui-dt-selected td.yui-dt-desc {
854 .yui-skin-sam tr.yui-dt-selected td.yui-dt-desc {
856 background-color: #426fd9;
855 background-color: #426fd9;
857 color: #FFF;
856 color: #FFF;
858 }
857 }
859 .yui-skin-sam tr.yui-dt-even td.yui-dt-selected,
858 .yui-skin-sam tr.yui-dt-even td.yui-dt-selected,
860 .yui-skin-sam tr.yui-dt-odd td.yui-dt-selected {
859 .yui-skin-sam tr.yui-dt-odd td.yui-dt-selected {
861 background-color: #446cd7;
860 background-color: #446cd7;
862 color: #FFF;
861 color: #FFF;
863 }
862 }
864 .yui-skin-sam .yui-dt-list th.yui-dt-selected,
863 .yui-skin-sam .yui-dt-list th.yui-dt-selected,
865 .yui-skin-sam .yui-dt-list th.yui-dt-selected a { background-color: #446cd7 }
864 .yui-skin-sam .yui-dt-list th.yui-dt-selected a { background-color: #446cd7 }
866 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td,
865 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td,
867 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-asc,
866 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-asc,
868 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-desc {
867 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-desc {
869 background-color: #426fd9;
868 background-color: #426fd9;
870 color: #FFF;
869 color: #FFF;
871 }
870 }
872 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-selected,
871 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-selected,
873 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-selected {
872 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-selected {
874 background-color: #446cd7;
873 background-color: #446cd7;
875 color: #FFF;
874 color: #FFF;
876 }
875 }
877 .yui-skin-sam .yui-dt-paginator {
876 .yui-skin-sam .yui-dt-paginator {
878 display: block;
877 display: block;
879 margin: 6px 0;
878 margin: 6px 0;
880 white-space: nowrap;
879 white-space: nowrap;
881 }
880 }
882 .yui-skin-sam .yui-dt-paginator .yui-dt-first,
881 .yui-skin-sam .yui-dt-paginator .yui-dt-first,
883 .yui-skin-sam .yui-dt-paginator .yui-dt-last,
882 .yui-skin-sam .yui-dt-paginator .yui-dt-last,
884 .yui-skin-sam .yui-dt-paginator .yui-dt-selected { padding: 2px 6px }
883 .yui-skin-sam .yui-dt-paginator .yui-dt-selected { padding: 2px 6px }
885 .yui-skin-sam .yui-dt-paginator a.yui-dt-first,
884 .yui-skin-sam .yui-dt-paginator a.yui-dt-first,
886 .yui-skin-sam .yui-dt-paginator a.yui-dt-last { text-decoration: none }
885 .yui-skin-sam .yui-dt-paginator a.yui-dt-last { text-decoration: none }
887 .yui-skin-sam .yui-dt-paginator .yui-dt-previous,
886 .yui-skin-sam .yui-dt-paginator .yui-dt-previous,
888 .yui-skin-sam .yui-dt-paginator .yui-dt-next { display: none }
887 .yui-skin-sam .yui-dt-paginator .yui-dt-next { display: none }
889 .yui-skin-sam a.yui-dt-page {
888 .yui-skin-sam a.yui-dt-page {
890 border: 1px solid #cbcbcb;
889 border: 1px solid #cbcbcb;
891 padding: 2px 6px;
890 padding: 2px 6px;
892 text-decoration: none;
891 text-decoration: none;
893 background-color: #fff;
892 background-color: #fff;
894 }
893 }
895 .yui-skin-sam .yui-dt-selected {
894 .yui-skin-sam .yui-dt-selected {
896 border: 1px solid #fff;
895 border: 1px solid #fff;
897 background-color: #fff;
896 background-color: #fff;
898 }
897 }
899
898
900 #content #left {
899 #content #left {
901 left: 0;
900 left: 0;
902 width: 280px;
901 width: 280px;
903 position: absolute;
902 position: absolute;
904 }
903 }
905
904
906 #content #right {
905 #content #right {
907 margin: 0 60px 10px 290px;
906 margin: 0 60px 10px 290px;
908 }
907 }
909
908
910 #content div.box {
909 #content div.box {
911 clear: both;
910 clear: both;
912 background: #fff;
911 background: #fff;
913 margin: 0 0 10px;
912 margin: 0 0 10px;
914 padding: 0 0 10px;
913 padding: 0 0 10px;
915 -webkit-border-radius: 4px 4px 4px 4px;
914 -webkit-border-radius: 4px 4px 4px 4px;
916 -khtml-border-radius: 4px 4px 4px 4px;
915 -khtml-border-radius: 4px 4px 4px 4px;
917 border-radius: 4px 4px 4px 4px;
916 border-radius: 4px 4px 4px 4px;
918 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
917 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
919 }
918 }
920
919
921 #content div.box-left {
920 #content div.box-left {
922 width: 49%;
921 width: 49%;
923 clear: none;
922 clear: none;
924 float: left;
923 float: left;
925 margin: 0 0 10px;
924 margin: 0 0 10px;
926 }
925 }
927
926
928 #content div.box-right {
927 #content div.box-right {
929 width: 49%;
928 width: 49%;
930 clear: none;
929 clear: none;
931 float: right;
930 float: right;
932 margin: 0 0 10px;
931 margin: 0 0 10px;
933 }
932 }
934
933
935 #content div.box div.title {
934 #content div.box div.title {
936 clear: both;
935 clear: both;
937 overflow: hidden;
936 overflow: hidden;
938 background-color: #003B76;
937 background-color: #003B76;
939 background-repeat: repeat-x;
938 background-repeat: repeat-x;
940 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
939 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
941 background-image: -moz-linear-gradient(top, #003b76, #00376e);
940 background-image: -moz-linear-gradient(top, #003b76, #00376e);
942 background-image: -ms-linear-gradient(top, #003b76, #00376e);
941 background-image: -ms-linear-gradient(top, #003b76, #00376e);
943 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
942 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
944 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
943 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
945 background-image: -o-linear-gradient(top, #003b76, #00376e);
944 background-image: -o-linear-gradient(top, #003b76, #00376e);
946 background-image: linear-gradient(to bottom, #003b76, #00376e);
945 background-image: linear-gradient(to bottom, #003b76, #00376e);
947 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
946 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
948 margin: 0 0 20px;
947 margin: 0 0 20px;
949 padding: 0;
948 padding: 0;
950 border-radius: 4px 4px 0 0;
949 border-radius: 4px 4px 0 0;
951 }
950 }
952
951
953 #content div.box div.title h5 {
952 #content div.box div.title h5 {
954 float: left;
953 float: left;
955 border: none;
954 border: none;
956 color: #fff;
955 color: #fff;
957 text-transform: uppercase;
956 text-transform: uppercase;
958 margin: 0;
957 margin: 0;
959 padding: 11px 0 11px 10px;
958 padding: 11px 0 11px 10px;
960 }
959 }
961
960
962 #content div.box div.title .link-white {
961 #content div.box div.title .link-white {
963 color: #FFFFFF;
962 color: #FFFFFF;
964 }
963 }
965
964
966 #content div.box div.title .link-white.current {
965 #content div.box div.title .link-white.current {
967 color: #BFE3FF;
966 color: #BFE3FF;
968 }
967 }
969
968
970 #content div.box div.title ul.links li {
969 #content div.box div.title ul.links li {
971 list-style: none;
970 list-style: none;
972 float: left;
971 float: left;
973 margin: 0;
972 margin: 0;
974 padding: 0;
973 padding: 0;
975 }
974 }
976
975
977 #content div.box div.title ul.links li a {
976 #content div.box div.title ul.links li a {
978 border-left: 1px solid #316293;
977 border-left: 1px solid #316293;
979 color: #FFFFFF;
978 color: #FFFFFF;
980 display: block;
979 display: block;
981 float: left;
980 float: left;
982 font-size: 13px;
981 font-size: 13px;
983 font-weight: 700;
982 font-weight: 700;
984 height: 1%;
983 height: 1%;
985 margin: 0;
984 margin: 0;
986 padding: 11px 22px 12px;
985 padding: 11px 22px 12px;
987 text-decoration: none;
986 text-decoration: none;
988 }
987 }
989
988
990 #content div.box h1, #content div.box h2, #content div.box h3, #content div.box h4, #content div.box h5, #content div.box h6,
989 #content div.box h1, #content div.box h2, #content div.box h3, #content div.box h4, #content div.box h5, #content div.box h6,
991 #content div.box div.h1, #content div.box div.h2, #content div.box div.h3, #content div.box div.h4, #content div.box div.h5, #content div.box div.h6 {
990 #content div.box div.h1, #content div.box div.h2, #content div.box div.h3, #content div.box div.h4, #content div.box div.h5, #content div.box div.h6 {
992 clear: both;
991 clear: both;
993 overflow: hidden;
992 overflow: hidden;
994 border-bottom: 1px solid #DDD;
993 border-bottom: 1px solid #DDD;
995 margin: 10px 20px;
994 margin: 10px 20px;
996 padding: 0 0 15px;
995 padding: 0 0 15px;
997 }
996 }
998
997
999 #content div.box p {
998 #content div.box p {
1000 color: #5f5f5f;
999 color: #5f5f5f;
1001 font-size: 12px;
1000 font-size: 12px;
1002 line-height: 150%;
1001 line-height: 150%;
1003 margin: 0 24px 10px;
1002 margin: 0 24px 10px;
1004 padding: 0;
1003 padding: 0;
1005 }
1004 }
1006
1005
1007 #content div.box blockquote {
1006 #content div.box blockquote {
1008 border-left: 4px solid #DDD;
1007 border-left: 4px solid #DDD;
1009 color: #5f5f5f;
1008 color: #5f5f5f;
1010 font-size: 11px;
1009 font-size: 11px;
1011 line-height: 150%;
1010 line-height: 150%;
1012 margin: 0 34px;
1011 margin: 0 34px;
1013 padding: 0 0 0 14px;
1012 padding: 0 0 0 14px;
1014 }
1013 }
1015
1014
1016 #content div.box blockquote p {
1015 #content div.box blockquote p {
1017 margin: 10px 0;
1016 margin: 10px 0;
1018 padding: 0;
1017 padding: 0;
1019 }
1018 }
1020
1019
1021 #content div.box dl {
1020 #content div.box dl {
1022 margin: 10px 0px;
1021 margin: 10px 0px;
1023 }
1022 }
1024
1023
1025 #content div.box dt {
1024 #content div.box dt {
1026 font-size: 12px;
1025 font-size: 12px;
1027 margin: 0;
1026 margin: 0;
1028 }
1027 }
1029
1028
1030 #content div.box dd {
1029 #content div.box dd {
1031 font-size: 12px;
1030 font-size: 12px;
1032 margin: 0;
1031 margin: 0;
1033 padding: 8px 0 8px 15px;
1032 padding: 8px 0 8px 15px;
1034 }
1033 }
1035
1034
1036 #content div.box li {
1035 #content div.box li {
1037 font-size: 12px;
1036 font-size: 12px;
1038 padding: 4px 0;
1037 padding: 4px 0;
1039 }
1038 }
1040
1039
1041 #content div.box ul.disc, #content div.box ul.circle {
1040 #content div.box ul.disc, #content div.box ul.circle {
1042 margin: 10px 24px 10px 38px;
1041 margin: 10px 24px 10px 38px;
1043 }
1042 }
1044
1043
1045 #content div.box ul.square {
1044 #content div.box ul.square {
1046 margin: 10px 24px 10px 40px;
1045 margin: 10px 24px 10px 40px;
1047 }
1046 }
1048
1047
1049 #content div.box img.left {
1048 #content div.box img.left {
1050 border: none;
1049 border: none;
1051 float: left;
1050 float: left;
1052 margin: 10px 10px 10px 0;
1051 margin: 10px 10px 10px 0;
1053 }
1052 }
1054
1053
1055 #content div.box img.right {
1054 #content div.box img.right {
1056 border: none;
1055 border: none;
1057 float: right;
1056 float: right;
1058 margin: 10px 0 10px 10px;
1057 margin: 10px 0 10px 10px;
1059 }
1058 }
1060
1059
1061 #content div.box div.messages {
1060 #content div.box div.messages {
1062 clear: both;
1061 clear: both;
1063 overflow: hidden;
1062 overflow: hidden;
1064 margin: 0 20px;
1063 margin: 0 20px;
1065 padding: 0;
1064 padding: 0;
1066 }
1065 }
1067
1066
1068 #content div.box div.message {
1067 #content div.box div.message {
1069 clear: both;
1068 clear: both;
1070 overflow: hidden;
1069 overflow: hidden;
1071 margin: 0;
1070 margin: 0;
1072 padding: 5px 0;
1071 padding: 5px 0;
1073 white-space: pre-wrap;
1072 white-space: pre-wrap;
1074 }
1073 }
1075 #content div.box div.expand {
1074 #content div.box div.expand {
1076 width: 110%;
1075 width: 110%;
1077 height: 14px;
1076 height: 14px;
1078 font-size: 10px;
1077 font-size: 10px;
1079 text-align: center;
1078 text-align: center;
1080 cursor: pointer;
1079 cursor: pointer;
1081 color: #666;
1080 color: #666;
1082
1081
1083 background: -webkit-gradient(linear,0% 50%,100% 50%,color-stop(0%,rgba(255,255,255,0)),color-stop(100%,rgba(64,96,128,0.1)));
1082 background: -webkit-gradient(linear,0% 50%,100% 50%,color-stop(0%,rgba(255,255,255,0)),color-stop(100%,rgba(64,96,128,0.1)));
1084 background: -webkit-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1083 background: -webkit-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1085 background: -moz-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1084 background: -moz-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1086 background: -o-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1085 background: -o-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1087 background: -ms-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1086 background: -ms-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1088 background: linear-gradient(to bottom,rgba(255,255,255,0),rgba(64,96,128,0.1));
1087 background: linear-gradient(to bottom,rgba(255,255,255,0),rgba(64,96,128,0.1));
1089
1088
1090 display: none;
1089 display: none;
1091 overflow: hidden;
1090 overflow: hidden;
1092 }
1091 }
1093 #content div.box div.expand .expandtext {
1092 #content div.box div.expand .expandtext {
1094 background-color: #ffffff;
1093 background-color: #ffffff;
1095 padding: 2px;
1094 padding: 2px;
1096 border-radius: 2px;
1095 border-radius: 2px;
1097 }
1096 }
1098
1097
1099 #content div.box div.message a {
1098 #content div.box div.message a {
1100 font-weight: 400 !important;
1099 font-weight: 400 !important;
1101 }
1100 }
1102
1101
1103 #content div.box div.message div.image {
1102 #content div.box div.message div.image {
1104 float: left;
1103 float: left;
1105 margin: 9px 0 0 5px;
1104 margin: 9px 0 0 5px;
1106 padding: 6px;
1105 padding: 6px;
1107 }
1106 }
1108
1107
1109 #content div.box div.message div.image img {
1108 #content div.box div.message div.image img {
1110 vertical-align: middle;
1109 vertical-align: middle;
1111 margin: 0;
1110 margin: 0;
1112 }
1111 }
1113
1112
1114 #content div.box div.message div.text {
1113 #content div.box div.message div.text {
1115 float: left;
1114 float: left;
1116 margin: 0;
1115 margin: 0;
1117 padding: 9px 6px;
1116 padding: 9px 6px;
1118 }
1117 }
1119
1118
1120 #content div.box div.message div.dismiss a {
1119 #content div.box div.message div.dismiss a {
1121 height: 16px;
1120 height: 16px;
1122 width: 16px;
1121 width: 16px;
1123 display: block;
1122 display: block;
1124 background: url("../images/icons/cross.png") no-repeat;
1123 background: url("../images/icons/cross.png") no-repeat;
1125 margin: 15px 14px 0 0;
1124 margin: 15px 14px 0 0;
1126 padding: 0;
1125 padding: 0;
1127 }
1126 }
1128
1127
1129 #content div.box div.message div.text h1, #content div.box div.message div.text h2, #content div.box div.message div.text h3, #content div.box div.message div.text h4, #content div.box div.message div.text h5, #content div.box div.message div.text h6 {
1128 #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 {
1130 border: none;
1129 border: none;
1131 margin: 0;
1130 margin: 0;
1132 padding: 0;
1131 padding: 0;
1133 }
1132 }
1134
1133
1135 #content div.box div.message div.text span {
1134 #content div.box div.message div.text span {
1136 height: 1%;
1135 height: 1%;
1137 display: block;
1136 display: block;
1138 margin: 0;
1137 margin: 0;
1139 padding: 5px 0 0;
1138 padding: 5px 0 0;
1140 }
1139 }
1141
1140
1142 #content div.box div.message-error {
1141 #content div.box div.message-error {
1143 height: 1%;
1142 height: 1%;
1144 clear: both;
1143 clear: both;
1145 overflow: hidden;
1144 overflow: hidden;
1146 background: #FBE3E4;
1145 background: #FBE3E4;
1147 border: 1px solid #FBC2C4;
1146 border: 1px solid #FBC2C4;
1148 color: #860006;
1147 color: #860006;
1149 }
1148 }
1150
1149
1151 #content div.box div.message-error h6 {
1150 #content div.box div.message-error h6 {
1152 color: #860006;
1151 color: #860006;
1153 }
1152 }
1154
1153
1155 #content div.box div.message-warning {
1154 #content div.box div.message-warning {
1156 height: 1%;
1155 height: 1%;
1157 clear: both;
1156 clear: both;
1158 overflow: hidden;
1157 overflow: hidden;
1159 background: #FFF6BF;
1158 background: #FFF6BF;
1160 border: 1px solid #FFD324;
1159 border: 1px solid #FFD324;
1161 color: #5f5200;
1160 color: #5f5200;
1162 }
1161 }
1163
1162
1164 #content div.box div.message-warning h6 {
1163 #content div.box div.message-warning h6 {
1165 color: #5f5200;
1164 color: #5f5200;
1166 }
1165 }
1167
1166
1168 #content div.box div.message-notice {
1167 #content div.box div.message-notice {
1169 height: 1%;
1168 height: 1%;
1170 clear: both;
1169 clear: both;
1171 overflow: hidden;
1170 overflow: hidden;
1172 background: #8FBDE0;
1171 background: #8FBDE0;
1173 border: 1px solid #6BACDE;
1172 border: 1px solid #6BACDE;
1174 color: #003863;
1173 color: #003863;
1175 }
1174 }
1176
1175
1177 #content div.box div.message-notice h6 {
1176 #content div.box div.message-notice h6 {
1178 color: #003863;
1177 color: #003863;
1179 }
1178 }
1180
1179
1181 #content div.box div.message-success {
1180 #content div.box div.message-success {
1182 height: 1%;
1181 height: 1%;
1183 clear: both;
1182 clear: both;
1184 overflow: hidden;
1183 overflow: hidden;
1185 background: #E6EFC2;
1184 background: #E6EFC2;
1186 border: 1px solid #C6D880;
1185 border: 1px solid #C6D880;
1187 color: #4e6100;
1186 color: #4e6100;
1188 }
1187 }
1189
1188
1190 #content div.box div.message-success h6 {
1189 #content div.box div.message-success h6 {
1191 color: #4e6100;
1190 color: #4e6100;
1192 }
1191 }
1193
1192
1194 #content div.box div.form div.fields div.field {
1193 #content div.box div.form div.fields div.field {
1195 height: 1%;
1194 height: 1%;
1196 min-height: 12px;
1195 min-height: 12px;
1197 border-bottom: 1px solid #DDD;
1196 border-bottom: 1px solid #DDD;
1198 clear: both;
1197 clear: both;
1199 margin: 0;
1198 margin: 0;
1200 padding: 10px 0;
1199 padding: 10px 0;
1201 }
1200 }
1202
1201
1203 #content div.box div.form div.fields div.field-first {
1202 #content div.box div.form div.fields div.field-first {
1204 padding: 0 0 10px;
1203 padding: 0 0 10px;
1205 }
1204 }
1206
1205
1207 #content div.box div.form div.fields div.field-noborder {
1206 #content div.box div.form div.fields div.field-noborder {
1208 border-bottom: 0 !important;
1207 border-bottom: 0 !important;
1209 }
1208 }
1210
1209
1211 #content div.box div.form div.fields div.field span.error-message {
1210 #content div.box div.form div.fields div.field span.error-message {
1212 height: 1%;
1211 height: 1%;
1213 display: inline-block;
1212 display: inline-block;
1214 color: red;
1213 color: red;
1215 margin: 8px 0 0 4px;
1214 margin: 8px 0 0 4px;
1216 padding: 0;
1215 padding: 0;
1217 }
1216 }
1218
1217
1219 #content div.box div.form div.fields div.field span.success {
1218 #content div.box div.form div.fields div.field span.success {
1220 height: 1%;
1219 height: 1%;
1221 display: block;
1220 display: block;
1222 color: #316309;
1221 color: #316309;
1223 margin: 8px 0 0;
1222 margin: 8px 0 0;
1224 padding: 0;
1223 padding: 0;
1225 }
1224 }
1226
1225
1227 #content div.box div.form div.fields div.field div.label {
1226 #content div.box div.form div.fields div.field div.label {
1228 left: 70px;
1227 left: 70px;
1229 width: 155px;
1228 width: 155px;
1230 position: absolute;
1229 position: absolute;
1231 margin: 0;
1230 margin: 0;
1232 padding: 5px 0 0 0px;
1231 padding: 5px 0 0 0px;
1233 }
1232 }
1234
1233
1235 #content div.box div.form div.fields div.field div.label-summary {
1234 #content div.box div.form div.fields div.field div.label-summary {
1236 left: 30px;
1235 left: 30px;
1237 width: 155px;
1236 width: 155px;
1238 position: absolute;
1237 position: absolute;
1239 margin: 0;
1238 margin: 0;
1240 padding: 0px 0 0 0px;
1239 padding: 0px 0 0 0px;
1241 }
1240 }
1242
1241
1243 #content div.box-left div.form div.fields div.field div.label,
1242 #content div.box-left div.form div.fields div.field div.label,
1244 #content div.box-right div.form div.fields div.field div.label,
1243 #content div.box-right div.form div.fields div.field div.label,
1245 #content div.box-left div.form div.fields div.field div.label,
1244 #content div.box-left div.form div.fields div.field div.label,
1246 #content div.box-left div.form div.fields div.field div.label-summary,
1245 #content div.box-left div.form div.fields div.field div.label-summary,
1247 #content div.box-right div.form div.fields div.field div.label-summary,
1246 #content div.box-right div.form div.fields div.field div.label-summary,
1248 #content div.box-left div.form div.fields div.field div.label-summary {
1247 #content div.box-left div.form div.fields div.field div.label-summary {
1249 clear: both;
1248 clear: both;
1250 overflow: hidden;
1249 overflow: hidden;
1251 left: 0;
1250 left: 0;
1252 width: auto;
1251 width: auto;
1253 position: relative;
1252 position: relative;
1254 margin: 0;
1253 margin: 0;
1255 padding: 0 0 8px;
1254 padding: 0 0 8px;
1256 }
1255 }
1257
1256
1258 #content div.box div.form div.fields div.field div.label-select {
1257 #content div.box div.form div.fields div.field div.label-select {
1259 padding: 5px 0 0 5px;
1258 padding: 5px 0 0 5px;
1260 }
1259 }
1261
1260
1262 #content div.box-left div.form div.fields div.field div.label-select,
1261 #content div.box-left div.form div.fields div.field div.label-select,
1263 #content div.box-right div.form div.fields div.field div.label-select {
1262 #content div.box-right div.form div.fields div.field div.label-select {
1264 padding: 0 0 8px;
1263 padding: 0 0 8px;
1265 }
1264 }
1266
1265
1267 #content div.box-left div.form div.fields div.field div.label-textarea,
1266 #content div.box-left div.form div.fields div.field div.label-textarea,
1268 #content div.box-right div.form div.fields div.field div.label-textarea {
1267 #content div.box-right div.form div.fields div.field div.label-textarea {
1269 padding: 0 0 8px !important;
1268 padding: 0 0 8px !important;
1270 }
1269 }
1271
1270
1272 #content div.box div.form div.fields div.field div.label label, div.label label {
1271 #content div.box div.form div.fields div.field div.label label, div.label label {
1273 color: #393939;
1272 color: #393939;
1274 font-weight: 700;
1273 font-weight: 700;
1275 }
1274 }
1276 #content div.box div.form div.fields div.field div.label label, div.label-summary label {
1275 #content div.box div.form div.fields div.field div.label label, div.label-summary label {
1277 color: #393939;
1276 color: #393939;
1278 font-weight: 700;
1277 font-weight: 700;
1279 }
1278 }
1280 #content div.box div.form div.fields div.field div.input {
1279 #content div.box div.form div.fields div.field div.input {
1281 margin: 0 0 0 200px;
1280 margin: 0 0 0 200px;
1282 }
1281 }
1283
1282
1284 #content div.box div.form div.fields div.field div.input.summary {
1283 #content div.box div.form div.fields div.field div.input.summary {
1285 margin: 0 0 0 110px;
1284 margin: 0 0 0 110px;
1286 }
1285 }
1287 #content div.box div.form div.fields div.field div.input.summary-short {
1286 #content div.box div.form div.fields div.field div.input.summary-short {
1288 margin: 0 0 0 110px;
1287 margin: 0 0 0 110px;
1289 }
1288 }
1290 #content div.box div.form div.fields div.field div.file {
1289 #content div.box div.form div.fields div.field div.file {
1291 margin: 0 0 0 200px;
1290 margin: 0 0 0 200px;
1292 }
1291 }
1293
1292
1294 #content div.box-left div.form div.fields div.field div.input, #content div.box-right div.form div.fields div.field div.input {
1293 #content div.box-left div.form div.fields div.field div.input, #content div.box-right div.form div.fields div.field div.input {
1295 margin: 0 0 0 0px;
1294 margin: 0 0 0 0px;
1296 }
1295 }
1297
1296
1298 #content div.box div.form div.fields div.field div.input input,
1297 #content div.box div.form div.fields div.field div.input input,
1299 .reviewer_ac input {
1298 .reviewer_ac input {
1300 background: #FFF;
1299 background: #FFF;
1301 border-top: 1px solid #b3b3b3;
1300 border-top: 1px solid #b3b3b3;
1302 border-left: 1px solid #b3b3b3;
1301 border-left: 1px solid #b3b3b3;
1303 border-right: 1px solid #eaeaea;
1302 border-right: 1px solid #eaeaea;
1304 border-bottom: 1px solid #eaeaea;
1303 border-bottom: 1px solid #eaeaea;
1305 color: #000;
1304 color: #000;
1306 font-size: 11px;
1305 font-size: 11px;
1307 margin: 0;
1306 margin: 0;
1308 padding: 7px 7px 6px;
1307 padding: 7px 7px 6px;
1309 }
1308 }
1310
1309
1311 #content div.box div.form div.fields div.field div.input input#clone_url,
1310 #content div.box div.form div.fields div.field div.input input#clone_url,
1312 #content div.box div.form div.fields div.field div.input input#clone_url_id
1311 #content div.box div.form div.fields div.field div.input input#clone_url_id
1313 {
1312 {
1314 font-size: 16px;
1313 font-size: 16px;
1315 padding: 2px;
1314 padding: 2px;
1316 }
1315 }
1317
1316
1318 #content div.box div.form div.fields div.field div.file input {
1317 #content div.box div.form div.fields div.field div.file input {
1319 background: none repeat scroll 0 0 #FFFFFF;
1318 background: none repeat scroll 0 0 #FFFFFF;
1320 border-color: #B3B3B3 #EAEAEA #EAEAEA #B3B3B3;
1319 border-color: #B3B3B3 #EAEAEA #EAEAEA #B3B3B3;
1321 border-style: solid;
1320 border-style: solid;
1322 border-width: 1px;
1321 border-width: 1px;
1323 color: #000000;
1322 color: #000000;
1324 font-size: 11px;
1323 font-size: 11px;
1325 margin: 0;
1324 margin: 0;
1326 padding: 7px 7px 6px;
1325 padding: 7px 7px 6px;
1327 }
1326 }
1328
1327
1329 input.disabled {
1328 input.disabled {
1330 background-color: #F5F5F5 !important;
1329 background-color: #F5F5F5 !important;
1331 }
1330 }
1332 #content div.box div.form div.fields div.field div.input input.small {
1331 #content div.box div.form div.fields div.field div.input input.small {
1333 width: 30%;
1332 width: 30%;
1334 }
1333 }
1335
1334
1336 #content div.box div.form div.fields div.field div.input input.medium {
1335 #content div.box div.form div.fields div.field div.input input.medium {
1337 width: 55%;
1336 width: 55%;
1338 }
1337 }
1339
1338
1340 #content div.box div.form div.fields div.field div.input input.large {
1339 #content div.box div.form div.fields div.field div.input input.large {
1341 width: 85%;
1340 width: 85%;
1342 }
1341 }
1343
1342
1344 #content div.box div.form div.fields div.field div.input input.date {
1343 #content div.box div.form div.fields div.field div.input input.date {
1345 width: 177px;
1344 width: 177px;
1346 }
1345 }
1347
1346
1348 #content div.box div.form div.fields div.field div.input input.button {
1347 #content div.box div.form div.fields div.field div.input input.button {
1349 background: #D4D0C8;
1348 background: #D4D0C8;
1350 border-top: 1px solid #FFF;
1349 border-top: 1px solid #FFF;
1351 border-left: 1px solid #FFF;
1350 border-left: 1px solid #FFF;
1352 border-right: 1px solid #404040;
1351 border-right: 1px solid #404040;
1353 border-bottom: 1px solid #404040;
1352 border-bottom: 1px solid #404040;
1354 color: #000;
1353 color: #000;
1355 margin: 0;
1354 margin: 0;
1356 padding: 4px 8px;
1355 padding: 4px 8px;
1357 }
1356 }
1358
1357
1359 #content div.box div.form div.fields div.field div.textarea {
1358 #content div.box div.form div.fields div.field div.textarea {
1360 border-top: 1px solid #b3b3b3;
1359 border-top: 1px solid #b3b3b3;
1361 border-left: 1px solid #b3b3b3;
1360 border-left: 1px solid #b3b3b3;
1362 border-right: 1px solid #eaeaea;
1361 border-right: 1px solid #eaeaea;
1363 border-bottom: 1px solid #eaeaea;
1362 border-bottom: 1px solid #eaeaea;
1364 margin: 0 0 0 200px;
1363 margin: 0 0 0 200px;
1365 padding: 10px;
1364 padding: 10px;
1366 }
1365 }
1367
1366
1368 #content div.box div.form div.fields div.field div.textarea-editor {
1367 #content div.box div.form div.fields div.field div.textarea-editor {
1369 border: 1px solid #ddd;
1368 border: 1px solid #ddd;
1370 padding: 0;
1369 padding: 0;
1371 }
1370 }
1372
1371
1373 #content div.box div.form div.fields div.field div.textarea textarea {
1372 #content div.box div.form div.fields div.field div.textarea textarea {
1374 width: 100%;
1373 width: 100%;
1375 height: 220px;
1374 height: 220px;
1376 overflow: hidden;
1375 overflow: hidden;
1377 background: #FFF;
1376 background: #FFF;
1378 color: #000;
1377 color: #000;
1379 font-size: 11px;
1378 font-size: 11px;
1380 outline: none;
1379 outline: none;
1381 border-width: 0;
1380 border-width: 0;
1382 margin: 0;
1381 margin: 0;
1383 padding: 0;
1382 padding: 0;
1384 }
1383 }
1385
1384
1386 #content div.box-left div.form div.fields div.field div.textarea textarea, #content div.box-right div.form div.fields div.field div.textarea textarea {
1385 #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 {
1387 width: 100%;
1386 width: 100%;
1388 height: 100px;
1387 height: 100px;
1389 }
1388 }
1390
1389
1391 #content div.box div.form div.fields div.field div.textarea table {
1390 #content div.box div.form div.fields div.field div.textarea table {
1392 width: 100%;
1391 width: 100%;
1393 border: none;
1392 border: none;
1394 margin: 0;
1393 margin: 0;
1395 padding: 0;
1394 padding: 0;
1396 }
1395 }
1397
1396
1398 #content div.box div.form div.fields div.field div.textarea table td {
1397 #content div.box div.form div.fields div.field div.textarea table td {
1399 background: #DDD;
1398 background: #DDD;
1400 border: none;
1399 border: none;
1401 padding: 0;
1400 padding: 0;
1402 }
1401 }
1403
1402
1404 #content div.box div.form div.fields div.field div.textarea table td table {
1403 #content div.box div.form div.fields div.field div.textarea table td table {
1405 width: auto;
1404 width: auto;
1406 border: none;
1405 border: none;
1407 margin: 0;
1406 margin: 0;
1408 padding: 0;
1407 padding: 0;
1409 }
1408 }
1410
1409
1411 #content div.box div.form div.fields div.field div.textarea table td table td {
1410 #content div.box div.form div.fields div.field div.textarea table td table td {
1412 font-size: 11px;
1411 font-size: 11px;
1413 padding: 5px 5px 5px 0;
1412 padding: 5px 5px 5px 0;
1414 }
1413 }
1415
1414
1416 #content div.box div.form div.fields div.field input[type=text]:focus,
1415 #content div.box div.form div.fields div.field input[type=text]:focus,
1417 #content div.box div.form div.fields div.field input[type=password]:focus,
1416 #content div.box div.form div.fields div.field input[type=password]:focus,
1418 #content div.box div.form div.fields div.field input[type=file]:focus,
1417 #content div.box div.form div.fields div.field input[type=file]:focus,
1419 #content div.box div.form div.fields div.field textarea:focus,
1418 #content div.box div.form div.fields div.field textarea:focus,
1420 #content div.box div.form div.fields div.field select:focus,
1419 #content div.box div.form div.fields div.field select:focus,
1421 .reviewer_ac input:focus {
1420 .reviewer_ac input:focus {
1422 background: #f6f6f6;
1421 background: #f6f6f6;
1423 border-color: #666;
1422 border-color: #666;
1424 }
1423 }
1425
1424
1426 .reviewer_ac {
1425 .reviewer_ac {
1427 padding: 10px
1426 padding: 10px
1428 }
1427 }
1429
1428
1430 div.form div.fields div.field div.button {
1429 div.form div.fields div.field div.button {
1431 margin: 0;
1430 margin: 0;
1432 padding: 0 0 0 8px;
1431 padding: 0 0 0 8px;
1433 }
1432 }
1434 #content div.box table.noborder {
1433 #content div.box table.noborder {
1435 border: 1px solid transparent;
1434 border: 1px solid transparent;
1436 }
1435 }
1437
1436
1438 #content div.box table {
1437 #content div.box table {
1439 width: 100%;
1438 width: 100%;
1440 border-collapse: separate;
1439 border-collapse: separate;
1441 margin: 0;
1440 margin: 0;
1442 padding: 0;
1441 padding: 0;
1443 border: 1px solid #eee;
1442 border: 1px solid #eee;
1444 -webkit-border-radius: 4px;
1443 -webkit-border-radius: 4px;
1445 border-radius: 4px;
1444 border-radius: 4px;
1446 }
1445 }
1447
1446
1448 #content div.box table th {
1447 #content div.box table th {
1449 background: #eee;
1448 background: #eee;
1450 border-bottom: 1px solid #ddd;
1449 border-bottom: 1px solid #ddd;
1451 padding: 5px 0px 5px 5px;
1450 padding: 5px 0px 5px 5px;
1452 text-align: left;
1451 text-align: left;
1453 }
1452 }
1454
1453
1455 #content div.box table th.left {
1454 #content div.box table th.left {
1456 text-align: left;
1455 text-align: left;
1457 }
1456 }
1458
1457
1459 #content div.box table th.right {
1458 #content div.box table th.right {
1460 text-align: right;
1459 text-align: right;
1461 }
1460 }
1462
1461
1463 #content div.box table th.center {
1462 #content div.box table th.center {
1464 text-align: center;
1463 text-align: center;
1465 }
1464 }
1466
1465
1467 #content div.box table th.selected {
1466 #content div.box table th.selected {
1468 vertical-align: middle;
1467 vertical-align: middle;
1469 padding: 0;
1468 padding: 0;
1470 }
1469 }
1471
1470
1472 #content div.box table td {
1471 #content div.box table td {
1473 background: #fff;
1472 background: #fff;
1474 border-bottom: 1px solid #cdcdcd;
1473 border-bottom: 1px solid #cdcdcd;
1475 vertical-align: middle;
1474 vertical-align: middle;
1476 padding: 5px;
1475 padding: 5px;
1477 }
1476 }
1478
1477
1479 #content div.box table tr.selected td {
1478 #content div.box table tr.selected td {
1480 background: #FFC;
1479 background: #FFC;
1481 }
1480 }
1482
1481
1483 #content div.box table td.selected {
1482 #content div.box table td.selected {
1484 width: 3%;
1483 width: 3%;
1485 text-align: center;
1484 text-align: center;
1486 vertical-align: middle;
1485 vertical-align: middle;
1487 padding: 0;
1486 padding: 0;
1488 }
1487 }
1489
1488
1490 #content div.box table td.action {
1489 #content div.box table td.action {
1491 width: 45%;
1490 width: 45%;
1492 text-align: left;
1491 text-align: left;
1493 }
1492 }
1494
1493
1495 #content div.box table td.date {
1494 #content div.box table td.date {
1496 width: 33%;
1495 width: 33%;
1497 text-align: center;
1496 text-align: center;
1498 }
1497 }
1499
1498
1500 #content div.box div.action {
1499 #content div.box div.action {
1501 float: right;
1500 float: right;
1502 background: #FFF;
1501 background: #FFF;
1503 text-align: right;
1502 text-align: right;
1504 margin: 10px 0 0;
1503 margin: 10px 0 0;
1505 padding: 0;
1504 padding: 0;
1506 }
1505 }
1507
1506
1508 #content div.box div.action select {
1507 #content div.box div.action select {
1509 font-size: 11px;
1508 font-size: 11px;
1510 margin: 0;
1509 margin: 0;
1511 }
1510 }
1512
1511
1513 #content div.box div.action .ui-selectmenu {
1512 #content div.box div.action .ui-selectmenu {
1514 margin: 0;
1513 margin: 0;
1515 padding: 0;
1514 padding: 0;
1516 }
1515 }
1517
1516
1518 #content div.box div.pagination {
1517 #content div.box div.pagination {
1519 height: 1%;
1518 height: 1%;
1520 clear: both;
1519 clear: both;
1521 overflow: hidden;
1520 overflow: hidden;
1522 margin: 10px 0 0;
1521 margin: 10px 0 0;
1523 padding: 0;
1522 padding: 0;
1524 }
1523 }
1525
1524
1526 #content div.box div.pagination ul.pager {
1525 #content div.box div.pagination ul.pager {
1527 float: right;
1526 float: right;
1528 text-align: right;
1527 text-align: right;
1529 margin: 0;
1528 margin: 0;
1530 padding: 0;
1529 padding: 0;
1531 }
1530 }
1532
1531
1533 #content div.box div.pagination ul.pager li {
1532 #content div.box div.pagination ul.pager li {
1534 height: 1%;
1533 height: 1%;
1535 float: left;
1534 float: left;
1536 list-style: none;
1535 list-style: none;
1537 background: #ebebeb url("../images/pager.png") repeat-x;
1536 background: #ebebeb url("../images/pager.png") repeat-x;
1538 border-top: 1px solid #dedede;
1537 border-top: 1px solid #dedede;
1539 border-left: 1px solid #cfcfcf;
1538 border-left: 1px solid #cfcfcf;
1540 border-right: 1px solid #c4c4c4;
1539 border-right: 1px solid #c4c4c4;
1541 border-bottom: 1px solid #c4c4c4;
1540 border-bottom: 1px solid #c4c4c4;
1542 color: #4A4A4A;
1541 color: #4A4A4A;
1543 font-weight: 700;
1542 font-weight: 700;
1544 margin: 0 0 0 4px;
1543 margin: 0 0 0 4px;
1545 padding: 0;
1544 padding: 0;
1546 }
1545 }
1547
1546
1548 #content div.box div.pagination ul.pager li.separator {
1547 #content div.box div.pagination ul.pager li.separator {
1549 padding: 6px;
1548 padding: 6px;
1550 }
1549 }
1551
1550
1552 #content div.box div.pagination ul.pager li.current {
1551 #content div.box div.pagination ul.pager li.current {
1553 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1552 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1554 border-top: 1px solid #ccc;
1553 border-top: 1px solid #ccc;
1555 border-left: 1px solid #bebebe;
1554 border-left: 1px solid #bebebe;
1556 border-right: 1px solid #b1b1b1;
1555 border-right: 1px solid #b1b1b1;
1557 border-bottom: 1px solid #afafaf;
1556 border-bottom: 1px solid #afafaf;
1558 color: #515151;
1557 color: #515151;
1559 padding: 6px;
1558 padding: 6px;
1560 }
1559 }
1561
1560
1562 #content div.box div.pagination ul.pager li a {
1561 #content div.box div.pagination ul.pager li a {
1563 height: 1%;
1562 height: 1%;
1564 display: block;
1563 display: block;
1565 float: left;
1564 float: left;
1566 color: #515151;
1565 color: #515151;
1567 text-decoration: none;
1566 text-decoration: none;
1568 margin: 0;
1567 margin: 0;
1569 padding: 6px;
1568 padding: 6px;
1570 }
1569 }
1571
1570
1572 #content div.box div.pagination ul.pager li a:hover, #content div.box div.pagination ul.pager li a:active {
1571 #content div.box div.pagination ul.pager li a:hover, #content div.box div.pagination ul.pager li a:active {
1573 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1572 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1574 border-top: 1px solid #ccc;
1573 border-top: 1px solid #ccc;
1575 border-left: 1px solid #bebebe;
1574 border-left: 1px solid #bebebe;
1576 border-right: 1px solid #b1b1b1;
1575 border-right: 1px solid #b1b1b1;
1577 border-bottom: 1px solid #afafaf;
1576 border-bottom: 1px solid #afafaf;
1578 margin: -1px;
1577 margin: -1px;
1579 }
1578 }
1580
1579
1581 #content div.box div.pagination-wh {
1580 #content div.box div.pagination-wh {
1582 height: 1%;
1581 height: 1%;
1583 clear: both;
1582 clear: both;
1584 overflow: hidden;
1583 overflow: hidden;
1585 text-align: right;
1584 text-align: right;
1586 margin: 10px 0 0;
1585 margin: 10px 0 0;
1587 padding: 0;
1586 padding: 0;
1588 }
1587 }
1589
1588
1590 #content div.box div.pagination-right {
1589 #content div.box div.pagination-right {
1591 float: right;
1590 float: right;
1592 }
1591 }
1593
1592
1594 #content div.box div.pagination-wh a,
1593 #content div.box div.pagination-wh a,
1595 #content div.box div.pagination-wh span.pager_dotdot,
1594 #content div.box div.pagination-wh span.pager_dotdot,
1596 #content div.box div.pagination-wh span.yui-pg-previous,
1595 #content div.box div.pagination-wh span.yui-pg-previous,
1597 #content div.box div.pagination-wh span.yui-pg-last,
1596 #content div.box div.pagination-wh span.yui-pg-last,
1598 #content div.box div.pagination-wh span.yui-pg-next,
1597 #content div.box div.pagination-wh span.yui-pg-next,
1599 #content div.box div.pagination-wh span.yui-pg-first {
1598 #content div.box div.pagination-wh span.yui-pg-first {
1600 height: 1%;
1599 height: 1%;
1601 float: left;
1600 float: left;
1602 background: #ebebeb url("../images/pager.png") repeat-x;
1601 background: #ebebeb url("../images/pager.png") repeat-x;
1603 border-top: 1px solid #dedede;
1602 border-top: 1px solid #dedede;
1604 border-left: 1px solid #cfcfcf;
1603 border-left: 1px solid #cfcfcf;
1605 border-right: 1px solid #c4c4c4;
1604 border-right: 1px solid #c4c4c4;
1606 border-bottom: 1px solid #c4c4c4;
1605 border-bottom: 1px solid #c4c4c4;
1607 color: #4A4A4A;
1606 color: #4A4A4A;
1608 font-weight: 700;
1607 font-weight: 700;
1609 margin: 0 0 0 4px;
1608 margin: 0 0 0 4px;
1610 padding: 6px;
1609 padding: 6px;
1611 }
1610 }
1612
1611
1613 #content div.box div.pagination-wh span.pager_curpage {
1612 #content div.box div.pagination-wh span.pager_curpage {
1614 height: 1%;
1613 height: 1%;
1615 float: left;
1614 float: left;
1616 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1615 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1617 border-top: 1px solid #ccc;
1616 border-top: 1px solid #ccc;
1618 border-left: 1px solid #bebebe;
1617 border-left: 1px solid #bebebe;
1619 border-right: 1px solid #b1b1b1;
1618 border-right: 1px solid #b1b1b1;
1620 border-bottom: 1px solid #afafaf;
1619 border-bottom: 1px solid #afafaf;
1621 color: #515151;
1620 color: #515151;
1622 font-weight: 700;
1621 font-weight: 700;
1623 margin: 0 0 0 4px;
1622 margin: 0 0 0 4px;
1624 padding: 6px;
1623 padding: 6px;
1625 }
1624 }
1626
1625
1627 #content div.box div.pagination-wh a:hover, #content div.box div.pagination-wh a:active {
1626 #content div.box div.pagination-wh a:hover, #content div.box div.pagination-wh a:active {
1628 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1627 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1629 border-top: 1px solid #ccc;
1628 border-top: 1px solid #ccc;
1630 border-left: 1px solid #bebebe;
1629 border-left: 1px solid #bebebe;
1631 border-right: 1px solid #b1b1b1;
1630 border-right: 1px solid #b1b1b1;
1632 border-bottom: 1px solid #afafaf;
1631 border-bottom: 1px solid #afafaf;
1633 text-decoration: none;
1632 text-decoration: none;
1634 }
1633 }
1635
1634
1636 #content div.box div.traffic div.legend {
1635 #content div.box div.traffic div.legend {
1637 clear: both;
1636 clear: both;
1638 overflow: hidden;
1637 overflow: hidden;
1639 border-bottom: 1px solid #ddd;
1638 border-bottom: 1px solid #ddd;
1640 margin: 0 0 10px;
1639 margin: 0 0 10px;
1641 padding: 0 0 10px;
1640 padding: 0 0 10px;
1642 }
1641 }
1643
1642
1644 #content div.box div.traffic div.legend h6 {
1643 #content div.box div.traffic div.legend h6 {
1645 float: left;
1644 float: left;
1646 border: none;
1645 border: none;
1647 margin: 0;
1646 margin: 0;
1648 padding: 0;
1647 padding: 0;
1649 }
1648 }
1650
1649
1651 #content div.box div.traffic div.legend li {
1650 #content div.box div.traffic div.legend li {
1652 list-style: none;
1651 list-style: none;
1653 float: left;
1652 float: left;
1654 font-size: 11px;
1653 font-size: 11px;
1655 margin: 0;
1654 margin: 0;
1656 padding: 0 8px 0 4px;
1655 padding: 0 8px 0 4px;
1657 }
1656 }
1658
1657
1659 #content div.box div.traffic div.legend li.visits {
1658 #content div.box div.traffic div.legend li.visits {
1660 border-left: 12px solid #edc240;
1659 border-left: 12px solid #edc240;
1661 }
1660 }
1662
1661
1663 #content div.box div.traffic div.legend li.pageviews {
1662 #content div.box div.traffic div.legend li.pageviews {
1664 border-left: 12px solid #afd8f8;
1663 border-left: 12px solid #afd8f8;
1665 }
1664 }
1666
1665
1667 #content div.box div.traffic table {
1666 #content div.box div.traffic table {
1668 width: auto;
1667 width: auto;
1669 }
1668 }
1670
1669
1671 #content div.box div.traffic table td {
1670 #content div.box div.traffic table td {
1672 background: transparent;
1671 background: transparent;
1673 border: none;
1672 border: none;
1674 padding: 2px 3px 3px;
1673 padding: 2px 3px 3px;
1675 }
1674 }
1676
1675
1677 #content div.box div.traffic table td.legendLabel {
1676 #content div.box div.traffic table td.legendLabel {
1678 padding: 0 3px 2px;
1677 padding: 0 3px 2px;
1679 }
1678 }
1680
1679
1681 #content div.box #summary {
1680 #content div.box #summary {
1682 margin-right: 200px;
1681 margin-right: 200px;
1683 }
1682 }
1684
1683
1685 #summary-menu-stats {
1684 #summary-menu-stats {
1686 float: left;
1685 float: left;
1687 width: 180px;
1686 width: 180px;
1688 position: absolute;
1687 position: absolute;
1689 top: 0;
1688 top: 0;
1690 right: 0;
1689 right: 0;
1691 }
1690 }
1692
1691
1693 #summary-menu-stats ul {
1692 #summary-menu-stats ul {
1694 margin: 0 10px;
1693 margin: 0 10px;
1695 display: block;
1694 display: block;
1696 background-color: #f9f9f9;
1695 background-color: #f9f9f9;
1697 border: 1px solid #d1d1d1;
1696 border: 1px solid #d1d1d1;
1698 border-radius: 4px;
1697 border-radius: 4px;
1699 }
1698 }
1700
1699
1701 #content #summary-menu-stats li {
1700 #content #summary-menu-stats li {
1702 border-top: 1px solid #d1d1d1;
1701 border-top: 1px solid #d1d1d1;
1703 padding: 0;
1702 padding: 0;
1704 }
1703 }
1705
1704
1706 #content #summary-menu-stats li:hover {
1705 #content #summary-menu-stats li:hover {
1707 background: #f0f0f0;
1706 background: #f0f0f0;
1708 }
1707 }
1709
1708
1710 #content #summary-menu-stats li:first-child {
1709 #content #summary-menu-stats li:first-child {
1711 border-top: none;
1710 border-top: none;
1712 }
1711 }
1713
1712
1714 #summary-menu-stats a.followers { background-image: url('../images/icons/heart.png')}
1713 #summary-menu-stats a.followers { background-image: url('../images/icons/heart.png')}
1715 #summary-menu-stats a.forks { background-image: url('../images/icons/arrow_divide.png')}
1714 #summary-menu-stats a.forks { background-image: url('../images/icons/arrow_divide.png')}
1716 #summary-menu-stats a.settings { background-image: url('../images/icons/cog_edit.png')}
1715 #summary-menu-stats a.settings { background-image: url('../images/icons/cog_edit.png')}
1717 #summary-menu-stats a.feed { background-image: url('../images/icons/rss_16.png')}
1716 #summary-menu-stats a.feed { background-image: url('../images/icons/rss_16.png')}
1718 #summary-menu-stats a.repo-size { background-image: url('../images/icons/server.png')}
1717 #summary-menu-stats a.repo-size { background-image: url('../images/icons/server.png')}
1719
1718
1720 #summary-menu-stats a {
1719 #summary-menu-stats a {
1721 display: block;
1720 display: block;
1722 padding: 12px 30px;
1721 padding: 12px 30px;
1723 background-repeat: no-repeat;
1722 background-repeat: no-repeat;
1724 background-position: 10px 50%;
1723 background-position: 10px 50%;
1725 padding-right: 10px;
1724 padding-right: 10px;
1726 }
1725 }
1727
1726
1728
1729 #repo_size_2 {
1727 #repo_size_2 {
1730 margin-left: 30px;
1728 margin-left: 30px;
1731 display: block;
1729 display: block;
1732 padding-right: 10px;
1730 padding-right: 10px;
1733 padding-bottom: 7px;
1731 padding-bottom: 7px;
1734 }
1732 }
1735
1733
1736 #summary-menu-stats a:hover {
1734 #summary-menu-stats a:hover {
1737 text-decoration: none;
1735 text-decoration: none;
1738 }
1736 }
1739
1737
1740 #summary-menu-stats a span {
1738 #summary-menu-stats a span {
1741 background-color: #DEDEDE;
1739 background-color: #DEDEDE;
1742 color: 888 !important;
1740 color: 888 !important;
1743 border-radius: 4px;
1741 border-radius: 4px;
1744 padding: 2px 4px;
1742 padding: 2px 4px;
1745 font-size: 10px;
1743 font-size: 10px;
1746 }
1744 }
1747
1745
1748 #summary .metatag {
1746 #summary .metatag {
1749 display: inline-block;
1747 display: inline-block;
1750 padding: 3px 5px;
1748 padding: 3px 5px;
1751 margin-bottom: 3px;
1749 margin-bottom: 3px;
1752 margin-right: 1px;
1750 margin-right: 1px;
1753 border-radius: 5px;
1751 border-radius: 5px;
1754 }
1752 }
1755
1753
1756 #content div.box #summary p {
1754 #content div.box #summary p {
1757 margin-bottom: -5px;
1755 margin-bottom: -5px;
1758 width: 600px;
1756 width: 600px;
1759 white-space: pre-wrap;
1757 white-space: pre-wrap;
1760 }
1758 }
1761
1759
1762 #content div.box #summary p:last-child {
1760 #content div.box #summary p:last-child {
1763 margin-bottom: 9px;
1761 margin-bottom: 9px;
1764 }
1762 }
1765
1763
1766 #content div.box #summary p:first-of-type {
1764 #content div.box #summary p:first-of-type {
1767 margin-top: 9px;
1765 margin-top: 9px;
1768 }
1766 }
1769
1767
1770 .metatag {
1768 .metatag {
1771 display: inline-block;
1769 display: inline-block;
1772 margin-right: 1px;
1770 margin-right: 1px;
1773 -webkit-border-radius: 4px 4px 4px 4px;
1771 -webkit-border-radius: 4px 4px 4px 4px;
1774 -khtml-border-radius: 4px 4px 4px 4px;
1772 -khtml-border-radius: 4px 4px 4px 4px;
1775 border-radius: 4px 4px 4px 4px;
1773 border-radius: 4px 4px 4px 4px;
1776
1774
1777 border: solid 1px #9CF;
1775 border: solid 1px #9CF;
1778 padding: 2px 3px 2px 3px !important;
1776 padding: 2px 3px 2px 3px !important;
1779 background-color: #DEF;
1777 background-color: #DEF;
1780 }
1778 }
1781
1779
1782 .metatag[tag="dead"] {
1780 .metatag[tag="dead"] {
1783 background-color: #E44;
1781 background-color: #E44;
1784 }
1782 }
1785
1783
1786 .metatag[tag="stale"] {
1784 .metatag[tag="stale"] {
1787 background-color: #EA4;
1785 background-color: #EA4;
1788 }
1786 }
1789
1787
1790 .metatag[tag="featured"] {
1788 .metatag[tag="featured"] {
1791 background-color: #AEA;
1789 background-color: #AEA;
1792 }
1790 }
1793
1791
1794 .metatag[tag="requires"] {
1792 .metatag[tag="requires"] {
1795 background-color: #9CF;
1793 background-color: #9CF;
1796 }
1794 }
1797
1795
1798 .metatag[tag="recommends"] {
1796 .metatag[tag="recommends"] {
1799 background-color: #BDF;
1797 background-color: #BDF;
1800 }
1798 }
1801
1799
1802 .metatag[tag="lang"] {
1800 .metatag[tag="lang"] {
1803 background-color: #FAF474;
1801 background-color: #FAF474;
1804 }
1802 }
1805
1803
1806 .metatag[tag="license"] {
1804 .metatag[tag="license"] {
1807 border: solid 1px #9CF;
1805 border: solid 1px #9CF;
1808 background-color: #DEF;
1806 background-color: #DEF;
1809 target-new: tab !important;
1807 target-new: tab !important;
1810 }
1808 }
1811 .metatag[tag="see"] {
1809 .metatag[tag="see"] {
1812 border: solid 1px #CBD;
1810 border: solid 1px #CBD;
1813 background-color: #EDF;
1811 background-color: #EDF;
1814 }
1812 }
1815
1813
1816 a.metatag[tag="license"]:hover {
1814 a.metatag[tag="license"]:hover {
1817 background-color: #003367;
1815 background-color: #003367;
1818 color: #FFF;
1816 color: #FFF;
1819 text-decoration: none;
1817 text-decoration: none;
1820 }
1818 }
1821
1819
1822 #summary .desc {
1820 #summary .desc {
1823 white-space: pre;
1821 white-space: pre;
1824 width: 100%;
1822 width: 100%;
1825 }
1823 }
1826
1824
1827 #summary .repo_name {
1825 #summary .repo_name {
1828 font-size: 1.6em;
1826 font-size: 1.6em;
1829 font-weight: bold;
1827 font-weight: bold;
1830 vertical-align: baseline;
1828 vertical-align: baseline;
1831 clear: right
1829 clear: right
1832 }
1830 }
1833
1831
1834 #footer {
1832 #footer {
1835 clear: both;
1833 clear: both;
1836 overflow: hidden;
1834 overflow: hidden;
1837 text-align: right;
1835 text-align: right;
1838 margin: 0;
1836 margin: 0;
1839 padding: 0 10px 4px;
1837 padding: 0 10px 4px;
1840 margin: -10px 0 0;
1838 margin: -10px 0 0;
1841 }
1839 }
1842
1840
1843 #footer div#footer-inner {
1841 #footer div#footer-inner {
1844 background-color: #003B76;
1842 background-color: #003B76;
1845 background-repeat: repeat-x;
1843 background-repeat: repeat-x;
1846 background-image: -khtml-gradient( linear, left top, left bottom, from(#003B76), to(#00376E));
1844 background-image: -khtml-gradient( linear, left top, left bottom, from(#003B76), to(#00376E));
1847 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1845 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1848 background-image: -ms-linear-gradient( top, #003b76, #00376e);
1846 background-image: -ms-linear-gradient( top, #003b76, #00376e);
1849 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1847 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1850 background-image: -webkit-linear-gradient( top, #003b76, #00376e));
1848 background-image: -webkit-linear-gradient( top, #003b76, #00376e));
1851 background-image: -o-linear-gradient( top, #003b76, #00376e));
1849 background-image: -o-linear-gradient( top, #003b76, #00376e));
1852 background-image: linear-gradient(to bottom, #003b76, #00376e);
1850 background-image: linear-gradient(to bottom, #003b76, #00376e);
1853 filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#003b76', endColorstr = '#00376e', GradientType = 0);
1851 filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#003b76', endColorstr = '#00376e', GradientType = 0);
1854 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1852 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1855 -webkit-border-radius: 4px 4px 4px 4px;
1853 -webkit-border-radius: 4px 4px 4px 4px;
1856 -khtml-border-radius: 4px 4px 4px 4px;
1854 -khtml-border-radius: 4px 4px 4px 4px;
1857 border-radius: 4px 4px 4px 4px;
1855 border-radius: 4px 4px 4px 4px;
1858 }
1856 }
1859
1857
1860 #footer div#footer-inner p {
1858 #footer div#footer-inner p {
1861 padding: 15px 25px 15px 0;
1859 padding: 15px 25px 15px 0;
1862 color: #FFF;
1860 color: #FFF;
1863 font-weight: 700;
1861 font-weight: 700;
1864 }
1862 }
1865
1863
1866 #footer div#footer-inner .footer-link {
1864 #footer div#footer-inner .footer-link {
1867 float: left;
1865 float: left;
1868 padding-left: 10px;
1866 padding-left: 10px;
1869 }
1867 }
1870
1868
1871 #footer div#footer-inner .footer-link a, #footer div#footer-inner .footer-link-right a {
1869 #footer div#footer-inner .footer-link a, #footer div#footer-inner .footer-link-right a {
1872 color: #FFF;
1870 color: #FFF;
1873 }
1871 }
1874
1872
1875 #login div.title {
1873 #login div.title {
1876 clear: both;
1874 clear: both;
1877 overflow: hidden;
1875 overflow: hidden;
1878 position: relative;
1876 position: relative;
1879 background-color: #003B76;
1877 background-color: #003B76;
1880 background-repeat: repeat-x;
1878 background-repeat: repeat-x;
1881 background-image: -khtml-gradient( linear, left top, left bottom, from(#003B76), to(#00376E));
1879 background-image: -khtml-gradient( linear, left top, left bottom, from(#003B76), to(#00376E));
1882 background-image: -moz-linear-gradient( top, #003b76, #00376e);
1880 background-image: -moz-linear-gradient( top, #003b76, #00376e);
1883 background-image: -ms-linear-gradient( top, #003b76, #00376e);
1881 background-image: -ms-linear-gradient( top, #003b76, #00376e);
1884 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1882 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1885 background-image: -webkit-linear-gradient( top, #003b76, #00376e));
1883 background-image: -webkit-linear-gradient( top, #003b76, #00376e));
1886 background-image: -o-linear-gradient( top, #003b76, #00376e));
1884 background-image: -o-linear-gradient( top, #003b76, #00376e));
1887 background-image: linear-gradient(to bottom, #003b76, #00376e);
1885 background-image: linear-gradient(to bottom, #003b76, #00376e);
1888 filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#003b76', endColorstr = '#00376e', GradientType = 0);
1886 filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#003b76', endColorstr = '#00376e', GradientType = 0);
1889 margin: 0 auto;
1887 margin: 0 auto;
1890 padding: 0;
1888 padding: 0;
1891 }
1889 }
1892
1890
1893 #login div.inner {
1891 #login div.inner {
1894 background: #FFF url("../images/login.png") no-repeat top left;
1892 background: #FFF url("../images/login.png") no-repeat top left;
1895 border-top: none;
1893 border-top: none;
1896 border-bottom: none;
1894 border-bottom: none;
1897 margin: 0 auto;
1895 margin: 0 auto;
1898 padding: 20px;
1896 padding: 20px;
1899 }
1897 }
1900
1898
1901 #login div.form div.fields div.field div.label {
1899 #login div.form div.fields div.field div.label {
1902 width: 173px;
1900 width: 173px;
1903 float: left;
1901 float: left;
1904 text-align: right;
1902 text-align: right;
1905 margin: 2px 10px 0 0;
1903 margin: 2px 10px 0 0;
1906 padding: 5px 0 0 5px;
1904 padding: 5px 0 0 5px;
1907 }
1905 }
1908
1906
1909 #login div.form div.fields div.field div.input input {
1907 #login div.form div.fields div.field div.input input {
1910 background: #FFF;
1908 background: #FFF;
1911 border-top: 1px solid #b3b3b3;
1909 border-top: 1px solid #b3b3b3;
1912 border-left: 1px solid #b3b3b3;
1910 border-left: 1px solid #b3b3b3;
1913 border-right: 1px solid #eaeaea;
1911 border-right: 1px solid #eaeaea;
1914 border-bottom: 1px solid #eaeaea;
1912 border-bottom: 1px solid #eaeaea;
1915 color: #000;
1913 color: #000;
1916 font-size: 11px;
1914 font-size: 11px;
1917 margin: 0;
1915 margin: 0;
1918 padding: 7px 7px 6px;
1916 padding: 7px 7px 6px;
1919 }
1917 }
1920
1918
1921 #login div.form div.fields div.buttons {
1919 #login div.form div.fields div.buttons {
1922 clear: both;
1920 clear: both;
1923 overflow: hidden;
1921 overflow: hidden;
1924 border-top: 1px solid #DDD;
1922 border-top: 1px solid #DDD;
1925 text-align: right;
1923 text-align: right;
1926 margin: 0;
1924 margin: 0;
1927 padding: 10px 0 0;
1925 padding: 10px 0 0;
1928 }
1926 }
1929
1927
1930 #login div.form div.links {
1928 #login div.form div.links {
1931 clear: both;
1929 clear: both;
1932 overflow: hidden;
1930 overflow: hidden;
1933 margin: 10px 0 0;
1931 margin: 10px 0 0;
1934 padding: 0 0 2px;
1932 padding: 0 0 2px;
1935 }
1933 }
1936
1934
1937 .user-menu {
1935 .user-menu {
1938 margin: 0px !important;
1936 margin: 0px !important;
1939 float: left;
1937 float: left;
1940 }
1938 }
1941
1939
1942 .user-menu .container {
1940 .user-menu .container {
1943 padding: 0px 4px 0px 4px;
1941 padding: 0px 4px 0px 4px;
1944 margin: 0px 0px 0px 0px;
1942 margin: 0px 0px 0px 0px;
1945 }
1943 }
1946
1944
1947 .user-menu .gravatar {
1945 .user-menu .gravatar {
1948 margin: 0px 0px 0px 0px;
1946 margin: 0px 0px 0px 0px;
1949 cursor: pointer;
1947 cursor: pointer;
1950 }
1948 }
1951 .user-menu .gravatar.enabled {
1949 .user-menu .gravatar.enabled {
1952 background-color: #FDF784 !important;
1950 background-color: #FDF784 !important;
1953 }
1951 }
1954 .user-menu .gravatar:hover {
1952 .user-menu .gravatar:hover {
1955 background-color: #FDF784 !important;
1953 background-color: #FDF784 !important;
1956 }
1954 }
1957 #quick_login {
1955 #quick_login {
1958 min-height: 80px;
1956 min-height: 80px;
1959 padding: 4px;
1957 padding: 4px;
1960 position: absolute;
1958 position: absolute;
1961 right: 0;
1959 right: 0;
1962 background-color: #003B76;
1960 background-color: #003B76;
1963 background-repeat: repeat-x;
1961 background-repeat: repeat-x;
1964 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
1962 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
1965 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1963 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1966 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1964 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1967 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1965 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1968 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1966 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1969 background-image: -o-linear-gradient(top, #003b76, #00376e);
1967 background-image: -o-linear-gradient(top, #003b76, #00376e);
1970 background-image: linear-gradient(to bottom, #003b76, #00376e);
1968 background-image: linear-gradient(to bottom, #003b76, #00376e);
1971 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
1969 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
1972
1970
1973 z-index: 999;
1971 z-index: 999;
1974 -webkit-border-radius: 0px 0px 4px 4px;
1972 -webkit-border-radius: 0px 0px 4px 4px;
1975 -khtml-border-radius: 0px 0px 4px 4px;
1973 -khtml-border-radius: 0px 0px 4px 4px;
1976 border-radius: 0px 0px 4px 4px;
1974 border-radius: 0px 0px 4px 4px;
1977 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1975 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1978
1976
1979 overflow: hidden;
1977 overflow: hidden;
1980 }
1978 }
1981 #quick_login h4 {
1979 #quick_login h4 {
1982 color: #fff;
1980 color: #fff;
1983 padding: 5px 0px 5px 14px;
1981 padding: 5px 0px 5px 14px;
1984 }
1982 }
1985
1983
1986 #quick_login .password_forgoten {
1984 #quick_login .password_forgoten {
1987 padding-right: 0px;
1985 padding-right: 0px;
1988 padding-top: 0px;
1986 padding-top: 0px;
1989 text-align: left;
1987 text-align: left;
1990 }
1988 }
1991
1989
1992 #quick_login .password_forgoten a {
1990 #quick_login .password_forgoten a {
1993 font-size: 10px;
1991 font-size: 10px;
1994 color: #fff;
1992 color: #fff;
1995 padding: 0px !important;
1993 padding: 0px !important;
1996 line-height: 20px !important;
1994 line-height: 20px !important;
1997 }
1995 }
1998
1996
1999 #quick_login .register {
1997 #quick_login .register {
2000 padding-right: 10px;
1998 padding-right: 10px;
2001 padding-top: 5px;
1999 padding-top: 5px;
2002 text-align: left;
2000 text-align: left;
2003 }
2001 }
2004
2002
2005 #quick_login .register a {
2003 #quick_login .register a {
2006 font-size: 10px;
2004 font-size: 10px;
2007 color: #fff;
2005 color: #fff;
2008 padding: 0px !important;
2006 padding: 0px !important;
2009 line-height: 20px !important;
2007 line-height: 20px !important;
2010 }
2008 }
2011
2009
2012 #quick_login .submit {
2010 #quick_login .submit {
2013 margin: -20px 0 0 0px;
2011 margin: -20px 0 0 0px;
2014 position: absolute;
2012 position: absolute;
2015 right: 15px;
2013 right: 15px;
2016 }
2014 }
2017
2015
2018 #quick_login .links_left {
2016 #quick_login .links_left {
2019 float: left;
2017 float: left;
2020 margin-right: 120px;
2018 margin-right: 120px;
2021 }
2019 }
2022 #quick_login .links_right {
2020 #quick_login .links_right {
2023 width: 120px;
2021 width: 120px;
2024 position: absolute;
2022 position: absolute;
2025 right: 0;
2023 right: 0;
2026 }
2024 }
2027 #quick_login .full_name {
2025 #quick_login .full_name {
2028 color: #FFFFFF;
2026 color: #FFFFFF;
2029 font-weight: bold;
2027 font-weight: bold;
2030 padding: 3px 3px 3px 6px;
2028 padding: 3px 3px 3px 6px;
2031 }
2029 }
2032 #quick_login .big_gravatar {
2030 #quick_login .big_gravatar {
2033 padding: 4px 0px 0px 6px;
2031 padding: 4px 0px 0px 6px;
2034 }
2032 }
2035 #quick_login .notifications {
2033 #quick_login .notifications {
2036 padding: 2px 0px 0px 6px;
2034 padding: 2px 0px 0px 6px;
2037 color: #FFFFFF;
2035 color: #FFFFFF;
2038 font-weight: bold;
2036 font-weight: bold;
2039 line-height: 10px !important;
2037 line-height: 10px !important;
2040 }
2038 }
2041 #quick_login .notifications a,
2039 #quick_login .notifications a,
2042 #quick_login .unread a {
2040 #quick_login .unread a {
2043 color: #FFFFFF;
2041 color: #FFFFFF;
2044 display: block;
2042 display: block;
2045 padding: 0px !important;
2043 padding: 0px !important;
2046 }
2044 }
2047 #quick_login .notifications a:hover,
2045 #quick_login .notifications a:hover,
2048 #quick_login .unread a:hover {
2046 #quick_login .unread a:hover {
2049 background-color: inherit !important;
2047 background-color: inherit !important;
2050 }
2048 }
2051 #quick_login .email, #quick_login .unread {
2049 #quick_login .email, #quick_login .unread {
2052 color: #FFFFFF;
2050 color: #FFFFFF;
2053 padding: 3px 3px 3px 6px;
2051 padding: 3px 3px 3px 6px;
2054 }
2052 }
2055 #quick_login .links .logout {
2053 #quick_login .links .logout {
2056 }
2054 }
2057
2055
2058 #quick_login div.form div.fields {
2056 #quick_login div.form div.fields {
2059 padding-top: 2px;
2057 padding-top: 2px;
2060 padding-left: 10px;
2058 padding-left: 10px;
2061 }
2059 }
2062
2060
2063 #quick_login div.form div.fields div.field {
2061 #quick_login div.form div.fields div.field {
2064 padding: 5px;
2062 padding: 5px;
2065 }
2063 }
2066
2064
2067 #quick_login div.form div.fields div.field div.label label {
2065 #quick_login div.form div.fields div.field div.label label {
2068 color: #fff;
2066 color: #fff;
2069 padding-bottom: 3px;
2067 padding-bottom: 3px;
2070 }
2068 }
2071
2069
2072 #quick_login div.form div.fields div.field div.input input {
2070 #quick_login div.form div.fields div.field div.input input {
2073 width: 236px;
2071 width: 236px;
2074 background: #FFF;
2072 background: #FFF;
2075 border-top: 1px solid #b3b3b3;
2073 border-top: 1px solid #b3b3b3;
2076 border-left: 1px solid #b3b3b3;
2074 border-left: 1px solid #b3b3b3;
2077 border-right: 1px solid #eaeaea;
2075 border-right: 1px solid #eaeaea;
2078 border-bottom: 1px solid #eaeaea;
2076 border-bottom: 1px solid #eaeaea;
2079 color: #000;
2077 color: #000;
2080 font-size: 11px;
2078 font-size: 11px;
2081 margin: 0;
2079 margin: 0;
2082 padding: 5px 7px 4px;
2080 padding: 5px 7px 4px;
2083 }
2081 }
2084
2082
2085 #quick_login div.form div.fields div.buttons {
2083 #quick_login div.form div.fields div.buttons {
2086 clear: both;
2084 clear: both;
2087 overflow: hidden;
2085 overflow: hidden;
2088 text-align: right;
2086 text-align: right;
2089 margin: 0;
2087 margin: 0;
2090 padding: 5px 14px 0px 5px;
2088 padding: 5px 14px 0px 5px;
2091 }
2089 }
2092
2090
2093 #quick_login div.form div.links {
2091 #quick_login div.form div.links {
2094 clear: both;
2092 clear: both;
2095 overflow: hidden;
2093 overflow: hidden;
2096 margin: 10px 0 0;
2094 margin: 10px 0 0;
2097 padding: 0 0 2px;
2095 padding: 0 0 2px;
2098 }
2096 }
2099
2097
2100 #quick_login ol.links {
2098 #quick_login ol.links {
2101 display: block;
2099 display: block;
2102 font-weight: bold;
2100 font-weight: bold;
2103 list-style: none outside none;
2101 list-style: none outside none;
2104 text-align: right;
2102 text-align: right;
2105 }
2103 }
2106 #quick_login ol.links li {
2104 #quick_login ol.links li {
2107 line-height: 27px;
2105 line-height: 27px;
2108 margin: 0;
2106 margin: 0;
2109 padding: 0;
2107 padding: 0;
2110 color: #fff;
2108 color: #fff;
2111 display: block;
2109 display: block;
2112 float: none !important;
2110 float: none !important;
2113 }
2111 }
2114
2112
2115 #quick_login ol.links li a {
2113 #quick_login ol.links li a {
2116 color: #fff;
2114 color: #fff;
2117 display: block;
2115 display: block;
2118 padding: 2px;
2116 padding: 2px;
2119 }
2117 }
2120 #quick_login ol.links li a:HOVER {
2118 #quick_login ol.links li a:HOVER {
2121 background-color: inherit !important;
2119 background-color: inherit !important;
2122 }
2120 }
2123
2121
2124 #register div.title {
2122 #register div.title {
2125 clear: both;
2123 clear: both;
2126 overflow: hidden;
2124 overflow: hidden;
2127 position: relative;
2125 position: relative;
2128 background-color: #003B76;
2126 background-color: #003B76;
2129 background-repeat: repeat-x;
2127 background-repeat: repeat-x;
2130 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
2128 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
2131 background-image: -moz-linear-gradient(top, #003b76, #00376e);
2129 background-image: -moz-linear-gradient(top, #003b76, #00376e);
2132 background-image: -ms-linear-gradient(top, #003b76, #00376e);
2130 background-image: -ms-linear-gradient(top, #003b76, #00376e);
2133 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
2131 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
2134 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
2132 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
2135 background-image: -o-linear-gradient(top, #003b76, #00376e);
2133 background-image: -o-linear-gradient(top, #003b76, #00376e);
2136 background-image: linear-gradient(to bottom, #003b76, #00376e);
2134 background-image: linear-gradient(to bottom, #003b76, #00376e);
2137 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
2135 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
2138 endColorstr='#00376e', GradientType=0 );
2136 endColorstr='#00376e', GradientType=0 );
2139 margin: 0 auto;
2137 margin: 0 auto;
2140 padding: 0;
2138 padding: 0;
2141 }
2139 }
2142
2140
2143 #register div.inner {
2141 #register div.inner {
2144 background: #FFF;
2142 background: #FFF;
2145 border-top: none;
2143 border-top: none;
2146 border-bottom: none;
2144 border-bottom: none;
2147 margin: 0 auto;
2145 margin: 0 auto;
2148 padding: 20px;
2146 padding: 20px;
2149 }
2147 }
2150
2148
2151 #register div.form div.fields div.field div.label {
2149 #register div.form div.fields div.field div.label {
2152 width: 135px;
2150 width: 135px;
2153 float: left;
2151 float: left;
2154 text-align: right;
2152 text-align: right;
2155 margin: 2px 10px 0 0;
2153 margin: 2px 10px 0 0;
2156 padding: 5px 0 0 5px;
2154 padding: 5px 0 0 5px;
2157 }
2155 }
2158
2156
2159 #register div.form div.fields div.field div.input input {
2157 #register div.form div.fields div.field div.input input {
2160 width: 300px;
2158 width: 300px;
2161 background: #FFF;
2159 background: #FFF;
2162 border-top: 1px solid #b3b3b3;
2160 border-top: 1px solid #b3b3b3;
2163 border-left: 1px solid #b3b3b3;
2161 border-left: 1px solid #b3b3b3;
2164 border-right: 1px solid #eaeaea;
2162 border-right: 1px solid #eaeaea;
2165 border-bottom: 1px solid #eaeaea;
2163 border-bottom: 1px solid #eaeaea;
2166 color: #000;
2164 color: #000;
2167 font-size: 11px;
2165 font-size: 11px;
2168 margin: 0;
2166 margin: 0;
2169 padding: 7px 7px 6px;
2167 padding: 7px 7px 6px;
2170 }
2168 }
2171
2169
2172 #register div.form div.fields div.buttons {
2170 #register div.form div.fields div.buttons {
2173 clear: both;
2171 clear: both;
2174 overflow: hidden;
2172 overflow: hidden;
2175 border-top: 1px solid #DDD;
2173 border-top: 1px solid #DDD;
2176 text-align: left;
2174 text-align: left;
2177 margin: 0;
2175 margin: 0;
2178 padding: 10px 0 0 150px;
2176 padding: 10px 0 0 150px;
2179 }
2177 }
2180
2178
2181 #register div.form div.activation_msg {
2179 #register div.form div.activation_msg {
2182 padding-top: 4px;
2180 padding-top: 4px;
2183 padding-bottom: 4px;
2181 padding-bottom: 4px;
2184 }
2182 }
2185
2183
2186 #journal .journal_day {
2184 #journal .journal_day {
2187 font-size: 20px;
2185 font-size: 20px;
2188 padding: 10px 0px;
2186 padding: 10px 0px;
2189 border-bottom: 2px solid #DDD;
2187 border-bottom: 2px solid #DDD;
2190 margin-left: 10px;
2188 margin-left: 10px;
2191 margin-right: 10px;
2189 margin-right: 10px;
2192 }
2190 }
2193
2191
2194 #journal .journal_container {
2192 #journal .journal_container {
2195 padding: 5px;
2193 padding: 5px;
2196 clear: both;
2194 clear: both;
2197 margin: 0px 5px 0px 10px;
2195 margin: 0px 5px 0px 10px;
2198 }
2196 }
2199
2197
2200 #journal .journal_action_container {
2198 #journal .journal_action_container {
2201 padding-left: 38px;
2199 padding-left: 38px;
2202 }
2200 }
2203
2201
2204 #journal .journal_user {
2202 #journal .journal_user {
2205 color: #747474;
2203 color: #747474;
2206 font-size: 14px;
2204 font-size: 14px;
2207 font-weight: bold;
2205 font-weight: bold;
2208 height: 30px;
2206 height: 30px;
2209 }
2207 }
2210
2208
2211 #journal .journal_user.deleted {
2209 #journal .journal_user.deleted {
2212 color: #747474;
2210 color: #747474;
2213 font-size: 14px;
2211 font-size: 14px;
2214 font-weight: normal;
2212 font-weight: normal;
2215 height: 30px;
2213 height: 30px;
2216 font-style: italic;
2214 font-style: italic;
2217 }
2215 }
2218
2216
2219
2217
2220 #journal .journal_icon {
2218 #journal .journal_icon {
2221 clear: both;
2219 clear: both;
2222 float: left;
2220 float: left;
2223 padding-right: 4px;
2221 padding-right: 4px;
2224 padding-top: 3px;
2222 padding-top: 3px;
2225 }
2223 }
2226
2224
2227 #journal .journal_action {
2225 #journal .journal_action {
2228 padding-top: 4px;
2226 padding-top: 4px;
2229 min-height: 2px;
2227 min-height: 2px;
2230 float: left
2228 float: left
2231 }
2229 }
2232
2230
2233 #journal .journal_action_params {
2231 #journal .journal_action_params {
2234 clear: left;
2232 clear: left;
2235 padding-left: 22px;
2233 padding-left: 22px;
2236 }
2234 }
2237
2235
2238 #journal .journal_repo {
2236 #journal .journal_repo {
2239 float: left;
2237 float: left;
2240 margin-left: 6px;
2238 margin-left: 6px;
2241 padding-top: 3px;
2239 padding-top: 3px;
2242 }
2240 }
2243
2241
2244 #journal .date {
2242 #journal .date {
2245 clear: both;
2243 clear: both;
2246 color: #777777;
2244 color: #777777;
2247 font-size: 11px;
2245 font-size: 11px;
2248 padding-left: 22px;
2246 padding-left: 22px;
2249 }
2247 }
2250
2248
2251 #journal .journal_repo .journal_repo_name {
2249 #journal .journal_repo .journal_repo_name {
2252 font-weight: bold;
2250 font-weight: bold;
2253 font-size: 1.1em;
2251 font-size: 1.1em;
2254 }
2252 }
2255
2253
2256 #journal .compare_view {
2254 #journal .compare_view {
2257 padding: 5px 0px 5px 0px;
2255 padding: 5px 0px 5px 0px;
2258 width: 95px;
2256 width: 95px;
2259 }
2257 }
2260
2258
2261 .journal_highlight {
2259 .journal_highlight {
2262 font-weight: bold;
2260 font-weight: bold;
2263 padding: 0 2px;
2261 padding: 0 2px;
2264 vertical-align: bottom;
2262 vertical-align: bottom;
2265 }
2263 }
2266
2264
2267 .trending_language_tbl, .trending_language_tbl td {
2265 .trending_language_tbl, .trending_language_tbl td {
2268 border: 0 !important;
2266 border: 0 !important;
2269 margin: 0 !important;
2267 margin: 0 !important;
2270 padding: 0 !important;
2268 padding: 0 !important;
2271 }
2269 }
2272
2270
2273 .trending_language_tbl, .trending_language_tbl tr {
2271 .trending_language_tbl, .trending_language_tbl tr {
2274 border-spacing: 1px;
2272 border-spacing: 1px;
2275 }
2273 }
2276
2274
2277 .trending_language {
2275 .trending_language {
2278 background-color: #003367;
2276 background-color: #003367;
2279 color: #FFF;
2277 color: #FFF;
2280 display: block;
2278 display: block;
2281 min-width: 20px;
2279 min-width: 20px;
2282 text-decoration: none;
2280 text-decoration: none;
2283 height: 12px;
2281 height: 12px;
2284 margin-bottom: 0px;
2282 margin-bottom: 0px;
2285 margin-left: 5px;
2283 margin-left: 5px;
2286 white-space: pre;
2284 white-space: pre;
2287 padding: 3px;
2285 padding: 3px;
2288 }
2286 }
2289
2287
2290 h3.files_location {
2288 h3.files_location {
2291 font-size: 1.8em;
2289 font-size: 1.8em;
2292 font-weight: 700;
2290 font-weight: 700;
2293 border-bottom: none !important;
2291 border-bottom: none !important;
2294 margin: 10px 0 !important;
2292 margin: 10px 0 !important;
2295 }
2293 }
2296
2294
2297 #files_data dl dt {
2295 #files_data dl dt {
2298 float: left;
2296 float: left;
2299 width: 60px;
2297 width: 60px;
2300 margin: 0 !important;
2298 margin: 0 !important;
2301 padding: 5px;
2299 padding: 5px;
2302 }
2300 }
2303
2301
2304 #files_data dl dd {
2302 #files_data dl dd {
2305 margin: 0 !important;
2303 margin: 0 !important;
2306 padding: 5px !important;
2304 padding: 5px !important;
2307 }
2305 }
2308
2306
2309 .file_history {
2307 .file_history {
2310 padding-top: 10px;
2308 padding-top: 10px;
2311 font-size: 16px;
2309 font-size: 16px;
2312 }
2310 }
2313 .file_author {
2311 .file_author {
2314 float: left;
2312 float: left;
2315 }
2313 }
2316
2314
2317 .file_author .item {
2315 .file_author .item {
2318 float: left;
2316 float: left;
2319 padding: 5px;
2317 padding: 5px;
2320 color: #888;
2318 color: #888;
2321 }
2319 }
2322
2320
2323 .tablerow0 {
2321 .tablerow0 {
2324 background-color: #F8F8F8;
2322 background-color: #F8F8F8;
2325 }
2323 }
2326
2324
2327 .tablerow1 {
2325 .tablerow1 {
2328 background-color: #FFFFFF;
2326 background-color: #FFFFFF;
2329 }
2327 }
2330
2328
2331 .changeset_id {
2329 .changeset_id {
2332 color: #666666;
2330 color: #666666;
2333 margin-right: -3px;
2331 margin-right: -3px;
2334 }
2332 }
2335
2333
2336 .changeset_hash {
2334 .changeset_hash {
2337 color: #000000;
2335 color: #000000;
2338 }
2336 }
2339
2337
2340 #changeset_content {
2338 #changeset_content {
2341 border-left: 1px solid #CCC;
2339 border-left: 1px solid #CCC;
2342 border-right: 1px solid #CCC;
2340 border-right: 1px solid #CCC;
2343 border-bottom: 1px solid #CCC;
2341 border-bottom: 1px solid #CCC;
2344 padding: 5px;
2342 padding: 5px;
2345 }
2343 }
2346
2344
2347 #changeset_compare_view_content {
2345 #changeset_compare_view_content {
2348 border: 1px solid #CCC;
2346 border: 1px solid #CCC;
2349 padding: 5px;
2347 padding: 5px;
2350 }
2348 }
2351
2349
2352 #changeset_content .container {
2350 #changeset_content .container {
2353 min-height: 100px;
2351 min-height: 100px;
2354 font-size: 1.2em;
2352 font-size: 1.2em;
2355 overflow: hidden;
2353 overflow: hidden;
2356 }
2354 }
2357
2355
2358 #changeset_compare_view_content .compare_view_commits {
2356 #changeset_compare_view_content .compare_view_commits {
2359 width: auto !important;
2357 width: auto !important;
2360 }
2358 }
2361
2359
2362 #changeset_compare_view_content .compare_view_commits td {
2360 #changeset_compare_view_content .compare_view_commits td {
2363 padding: 0px 0px 0px 12px !important;
2361 padding: 0px 0px 0px 12px !important;
2364 }
2362 }
2365
2363
2366 #changeset_content .container .right {
2364 #changeset_content .container .right {
2367 float: right;
2365 float: right;
2368 width: 20%;
2366 width: 20%;
2369 text-align: right;
2367 text-align: right;
2370 }
2368 }
2371
2369
2372 #changeset_content .container .message {
2370 #changeset_content .container .message {
2373 white-space: pre-wrap;
2371 white-space: pre-wrap;
2374 }
2372 }
2375 #changeset_content .container .message a:hover {
2373 #changeset_content .container .message a:hover {
2376 text-decoration: none;
2374 text-decoration: none;
2377 }
2375 }
2378 .cs_files .cur_cs {
2376 .cs_files .cur_cs {
2379 margin: 10px 2px;
2377 margin: 10px 2px;
2380 font-weight: bold;
2378 font-weight: bold;
2381 }
2379 }
2382
2380
2383 .cs_files .node {
2381 .cs_files .node {
2384 float: left;
2382 float: left;
2385 }
2383 }
2386
2384
2387 .cs_files .changes {
2385 .cs_files .changes {
2388 float: right;
2386 float: right;
2389 color: #003367;
2387 color: #003367;
2390 }
2388 }
2391
2389
2392 .cs_files .changes .added {
2390 .cs_files .changes .added {
2393 background-color: #BBFFBB;
2391 background-color: #BBFFBB;
2394 float: left;
2392 float: left;
2395 text-align: center;
2393 text-align: center;
2396 font-size: 9px;
2394 font-size: 9px;
2397 padding: 2px 0px 2px 0px;
2395 padding: 2px 0px 2px 0px;
2398 }
2396 }
2399
2397
2400 .cs_files .changes .deleted {
2398 .cs_files .changes .deleted {
2401 background-color: #FF8888;
2399 background-color: #FF8888;
2402 float: left;
2400 float: left;
2403 text-align: center;
2401 text-align: center;
2404 font-size: 9px;
2402 font-size: 9px;
2405 padding: 2px 0px 2px 0px;
2403 padding: 2px 0px 2px 0px;
2406 }
2404 }
2407 /*new binary*/
2405 /*new binary*/
2408 .cs_files .changes .bin1 {
2406 .cs_files .changes .bin1 {
2409 background-color: #BBFFBB;
2407 background-color: #BBFFBB;
2410 float: left;
2408 float: left;
2411 text-align: center;
2409 text-align: center;
2412 font-size: 9px;
2410 font-size: 9px;
2413 padding: 2px 0px 2px 0px;
2411 padding: 2px 0px 2px 0px;
2414 }
2412 }
2415
2413
2416 /*deleted binary*/
2414 /*deleted binary*/
2417 .cs_files .changes .bin2 {
2415 .cs_files .changes .bin2 {
2418 background-color: #FF8888;
2416 background-color: #FF8888;
2419 float: left;
2417 float: left;
2420 text-align: center;
2418 text-align: center;
2421 font-size: 9px;
2419 font-size: 9px;
2422 padding: 2px 0px 2px 0px;
2420 padding: 2px 0px 2px 0px;
2423 }
2421 }
2424
2422
2425 /*mod binary*/
2423 /*mod binary*/
2426 .cs_files .changes .bin3 {
2424 .cs_files .changes .bin3 {
2427 background-color: #DDDDDD;
2425 background-color: #DDDDDD;
2428 float: left;
2426 float: left;
2429 text-align: center;
2427 text-align: center;
2430 font-size: 9px;
2428 font-size: 9px;
2431 padding: 2px 0px 2px 0px;
2429 padding: 2px 0px 2px 0px;
2432 }
2430 }
2433
2431
2434 /*rename file*/
2432 /*rename file*/
2435 .cs_files .changes .bin4 {
2433 .cs_files .changes .bin4 {
2436 background-color: #6D99FF;
2434 background-color: #6D99FF;
2437 float: left;
2435 float: left;
2438 text-align: center;
2436 text-align: center;
2439 font-size: 9px;
2437 font-size: 9px;
2440 padding: 2px 0px 2px 0px;
2438 padding: 2px 0px 2px 0px;
2441 }
2439 }
2442
2440
2443
2441
2444 .cs_files .cs_added, .cs_files .cs_A {
2442 .cs_files .cs_added, .cs_files .cs_A {
2445 background: url("../images/icons/page_white_add.png") no-repeat scroll
2443 background: url("../images/icons/page_white_add.png") no-repeat scroll
2446 3px;
2444 3px;
2447 height: 16px;
2445 height: 16px;
2448 padding-left: 20px;
2446 padding-left: 20px;
2449 margin-top: 7px;
2447 margin-top: 7px;
2450 text-align: left;
2448 text-align: left;
2451 }
2449 }
2452
2450
2453 .cs_files .cs_changed, .cs_files .cs_M {
2451 .cs_files .cs_changed, .cs_files .cs_M {
2454 background: url("../images/icons/page_white_edit.png") no-repeat scroll
2452 background: url("../images/icons/page_white_edit.png") no-repeat scroll
2455 3px;
2453 3px;
2456 height: 16px;
2454 height: 16px;
2457 padding-left: 20px;
2455 padding-left: 20px;
2458 margin-top: 7px;
2456 margin-top: 7px;
2459 text-align: left;
2457 text-align: left;
2460 }
2458 }
2461
2459
2462 .cs_files .cs_removed, .cs_files .cs_D {
2460 .cs_files .cs_removed, .cs_files .cs_D {
2463 background: url("../images/icons/page_white_delete.png") no-repeat
2461 background: url("../images/icons/page_white_delete.png") no-repeat
2464 scroll 3px;
2462 scroll 3px;
2465 height: 16px;
2463 height: 16px;
2466 padding-left: 20px;
2464 padding-left: 20px;
2467 margin-top: 7px;
2465 margin-top: 7px;
2468 text-align: left;
2466 text-align: left;
2469 }
2467 }
2470
2468
2471 .table {
2469 .table {
2472 position: relative;
2470 position: relative;
2473 }
2471 }
2474
2472
2475 #graph {
2473 #graph {
2476 position: relative;
2474 position: relative;
2477 overflow: hidden;
2475 overflow: hidden;
2478 }
2476 }
2479
2477
2480 #graph_nodes {
2478 #graph_nodes {
2481 position: absolute;
2479 position: absolute;
2482 }
2480 }
2483
2481
2484 #graph_content,
2482 #graph_content,
2485 #graph .info_box,
2483 #graph .info_box,
2486 #graph .container_header {
2484 #graph .container_header {
2487 margin-left: 100px;
2485 margin-left: 100px;
2488 }
2486 }
2489
2487
2490 #graph_content {
2488 #graph_content {
2491 position: relative;
2489 position: relative;
2492 }
2490 }
2493
2491
2494 #graph .container_header {
2492 #graph .container_header {
2495 padding: 10px;
2493 padding: 10px;
2496 height: 25px;
2494 height: 25px;
2497 }
2495 }
2498
2496
2499 #graph_content #rev_range_container {
2497 #graph_content #rev_range_container {
2500 float: left;
2498 float: left;
2501 margin: 0px 0px 0px 3px;
2499 margin: 0px 0px 0px 3px;
2502 }
2500 }
2503
2501
2504 #graph_content #rev_range_clear {
2502 #graph_content #rev_range_clear {
2505 float: left;
2503 float: left;
2506 margin: 0px 0px 0px 3px;
2504 margin: 0px 0px 0px 3px;
2507 }
2505 }
2508
2506
2509 #graph_content #changesets {
2507 #graph_content #changesets {
2510 table-layout: fixed;
2508 table-layout: fixed;
2511 border-collapse: collapse;
2509 border-collapse: collapse;
2512 border-left: none;
2510 border-left: none;
2513 border-right: none;
2511 border-right: none;
2514 border-color: #cdcdcd;
2512 border-color: #cdcdcd;
2515 }
2513 }
2516
2514
2517 #graph_content .container {
2518
2519 }
2520
2521 #graph_content #changesets td {
2515 #graph_content #changesets td {
2522 overflow: hidden;
2516 overflow: hidden;
2523 text-overflow: ellipsis;
2517 text-overflow: ellipsis;
2524 white-space: nowrap;
2518 white-space: nowrap;
2525 height: 31px;
2519 height: 31px;
2526 border-color: #cdcdcd;
2520 border-color: #cdcdcd;
2527 text-align: left;
2521 text-align: left;
2528 }
2522 }
2529
2523
2530 #graph_content .container .author {
2524 #graph_content .container .author {
2531 width: 105px;
2525 width: 105px;
2532 }
2526 }
2533
2527
2534 #graph_content .container .hash {
2528 #graph_content .container .hash {
2535 width: 100px;
2529 width: 100px;
2536 font-size: 0.85em;
2530 font-size: 0.85em;
2537 }
2531 }
2538
2532
2539 #graph_content #changesets .container .date {
2533 #graph_content #changesets .container .date {
2540 width: 76px;
2534 width: 76px;
2541 color: #666;
2535 color: #666;
2542 font-size: 10px;
2536 font-size: 10px;
2543 }
2537 }
2544
2538
2545 #graph_content #changesets .container .right {
2539 #graph_content #changesets .container .right {
2546 width: 120px;
2540 width: 120px;
2547 padding-right: 0px;
2541 padding-right: 0px;
2548 overflow: visible;
2542 overflow: visible;
2549 position: relative;
2543 position: relative;
2550 }
2544 }
2551
2545
2552 #graph_content .container .mid {
2546 #graph_content .container .mid {
2553 padding: 0;
2547 padding: 0;
2554 }
2548 }
2555
2549
2556 #graph_content .log-container {
2550 #graph_content .log-container {
2557 position: relative;
2551 position: relative;
2558 }
2552 }
2559
2553
2560 #graph_content #changesets td.checkbox {
2554 #graph_content #changesets td.checkbox {
2561 width: 20px;
2555 width: 20px;
2562 }
2556 }
2563
2557
2564 #graph_content .container .changeset_range {
2558 #graph_content .container .changeset_range {
2565 float: left;
2559 float: left;
2566 margin: 6px 3px;
2560 margin: 6px 3px;
2567 }
2561 }
2568
2562
2569 #graph_content .container .author img {
2563 #graph_content .container .author img {
2570 vertical-align: middle;
2564 vertical-align: middle;
2571 }
2565 }
2572
2566
2573 #graph_content .container .author .user {
2567 #graph_content .container .author .user {
2574 color: #444444;
2568 color: #444444;
2575 }
2569 }
2576
2570
2577 #graph_content .container .mid .message {
2571 #graph_content .container .mid .message {
2578 white-space: pre-wrap;
2572 white-space: pre-wrap;
2579 padding: 0;
2573 padding: 0;
2580 overflow: hidden;
2574 overflow: hidden;
2581 height: 1.1em;
2575 height: 1.1em;
2582 }
2576 }
2583
2577
2584 #graph_content .container .extra-container {
2578 #graph_content .container .extra-container {
2585 display: block;
2579 display: block;
2586 position: absolute;
2580 position: absolute;
2587 top: -15px;
2581 top: -15px;
2588 right: 0;
2582 right: 0;
2589 padding-left: 5px;
2583 padding-left: 5px;
2590 background: #FFFFFF;
2584 background: #FFFFFF;
2591 height: 41px;
2585 height: 41px;
2592 }
2586 }
2593
2587
2594 #graph_content .comments-container,
2588 #graph_content .comments-container,
2595 #graph_content .logtags {
2589 #graph_content .logtags {
2596 display: block;
2590 display: block;
2597 float: left;
2591 float: left;
2598 overflow: hidden;
2592 overflow: hidden;
2599 padding: 0;
2593 padding: 0;
2600 margin: 0;
2594 margin: 0;
2601 }
2595 }
2602
2596
2603 #graph_content .comments-container {
2597 #graph_content .comments-container {
2604 margin: 0.8em 0;
2598 margin: 0.8em 0;
2605 margin-right: 0.5em;
2599 margin-right: 0.5em;
2606 }
2600 }
2607
2601
2608 #graph_content .tagcontainer {
2602 #graph_content .tagcontainer {
2609 width: 80px;
2603 width: 80px;
2610 position: relative;
2604 position: relative;
2611 float: right;
2605 float: right;
2612 height: 100%;
2606 height: 100%;
2613 top: 7px;
2607 top: 7px;
2614 margin-left: 0.5em;
2608 margin-left: 0.5em;
2615 }
2609 }
2616
2610
2617 #graph_content .logtags {
2611 #graph_content .logtags {
2618 min-width: 80px;
2612 min-width: 80px;
2619 height: 1.1em;
2613 height: 1.1em;
2620 position: absolute;
2614 position: absolute;
2621 left: 0px;
2615 left: 0px;
2622 width: auto;
2616 width: auto;
2623 top: 0px;
2617 top: 0px;
2624 }
2618 }
2625
2619
2626 #graph_content .logtags.tags {
2620 #graph_content .logtags.tags {
2627 top: 14px;
2621 top: 14px;
2628 }
2622 }
2629
2623
2630 #graph_content .logtags:hover {
2624 #graph_content .logtags:hover {
2631 overflow: visible;
2625 overflow: visible;
2632 position: absolute;
2626 position: absolute;
2633 width: auto;
2627 width: auto;
2634 right: 0;
2628 right: 0;
2635 left: initial;
2629 left: initial;
2636 }
2630 }
2637
2631
2638 #graph_content .logtags .bookbook,
2632 #graph_content .logtags .bookbook,
2639 #graph_content .logtags .tagtag {
2633 #graph_content .logtags .tagtag {
2640 float: left;
2634 float: left;
2641 line-height: 1em;
2635 line-height: 1em;
2642 margin-bottom: 1px;
2636 margin-bottom: 1px;
2643 margin-right: 1px;
2637 margin-right: 1px;
2644 padding: 1px 3px;
2638 padding: 1px 3px;
2645 font-size: 10px;
2639 font-size: 10px;
2646 }
2640 }
2647
2641
2648 #graph_content .container .mid .message a:hover {
2642 #graph_content .container .mid .message a:hover {
2649 text-decoration: none;
2643 text-decoration: none;
2650 }
2644 }
2651
2645
2652 .revision-link {
2646 .revision-link {
2653 color: #3F6F9F;
2647 color: #3F6F9F;
2654 font-weight: bold !important;
2648 font-weight: bold !important;
2655 }
2649 }
2656
2650
2657 .issue-tracker-link {
2651 .issue-tracker-link {
2658 color: #3F6F9F;
2652 color: #3F6F9F;
2659 font-weight: bold !important;
2653 font-weight: bold !important;
2660 }
2654 }
2661
2655
2662 .changeset-status-container {
2656 .changeset-status-container {
2663 padding-right: 5px;
2657 padding-right: 5px;
2664 margin-top: 1px;
2658 margin-top: 1px;
2665 float: right;
2659 float: right;
2666 height: 14px;
2660 height: 14px;
2667 }
2661 }
2668 .code-header .changeset-status-container {
2662 .code-header .changeset-status-container {
2669 float: left;
2663 float: left;
2670 padding: 2px 0px 0px 2px;
2664 padding: 2px 0px 0px 2px;
2671 }
2665 }
2672 .changeset-status-container .changeset-status-lbl {
2666 .changeset-status-container .changeset-status-lbl {
2673 color: rgb(136, 136, 136);
2667 color: rgb(136, 136, 136);
2674 float: left;
2668 float: left;
2675 padding: 3px 4px 0px 0px
2669 padding: 3px 4px 0px 0px
2676 }
2670 }
2677 .code-header .changeset-status-container .changeset-status-lbl {
2671 .code-header .changeset-status-container .changeset-status-lbl {
2678 float: left;
2672 float: left;
2679 padding: 0px 4px 0px 0px;
2673 padding: 0px 4px 0px 0px;
2680 }
2674 }
2681 .changeset-status-container .changeset-status-ico {
2675 .changeset-status-container .changeset-status-ico {
2682 float: left;
2676 float: left;
2683 }
2677 }
2684 .code-header .changeset-status-container .changeset-status-ico, .container .changeset-status-ico {
2678 .code-header .changeset-status-container .changeset-status-ico, .container .changeset-status-ico {
2685 float: left;
2679 float: left;
2686 }
2680 }
2687
2681
2688 #graph_content .comments-cnt {
2682 #graph_content .comments-cnt {
2689 color: rgb(136, 136, 136);
2683 color: rgb(136, 136, 136);
2690 padding: 5px 0;
2684 padding: 5px 0;
2691 }
2685 }
2692
2686
2693 #graph_content .comments-cnt a {
2687 #graph_content .comments-cnt a {
2694 background-image: url('../images/icons/comments.png');
2688 background-image: url('../images/icons/comments.png');
2695 background-repeat: no-repeat;
2689 background-repeat: no-repeat;
2696 background-position: 100% 50%;
2690 background-position: 100% 50%;
2697 padding: 5px 0;
2691 padding: 5px 0;
2698 padding-right: 20px;
2692 padding-right: 20px;
2699 }
2693 }
2700
2694
2701 .right .changes {
2695 .right .changes {
2702 clear: both;
2696 clear: both;
2703 }
2697 }
2704
2698
2705 .right .changes .changed_total {
2699 .right .changes .changed_total {
2706 display: block;
2700 display: block;
2707 float: right;
2701 float: right;
2708 text-align: center;
2702 text-align: center;
2709 min-width: 45px;
2703 min-width: 45px;
2710 cursor: pointer;
2704 cursor: pointer;
2711 color: #444444;
2705 color: #444444;
2712 background: #FEA;
2706 background: #FEA;
2713 -webkit-border-radius: 0px 0px 0px 6px;
2707 -webkit-border-radius: 0px 0px 0px 6px;
2714 border-radius: 0px 0px 0px 6px;
2708 border-radius: 0px 0px 0px 6px;
2715 padding: 1px;
2709 padding: 1px;
2716 }
2710 }
2717
2711
2718 .right .changes .added, .changed, .removed {
2712 .right .changes .added, .changed, .removed {
2719 display: block;
2713 display: block;
2720 padding: 1px;
2714 padding: 1px;
2721 color: #444444;
2715 color: #444444;
2722 float: right;
2716 float: right;
2723 text-align: center;
2717 text-align: center;
2724 min-width: 15px;
2718 min-width: 15px;
2725 }
2719 }
2726
2720
2727 .right .changes .added {
2721 .right .changes .added {
2728 background: #CFC;
2722 background: #CFC;
2729 }
2723 }
2730
2724
2731 .right .changes .changed {
2725 .right .changes .changed {
2732 background: #FEA;
2726 background: #FEA;
2733 }
2727 }
2734
2728
2735 .right .changes .removed {
2729 .right .changes .removed {
2736 background: #FAA;
2730 background: #FAA;
2737 }
2731 }
2738
2732
2739 .right .merge {
2733 .right .merge {
2740 padding: 1px 3px 1px 3px;
2734 padding: 1px 3px 1px 3px;
2741 background-color: #fca062;
2735 background-color: #fca062;
2742 font-size: 10px;
2736 font-size: 10px;
2743 color: #ffffff;
2737 color: #ffffff;
2744 text-transform: uppercase;
2738 text-transform: uppercase;
2745 white-space: nowrap;
2739 white-space: nowrap;
2746 -webkit-border-radius: 3px;
2740 -webkit-border-radius: 3px;
2747 border-radius: 3px;
2741 border-radius: 3px;
2748 margin-right: 2px;
2742 margin-right: 2px;
2749 }
2743 }
2750
2744
2751 .right .parent {
2745 .right .parent {
2752 color: #666666;
2746 color: #666666;
2753 clear: both;
2747 clear: both;
2754 }
2748 }
2755 .right .logtags {
2749 .right .logtags {
2756 line-height: 2.2em;
2750 line-height: 2.2em;
2757 }
2751 }
2758 .branchtag, .logtags .tagtag, .logtags .booktag {
2752 .branchtag, .logtags .tagtag, .logtags .booktag {
2759 margin: 0px 2px;
2753 margin: 0px 2px;
2760 }
2754 }
2761
2755
2762 .branchtag,
2756 .branchtag,
2763 .tagtag,
2757 .tagtag,
2764 .bookbook,
2758 .bookbook,
2765 .spantag {
2759 .spantag {
2766 padding: 1px 3px 1px 3px;
2760 padding: 1px 3px 1px 3px;
2767 font-size: 10px;
2761 font-size: 10px;
2768 color: #336699;
2762 color: #336699;
2769 white-space: nowrap;
2763 white-space: nowrap;
2770 -webkit-border-radius: 4px;
2764 -webkit-border-radius: 4px;
2771 border-radius: 4px;
2765 border-radius: 4px;
2772 border: 1px solid #d9e8f8;
2766 border: 1px solid #d9e8f8;
2773 line-height: 1.5em;
2767 line-height: 1.5em;
2774 }
2768 }
2775
2769
2776 #graph_content .branchtag,
2770 #graph_content .branchtag,
2777 #graph_content .tagtag,
2771 #graph_content .tagtag,
2778 #graph_content .bookbook {
2772 #graph_content .bookbook {
2779 margin: 1.1em 0;
2773 margin: 1.1em 0;
2780 margin-right: 0.5em;
2774 margin-right: 0.5em;
2781 }
2775 }
2782
2776
2783 .branchtag,
2777 .branchtag,
2784 .tagtag,
2778 .tagtag,
2785 .bookbook {
2779 .bookbook {
2786 float: left;
2780 float: left;
2787 }
2781 }
2788
2782
2789 .right .logtags .branchtag,
2783 .right .logtags .branchtag,
2790 .logtags .tagtag,
2784 .logtags .tagtag,
2791 .right .merge {
2785 .right .merge {
2792 float: right;
2786 float: right;
2793 line-height: 1em;
2787 line-height: 1em;
2794 margin: 1px 1px !important;
2788 margin: 1px 1px !important;
2795 display: block;
2789 display: block;
2796 }
2790 }
2797
2791
2798 .bookbook {
2792 .bookbook {
2799 border-color: #46A546;
2793 border-color: #46A546;
2800 color: #46A546;
2794 color: #46A546;
2801 }
2795 }
2802
2796
2803 .tagtag {
2797 .tagtag {
2804 border-color: #62cffc;
2798 border-color: #62cffc;
2805 color: #62cffc;
2799 color: #62cffc;
2806 }
2800 }
2807
2801
2808 .logtags .branchtag a:hover,
2802 .logtags .branchtag a:hover,
2809 .logtags .branchtag a,
2803 .logtags .branchtag a,
2810 .branchtag a,
2804 .branchtag a,
2811 .branchtag a:hover {
2805 .branchtag a:hover {
2812 text-decoration: none;
2806 text-decoration: none;
2813 color: inherit;
2807 color: inherit;
2814 }
2808 }
2815 .logtags .tagtag {
2809 .logtags .tagtag {
2816 padding: 1px 3px 1px 3px;
2810 padding: 1px 3px 1px 3px;
2817 background-color: #62cffc;
2811 background-color: #62cffc;
2818 font-size: 10px;
2812 font-size: 10px;
2819 color: #ffffff;
2813 color: #ffffff;
2820 white-space: nowrap;
2814 white-space: nowrap;
2821 -webkit-border-radius: 3px;
2815 -webkit-border-radius: 3px;
2822 border-radius: 3px;
2816 border-radius: 3px;
2823 }
2817 }
2824
2818
2825 .tagtag a,
2819 .tagtag a,
2826 .tagtag a:hover,
2820 .tagtag a:hover,
2827 .logtags .tagtag a,
2821 .logtags .tagtag a,
2828 .logtags .tagtag a:hover {
2822 .logtags .tagtag a:hover {
2829 text-decoration: none;
2823 text-decoration: none;
2830 color: inherit;
2824 color: inherit;
2831 }
2825 }
2832 .logbooks .bookbook, .logbooks .bookbook, .logtags .bookbook, .logtags .bookbook {
2826 .logbooks .bookbook, .logbooks .bookbook, .logtags .bookbook, .logtags .bookbook {
2833 padding: 1px 3px 1px 3px;
2827 padding: 1px 3px 1px 3px;
2834 background-color: #46A546;
2828 background-color: #46A546;
2835 font-size: 10px;
2829 font-size: 10px;
2836 color: #ffffff;
2830 color: #ffffff;
2837 white-space: nowrap;
2831 white-space: nowrap;
2838 -webkit-border-radius: 3px;
2832 -webkit-border-radius: 3px;
2839 border-radius: 3px;
2833 border-radius: 3px;
2840 }
2834 }
2841 .logbooks .bookbook, .logbooks .bookbook a, .right .logtags .bookbook, .logtags .bookbook a {
2835 .logbooks .bookbook, .logbooks .bookbook a, .right .logtags .bookbook, .logtags .bookbook a {
2842 color: #ffffff;
2836 color: #ffffff;
2843 }
2837 }
2844
2838
2845 .logbooks .bookbook, .logbooks .bookbook a:hover,
2839 .logbooks .bookbook, .logbooks .bookbook a:hover,
2846 .logtags .bookbook, .logtags .bookbook a:hover,
2840 .logtags .bookbook, .logtags .bookbook a:hover,
2847 .bookbook a,
2841 .bookbook a,
2848 .bookbook a:hover {
2842 .bookbook a:hover {
2849 text-decoration: none;
2843 text-decoration: none;
2850 color: inherit;
2844 color: inherit;
2851 }
2845 }
2852 div.browserblock {
2846 div.browserblock {
2853 overflow: hidden;
2847 overflow: hidden;
2854 border: 1px solid #ccc;
2848 border: 1px solid #ccc;
2855 background: #f8f8f8;
2849 background: #f8f8f8;
2856 font-size: 100%;
2850 font-size: 100%;
2857 line-height: 125%;
2851 line-height: 125%;
2858 padding: 0;
2852 padding: 0;
2859 -webkit-border-radius: 6px 6px 0px 0px;
2853 -webkit-border-radius: 6px 6px 0px 0px;
2860 border-radius: 6px 6px 0px 0px;
2854 border-radius: 6px 6px 0px 0px;
2861 }
2855 }
2862
2856
2863 div.browserblock .browser-header {
2857 div.browserblock .browser-header {
2864 background: #FFF;
2858 background: #FFF;
2865 padding: 10px 0px 15px 0px;
2859 padding: 10px 0px 15px 0px;
2866 width: 100%;
2860 width: 100%;
2867 }
2861 }
2868
2862
2869 div.browserblock .browser-nav {
2863 div.browserblock .browser-nav {
2870 float: left
2864 float: left
2871 }
2865 }
2872
2866
2873 div.browserblock .browser-branch {
2867 div.browserblock .browser-branch {
2874 float: left;
2868 float: left;
2875 }
2869 }
2876
2870
2877 div.browserblock .browser-branch label {
2871 div.browserblock .browser-branch label {
2878 color: #4A4A4A;
2872 color: #4A4A4A;
2879 vertical-align: text-top;
2873 vertical-align: text-top;
2880 }
2874 }
2881
2875
2882 div.browserblock .browser-header span {
2876 div.browserblock .browser-header span {
2883 margin-left: 5px;
2877 margin-left: 5px;
2884 font-weight: 700;
2878 font-weight: 700;
2885 }
2879 }
2886
2880
2887 div.browserblock .browser-search {
2881 div.browserblock .browser-search {
2888 clear: both;
2882 clear: both;
2889 padding: 8px 8px 0px 5px;
2883 padding: 8px 8px 0px 5px;
2890 height: 20px;
2884 height: 20px;
2891 }
2885 }
2892
2886
2893 div.browserblock #node_filter_box {
2887 div.browserblock #node_filter_box {
2894 }
2888 }
2895
2889
2896 div.browserblock .search_activate {
2890 div.browserblock .search_activate {
2897 float: left
2891 float: left
2898 }
2892 }
2899
2893
2900 div.browserblock .add_node {
2894 div.browserblock .add_node {
2901 float: left;
2895 float: left;
2902 padding-left: 5px;
2896 padding-left: 5px;
2903 }
2897 }
2904
2898
2905 div.browserblock .search_activate a:hover, div.browserblock .add_node a:hover {
2899 div.browserblock .search_activate a:hover, div.browserblock .add_node a:hover {
2906 text-decoration: none !important;
2900 text-decoration: none !important;
2907 }
2901 }
2908
2902
2909 div.browserblock .browser-body {
2903 div.browserblock .browser-body {
2910 background: #EEE;
2904 background: #EEE;
2911 border-top: 1px solid #CCC;
2905 border-top: 1px solid #CCC;
2912 }
2906 }
2913
2907
2914 table.code-browser {
2908 table.code-browser {
2915 border-collapse: collapse;
2909 border-collapse: collapse;
2916 width: 100%;
2910 width: 100%;
2917 }
2911 }
2918
2912
2919 table.code-browser tr {
2913 table.code-browser tr {
2920 margin: 3px;
2914 margin: 3px;
2921 }
2915 }
2922
2916
2923 table.code-browser thead th {
2917 table.code-browser thead th {
2924 background-color: #EEE;
2918 background-color: #EEE;
2925 height: 20px;
2919 height: 20px;
2926 font-size: 1.1em;
2920 font-size: 1.1em;
2927 font-weight: 700;
2921 font-weight: 700;
2928 text-align: left;
2922 text-align: left;
2929 padding-left: 10px;
2923 padding-left: 10px;
2930 }
2924 }
2931
2925
2932 table.code-browser tbody td {
2926 table.code-browser tbody td {
2933 padding-left: 10px;
2927 padding-left: 10px;
2934 height: 20px;
2928 height: 20px;
2935 }
2929 }
2936
2930
2937 table.code-browser .browser-file {
2931 table.code-browser .browser-file {
2938 background: url("../images/icons/document_16.png") no-repeat scroll 3px;
2932 background: url("../images/icons/document_16.png") no-repeat scroll 3px;
2939 height: 16px;
2933 height: 16px;
2940 padding-left: 20px;
2934 padding-left: 20px;
2941 text-align: left;
2935 text-align: left;
2942 }
2936 }
2943 .diffblock .changeset_header {
2937 .diffblock .changeset_header {
2944 height: 16px;
2938 height: 16px;
2945 }
2939 }
2946 .diffblock .changeset_file {
2940 .diffblock .changeset_file {
2947 background: url("../images/icons/file.png") no-repeat scroll 3px;
2941 background: url("../images/icons/file.png") no-repeat scroll 3px;
2948 text-align: left;
2942 text-align: left;
2949 float: left;
2943 float: left;
2950 padding: 2px 0px 2px 22px;
2944 padding: 2px 0px 2px 22px;
2951 }
2945 }
2952 .diffblock .diff-menu-wrapper {
2946 .diffblock .diff-menu-wrapper {
2953 float: left;
2947 float: left;
2954 }
2948 }
2955
2949
2956 .diffblock .diff-menu {
2950 .diffblock .diff-menu {
2957 position: absolute;
2951 position: absolute;
2958 background: none repeat scroll 0 0 #FFFFFF;
2952 background: none repeat scroll 0 0 #FFFFFF;
2959 border-color: #003367 #666666 #666666;
2953 border-color: #003367 #666666 #666666;
2960 border-right: 1px solid #666666;
2954 border-right: 1px solid #666666;
2961 border-style: solid solid solid;
2955 border-style: solid solid solid;
2962 border-width: 1px;
2956 border-width: 1px;
2963 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
2957 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
2964 margin-top: 5px;
2958 margin-top: 5px;
2965 margin-left: 1px;
2959 margin-left: 1px;
2966
2960
2967 }
2961 }
2968 .diffblock .diff-actions {
2962 .diffblock .diff-actions {
2969 padding: 2px 0px 0px 2px;
2963 padding: 2px 0px 0px 2px;
2970 float: left;
2964 float: left;
2971 }
2965 }
2972 .diffblock .diff-menu ul li {
2966 .diffblock .diff-menu ul li {
2973 padding: 0px 0px 0px 0px !important;
2967 padding: 0px 0px 0px 0px !important;
2974 }
2968 }
2975 .diffblock .diff-menu ul li a {
2969 .diffblock .diff-menu ul li a {
2976 display: block;
2970 display: block;
2977 padding: 3px 8px 3px 8px !important;
2971 padding: 3px 8px 3px 8px !important;
2978 }
2972 }
2979 .diffblock .diff-menu ul li a:hover {
2973 .diffblock .diff-menu ul li a:hover {
2980 text-decoration: none;
2974 text-decoration: none;
2981 background-color: #EEEEEE;
2975 background-color: #EEEEEE;
2982 }
2976 }
2983 table.code-browser .browser-dir {
2977 table.code-browser .browser-dir {
2984 background: url("../images/icons/folder_16.png") no-repeat scroll 3px;
2978 background: url("../images/icons/folder_16.png") no-repeat scroll 3px;
2985 height: 16px;
2979 height: 16px;
2986 padding-left: 20px;
2980 padding-left: 20px;
2987 text-align: left;
2981 text-align: left;
2988 }
2982 }
2989
2983
2990 table.code-browser .submodule-dir {
2984 table.code-browser .submodule-dir {
2991 background: url("../images/icons/disconnect.png") no-repeat scroll 3px;
2985 background: url("../images/icons/disconnect.png") no-repeat scroll 3px;
2992 height: 16px;
2986 height: 16px;
2993 padding-left: 20px;
2987 padding-left: 20px;
2994 text-align: left;
2988 text-align: left;
2995 }
2989 }
2996
2990
2997
2991
2998 .box .search {
2992 .box .search {
2999 clear: both;
2993 clear: both;
3000 overflow: hidden;
2994 overflow: hidden;
3001 margin: 0;
2995 margin: 0;
3002 padding: 0 20px 10px;
2996 padding: 0 20px 10px;
3003 }
2997 }
3004
2998
3005 .box .search div.search_path {
2999 .box .search div.search_path {
3006 background: none repeat scroll 0 0 #EEE;
3000 background: none repeat scroll 0 0 #EEE;
3007 border: 1px solid #CCC;
3001 border: 1px solid #CCC;
3008 color: blue;
3002 color: blue;
3009 margin-bottom: 10px;
3003 margin-bottom: 10px;
3010 padding: 10px 0;
3004 padding: 10px 0;
3011 }
3005 }
3012
3006
3013 .box .search div.search_path div.link {
3007 .box .search div.search_path div.link {
3014 font-weight: 700;
3008 font-weight: 700;
3015 margin-left: 25px;
3009 margin-left: 25px;
3016 }
3010 }
3017
3011
3018 .box .search div.search_path div.link a {
3012 .box .search div.search_path div.link a {
3019 color: #003367;
3013 color: #003367;
3020 cursor: pointer;
3014 cursor: pointer;
3021 text-decoration: none;
3015 text-decoration: none;
3022 }
3016 }
3023
3017
3024 #path_unlock {
3018 #path_unlock {
3025 color: red;
3019 color: red;
3026 font-size: 1.2em;
3020 font-size: 1.2em;
3027 padding-left: 4px;
3021 padding-left: 4px;
3028 }
3022 }
3029
3023
3030 .info_box span {
3024 .info_box span {
3031 margin-left: 3px;
3025 margin-left: 3px;
3032 margin-right: 3px;
3026 margin-right: 3px;
3033 }
3027 }
3034
3028
3035 .info_box .rev {
3029 .info_box .rev {
3036 color: #003367;
3030 color: #003367;
3037 font-size: 1.6em;
3031 font-size: 1.6em;
3038 font-weight: bold;
3032 font-weight: bold;
3039 vertical-align: sub;
3033 vertical-align: sub;
3040 }
3034 }
3041
3035
3042 .info_box input#at_rev, .info_box input#size {
3036 .info_box input#at_rev, .info_box input#size {
3043 background: #FFF;
3037 background: #FFF;
3044 border-top: 1px solid #b3b3b3;
3038 border-top: 1px solid #b3b3b3;
3045 border-left: 1px solid #b3b3b3;
3039 border-left: 1px solid #b3b3b3;
3046 border-right: 1px solid #eaeaea;
3040 border-right: 1px solid #eaeaea;
3047 border-bottom: 1px solid #eaeaea;
3041 border-bottom: 1px solid #eaeaea;
3048 color: #000;
3042 color: #000;
3049 font-size: 12px;
3043 font-size: 12px;
3050 margin: 0;
3044 margin: 0;
3051 padding: 1px 5px 1px;
3045 padding: 1px 5px 1px;
3052 }
3046 }
3053
3047
3054 .info_box input#view {
3048 .info_box input#view {
3055 text-align: center;
3049 text-align: center;
3056 padding: 4px 3px 2px 2px;
3050 padding: 4px 3px 2px 2px;
3057 }
3051 }
3058
3052
3059 .yui-overlay, .yui-panel-container {
3053 .yui-overlay, .yui-panel-container {
3060 visibility: hidden;
3054 visibility: hidden;
3061 position: absolute;
3055 position: absolute;
3062 z-index: 2;
3056 z-index: 2;
3063 }
3057 }
3064
3058
3065 #tip-box {
3059 #tip-box {
3066 position: absolute;
3060 position: absolute;
3067
3061
3068 background-color: #FFF;
3062 background-color: #FFF;
3069 border: 2px solid #003367;
3063 border: 2px solid #003367;
3070 font: 100% sans-serif;
3064 font: 100% sans-serif;
3071 width: auto;
3065 width: auto;
3072 opacity: 1;
3066 opacity: 1;
3073 padding: 8px;
3067 padding: 8px;
3074
3068
3075 white-space: pre-wrap;
3069 white-space: pre-wrap;
3076 -webkit-border-radius: 8px 8px 8px 8px;
3070 -webkit-border-radius: 8px 8px 8px 8px;
3077 -khtml-border-radius: 8px 8px 8px 8px;
3071 -khtml-border-radius: 8px 8px 8px 8px;
3078 border-radius: 8px 8px 8px 8px;
3072 border-radius: 8px 8px 8px 8px;
3079 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3073 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3080 -webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3074 -webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3081 }
3075 }
3082
3076
3083 .hl-tip-box {
3077 .hl-tip-box {
3084 visibility: hidden;
3078 visibility: hidden;
3085 position: absolute;
3079 position: absolute;
3086 color: #666;
3080 color: #666;
3087 background-color: #FFF;
3081 background-color: #FFF;
3088 border: 2px solid #003367;
3082 border: 2px solid #003367;
3089 font: 100% sans-serif;
3083 font: 100% sans-serif;
3090 width: auto;
3084 width: auto;
3091 opacity: 1;
3085 opacity: 1;
3092 padding: 8px;
3086 padding: 8px;
3093 white-space: pre-wrap;
3087 white-space: pre-wrap;
3094 -webkit-border-radius: 8px 8px 8px 8px;
3088 -webkit-border-radius: 8px 8px 8px 8px;
3095 -khtml-border-radius: 8px 8px 8px 8px;
3089 -khtml-border-radius: 8px 8px 8px 8px;
3096 border-radius: 8px 8px 8px 8px;
3090 border-radius: 8px 8px 8px 8px;
3097 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3091 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3098 }
3092 }
3099
3093
3100
3094
3101 .mentions-container {
3095 .mentions-container {
3102 width: 90% !important;
3096 width: 90% !important;
3103 }
3097 }
3104 .mentions-container .yui-ac-content {
3098 .mentions-container .yui-ac-content {
3105 width: 100% !important;
3099 width: 100% !important;
3106 }
3100 }
3107
3101
3108 .ac {
3102 .ac {
3109 vertical-align: top;
3103 vertical-align: top;
3110 }
3104 }
3111
3105
3112 .ac .yui-ac {
3106 .ac .yui-ac {
3113 position: inherit;
3107 position: inherit;
3114 font-size: 100%;
3108 font-size: 100%;
3115 }
3109 }
3116
3110
3117 .ac .perm_ac {
3111 .ac .perm_ac {
3118 width: 20em;
3112 width: 20em;
3119 }
3113 }
3120
3114
3121 .ac .yui-ac-input {
3115 .ac .yui-ac-input {
3122 width: 100%;
3116 width: 100%;
3123 }
3117 }
3124
3118
3125 .ac .yui-ac-container {
3119 .ac .yui-ac-container {
3126 position: absolute;
3120 position: absolute;
3127 top: 1.6em;
3121 top: 1.6em;
3128 width: auto;
3122 width: auto;
3129 }
3123 }
3130
3124
3131 .ac .yui-ac-content {
3125 .ac .yui-ac-content {
3132 position: absolute;
3126 position: absolute;
3133 border: 1px solid gray;
3127 border: 1px solid gray;
3134 background: #fff;
3128 background: #fff;
3135 z-index: 9050;
3129 z-index: 9050;
3136 }
3130 }
3137
3131
3138 .ac .yui-ac-shadow {
3132 .ac .yui-ac-shadow {
3139 position: absolute;
3133 position: absolute;
3140 width: 100%;
3134 width: 100%;
3141 background: #000;
3135 background: #000;
3142 opacity: .10;
3136 opacity: .10;
3143 filter: alpha(opacity = 10);
3137 filter: alpha(opacity = 10);
3144 z-index: 9049;
3138 z-index: 9049;
3145 margin: .3em;
3139 margin: .3em;
3146 }
3140 }
3147
3141
3148 .ac .yui-ac-content ul {
3142 .ac .yui-ac-content ul {
3149 width: 100%;
3143 width: 100%;
3150 margin: 0;
3144 margin: 0;
3151 padding: 0;
3145 padding: 0;
3152 z-index: 9050;
3146 z-index: 9050;
3153 }
3147 }
3154
3148
3155 .ac .yui-ac-content li {
3149 .ac .yui-ac-content li {
3156 cursor: default;
3150 cursor: default;
3157 white-space: nowrap;
3151 white-space: nowrap;
3158 margin: 0;
3152 margin: 0;
3159 padding: 2px 5px;
3153 padding: 2px 5px;
3160 height: 18px;
3154 height: 18px;
3161 z-index: 9050;
3155 z-index: 9050;
3162 display: block;
3156 display: block;
3163 width: auto !important;
3157 width: auto !important;
3164 }
3158 }
3165
3159
3166 .ac .yui-ac-content li .ac-container-wrap {
3160 .ac .yui-ac-content li .ac-container-wrap {
3167 width: auto;
3161 width: auto;
3168 }
3162 }
3169
3163
3170 .ac .yui-ac-content li.yui-ac-prehighlight {
3164 .ac .yui-ac-content li.yui-ac-prehighlight {
3171 background: #B3D4FF;
3165 background: #B3D4FF;
3172 z-index: 9050;
3166 z-index: 9050;
3173 }
3167 }
3174
3168
3175 .ac .yui-ac-content li.yui-ac-highlight {
3169 .ac .yui-ac-content li.yui-ac-highlight {
3176 background: #556CB5;
3170 background: #556CB5;
3177 color: #FFF;
3171 color: #FFF;
3178 z-index: 9050;
3172 z-index: 9050;
3179 }
3173 }
3180 .ac .yui-ac-bd {
3174 .ac .yui-ac-bd {
3181 z-index: 9050;
3175 z-index: 9050;
3182 }
3176 }
3183
3177
3184 .follow {
3178 .follow {
3185 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
3179 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
3186 height: 16px;
3180 height: 16px;
3187 width: 20px;
3181 width: 20px;
3188 cursor: pointer;
3182 cursor: pointer;
3189 display: block;
3183 display: block;
3190 float: right;
3184 float: right;
3191 margin-top: 2px;
3185 margin-top: 2px;
3192 }
3186 }
3193
3187
3194 .following {
3188 .following {
3195 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
3189 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
3196 height: 16px;
3190 height: 16px;
3197 width: 20px;
3191 width: 20px;
3198 cursor: pointer;
3192 cursor: pointer;
3199 display: block;
3193 display: block;
3200 float: right;
3194 float: right;
3201 margin-top: 2px;
3195 margin-top: 2px;
3202 }
3196 }
3203
3197
3204 .reposize {
3198 .reposize {
3205 background: url("../images/icons/server.png") no-repeat scroll 3px;
3199 background: url("../images/icons/server.png") no-repeat scroll 3px;
3206 height: 16px;
3200 height: 16px;
3207 width: 20px;
3201 width: 20px;
3208 cursor: pointer;
3202 cursor: pointer;
3209 display: block;
3203 display: block;
3210 float: right;
3204 float: right;
3211 margin-top: 2px;
3205 margin-top: 2px;
3212 }
3206 }
3213
3207
3214 #repo_size {
3208 #repo_size {
3215 display: block;
3209 display: block;
3216 margin-top: 4px;
3210 margin-top: 4px;
3217 color: #666;
3211 color: #666;
3218 float: right;
3212 float: right;
3219 }
3213 }
3220
3214
3221 .locking_locked {
3215 .locking_locked {
3222 background: #FFF url("../images/icons/block_16.png") no-repeat scroll 3px;
3216 background: #FFF url("../images/icons/block_16.png") no-repeat scroll 3px;
3223 height: 16px;
3217 height: 16px;
3224 width: 20px;
3218 width: 20px;
3225 cursor: pointer;
3219 cursor: pointer;
3226 display: block;
3220 display: block;
3227 float: right;
3221 float: right;
3228 margin-top: 2px;
3222 margin-top: 2px;
3229 }
3223 }
3230
3224
3231 .locking_unlocked {
3225 .locking_unlocked {
3232 background: #FFF url("../images/icons/accept.png") no-repeat scroll 3px;
3226 background: #FFF url("../images/icons/accept.png") no-repeat scroll 3px;
3233 height: 16px;
3227 height: 16px;
3234 width: 20px;
3228 width: 20px;
3235 cursor: pointer;
3229 cursor: pointer;
3236 display: block;
3230 display: block;
3237 float: right;
3231 float: right;
3238 margin-top: 2px;
3232 margin-top: 2px;
3239 }
3233 }
3240
3234
3241 .currently_following {
3235 .currently_following {
3242 padding-left: 10px;
3236 padding-left: 10px;
3243 padding-bottom: 5px;
3237 padding-bottom: 5px;
3244 }
3238 }
3245
3239
3246 .add_icon {
3240 .add_icon {
3247 background: url("../images/icons/add.png") no-repeat scroll 3px;
3241 background: url("../images/icons/add.png") no-repeat scroll 3px;
3248 padding-left: 20px;
3242 padding-left: 20px;
3249 padding-top: 0px;
3243 padding-top: 0px;
3250 text-align: left;
3244 text-align: left;
3251 }
3245 }
3252
3246
3253 .accept_icon {
3247 .accept_icon {
3254 background: url("../images/icons/accept.png") no-repeat scroll 3px;
3248 background: url("../images/icons/accept.png") no-repeat scroll 3px;
3255 padding-left: 20px;
3249 padding-left: 20px;
3256 padding-top: 0px;
3250 padding-top: 0px;
3257 text-align: left;
3251 text-align: left;
3258 }
3252 }
3259
3253
3260 .edit_icon {
3254 .edit_icon {
3261 background: url("../images/icons/application_form_edit.png") no-repeat scroll 3px;
3255 background: url("../images/icons/application_form_edit.png") no-repeat scroll 3px;
3262 padding-left: 20px;
3256 padding-left: 20px;
3263 padding-top: 0px;
3257 padding-top: 0px;
3264 text-align: left;
3258 text-align: left;
3265 }
3259 }
3266
3260
3267 .delete_icon {
3261 .delete_icon {
3268 background: url("../images/icons/delete.png") no-repeat scroll 3px;
3262 background: url("../images/icons/delete.png") no-repeat scroll 3px;
3269 padding-left: 20px;
3263 padding-left: 20px;
3270 padding-top: 0px;
3264 padding-top: 0px;
3271 text-align: left;
3265 text-align: left;
3272 }
3266 }
3273
3267
3274 .refresh_icon {
3268 .refresh_icon {
3275 background: url("../images/icons/arrow_refresh.png") no-repeat scroll
3269 background: url("../images/icons/arrow_refresh.png") no-repeat scroll
3276 3px;
3270 3px;
3277 padding-left: 20px;
3271 padding-left: 20px;
3278 padding-top: 0px;
3272 padding-top: 0px;
3279 text-align: left;
3273 text-align: left;
3280 }
3274 }
3281
3275
3282 .pull_icon {
3276 .pull_icon {
3283 background: url("../images/icons/connect.png") no-repeat scroll 3px;
3277 background: url("../images/icons/connect.png") no-repeat scroll 3px;
3284 padding-left: 20px;
3278 padding-left: 20px;
3285 padding-top: 0px;
3279 padding-top: 0px;
3286 text-align: left;
3280 text-align: left;
3287 }
3281 }
3288
3282
3289 .rss_icon {
3283 .rss_icon {
3290 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
3284 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
3291 padding-left: 20px;
3285 padding-left: 20px;
3292 padding-top: 4px;
3286 padding-top: 4px;
3293 text-align: left;
3287 text-align: left;
3294 font-size: 8px
3288 font-size: 8px
3295 }
3289 }
3296
3290
3297 .atom_icon {
3291 .atom_icon {
3298 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
3292 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
3299 padding-left: 20px;
3293 padding-left: 20px;
3300 padding-top: 4px;
3294 padding-top: 4px;
3301 text-align: left;
3295 text-align: left;
3302 font-size: 8px
3296 font-size: 8px
3303 }
3297 }
3304
3298
3305 .archive_icon {
3299 .archive_icon {
3306 background: url("../images/icons/compress.png") no-repeat scroll 3px;
3300 background: url("../images/icons/compress.png") no-repeat scroll 3px;
3307 padding-left: 20px;
3301 padding-left: 20px;
3308 text-align: left;
3302 text-align: left;
3309 padding-top: 1px;
3303 padding-top: 1px;
3310 }
3304 }
3311
3305
3312 .start_following_icon {
3306 .start_following_icon {
3313 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
3307 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
3314 padding-left: 20px;
3308 padding-left: 20px;
3315 text-align: left;
3309 text-align: left;
3316 padding-top: 0px;
3310 padding-top: 0px;
3317 }
3311 }
3318
3312
3319 .stop_following_icon {
3313 .stop_following_icon {
3320 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
3314 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
3321 padding-left: 20px;
3315 padding-left: 20px;
3322 text-align: left;
3316 text-align: left;
3323 padding-top: 0px;
3317 padding-top: 0px;
3324 }
3318 }
3325
3319
3326 .action_button {
3320 .action_button {
3327 border: 0;
3321 border: 0;
3328 display: inline;
3322 display: inline;
3329 }
3323 }
3330
3324
3331 .action_button:hover {
3325 .action_button:hover {
3332 border: 0;
3326 border: 0;
3333 text-decoration: underline;
3327 text-decoration: underline;
3334 cursor: pointer;
3328 cursor: pointer;
3335 }
3329 }
3336
3330
3337 #switch_repos {
3331 #switch_repos {
3338 position: absolute;
3332 position: absolute;
3339 height: 25px;
3333 height: 25px;
3340 z-index: 1;
3334 z-index: 1;
3341 }
3335 }
3342
3336
3343 #switch_repos select {
3337 #switch_repos select {
3344 min-width: 150px;
3338 min-width: 150px;
3345 max-height: 250px;
3339 max-height: 250px;
3346 z-index: 1;
3340 z-index: 1;
3347 }
3341 }
3348
3342
3349 .breadcrumbs {
3343 .breadcrumbs {
3350 border: medium none;
3344 border: medium none;
3351 color: #FFF;
3345 color: #FFF;
3352 float: left;
3346 float: left;
3353 font-weight: 700;
3347 font-weight: 700;
3354 font-size: 14px;
3348 font-size: 14px;
3355 margin: 0;
3349 margin: 0;
3356 padding: 11px 0 11px 10px;
3350 padding: 11px 0 11px 10px;
3357 }
3351 }
3358
3352
3359 .breadcrumbs .hash {
3353 .breadcrumbs .hash {
3360 text-transform: none;
3354 text-transform: none;
3361 color: #fff;
3355 color: #fff;
3362 }
3356 }
3363
3357
3364 .breadcrumbs a {
3358 .breadcrumbs a {
3365 color: #FFF;
3359 color: #FFF;
3366 }
3360 }
3367
3361
3368 .flash_msg {
3362 .flash_msg {
3369 }
3363 }
3370
3364
3371 .flash_msg ul {
3365 .flash_msg ul {
3372 }
3366 }
3373
3367
3374 .error_red {
3368 .error_red {
3375 color: red;
3369 color: red;
3376 }
3370 }
3377
3371
3378 .error_msg {
3372 .error_msg {
3379 background-color: #c43c35;
3373 background-color: #c43c35;
3380 background-repeat: repeat-x;
3374 background-repeat: repeat-x;
3381 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35) );
3375 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35) );
3382 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3376 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3383 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3377 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3384 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35) );
3378 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35) );
3385 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3379 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3386 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3380 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3387 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3381 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3388 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b',endColorstr='#c43c35', GradientType=0 );
3382 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b',endColorstr='#c43c35', GradientType=0 );
3389 border-color: #c43c35 #c43c35 #882a25;
3383 border-color: #c43c35 #c43c35 #882a25;
3390 }
3384 }
3391
3385
3392 .error_msg a {
3386 .error_msg a {
3393 text-decoration: underline;
3387 text-decoration: underline;
3394 }
3388 }
3395
3389
3396 .warning_msg {
3390 .warning_msg {
3397 color: #404040 !important;
3391 color: #404040 !important;
3398 background-color: #eedc94;
3392 background-color: #eedc94;
3399 background-repeat: repeat-x;
3393 background-repeat: repeat-x;
3400 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94) );
3394 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94) );
3401 background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
3395 background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
3402 background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
3396 background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
3403 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94) );
3397 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94) );
3404 background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
3398 background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
3405 background-image: -o-linear-gradient(top, #fceec1, #eedc94);
3399 background-image: -o-linear-gradient(top, #fceec1, #eedc94);
3406 background-image: linear-gradient(to bottom, #fceec1, #eedc94);
3400 background-image: linear-gradient(to bottom, #fceec1, #eedc94);
3407 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0 );
3401 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0 );
3408 border-color: #eedc94 #eedc94 #e4c652;
3402 border-color: #eedc94 #eedc94 #e4c652;
3409 }
3403 }
3410
3404
3411 .warning_msg a {
3405 .warning_msg a {
3412 text-decoration: underline;
3406 text-decoration: underline;
3413 }
3407 }
3414
3408
3415 .success_msg {
3409 .success_msg {
3416 background-color: #57a957;
3410 background-color: #57a957;
3417 background-repeat: repeat-x !important;
3411 background-repeat: repeat-x !important;
3418 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957) );
3412 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957) );
3419 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3413 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3420 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3414 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3421 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957) );
3415 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957) );
3422 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3416 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3423 background-image: -o-linear-gradient(top, #62c462, #57a957);
3417 background-image: -o-linear-gradient(top, #62c462, #57a957);
3424 background-image: linear-gradient(to bottom, #62c462, #57a957);
3418 background-image: linear-gradient(to bottom, #62c462, #57a957);
3425 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0 );
3419 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0 );
3426 border-color: #57a957 #57a957 #3d773d;
3420 border-color: #57a957 #57a957 #3d773d;
3427 }
3421 }
3428
3422
3429 .success_msg a {
3423 .success_msg a {
3430 text-decoration: underline;
3424 text-decoration: underline;
3431 color: #FFF !important;
3425 color: #FFF !important;
3432 }
3426 }
3433
3427
3434 .notice_msg {
3428 .notice_msg {
3435 background-color: #339bb9;
3429 background-color: #339bb9;
3436 background-repeat: repeat-x;
3430 background-repeat: repeat-x;
3437 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9) );
3431 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9) );
3438 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3432 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3439 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3433 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3440 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9) );
3434 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9) );
3441 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3435 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3442 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3436 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3443 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3437 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3444 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0 );
3438 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0 );
3445 border-color: #339bb9 #339bb9 #22697d;
3439 border-color: #339bb9 #339bb9 #22697d;
3446 }
3440 }
3447
3441
3448 .notice_msg a {
3442 .notice_msg a {
3449 text-decoration: underline;
3443 text-decoration: underline;
3450 }
3444 }
3451
3445
3452 .success_msg, .error_msg, .notice_msg, .warning_msg {
3446 .success_msg, .error_msg, .notice_msg, .warning_msg {
3453 font-size: 12px;
3447 font-size: 12px;
3454 font-weight: 700;
3448 font-weight: 700;
3455 min-height: 14px;
3449 min-height: 14px;
3456 line-height: 14px;
3450 line-height: 14px;
3457 margin-bottom: 10px;
3451 margin-bottom: 10px;
3458 margin-top: 0;
3452 margin-top: 0;
3459 display: block;
3453 display: block;
3460 overflow: auto;
3454 overflow: auto;
3461 padding: 6px 10px 6px 10px;
3455 padding: 6px 10px 6px 10px;
3462 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3456 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3463 position: relative;
3457 position: relative;
3464 color: #FFF;
3458 color: #FFF;
3465 border-width: 1px;
3459 border-width: 1px;
3466 border-style: solid;
3460 border-style: solid;
3467 -webkit-border-radius: 4px;
3461 -webkit-border-radius: 4px;
3468 border-radius: 4px;
3462 border-radius: 4px;
3469 -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3463 -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3470 box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3464 box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3471 }
3465 }
3472
3466
3473 #msg_close {
3467 #msg_close {
3474 background: transparent url("../icons/cross_grey_small.png") no-repeat scroll 0 0;
3468 background: transparent url("../icons/cross_grey_small.png") no-repeat scroll 0 0;
3475 cursor: pointer;
3469 cursor: pointer;
3476 height: 16px;
3470 height: 16px;
3477 position: absolute;
3471 position: absolute;
3478 right: 5px;
3472 right: 5px;
3479 top: 5px;
3473 top: 5px;
3480 width: 16px;
3474 width: 16px;
3481 }
3475 }
3482 div#legend_data {
3476 div#legend_data {
3483 padding-left: 10px;
3477 padding-left: 10px;
3484 }
3478 }
3485 div#legend_container table {
3479 div#legend_container table {
3486 border: none !important;
3480 border: none !important;
3487 }
3481 }
3488 div#legend_container table, div#legend_choices table {
3482 div#legend_container table, div#legend_choices table {
3489 width: auto !important;
3483 width: auto !important;
3490 }
3484 }
3491
3485
3492 table#permissions_manage {
3486 table#permissions_manage {
3493 width: 0 !important;
3487 width: 0 !important;
3494 }
3488 }
3495
3489
3496 table#permissions_manage span.private_repo_msg {
3490 table#permissions_manage span.private_repo_msg {
3497 font-size: 0.8em;
3491 font-size: 0.8em;
3498 opacity: 0.6;
3492 opacity: 0.6;
3499 }
3493 }
3500
3494
3501 table#permissions_manage td.private_repo_msg {
3495 table#permissions_manage td.private_repo_msg {
3502 font-size: 0.8em;
3496 font-size: 0.8em;
3503 }
3497 }
3504
3498
3505 table#permissions_manage tr#add_perm_input td {
3499 table#permissions_manage tr#add_perm_input td {
3506 vertical-align: middle;
3500 vertical-align: middle;
3507 }
3501 }
3508
3502
3509 div.gravatar {
3503 div.gravatar {
3510 background-color: #FFF;
3504 background-color: #FFF;
3511 float: left;
3505 float: left;
3512 margin-right: 0.7em;
3506 margin-right: 0.7em;
3513 padding: 1px 1px 1px 1px;
3507 padding: 1px 1px 1px 1px;
3514 line-height: 0;
3508 line-height: 0;
3515 -webkit-border-radius: 3px;
3509 -webkit-border-radius: 3px;
3516 -khtml-border-radius: 3px;
3510 -khtml-border-radius: 3px;
3517 border-radius: 3px;
3511 border-radius: 3px;
3518 }
3512 }
3519
3513
3520 div.gravatar img {
3514 div.gravatar img {
3521 -webkit-border-radius: 2px;
3515 -webkit-border-radius: 2px;
3522 -khtml-border-radius: 2px;
3516 -khtml-border-radius: 2px;
3523 border-radius: 2px;
3517 border-radius: 2px;
3524 }
3518 }
3525
3519
3526 #header, #content, #footer {
3520 #header, #content, #footer {
3527 min-width: 978px;
3521 min-width: 978px;
3528 }
3522 }
3529
3523
3530 #content {
3524 #content {
3531 clear: both;
3525 clear: both;
3532 padding: 10px 10px 14px 10px;
3526 padding: 10px 10px 14px 10px;
3533 }
3527 }
3534
3528
3535 #content.hover {
3529 #content.hover {
3536 padding: 55px 10px 14px 10px !important;
3530 padding: 55px 10px 14px 10px !important;
3537 }
3531 }
3538
3532
3539 #content div.box div.title div.search {
3533 #content div.box div.title div.search {
3540 border-left: 1px solid #316293;
3534 border-left: 1px solid #316293;
3541 }
3535 }
3542
3536
3543 #content div.box div.title div.search div.input input {
3537 #content div.box div.title div.search div.input input {
3544 border: 1px solid #316293;
3538 border: 1px solid #316293;
3545 }
3539 }
3546
3540
3547 .ui-btn {
3541 .ui-btn {
3548 color: #515151;
3542 color: #515151;
3549 background-color: #DADADA;
3543 background-color: #DADADA;
3550 background-repeat: repeat-x;
3544 background-repeat: repeat-x;
3551 background-image: -khtml-gradient(linear, left top, left bottom, from(#F4F4F4),to(#DADADA) );
3545 background-image: -khtml-gradient(linear, left top, left bottom, from(#F4F4F4),to(#DADADA) );
3552 background-image: -moz-linear-gradient(top, #F4F4F4, #DADADA);
3546 background-image: -moz-linear-gradient(top, #F4F4F4, #DADADA);
3553 background-image: -ms-linear-gradient(top, #F4F4F4, #DADADA);
3547 background-image: -ms-linear-gradient(top, #F4F4F4, #DADADA);
3554 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #F4F4F4),color-stop(100%, #DADADA) );
3548 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #F4F4F4),color-stop(100%, #DADADA) );
3555 background-image: -webkit-linear-gradient(top, #F4F4F4, #DADADA) );
3549 background-image: -webkit-linear-gradient(top, #F4F4F4, #DADADA) );
3556 background-image: -o-linear-gradient(top, #F4F4F4, #DADADA) );
3550 background-image: -o-linear-gradient(top, #F4F4F4, #DADADA) );
3557 background-image: linear-gradient(to bottom, #F4F4F4, #DADADA);
3551 background-image: linear-gradient(to bottom, #F4F4F4, #DADADA);
3558 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F4F4F4', endColorstr='#DADADA', GradientType=0);
3552 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F4F4F4', endColorstr='#DADADA', GradientType=0);
3559
3553
3560 border-top: 1px solid #DDD;
3554 border-top: 1px solid #DDD;
3561 border-left: 1px solid #c6c6c6;
3555 border-left: 1px solid #c6c6c6;
3562 border-right: 1px solid #DDD;
3556 border-right: 1px solid #DDD;
3563 border-bottom: 1px solid #c6c6c6;
3557 border-bottom: 1px solid #c6c6c6;
3564 color: #515151;
3558 color: #515151;
3565 outline: none;
3559 outline: none;
3566 margin: 0px 3px 3px 0px;
3560 margin: 0px 3px 3px 0px;
3567 -webkit-border-radius: 4px 4px 4px 4px !important;
3561 -webkit-border-radius: 4px 4px 4px 4px !important;
3568 -khtml-border-radius: 4px 4px 4px 4px !important;
3562 -khtml-border-radius: 4px 4px 4px 4px !important;
3569 border-radius: 4px 4px 4px 4px !important;
3563 border-radius: 4px 4px 4px 4px !important;
3570 cursor: pointer !important;
3564 cursor: pointer !important;
3571 padding: 3px 3px 3px 3px;
3565 padding: 3px 3px 3px 3px;
3572 background-position: 0 -15px;
3566 background-position: 0 -15px;
3573
3567
3574 }
3568 }
3575
3569
3576 .ui-btn.disabled {
3570 .ui-btn.disabled {
3577 color: #999;
3571 color: #999;
3578 }
3572 }
3579
3573
3580 .ui-btn.xsmall {
3574 .ui-btn.xsmall {
3581 padding: 1px 2px 1px 1px;
3575 padding: 1px 2px 1px 1px;
3582 }
3576 }
3583
3577
3584 .ui-btn.large {
3578 .ui-btn.large {
3585 padding: 6px 12px;
3579 padding: 6px 12px;
3586 }
3580 }
3587
3581
3588 .ui-btn.clone {
3582 .ui-btn.clone {
3589 padding: 5px 2px 6px 1px;
3583 padding: 5px 2px 6px 1px;
3590 margin: 0px 0px 3px -4px;
3584 margin: 0px 0px 3px -4px;
3591 -webkit-border-radius: 0px 4px 4px 0px !important;
3585 -webkit-border-radius: 0px 4px 4px 0px !important;
3592 -khtml-border-radius: 0px 4px 4px 0px !important;
3586 -khtml-border-radius: 0px 4px 4px 0px !important;
3593 border-radius: 0px 4px 4px 0px !important;
3587 border-radius: 0px 4px 4px 0px !important;
3594 width: 100px;
3588 width: 100px;
3595 text-align: center;
3589 text-align: center;
3596 display: inline-block;
3590 display: inline-block;
3597 position: relative;
3591 position: relative;
3598 top: -2px;
3592 top: -2px;
3599 }
3593 }
3600 .ui-btn:focus {
3594 .ui-btn:focus {
3601 outline: none;
3595 outline: none;
3602 }
3596 }
3603 .ui-btn:hover {
3597 .ui-btn:hover {
3604 background-position: 0 -15px;
3598 background-position: 0 -15px;
3605 text-decoration: none;
3599 text-decoration: none;
3606 color: #515151;
3600 color: #515151;
3607 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 0 3px #FFFFFF !important;
3601 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 0 3px #FFFFFF !important;
3608 }
3602 }
3609
3603
3610 .ui-btn.disabled:hover {
3604 .ui-btn.disabled:hover {
3611 background-position: 0;
3605 background-position: 0;
3612 color: #999;
3606 color: #999;
3613 text-decoration: none;
3607 text-decoration: none;
3614 box-shadow: none !important;
3608 box-shadow: none !important;
3615 }
3609 }
3616
3610
3617 .ui-btn.red {
3611 .ui-btn.red {
3618 color: #fff;
3612 color: #fff;
3619 background-color: #c43c35;
3613 background-color: #c43c35;
3620 background-repeat: repeat-x;
3614 background-repeat: repeat-x;
3621 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
3615 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
3622 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3616 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3623 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3617 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3624 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
3618 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
3625 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3619 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3626 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3620 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3627 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3621 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3628 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
3622 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
3629 border-color: #c43c35 #c43c35 #882a25;
3623 border-color: #c43c35 #c43c35 #882a25;
3630 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3624 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3631 }
3625 }
3632
3626
3633
3627
3634 .ui-btn.blue {
3628 .ui-btn.blue {
3635 color: #fff;
3629 color: #fff;
3636 background-color: #339bb9;
3630 background-color: #339bb9;
3637 background-repeat: repeat-x;
3631 background-repeat: repeat-x;
3638 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
3632 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
3639 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3633 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3640 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3634 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3641 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
3635 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
3642 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3636 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3643 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3637 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3644 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3638 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3645 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
3639 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
3646 border-color: #339bb9 #339bb9 #22697d;
3640 border-color: #339bb9 #339bb9 #22697d;
3647 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3641 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3648 }
3642 }
3649
3643
3650 .ui-btn.green {
3644 .ui-btn.green {
3651 background-color: #57a957;
3645 background-color: #57a957;
3652 background-repeat: repeat-x;
3646 background-repeat: repeat-x;
3653 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
3647 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
3654 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3648 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3655 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3649 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3656 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
3650 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
3657 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3651 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3658 background-image: -o-linear-gradient(top, #62c462, #57a957);
3652 background-image: -o-linear-gradient(top, #62c462, #57a957);
3659 background-image: linear-gradient(to bottom, #62c462, #57a957);
3653 background-image: linear-gradient(to bottom, #62c462, #57a957);
3660 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
3654 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
3661 border-color: #57a957 #57a957 #3d773d;
3655 border-color: #57a957 #57a957 #3d773d;
3662 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3656 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3663 }
3657 }
3664
3658
3665 .ui-btn.blue.hidden {
3659 .ui-btn.blue.hidden {
3666 display: none;
3660 display: none;
3667 }
3661 }
3668
3662
3669 .ui-btn.active {
3663 .ui-btn.active {
3670 font-weight: bold;
3664 font-weight: bold;
3671 }
3665 }
3672
3666
3673 ins, div.options a:hover {
3667 ins, div.options a:hover {
3674 text-decoration: none;
3668 text-decoration: none;
3675 }
3669 }
3676
3670
3677 img,
3671 img,
3678 #header #header-inner #quick li a:hover span.normal,
3672 #header #header-inner #quick li a:hover span.normal,
3679 #content div.box div.form div.fields div.field div.textarea table td table td a,
3673 #content div.box div.form div.fields div.field div.textarea table td table td a,
3680 #clone_url,
3674 #clone_url,
3681 #clone_url_id
3675 #clone_url_id
3682 {
3676 {
3683 border: none;
3677 border: none;
3684 }
3678 }
3685
3679
3686 img.icon, .right .merge img {
3680 img.icon, .right .merge img {
3687 vertical-align: bottom;
3681 vertical-align: bottom;
3688 }
3682 }
3689
3683
3690 #header ul#logged-user, #content div.box div.title ul.links,
3684 #header ul#logged-user, #content div.box div.title ul.links,
3691 #content div.box div.message div.dismiss,
3685 #content div.box div.message div.dismiss,
3692 #content div.box div.traffic div.legend ul {
3686 #content div.box div.traffic div.legend ul {
3693 float: right;
3687 float: right;
3694 margin: 0;
3688 margin: 0;
3695 padding: 0;
3689 padding: 0;
3696 }
3690 }
3697
3691
3698 #header #header-inner #home, #header #header-inner #logo,
3692 #header #header-inner #home, #header #header-inner #logo,
3699 #content div.box ul.left, #content div.box ol.left,
3693 #content div.box ul.left, #content div.box ol.left,
3700 #content div.box div.pagination-left, div#commit_history,
3694 #content div.box div.pagination-left, div#commit_history,
3701 div#legend_data, div#legend_container, div#legend_choices {
3695 div#legend_data, div#legend_container, div#legend_choices {
3702 float: left;
3696 float: left;
3703 }
3697 }
3704
3698
3705 #header #header-inner #quick li #quick_login,
3699 #header #header-inner #quick li #quick_login,
3706 #header #header-inner #quick li:hover ul ul,
3700 #header #header-inner #quick li:hover ul ul,
3707 #header #header-inner #quick li:hover ul ul ul,
3701 #header #header-inner #quick li:hover ul ul ul,
3708 #header #header-inner #quick li:hover ul ul ul ul,
3702 #header #header-inner #quick li:hover ul ul ul ul,
3709 #content #left #menu ul.closed, #content #left #menu li ul.collapsed, .yui-tt-shadow {
3703 #content #left #menu ul.closed, #content #left #menu li ul.collapsed, .yui-tt-shadow {
3710 display: none;
3704 display: none;
3711 }
3705 }
3712
3706
3713 #header #header-inner #quick li:hover #quick_login,
3707 #header #header-inner #quick li:hover #quick_login,
3714 #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 {
3708 #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 {
3715 display: block;
3709 display: block;
3716 }
3710 }
3717
3711
3718 #content div.graph {
3712 #content div.graph {
3719 padding: 0 10px 10px;
3713 padding: 0 10px 10px;
3720 }
3714 }
3721
3715
3722 #content div.box div.title ul.links li a:hover,
3716 #content div.box div.title ul.links li a:hover,
3723 #content div.box div.title ul.links li.ui-tabs-selected a {
3717 #content div.box div.title ul.links li.ui-tabs-selected a {
3724
3718
3725 background: #6388ad; /* Old browsers */
3719 background: #6388ad; /* Old browsers */
3726 background: -moz-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* FF3.6+ */
3720 background: -moz-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* FF3.6+ */
3727 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,0.1)), color-stop(100%,rgba(255,255,255,0))); /* Chrome,Safari4+ */
3721 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,0.1)), color-stop(100%,rgba(255,255,255,0))); /* Chrome,Safari4+ */
3728 background: -webkit-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* Chrome10+,Safari5.1+ */
3722 background: -webkit-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* Chrome10+,Safari5.1+ */
3729 background: -o-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* Opera 11.10+ */
3723 background: -o-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* Opera 11.10+ */
3730 background: -ms-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* IE10+ */
3724 background: -ms-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* IE10+ */
3731 background: linear-gradient(to bottom, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* W3C */
3725 background: linear-gradient(to bottom, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* W3C */
3732 /*filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#88bfe8', endColorstr='#70b0e0',GradientType=0 ); /* IE6-9 */*/
3726 /*filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#88bfe8', endColorstr='#70b0e0',GradientType=0 ); /* IE6-9 */*/
3733 }
3727 }
3734
3728
3735 #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 {
3729 #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 {
3736 margin: 10px 24px 10px 44px;
3730 margin: 10px 24px 10px 44px;
3737 }
3731 }
3738
3732
3739 #content div.box div.form, #content div.box div.table, #content div.box div.traffic {
3733 #content div.box div.form, #content div.box div.table, #content div.box div.traffic {
3740 position: relative;
3734 position: relative;
3741 clear: both;
3735 clear: both;
3742 overflow: hidden;
3736 overflow: hidden;
3743 margin: 0;
3737 margin: 0;
3744 padding: 0 20px 10px;
3738 padding: 0 20px 10px;
3745 }
3739 }
3746
3740
3747 #content div.box div.form div.fields, #login div.form, #login div.form div.fields, #register div.form, #register div.form div.fields {
3741 #content div.box div.form div.fields, #login div.form, #login div.form div.fields, #register div.form, #register div.form div.fields {
3748 clear: both;
3742 clear: both;
3749 overflow: hidden;
3743 overflow: hidden;
3750 margin: 0;
3744 margin: 0;
3751 padding: 0;
3745 padding: 0;
3752 }
3746 }
3753
3747
3754 #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 {
3748 #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 {
3755 height: 1%;
3749 height: 1%;
3756 display: block;
3750 display: block;
3757 color: #363636;
3751 color: #363636;
3758 margin: 0;
3752 margin: 0;
3759 padding: 2px 0 0;
3753 padding: 2px 0 0;
3760 }
3754 }
3761
3755
3762 #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 {
3756 #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 {
3763 background: #FBE3E4;
3757 background: #FBE3E4;
3764 border-top: 1px solid #e1b2b3;
3758 border-top: 1px solid #e1b2b3;
3765 border-left: 1px solid #e1b2b3;
3759 border-left: 1px solid #e1b2b3;
3766 border-right: 1px solid #FBC2C4;
3760 border-right: 1px solid #FBC2C4;
3767 border-bottom: 1px solid #FBC2C4;
3761 border-bottom: 1px solid #FBC2C4;
3768 }
3762 }
3769
3763
3770 #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 {
3764 #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 {
3771 background: #E6EFC2;
3765 background: #E6EFC2;
3772 border-top: 1px solid #cebb98;
3766 border-top: 1px solid #cebb98;
3773 border-left: 1px solid #cebb98;
3767 border-left: 1px solid #cebb98;
3774 border-right: 1px solid #c6d880;
3768 border-right: 1px solid #c6d880;
3775 border-bottom: 1px solid #c6d880;
3769 border-bottom: 1px solid #c6d880;
3776 }
3770 }
3777
3771
3778 #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 {
3772 #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 {
3779 margin: 0;
3773 margin: 0;
3780 }
3774 }
3781
3775
3782 #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 {
3776 #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 {
3783 margin: 0 0 0 0px !important;
3777 margin: 0 0 0 0px !important;
3784 padding: 0;
3778 padding: 0;
3785 }
3779 }
3786
3780
3787 #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 {
3781 #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 {
3788 margin: 0 0 0 200px;
3782 margin: 0 0 0 200px;
3789 padding: 0;
3783 padding: 0;
3790 }
3784 }
3791
3785
3792 #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 {
3786 #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 {
3793 color: #000;
3787 color: #000;
3794 text-decoration: none;
3788 text-decoration: none;
3795 }
3789 }
3796
3790
3797 #content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus, #content div.box div.action a.ui-selectmenu-focus {
3791 #content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus, #content div.box div.action a.ui-selectmenu-focus {
3798 border: 1px solid #666;
3792 border: 1px solid #666;
3799 }
3793 }
3800
3794
3801 #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 {
3795 #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 {
3802 clear: both;
3796 clear: both;
3803 overflow: hidden;
3797 overflow: hidden;
3804 margin: 0;
3798 margin: 0;
3805 padding: 8px 0 2px;
3799 padding: 8px 0 2px;
3806 }
3800 }
3807
3801
3808 #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 {
3802 #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 {
3809 float: left;
3803 float: left;
3810 margin: 0;
3804 margin: 0;
3811 }
3805 }
3812
3806
3813 #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 {
3807 #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 {
3814 height: 1%;
3808 height: 1%;
3815 display: block;
3809 display: block;
3816 float: left;
3810 float: left;
3817 margin: 2px 0 0 4px;
3811 margin: 2px 0 0 4px;
3818 }
3812 }
3819
3813
3820 div.form div.fields div.field div.button input,
3814 div.form div.fields div.field div.button input,
3821 #content div.box div.form div.fields div.buttons input
3815 #content div.box div.form div.fields div.buttons input
3822 div.form div.fields div.buttons input,
3816 div.form div.fields div.buttons input,
3823 #content div.box div.action div.button input {
3817 #content div.box div.action div.button input {
3824 font-size: 11px;
3818 font-size: 11px;
3825 font-weight: 700;
3819 font-weight: 700;
3826 margin: 0;
3820 margin: 0;
3827 }
3821 }
3828
3822
3829 input.ui-button {
3823 input.ui-button {
3830 background: #e5e3e3 url("../images/button.png") repeat-x;
3824 background: #e5e3e3 url("../images/button.png") repeat-x;
3831 border-top: 1px solid #DDD;
3825 border-top: 1px solid #DDD;
3832 border-left: 1px solid #c6c6c6;
3826 border-left: 1px solid #c6c6c6;
3833 border-right: 1px solid #DDD;
3827 border-right: 1px solid #DDD;
3834 border-bottom: 1px solid #c6c6c6;
3828 border-bottom: 1px solid #c6c6c6;
3835 color: #515151 !important;
3829 color: #515151 !important;
3836 outline: none;
3830 outline: none;
3837 margin: 0;
3831 margin: 0;
3838 padding: 6px 12px;
3832 padding: 6px 12px;
3839 -webkit-border-radius: 4px 4px 4px 4px;
3833 -webkit-border-radius: 4px 4px 4px 4px;
3840 -khtml-border-radius: 4px 4px 4px 4px;
3834 -khtml-border-radius: 4px 4px 4px 4px;
3841 border-radius: 4px 4px 4px 4px;
3835 border-radius: 4px 4px 4px 4px;
3842 box-shadow: 0 1px 0 #ececec;
3836 box-shadow: 0 1px 0 #ececec;
3843 cursor: pointer;
3837 cursor: pointer;
3844 }
3838 }
3845
3839
3846 input.ui-button:hover {
3840 input.ui-button:hover {
3847 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3841 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3848 border-top: 1px solid #ccc;
3842 border-top: 1px solid #ccc;
3849 border-left: 1px solid #bebebe;
3843 border-left: 1px solid #bebebe;
3850 border-right: 1px solid #b1b1b1;
3844 border-right: 1px solid #b1b1b1;
3851 border-bottom: 1px solid #afafaf;
3845 border-bottom: 1px solid #afafaf;
3852 }
3846 }
3853
3847
3854 div.form div.fields div.field div.highlight, #content div.box div.form div.fields div.buttons div.highlight {
3848 div.form div.fields div.field div.highlight, #content div.box div.form div.fields div.buttons div.highlight {
3855 display: inline;
3849 display: inline;
3856 }
3850 }
3857
3851
3858 #content div.box div.form div.fields div.buttons, div.form div.fields div.buttons {
3852 #content div.box div.form div.fields div.buttons, div.form div.fields div.buttons {
3859 margin: 10px 0 0 200px;
3853 margin: 10px 0 0 200px;
3860 padding: 0;
3854 padding: 0;
3861 }
3855 }
3862
3856
3863 #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 {
3857 #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 {
3864 margin: 10px 0 0;
3858 margin: 10px 0 0;
3865 }
3859 }
3866
3860
3867 #content div.box table td.user, #content div.box table td.address {
3861 #content div.box table td.user, #content div.box table td.address {
3868 width: 10%;
3862 width: 10%;
3869 text-align: center;
3863 text-align: center;
3870 }
3864 }
3871
3865
3872 #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 {
3866 #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 {
3873 text-align: right;
3867 text-align: right;
3874 margin: 6px 0 0;
3868 margin: 6px 0 0;
3875 padding: 0;
3869 padding: 0;
3876 }
3870 }
3877
3871
3878 #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 {
3872 #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 {
3879 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3873 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3880 border-top: 1px solid #ccc;
3874 border-top: 1px solid #ccc;
3881 border-left: 1px solid #bebebe;
3875 border-left: 1px solid #bebebe;
3882 border-right: 1px solid #b1b1b1;
3876 border-right: 1px solid #b1b1b1;
3883 border-bottom: 1px solid #afafaf;
3877 border-bottom: 1px solid #afafaf;
3884 color: #515151;
3878 color: #515151;
3885 margin: 0;
3879 margin: 0;
3886 padding: 6px 12px;
3880 padding: 6px 12px;
3887 }
3881 }
3888
3882
3889 #content div.box div.pagination div.results, #content div.box div.pagination-wh div.results {
3883 #content div.box div.pagination div.results, #content div.box div.pagination-wh div.results {
3890 text-align: left;
3884 text-align: left;
3891 float: left;
3885 float: left;
3892 margin: 0;
3886 margin: 0;
3893 padding: 0;
3887 padding: 0;
3894 }
3888 }
3895
3889
3896 #content div.box div.pagination div.results span, #content div.box div.pagination-wh div.results span {
3890 #content div.box div.pagination div.results span, #content div.box div.pagination-wh div.results span {
3897 height: 1%;
3891 height: 1%;
3898 display: block;
3892 display: block;
3899 float: left;
3893 float: left;
3900 background: #ebebeb url("../images/pager.png") repeat-x;
3894 background: #ebebeb url("../images/pager.png") repeat-x;
3901 border-top: 1px solid #dedede;
3895 border-top: 1px solid #dedede;
3902 border-left: 1px solid #cfcfcf;
3896 border-left: 1px solid #cfcfcf;
3903 border-right: 1px solid #c4c4c4;
3897 border-right: 1px solid #c4c4c4;
3904 border-bottom: 1px solid #c4c4c4;
3898 border-bottom: 1px solid #c4c4c4;
3905 color: #4A4A4A;
3899 color: #4A4A4A;
3906 font-weight: 700;
3900 font-weight: 700;
3907 margin: 0;
3901 margin: 0;
3908 padding: 6px 8px;
3902 padding: 6px 8px;
3909 }
3903 }
3910
3904
3911 #content div.box div.pagination ul.pager li.disabled, #content div.box div.pagination-wh a.disabled {
3905 #content div.box div.pagination ul.pager li.disabled, #content div.box div.pagination-wh a.disabled {
3912 color: #B4B4B4;
3906 color: #B4B4B4;
3913 padding: 6px;
3907 padding: 6px;
3914 }
3908 }
3915
3909
3916 #login, #register {
3910 #login, #register {
3917 width: 520px;
3911 width: 520px;
3918 margin: 10% auto 0;
3912 margin: 10% auto 0;
3919 padding: 0;
3913 padding: 0;
3920 }
3914 }
3921
3915
3922 #login div.color, #register div.color {
3916 #login div.color, #register div.color {
3923 clear: both;
3917 clear: both;
3924 overflow: hidden;
3918 overflow: hidden;
3925 background: #FFF;
3919 background: #FFF;
3926 margin: 10px auto 0;
3920 margin: 10px auto 0;
3927 padding: 3px 3px 3px 0;
3921 padding: 3px 3px 3px 0;
3928 }
3922 }
3929
3923
3930 #login div.color a, #register div.color a {
3924 #login div.color a, #register div.color a {
3931 width: 20px;
3925 width: 20px;
3932 height: 20px;
3926 height: 20px;
3933 display: block;
3927 display: block;
3934 float: left;
3928 float: left;
3935 margin: 0 0 0 3px;
3929 margin: 0 0 0 3px;
3936 padding: 0;
3930 padding: 0;
3937 }
3931 }
3938
3932
3939 #login div.title h5, #register div.title h5 {
3933 #login div.title h5, #register div.title h5 {
3940 color: #fff;
3934 color: #fff;
3941 margin: 10px;
3935 margin: 10px;
3942 padding: 0;
3936 padding: 0;
3943 }
3937 }
3944
3938
3945 #login div.form div.fields div.field, #register div.form div.fields div.field {
3939 #login div.form div.fields div.field, #register div.form div.fields div.field {
3946 clear: both;
3940 clear: both;
3947 overflow: hidden;
3941 overflow: hidden;
3948 margin: 0;
3942 margin: 0;
3949 padding: 0 0 10px;
3943 padding: 0 0 10px;
3950 }
3944 }
3951
3945
3952 #login div.form div.fields div.field span.error-message, #register div.form div.fields div.field span.error-message {
3946 #login div.form div.fields div.field span.error-message, #register div.form div.fields div.field span.error-message {
3953 height: 1%;
3947 height: 1%;
3954 display: block;
3948 display: block;
3955 color: red;
3949 color: red;
3956 margin: 8px 0 0;
3950 margin: 8px 0 0;
3957 padding: 0;
3951 padding: 0;
3958 max-width: 320px;
3952 max-width: 320px;
3959 }
3953 }
3960
3954
3961 #login div.form div.fields div.field div.label label, #register div.form div.fields div.field div.label label {
3955 #login div.form div.fields div.field div.label label, #register div.form div.fields div.field div.label label {
3962 color: #000;
3956 color: #000;
3963 font-weight: 700;
3957 font-weight: 700;
3964 }
3958 }
3965
3959
3966 #login div.form div.fields div.field div.input, #register div.form div.fields div.field div.input {
3960 #login div.form div.fields div.field div.input, #register div.form div.fields div.field div.input {
3967 float: left;
3961 float: left;
3968 margin: 0;
3962 margin: 0;
3969 padding: 0;
3963 padding: 0;
3970 }
3964 }
3971
3965
3972 #login div.form div.fields div.field div.input input.large {
3966 #login div.form div.fields div.field div.input input.large {
3973 width: 250px;
3967 width: 250px;
3974 }
3968 }
3975
3969
3976 #login div.form div.fields div.field div.checkbox, #register div.form div.fields div.field div.checkbox {
3970 #login div.form div.fields div.field div.checkbox, #register div.form div.fields div.field div.checkbox {
3977 margin: 0 0 0 184px;
3971 margin: 0 0 0 184px;
3978 padding: 0;
3972 padding: 0;
3979 }
3973 }
3980
3974
3981 #login div.form div.fields div.field div.checkbox label, #register div.form div.fields div.field div.checkbox label {
3975 #login div.form div.fields div.field div.checkbox label, #register div.form div.fields div.field div.checkbox label {
3982 color: #565656;
3976 color: #565656;
3983 font-weight: 700;
3977 font-weight: 700;
3984 }
3978 }
3985
3979
3986 #login div.form div.fields div.buttons input, #register div.form div.fields div.buttons input {
3980 #login div.form div.fields div.buttons input, #register div.form div.fields div.buttons input {
3987 color: #000;
3981 color: #000;
3988 font-size: 1em;
3982 font-size: 1em;
3989 font-weight: 700;
3983 font-weight: 700;
3990 margin: 0;
3984 margin: 0;
3991 }
3985 }
3992
3986
3993 #changeset_content .container .wrapper, #graph_content .container .wrapper {
3987 #changeset_content .container .wrapper, #graph_content .container .wrapper {
3994 width: 600px;
3988 width: 600px;
3995 }
3989 }
3996
3990
3997 #changeset_content .container .date, .ac .match {
3991 #changeset_content .container .date, .ac .match {
3998 font-weight: 700;
3992 font-weight: 700;
3999 padding-top: 5px;
3993 padding-top: 5px;
4000 padding-bottom: 5px;
3994 padding-bottom: 5px;
4001 }
3995 }
4002
3996
4003 div#legend_container table td, div#legend_choices table td {
3997 div#legend_container table td, div#legend_choices table td {
4004 border: none !important;
3998 border: none !important;
4005 height: 20px !important;
3999 height: 20px !important;
4006 padding: 0 !important;
4000 padding: 0 !important;
4007 }
4001 }
4008
4002
4009 .q_filter_box {
4003 .q_filter_box {
4010 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4004 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4011 -webkit-border-radius: 4px;
4005 -webkit-border-radius: 4px;
4012 border-radius: 4px;
4006 border-radius: 4px;
4013 border: 0 none;
4007 border: 0 none;
4014 color: #AAAAAA;
4008 color: #AAAAAA;
4015 margin-bottom: -4px;
4009 margin-bottom: -4px;
4016 margin-top: -4px;
4010 margin-top: -4px;
4017 padding-left: 3px;
4011 padding-left: 3px;
4018 }
4012 }
4019
4013
4020 #node_filter {
4014 #node_filter {
4021 border: 0px solid #545454;
4015 border: 0px solid #545454;
4022 color: #AAAAAA;
4016 color: #AAAAAA;
4023 padding-left: 3px;
4017 padding-left: 3px;
4024 }
4018 }
4025
4019
4026
4020
4027 .group_members_wrap {
4021 .group_members_wrap {
4028 min-height: 85px;
4022 min-height: 85px;
4029 padding-left: 20px;
4023 padding-left: 20px;
4030 }
4024 }
4031
4025
4032 .group_members .group_member {
4026 .group_members .group_member {
4033 height: 30px;
4027 height: 30px;
4034 padding: 0px 0px 0px 0px;
4028 padding: 0px 0px 0px 0px;
4035 }
4029 }
4036
4030
4037 .reviewers_member {
4031 .reviewers_member {
4038 height: 15px;
4032 height: 15px;
4039 padding: 0px 0px 0px 10px;
4033 padding: 0px 0px 0px 10px;
4040 }
4034 }
4041
4035
4042 .emails_wrap {
4036 .emails_wrap {
4043 padding: 0px 20px;
4037 padding: 0px 20px;
4044 }
4038 }
4045
4039
4046 .emails_wrap .email_entry {
4040 .emails_wrap .email_entry {
4047 height: 30px;
4041 height: 30px;
4048 padding: 0px 0px 0px 10px;
4042 padding: 0px 0px 0px 10px;
4049 }
4043 }
4050 .emails_wrap .email_entry .email {
4044 .emails_wrap .email_entry .email {
4051 float: left
4045 float: left
4052 }
4046 }
4053 .emails_wrap .email_entry .email_action {
4047 .emails_wrap .email_entry .email_action {
4054 float: left
4048 float: left
4055 }
4049 }
4056
4050
4057 .ips_wrap {
4051 .ips_wrap {
4058 padding: 0px 20px;
4052 padding: 0px 20px;
4059 }
4053 }
4060
4054
4061 .ips_wrap .ip_entry {
4055 .ips_wrap .ip_entry {
4062 height: 30px;
4056 height: 30px;
4063 padding: 0px 0px 0px 10px;
4057 padding: 0px 0px 0px 10px;
4064 }
4058 }
4065 .ips_wrap .ip_entry .ip {
4059 .ips_wrap .ip_entry .ip {
4066 float: left
4060 float: left
4067 }
4061 }
4068 .ips_wrap .ip_entry .ip_action {
4062 .ips_wrap .ip_entry .ip_action {
4069 float: left
4063 float: left
4070 }
4064 }
4071
4065
4072
4066
4073 /*README STYLE*/
4067 /*README STYLE*/
4074
4068
4075 div.readme {
4069 div.readme {
4076 padding: 0px;
4070 padding: 0px;
4077 }
4071 }
4078
4072
4079 div.readme h2 {
4073 div.readme h2 {
4080 font-weight: normal;
4074 font-weight: normal;
4081 }
4075 }
4082
4076
4083 div.readme .readme_box {
4077 div.readme .readme_box {
4084 background-color: #fafafa;
4078 background-color: #fafafa;
4085 }
4079 }
4086
4080
4087 div.readme .readme_box {
4081 div.readme .readme_box {
4088 clear: both;
4082 clear: both;
4089 overflow: hidden;
4083 overflow: hidden;
4090 margin: 0;
4084 margin: 0;
4091 padding: 0 20px 10px;
4085 padding: 0 20px 10px;
4092 }
4086 }
4093
4087
4094 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 {
4088 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 {
4095 border-bottom: 0 !important;
4089 border-bottom: 0 !important;
4096 margin: 0 !important;
4090 margin: 0 !important;
4097 padding: 0 !important;
4091 padding: 0 !important;
4098 line-height: 1.5em !important;
4092 line-height: 1.5em !important;
4099 }
4093 }
4100
4094
4101
4095
4102 div.readme .readme_box h1:first-child {
4096 div.readme .readme_box h1:first-child {
4103 padding-top: .25em !important;
4097 padding-top: .25em !important;
4104 }
4098 }
4105
4099
4106 div.readme .readme_box h2, div.readme .readme_box h3 {
4100 div.readme .readme_box h2, div.readme .readme_box h3 {
4107 margin: 1em 0 !important;
4101 margin: 1em 0 !important;
4108 }
4102 }
4109
4103
4110 div.readme .readme_box h2 {
4104 div.readme .readme_box h2 {
4111 margin-top: 1.5em !important;
4105 margin-top: 1.5em !important;
4112 border-top: 4px solid #e0e0e0 !important;
4106 border-top: 4px solid #e0e0e0 !important;
4113 padding-top: .5em !important;
4107 padding-top: .5em !important;
4114 }
4108 }
4115
4109
4116 div.readme .readme_box p {
4110 div.readme .readme_box p {
4117 color: black !important;
4111 color: black !important;
4118 margin: 1em 0 !important;
4112 margin: 1em 0 !important;
4119 line-height: 1.5em !important;
4113 line-height: 1.5em !important;
4120 }
4114 }
4121
4115
4122 div.readme .readme_box ul {
4116 div.readme .readme_box ul {
4123 list-style: disc !important;
4117 list-style: disc !important;
4124 margin: 1em 0 1em 2em !important;
4118 margin: 1em 0 1em 2em !important;
4125 }
4119 }
4126
4120
4127 div.readme .readme_box ol {
4121 div.readme .readme_box ol {
4128 list-style: decimal;
4122 list-style: decimal;
4129 margin: 1em 0 1em 2em !important;
4123 margin: 1em 0 1em 2em !important;
4130 }
4124 }
4131
4125
4132 div.readme .readme_box pre, code {
4126 div.readme .readme_box pre, code {
4133 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
4127 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
4134 }
4128 }
4135
4129
4136 div.readme .readme_box code {
4130 div.readme .readme_box code {
4137 font-size: 12px !important;
4131 font-size: 12px !important;
4138 background-color: ghostWhite !important;
4132 background-color: ghostWhite !important;
4139 color: #444 !important;
4133 color: #444 !important;
4140 padding: 0 .2em !important;
4134 padding: 0 .2em !important;
4141 border: 1px solid #dedede !important;
4135 border: 1px solid #dedede !important;
4142 }
4136 }
4143
4137
4144 div.readme .readme_box pre code {
4138 div.readme .readme_box pre code {
4145 padding: 0 !important;
4139 padding: 0 !important;
4146 font-size: 12px !important;
4140 font-size: 12px !important;
4147 background-color: #eee !important;
4141 background-color: #eee !important;
4148 border: none !important;
4142 border: none !important;
4149 }
4143 }
4150
4144
4151 div.readme .readme_box pre {
4145 div.readme .readme_box pre {
4152 margin: 1em 0;
4146 margin: 1em 0;
4153 font-size: 12px;
4147 font-size: 12px;
4154 background-color: #eee;
4148 background-color: #eee;
4155 border: 1px solid #ddd;
4149 border: 1px solid #ddd;
4156 padding: 5px;
4150 padding: 5px;
4157 color: #444;
4151 color: #444;
4158 overflow: auto;
4152 overflow: auto;
4159 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4153 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4160 -webkit-border-radius: 3px;
4154 -webkit-border-radius: 3px;
4161 border-radius: 3px;
4155 border-radius: 3px;
4162 }
4156 }
4163
4157
4164 div.readme .readme_box table {
4158 div.readme .readme_box table {
4165 display: table;
4159 display: table;
4166 border-collapse: separate;
4160 border-collapse: separate;
4167 border-spacing: 2px;
4161 border-spacing: 2px;
4168 border-color: gray;
4162 border-color: gray;
4169 width: auto !important;
4163 width: auto !important;
4170 }
4164 }
4171
4165
4172
4166
4173 /** RST STYLE **/
4167 /** RST STYLE **/
4174
4168
4175
4169
4176 div.rst-block {
4170 div.rst-block {
4177 padding: 0px;
4171 padding: 0px;
4178 }
4172 }
4179
4173
4180 div.rst-block h2 {
4174 div.rst-block h2 {
4181 font-weight: normal;
4175 font-weight: normal;
4182 }
4176 }
4183
4177
4184 div.rst-block {
4178 div.rst-block {
4185 background-color: #fafafa;
4179 background-color: #fafafa;
4186 }
4180 }
4187
4181
4188 div.rst-block {
4182 div.rst-block {
4189 clear: both;
4183 clear: both;
4190 overflow: hidden;
4184 overflow: hidden;
4191 margin: 0;
4185 margin: 0;
4192 padding: 0 20px 10px;
4186 padding: 0 20px 10px;
4193 }
4187 }
4194
4188
4195 div.rst-block h1, div.rst-block h2, div.rst-block h3, div.rst-block h4, div.rst-block h5, div.rst-block h6 {
4189 div.rst-block h1, div.rst-block h2, div.rst-block h3, div.rst-block h4, div.rst-block h5, div.rst-block h6 {
4196 border-bottom: 0 !important;
4190 border-bottom: 0 !important;
4197 margin: 0 !important;
4191 margin: 0 !important;
4198 padding: 0 !important;
4192 padding: 0 !important;
4199 line-height: 1.5em !important;
4193 line-height: 1.5em !important;
4200 }
4194 }
4201
4195
4202
4196
4203 div.rst-block h1:first-child {
4197 div.rst-block h1:first-child {
4204 padding-top: .25em !important;
4198 padding-top: .25em !important;
4205 }
4199 }
4206
4200
4207 div.rst-block h2, div.rst-block h3 {
4201 div.rst-block h2, div.rst-block h3 {
4208 margin: 1em 0 !important;
4202 margin: 1em 0 !important;
4209 }
4203 }
4210
4204
4211 div.rst-block h2 {
4205 div.rst-block h2 {
4212 margin-top: 1.5em !important;
4206 margin-top: 1.5em !important;
4213 border-top: 4px solid #e0e0e0 !important;
4207 border-top: 4px solid #e0e0e0 !important;
4214 padding-top: .5em !important;
4208 padding-top: .5em !important;
4215 }
4209 }
4216
4210
4217 div.rst-block p {
4211 div.rst-block p {
4218 color: black !important;
4212 color: black !important;
4219 margin: 1em 0 !important;
4213 margin: 1em 0 !important;
4220 line-height: 1.5em !important;
4214 line-height: 1.5em !important;
4221 }
4215 }
4222
4216
4223 div.rst-block ul {
4217 div.rst-block ul {
4224 list-style: disc !important;
4218 list-style: disc !important;
4225 margin: 1em 0 1em 2em !important;
4219 margin: 1em 0 1em 2em !important;
4226 }
4220 }
4227
4221
4228 div.rst-block ol {
4222 div.rst-block ol {
4229 list-style: decimal;
4223 list-style: decimal;
4230 margin: 1em 0 1em 2em !important;
4224 margin: 1em 0 1em 2em !important;
4231 }
4225 }
4232
4226
4233 div.rst-block pre, code {
4227 div.rst-block pre, code {
4234 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
4228 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
4235 }
4229 }
4236
4230
4237 div.rst-block code {
4231 div.rst-block code {
4238 font-size: 12px !important;
4232 font-size: 12px !important;
4239 background-color: ghostWhite !important;
4233 background-color: ghostWhite !important;
4240 color: #444 !important;
4234 color: #444 !important;
4241 padding: 0 .2em !important;
4235 padding: 0 .2em !important;
4242 border: 1px solid #dedede !important;
4236 border: 1px solid #dedede !important;
4243 }
4237 }
4244
4238
4245 div.rst-block pre code {
4239 div.rst-block pre code {
4246 padding: 0 !important;
4240 padding: 0 !important;
4247 font-size: 12px !important;
4241 font-size: 12px !important;
4248 background-color: #eee !important;
4242 background-color: #eee !important;
4249 border: none !important;
4243 border: none !important;
4250 }
4244 }
4251
4245
4252 div.rst-block pre {
4246 div.rst-block pre {
4253 margin: 1em 0;
4247 margin: 1em 0;
4254 font-size: 12px;
4248 font-size: 12px;
4255 background-color: #eee;
4249 background-color: #eee;
4256 border: 1px solid #ddd;
4250 border: 1px solid #ddd;
4257 padding: 5px;
4251 padding: 5px;
4258 color: #444;
4252 color: #444;
4259 overflow: auto;
4253 overflow: auto;
4260 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4254 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4261 -webkit-border-radius: 3px;
4255 -webkit-border-radius: 3px;
4262 border-radius: 3px;
4256 border-radius: 3px;
4263 }
4257 }
4264
4258
4265
4259
4266 /** comment main **/
4260 /** comment main **/
4267 .comments {
4261 .comments {
4268 padding: 10px 20px;
4262 padding: 10px 20px;
4269 }
4263 }
4270
4264
4271 .comments .comment {
4265 .comments .comment {
4272 border: 1px solid #ddd;
4266 border: 1px solid #ddd;
4273 margin-top: 10px;
4267 margin-top: 10px;
4274 -webkit-border-radius: 4px;
4268 -webkit-border-radius: 4px;
4275 border-radius: 4px;
4269 border-radius: 4px;
4276 }
4270 }
4277
4271
4278 .comments .comment .meta {
4272 .comments .comment .meta {
4279 background: #f8f8f8;
4273 background: #f8f8f8;
4280 padding: 4px;
4274 padding: 4px;
4281 border-bottom: 1px solid #ddd;
4275 border-bottom: 1px solid #ddd;
4282 height: 18px;
4276 height: 18px;
4283 }
4277 }
4284
4278
4285 .comments .comment .meta img {
4279 .comments .comment .meta img {
4286 vertical-align: middle;
4280 vertical-align: middle;
4287 }
4281 }
4288
4282
4289 .comments .comment .meta .user {
4283 .comments .comment .meta .user {
4290 font-weight: bold;
4284 font-weight: bold;
4291 float: left;
4285 float: left;
4292 padding: 4px 2px 2px 2px;
4286 padding: 4px 2px 2px 2px;
4293 }
4287 }
4294
4288
4295 .comments .comment .meta .date {
4289 .comments .comment .meta .date {
4296 float: left;
4290 float: left;
4297 padding: 4px 4px 0px 4px;
4291 padding: 4px 4px 0px 4px;
4298 }
4292 }
4299
4293
4300 .comments .comment .text {
4294 .comments .comment .text {
4301 background-color: #FAFAFA;
4295 background-color: #FAFAFA;
4302 }
4296 }
4303 .comment .text div.rst-block p {
4297 .comment .text div.rst-block p {
4304 margin: 0.5em 0px !important;
4298 margin: 0.5em 0px !important;
4305 }
4299 }
4306
4300
4307 .comments .comments-number {
4301 .comments .comments-number {
4308 padding: 0px 0px 10px 0px;
4302 padding: 0px 0px 10px 0px;
4309 font-weight: bold;
4303 font-weight: bold;
4310 color: #666;
4304 color: #666;
4311 font-size: 16px;
4305 font-size: 16px;
4312 }
4306 }
4313
4307
4314 /** comment form **/
4308 /** comment form **/
4315
4309
4316 .status-block {
4310 .status-block {
4317 min-height: 80px;
4311 min-height: 80px;
4318 clear: both
4312 clear: both
4319 }
4313 }
4320
4314
4321 .comment-form .clearfix {
4315 .comment-form .clearfix {
4322 background: #EEE;
4316 background: #EEE;
4323 -webkit-border-radius: 4px;
4317 -webkit-border-radius: 4px;
4324 border-radius: 4px;
4318 border-radius: 4px;
4325 padding: 10px;
4319 padding: 10px;
4326 }
4320 }
4327
4321
4328 div.comment-form {
4322 div.comment-form {
4329 margin-top: 20px;
4323 margin-top: 20px;
4330 }
4324 }
4331
4325
4332 .comment-form strong {
4326 .comment-form strong {
4333 display: block;
4327 display: block;
4334 margin-bottom: 15px;
4328 margin-bottom: 15px;
4335 }
4329 }
4336
4330
4337 .comment-form textarea {
4331 .comment-form textarea {
4338 width: 100%;
4332 width: 100%;
4339 height: 100px;
4333 height: 100px;
4340 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
4334 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
4341 }
4335 }
4342
4336
4343 form.comment-form {
4337 form.comment-form {
4344 margin-top: 10px;
4338 margin-top: 10px;
4345 margin-left: 10px;
4339 margin-left: 10px;
4346 }
4340 }
4347
4341
4348 .comment-form-submit {
4342 .comment-form-submit {
4349 margin-top: 5px;
4343 margin-top: 5px;
4350 margin-left: 525px;
4344 margin-left: 525px;
4351 }
4345 }
4352
4346
4353 .file-comments {
4347 .file-comments {
4354 display: none;
4348 display: none;
4355 }
4349 }
4356
4350
4357 .comment-form .comment {
4351 .comment-form .comment {
4358 margin-left: 10px;
4352 margin-left: 10px;
4359 }
4353 }
4360
4354
4361 .comment-form .comment-help {
4355 .comment-form .comment-help {
4362 padding: 0px 0px 5px 0px;
4356 padding: 0px 0px 5px 0px;
4363 color: #666;
4357 color: #666;
4364 }
4358 }
4365
4359
4366 .comment-form .comment-button {
4360 .comment-form .comment-button {
4367 padding-top: 5px;
4361 padding-top: 5px;
4368 }
4362 }
4369
4363
4370 .add-another-button {
4364 .add-another-button {
4371 margin-left: 10px;
4365 margin-left: 10px;
4372 margin-top: 10px;
4366 margin-top: 10px;
4373 margin-bottom: 10px;
4367 margin-bottom: 10px;
4374 }
4368 }
4375
4369
4376 .comment .buttons {
4370 .comment .buttons {
4377 float: right;
4371 float: right;
4378 padding: 2px 2px 0px 0px;
4372 padding: 2px 2px 0px 0px;
4379 }
4373 }
4380
4374
4381
4375
4382 .show-inline-comments {
4376 .show-inline-comments {
4383 position: relative;
4377 position: relative;
4384 top: 1px
4378 top: 1px
4385 }
4379 }
4386
4380
4387 /** comment inline form **/
4381 /** comment inline form **/
4388 .comment-inline-form .overlay {
4382 .comment-inline-form .overlay {
4389 display: none;
4383 display: none;
4390 }
4384 }
4391 .comment-inline-form .overlay.submitting {
4385 .comment-inline-form .overlay.submitting {
4392 display: block;
4386 display: block;
4393 background: none repeat scroll 0 0 white;
4387 background: none repeat scroll 0 0 white;
4394 font-size: 16px;
4388 font-size: 16px;
4395 opacity: 0.5;
4389 opacity: 0.5;
4396 position: absolute;
4390 position: absolute;
4397 text-align: center;
4391 text-align: center;
4398 vertical-align: top;
4392 vertical-align: top;
4399
4393
4400 }
4394 }
4401 .comment-inline-form .overlay.submitting .overlay-text {
4395 .comment-inline-form .overlay.submitting .overlay-text {
4402 width: 100%;
4396 width: 100%;
4403 margin-top: 5%;
4397 margin-top: 5%;
4404 }
4398 }
4405
4399
4406 .comment-inline-form .clearfix {
4400 .comment-inline-form .clearfix {
4407 background: #EEE;
4401 background: #EEE;
4408 -webkit-border-radius: 4px;
4402 -webkit-border-radius: 4px;
4409 border-radius: 4px;
4403 border-radius: 4px;
4410 padding: 5px;
4404 padding: 5px;
4411 }
4405 }
4412
4406
4413 div.comment-inline-form {
4407 div.comment-inline-form {
4414 padding: 4px 0px 6px 0px;
4408 padding: 4px 0px 6px 0px;
4415 }
4409 }
4416
4410
4417 .comment-inline-form strong {
4411 .comment-inline-form strong {
4418 display: block;
4412 display: block;
4419 margin-bottom: 15px;
4413 margin-bottom: 15px;
4420 }
4414 }
4421
4415
4422 .comment-inline-form textarea {
4416 .comment-inline-form textarea {
4423 width: 100%;
4417 width: 100%;
4424 height: 100px;
4418 height: 100px;
4425 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
4419 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
4426 }
4420 }
4427
4421
4428 form.comment-inline-form {
4422 form.comment-inline-form {
4429 margin-top: 10px;
4423 margin-top: 10px;
4430 margin-left: 10px;
4424 margin-left: 10px;
4431 }
4425 }
4432
4426
4433 .comment-inline-form-submit {
4427 .comment-inline-form-submit {
4434 margin-top: 5px;
4428 margin-top: 5px;
4435 margin-left: 525px;
4429 margin-left: 525px;
4436 }
4430 }
4437
4431
4438 .file-comments {
4432 .file-comments {
4439 display: none;
4433 display: none;
4440 }
4434 }
4441
4435
4442 .comment-inline-form .comment {
4436 .comment-inline-form .comment {
4443 margin-left: 10px;
4437 margin-left: 10px;
4444 }
4438 }
4445
4439
4446 .comment-inline-form .comment-help {
4440 .comment-inline-form .comment-help {
4447 padding: 0px 0px 2px 0px;
4441 padding: 0px 0px 2px 0px;
4448 color: #666666;
4442 color: #666666;
4449 font-size: 10px;
4443 font-size: 10px;
4450 }
4444 }
4451
4445
4452 .comment-inline-form .comment-button {
4446 .comment-inline-form .comment-button {
4453 padding-top: 5px;
4447 padding-top: 5px;
4454 }
4448 }
4455
4449
4456 /** comment inline **/
4450 /** comment inline **/
4457 .inline-comments {
4451 .inline-comments {
4458 padding: 10px 20px;
4452 padding: 10px 20px;
4459 }
4453 }
4460
4454
4461 .inline-comments div.rst-block {
4455 .inline-comments div.rst-block {
4462 clear: both;
4456 clear: both;
4463 overflow: hidden;
4457 overflow: hidden;
4464 margin: 0;
4458 margin: 0;
4465 padding: 0 20px 0px;
4459 padding: 0 20px 0px;
4466 }
4460 }
4467 .inline-comments .comment {
4461 .inline-comments .comment {
4468 border: 1px solid #ddd;
4462 border: 1px solid #ddd;
4469 -webkit-border-radius: 4px;
4463 -webkit-border-radius: 4px;
4470 border-radius: 4px;
4464 border-radius: 4px;
4471 margin: 3px 3px 5px 5px;
4465 margin: 3px 3px 5px 5px;
4472 background-color: #FAFAFA;
4466 background-color: #FAFAFA;
4473 }
4467 }
4474 .inline-comments .add-comment {
4468 .inline-comments .add-comment {
4475 padding: 2px 4px 8px 5px;
4469 padding: 2px 4px 8px 5px;
4476 }
4470 }
4477
4471
4478 .inline-comments .comment-wrapp {
4472 .inline-comments .comment-wrapp {
4479 padding: 1px;
4473 padding: 1px;
4480 }
4474 }
4481 .inline-comments .comment .meta {
4475 .inline-comments .comment .meta {
4482 background: #f8f8f8;
4476 background: #f8f8f8;
4483 padding: 4px;
4477 padding: 4px;
4484 border-bottom: 1px solid #ddd;
4478 border-bottom: 1px solid #ddd;
4485 height: 20px;
4479 height: 20px;
4486 }
4480 }
4487
4481
4488 .inline-comments .comment .meta img {
4482 .inline-comments .comment .meta img {
4489 vertical-align: middle;
4483 vertical-align: middle;
4490 }
4484 }
4491
4485
4492 .inline-comments .comment .meta .user {
4486 .inline-comments .comment .meta .user {
4493 font-weight: bold;
4487 font-weight: bold;
4494 float: left;
4488 float: left;
4495 padding: 3px;
4489 padding: 3px;
4496 }
4490 }
4497
4491
4498 .inline-comments .comment .meta .date {
4492 .inline-comments .comment .meta .date {
4499 float: left;
4493 float: left;
4500 padding: 3px;
4494 padding: 3px;
4501 }
4495 }
4502
4496
4503 .inline-comments .comment .text {
4497 .inline-comments .comment .text {
4504 background-color: #FAFAFA;
4498 background-color: #FAFAFA;
4505 }
4499 }
4506
4500
4507 .inline-comments .comments-number {
4501 .inline-comments .comments-number {
4508 padding: 0px 0px 10px 0px;
4502 padding: 0px 0px 10px 0px;
4509 font-weight: bold;
4503 font-weight: bold;
4510 color: #666;
4504 color: #666;
4511 font-size: 16px;
4505 font-size: 16px;
4512 }
4506 }
4513 .inline-comments-button .add-comment {
4507 .inline-comments-button .add-comment {
4514 margin: 2px 0px 8px 5px !important
4508 margin: 2px 0px 8px 5px !important
4515 }
4509 }
4516
4510
4517 .notification-paginator {
4511 .notification-paginator {
4518 padding: 0px 0px 4px 16px;
4512 padding: 0px 0px 4px 16px;
4519 float: left;
4513 float: left;
4520 }
4514 }
4521
4515
4522 #context-pages .pull-request span,
4516 #context-pages .pull-request span,
4523 .menu_link_notifications {
4517 .menu_link_notifications {
4524 padding: 4px 4px !important;
4518 padding: 4px 4px !important;
4525 text-align: center;
4519 text-align: center;
4526 color: #888 !important;
4520 color: #888 !important;
4527 background-color: #DEDEDE !important;
4521 background-color: #DEDEDE !important;
4528 border-radius: 4px !important;
4522 border-radius: 4px !important;
4529 -webkit-border-radius: 4px !important;
4523 -webkit-border-radius: 4px !important;
4530 }
4524 }
4531
4525
4532 .notification-header {
4526 .notification-header {
4533 padding-top: 6px;
4527 padding-top: 6px;
4534 }
4528 }
4535 .notification-header .desc {
4529 .notification-header .desc {
4536 font-size: 16px;
4530 font-size: 16px;
4537 height: 24px;
4531 height: 24px;
4538 float: left
4532 float: left
4539 }
4533 }
4540 .notification-list .container.unread {
4534 .notification-list .container.unread {
4541 background: none repeat scroll 0 0 rgba(255, 255, 180, 0.6);
4535 background: none repeat scroll 0 0 rgba(255, 255, 180, 0.6);
4542 }
4536 }
4543 .notification-header .gravatar {
4537 .notification-header .gravatar {
4544 background: none repeat scroll 0 0 transparent;
4538 background: none repeat scroll 0 0 transparent;
4545 padding: 0px 0px 0px 8px;
4539 padding: 0px 0px 0px 8px;
4546 }
4540 }
4547 .notification-list .container .notification-header .desc {
4541 .notification-list .container .notification-header .desc {
4548 font-weight: bold;
4542 font-weight: bold;
4549 font-size: 17px;
4543 font-size: 17px;
4550 }
4544 }
4551 .notification-table {
4545 .notification-table {
4552 border: 1px solid #ccc;
4546 border: 1px solid #ccc;
4553 -webkit-border-radius: 6px 6px 6px 6px;
4547 -webkit-border-radius: 6px 6px 6px 6px;
4554 border-radius: 6px 6px 6px 6px;
4548 border-radius: 6px 6px 6px 6px;
4555 clear: both;
4549 clear: both;
4556 margin: 0px 20px 0px 20px;
4550 margin: 0px 20px 0px 20px;
4557 }
4551 }
4558 .notification-header .delete-notifications {
4552 .notification-header .delete-notifications {
4559 float: right;
4553 float: right;
4560 padding-top: 8px;
4554 padding-top: 8px;
4561 cursor: pointer;
4555 cursor: pointer;
4562 }
4556 }
4563 .notification-header .read-notifications {
4557 .notification-header .read-notifications {
4564 float: right;
4558 float: right;
4565 padding-top: 8px;
4559 padding-top: 8px;
4566 cursor: pointer;
4560 cursor: pointer;
4567 }
4561 }
4568 .notification-subject {
4562 .notification-subject {
4569 clear: both;
4563 clear: both;
4570 border-bottom: 1px solid #eee;
4564 border-bottom: 1px solid #eee;
4571 padding: 5px 0px 5px 38px;
4565 padding: 5px 0px 5px 38px;
4572 }
4566 }
4573
4567
4574 .notification-body {
4568 .notification-body {
4575 clear: both;
4569 clear: both;
4576 margin: 34px 2px 2px 8px
4570 margin: 34px 2px 2px 8px
4577 }
4571 }
4578
4572
4579 /****
4573 /****
4580 PULL REQUESTS
4574 PULL REQUESTS
4581 *****/
4575 *****/
4582 .pullrequests_section_head {
4576 .pullrequests_section_head {
4583 padding: 10px 10px 10px 0px;
4577 padding: 10px 10px 10px 0px;
4584 font-size: 16px;
4578 font-size: 16px;
4585 font-weight: bold;
4579 font-weight: bold;
4586 }
4580 }
4587
4581
4588 /****
4582 /****
4589 PERMS
4583 PERMS
4590 *****/
4584 *****/
4591 #perms .perms_section_head {
4585 #perms .perms_section_head {
4592 padding: 10px 10px 10px 0px;
4586 padding: 10px 10px 10px 0px;
4593 font-size: 16px;
4587 font-size: 16px;
4594 font-weight: bold;
4588 font-weight: bold;
4595 }
4589 }
4596
4590
4597 #perms .perm_tag {
4591 #perms .perm_tag {
4598 padding: 1px 3px 1px 3px;
4592 padding: 1px 3px 1px 3px;
4599 font-size: 10px;
4593 font-size: 10px;
4600 font-weight: bold;
4594 font-weight: bold;
4601 text-transform: uppercase;
4595 text-transform: uppercase;
4602 white-space: nowrap;
4596 white-space: nowrap;
4603 -webkit-border-radius: 3px;
4597 -webkit-border-radius: 3px;
4604 border-radius: 3px;
4598 border-radius: 3px;
4605 }
4599 }
4606
4600
4607 #perms .perm_tag.admin {
4601 #perms .perm_tag.admin {
4608 background-color: #B94A48;
4602 background-color: #B94A48;
4609 color: #ffffff;
4603 color: #ffffff;
4610 }
4604 }
4611
4605
4612 #perms .perm_tag.write {
4606 #perms .perm_tag.write {
4613 background-color: #DB7525;
4607 background-color: #DB7525;
4614 color: #ffffff;
4608 color: #ffffff;
4615 }
4609 }
4616
4610
4617 #perms .perm_tag.read {
4611 #perms .perm_tag.read {
4618 background-color: #468847;
4612 background-color: #468847;
4619 color: #ffffff;
4613 color: #ffffff;
4620 }
4614 }
4621
4615
4622 #perms .perm_tag.none {
4616 #perms .perm_tag.none {
4623 background-color: #bfbfbf;
4617 background-color: #bfbfbf;
4624 color: #ffffff;
4618 color: #ffffff;
4625 }
4619 }
4626
4620
4627 .perm-gravatar {
4621 .perm-gravatar {
4628 vertical-align: middle;
4622 vertical-align: middle;
4629 padding: 2px;
4623 padding: 2px;
4630 }
4624 }
4631 .perm-gravatar-ac {
4625 .perm-gravatar-ac {
4632 vertical-align: middle;
4626 vertical-align: middle;
4633 padding: 2px;
4627 padding: 2px;
4634 width: 14px;
4628 width: 14px;
4635 height: 14px;
4629 height: 14px;
4636 }
4630 }
4637
4631
4638 /*****************************************************************************
4632 /*****************************************************************************
4639 DIFFS CSS
4633 DIFFS CSS
4640 ******************************************************************************/
4634 ******************************************************************************/
4641 .diff-collapse {
4635 .diff-collapse {
4642 text-align: center;
4636 text-align: center;
4643 margin-bottom: -15px;
4637 margin-bottom: -15px;
4644 }
4638 }
4645 .diff-collapse-button {
4639 .diff-collapse-button {
4646 cursor: pointer;
4640 cursor: pointer;
4647 color: #666;
4641 color: #666;
4648 font-size: 16px;
4642 font-size: 16px;
4649 }
4643 }
4650 .diff-container {
4644 .diff-container {
4651
4645
4652 }
4646 }
4653
4647
4654 .diff-container.hidden {
4648 .diff-container.hidden {
4655 display: none;
4649 display: none;
4656 overflow: hidden;
4650 overflow: hidden;
4657 }
4651 }
4658
4652
4659
4653
4660 div.diffblock {
4654 div.diffblock {
4661 overflow: auto;
4655 overflow: auto;
4662 padding: 0px;
4656 padding: 0px;
4663 border: 1px solid #ccc;
4657 border: 1px solid #ccc;
4664 background: #f8f8f8;
4658 background: #f8f8f8;
4665 font-size: 100%;
4659 font-size: 100%;
4666 line-height: 100%;
4660 line-height: 100%;
4667 /* new */
4661 /* new */
4668 line-height: 125%;
4662 line-height: 125%;
4669 -webkit-border-radius: 6px 6px 0px 0px;
4663 -webkit-border-radius: 6px 6px 0px 0px;
4670 border-radius: 6px 6px 0px 0px;
4664 border-radius: 6px 6px 0px 0px;
4671 }
4665 }
4672 div.diffblock.margined {
4666 div.diffblock.margined {
4673 margin: 0px 20px 0px 20px;
4667 margin: 0px 20px 0px 20px;
4674 }
4668 }
4675 div.diffblock .code-header {
4669 div.diffblock .code-header {
4676 border-bottom: 1px solid #CCCCCC;
4670 border-bottom: 1px solid #CCCCCC;
4677 background: #EEEEEE;
4671 background: #EEEEEE;
4678 padding: 10px 0 10px 0;
4672 padding: 10px 0 10px 0;
4679 height: 14px;
4673 height: 14px;
4680 }
4674 }
4681
4675
4682 div.diffblock .code-header.banner {
4676 div.diffblock .code-header.banner {
4683 border-bottom: 1px solid #CCCCCC;
4677 border-bottom: 1px solid #CCCCCC;
4684 background: #EEEEEE;
4678 background: #EEEEEE;
4685 height: 14px;
4679 height: 14px;
4686 margin: 0px 95px 0px 95px;
4680 margin: 0px 95px 0px 95px;
4687 padding: 3px 3px 11px 3px;
4681 padding: 3px 3px 11px 3px;
4688 }
4682 }
4689
4683
4690 div.diffblock .code-header.cv {
4684 div.diffblock .code-header.cv {
4691 height: 34px;
4685 height: 34px;
4692 }
4686 }
4693 div.diffblock .code-header-title {
4687 div.diffblock .code-header-title {
4694 padding: 0px 0px 10px 5px !important;
4688 padding: 0px 0px 10px 5px !important;
4695 margin: 0 !important;
4689 margin: 0 !important;
4696 }
4690 }
4697 div.diffblock .code-header .hash {
4691 div.diffblock .code-header .hash {
4698 float: left;
4692 float: left;
4699 padding: 2px 0 0 2px;
4693 padding: 2px 0 0 2px;
4700 }
4694 }
4701 div.diffblock .code-header .date {
4695 div.diffblock .code-header .date {
4702 float: left;
4696 float: left;
4703 text-transform: uppercase;
4697 text-transform: uppercase;
4704 padding: 2px 0px 0px 2px;
4698 padding: 2px 0px 0px 2px;
4705 }
4699 }
4706 div.diffblock .code-header div {
4700 div.diffblock .code-header div {
4707 margin-left: 4px;
4701 margin-left: 4px;
4708 font-weight: bold;
4702 font-weight: bold;
4709 font-size: 14px;
4703 font-size: 14px;
4710 }
4704 }
4711
4705
4712 div.diffblock .parents {
4706 div.diffblock .parents {
4713 float: left;
4707 float: left;
4714 height: 26px;
4708 height: 26px;
4715 width: 100px;
4709 width: 100px;
4716 font-size: 10px;
4710 font-size: 10px;
4717 font-weight: 400;
4711 font-weight: 400;
4718 vertical-align: middle;
4712 vertical-align: middle;
4719 padding: 0px 2px 2px 2px;
4713 padding: 0px 2px 2px 2px;
4720 background-color: #eeeeee;
4714 background-color: #eeeeee;
4721 border-bottom: 1px solid #CCCCCC;
4715 border-bottom: 1px solid #CCCCCC;
4722 }
4716 }
4723
4717
4724 div.diffblock .children {
4718 div.diffblock .children {
4725 float: right;
4719 float: right;
4726 height: 26px;
4720 height: 26px;
4727 width: 100px;
4721 width: 100px;
4728 font-size: 10px;
4722 font-size: 10px;
4729 font-weight: 400;
4723 font-weight: 400;
4730 vertical-align: middle;
4724 vertical-align: middle;
4731 text-align: right;
4725 text-align: right;
4732 padding: 0px 2px 2px 2px;
4726 padding: 0px 2px 2px 2px;
4733 background-color: #eeeeee;
4727 background-color: #eeeeee;
4734 border-bottom: 1px solid #CCCCCC;
4728 border-bottom: 1px solid #CCCCCC;
4735 }
4729 }
4736
4730
4737 div.diffblock .code-body {
4731 div.diffblock .code-body {
4738 background: #FFFFFF;
4732 background: #FFFFFF;
4739 }
4733 }
4740 div.diffblock pre.raw {
4734 div.diffblock pre.raw {
4741 background: #FFFFFF;
4735 background: #FFFFFF;
4742 color: #000000;
4736 color: #000000;
4743 }
4737 }
4744 table.code-difftable {
4738 table.code-difftable {
4745 border-collapse: collapse;
4739 border-collapse: collapse;
4746 width: 99%;
4740 width: 99%;
4747 border-radius: 0px !important;
4741 border-radius: 0px !important;
4748 }
4742 }
4749 table.code-difftable td {
4743 table.code-difftable td {
4750 padding: 0 !important;
4744 padding: 0 !important;
4751 background: none !important;
4745 background: none !important;
4752 border: 0 !important;
4746 border: 0 !important;
4753 vertical-align: baseline !important
4747 vertical-align: baseline !important
4754 }
4748 }
4755 table.code-difftable .context {
4749 table.code-difftable .context {
4756 background: none repeat scroll 0 0 #DDE7EF;
4750 background: none repeat scroll 0 0 #DDE7EF;
4757 }
4751 }
4758 table.code-difftable .add {
4752 table.code-difftable .add {
4759 background: none repeat scroll 0 0 #DDFFDD;
4753 background: none repeat scroll 0 0 #DDFFDD;
4760 }
4754 }
4761 table.code-difftable .add ins {
4755 table.code-difftable .add ins {
4762 background: none repeat scroll 0 0 #AAFFAA;
4756 background: none repeat scroll 0 0 #AAFFAA;
4763 text-decoration: none;
4757 text-decoration: none;
4764 }
4758 }
4765 table.code-difftable .del {
4759 table.code-difftable .del {
4766 background: none repeat scroll 0 0 #FFDDDD;
4760 background: none repeat scroll 0 0 #FFDDDD;
4767 }
4761 }
4768 table.code-difftable .del del {
4762 table.code-difftable .del del {
4769 background: none repeat scroll 0 0 #FFAAAA;
4763 background: none repeat scroll 0 0 #FFAAAA;
4770 text-decoration: none;
4764 text-decoration: none;
4771 }
4765 }
4772
4766
4773 /** LINE NUMBERS **/
4767 /** LINE NUMBERS **/
4774 table.code-difftable .lineno {
4768 table.code-difftable .lineno {
4775
4769
4776 padding-left: 2px;
4770 padding-left: 2px;
4777 padding-right: 2px;
4771 padding-right: 2px;
4778 text-align: right;
4772 text-align: right;
4779 width: 32px;
4773 width: 32px;
4780 -moz-user-select: none;
4774 -moz-user-select: none;
4781 -webkit-user-select: none;
4775 -webkit-user-select: none;
4782 border-right: 1px solid #CCC !important;
4776 border-right: 1px solid #CCC !important;
4783 border-left: 0px solid #CCC !important;
4777 border-left: 0px solid #CCC !important;
4784 border-top: 0px solid #CCC !important;
4778 border-top: 0px solid #CCC !important;
4785 border-bottom: none !important;
4779 border-bottom: none !important;
4786 vertical-align: middle !important;
4780 vertical-align: middle !important;
4787
4781
4788 }
4782 }
4789 table.code-difftable .lineno.new {
4783 table.code-difftable .lineno.new {
4790 }
4784 }
4791 table.code-difftable .lineno.old {
4785 table.code-difftable .lineno.old {
4792 }
4786 }
4793 table.code-difftable .lineno a {
4787 table.code-difftable .lineno a {
4794 color: #747474 !important;
4788 color: #747474 !important;
4795 font: 11px "Bitstream Vera Sans Mono",Monaco,"Courier New",Courier,monospace !important;
4789 font: 11px "Bitstream Vera Sans Mono",Monaco,"Courier New",Courier,monospace !important;
4796 letter-spacing: -1px;
4790 letter-spacing: -1px;
4797 text-align: right;
4791 text-align: right;
4798 padding-right: 2px;
4792 padding-right: 2px;
4799 cursor: pointer;
4793 cursor: pointer;
4800 display: block;
4794 display: block;
4801 width: 32px;
4795 width: 32px;
4802 }
4796 }
4803
4797
4804 table.code-difftable .lineno-inline {
4798 table.code-difftable .lineno-inline {
4805 background: none repeat scroll 0 0 #FFF !important;
4799 background: none repeat scroll 0 0 #FFF !important;
4806 padding-left: 2px;
4800 padding-left: 2px;
4807 padding-right: 2px;
4801 padding-right: 2px;
4808 text-align: right;
4802 text-align: right;
4809 width: 30px;
4803 width: 30px;
4810 -moz-user-select: none;
4804 -moz-user-select: none;
4811 -webkit-user-select: none;
4805 -webkit-user-select: none;
4812 }
4806 }
4813
4807
4814 /** CODE **/
4808 /** CODE **/
4815 table.code-difftable .code {
4809 table.code-difftable .code {
4816 display: block;
4810 display: block;
4817 width: 100%;
4811 width: 100%;
4818 }
4812 }
4819 table.code-difftable .code td {
4813 table.code-difftable .code td {
4820 margin: 0;
4814 margin: 0;
4821 padding: 0;
4815 padding: 0;
4822 }
4816 }
4823 table.code-difftable .code pre {
4817 table.code-difftable .code pre {
4824 margin: 0;
4818 margin: 0;
4825 padding: 0;
4819 padding: 0;
4826 height: 17px;
4820 height: 17px;
4827 line-height: 17px;
4821 line-height: 17px;
4828 }
4822 }
4829
4823
4830
4824
4831 .diffblock.margined.comm .line .code:hover {
4825 .diffblock.margined.comm .line .code:hover {
4832 background-color: #FFFFCC !important;
4826 background-color: #FFFFCC !important;
4833 cursor: pointer !important;
4827 cursor: pointer !important;
4834 background-image: url("../images/icons/comment_add.png") !important;
4828 background-image: url("../images/icons/comment_add.png") !important;
4835 background-repeat: no-repeat !important;
4829 background-repeat: no-repeat !important;
4836 background-position: right !important;
4830 background-position: right !important;
4837 background-position: 0% 50% !important;
4831 background-position: 0% 50% !important;
4838 }
4832 }
4839 .diffblock.margined.comm .line .code.no-comment:hover {
4833 .diffblock.margined.comm .line .code.no-comment:hover {
4840 background-image: none !important;
4834 background-image: none !important;
4841 cursor: auto !important;
4835 cursor: auto !important;
4842 background-color: inherit !important;
4836 background-color: inherit !important;
4843 }
4837 }
4844
4838
4845 div.comment:target>.comment-wrapp {
4839 div.comment:target>.comment-wrapp {
4846 border: solid 2px #ee0 !important;
4840 border: solid 2px #ee0 !important;
4847 }
4841 }
4848
4842
4849 .lineno:target a {
4843 .lineno:target a {
4850 border: solid 2px #ee0 !important;
4844 border: solid 2px #ee0 !important;
4851 margin: -2px;
4845 margin: -2px;
4852 }
4846 }
@@ -1,2174 +1,2173 b''
1 /**
1 /**
2 RhodeCode JS Files
2 RhodeCode JS Files
3 **/
3 **/
4
4
5 if (typeof console == "undefined" || typeof console.log == "undefined"){
5 if (typeof console == "undefined" || typeof console.log == "undefined"){
6 console = { log: function() {} }
6 console = { log: function() {} }
7 }
7 }
8
8
9
9
10 var str_repeat = function(i, m) {
10 var str_repeat = function(i, m) {
11 for (var o = []; m > 0; o[--m] = i);
11 for (var o = []; m > 0; o[--m] = i);
12 return o.join('');
12 return o.join('');
13 };
13 };
14
14
15 /**
15 /**
16 * INJECT .format function into String
16 * INJECT .format function into String
17 * Usage: "My name is {0} {1}".format("Johny","Bravo")
17 * Usage: "My name is {0} {1}".format("Johny","Bravo")
18 * Return "My name is Johny Bravo"
18 * Return "My name is Johny Bravo"
19 * Inspired by https://gist.github.com/1049426
19 * Inspired by https://gist.github.com/1049426
20 */
20 */
21 String.prototype.format = function() {
21 String.prototype.format = function() {
22
22
23 function format() {
23 function format() {
24 var str = this;
24 var str = this;
25 var len = arguments.length+1;
25 var len = arguments.length+1;
26 var safe = undefined;
26 var safe = undefined;
27 var arg = undefined;
27 var arg = undefined;
28
28
29 // For each {0} {1} {n...} replace with the argument in that position. If
29 // For each {0} {1} {n...} replace with the argument in that position. If
30 // the argument is an object or an array it will be stringified to JSON.
30 // the argument is an object or an array it will be stringified to JSON.
31 for (var i=0; i < len; arg = arguments[i++]) {
31 for (var i=0; i < len; arg = arguments[i++]) {
32 safe = typeof arg === 'object' ? JSON.stringify(arg) : arg;
32 safe = typeof arg === 'object' ? JSON.stringify(arg) : arg;
33 str = str.replace(RegExp('\\{'+(i-1)+'\\}', 'g'), safe);
33 str = str.replace(RegExp('\\{'+(i-1)+'\\}', 'g'), safe);
34 }
34 }
35 return str;
35 return str;
36 }
36 }
37
37
38 // Save a reference of what may already exist under the property native.
38 // Save a reference of what may already exist under the property native.
39 // Allows for doing something like: if("".format.native) { /* use native */ }
39 // Allows for doing something like: if("".format.native) { /* use native */ }
40 format.native = String.prototype.format;
40 format.native = String.prototype.format;
41
41
42 // Replace the prototype property
42 // Replace the prototype property
43 return format;
43 return format;
44
44
45 }();
45 }();
46
46
47 String.prototype.strip = function(char) {
47 String.prototype.strip = function(char) {
48 if(char === undefined){
48 if(char === undefined){
49 char = '\\s';
49 char = '\\s';
50 }
50 }
51 return this.replace(new RegExp('^'+char+'+|'+char+'+$','g'), '');
51 return this.replace(new RegExp('^'+char+'+|'+char+'+$','g'), '');
52 }
52 }
53 String.prototype.lstrip = function(char) {
53 String.prototype.lstrip = function(char) {
54 if(char === undefined){
54 if(char === undefined){
55 char = '\\s';
55 char = '\\s';
56 }
56 }
57 return this.replace(new RegExp('^'+char+'+'),'');
57 return this.replace(new RegExp('^'+char+'+'),'');
58 }
58 }
59 String.prototype.rstrip = function(char) {
59 String.prototype.rstrip = function(char) {
60 if(char === undefined){
60 if(char === undefined){
61 char = '\\s';
61 char = '\\s';
62 }
62 }
63 return this.replace(new RegExp(''+char+'+$'),'');
63 return this.replace(new RegExp(''+char+'+$'),'');
64 }
64 }
65
65
66
66
67 if(!Array.prototype.indexOf) {
67 if(!Array.prototype.indexOf) {
68 Array.prototype.indexOf = function(needle) {
68 Array.prototype.indexOf = function(needle) {
69 for(var i = 0; i < this.length; i++) {
69 for(var i = 0; i < this.length; i++) {
70 if(this[i] === needle) {
70 if(this[i] === needle) {
71 return i;
71 return i;
72 }
72 }
73 }
73 }
74 return -1;
74 return -1;
75 };
75 };
76 }
76 }
77
77
78 // IE(CRAP) doesn't support previousElementSibling
78 // IE(CRAP) doesn't support previousElementSibling
79 var prevElementSibling = function( el ) {
79 var prevElementSibling = function( el ) {
80 if( el.previousElementSibling ) {
80 if( el.previousElementSibling ) {
81 return el.previousElementSibling;
81 return el.previousElementSibling;
82 } else {
82 } else {
83 while( el = el.previousSibling ) {
83 while( el = el.previousSibling ) {
84 if( el.nodeType === 1 ) return el;
84 if( el.nodeType === 1 ) return el;
85 }
85 }
86 }
86 }
87 }
87 }
88
88
89 /**
89 /**
90 * SmartColorGenerator
90 * SmartColorGenerator
91 *
91 *
92 *usage::
92 *usage::
93 * var CG = new ColorGenerator();
93 * var CG = new ColorGenerator();
94 * var col = CG.getColor(key); //returns array of RGB
94 * var col = CG.getColor(key); //returns array of RGB
95 * 'rgb({0})'.format(col.join(',')
95 * 'rgb({0})'.format(col.join(',')
96 *
96 *
97 * @returns {ColorGenerator}
97 * @returns {ColorGenerator}
98 */
98 */
99 var ColorGenerator = function(){
99 var ColorGenerator = function(){
100 this.GOLDEN_RATIO = 0.618033988749895;
100 this.GOLDEN_RATIO = 0.618033988749895;
101 this.CURRENT_RATIO = 0.22717784590367374 // this can be random
101 this.CURRENT_RATIO = 0.22717784590367374 // this can be random
102 this.HSV_1 = 0.75;//saturation
102 this.HSV_1 = 0.75;//saturation
103 this.HSV_2 = 0.95;
103 this.HSV_2 = 0.95;
104 this.color;
104 this.color;
105 this.cacheColorMap = {};
105 this.cacheColorMap = {};
106 };
106 };
107
107
108 ColorGenerator.prototype = {
108 ColorGenerator.prototype = {
109 getColor:function(key){
109 getColor:function(key){
110 if(this.cacheColorMap[key] !== undefined){
110 if(this.cacheColorMap[key] !== undefined){
111 return this.cacheColorMap[key];
111 return this.cacheColorMap[key];
112 }
112 }
113 else{
113 else{
114 this.cacheColorMap[key] = this.generateColor();
114 this.cacheColorMap[key] = this.generateColor();
115 return this.cacheColorMap[key];
115 return this.cacheColorMap[key];
116 }
116 }
117 },
117 },
118 _hsvToRgb:function(h,s,v){
118 _hsvToRgb:function(h,s,v){
119 if (s == 0.0)
119 if (s == 0.0)
120 return [v, v, v];
120 return [v, v, v];
121 i = parseInt(h * 6.0)
121 i = parseInt(h * 6.0)
122 f = (h * 6.0) - i
122 f = (h * 6.0) - i
123 p = v * (1.0 - s)
123 p = v * (1.0 - s)
124 q = v * (1.0 - s * f)
124 q = v * (1.0 - s * f)
125 t = v * (1.0 - s * (1.0 - f))
125 t = v * (1.0 - s * (1.0 - f))
126 i = i % 6
126 i = i % 6
127 if (i == 0)
127 if (i == 0)
128 return [v, t, p]
128 return [v, t, p]
129 if (i == 1)
129 if (i == 1)
130 return [q, v, p]
130 return [q, v, p]
131 if (i == 2)
131 if (i == 2)
132 return [p, v, t]
132 return [p, v, t]
133 if (i == 3)
133 if (i == 3)
134 return [p, q, v]
134 return [p, q, v]
135 if (i == 4)
135 if (i == 4)
136 return [t, p, v]
136 return [t, p, v]
137 if (i == 5)
137 if (i == 5)
138 return [v, p, q]
138 return [v, p, q]
139 },
139 },
140 generateColor:function(){
140 generateColor:function(){
141 this.CURRENT_RATIO = this.CURRENT_RATIO+this.GOLDEN_RATIO;
141 this.CURRENT_RATIO = this.CURRENT_RATIO+this.GOLDEN_RATIO;
142 this.CURRENT_RATIO = this.CURRENT_RATIO %= 1;
142 this.CURRENT_RATIO = this.CURRENT_RATIO %= 1;
143 HSV_tuple = [this.CURRENT_RATIO, this.HSV_1, this.HSV_2]
143 HSV_tuple = [this.CURRENT_RATIO, this.HSV_1, this.HSV_2]
144 RGB_tuple = this._hsvToRgb(HSV_tuple[0],HSV_tuple[1],HSV_tuple[2]);
144 RGB_tuple = this._hsvToRgb(HSV_tuple[0],HSV_tuple[1],HSV_tuple[2]);
145 function toRgb(v){
145 function toRgb(v){
146 return ""+parseInt(v*256)
146 return ""+parseInt(v*256)
147 }
147 }
148 return [toRgb(RGB_tuple[0]),toRgb(RGB_tuple[1]),toRgb(RGB_tuple[2])];
148 return [toRgb(RGB_tuple[0]),toRgb(RGB_tuple[1]),toRgb(RGB_tuple[2])];
149
149
150 }
150 }
151 }
151 }
152
152
153 /**
153 /**
154 * PyRoutesJS
154 * PyRoutesJS
155 *
155 *
156 * Usage pyroutes.url('mark_error_fixed',{"error_id":error_id}) // /mark_error_fixed/<error_id>
156 * Usage pyroutes.url('mark_error_fixed',{"error_id":error_id}) // /mark_error_fixed/<error_id>
157 */
157 */
158 var pyroutes = (function() {
158 var pyroutes = (function() {
159 // access global map defined in special file pyroutes
159 // access global map defined in special file pyroutes
160 var matchlist = PROUTES_MAP;
160 var matchlist = PROUTES_MAP;
161 var sprintf = (function() {
161 var sprintf = (function() {
162 function get_type(variable) {
162 function get_type(variable) {
163 return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();
163 return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();
164 }
164 }
165 function str_repeat(input, multiplier) {
165 function str_repeat(input, multiplier) {
166 for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */}
166 for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */}
167 return output.join('');
167 return output.join('');
168 }
168 }
169
169
170 var str_format = function() {
170 var str_format = function() {
171 if (!str_format.cache.hasOwnProperty(arguments[0])) {
171 if (!str_format.cache.hasOwnProperty(arguments[0])) {
172 str_format.cache[arguments[0]] = str_format.parse(arguments[0]);
172 str_format.cache[arguments[0]] = str_format.parse(arguments[0]);
173 }
173 }
174 return str_format.format.call(null, str_format.cache[arguments[0]], arguments);
174 return str_format.format.call(null, str_format.cache[arguments[0]], arguments);
175 };
175 };
176
176
177 str_format.format = function(parse_tree, argv) {
177 str_format.format = function(parse_tree, argv) {
178 var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;
178 var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;
179 for (i = 0; i < tree_length; i++) {
179 for (i = 0; i < tree_length; i++) {
180 node_type = get_type(parse_tree[i]);
180 node_type = get_type(parse_tree[i]);
181 if (node_type === 'string') {
181 if (node_type === 'string') {
182 output.push(parse_tree[i]);
182 output.push(parse_tree[i]);
183 }
183 }
184 else if (node_type === 'array') {
184 else if (node_type === 'array') {
185 match = parse_tree[i]; // convenience purposes only
185 match = parse_tree[i]; // convenience purposes only
186 if (match[2]) { // keyword argument
186 if (match[2]) { // keyword argument
187 arg = argv[cursor];
187 arg = argv[cursor];
188 for (k = 0; k < match[2].length; k++) {
188 for (k = 0; k < match[2].length; k++) {
189 if (!arg.hasOwnProperty(match[2][k])) {
189 if (!arg.hasOwnProperty(match[2][k])) {
190 throw(sprintf('[sprintf] property "%s" does not exist', match[2][k]));
190 throw(sprintf('[sprintf] property "%s" does not exist', match[2][k]));
191 }
191 }
192 arg = arg[match[2][k]];
192 arg = arg[match[2][k]];
193 }
193 }
194 }
194 }
195 else if (match[1]) { // positional argument (explicit)
195 else if (match[1]) { // positional argument (explicit)
196 arg = argv[match[1]];
196 arg = argv[match[1]];
197 }
197 }
198 else { // positional argument (implicit)
198 else { // positional argument (implicit)
199 arg = argv[cursor++];
199 arg = argv[cursor++];
200 }
200 }
201
201
202 if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {
202 if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {
203 throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)));
203 throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)));
204 }
204 }
205 switch (match[8]) {
205 switch (match[8]) {
206 case 'b': arg = arg.toString(2); break;
206 case 'b': arg = arg.toString(2); break;
207 case 'c': arg = String.fromCharCode(arg); break;
207 case 'c': arg = String.fromCharCode(arg); break;
208 case 'd': arg = parseInt(arg, 10); break;
208 case 'd': arg = parseInt(arg, 10); break;
209 case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;
209 case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;
210 case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;
210 case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;
211 case 'o': arg = arg.toString(8); break;
211 case 'o': arg = arg.toString(8); break;
212 case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;
212 case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;
213 case 'u': arg = Math.abs(arg); break;
213 case 'u': arg = Math.abs(arg); break;
214 case 'x': arg = arg.toString(16); break;
214 case 'x': arg = arg.toString(16); break;
215 case 'X': arg = arg.toString(16).toUpperCase(); break;
215 case 'X': arg = arg.toString(16).toUpperCase(); break;
216 }
216 }
217 arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);
217 arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);
218 pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';
218 pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';
219 pad_length = match[6] - String(arg).length;
219 pad_length = match[6] - String(arg).length;
220 pad = match[6] ? str_repeat(pad_character, pad_length) : '';
220 pad = match[6] ? str_repeat(pad_character, pad_length) : '';
221 output.push(match[5] ? arg + pad : pad + arg);
221 output.push(match[5] ? arg + pad : pad + arg);
222 }
222 }
223 }
223 }
224 return output.join('');
224 return output.join('');
225 };
225 };
226
226
227 str_format.cache = {};
227 str_format.cache = {};
228
228
229 str_format.parse = function(fmt) {
229 str_format.parse = function(fmt) {
230 var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;
230 var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;
231 while (_fmt) {
231 while (_fmt) {
232 if ((match = /^[^\x25]+/.exec(_fmt)) !== null) {
232 if ((match = /^[^\x25]+/.exec(_fmt)) !== null) {
233 parse_tree.push(match[0]);
233 parse_tree.push(match[0]);
234 }
234 }
235 else if ((match = /^\x25{2}/.exec(_fmt)) !== null) {
235 else if ((match = /^\x25{2}/.exec(_fmt)) !== null) {
236 parse_tree.push('%');
236 parse_tree.push('%');
237 }
237 }
238 else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {
238 else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {
239 if (match[2]) {
239 if (match[2]) {
240 arg_names |= 1;
240 arg_names |= 1;
241 var field_list = [], replacement_field = match[2], field_match = [];
241 var field_list = [], replacement_field = match[2], field_match = [];
242 if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
242 if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
243 field_list.push(field_match[1]);
243 field_list.push(field_match[1]);
244 while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
244 while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
245 if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
245 if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
246 field_list.push(field_match[1]);
246 field_list.push(field_match[1]);
247 }
247 }
248 else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) {
248 else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) {
249 field_list.push(field_match[1]);
249 field_list.push(field_match[1]);
250 }
250 }
251 else {
251 else {
252 throw('[sprintf] huh?');
252 throw('[sprintf] huh?');
253 }
253 }
254 }
254 }
255 }
255 }
256 else {
256 else {
257 throw('[sprintf] huh?');
257 throw('[sprintf] huh?');
258 }
258 }
259 match[2] = field_list;
259 match[2] = field_list;
260 }
260 }
261 else {
261 else {
262 arg_names |= 2;
262 arg_names |= 2;
263 }
263 }
264 if (arg_names === 3) {
264 if (arg_names === 3) {
265 throw('[sprintf] mixing positional and named placeholders is not (yet) supported');
265 throw('[sprintf] mixing positional and named placeholders is not (yet) supported');
266 }
266 }
267 parse_tree.push(match);
267 parse_tree.push(match);
268 }
268 }
269 else {
269 else {
270 throw('[sprintf] huh?');
270 throw('[sprintf] huh?');
271 }
271 }
272 _fmt = _fmt.substring(match[0].length);
272 _fmt = _fmt.substring(match[0].length);
273 }
273 }
274 return parse_tree;
274 return parse_tree;
275 };
275 };
276
276
277 return str_format;
277 return str_format;
278 })();
278 })();
279
279
280 var vsprintf = function(fmt, argv) {
280 var vsprintf = function(fmt, argv) {
281 argv.unshift(fmt);
281 argv.unshift(fmt);
282 return sprintf.apply(null, argv);
282 return sprintf.apply(null, argv);
283 };
283 };
284 return {
284 return {
285 'url': function(route_name, params) {
285 'url': function(route_name, params) {
286 var result = route_name;
286 var result = route_name;
287 if (typeof(params) != 'object'){
287 if (typeof(params) != 'object'){
288 params = {};
288 params = {};
289 }
289 }
290 if (matchlist.hasOwnProperty(route_name)) {
290 if (matchlist.hasOwnProperty(route_name)) {
291 var route = matchlist[route_name];
291 var route = matchlist[route_name];
292 // param substitution
292 // param substitution
293 for(var i=0; i < route[1].length; i++) {
293 for(var i=0; i < route[1].length; i++) {
294
294
295 if (!params.hasOwnProperty(route[1][i]))
295 if (!params.hasOwnProperty(route[1][i]))
296 throw new Error(route[1][i] + ' missing in "' + route_name + '" route generation');
296 throw new Error(route[1][i] + ' missing in "' + route_name + '" route generation');
297 }
297 }
298 result = sprintf(route[0], params);
298 result = sprintf(route[0], params);
299
299
300 var ret = [];
300 var ret = [];
301 //extra params => GET
301 //extra params => GET
302 for(param in params){
302 for(param in params){
303 if (route[1].indexOf(param) == -1){
303 if (route[1].indexOf(param) == -1){
304 ret.push(encodeURIComponent(param) + "=" + encodeURIComponent(params[param]));
304 ret.push(encodeURIComponent(param) + "=" + encodeURIComponent(params[param]));
305 }
305 }
306 }
306 }
307 var _parts = ret.join("&");
307 var _parts = ret.join("&");
308 if(_parts){
308 if(_parts){
309 result = result +'?'+ _parts
309 result = result +'?'+ _parts
310 }
310 }
311 }
311 }
312
312
313 return result;
313 return result;
314 },
314 },
315 'register': function(route_name, route_tmpl, req_params) {
315 'register': function(route_name, route_tmpl, req_params) {
316 if (typeof(req_params) != 'object') {
316 if (typeof(req_params) != 'object') {
317 req_params = [];
317 req_params = [];
318 }
318 }
319 //fix escape
319 //fix escape
320 route_tmpl = unescape(route_tmpl);
320 route_tmpl = unescape(route_tmpl);
321 keys = [];
321 keys = [];
322 for (o in req_params){
322 for (o in req_params){
323 keys.push(req_params[o])
323 keys.push(req_params[o])
324 }
324 }
325 matchlist[route_name] = [
325 matchlist[route_name] = [
326 route_tmpl,
326 route_tmpl,
327 keys
327 keys
328 ]
328 ]
329 },
329 },
330 '_routes': function(){
330 '_routes': function(){
331 return matchlist;
331 return matchlist;
332 }
332 }
333 }
333 }
334 })();
334 })();
335
335
336
336
337
337
338 /**
338 /**
339 * GLOBAL YUI Shortcuts
339 * GLOBAL YUI Shortcuts
340 */
340 */
341 var YUC = YAHOO.util.Connect;
341 var YUC = YAHOO.util.Connect;
342 var YUD = YAHOO.util.Dom;
342 var YUD = YAHOO.util.Dom;
343 var YUE = YAHOO.util.Event;
343 var YUE = YAHOO.util.Event;
344 var YUQ = YAHOO.util.Selector.query;
344 var YUQ = YAHOO.util.Selector.query;
345
345
346 // defines if push state is enabled for this browser ?
346 // defines if push state is enabled for this browser ?
347 var push_state_enabled = Boolean(
347 var push_state_enabled = Boolean(
348 window.history && window.history.pushState && window.history.replaceState
348 window.history && window.history.pushState && window.history.replaceState
349 && !( /* disable for versions of iOS before version 4.3 (8F190) */
349 && !( /* disable for versions of iOS before version 4.3 (8F190) */
350 (/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i).test(navigator.userAgent)
350 (/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i).test(navigator.userAgent)
351 /* disable for the mercury iOS browser, or at least older versions of the webkit engine */
351 /* disable for the mercury iOS browser, or at least older versions of the webkit engine */
352 || (/AppleWebKit\/5([0-2]|3[0-2])/i).test(navigator.userAgent)
352 || (/AppleWebKit\/5([0-2]|3[0-2])/i).test(navigator.userAgent)
353 )
353 )
354 );
354 );
355
355
356 var _run_callbacks = function(callbacks){
356 var _run_callbacks = function(callbacks){
357 if (callbacks !== undefined){
357 if (callbacks !== undefined){
358 var _l = callbacks.length;
358 var _l = callbacks.length;
359 for (var i=0;i<_l;i++){
359 for (var i=0;i<_l;i++){
360 var func = callbacks[i];
360 var func = callbacks[i];
361 if(typeof(func)=='function'){
361 if(typeof(func)=='function'){
362 try{
362 try{
363 func();
363 func();
364 }catch (err){};
364 }catch (err){};
365 }
365 }
366 }
366 }
367 }
367 }
368 }
368 }
369
369
370 /**
370 /**
371 * Partial Ajax Implementation
371 * Partial Ajax Implementation
372 *
372 *
373 * @param url: defines url to make partial request
373 * @param url: defines url to make partial request
374 * @param container: defines id of container to input partial result
374 * @param container: defines id of container to input partial result
375 * @param s_call: success callback function that takes o as arg
375 * @param s_call: success callback function that takes o as arg
376 * o.tId
376 * o.tId
377 * o.status
377 * o.status
378 * o.statusText
378 * o.statusText
379 * o.getResponseHeader[ ]
379 * o.getResponseHeader[ ]
380 * o.getAllResponseHeaders
380 * o.getAllResponseHeaders
381 * o.responseText
381 * o.responseText
382 * o.responseXML
382 * o.responseXML
383 * o.argument
383 * o.argument
384 * @param f_call: failure callback
384 * @param f_call: failure callback
385 * @param args arguments
385 * @param args arguments
386 */
386 */
387 function ypjax(url,container,s_call,f_call,args){
387 function ypjax(url,container,s_call,f_call,args){
388 var method='GET';
388 var method='GET';
389 if(args===undefined){
389 if(args===undefined){
390 args=null;
390 args=null;
391 }
391 }
392
392
393 // Set special header for partial ajax == HTTP_X_PARTIAL_XHR
393 // Set special header for partial ajax == HTTP_X_PARTIAL_XHR
394 YUC.initHeader('X-PARTIAL-XHR',true);
394 YUC.initHeader('X-PARTIAL-XHR',true);
395
395
396 // wrapper of passed callback
396 // wrapper of passed callback
397 var s_wrapper = (function(o){
397 var s_wrapper = (function(o){
398 return function(o){
398 return function(o){
399 YUD.get(container).innerHTML=o.responseText;
399 YUD.get(container).innerHTML=o.responseText;
400 YUD.setStyle(container,'opacity','1.0');
400 YUD.setStyle(container,'opacity','1.0');
401 //execute the given original callback
401 //execute the given original callback
402 if (s_call !== undefined){
402 if (s_call !== undefined){
403 s_call(o);
403 s_call(o);
404 }
404 }
405 }
405 }
406 })()
406 })()
407 YUD.setStyle(container,'opacity','0.3');
407 YUD.setStyle(container,'opacity','0.3');
408 YUC.asyncRequest(method,url,{
408 YUC.asyncRequest(method,url,{
409 success:s_wrapper,
409 success:s_wrapper,
410 failure:function(o){
410 failure:function(o){
411 console.log(o);
411 console.log(o);
412 YUD.get(container).innerHTML='<span class="error_red">ERROR: {0}</span>'.format(o.status);
412 YUD.get(container).innerHTML='<span class="error_red">ERROR: {0}</span>'.format(o.status);
413 YUD.setStyle(container,'opacity','1.0');
413 YUD.setStyle(container,'opacity','1.0');
414 },
414 },
415 cache:false
415 cache:false
416 },args);
416 },args);
417
417
418 };
418 };
419
419
420 var ajaxGET = function(url,success) {
420 var ajaxGET = function(url,success) {
421 // Set special header for ajax == HTTP_X_PARTIAL_XHR
421 // Set special header for ajax == HTTP_X_PARTIAL_XHR
422 YUC.initHeader('X-PARTIAL-XHR',true);
422 YUC.initHeader('X-PARTIAL-XHR',true);
423
423
424 var sUrl = url;
424 var sUrl = url;
425 var callback = {
425 var callback = {
426 success: success,
426 success: success,
427 failure: function (o) {
427 failure: function (o) {
428 alert("error");
428 alert("error");
429 },
429 },
430 };
430 };
431
431
432 var request = YAHOO.util.Connect.asyncRequest('GET', sUrl, callback);
432 var request = YAHOO.util.Connect.asyncRequest('GET', sUrl, callback);
433 return request;
433 return request;
434 };
434 };
435
435
436
436
437
437
438 var ajaxPOST = function(url,postData,success) {
438 var ajaxPOST = function(url,postData,success) {
439 // Set special header for ajax == HTTP_X_PARTIAL_XHR
439 // Set special header for ajax == HTTP_X_PARTIAL_XHR
440 YUC.initHeader('X-PARTIAL-XHR',true);
440 YUC.initHeader('X-PARTIAL-XHR',true);
441
441
442 var toQueryString = function(o) {
442 var toQueryString = function(o) {
443 if(typeof o !== 'object') {
443 if(typeof o !== 'object') {
444 return false;
444 return false;
445 }
445 }
446 var _p, _qs = [];
446 var _p, _qs = [];
447 for(_p in o) {
447 for(_p in o) {
448 _qs.push(encodeURIComponent(_p) + '=' + encodeURIComponent(o[_p]));
448 _qs.push(encodeURIComponent(_p) + '=' + encodeURIComponent(o[_p]));
449 }
449 }
450 return _qs.join('&');
450 return _qs.join('&');
451 };
451 };
452
452
453 var sUrl = url;
453 var sUrl = url;
454 var callback = {
454 var callback = {
455 success: success,
455 success: success,
456 failure: function (o) {
456 failure: function (o) {
457 alert("error");
457 alert("error");
458 },
458 },
459 };
459 };
460 var postData = toQueryString(postData);
460 var postData = toQueryString(postData);
461 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
461 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
462 return request;
462 return request;
463 };
463 };
464
464
465
465
466 /**
466 /**
467 * tooltip activate
467 * tooltip activate
468 */
468 */
469 var tooltip_activate = function(){
469 var tooltip_activate = function(){
470 yt = YAHOO.yuitip.main;
470 yt = YAHOO.yuitip.main;
471 YUE.onDOMReady(yt.init);
471 YUE.onDOMReady(yt.init);
472 };
472 };
473
473
474 /**
474 /**
475 * show more
475 * show more
476 */
476 */
477 var show_more_event = function(){
477 var show_more_event = function(){
478 YUE.on(YUD.getElementsByClassName('show_more'),'click',function(e){
478 YUE.on(YUD.getElementsByClassName('show_more'),'click',function(e){
479 var el = e.target;
479 var el = e.target;
480 YUD.setStyle(YUD.get(el.id.substring(1)),'display','');
480 YUD.setStyle(YUD.get(el.id.substring(1)),'display','');
481 YUD.setStyle(el.parentNode,'display','none');
481 YUD.setStyle(el.parentNode,'display','none');
482 });
482 });
483 };
483 };
484
484
485 /**
485 /**
486 * show changeset tooltip
486 * show changeset tooltip
487 */
487 */
488 var show_changeset_tooltip = function(){
488 var show_changeset_tooltip = function(){
489 YUE.on(YUD.getElementsByClassName('lazy-cs'), 'mouseover', function(e){
489 YUE.on(YUD.getElementsByClassName('lazy-cs'), 'mouseover', function(e){
490 var target = e.currentTarget;
490 var target = e.currentTarget;
491 var rid = YUD.getAttribute(target,'raw_id');
491 var rid = YUD.getAttribute(target,'raw_id');
492 var repo_name = YUD.getAttribute(target,'repo_name');
492 var repo_name = YUD.getAttribute(target,'repo_name');
493 var ttid = 'tt-'+rid;
493 var ttid = 'tt-'+rid;
494 var success = function(o){
494 var success = function(o){
495 var json = JSON.parse(o.responseText);
495 var json = JSON.parse(o.responseText);
496 YUD.addClass(target,'tooltip')
496 YUD.addClass(target,'tooltip')
497 YUD.setAttribute(target, 'title',json['message']);
497 YUD.setAttribute(target, 'title',json['message']);
498 YAHOO.yuitip.main.show_yuitip(e, target);
498 YAHOO.yuitip.main.show_yuitip(e, target);
499 }
499 }
500 if(rid && !YUD.hasClass(target, 'tooltip')){
500 if(rid && !YUD.hasClass(target, 'tooltip')){
501 YUD.setAttribute(target,'id',ttid);
501 YUD.setAttribute(target,'id',ttid);
502 YUD.setAttribute(target, 'title',_TM['loading...']);
502 YUD.setAttribute(target, 'title',_TM['loading...']);
503 YAHOO.yuitip.main.set_listeners(target);
503 YAHOO.yuitip.main.set_listeners(target);
504 YAHOO.yuitip.main.show_yuitip(e, target);
504 YAHOO.yuitip.main.show_yuitip(e, target);
505 var url = pyroutes.url('changeset_info', {"repo_name":repo_name, "revision": rid});
505 var url = pyroutes.url('changeset_info', {"repo_name":repo_name, "revision": rid});
506 ajaxGET(url, success)
506 ajaxGET(url, success)
507 }
507 }
508 });
508 });
509 };
509 };
510
510
511 var onSuccessFollow = function(target){
511 var onSuccessFollow = function(target){
512 var f = YUD.get(target);
512 var f = YUD.get(target);
513 var f_cnt = YUD.get('current_followers_count');
513 var f_cnt = YUD.get('current_followers_count');
514
514
515 if(YUD.hasClass(f, 'follow')){
515 if(YUD.hasClass(f, 'follow')){
516 f.setAttribute('class','following');
516 f.setAttribute('class','following');
517 f.setAttribute('title',_TM['Stop following this repository']);
517 f.setAttribute('title',_TM['Stop following this repository']);
518
518
519 if(f_cnt){
519 if(f_cnt){
520 var cnt = Number(f_cnt.innerHTML)+1;
520 var cnt = Number(f_cnt.innerHTML)+1;
521 f_cnt.innerHTML = cnt;
521 f_cnt.innerHTML = cnt;
522 }
522 }
523 }
523 }
524 else{
524 else{
525 f.setAttribute('class','follow');
525 f.setAttribute('class','follow');
526 f.setAttribute('title',_TM['Start following this repository']);
526 f.setAttribute('title',_TM['Start following this repository']);
527 if(f_cnt){
527 if(f_cnt){
528 var cnt = Number(f_cnt.innerHTML)-1;
528 var cnt = Number(f_cnt.innerHTML)-1;
529 f_cnt.innerHTML = cnt;
529 f_cnt.innerHTML = cnt;
530 }
530 }
531 }
531 }
532 }
532 }
533
533
534 var toggleFollowingUser = function(target,fallows_user_id,token,user_id){
534 var toggleFollowingUser = function(target,fallows_user_id,token,user_id){
535 args = 'follows_user_id='+fallows_user_id;
535 args = 'follows_user_id='+fallows_user_id;
536 args+= '&amp;auth_token='+token;
536 args+= '&amp;auth_token='+token;
537 if(user_id != undefined){
537 if(user_id != undefined){
538 args+="&amp;user_id="+user_id;
538 args+="&amp;user_id="+user_id;
539 }
539 }
540 YUC.asyncRequest('POST',TOGGLE_FOLLOW_URL,{
540 YUC.asyncRequest('POST',TOGGLE_FOLLOW_URL,{
541 success:function(o){
541 success:function(o){
542 onSuccessFollow(target);
542 onSuccessFollow(target);
543 }
543 }
544 },args);
544 },args);
545 return false;
545 return false;
546 }
546 }
547
547
548 var toggleFollowingRepo = function(target,fallows_repo_id,token,user_id){
548 var toggleFollowingRepo = function(target,fallows_repo_id,token,user_id){
549
549
550 args = 'follows_repo_id='+fallows_repo_id;
550 args = 'follows_repo_id='+fallows_repo_id;
551 args+= '&amp;auth_token='+token;
551 args+= '&amp;auth_token='+token;
552 if(user_id != undefined){
552 if(user_id != undefined){
553 args+="&amp;user_id="+user_id;
553 args+="&amp;user_id="+user_id;
554 }
554 }
555 YUC.asyncRequest('POST',TOGGLE_FOLLOW_URL,{
555 YUC.asyncRequest('POST',TOGGLE_FOLLOW_URL,{
556 success:function(o){
556 success:function(o){
557 onSuccessFollow(target);
557 onSuccessFollow(target);
558 }
558 }
559 },args);
559 },args);
560 return false;
560 return false;
561 }
561 }
562
562
563 var showRepoSize = function(target, repo_name, token){
563 var showRepoSize = function(target, repo_name, token){
564 var args= 'auth_token='+token;
564 var args= 'auth_token='+token;
565
565
566 if(!YUD.hasClass(target, 'loaded')){
566 if(!YUD.hasClass(target, 'loaded')){
567 YUD.get(target).innerHTML = _TM['Loading ...'];
567 YUD.get(target).innerHTML = _TM['Loading ...'];
568 var url = pyroutes.url('repo_size', {"repo_name":repo_name});
568 var url = pyroutes.url('repo_size', {"repo_name":repo_name});
569 YUC.asyncRequest('POST',url,{
569 YUC.asyncRequest('POST',url,{
570 success:function(o){
570 success:function(o){
571 YUD.get(target).innerHTML = JSON.parse(o.responseText);
571 YUD.get(target).innerHTML = JSON.parse(o.responseText);
572 YUD.addClass(target, 'loaded');
572 YUD.addClass(target, 'loaded');
573 }
573 }
574 },args);
574 },args);
575 }
575 }
576 return false;
576 return false;
577 }
577 }
578
578
579
580 /**
579 /**
581 * TOOLTIP IMPL.
580 * TOOLTIP IMPL.
582 */
581 */
583 YAHOO.namespace('yuitip');
582 YAHOO.namespace('yuitip');
584 YAHOO.yuitip.main = {
583 YAHOO.yuitip.main = {
585
584
586 $: YAHOO.util.Dom.get,
585 $: YAHOO.util.Dom.get,
587
586
588 bgColor: '#000',
587 bgColor: '#000',
589 speed: 0.3,
588 speed: 0.3,
590 opacity: 0.9,
589 opacity: 0.9,
591 offset: [15,15],
590 offset: [15,15],
592 useAnim: false,
591 useAnim: false,
593 maxWidth: 600,
592 maxWidth: 600,
594 add_links: false,
593 add_links: false,
595 yuitips: [],
594 yuitips: [],
596
595
597 set_listeners: function(tt){
596 set_listeners: function(tt){
598 YUE.on(tt, 'mouseover', yt.show_yuitip, tt);
597 YUE.on(tt, 'mouseover', yt.show_yuitip, tt);
599 YUE.on(tt, 'mousemove', yt.move_yuitip, tt);
598 YUE.on(tt, 'mousemove', yt.move_yuitip, tt);
600 YUE.on(tt, 'mouseout', yt.close_yuitip, tt);
599 YUE.on(tt, 'mouseout', yt.close_yuitip, tt);
601 },
600 },
602
601
603 init: function(){
602 init: function(){
604 yt.tipBox = yt.$('tip-box');
603 yt.tipBox = yt.$('tip-box');
605 if(!yt.tipBox){
604 if(!yt.tipBox){
606 yt.tipBox = document.createElement('div');
605 yt.tipBox = document.createElement('div');
607 document.body.appendChild(yt.tipBox);
606 document.body.appendChild(yt.tipBox);
608 yt.tipBox.id = 'tip-box';
607 yt.tipBox.id = 'tip-box';
609 }
608 }
610
609
611 YUD.setStyle(yt.tipBox, 'display', 'none');
610 YUD.setStyle(yt.tipBox, 'display', 'none');
612 YUD.setStyle(yt.tipBox, 'position', 'absolute');
611 YUD.setStyle(yt.tipBox, 'position', 'absolute');
613 if(yt.maxWidth !== null){
612 if(yt.maxWidth !== null){
614 YUD.setStyle(yt.tipBox, 'max-width', yt.maxWidth+'px');
613 YUD.setStyle(yt.tipBox, 'max-width', yt.maxWidth+'px');
615 }
614 }
616
615
617 var yuitips = YUD.getElementsByClassName('tooltip');
616 var yuitips = YUD.getElementsByClassName('tooltip');
618
617
619 if(yt.add_links === true){
618 if(yt.add_links === true){
620 var links = document.getElementsByTagName('a');
619 var links = document.getElementsByTagName('a');
621 var linkLen = links.length;
620 var linkLen = links.length;
622 for(i=0;i<linkLen;i++){
621 for(i=0;i<linkLen;i++){
623 yuitips.push(links[i]);
622 yuitips.push(links[i]);
624 }
623 }
625 }
624 }
626
625
627 var yuiLen = yuitips.length;
626 var yuiLen = yuitips.length;
628
627
629 for(i=0;i<yuiLen;i++){
628 for(i=0;i<yuiLen;i++){
630 yt.set_listeners(yuitips[i]);
629 yt.set_listeners(yuitips[i]);
631 }
630 }
632 },
631 },
633
632
634 show_yuitip: function(e, el){
633 show_yuitip: function(e, el){
635 YUE.stopEvent(e);
634 YUE.stopEvent(e);
636 if(el.tagName.toLowerCase() === 'img'){
635 if(el.tagName.toLowerCase() === 'img'){
637 yt.tipText = el.alt ? el.alt : '';
636 yt.tipText = el.alt ? el.alt : '';
638 } else {
637 } else {
639 yt.tipText = el.title ? el.title : '';
638 yt.tipText = el.title ? el.title : '';
640 }
639 }
641
640
642 if(yt.tipText !== ''){
641 if(yt.tipText !== ''){
643 // save org title
642 // save org title
644 YUD.setAttribute(el, 'tt_title', yt.tipText);
643 YUD.setAttribute(el, 'tt_title', yt.tipText);
645 // reset title to not show org tooltips
644 // reset title to not show org tooltips
646 YUD.setAttribute(el, 'title', '');
645 YUD.setAttribute(el, 'title', '');
647
646
648 yt.tipBox.innerHTML = yt.tipText;
647 yt.tipBox.innerHTML = yt.tipText;
649 YUD.setStyle(yt.tipBox, 'display', 'block');
648 YUD.setStyle(yt.tipBox, 'display', 'block');
650 if(yt.useAnim === true){
649 if(yt.useAnim === true){
651 YUD.setStyle(yt.tipBox, 'opacity', '0');
650 YUD.setStyle(yt.tipBox, 'opacity', '0');
652 var newAnim = new YAHOO.util.Anim(yt.tipBox,
651 var newAnim = new YAHOO.util.Anim(yt.tipBox,
653 {
652 {
654 opacity: { to: yt.opacity }
653 opacity: { to: yt.opacity }
655 }, yt.speed, YAHOO.util.Easing.easeOut
654 }, yt.speed, YAHOO.util.Easing.easeOut
656 );
655 );
657 newAnim.animate();
656 newAnim.animate();
658 }
657 }
659 }
658 }
660 },
659 },
661
660
662 move_yuitip: function(e, el){
661 move_yuitip: function(e, el){
663 YUE.stopEvent(e);
662 YUE.stopEvent(e);
664 var movePos = YUE.getXY(e);
663 var movePos = YUE.getXY(e);
665 YUD.setStyle(yt.tipBox, 'top', (movePos[1] + yt.offset[1]) + 'px');
664 YUD.setStyle(yt.tipBox, 'top', (movePos[1] + yt.offset[1]) + 'px');
666 YUD.setStyle(yt.tipBox, 'left', (movePos[0] + yt.offset[0]) + 'px');
665 YUD.setStyle(yt.tipBox, 'left', (movePos[0] + yt.offset[0]) + 'px');
667 },
666 },
668
667
669 close_yuitip: function(e, el){
668 close_yuitip: function(e, el){
670 YUE.stopEvent(e);
669 YUE.stopEvent(e);
671
670
672 if(yt.useAnim === true){
671 if(yt.useAnim === true){
673 var newAnim = new YAHOO.util.Anim(yt.tipBox,
672 var newAnim = new YAHOO.util.Anim(yt.tipBox,
674 {
673 {
675 opacity: { to: 0 }
674 opacity: { to: 0 }
676 }, yt.speed, YAHOO.util.Easing.easeOut
675 }, yt.speed, YAHOO.util.Easing.easeOut
677 );
676 );
678 newAnim.animate();
677 newAnim.animate();
679 } else {
678 } else {
680 YUD.setStyle(yt.tipBox, 'display', 'none');
679 YUD.setStyle(yt.tipBox, 'display', 'none');
681 }
680 }
682 YUD.setAttribute(el,'title', YUD.getAttribute(el, 'tt_title'));
681 YUD.setAttribute(el,'title', YUD.getAttribute(el, 'tt_title'));
683 }
682 }
684 }
683 }
685
684
686 /**
685 /**
687 * Quick filter widget
686 * Quick filter widget
688 *
687 *
689 * @param target: filter input target
688 * @param target: filter input target
690 * @param nodes: list of nodes in html we want to filter.
689 * @param nodes: list of nodes in html we want to filter.
691 * @param display_element function that takes current node from nodes and
690 * @param display_element function that takes current node from nodes and
692 * does hide or show based on the node
691 * does hide or show based on the node
693 *
692 *
694 */
693 */
695 var q_filter = function(target,nodes,display_element){
694 var q_filter = function(target,nodes,display_element){
696
695
697 var nodes = nodes;
696 var nodes = nodes;
698 var q_filter_field = YUD.get(target);
697 var q_filter_field = YUD.get(target);
699 var F = YAHOO.namespace(target);
698 var F = YAHOO.namespace(target);
700
699
701 YUE.on(q_filter_field,'click',function(){
700 YUE.on(q_filter_field,'click',function(){
702 q_filter_field.value = '';
701 q_filter_field.value = '';
703 });
702 });
704
703
705 YUE.on(q_filter_field,'keyup',function(e){
704 YUE.on(q_filter_field,'keyup',function(e){
706 clearTimeout(F.filterTimeout);
705 clearTimeout(F.filterTimeout);
707 F.filterTimeout = setTimeout(F.updateFilter,600);
706 F.filterTimeout = setTimeout(F.updateFilter,600);
708 });
707 });
709
708
710 F.filterTimeout = null;
709 F.filterTimeout = null;
711
710
712 var show_node = function(node){
711 var show_node = function(node){
713 YUD.setStyle(node,'display','')
712 YUD.setStyle(node,'display','')
714 }
713 }
715 var hide_node = function(node){
714 var hide_node = function(node){
716 YUD.setStyle(node,'display','none');
715 YUD.setStyle(node,'display','none');
717 }
716 }
718
717
719 F.updateFilter = function() {
718 F.updateFilter = function() {
720 // Reset timeout
719 // Reset timeout
721 F.filterTimeout = null;
720 F.filterTimeout = null;
722
721
723 var obsolete = [];
722 var obsolete = [];
724
723
725 var req = q_filter_field.value.toLowerCase();
724 var req = q_filter_field.value.toLowerCase();
726
725
727 var l = nodes.length;
726 var l = nodes.length;
728 var i;
727 var i;
729 var showing = 0;
728 var showing = 0;
730
729
731 for (i=0;i<l;i++ ){
730 for (i=0;i<l;i++ ){
732 var n = nodes[i];
731 var n = nodes[i];
733 var target_element = display_element(n)
732 var target_element = display_element(n)
734 if(req && n.innerHTML.toLowerCase().indexOf(req) == -1){
733 if(req && n.innerHTML.toLowerCase().indexOf(req) == -1){
735 hide_node(target_element);
734 hide_node(target_element);
736 }
735 }
737 else{
736 else{
738 show_node(target_element);
737 show_node(target_element);
739 showing+=1;
738 showing+=1;
740 }
739 }
741 }
740 }
742
741
743 // if repo_count is set update the number
742 // if repo_count is set update the number
744 var cnt = YUD.get('repo_count');
743 var cnt = YUD.get('repo_count');
745 if(cnt){
744 if(cnt){
746 YUD.get('repo_count').innerHTML = showing;
745 YUD.get('repo_count').innerHTML = showing;
747 }
746 }
748
747
749 }
748 }
750 };
749 };
751
750
752 var tableTr = function(cls, body){
751 var tableTr = function(cls, body){
753 var _el = document.createElement('div');
752 var _el = document.createElement('div');
754 var cont = new YAHOO.util.Element(body);
753 var cont = new YAHOO.util.Element(body);
755 var comment_id = fromHTML(body).children[0].id.split('comment-')[1];
754 var comment_id = fromHTML(body).children[0].id.split('comment-')[1];
756 var id = 'comment-tr-{0}'.format(comment_id);
755 var id = 'comment-tr-{0}'.format(comment_id);
757 var _html = ('<table><tbody><tr id="{0}" class="{1}">'+
756 var _html = ('<table><tbody><tr id="{0}" class="{1}">'+
758 '<td class="lineno-inline new-inline"></td>'+
757 '<td class="lineno-inline new-inline"></td>'+
759 '<td class="lineno-inline old-inline"></td>'+
758 '<td class="lineno-inline old-inline"></td>'+
760 '<td>{2}</td>'+
759 '<td>{2}</td>'+
761 '</tr></tbody></table>').format(id, cls, body);
760 '</tr></tbody></table>').format(id, cls, body);
762 _el.innerHTML = _html;
761 _el.innerHTML = _html;
763 return _el.children[0].children[0].children[0];
762 return _el.children[0].children[0].children[0];
764 };
763 };
765
764
766 /** comments **/
765 /** comments **/
767 var removeInlineForm = function(form) {
766 var removeInlineForm = function(form) {
768 form.parentNode.removeChild(form);
767 form.parentNode.removeChild(form);
769 };
768 };
770
769
771 var createInlineForm = function(parent_tr, f_path, line) {
770 var createInlineForm = function(parent_tr, f_path, line) {
772 var tmpl = YUD.get('comment-inline-form-template').innerHTML;
771 var tmpl = YUD.get('comment-inline-form-template').innerHTML;
773 tmpl = tmpl.format(f_path, line);
772 tmpl = tmpl.format(f_path, line);
774 var form = tableTr('comment-form-inline',tmpl)
773 var form = tableTr('comment-form-inline',tmpl)
775
774
776 // create event for hide button
775 // create event for hide button
777 form = new YAHOO.util.Element(form);
776 form = new YAHOO.util.Element(form);
778 var form_hide_button = new YAHOO.util.Element(YUD.getElementsByClassName('hide-inline-form',null,form)[0]);
777 var form_hide_button = new YAHOO.util.Element(YUD.getElementsByClassName('hide-inline-form',null,form)[0]);
779 form_hide_button.on('click', function(e) {
778 form_hide_button.on('click', function(e) {
780 var newtr = e.currentTarget.parentNode.parentNode.parentNode.parentNode.parentNode;
779 var newtr = e.currentTarget.parentNode.parentNode.parentNode.parentNode.parentNode;
781 if(YUD.hasClass(newtr.nextElementSibling,'inline-comments-button')){
780 if(YUD.hasClass(newtr.nextElementSibling,'inline-comments-button')){
782 YUD.setStyle(newtr.nextElementSibling,'display','');
781 YUD.setStyle(newtr.nextElementSibling,'display','');
783 }
782 }
784 removeInlineForm(newtr);
783 removeInlineForm(newtr);
785 YUD.removeClass(parent_tr, 'form-open');
784 YUD.removeClass(parent_tr, 'form-open');
786 YUD.removeClass(parent_tr, 'hl-comment');
785 YUD.removeClass(parent_tr, 'hl-comment');
787
786
788 });
787 });
789
788
790 return form
789 return form
791 };
790 };
792
791
793 /**
792 /**
794 * Inject inline comment for on given TR this tr should be always an .line
793 * Inject inline comment for on given TR this tr should be always an .line
795 * tr containing the line. Code will detect comment, and always put the comment
794 * tr containing the line. Code will detect comment, and always put the comment
796 * block at the very bottom
795 * block at the very bottom
797 */
796 */
798 var injectInlineForm = function(tr){
797 var injectInlineForm = function(tr){
799 if(!YUD.hasClass(tr, 'line')){
798 if(!YUD.hasClass(tr, 'line')){
800 return
799 return
801 }
800 }
802 var submit_url = AJAX_COMMENT_URL;
801 var submit_url = AJAX_COMMENT_URL;
803 var _td = YUD.getElementsByClassName('code',null,tr)[0];
802 var _td = YUD.getElementsByClassName('code',null,tr)[0];
804 if(YUD.hasClass(tr,'form-open') || YUD.hasClass(tr,'context') || YUD.hasClass(_td,'no-comment')){
803 if(YUD.hasClass(tr,'form-open') || YUD.hasClass(tr,'context') || YUD.hasClass(_td,'no-comment')){
805 return
804 return
806 }
805 }
807 YUD.addClass(tr,'form-open');
806 YUD.addClass(tr,'form-open');
808 YUD.addClass(tr,'hl-comment');
807 YUD.addClass(tr,'hl-comment');
809 var node = YUD.getElementsByClassName('full_f_path',null,tr.parentNode.parentNode.parentNode)[0];
808 var node = YUD.getElementsByClassName('full_f_path',null,tr.parentNode.parentNode.parentNode)[0];
810 var f_path = YUD.getAttribute(node,'path');
809 var f_path = YUD.getAttribute(node,'path');
811 var lineno = getLineNo(tr);
810 var lineno = getLineNo(tr);
812 var form = createInlineForm(tr, f_path, lineno, submit_url);
811 var form = createInlineForm(tr, f_path, lineno, submit_url);
813
812
814 var parent = tr;
813 var parent = tr;
815 while (1){
814 while (1){
816 var n = parent.nextElementSibling;
815 var n = parent.nextElementSibling;
817 // next element are comments !
816 // next element are comments !
818 if(YUD.hasClass(n,'inline-comments')){
817 if(YUD.hasClass(n,'inline-comments')){
819 parent = n;
818 parent = n;
820 }
819 }
821 else{
820 else{
822 break;
821 break;
823 }
822 }
824 }
823 }
825 YUD.insertAfter(form,parent);
824 YUD.insertAfter(form,parent);
826 var f = YUD.get(form);
825 var f = YUD.get(form);
827 var overlay = YUD.getElementsByClassName('overlay',null,f)[0];
826 var overlay = YUD.getElementsByClassName('overlay',null,f)[0];
828 var _form = YUD.getElementsByClassName('inline-form',null,f)[0];
827 var _form = YUD.getElementsByClassName('inline-form',null,f)[0];
829
828
830 YUE.on(YUD.get(_form), 'submit',function(e){
829 YUE.on(YUD.get(_form), 'submit',function(e){
831 YUE.preventDefault(e);
830 YUE.preventDefault(e);
832
831
833 //ajax submit
832 //ajax submit
834 var text = YUD.get('text_'+lineno).value;
833 var text = YUD.get('text_'+lineno).value;
835 var postData = {
834 var postData = {
836 'text':text,
835 'text':text,
837 'f_path':f_path,
836 'f_path':f_path,
838 'line':lineno
837 'line':lineno
839 };
838 };
840
839
841 if(lineno === undefined){
840 if(lineno === undefined){
842 alert('missing line !');
841 alert('missing line !');
843 return
842 return
844 }
843 }
845 if(f_path === undefined){
844 if(f_path === undefined){
846 alert('missing file path !');
845 alert('missing file path !');
847 return
846 return
848 }
847 }
849
848
850 if(text == ""){
849 if(text == ""){
851 return
850 return
852 }
851 }
853
852
854 var success = function(o){
853 var success = function(o){
855 YUD.removeClass(tr, 'form-open');
854 YUD.removeClass(tr, 'form-open');
856 removeInlineForm(f);
855 removeInlineForm(f);
857 var json_data = JSON.parse(o.responseText);
856 var json_data = JSON.parse(o.responseText);
858 renderInlineComment(json_data);
857 renderInlineComment(json_data);
859 };
858 };
860
859
861 if (YUD.hasClass(overlay,'overlay')){
860 if (YUD.hasClass(overlay,'overlay')){
862 var w = _form.offsetWidth;
861 var w = _form.offsetWidth;
863 var h = _form.offsetHeight;
862 var h = _form.offsetHeight;
864 YUD.setStyle(overlay,'width',w+'px');
863 YUD.setStyle(overlay,'width',w+'px');
865 YUD.setStyle(overlay,'height',h+'px');
864 YUD.setStyle(overlay,'height',h+'px');
866 }
865 }
867 YUD.addClass(overlay, 'submitting');
866 YUD.addClass(overlay, 'submitting');
868
867
869 ajaxPOST(submit_url, postData, success);
868 ajaxPOST(submit_url, postData, success);
870 });
869 });
871
870
872 setTimeout(function(){
871 setTimeout(function(){
873 // callbacks
872 // callbacks
874 tooltip_activate();
873 tooltip_activate();
875 MentionsAutoComplete('text_'+lineno, 'mentions_container_'+lineno,
874 MentionsAutoComplete('text_'+lineno, 'mentions_container_'+lineno,
876 _USERS_AC_DATA, _GROUPS_AC_DATA);
875 _USERS_AC_DATA, _GROUPS_AC_DATA);
877 var _e = YUD.get('text_'+lineno);
876 var _e = YUD.get('text_'+lineno);
878 if(_e){
877 if(_e){
879 _e.focus();
878 _e.focus();
880 }
879 }
881 },10)
880 },10)
882 };
881 };
883
882
884 var deleteComment = function(comment_id){
883 var deleteComment = function(comment_id){
885 var url = AJAX_COMMENT_DELETE_URL.replace('__COMMENT_ID__',comment_id);
884 var url = AJAX_COMMENT_DELETE_URL.replace('__COMMENT_ID__',comment_id);
886 var postData = {'_method':'delete'};
885 var postData = {'_method':'delete'};
887 var success = function(o){
886 var success = function(o){
888 var n = YUD.get('comment-tr-'+comment_id);
887 var n = YUD.get('comment-tr-'+comment_id);
889 var root = prevElementSibling(prevElementSibling(n));
888 var root = prevElementSibling(prevElementSibling(n));
890 n.parentNode.removeChild(n);
889 n.parentNode.removeChild(n);
891
890
892 // scann nodes, and attach add button to last one
891 // scann nodes, and attach add button to last one
893 placeAddButton(root);
892 placeAddButton(root);
894 }
893 }
895 ajaxPOST(url,postData,success);
894 ajaxPOST(url,postData,success);
896 }
895 }
897
896
898 var createInlineAddButton = function(tr){
897 var createInlineAddButton = function(tr){
899
898
900 var label = TRANSLATION_MAP['Add another comment'];
899 var label = TRANSLATION_MAP['Add another comment'];
901
900
902 var html_el = document.createElement('div');
901 var html_el = document.createElement('div');
903 YUD.addClass(html_el, 'add-comment');
902 YUD.addClass(html_el, 'add-comment');
904 html_el.innerHTML = '<span class="ui-btn">{0}</span>'.format(label);
903 html_el.innerHTML = '<span class="ui-btn">{0}</span>'.format(label);
905
904
906 var add = new YAHOO.util.Element(html_el);
905 var add = new YAHOO.util.Element(html_el);
907 add.on('click', function(e) {
906 add.on('click', function(e) {
908 injectInlineForm(tr);
907 injectInlineForm(tr);
909 });
908 });
910 return add;
909 return add;
911 };
910 };
912
911
913 var getLineNo = function(tr) {
912 var getLineNo = function(tr) {
914 var line;
913 var line;
915 var o = tr.children[0].id.split('_');
914 var o = tr.children[0].id.split('_');
916 var n = tr.children[1].id.split('_');
915 var n = tr.children[1].id.split('_');
917
916
918 if (n.length >= 2) {
917 if (n.length >= 2) {
919 line = n[n.length-1];
918 line = n[n.length-1];
920 } else if (o.length >= 2) {
919 } else if (o.length >= 2) {
921 line = o[o.length-1];
920 line = o[o.length-1];
922 }
921 }
923
922
924 return line
923 return line
925 };
924 };
926
925
927 var placeAddButton = function(target_tr){
926 var placeAddButton = function(target_tr){
928 if(!target_tr){
927 if(!target_tr){
929 return
928 return
930 }
929 }
931 var last_node = target_tr;
930 var last_node = target_tr;
932 //scann
931 //scann
933 while (1){
932 while (1){
934 var n = last_node.nextElementSibling;
933 var n = last_node.nextElementSibling;
935 // next element are comments !
934 // next element are comments !
936 if(YUD.hasClass(n,'inline-comments')){
935 if(YUD.hasClass(n,'inline-comments')){
937 last_node = n;
936 last_node = n;
938 //also remove the comment button from previous
937 //also remove the comment button from previous
939 var comment_add_buttons = YUD.getElementsByClassName('add-comment',null,last_node);
938 var comment_add_buttons = YUD.getElementsByClassName('add-comment',null,last_node);
940 for(var i=0;i<comment_add_buttons.length;i++){
939 for(var i=0;i<comment_add_buttons.length;i++){
941 var b = comment_add_buttons[i];
940 var b = comment_add_buttons[i];
942 b.parentNode.removeChild(b);
941 b.parentNode.removeChild(b);
943 }
942 }
944 }
943 }
945 else{
944 else{
946 break;
945 break;
947 }
946 }
948 }
947 }
949
948
950 var add = createInlineAddButton(target_tr);
949 var add = createInlineAddButton(target_tr);
951 // get the comment div
950 // get the comment div
952 var comment_block = YUD.getElementsByClassName('comment',null,last_node)[0];
951 var comment_block = YUD.getElementsByClassName('comment',null,last_node)[0];
953 // attach add button
952 // attach add button
954 YUD.insertAfter(add,comment_block);
953 YUD.insertAfter(add,comment_block);
955 }
954 }
956
955
957 /**
956 /**
958 * Places the inline comment into the changeset block in proper line position
957 * Places the inline comment into the changeset block in proper line position
959 */
958 */
960 var placeInline = function(target_container,lineno,html){
959 var placeInline = function(target_container,lineno,html){
961 var lineid = "{0}_{1}".format(target_container,lineno);
960 var lineid = "{0}_{1}".format(target_container,lineno);
962 var target_line = YUD.get(lineid);
961 var target_line = YUD.get(lineid);
963 var comment = new YAHOO.util.Element(tableTr('inline-comments',html))
962 var comment = new YAHOO.util.Element(tableTr('inline-comments',html))
964
963
965 // check if there are comments already !
964 // check if there are comments already !
966 var parent = target_line.parentNode;
965 var parent = target_line.parentNode;
967 var root_parent = parent;
966 var root_parent = parent;
968 while (1){
967 while (1){
969 var n = parent.nextElementSibling;
968 var n = parent.nextElementSibling;
970 // next element are comments !
969 // next element are comments !
971 if(YUD.hasClass(n,'inline-comments')){
970 if(YUD.hasClass(n,'inline-comments')){
972 parent = n;
971 parent = n;
973 }
972 }
974 else{
973 else{
975 break;
974 break;
976 }
975 }
977 }
976 }
978 // put in the comment at the bottom
977 // put in the comment at the bottom
979 YUD.insertAfter(comment,parent);
978 YUD.insertAfter(comment,parent);
980
979
981 // scann nodes, and attach add button to last one
980 // scann nodes, and attach add button to last one
982 placeAddButton(root_parent);
981 placeAddButton(root_parent);
983
982
984 return target_line;
983 return target_line;
985 }
984 }
986
985
987 /**
986 /**
988 * make a single inline comment and place it inside
987 * make a single inline comment and place it inside
989 */
988 */
990 var renderInlineComment = function(json_data){
989 var renderInlineComment = function(json_data){
991 try{
990 try{
992 var html = json_data['rendered_text'];
991 var html = json_data['rendered_text'];
993 var lineno = json_data['line_no'];
992 var lineno = json_data['line_no'];
994 var target_id = json_data['target_id'];
993 var target_id = json_data['target_id'];
995 placeInline(target_id, lineno, html);
994 placeInline(target_id, lineno, html);
996
995
997 }catch(e){
996 }catch(e){
998 console.log(e);
997 console.log(e);
999 }
998 }
1000 }
999 }
1001
1000
1002 /**
1001 /**
1003 * Iterates over all the inlines, and places them inside proper blocks of data
1002 * Iterates over all the inlines, and places them inside proper blocks of data
1004 */
1003 */
1005 var renderInlineComments = function(file_comments){
1004 var renderInlineComments = function(file_comments){
1006 for (f in file_comments){
1005 for (f in file_comments){
1007 // holding all comments for a FILE
1006 // holding all comments for a FILE
1008 var box = file_comments[f];
1007 var box = file_comments[f];
1009
1008
1010 var target_id = YUD.getAttribute(box,'target_id');
1009 var target_id = YUD.getAttribute(box,'target_id');
1011 // actually comments with line numbers
1010 // actually comments with line numbers
1012 var comments = box.children;
1011 var comments = box.children;
1013 for(var i=0; i<comments.length; i++){
1012 for(var i=0; i<comments.length; i++){
1014 var data = {
1013 var data = {
1015 'rendered_text': comments[i].outerHTML,
1014 'rendered_text': comments[i].outerHTML,
1016 'line_no': YUD.getAttribute(comments[i],'line'),
1015 'line_no': YUD.getAttribute(comments[i],'line'),
1017 'target_id': target_id
1016 'target_id': target_id
1018 }
1017 }
1019 renderInlineComment(data);
1018 renderInlineComment(data);
1020 }
1019 }
1021 }
1020 }
1022 }
1021 }
1023
1022
1024 var fileBrowserListeners = function(current_url, node_list_url, url_base){
1023 var fileBrowserListeners = function(current_url, node_list_url, url_base){
1025 var current_url_branch = +"?branch=__BRANCH__";
1024 var current_url_branch = +"?branch=__BRANCH__";
1026
1025
1027 YUE.on('stay_at_branch','click',function(e){
1026 YUE.on('stay_at_branch','click',function(e){
1028 if(e.target.checked){
1027 if(e.target.checked){
1029 var uri = current_url_branch;
1028 var uri = current_url_branch;
1030 uri = uri.replace('__BRANCH__',e.target.value);
1029 uri = uri.replace('__BRANCH__',e.target.value);
1031 window.location = uri;
1030 window.location = uri;
1032 }
1031 }
1033 else{
1032 else{
1034 window.location = current_url;
1033 window.location = current_url;
1035 }
1034 }
1036 })
1035 })
1037
1036
1038 var n_filter = YUD.get('node_filter');
1037 var n_filter = YUD.get('node_filter');
1039 var F = YAHOO.namespace('node_filter');
1038 var F = YAHOO.namespace('node_filter');
1040
1039
1041 F.filterTimeout = null;
1040 F.filterTimeout = null;
1042 var nodes = null;
1041 var nodes = null;
1043
1042
1044 F.initFilter = function(){
1043 F.initFilter = function(){
1045 YUD.setStyle('node_filter_box_loading','display','');
1044 YUD.setStyle('node_filter_box_loading','display','');
1046 YUD.setStyle('search_activate_id','display','none');
1045 YUD.setStyle('search_activate_id','display','none');
1047 YUD.setStyle('add_node_id','display','none');
1046 YUD.setStyle('add_node_id','display','none');
1048 YUC.initHeader('X-PARTIAL-XHR',true);
1047 YUC.initHeader('X-PARTIAL-XHR',true);
1049 YUC.asyncRequest('GET', node_list_url, {
1048 YUC.asyncRequest('GET', node_list_url, {
1050 success:function(o){
1049 success:function(o){
1051 nodes = JSON.parse(o.responseText).nodes;
1050 nodes = JSON.parse(o.responseText).nodes;
1052 YUD.setStyle('node_filter_box_loading','display','none');
1051 YUD.setStyle('node_filter_box_loading','display','none');
1053 YUD.setStyle('node_filter_box','display','');
1052 YUD.setStyle('node_filter_box','display','');
1054 n_filter.focus();
1053 n_filter.focus();
1055 if(YUD.hasClass(n_filter,'init')){
1054 if(YUD.hasClass(n_filter,'init')){
1056 n_filter.value = '';
1055 n_filter.value = '';
1057 YUD.removeClass(n_filter,'init');
1056 YUD.removeClass(n_filter,'init');
1058 }
1057 }
1059 },
1058 },
1060 failure:function(o){
1059 failure:function(o){
1061 console.log('failed to load');
1060 console.log('failed to load');
1062 }
1061 }
1063 },null);
1062 },null);
1064 }
1063 }
1065
1064
1066 F.updateFilter = function(e) {
1065 F.updateFilter = function(e) {
1067
1066
1068 return function(){
1067 return function(){
1069 // Reset timeout
1068 // Reset timeout
1070 F.filterTimeout = null;
1069 F.filterTimeout = null;
1071 var query = e.target.value.toLowerCase();
1070 var query = e.target.value.toLowerCase();
1072 var match = [];
1071 var match = [];
1073 var matches = 0;
1072 var matches = 0;
1074 var matches_max = 20;
1073 var matches_max = 20;
1075 if (query != ""){
1074 if (query != ""){
1076 for(var i=0;i<nodes.length;i++){
1075 for(var i=0;i<nodes.length;i++){
1077
1076
1078 var pos = nodes[i].name.toLowerCase().indexOf(query)
1077 var pos = nodes[i].name.toLowerCase().indexOf(query)
1079 if(query && pos != -1){
1078 if(query && pos != -1){
1080
1079
1081 matches++
1080 matches++
1082 //show only certain amount to not kill browser
1081 //show only certain amount to not kill browser
1083 if (matches > matches_max){
1082 if (matches > matches_max){
1084 break;
1083 break;
1085 }
1084 }
1086
1085
1087 var n = nodes[i].name;
1086 var n = nodes[i].name;
1088 var t = nodes[i].type;
1087 var t = nodes[i].type;
1089 var n_hl = n.substring(0,pos)
1088 var n_hl = n.substring(0,pos)
1090 +"<b>{0}</b>".format(n.substring(pos,pos+query.length))
1089 +"<b>{0}</b>".format(n.substring(pos,pos+query.length))
1091 +n.substring(pos+query.length)
1090 +n.substring(pos+query.length)
1092 var new_url = url_base.replace('__FPATH__',n);
1091 var new_url = url_base.replace('__FPATH__',n);
1093 match.push('<tr><td><a class="browser-{0}" href="{1}">{2}</a></td><td colspan="5"></td></tr>'.format(t,new_url,n_hl));
1092 match.push('<tr><td><a class="browser-{0}" href="{1}">{2}</a></td><td colspan="5"></td></tr>'.format(t,new_url,n_hl));
1094 }
1093 }
1095 if(match.length >= matches_max){
1094 if(match.length >= matches_max){
1096 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['Search truncated']));
1095 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['Search truncated']));
1097 }
1096 }
1098 }
1097 }
1099 }
1098 }
1100 if(query != ""){
1099 if(query != ""){
1101 YUD.setStyle('tbody','display','none');
1100 YUD.setStyle('tbody','display','none');
1102 YUD.setStyle('tbody_filtered','display','');
1101 YUD.setStyle('tbody_filtered','display','');
1103
1102
1104 if (match.length==0){
1103 if (match.length==0){
1105 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['No matching files']));
1104 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['No matching files']));
1106 }
1105 }
1107
1106
1108 YUD.get('tbody_filtered').innerHTML = match.join("");
1107 YUD.get('tbody_filtered').innerHTML = match.join("");
1109 }
1108 }
1110 else{
1109 else{
1111 YUD.setStyle('tbody','display','');
1110 YUD.setStyle('tbody','display','');
1112 YUD.setStyle('tbody_filtered','display','none');
1111 YUD.setStyle('tbody_filtered','display','none');
1113 }
1112 }
1114
1113
1115 }
1114 }
1116 };
1115 };
1117
1116
1118 YUE.on(YUD.get('filter_activate'),'click',function(){
1117 YUE.on(YUD.get('filter_activate'),'click',function(){
1119 F.initFilter();
1118 F.initFilter();
1120 })
1119 })
1121 YUE.on(n_filter,'click',function(){
1120 YUE.on(n_filter,'click',function(){
1122 if(YUD.hasClass(n_filter,'init')){
1121 if(YUD.hasClass(n_filter,'init')){
1123 n_filter.value = '';
1122 n_filter.value = '';
1124 YUD.removeClass(n_filter,'init');
1123 YUD.removeClass(n_filter,'init');
1125 }
1124 }
1126 });
1125 });
1127 YUE.on(n_filter,'keyup',function(e){
1126 YUE.on(n_filter,'keyup',function(e){
1128 clearTimeout(F.filterTimeout);
1127 clearTimeout(F.filterTimeout);
1129 F.filterTimeout = setTimeout(F.updateFilter(e),600);
1128 F.filterTimeout = setTimeout(F.updateFilter(e),600);
1130 });
1129 });
1131 };
1130 };
1132
1131
1133
1132
1134 var initCodeMirror = function(textAreadId,resetUrl){
1133 var initCodeMirror = function(textAreadId,resetUrl){
1135 var myCodeMirror = CodeMirror.fromTextArea(YUD.get(textAreadId),{
1134 var myCodeMirror = CodeMirror.fromTextArea(YUD.get(textAreadId),{
1136 mode: "null",
1135 mode: "null",
1137 lineNumbers:true
1136 lineNumbers:true
1138 });
1137 });
1139 YUE.on('reset','click',function(e){
1138 YUE.on('reset','click',function(e){
1140 window.location=resetUrl
1139 window.location=resetUrl
1141 });
1140 });
1142
1141
1143 YUE.on('file_enable','click',function(){
1142 YUE.on('file_enable','click',function(){
1144 YUD.setStyle('editor_container','display','');
1143 YUD.setStyle('editor_container','display','');
1145 YUD.setStyle('upload_file_container','display','none');
1144 YUD.setStyle('upload_file_container','display','none');
1146 YUD.setStyle('filename_container','display','');
1145 YUD.setStyle('filename_container','display','');
1147 });
1146 });
1148
1147
1149 YUE.on('upload_file_enable','click',function(){
1148 YUE.on('upload_file_enable','click',function(){
1150 YUD.setStyle('editor_container','display','none');
1149 YUD.setStyle('editor_container','display','none');
1151 YUD.setStyle('upload_file_container','display','');
1150 YUD.setStyle('upload_file_container','display','');
1152 YUD.setStyle('filename_container','display','none');
1151 YUD.setStyle('filename_container','display','none');
1153 });
1152 });
1154 };
1153 };
1155
1154
1156
1155
1157
1156
1158 var getIdentNode = function(n){
1157 var getIdentNode = function(n){
1159 //iterate thru nodes untill matched interesting node !
1158 //iterate thru nodes untill matched interesting node !
1160
1159
1161 if (typeof n == 'undefined'){
1160 if (typeof n == 'undefined'){
1162 return -1
1161 return -1
1163 }
1162 }
1164
1163
1165 if(typeof n.id != "undefined" && n.id.match('L[0-9]+')){
1164 if(typeof n.id != "undefined" && n.id.match('L[0-9]+')){
1166 return n
1165 return n
1167 }
1166 }
1168 else{
1167 else{
1169 return getIdentNode(n.parentNode);
1168 return getIdentNode(n.parentNode);
1170 }
1169 }
1171 };
1170 };
1172
1171
1173 var getSelectionLink = function(e) {
1172 var getSelectionLink = function(e) {
1174
1173
1175 //get selection from start/to nodes
1174 //get selection from start/to nodes
1176 if (typeof window.getSelection != "undefined") {
1175 if (typeof window.getSelection != "undefined") {
1177 s = window.getSelection();
1176 s = window.getSelection();
1178
1177
1179 from = getIdentNode(s.anchorNode);
1178 from = getIdentNode(s.anchorNode);
1180 till = getIdentNode(s.focusNode);
1179 till = getIdentNode(s.focusNode);
1181
1180
1182 f_int = parseInt(from.id.replace('L',''));
1181 f_int = parseInt(from.id.replace('L',''));
1183 t_int = parseInt(till.id.replace('L',''));
1182 t_int = parseInt(till.id.replace('L',''));
1184
1183
1185 if (f_int > t_int){
1184 if (f_int > t_int){
1186 //highlight from bottom
1185 //highlight from bottom
1187 offset = -35;
1186 offset = -35;
1188 ranges = [t_int,f_int];
1187 ranges = [t_int,f_int];
1189
1188
1190 }
1189 }
1191 else{
1190 else{
1192 //highligth from top
1191 //highligth from top
1193 offset = 35;
1192 offset = 35;
1194 ranges = [f_int,t_int];
1193 ranges = [f_int,t_int];
1195 }
1194 }
1196 // if we select more than 2 lines
1195 // if we select more than 2 lines
1197 if (ranges[0] != ranges[1]){
1196 if (ranges[0] != ranges[1]){
1198 if(YUD.get('linktt') == null){
1197 if(YUD.get('linktt') == null){
1199 hl_div = document.createElement('div');
1198 hl_div = document.createElement('div');
1200 hl_div.id = 'linktt';
1199 hl_div.id = 'linktt';
1201 }
1200 }
1202 hl_div.innerHTML = '';
1201 hl_div.innerHTML = '';
1203
1202
1204 anchor = '#L'+ranges[0]+'-'+ranges[1];
1203 anchor = '#L'+ranges[0]+'-'+ranges[1];
1205 var link = document.createElement('a');
1204 var link = document.createElement('a');
1206 link.href = location.href.substring(0,location.href.indexOf('#'))+anchor;
1205 link.href = location.href.substring(0,location.href.indexOf('#'))+anchor;
1207 link.innerHTML = _TM['Selection link'];
1206 link.innerHTML = _TM['Selection link'];
1208 hl_div.appendChild(link);
1207 hl_div.appendChild(link);
1209 YUD.get('body').appendChild(hl_div);
1208 YUD.get('body').appendChild(hl_div);
1210
1209
1211 xy = YUD.getXY(till.id);
1210 xy = YUD.getXY(till.id);
1212
1211
1213 YUD.addClass('linktt', 'hl-tip-box');
1212 YUD.addClass('linktt', 'hl-tip-box');
1214 YUD.setStyle('linktt','top',xy[1]+offset+'px');
1213 YUD.setStyle('linktt','top',xy[1]+offset+'px');
1215 YUD.setStyle('linktt','left',xy[0]+'px');
1214 YUD.setStyle('linktt','left',xy[0]+'px');
1216 YUD.setStyle('linktt','visibility','visible');
1215 YUD.setStyle('linktt','visibility','visible');
1217
1216
1218 }
1217 }
1219 else{
1218 else{
1220 YUD.setStyle('linktt','visibility','hidden');
1219 YUD.setStyle('linktt','visibility','hidden');
1221 }
1220 }
1222 }
1221 }
1223 };
1222 };
1224
1223
1225 var deleteNotification = function(url, notification_id,callbacks){
1224 var deleteNotification = function(url, notification_id,callbacks){
1226 var callback = {
1225 var callback = {
1227 success:function(o){
1226 success:function(o){
1228 var obj = YUD.get(String("notification_"+notification_id));
1227 var obj = YUD.get(String("notification_"+notification_id));
1229 if(obj.parentNode !== undefined){
1228 if(obj.parentNode !== undefined){
1230 obj.parentNode.removeChild(obj);
1229 obj.parentNode.removeChild(obj);
1231 }
1230 }
1232 _run_callbacks(callbacks);
1231 _run_callbacks(callbacks);
1233 },
1232 },
1234 failure:function(o){
1233 failure:function(o){
1235 alert("error");
1234 alert("error");
1236 },
1235 },
1237 };
1236 };
1238 var postData = '_method=delete';
1237 var postData = '_method=delete';
1239 var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
1238 var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
1240 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
1239 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
1241 callback, postData);
1240 callback, postData);
1242 };
1241 };
1243
1242
1244 var readNotification = function(url, notification_id,callbacks){
1243 var readNotification = function(url, notification_id,callbacks){
1245 var callback = {
1244 var callback = {
1246 success:function(o){
1245 success:function(o){
1247 var obj = YUD.get(String("notification_"+notification_id));
1246 var obj = YUD.get(String("notification_"+notification_id));
1248 YUD.removeClass(obj, 'unread');
1247 YUD.removeClass(obj, 'unread');
1249 var r_button = YUD.getElementsByClassName('read-notification',null,obj.children[0])[0];
1248 var r_button = YUD.getElementsByClassName('read-notification',null,obj.children[0])[0];
1250
1249
1251 if(r_button.parentNode !== undefined){
1250 if(r_button.parentNode !== undefined){
1252 r_button.parentNode.removeChild(r_button);
1251 r_button.parentNode.removeChild(r_button);
1253 }
1252 }
1254 _run_callbacks(callbacks);
1253 _run_callbacks(callbacks);
1255 },
1254 },
1256 failure:function(o){
1255 failure:function(o){
1257 alert("error");
1256 alert("error");
1258 },
1257 },
1259 };
1258 };
1260 var postData = '_method=put';
1259 var postData = '_method=put';
1261 var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
1260 var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
1262 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
1261 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
1263 callback, postData);
1262 callback, postData);
1264 };
1263 };
1265
1264
1266 /** MEMBERS AUTOCOMPLETE WIDGET **/
1265 /** MEMBERS AUTOCOMPLETE WIDGET **/
1267
1266
1268 var MembersAutoComplete = function (divid, cont, users_list, groups_list) {
1267 var MembersAutoComplete = function (divid, cont, users_list, groups_list) {
1269 var myUsers = users_list;
1268 var myUsers = users_list;
1270 var myGroups = groups_list;
1269 var myGroups = groups_list;
1271
1270
1272 // Define a custom search function for the DataSource of users
1271 // Define a custom search function for the DataSource of users
1273 var matchUsers = function (sQuery) {
1272 var matchUsers = function (sQuery) {
1274 // Case insensitive matching
1273 // Case insensitive matching
1275 var query = sQuery.toLowerCase();
1274 var query = sQuery.toLowerCase();
1276 var i = 0;
1275 var i = 0;
1277 var l = myUsers.length;
1276 var l = myUsers.length;
1278 var matches = [];
1277 var matches = [];
1279
1278
1280 // Match against each name of each contact
1279 // Match against each name of each contact
1281 for (; i < l; i++) {
1280 for (; i < l; i++) {
1282 contact = myUsers[i];
1281 contact = myUsers[i];
1283 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1282 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1284 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1283 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1285 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1284 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1286 matches[matches.length] = contact;
1285 matches[matches.length] = contact;
1287 }
1286 }
1288 }
1287 }
1289 return matches;
1288 return matches;
1290 };
1289 };
1291
1290
1292 // Define a custom search function for the DataSource of userGroups
1291 // Define a custom search function for the DataSource of userGroups
1293 var matchGroups = function (sQuery) {
1292 var matchGroups = function (sQuery) {
1294 // Case insensitive matching
1293 // Case insensitive matching
1295 var query = sQuery.toLowerCase();
1294 var query = sQuery.toLowerCase();
1296 var i = 0;
1295 var i = 0;
1297 var l = myGroups.length;
1296 var l = myGroups.length;
1298 var matches = [];
1297 var matches = [];
1299
1298
1300 // Match against each name of each contact
1299 // Match against each name of each contact
1301 for (; i < l; i++) {
1300 for (; i < l; i++) {
1302 matched_group = myGroups[i];
1301 matched_group = myGroups[i];
1303 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
1302 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
1304 matches[matches.length] = matched_group;
1303 matches[matches.length] = matched_group;
1305 }
1304 }
1306 }
1305 }
1307 return matches;
1306 return matches;
1308 };
1307 };
1309
1308
1310 //match all
1309 //match all
1311 var matchAll = function (sQuery) {
1310 var matchAll = function (sQuery) {
1312 u = matchUsers(sQuery);
1311 u = matchUsers(sQuery);
1313 g = matchGroups(sQuery);
1312 g = matchGroups(sQuery);
1314 return u.concat(g);
1313 return u.concat(g);
1315 };
1314 };
1316
1315
1317 // DataScheme for members
1316 // DataScheme for members
1318 var memberDS = new YAHOO.util.FunctionDataSource(matchAll);
1317 var memberDS = new YAHOO.util.FunctionDataSource(matchAll);
1319 memberDS.responseSchema = {
1318 memberDS.responseSchema = {
1320 fields: ["id", "fname", "lname", "nname", "grname", "grmembers", "gravatar_lnk"]
1319 fields: ["id", "fname", "lname", "nname", "grname", "grmembers", "gravatar_lnk"]
1321 };
1320 };
1322
1321
1323 // DataScheme for owner
1322 // DataScheme for owner
1324 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1323 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1325 ownerDS.responseSchema = {
1324 ownerDS.responseSchema = {
1326 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1325 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1327 };
1326 };
1328
1327
1329 // Instantiate AutoComplete for perms
1328 // Instantiate AutoComplete for perms
1330 var membersAC = new YAHOO.widget.AutoComplete(divid, cont, memberDS);
1329 var membersAC = new YAHOO.widget.AutoComplete(divid, cont, memberDS);
1331 membersAC.useShadow = false;
1330 membersAC.useShadow = false;
1332 membersAC.resultTypeList = false;
1331 membersAC.resultTypeList = false;
1333 membersAC.animVert = false;
1332 membersAC.animVert = false;
1334 membersAC.animHoriz = false;
1333 membersAC.animHoriz = false;
1335 membersAC.animSpeed = 0.1;
1334 membersAC.animSpeed = 0.1;
1336
1335
1337 // Instantiate AutoComplete for owner
1336 // Instantiate AutoComplete for owner
1338 var ownerAC = new YAHOO.widget.AutoComplete("user", "owner_container", ownerDS);
1337 var ownerAC = new YAHOO.widget.AutoComplete("user", "owner_container", ownerDS);
1339 ownerAC.useShadow = false;
1338 ownerAC.useShadow = false;
1340 ownerAC.resultTypeList = false;
1339 ownerAC.resultTypeList = false;
1341 ownerAC.animVert = false;
1340 ownerAC.animVert = false;
1342 ownerAC.animHoriz = false;
1341 ownerAC.animHoriz = false;
1343 ownerAC.animSpeed = 0.1;
1342 ownerAC.animSpeed = 0.1;
1344
1343
1345 // Helper highlight function for the formatter
1344 // Helper highlight function for the formatter
1346 var highlightMatch = function (full, snippet, matchindex) {
1345 var highlightMatch = function (full, snippet, matchindex) {
1347 return full.substring(0, matchindex)
1346 return full.substring(0, matchindex)
1348 + "<span class='match'>"
1347 + "<span class='match'>"
1349 + full.substr(matchindex, snippet.length)
1348 + full.substr(matchindex, snippet.length)
1350 + "</span>" + full.substring(matchindex + snippet.length);
1349 + "</span>" + full.substring(matchindex + snippet.length);
1351 };
1350 };
1352
1351
1353 // Custom formatter to highlight the matching letters
1352 // Custom formatter to highlight the matching letters
1354 var custom_formatter = function (oResultData, sQuery, sResultMatch) {
1353 var custom_formatter = function (oResultData, sQuery, sResultMatch) {
1355 var query = sQuery.toLowerCase();
1354 var query = sQuery.toLowerCase();
1356 var _gravatar = function(res, em, group){
1355 var _gravatar = function(res, em, group){
1357 if (group !== undefined){
1356 if (group !== undefined){
1358 em = '/images/icons/group.png'
1357 em = '/images/icons/group.png'
1359 }
1358 }
1360 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1359 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1361 return tmpl.format(em,res)
1360 return tmpl.format(em,res)
1362 }
1361 }
1363 // group
1362 // group
1364 if (oResultData.grname != undefined) {
1363 if (oResultData.grname != undefined) {
1365 var grname = oResultData.grname;
1364 var grname = oResultData.grname;
1366 var grmembers = oResultData.grmembers;
1365 var grmembers = oResultData.grmembers;
1367 var grnameMatchIndex = grname.toLowerCase().indexOf(query);
1366 var grnameMatchIndex = grname.toLowerCase().indexOf(query);
1368 var grprefix = "{0}: ".format(_TM['Group']);
1367 var grprefix = "{0}: ".format(_TM['Group']);
1369 var grsuffix = " (" + grmembers + " )";
1368 var grsuffix = " (" + grmembers + " )";
1370 var grsuffix = " ({0} {1})".format(grmembers, _TM['members']);
1369 var grsuffix = " ({0} {1})".format(grmembers, _TM['members']);
1371
1370
1372 if (grnameMatchIndex > -1) {
1371 if (grnameMatchIndex > -1) {
1373 return _gravatar(grprefix + highlightMatch(grname, query, grnameMatchIndex) + grsuffix,null,true);
1372 return _gravatar(grprefix + highlightMatch(grname, query, grnameMatchIndex) + grsuffix,null,true);
1374 }
1373 }
1375 return _gravatar(grprefix + oResultData.grname + grsuffix, null,true);
1374 return _gravatar(grprefix + oResultData.grname + grsuffix, null,true);
1376 // Users
1375 // Users
1377 } else if (oResultData.nname != undefined) {
1376 } else if (oResultData.nname != undefined) {
1378 var fname = oResultData.fname || "";
1377 var fname = oResultData.fname || "";
1379 var lname = oResultData.lname || "";
1378 var lname = oResultData.lname || "";
1380 var nname = oResultData.nname;
1379 var nname = oResultData.nname;
1381
1380
1382 // Guard against null value
1381 // Guard against null value
1383 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1382 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1384 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1383 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1385 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1384 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1386 displayfname, displaylname, displaynname;
1385 displayfname, displaylname, displaynname;
1387
1386
1388 if (fnameMatchIndex > -1) {
1387 if (fnameMatchIndex > -1) {
1389 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1388 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1390 } else {
1389 } else {
1391 displayfname = fname;
1390 displayfname = fname;
1392 }
1391 }
1393
1392
1394 if (lnameMatchIndex > -1) {
1393 if (lnameMatchIndex > -1) {
1395 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1394 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1396 } else {
1395 } else {
1397 displaylname = lname;
1396 displaylname = lname;
1398 }
1397 }
1399
1398
1400 if (nnameMatchIndex > -1) {
1399 if (nnameMatchIndex > -1) {
1401 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1400 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1402 } else {
1401 } else {
1403 displaynname = nname ? "(" + nname + ")" : "";
1402 displaynname = nname ? "(" + nname + ")" : "";
1404 }
1403 }
1405
1404
1406 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1405 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1407 } else {
1406 } else {
1408 return '';
1407 return '';
1409 }
1408 }
1410 };
1409 };
1411 membersAC.formatResult = custom_formatter;
1410 membersAC.formatResult = custom_formatter;
1412 ownerAC.formatResult = custom_formatter;
1411 ownerAC.formatResult = custom_formatter;
1413
1412
1414 var myHandler = function (sType, aArgs) {
1413 var myHandler = function (sType, aArgs) {
1415 var nextId = divid.split('perm_new_member_name_')[1];
1414 var nextId = divid.split('perm_new_member_name_')[1];
1416 var myAC = aArgs[0]; // reference back to the AC instance
1415 var myAC = aArgs[0]; // reference back to the AC instance
1417 var elLI = aArgs[1]; // reference to the selected LI element
1416 var elLI = aArgs[1]; // reference to the selected LI element
1418 var oData = aArgs[2]; // object literal of selected item's result data
1417 var oData = aArgs[2]; // object literal of selected item's result data
1419 //fill the autocomplete with value
1418 //fill the autocomplete with value
1420 if (oData.nname != undefined) {
1419 if (oData.nname != undefined) {
1421 //users
1420 //users
1422 myAC.getInputEl().value = oData.nname;
1421 myAC.getInputEl().value = oData.nname;
1423 YUD.get('perm_new_member_type_'+nextId).value = 'user';
1422 YUD.get('perm_new_member_type_'+nextId).value = 'user';
1424 } else {
1423 } else {
1425 //groups
1424 //groups
1426 myAC.getInputEl().value = oData.grname;
1425 myAC.getInputEl().value = oData.grname;
1427 YUD.get('perm_new_member_type_'+nextId).value = 'users_group';
1426 YUD.get('perm_new_member_type_'+nextId).value = 'users_group';
1428 }
1427 }
1429 };
1428 };
1430
1429
1431 membersAC.itemSelectEvent.subscribe(myHandler);
1430 membersAC.itemSelectEvent.subscribe(myHandler);
1432 if(ownerAC.itemSelectEvent){
1431 if(ownerAC.itemSelectEvent){
1433 ownerAC.itemSelectEvent.subscribe(myHandler);
1432 ownerAC.itemSelectEvent.subscribe(myHandler);
1434 }
1433 }
1435
1434
1436 return {
1435 return {
1437 memberDS: memberDS,
1436 memberDS: memberDS,
1438 ownerDS: ownerDS,
1437 ownerDS: ownerDS,
1439 membersAC: membersAC,
1438 membersAC: membersAC,
1440 ownerAC: ownerAC,
1439 ownerAC: ownerAC,
1441 };
1440 };
1442 }
1441 }
1443
1442
1444
1443
1445 var MentionsAutoComplete = function (divid, cont, users_list, groups_list) {
1444 var MentionsAutoComplete = function (divid, cont, users_list, groups_list) {
1446 var myUsers = users_list;
1445 var myUsers = users_list;
1447 var myGroups = groups_list;
1446 var myGroups = groups_list;
1448
1447
1449 // Define a custom search function for the DataSource of users
1448 // Define a custom search function for the DataSource of users
1450 var matchUsers = function (sQuery) {
1449 var matchUsers = function (sQuery) {
1451 var org_sQuery = sQuery;
1450 var org_sQuery = sQuery;
1452 if(this.mentionQuery == null){
1451 if(this.mentionQuery == null){
1453 return []
1452 return []
1454 }
1453 }
1455 sQuery = this.mentionQuery;
1454 sQuery = this.mentionQuery;
1456 // Case insensitive matching
1455 // Case insensitive matching
1457 var query = sQuery.toLowerCase();
1456 var query = sQuery.toLowerCase();
1458 var i = 0;
1457 var i = 0;
1459 var l = myUsers.length;
1458 var l = myUsers.length;
1460 var matches = [];
1459 var matches = [];
1461
1460
1462 // Match against each name of each contact
1461 // Match against each name of each contact
1463 for (; i < l; i++) {
1462 for (; i < l; i++) {
1464 contact = myUsers[i];
1463 contact = myUsers[i];
1465 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1464 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1466 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1465 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1467 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1466 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1468 matches[matches.length] = contact;
1467 matches[matches.length] = contact;
1469 }
1468 }
1470 }
1469 }
1471 return matches
1470 return matches
1472 };
1471 };
1473
1472
1474 //match all
1473 //match all
1475 var matchAll = function (sQuery) {
1474 var matchAll = function (sQuery) {
1476 u = matchUsers(sQuery);
1475 u = matchUsers(sQuery);
1477 return u
1476 return u
1478 };
1477 };
1479
1478
1480 // DataScheme for owner
1479 // DataScheme for owner
1481 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1480 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1482
1481
1483 ownerDS.responseSchema = {
1482 ownerDS.responseSchema = {
1484 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1483 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1485 };
1484 };
1486
1485
1487 // Instantiate AutoComplete for mentions
1486 // Instantiate AutoComplete for mentions
1488 var ownerAC = new YAHOO.widget.AutoComplete(divid, cont, ownerDS);
1487 var ownerAC = new YAHOO.widget.AutoComplete(divid, cont, ownerDS);
1489 ownerAC.useShadow = false;
1488 ownerAC.useShadow = false;
1490 ownerAC.resultTypeList = false;
1489 ownerAC.resultTypeList = false;
1491 ownerAC.suppressInputUpdate = true;
1490 ownerAC.suppressInputUpdate = true;
1492 ownerAC.animVert = false;
1491 ownerAC.animVert = false;
1493 ownerAC.animHoriz = false;
1492 ownerAC.animHoriz = false;
1494 ownerAC.animSpeed = 0.1;
1493 ownerAC.animSpeed = 0.1;
1495
1494
1496 // Helper highlight function for the formatter
1495 // Helper highlight function for the formatter
1497 var highlightMatch = function (full, snippet, matchindex) {
1496 var highlightMatch = function (full, snippet, matchindex) {
1498 return full.substring(0, matchindex)
1497 return full.substring(0, matchindex)
1499 + "<span class='match'>"
1498 + "<span class='match'>"
1500 + full.substr(matchindex, snippet.length)
1499 + full.substr(matchindex, snippet.length)
1501 + "</span>" + full.substring(matchindex + snippet.length);
1500 + "</span>" + full.substring(matchindex + snippet.length);
1502 };
1501 };
1503
1502
1504 // Custom formatter to highlight the matching letters
1503 // Custom formatter to highlight the matching letters
1505 ownerAC.formatResult = function (oResultData, sQuery, sResultMatch) {
1504 ownerAC.formatResult = function (oResultData, sQuery, sResultMatch) {
1506 var org_sQuery = sQuery;
1505 var org_sQuery = sQuery;
1507 if(this.dataSource.mentionQuery != null){
1506 if(this.dataSource.mentionQuery != null){
1508 sQuery = this.dataSource.mentionQuery;
1507 sQuery = this.dataSource.mentionQuery;
1509 }
1508 }
1510
1509
1511 var query = sQuery.toLowerCase();
1510 var query = sQuery.toLowerCase();
1512 var _gravatar = function(res, em, group){
1511 var _gravatar = function(res, em, group){
1513 if (group !== undefined){
1512 if (group !== undefined){
1514 em = '/images/icons/group.png'
1513 em = '/images/icons/group.png'
1515 }
1514 }
1516 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1515 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1517 return tmpl.format(em,res)
1516 return tmpl.format(em,res)
1518 }
1517 }
1519 if (oResultData.nname != undefined) {
1518 if (oResultData.nname != undefined) {
1520 var fname = oResultData.fname || "";
1519 var fname = oResultData.fname || "";
1521 var lname = oResultData.lname || "";
1520 var lname = oResultData.lname || "";
1522 var nname = oResultData.nname;
1521 var nname = oResultData.nname;
1523
1522
1524 // Guard against null value
1523 // Guard against null value
1525 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1524 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1526 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1525 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1527 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1526 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1528 displayfname, displaylname, displaynname;
1527 displayfname, displaylname, displaynname;
1529
1528
1530 if (fnameMatchIndex > -1) {
1529 if (fnameMatchIndex > -1) {
1531 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1530 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1532 } else {
1531 } else {
1533 displayfname = fname;
1532 displayfname = fname;
1534 }
1533 }
1535
1534
1536 if (lnameMatchIndex > -1) {
1535 if (lnameMatchIndex > -1) {
1537 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1536 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1538 } else {
1537 } else {
1539 displaylname = lname;
1538 displaylname = lname;
1540 }
1539 }
1541
1540
1542 if (nnameMatchIndex > -1) {
1541 if (nnameMatchIndex > -1) {
1543 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1542 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1544 } else {
1543 } else {
1545 displaynname = nname ? "(" + nname + ")" : "";
1544 displaynname = nname ? "(" + nname + ")" : "";
1546 }
1545 }
1547
1546
1548 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1547 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1549 } else {
1548 } else {
1550 return '';
1549 return '';
1551 }
1550 }
1552 };
1551 };
1553
1552
1554 if(ownerAC.itemSelectEvent){
1553 if(ownerAC.itemSelectEvent){
1555 ownerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
1554 ownerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
1556
1555
1557 var myAC = aArgs[0]; // reference back to the AC instance
1556 var myAC = aArgs[0]; // reference back to the AC instance
1558 var elLI = aArgs[1]; // reference to the selected LI element
1557 var elLI = aArgs[1]; // reference to the selected LI element
1559 var oData = aArgs[2]; // object literal of selected item's result data
1558 var oData = aArgs[2]; // object literal of selected item's result data
1560 //fill the autocomplete with value
1559 //fill the autocomplete with value
1561 if (oData.nname != undefined) {
1560 if (oData.nname != undefined) {
1562 //users
1561 //users
1563 //Replace the mention name with replaced
1562 //Replace the mention name with replaced
1564 var re = new RegExp();
1563 var re = new RegExp();
1565 var org = myAC.getInputEl().value;
1564 var org = myAC.getInputEl().value;
1566 var chunks = myAC.dataSource.chunks
1565 var chunks = myAC.dataSource.chunks
1567 // replace middle chunk(the search term) with actuall match
1566 // replace middle chunk(the search term) with actuall match
1568 chunks[1] = chunks[1].replace('@'+myAC.dataSource.mentionQuery,
1567 chunks[1] = chunks[1].replace('@'+myAC.dataSource.mentionQuery,
1569 '@'+oData.nname+' ');
1568 '@'+oData.nname+' ');
1570 myAC.getInputEl().value = chunks.join('')
1569 myAC.getInputEl().value = chunks.join('')
1571 YUD.get(myAC.getInputEl()).focus(); // Y U NO WORK !?
1570 YUD.get(myAC.getInputEl()).focus(); // Y U NO WORK !?
1572 } else {
1571 } else {
1573 //groups
1572 //groups
1574 myAC.getInputEl().value = oData.grname;
1573 myAC.getInputEl().value = oData.grname;
1575 YUD.get('perm_new_member_type').value = 'users_group';
1574 YUD.get('perm_new_member_type').value = 'users_group';
1576 }
1575 }
1577 });
1576 });
1578 }
1577 }
1579
1578
1580 // in this keybuffer we will gather current value of search !
1579 // in this keybuffer we will gather current value of search !
1581 // since we need to get this just when someone does `@` then we do the
1580 // since we need to get this just when someone does `@` then we do the
1582 // search
1581 // search
1583 ownerAC.dataSource.chunks = [];
1582 ownerAC.dataSource.chunks = [];
1584 ownerAC.dataSource.mentionQuery = null;
1583 ownerAC.dataSource.mentionQuery = null;
1585
1584
1586 ownerAC.get_mention = function(msg, max_pos) {
1585 ownerAC.get_mention = function(msg, max_pos) {
1587 var org = msg;
1586 var org = msg;
1588 var re = new RegExp('(?:^@|\s@)([a-zA-Z0-9]{1}[a-zA-Z0-9\-\_\.]+)$')
1587 var re = new RegExp('(?:^@|\s@)([a-zA-Z0-9]{1}[a-zA-Z0-9\-\_\.]+)$')
1589 var chunks = [];
1588 var chunks = [];
1590
1589
1591
1590
1592 // cut first chunk until curret pos
1591 // cut first chunk until curret pos
1593 var to_max = msg.substr(0, max_pos);
1592 var to_max = msg.substr(0, max_pos);
1594 var at_pos = Math.max(0,to_max.lastIndexOf('@')-1);
1593 var at_pos = Math.max(0,to_max.lastIndexOf('@')-1);
1595 var msg2 = to_max.substr(at_pos);
1594 var msg2 = to_max.substr(at_pos);
1596
1595
1597 chunks.push(org.substr(0,at_pos))// prefix chunk
1596 chunks.push(org.substr(0,at_pos))// prefix chunk
1598 chunks.push(msg2) // search chunk
1597 chunks.push(msg2) // search chunk
1599 chunks.push(org.substr(max_pos)) // postfix chunk
1598 chunks.push(org.substr(max_pos)) // postfix chunk
1600
1599
1601 // clean up msg2 for filtering and regex match
1600 // clean up msg2 for filtering and regex match
1602 var msg2 = msg2.lstrip(' ').lstrip('\n');
1601 var msg2 = msg2.lstrip(' ').lstrip('\n');
1603
1602
1604 if(re.test(msg2)){
1603 if(re.test(msg2)){
1605 var unam = re.exec(msg2)[1];
1604 var unam = re.exec(msg2)[1];
1606 return [unam, chunks];
1605 return [unam, chunks];
1607 }
1606 }
1608 return [null, null];
1607 return [null, null];
1609 };
1608 };
1610
1609
1611 if (ownerAC.textboxKeyUpEvent){
1610 if (ownerAC.textboxKeyUpEvent){
1612 ownerAC.textboxKeyUpEvent.subscribe(function(type, args){
1611 ownerAC.textboxKeyUpEvent.subscribe(function(type, args){
1613
1612
1614 var ac_obj = args[0];
1613 var ac_obj = args[0];
1615 var currentMessage = args[1];
1614 var currentMessage = args[1];
1616 var currentCaretPosition = args[0]._elTextbox.selectionStart;
1615 var currentCaretPosition = args[0]._elTextbox.selectionStart;
1617
1616
1618 var unam = ownerAC.get_mention(currentMessage, currentCaretPosition);
1617 var unam = ownerAC.get_mention(currentMessage, currentCaretPosition);
1619 var curr_search = null;
1618 var curr_search = null;
1620 if(unam[0]){
1619 if(unam[0]){
1621 curr_search = unam[0];
1620 curr_search = unam[0];
1622 }
1621 }
1623
1622
1624 ownerAC.dataSource.chunks = unam[1];
1623 ownerAC.dataSource.chunks = unam[1];
1625 ownerAC.dataSource.mentionQuery = curr_search;
1624 ownerAC.dataSource.mentionQuery = curr_search;
1626
1625
1627 })
1626 })
1628 }
1627 }
1629 return {
1628 return {
1630 ownerDS: ownerDS,
1629 ownerDS: ownerDS,
1631 ownerAC: ownerAC,
1630 ownerAC: ownerAC,
1632 };
1631 };
1633 }
1632 }
1634
1633
1635 var addReviewMember = function(id,fname,lname,nname,gravatar_link){
1634 var addReviewMember = function(id,fname,lname,nname,gravatar_link){
1636 var members = YUD.get('review_members');
1635 var members = YUD.get('review_members');
1637 var tmpl = '<li id="reviewer_{2}">'+
1636 var tmpl = '<li id="reviewer_{2}">'+
1638 '<div class="reviewers_member">'+
1637 '<div class="reviewers_member">'+
1639 '<div class="gravatar"><img alt="gravatar" src="{0}"/> </div>'+
1638 '<div class="gravatar"><img alt="gravatar" src="{0}"/> </div>'+
1640 '<div style="float:left">{1}</div>'+
1639 '<div style="float:left">{1}</div>'+
1641 '<input type="hidden" value="{2}" name="review_members" />'+
1640 '<input type="hidden" value="{2}" name="review_members" />'+
1642 '<span class="delete_icon action_button" onclick="removeReviewMember({2})"></span>'+
1641 '<span class="delete_icon action_button" onclick="removeReviewMember({2})"></span>'+
1643 '</div>'+
1642 '</div>'+
1644 '</li>' ;
1643 '</li>' ;
1645 var displayname = "{0} {1} ({2})".format(fname,lname,nname);
1644 var displayname = "{0} {1} ({2})".format(fname,lname,nname);
1646 var element = tmpl.format(gravatar_link,displayname,id);
1645 var element = tmpl.format(gravatar_link,displayname,id);
1647 // check if we don't have this ID already in
1646 // check if we don't have this ID already in
1648 var ids = [];
1647 var ids = [];
1649 var _els = YUQ('#review_members li');
1648 var _els = YUQ('#review_members li');
1650 for (el in _els){
1649 for (el in _els){
1651 ids.push(_els[el].id)
1650 ids.push(_els[el].id)
1652 }
1651 }
1653 if(ids.indexOf('reviewer_'+id) == -1){
1652 if(ids.indexOf('reviewer_'+id) == -1){
1654 //only add if it's not there
1653 //only add if it's not there
1655 members.innerHTML += element;
1654 members.innerHTML += element;
1656 }
1655 }
1657
1656
1658 }
1657 }
1659
1658
1660 var removeReviewMember = function(reviewer_id, repo_name, pull_request_id){
1659 var removeReviewMember = function(reviewer_id, repo_name, pull_request_id){
1661 var el = YUD.get('reviewer_{0}'.format(reviewer_id));
1660 var el = YUD.get('reviewer_{0}'.format(reviewer_id));
1662 if (el.parentNode !== undefined){
1661 if (el.parentNode !== undefined){
1663 el.parentNode.removeChild(el);
1662 el.parentNode.removeChild(el);
1664 }
1663 }
1665 }
1664 }
1666
1665
1667 var updateReviewers = function(reviewers_ids, repo_name, pull_request_id){
1666 var updateReviewers = function(reviewers_ids, repo_name, pull_request_id){
1668 if (reviewers_ids === undefined){
1667 if (reviewers_ids === undefined){
1669 var reviewers_ids = [];
1668 var reviewers_ids = [];
1670 var ids = YUQ('#review_members input');
1669 var ids = YUQ('#review_members input');
1671 for(var i=0; i<ids.length;i++){
1670 for(var i=0; i<ids.length;i++){
1672 var id = ids[i].value
1671 var id = ids[i].value
1673 reviewers_ids.push(id);
1672 reviewers_ids.push(id);
1674 }
1673 }
1675 }
1674 }
1676 var url = pyroutes.url('pullrequest_update', {"repo_name":repo_name,
1675 var url = pyroutes.url('pullrequest_update', {"repo_name":repo_name,
1677 "pull_request_id": pull_request_id});
1676 "pull_request_id": pull_request_id});
1678 var postData = {'_method':'put',
1677 var postData = {'_method':'put',
1679 'reviewers_ids': reviewers_ids};
1678 'reviewers_ids': reviewers_ids};
1680 var success = function(o){
1679 var success = function(o){
1681 window.location.reload();
1680 window.location.reload();
1682 }
1681 }
1683 ajaxPOST(url,postData,success);
1682 ajaxPOST(url,postData,success);
1684 }
1683 }
1685
1684
1686 var PullRequestAutoComplete = function (divid, cont, users_list, groups_list) {
1685 var PullRequestAutoComplete = function (divid, cont, users_list, groups_list) {
1687 var myUsers = users_list;
1686 var myUsers = users_list;
1688 var myGroups = groups_list;
1687 var myGroups = groups_list;
1689
1688
1690 // Define a custom search function for the DataSource of users
1689 // Define a custom search function for the DataSource of users
1691 var matchUsers = function (sQuery) {
1690 var matchUsers = function (sQuery) {
1692 // Case insensitive matching
1691 // Case insensitive matching
1693 var query = sQuery.toLowerCase();
1692 var query = sQuery.toLowerCase();
1694 var i = 0;
1693 var i = 0;
1695 var l = myUsers.length;
1694 var l = myUsers.length;
1696 var matches = [];
1695 var matches = [];
1697
1696
1698 // Match against each name of each contact
1697 // Match against each name of each contact
1699 for (; i < l; i++) {
1698 for (; i < l; i++) {
1700 contact = myUsers[i];
1699 contact = myUsers[i];
1701 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1700 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1702 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1701 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1703 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1702 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1704 matches[matches.length] = contact;
1703 matches[matches.length] = contact;
1705 }
1704 }
1706 }
1705 }
1707 return matches;
1706 return matches;
1708 };
1707 };
1709
1708
1710 // Define a custom search function for the DataSource of userGroups
1709 // Define a custom search function for the DataSource of userGroups
1711 var matchGroups = function (sQuery) {
1710 var matchGroups = function (sQuery) {
1712 // Case insensitive matching
1711 // Case insensitive matching
1713 var query = sQuery.toLowerCase();
1712 var query = sQuery.toLowerCase();
1714 var i = 0;
1713 var i = 0;
1715 var l = myGroups.length;
1714 var l = myGroups.length;
1716 var matches = [];
1715 var matches = [];
1717
1716
1718 // Match against each name of each contact
1717 // Match against each name of each contact
1719 for (; i < l; i++) {
1718 for (; i < l; i++) {
1720 matched_group = myGroups[i];
1719 matched_group = myGroups[i];
1721 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
1720 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
1722 matches[matches.length] = matched_group;
1721 matches[matches.length] = matched_group;
1723 }
1722 }
1724 }
1723 }
1725 return matches;
1724 return matches;
1726 };
1725 };
1727
1726
1728 //match all
1727 //match all
1729 var matchAll = function (sQuery) {
1728 var matchAll = function (sQuery) {
1730 u = matchUsers(sQuery);
1729 u = matchUsers(sQuery);
1731 return u
1730 return u
1732 };
1731 };
1733
1732
1734 // DataScheme for owner
1733 // DataScheme for owner
1735 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1734 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1736
1735
1737 ownerDS.responseSchema = {
1736 ownerDS.responseSchema = {
1738 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1737 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1739 };
1738 };
1740
1739
1741 // Instantiate AutoComplete for mentions
1740 // Instantiate AutoComplete for mentions
1742 var reviewerAC = new YAHOO.widget.AutoComplete(divid, cont, ownerDS);
1741 var reviewerAC = new YAHOO.widget.AutoComplete(divid, cont, ownerDS);
1743 reviewerAC.useShadow = false;
1742 reviewerAC.useShadow = false;
1744 reviewerAC.resultTypeList = false;
1743 reviewerAC.resultTypeList = false;
1745 reviewerAC.suppressInputUpdate = true;
1744 reviewerAC.suppressInputUpdate = true;
1746 reviewerAC.animVert = false;
1745 reviewerAC.animVert = false;
1747 reviewerAC.animHoriz = false;
1746 reviewerAC.animHoriz = false;
1748 reviewerAC.animSpeed = 0.1;
1747 reviewerAC.animSpeed = 0.1;
1749
1748
1750 // Helper highlight function for the formatter
1749 // Helper highlight function for the formatter
1751 var highlightMatch = function (full, snippet, matchindex) {
1750 var highlightMatch = function (full, snippet, matchindex) {
1752 return full.substring(0, matchindex)
1751 return full.substring(0, matchindex)
1753 + "<span class='match'>"
1752 + "<span class='match'>"
1754 + full.substr(matchindex, snippet.length)
1753 + full.substr(matchindex, snippet.length)
1755 + "</span>" + full.substring(matchindex + snippet.length);
1754 + "</span>" + full.substring(matchindex + snippet.length);
1756 };
1755 };
1757
1756
1758 // Custom formatter to highlight the matching letters
1757 // Custom formatter to highlight the matching letters
1759 reviewerAC.formatResult = function (oResultData, sQuery, sResultMatch) {
1758 reviewerAC.formatResult = function (oResultData, sQuery, sResultMatch) {
1760 var org_sQuery = sQuery;
1759 var org_sQuery = sQuery;
1761 if(this.dataSource.mentionQuery != null){
1760 if(this.dataSource.mentionQuery != null){
1762 sQuery = this.dataSource.mentionQuery;
1761 sQuery = this.dataSource.mentionQuery;
1763 }
1762 }
1764
1763
1765 var query = sQuery.toLowerCase();
1764 var query = sQuery.toLowerCase();
1766 var _gravatar = function(res, em, group){
1765 var _gravatar = function(res, em, group){
1767 if (group !== undefined){
1766 if (group !== undefined){
1768 em = '/images/icons/group.png'
1767 em = '/images/icons/group.png'
1769 }
1768 }
1770 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1769 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1771 return tmpl.format(em,res)
1770 return tmpl.format(em,res)
1772 }
1771 }
1773 if (oResultData.nname != undefined) {
1772 if (oResultData.nname != undefined) {
1774 var fname = oResultData.fname || "";
1773 var fname = oResultData.fname || "";
1775 var lname = oResultData.lname || "";
1774 var lname = oResultData.lname || "";
1776 var nname = oResultData.nname;
1775 var nname = oResultData.nname;
1777
1776
1778 // Guard against null value
1777 // Guard against null value
1779 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1778 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1780 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1779 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1781 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1780 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1782 displayfname, displaylname, displaynname;
1781 displayfname, displaylname, displaynname;
1783
1782
1784 if (fnameMatchIndex > -1) {
1783 if (fnameMatchIndex > -1) {
1785 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1784 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1786 } else {
1785 } else {
1787 displayfname = fname;
1786 displayfname = fname;
1788 }
1787 }
1789
1788
1790 if (lnameMatchIndex > -1) {
1789 if (lnameMatchIndex > -1) {
1791 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1790 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1792 } else {
1791 } else {
1793 displaylname = lname;
1792 displaylname = lname;
1794 }
1793 }
1795
1794
1796 if (nnameMatchIndex > -1) {
1795 if (nnameMatchIndex > -1) {
1797 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1796 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1798 } else {
1797 } else {
1799 displaynname = nname ? "(" + nname + ")" : "";
1798 displaynname = nname ? "(" + nname + ")" : "";
1800 }
1799 }
1801
1800
1802 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1801 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1803 } else {
1802 } else {
1804 return '';
1803 return '';
1805 }
1804 }
1806 };
1805 };
1807
1806
1808 //members cache to catch duplicates
1807 //members cache to catch duplicates
1809 reviewerAC.dataSource.cache = [];
1808 reviewerAC.dataSource.cache = [];
1810 // hack into select event
1809 // hack into select event
1811 if(reviewerAC.itemSelectEvent){
1810 if(reviewerAC.itemSelectEvent){
1812 reviewerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
1811 reviewerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
1813
1812
1814 var myAC = aArgs[0]; // reference back to the AC instance
1813 var myAC = aArgs[0]; // reference back to the AC instance
1815 var elLI = aArgs[1]; // reference to the selected LI element
1814 var elLI = aArgs[1]; // reference to the selected LI element
1816 var oData = aArgs[2]; // object literal of selected item's result data
1815 var oData = aArgs[2]; // object literal of selected item's result data
1817
1816
1818 //fill the autocomplete with value
1817 //fill the autocomplete with value
1819
1818
1820 if (oData.nname != undefined) {
1819 if (oData.nname != undefined) {
1821 addReviewMember(oData.id, oData.fname, oData.lname, oData.nname,
1820 addReviewMember(oData.id, oData.fname, oData.lname, oData.nname,
1822 oData.gravatar_lnk);
1821 oData.gravatar_lnk);
1823 myAC.dataSource.cache.push(oData.id);
1822 myAC.dataSource.cache.push(oData.id);
1824 YUD.get('user').value = ''
1823 YUD.get('user').value = ''
1825 }
1824 }
1826 });
1825 });
1827 }
1826 }
1828 return {
1827 return {
1829 ownerDS: ownerDS,
1828 ownerDS: ownerDS,
1830 reviewerAC: reviewerAC,
1829 reviewerAC: reviewerAC,
1831 };
1830 };
1832 }
1831 }
1833
1832
1834 /**
1833 /**
1835 * QUICK REPO MENU
1834 * QUICK REPO MENU
1836 */
1835 */
1837 var quick_repo_menu = function(){
1836 var quick_repo_menu = function(){
1838 YUE.on(YUQ('.quick_repo_menu'),'mouseenter',function(e){
1837 YUE.on(YUQ('.quick_repo_menu'),'mouseenter',function(e){
1839 var menu = e.currentTarget.firstElementChild.firstElementChild;
1838 var menu = e.currentTarget.firstElementChild.firstElementChild;
1840 if(YUD.hasClass(menu,'hidden')){
1839 if(YUD.hasClass(menu,'hidden')){
1841 YUD.replaceClass(e.currentTarget,'hidden', 'active');
1840 YUD.replaceClass(e.currentTarget,'hidden', 'active');
1842 YUD.replaceClass(menu, 'hidden', 'active');
1841 YUD.replaceClass(menu, 'hidden', 'active');
1843 }
1842 }
1844 })
1843 })
1845 YUE.on(YUQ('.quick_repo_menu'),'mouseleave',function(e){
1844 YUE.on(YUQ('.quick_repo_menu'),'mouseleave',function(e){
1846 var menu = e.currentTarget.firstElementChild.firstElementChild;
1845 var menu = e.currentTarget.firstElementChild.firstElementChild;
1847 if(YUD.hasClass(menu,'active')){
1846 if(YUD.hasClass(menu,'active')){
1848 YUD.replaceClass(e.currentTarget, 'active', 'hidden');
1847 YUD.replaceClass(e.currentTarget, 'active', 'hidden');
1849 YUD.replaceClass(menu, 'active', 'hidden');
1848 YUD.replaceClass(menu, 'active', 'hidden');
1850 }
1849 }
1851 })
1850 })
1852 };
1851 };
1853
1852
1854
1853
1855 /**
1854 /**
1856 * TABLE SORTING
1855 * TABLE SORTING
1857 */
1856 */
1858
1857
1859 // returns a node from given html;
1858 // returns a node from given html;
1860 var fromHTML = function(html){
1859 var fromHTML = function(html){
1861 var _html = document.createElement('element');
1860 var _html = document.createElement('element');
1862 _html.innerHTML = html;
1861 _html.innerHTML = html;
1863 return _html;
1862 return _html;
1864 }
1863 }
1865 var get_rev = function(node){
1864 var get_rev = function(node){
1866 var n = node.firstElementChild.firstElementChild;
1865 var n = node.firstElementChild.firstElementChild;
1867
1866
1868 if (n===null){
1867 if (n===null){
1869 return -1
1868 return -1
1870 }
1869 }
1871 else{
1870 else{
1872 out = n.firstElementChild.innerHTML.split(':')[0].replace('r','');
1871 out = n.firstElementChild.innerHTML.split(':')[0].replace('r','');
1873 return parseInt(out);
1872 return parseInt(out);
1874 }
1873 }
1875 }
1874 }
1876
1875
1877 var get_name = function(node){
1876 var get_name = function(node){
1878 var name = node.firstElementChild.children[2].innerHTML;
1877 var name = node.firstElementChild.children[2].innerHTML;
1879 return name
1878 return name
1880 }
1879 }
1881 var get_group_name = function(node){
1880 var get_group_name = function(node){
1882 var name = node.firstElementChild.children[1].innerHTML;
1881 var name = node.firstElementChild.children[1].innerHTML;
1883 return name
1882 return name
1884 }
1883 }
1885 var get_date = function(node){
1884 var get_date = function(node){
1886 var date_ = YUD.getAttribute(node.firstElementChild,'date');
1885 var date_ = YUD.getAttribute(node.firstElementChild,'date');
1887 return date_
1886 return date_
1888 }
1887 }
1889
1888
1890 var get_age = function(node){
1889 var get_age = function(node){
1891 return node
1890 return node
1892 }
1891 }
1893
1892
1894 var get_link = function(node){
1893 var get_link = function(node){
1895 return node.firstElementChild.text;
1894 return node.firstElementChild.text;
1896 }
1895 }
1897
1896
1898 var revisionSort = function(a, b, desc, field) {
1897 var revisionSort = function(a, b, desc, field) {
1899
1898
1900 var a_ = fromHTML(a.getData(field));
1899 var a_ = fromHTML(a.getData(field));
1901 var b_ = fromHTML(b.getData(field));
1900 var b_ = fromHTML(b.getData(field));
1902
1901
1903 // extract revisions from string nodes
1902 // extract revisions from string nodes
1904 a_ = get_rev(a_)
1903 a_ = get_rev(a_)
1905 b_ = get_rev(b_)
1904 b_ = get_rev(b_)
1906
1905
1907 var comp = YAHOO.util.Sort.compare;
1906 var comp = YAHOO.util.Sort.compare;
1908 var compState = comp(a_, b_, desc);
1907 var compState = comp(a_, b_, desc);
1909 return compState;
1908 return compState;
1910 };
1909 };
1911 var ageSort = function(a, b, desc, field) {
1910 var ageSort = function(a, b, desc, field) {
1912 var a_ = fromHTML(a.getData(field));
1911 var a_ = fromHTML(a.getData(field));
1913 var b_ = fromHTML(b.getData(field));
1912 var b_ = fromHTML(b.getData(field));
1914
1913
1915 // extract name from table
1914 // extract name from table
1916 a_ = get_date(a_)
1915 a_ = get_date(a_)
1917 b_ = get_date(b_)
1916 b_ = get_date(b_)
1918
1917
1919 var comp = YAHOO.util.Sort.compare;
1918 var comp = YAHOO.util.Sort.compare;
1920 var compState = comp(a_, b_, desc);
1919 var compState = comp(a_, b_, desc);
1921 return compState;
1920 return compState;
1922 };
1921 };
1923
1922
1924 var lastLoginSort = function(a, b, desc, field) {
1923 var lastLoginSort = function(a, b, desc, field) {
1925 var a_ = a.getData('last_login_raw') || 0;
1924 var a_ = a.getData('last_login_raw') || 0;
1926 var b_ = b.getData('last_login_raw') || 0;
1925 var b_ = b.getData('last_login_raw') || 0;
1927
1926
1928 var comp = YAHOO.util.Sort.compare;
1927 var comp = YAHOO.util.Sort.compare;
1929 var compState = comp(a_, b_, desc);
1928 var compState = comp(a_, b_, desc);
1930 return compState;
1929 return compState;
1931 };
1930 };
1932
1931
1933 var nameSort = function(a, b, desc, field) {
1932 var nameSort = function(a, b, desc, field) {
1934 var a_ = fromHTML(a.getData(field));
1933 var a_ = fromHTML(a.getData(field));
1935 var b_ = fromHTML(b.getData(field));
1934 var b_ = fromHTML(b.getData(field));
1936
1935
1937 // extract name from table
1936 // extract name from table
1938 a_ = get_name(a_)
1937 a_ = get_name(a_)
1939 b_ = get_name(b_)
1938 b_ = get_name(b_)
1940
1939
1941 var comp = YAHOO.util.Sort.compare;
1940 var comp = YAHOO.util.Sort.compare;
1942 var compState = comp(a_, b_, desc);
1941 var compState = comp(a_, b_, desc);
1943 return compState;
1942 return compState;
1944 };
1943 };
1945
1944
1946 var permNameSort = function(a, b, desc, field) {
1945 var permNameSort = function(a, b, desc, field) {
1947 var a_ = fromHTML(a.getData(field));
1946 var a_ = fromHTML(a.getData(field));
1948 var b_ = fromHTML(b.getData(field));
1947 var b_ = fromHTML(b.getData(field));
1949 // extract name from table
1948 // extract name from table
1950
1949
1951 a_ = a_.children[0].innerHTML;
1950 a_ = a_.children[0].innerHTML;
1952 b_ = b_.children[0].innerHTML;
1951 b_ = b_.children[0].innerHTML;
1953
1952
1954 var comp = YAHOO.util.Sort.compare;
1953 var comp = YAHOO.util.Sort.compare;
1955 var compState = comp(a_, b_, desc);
1954 var compState = comp(a_, b_, desc);
1956 return compState;
1955 return compState;
1957 };
1956 };
1958
1957
1959 var groupNameSort = function(a, b, desc, field) {
1958 var groupNameSort = function(a, b, desc, field) {
1960 var a_ = fromHTML(a.getData(field));
1959 var a_ = fromHTML(a.getData(field));
1961 var b_ = fromHTML(b.getData(field));
1960 var b_ = fromHTML(b.getData(field));
1962
1961
1963 // extract name from table
1962 // extract name from table
1964 a_ = get_group_name(a_)
1963 a_ = get_group_name(a_)
1965 b_ = get_group_name(b_)
1964 b_ = get_group_name(b_)
1966
1965
1967 var comp = YAHOO.util.Sort.compare;
1966 var comp = YAHOO.util.Sort.compare;
1968 var compState = comp(a_, b_, desc);
1967 var compState = comp(a_, b_, desc);
1969 return compState;
1968 return compState;
1970 };
1969 };
1971 var dateSort = function(a, b, desc, field) {
1970 var dateSort = function(a, b, desc, field) {
1972 var a_ = fromHTML(a.getData(field));
1971 var a_ = fromHTML(a.getData(field));
1973 var b_ = fromHTML(b.getData(field));
1972 var b_ = fromHTML(b.getData(field));
1974
1973
1975 // extract name from table
1974 // extract name from table
1976 a_ = get_date(a_)
1975 a_ = get_date(a_)
1977 b_ = get_date(b_)
1976 b_ = get_date(b_)
1978
1977
1979 var comp = YAHOO.util.Sort.compare;
1978 var comp = YAHOO.util.Sort.compare;
1980 var compState = comp(a_, b_, desc);
1979 var compState = comp(a_, b_, desc);
1981 return compState;
1980 return compState;
1982 };
1981 };
1983
1982
1984 var linkSort = function(a, b, desc, field) {
1983 var linkSort = function(a, b, desc, field) {
1985 var a_ = fromHTML(a.getData(field));
1984 var a_ = fromHTML(a.getData(field));
1986 var b_ = fromHTML(a.getData(field));
1985 var b_ = fromHTML(a.getData(field));
1987
1986
1988 // extract url text from string nodes
1987 // extract url text from string nodes
1989 a_ = get_link(a_)
1988 a_ = get_link(a_)
1990 b_ = get_link(b_)
1989 b_ = get_link(b_)
1991
1990
1992 var comp = YAHOO.util.Sort.compare;
1991 var comp = YAHOO.util.Sort.compare;
1993 var compState = comp(a_, b_, desc);
1992 var compState = comp(a_, b_, desc);
1994 return compState;
1993 return compState;
1995 }
1994 }
1996
1995
1997 var addPermAction = function(_html, users_list, groups_list){
1996 var addPermAction = function(_html, users_list, groups_list){
1998 var elmts = YUD.getElementsByClassName('last_new_member');
1997 var elmts = YUD.getElementsByClassName('last_new_member');
1999 var last_node = elmts[elmts.length-1];
1998 var last_node = elmts[elmts.length-1];
2000 if (last_node){
1999 if (last_node){
2001 var next_id = (YUD.getElementsByClassName('new_members')).length;
2000 var next_id = (YUD.getElementsByClassName('new_members')).length;
2002 _html = _html.format(next_id);
2001 _html = _html.format(next_id);
2003 last_node.innerHTML = _html;
2002 last_node.innerHTML = _html;
2004 YUD.setStyle(last_node, 'display', '');
2003 YUD.setStyle(last_node, 'display', '');
2005 YUD.removeClass(last_node, 'last_new_member');
2004 YUD.removeClass(last_node, 'last_new_member');
2006 MembersAutoComplete("perm_new_member_name_"+next_id,
2005 MembersAutoComplete("perm_new_member_name_"+next_id,
2007 "perm_container_"+next_id, users_list, groups_list);
2006 "perm_container_"+next_id, users_list, groups_list);
2008 //create new last NODE
2007 //create new last NODE
2009 var el = document.createElement('tr');
2008 var el = document.createElement('tr');
2010 el.id = 'add_perm_input';
2009 el.id = 'add_perm_input';
2011 YUD.addClass(el,'last_new_member');
2010 YUD.addClass(el,'last_new_member');
2012 YUD.addClass(el,'new_members');
2011 YUD.addClass(el,'new_members');
2013 YUD.insertAfter(el, last_node);
2012 YUD.insertAfter(el, last_node);
2014 }
2013 }
2015 }
2014 }
2016
2015
2017 /* Multi selectors */
2016 /* Multi selectors */
2018
2017
2019 var MultiSelectWidget = function(selected_id, available_id, form_id){
2018 var MultiSelectWidget = function(selected_id, available_id, form_id){
2020
2019
2021
2020
2022 //definition of containers ID's
2021 //definition of containers ID's
2023 var selected_container = selected_id;
2022 var selected_container = selected_id;
2024 var available_container = available_id;
2023 var available_container = available_id;
2025
2024
2026 //temp container for selected storage.
2025 //temp container for selected storage.
2027 var cache = new Array();
2026 var cache = new Array();
2028 var av_cache = new Array();
2027 var av_cache = new Array();
2029 var c = YUD.get(selected_container);
2028 var c = YUD.get(selected_container);
2030 var ac = YUD.get(available_container);
2029 var ac = YUD.get(available_container);
2031
2030
2032 //get only selected options for further fullfilment
2031 //get only selected options for further fullfilment
2033 for(var i = 0;node =c.options[i];i++){
2032 for(var i = 0;node =c.options[i];i++){
2034 if(node.selected){
2033 if(node.selected){
2035 //push selected to my temp storage left overs :)
2034 //push selected to my temp storage left overs :)
2036 cache.push(node);
2035 cache.push(node);
2037 }
2036 }
2038 }
2037 }
2039
2038
2040 //get all available options to cache
2039 //get all available options to cache
2041 for(var i = 0;node =ac.options[i];i++){
2040 for(var i = 0;node =ac.options[i];i++){
2042 //push selected to my temp storage left overs :)
2041 //push selected to my temp storage left overs :)
2043 av_cache.push(node);
2042 av_cache.push(node);
2044 }
2043 }
2045
2044
2046 //fill available only with those not in choosen
2045 //fill available only with those not in choosen
2047 ac.options.length=0;
2046 ac.options.length=0;
2048 tmp_cache = new Array();
2047 tmp_cache = new Array();
2049
2048
2050 for(var i = 0;node = av_cache[i];i++){
2049 for(var i = 0;node = av_cache[i];i++){
2051 var add = true;
2050 var add = true;
2052 for(var i2 = 0;node_2 = cache[i2];i2++){
2051 for(var i2 = 0;node_2 = cache[i2];i2++){
2053 if(node.value == node_2.value){
2052 if(node.value == node_2.value){
2054 add=false;
2053 add=false;
2055 break;
2054 break;
2056 }
2055 }
2057 }
2056 }
2058 if(add){
2057 if(add){
2059 tmp_cache.push(new Option(node.text, node.value, false, false));
2058 tmp_cache.push(new Option(node.text, node.value, false, false));
2060 }
2059 }
2061 }
2060 }
2062
2061
2063 for(var i = 0;node = tmp_cache[i];i++){
2062 for(var i = 0;node = tmp_cache[i];i++){
2064 ac.options[i] = node;
2063 ac.options[i] = node;
2065 }
2064 }
2066
2065
2067 function prompts_action_callback(e){
2066 function prompts_action_callback(e){
2068
2067
2069 var choosen = YUD.get(selected_container);
2068 var choosen = YUD.get(selected_container);
2070 var available = YUD.get(available_container);
2069 var available = YUD.get(available_container);
2071
2070
2072 //get checked and unchecked options from field
2071 //get checked and unchecked options from field
2073 function get_checked(from_field){
2072 function get_checked(from_field){
2074 //temp container for storage.
2073 //temp container for storage.
2075 var sel_cache = new Array();
2074 var sel_cache = new Array();
2076 var oth_cache = new Array();
2075 var oth_cache = new Array();
2077
2076
2078 for(var i = 0;node = from_field.options[i];i++){
2077 for(var i = 0;node = from_field.options[i];i++){
2079 if(node.selected){
2078 if(node.selected){
2080 //push selected fields :)
2079 //push selected fields :)
2081 sel_cache.push(node);
2080 sel_cache.push(node);
2082 }
2081 }
2083 else{
2082 else{
2084 oth_cache.push(node)
2083 oth_cache.push(node)
2085 }
2084 }
2086 }
2085 }
2087
2086
2088 return [sel_cache,oth_cache]
2087 return [sel_cache,oth_cache]
2089 }
2088 }
2090
2089
2091 //fill the field with given options
2090 //fill the field with given options
2092 function fill_with(field,options){
2091 function fill_with(field,options){
2093 //clear firtst
2092 //clear firtst
2094 field.options.length=0;
2093 field.options.length=0;
2095 for(var i = 0;node = options[i];i++){
2094 for(var i = 0;node = options[i];i++){
2096 field.options[i]=new Option(node.text, node.value,
2095 field.options[i]=new Option(node.text, node.value,
2097 false, false);
2096 false, false);
2098 }
2097 }
2099
2098
2100 }
2099 }
2101 //adds to current field
2100 //adds to current field
2102 function add_to(field,options){
2101 function add_to(field,options){
2103 for(var i = 0;node = options[i];i++){
2102 for(var i = 0;node = options[i];i++){
2104 field.appendChild(new Option(node.text, node.value,
2103 field.appendChild(new Option(node.text, node.value,
2105 false, false));
2104 false, false));
2106 }
2105 }
2107 }
2106 }
2108
2107
2109 // add action
2108 // add action
2110 if (this.id=='add_element'){
2109 if (this.id=='add_element'){
2111 var c = get_checked(available);
2110 var c = get_checked(available);
2112 add_to(choosen,c[0]);
2111 add_to(choosen,c[0]);
2113 fill_with(available,c[1]);
2112 fill_with(available,c[1]);
2114 }
2113 }
2115 // remove action
2114 // remove action
2116 if (this.id=='remove_element'){
2115 if (this.id=='remove_element'){
2117 var c = get_checked(choosen);
2116 var c = get_checked(choosen);
2118 add_to(available,c[0]);
2117 add_to(available,c[0]);
2119 fill_with(choosen,c[1]);
2118 fill_with(choosen,c[1]);
2120 }
2119 }
2121 // add all elements
2120 // add all elements
2122 if(this.id=='add_all_elements'){
2121 if(this.id=='add_all_elements'){
2123 for(var i=0; node = available.options[i];i++){
2122 for(var i=0; node = available.options[i];i++){
2124 choosen.appendChild(new Option(node.text,
2123 choosen.appendChild(new Option(node.text,
2125 node.value, false, false));
2124 node.value, false, false));
2126 }
2125 }
2127 available.options.length = 0;
2126 available.options.length = 0;
2128 }
2127 }
2129 //remove all elements
2128 //remove all elements
2130 if(this.id=='remove_all_elements'){
2129 if(this.id=='remove_all_elements'){
2131 for(var i=0; node = choosen.options[i];i++){
2130 for(var i=0; node = choosen.options[i];i++){
2132 available.appendChild(new Option(node.text,
2131 available.appendChild(new Option(node.text,
2133 node.value, false, false));
2132 node.value, false, false));
2134 }
2133 }
2135 choosen.options.length = 0;
2134 choosen.options.length = 0;
2136 }
2135 }
2137
2136
2138 }
2137 }
2139
2138
2140 YUE.addListener(['add_element','remove_element',
2139 YUE.addListener(['add_element','remove_element',
2141 'add_all_elements','remove_all_elements'],'click',
2140 'add_all_elements','remove_all_elements'],'click',
2142 prompts_action_callback)
2141 prompts_action_callback)
2143 if (form_id !== undefined) {
2142 if (form_id !== undefined) {
2144 YUE.addListener(form_id,'submit',function(){
2143 YUE.addListener(form_id,'submit',function(){
2145 var choosen = YUD.get(selected_container);
2144 var choosen = YUD.get(selected_container);
2146 for (var i = 0; i < choosen.options.length; i++) {
2145 for (var i = 0; i < choosen.options.length; i++) {
2147 choosen.options[i].selected = 'selected';
2146 choosen.options[i].selected = 'selected';
2148 }
2147 }
2149 });
2148 });
2150 }
2149 }
2151 }
2150 }
2152
2151
2153
2152
2154 // global hooks after DOM is loaded
2153 // global hooks after DOM is loaded
2155
2154
2156 YUE.onDOMReady(function(){
2155 YUE.onDOMReady(function(){
2157 YUE.on(YUQ('.diff-collapse-button'), 'click', function(e){
2156 YUE.on(YUQ('.diff-collapse-button'), 'click', function(e){
2158 var button = e.currentTarget;
2157 var button = e.currentTarget;
2159 var t = YUD.get(button).getAttribute('target');
2158 var t = YUD.get(button).getAttribute('target');
2160 console.log(t);
2159 console.log(t);
2161 if(YUD.hasClass(t, 'hidden')){
2160 if(YUD.hasClass(t, 'hidden')){
2162 YUD.removeClass(t, 'hidden');
2161 YUD.removeClass(t, 'hidden');
2163 YUD.get(button).innerHTML = "&uarr; {0} &uarr;".format(_TM['Collapse diff']);
2162 YUD.get(button).innerHTML = "&uarr; {0} &uarr;".format(_TM['Collapse diff']);
2164 }
2163 }
2165 else if(!YUD.hasClass(t, 'hidden')){
2164 else if(!YUD.hasClass(t, 'hidden')){
2166 YUD.addClass(t, 'hidden');
2165 YUD.addClass(t, 'hidden');
2167 YUD.get(button).innerHTML = "&darr; {0} &darr;".format(_TM['Expand diff']);
2166 YUD.get(button).innerHTML = "&darr; {0} &darr;".format(_TM['Expand diff']);
2168 }
2167 }
2169 });
2168 });
2170
2169
2171
2170
2172
2171
2173 });
2172 });
2174
2173
@@ -1,359 +1,355 b''
1 ## -*- coding: utf-8 -*-
1 ## -*- coding: utf-8 -*-
2 <%inherit file="root.html"/>
2 <%inherit file="root.html"/>
3
3
4 <!-- HEADER -->
4 <!-- HEADER -->
5 <div id="header-dd"></div>
5 <div id="header-dd"></div>
6 <div id="header">
6 <div id="header">
7 <div id="header-inner" class="title">
7 <div id="header-inner" class="title">
8 <div id="logo">
8 <div id="logo">
9 <h1><a href="${h.url('home')}">${c.rhodecode_name}</a></h1>
9 <h1><a href="${h.url('home')}">${c.rhodecode_name}</a></h1>
10 </div>
10 </div>
11 <!-- MENU -->
11 <!-- MENU -->
12 ${self.page_nav()}
12 ${self.page_nav()}
13 <!-- END MENU -->
13 <!-- END MENU -->
14 ${self.body()}
14 ${self.body()}
15 </div>
15 </div>
16 </div>
16 </div>
17 <!-- END HEADER -->
17 <!-- END HEADER -->
18
18
19 <!-- CONTENT -->
19 <!-- CONTENT -->
20 <div id="content">
20 <div id="content">
21 <div class="flash_msg">
21 <div class="flash_msg">
22 <% messages = h.flash.pop_messages() %>
22 <% messages = h.flash.pop_messages() %>
23 % if messages:
23 % if messages:
24 <ul id="flash-messages">
24 <ul id="flash-messages">
25 % for message in messages:
25 % for message in messages:
26 <li class="${message.category}_msg">${message}</li>
26 <li class="${message.category}_msg">${message}</li>
27 % endfor
27 % endfor
28 </ul>
28 </ul>
29 % endif
29 % endif
30 </div>
30 </div>
31 <div id="main">
31 <div id="main">
32 ${next.main()}
32 ${next.main()}
33 </div>
33 </div>
34 </div>
34 </div>
35 <!-- END CONTENT -->
35 <!-- END CONTENT -->
36
36
37 <!-- FOOTER -->
37 <!-- FOOTER -->
38 <div id="footer">
38 <div id="footer">
39 <div id="footer-inner" class="title">
39 <div id="footer-inner" class="title">
40 <div>
40 <div>
41 <p class="footer-link">
41 <p class="footer-link">
42 <a href="${h.url('bugtracker')}">${_('Submit a bug')}</a>
42 <a href="${h.url('bugtracker')}">${_('Submit a bug')}</a>
43 </p>
43 </p>
44 <p class="footer-link-right">
44 <p class="footer-link-right">
45 <a href="${h.url('rhodecode_official')}">RhodeCode${'-%s' % c.rhodecode_instanceid if c.rhodecode_instanceid else ''}</a>
45 <a href="${h.url('rhodecode_official')}">RhodeCode${'-%s' % c.rhodecode_instanceid if c.rhodecode_instanceid else ''}</a>
46 ${c.rhodecode_version} &copy; 2010-${h.datetime.today().year} by Marcin Kuzminski
46 ${c.rhodecode_version} &copy; 2010-${h.datetime.today().year} by Marcin Kuzminski
47 </p>
47 </p>
48 </div>
48 </div>
49 </div>
49 </div>
50 </div>
50 </div>
51 <!-- END FOOTER -->
51 <!-- END FOOTER -->
52
52
53 ### MAKO DEFS ###
53 ### MAKO DEFS ###
54 <%def name="page_nav()">
54 <%def name="page_nav()">
55 ${self.menu()}
55 ${self.menu()}
56 </%def>
56 </%def>
57
57
58 <%def name="breadcrumbs()">
58 <%def name="breadcrumbs()">
59 <div class="breadcrumbs">
59 <div class="breadcrumbs">
60 ${self.breadcrumbs_links()}
60 ${self.breadcrumbs_links()}
61 </div>
61 </div>
62 </%def>
62 </%def>
63
63
64 <%def name="context_bar(current=None)">
64 <%def name="context_bar(current=None)">
65 %if c.repo_name:
65 %if c.repo_name:
66 ${repo_context_bar(current)}
66 ${repo_context_bar(current)}
67 %endif
67 %endif
68 </%def>
68 </%def>
69
69
70 <%def name="admin_menu()">
70 <%def name="admin_menu()">
71 <ul class="admin_menu">
71 <ul class="admin_menu">
72 <li>${h.link_to(_('admin journal'),h.url('admin_home'),class_='journal ')}</li>
72 <li>${h.link_to(_('admin journal'),h.url('admin_home'),class_='journal ')}</li>
73 <li>${h.link_to(_('repositories'),h.url('repos'),class_='repos')}</li>
73 <li>${h.link_to(_('repositories'),h.url('repos'),class_='repos')}</li>
74 <li>${h.link_to(_('repository groups'),h.url('repos_groups'),class_='repos_groups')}</li>
74 <li>${h.link_to(_('repository groups'),h.url('repos_groups'),class_='repos_groups')}</li>
75 <li>${h.link_to(_('users'),h.url('users'),class_='users')}</li>
75 <li>${h.link_to(_('users'),h.url('users'),class_='users')}</li>
76 <li>${h.link_to(_('user groups'),h.url('users_groups'),class_='groups')}</li>
76 <li>${h.link_to(_('user groups'),h.url('users_groups'),class_='groups')}</li>
77 <li>${h.link_to(_('permissions'),h.url('edit_permission',id='default'),class_='permissions')}</li>
77 <li>${h.link_to(_('permissions'),h.url('edit_permission',id='default'),class_='permissions')}</li>
78 <li>${h.link_to(_('ldap'),h.url('ldap_home'),class_='ldap')}</li>
78 <li>${h.link_to(_('ldap'),h.url('ldap_home'),class_='ldap')}</li>
79 <li>${h.link_to(_('defaults'),h.url('defaults'),class_='defaults')}</li>
79 <li>${h.link_to(_('defaults'),h.url('defaults'),class_='defaults')}</li>
80 <li class="last">${h.link_to(_('settings'),h.url('admin_settings'),class_='settings')}</li>
80 <li class="last">${h.link_to(_('settings'),h.url('admin_settings'),class_='settings')}</li>
81 </ul>
81 </ul>
82 </%def>
82 </%def>
83
83
84 <%def name="admin_menu_simple()">
84 <%def name="admin_menu_simple()">
85 <ul>
85 <ul>
86 <li>${h.link_to(_('repositories groups'),h.url('repos_groups'),class_='repos_groups')}</li>
86 <li>${h.link_to(_('repository groups'),h.url('repos_groups'),class_='repos_groups')}</li>
87 </ul>
87 </ul>
88 </%def>
88 </%def>
89
89
90 <%def name="repo_context_bar(current=None)">
90 <%def name="repo_context_bar(current=None)">
91 <%
91 <%
92 def follow_class():
92 def follow_class():
93 if c.repository_following:
93 if c.repository_following:
94 return h.literal('following')
94 return h.literal('following')
95 else:
95 else:
96 return h.literal('follow')
96 return h.literal('follow')
97 %>
97 %>
98 <%
98 <%
99 def is_current(selected):
99 def is_current(selected):
100 if selected == current:
100 if selected == current:
101 return h.literal('class="current"')
101 return h.literal('class="current"')
102 %>
102 %>
103
103
104 <!--- CONTEXT BAR -->
104 <!--- CONTEXT BAR -->
105 <div id="context-bar" class="box">
105 <div id="context-bar" class="box">
106 <div id="context-top">
106 <div id="context-top">
107 <div id="breadcrumbs">
107 <div id="breadcrumbs">
108 ${h.link_to(_(u'Repositories'),h.url('home'))}
108 ${h.link_to(_(u'Repositories'),h.url('home'))}
109 Β»
109 Β»
110 ${h.repo_link(c.rhodecode_db_repo.groups_and_repo)}
110 ${h.repo_link(c.rhodecode_db_repo.groups_and_repo)}
111 </div>
111 </div>
112 ## TODO: this check feels wrong, it would be better to have a check for permissions
112 ## TODO: this check feels wrong, it would be better to have a check for permissions
113 ## also it feels like a job for the controller
113 ## also it feels like a job for the controller
114 %if c.rhodecode_user.username != 'default':
114 %if c.rhodecode_user.username != 'default':
115 <ul id="context-actions" class="horizontal-list">
115 <ul id="context-actions" class="horizontal-list">
116 <li>
116 <li>
117 <button class="${follow_class()}" onclick="javascript:toggleFollowingRepo(this,${c.rhodecode_db_repo.repo_id},'${str(h.get_token())}');">
117 <button class="${follow_class()}" onclick="javascript:toggleFollowingRepo(this,${c.rhodecode_db_repo.repo_id},'${str(h.get_token())}');">
118 <!--span class="icon show-follow follow"></span>
118 <!--span class="icon show-follow follow"></span>
119 <span class="icon show-following following"></span-->
119 <span class="icon show-following following"></span-->
120 <span class="show-follow">${_('Follow')}</span>
120 <span class="show-follow">${_('Follow')}</span>
121 <span class="show-following">${_('Unfollow')}</span>
121 <span class="show-following">${_('Unfollow')}</span>
122 </button>
122 </button>
123 </li>
123 </li>
124 <li><a href="${h.url('repo_fork_home',repo_name=c.repo_name)}" class="fork">${_('Fork')}</a></li>
124 <li><a href="${h.url('repo_fork_home',repo_name=c.repo_name)}" class="fork">${_('Fork')}</a></li>
125 %if h.is_hg(c.rhodecode_repo):
125 %if h.is_hg(c.rhodecode_repo):
126 <li><a href="${h.url('pullrequest_home',repo_name=c.repo_name)}" class="pull-request">${_('Create Pull Request')}</a></li>
126 <li><a href="${h.url('pullrequest_home',repo_name=c.repo_name)}" class="pull-request">${_('Create Pull Request')}</a></li>
127 %endif
127 %endif
128 </ul>
128 </ul>
129 %endif
129 %endif
130 </div>
130 </div>
131 <div id="context-state">
131 <div id="context-state">
132 <!--button id="revision-changer">
133 <span class="branch-name">graphics/shader-move</span>
134 <span class="revision">@73318:8d3d6ee94072</span>
135 </button-->
136 <ul id="context-pages" class="horizontal-list">
132 <ul id="context-pages" class="horizontal-list">
137 <li ${is_current('summary')}><a href="${h.url('summary_home', repo_name=c.repo_name)}" class="summary">${_('Summary')}</a></li>
133 <li ${is_current('summary')}><a href="${h.url('summary_home', repo_name=c.repo_name)}" class="summary">${_('Summary')}</a></li>
138 <li ${is_current('changelog')}><a href="${h.url('changelog_home', repo_name=c.repo_name)}" class="changelogs">${_('Changelog')}</a></li>
134 <li ${is_current('changelog')}><a href="${h.url('changelog_home', repo_name=c.repo_name)}" class="changelogs">${_('Changelog')}</a></li>
139 <li ${is_current('files')}><a href="${h.url('files_home', repo_name=c.repo_name)}" class="files"></span>${_('Files')}</a></li>
135 <li ${is_current('files')}><a href="${h.url('files_home', repo_name=c.repo_name)}" class="files"></span>${_('Files')}</a></li>
140 <li ${is_current('switch-to')}>
136 <li ${is_current('switch-to')}>
141 <a href="#" id="branch_tag_switcher_2" class="dropdown switch-to"></span>${_('Switch To')}</a>
137 <a href="#" id="branch_tag_switcher_2" class="dropdown switch-to"></span>${_('Switch To')}</a>
142 <ul id="switch_to_list_2" class="switch_to submenu">
138 <ul id="switch_to_list_2" class="switch_to submenu">
143 <li><a href="#">${_('loading...')}</a></li>
139 <li><a href="#">${_('loading...')}</a></li>
144 </ul>
140 </ul>
145 </li>
141 </li>
146 <li ${is_current('options')}>
142 <li ${is_current('options')}>
147 <a href="#" class="dropdown options"></span>Options</a>
143 <a href="#" class="dropdown options"></span>Options</a>
148 <ul>
144 <ul>
149 %if h.HasRepoPermissionAll('repository.admin')(c.repo_name):
145 %if h.HasRepoPermissionAll('repository.admin')(c.repo_name):
150 %if h.HasPermissionAll('hg.admin')('access settings on repository'):
146 %if h.HasPermissionAll('hg.admin')('access settings on repository'):
151 <li>${h.link_to(_('Settings'),h.url('edit_repo',repo_name=c.repo_name),class_='settings')}</li>
147 <li>${h.link_to(_('Settings'),h.url('edit_repo',repo_name=c.repo_name),class_='settings')}</li>
152 %else:
148 %else:
153 <li>${h.link_to(_('Settings'),h.url('repo_settings_home',repo_name=c.repo_name),class_='settings')}</li>
149 <li>${h.link_to(_('Settings'),h.url('repo_settings_home',repo_name=c.repo_name),class_='settings')}</li>
154 %endif
150 %endif
155 %endif
151 %endif
156 %if c.rhodecode_db_repo.fork:
152 %if c.rhodecode_db_repo.fork:
157 <li>${h.link_to(_('Compare fork'),h.url('compare_url',repo_name=c.rhodecode_db_repo.fork.repo_name,org_ref_type='branch',org_ref='default',other_repo=c.repo_name,other_ref_type='branch',other_ref=request.GET.get('branch') or 'default'),class_='compare_request')}</li>
153 <li>${h.link_to(_('Compare fork'),h.url('compare_url',repo_name=c.rhodecode_db_repo.fork.repo_name,org_ref_type='branch',org_ref='default',other_repo=c.repo_name,other_ref_type='branch',other_ref=request.GET.get('branch') or 'default'),class_='compare_request')}</li>
158 %endif
154 %endif
159 <li>${h.link_to(_('Lightweight changelog'),h.url('shortlog_home',repo_name=c.repo_name),class_='shortlog')}</li>
155 <li>${h.link_to(_('Lightweight changelog'),h.url('shortlog_home',repo_name=c.repo_name),class_='shortlog')}</li>
160 <li>${h.link_to(_('Search'),h.url('search_repo',repo_name=c.repo_name),class_='search')}</li>
156 <li>${h.link_to(_('Search'),h.url('search_repo',repo_name=c.repo_name),class_='search')}</li>
161
157
162 %if h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name) and c.rhodecode_db_repo.enable_locking:
158 %if h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name) and c.rhodecode_db_repo.enable_locking:
163 %if c.rhodecode_db_repo.locked[0]:
159 %if c.rhodecode_db_repo.locked[0]:
164 <li>${h.link_to(_('Unlock'), h.url('toggle_locking',repo_name=c.repo_name),class_='locking_del')}</li>
160 <li>${h.link_to(_('Unlock'), h.url('toggle_locking',repo_name=c.repo_name),class_='locking_del')}</li>
165 %else:
161 %else:
166 <li>${h.link_to(_('Lock'), h.url('toggle_locking',repo_name=c.repo_name),class_='locking_add')}</li>
162 <li>${h.link_to(_('Lock'), h.url('toggle_locking',repo_name=c.repo_name),class_='locking_add')}</li>
167 %endif
163 %endif
168 %endif
164 %endif
169 </ul>
165 </ul>
170 </li>
166 </li>
171 <li ${is_current('showpullrequest')}>
167 <li ${is_current('showpullrequest')}>
172 <a href="${h.url('pullrequest_show_all',repo_name=c.repo_name)}" title="${_('Show Pull Requests')}" class="pull-request">Pull Requests
168 <a href="${h.url('pullrequest_show_all',repo_name=c.repo_name)}" title="${_('Show Pull Requests')}" class="pull-request">Pull Requests
173 %if c.repository_pull_requests:
169 %if c.repository_pull_requests:
174 <span>${c.repository_pull_requests}</span>
170 <span>${c.repository_pull_requests}</span>
175 %endif
171 %endif
176 </a>
172 </a>
177 </li>
173 </li>
178 </ul>
174 </ul>
179 </div>
175 </div>
180 </div>
176 </div>
181 <script type="text/javascript">
177 <script type="text/javascript">
182 YUE.on('branch_tag_switcher_2','mouseover',function(){
178 YUE.on('branch_tag_switcher_2','mouseover',function(){
183 var loaded = YUD.hasClass('branch_tag_switcher_2','loaded');
179 var loaded = YUD.hasClass('branch_tag_switcher_2','loaded');
184 if(!loaded){
180 if(!loaded){
185 YUD.addClass('branch_tag_switcher_2','loaded');
181 YUD.addClass('branch_tag_switcher_2','loaded');
186 ypjax("${h.url('branch_tag_switcher',repo_name=c.repo_name)}",'switch_to_list_2',
182 ypjax("${h.url('branch_tag_switcher',repo_name=c.repo_name)}",'switch_to_list_2',
187 function(o){},
183 function(o){},
188 function(o){YUD.removeClass('branch_tag_switcher_2','loaded');}
184 function(o){YUD.removeClass('branch_tag_switcher_2','loaded');}
189 ,null);
185 ,null);
190 }
186 }
191 return false;
187 return false;
192 });
188 });
193 </script>
189 </script>
194 <!--- END CONTEXT BAR -->
190 <!--- END CONTEXT BAR -->
195 </%def>
191 </%def>
196
192
197 <%def name="usermenu()">
193 <%def name="usermenu()">
198 ## USER MENU
194 ## USER MENU
199 <li>
195 <li>
200 <a class="menu_link childs" id="quick_login_link">
196 <a class="menu_link childs" id="quick_login_link">
201 <span class="icon">
197 <span class="icon">
202 <img src="${h.gravatar_url(c.rhodecode_user.email,20)}" alt="avatar">
198 <img src="${h.gravatar_url(c.rhodecode_user.email,20)}" alt="avatar">
203 </span>
199 </span>
204 %if c.rhodecode_user.username != 'default':
200 %if c.rhodecode_user.username != 'default':
205 <span class="menu_link_user">${c.rhodecode_user.username}</span>
201 <span class="menu_link_user">${c.rhodecode_user.username}</span>
206 %if c.unread_notifications != 0:
202 %if c.unread_notifications != 0:
207 <span class="menu_link_notifications">${c.unread_notifications}</span>
203 <span class="menu_link_notifications">${c.unread_notifications}</span>
208 %endif
204 %endif
209 %else:
205 %else:
210 <span>${_('Not logged in')}</span>
206 <span>${_('Not logged in')}</span>
211 %endif
207 %endif
212 </a>
208 </a>
213
209
214 <div class="user-menu">
210 <div class="user-menu">
215 <div id="quick_login">
211 <div id="quick_login">
216 %if c.rhodecode_user.username == 'default':
212 %if c.rhodecode_user.username == 'default':
217 <h4>${_('Login to your account')}</h4>
213 <h4>${_('Login to your account')}</h4>
218 ${h.form(h.url('login_home',came_from=h.url.current()))}
214 ${h.form(h.url('login_home',came_from=h.url.current()))}
219 <div class="form">
215 <div class="form">
220 <div class="fields">
216 <div class="fields">
221 <div class="field">
217 <div class="field">
222 <div class="label">
218 <div class="label">
223 <label for="username">${_('Username')}:</label>
219 <label for="username">${_('Username')}:</label>
224 </div>
220 </div>
225 <div class="input">
221 <div class="input">
226 ${h.text('username',class_='focus')}
222 ${h.text('username',class_='focus')}
227 </div>
223 </div>
228
224
229 </div>
225 </div>
230 <div class="field">
226 <div class="field">
231 <div class="label">
227 <div class="label">
232 <label for="password">${_('Password')}:</label>
228 <label for="password">${_('Password')}:</label>
233 </div>
229 </div>
234 <div class="input">
230 <div class="input">
235 ${h.password('password',class_='focus')}
231 ${h.password('password',class_='focus')}
236 </div>
232 </div>
237
233
238 </div>
234 </div>
239 <div class="buttons">
235 <div class="buttons">
240 <div class="password_forgoten">${h.link_to(_('Forgot password ?'),h.url('reset_password'))}</div>
236 <div class="password_forgoten">${h.link_to(_('Forgot password ?'),h.url('reset_password'))}</div>
241 <div class="register">
237 <div class="register">
242 %if h.HasPermissionAny('hg.admin', 'hg.register.auto_activate', 'hg.register.manual_activate')():
238 %if h.HasPermissionAny('hg.admin', 'hg.register.auto_activate', 'hg.register.manual_activate')():
243 ${h.link_to(_("Don't have an account ?"),h.url('register'))}
239 ${h.link_to(_("Don't have an account ?"),h.url('register'))}
244 %endif
240 %endif
245 </div>
241 </div>
246 <div class="submit">
242 <div class="submit">
247 ${h.submit('sign_in',_('Log In'),class_="ui-btn xsmall")}
243 ${h.submit('sign_in',_('Log In'),class_="ui-btn xsmall")}
248 </div>
244 </div>
249 </div>
245 </div>
250 </div>
246 </div>
251 </div>
247 </div>
252 ${h.end_form()}
248 ${h.end_form()}
253 %else:
249 %else:
254 <div class="links_left">
250 <div class="links_left">
255 <div class="full_name">${c.rhodecode_user.full_name_or_username}</div>
251 <div class="full_name">${c.rhodecode_user.full_name_or_username}</div>
256 <div class="email">${c.rhodecode_user.email}</div>
252 <div class="email">${c.rhodecode_user.email}</div>
257 <div class="big_gravatar"><img alt="gravatar" src="${h.gravatar_url(c.rhodecode_user.email,48)}" /></div>
253 <div class="big_gravatar"><img alt="gravatar" src="${h.gravatar_url(c.rhodecode_user.email,48)}" /></div>
258 ##<div class="notifications"><a href="${h.url('notifications')}">${_('Notifications')}</a></div>
254 ##<div class="notifications"><a href="${h.url('notifications')}">${_('Notifications')}</a></div>
259 <div class="unread"><a href="${h.url('notifications')}">${_('Unread notifications')}: ${c.unread_notifications}</a></div>
255 <div class="unread"><a href="${h.url('notifications')}">${_('Unread notifications')}: ${c.unread_notifications}</a></div>
260 </div>
256 </div>
261 <div class="links_right">
257 <div class="links_right">
262 <ol class="links">
258 <ol class="links">
263 ##<li>${h.link_to(_(u'Home'),h.url('home'))}</li>
259 ##<li>${h.link_to(_(u'Home'),h.url('home'))}</li>
264 <li>${h.link_to(_(u'Journal'),h.url('journal'))}</li>
260 <li>${h.link_to(_(u'Journal'),h.url('journal'))}</li>
265 <li>${h.link_to(_(u'My account'),h.url('admin_settings_my_account'))}</li>
261 <li>${h.link_to(_(u'My account'),h.url('admin_settings_my_account'))}</li>
266 <li class="logout">${h.link_to(_(u'Log Out'),h.url('logout_home'))}</li>
262 <li class="logout">${h.link_to(_(u'Log Out'),h.url('logout_home'))}</li>
267 </ol>
263 </ol>
268 </div>
264 </div>
269 %endif
265 %endif
270 </div>
266 </div>
271 </div>
267 </div>
272
268
273 </li>
269 </li>
274 </%def>
270 </%def>
275
271
276 <%def name="menu(current=None)">
272 <%def name="menu(current=None)">
277 <%
273 <%
278 def is_current(selected):
274 def is_current(selected):
279 if selected == current:
275 if selected == current:
280 return h.literal('class="current"')
276 return h.literal('class="current"')
281 %>
277 %>
282 <ul id="quick" class="horizontal-list">
278 <ul id="quick" class="horizontal-list">
283 <!-- repo switcher -->
279 <!-- repo switcher -->
284 <li ${is_current('home')}>
280 <li ${is_current('home')}>
285 <a class="menu_link repo_switcher childs" id="repo_switcher" title="${_('Switch repository')}" href="${h.url('home')}">
281 <a class="menu_link repo_switcher childs" id="repo_switcher" title="${_('Switch repository')}" href="${h.url('home')}">
286 ${_('Repositories')}
282 ${_('Repositories')}
287 </a>
283 </a>
288 <ul id="repo_switcher_list" class="repo_switcher">
284 <ul id="repo_switcher_list" class="repo_switcher">
289 <li>
285 <li>
290 <a href="#">${_('loading...')}</a>
286 <a href="#">${_('loading...')}</a>
291 </li>
287 </li>
292 </ul>
288 </ul>
293 </li>
289 </li>
294 ##ROOT MENU
290 ##ROOT MENU
295 %if c.rhodecode_user.username != 'default':
291 %if c.rhodecode_user.username != 'default':
296 <li ${is_current('journal')}>
292 <li ${is_current('journal')}>
297 <a class="menu_link journal" title="${_('Show recent activity')}" href="${h.url('journal')}">
293 <a class="menu_link journal" title="${_('Show recent activity')}" href="${h.url('journal')}">
298 ${_('Journal')}
294 ${_('Journal')}
299 </a>
295 </a>
300 </li>
296 </li>
301 %else:
297 %else:
302 <li ${is_current('journal')}>
298 <li ${is_current('journal')}>
303 <a class="menu_link journal" title="${_('Public journal')}" href="${h.url('public_journal')}">
299 <a class="menu_link journal" title="${_('Public journal')}" href="${h.url('public_journal')}">
304 ${_('Public journal')}
300 ${_('Public journal')}
305 </a>
301 </a>
306 </li>
302 </li>
307 %endif
303 %endif
308 <li ${is_current('search')}>
304 <li ${is_current('search')}>
309 <a class="menu_link search" title="${_('Search in repositories')}" href="${h.url('search')}">
305 <a class="menu_link search" title="${_('Search in repositories')}" href="${h.url('search')}">
310 ${_('Search')}
306 ${_('Search')}
311 </a>
307 </a>
312 </li>
308 </li>
313 % if h.HasPermissionAll('hg.admin')('access admin main page'):
309 % if h.HasPermissionAll('hg.admin')('access admin main page'):
314 <li ${is_current('admin')}>
310 <li ${is_current('admin')}>
315 <a class="menu_link admin childs" title="${_('Admin')}" href="${h.url('admin_home')}">
311 <a class="menu_link admin childs" title="${_('Admin')}" href="${h.url('admin_home')}">
316 ${_('Admin')}
312 ${_('Admin')}
317 </a>
313 </a>
318 ${admin_menu()}
314 ${admin_menu()}
319 </li>
315 </li>
320 % elif c.rhodecode_user.groups_admin:
316 % elif c.rhodecode_user.groups_admin:
321 <li ${is_current('admin')}>
317 <li ${is_current('admin')}>
322 <a class="menu_link admin childs" title="${_('Admin')}" href="${h.url('admin_home')}">
318 <a class="menu_link admin childs" title="${_('Admin')}" href="${h.url('admin_home')}">
323 ${_('Admin')}
319 ${_('Admin')}
324 </a>
320 </a>
325 ${admin_menu_simple()}
321 ${admin_menu_simple()}
326 </li>
322 </li>
327 % endif
323 % endif
328 ${usermenu()}
324 ${usermenu()}
329 <script type="text/javascript">
325 <script type="text/javascript">
330 YUE.on('repo_switcher','mouseover',function(){
326 YUE.on('repo_switcher','mouseover',function(){
331 var target = 'q_filter_rs';
327 var target = 'q_filter_rs';
332 var qfilter_activate = function(){
328 var qfilter_activate = function(){
333 var nodes = YUQ('ul#repo_switcher_list li a.repo_name');
329 var nodes = YUQ('ul#repo_switcher_list li a.repo_name');
334 var func = function(node){
330 var func = function(node){
335 return node.parentNode;
331 return node.parentNode;
336 }
332 }
337 q_filter(target,nodes,func);
333 q_filter(target,nodes,func);
338 }
334 }
339
335
340 var loaded = YUD.hasClass('repo_switcher','loaded');
336 var loaded = YUD.hasClass('repo_switcher','loaded');
341 if(!loaded){
337 if(!loaded){
342 YUD.addClass('repo_switcher','loaded');
338 YUD.addClass('repo_switcher','loaded');
343 ypjax("${h.url('repo_switcher')}",'repo_switcher_list',
339 ypjax("${h.url('repo_switcher')}",'repo_switcher_list',
344 function(o){qfilter_activate();YUD.get(target).focus()},
340 function(o){qfilter_activate();YUD.get(target).focus()},
345 function(o){YUD.removeClass('repo_switcher','loaded');}
341 function(o){YUD.removeClass('repo_switcher','loaded');}
346 ,null);
342 ,null);
347 }else{
343 }else{
348 YUD.get(target).focus();
344 YUD.get(target).focus();
349 }
345 }
350 return false;
346 return false;
351 });
347 });
352
348
353 YUE.on('header-dd', 'click',function(e){
349 YUE.on('header-dd', 'click',function(e){
354 YUD.addClass('header-inner', 'hover');
350 YUD.addClass('header-inner', 'hover');
355 YUD.addClass('content', 'hover');
351 YUD.addClass('content', 'hover');
356 });
352 });
357
353
358 </script>
354 </script>
359 </%def>
355 </%def>
@@ -1,116 +1,115 b''
1 ## -*- coding: utf-8 -*-
1 ## -*- coding: utf-8 -*-
2 <!DOCTYPE html>
2 <!DOCTYPE html>
3 <html xmlns="http://www.w3.org/1999/xhtml">
3 <html xmlns="http://www.w3.org/1999/xhtml">
4 <head>
4 <head>
5 <title>${self.title()}</title>
5 <title>${self.title()}</title>
6 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
6 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
7 <meta name="robots" content="index, nofollow"/>
7 <meta name="robots" content="index, nofollow"/>
8 <link rel="icon" href="${h.url('/images/icons/database_gear.png')}" type="image/png" />
8 <link rel="icon" href="${h.url('/images/icons/database_gear.png')}" type="image/png" />
9
9
10 ## CSS ###
10 ## CSS ###
11 <%def name="css()">
11 <%def name="css()">
12 <link rel="stylesheet" type="text/css" href="${h.url('/css/style.css', ver=c.rhodecode_version)}" media="screen"/>
12 <link rel="stylesheet" type="text/css" href="${h.url('/css/style.css', ver=c.rhodecode_version)}" media="screen"/>
13 <link rel="stylesheet" type="text/css" href="${h.url('/css/pygments.css', ver=c.rhodecode_version)}"/>
13 <link rel="stylesheet" type="text/css" href="${h.url('/css/pygments.css', ver=c.rhodecode_version)}"/>
14
15 <link rel="stylesheet" type="text/css" href="${h.url('/css/contextbar.css', ver=c.rhodecode_version)}"/>
14 <link rel="stylesheet" type="text/css" href="${h.url('/css/contextbar.css', ver=c.rhodecode_version)}"/>
16 ## EXTRA FOR CSS
15 ## EXTRA FOR CSS
17 ${self.css_extra()}
16 ${self.css_extra()}
18 </%def>
17 </%def>
19 <%def name="css_extra()">
18 <%def name="css_extra()">
20 </%def>
19 </%def>
21
20
22 ${self.css()}
21 ${self.css()}
23
22
24 %if c.ga_code:
23 %if c.ga_code:
25 <!-- Analytics -->
24 <!-- Analytics -->
26 <script type="text/javascript">
25 <script type="text/javascript">
27 var _gaq = _gaq || [];
26 var _gaq = _gaq || [];
28 _gaq.push(['_setAccount', '${c.ga_code}']);
27 _gaq.push(['_setAccount', '${c.ga_code}']);
29 _gaq.push(['_trackPageview']);
28 _gaq.push(['_trackPageview']);
30
29
31 (function() {
30 (function() {
32 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
31 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
33 ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
32 ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
34 var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
33 var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
35 })();
34 })();
36 </script>
35 </script>
37 %endif
36 %endif
38
37
39 ## JAVASCRIPT ##
38 ## JAVASCRIPT ##
40 <%def name="js()">
39 <%def name="js()">
41 <script type="text/javascript">
40 <script type="text/javascript">
42 //JS translations map
41 //JS translations map
43 var TRANSLATION_MAP = {
42 var TRANSLATION_MAP = {
44 'Add another comment':'${_("Add another comment")}',
43 'Add another comment':'${_("Add another comment")}',
45 'Stop following this repository':"${_('Stop following this repository')}",
44 'Stop following this repository':"${_('Stop following this repository')}",
46 'Start following this repository':"${_('Start following this repository')}",
45 'Start following this repository':"${_('Start following this repository')}",
47 'Group':"${_('Group')}",
46 'Group':"${_('Group')}",
48 'members':"${_('members')}",
47 'members':"${_('members')}",
49 'Loading ...':"${_('Loading ...')}",
48 'Loading ...':"${_('Loading ...')}",
50 'Search truncated': "${_('Search truncated')}",
49 'Search truncated': "${_('Search truncated')}",
51 'No matching files': "${_('No matching files')}",
50 'No matching files': "${_('No matching files')}",
52 'Open new pull request': "${_('Open new pull request')}",
51 'Open new pull request': "${_('Open new pull request')}",
53 'Open new pull request for selected changesets': "${_('Open new pull request for selected changesets')}",
52 'Open new pull request for selected changesets': "${_('Open new pull request for selected changesets')}",
54 'Show selected changes __S -> __E': "${_('Show selected changes __S -> __E')}",
53 'Show selected changes __S -> __E': "${_('Show selected changes __S -> __E')}",
55 'Show selected change __S': "${_('Show selected change __S')}",
54 'Show selected change __S': "${_('Show selected change __S')}",
56 'Selection link': "${_('Selection link')}",
55 'Selection link': "${_('Selection link')}",
57 'Collapse diff': "${_('Collapse diff')}",
56 'Collapse diff': "${_('Collapse diff')}",
58 'Expand diff': "${_('Expand diff')}"
57 'Expand diff': "${_('Expand diff')}"
59 };
58 };
60 var _TM = TRANSLATION_MAP;
59 var _TM = TRANSLATION_MAP;
61
60
62 var TOGGLE_FOLLOW_URL = "${h.url('toggle_following')}";
61 var TOGGLE_FOLLOW_URL = "${h.url('toggle_following')}";
63
62
64 </script>
63 </script>
65 <script type="text/javascript" src="${h.url('/js/yui.2.9.js', ver=c.rhodecode_version)}"></script>
64 <script type="text/javascript" src="${h.url('/js/yui.2.9.js', ver=c.rhodecode_version)}"></script>
66 <!--[if lt IE 9]>
65 <!--[if lt IE 9]>
67 <script language="javascript" type="text/javascript" src="${h.url('/js/excanvas.min.js')}"></script>
66 <script language="javascript" type="text/javascript" src="${h.url('/js/excanvas.min.js')}"></script>
68 <![endif]-->
67 <![endif]-->
69 <script type="text/javascript" src="${h.url('/js/yui.flot.js', ver=c.rhodecode_version)}"></script>
68 <script type="text/javascript" src="${h.url('/js/yui.flot.js', ver=c.rhodecode_version)}"></script>
70 <script type="text/javascript" src="${h.url('/js/native.history.js', ver=c.rhodecode_version)}"></script>
69 <script type="text/javascript" src="${h.url('/js/native.history.js', ver=c.rhodecode_version)}"></script>
71 <script type="text/javascript" src="${h.url('/js/pyroutes_map.js', ver=c.rhodecode_version)}"></script>
70 <script type="text/javascript" src="${h.url('/js/pyroutes_map.js', ver=c.rhodecode_version)}"></script>
72 <script type="text/javascript" src="${h.url('/js/rhodecode.js', ver=c.rhodecode_version)}"></script>
71 <script type="text/javascript" src="${h.url('/js/rhodecode.js', ver=c.rhodecode_version)}"></script>
73 ## EXTRA FOR JS
72 ## EXTRA FOR JS
74 ${self.js_extra()}
73 ${self.js_extra()}
75 <script type="text/javascript">
74 <script type="text/javascript">
76 (function(window,undefined){
75 (function(window,undefined){
77 // Prepare
76 // Prepare
78 var History = window.History; // Note: We are using a capital H instead of a lower h
77 var History = window.History; // Note: We are using a capital H instead of a lower h
79 if ( !History.enabled ) {
78 if ( !History.enabled ) {
80 // History.js is disabled for this browser.
79 // History.js is disabled for this browser.
81 // This is because we can optionally choose to support HTML4 browsers or not.
80 // This is because we can optionally choose to support HTML4 browsers or not.
82 return false;
81 return false;
83 }
82 }
84 })(window);
83 })(window);
85
84
86 YUE.onDOMReady(function(){
85 YUE.onDOMReady(function(){
87 tooltip_activate();
86 tooltip_activate();
88 show_more_event();
87 show_more_event();
89 show_changeset_tooltip();
88 show_changeset_tooltip();
90 // routes registration
89 // routes registration
91 pyroutes.register('toggle_following', "${h.url('toggle_following')}");
90 pyroutes.register('toggle_following', "${h.url('toggle_following')}");
92 pyroutes.register('changeset_info', "${h.url('changeset_info', repo_name='%(repo_name)s', revision='%(revision)s')}", ['repo_name', 'revision']);
91 pyroutes.register('changeset_info', "${h.url('changeset_info', repo_name='%(repo_name)s', revision='%(revision)s')}", ['repo_name', 'revision']);
93 pyroutes.register('repo_size', "${h.url('repo_size', repo_name='%(repo_name)s')}", ['repo_name']);
92 pyroutes.register('repo_size', "${h.url('repo_size', repo_name='%(repo_name)s')}", ['repo_name']);
94 })
93 })
95 </script>
94 </script>
96 </%def>
95 </%def>
97 <%def name="js_extra()"></%def>
96 <%def name="js_extra()"></%def>
98 ${self.js()}
97 ${self.js()}
99 <%def name="head_extra()"></%def>
98 <%def name="head_extra()"></%def>
100 ${self.head_extra()}
99 ${self.head_extra()}
101 </head>
100 </head>
102 <body id="body">
101 <body id="body">
103 ## IE hacks
102 ## IE hacks
104 <!--[if IE 7]>
103 <!--[if IE 7]>
105 <script>YUD.addClass(document.body,'ie7')</script>
104 <script>YUD.addClass(document.body,'ie7')</script>
106 <![endif]-->
105 <![endif]-->
107 <!--[if IE 8]>
106 <!--[if IE 8]>
108 <script>YUD.addClass(document.body,'ie8')</script>
107 <script>YUD.addClass(document.body,'ie8')</script>
109 <![endif]-->
108 <![endif]-->
110 <!--[if IE 9]>
109 <!--[if IE 9]>
111 <script>YUD.addClass(document.body,'ie9')</script>
110 <script>YUD.addClass(document.body,'ie9')</script>
112 <![endif]-->
111 <![endif]-->
113
112
114 ${next.body()}
113 ${next.body()}
115 </body>
114 </body>
116 </html>
115 </html>
@@ -1,266 +1,263 b''
1 ## -*- coding: utf-8 -*-
1 ## -*- coding: utf-8 -*-
2
2
3 <%inherit file="/base/base.html"/>
3 <%inherit file="/base/base.html"/>
4
4
5 <%def name="title()">
5 <%def name="title()">
6 ${_('%s Changelog') % c.repo_name} - ${c.rhodecode_name}
6 ${_('%s Changelog') % c.repo_name} - ${c.rhodecode_name}
7 </%def>
7 </%def>
8
8
9 <%def name="breadcrumbs_links()">
9 <%def name="breadcrumbs_links()">
10 <% size = c.size if c.size <= c.total_cs else c.total_cs %>
10 <% size = c.size if c.size <= c.total_cs else c.total_cs %>
11 ${_('Changelog')} - ${ungettext('showing %d out of %d revision', 'showing %d out of %d revisions', size) % (size, c.total_cs)}
11 ${_('Changelog')} - ${ungettext('showing %d out of %d revision', 'showing %d out of %d revisions', size) % (size, c.total_cs)}
12 </%def>
12 </%def>
13
13
14 <%def name="page_nav()">
14 <%def name="page_nav()">
15 ${self.menu('changelog')}
15 ${self.menu('changelog')}
16 </%def>
16 </%def>
17
17
18 <%def name="main()">
18 <%def name="main()">
19 ${self.context_bar('changelog')}
19 ${self.context_bar('changelog')}
20 <div class="box">
20 <div class="box">
21 <!-- box / title -->
21 <!-- box / title -->
22 <div class="title">
22 <div class="title">
23 ${self.breadcrumbs()}
23 ${self.breadcrumbs()}
24 </div>
24 </div>
25 <div class="table">
25 <div class="table">
26 % if c.pagination:
26 % if c.pagination:
27 <div id="graph">
27 <div id="graph">
28 <div class="info_box" style="clear: both;padding: 10px 6px;min-height: 12px;text-align: right;">
28 <div class="info_box" style="clear: both;padding: 10px 6px;min-height: 12px;text-align: right;">
29 <a href="#" class="ui-btn small" id="rev_range_container" style="display:none"></a>
29 <a href="#" class="ui-btn small" id="rev_range_container" style="display:none"></a>
30 <a href="#" class="ui-btn small" id="rev_range_clear" style="display:none">${_('Clear selection')}</a>
30 <a href="#" class="ui-btn small" id="rev_range_clear" style="display:none">${_('Clear selection')}</a>
31
31
32 %if c.rhodecode_db_repo.fork:
32 %if c.rhodecode_db_repo.fork:
33 <a id="compare_fork" title="${_('Compare fork with %s' % c.rhodecode_db_repo.fork.repo_name)}" href="${h.url('compare_url',repo_name=c.rhodecode_db_repo.fork.repo_name,org_ref_type='branch',org_ref='default',other_repo=c.repo_name,other_ref_type='branch',other_ref=request.GET.get('branch') or 'default',merge=1)}" class="ui-btn small">${_('Compare fork with parent')}</a>
33 <a id="compare_fork" title="${_('Compare fork with %s' % c.rhodecode_db_repo.fork.repo_name)}" href="${h.url('compare_url',repo_name=c.rhodecode_db_repo.fork.repo_name,org_ref_type='branch',org_ref='default',other_repo=c.repo_name,other_ref_type='branch',other_ref=request.GET.get('branch') or 'default',merge=1)}" class="ui-btn small">${_('Compare fork with parent')}</a>
34 %endif
34 %endif
35 %if h.is_hg(c.rhodecode_repo):
35 %if h.is_hg(c.rhodecode_repo):
36 <a id="open_new_pr" href="${h.url('pullrequest_home',repo_name=c.repo_name)}" class="ui-btn small">${_('Open new pull request')}</a>
36 <a id="open_new_pr" href="${h.url('pullrequest_home',repo_name=c.repo_name)}" class="ui-btn small">${_('Open new pull request')}</a>
37 %endif
37 %endif
38 </div>
38 </div>
39 <div class="container_header">
39 <div class="container_header">
40 ${h.form(h.url.current(),method='get')}
40 ${h.form(h.url.current(),method='get')}
41 <div style="float:left">
41 <div style="float:left">
42 ${h.submit('set',_('Show'),class_="ui-btn")}
42 ${h.submit('set',_('Show'),class_="ui-btn")}
43 ${h.text('size',size=1,value=c.size)}
43 ${h.text('size',size=1,value=c.size)}
44 ${_('revisions')}
44 ${_('revisions')}
45 </div>
45 </div>
46 ${h.end_form()}
46 ${h.end_form()}
47 <div style="float:right">${h.select('branch_filter',c.branch_name,c.branch_filters)}</div>
47 <div style="float:right">${h.select('branch_filter',c.branch_name,c.branch_filters)}</div>
48 </div>
48 </div>
49 <div id="graph_nodes">
49 <div id="graph_nodes">
50 <canvas id="graph_canvas"></canvas>
50 <canvas id="graph_canvas"></canvas>
51 </div>
51 </div>
52 <div id="graph_content">
52 <div id="graph_content">
53
53
54 <table id="changesets">
54 <table id="changesets">
55 <tbody>
55 <tbody>
56 %for cnt,cs in enumerate(c.pagination):
56 %for cnt,cs in enumerate(c.pagination):
57 <tr id="chg_${cnt+1}" class="container ${'tablerow%s' % (cnt%2)}">
57 <tr id="chg_${cnt+1}" class="container ${'tablerow%s' % (cnt%2)}">
58 <td class="checkbox">
58 <td class="checkbox">
59 ${h.checkbox(cs.raw_id,class_="changeset_range")}
59 ${h.checkbox(cs.raw_id,class_="changeset_range")}
60 </td>
60 </td>
61 <td class="author">
61 <td class="author">
62 <img alt="gravatar" src="${h.gravatar_url(h.email_or_none(cs.author),16)}"/>
62 <img alt="gravatar" src="${h.gravatar_url(h.email_or_none(cs.author),16)}"/>
63 <span title="${cs.author}" class="user">${h.shorter(h.person(cs.author),22)}</span>
63 <span title="${cs.author}" class="user">${h.shorter(h.person(cs.author),22)}</span>
64 </td>
64 </td>
65 <td class="hash">
65 <td class="hash">
66 <a href="${h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id)}">
66 <a href="${h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id)}">
67 <span class="changeset_id">${cs.revision}:</span>
67 <span class="changeset_id">${cs.revision}:</span>
68 <span class="changeset_hash">${h.short_id(cs.raw_id)}</span>
68 <span class="changeset_hash">${h.short_id(cs.raw_id)}</span>
69 </a>
69 </a>
70 </td>
70 </td>
71 <td class="date">
71 <td class="date">
72 <div class="date">${h.age(cs.date,True)}</div>
72 <div class="date">${h.age(cs.date,True)}</div>
73 </td>
73 </td>
74 <td class="mid">
74 <td class="mid">
75 <div class="log-container">
75 <div class="log-container">
76 <div class="message">${h.urlify_commit(cs.message, c.repo_name,h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}</div>
76 <div class="message">${h.urlify_commit(cs.message, c.repo_name,h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}</div>
77 <div class="expand"><span class="expandtext">&darr; ${_('Show more')} &darr;</span></div>
77 <div class="expand"><span class="expandtext">&darr; ${_('Show more')} &darr;</span></div>
78 <div class="extra-container">
78 <div class="extra-container">
79 %if c.comments.get(cs.raw_id,[]):
79 %if c.comments.get(cs.raw_id,[]):
80 <div class="comments-container">
80 <div class="comments-container">
81 <div class="comments-cnt" title="${('comments')}">
81 <div class="comments-cnt" title="${('comments')}">
82 <a href="${h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id,anchor='comment-%s' % c.comments[cs.raw_id][0].comment_id)}">
82 <a href="${h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id,anchor='comment-%s' % c.comments[cs.raw_id][0].comment_id)}">
83 ${len(c.comments[cs.raw_id])}
83 ${len(c.comments[cs.raw_id])}
84 </a>
84 </a>
85 </div>
85 </div>
86 </div>
86 </div>
87 %endif
87 %endif
88 %if h.is_hg(c.rhodecode_repo):
88 %if h.is_hg(c.rhodecode_repo):
89 %for book in cs.bookmarks:
89 %for book in cs.bookmarks:
90 <div class="bookbook" title="${'%s %s' % (_('bookmark'),book)}">
90 <div class="bookbook" title="${'%s %s' % (_('bookmark'),book)}">
91 ${h.link_to(h.shorter(book),h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))}
91 ${h.link_to(h.shorter(book),h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))}
92 </div>
92 </div>
93 %endfor
93 %endfor
94 %endif
94 %endif
95 %for tag in cs.tags:
95 %for tag in cs.tags:
96 <div class="tagtag" title="${'%s %s' % (_('tag'),tag)}">
96 <div class="tagtag" title="${'%s %s' % (_('tag'),tag)}">
97 ${h.link_to(h.shorter(tag),h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))}
97 ${h.link_to(h.shorter(tag),h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))}
98 </div>
98 </div>
99 %endfor
99 %endfor
100 %if (not c.branch_name) and cs.branch:
100 %if (not c.branch_name) and cs.branch:
101 <div class="branchtag" title="${'%s %s' % (_('branch'),cs.branch)}">
101 <div class="branchtag" title="${'%s %s' % (_('branch'),cs.branch)}">
102 ${h.link_to(h.shorter(cs.branch),h.url('changelog_home',repo_name=c.repo_name,branch=cs.branch))}
102 ${h.link_to(h.shorter(cs.branch),h.url('changelog_home',repo_name=c.repo_name,branch=cs.branch))}
103 </div>
103 </div>
104 %endif
104 %endif
105 </div>
105 </div>
106 </div>
106 </div>
107 </td>
107 </td>
108 </tr>
108 </tr>
109 %endfor
109 %endfor
110 </tbody>
110 </tbody>
111 </table>
111 </table>
112
112
113
114 <div class="pagination-wh pagination-left">
113 <div class="pagination-wh pagination-left">
115 ${c.pagination.pager('$link_previous ~2~ $link_next')}
114 ${c.pagination.pager('$link_previous ~2~ $link_next')}
116 </div>
115 </div>
117 </div>
116 </div>
118 </div>
117 </div>
119
118
120 <script type="text/javascript" src="${h.url('/js/graph.js')}"></script>
119 <script type="text/javascript" src="${h.url('/js/graph.js')}"></script>
121 <script type="text/javascript">
120 <script type="text/javascript">
122 YAHOO.util.Event.onDOMReady(function(){
121 YAHOO.util.Event.onDOMReady(function(){
123
122
124 //Monitor range checkboxes and build a link to changesets
123 //Monitor range checkboxes and build a link to changesets
125 //ranges
124 //ranges
126 var checkboxes = YUD.getElementsByClassName('changeset_range');
125 var checkboxes = YUD.getElementsByClassName('changeset_range');
127 var url_tmpl = "${h.url('changeset_home',repo_name=c.repo_name,revision='__REVRANGE__')}";
126 var url_tmpl = "${h.url('changeset_home',repo_name=c.repo_name,revision='__REVRANGE__')}";
128 var pr_tmpl = "${h.url('pullrequest_home',repo_name=c.repo_name)}";
127 var pr_tmpl = "${h.url('pullrequest_home',repo_name=c.repo_name)}";
129
128
130 var checkbox_checker = function(e){
129 var checkbox_checker = function(e){
131 var checked_checkboxes = [];
130 var checked_checkboxes = [];
132 for (pos in checkboxes){
131 for (pos in checkboxes){
133 if(checkboxes[pos].checked){
132 if(checkboxes[pos].checked){
134 checked_checkboxes.push(checkboxes[pos]);
133 checked_checkboxes.push(checkboxes[pos]);
135 }
134 }
136 }
135 }
137 if(YUD.get('open_new_pr')){
136 if(YUD.get('open_new_pr')){
138 if(checked_checkboxes.length>1){
137 if(checked_checkboxes.length>1){
139 YUD.setStyle('open_new_pr','display','none');
138 YUD.setStyle('open_new_pr','display','none');
140 } else {
139 } else {
141 YUD.setStyle('open_new_pr','display','');
140 YUD.setStyle('open_new_pr','display','');
142 if(checked_checkboxes.length>0){
141 if(checked_checkboxes.length>0){
143 YUD.get('open_new_pr').innerHTML = _TM['Open new pull request for selected changesets'];
142 YUD.get('open_new_pr').innerHTML = _TM['Open new pull request for selected changesets'];
144 }else{
143 }else{
145 YUD.get('open_new_pr').innerHTML = _TM['Open new pull request'];
144 YUD.get('open_new_pr').innerHTML = _TM['Open new pull request'];
146 }
145 }
147 }
146 }
148 }
147 }
149
148
150 if(checked_checkboxes.length>0){
149 if(checked_checkboxes.length>0){
151 var rev_end = checked_checkboxes[0].name;
150 var rev_end = checked_checkboxes[0].name;
152 var rev_start = checked_checkboxes[checked_checkboxes.length-1].name;
151 var rev_start = checked_checkboxes[checked_checkboxes.length-1].name;
153 var url = url_tmpl.replace('__REVRANGE__',
152 var url = url_tmpl.replace('__REVRANGE__',
154 rev_start+'...'+rev_end);
153 rev_start+'...'+rev_end);
155
154
156 var link = (rev_start == rev_end)
155 var link = (rev_start == rev_end)
157 ? _TM['Show selected change __S']
156 ? _TM['Show selected change __S']
158 : _TM['Show selected changes __S -> __E'];
157 : _TM['Show selected changes __S -> __E'];
159
158
160 link = link.replace('__S',rev_start.substr(0,6));
159 link = link.replace('__S',rev_start.substr(0,6));
161 link = link.replace('__E',rev_end.substr(0,6));
160 link = link.replace('__E',rev_end.substr(0,6));
162 YUD.get('rev_range_container').href = url;
161 YUD.get('rev_range_container').href = url;
163 YUD.get('rev_range_container').innerHTML = link;
162 YUD.get('rev_range_container').innerHTML = link;
164 YUD.setStyle('rev_range_container','display','');
163 YUD.setStyle('rev_range_container','display','');
165 YUD.setStyle('rev_range_clear','display','');
164 YUD.setStyle('rev_range_clear','display','');
166
165
167 YUD.get('open_new_pr').href = pr_tmpl + '?rev_start={0}&rev_end={1}'.format(rev_start,rev_end);
166 YUD.get('open_new_pr').href = pr_tmpl + '?rev_start={0}&rev_end={1}'.format(rev_start,rev_end);
168 YUD.setStyle('compare_fork','display','none');
167 YUD.setStyle('compare_fork','display','none');
169 } else{
168 }else{
170 YUD.setStyle('rev_range_container','display','none');
169 YUD.setStyle('rev_range_container','display','none');
171 YUD.setStyle('rev_range_clear','display','none');
170 YUD.setStyle('rev_range_clear','display','none');
172 if (checkboxes){
171 if (checkboxes){
173 YUD.get('open_new_pr').href = pr_tmpl + '?rev_end={0}'.format(checkboxes[0].name);
172 YUD.get('open_new_pr').href = pr_tmpl + '?rev_end={0}'.format(checkboxes[0].name);
174 }
173 }
175 YUD.setStyle('compare_fork','display','');
174 YUD.setStyle('compare_fork','display','');
176 }
175 }
177 };
176 };
178 YUE.onDOMReady(checkbox_checker);
177 YUE.onDOMReady(checkbox_checker);
179 YUE.on(checkboxes,'click', checkbox_checker);
178 YUE.on(checkboxes,'click', checkbox_checker);
180
179
181 YUE.on('rev_range_clear','click',function(e){
180 YUE.on('rev_range_clear','click',function(e){
182 for (var i=0; i<checkboxes.length; i++){
181 for (var i=0; i<checkboxes.length; i++){
183 var cb = checkboxes[i];
182 var cb = checkboxes[i];
184 cb.checked = false;
183 cb.checked = false;
185 }
184 }
186 checkbox_checker();
185 checkbox_checker();
187 YUE.preventDefault(e);
186 YUE.preventDefault(e);
188 });
187 });
189
188
190 var msgs = YUQ('.message');
189 var msgs = YUQ('.message');
191 // get first element height
190 // get first element height
192 var el = YUQ('#graph_content .container')[0];
191 var el = YUQ('#graph_content .container')[0];
193 var row_h = el.clientHeight;
192 var row_h = el.clientHeight;
194 for(var i=0;i<msgs.length;i++){
193 for(var i=0;i<msgs.length;i++){
195 var m = msgs[i];
194 var m = msgs[i];
196
195
197 var h = m.clientHeight;
196 var h = m.clientHeight;
198 var pad = YUD.getStyle(m,'padding');
197 var pad = YUD.getStyle(m,'padding');
199 if(h > row_h){
198 if(h > row_h){
200 var offset = row_h - (h+12);
199 var offset = row_h - (h+12);
201 YUD.setStyle(m.nextElementSibling,'display','block');
200 YUD.setStyle(m.nextElementSibling,'display','block');
202 YUD.setStyle(m.nextElementSibling,'margin-top',offset+'px');
201 YUD.setStyle(m.nextElementSibling,'margin-top',offset+'px');
203 };
202 };
204 }
203 }
205 YUE.on(YUQ('.expand'),'click',function(e){
204 YUE.on(YUQ('.expand'),'click',function(e){
206 var elem = e.currentTarget.parentNode.parentNode;
205 var elem = e.currentTarget.parentNode.parentNode;
207 YUD.setStyle(e.currentTarget,'display','none');
206 YUD.setStyle(e.currentTarget,'display','none');
208 YUD.setStyle(elem,'height','auto');
207 YUD.setStyle(elem,'height','auto');
209
208
210 //redraw the graph, line_count and jsdata are global vars
209 //redraw the graph, line_count and jsdata are global vars
211 set_canvas(100);
210 set_canvas(100);
212
211
213 var r = new BranchRenderer();
212 var r = new BranchRenderer();
214 r.render(jsdata,100,line_count);
213 r.render(jsdata,100,line_count);
215
214
216 });
215 });
217
216
218 // change branch filter
217 // change branch filter
219 YUE.on(YUD.get('branch_filter'),'change',function(e){
218 YUE.on(YUD.get('branch_filter'),'change',function(e){
220 var selected_branch = e.currentTarget.options[e.currentTarget.selectedIndex].value;
219 var selected_branch = e.currentTarget.options[e.currentTarget.selectedIndex].value;
221 var url_main = "${h.url('changelog_home',repo_name=c.repo_name)}";
220 var url_main = "${h.url('changelog_home',repo_name=c.repo_name)}";
222 var url = "${h.url('changelog_home',repo_name=c.repo_name,branch='__BRANCH__')}";
221 var url = "${h.url('changelog_home',repo_name=c.repo_name,branch='__BRANCH__')}";
223 var url = url.replace('__BRANCH__',selected_branch);
222 var url = url.replace('__BRANCH__',selected_branch);
224 if(selected_branch != ''){
223 if(selected_branch != ''){
225 window.location = url;
224 window.location = url;
226 }else{
225 }else{
227 window.location = url_main;
226 window.location = url_main;
228 }
227 }
229
228
230 });
229 });
231
230
232 function set_canvas(width) {
231 function set_canvas(width) {
233 var c = document.getElementById('graph_nodes');
232 var c = document.getElementById('graph_nodes');
234 var t = document.getElementById('graph_content');
233 var t = document.getElementById('graph_content');
235 canvas = document.getElementById('graph_canvas');
234 canvas = document.getElementById('graph_canvas');
236 var div_h = t.clientHeight;
235 var div_h = t.clientHeight;
237 //c.style.height=div_h+'px';
238 canvas.setAttribute('height',div_h);
236 canvas.setAttribute('height',div_h);
239 //c.style.height=width+'px';
240 canvas.setAttribute('width',width);
237 canvas.setAttribute('width',width);
241 };
238 };
242 var heads = 1;
239 var heads = 1;
243 var line_count = 0;
240 var line_count = 0;
244 var jsdata = ${c.jsdata|n};
241 var jsdata = ${c.jsdata|n};
245
242
246 for (var i=0;i<jsdata.length;i++) {
243 for (var i=0;i<jsdata.length;i++) {
247 var in_l = jsdata[i][2];
244 var in_l = jsdata[i][2];
248 for (var j in in_l) {
245 for (var j in in_l) {
249 var m = in_l[j][1];
246 var m = in_l[j][1];
250 if (m > line_count)
247 if (m > line_count)
251 line_count = m;
248 line_count = m;
252 }
249 }
253 }
250 }
254 set_canvas(100);
251 set_canvas(100);
255
252
256 var r = new BranchRenderer();
253 var r = new BranchRenderer();
257 r.render(jsdata,100,line_count);
254 r.render(jsdata,100,line_count);
258
255
259 });
256 });
260 </script>
257 </script>
261 %else:
258 %else:
262 ${_('There are no changes yet')}
259 ${_('There are no changes yet')}
263 %endif
260 %endif
264 </div>
261 </div>
265 </div>
262 </div>
266 </%def>
263 </%def>
General Comments 0
You need to be logged in to leave comments. Login now