##// 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 1 """The base Controller API
2 2
3 3 Provides the BaseController class for subclassing.
4 4 """
5 5 import logging
6 6 import time
7 7 import traceback
8 8
9 9 from paste.auth.basic import AuthBasicAuthenticator
10 10 from paste.httpexceptions import HTTPUnauthorized, HTTPForbidden
11 11 from paste.httpheaders import WWW_AUTHENTICATE, AUTHORIZATION
12 12
13 13 from pylons import config, tmpl_context as c, request, session, url
14 14 from pylons.controllers import WSGIController
15 15 from pylons.controllers.util import redirect
16 16 from pylons.templating import render_mako as render
17 17
18 18 from rhodecode import __version__, BACKENDS
19 19
20 20 from rhodecode.lib.utils2 import str2bool, safe_unicode, AttributeDict,\
21 21 safe_str, safe_int
22 22 from rhodecode.lib.auth import AuthUser, get_container_username, authfunc,\
23 23 HasPermissionAnyMiddleware, CookieStoreWrapper
24 24 from rhodecode.lib.utils import get_repo_slug, invalidate_cache
25 25 from rhodecode.model import meta
26 26
27 27 from rhodecode.model.db import Repository, RhodeCodeUi, User, RhodeCodeSetting
28 28 from rhodecode.model.notification import NotificationModel
29 29 from rhodecode.model.scm import ScmModel
30 30 from rhodecode.model.meta import Session
31 31
32 32 log = logging.getLogger(__name__)
33 33
34 34
35 35 def _get_ip_addr(environ):
36 36 proxy_key = 'HTTP_X_REAL_IP'
37 37 proxy_key2 = 'HTTP_X_FORWARDED_FOR'
38 38 def_key = 'REMOTE_ADDR'
39 39
40 40 ip = environ.get(proxy_key)
41 41 if ip:
42 42 return ip
43 43
44 44 ip = environ.get(proxy_key2)
45 45 if ip:
46 46 return ip
47 47
48 48 ip = environ.get(def_key, '0.0.0.0')
49 49
50 50 # HEADERS can have mutliple ips inside
51 51 # the left-most being the original client, and each successive proxy
52 52 # that passed the request adding the IP address where it received the
53 53 # request from.
54 54 if ',' in ip:
55 55 ip = ip.split(',')[0].strip()
56 56
57 57 return ip
58 58
59 59
60 60 def _get_access_path(environ):
61 61 path = environ.get('PATH_INFO')
62 62 org_req = environ.get('pylons.original_request')
63 63 if org_req:
64 64 path = org_req.environ.get('PATH_INFO')
65 65 return path
66 66
67 67
68 68 class BasicAuth(AuthBasicAuthenticator):
69 69
70 70 def __init__(self, realm, authfunc, auth_http_code=None):
71 71 self.realm = realm
72 72 self.authfunc = authfunc
73 73 self._rc_auth_http_code = auth_http_code
74 74
75 75 def build_authentication(self):
76 76 head = WWW_AUTHENTICATE.tuples('Basic realm="%s"' % self.realm)
77 77 if self._rc_auth_http_code and self._rc_auth_http_code == '403':
78 78 # return 403 if alternative http return code is specified in
79 79 # RhodeCode config
80 80 return HTTPForbidden(headers=head)
81 81 return HTTPUnauthorized(headers=head)
82 82
83 83 def authenticate(self, environ):
84 84 authorization = AUTHORIZATION(environ)
85 85 if not authorization:
86 86 return self.build_authentication()
87 87 (authmeth, auth) = authorization.split(' ', 1)
88 88 if 'basic' != authmeth.lower():
89 89 return self.build_authentication()
90 90 auth = auth.strip().decode('base64')
91 91 _parts = auth.split(':', 1)
92 92 if len(_parts) == 2:
93 93 username, password = _parts
94 94 if self.authfunc(environ, username, password):
95 95 return username
96 96 return self.build_authentication()
97 97
98 98 __call__ = authenticate
99 99
100 100
101 101 class BaseVCSController(object):
102 102
103 103 def __init__(self, application, config):
104 104 self.application = application
105 105 self.config = config
106 106 # base path of repo locations
107 107 self.basepath = self.config['base_path']
108 108 #authenticate this mercurial request using authfunc
109 109 self.authenticate = BasicAuth('', authfunc,
110 110 config.get('auth_ret_code'))
111 111 self.ip_addr = '0.0.0.0'
112 112
113 113 def _handle_request(self, environ, start_response):
114 114 raise NotImplementedError()
115 115
116 116 def _get_by_id(self, repo_name):
117 117 """
118 118 Get's a special pattern _<ID> from clone url and tries to replace it
119 119 with a repository_name for support of _<ID> non changable urls
120 120
121 121 :param repo_name:
122 122 """
123 123 try:
124 124 data = repo_name.split('/')
125 125 if len(data) >= 2:
126 126 by_id = data[1].split('_')
127 127 if len(by_id) == 2 and by_id[1].isdigit():
128 128 _repo_name = Repository.get(by_id[1]).repo_name
129 129 data[1] = _repo_name
130 130 except:
131 131 log.debug('Failed to extract repo_name from id %s' % (
132 132 traceback.format_exc()
133 133 )
134 134 )
135 135
136 136 return '/'.join(data)
137 137
138 138 def _invalidate_cache(self, repo_name):
139 139 """
140 140 Set's cache for this repository for invalidation on next access
141 141
142 142 :param repo_name: full repo name, also a cache key
143 143 """
144 144 invalidate_cache('get_repo_cached_%s' % repo_name)
145 145
146 146 def _check_permission(self, action, user, repo_name, ip_addr=None):
147 147 """
148 148 Checks permissions using action (push/pull) user and repository
149 149 name
150 150
151 151 :param action: push or pull action
152 152 :param user: user instance
153 153 :param repo_name: repository name
154 154 """
155 155 #check IP
156 156 authuser = AuthUser(user_id=user.user_id, ip_addr=ip_addr)
157 157 if not authuser.ip_allowed:
158 158 return False
159 159 else:
160 160 log.info('Access for IP:%s allowed' % (ip_addr))
161 161 if action == 'push':
162 162 if not HasPermissionAnyMiddleware('repository.write',
163 163 'repository.admin')(user,
164 164 repo_name):
165 165 return False
166 166
167 167 else:
168 168 #any other action need at least read permission
169 169 if not HasPermissionAnyMiddleware('repository.read',
170 170 'repository.write',
171 171 'repository.admin')(user,
172 172 repo_name):
173 173 return False
174 174
175 175 return True
176 176
177 177 def _get_ip_addr(self, environ):
178 178 return _get_ip_addr(environ)
179 179
180 180 def _check_ssl(self, environ, start_response):
181 181 """
182 182 Checks the SSL check flag and returns False if SSL is not present
183 183 and required True otherwise
184 184 """
185 185 org_proto = environ['wsgi._org_proto']
186 186 #check if we have SSL required ! if not it's a bad request !
187 187 require_ssl = str2bool(RhodeCodeUi.get_by_key('push_ssl').ui_value)
188 188 if require_ssl and org_proto == 'http':
189 189 log.debug('proto is %s and SSL is required BAD REQUEST !'
190 190 % org_proto)
191 191 return False
192 192 return True
193 193
194 194 def _check_locking_state(self, environ, action, repo, user_id):
195 195 """
196 196 Checks locking on this repository, if locking is enabled and lock is
197 197 present returns a tuple of make_lock, locked, locked_by.
198 198 make_lock can have 3 states None (do nothing) True, make lock
199 199 False release lock, This value is later propagated to hooks, which
200 200 do the locking. Think about this as signals passed to hooks what to do.
201 201
202 202 """
203 203 locked = False # defines that locked error should be thrown to user
204 204 make_lock = None
205 205 repo = Repository.get_by_repo_name(repo)
206 206 user = User.get(user_id)
207 207
208 208 # this is kind of hacky, but due to how mercurial handles client-server
209 209 # server see all operation on changeset; bookmarks, phases and
210 210 # obsolescence marker in different transaction, we don't want to check
211 211 # locking on those
212 212 obsolete_call = environ['QUERY_STRING'] in ['cmd=listkeys',]
213 213 locked_by = repo.locked
214 214 if repo and repo.enable_locking and not obsolete_call:
215 215 if action == 'push':
216 216 #check if it's already locked !, if it is compare users
217 217 user_id, _date = repo.locked
218 218 if user.user_id == user_id:
219 219 log.debug('Got push from user %s, now unlocking' % (user))
220 220 # unlock if we have push from user who locked
221 221 make_lock = False
222 222 else:
223 223 # we're not the same user who locked, ban with 423 !
224 224 locked = True
225 225 if action == 'pull':
226 226 if repo.locked[0] and repo.locked[1]:
227 227 locked = True
228 228 else:
229 229 log.debug('Setting lock on repo %s by %s' % (repo, user))
230 230 make_lock = True
231 231
232 232 else:
233 233 log.debug('Repository %s do not have locking enabled' % (repo))
234 234 log.debug('FINAL locking values make_lock:%s,locked:%s,locked_by:%s'
235 235 % (make_lock, locked, locked_by))
236 236 return make_lock, locked, locked_by
237 237
238 238 def __call__(self, environ, start_response):
239 239 start = time.time()
240 240 try:
241 241 return self._handle_request(environ, start_response)
242 242 finally:
243 243 log = logging.getLogger('rhodecode.' + self.__class__.__name__)
244 244 log.debug('Request time: %.3fs' % (time.time() - start))
245 245 meta.Session.remove()
246 246
247 247
248 248 class BaseController(WSGIController):
249 249
250 250 def __before__(self):
251 251 """
252 252 __before__ is called before controller methods and after __call__
253 253 """
254 254 c.rhodecode_version = __version__
255 255 c.rhodecode_instanceid = config.get('instance_id')
256 256 c.rhodecode_name = config.get('rhodecode_title')
257 257 c.use_gravatar = str2bool(config.get('use_gravatar'))
258 258 c.ga_code = config.get('rhodecode_ga_code')
259 259 # Visual options
260 260 c.visual = AttributeDict({})
261 261 rc_config = RhodeCodeSetting.get_app_settings()
262 262
263 263 c.visual.show_public_icon = str2bool(rc_config.get('rhodecode_show_public_icon'))
264 264 c.visual.show_private_icon = str2bool(rc_config.get('rhodecode_show_private_icon'))
265 265 c.visual.stylify_metatags = str2bool(rc_config.get('rhodecode_stylify_metatags'))
266 266 c.visual.lightweight_dashboard = str2bool(rc_config.get('rhodecode_lightweight_dashboard'))
267 267 c.visual.lightweight_dashboard_items = safe_int(config.get('dashboard_items', 100))
268 268 c.visual.repository_fields = str2bool(rc_config.get('rhodecode_repository_fields'))
269 269
270 270 c.repo_name = get_repo_slug(request)
271 271 c.backends = BACKENDS.keys()
272 272 c.unread_notifications = NotificationModel()\
273 273 .get_unread_cnt_for_user(c.rhodecode_user.user_id)
274 274 self.cut_off_limit = int(config.get('cut_off_limit'))
275 275
276 276 self.sa = meta.Session
277 277 self.scm_model = ScmModel(self.sa)
278 278
279 279 def __call__(self, environ, start_response):
280 280 """Invoke the Controller"""
281 281 # WSGIController.__call__ dispatches to the Controller method
282 282 # the request is routed to. This routing information is
283 283 # available in environ['pylons.routes_dict']
284 284 try:
285 285 self.ip_addr = _get_ip_addr(environ)
286 286 # make sure that we update permissions each time we call controller
287 287 api_key = request.GET.get('api_key')
288 288 cookie_store = CookieStoreWrapper(session.get('rhodecode_user'))
289 289 user_id = cookie_store.get('user_id', None)
290 290 username = get_container_username(environ, config)
291 291 auth_user = AuthUser(user_id, api_key, username, self.ip_addr)
292 292 request.user = auth_user
293 293 self.rhodecode_user = c.rhodecode_user = auth_user
294 294 if not self.rhodecode_user.is_authenticated and \
295 295 self.rhodecode_user.user_id is not None:
296 296 self.rhodecode_user.set_authenticated(
297 297 cookie_store.get('is_authenticated')
298 298 )
299 299 log.info('IP: %s User: %s accessed %s' % (
300 300 self.ip_addr, auth_user, safe_unicode(_get_access_path(environ)))
301 301 )
302 302 return WSGIController.__call__(self, environ, start_response)
303 303 finally:
304 304 meta.Session.remove()
305 305
306 306
307 307 class BaseRepoController(BaseController):
308 308 """
309 309 Base class for controllers responsible for loading all needed data for
310 310 repository loaded items are
311 311
312 312 c.rhodecode_repo: instance of scm repository
313 313 c.rhodecode_db_repo: instance of db
314 314 c.repository_followers: number of followers
315 315 c.repository_forks: number of forks
316 316 c.repository_following: weather the current user is following the current repo
317
318 317 """
319 318
320 319 def __before__(self):
321 320 super(BaseRepoController, self).__before__()
322 321 if c.repo_name:
323 322
324 323 dbr = c.rhodecode_db_repo = Repository.get_by_repo_name(c.repo_name)
325 324 c.rhodecode_repo = c.rhodecode_db_repo.scm_instance
326 325 # update last change according to VCS data
327 326 dbr.update_changeset_cache(dbr.get_changeset())
328 327 if c.rhodecode_repo is None:
329 328 log.error('%s this repository is present in database but it '
330 329 'cannot be created as an scm instance', c.repo_name)
331 330
332 331 redirect(url('home'))
333 332
334 333 # some globals counter for menu
335 334 c.repository_followers = self.scm_model.get_followers(dbr)
336 335 c.repository_forks = self.scm_model.get_forks(dbr)
337 336 c.repository_pull_requests = self.scm_model.get_pull_requests(dbr)
338 337 c.repository_following = self.scm_model.is_following_repo(c.repo_name,
339 338 self.rhodecode_user.user_id)
@@ -1,581 +1,580 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 rhodecode.lib.utils
4 4 ~~~~~~~~~~~~~~~~~~~
5 5
6 6 Some simple helper functions
7 7
8 8 :created_on: Jan 5, 2011
9 9 :author: marcink
10 10 :copyright: (C) 2011-2012 Marcin Kuzminski <marcin@python-works.com>
11 11 :license: GPLv3, see COPYING for more details.
12 12 """
13 13 # This program is free software: you can redistribute it and/or modify
14 14 # it under the terms of the GNU General Public License as published by
15 15 # the Free Software Foundation, either version 3 of the License, or
16 16 # (at your option) any later version.
17 17 #
18 18 # This program is distributed in the hope that it will be useful,
19 19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 21 # GNU General Public License for more details.
22 22 #
23 23 # You should have received a copy of the GNU General Public License
24 24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25 25
26 26 import re
27 27 import time
28 28 import datetime
29 29 import webob
30 30
31 31 from pylons.i18n.translation import _, ungettext
32 32 from rhodecode.lib.vcs.utils.lazy import LazyProperty
33 33
34 34
35 35 def __get_lem():
36 36 """
37 37 Get language extension map based on what's inside pygments lexers
38 38 """
39 39 from pygments import lexers
40 40 from string import lower
41 41 from collections import defaultdict
42 42
43 43 d = defaultdict(lambda: [])
44 44
45 45 def __clean(s):
46 46 s = s.lstrip('*')
47 47 s = s.lstrip('.')
48 48
49 49 if s.find('[') != -1:
50 50 exts = []
51 51 start, stop = s.find('['), s.find(']')
52 52
53 53 for suffix in s[start + 1:stop]:
54 54 exts.append(s[:s.find('[')] + suffix)
55 55 return map(lower, exts)
56 56 else:
57 57 return map(lower, [s])
58 58
59 59 for lx, t in sorted(lexers.LEXERS.items()):
60 60 m = map(__clean, t[-2])
61 61 if m:
62 62 m = reduce(lambda x, y: x + y, m)
63 63 for ext in m:
64 64 desc = lx.replace('Lexer', '')
65 65 d[ext].append(desc)
66 66
67 67 return dict(d)
68 68
69 69
70 70 def str2bool(_str):
71 71 """
72 72 returs True/False value from given string, it tries to translate the
73 73 string into boolean
74 74
75 75 :param _str: string value to translate into boolean
76 76 :rtype: boolean
77 77 :returns: boolean from given string
78 78 """
79 79 if _str is None:
80 80 return False
81 81 if _str in (True, False):
82 82 return _str
83 83 _str = str(_str).strip().lower()
84 84 return _str in ('t', 'true', 'y', 'yes', 'on', '1')
85 85
86 86
87 87 def aslist(obj, sep=None, strip=True):
88 88 """
89 89 Returns given string separated by sep as list
90 90
91 91 :param obj:
92 92 :param sep:
93 93 :param strip:
94 94 """
95 95 if isinstance(obj, (basestring)):
96 96 lst = obj.split(sep)
97 97 if strip:
98 98 lst = [v.strip() for v in lst]
99 99 return lst
100 100 elif isinstance(obj, (list, tuple)):
101 101 return obj
102 102 elif obj is None:
103 103 return []
104 104 else:
105 105 return [obj]
106 106
107 107
108 108 def convert_line_endings(line, mode):
109 109 """
110 110 Converts a given line "line end" accordingly to given mode
111 111
112 112 Available modes are::
113 113 0 - Unix
114 114 1 - Mac
115 115 2 - DOS
116 116
117 117 :param line: given line to convert
118 118 :param mode: mode to convert to
119 119 :rtype: str
120 120 :return: converted line according to mode
121 121 """
122 122 from string import replace
123 123
124 124 if mode == 0:
125 125 line = replace(line, '\r\n', '\n')
126 126 line = replace(line, '\r', '\n')
127 127 elif mode == 1:
128 128 line = replace(line, '\r\n', '\r')
129 129 line = replace(line, '\n', '\r')
130 130 elif mode == 2:
131 131 line = re.sub("\r(?!\n)|(?<!\r)\n", "\r\n", line)
132 132 return line
133 133
134 134
135 135 def detect_mode(line, default):
136 136 """
137 137 Detects line break for given line, if line break couldn't be found
138 138 given default value is returned
139 139
140 140 :param line: str line
141 141 :param default: default
142 142 :rtype: int
143 143 :return: value of line end on of 0 - Unix, 1 - Mac, 2 - DOS
144 144 """
145 145 if line.endswith('\r\n'):
146 146 return 2
147 147 elif line.endswith('\n'):
148 148 return 0
149 149 elif line.endswith('\r'):
150 150 return 1
151 151 else:
152 152 return default
153 153
154 154
155 155 def generate_api_key(username, salt=None):
156 156 """
157 157 Generates unique API key for given username, if salt is not given
158 158 it'll be generated from some random string
159 159
160 160 :param username: username as string
161 161 :param salt: salt to hash generate KEY
162 162 :rtype: str
163 163 :returns: sha1 hash from username+salt
164 164 """
165 165 from tempfile import _RandomNameSequence
166 166 import hashlib
167 167
168 168 if salt is None:
169 169 salt = _RandomNameSequence().next()
170 170
171 171 return hashlib.sha1(username + salt).hexdigest()
172 172
173 173
174 174 def safe_int(val, default=None):
175 175 """
176 176 Returns int() of val if val is not convertable to int use default
177 177 instead
178 178
179 179 :param val:
180 180 :param default:
181 181 """
182 182
183 183 try:
184 184 val = int(val)
185 185 except (ValueError, TypeError):
186 186 val = default
187 187
188 188 return val
189 189
190 190
191 191 def safe_unicode(str_, from_encoding=None):
192 192 """
193 193 safe unicode function. Does few trick to turn str_ into unicode
194 194
195 195 In case of UnicodeDecode error we try to return it with encoding detected
196 196 by chardet library if it fails fallback to unicode with errors replaced
197 197
198 198 :param str_: string to decode
199 199 :rtype: unicode
200 200 :returns: unicode object
201 201 """
202 202 if isinstance(str_, unicode):
203 203 return str_
204 204
205 205 if not from_encoding:
206 206 import rhodecode
207 207 DEFAULT_ENCODINGS = aslist(rhodecode.CONFIG.get('default_encoding',
208 208 'utf8'), sep=',')
209 209 from_encoding = DEFAULT_ENCODINGS
210 210
211 211 if not isinstance(from_encoding, (list, tuple)):
212 212 from_encoding = [from_encoding]
213 213
214 214 try:
215 215 return unicode(str_)
216 216 except UnicodeDecodeError:
217 217 pass
218 218
219 219 for enc in from_encoding:
220 220 try:
221 221 return unicode(str_, enc)
222 222 except UnicodeDecodeError:
223 223 pass
224 224
225 225 try:
226 226 import chardet
227 227 encoding = chardet.detect(str_)['encoding']
228 228 if encoding is None:
229 229 raise Exception()
230 230 return str_.decode(encoding)
231 231 except (ImportError, UnicodeDecodeError, Exception):
232 232 return unicode(str_, from_encoding[0], 'replace')
233 233
234 234
235 235 def safe_str(unicode_, to_encoding=None):
236 236 """
237 237 safe str function. Does few trick to turn unicode_ into string
238 238
239 239 In case of UnicodeEncodeError we try to return it with encoding detected
240 240 by chardet library if it fails fallback to string with errors replaced
241 241
242 242 :param unicode_: unicode to encode
243 243 :rtype: str
244 244 :returns: str object
245 245 """
246 246
247 247 # if it's not basestr cast to str
248 248 if not isinstance(unicode_, basestring):
249 249 return str(unicode_)
250 250
251 251 if isinstance(unicode_, str):
252 252 return unicode_
253 253
254 254 if not to_encoding:
255 255 import rhodecode
256 256 DEFAULT_ENCODINGS = aslist(rhodecode.CONFIG.get('default_encoding',
257 257 'utf8'), sep=',')
258 258 to_encoding = DEFAULT_ENCODINGS
259 259
260 260 if not isinstance(to_encoding, (list, tuple)):
261 261 to_encoding = [to_encoding]
262 262
263 263 for enc in to_encoding:
264 264 try:
265 265 return unicode_.encode(enc)
266 266 except UnicodeEncodeError:
267 267 pass
268 268
269 269 try:
270 270 import chardet
271 271 encoding = chardet.detect(unicode_)['encoding']
272 272 if encoding is None:
273 273 raise UnicodeEncodeError()
274 274
275 275 return unicode_.encode(encoding)
276 276 except (ImportError, UnicodeEncodeError):
277 277 return unicode_.encode(to_encoding[0], 'replace')
278 278
279 279 return safe_str
280 280
281 281
282 282 def remove_suffix(s, suffix):
283 283 if s.endswith(suffix):
284 284 s = s[:-1 * len(suffix)]
285 285 return s
286 286
287 287
288 288 def remove_prefix(s, prefix):
289 289 if s.startswith(prefix):
290 290 s = s[len(prefix):]
291 291 return s
292 292
293 293
294 294 def engine_from_config(configuration, prefix='sqlalchemy.', **kwargs):
295 295 """
296 296 Custom engine_from_config functions that makes sure we use NullPool for
297 297 file based sqlite databases. This prevents errors on sqlite. This only
298 298 applies to sqlalchemy versions < 0.7.0
299 299
300 300 """
301 301 import sqlalchemy
302 302 from sqlalchemy import engine_from_config as efc
303 303 import logging
304 304
305 305 if int(sqlalchemy.__version__.split('.')[1]) < 7:
306 306
307 307 # This solution should work for sqlalchemy < 0.7.0, and should use
308 308 # proxy=TimerProxy() for execution time profiling
309 309
310 310 from sqlalchemy.pool import NullPool
311 311 url = configuration[prefix + 'url']
312 312
313 313 if url.startswith('sqlite'):
314 314 kwargs.update({'poolclass': NullPool})
315 315 return efc(configuration, prefix, **kwargs)
316 316 else:
317 317 import time
318 318 from sqlalchemy import event
319 319 from sqlalchemy.engine import Engine
320 320
321 321 log = logging.getLogger('sqlalchemy.engine')
322 322 BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = xrange(30, 38)
323 323 engine = efc(configuration, prefix, **kwargs)
324 324
325 325 def color_sql(sql):
326 326 COLOR_SEQ = "\033[1;%dm"
327 327 COLOR_SQL = YELLOW
328 328 normal = '\x1b[0m'
329 329 return ''.join([COLOR_SEQ % COLOR_SQL, sql, normal])
330 330
331 331 if configuration['debug']:
332 332 #attach events only for debug configuration
333 333
334 334 def before_cursor_execute(conn, cursor, statement,
335 335 parameters, context, executemany):
336 336 context._query_start_time = time.time()
337 337 log.info(color_sql(">>>>> STARTING QUERY >>>>>"))
338 338
339 339 def after_cursor_execute(conn, cursor, statement,
340 340 parameters, context, executemany):
341 341 total = time.time() - context._query_start_time
342 342 log.info(color_sql("<<<<< TOTAL TIME: %f <<<<<" % total))
343 343
344 344 event.listen(engine, "before_cursor_execute",
345 345 before_cursor_execute)
346 346 event.listen(engine, "after_cursor_execute",
347 347 after_cursor_execute)
348 348
349 349 return engine
350 350
351 351
352 352 def age(prevdate, show_short_version=False):
353 353 """
354 354 turns a datetime into an age string.
355 355 If show_short_version is True, then it will generate a not so accurate but shorter string,
356 356 example: 2days ago, instead of 2 days and 23 hours ago.
357 357
358
359 358 :param prevdate: datetime object
360 359 :param show_short_version: if it should aproximate the date and return a shorter string
361 360 :rtype: unicode
362 361 :returns: unicode words describing age
363 362 """
364 363 now = datetime.datetime.now()
365 364 now = now.replace(microsecond=0)
366 365 order = ['year', 'month', 'day', 'hour', 'minute', 'second']
367 366 deltas = {}
368 367 future = False
369 368
370 369 if prevdate > now:
371 370 now, prevdate = prevdate, now
372 371 future = True
373 372
374 373 # Get date parts deltas
375 374 for part in order:
376 375 if future:
377 376 from dateutil import relativedelta
378 377 d = relativedelta.relativedelta(now, prevdate)
379 378 deltas[part] = getattr(d, part + 's')
380 379 else:
381 380 deltas[part] = getattr(now, part) - getattr(prevdate, part)
382 381
383 382 # Fix negative offsets (there is 1 second between 10:59:59 and 11:00:00,
384 383 # not 1 hour, -59 minutes and -59 seconds)
385 384 for num, length in [(5, 60), (4, 60), (3, 24)]: # seconds, minutes, hours
386 385 part = order[num]
387 386 carry_part = order[num - 1]
388 387
389 388 if deltas[part] < 0:
390 389 deltas[part] += length
391 390 deltas[carry_part] -= 1
392 391
393 392 # Same thing for days except that the increment depends on the (variable)
394 393 # number of days in the month
395 394 month_lengths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
396 395 if deltas['day'] < 0:
397 396 if prevdate.month == 2 and (prevdate.year % 4 == 0 and
398 397 (prevdate.year % 100 != 0 or prevdate.year % 400 == 0)):
399 398 deltas['day'] += 29
400 399 else:
401 400 deltas['day'] += month_lengths[prevdate.month - 1]
402 401
403 402 deltas['month'] -= 1
404 403
405 404 if deltas['month'] < 0:
406 405 deltas['month'] += 12
407 406 deltas['year'] -= 1
408 407
409 408 # Format the result
410 409 fmt_funcs = {
411 410 'year': lambda d: ungettext(u'%d year', '%d years', d) % d,
412 411 'month': lambda d: ungettext(u'%d month', '%d months', d) % d,
413 412 'day': lambda d: ungettext(u'%d day', '%d days', d) % d,
414 413 'hour': lambda d: ungettext(u'%d hour', '%d hours', d) % d,
415 414 'minute': lambda d: ungettext(u'%d minute', '%d minutes', d) % d,
416 415 'second': lambda d: ungettext(u'%d second', '%d seconds', d) % d,
417 416 }
418 417
419 418 for i, part in enumerate(order):
420 419 value = deltas[part]
421 420 if value == 0:
422 421 continue
423 422
424 423 if i < 5:
425 424 sub_part = order[i + 1]
426 425 sub_value = deltas[sub_part]
427 426 else:
428 427 sub_value = 0
429 428
430 429 if sub_value == 0 or show_short_version:
431 430 if future:
432 431 return _(u'in %s') % fmt_funcs[part](value)
433 432 else:
434 433 return _(u'%s ago') % fmt_funcs[part](value)
435 434 if future:
436 435 return _(u'in %s and %s') % (fmt_funcs[part](value),
437 436 fmt_funcs[sub_part](sub_value))
438 437 else:
439 438 return _(u'%s and %s ago') % (fmt_funcs[part](value),
440 439 fmt_funcs[sub_part](sub_value))
441 440
442 441 return _(u'just now')
443 442
444 443
445 444 def uri_filter(uri):
446 445 """
447 446 Removes user:password from given url string
448 447
449 448 :param uri:
450 449 :rtype: unicode
451 450 :returns: filtered list of strings
452 451 """
453 452 if not uri:
454 453 return ''
455 454
456 455 proto = ''
457 456
458 457 for pat in ('https://', 'http://'):
459 458 if uri.startswith(pat):
460 459 uri = uri[len(pat):]
461 460 proto = pat
462 461 break
463 462
464 463 # remove passwords and username
465 464 uri = uri[uri.find('@') + 1:]
466 465
467 466 # get the port
468 467 cred_pos = uri.find(':')
469 468 if cred_pos == -1:
470 469 host, port = uri, None
471 470 else:
472 471 host, port = uri[:cred_pos], uri[cred_pos + 1:]
473 472
474 473 return filter(None, [proto, host, port])
475 474
476 475
477 476 def credentials_filter(uri):
478 477 """
479 478 Returns a url with removed credentials
480 479
481 480 :param uri:
482 481 """
483 482
484 483 uri = uri_filter(uri)
485 484 #check if we have port
486 485 if len(uri) > 2 and uri[2]:
487 486 uri[2] = ':' + uri[2]
488 487
489 488 return ''.join(uri)
490 489
491 490
492 491 def get_changeset_safe(repo, rev):
493 492 """
494 493 Safe version of get_changeset if this changeset doesn't exists for a
495 494 repo it returns a Dummy one instead
496 495
497 496 :param repo:
498 497 :param rev:
499 498 """
500 499 from rhodecode.lib.vcs.backends.base import BaseRepository
501 500 from rhodecode.lib.vcs.exceptions import RepositoryError
502 501 from rhodecode.lib.vcs.backends.base import EmptyChangeset
503 502 if not isinstance(repo, BaseRepository):
504 503 raise Exception('You must pass an Repository '
505 504 'object as first argument got %s', type(repo))
506 505
507 506 try:
508 507 cs = repo.get_changeset(rev)
509 508 except RepositoryError:
510 509 cs = EmptyChangeset(requested_revision=rev)
511 510 return cs
512 511
513 512
514 513 def datetime_to_time(dt):
515 514 if dt:
516 515 return time.mktime(dt.timetuple())
517 516
518 517
519 518 def time_to_datetime(tm):
520 519 if tm:
521 520 if isinstance(tm, basestring):
522 521 try:
523 522 tm = float(tm)
524 523 except ValueError:
525 524 return
526 525 return datetime.datetime.fromtimestamp(tm)
527 526
528 527 MENTIONS_REGEX = r'(?:^@|\s@)([a-zA-Z0-9]{1}[a-zA-Z0-9\-\_\.]+)(?:\s{1})'
529 528
530 529
531 530 def extract_mentioned_users(s):
532 531 """
533 532 Returns unique usernames from given string s that have @mention
534 533
535 534 :param s: string to get mentions
536 535 """
537 536 usrs = set()
538 537 for username in re.findall(MENTIONS_REGEX, s):
539 538 usrs.add(username)
540 539
541 540 return sorted(list(usrs), key=lambda k: k.lower())
542 541
543 542
544 543 class AttributeDict(dict):
545 544 def __getattr__(self, attr):
546 545 return self.get(attr, None)
547 546 __setattr__ = dict.__setitem__
548 547 __delattr__ = dict.__delitem__
549 548
550 549
551 550 def fix_PATH(os_=None):
552 551 """
553 552 Get current active python path, and append it to PATH variable to fix issues
554 553 of subprocess calls and different python versions
555 554 """
556 555 import sys
557 556 if os_ is None:
558 557 import os
559 558 else:
560 559 os = os_
561 560
562 561 cur_path = os.path.split(sys.executable)[0]
563 562 if not os.environ['PATH'].startswith(cur_path):
564 563 os.environ['PATH'] = '%s:%s' % (cur_path, os.environ['PATH'])
565 564
566 565
567 566 def obfuscate_url_pw(engine):
568 567 _url = engine or ''
569 568 from sqlalchemy.engine import url as sa_url
570 569 try:
571 570 _url = sa_url.make_url(engine)
572 571 if _url.password:
573 572 _url.password = 'XXXXX'
574 573 except:
575 574 pass
576 575 return str(_url)
577 576
578 577
579 578 def get_server_url(environ):
580 579 req = webob.Request(environ)
581 580 return req.host_url + req.script_name
@@ -1,367 +1,368 b''
1 1 /**
2 2 * Stylesheets for the context bar
3 3 */
4 4
5 5 #quick .repo_switcher { background-image: url("../images/icons/database.png"); }
6 6 #quick .journal { background-image: url("../images/icons/book.png"); }
7 7 #quick .search { background-image: url("../images/icons/search_16.png"); }
8 8 #quick .admin { background-image: url("../images/icons/cog_edit.png"); }
9 9
10 10 #context-bar button.follow { background-image: url("../images/icons/heart.png"); }
11 11 #context-bar button.following { background-image: url("../images/icons/heart_delete.png"); }
12 12 #context-bar a.fork { background-image: url("../images/icons/arrow_divide.png"); }
13 13 #context-bar a.summary { background-image: url("../images/icons/clipboard_16.png"); }
14 14 #context-bar a.changelogs { background-image: url("../images/icons/time.png"); }
15 15 #context-bar a.files { background-image: url("../images/icons/file.png"); }
16 16 #context-bar a.switch-to { background-image: url("../images/icons/arrow_switch.png"); }
17 17 #context-bar a.options { background-image: url("../images/icons/table_gear.png"); }
18 18 #context-bar a.pull-request { background-image: url("../images/icons/arrow_join.png"); }
19 19 #context-bar a.branches { background-image: url("../images/icons/arrow_branch.png"); }
20 20 #context-bar a.tags { background-image: url("../images/icons/tag_blue.png"); }
21 21 #context-bar a.bookmarks { background-image: url("../images/icons/tag_green.png"); }
22 22 #context-bar a.settings { background-image: url("../images/icons/cog.png"); }
23 23 #context-bar a.shortlog { background-image: url("../images/icons/time.png"); }
24 24 #context-bar a.search { background-image: url("../images/icons/search_16.png"); }
25 25 #context-bar a.admin { background-image: url("../images/icons/cog_edit.png"); }
26 26
27 27 #context-bar a.journal { background-image: url("../images/icons/book.png"); }
28 28 #context-bar a.repos { background-image: url("../images/icons/database_edit.png"); }
29 29 #context-bar a.repos_groups { background-image: url("../images/icons/database_link.png"); }
30 30 #context-bar a.users { background-image: url("../images/icons/user_edit.png"); }
31 31 #context-bar a.groups { background-image: url("../images/icons/group_edit.png"); }
32 32 #context-bar a.permissions { background-image: url("../images/icons/key.png"); }
33 33 #context-bar a.ldap { background-image: url("../images/icons/server_key.png"); }
34 34 #context-bar a.defaults { background-image: url("../images/icons/wrench.png"); }
35 35 #context-bar a.settings { background-image: url("../images/icons/cog_edit.png"); }
36 36 #context-bar a.compare_request { background-image: url('../images/icons/arrow_inout.png')}
37 37 #context-bar a.locking_del { background-image: url('../images/icons/lock_delete.png')}
38 38 #context-bar a.locking_add { background-image: url('../images/icons/lock_add.png')}
39 39
40 40 #content #context-bar {
41 41 position: relative;
42 42 background-color: #003B76 !important;
43 43 padding: 0px;
44 44 overflow: visible;
45 45 }
46 46
47 47 #header #header-inner #quick a,
48 48 #content #context-bar,
49 49 #content #context-bar a,
50 50 #content #context-bar button {
51 51 color: #FFFFFF;
52 52 }
53 53
54 54 #header #header-inner #quick a:hover,
55 55 #content #context-bar a:hover,
56 56 #content #context-bar button:hover {
57 57 text-decoration: none;
58 58 }
59 59
60 60 #content #context-bar .icon {
61 61 display: inline-block;
62 62 width: 16px;
63 63 height: 16px;
64 64 vertical-align: text-bottom;
65 65 }
66 66
67 67 ul.horizontal-list {
68 68 display: block;
69 69 }
70 70
71 71 ul.horizontal-list > li {
72 72 float: left;
73 73 position: relative;
74 74 }
75 75
76 76 #header #header-inner #quick ul,
77 77 ul.horizontal-list > li ul {
78 78 position: absolute;
79 79 display: none;
80 80 right: 0;
81 81 z-index: 999;
82 82 }
83 83
84 84 #header #header-inner #quick li:hover > ul,
85 85 ul.horizontal-list li:hover > ul {
86 86 display: block;
87 87 }
88 88
89 89 #header #header-inner #quick li ul li,
90 90 ul.horizontal-list ul li {
91 91 position: relative;
92 92 border-bottom: 1px solid rgba(0,0,0,0.1);
93 93 border-top: 1px solid rgba(255,255,255,0.1);
94 94 }
95 95
96 96 ul.horizontal-list > li ul ul {
97 97 position: absolute;
98 98 right: 100%;
99 99 top: -1px;
100 100 min-width: 200px;
101 101 max-height: 400px;
102 102 overflow-x: hidden;
103 103 overflow-y: auto;
104 104 }
105 105
106 106 #header #header-inner #quick ul a,
107 107 ul.horizontal-list li a {
108 108 white-space: nowrap;
109 109 }
110 110
111 111 #breadcrumbs {
112 112 float: left;
113 113 padding: 5px 0;
114 114 padding-left: 5px;
115 115 font-weight: bold;
116 116 font-size: 14px;
117 117 }
118 118
119 119 #breadcrumbs span {
120 120 font-weight: bold;
121 121 font-size: 1.8em;
122 122 }
123 123
124 124 #context-top {
125 125 position: relative;
126 126 overflow: hidden;
127 127 border-bottom: 1px solid #003162;
128 128 padding: 5px;
129 129 }
130 130
131 131 #header #header-inner #quick ul,
132 132 #revision-changer,
133 133 #context-pages,
134 134 #context-pages ul {
135 135 background: #3b6998; /* Old browsers */
136 136 background: -moz-linear-gradient(top, #4574a2 0%, #2f5d8b 100%); /* FF3.6+ */
137 137 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#4574a2), color-stop(100%,#2f5d8b)); /* Chrome,Safari4+ */
138 138 background: -webkit-linear-gradient(top, #4574a2 0%, #2f5d8b 100%); /* Chrome10+,Safari5.1+ */
139 139 background: -o-linear-gradient(top, #4574a2 0%, #2f5d8b 100%); /* Opera 11.10+ */
140 140 background: -ms-linear-gradient(top, #4574a2 0%, #2f5d8b 100%); /* IE10+ */
141 141 background: linear-gradient(to bottom, #4574a2 0%, #2f5d8b 100%); /* W3C */
142 142 /*Filter on IE will also use overflow:hidden implicitly, and that would clip our inner menus.*/
143 143 /*filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#4574a2', endColorstr='#2f5d8b',GradientType=0 ); /* IE6-9 */*/
144 144 }
145 145
146 146 #header #header-inner #quick a,
147 147 #context-actions a,
148 148 #context-pages a {
149 149 background-repeat: no-repeat;
150 150 background-position: 10px 50%;
151 151 padding-left: 30px;
152 152 }
153 153
154 154 #quick a,
155 155 #context-pages ul ul a {
156 156 padding-left: 10px;
157 157 }
158 158
159 159 ul#context-actions {
160 160 display: inline-block;
161 161 float: right;
162 162 border-radius: 4px;
163 163 background-image: linear-gradient(top, #4574a2 0%, #2f5d8b 100%);
164 164 }
165
165 166 #content ul#context-actions li {
166 167 padding: 0px;
167 168 border-right: 1px solid rgba(0,0,0,0.1);
168 169 border-left: 1px solid rgba(255,255,255,0.1);
169 170 }
170 171
171 172 #context-actions button,
172 173 #context-actions a {
173 174 display: block;
174 175 cursor: pointer;
175 176 background: none;
176 177 border: none;
177 178 margin: 0px;
178 179 height: auto;
179 180 padding: 10px 10px 10px 30px;
180 181 background-repeat: no-repeat;
181 182 background-position: 10px 50%;
182 183 font-size: 1em;
183 184 }
184 185
185 186 #context-actions a {
186 187 padding: 11px 10px 12px 30px;
187 188 }
188 189
189 190 #header #header-inner #quick li:hover,
190 191 #revision-changer:hover,
191 192 #context-pages li:hover,
192 193 #context-actions li:hover,
193 194 #content #context-actions li:hover,
194 195 #header #header-inner #quick li.current,
195 196 #context-pages li.current {
196 197 background: #6388ad; /* Old browsers */
197 198 background: -moz-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* FF3.6+ */
198 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 200 background: -webkit-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* Chrome10+,Safari5.1+ */
200 201 background: -o-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* Opera 11.10+ */
201 202 background: -ms-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* IE10+ */
202 203 background: linear-gradient(to bottom, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* W3C */
203 204 /*filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#88bfe8', endColorstr='#70b0e0',GradientType=0 ); /* IE6-9 */*/
204 205 }
205 206
206 207
207 208 #content #context-actions li:first-child {
208 209 border-left: none;
209 210 border-radius: 4px 0 0px 4px;
210 211 }
211 212
212 213 #content #context-actions li:last-child {
213 214 border-right: none;
214 215 border-radius: 0 4px 4px 0;
215 216 }
216 217
217 218 #content #context-actions .icon {
218 219 margin: auto;
219 220 margin-bottom: 5px;
220 221 display: block;
221 222 clear: both;
222 223 float: none;
223 224 }
224 225
225 226 #content #context-actions button.follow,
226 227 #content #context-actions button.following {
227 228 width: auto;
228 229 float: none;
229 230 }
230 231
231 232 #content #context-actions button .show-following,
232 233 #content #context-actions button .show-follow {
233 234 display: none;
234 235 }
235 236
236 237 #content #context-bar #context-actions button.follow .show-follow {
237 238 display: block;
238 239 }
239 240
240 241 #content #context-bar #context-actions button.following .show-following {
241 242 display: block;
242 243 }
243 244
244 245 #context-state {
245 246 background-color: #336699;
246 247 border-top: 1px solid #517da8;
247 248 min-height: 36px;
248 249 }
249 250
250 251 #context-pages {
251 252 float: right;
252 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 257 background: #535353; /* Old browsers */
257 258 background: -moz-linear-gradient(top, #5d5d5d 0%, #484848 100%); /* FF3.6+ */
258 259 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#5d5d5d), color-stop(100%,#484848)); /* Chrome,Safari4+ */
259 260 background: -webkit-linear-gradient(top, #5d5d5d 0%, #484848 100%); /* Chrome10+,Safari5.1+ */
260 261 background: -o-linear-gradient(top, #5d5d5d 0%, #484848 100%); /* Opera 11.10+ */
261 262 background: -ms-linear-gradient(top, #5d5d5d 0%, #484848 100%); /* IE10+ */
262 263 background: linear-gradient(to bottom, #5d5d5d 0%, #484848 100%); /* W3C */
263 264 }
264 265
265 266 #content #context-pages .icon {
266 267 margin-right: 5px;
267 268 }
268 269
269 270 #header #header-inner #quick li,
270 271 #content #context-pages li {
271 272 border-right: 1px solid rgba(0,0,0,0.1);
272 273 border-left: 1px solid rgba(255,255,255,0.1);
273 274 padding: 0;
274 275 }
275 276 #header #header-inner #quick li:last-child,
276 277 #content #context-pages li:last-child {
277 278 border-right: none;
278 279 }
279 280
280 281 #header #header-inner #quick > li:first-child {
281 282 border-left: none;
282 283 }
283 284
284 285 #header #header-inner #quick > li:first-child > a {
285 286 border-radius: 4px 0 0 4px;
286 287 }
287 288
288 289 #header #header-inner #quick a,
289 290 #context-pages a,
290 291 #context-pages .admin_menu a {
291 292 display: block;
292 293 padding: 0px 10px 1px 30px;
293 294 padding-left: 30px;
294 295 line-height: 35px;
295 296 }
296 297
297 298 #header #header-inner #quick a.thin,
298 299 #context-pages a.thin,
299 300 #context-pages .admin_menu a.thin {
300 301 line-height: 28px !important;
301 302 }
302 303
303 304 #header #header-inner #quick a#quick_login_link {
304 305 padding-left: 0px;
305 306 }
306 307
307 308 #header #header-inner #quick a {
308 309 overflow: hidden;
309 310 }
310 311 #quick a.childs:after,
311 312 #revision-changer:before,
312 313 #context-pages a.childs:after,
313 314 #context-pages a.dropdown:after {
314 315 content: ' \25BE';
315 316 }
316 317 #context-pages a.childs {
317 318 padding-right: 30px;
318 319 }
319 320 #context-pages a.childs:after {
320 321 position: absolute;
321 322 float: right;
322 323 padding-left: 5px;
323 324 padding-right: 5px;
324 325 }
325 326
326 327 #revision-changer:before {
327 328 position: absolute;
328 329 top: 0px;
329 330 right: 0px;
330 331 border-right: 1px solid rgba(0,0,0,0.1);
331 332 height: 25px;
332 333 padding-top: 10px;
333 334 padding-right: 10px;
334 335 }
335 336
336 337 #context-pages li:last-child a {
337 338 padding-right: 10px;
338 339 }
339 340
340 341 #context-bar #revision-changer {
341 342 position: relative;
342 343 cursor: pointer;
343 344 border: none;
344 345 padding: 0;
345 346 margin: 0;
346 347 color: #FFFFFF;
347 348 font-size: 0.85em;
348 349 padding: 2px 15px;
349 350 padding-bottom: 3px;
350 351 padding-right: 30px;
351 352 border-right: 1px solid rgba(255,255,255,0.1);
352 353 }
353 354
354 355 #revision-changer .branch-name,
355 356 #revision-changer .revision {
356 357 display: block;
357 358 text-align: center;
358 359 line-height: 1.5em;
359 360 }
360 361
361 362 #revision-changer .branch-name {
362 363 font-weight: bold;
363 364 }
364 365
365 366 #revision-changer .revision {
366 367 text-transform: uppercase;
367 368 }
@@ -1,4852 +1,4846 b''
1 1 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td {
2 2 border: 0;
3 3 outline: 0;
4 4 font-size: 100%;
5 5 vertical-align: baseline;
6 6 background: transparent;
7 7 margin: 0;
8 8 padding: 0;
9 9 }
10 10
11 11 body {
12 12 line-height: 1;
13 13 height: 100%;
14 14 background: url("../images/background.png") repeat scroll 0 0 #B0B0B0;
15 15 font-family: Lucida Grande, Verdana, Lucida Sans Regular,
16 16 Lucida Sans Unicode, Arial, sans-serif; font-size : 12px;
17 17 color: #000;
18 18 margin: 0;
19 19 padding: 0;
20 20 font-size: 12px;
21 21 }
22 22
23 23 ol, ul {
24 24 list-style: none;
25 25 }
26 26
27 27 blockquote, q {
28 28 quotes: none;
29 29 }
30 30
31 31 blockquote:before, blockquote:after, q:before, q:after {
32 32 content: none;
33 33 }
34 34
35 35 :focus {
36 36 outline: 0;
37 37 }
38 38
39 39 del {
40 40 text-decoration: line-through;
41 41 }
42 42
43 43 table {
44 44 border-collapse: collapse;
45 45 border-spacing: 0;
46 46 }
47 47
48 48 html {
49 49 height: 100%;
50 50 }
51 51
52 52 a {
53 53 color: #003367;
54 54 text-decoration: none;
55 55 cursor: pointer;
56 56 }
57 57
58 58 a:hover {
59 59 color: #316293;
60 60 text-decoration: underline;
61 61 }
62 62
63 63 h1, h2, h3, h4, h5, h6,
64 64 div.h1, div.h2, div.h3, div.h4, div.h5, div.h6 {
65 65 color: #292929;
66 66 font-weight: 700;
67 67 }
68 68
69 69 h1, div.h1 {
70 70 font-size: 22px;
71 71 }
72 72
73 73 h2, div.h2 {
74 74 font-size: 20px;
75 75 }
76 76
77 77 h3, div.h3 {
78 78 font-size: 18px;
79 79 }
80 80
81 81 h4, div.h4 {
82 82 font-size: 16px;
83 83 }
84 84
85 85 h5, div.h5 {
86 86 font-size: 14px;
87 87 }
88 88
89 89 h6, div.h6 {
90 90 font-size: 11px;
91 91 }
92 92
93 93 ul.circle {
94 94 list-style-type: circle;
95 95 }
96 96
97 97 ul.disc {
98 98 list-style-type: disc;
99 99 }
100 100
101 101 ul.square {
102 102 list-style-type: square;
103 103 }
104 104
105 105 ol.lower-roman {
106 106 list-style-type: lower-roman;
107 107 }
108 108
109 109 ol.upper-roman {
110 110 list-style-type: upper-roman;
111 111 }
112 112
113 113 ol.lower-alpha {
114 114 list-style-type: lower-alpha;
115 115 }
116 116
117 117 ol.upper-alpha {
118 118 list-style-type: upper-alpha;
119 119 }
120 120
121 121 ol.decimal {
122 122 list-style-type: decimal;
123 123 }
124 124
125 125 div.color {
126 126 clear: both;
127 127 overflow: hidden;
128 128 position: absolute;
129 129 background: #FFF;
130 130 margin: 7px 0 0 60px;
131 131 padding: 1px 1px 1px 0;
132 132 }
133 133
134 134 div.color a {
135 135 width: 15px;
136 136 height: 15px;
137 137 display: block;
138 138 float: left;
139 139 margin: 0 0 0 1px;
140 140 padding: 0;
141 141 }
142 142
143 143 div.options {
144 144 clear: both;
145 145 overflow: hidden;
146 146 position: absolute;
147 147 background: #FFF;
148 148 margin: 7px 0 0 162px;
149 149 padding: 0;
150 150 }
151 151
152 152 div.options a {
153 153 height: 1%;
154 154 display: block;
155 155 text-decoration: none;
156 156 margin: 0;
157 157 padding: 3px 8px;
158 158 }
159 159
160 160 .top-left-rounded-corner {
161 161 -webkit-border-top-left-radius: 8px;
162 162 -khtml-border-radius-topleft: 8px;
163 163 border-top-left-radius: 8px;
164 164 }
165 165
166 166 .top-right-rounded-corner {
167 167 -webkit-border-top-right-radius: 8px;
168 168 -khtml-border-radius-topright: 8px;
169 169 border-top-right-radius: 8px;
170 170 }
171 171
172 172 .bottom-left-rounded-corner {
173 173 -webkit-border-bottom-left-radius: 8px;
174 174 -khtml-border-radius-bottomleft: 8px;
175 175 border-bottom-left-radius: 8px;
176 176 }
177 177
178 178 .bottom-right-rounded-corner {
179 179 -webkit-border-bottom-right-radius: 8px;
180 180 -khtml-border-radius-bottomright: 8px;
181 181 border-bottom-right-radius: 8px;
182 182 }
183 183
184 184 .top-left-rounded-corner-mid {
185 185 -webkit-border-top-left-radius: 4px;
186 186 -khtml-border-radius-topleft: 4px;
187 187 border-top-left-radius: 4px;
188 188 }
189 189
190 190 .top-right-rounded-corner-mid {
191 191 -webkit-border-top-right-radius: 4px;
192 192 -khtml-border-radius-topright: 4px;
193 193 border-top-right-radius: 4px;
194 194 }
195 195
196 196 .bottom-left-rounded-corner-mid {
197 197 -webkit-border-bottom-left-radius: 4px;
198 198 -khtml-border-radius-bottomleft: 4px;
199 199 border-bottom-left-radius: 4px;
200 200 }
201 201
202 202 .bottom-right-rounded-corner-mid {
203 203 -webkit-border-bottom-right-radius: 4px;
204 204 -khtml-border-radius-bottomright: 4px;
205 205 border-bottom-right-radius: 4px;
206 206 }
207 207
208 208 .help-block {
209 209 color: #999999;
210 210 display: block;
211 211 margin-bottom: 0;
212 212 margin-top: 5px;
213 213 }
214 214
215 215 .empty_data {
216 216 color: #B9B9B9;
217 217 }
218 218
219 219 a.permalink {
220 220 visibility: hidden;
221 221 }
222 222
223 223 a.permalink:hover {
224 224 text-decoration: none;
225 225 }
226 226
227 227 h1:hover > a.permalink,
228 228 h2:hover > a.permalink,
229 229 h3:hover > a.permalink,
230 230 h4:hover > a.permalink,
231 231 h5:hover > a.permalink,
232 232 h6:hover > a.permalink,
233 233 div:hover > a.permalink {
234 234 visibility: visible;
235 235 }
236 236
237 237 #header {
238 238 }
239 239 #header ul#logged-user {
240 240 margin-bottom: 5px !important;
241 241 -webkit-border-radius: 0px 0px 8px 8px;
242 242 -khtml-border-radius: 0px 0px 8px 8px;
243 243 border-radius: 0px 0px 8px 8px;
244 244 height: 37px;
245 245 background-color: #003B76;
246 246 background-repeat: repeat-x;
247 247 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
248 248 background-image: -moz-linear-gradient(top, #003b76, #00376e);
249 249 background-image: -ms-linear-gradient(top, #003b76, #00376e);
250 250 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
251 251 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
252 252 background-image: -o-linear-gradient(top, #003b76, #00376e);
253 253 background-image: linear-gradient(to bottom, #003b76, #00376e);
254 254 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
255 255 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
256 256 }
257 257
258 258 #header ul#logged-user li {
259 259 list-style: none;
260 260 float: left;
261 261 margin: 8px 0 0;
262 262 padding: 4px 12px;
263 263 border-left: 1px solid #316293;
264 264 }
265 265
266 266 #header ul#logged-user li.first {
267 267 border-left: none;
268 268 margin: 4px;
269 269 }
270 270
271 271 #header ul#logged-user li.first div.gravatar {
272 272 margin-top: -2px;
273 273 }
274 274
275 275 #header ul#logged-user li.first div.account {
276 276 padding-top: 4px;
277 277 float: left;
278 278 }
279 279
280 280 #header ul#logged-user li.last {
281 281 border-right: none;
282 282 }
283 283
284 284 #header ul#logged-user li a {
285 285 color: #fff;
286 286 font-weight: 700;
287 287 text-decoration: none;
288 288 }
289 289
290 290 #header ul#logged-user li a:hover {
291 291 text-decoration: underline;
292 292 }
293 293
294 294 #header ul#logged-user li.highlight a {
295 295 color: #fff;
296 296 }
297 297
298 298 #header ul#logged-user li.highlight a:hover {
299 299 color: #FFF;
300 300 }
301 301 #header-dd {
302 302 clear: both;
303 303 position: fixed !important;
304 304 background-color: #003B76;
305 305 opacity: 0.01;
306 306 cursor: pointer;
307 307 min-height: 10px;
308 308 width: 100% !important;
309 309 -webkit-border-radius: 0px 0px 4px 4px;
310 310 -khtml-border-radius: 0px 0px 4px 4px;
311 311 border-radius: 0px 0px 4px 4px;
312 312 }
313 313
314 314 #header-dd:hover {
315 315 opacity: 0.2;
316 316 -webkit-transition: opacity 0.5s ease-in-out;
317 317 -moz-transition: opacity 0.5s ease-in-out;
318 318 transition: opacity 0.5s ease-in-out;
319 319 }
320 320
321 321 #header #header-inner {
322 322 min-height: 44px;
323 323 clear: both;
324 324 position: relative;
325 325 background-color: #003B76;
326 326 background-repeat: repeat-x;
327 327 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
328 328 background-image: -moz-linear-gradient(top, #003b76, #00376e);
329 329 background-image: -ms-linear-gradient(top, #003b76, #00376e);
330 330 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76),color-stop(100%, #00376e) );
331 331 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
332 332 background-image: -o-linear-gradient(top, #003b76, #00376e);
333 333 background-image: linear-gradient(to bottom, #003b76, #00376e);
334 334 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
335 335 margin: 0;
336 336 padding: 0;
337 337 display: block;
338 338 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
339 339 -webkit-border-radius: 0px 0px 4px 4px;
340 340 -khtml-border-radius: 0px 0px 4px 4px;
341 341 border-radius: 0px 0px 4px 4px;
342 342 }
343 343 #header #header-inner.hover {
344 344 width: 100% !important;
345 345 -webkit-border-radius: 0px 0px 0px 0px;
346 346 -khtml-border-radius: 0px 0px 0px 0px;
347 347 border-radius: 0px 0px 0px 0px;
348 348 position: fixed !important;
349 349 z-index: 10000;
350 350 }
351 351
352 352 .ie7 #header #header-inner.hover,
353 353 .ie8 #header #header-inner.hover,
354 354 .ie9 #header #header-inner.hover
355 355 {
356 356 z-index: auto !important;
357 357 }
358 358
359 359 .header-pos-fix, .anchor {
360 360 margin-top: -46px;
361 361 padding-top: 46px;
362 362 }
363 363
364 364 #header #header-inner #home a {
365 365 height: 40px;
366 366 width: 46px;
367 367 display: block;
368 368 background: url("../images/button_home.png");
369 369 background-position: 0 0;
370 370 margin: 0;
371 371 padding: 0;
372 372 }
373 373
374 374 #header #header-inner #home a:hover {
375 375 background-position: 0 -40px;
376 376 }
377 377
378 378 #header #header-inner #logo {
379 379 float: left;
380 380 position: absolute;
381 381 }
382 382
383 383 #header #header-inner #logo h1 {
384 384 color: #FFF;
385 385 font-size: 20px;
386 386 margin: 12px 0 0 13px;
387 387 padding: 0;
388 388 }
389 389
390 390 #header #header-inner #logo a {
391 391 color: #fff;
392 392 text-decoration: none;
393 393 }
394 394
395 395 #header #header-inner #logo a:hover {
396 396 color: #bfe3ff;
397 397 }
398 398
399 399 #header #header-inner #quick {
400 400 position: relative;
401 401 float: right;
402 402 list-style-type: none;
403 403 list-style-position: outside;
404 404 margin: 4px 8px 0 0;
405 405 padding: 0;
406 406 border-radius: 4px;
407 407 }
408 408
409 409 #header #header-inner #quick li span.short {
410 410 padding: 9px 6px 8px 6px;
411 411 }
412 412
413 413 #header #header-inner #quick li span {
414 414 display: inline;
415 415 margin: 0;
416 416 }
417 417
418 418 #header #header-inner #quick li span.normal {
419 419 border: none;
420 420 padding: 10px 12px 8px;
421 421 }
422 422
423 423 #header #header-inner #quick li span.icon {
424
425 424 border-left: none;
426 425 padding-left: 10px ;
427 426 }
428 427
429 428 #header #header-inner #quick li span.icon_short {
430 429 top: 0;
431 430 left: 0;
432 431 border-left: none;
433 432 border-right: 1px solid #2e5c89;
434 433 padding: 8px 6px 4px;
435 434 }
436 435
437 436 #header #header-inner #quick li span.icon img, #header #header-inner #quick li span.icon_short img {
438 437 vertical-align: middle;
439 438 margin-bottom: 2px;
440 439 }
441 440
442 441 #header #header-inner #quick ul.repo_switcher {
443 442 max-height: 275px;
444 443 overflow-x: hidden;
445 444 overflow-y: auto;
446 445 }
447 446
448 447 #header #header-inner #quick ul.repo_switcher li.qfilter_rs {
449 448 padding: 2px 3px;
450 449 padding-right: 17px;
451 450 }
452 451
453 452 #header #header-inner #quick ul.repo_switcher li.qfilter_rs input {
454 453 width: 100%;
455 454 border-radius: 10px;
456 455 padding: 2px 7px;
457 456 }
458 457
459 458 #header #header-inner #quick .repo_switcher_type {
460 459 position: absolute;
461 460 left: 0;
462 461 top: 9px;
463 462 margin: 0px 2px 0px 2px;
464 463 }
465 464
466 465 #header #header-inner #quick li ul li a.journal, #header #header-inner #quick li ul li a.journal:hover {
467 466 background-image: url("../images/icons/book.png");
468 467 }
469 468
470 469 #header #header-inner #quick li ul li a.private_repo, #header #header-inner #quick li ul li a.private_repo:hover {
471 470 background-image: url("../images/icons/lock.png")
472 471 }
473 472
474 473 #header #header-inner #quick li ul li a.public_repo, #header #header-inner #quick li ul li a.public_repo:hover {
475 474 background-image: url("../images/icons/lock_open.png");
476 475 }
477 476
478 477 #header #header-inner #quick li ul li a.hg, #header #header-inner #quick li ul li a.hg:hover {
479 478 background-image: url("../images/icons/hgicon.png");
480 479 padding-left: 42px;
481 480 background-position: 20px 9px;
482 481 }
483 482
484 483 #header #header-inner #quick li ul li a.git, #header #header-inner #quick li ul li a.git:hover {
485 484 background-image: url("../images/icons/giticon.png");
486 485 padding-left: 42px;
487 486 background-position: 20px 9px;
488 487 }
489 488
490 489 #header #header-inner #quick li ul li a.repos, #header #header-inner #quick li ul li a.repos:hover {
491 490 background-image: url("../images/icons/database_edit.png");
492 491 }
493 492
494 493 #header #header-inner #quick li ul li a.repos_groups, #header #header-inner #quick li ul li a.repos_groups:hover {
495 494 background-image: url("../images/icons/database_link.png");
496 495 }
497 496
498 497 #header #header-inner #quick li ul li a.users, #header #header-inner #quick li ul li a.users:hover {
499 498 background-image: url("../images/icons/user_edit.png");
500 499 }
501 500
502 501 #header #header-inner #quick li ul li a.groups, #header #header-inner #quick li ul li a.groups:hover {
503 502 background-image: url("../images/icons/group_edit.png");
504 503 }
505 504
506 505 #header #header-inner #quick li ul li a.defaults, #header #header-inner #quick li ul li a.defaults:hover {
507 506 background-image: url("../images/icons/wrench.png");
508 507 }
509 508
510 509 #header #header-inner #quick li ul li a.settings, #header #header-inner #quick li ul li a.settings:hover {
511 510 background-image: url("../images/icons/cog.png");
512 511 }
513 512
514 513 #header #header-inner #quick li ul li a.permissions, #header #header-inner #quick li ul li a.permissions:hover {
515 514 background-image: url("../images/icons/key.png");
516 515 }
517 516
518 517 #header #header-inner #quick li ul li a.ldap, #header #header-inner #quick li ul li a.ldap:hover {
519 518 background-image: url("../images/icons/server_key.png");
520 519 }
521 520
522 521 #header #header-inner #quick li ul li a.fork, #header #header-inner #quick li ul li a.fork:hover {
523 522 background-image: url("../images/icons/arrow_divide.png");
524 523 }
525 524
526 525 #header #header-inner #quick li ul li a.locking_add, #header #header-inner #quick li ul li a.locking_add:hover {
527 526 background-image: url("../images/icons/lock_add.png");
528 527 }
529 528
530 529 #header #header-inner #quick li ul li a.locking_del, #header #header-inner #quick li ul li a.locking_del:hover {
531 530 background-image: url("../images/icons/lock_delete.png");
532 531 }
533 532
534 533 #header #header-inner #quick li ul li a.pull_request, #header #header-inner #quick li ul li a.pull_request:hover {
535 534 background-image: url("../images/icons/arrow_join.png") ;
536 535 }
537 536
538 537 #header #header-inner #quick li ul li a.compare_request, #header #header-inner #quick li ul li a.compare_request:hover {
539 538 background-image: url("../images/icons/arrow_inout.png");
540 539 }
541 540
542 541 #header #header-inner #quick li ul li a.search, #header #header-inner #quick li ul li a.search:hover {
543 542 background-image: url("../images/icons/search_16.png");
544 543 }
545 544
546 545 #header #header-inner #quick li ul li a.shortlog, #header #header-inner #quick li ul li a.shortlog:hover {
547 546 background-image: url("../images/icons/clock_16.png");
548 547 }
549 548
550 549 #header #header-inner #quick li ul li a.delete, #header #header-inner #quick li ul li a.delete:hover {
551 550 background-image: url("../images/icons/delete.png");
552 551 }
553 552
554 553 #header #header-inner #quick li ul li a.branches, #header #header-inner #quick li ul li a.branches:hover {
555 554 background-image: url("../images/icons/arrow_branch.png");
556 555 }
557 556
558 557 #header #header-inner #quick li ul li a.tags,
559 558 #header #header-inner #quick li ul li a.tags:hover {
560 559 background: #FFF url("../images/icons/tag_blue.png") no-repeat 4px 9px;
561 560 width: 167px;
562 561 margin: 0;
563 562 padding: 12px 9px 7px 24px;
564 563 }
565 564
566 565 #header #header-inner #quick li ul li a.bookmarks,
567 566 #header #header-inner #quick li ul li a.bookmarks:hover {
568 567 background: #FFF url("../images/icons/tag_green.png") no-repeat 4px 9px;
569 568 width: 167px;
570 569 margin: 0;
571 570 padding: 12px 9px 7px 24px;
572 571 }
573 572
574 573 #header #header-inner #quick li ul li a.admin,
575 574 #header #header-inner #quick li ul li a.admin:hover {
576 575 background: #FFF url("../images/icons/cog_edit.png") no-repeat 4px 9px;
577 576 width: 167px;
578 577 margin: 0;
579 578 padding: 12px 9px 7px 24px;
580 579 }
581 580
582 581 .groups_breadcrumbs a {
583 582 color: #fff;
584 583 }
585 584
586 585 .groups_breadcrumbs a:hover {
587 586 color: #bfe3ff;
588 587 text-decoration: none;
589 588 }
590 589
591 590 td.quick_repo_menu {
592 591 background: #FFF url("../images/vertical-indicator.png") 8px 50% no-repeat !important;
593 592 cursor: pointer;
594 593 width: 8px;
595 594 border: 1px solid transparent;
596 595 }
597 596
598 597 td.quick_repo_menu.active {
599 598 background: url("../images/dt-arrow-dn.png") no-repeat scroll 5px 50% #FFFFFF !important;
600 599 border: 1px solid #003367;
601 600 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
602 601 cursor: pointer;
603 602 }
604 603
605 604 td.quick_repo_menu .menu_items {
606 605 margin-top: 10px;
607 606 margin-left: -6px;
608 607 width: 150px;
609 608 position: absolute;
610 609 background-color: #FFF;
611 610 background: none repeat scroll 0 0 #FFFFFF;
612 611 border-color: #003367 #666666 #666666;
613 612 border-right: 1px solid #666666;
614 613 border-style: solid;
615 614 border-width: 1px;
616 615 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
617 616 border-top-style: none;
618 617 }
619 618
620 619 td.quick_repo_menu .menu_items li {
621 620 padding: 0 !important;
622 621 }
623 622
624 623 td.quick_repo_menu .menu_items a {
625 624 display: block;
626 625 padding: 4px 12px 4px 8px;
627 626 }
628 627
629 628 td.quick_repo_menu .menu_items a:hover {
630 629 background-color: #EEE;
631 630 text-decoration: none;
632 631 }
633 632
634 633 td.quick_repo_menu .menu_items .icon img {
635 634 margin-bottom: -2px;
636 635 }
637 636
638 637 td.quick_repo_menu .menu_items.hidden {
639 638 display: none;
640 639 }
641 640
642 641 .yui-dt-first th {
643 642 text-align: left;
644 643 }
645 644
646 645 /*
647 646 Copyright (c) 2011, Yahoo! Inc. All rights reserved.
648 647 Code licensed under the BSD License:
649 648 http://developer.yahoo.com/yui/license.html
650 649 version: 2.9.0
651 650 */
652 651 .yui-skin-sam .yui-dt-mask {
653 652 position: absolute;
654 653 z-index: 9500;
655 654 }
656 655 .yui-dt-tmp {
657 656 position: absolute;
658 657 left: -9000px;
659 658 }
660 659 .yui-dt-scrollable .yui-dt-bd { overflow: auto }
661 660 .yui-dt-scrollable .yui-dt-hd {
662 661 overflow: hidden;
663 662 position: relative;
664 663 }
665 664 .yui-dt-scrollable .yui-dt-bd thead tr,
666 665 .yui-dt-scrollable .yui-dt-bd thead th {
667 666 position: absolute;
668 667 left: -1500px;
669 668 }
670 669 .yui-dt-scrollable tbody { -moz-outline: 0 }
671 670 .yui-skin-sam thead .yui-dt-sortable { cursor: pointer }
672 671 .yui-skin-sam thead .yui-dt-draggable { cursor: move }
673 672 .yui-dt-coltarget {
674 673 position: absolute;
675 674 z-index: 999;
676 675 }
677 676 .yui-dt-hd { zoom: 1 }
678 677 th.yui-dt-resizeable .yui-dt-resizerliner { position: relative }
679 678 .yui-dt-resizer {
680 679 position: absolute;
681 680 right: 0;
682 681 bottom: 0;
683 682 height: 100%;
684 683 cursor: e-resize;
685 684 cursor: col-resize;
686 685 background-color: #CCC;
687 686 opacity: 0;
688 687 filter: alpha(opacity=0);
689 688 }
690 689 .yui-dt-resizerproxy {
691 690 visibility: hidden;
692 691 position: absolute;
693 692 z-index: 9000;
694 693 background-color: #CCC;
695 694 opacity: 0;
696 695 filter: alpha(opacity=0);
697 696 }
698 697 th.yui-dt-hidden .yui-dt-liner,
699 698 td.yui-dt-hidden .yui-dt-liner,
700 699 th.yui-dt-hidden .yui-dt-resizer { display: none }
701 700 .yui-dt-editor,
702 701 .yui-dt-editor-shim {
703 702 position: absolute;
704 703 z-index: 9000;
705 704 }
706 705 .yui-skin-sam .yui-dt table {
707 706 margin: 0;
708 707 padding: 0;
709 708 font-family: arial;
710 709 font-size: inherit;
711 710 border-collapse: separate;
712 711 *border-collapse: collapse;
713 712 border-spacing: 0;
714 713 border: 1px solid #7f7f7f;
715 714 }
716 715 .yui-skin-sam .yui-dt thead { border-spacing: 0 }
717 716 .yui-skin-sam .yui-dt caption {
718 717 color: #000;
719 718 font-size: 85%;
720 719 font-weight: normal;
721 720 font-style: italic;
722 721 line-height: 1;
723 722 padding: 1em 0;
724 723 text-align: center;
725 724 }
726 725 .yui-skin-sam .yui-dt th { background: #d8d8da url(../images/sprite.png) repeat-x 0 0 }
727 726 .yui-skin-sam .yui-dt th,
728 727 .yui-skin-sam .yui-dt th a {
729 728 font-weight: normal;
730 729 text-decoration: none;
731 730 color: #000;
732 731 vertical-align: bottom;
733 732 }
734 733 .yui-skin-sam .yui-dt th {
735 734 margin: 0;
736 735 padding: 0;
737 736 border: 0;
738 737 border-right: 1px solid #cbcbcb;
739 738 }
740 739 .yui-skin-sam .yui-dt tr.yui-dt-first td { border-top: 1px solid #7f7f7f }
741 740 .yui-skin-sam .yui-dt th .yui-dt-liner { white-space: nowrap }
742 741 .yui-skin-sam .yui-dt-liner {
743 742 margin: 0;
744 743 padding: 0;
745 744 }
746 745 .yui-skin-sam .yui-dt-coltarget {
747 746 width: 5px;
748 747 background-color: red;
749 748 }
750 749 .yui-skin-sam .yui-dt td {
751 750 margin: 0;
752 751 padding: 0;
753 752 border: 0;
754 753 border-right: 1px solid #cbcbcb;
755 754 text-align: left;
756 755 }
757 756 .yui-skin-sam .yui-dt-list td { border-right: 0 }
758 757 .yui-skin-sam .yui-dt-resizer { width: 6px }
759 758 .yui-skin-sam .yui-dt-mask {
760 759 background-color: #000;
761 760 opacity: .25;
762 761 filter: alpha(opacity=25);
763 762 }
764 763 .yui-skin-sam .yui-dt-message { background-color: #FFF }
765 764 .yui-skin-sam .yui-dt-scrollable table { border: 0 }
766 765 .yui-skin-sam .yui-dt-scrollable .yui-dt-hd {
767 766 border-left: 1px solid #7f7f7f;
768 767 border-top: 1px solid #7f7f7f;
769 768 border-right: 1px solid #7f7f7f;
770 769 }
771 770 .yui-skin-sam .yui-dt-scrollable .yui-dt-bd {
772 771 border-left: 1px solid #7f7f7f;
773 772 border-bottom: 1px solid #7f7f7f;
774 773 border-right: 1px solid #7f7f7f;
775 774 background-color: #FFF;
776 775 }
777 776 .yui-skin-sam .yui-dt-scrollable .yui-dt-data tr.yui-dt-last td { border-bottom: 1px solid #7f7f7f }
778 777 .yui-skin-sam th.yui-dt-asc,
779 778 .yui-skin-sam th.yui-dt-desc { background: url(../images/sprite.png) repeat-x 0 -100px }
780 779 .yui-skin-sam th.yui-dt-sortable .yui-dt-label { margin-right: 10px }
781 780 .yui-skin-sam th.yui-dt-asc .yui-dt-liner { background: url(../images/dt-arrow-up.png) no-repeat right }
782 781 .yui-skin-sam th.yui-dt-desc .yui-dt-liner { background: url(../images/dt-arrow-dn.png) no-repeat right }
783 782 tbody .yui-dt-editable { cursor: pointer }
784 783 .yui-dt-editor {
785 784 text-align: left;
786 785 background-color: #f2f2f2;
787 786 border: 1px solid #808080;
788 787 padding: 6px;
789 788 }
790 789 .yui-dt-editor label {
791 790 padding-left: 4px;
792 791 padding-right: 6px;
793 792 }
794 793 .yui-dt-editor .yui-dt-button {
795 794 padding-top: 6px;
796 795 text-align: right;
797 796 }
798 797 .yui-dt-editor .yui-dt-button button {
799 798 background: url(../images/sprite.png) repeat-x 0 0;
800 799 border: 1px solid #999;
801 800 width: 4em;
802 801 height: 1.8em;
803 802 margin-left: 6px;
804 803 }
805 804 .yui-dt-editor .yui-dt-button button.yui-dt-default {
806 805 background: url(../images/sprite.png) repeat-x 0 -1400px;
807 806 background-color: #5584e0;
808 807 border: 1px solid #304369;
809 808 color: #FFF;
810 809 }
811 810 .yui-dt-editor .yui-dt-button button:hover {
812 811 background: url(../images/sprite.png) repeat-x 0 -1300px;
813 812 color: #000;
814 813 }
815 814 .yui-dt-editor .yui-dt-button button:active {
816 815 background: url(../images/sprite.png) repeat-x 0 -1700px;
817 816 color: #000;
818 817 }
819 818 .yui-skin-sam tr.yui-dt-even { background-color: #FFF }
820 819 .yui-skin-sam tr.yui-dt-odd { background-color: #edf5ff }
821 820 .yui-skin-sam tr.yui-dt-even td.yui-dt-asc,
822 821 .yui-skin-sam tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
823 822 .yui-skin-sam tr.yui-dt-odd td.yui-dt-asc,
824 823 .yui-skin-sam tr.yui-dt-odd td.yui-dt-desc { background-color: #dbeaff }
825 824 .yui-skin-sam .yui-dt-list tr.yui-dt-even { background-color: #FFF }
826 825 .yui-skin-sam .yui-dt-list tr.yui-dt-odd { background-color: #FFF }
827 826 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-asc,
828 827 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
829 828 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-asc,
830 829 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-desc { background-color: #edf5ff }
831 830 .yui-skin-sam th.yui-dt-highlighted,
832 831 .yui-skin-sam th.yui-dt-highlighted a { background-color: #b2d2ff }
833 832 .yui-skin-sam tr.yui-dt-highlighted,
834 833 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc,
835 834 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc,
836 835 .yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted,
837 836 .yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted {
838 837 cursor: pointer;
839 838 background-color: #b2d2ff;
840 839 }
841 840 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted,
842 841 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted a { background-color: #b2d2ff }
843 842 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted,
844 843 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-asc,
845 844 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc,
846 845 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-highlighted,
847 846 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-highlighted {
848 847 cursor: pointer;
849 848 background-color: #b2d2ff;
850 849 }
851 850 .yui-skin-sam th.yui-dt-selected,
852 851 .yui-skin-sam th.yui-dt-selected a { background-color: #446cd7 }
853 852 .yui-skin-sam tr.yui-dt-selected td,
854 853 .yui-skin-sam tr.yui-dt-selected td.yui-dt-asc,
855 854 .yui-skin-sam tr.yui-dt-selected td.yui-dt-desc {
856 855 background-color: #426fd9;
857 856 color: #FFF;
858 857 }
859 858 .yui-skin-sam tr.yui-dt-even td.yui-dt-selected,
860 859 .yui-skin-sam tr.yui-dt-odd td.yui-dt-selected {
861 860 background-color: #446cd7;
862 861 color: #FFF;
863 862 }
864 863 .yui-skin-sam .yui-dt-list th.yui-dt-selected,
865 864 .yui-skin-sam .yui-dt-list th.yui-dt-selected a { background-color: #446cd7 }
866 865 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td,
867 866 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-asc,
868 867 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-desc {
869 868 background-color: #426fd9;
870 869 color: #FFF;
871 870 }
872 871 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-selected,
873 872 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-selected {
874 873 background-color: #446cd7;
875 874 color: #FFF;
876 875 }
877 876 .yui-skin-sam .yui-dt-paginator {
878 877 display: block;
879 878 margin: 6px 0;
880 879 white-space: nowrap;
881 880 }
882 881 .yui-skin-sam .yui-dt-paginator .yui-dt-first,
883 882 .yui-skin-sam .yui-dt-paginator .yui-dt-last,
884 883 .yui-skin-sam .yui-dt-paginator .yui-dt-selected { padding: 2px 6px }
885 884 .yui-skin-sam .yui-dt-paginator a.yui-dt-first,
886 885 .yui-skin-sam .yui-dt-paginator a.yui-dt-last { text-decoration: none }
887 886 .yui-skin-sam .yui-dt-paginator .yui-dt-previous,
888 887 .yui-skin-sam .yui-dt-paginator .yui-dt-next { display: none }
889 888 .yui-skin-sam a.yui-dt-page {
890 889 border: 1px solid #cbcbcb;
891 890 padding: 2px 6px;
892 891 text-decoration: none;
893 892 background-color: #fff;
894 893 }
895 894 .yui-skin-sam .yui-dt-selected {
896 895 border: 1px solid #fff;
897 896 background-color: #fff;
898 897 }
899 898
900 899 #content #left {
901 900 left: 0;
902 901 width: 280px;
903 902 position: absolute;
904 903 }
905 904
906 905 #content #right {
907 906 margin: 0 60px 10px 290px;
908 907 }
909 908
910 909 #content div.box {
911 910 clear: both;
912 911 background: #fff;
913 912 margin: 0 0 10px;
914 913 padding: 0 0 10px;
915 914 -webkit-border-radius: 4px 4px 4px 4px;
916 915 -khtml-border-radius: 4px 4px 4px 4px;
917 916 border-radius: 4px 4px 4px 4px;
918 917 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
919 918 }
920 919
921 920 #content div.box-left {
922 921 width: 49%;
923 922 clear: none;
924 923 float: left;
925 924 margin: 0 0 10px;
926 925 }
927 926
928 927 #content div.box-right {
929 928 width: 49%;
930 929 clear: none;
931 930 float: right;
932 931 margin: 0 0 10px;
933 932 }
934 933
935 934 #content div.box div.title {
936 935 clear: both;
937 936 overflow: hidden;
938 937 background-color: #003B76;
939 938 background-repeat: repeat-x;
940 939 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
941 940 background-image: -moz-linear-gradient(top, #003b76, #00376e);
942 941 background-image: -ms-linear-gradient(top, #003b76, #00376e);
943 942 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
944 943 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
945 944 background-image: -o-linear-gradient(top, #003b76, #00376e);
946 945 background-image: linear-gradient(to bottom, #003b76, #00376e);
947 946 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
948 947 margin: 0 0 20px;
949 948 padding: 0;
950 949 border-radius: 4px 4px 0 0;
951 950 }
952 951
953 952 #content div.box div.title h5 {
954 953 float: left;
955 954 border: none;
956 955 color: #fff;
957 956 text-transform: uppercase;
958 957 margin: 0;
959 958 padding: 11px 0 11px 10px;
960 959 }
961 960
962 961 #content div.box div.title .link-white {
963 962 color: #FFFFFF;
964 963 }
965 964
966 965 #content div.box div.title .link-white.current {
967 966 color: #BFE3FF;
968 967 }
969 968
970 969 #content div.box div.title ul.links li {
971 970 list-style: none;
972 971 float: left;
973 972 margin: 0;
974 973 padding: 0;
975 974 }
976 975
977 976 #content div.box div.title ul.links li a {
978 977 border-left: 1px solid #316293;
979 978 color: #FFFFFF;
980 979 display: block;
981 980 float: left;
982 981 font-size: 13px;
983 982 font-weight: 700;
984 983 height: 1%;
985 984 margin: 0;
986 985 padding: 11px 22px 12px;
987 986 text-decoration: none;
988 987 }
989 988
990 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 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 991 clear: both;
993 992 overflow: hidden;
994 993 border-bottom: 1px solid #DDD;
995 994 margin: 10px 20px;
996 995 padding: 0 0 15px;
997 996 }
998 997
999 998 #content div.box p {
1000 999 color: #5f5f5f;
1001 1000 font-size: 12px;
1002 1001 line-height: 150%;
1003 1002 margin: 0 24px 10px;
1004 1003 padding: 0;
1005 1004 }
1006 1005
1007 1006 #content div.box blockquote {
1008 1007 border-left: 4px solid #DDD;
1009 1008 color: #5f5f5f;
1010 1009 font-size: 11px;
1011 1010 line-height: 150%;
1012 1011 margin: 0 34px;
1013 1012 padding: 0 0 0 14px;
1014 1013 }
1015 1014
1016 1015 #content div.box blockquote p {
1017 1016 margin: 10px 0;
1018 1017 padding: 0;
1019 1018 }
1020 1019
1021 1020 #content div.box dl {
1022 1021 margin: 10px 0px;
1023 1022 }
1024 1023
1025 1024 #content div.box dt {
1026 1025 font-size: 12px;
1027 1026 margin: 0;
1028 1027 }
1029 1028
1030 1029 #content div.box dd {
1031 1030 font-size: 12px;
1032 1031 margin: 0;
1033 1032 padding: 8px 0 8px 15px;
1034 1033 }
1035 1034
1036 1035 #content div.box li {
1037 1036 font-size: 12px;
1038 1037 padding: 4px 0;
1039 1038 }
1040 1039
1041 1040 #content div.box ul.disc, #content div.box ul.circle {
1042 1041 margin: 10px 24px 10px 38px;
1043 1042 }
1044 1043
1045 1044 #content div.box ul.square {
1046 1045 margin: 10px 24px 10px 40px;
1047 1046 }
1048 1047
1049 1048 #content div.box img.left {
1050 1049 border: none;
1051 1050 float: left;
1052 1051 margin: 10px 10px 10px 0;
1053 1052 }
1054 1053
1055 1054 #content div.box img.right {
1056 1055 border: none;
1057 1056 float: right;
1058 1057 margin: 10px 0 10px 10px;
1059 1058 }
1060 1059
1061 1060 #content div.box div.messages {
1062 1061 clear: both;
1063 1062 overflow: hidden;
1064 1063 margin: 0 20px;
1065 1064 padding: 0;
1066 1065 }
1067 1066
1068 1067 #content div.box div.message {
1069 1068 clear: both;
1070 1069 overflow: hidden;
1071 1070 margin: 0;
1072 1071 padding: 5px 0;
1073 1072 white-space: pre-wrap;
1074 1073 }
1075 1074 #content div.box div.expand {
1076 1075 width: 110%;
1077 1076 height: 14px;
1078 1077 font-size: 10px;
1079 1078 text-align: center;
1080 1079 cursor: pointer;
1081 1080 color: #666;
1082 1081
1083 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 1083 background: -webkit-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1085 1084 background: -moz-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1086 1085 background: -o-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1087 1086 background: -ms-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1088 1087 background: linear-gradient(to bottom,rgba(255,255,255,0),rgba(64,96,128,0.1));
1089 1088
1090 1089 display: none;
1091 1090 overflow: hidden;
1092 1091 }
1093 1092 #content div.box div.expand .expandtext {
1094 1093 background-color: #ffffff;
1095 1094 padding: 2px;
1096 1095 border-radius: 2px;
1097 1096 }
1098 1097
1099 1098 #content div.box div.message a {
1100 1099 font-weight: 400 !important;
1101 1100 }
1102 1101
1103 1102 #content div.box div.message div.image {
1104 1103 float: left;
1105 1104 margin: 9px 0 0 5px;
1106 1105 padding: 6px;
1107 1106 }
1108 1107
1109 1108 #content div.box div.message div.image img {
1110 1109 vertical-align: middle;
1111 1110 margin: 0;
1112 1111 }
1113 1112
1114 1113 #content div.box div.message div.text {
1115 1114 float: left;
1116 1115 margin: 0;
1117 1116 padding: 9px 6px;
1118 1117 }
1119 1118
1120 1119 #content div.box div.message div.dismiss a {
1121 1120 height: 16px;
1122 1121 width: 16px;
1123 1122 display: block;
1124 1123 background: url("../images/icons/cross.png") no-repeat;
1125 1124 margin: 15px 14px 0 0;
1126 1125 padding: 0;
1127 1126 }
1128 1127
1129 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 1129 border: none;
1131 1130 margin: 0;
1132 1131 padding: 0;
1133 1132 }
1134 1133
1135 1134 #content div.box div.message div.text span {
1136 1135 height: 1%;
1137 1136 display: block;
1138 1137 margin: 0;
1139 1138 padding: 5px 0 0;
1140 1139 }
1141 1140
1142 1141 #content div.box div.message-error {
1143 1142 height: 1%;
1144 1143 clear: both;
1145 1144 overflow: hidden;
1146 1145 background: #FBE3E4;
1147 1146 border: 1px solid #FBC2C4;
1148 1147 color: #860006;
1149 1148 }
1150 1149
1151 1150 #content div.box div.message-error h6 {
1152 1151 color: #860006;
1153 1152 }
1154 1153
1155 1154 #content div.box div.message-warning {
1156 1155 height: 1%;
1157 1156 clear: both;
1158 1157 overflow: hidden;
1159 1158 background: #FFF6BF;
1160 1159 border: 1px solid #FFD324;
1161 1160 color: #5f5200;
1162 1161 }
1163 1162
1164 1163 #content div.box div.message-warning h6 {
1165 1164 color: #5f5200;
1166 1165 }
1167 1166
1168 1167 #content div.box div.message-notice {
1169 1168 height: 1%;
1170 1169 clear: both;
1171 1170 overflow: hidden;
1172 1171 background: #8FBDE0;
1173 1172 border: 1px solid #6BACDE;
1174 1173 color: #003863;
1175 1174 }
1176 1175
1177 1176 #content div.box div.message-notice h6 {
1178 1177 color: #003863;
1179 1178 }
1180 1179
1181 1180 #content div.box div.message-success {
1182 1181 height: 1%;
1183 1182 clear: both;
1184 1183 overflow: hidden;
1185 1184 background: #E6EFC2;
1186 1185 border: 1px solid #C6D880;
1187 1186 color: #4e6100;
1188 1187 }
1189 1188
1190 1189 #content div.box div.message-success h6 {
1191 1190 color: #4e6100;
1192 1191 }
1193 1192
1194 1193 #content div.box div.form div.fields div.field {
1195 1194 height: 1%;
1196 1195 min-height: 12px;
1197 1196 border-bottom: 1px solid #DDD;
1198 1197 clear: both;
1199 1198 margin: 0;
1200 1199 padding: 10px 0;
1201 1200 }
1202 1201
1203 1202 #content div.box div.form div.fields div.field-first {
1204 1203 padding: 0 0 10px;
1205 1204 }
1206 1205
1207 1206 #content div.box div.form div.fields div.field-noborder {
1208 1207 border-bottom: 0 !important;
1209 1208 }
1210 1209
1211 1210 #content div.box div.form div.fields div.field span.error-message {
1212 1211 height: 1%;
1213 1212 display: inline-block;
1214 1213 color: red;
1215 1214 margin: 8px 0 0 4px;
1216 1215 padding: 0;
1217 1216 }
1218 1217
1219 1218 #content div.box div.form div.fields div.field span.success {
1220 1219 height: 1%;
1221 1220 display: block;
1222 1221 color: #316309;
1223 1222 margin: 8px 0 0;
1224 1223 padding: 0;
1225 1224 }
1226 1225
1227 1226 #content div.box div.form div.fields div.field div.label {
1228 1227 left: 70px;
1229 1228 width: 155px;
1230 1229 position: absolute;
1231 1230 margin: 0;
1232 1231 padding: 5px 0 0 0px;
1233 1232 }
1234 1233
1235 1234 #content div.box div.form div.fields div.field div.label-summary {
1236 1235 left: 30px;
1237 1236 width: 155px;
1238 1237 position: absolute;
1239 1238 margin: 0;
1240 1239 padding: 0px 0 0 0px;
1241 1240 }
1242 1241
1243 1242 #content div.box-left div.form div.fields div.field div.label,
1244 1243 #content div.box-right div.form div.fields div.field div.label,
1245 1244 #content div.box-left div.form div.fields div.field div.label,
1246 1245 #content div.box-left div.form div.fields div.field div.label-summary,
1247 1246 #content div.box-right div.form div.fields div.field div.label-summary,
1248 1247 #content div.box-left div.form div.fields div.field div.label-summary {
1249 1248 clear: both;
1250 1249 overflow: hidden;
1251 1250 left: 0;
1252 1251 width: auto;
1253 1252 position: relative;
1254 1253 margin: 0;
1255 1254 padding: 0 0 8px;
1256 1255 }
1257 1256
1258 1257 #content div.box div.form div.fields div.field div.label-select {
1259 1258 padding: 5px 0 0 5px;
1260 1259 }
1261 1260
1262 1261 #content div.box-left div.form div.fields div.field div.label-select,
1263 1262 #content div.box-right div.form div.fields div.field div.label-select {
1264 1263 padding: 0 0 8px;
1265 1264 }
1266 1265
1267 1266 #content div.box-left div.form div.fields div.field div.label-textarea,
1268 1267 #content div.box-right div.form div.fields div.field div.label-textarea {
1269 1268 padding: 0 0 8px !important;
1270 1269 }
1271 1270
1272 1271 #content div.box div.form div.fields div.field div.label label, div.label label {
1273 1272 color: #393939;
1274 1273 font-weight: 700;
1275 1274 }
1276 1275 #content div.box div.form div.fields div.field div.label label, div.label-summary label {
1277 1276 color: #393939;
1278 1277 font-weight: 700;
1279 1278 }
1280 1279 #content div.box div.form div.fields div.field div.input {
1281 1280 margin: 0 0 0 200px;
1282 1281 }
1283 1282
1284 1283 #content div.box div.form div.fields div.field div.input.summary {
1285 1284 margin: 0 0 0 110px;
1286 1285 }
1287 1286 #content div.box div.form div.fields div.field div.input.summary-short {
1288 1287 margin: 0 0 0 110px;
1289 1288 }
1290 1289 #content div.box div.form div.fields div.field div.file {
1291 1290 margin: 0 0 0 200px;
1292 1291 }
1293 1292
1294 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 1294 margin: 0 0 0 0px;
1296 1295 }
1297 1296
1298 1297 #content div.box div.form div.fields div.field div.input input,
1299 1298 .reviewer_ac input {
1300 1299 background: #FFF;
1301 1300 border-top: 1px solid #b3b3b3;
1302 1301 border-left: 1px solid #b3b3b3;
1303 1302 border-right: 1px solid #eaeaea;
1304 1303 border-bottom: 1px solid #eaeaea;
1305 1304 color: #000;
1306 1305 font-size: 11px;
1307 1306 margin: 0;
1308 1307 padding: 7px 7px 6px;
1309 1308 }
1310 1309
1311 1310 #content div.box div.form div.fields div.field div.input input#clone_url,
1312 1311 #content div.box div.form div.fields div.field div.input input#clone_url_id
1313 1312 {
1314 1313 font-size: 16px;
1315 1314 padding: 2px;
1316 1315 }
1317 1316
1318 1317 #content div.box div.form div.fields div.field div.file input {
1319 1318 background: none repeat scroll 0 0 #FFFFFF;
1320 1319 border-color: #B3B3B3 #EAEAEA #EAEAEA #B3B3B3;
1321 1320 border-style: solid;
1322 1321 border-width: 1px;
1323 1322 color: #000000;
1324 1323 font-size: 11px;
1325 1324 margin: 0;
1326 1325 padding: 7px 7px 6px;
1327 1326 }
1328 1327
1329 1328 input.disabled {
1330 1329 background-color: #F5F5F5 !important;
1331 1330 }
1332 1331 #content div.box div.form div.fields div.field div.input input.small {
1333 1332 width: 30%;
1334 1333 }
1335 1334
1336 1335 #content div.box div.form div.fields div.field div.input input.medium {
1337 1336 width: 55%;
1338 1337 }
1339 1338
1340 1339 #content div.box div.form div.fields div.field div.input input.large {
1341 1340 width: 85%;
1342 1341 }
1343 1342
1344 1343 #content div.box div.form div.fields div.field div.input input.date {
1345 1344 width: 177px;
1346 1345 }
1347 1346
1348 1347 #content div.box div.form div.fields div.field div.input input.button {
1349 1348 background: #D4D0C8;
1350 1349 border-top: 1px solid #FFF;
1351 1350 border-left: 1px solid #FFF;
1352 1351 border-right: 1px solid #404040;
1353 1352 border-bottom: 1px solid #404040;
1354 1353 color: #000;
1355 1354 margin: 0;
1356 1355 padding: 4px 8px;
1357 1356 }
1358 1357
1359 1358 #content div.box div.form div.fields div.field div.textarea {
1360 1359 border-top: 1px solid #b3b3b3;
1361 1360 border-left: 1px solid #b3b3b3;
1362 1361 border-right: 1px solid #eaeaea;
1363 1362 border-bottom: 1px solid #eaeaea;
1364 1363 margin: 0 0 0 200px;
1365 1364 padding: 10px;
1366 1365 }
1367 1366
1368 1367 #content div.box div.form div.fields div.field div.textarea-editor {
1369 1368 border: 1px solid #ddd;
1370 1369 padding: 0;
1371 1370 }
1372 1371
1373 1372 #content div.box div.form div.fields div.field div.textarea textarea {
1374 1373 width: 100%;
1375 1374 height: 220px;
1376 1375 overflow: hidden;
1377 1376 background: #FFF;
1378 1377 color: #000;
1379 1378 font-size: 11px;
1380 1379 outline: none;
1381 1380 border-width: 0;
1382 1381 margin: 0;
1383 1382 padding: 0;
1384 1383 }
1385 1384
1386 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 1386 width: 100%;
1388 1387 height: 100px;
1389 1388 }
1390 1389
1391 1390 #content div.box div.form div.fields div.field div.textarea table {
1392 1391 width: 100%;
1393 1392 border: none;
1394 1393 margin: 0;
1395 1394 padding: 0;
1396 1395 }
1397 1396
1398 1397 #content div.box div.form div.fields div.field div.textarea table td {
1399 1398 background: #DDD;
1400 1399 border: none;
1401 1400 padding: 0;
1402 1401 }
1403 1402
1404 1403 #content div.box div.form div.fields div.field div.textarea table td table {
1405 1404 width: auto;
1406 1405 border: none;
1407 1406 margin: 0;
1408 1407 padding: 0;
1409 1408 }
1410 1409
1411 1410 #content div.box div.form div.fields div.field div.textarea table td table td {
1412 1411 font-size: 11px;
1413 1412 padding: 5px 5px 5px 0;
1414 1413 }
1415 1414
1416 1415 #content div.box div.form div.fields div.field input[type=text]:focus,
1417 1416 #content div.box div.form div.fields div.field input[type=password]:focus,
1418 1417 #content div.box div.form div.fields div.field input[type=file]:focus,
1419 1418 #content div.box div.form div.fields div.field textarea:focus,
1420 1419 #content div.box div.form div.fields div.field select:focus,
1421 1420 .reviewer_ac input:focus {
1422 1421 background: #f6f6f6;
1423 1422 border-color: #666;
1424 1423 }
1425 1424
1426 1425 .reviewer_ac {
1427 1426 padding: 10px
1428 1427 }
1429 1428
1430 1429 div.form div.fields div.field div.button {
1431 1430 margin: 0;
1432 1431 padding: 0 0 0 8px;
1433 1432 }
1434 1433 #content div.box table.noborder {
1435 1434 border: 1px solid transparent;
1436 1435 }
1437 1436
1438 1437 #content div.box table {
1439 1438 width: 100%;
1440 1439 border-collapse: separate;
1441 1440 margin: 0;
1442 1441 padding: 0;
1443 1442 border: 1px solid #eee;
1444 1443 -webkit-border-radius: 4px;
1445 1444 border-radius: 4px;
1446 1445 }
1447 1446
1448 1447 #content div.box table th {
1449 1448 background: #eee;
1450 1449 border-bottom: 1px solid #ddd;
1451 1450 padding: 5px 0px 5px 5px;
1452 1451 text-align: left;
1453 1452 }
1454 1453
1455 1454 #content div.box table th.left {
1456 1455 text-align: left;
1457 1456 }
1458 1457
1459 1458 #content div.box table th.right {
1460 1459 text-align: right;
1461 1460 }
1462 1461
1463 1462 #content div.box table th.center {
1464 1463 text-align: center;
1465 1464 }
1466 1465
1467 1466 #content div.box table th.selected {
1468 1467 vertical-align: middle;
1469 1468 padding: 0;
1470 1469 }
1471 1470
1472 1471 #content div.box table td {
1473 1472 background: #fff;
1474 1473 border-bottom: 1px solid #cdcdcd;
1475 1474 vertical-align: middle;
1476 1475 padding: 5px;
1477 1476 }
1478 1477
1479 1478 #content div.box table tr.selected td {
1480 1479 background: #FFC;
1481 1480 }
1482 1481
1483 1482 #content div.box table td.selected {
1484 1483 width: 3%;
1485 1484 text-align: center;
1486 1485 vertical-align: middle;
1487 1486 padding: 0;
1488 1487 }
1489 1488
1490 1489 #content div.box table td.action {
1491 1490 width: 45%;
1492 1491 text-align: left;
1493 1492 }
1494 1493
1495 1494 #content div.box table td.date {
1496 1495 width: 33%;
1497 1496 text-align: center;
1498 1497 }
1499 1498
1500 1499 #content div.box div.action {
1501 1500 float: right;
1502 1501 background: #FFF;
1503 1502 text-align: right;
1504 1503 margin: 10px 0 0;
1505 1504 padding: 0;
1506 1505 }
1507 1506
1508 1507 #content div.box div.action select {
1509 1508 font-size: 11px;
1510 1509 margin: 0;
1511 1510 }
1512 1511
1513 1512 #content div.box div.action .ui-selectmenu {
1514 1513 margin: 0;
1515 1514 padding: 0;
1516 1515 }
1517 1516
1518 1517 #content div.box div.pagination {
1519 1518 height: 1%;
1520 1519 clear: both;
1521 1520 overflow: hidden;
1522 1521 margin: 10px 0 0;
1523 1522 padding: 0;
1524 1523 }
1525 1524
1526 1525 #content div.box div.pagination ul.pager {
1527 1526 float: right;
1528 1527 text-align: right;
1529 1528 margin: 0;
1530 1529 padding: 0;
1531 1530 }
1532 1531
1533 1532 #content div.box div.pagination ul.pager li {
1534 1533 height: 1%;
1535 1534 float: left;
1536 1535 list-style: none;
1537 1536 background: #ebebeb url("../images/pager.png") repeat-x;
1538 1537 border-top: 1px solid #dedede;
1539 1538 border-left: 1px solid #cfcfcf;
1540 1539 border-right: 1px solid #c4c4c4;
1541 1540 border-bottom: 1px solid #c4c4c4;
1542 1541 color: #4A4A4A;
1543 1542 font-weight: 700;
1544 1543 margin: 0 0 0 4px;
1545 1544 padding: 0;
1546 1545 }
1547 1546
1548 1547 #content div.box div.pagination ul.pager li.separator {
1549 1548 padding: 6px;
1550 1549 }
1551 1550
1552 1551 #content div.box div.pagination ul.pager li.current {
1553 1552 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1554 1553 border-top: 1px solid #ccc;
1555 1554 border-left: 1px solid #bebebe;
1556 1555 border-right: 1px solid #b1b1b1;
1557 1556 border-bottom: 1px solid #afafaf;
1558 1557 color: #515151;
1559 1558 padding: 6px;
1560 1559 }
1561 1560
1562 1561 #content div.box div.pagination ul.pager li a {
1563 1562 height: 1%;
1564 1563 display: block;
1565 1564 float: left;
1566 1565 color: #515151;
1567 1566 text-decoration: none;
1568 1567 margin: 0;
1569 1568 padding: 6px;
1570 1569 }
1571 1570
1572 1571 #content div.box div.pagination ul.pager li a:hover, #content div.box div.pagination ul.pager li a:active {
1573 1572 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1574 1573 border-top: 1px solid #ccc;
1575 1574 border-left: 1px solid #bebebe;
1576 1575 border-right: 1px solid #b1b1b1;
1577 1576 border-bottom: 1px solid #afafaf;
1578 1577 margin: -1px;
1579 1578 }
1580 1579
1581 1580 #content div.box div.pagination-wh {
1582 1581 height: 1%;
1583 1582 clear: both;
1584 1583 overflow: hidden;
1585 1584 text-align: right;
1586 1585 margin: 10px 0 0;
1587 1586 padding: 0;
1588 1587 }
1589 1588
1590 1589 #content div.box div.pagination-right {
1591 1590 float: right;
1592 1591 }
1593 1592
1594 1593 #content div.box div.pagination-wh a,
1595 1594 #content div.box div.pagination-wh span.pager_dotdot,
1596 1595 #content div.box div.pagination-wh span.yui-pg-previous,
1597 1596 #content div.box div.pagination-wh span.yui-pg-last,
1598 1597 #content div.box div.pagination-wh span.yui-pg-next,
1599 1598 #content div.box div.pagination-wh span.yui-pg-first {
1600 1599 height: 1%;
1601 1600 float: left;
1602 1601 background: #ebebeb url("../images/pager.png") repeat-x;
1603 1602 border-top: 1px solid #dedede;
1604 1603 border-left: 1px solid #cfcfcf;
1605 1604 border-right: 1px solid #c4c4c4;
1606 1605 border-bottom: 1px solid #c4c4c4;
1607 1606 color: #4A4A4A;
1608 1607 font-weight: 700;
1609 1608 margin: 0 0 0 4px;
1610 1609 padding: 6px;
1611 1610 }
1612 1611
1613 1612 #content div.box div.pagination-wh span.pager_curpage {
1614 1613 height: 1%;
1615 1614 float: left;
1616 1615 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1617 1616 border-top: 1px solid #ccc;
1618 1617 border-left: 1px solid #bebebe;
1619 1618 border-right: 1px solid #b1b1b1;
1620 1619 border-bottom: 1px solid #afafaf;
1621 1620 color: #515151;
1622 1621 font-weight: 700;
1623 1622 margin: 0 0 0 4px;
1624 1623 padding: 6px;
1625 1624 }
1626 1625
1627 1626 #content div.box div.pagination-wh a:hover, #content div.box div.pagination-wh a:active {
1628 1627 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1629 1628 border-top: 1px solid #ccc;
1630 1629 border-left: 1px solid #bebebe;
1631 1630 border-right: 1px solid #b1b1b1;
1632 1631 border-bottom: 1px solid #afafaf;
1633 1632 text-decoration: none;
1634 1633 }
1635 1634
1636 1635 #content div.box div.traffic div.legend {
1637 1636 clear: both;
1638 1637 overflow: hidden;
1639 1638 border-bottom: 1px solid #ddd;
1640 1639 margin: 0 0 10px;
1641 1640 padding: 0 0 10px;
1642 1641 }
1643 1642
1644 1643 #content div.box div.traffic div.legend h6 {
1645 1644 float: left;
1646 1645 border: none;
1647 1646 margin: 0;
1648 1647 padding: 0;
1649 1648 }
1650 1649
1651 1650 #content div.box div.traffic div.legend li {
1652 1651 list-style: none;
1653 1652 float: left;
1654 1653 font-size: 11px;
1655 1654 margin: 0;
1656 1655 padding: 0 8px 0 4px;
1657 1656 }
1658 1657
1659 1658 #content div.box div.traffic div.legend li.visits {
1660 1659 border-left: 12px solid #edc240;
1661 1660 }
1662 1661
1663 1662 #content div.box div.traffic div.legend li.pageviews {
1664 1663 border-left: 12px solid #afd8f8;
1665 1664 }
1666 1665
1667 1666 #content div.box div.traffic table {
1668 1667 width: auto;
1669 1668 }
1670 1669
1671 1670 #content div.box div.traffic table td {
1672 1671 background: transparent;
1673 1672 border: none;
1674 1673 padding: 2px 3px 3px;
1675 1674 }
1676 1675
1677 1676 #content div.box div.traffic table td.legendLabel {
1678 1677 padding: 0 3px 2px;
1679 1678 }
1680 1679
1681 1680 #content div.box #summary {
1682 1681 margin-right: 200px;
1683 1682 }
1684 1683
1685 1684 #summary-menu-stats {
1686 1685 float: left;
1687 1686 width: 180px;
1688 1687 position: absolute;
1689 1688 top: 0;
1690 1689 right: 0;
1691 1690 }
1692 1691
1693 1692 #summary-menu-stats ul {
1694 1693 margin: 0 10px;
1695 1694 display: block;
1696 1695 background-color: #f9f9f9;
1697 1696 border: 1px solid #d1d1d1;
1698 1697 border-radius: 4px;
1699 1698 }
1700 1699
1701 1700 #content #summary-menu-stats li {
1702 1701 border-top: 1px solid #d1d1d1;
1703 1702 padding: 0;
1704 1703 }
1705 1704
1706 1705 #content #summary-menu-stats li:hover {
1707 1706 background: #f0f0f0;
1708 1707 }
1709 1708
1710 1709 #content #summary-menu-stats li:first-child {
1711 1710 border-top: none;
1712 1711 }
1713 1712
1714 1713 #summary-menu-stats a.followers { background-image: url('../images/icons/heart.png')}
1715 1714 #summary-menu-stats a.forks { background-image: url('../images/icons/arrow_divide.png')}
1716 1715 #summary-menu-stats a.settings { background-image: url('../images/icons/cog_edit.png')}
1717 1716 #summary-menu-stats a.feed { background-image: url('../images/icons/rss_16.png')}
1718 1717 #summary-menu-stats a.repo-size { background-image: url('../images/icons/server.png')}
1719 1718
1720 1719 #summary-menu-stats a {
1721 1720 display: block;
1722 1721 padding: 12px 30px;
1723 1722 background-repeat: no-repeat;
1724 1723 background-position: 10px 50%;
1725 1724 padding-right: 10px;
1726 1725 }
1727 1726
1728
1729 1727 #repo_size_2 {
1730 1728 margin-left: 30px;
1731 1729 display: block;
1732 1730 padding-right: 10px;
1733 1731 padding-bottom: 7px;
1734 1732 }
1735 1733
1736 1734 #summary-menu-stats a:hover {
1737 1735 text-decoration: none;
1738 1736 }
1739 1737
1740 1738 #summary-menu-stats a span {
1741 1739 background-color: #DEDEDE;
1742 1740 color: 888 !important;
1743 1741 border-radius: 4px;
1744 1742 padding: 2px 4px;
1745 1743 font-size: 10px;
1746 1744 }
1747 1745
1748 1746 #summary .metatag {
1749 1747 display: inline-block;
1750 1748 padding: 3px 5px;
1751 1749 margin-bottom: 3px;
1752 1750 margin-right: 1px;
1753 1751 border-radius: 5px;
1754 1752 }
1755 1753
1756 1754 #content div.box #summary p {
1757 1755 margin-bottom: -5px;
1758 1756 width: 600px;
1759 1757 white-space: pre-wrap;
1760 1758 }
1761 1759
1762 1760 #content div.box #summary p:last-child {
1763 1761 margin-bottom: 9px;
1764 1762 }
1765 1763
1766 1764 #content div.box #summary p:first-of-type {
1767 1765 margin-top: 9px;
1768 1766 }
1769 1767
1770 1768 .metatag {
1771 1769 display: inline-block;
1772 1770 margin-right: 1px;
1773 1771 -webkit-border-radius: 4px 4px 4px 4px;
1774 1772 -khtml-border-radius: 4px 4px 4px 4px;
1775 1773 border-radius: 4px 4px 4px 4px;
1776 1774
1777 1775 border: solid 1px #9CF;
1778 1776 padding: 2px 3px 2px 3px !important;
1779 1777 background-color: #DEF;
1780 1778 }
1781 1779
1782 1780 .metatag[tag="dead"] {
1783 1781 background-color: #E44;
1784 1782 }
1785 1783
1786 1784 .metatag[tag="stale"] {
1787 1785 background-color: #EA4;
1788 1786 }
1789 1787
1790 1788 .metatag[tag="featured"] {
1791 1789 background-color: #AEA;
1792 1790 }
1793 1791
1794 1792 .metatag[tag="requires"] {
1795 1793 background-color: #9CF;
1796 1794 }
1797 1795
1798 1796 .metatag[tag="recommends"] {
1799 1797 background-color: #BDF;
1800 1798 }
1801 1799
1802 1800 .metatag[tag="lang"] {
1803 1801 background-color: #FAF474;
1804 1802 }
1805 1803
1806 1804 .metatag[tag="license"] {
1807 1805 border: solid 1px #9CF;
1808 1806 background-color: #DEF;
1809 1807 target-new: tab !important;
1810 1808 }
1811 1809 .metatag[tag="see"] {
1812 1810 border: solid 1px #CBD;
1813 1811 background-color: #EDF;
1814 1812 }
1815 1813
1816 1814 a.metatag[tag="license"]:hover {
1817 1815 background-color: #003367;
1818 1816 color: #FFF;
1819 1817 text-decoration: none;
1820 1818 }
1821 1819
1822 1820 #summary .desc {
1823 1821 white-space: pre;
1824 1822 width: 100%;
1825 1823 }
1826 1824
1827 1825 #summary .repo_name {
1828 1826 font-size: 1.6em;
1829 1827 font-weight: bold;
1830 1828 vertical-align: baseline;
1831 1829 clear: right
1832 1830 }
1833 1831
1834 1832 #footer {
1835 1833 clear: both;
1836 1834 overflow: hidden;
1837 1835 text-align: right;
1838 1836 margin: 0;
1839 1837 padding: 0 10px 4px;
1840 1838 margin: -10px 0 0;
1841 1839 }
1842 1840
1843 1841 #footer div#footer-inner {
1844 1842 background-color: #003B76;
1845 1843 background-repeat: repeat-x;
1846 1844 background-image: -khtml-gradient( linear, left top, left bottom, from(#003B76), to(#00376E));
1847 1845 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1848 1846 background-image: -ms-linear-gradient( top, #003b76, #00376e);
1849 1847 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1850 1848 background-image: -webkit-linear-gradient( top, #003b76, #00376e));
1851 1849 background-image: -o-linear-gradient( top, #003b76, #00376e));
1852 1850 background-image: linear-gradient(to bottom, #003b76, #00376e);
1853 1851 filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#003b76', endColorstr = '#00376e', GradientType = 0);
1854 1852 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1855 1853 -webkit-border-radius: 4px 4px 4px 4px;
1856 1854 -khtml-border-radius: 4px 4px 4px 4px;
1857 1855 border-radius: 4px 4px 4px 4px;
1858 1856 }
1859 1857
1860 1858 #footer div#footer-inner p {
1861 1859 padding: 15px 25px 15px 0;
1862 1860 color: #FFF;
1863 1861 font-weight: 700;
1864 1862 }
1865 1863
1866 1864 #footer div#footer-inner .footer-link {
1867 1865 float: left;
1868 1866 padding-left: 10px;
1869 1867 }
1870 1868
1871 1869 #footer div#footer-inner .footer-link a, #footer div#footer-inner .footer-link-right a {
1872 1870 color: #FFF;
1873 1871 }
1874 1872
1875 1873 #login div.title {
1876 1874 clear: both;
1877 1875 overflow: hidden;
1878 1876 position: relative;
1879 1877 background-color: #003B76;
1880 1878 background-repeat: repeat-x;
1881 1879 background-image: -khtml-gradient( linear, left top, left bottom, from(#003B76), to(#00376E));
1882 1880 background-image: -moz-linear-gradient( top, #003b76, #00376e);
1883 1881 background-image: -ms-linear-gradient( top, #003b76, #00376e);
1884 1882 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1885 1883 background-image: -webkit-linear-gradient( top, #003b76, #00376e));
1886 1884 background-image: -o-linear-gradient( top, #003b76, #00376e));
1887 1885 background-image: linear-gradient(to bottom, #003b76, #00376e);
1888 1886 filter: progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#003b76', endColorstr = '#00376e', GradientType = 0);
1889 1887 margin: 0 auto;
1890 1888 padding: 0;
1891 1889 }
1892 1890
1893 1891 #login div.inner {
1894 1892 background: #FFF url("../images/login.png") no-repeat top left;
1895 1893 border-top: none;
1896 1894 border-bottom: none;
1897 1895 margin: 0 auto;
1898 1896 padding: 20px;
1899 1897 }
1900 1898
1901 1899 #login div.form div.fields div.field div.label {
1902 1900 width: 173px;
1903 1901 float: left;
1904 1902 text-align: right;
1905 1903 margin: 2px 10px 0 0;
1906 1904 padding: 5px 0 0 5px;
1907 1905 }
1908 1906
1909 1907 #login div.form div.fields div.field div.input input {
1910 1908 background: #FFF;
1911 1909 border-top: 1px solid #b3b3b3;
1912 1910 border-left: 1px solid #b3b3b3;
1913 1911 border-right: 1px solid #eaeaea;
1914 1912 border-bottom: 1px solid #eaeaea;
1915 1913 color: #000;
1916 1914 font-size: 11px;
1917 1915 margin: 0;
1918 1916 padding: 7px 7px 6px;
1919 1917 }
1920 1918
1921 1919 #login div.form div.fields div.buttons {
1922 1920 clear: both;
1923 1921 overflow: hidden;
1924 1922 border-top: 1px solid #DDD;
1925 1923 text-align: right;
1926 1924 margin: 0;
1927 1925 padding: 10px 0 0;
1928 1926 }
1929 1927
1930 1928 #login div.form div.links {
1931 1929 clear: both;
1932 1930 overflow: hidden;
1933 1931 margin: 10px 0 0;
1934 1932 padding: 0 0 2px;
1935 1933 }
1936 1934
1937 1935 .user-menu {
1938 1936 margin: 0px !important;
1939 1937 float: left;
1940 1938 }
1941 1939
1942 1940 .user-menu .container {
1943 1941 padding: 0px 4px 0px 4px;
1944 1942 margin: 0px 0px 0px 0px;
1945 1943 }
1946 1944
1947 1945 .user-menu .gravatar {
1948 1946 margin: 0px 0px 0px 0px;
1949 1947 cursor: pointer;
1950 1948 }
1951 1949 .user-menu .gravatar.enabled {
1952 1950 background-color: #FDF784 !important;
1953 1951 }
1954 1952 .user-menu .gravatar:hover {
1955 1953 background-color: #FDF784 !important;
1956 1954 }
1957 1955 #quick_login {
1958 1956 min-height: 80px;
1959 1957 padding: 4px;
1960 1958 position: absolute;
1961 1959 right: 0;
1962 1960 background-color: #003B76;
1963 1961 background-repeat: repeat-x;
1964 1962 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
1965 1963 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1966 1964 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1967 1965 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1968 1966 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1969 1967 background-image: -o-linear-gradient(top, #003b76, #00376e);
1970 1968 background-image: linear-gradient(to bottom, #003b76, #00376e);
1971 1969 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
1972 1970
1973 1971 z-index: 999;
1974 1972 -webkit-border-radius: 0px 0px 4px 4px;
1975 1973 -khtml-border-radius: 0px 0px 4px 4px;
1976 1974 border-radius: 0px 0px 4px 4px;
1977 1975 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1978 1976
1979 1977 overflow: hidden;
1980 1978 }
1981 1979 #quick_login h4 {
1982 1980 color: #fff;
1983 1981 padding: 5px 0px 5px 14px;
1984 1982 }
1985 1983
1986 1984 #quick_login .password_forgoten {
1987 1985 padding-right: 0px;
1988 1986 padding-top: 0px;
1989 1987 text-align: left;
1990 1988 }
1991 1989
1992 1990 #quick_login .password_forgoten a {
1993 1991 font-size: 10px;
1994 1992 color: #fff;
1995 1993 padding: 0px !important;
1996 1994 line-height: 20px !important;
1997 1995 }
1998 1996
1999 1997 #quick_login .register {
2000 1998 padding-right: 10px;
2001 1999 padding-top: 5px;
2002 2000 text-align: left;
2003 2001 }
2004 2002
2005 2003 #quick_login .register a {
2006 2004 font-size: 10px;
2007 2005 color: #fff;
2008 2006 padding: 0px !important;
2009 2007 line-height: 20px !important;
2010 2008 }
2011 2009
2012 2010 #quick_login .submit {
2013 2011 margin: -20px 0 0 0px;
2014 2012 position: absolute;
2015 2013 right: 15px;
2016 2014 }
2017 2015
2018 2016 #quick_login .links_left {
2019 2017 float: left;
2020 2018 margin-right: 120px;
2021 2019 }
2022 2020 #quick_login .links_right {
2023 2021 width: 120px;
2024 2022 position: absolute;
2025 2023 right: 0;
2026 2024 }
2027 2025 #quick_login .full_name {
2028 2026 color: #FFFFFF;
2029 2027 font-weight: bold;
2030 2028 padding: 3px 3px 3px 6px;
2031 2029 }
2032 2030 #quick_login .big_gravatar {
2033 2031 padding: 4px 0px 0px 6px;
2034 2032 }
2035 2033 #quick_login .notifications {
2036 2034 padding: 2px 0px 0px 6px;
2037 2035 color: #FFFFFF;
2038 2036 font-weight: bold;
2039 2037 line-height: 10px !important;
2040 2038 }
2041 2039 #quick_login .notifications a,
2042 2040 #quick_login .unread a {
2043 2041 color: #FFFFFF;
2044 2042 display: block;
2045 2043 padding: 0px !important;
2046 2044 }
2047 2045 #quick_login .notifications a:hover,
2048 2046 #quick_login .unread a:hover {
2049 2047 background-color: inherit !important;
2050 2048 }
2051 2049 #quick_login .email, #quick_login .unread {
2052 2050 color: #FFFFFF;
2053 2051 padding: 3px 3px 3px 6px;
2054 2052 }
2055 2053 #quick_login .links .logout {
2056 2054 }
2057 2055
2058 2056 #quick_login div.form div.fields {
2059 2057 padding-top: 2px;
2060 2058 padding-left: 10px;
2061 2059 }
2062 2060
2063 2061 #quick_login div.form div.fields div.field {
2064 2062 padding: 5px;
2065 2063 }
2066 2064
2067 2065 #quick_login div.form div.fields div.field div.label label {
2068 2066 color: #fff;
2069 2067 padding-bottom: 3px;
2070 2068 }
2071 2069
2072 2070 #quick_login div.form div.fields div.field div.input input {
2073 2071 width: 236px;
2074 2072 background: #FFF;
2075 2073 border-top: 1px solid #b3b3b3;
2076 2074 border-left: 1px solid #b3b3b3;
2077 2075 border-right: 1px solid #eaeaea;
2078 2076 border-bottom: 1px solid #eaeaea;
2079 2077 color: #000;
2080 2078 font-size: 11px;
2081 2079 margin: 0;
2082 2080 padding: 5px 7px 4px;
2083 2081 }
2084 2082
2085 2083 #quick_login div.form div.fields div.buttons {
2086 2084 clear: both;
2087 2085 overflow: hidden;
2088 2086 text-align: right;
2089 2087 margin: 0;
2090 2088 padding: 5px 14px 0px 5px;
2091 2089 }
2092 2090
2093 2091 #quick_login div.form div.links {
2094 2092 clear: both;
2095 2093 overflow: hidden;
2096 2094 margin: 10px 0 0;
2097 2095 padding: 0 0 2px;
2098 2096 }
2099 2097
2100 2098 #quick_login ol.links {
2101 2099 display: block;
2102 2100 font-weight: bold;
2103 2101 list-style: none outside none;
2104 2102 text-align: right;
2105 2103 }
2106 2104 #quick_login ol.links li {
2107 2105 line-height: 27px;
2108 2106 margin: 0;
2109 2107 padding: 0;
2110 2108 color: #fff;
2111 2109 display: block;
2112 2110 float: none !important;
2113 2111 }
2114 2112
2115 2113 #quick_login ol.links li a {
2116 2114 color: #fff;
2117 2115 display: block;
2118 2116 padding: 2px;
2119 2117 }
2120 2118 #quick_login ol.links li a:HOVER {
2121 2119 background-color: inherit !important;
2122 2120 }
2123 2121
2124 2122 #register div.title {
2125 2123 clear: both;
2126 2124 overflow: hidden;
2127 2125 position: relative;
2128 2126 background-color: #003B76;
2129 2127 background-repeat: repeat-x;
2130 2128 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
2131 2129 background-image: -moz-linear-gradient(top, #003b76, #00376e);
2132 2130 background-image: -ms-linear-gradient(top, #003b76, #00376e);
2133 2131 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
2134 2132 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
2135 2133 background-image: -o-linear-gradient(top, #003b76, #00376e);
2136 2134 background-image: linear-gradient(to bottom, #003b76, #00376e);
2137 2135 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
2138 2136 endColorstr='#00376e', GradientType=0 );
2139 2137 margin: 0 auto;
2140 2138 padding: 0;
2141 2139 }
2142 2140
2143 2141 #register div.inner {
2144 2142 background: #FFF;
2145 2143 border-top: none;
2146 2144 border-bottom: none;
2147 2145 margin: 0 auto;
2148 2146 padding: 20px;
2149 2147 }
2150 2148
2151 2149 #register div.form div.fields div.field div.label {
2152 2150 width: 135px;
2153 2151 float: left;
2154 2152 text-align: right;
2155 2153 margin: 2px 10px 0 0;
2156 2154 padding: 5px 0 0 5px;
2157 2155 }
2158 2156
2159 2157 #register div.form div.fields div.field div.input input {
2160 2158 width: 300px;
2161 2159 background: #FFF;
2162 2160 border-top: 1px solid #b3b3b3;
2163 2161 border-left: 1px solid #b3b3b3;
2164 2162 border-right: 1px solid #eaeaea;
2165 2163 border-bottom: 1px solid #eaeaea;
2166 2164 color: #000;
2167 2165 font-size: 11px;
2168 2166 margin: 0;
2169 2167 padding: 7px 7px 6px;
2170 2168 }
2171 2169
2172 2170 #register div.form div.fields div.buttons {
2173 2171 clear: both;
2174 2172 overflow: hidden;
2175 2173 border-top: 1px solid #DDD;
2176 2174 text-align: left;
2177 2175 margin: 0;
2178 2176 padding: 10px 0 0 150px;
2179 2177 }
2180 2178
2181 2179 #register div.form div.activation_msg {
2182 2180 padding-top: 4px;
2183 2181 padding-bottom: 4px;
2184 2182 }
2185 2183
2186 2184 #journal .journal_day {
2187 2185 font-size: 20px;
2188 2186 padding: 10px 0px;
2189 2187 border-bottom: 2px solid #DDD;
2190 2188 margin-left: 10px;
2191 2189 margin-right: 10px;
2192 2190 }
2193 2191
2194 2192 #journal .journal_container {
2195 2193 padding: 5px;
2196 2194 clear: both;
2197 2195 margin: 0px 5px 0px 10px;
2198 2196 }
2199 2197
2200 2198 #journal .journal_action_container {
2201 2199 padding-left: 38px;
2202 2200 }
2203 2201
2204 2202 #journal .journal_user {
2205 2203 color: #747474;
2206 2204 font-size: 14px;
2207 2205 font-weight: bold;
2208 2206 height: 30px;
2209 2207 }
2210 2208
2211 2209 #journal .journal_user.deleted {
2212 2210 color: #747474;
2213 2211 font-size: 14px;
2214 2212 font-weight: normal;
2215 2213 height: 30px;
2216 2214 font-style: italic;
2217 2215 }
2218 2216
2219 2217
2220 2218 #journal .journal_icon {
2221 2219 clear: both;
2222 2220 float: left;
2223 2221 padding-right: 4px;
2224 2222 padding-top: 3px;
2225 2223 }
2226 2224
2227 2225 #journal .journal_action {
2228 2226 padding-top: 4px;
2229 2227 min-height: 2px;
2230 2228 float: left
2231 2229 }
2232 2230
2233 2231 #journal .journal_action_params {
2234 2232 clear: left;
2235 2233 padding-left: 22px;
2236 2234 }
2237 2235
2238 2236 #journal .journal_repo {
2239 2237 float: left;
2240 2238 margin-left: 6px;
2241 2239 padding-top: 3px;
2242 2240 }
2243 2241
2244 2242 #journal .date {
2245 2243 clear: both;
2246 2244 color: #777777;
2247 2245 font-size: 11px;
2248 2246 padding-left: 22px;
2249 2247 }
2250 2248
2251 2249 #journal .journal_repo .journal_repo_name {
2252 2250 font-weight: bold;
2253 2251 font-size: 1.1em;
2254 2252 }
2255 2253
2256 2254 #journal .compare_view {
2257 2255 padding: 5px 0px 5px 0px;
2258 2256 width: 95px;
2259 2257 }
2260 2258
2261 2259 .journal_highlight {
2262 2260 font-weight: bold;
2263 2261 padding: 0 2px;
2264 2262 vertical-align: bottom;
2265 2263 }
2266 2264
2267 2265 .trending_language_tbl, .trending_language_tbl td {
2268 2266 border: 0 !important;
2269 2267 margin: 0 !important;
2270 2268 padding: 0 !important;
2271 2269 }
2272 2270
2273 2271 .trending_language_tbl, .trending_language_tbl tr {
2274 2272 border-spacing: 1px;
2275 2273 }
2276 2274
2277 2275 .trending_language {
2278 2276 background-color: #003367;
2279 2277 color: #FFF;
2280 2278 display: block;
2281 2279 min-width: 20px;
2282 2280 text-decoration: none;
2283 2281 height: 12px;
2284 2282 margin-bottom: 0px;
2285 2283 margin-left: 5px;
2286 2284 white-space: pre;
2287 2285 padding: 3px;
2288 2286 }
2289 2287
2290 2288 h3.files_location {
2291 2289 font-size: 1.8em;
2292 2290 font-weight: 700;
2293 2291 border-bottom: none !important;
2294 2292 margin: 10px 0 !important;
2295 2293 }
2296 2294
2297 2295 #files_data dl dt {
2298 2296 float: left;
2299 2297 width: 60px;
2300 2298 margin: 0 !important;
2301 2299 padding: 5px;
2302 2300 }
2303 2301
2304 2302 #files_data dl dd {
2305 2303 margin: 0 !important;
2306 2304 padding: 5px !important;
2307 2305 }
2308 2306
2309 2307 .file_history {
2310 2308 padding-top: 10px;
2311 2309 font-size: 16px;
2312 2310 }
2313 2311 .file_author {
2314 2312 float: left;
2315 2313 }
2316 2314
2317 2315 .file_author .item {
2318 2316 float: left;
2319 2317 padding: 5px;
2320 2318 color: #888;
2321 2319 }
2322 2320
2323 2321 .tablerow0 {
2324 2322 background-color: #F8F8F8;
2325 2323 }
2326 2324
2327 2325 .tablerow1 {
2328 2326 background-color: #FFFFFF;
2329 2327 }
2330 2328
2331 2329 .changeset_id {
2332 2330 color: #666666;
2333 2331 margin-right: -3px;
2334 2332 }
2335 2333
2336 2334 .changeset_hash {
2337 2335 color: #000000;
2338 2336 }
2339 2337
2340 2338 #changeset_content {
2341 2339 border-left: 1px solid #CCC;
2342 2340 border-right: 1px solid #CCC;
2343 2341 border-bottom: 1px solid #CCC;
2344 2342 padding: 5px;
2345 2343 }
2346 2344
2347 2345 #changeset_compare_view_content {
2348 2346 border: 1px solid #CCC;
2349 2347 padding: 5px;
2350 2348 }
2351 2349
2352 2350 #changeset_content .container {
2353 2351 min-height: 100px;
2354 2352 font-size: 1.2em;
2355 2353 overflow: hidden;
2356 2354 }
2357 2355
2358 2356 #changeset_compare_view_content .compare_view_commits {
2359 2357 width: auto !important;
2360 2358 }
2361 2359
2362 2360 #changeset_compare_view_content .compare_view_commits td {
2363 2361 padding: 0px 0px 0px 12px !important;
2364 2362 }
2365 2363
2366 2364 #changeset_content .container .right {
2367 2365 float: right;
2368 2366 width: 20%;
2369 2367 text-align: right;
2370 2368 }
2371 2369
2372 2370 #changeset_content .container .message {
2373 2371 white-space: pre-wrap;
2374 2372 }
2375 2373 #changeset_content .container .message a:hover {
2376 2374 text-decoration: none;
2377 2375 }
2378 2376 .cs_files .cur_cs {
2379 2377 margin: 10px 2px;
2380 2378 font-weight: bold;
2381 2379 }
2382 2380
2383 2381 .cs_files .node {
2384 2382 float: left;
2385 2383 }
2386 2384
2387 2385 .cs_files .changes {
2388 2386 float: right;
2389 2387 color: #003367;
2390 2388 }
2391 2389
2392 2390 .cs_files .changes .added {
2393 2391 background-color: #BBFFBB;
2394 2392 float: left;
2395 2393 text-align: center;
2396 2394 font-size: 9px;
2397 2395 padding: 2px 0px 2px 0px;
2398 2396 }
2399 2397
2400 2398 .cs_files .changes .deleted {
2401 2399 background-color: #FF8888;
2402 2400 float: left;
2403 2401 text-align: center;
2404 2402 font-size: 9px;
2405 2403 padding: 2px 0px 2px 0px;
2406 2404 }
2407 2405 /*new binary*/
2408 2406 .cs_files .changes .bin1 {
2409 2407 background-color: #BBFFBB;
2410 2408 float: left;
2411 2409 text-align: center;
2412 2410 font-size: 9px;
2413 2411 padding: 2px 0px 2px 0px;
2414 2412 }
2415 2413
2416 2414 /*deleted binary*/
2417 2415 .cs_files .changes .bin2 {
2418 2416 background-color: #FF8888;
2419 2417 float: left;
2420 2418 text-align: center;
2421 2419 font-size: 9px;
2422 2420 padding: 2px 0px 2px 0px;
2423 2421 }
2424 2422
2425 2423 /*mod binary*/
2426 2424 .cs_files .changes .bin3 {
2427 2425 background-color: #DDDDDD;
2428 2426 float: left;
2429 2427 text-align: center;
2430 2428 font-size: 9px;
2431 2429 padding: 2px 0px 2px 0px;
2432 2430 }
2433 2431
2434 2432 /*rename file*/
2435 2433 .cs_files .changes .bin4 {
2436 2434 background-color: #6D99FF;
2437 2435 float: left;
2438 2436 text-align: center;
2439 2437 font-size: 9px;
2440 2438 padding: 2px 0px 2px 0px;
2441 2439 }
2442 2440
2443 2441
2444 2442 .cs_files .cs_added, .cs_files .cs_A {
2445 2443 background: url("../images/icons/page_white_add.png") no-repeat scroll
2446 2444 3px;
2447 2445 height: 16px;
2448 2446 padding-left: 20px;
2449 2447 margin-top: 7px;
2450 2448 text-align: left;
2451 2449 }
2452 2450
2453 2451 .cs_files .cs_changed, .cs_files .cs_M {
2454 2452 background: url("../images/icons/page_white_edit.png") no-repeat scroll
2455 2453 3px;
2456 2454 height: 16px;
2457 2455 padding-left: 20px;
2458 2456 margin-top: 7px;
2459 2457 text-align: left;
2460 2458 }
2461 2459
2462 2460 .cs_files .cs_removed, .cs_files .cs_D {
2463 2461 background: url("../images/icons/page_white_delete.png") no-repeat
2464 2462 scroll 3px;
2465 2463 height: 16px;
2466 2464 padding-left: 20px;
2467 2465 margin-top: 7px;
2468 2466 text-align: left;
2469 2467 }
2470 2468
2471 2469 .table {
2472 2470 position: relative;
2473 2471 }
2474 2472
2475 2473 #graph {
2476 2474 position: relative;
2477 2475 overflow: hidden;
2478 2476 }
2479 2477
2480 2478 #graph_nodes {
2481 2479 position: absolute;
2482 2480 }
2483 2481
2484 2482 #graph_content,
2485 2483 #graph .info_box,
2486 2484 #graph .container_header {
2487 2485 margin-left: 100px;
2488 2486 }
2489 2487
2490 2488 #graph_content {
2491 2489 position: relative;
2492 2490 }
2493 2491
2494 2492 #graph .container_header {
2495 2493 padding: 10px;
2496 2494 height: 25px;
2497 2495 }
2498 2496
2499 2497 #graph_content #rev_range_container {
2500 2498 float: left;
2501 2499 margin: 0px 0px 0px 3px;
2502 2500 }
2503 2501
2504 2502 #graph_content #rev_range_clear {
2505 2503 float: left;
2506 2504 margin: 0px 0px 0px 3px;
2507 2505 }
2508 2506
2509 2507 #graph_content #changesets {
2510 2508 table-layout: fixed;
2511 2509 border-collapse: collapse;
2512 2510 border-left: none;
2513 2511 border-right: none;
2514 2512 border-color: #cdcdcd;
2515 2513 }
2516 2514
2517 #graph_content .container {
2518
2519 }
2520
2521 2515 #graph_content #changesets td {
2522 2516 overflow: hidden;
2523 2517 text-overflow: ellipsis;
2524 2518 white-space: nowrap;
2525 2519 height: 31px;
2526 2520 border-color: #cdcdcd;
2527 2521 text-align: left;
2528 2522 }
2529 2523
2530 2524 #graph_content .container .author {
2531 2525 width: 105px;
2532 2526 }
2533 2527
2534 2528 #graph_content .container .hash {
2535 2529 width: 100px;
2536 2530 font-size: 0.85em;
2537 2531 }
2538 2532
2539 2533 #graph_content #changesets .container .date {
2540 2534 width: 76px;
2541 2535 color: #666;
2542 2536 font-size: 10px;
2543 2537 }
2544 2538
2545 2539 #graph_content #changesets .container .right {
2546 2540 width: 120px;
2547 2541 padding-right: 0px;
2548 2542 overflow: visible;
2549 2543 position: relative;
2550 2544 }
2551 2545
2552 2546 #graph_content .container .mid {
2553 2547 padding: 0;
2554 2548 }
2555 2549
2556 2550 #graph_content .log-container {
2557 2551 position: relative;
2558 2552 }
2559 2553
2560 2554 #graph_content #changesets td.checkbox {
2561 2555 width: 20px;
2562 2556 }
2563 2557
2564 2558 #graph_content .container .changeset_range {
2565 2559 float: left;
2566 2560 margin: 6px 3px;
2567 2561 }
2568 2562
2569 2563 #graph_content .container .author img {
2570 2564 vertical-align: middle;
2571 2565 }
2572 2566
2573 2567 #graph_content .container .author .user {
2574 2568 color: #444444;
2575 2569 }
2576 2570
2577 2571 #graph_content .container .mid .message {
2578 2572 white-space: pre-wrap;
2579 2573 padding: 0;
2580 2574 overflow: hidden;
2581 2575 height: 1.1em;
2582 2576 }
2583 2577
2584 2578 #graph_content .container .extra-container {
2585 2579 display: block;
2586 2580 position: absolute;
2587 2581 top: -15px;
2588 2582 right: 0;
2589 2583 padding-left: 5px;
2590 2584 background: #FFFFFF;
2591 2585 height: 41px;
2592 2586 }
2593 2587
2594 2588 #graph_content .comments-container,
2595 2589 #graph_content .logtags {
2596 2590 display: block;
2597 2591 float: left;
2598 2592 overflow: hidden;
2599 2593 padding: 0;
2600 2594 margin: 0;
2601 2595 }
2602 2596
2603 2597 #graph_content .comments-container {
2604 2598 margin: 0.8em 0;
2605 2599 margin-right: 0.5em;
2606 2600 }
2607 2601
2608 2602 #graph_content .tagcontainer {
2609 2603 width: 80px;
2610 2604 position: relative;
2611 2605 float: right;
2612 2606 height: 100%;
2613 2607 top: 7px;
2614 2608 margin-left: 0.5em;
2615 2609 }
2616 2610
2617 2611 #graph_content .logtags {
2618 2612 min-width: 80px;
2619 2613 height: 1.1em;
2620 2614 position: absolute;
2621 2615 left: 0px;
2622 2616 width: auto;
2623 2617 top: 0px;
2624 2618 }
2625 2619
2626 2620 #graph_content .logtags.tags {
2627 2621 top: 14px;
2628 2622 }
2629 2623
2630 2624 #graph_content .logtags:hover {
2631 2625 overflow: visible;
2632 2626 position: absolute;
2633 2627 width: auto;
2634 2628 right: 0;
2635 2629 left: initial;
2636 2630 }
2637 2631
2638 2632 #graph_content .logtags .bookbook,
2639 2633 #graph_content .logtags .tagtag {
2640 2634 float: left;
2641 2635 line-height: 1em;
2642 2636 margin-bottom: 1px;
2643 2637 margin-right: 1px;
2644 2638 padding: 1px 3px;
2645 2639 font-size: 10px;
2646 2640 }
2647 2641
2648 2642 #graph_content .container .mid .message a:hover {
2649 2643 text-decoration: none;
2650 2644 }
2651 2645
2652 2646 .revision-link {
2653 2647 color: #3F6F9F;
2654 2648 font-weight: bold !important;
2655 2649 }
2656 2650
2657 2651 .issue-tracker-link {
2658 2652 color: #3F6F9F;
2659 2653 font-weight: bold !important;
2660 2654 }
2661 2655
2662 2656 .changeset-status-container {
2663 2657 padding-right: 5px;
2664 2658 margin-top: 1px;
2665 2659 float: right;
2666 2660 height: 14px;
2667 2661 }
2668 2662 .code-header .changeset-status-container {
2669 2663 float: left;
2670 2664 padding: 2px 0px 0px 2px;
2671 2665 }
2672 2666 .changeset-status-container .changeset-status-lbl {
2673 2667 color: rgb(136, 136, 136);
2674 2668 float: left;
2675 2669 padding: 3px 4px 0px 0px
2676 2670 }
2677 2671 .code-header .changeset-status-container .changeset-status-lbl {
2678 2672 float: left;
2679 2673 padding: 0px 4px 0px 0px;
2680 2674 }
2681 2675 .changeset-status-container .changeset-status-ico {
2682 2676 float: left;
2683 2677 }
2684 2678 .code-header .changeset-status-container .changeset-status-ico, .container .changeset-status-ico {
2685 2679 float: left;
2686 2680 }
2687 2681
2688 2682 #graph_content .comments-cnt {
2689 2683 color: rgb(136, 136, 136);
2690 2684 padding: 5px 0;
2691 2685 }
2692 2686
2693 2687 #graph_content .comments-cnt a {
2694 2688 background-image: url('../images/icons/comments.png');
2695 2689 background-repeat: no-repeat;
2696 2690 background-position: 100% 50%;
2697 2691 padding: 5px 0;
2698 2692 padding-right: 20px;
2699 2693 }
2700 2694
2701 2695 .right .changes {
2702 2696 clear: both;
2703 2697 }
2704 2698
2705 2699 .right .changes .changed_total {
2706 2700 display: block;
2707 2701 float: right;
2708 2702 text-align: center;
2709 2703 min-width: 45px;
2710 2704 cursor: pointer;
2711 2705 color: #444444;
2712 2706 background: #FEA;
2713 2707 -webkit-border-radius: 0px 0px 0px 6px;
2714 2708 border-radius: 0px 0px 0px 6px;
2715 2709 padding: 1px;
2716 2710 }
2717 2711
2718 2712 .right .changes .added, .changed, .removed {
2719 2713 display: block;
2720 2714 padding: 1px;
2721 2715 color: #444444;
2722 2716 float: right;
2723 2717 text-align: center;
2724 2718 min-width: 15px;
2725 2719 }
2726 2720
2727 2721 .right .changes .added {
2728 2722 background: #CFC;
2729 2723 }
2730 2724
2731 2725 .right .changes .changed {
2732 2726 background: #FEA;
2733 2727 }
2734 2728
2735 2729 .right .changes .removed {
2736 2730 background: #FAA;
2737 2731 }
2738 2732
2739 2733 .right .merge {
2740 2734 padding: 1px 3px 1px 3px;
2741 2735 background-color: #fca062;
2742 2736 font-size: 10px;
2743 2737 color: #ffffff;
2744 2738 text-transform: uppercase;
2745 2739 white-space: nowrap;
2746 2740 -webkit-border-radius: 3px;
2747 2741 border-radius: 3px;
2748 2742 margin-right: 2px;
2749 2743 }
2750 2744
2751 2745 .right .parent {
2752 2746 color: #666666;
2753 2747 clear: both;
2754 2748 }
2755 2749 .right .logtags {
2756 2750 line-height: 2.2em;
2757 2751 }
2758 2752 .branchtag, .logtags .tagtag, .logtags .booktag {
2759 2753 margin: 0px 2px;
2760 2754 }
2761 2755
2762 2756 .branchtag,
2763 2757 .tagtag,
2764 2758 .bookbook,
2765 2759 .spantag {
2766 2760 padding: 1px 3px 1px 3px;
2767 2761 font-size: 10px;
2768 2762 color: #336699;
2769 2763 white-space: nowrap;
2770 2764 -webkit-border-radius: 4px;
2771 2765 border-radius: 4px;
2772 2766 border: 1px solid #d9e8f8;
2773 2767 line-height: 1.5em;
2774 2768 }
2775 2769
2776 2770 #graph_content .branchtag,
2777 2771 #graph_content .tagtag,
2778 2772 #graph_content .bookbook {
2779 2773 margin: 1.1em 0;
2780 2774 margin-right: 0.5em;
2781 2775 }
2782 2776
2783 2777 .branchtag,
2784 2778 .tagtag,
2785 2779 .bookbook {
2786 2780 float: left;
2787 2781 }
2788 2782
2789 2783 .right .logtags .branchtag,
2790 2784 .logtags .tagtag,
2791 2785 .right .merge {
2792 2786 float: right;
2793 2787 line-height: 1em;
2794 2788 margin: 1px 1px !important;
2795 2789 display: block;
2796 2790 }
2797 2791
2798 2792 .bookbook {
2799 2793 border-color: #46A546;
2800 2794 color: #46A546;
2801 2795 }
2802 2796
2803 2797 .tagtag {
2804 2798 border-color: #62cffc;
2805 2799 color: #62cffc;
2806 2800 }
2807 2801
2808 2802 .logtags .branchtag a:hover,
2809 2803 .logtags .branchtag a,
2810 2804 .branchtag a,
2811 2805 .branchtag a:hover {
2812 2806 text-decoration: none;
2813 2807 color: inherit;
2814 2808 }
2815 2809 .logtags .tagtag {
2816 2810 padding: 1px 3px 1px 3px;
2817 2811 background-color: #62cffc;
2818 2812 font-size: 10px;
2819 2813 color: #ffffff;
2820 2814 white-space: nowrap;
2821 2815 -webkit-border-radius: 3px;
2822 2816 border-radius: 3px;
2823 2817 }
2824 2818
2825 2819 .tagtag a,
2826 2820 .tagtag a:hover,
2827 2821 .logtags .tagtag a,
2828 2822 .logtags .tagtag a:hover {
2829 2823 text-decoration: none;
2830 2824 color: inherit;
2831 2825 }
2832 2826 .logbooks .bookbook, .logbooks .bookbook, .logtags .bookbook, .logtags .bookbook {
2833 2827 padding: 1px 3px 1px 3px;
2834 2828 background-color: #46A546;
2835 2829 font-size: 10px;
2836 2830 color: #ffffff;
2837 2831 white-space: nowrap;
2838 2832 -webkit-border-radius: 3px;
2839 2833 border-radius: 3px;
2840 2834 }
2841 2835 .logbooks .bookbook, .logbooks .bookbook a, .right .logtags .bookbook, .logtags .bookbook a {
2842 2836 color: #ffffff;
2843 2837 }
2844 2838
2845 2839 .logbooks .bookbook, .logbooks .bookbook a:hover,
2846 2840 .logtags .bookbook, .logtags .bookbook a:hover,
2847 2841 .bookbook a,
2848 2842 .bookbook a:hover {
2849 2843 text-decoration: none;
2850 2844 color: inherit;
2851 2845 }
2852 2846 div.browserblock {
2853 2847 overflow: hidden;
2854 2848 border: 1px solid #ccc;
2855 2849 background: #f8f8f8;
2856 2850 font-size: 100%;
2857 2851 line-height: 125%;
2858 2852 padding: 0;
2859 2853 -webkit-border-radius: 6px 6px 0px 0px;
2860 2854 border-radius: 6px 6px 0px 0px;
2861 2855 }
2862 2856
2863 2857 div.browserblock .browser-header {
2864 2858 background: #FFF;
2865 2859 padding: 10px 0px 15px 0px;
2866 2860 width: 100%;
2867 2861 }
2868 2862
2869 2863 div.browserblock .browser-nav {
2870 2864 float: left
2871 2865 }
2872 2866
2873 2867 div.browserblock .browser-branch {
2874 2868 float: left;
2875 2869 }
2876 2870
2877 2871 div.browserblock .browser-branch label {
2878 2872 color: #4A4A4A;
2879 2873 vertical-align: text-top;
2880 2874 }
2881 2875
2882 2876 div.browserblock .browser-header span {
2883 2877 margin-left: 5px;
2884 2878 font-weight: 700;
2885 2879 }
2886 2880
2887 2881 div.browserblock .browser-search {
2888 2882 clear: both;
2889 2883 padding: 8px 8px 0px 5px;
2890 2884 height: 20px;
2891 2885 }
2892 2886
2893 2887 div.browserblock #node_filter_box {
2894 2888 }
2895 2889
2896 2890 div.browserblock .search_activate {
2897 2891 float: left
2898 2892 }
2899 2893
2900 2894 div.browserblock .add_node {
2901 2895 float: left;
2902 2896 padding-left: 5px;
2903 2897 }
2904 2898
2905 2899 div.browserblock .search_activate a:hover, div.browserblock .add_node a:hover {
2906 2900 text-decoration: none !important;
2907 2901 }
2908 2902
2909 2903 div.browserblock .browser-body {
2910 2904 background: #EEE;
2911 2905 border-top: 1px solid #CCC;
2912 2906 }
2913 2907
2914 2908 table.code-browser {
2915 2909 border-collapse: collapse;
2916 2910 width: 100%;
2917 2911 }
2918 2912
2919 2913 table.code-browser tr {
2920 2914 margin: 3px;
2921 2915 }
2922 2916
2923 2917 table.code-browser thead th {
2924 2918 background-color: #EEE;
2925 2919 height: 20px;
2926 2920 font-size: 1.1em;
2927 2921 font-weight: 700;
2928 2922 text-align: left;
2929 2923 padding-left: 10px;
2930 2924 }
2931 2925
2932 2926 table.code-browser tbody td {
2933 2927 padding-left: 10px;
2934 2928 height: 20px;
2935 2929 }
2936 2930
2937 2931 table.code-browser .browser-file {
2938 2932 background: url("../images/icons/document_16.png") no-repeat scroll 3px;
2939 2933 height: 16px;
2940 2934 padding-left: 20px;
2941 2935 text-align: left;
2942 2936 }
2943 2937 .diffblock .changeset_header {
2944 2938 height: 16px;
2945 2939 }
2946 2940 .diffblock .changeset_file {
2947 2941 background: url("../images/icons/file.png") no-repeat scroll 3px;
2948 2942 text-align: left;
2949 2943 float: left;
2950 2944 padding: 2px 0px 2px 22px;
2951 2945 }
2952 2946 .diffblock .diff-menu-wrapper {
2953 2947 float: left;
2954 2948 }
2955 2949
2956 2950 .diffblock .diff-menu {
2957 2951 position: absolute;
2958 2952 background: none repeat scroll 0 0 #FFFFFF;
2959 2953 border-color: #003367 #666666 #666666;
2960 2954 border-right: 1px solid #666666;
2961 2955 border-style: solid solid solid;
2962 2956 border-width: 1px;
2963 2957 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
2964 2958 margin-top: 5px;
2965 2959 margin-left: 1px;
2966 2960
2967 2961 }
2968 2962 .diffblock .diff-actions {
2969 2963 padding: 2px 0px 0px 2px;
2970 2964 float: left;
2971 2965 }
2972 2966 .diffblock .diff-menu ul li {
2973 2967 padding: 0px 0px 0px 0px !important;
2974 2968 }
2975 2969 .diffblock .diff-menu ul li a {
2976 2970 display: block;
2977 2971 padding: 3px 8px 3px 8px !important;
2978 2972 }
2979 2973 .diffblock .diff-menu ul li a:hover {
2980 2974 text-decoration: none;
2981 2975 background-color: #EEEEEE;
2982 2976 }
2983 2977 table.code-browser .browser-dir {
2984 2978 background: url("../images/icons/folder_16.png") no-repeat scroll 3px;
2985 2979 height: 16px;
2986 2980 padding-left: 20px;
2987 2981 text-align: left;
2988 2982 }
2989 2983
2990 2984 table.code-browser .submodule-dir {
2991 2985 background: url("../images/icons/disconnect.png") no-repeat scroll 3px;
2992 2986 height: 16px;
2993 2987 padding-left: 20px;
2994 2988 text-align: left;
2995 2989 }
2996 2990
2997 2991
2998 2992 .box .search {
2999 2993 clear: both;
3000 2994 overflow: hidden;
3001 2995 margin: 0;
3002 2996 padding: 0 20px 10px;
3003 2997 }
3004 2998
3005 2999 .box .search div.search_path {
3006 3000 background: none repeat scroll 0 0 #EEE;
3007 3001 border: 1px solid #CCC;
3008 3002 color: blue;
3009 3003 margin-bottom: 10px;
3010 3004 padding: 10px 0;
3011 3005 }
3012 3006
3013 3007 .box .search div.search_path div.link {
3014 3008 font-weight: 700;
3015 3009 margin-left: 25px;
3016 3010 }
3017 3011
3018 3012 .box .search div.search_path div.link a {
3019 3013 color: #003367;
3020 3014 cursor: pointer;
3021 3015 text-decoration: none;
3022 3016 }
3023 3017
3024 3018 #path_unlock {
3025 3019 color: red;
3026 3020 font-size: 1.2em;
3027 3021 padding-left: 4px;
3028 3022 }
3029 3023
3030 3024 .info_box span {
3031 3025 margin-left: 3px;
3032 3026 margin-right: 3px;
3033 3027 }
3034 3028
3035 3029 .info_box .rev {
3036 3030 color: #003367;
3037 3031 font-size: 1.6em;
3038 3032 font-weight: bold;
3039 3033 vertical-align: sub;
3040 3034 }
3041 3035
3042 3036 .info_box input#at_rev, .info_box input#size {
3043 3037 background: #FFF;
3044 3038 border-top: 1px solid #b3b3b3;
3045 3039 border-left: 1px solid #b3b3b3;
3046 3040 border-right: 1px solid #eaeaea;
3047 3041 border-bottom: 1px solid #eaeaea;
3048 3042 color: #000;
3049 3043 font-size: 12px;
3050 3044 margin: 0;
3051 3045 padding: 1px 5px 1px;
3052 3046 }
3053 3047
3054 3048 .info_box input#view {
3055 3049 text-align: center;
3056 3050 padding: 4px 3px 2px 2px;
3057 3051 }
3058 3052
3059 3053 .yui-overlay, .yui-panel-container {
3060 3054 visibility: hidden;
3061 3055 position: absolute;
3062 3056 z-index: 2;
3063 3057 }
3064 3058
3065 3059 #tip-box {
3066 3060 position: absolute;
3067 3061
3068 3062 background-color: #FFF;
3069 3063 border: 2px solid #003367;
3070 3064 font: 100% sans-serif;
3071 3065 width: auto;
3072 3066 opacity: 1;
3073 3067 padding: 8px;
3074 3068
3075 3069 white-space: pre-wrap;
3076 3070 -webkit-border-radius: 8px 8px 8px 8px;
3077 3071 -khtml-border-radius: 8px 8px 8px 8px;
3078 3072 border-radius: 8px 8px 8px 8px;
3079 3073 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3080 3074 -webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3081 3075 }
3082 3076
3083 3077 .hl-tip-box {
3084 3078 visibility: hidden;
3085 3079 position: absolute;
3086 3080 color: #666;
3087 3081 background-color: #FFF;
3088 3082 border: 2px solid #003367;
3089 3083 font: 100% sans-serif;
3090 3084 width: auto;
3091 3085 opacity: 1;
3092 3086 padding: 8px;
3093 3087 white-space: pre-wrap;
3094 3088 -webkit-border-radius: 8px 8px 8px 8px;
3095 3089 -khtml-border-radius: 8px 8px 8px 8px;
3096 3090 border-radius: 8px 8px 8px 8px;
3097 3091 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3098 3092 }
3099 3093
3100 3094
3101 3095 .mentions-container {
3102 3096 width: 90% !important;
3103 3097 }
3104 3098 .mentions-container .yui-ac-content {
3105 3099 width: 100% !important;
3106 3100 }
3107 3101
3108 3102 .ac {
3109 3103 vertical-align: top;
3110 3104 }
3111 3105
3112 3106 .ac .yui-ac {
3113 3107 position: inherit;
3114 3108 font-size: 100%;
3115 3109 }
3116 3110
3117 3111 .ac .perm_ac {
3118 3112 width: 20em;
3119 3113 }
3120 3114
3121 3115 .ac .yui-ac-input {
3122 3116 width: 100%;
3123 3117 }
3124 3118
3125 3119 .ac .yui-ac-container {
3126 3120 position: absolute;
3127 3121 top: 1.6em;
3128 3122 width: auto;
3129 3123 }
3130 3124
3131 3125 .ac .yui-ac-content {
3132 3126 position: absolute;
3133 3127 border: 1px solid gray;
3134 3128 background: #fff;
3135 3129 z-index: 9050;
3136 3130 }
3137 3131
3138 3132 .ac .yui-ac-shadow {
3139 3133 position: absolute;
3140 3134 width: 100%;
3141 3135 background: #000;
3142 3136 opacity: .10;
3143 3137 filter: alpha(opacity = 10);
3144 3138 z-index: 9049;
3145 3139 margin: .3em;
3146 3140 }
3147 3141
3148 3142 .ac .yui-ac-content ul {
3149 3143 width: 100%;
3150 3144 margin: 0;
3151 3145 padding: 0;
3152 3146 z-index: 9050;
3153 3147 }
3154 3148
3155 3149 .ac .yui-ac-content li {
3156 3150 cursor: default;
3157 3151 white-space: nowrap;
3158 3152 margin: 0;
3159 3153 padding: 2px 5px;
3160 3154 height: 18px;
3161 3155 z-index: 9050;
3162 3156 display: block;
3163 3157 width: auto !important;
3164 3158 }
3165 3159
3166 3160 .ac .yui-ac-content li .ac-container-wrap {
3167 3161 width: auto;
3168 3162 }
3169 3163
3170 3164 .ac .yui-ac-content li.yui-ac-prehighlight {
3171 3165 background: #B3D4FF;
3172 3166 z-index: 9050;
3173 3167 }
3174 3168
3175 3169 .ac .yui-ac-content li.yui-ac-highlight {
3176 3170 background: #556CB5;
3177 3171 color: #FFF;
3178 3172 z-index: 9050;
3179 3173 }
3180 3174 .ac .yui-ac-bd {
3181 3175 z-index: 9050;
3182 3176 }
3183 3177
3184 3178 .follow {
3185 3179 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
3186 3180 height: 16px;
3187 3181 width: 20px;
3188 3182 cursor: pointer;
3189 3183 display: block;
3190 3184 float: right;
3191 3185 margin-top: 2px;
3192 3186 }
3193 3187
3194 3188 .following {
3195 3189 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
3196 3190 height: 16px;
3197 3191 width: 20px;
3198 3192 cursor: pointer;
3199 3193 display: block;
3200 3194 float: right;
3201 3195 margin-top: 2px;
3202 3196 }
3203 3197
3204 3198 .reposize {
3205 3199 background: url("../images/icons/server.png") no-repeat scroll 3px;
3206 3200 height: 16px;
3207 3201 width: 20px;
3208 3202 cursor: pointer;
3209 3203 display: block;
3210 3204 float: right;
3211 3205 margin-top: 2px;
3212 3206 }
3213 3207
3214 3208 #repo_size {
3215 3209 display: block;
3216 3210 margin-top: 4px;
3217 3211 color: #666;
3218 3212 float: right;
3219 3213 }
3220 3214
3221 3215 .locking_locked {
3222 3216 background: #FFF url("../images/icons/block_16.png") no-repeat scroll 3px;
3223 3217 height: 16px;
3224 3218 width: 20px;
3225 3219 cursor: pointer;
3226 3220 display: block;
3227 3221 float: right;
3228 3222 margin-top: 2px;
3229 3223 }
3230 3224
3231 3225 .locking_unlocked {
3232 3226 background: #FFF url("../images/icons/accept.png") no-repeat scroll 3px;
3233 3227 height: 16px;
3234 3228 width: 20px;
3235 3229 cursor: pointer;
3236 3230 display: block;
3237 3231 float: right;
3238 3232 margin-top: 2px;
3239 3233 }
3240 3234
3241 3235 .currently_following {
3242 3236 padding-left: 10px;
3243 3237 padding-bottom: 5px;
3244 3238 }
3245 3239
3246 3240 .add_icon {
3247 3241 background: url("../images/icons/add.png") no-repeat scroll 3px;
3248 3242 padding-left: 20px;
3249 3243 padding-top: 0px;
3250 3244 text-align: left;
3251 3245 }
3252 3246
3253 3247 .accept_icon {
3254 3248 background: url("../images/icons/accept.png") no-repeat scroll 3px;
3255 3249 padding-left: 20px;
3256 3250 padding-top: 0px;
3257 3251 text-align: left;
3258 3252 }
3259 3253
3260 3254 .edit_icon {
3261 3255 background: url("../images/icons/application_form_edit.png") no-repeat scroll 3px;
3262 3256 padding-left: 20px;
3263 3257 padding-top: 0px;
3264 3258 text-align: left;
3265 3259 }
3266 3260
3267 3261 .delete_icon {
3268 3262 background: url("../images/icons/delete.png") no-repeat scroll 3px;
3269 3263 padding-left: 20px;
3270 3264 padding-top: 0px;
3271 3265 text-align: left;
3272 3266 }
3273 3267
3274 3268 .refresh_icon {
3275 3269 background: url("../images/icons/arrow_refresh.png") no-repeat scroll
3276 3270 3px;
3277 3271 padding-left: 20px;
3278 3272 padding-top: 0px;
3279 3273 text-align: left;
3280 3274 }
3281 3275
3282 3276 .pull_icon {
3283 3277 background: url("../images/icons/connect.png") no-repeat scroll 3px;
3284 3278 padding-left: 20px;
3285 3279 padding-top: 0px;
3286 3280 text-align: left;
3287 3281 }
3288 3282
3289 3283 .rss_icon {
3290 3284 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
3291 3285 padding-left: 20px;
3292 3286 padding-top: 4px;
3293 3287 text-align: left;
3294 3288 font-size: 8px
3295 3289 }
3296 3290
3297 3291 .atom_icon {
3298 3292 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
3299 3293 padding-left: 20px;
3300 3294 padding-top: 4px;
3301 3295 text-align: left;
3302 3296 font-size: 8px
3303 3297 }
3304 3298
3305 3299 .archive_icon {
3306 3300 background: url("../images/icons/compress.png") no-repeat scroll 3px;
3307 3301 padding-left: 20px;
3308 3302 text-align: left;
3309 3303 padding-top: 1px;
3310 3304 }
3311 3305
3312 3306 .start_following_icon {
3313 3307 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
3314 3308 padding-left: 20px;
3315 3309 text-align: left;
3316 3310 padding-top: 0px;
3317 3311 }
3318 3312
3319 3313 .stop_following_icon {
3320 3314 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
3321 3315 padding-left: 20px;
3322 3316 text-align: left;
3323 3317 padding-top: 0px;
3324 3318 }
3325 3319
3326 3320 .action_button {
3327 3321 border: 0;
3328 3322 display: inline;
3329 3323 }
3330 3324
3331 3325 .action_button:hover {
3332 3326 border: 0;
3333 3327 text-decoration: underline;
3334 3328 cursor: pointer;
3335 3329 }
3336 3330
3337 3331 #switch_repos {
3338 3332 position: absolute;
3339 3333 height: 25px;
3340 3334 z-index: 1;
3341 3335 }
3342 3336
3343 3337 #switch_repos select {
3344 3338 min-width: 150px;
3345 3339 max-height: 250px;
3346 3340 z-index: 1;
3347 3341 }
3348 3342
3349 3343 .breadcrumbs {
3350 3344 border: medium none;
3351 3345 color: #FFF;
3352 3346 float: left;
3353 3347 font-weight: 700;
3354 3348 font-size: 14px;
3355 3349 margin: 0;
3356 3350 padding: 11px 0 11px 10px;
3357 3351 }
3358 3352
3359 3353 .breadcrumbs .hash {
3360 3354 text-transform: none;
3361 3355 color: #fff;
3362 3356 }
3363 3357
3364 3358 .breadcrumbs a {
3365 3359 color: #FFF;
3366 3360 }
3367 3361
3368 3362 .flash_msg {
3369 3363 }
3370 3364
3371 3365 .flash_msg ul {
3372 3366 }
3373 3367
3374 3368 .error_red {
3375 3369 color: red;
3376 3370 }
3377 3371
3378 3372 .error_msg {
3379 3373 background-color: #c43c35;
3380 3374 background-repeat: repeat-x;
3381 3375 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35) );
3382 3376 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3383 3377 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3384 3378 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35) );
3385 3379 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3386 3380 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3387 3381 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3388 3382 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b',endColorstr='#c43c35', GradientType=0 );
3389 3383 border-color: #c43c35 #c43c35 #882a25;
3390 3384 }
3391 3385
3392 3386 .error_msg a {
3393 3387 text-decoration: underline;
3394 3388 }
3395 3389
3396 3390 .warning_msg {
3397 3391 color: #404040 !important;
3398 3392 background-color: #eedc94;
3399 3393 background-repeat: repeat-x;
3400 3394 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94) );
3401 3395 background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
3402 3396 background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
3403 3397 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94) );
3404 3398 background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
3405 3399 background-image: -o-linear-gradient(top, #fceec1, #eedc94);
3406 3400 background-image: linear-gradient(to bottom, #fceec1, #eedc94);
3407 3401 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0 );
3408 3402 border-color: #eedc94 #eedc94 #e4c652;
3409 3403 }
3410 3404
3411 3405 .warning_msg a {
3412 3406 text-decoration: underline;
3413 3407 }
3414 3408
3415 3409 .success_msg {
3416 3410 background-color: #57a957;
3417 3411 background-repeat: repeat-x !important;
3418 3412 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957) );
3419 3413 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3420 3414 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3421 3415 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957) );
3422 3416 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3423 3417 background-image: -o-linear-gradient(top, #62c462, #57a957);
3424 3418 background-image: linear-gradient(to bottom, #62c462, #57a957);
3425 3419 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0 );
3426 3420 border-color: #57a957 #57a957 #3d773d;
3427 3421 }
3428 3422
3429 3423 .success_msg a {
3430 3424 text-decoration: underline;
3431 3425 color: #FFF !important;
3432 3426 }
3433 3427
3434 3428 .notice_msg {
3435 3429 background-color: #339bb9;
3436 3430 background-repeat: repeat-x;
3437 3431 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9) );
3438 3432 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3439 3433 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3440 3434 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9) );
3441 3435 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3442 3436 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3443 3437 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3444 3438 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0 );
3445 3439 border-color: #339bb9 #339bb9 #22697d;
3446 3440 }
3447 3441
3448 3442 .notice_msg a {
3449 3443 text-decoration: underline;
3450 3444 }
3451 3445
3452 3446 .success_msg, .error_msg, .notice_msg, .warning_msg {
3453 3447 font-size: 12px;
3454 3448 font-weight: 700;
3455 3449 min-height: 14px;
3456 3450 line-height: 14px;
3457 3451 margin-bottom: 10px;
3458 3452 margin-top: 0;
3459 3453 display: block;
3460 3454 overflow: auto;
3461 3455 padding: 6px 10px 6px 10px;
3462 3456 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3463 3457 position: relative;
3464 3458 color: #FFF;
3465 3459 border-width: 1px;
3466 3460 border-style: solid;
3467 3461 -webkit-border-radius: 4px;
3468 3462 border-radius: 4px;
3469 3463 -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3470 3464 box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3471 3465 }
3472 3466
3473 3467 #msg_close {
3474 3468 background: transparent url("../icons/cross_grey_small.png") no-repeat scroll 0 0;
3475 3469 cursor: pointer;
3476 3470 height: 16px;
3477 3471 position: absolute;
3478 3472 right: 5px;
3479 3473 top: 5px;
3480 3474 width: 16px;
3481 3475 }
3482 3476 div#legend_data {
3483 3477 padding-left: 10px;
3484 3478 }
3485 3479 div#legend_container table {
3486 3480 border: none !important;
3487 3481 }
3488 3482 div#legend_container table, div#legend_choices table {
3489 3483 width: auto !important;
3490 3484 }
3491 3485
3492 3486 table#permissions_manage {
3493 3487 width: 0 !important;
3494 3488 }
3495 3489
3496 3490 table#permissions_manage span.private_repo_msg {
3497 3491 font-size: 0.8em;
3498 3492 opacity: 0.6;
3499 3493 }
3500 3494
3501 3495 table#permissions_manage td.private_repo_msg {
3502 3496 font-size: 0.8em;
3503 3497 }
3504 3498
3505 3499 table#permissions_manage tr#add_perm_input td {
3506 3500 vertical-align: middle;
3507 3501 }
3508 3502
3509 3503 div.gravatar {
3510 3504 background-color: #FFF;
3511 3505 float: left;
3512 3506 margin-right: 0.7em;
3513 3507 padding: 1px 1px 1px 1px;
3514 3508 line-height: 0;
3515 3509 -webkit-border-radius: 3px;
3516 3510 -khtml-border-radius: 3px;
3517 3511 border-radius: 3px;
3518 3512 }
3519 3513
3520 3514 div.gravatar img {
3521 3515 -webkit-border-radius: 2px;
3522 3516 -khtml-border-radius: 2px;
3523 3517 border-radius: 2px;
3524 3518 }
3525 3519
3526 3520 #header, #content, #footer {
3527 3521 min-width: 978px;
3528 3522 }
3529 3523
3530 3524 #content {
3531 3525 clear: both;
3532 3526 padding: 10px 10px 14px 10px;
3533 3527 }
3534 3528
3535 3529 #content.hover {
3536 3530 padding: 55px 10px 14px 10px !important;
3537 3531 }
3538 3532
3539 3533 #content div.box div.title div.search {
3540 3534 border-left: 1px solid #316293;
3541 3535 }
3542 3536
3543 3537 #content div.box div.title div.search div.input input {
3544 3538 border: 1px solid #316293;
3545 3539 }
3546 3540
3547 3541 .ui-btn {
3548 3542 color: #515151;
3549 3543 background-color: #DADADA;
3550 3544 background-repeat: repeat-x;
3551 3545 background-image: -khtml-gradient(linear, left top, left bottom, from(#F4F4F4),to(#DADADA) );
3552 3546 background-image: -moz-linear-gradient(top, #F4F4F4, #DADADA);
3553 3547 background-image: -ms-linear-gradient(top, #F4F4F4, #DADADA);
3554 3548 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #F4F4F4),color-stop(100%, #DADADA) );
3555 3549 background-image: -webkit-linear-gradient(top, #F4F4F4, #DADADA) );
3556 3550 background-image: -o-linear-gradient(top, #F4F4F4, #DADADA) );
3557 3551 background-image: linear-gradient(to bottom, #F4F4F4, #DADADA);
3558 3552 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F4F4F4', endColorstr='#DADADA', GradientType=0);
3559 3553
3560 3554 border-top: 1px solid #DDD;
3561 3555 border-left: 1px solid #c6c6c6;
3562 3556 border-right: 1px solid #DDD;
3563 3557 border-bottom: 1px solid #c6c6c6;
3564 3558 color: #515151;
3565 3559 outline: none;
3566 3560 margin: 0px 3px 3px 0px;
3567 3561 -webkit-border-radius: 4px 4px 4px 4px !important;
3568 3562 -khtml-border-radius: 4px 4px 4px 4px !important;
3569 3563 border-radius: 4px 4px 4px 4px !important;
3570 3564 cursor: pointer !important;
3571 3565 padding: 3px 3px 3px 3px;
3572 3566 background-position: 0 -15px;
3573 3567
3574 3568 }
3575 3569
3576 3570 .ui-btn.disabled {
3577 3571 color: #999;
3578 3572 }
3579 3573
3580 3574 .ui-btn.xsmall {
3581 3575 padding: 1px 2px 1px 1px;
3582 3576 }
3583 3577
3584 3578 .ui-btn.large {
3585 3579 padding: 6px 12px;
3586 3580 }
3587 3581
3588 3582 .ui-btn.clone {
3589 3583 padding: 5px 2px 6px 1px;
3590 3584 margin: 0px 0px 3px -4px;
3591 3585 -webkit-border-radius: 0px 4px 4px 0px !important;
3592 3586 -khtml-border-radius: 0px 4px 4px 0px !important;
3593 3587 border-radius: 0px 4px 4px 0px !important;
3594 3588 width: 100px;
3595 3589 text-align: center;
3596 3590 display: inline-block;
3597 3591 position: relative;
3598 3592 top: -2px;
3599 3593 }
3600 3594 .ui-btn:focus {
3601 3595 outline: none;
3602 3596 }
3603 3597 .ui-btn:hover {
3604 3598 background-position: 0 -15px;
3605 3599 text-decoration: none;
3606 3600 color: #515151;
3607 3601 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 0 3px #FFFFFF !important;
3608 3602 }
3609 3603
3610 3604 .ui-btn.disabled:hover {
3611 3605 background-position: 0;
3612 3606 color: #999;
3613 3607 text-decoration: none;
3614 3608 box-shadow: none !important;
3615 3609 }
3616 3610
3617 3611 .ui-btn.red {
3618 3612 color: #fff;
3619 3613 background-color: #c43c35;
3620 3614 background-repeat: repeat-x;
3621 3615 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
3622 3616 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3623 3617 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3624 3618 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
3625 3619 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3626 3620 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3627 3621 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3628 3622 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
3629 3623 border-color: #c43c35 #c43c35 #882a25;
3630 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 3628 .ui-btn.blue {
3635 3629 color: #fff;
3636 3630 background-color: #339bb9;
3637 3631 background-repeat: repeat-x;
3638 3632 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
3639 3633 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3640 3634 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3641 3635 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
3642 3636 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3643 3637 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3644 3638 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3645 3639 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
3646 3640 border-color: #339bb9 #339bb9 #22697d;
3647 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 3644 .ui-btn.green {
3651 3645 background-color: #57a957;
3652 3646 background-repeat: repeat-x;
3653 3647 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
3654 3648 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3655 3649 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3656 3650 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
3657 3651 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3658 3652 background-image: -o-linear-gradient(top, #62c462, #57a957);
3659 3653 background-image: linear-gradient(to bottom, #62c462, #57a957);
3660 3654 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
3661 3655 border-color: #57a957 #57a957 #3d773d;
3662 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 3659 .ui-btn.blue.hidden {
3666 3660 display: none;
3667 3661 }
3668 3662
3669 3663 .ui-btn.active {
3670 3664 font-weight: bold;
3671 3665 }
3672 3666
3673 3667 ins, div.options a:hover {
3674 3668 text-decoration: none;
3675 3669 }
3676 3670
3677 3671 img,
3678 3672 #header #header-inner #quick li a:hover span.normal,
3679 3673 #content div.box div.form div.fields div.field div.textarea table td table td a,
3680 3674 #clone_url,
3681 3675 #clone_url_id
3682 3676 {
3683 3677 border: none;
3684 3678 }
3685 3679
3686 3680 img.icon, .right .merge img {
3687 3681 vertical-align: bottom;
3688 3682 }
3689 3683
3690 3684 #header ul#logged-user, #content div.box div.title ul.links,
3691 3685 #content div.box div.message div.dismiss,
3692 3686 #content div.box div.traffic div.legend ul {
3693 3687 float: right;
3694 3688 margin: 0;
3695 3689 padding: 0;
3696 3690 }
3697 3691
3698 3692 #header #header-inner #home, #header #header-inner #logo,
3699 3693 #content div.box ul.left, #content div.box ol.left,
3700 3694 #content div.box div.pagination-left, div#commit_history,
3701 3695 div#legend_data, div#legend_container, div#legend_choices {
3702 3696 float: left;
3703 3697 }
3704 3698
3705 3699 #header #header-inner #quick li #quick_login,
3706 3700 #header #header-inner #quick li:hover ul ul,
3707 3701 #header #header-inner #quick li:hover ul ul ul,
3708 3702 #header #header-inner #quick li:hover ul ul ul ul,
3709 3703 #content #left #menu ul.closed, #content #left #menu li ul.collapsed, .yui-tt-shadow {
3710 3704 display: none;
3711 3705 }
3712 3706
3713 3707 #header #header-inner #quick li:hover #quick_login,
3714 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 3709 display: block;
3716 3710 }
3717 3711
3718 3712 #content div.graph {
3719 3713 padding: 0 10px 10px;
3720 3714 }
3721 3715
3722 3716 #content div.box div.title ul.links li a:hover,
3723 3717 #content div.box div.title ul.links li.ui-tabs-selected a {
3724 3718
3725 3719 background: #6388ad; /* Old browsers */
3726 3720 background: -moz-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* FF3.6+ */
3727 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 3722 background: -webkit-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* Chrome10+,Safari5.1+ */
3729 3723 background: -o-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* Opera 11.10+ */
3730 3724 background: -ms-linear-gradient(top, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* IE10+ */
3731 3725 background: linear-gradient(to bottom, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* W3C */
3732 3726 /*filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#88bfe8', endColorstr='#70b0e0',GradientType=0 ); /* IE6-9 */*/
3733 3727 }
3734 3728
3735 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 3730 margin: 10px 24px 10px 44px;
3737 3731 }
3738 3732
3739 3733 #content div.box div.form, #content div.box div.table, #content div.box div.traffic {
3740 3734 position: relative;
3741 3735 clear: both;
3742 3736 overflow: hidden;
3743 3737 margin: 0;
3744 3738 padding: 0 20px 10px;
3745 3739 }
3746 3740
3747 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 3742 clear: both;
3749 3743 overflow: hidden;
3750 3744 margin: 0;
3751 3745 padding: 0;
3752 3746 }
3753 3747
3754 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 3749 height: 1%;
3756 3750 display: block;
3757 3751 color: #363636;
3758 3752 margin: 0;
3759 3753 padding: 2px 0 0;
3760 3754 }
3761 3755
3762 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 3757 background: #FBE3E4;
3764 3758 border-top: 1px solid #e1b2b3;
3765 3759 border-left: 1px solid #e1b2b3;
3766 3760 border-right: 1px solid #FBC2C4;
3767 3761 border-bottom: 1px solid #FBC2C4;
3768 3762 }
3769 3763
3770 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 3765 background: #E6EFC2;
3772 3766 border-top: 1px solid #cebb98;
3773 3767 border-left: 1px solid #cebb98;
3774 3768 border-right: 1px solid #c6d880;
3775 3769 border-bottom: 1px solid #c6d880;
3776 3770 }
3777 3771
3778 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 3773 margin: 0;
3780 3774 }
3781 3775
3782 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 3777 margin: 0 0 0 0px !important;
3784 3778 padding: 0;
3785 3779 }
3786 3780
3787 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 3782 margin: 0 0 0 200px;
3789 3783 padding: 0;
3790 3784 }
3791 3785
3792 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 3787 color: #000;
3794 3788 text-decoration: none;
3795 3789 }
3796 3790
3797 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 3792 border: 1px solid #666;
3799 3793 }
3800 3794
3801 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 3796 clear: both;
3803 3797 overflow: hidden;
3804 3798 margin: 0;
3805 3799 padding: 8px 0 2px;
3806 3800 }
3807 3801
3808 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 3803 float: left;
3810 3804 margin: 0;
3811 3805 }
3812 3806
3813 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 3808 height: 1%;
3815 3809 display: block;
3816 3810 float: left;
3817 3811 margin: 2px 0 0 4px;
3818 3812 }
3819 3813
3820 3814 div.form div.fields div.field div.button input,
3821 3815 #content div.box div.form div.fields div.buttons input
3822 3816 div.form div.fields div.buttons input,
3823 3817 #content div.box div.action div.button input {
3824 3818 font-size: 11px;
3825 3819 font-weight: 700;
3826 3820 margin: 0;
3827 3821 }
3828 3822
3829 3823 input.ui-button {
3830 3824 background: #e5e3e3 url("../images/button.png") repeat-x;
3831 3825 border-top: 1px solid #DDD;
3832 3826 border-left: 1px solid #c6c6c6;
3833 3827 border-right: 1px solid #DDD;
3834 3828 border-bottom: 1px solid #c6c6c6;
3835 3829 color: #515151 !important;
3836 3830 outline: none;
3837 3831 margin: 0;
3838 3832 padding: 6px 12px;
3839 3833 -webkit-border-radius: 4px 4px 4px 4px;
3840 3834 -khtml-border-radius: 4px 4px 4px 4px;
3841 3835 border-radius: 4px 4px 4px 4px;
3842 3836 box-shadow: 0 1px 0 #ececec;
3843 3837 cursor: pointer;
3844 3838 }
3845 3839
3846 3840 input.ui-button:hover {
3847 3841 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3848 3842 border-top: 1px solid #ccc;
3849 3843 border-left: 1px solid #bebebe;
3850 3844 border-right: 1px solid #b1b1b1;
3851 3845 border-bottom: 1px solid #afafaf;
3852 3846 }
3853 3847
3854 3848 div.form div.fields div.field div.highlight, #content div.box div.form div.fields div.buttons div.highlight {
3855 3849 display: inline;
3856 3850 }
3857 3851
3858 3852 #content div.box div.form div.fields div.buttons, div.form div.fields div.buttons {
3859 3853 margin: 10px 0 0 200px;
3860 3854 padding: 0;
3861 3855 }
3862 3856
3863 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 3858 margin: 10px 0 0;
3865 3859 }
3866 3860
3867 3861 #content div.box table td.user, #content div.box table td.address {
3868 3862 width: 10%;
3869 3863 text-align: center;
3870 3864 }
3871 3865
3872 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 3867 text-align: right;
3874 3868 margin: 6px 0 0;
3875 3869 padding: 0;
3876 3870 }
3877 3871
3878 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 3873 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3880 3874 border-top: 1px solid #ccc;
3881 3875 border-left: 1px solid #bebebe;
3882 3876 border-right: 1px solid #b1b1b1;
3883 3877 border-bottom: 1px solid #afafaf;
3884 3878 color: #515151;
3885 3879 margin: 0;
3886 3880 padding: 6px 12px;
3887 3881 }
3888 3882
3889 3883 #content div.box div.pagination div.results, #content div.box div.pagination-wh div.results {
3890 3884 text-align: left;
3891 3885 float: left;
3892 3886 margin: 0;
3893 3887 padding: 0;
3894 3888 }
3895 3889
3896 3890 #content div.box div.pagination div.results span, #content div.box div.pagination-wh div.results span {
3897 3891 height: 1%;
3898 3892 display: block;
3899 3893 float: left;
3900 3894 background: #ebebeb url("../images/pager.png") repeat-x;
3901 3895 border-top: 1px solid #dedede;
3902 3896 border-left: 1px solid #cfcfcf;
3903 3897 border-right: 1px solid #c4c4c4;
3904 3898 border-bottom: 1px solid #c4c4c4;
3905 3899 color: #4A4A4A;
3906 3900 font-weight: 700;
3907 3901 margin: 0;
3908 3902 padding: 6px 8px;
3909 3903 }
3910 3904
3911 3905 #content div.box div.pagination ul.pager li.disabled, #content div.box div.pagination-wh a.disabled {
3912 3906 color: #B4B4B4;
3913 3907 padding: 6px;
3914 3908 }
3915 3909
3916 3910 #login, #register {
3917 3911 width: 520px;
3918 3912 margin: 10% auto 0;
3919 3913 padding: 0;
3920 3914 }
3921 3915
3922 3916 #login div.color, #register div.color {
3923 3917 clear: both;
3924 3918 overflow: hidden;
3925 3919 background: #FFF;
3926 3920 margin: 10px auto 0;
3927 3921 padding: 3px 3px 3px 0;
3928 3922 }
3929 3923
3930 3924 #login div.color a, #register div.color a {
3931 3925 width: 20px;
3932 3926 height: 20px;
3933 3927 display: block;
3934 3928 float: left;
3935 3929 margin: 0 0 0 3px;
3936 3930 padding: 0;
3937 3931 }
3938 3932
3939 3933 #login div.title h5, #register div.title h5 {
3940 3934 color: #fff;
3941 3935 margin: 10px;
3942 3936 padding: 0;
3943 3937 }
3944 3938
3945 3939 #login div.form div.fields div.field, #register div.form div.fields div.field {
3946 3940 clear: both;
3947 3941 overflow: hidden;
3948 3942 margin: 0;
3949 3943 padding: 0 0 10px;
3950 3944 }
3951 3945
3952 3946 #login div.form div.fields div.field span.error-message, #register div.form div.fields div.field span.error-message {
3953 3947 height: 1%;
3954 3948 display: block;
3955 3949 color: red;
3956 3950 margin: 8px 0 0;
3957 3951 padding: 0;
3958 3952 max-width: 320px;
3959 3953 }
3960 3954
3961 3955 #login div.form div.fields div.field div.label label, #register div.form div.fields div.field div.label label {
3962 3956 color: #000;
3963 3957 font-weight: 700;
3964 3958 }
3965 3959
3966 3960 #login div.form div.fields div.field div.input, #register div.form div.fields div.field div.input {
3967 3961 float: left;
3968 3962 margin: 0;
3969 3963 padding: 0;
3970 3964 }
3971 3965
3972 3966 #login div.form div.fields div.field div.input input.large {
3973 3967 width: 250px;
3974 3968 }
3975 3969
3976 3970 #login div.form div.fields div.field div.checkbox, #register div.form div.fields div.field div.checkbox {
3977 3971 margin: 0 0 0 184px;
3978 3972 padding: 0;
3979 3973 }
3980 3974
3981 3975 #login div.form div.fields div.field div.checkbox label, #register div.form div.fields div.field div.checkbox label {
3982 3976 color: #565656;
3983 3977 font-weight: 700;
3984 3978 }
3985 3979
3986 3980 #login div.form div.fields div.buttons input, #register div.form div.fields div.buttons input {
3987 3981 color: #000;
3988 3982 font-size: 1em;
3989 3983 font-weight: 700;
3990 3984 margin: 0;
3991 3985 }
3992 3986
3993 3987 #changeset_content .container .wrapper, #graph_content .container .wrapper {
3994 3988 width: 600px;
3995 3989 }
3996 3990
3997 3991 #changeset_content .container .date, .ac .match {
3998 3992 font-weight: 700;
3999 3993 padding-top: 5px;
4000 3994 padding-bottom: 5px;
4001 3995 }
4002 3996
4003 3997 div#legend_container table td, div#legend_choices table td {
4004 3998 border: none !important;
4005 3999 height: 20px !important;
4006 4000 padding: 0 !important;
4007 4001 }
4008 4002
4009 4003 .q_filter_box {
4010 4004 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4011 4005 -webkit-border-radius: 4px;
4012 4006 border-radius: 4px;
4013 4007 border: 0 none;
4014 4008 color: #AAAAAA;
4015 4009 margin-bottom: -4px;
4016 4010 margin-top: -4px;
4017 4011 padding-left: 3px;
4018 4012 }
4019 4013
4020 4014 #node_filter {
4021 4015 border: 0px solid #545454;
4022 4016 color: #AAAAAA;
4023 4017 padding-left: 3px;
4024 4018 }
4025 4019
4026 4020
4027 4021 .group_members_wrap {
4028 4022 min-height: 85px;
4029 4023 padding-left: 20px;
4030 4024 }
4031 4025
4032 4026 .group_members .group_member {
4033 4027 height: 30px;
4034 4028 padding: 0px 0px 0px 0px;
4035 4029 }
4036 4030
4037 4031 .reviewers_member {
4038 4032 height: 15px;
4039 4033 padding: 0px 0px 0px 10px;
4040 4034 }
4041 4035
4042 4036 .emails_wrap {
4043 4037 padding: 0px 20px;
4044 4038 }
4045 4039
4046 4040 .emails_wrap .email_entry {
4047 4041 height: 30px;
4048 4042 padding: 0px 0px 0px 10px;
4049 4043 }
4050 4044 .emails_wrap .email_entry .email {
4051 4045 float: left
4052 4046 }
4053 4047 .emails_wrap .email_entry .email_action {
4054 4048 float: left
4055 4049 }
4056 4050
4057 4051 .ips_wrap {
4058 4052 padding: 0px 20px;
4059 4053 }
4060 4054
4061 4055 .ips_wrap .ip_entry {
4062 4056 height: 30px;
4063 4057 padding: 0px 0px 0px 10px;
4064 4058 }
4065 4059 .ips_wrap .ip_entry .ip {
4066 4060 float: left
4067 4061 }
4068 4062 .ips_wrap .ip_entry .ip_action {
4069 4063 float: left
4070 4064 }
4071 4065
4072 4066
4073 4067 /*README STYLE*/
4074 4068
4075 4069 div.readme {
4076 4070 padding: 0px;
4077 4071 }
4078 4072
4079 4073 div.readme h2 {
4080 4074 font-weight: normal;
4081 4075 }
4082 4076
4083 4077 div.readme .readme_box {
4084 4078 background-color: #fafafa;
4085 4079 }
4086 4080
4087 4081 div.readme .readme_box {
4088 4082 clear: both;
4089 4083 overflow: hidden;
4090 4084 margin: 0;
4091 4085 padding: 0 20px 10px;
4092 4086 }
4093 4087
4094 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 4089 border-bottom: 0 !important;
4096 4090 margin: 0 !important;
4097 4091 padding: 0 !important;
4098 4092 line-height: 1.5em !important;
4099 4093 }
4100 4094
4101 4095
4102 4096 div.readme .readme_box h1:first-child {
4103 4097 padding-top: .25em !important;
4104 4098 }
4105 4099
4106 4100 div.readme .readme_box h2, div.readme .readme_box h3 {
4107 4101 margin: 1em 0 !important;
4108 4102 }
4109 4103
4110 4104 div.readme .readme_box h2 {
4111 4105 margin-top: 1.5em !important;
4112 4106 border-top: 4px solid #e0e0e0 !important;
4113 4107 padding-top: .5em !important;
4114 4108 }
4115 4109
4116 4110 div.readme .readme_box p {
4117 4111 color: black !important;
4118 4112 margin: 1em 0 !important;
4119 4113 line-height: 1.5em !important;
4120 4114 }
4121 4115
4122 4116 div.readme .readme_box ul {
4123 4117 list-style: disc !important;
4124 4118 margin: 1em 0 1em 2em !important;
4125 4119 }
4126 4120
4127 4121 div.readme .readme_box ol {
4128 4122 list-style: decimal;
4129 4123 margin: 1em 0 1em 2em !important;
4130 4124 }
4131 4125
4132 4126 div.readme .readme_box pre, code {
4133 4127 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
4134 4128 }
4135 4129
4136 4130 div.readme .readme_box code {
4137 4131 font-size: 12px !important;
4138 4132 background-color: ghostWhite !important;
4139 4133 color: #444 !important;
4140 4134 padding: 0 .2em !important;
4141 4135 border: 1px solid #dedede !important;
4142 4136 }
4143 4137
4144 4138 div.readme .readme_box pre code {
4145 4139 padding: 0 !important;
4146 4140 font-size: 12px !important;
4147 4141 background-color: #eee !important;
4148 4142 border: none !important;
4149 4143 }
4150 4144
4151 4145 div.readme .readme_box pre {
4152 4146 margin: 1em 0;
4153 4147 font-size: 12px;
4154 4148 background-color: #eee;
4155 4149 border: 1px solid #ddd;
4156 4150 padding: 5px;
4157 4151 color: #444;
4158 4152 overflow: auto;
4159 4153 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4160 4154 -webkit-border-radius: 3px;
4161 4155 border-radius: 3px;
4162 4156 }
4163 4157
4164 4158 div.readme .readme_box table {
4165 4159 display: table;
4166 4160 border-collapse: separate;
4167 4161 border-spacing: 2px;
4168 4162 border-color: gray;
4169 4163 width: auto !important;
4170 4164 }
4171 4165
4172 4166
4173 4167 /** RST STYLE **/
4174 4168
4175 4169
4176 4170 div.rst-block {
4177 4171 padding: 0px;
4178 4172 }
4179 4173
4180 4174 div.rst-block h2 {
4181 4175 font-weight: normal;
4182 4176 }
4183 4177
4184 4178 div.rst-block {
4185 4179 background-color: #fafafa;
4186 4180 }
4187 4181
4188 4182 div.rst-block {
4189 4183 clear: both;
4190 4184 overflow: hidden;
4191 4185 margin: 0;
4192 4186 padding: 0 20px 10px;
4193 4187 }
4194 4188
4195 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 4190 border-bottom: 0 !important;
4197 4191 margin: 0 !important;
4198 4192 padding: 0 !important;
4199 4193 line-height: 1.5em !important;
4200 4194 }
4201 4195
4202 4196
4203 4197 div.rst-block h1:first-child {
4204 4198 padding-top: .25em !important;
4205 4199 }
4206 4200
4207 4201 div.rst-block h2, div.rst-block h3 {
4208 4202 margin: 1em 0 !important;
4209 4203 }
4210 4204
4211 4205 div.rst-block h2 {
4212 4206 margin-top: 1.5em !important;
4213 4207 border-top: 4px solid #e0e0e0 !important;
4214 4208 padding-top: .5em !important;
4215 4209 }
4216 4210
4217 4211 div.rst-block p {
4218 4212 color: black !important;
4219 4213 margin: 1em 0 !important;
4220 4214 line-height: 1.5em !important;
4221 4215 }
4222 4216
4223 4217 div.rst-block ul {
4224 4218 list-style: disc !important;
4225 4219 margin: 1em 0 1em 2em !important;
4226 4220 }
4227 4221
4228 4222 div.rst-block ol {
4229 4223 list-style: decimal;
4230 4224 margin: 1em 0 1em 2em !important;
4231 4225 }
4232 4226
4233 4227 div.rst-block pre, code {
4234 4228 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
4235 4229 }
4236 4230
4237 4231 div.rst-block code {
4238 4232 font-size: 12px !important;
4239 4233 background-color: ghostWhite !important;
4240 4234 color: #444 !important;
4241 4235 padding: 0 .2em !important;
4242 4236 border: 1px solid #dedede !important;
4243 4237 }
4244 4238
4245 4239 div.rst-block pre code {
4246 4240 padding: 0 !important;
4247 4241 font-size: 12px !important;
4248 4242 background-color: #eee !important;
4249 4243 border: none !important;
4250 4244 }
4251 4245
4252 4246 div.rst-block pre {
4253 4247 margin: 1em 0;
4254 4248 font-size: 12px;
4255 4249 background-color: #eee;
4256 4250 border: 1px solid #ddd;
4257 4251 padding: 5px;
4258 4252 color: #444;
4259 4253 overflow: auto;
4260 4254 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4261 4255 -webkit-border-radius: 3px;
4262 4256 border-radius: 3px;
4263 4257 }
4264 4258
4265 4259
4266 4260 /** comment main **/
4267 4261 .comments {
4268 4262 padding: 10px 20px;
4269 4263 }
4270 4264
4271 4265 .comments .comment {
4272 4266 border: 1px solid #ddd;
4273 4267 margin-top: 10px;
4274 4268 -webkit-border-radius: 4px;
4275 4269 border-radius: 4px;
4276 4270 }
4277 4271
4278 4272 .comments .comment .meta {
4279 4273 background: #f8f8f8;
4280 4274 padding: 4px;
4281 4275 border-bottom: 1px solid #ddd;
4282 4276 height: 18px;
4283 4277 }
4284 4278
4285 4279 .comments .comment .meta img {
4286 4280 vertical-align: middle;
4287 4281 }
4288 4282
4289 4283 .comments .comment .meta .user {
4290 4284 font-weight: bold;
4291 4285 float: left;
4292 4286 padding: 4px 2px 2px 2px;
4293 4287 }
4294 4288
4295 4289 .comments .comment .meta .date {
4296 4290 float: left;
4297 4291 padding: 4px 4px 0px 4px;
4298 4292 }
4299 4293
4300 4294 .comments .comment .text {
4301 4295 background-color: #FAFAFA;
4302 4296 }
4303 4297 .comment .text div.rst-block p {
4304 4298 margin: 0.5em 0px !important;
4305 4299 }
4306 4300
4307 4301 .comments .comments-number {
4308 4302 padding: 0px 0px 10px 0px;
4309 4303 font-weight: bold;
4310 4304 color: #666;
4311 4305 font-size: 16px;
4312 4306 }
4313 4307
4314 4308 /** comment form **/
4315 4309
4316 4310 .status-block {
4317 4311 min-height: 80px;
4318 4312 clear: both
4319 4313 }
4320 4314
4321 4315 .comment-form .clearfix {
4322 4316 background: #EEE;
4323 4317 -webkit-border-radius: 4px;
4324 4318 border-radius: 4px;
4325 4319 padding: 10px;
4326 4320 }
4327 4321
4328 4322 div.comment-form {
4329 4323 margin-top: 20px;
4330 4324 }
4331 4325
4332 4326 .comment-form strong {
4333 4327 display: block;
4334 4328 margin-bottom: 15px;
4335 4329 }
4336 4330
4337 4331 .comment-form textarea {
4338 4332 width: 100%;
4339 4333 height: 100px;
4340 4334 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
4341 4335 }
4342 4336
4343 4337 form.comment-form {
4344 4338 margin-top: 10px;
4345 4339 margin-left: 10px;
4346 4340 }
4347 4341
4348 4342 .comment-form-submit {
4349 4343 margin-top: 5px;
4350 4344 margin-left: 525px;
4351 4345 }
4352 4346
4353 4347 .file-comments {
4354 4348 display: none;
4355 4349 }
4356 4350
4357 4351 .comment-form .comment {
4358 4352 margin-left: 10px;
4359 4353 }
4360 4354
4361 4355 .comment-form .comment-help {
4362 4356 padding: 0px 0px 5px 0px;
4363 4357 color: #666;
4364 4358 }
4365 4359
4366 4360 .comment-form .comment-button {
4367 4361 padding-top: 5px;
4368 4362 }
4369 4363
4370 4364 .add-another-button {
4371 4365 margin-left: 10px;
4372 4366 margin-top: 10px;
4373 4367 margin-bottom: 10px;
4374 4368 }
4375 4369
4376 4370 .comment .buttons {
4377 4371 float: right;
4378 4372 padding: 2px 2px 0px 0px;
4379 4373 }
4380 4374
4381 4375
4382 4376 .show-inline-comments {
4383 4377 position: relative;
4384 4378 top: 1px
4385 4379 }
4386 4380
4387 4381 /** comment inline form **/
4388 4382 .comment-inline-form .overlay {
4389 4383 display: none;
4390 4384 }
4391 4385 .comment-inline-form .overlay.submitting {
4392 4386 display: block;
4393 4387 background: none repeat scroll 0 0 white;
4394 4388 font-size: 16px;
4395 4389 opacity: 0.5;
4396 4390 position: absolute;
4397 4391 text-align: center;
4398 4392 vertical-align: top;
4399 4393
4400 4394 }
4401 4395 .comment-inline-form .overlay.submitting .overlay-text {
4402 4396 width: 100%;
4403 4397 margin-top: 5%;
4404 4398 }
4405 4399
4406 4400 .comment-inline-form .clearfix {
4407 4401 background: #EEE;
4408 4402 -webkit-border-radius: 4px;
4409 4403 border-radius: 4px;
4410 4404 padding: 5px;
4411 4405 }
4412 4406
4413 4407 div.comment-inline-form {
4414 4408 padding: 4px 0px 6px 0px;
4415 4409 }
4416 4410
4417 4411 .comment-inline-form strong {
4418 4412 display: block;
4419 4413 margin-bottom: 15px;
4420 4414 }
4421 4415
4422 4416 .comment-inline-form textarea {
4423 4417 width: 100%;
4424 4418 height: 100px;
4425 4419 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
4426 4420 }
4427 4421
4428 4422 form.comment-inline-form {
4429 4423 margin-top: 10px;
4430 4424 margin-left: 10px;
4431 4425 }
4432 4426
4433 4427 .comment-inline-form-submit {
4434 4428 margin-top: 5px;
4435 4429 margin-left: 525px;
4436 4430 }
4437 4431
4438 4432 .file-comments {
4439 4433 display: none;
4440 4434 }
4441 4435
4442 4436 .comment-inline-form .comment {
4443 4437 margin-left: 10px;
4444 4438 }
4445 4439
4446 4440 .comment-inline-form .comment-help {
4447 4441 padding: 0px 0px 2px 0px;
4448 4442 color: #666666;
4449 4443 font-size: 10px;
4450 4444 }
4451 4445
4452 4446 .comment-inline-form .comment-button {
4453 4447 padding-top: 5px;
4454 4448 }
4455 4449
4456 4450 /** comment inline **/
4457 4451 .inline-comments {
4458 4452 padding: 10px 20px;
4459 4453 }
4460 4454
4461 4455 .inline-comments div.rst-block {
4462 4456 clear: both;
4463 4457 overflow: hidden;
4464 4458 margin: 0;
4465 4459 padding: 0 20px 0px;
4466 4460 }
4467 4461 .inline-comments .comment {
4468 4462 border: 1px solid #ddd;
4469 4463 -webkit-border-radius: 4px;
4470 4464 border-radius: 4px;
4471 4465 margin: 3px 3px 5px 5px;
4472 4466 background-color: #FAFAFA;
4473 4467 }
4474 4468 .inline-comments .add-comment {
4475 4469 padding: 2px 4px 8px 5px;
4476 4470 }
4477 4471
4478 4472 .inline-comments .comment-wrapp {
4479 4473 padding: 1px;
4480 4474 }
4481 4475 .inline-comments .comment .meta {
4482 4476 background: #f8f8f8;
4483 4477 padding: 4px;
4484 4478 border-bottom: 1px solid #ddd;
4485 4479 height: 20px;
4486 4480 }
4487 4481
4488 4482 .inline-comments .comment .meta img {
4489 4483 vertical-align: middle;
4490 4484 }
4491 4485
4492 4486 .inline-comments .comment .meta .user {
4493 4487 font-weight: bold;
4494 4488 float: left;
4495 4489 padding: 3px;
4496 4490 }
4497 4491
4498 4492 .inline-comments .comment .meta .date {
4499 4493 float: left;
4500 4494 padding: 3px;
4501 4495 }
4502 4496
4503 4497 .inline-comments .comment .text {
4504 4498 background-color: #FAFAFA;
4505 4499 }
4506 4500
4507 4501 .inline-comments .comments-number {
4508 4502 padding: 0px 0px 10px 0px;
4509 4503 font-weight: bold;
4510 4504 color: #666;
4511 4505 font-size: 16px;
4512 4506 }
4513 4507 .inline-comments-button .add-comment {
4514 4508 margin: 2px 0px 8px 5px !important
4515 4509 }
4516 4510
4517 4511 .notification-paginator {
4518 4512 padding: 0px 0px 4px 16px;
4519 4513 float: left;
4520 4514 }
4521 4515
4522 4516 #context-pages .pull-request span,
4523 4517 .menu_link_notifications {
4524 4518 padding: 4px 4px !important;
4525 4519 text-align: center;
4526 4520 color: #888 !important;
4527 4521 background-color: #DEDEDE !important;
4528 4522 border-radius: 4px !important;
4529 4523 -webkit-border-radius: 4px !important;
4530 4524 }
4531 4525
4532 4526 .notification-header {
4533 4527 padding-top: 6px;
4534 4528 }
4535 4529 .notification-header .desc {
4536 4530 font-size: 16px;
4537 4531 height: 24px;
4538 4532 float: left
4539 4533 }
4540 4534 .notification-list .container.unread {
4541 4535 background: none repeat scroll 0 0 rgba(255, 255, 180, 0.6);
4542 4536 }
4543 4537 .notification-header .gravatar {
4544 4538 background: none repeat scroll 0 0 transparent;
4545 4539 padding: 0px 0px 0px 8px;
4546 4540 }
4547 4541 .notification-list .container .notification-header .desc {
4548 4542 font-weight: bold;
4549 4543 font-size: 17px;
4550 4544 }
4551 4545 .notification-table {
4552 4546 border: 1px solid #ccc;
4553 4547 -webkit-border-radius: 6px 6px 6px 6px;
4554 4548 border-radius: 6px 6px 6px 6px;
4555 4549 clear: both;
4556 4550 margin: 0px 20px 0px 20px;
4557 4551 }
4558 4552 .notification-header .delete-notifications {
4559 4553 float: right;
4560 4554 padding-top: 8px;
4561 4555 cursor: pointer;
4562 4556 }
4563 4557 .notification-header .read-notifications {
4564 4558 float: right;
4565 4559 padding-top: 8px;
4566 4560 cursor: pointer;
4567 4561 }
4568 4562 .notification-subject {
4569 4563 clear: both;
4570 4564 border-bottom: 1px solid #eee;
4571 4565 padding: 5px 0px 5px 38px;
4572 4566 }
4573 4567
4574 4568 .notification-body {
4575 4569 clear: both;
4576 4570 margin: 34px 2px 2px 8px
4577 4571 }
4578 4572
4579 4573 /****
4580 4574 PULL REQUESTS
4581 4575 *****/
4582 4576 .pullrequests_section_head {
4583 4577 padding: 10px 10px 10px 0px;
4584 4578 font-size: 16px;
4585 4579 font-weight: bold;
4586 4580 }
4587 4581
4588 4582 /****
4589 4583 PERMS
4590 4584 *****/
4591 4585 #perms .perms_section_head {
4592 4586 padding: 10px 10px 10px 0px;
4593 4587 font-size: 16px;
4594 4588 font-weight: bold;
4595 4589 }
4596 4590
4597 4591 #perms .perm_tag {
4598 4592 padding: 1px 3px 1px 3px;
4599 4593 font-size: 10px;
4600 4594 font-weight: bold;
4601 4595 text-transform: uppercase;
4602 4596 white-space: nowrap;
4603 4597 -webkit-border-radius: 3px;
4604 4598 border-radius: 3px;
4605 4599 }
4606 4600
4607 4601 #perms .perm_tag.admin {
4608 4602 background-color: #B94A48;
4609 4603 color: #ffffff;
4610 4604 }
4611 4605
4612 4606 #perms .perm_tag.write {
4613 4607 background-color: #DB7525;
4614 4608 color: #ffffff;
4615 4609 }
4616 4610
4617 4611 #perms .perm_tag.read {
4618 4612 background-color: #468847;
4619 4613 color: #ffffff;
4620 4614 }
4621 4615
4622 4616 #perms .perm_tag.none {
4623 4617 background-color: #bfbfbf;
4624 4618 color: #ffffff;
4625 4619 }
4626 4620
4627 4621 .perm-gravatar {
4628 4622 vertical-align: middle;
4629 4623 padding: 2px;
4630 4624 }
4631 4625 .perm-gravatar-ac {
4632 4626 vertical-align: middle;
4633 4627 padding: 2px;
4634 4628 width: 14px;
4635 4629 height: 14px;
4636 4630 }
4637 4631
4638 4632 /*****************************************************************************
4639 4633 DIFFS CSS
4640 4634 ******************************************************************************/
4641 4635 .diff-collapse {
4642 4636 text-align: center;
4643 4637 margin-bottom: -15px;
4644 4638 }
4645 4639 .diff-collapse-button {
4646 4640 cursor: pointer;
4647 4641 color: #666;
4648 4642 font-size: 16px;
4649 4643 }
4650 4644 .diff-container {
4651 4645
4652 4646 }
4653 4647
4654 4648 .diff-container.hidden {
4655 4649 display: none;
4656 4650 overflow: hidden;
4657 4651 }
4658 4652
4659 4653
4660 4654 div.diffblock {
4661 4655 overflow: auto;
4662 4656 padding: 0px;
4663 4657 border: 1px solid #ccc;
4664 4658 background: #f8f8f8;
4665 4659 font-size: 100%;
4666 4660 line-height: 100%;
4667 4661 /* new */
4668 4662 line-height: 125%;
4669 4663 -webkit-border-radius: 6px 6px 0px 0px;
4670 4664 border-radius: 6px 6px 0px 0px;
4671 4665 }
4672 4666 div.diffblock.margined {
4673 4667 margin: 0px 20px 0px 20px;
4674 4668 }
4675 4669 div.diffblock .code-header {
4676 4670 border-bottom: 1px solid #CCCCCC;
4677 4671 background: #EEEEEE;
4678 4672 padding: 10px 0 10px 0;
4679 4673 height: 14px;
4680 4674 }
4681 4675
4682 4676 div.diffblock .code-header.banner {
4683 4677 border-bottom: 1px solid #CCCCCC;
4684 4678 background: #EEEEEE;
4685 4679 height: 14px;
4686 4680 margin: 0px 95px 0px 95px;
4687 4681 padding: 3px 3px 11px 3px;
4688 4682 }
4689 4683
4690 4684 div.diffblock .code-header.cv {
4691 4685 height: 34px;
4692 4686 }
4693 4687 div.diffblock .code-header-title {
4694 4688 padding: 0px 0px 10px 5px !important;
4695 4689 margin: 0 !important;
4696 4690 }
4697 4691 div.diffblock .code-header .hash {
4698 4692 float: left;
4699 4693 padding: 2px 0 0 2px;
4700 4694 }
4701 4695 div.diffblock .code-header .date {
4702 4696 float: left;
4703 4697 text-transform: uppercase;
4704 4698 padding: 2px 0px 0px 2px;
4705 4699 }
4706 4700 div.diffblock .code-header div {
4707 4701 margin-left: 4px;
4708 4702 font-weight: bold;
4709 4703 font-size: 14px;
4710 4704 }
4711 4705
4712 4706 div.diffblock .parents {
4713 4707 float: left;
4714 4708 height: 26px;
4715 4709 width: 100px;
4716 4710 font-size: 10px;
4717 4711 font-weight: 400;
4718 4712 vertical-align: middle;
4719 4713 padding: 0px 2px 2px 2px;
4720 4714 background-color: #eeeeee;
4721 4715 border-bottom: 1px solid #CCCCCC;
4722 4716 }
4723 4717
4724 4718 div.diffblock .children {
4725 4719 float: right;
4726 4720 height: 26px;
4727 4721 width: 100px;
4728 4722 font-size: 10px;
4729 4723 font-weight: 400;
4730 4724 vertical-align: middle;
4731 4725 text-align: right;
4732 4726 padding: 0px 2px 2px 2px;
4733 4727 background-color: #eeeeee;
4734 4728 border-bottom: 1px solid #CCCCCC;
4735 4729 }
4736 4730
4737 4731 div.diffblock .code-body {
4738 4732 background: #FFFFFF;
4739 4733 }
4740 4734 div.diffblock pre.raw {
4741 4735 background: #FFFFFF;
4742 4736 color: #000000;
4743 4737 }
4744 4738 table.code-difftable {
4745 4739 border-collapse: collapse;
4746 4740 width: 99%;
4747 4741 border-radius: 0px !important;
4748 4742 }
4749 4743 table.code-difftable td {
4750 4744 padding: 0 !important;
4751 4745 background: none !important;
4752 4746 border: 0 !important;
4753 4747 vertical-align: baseline !important
4754 4748 }
4755 4749 table.code-difftable .context {
4756 4750 background: none repeat scroll 0 0 #DDE7EF;
4757 4751 }
4758 4752 table.code-difftable .add {
4759 4753 background: none repeat scroll 0 0 #DDFFDD;
4760 4754 }
4761 4755 table.code-difftable .add ins {
4762 4756 background: none repeat scroll 0 0 #AAFFAA;
4763 4757 text-decoration: none;
4764 4758 }
4765 4759 table.code-difftable .del {
4766 4760 background: none repeat scroll 0 0 #FFDDDD;
4767 4761 }
4768 4762 table.code-difftable .del del {
4769 4763 background: none repeat scroll 0 0 #FFAAAA;
4770 4764 text-decoration: none;
4771 4765 }
4772 4766
4773 4767 /** LINE NUMBERS **/
4774 4768 table.code-difftable .lineno {
4775 4769
4776 4770 padding-left: 2px;
4777 4771 padding-right: 2px;
4778 4772 text-align: right;
4779 4773 width: 32px;
4780 4774 -moz-user-select: none;
4781 4775 -webkit-user-select: none;
4782 4776 border-right: 1px solid #CCC !important;
4783 4777 border-left: 0px solid #CCC !important;
4784 4778 border-top: 0px solid #CCC !important;
4785 4779 border-bottom: none !important;
4786 4780 vertical-align: middle !important;
4787 4781
4788 4782 }
4789 4783 table.code-difftable .lineno.new {
4790 4784 }
4791 4785 table.code-difftable .lineno.old {
4792 4786 }
4793 4787 table.code-difftable .lineno a {
4794 4788 color: #747474 !important;
4795 4789 font: 11px "Bitstream Vera Sans Mono",Monaco,"Courier New",Courier,monospace !important;
4796 4790 letter-spacing: -1px;
4797 4791 text-align: right;
4798 4792 padding-right: 2px;
4799 4793 cursor: pointer;
4800 4794 display: block;
4801 4795 width: 32px;
4802 4796 }
4803 4797
4804 4798 table.code-difftable .lineno-inline {
4805 4799 background: none repeat scroll 0 0 #FFF !important;
4806 4800 padding-left: 2px;
4807 4801 padding-right: 2px;
4808 4802 text-align: right;
4809 4803 width: 30px;
4810 4804 -moz-user-select: none;
4811 4805 -webkit-user-select: none;
4812 4806 }
4813 4807
4814 4808 /** CODE **/
4815 4809 table.code-difftable .code {
4816 4810 display: block;
4817 4811 width: 100%;
4818 4812 }
4819 4813 table.code-difftable .code td {
4820 4814 margin: 0;
4821 4815 padding: 0;
4822 4816 }
4823 4817 table.code-difftable .code pre {
4824 4818 margin: 0;
4825 4819 padding: 0;
4826 4820 height: 17px;
4827 4821 line-height: 17px;
4828 4822 }
4829 4823
4830 4824
4831 4825 .diffblock.margined.comm .line .code:hover {
4832 4826 background-color: #FFFFCC !important;
4833 4827 cursor: pointer !important;
4834 4828 background-image: url("../images/icons/comment_add.png") !important;
4835 4829 background-repeat: no-repeat !important;
4836 4830 background-position: right !important;
4837 4831 background-position: 0% 50% !important;
4838 4832 }
4839 4833 .diffblock.margined.comm .line .code.no-comment:hover {
4840 4834 background-image: none !important;
4841 4835 cursor: auto !important;
4842 4836 background-color: inherit !important;
4843 4837 }
4844 4838
4845 4839 div.comment:target>.comment-wrapp {
4846 4840 border: solid 2px #ee0 !important;
4847 4841 }
4848 4842
4849 4843 .lineno:target a {
4850 4844 border: solid 2px #ee0 !important;
4851 4845 margin: -2px;
4852 4846 }
@@ -1,2174 +1,2173 b''
1 1 /**
2 2 RhodeCode JS Files
3 3 **/
4 4
5 5 if (typeof console == "undefined" || typeof console.log == "undefined"){
6 6 console = { log: function() {} }
7 7 }
8 8
9 9
10 10 var str_repeat = function(i, m) {
11 11 for (var o = []; m > 0; o[--m] = i);
12 12 return o.join('');
13 13 };
14 14
15 15 /**
16 16 * INJECT .format function into String
17 17 * Usage: "My name is {0} {1}".format("Johny","Bravo")
18 18 * Return "My name is Johny Bravo"
19 19 * Inspired by https://gist.github.com/1049426
20 20 */
21 21 String.prototype.format = function() {
22 22
23 23 function format() {
24 24 var str = this;
25 25 var len = arguments.length+1;
26 26 var safe = undefined;
27 27 var arg = undefined;
28 28
29 29 // For each {0} {1} {n...} replace with the argument in that position. If
30 30 // the argument is an object or an array it will be stringified to JSON.
31 31 for (var i=0; i < len; arg = arguments[i++]) {
32 32 safe = typeof arg === 'object' ? JSON.stringify(arg) : arg;
33 33 str = str.replace(RegExp('\\{'+(i-1)+'\\}', 'g'), safe);
34 34 }
35 35 return str;
36 36 }
37 37
38 38 // Save a reference of what may already exist under the property native.
39 39 // Allows for doing something like: if("".format.native) { /* use native */ }
40 40 format.native = String.prototype.format;
41 41
42 42 // Replace the prototype property
43 43 return format;
44 44
45 45 }();
46 46
47 47 String.prototype.strip = function(char) {
48 48 if(char === undefined){
49 49 char = '\\s';
50 50 }
51 51 return this.replace(new RegExp('^'+char+'+|'+char+'+$','g'), '');
52 52 }
53 53 String.prototype.lstrip = function(char) {
54 54 if(char === undefined){
55 55 char = '\\s';
56 56 }
57 57 return this.replace(new RegExp('^'+char+'+'),'');
58 58 }
59 59 String.prototype.rstrip = function(char) {
60 60 if(char === undefined){
61 61 char = '\\s';
62 62 }
63 63 return this.replace(new RegExp(''+char+'+$'),'');
64 64 }
65 65
66 66
67 67 if(!Array.prototype.indexOf) {
68 68 Array.prototype.indexOf = function(needle) {
69 69 for(var i = 0; i < this.length; i++) {
70 70 if(this[i] === needle) {
71 71 return i;
72 72 }
73 73 }
74 74 return -1;
75 75 };
76 76 }
77 77
78 78 // IE(CRAP) doesn't support previousElementSibling
79 79 var prevElementSibling = function( el ) {
80 80 if( el.previousElementSibling ) {
81 81 return el.previousElementSibling;
82 82 } else {
83 83 while( el = el.previousSibling ) {
84 84 if( el.nodeType === 1 ) return el;
85 85 }
86 86 }
87 87 }
88 88
89 89 /**
90 90 * SmartColorGenerator
91 91 *
92 92 *usage::
93 93 * var CG = new ColorGenerator();
94 94 * var col = CG.getColor(key); //returns array of RGB
95 95 * 'rgb({0})'.format(col.join(',')
96 96 *
97 97 * @returns {ColorGenerator}
98 98 */
99 99 var ColorGenerator = function(){
100 100 this.GOLDEN_RATIO = 0.618033988749895;
101 101 this.CURRENT_RATIO = 0.22717784590367374 // this can be random
102 102 this.HSV_1 = 0.75;//saturation
103 103 this.HSV_2 = 0.95;
104 104 this.color;
105 105 this.cacheColorMap = {};
106 106 };
107 107
108 108 ColorGenerator.prototype = {
109 109 getColor:function(key){
110 110 if(this.cacheColorMap[key] !== undefined){
111 111 return this.cacheColorMap[key];
112 112 }
113 113 else{
114 114 this.cacheColorMap[key] = this.generateColor();
115 115 return this.cacheColorMap[key];
116 116 }
117 117 },
118 118 _hsvToRgb:function(h,s,v){
119 119 if (s == 0.0)
120 120 return [v, v, v];
121 121 i = parseInt(h * 6.0)
122 122 f = (h * 6.0) - i
123 123 p = v * (1.0 - s)
124 124 q = v * (1.0 - s * f)
125 125 t = v * (1.0 - s * (1.0 - f))
126 126 i = i % 6
127 127 if (i == 0)
128 128 return [v, t, p]
129 129 if (i == 1)
130 130 return [q, v, p]
131 131 if (i == 2)
132 132 return [p, v, t]
133 133 if (i == 3)
134 134 return [p, q, v]
135 135 if (i == 4)
136 136 return [t, p, v]
137 137 if (i == 5)
138 138 return [v, p, q]
139 139 },
140 140 generateColor:function(){
141 141 this.CURRENT_RATIO = this.CURRENT_RATIO+this.GOLDEN_RATIO;
142 142 this.CURRENT_RATIO = this.CURRENT_RATIO %= 1;
143 143 HSV_tuple = [this.CURRENT_RATIO, this.HSV_1, this.HSV_2]
144 144 RGB_tuple = this._hsvToRgb(HSV_tuple[0],HSV_tuple[1],HSV_tuple[2]);
145 145 function toRgb(v){
146 146 return ""+parseInt(v*256)
147 147 }
148 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 154 * PyRoutesJS
155 155 *
156 156 * Usage pyroutes.url('mark_error_fixed',{"error_id":error_id}) // /mark_error_fixed/<error_id>
157 157 */
158 158 var pyroutes = (function() {
159 159 // access global map defined in special file pyroutes
160 160 var matchlist = PROUTES_MAP;
161 161 var sprintf = (function() {
162 162 function get_type(variable) {
163 163 return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();
164 164 }
165 165 function str_repeat(input, multiplier) {
166 166 for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */}
167 167 return output.join('');
168 168 }
169 169
170 170 var str_format = function() {
171 171 if (!str_format.cache.hasOwnProperty(arguments[0])) {
172 172 str_format.cache[arguments[0]] = str_format.parse(arguments[0]);
173 173 }
174 174 return str_format.format.call(null, str_format.cache[arguments[0]], arguments);
175 175 };
176 176
177 177 str_format.format = function(parse_tree, argv) {
178 178 var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;
179 179 for (i = 0; i < tree_length; i++) {
180 180 node_type = get_type(parse_tree[i]);
181 181 if (node_type === 'string') {
182 182 output.push(parse_tree[i]);
183 183 }
184 184 else if (node_type === 'array') {
185 185 match = parse_tree[i]; // convenience purposes only
186 186 if (match[2]) { // keyword argument
187 187 arg = argv[cursor];
188 188 for (k = 0; k < match[2].length; k++) {
189 189 if (!arg.hasOwnProperty(match[2][k])) {
190 190 throw(sprintf('[sprintf] property "%s" does not exist', match[2][k]));
191 191 }
192 192 arg = arg[match[2][k]];
193 193 }
194 194 }
195 195 else if (match[1]) { // positional argument (explicit)
196 196 arg = argv[match[1]];
197 197 }
198 198 else { // positional argument (implicit)
199 199 arg = argv[cursor++];
200 200 }
201 201
202 202 if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {
203 203 throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)));
204 204 }
205 205 switch (match[8]) {
206 206 case 'b': arg = arg.toString(2); break;
207 207 case 'c': arg = String.fromCharCode(arg); break;
208 208 case 'd': arg = parseInt(arg, 10); break;
209 209 case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;
210 210 case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;
211 211 case 'o': arg = arg.toString(8); break;
212 212 case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;
213 213 case 'u': arg = Math.abs(arg); break;
214 214 case 'x': arg = arg.toString(16); break;
215 215 case 'X': arg = arg.toString(16).toUpperCase(); break;
216 216 }
217 217 arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);
218 218 pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';
219 219 pad_length = match[6] - String(arg).length;
220 220 pad = match[6] ? str_repeat(pad_character, pad_length) : '';
221 221 output.push(match[5] ? arg + pad : pad + arg);
222 222 }
223 223 }
224 224 return output.join('');
225 225 };
226 226
227 227 str_format.cache = {};
228 228
229 229 str_format.parse = function(fmt) {
230 230 var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;
231 231 while (_fmt) {
232 232 if ((match = /^[^\x25]+/.exec(_fmt)) !== null) {
233 233 parse_tree.push(match[0]);
234 234 }
235 235 else if ((match = /^\x25{2}/.exec(_fmt)) !== null) {
236 236 parse_tree.push('%');
237 237 }
238 238 else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {
239 239 if (match[2]) {
240 240 arg_names |= 1;
241 241 var field_list = [], replacement_field = match[2], field_match = [];
242 242 if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
243 243 field_list.push(field_match[1]);
244 244 while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
245 245 if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
246 246 field_list.push(field_match[1]);
247 247 }
248 248 else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) {
249 249 field_list.push(field_match[1]);
250 250 }
251 251 else {
252 252 throw('[sprintf] huh?');
253 253 }
254 254 }
255 255 }
256 256 else {
257 257 throw('[sprintf] huh?');
258 258 }
259 259 match[2] = field_list;
260 260 }
261 261 else {
262 262 arg_names |= 2;
263 263 }
264 264 if (arg_names === 3) {
265 265 throw('[sprintf] mixing positional and named placeholders is not (yet) supported');
266 266 }
267 267 parse_tree.push(match);
268 268 }
269 269 else {
270 270 throw('[sprintf] huh?');
271 271 }
272 272 _fmt = _fmt.substring(match[0].length);
273 273 }
274 274 return parse_tree;
275 275 };
276 276
277 277 return str_format;
278 278 })();
279 279
280 280 var vsprintf = function(fmt, argv) {
281 281 argv.unshift(fmt);
282 282 return sprintf.apply(null, argv);
283 283 };
284 284 return {
285 285 'url': function(route_name, params) {
286 286 var result = route_name;
287 287 if (typeof(params) != 'object'){
288 288 params = {};
289 289 }
290 290 if (matchlist.hasOwnProperty(route_name)) {
291 291 var route = matchlist[route_name];
292 292 // param substitution
293 293 for(var i=0; i < route[1].length; i++) {
294 294
295 295 if (!params.hasOwnProperty(route[1][i]))
296 296 throw new Error(route[1][i] + ' missing in "' + route_name + '" route generation');
297 297 }
298 298 result = sprintf(route[0], params);
299 299
300 300 var ret = [];
301 301 //extra params => GET
302 302 for(param in params){
303 303 if (route[1].indexOf(param) == -1){
304 304 ret.push(encodeURIComponent(param) + "=" + encodeURIComponent(params[param]));
305 305 }
306 306 }
307 307 var _parts = ret.join("&");
308 308 if(_parts){
309 309 result = result +'?'+ _parts
310 310 }
311 311 }
312 312
313 313 return result;
314 314 },
315 315 'register': function(route_name, route_tmpl, req_params) {
316 316 if (typeof(req_params) != 'object') {
317 317 req_params = [];
318 318 }
319 319 //fix escape
320 320 route_tmpl = unescape(route_tmpl);
321 321 keys = [];
322 322 for (o in req_params){
323 323 keys.push(req_params[o])
324 324 }
325 325 matchlist[route_name] = [
326 326 route_tmpl,
327 327 keys
328 328 ]
329 329 },
330 330 '_routes': function(){
331 331 return matchlist;
332 332 }
333 333 }
334 334 })();
335 335
336 336
337 337
338 338 /**
339 339 * GLOBAL YUI Shortcuts
340 340 */
341 341 var YUC = YAHOO.util.Connect;
342 342 var YUD = YAHOO.util.Dom;
343 343 var YUE = YAHOO.util.Event;
344 344 var YUQ = YAHOO.util.Selector.query;
345 345
346 346 // defines if push state is enabled for this browser ?
347 347 var push_state_enabled = Boolean(
348 348 window.history && window.history.pushState && window.history.replaceState
349 349 && !( /* disable for versions of iOS before version 4.3 (8F190) */
350 350 (/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i).test(navigator.userAgent)
351 351 /* disable for the mercury iOS browser, or at least older versions of the webkit engine */
352 352 || (/AppleWebKit\/5([0-2]|3[0-2])/i).test(navigator.userAgent)
353 353 )
354 354 );
355 355
356 356 var _run_callbacks = function(callbacks){
357 357 if (callbacks !== undefined){
358 358 var _l = callbacks.length;
359 359 for (var i=0;i<_l;i++){
360 360 var func = callbacks[i];
361 361 if(typeof(func)=='function'){
362 362 try{
363 363 func();
364 364 }catch (err){};
365 365 }
366 366 }
367 367 }
368 368 }
369 369
370 370 /**
371 371 * Partial Ajax Implementation
372 372 *
373 373 * @param url: defines url to make partial request
374 374 * @param container: defines id of container to input partial result
375 375 * @param s_call: success callback function that takes o as arg
376 376 * o.tId
377 377 * o.status
378 378 * o.statusText
379 379 * o.getResponseHeader[ ]
380 380 * o.getAllResponseHeaders
381 381 * o.responseText
382 382 * o.responseXML
383 383 * o.argument
384 384 * @param f_call: failure callback
385 385 * @param args arguments
386 386 */
387 387 function ypjax(url,container,s_call,f_call,args){
388 388 var method='GET';
389 389 if(args===undefined){
390 390 args=null;
391 391 }
392 392
393 393 // Set special header for partial ajax == HTTP_X_PARTIAL_XHR
394 394 YUC.initHeader('X-PARTIAL-XHR',true);
395 395
396 396 // wrapper of passed callback
397 397 var s_wrapper = (function(o){
398 398 return function(o){
399 399 YUD.get(container).innerHTML=o.responseText;
400 400 YUD.setStyle(container,'opacity','1.0');
401 401 //execute the given original callback
402 402 if (s_call !== undefined){
403 403 s_call(o);
404 404 }
405 405 }
406 406 })()
407 407 YUD.setStyle(container,'opacity','0.3');
408 408 YUC.asyncRequest(method,url,{
409 409 success:s_wrapper,
410 410 failure:function(o){
411 411 console.log(o);
412 412 YUD.get(container).innerHTML='<span class="error_red">ERROR: {0}</span>'.format(o.status);
413 413 YUD.setStyle(container,'opacity','1.0');
414 414 },
415 415 cache:false
416 416 },args);
417 417
418 418 };
419 419
420 420 var ajaxGET = function(url,success) {
421 421 // Set special header for ajax == HTTP_X_PARTIAL_XHR
422 422 YUC.initHeader('X-PARTIAL-XHR',true);
423 423
424 424 var sUrl = url;
425 425 var callback = {
426 426 success: success,
427 427 failure: function (o) {
428 428 alert("error");
429 429 },
430 430 };
431 431
432 432 var request = YAHOO.util.Connect.asyncRequest('GET', sUrl, callback);
433 433 return request;
434 434 };
435 435
436 436
437 437
438 438 var ajaxPOST = function(url,postData,success) {
439 439 // Set special header for ajax == HTTP_X_PARTIAL_XHR
440 440 YUC.initHeader('X-PARTIAL-XHR',true);
441 441
442 442 var toQueryString = function(o) {
443 443 if(typeof o !== 'object') {
444 444 return false;
445 445 }
446 446 var _p, _qs = [];
447 447 for(_p in o) {
448 448 _qs.push(encodeURIComponent(_p) + '=' + encodeURIComponent(o[_p]));
449 449 }
450 450 return _qs.join('&');
451 451 };
452 452
453 453 var sUrl = url;
454 454 var callback = {
455 455 success: success,
456 456 failure: function (o) {
457 457 alert("error");
458 458 },
459 459 };
460 460 var postData = toQueryString(postData);
461 461 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
462 462 return request;
463 463 };
464 464
465 465
466 466 /**
467 467 * tooltip activate
468 468 */
469 469 var tooltip_activate = function(){
470 470 yt = YAHOO.yuitip.main;
471 471 YUE.onDOMReady(yt.init);
472 472 };
473 473
474 474 /**
475 475 * show more
476 476 */
477 477 var show_more_event = function(){
478 478 YUE.on(YUD.getElementsByClassName('show_more'),'click',function(e){
479 479 var el = e.target;
480 480 YUD.setStyle(YUD.get(el.id.substring(1)),'display','');
481 481 YUD.setStyle(el.parentNode,'display','none');
482 482 });
483 483 };
484 484
485 485 /**
486 486 * show changeset tooltip
487 487 */
488 488 var show_changeset_tooltip = function(){
489 489 YUE.on(YUD.getElementsByClassName('lazy-cs'), 'mouseover', function(e){
490 490 var target = e.currentTarget;
491 491 var rid = YUD.getAttribute(target,'raw_id');
492 492 var repo_name = YUD.getAttribute(target,'repo_name');
493 493 var ttid = 'tt-'+rid;
494 494 var success = function(o){
495 495 var json = JSON.parse(o.responseText);
496 496 YUD.addClass(target,'tooltip')
497 497 YUD.setAttribute(target, 'title',json['message']);
498 498 YAHOO.yuitip.main.show_yuitip(e, target);
499 499 }
500 500 if(rid && !YUD.hasClass(target, 'tooltip')){
501 501 YUD.setAttribute(target,'id',ttid);
502 502 YUD.setAttribute(target, 'title',_TM['loading...']);
503 503 YAHOO.yuitip.main.set_listeners(target);
504 504 YAHOO.yuitip.main.show_yuitip(e, target);
505 505 var url = pyroutes.url('changeset_info', {"repo_name":repo_name, "revision": rid});
506 506 ajaxGET(url, success)
507 507 }
508 508 });
509 509 };
510 510
511 511 var onSuccessFollow = function(target){
512 512 var f = YUD.get(target);
513 513 var f_cnt = YUD.get('current_followers_count');
514 514
515 515 if(YUD.hasClass(f, 'follow')){
516 516 f.setAttribute('class','following');
517 517 f.setAttribute('title',_TM['Stop following this repository']);
518 518
519 519 if(f_cnt){
520 520 var cnt = Number(f_cnt.innerHTML)+1;
521 521 f_cnt.innerHTML = cnt;
522 522 }
523 523 }
524 524 else{
525 525 f.setAttribute('class','follow');
526 526 f.setAttribute('title',_TM['Start following this repository']);
527 527 if(f_cnt){
528 528 var cnt = Number(f_cnt.innerHTML)-1;
529 529 f_cnt.innerHTML = cnt;
530 530 }
531 531 }
532 532 }
533 533
534 534 var toggleFollowingUser = function(target,fallows_user_id,token,user_id){
535 535 args = 'follows_user_id='+fallows_user_id;
536 536 args+= '&amp;auth_token='+token;
537 537 if(user_id != undefined){
538 538 args+="&amp;user_id="+user_id;
539 539 }
540 540 YUC.asyncRequest('POST',TOGGLE_FOLLOW_URL,{
541 541 success:function(o){
542 542 onSuccessFollow(target);
543 543 }
544 544 },args);
545 545 return false;
546 546 }
547 547
548 548 var toggleFollowingRepo = function(target,fallows_repo_id,token,user_id){
549 549
550 550 args = 'follows_repo_id='+fallows_repo_id;
551 551 args+= '&amp;auth_token='+token;
552 552 if(user_id != undefined){
553 553 args+="&amp;user_id="+user_id;
554 554 }
555 555 YUC.asyncRequest('POST',TOGGLE_FOLLOW_URL,{
556 556 success:function(o){
557 557 onSuccessFollow(target);
558 558 }
559 559 },args);
560 560 return false;
561 561 }
562 562
563 563 var showRepoSize = function(target, repo_name, token){
564 564 var args= 'auth_token='+token;
565 565
566 566 if(!YUD.hasClass(target, 'loaded')){
567 567 YUD.get(target).innerHTML = _TM['Loading ...'];
568 568 var url = pyroutes.url('repo_size', {"repo_name":repo_name});
569 569 YUC.asyncRequest('POST',url,{
570 570 success:function(o){
571 571 YUD.get(target).innerHTML = JSON.parse(o.responseText);
572 572 YUD.addClass(target, 'loaded');
573 573 }
574 574 },args);
575 575 }
576 576 return false;
577 577 }
578 578
579
580 579 /**
581 580 * TOOLTIP IMPL.
582 581 */
583 582 YAHOO.namespace('yuitip');
584 583 YAHOO.yuitip.main = {
585 584
586 585 $: YAHOO.util.Dom.get,
587 586
588 587 bgColor: '#000',
589 588 speed: 0.3,
590 589 opacity: 0.9,
591 590 offset: [15,15],
592 591 useAnim: false,
593 592 maxWidth: 600,
594 593 add_links: false,
595 594 yuitips: [],
596 595
597 596 set_listeners: function(tt){
598 597 YUE.on(tt, 'mouseover', yt.show_yuitip, tt);
599 598 YUE.on(tt, 'mousemove', yt.move_yuitip, tt);
600 599 YUE.on(tt, 'mouseout', yt.close_yuitip, tt);
601 600 },
602 601
603 602 init: function(){
604 603 yt.tipBox = yt.$('tip-box');
605 604 if(!yt.tipBox){
606 605 yt.tipBox = document.createElement('div');
607 606 document.body.appendChild(yt.tipBox);
608 607 yt.tipBox.id = 'tip-box';
609 608 }
610 609
611 610 YUD.setStyle(yt.tipBox, 'display', 'none');
612 611 YUD.setStyle(yt.tipBox, 'position', 'absolute');
613 612 if(yt.maxWidth !== null){
614 613 YUD.setStyle(yt.tipBox, 'max-width', yt.maxWidth+'px');
615 614 }
616 615
617 616 var yuitips = YUD.getElementsByClassName('tooltip');
618 617
619 618 if(yt.add_links === true){
620 619 var links = document.getElementsByTagName('a');
621 620 var linkLen = links.length;
622 621 for(i=0;i<linkLen;i++){
623 622 yuitips.push(links[i]);
624 623 }
625 624 }
626 625
627 626 var yuiLen = yuitips.length;
628 627
629 628 for(i=0;i<yuiLen;i++){
630 629 yt.set_listeners(yuitips[i]);
631 630 }
632 631 },
633 632
634 633 show_yuitip: function(e, el){
635 634 YUE.stopEvent(e);
636 635 if(el.tagName.toLowerCase() === 'img'){
637 636 yt.tipText = el.alt ? el.alt : '';
638 637 } else {
639 638 yt.tipText = el.title ? el.title : '';
640 639 }
641 640
642 641 if(yt.tipText !== ''){
643 642 // save org title
644 643 YUD.setAttribute(el, 'tt_title', yt.tipText);
645 644 // reset title to not show org tooltips
646 645 YUD.setAttribute(el, 'title', '');
647 646
648 647 yt.tipBox.innerHTML = yt.tipText;
649 648 YUD.setStyle(yt.tipBox, 'display', 'block');
650 649 if(yt.useAnim === true){
651 650 YUD.setStyle(yt.tipBox, 'opacity', '0');
652 651 var newAnim = new YAHOO.util.Anim(yt.tipBox,
653 652 {
654 653 opacity: { to: yt.opacity }
655 654 }, yt.speed, YAHOO.util.Easing.easeOut
656 655 );
657 656 newAnim.animate();
658 657 }
659 658 }
660 659 },
661 660
662 661 move_yuitip: function(e, el){
663 662 YUE.stopEvent(e);
664 663 var movePos = YUE.getXY(e);
665 664 YUD.setStyle(yt.tipBox, 'top', (movePos[1] + yt.offset[1]) + 'px');
666 665 YUD.setStyle(yt.tipBox, 'left', (movePos[0] + yt.offset[0]) + 'px');
667 666 },
668 667
669 668 close_yuitip: function(e, el){
670 669 YUE.stopEvent(e);
671 670
672 671 if(yt.useAnim === true){
673 672 var newAnim = new YAHOO.util.Anim(yt.tipBox,
674 673 {
675 674 opacity: { to: 0 }
676 675 }, yt.speed, YAHOO.util.Easing.easeOut
677 676 );
678 677 newAnim.animate();
679 678 } else {
680 679 YUD.setStyle(yt.tipBox, 'display', 'none');
681 680 }
682 681 YUD.setAttribute(el,'title', YUD.getAttribute(el, 'tt_title'));
683 682 }
684 683 }
685 684
686 685 /**
687 686 * Quick filter widget
688 687 *
689 688 * @param target: filter input target
690 689 * @param nodes: list of nodes in html we want to filter.
691 690 * @param display_element function that takes current node from nodes and
692 691 * does hide or show based on the node
693 692 *
694 693 */
695 694 var q_filter = function(target,nodes,display_element){
696 695
697 696 var nodes = nodes;
698 697 var q_filter_field = YUD.get(target);
699 698 var F = YAHOO.namespace(target);
700 699
701 700 YUE.on(q_filter_field,'click',function(){
702 701 q_filter_field.value = '';
703 702 });
704 703
705 704 YUE.on(q_filter_field,'keyup',function(e){
706 705 clearTimeout(F.filterTimeout);
707 706 F.filterTimeout = setTimeout(F.updateFilter,600);
708 707 });
709 708
710 709 F.filterTimeout = null;
711 710
712 711 var show_node = function(node){
713 712 YUD.setStyle(node,'display','')
714 713 }
715 714 var hide_node = function(node){
716 715 YUD.setStyle(node,'display','none');
717 716 }
718 717
719 718 F.updateFilter = function() {
720 719 // Reset timeout
721 720 F.filterTimeout = null;
722 721
723 722 var obsolete = [];
724 723
725 724 var req = q_filter_field.value.toLowerCase();
726 725
727 726 var l = nodes.length;
728 727 var i;
729 728 var showing = 0;
730 729
731 730 for (i=0;i<l;i++ ){
732 731 var n = nodes[i];
733 732 var target_element = display_element(n)
734 733 if(req && n.innerHTML.toLowerCase().indexOf(req) == -1){
735 734 hide_node(target_element);
736 735 }
737 736 else{
738 737 show_node(target_element);
739 738 showing+=1;
740 739 }
741 740 }
742 741
743 742 // if repo_count is set update the number
744 743 var cnt = YUD.get('repo_count');
745 744 if(cnt){
746 745 YUD.get('repo_count').innerHTML = showing;
747 746 }
748 747
749 748 }
750 749 };
751 750
752 751 var tableTr = function(cls, body){
753 752 var _el = document.createElement('div');
754 753 var cont = new YAHOO.util.Element(body);
755 754 var comment_id = fromHTML(body).children[0].id.split('comment-')[1];
756 755 var id = 'comment-tr-{0}'.format(comment_id);
757 756 var _html = ('<table><tbody><tr id="{0}" class="{1}">'+
758 757 '<td class="lineno-inline new-inline"></td>'+
759 758 '<td class="lineno-inline old-inline"></td>'+
760 759 '<td>{2}</td>'+
761 760 '</tr></tbody></table>').format(id, cls, body);
762 761 _el.innerHTML = _html;
763 762 return _el.children[0].children[0].children[0];
764 763 };
765 764
766 765 /** comments **/
767 766 var removeInlineForm = function(form) {
768 767 form.parentNode.removeChild(form);
769 768 };
770 769
771 770 var createInlineForm = function(parent_tr, f_path, line) {
772 771 var tmpl = YUD.get('comment-inline-form-template').innerHTML;
773 772 tmpl = tmpl.format(f_path, line);
774 773 var form = tableTr('comment-form-inline',tmpl)
775 774
776 775 // create event for hide button
777 776 form = new YAHOO.util.Element(form);
778 777 var form_hide_button = new YAHOO.util.Element(YUD.getElementsByClassName('hide-inline-form',null,form)[0]);
779 778 form_hide_button.on('click', function(e) {
780 779 var newtr = e.currentTarget.parentNode.parentNode.parentNode.parentNode.parentNode;
781 780 if(YUD.hasClass(newtr.nextElementSibling,'inline-comments-button')){
782 781 YUD.setStyle(newtr.nextElementSibling,'display','');
783 782 }
784 783 removeInlineForm(newtr);
785 784 YUD.removeClass(parent_tr, 'form-open');
786 785 YUD.removeClass(parent_tr, 'hl-comment');
787 786
788 787 });
789 788
790 789 return form
791 790 };
792 791
793 792 /**
794 793 * Inject inline comment for on given TR this tr should be always an .line
795 794 * tr containing the line. Code will detect comment, and always put the comment
796 795 * block at the very bottom
797 796 */
798 797 var injectInlineForm = function(tr){
799 798 if(!YUD.hasClass(tr, 'line')){
800 799 return
801 800 }
802 801 var submit_url = AJAX_COMMENT_URL;
803 802 var _td = YUD.getElementsByClassName('code',null,tr)[0];
804 803 if(YUD.hasClass(tr,'form-open') || YUD.hasClass(tr,'context') || YUD.hasClass(_td,'no-comment')){
805 804 return
806 805 }
807 806 YUD.addClass(tr,'form-open');
808 807 YUD.addClass(tr,'hl-comment');
809 808 var node = YUD.getElementsByClassName('full_f_path',null,tr.parentNode.parentNode.parentNode)[0];
810 809 var f_path = YUD.getAttribute(node,'path');
811 810 var lineno = getLineNo(tr);
812 811 var form = createInlineForm(tr, f_path, lineno, submit_url);
813 812
814 813 var parent = tr;
815 814 while (1){
816 815 var n = parent.nextElementSibling;
817 816 // next element are comments !
818 817 if(YUD.hasClass(n,'inline-comments')){
819 818 parent = n;
820 819 }
821 820 else{
822 821 break;
823 822 }
824 823 }
825 824 YUD.insertAfter(form,parent);
826 825 var f = YUD.get(form);
827 826 var overlay = YUD.getElementsByClassName('overlay',null,f)[0];
828 827 var _form = YUD.getElementsByClassName('inline-form',null,f)[0];
829 828
830 829 YUE.on(YUD.get(_form), 'submit',function(e){
831 830 YUE.preventDefault(e);
832 831
833 832 //ajax submit
834 833 var text = YUD.get('text_'+lineno).value;
835 834 var postData = {
836 835 'text':text,
837 836 'f_path':f_path,
838 837 'line':lineno
839 838 };
840 839
841 840 if(lineno === undefined){
842 841 alert('missing line !');
843 842 return
844 843 }
845 844 if(f_path === undefined){
846 845 alert('missing file path !');
847 846 return
848 847 }
849 848
850 849 if(text == ""){
851 850 return
852 851 }
853 852
854 853 var success = function(o){
855 854 YUD.removeClass(tr, 'form-open');
856 855 removeInlineForm(f);
857 856 var json_data = JSON.parse(o.responseText);
858 857 renderInlineComment(json_data);
859 858 };
860 859
861 860 if (YUD.hasClass(overlay,'overlay')){
862 861 var w = _form.offsetWidth;
863 862 var h = _form.offsetHeight;
864 863 YUD.setStyle(overlay,'width',w+'px');
865 864 YUD.setStyle(overlay,'height',h+'px');
866 865 }
867 866 YUD.addClass(overlay, 'submitting');
868 867
869 868 ajaxPOST(submit_url, postData, success);
870 869 });
871 870
872 871 setTimeout(function(){
873 872 // callbacks
874 873 tooltip_activate();
875 874 MentionsAutoComplete('text_'+lineno, 'mentions_container_'+lineno,
876 875 _USERS_AC_DATA, _GROUPS_AC_DATA);
877 876 var _e = YUD.get('text_'+lineno);
878 877 if(_e){
879 878 _e.focus();
880 879 }
881 880 },10)
882 881 };
883 882
884 883 var deleteComment = function(comment_id){
885 884 var url = AJAX_COMMENT_DELETE_URL.replace('__COMMENT_ID__',comment_id);
886 885 var postData = {'_method':'delete'};
887 886 var success = function(o){
888 887 var n = YUD.get('comment-tr-'+comment_id);
889 888 var root = prevElementSibling(prevElementSibling(n));
890 889 n.parentNode.removeChild(n);
891 890
892 891 // scann nodes, and attach add button to last one
893 892 placeAddButton(root);
894 893 }
895 894 ajaxPOST(url,postData,success);
896 895 }
897 896
898 897 var createInlineAddButton = function(tr){
899 898
900 899 var label = TRANSLATION_MAP['Add another comment'];
901 900
902 901 var html_el = document.createElement('div');
903 902 YUD.addClass(html_el, 'add-comment');
904 903 html_el.innerHTML = '<span class="ui-btn">{0}</span>'.format(label);
905 904
906 905 var add = new YAHOO.util.Element(html_el);
907 906 add.on('click', function(e) {
908 907 injectInlineForm(tr);
909 908 });
910 909 return add;
911 910 };
912 911
913 912 var getLineNo = function(tr) {
914 913 var line;
915 914 var o = tr.children[0].id.split('_');
916 915 var n = tr.children[1].id.split('_');
917 916
918 917 if (n.length >= 2) {
919 918 line = n[n.length-1];
920 919 } else if (o.length >= 2) {
921 920 line = o[o.length-1];
922 921 }
923 922
924 923 return line
925 924 };
926 925
927 926 var placeAddButton = function(target_tr){
928 927 if(!target_tr){
929 928 return
930 929 }
931 930 var last_node = target_tr;
932 931 //scann
933 932 while (1){
934 933 var n = last_node.nextElementSibling;
935 934 // next element are comments !
936 935 if(YUD.hasClass(n,'inline-comments')){
937 936 last_node = n;
938 937 //also remove the comment button from previous
939 938 var comment_add_buttons = YUD.getElementsByClassName('add-comment',null,last_node);
940 939 for(var i=0;i<comment_add_buttons.length;i++){
941 940 var b = comment_add_buttons[i];
942 941 b.parentNode.removeChild(b);
943 942 }
944 943 }
945 944 else{
946 945 break;
947 946 }
948 947 }
949 948
950 949 var add = createInlineAddButton(target_tr);
951 950 // get the comment div
952 951 var comment_block = YUD.getElementsByClassName('comment',null,last_node)[0];
953 952 // attach add button
954 953 YUD.insertAfter(add,comment_block);
955 954 }
956 955
957 956 /**
958 957 * Places the inline comment into the changeset block in proper line position
959 958 */
960 959 var placeInline = function(target_container,lineno,html){
961 960 var lineid = "{0}_{1}".format(target_container,lineno);
962 961 var target_line = YUD.get(lineid);
963 962 var comment = new YAHOO.util.Element(tableTr('inline-comments',html))
964 963
965 964 // check if there are comments already !
966 965 var parent = target_line.parentNode;
967 966 var root_parent = parent;
968 967 while (1){
969 968 var n = parent.nextElementSibling;
970 969 // next element are comments !
971 970 if(YUD.hasClass(n,'inline-comments')){
972 971 parent = n;
973 972 }
974 973 else{
975 974 break;
976 975 }
977 976 }
978 977 // put in the comment at the bottom
979 978 YUD.insertAfter(comment,parent);
980 979
981 980 // scann nodes, and attach add button to last one
982 981 placeAddButton(root_parent);
983 982
984 983 return target_line;
985 984 }
986 985
987 986 /**
988 987 * make a single inline comment and place it inside
989 988 */
990 989 var renderInlineComment = function(json_data){
991 990 try{
992 991 var html = json_data['rendered_text'];
993 992 var lineno = json_data['line_no'];
994 993 var target_id = json_data['target_id'];
995 994 placeInline(target_id, lineno, html);
996 995
997 996 }catch(e){
998 997 console.log(e);
999 998 }
1000 999 }
1001 1000
1002 1001 /**
1003 1002 * Iterates over all the inlines, and places them inside proper blocks of data
1004 1003 */
1005 1004 var renderInlineComments = function(file_comments){
1006 1005 for (f in file_comments){
1007 1006 // holding all comments for a FILE
1008 1007 var box = file_comments[f];
1009 1008
1010 1009 var target_id = YUD.getAttribute(box,'target_id');
1011 1010 // actually comments with line numbers
1012 1011 var comments = box.children;
1013 1012 for(var i=0; i<comments.length; i++){
1014 1013 var data = {
1015 1014 'rendered_text': comments[i].outerHTML,
1016 1015 'line_no': YUD.getAttribute(comments[i],'line'),
1017 1016 'target_id': target_id
1018 1017 }
1019 1018 renderInlineComment(data);
1020 1019 }
1021 1020 }
1022 1021 }
1023 1022
1024 1023 var fileBrowserListeners = function(current_url, node_list_url, url_base){
1025 1024 var current_url_branch = +"?branch=__BRANCH__";
1026 1025
1027 1026 YUE.on('stay_at_branch','click',function(e){
1028 1027 if(e.target.checked){
1029 1028 var uri = current_url_branch;
1030 1029 uri = uri.replace('__BRANCH__',e.target.value);
1031 1030 window.location = uri;
1032 1031 }
1033 1032 else{
1034 1033 window.location = current_url;
1035 1034 }
1036 1035 })
1037 1036
1038 1037 var n_filter = YUD.get('node_filter');
1039 1038 var F = YAHOO.namespace('node_filter');
1040 1039
1041 1040 F.filterTimeout = null;
1042 1041 var nodes = null;
1043 1042
1044 1043 F.initFilter = function(){
1045 1044 YUD.setStyle('node_filter_box_loading','display','');
1046 1045 YUD.setStyle('search_activate_id','display','none');
1047 1046 YUD.setStyle('add_node_id','display','none');
1048 1047 YUC.initHeader('X-PARTIAL-XHR',true);
1049 1048 YUC.asyncRequest('GET', node_list_url, {
1050 1049 success:function(o){
1051 1050 nodes = JSON.parse(o.responseText).nodes;
1052 1051 YUD.setStyle('node_filter_box_loading','display','none');
1053 1052 YUD.setStyle('node_filter_box','display','');
1054 1053 n_filter.focus();
1055 1054 if(YUD.hasClass(n_filter,'init')){
1056 1055 n_filter.value = '';
1057 1056 YUD.removeClass(n_filter,'init');
1058 1057 }
1059 1058 },
1060 1059 failure:function(o){
1061 1060 console.log('failed to load');
1062 1061 }
1063 1062 },null);
1064 1063 }
1065 1064
1066 1065 F.updateFilter = function(e) {
1067 1066
1068 1067 return function(){
1069 1068 // Reset timeout
1070 1069 F.filterTimeout = null;
1071 1070 var query = e.target.value.toLowerCase();
1072 1071 var match = [];
1073 1072 var matches = 0;
1074 1073 var matches_max = 20;
1075 1074 if (query != ""){
1076 1075 for(var i=0;i<nodes.length;i++){
1077 1076
1078 1077 var pos = nodes[i].name.toLowerCase().indexOf(query)
1079 1078 if(query && pos != -1){
1080 1079
1081 1080 matches++
1082 1081 //show only certain amount to not kill browser
1083 1082 if (matches > matches_max){
1084 1083 break;
1085 1084 }
1086 1085
1087 1086 var n = nodes[i].name;
1088 1087 var t = nodes[i].type;
1089 1088 var n_hl = n.substring(0,pos)
1090 1089 +"<b>{0}</b>".format(n.substring(pos,pos+query.length))
1091 1090 +n.substring(pos+query.length)
1092 1091 var new_url = url_base.replace('__FPATH__',n);
1093 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 1094 if(match.length >= matches_max){
1096 1095 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['Search truncated']));
1097 1096 }
1098 1097 }
1099 1098 }
1100 1099 if(query != ""){
1101 1100 YUD.setStyle('tbody','display','none');
1102 1101 YUD.setStyle('tbody_filtered','display','');
1103 1102
1104 1103 if (match.length==0){
1105 1104 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['No matching files']));
1106 1105 }
1107 1106
1108 1107 YUD.get('tbody_filtered').innerHTML = match.join("");
1109 1108 }
1110 1109 else{
1111 1110 YUD.setStyle('tbody','display','');
1112 1111 YUD.setStyle('tbody_filtered','display','none');
1113 1112 }
1114 1113
1115 1114 }
1116 1115 };
1117 1116
1118 1117 YUE.on(YUD.get('filter_activate'),'click',function(){
1119 1118 F.initFilter();
1120 1119 })
1121 1120 YUE.on(n_filter,'click',function(){
1122 1121 if(YUD.hasClass(n_filter,'init')){
1123 1122 n_filter.value = '';
1124 1123 YUD.removeClass(n_filter,'init');
1125 1124 }
1126 1125 });
1127 1126 YUE.on(n_filter,'keyup',function(e){
1128 1127 clearTimeout(F.filterTimeout);
1129 1128 F.filterTimeout = setTimeout(F.updateFilter(e),600);
1130 1129 });
1131 1130 };
1132 1131
1133 1132
1134 1133 var initCodeMirror = function(textAreadId,resetUrl){
1135 1134 var myCodeMirror = CodeMirror.fromTextArea(YUD.get(textAreadId),{
1136 1135 mode: "null",
1137 1136 lineNumbers:true
1138 1137 });
1139 1138 YUE.on('reset','click',function(e){
1140 1139 window.location=resetUrl
1141 1140 });
1142 1141
1143 1142 YUE.on('file_enable','click',function(){
1144 1143 YUD.setStyle('editor_container','display','');
1145 1144 YUD.setStyle('upload_file_container','display','none');
1146 1145 YUD.setStyle('filename_container','display','');
1147 1146 });
1148 1147
1149 1148 YUE.on('upload_file_enable','click',function(){
1150 1149 YUD.setStyle('editor_container','display','none');
1151 1150 YUD.setStyle('upload_file_container','display','');
1152 1151 YUD.setStyle('filename_container','display','none');
1153 1152 });
1154 1153 };
1155 1154
1156 1155
1157 1156
1158 1157 var getIdentNode = function(n){
1159 1158 //iterate thru nodes untill matched interesting node !
1160 1159
1161 1160 if (typeof n == 'undefined'){
1162 1161 return -1
1163 1162 }
1164 1163
1165 1164 if(typeof n.id != "undefined" && n.id.match('L[0-9]+')){
1166 1165 return n
1167 1166 }
1168 1167 else{
1169 1168 return getIdentNode(n.parentNode);
1170 1169 }
1171 1170 };
1172 1171
1173 1172 var getSelectionLink = function(e) {
1174 1173
1175 1174 //get selection from start/to nodes
1176 1175 if (typeof window.getSelection != "undefined") {
1177 1176 s = window.getSelection();
1178 1177
1179 1178 from = getIdentNode(s.anchorNode);
1180 1179 till = getIdentNode(s.focusNode);
1181 1180
1182 1181 f_int = parseInt(from.id.replace('L',''));
1183 1182 t_int = parseInt(till.id.replace('L',''));
1184 1183
1185 1184 if (f_int > t_int){
1186 1185 //highlight from bottom
1187 1186 offset = -35;
1188 1187 ranges = [t_int,f_int];
1189 1188
1190 1189 }
1191 1190 else{
1192 1191 //highligth from top
1193 1192 offset = 35;
1194 1193 ranges = [f_int,t_int];
1195 1194 }
1196 1195 // if we select more than 2 lines
1197 1196 if (ranges[0] != ranges[1]){
1198 1197 if(YUD.get('linktt') == null){
1199 1198 hl_div = document.createElement('div');
1200 1199 hl_div.id = 'linktt';
1201 1200 }
1202 1201 hl_div.innerHTML = '';
1203 1202
1204 1203 anchor = '#L'+ranges[0]+'-'+ranges[1];
1205 1204 var link = document.createElement('a');
1206 1205 link.href = location.href.substring(0,location.href.indexOf('#'))+anchor;
1207 1206 link.innerHTML = _TM['Selection link'];
1208 1207 hl_div.appendChild(link);
1209 1208 YUD.get('body').appendChild(hl_div);
1210 1209
1211 1210 xy = YUD.getXY(till.id);
1212 1211
1213 1212 YUD.addClass('linktt', 'hl-tip-box');
1214 1213 YUD.setStyle('linktt','top',xy[1]+offset+'px');
1215 1214 YUD.setStyle('linktt','left',xy[0]+'px');
1216 1215 YUD.setStyle('linktt','visibility','visible');
1217 1216
1218 1217 }
1219 1218 else{
1220 1219 YUD.setStyle('linktt','visibility','hidden');
1221 1220 }
1222 1221 }
1223 1222 };
1224 1223
1225 1224 var deleteNotification = function(url, notification_id,callbacks){
1226 1225 var callback = {
1227 1226 success:function(o){
1228 1227 var obj = YUD.get(String("notification_"+notification_id));
1229 1228 if(obj.parentNode !== undefined){
1230 1229 obj.parentNode.removeChild(obj);
1231 1230 }
1232 1231 _run_callbacks(callbacks);
1233 1232 },
1234 1233 failure:function(o){
1235 1234 alert("error");
1236 1235 },
1237 1236 };
1238 1237 var postData = '_method=delete';
1239 1238 var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
1240 1239 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
1241 1240 callback, postData);
1242 1241 };
1243 1242
1244 1243 var readNotification = function(url, notification_id,callbacks){
1245 1244 var callback = {
1246 1245 success:function(o){
1247 1246 var obj = YUD.get(String("notification_"+notification_id));
1248 1247 YUD.removeClass(obj, 'unread');
1249 1248 var r_button = YUD.getElementsByClassName('read-notification',null,obj.children[0])[0];
1250 1249
1251 1250 if(r_button.parentNode !== undefined){
1252 1251 r_button.parentNode.removeChild(r_button);
1253 1252 }
1254 1253 _run_callbacks(callbacks);
1255 1254 },
1256 1255 failure:function(o){
1257 1256 alert("error");
1258 1257 },
1259 1258 };
1260 1259 var postData = '_method=put';
1261 1260 var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
1262 1261 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
1263 1262 callback, postData);
1264 1263 };
1265 1264
1266 1265 /** MEMBERS AUTOCOMPLETE WIDGET **/
1267 1266
1268 1267 var MembersAutoComplete = function (divid, cont, users_list, groups_list) {
1269 1268 var myUsers = users_list;
1270 1269 var myGroups = groups_list;
1271 1270
1272 1271 // Define a custom search function for the DataSource of users
1273 1272 var matchUsers = function (sQuery) {
1274 1273 // Case insensitive matching
1275 1274 var query = sQuery.toLowerCase();
1276 1275 var i = 0;
1277 1276 var l = myUsers.length;
1278 1277 var matches = [];
1279 1278
1280 1279 // Match against each name of each contact
1281 1280 for (; i < l; i++) {
1282 1281 contact = myUsers[i];
1283 1282 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1284 1283 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1285 1284 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1286 1285 matches[matches.length] = contact;
1287 1286 }
1288 1287 }
1289 1288 return matches;
1290 1289 };
1291 1290
1292 1291 // Define a custom search function for the DataSource of userGroups
1293 1292 var matchGroups = function (sQuery) {
1294 1293 // Case insensitive matching
1295 1294 var query = sQuery.toLowerCase();
1296 1295 var i = 0;
1297 1296 var l = myGroups.length;
1298 1297 var matches = [];
1299 1298
1300 1299 // Match against each name of each contact
1301 1300 for (; i < l; i++) {
1302 1301 matched_group = myGroups[i];
1303 1302 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
1304 1303 matches[matches.length] = matched_group;
1305 1304 }
1306 1305 }
1307 1306 return matches;
1308 1307 };
1309 1308
1310 1309 //match all
1311 1310 var matchAll = function (sQuery) {
1312 1311 u = matchUsers(sQuery);
1313 1312 g = matchGroups(sQuery);
1314 1313 return u.concat(g);
1315 1314 };
1316 1315
1317 1316 // DataScheme for members
1318 1317 var memberDS = new YAHOO.util.FunctionDataSource(matchAll);
1319 1318 memberDS.responseSchema = {
1320 1319 fields: ["id", "fname", "lname", "nname", "grname", "grmembers", "gravatar_lnk"]
1321 1320 };
1322 1321
1323 1322 // DataScheme for owner
1324 1323 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1325 1324 ownerDS.responseSchema = {
1326 1325 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1327 1326 };
1328 1327
1329 1328 // Instantiate AutoComplete for perms
1330 1329 var membersAC = new YAHOO.widget.AutoComplete(divid, cont, memberDS);
1331 1330 membersAC.useShadow = false;
1332 1331 membersAC.resultTypeList = false;
1333 1332 membersAC.animVert = false;
1334 1333 membersAC.animHoriz = false;
1335 1334 membersAC.animSpeed = 0.1;
1336 1335
1337 1336 // Instantiate AutoComplete for owner
1338 1337 var ownerAC = new YAHOO.widget.AutoComplete("user", "owner_container", ownerDS);
1339 1338 ownerAC.useShadow = false;
1340 1339 ownerAC.resultTypeList = false;
1341 1340 ownerAC.animVert = false;
1342 1341 ownerAC.animHoriz = false;
1343 1342 ownerAC.animSpeed = 0.1;
1344 1343
1345 1344 // Helper highlight function for the formatter
1346 1345 var highlightMatch = function (full, snippet, matchindex) {
1347 1346 return full.substring(0, matchindex)
1348 1347 + "<span class='match'>"
1349 1348 + full.substr(matchindex, snippet.length)
1350 1349 + "</span>" + full.substring(matchindex + snippet.length);
1351 1350 };
1352 1351
1353 1352 // Custom formatter to highlight the matching letters
1354 1353 var custom_formatter = function (oResultData, sQuery, sResultMatch) {
1355 1354 var query = sQuery.toLowerCase();
1356 1355 var _gravatar = function(res, em, group){
1357 1356 if (group !== undefined){
1358 1357 em = '/images/icons/group.png'
1359 1358 }
1360 1359 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1361 1360 return tmpl.format(em,res)
1362 1361 }
1363 1362 // group
1364 1363 if (oResultData.grname != undefined) {
1365 1364 var grname = oResultData.grname;
1366 1365 var grmembers = oResultData.grmembers;
1367 1366 var grnameMatchIndex = grname.toLowerCase().indexOf(query);
1368 1367 var grprefix = "{0}: ".format(_TM['Group']);
1369 1368 var grsuffix = " (" + grmembers + " )";
1370 1369 var grsuffix = " ({0} {1})".format(grmembers, _TM['members']);
1371 1370
1372 1371 if (grnameMatchIndex > -1) {
1373 1372 return _gravatar(grprefix + highlightMatch(grname, query, grnameMatchIndex) + grsuffix,null,true);
1374 1373 }
1375 1374 return _gravatar(grprefix + oResultData.grname + grsuffix, null,true);
1376 1375 // Users
1377 1376 } else if (oResultData.nname != undefined) {
1378 1377 var fname = oResultData.fname || "";
1379 1378 var lname = oResultData.lname || "";
1380 1379 var nname = oResultData.nname;
1381 1380
1382 1381 // Guard against null value
1383 1382 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1384 1383 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1385 1384 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1386 1385 displayfname, displaylname, displaynname;
1387 1386
1388 1387 if (fnameMatchIndex > -1) {
1389 1388 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1390 1389 } else {
1391 1390 displayfname = fname;
1392 1391 }
1393 1392
1394 1393 if (lnameMatchIndex > -1) {
1395 1394 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1396 1395 } else {
1397 1396 displaylname = lname;
1398 1397 }
1399 1398
1400 1399 if (nnameMatchIndex > -1) {
1401 1400 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1402 1401 } else {
1403 1402 displaynname = nname ? "(" + nname + ")" : "";
1404 1403 }
1405 1404
1406 1405 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1407 1406 } else {
1408 1407 return '';
1409 1408 }
1410 1409 };
1411 1410 membersAC.formatResult = custom_formatter;
1412 1411 ownerAC.formatResult = custom_formatter;
1413 1412
1414 1413 var myHandler = function (sType, aArgs) {
1415 1414 var nextId = divid.split('perm_new_member_name_')[1];
1416 1415 var myAC = aArgs[0]; // reference back to the AC instance
1417 1416 var elLI = aArgs[1]; // reference to the selected LI element
1418 1417 var oData = aArgs[2]; // object literal of selected item's result data
1419 1418 //fill the autocomplete with value
1420 1419 if (oData.nname != undefined) {
1421 1420 //users
1422 1421 myAC.getInputEl().value = oData.nname;
1423 1422 YUD.get('perm_new_member_type_'+nextId).value = 'user';
1424 1423 } else {
1425 1424 //groups
1426 1425 myAC.getInputEl().value = oData.grname;
1427 1426 YUD.get('perm_new_member_type_'+nextId).value = 'users_group';
1428 1427 }
1429 1428 };
1430 1429
1431 1430 membersAC.itemSelectEvent.subscribe(myHandler);
1432 1431 if(ownerAC.itemSelectEvent){
1433 1432 ownerAC.itemSelectEvent.subscribe(myHandler);
1434 1433 }
1435 1434
1436 1435 return {
1437 1436 memberDS: memberDS,
1438 1437 ownerDS: ownerDS,
1439 1438 membersAC: membersAC,
1440 1439 ownerAC: ownerAC,
1441 1440 };
1442 1441 }
1443 1442
1444 1443
1445 1444 var MentionsAutoComplete = function (divid, cont, users_list, groups_list) {
1446 1445 var myUsers = users_list;
1447 1446 var myGroups = groups_list;
1448 1447
1449 1448 // Define a custom search function for the DataSource of users
1450 1449 var matchUsers = function (sQuery) {
1451 1450 var org_sQuery = sQuery;
1452 1451 if(this.mentionQuery == null){
1453 1452 return []
1454 1453 }
1455 1454 sQuery = this.mentionQuery;
1456 1455 // Case insensitive matching
1457 1456 var query = sQuery.toLowerCase();
1458 1457 var i = 0;
1459 1458 var l = myUsers.length;
1460 1459 var matches = [];
1461 1460
1462 1461 // Match against each name of each contact
1463 1462 for (; i < l; i++) {
1464 1463 contact = myUsers[i];
1465 1464 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1466 1465 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1467 1466 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1468 1467 matches[matches.length] = contact;
1469 1468 }
1470 1469 }
1471 1470 return matches
1472 1471 };
1473 1472
1474 1473 //match all
1475 1474 var matchAll = function (sQuery) {
1476 1475 u = matchUsers(sQuery);
1477 1476 return u
1478 1477 };
1479 1478
1480 1479 // DataScheme for owner
1481 1480 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1482 1481
1483 1482 ownerDS.responseSchema = {
1484 1483 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1485 1484 };
1486 1485
1487 1486 // Instantiate AutoComplete for mentions
1488 1487 var ownerAC = new YAHOO.widget.AutoComplete(divid, cont, ownerDS);
1489 1488 ownerAC.useShadow = false;
1490 1489 ownerAC.resultTypeList = false;
1491 1490 ownerAC.suppressInputUpdate = true;
1492 1491 ownerAC.animVert = false;
1493 1492 ownerAC.animHoriz = false;
1494 1493 ownerAC.animSpeed = 0.1;
1495 1494
1496 1495 // Helper highlight function for the formatter
1497 1496 var highlightMatch = function (full, snippet, matchindex) {
1498 1497 return full.substring(0, matchindex)
1499 1498 + "<span class='match'>"
1500 1499 + full.substr(matchindex, snippet.length)
1501 1500 + "</span>" + full.substring(matchindex + snippet.length);
1502 1501 };
1503 1502
1504 1503 // Custom formatter to highlight the matching letters
1505 1504 ownerAC.formatResult = function (oResultData, sQuery, sResultMatch) {
1506 1505 var org_sQuery = sQuery;
1507 1506 if(this.dataSource.mentionQuery != null){
1508 1507 sQuery = this.dataSource.mentionQuery;
1509 1508 }
1510 1509
1511 1510 var query = sQuery.toLowerCase();
1512 1511 var _gravatar = function(res, em, group){
1513 1512 if (group !== undefined){
1514 1513 em = '/images/icons/group.png'
1515 1514 }
1516 1515 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1517 1516 return tmpl.format(em,res)
1518 1517 }
1519 1518 if (oResultData.nname != undefined) {
1520 1519 var fname = oResultData.fname || "";
1521 1520 var lname = oResultData.lname || "";
1522 1521 var nname = oResultData.nname;
1523 1522
1524 1523 // Guard against null value
1525 1524 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1526 1525 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1527 1526 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1528 1527 displayfname, displaylname, displaynname;
1529 1528
1530 1529 if (fnameMatchIndex > -1) {
1531 1530 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1532 1531 } else {
1533 1532 displayfname = fname;
1534 1533 }
1535 1534
1536 1535 if (lnameMatchIndex > -1) {
1537 1536 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1538 1537 } else {
1539 1538 displaylname = lname;
1540 1539 }
1541 1540
1542 1541 if (nnameMatchIndex > -1) {
1543 1542 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1544 1543 } else {
1545 1544 displaynname = nname ? "(" + nname + ")" : "";
1546 1545 }
1547 1546
1548 1547 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1549 1548 } else {
1550 1549 return '';
1551 1550 }
1552 1551 };
1553 1552
1554 1553 if(ownerAC.itemSelectEvent){
1555 1554 ownerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
1556 1555
1557 1556 var myAC = aArgs[0]; // reference back to the AC instance
1558 1557 var elLI = aArgs[1]; // reference to the selected LI element
1559 1558 var oData = aArgs[2]; // object literal of selected item's result data
1560 1559 //fill the autocomplete with value
1561 1560 if (oData.nname != undefined) {
1562 1561 //users
1563 1562 //Replace the mention name with replaced
1564 1563 var re = new RegExp();
1565 1564 var org = myAC.getInputEl().value;
1566 1565 var chunks = myAC.dataSource.chunks
1567 1566 // replace middle chunk(the search term) with actuall match
1568 1567 chunks[1] = chunks[1].replace('@'+myAC.dataSource.mentionQuery,
1569 1568 '@'+oData.nname+' ');
1570 1569 myAC.getInputEl().value = chunks.join('')
1571 1570 YUD.get(myAC.getInputEl()).focus(); // Y U NO WORK !?
1572 1571 } else {
1573 1572 //groups
1574 1573 myAC.getInputEl().value = oData.grname;
1575 1574 YUD.get('perm_new_member_type').value = 'users_group';
1576 1575 }
1577 1576 });
1578 1577 }
1579 1578
1580 1579 // in this keybuffer we will gather current value of search !
1581 1580 // since we need to get this just when someone does `@` then we do the
1582 1581 // search
1583 1582 ownerAC.dataSource.chunks = [];
1584 1583 ownerAC.dataSource.mentionQuery = null;
1585 1584
1586 1585 ownerAC.get_mention = function(msg, max_pos) {
1587 1586 var org = msg;
1588 1587 var re = new RegExp('(?:^@|\s@)([a-zA-Z0-9]{1}[a-zA-Z0-9\-\_\.]+)$')
1589 1588 var chunks = [];
1590 1589
1591 1590
1592 1591 // cut first chunk until curret pos
1593 1592 var to_max = msg.substr(0, max_pos);
1594 1593 var at_pos = Math.max(0,to_max.lastIndexOf('@')-1);
1595 1594 var msg2 = to_max.substr(at_pos);
1596 1595
1597 1596 chunks.push(org.substr(0,at_pos))// prefix chunk
1598 1597 chunks.push(msg2) // search chunk
1599 1598 chunks.push(org.substr(max_pos)) // postfix chunk
1600 1599
1601 1600 // clean up msg2 for filtering and regex match
1602 1601 var msg2 = msg2.lstrip(' ').lstrip('\n');
1603 1602
1604 1603 if(re.test(msg2)){
1605 1604 var unam = re.exec(msg2)[1];
1606 1605 return [unam, chunks];
1607 1606 }
1608 1607 return [null, null];
1609 1608 };
1610 1609
1611 1610 if (ownerAC.textboxKeyUpEvent){
1612 1611 ownerAC.textboxKeyUpEvent.subscribe(function(type, args){
1613 1612
1614 1613 var ac_obj = args[0];
1615 1614 var currentMessage = args[1];
1616 1615 var currentCaretPosition = args[0]._elTextbox.selectionStart;
1617 1616
1618 1617 var unam = ownerAC.get_mention(currentMessage, currentCaretPosition);
1619 1618 var curr_search = null;
1620 1619 if(unam[0]){
1621 1620 curr_search = unam[0];
1622 1621 }
1623 1622
1624 1623 ownerAC.dataSource.chunks = unam[1];
1625 1624 ownerAC.dataSource.mentionQuery = curr_search;
1626 1625
1627 1626 })
1628 1627 }
1629 1628 return {
1630 1629 ownerDS: ownerDS,
1631 1630 ownerAC: ownerAC,
1632 1631 };
1633 1632 }
1634 1633
1635 1634 var addReviewMember = function(id,fname,lname,nname,gravatar_link){
1636 1635 var members = YUD.get('review_members');
1637 1636 var tmpl = '<li id="reviewer_{2}">'+
1638 1637 '<div class="reviewers_member">'+
1639 1638 '<div class="gravatar"><img alt="gravatar" src="{0}"/> </div>'+
1640 1639 '<div style="float:left">{1}</div>'+
1641 1640 '<input type="hidden" value="{2}" name="review_members" />'+
1642 1641 '<span class="delete_icon action_button" onclick="removeReviewMember({2})"></span>'+
1643 1642 '</div>'+
1644 1643 '</li>' ;
1645 1644 var displayname = "{0} {1} ({2})".format(fname,lname,nname);
1646 1645 var element = tmpl.format(gravatar_link,displayname,id);
1647 1646 // check if we don't have this ID already in
1648 1647 var ids = [];
1649 1648 var _els = YUQ('#review_members li');
1650 1649 for (el in _els){
1651 1650 ids.push(_els[el].id)
1652 1651 }
1653 1652 if(ids.indexOf('reviewer_'+id) == -1){
1654 1653 //only add if it's not there
1655 1654 members.innerHTML += element;
1656 1655 }
1657 1656
1658 1657 }
1659 1658
1660 1659 var removeReviewMember = function(reviewer_id, repo_name, pull_request_id){
1661 1660 var el = YUD.get('reviewer_{0}'.format(reviewer_id));
1662 1661 if (el.parentNode !== undefined){
1663 1662 el.parentNode.removeChild(el);
1664 1663 }
1665 1664 }
1666 1665
1667 1666 var updateReviewers = function(reviewers_ids, repo_name, pull_request_id){
1668 1667 if (reviewers_ids === undefined){
1669 1668 var reviewers_ids = [];
1670 1669 var ids = YUQ('#review_members input');
1671 1670 for(var i=0; i<ids.length;i++){
1672 1671 var id = ids[i].value
1673 1672 reviewers_ids.push(id);
1674 1673 }
1675 1674 }
1676 1675 var url = pyroutes.url('pullrequest_update', {"repo_name":repo_name,
1677 1676 "pull_request_id": pull_request_id});
1678 1677 var postData = {'_method':'put',
1679 1678 'reviewers_ids': reviewers_ids};
1680 1679 var success = function(o){
1681 1680 window.location.reload();
1682 1681 }
1683 1682 ajaxPOST(url,postData,success);
1684 1683 }
1685 1684
1686 1685 var PullRequestAutoComplete = function (divid, cont, users_list, groups_list) {
1687 1686 var myUsers = users_list;
1688 1687 var myGroups = groups_list;
1689 1688
1690 1689 // Define a custom search function for the DataSource of users
1691 1690 var matchUsers = function (sQuery) {
1692 1691 // Case insensitive matching
1693 1692 var query = sQuery.toLowerCase();
1694 1693 var i = 0;
1695 1694 var l = myUsers.length;
1696 1695 var matches = [];
1697 1696
1698 1697 // Match against each name of each contact
1699 1698 for (; i < l; i++) {
1700 1699 contact = myUsers[i];
1701 1700 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1702 1701 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1703 1702 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1704 1703 matches[matches.length] = contact;
1705 1704 }
1706 1705 }
1707 1706 return matches;
1708 1707 };
1709 1708
1710 1709 // Define a custom search function for the DataSource of userGroups
1711 1710 var matchGroups = function (sQuery) {
1712 1711 // Case insensitive matching
1713 1712 var query = sQuery.toLowerCase();
1714 1713 var i = 0;
1715 1714 var l = myGroups.length;
1716 1715 var matches = [];
1717 1716
1718 1717 // Match against each name of each contact
1719 1718 for (; i < l; i++) {
1720 1719 matched_group = myGroups[i];
1721 1720 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
1722 1721 matches[matches.length] = matched_group;
1723 1722 }
1724 1723 }
1725 1724 return matches;
1726 1725 };
1727 1726
1728 1727 //match all
1729 1728 var matchAll = function (sQuery) {
1730 1729 u = matchUsers(sQuery);
1731 1730 return u
1732 1731 };
1733 1732
1734 1733 // DataScheme for owner
1735 1734 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1736 1735
1737 1736 ownerDS.responseSchema = {
1738 1737 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1739 1738 };
1740 1739
1741 1740 // Instantiate AutoComplete for mentions
1742 1741 var reviewerAC = new YAHOO.widget.AutoComplete(divid, cont, ownerDS);
1743 1742 reviewerAC.useShadow = false;
1744 1743 reviewerAC.resultTypeList = false;
1745 1744 reviewerAC.suppressInputUpdate = true;
1746 1745 reviewerAC.animVert = false;
1747 1746 reviewerAC.animHoriz = false;
1748 1747 reviewerAC.animSpeed = 0.1;
1749 1748
1750 1749 // Helper highlight function for the formatter
1751 1750 var highlightMatch = function (full, snippet, matchindex) {
1752 1751 return full.substring(0, matchindex)
1753 1752 + "<span class='match'>"
1754 1753 + full.substr(matchindex, snippet.length)
1755 1754 + "</span>" + full.substring(matchindex + snippet.length);
1756 1755 };
1757 1756
1758 1757 // Custom formatter to highlight the matching letters
1759 1758 reviewerAC.formatResult = function (oResultData, sQuery, sResultMatch) {
1760 1759 var org_sQuery = sQuery;
1761 1760 if(this.dataSource.mentionQuery != null){
1762 1761 sQuery = this.dataSource.mentionQuery;
1763 1762 }
1764 1763
1765 1764 var query = sQuery.toLowerCase();
1766 1765 var _gravatar = function(res, em, group){
1767 1766 if (group !== undefined){
1768 1767 em = '/images/icons/group.png'
1769 1768 }
1770 1769 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1771 1770 return tmpl.format(em,res)
1772 1771 }
1773 1772 if (oResultData.nname != undefined) {
1774 1773 var fname = oResultData.fname || "";
1775 1774 var lname = oResultData.lname || "";
1776 1775 var nname = oResultData.nname;
1777 1776
1778 1777 // Guard against null value
1779 1778 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1780 1779 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1781 1780 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1782 1781 displayfname, displaylname, displaynname;
1783 1782
1784 1783 if (fnameMatchIndex > -1) {
1785 1784 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1786 1785 } else {
1787 1786 displayfname = fname;
1788 1787 }
1789 1788
1790 1789 if (lnameMatchIndex > -1) {
1791 1790 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1792 1791 } else {
1793 1792 displaylname = lname;
1794 1793 }
1795 1794
1796 1795 if (nnameMatchIndex > -1) {
1797 1796 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1798 1797 } else {
1799 1798 displaynname = nname ? "(" + nname + ")" : "";
1800 1799 }
1801 1800
1802 1801 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1803 1802 } else {
1804 1803 return '';
1805 1804 }
1806 1805 };
1807 1806
1808 1807 //members cache to catch duplicates
1809 1808 reviewerAC.dataSource.cache = [];
1810 1809 // hack into select event
1811 1810 if(reviewerAC.itemSelectEvent){
1812 1811 reviewerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
1813 1812
1814 1813 var myAC = aArgs[0]; // reference back to the AC instance
1815 1814 var elLI = aArgs[1]; // reference to the selected LI element
1816 1815 var oData = aArgs[2]; // object literal of selected item's result data
1817 1816
1818 1817 //fill the autocomplete with value
1819 1818
1820 1819 if (oData.nname != undefined) {
1821 1820 addReviewMember(oData.id, oData.fname, oData.lname, oData.nname,
1822 1821 oData.gravatar_lnk);
1823 1822 myAC.dataSource.cache.push(oData.id);
1824 1823 YUD.get('user').value = ''
1825 1824 }
1826 1825 });
1827 1826 }
1828 1827 return {
1829 1828 ownerDS: ownerDS,
1830 1829 reviewerAC: reviewerAC,
1831 1830 };
1832 1831 }
1833 1832
1834 1833 /**
1835 1834 * QUICK REPO MENU
1836 1835 */
1837 1836 var quick_repo_menu = function(){
1838 1837 YUE.on(YUQ('.quick_repo_menu'),'mouseenter',function(e){
1839 1838 var menu = e.currentTarget.firstElementChild.firstElementChild;
1840 1839 if(YUD.hasClass(menu,'hidden')){
1841 1840 YUD.replaceClass(e.currentTarget,'hidden', 'active');
1842 1841 YUD.replaceClass(menu, 'hidden', 'active');
1843 1842 }
1844 1843 })
1845 1844 YUE.on(YUQ('.quick_repo_menu'),'mouseleave',function(e){
1846 1845 var menu = e.currentTarget.firstElementChild.firstElementChild;
1847 1846 if(YUD.hasClass(menu,'active')){
1848 1847 YUD.replaceClass(e.currentTarget, 'active', 'hidden');
1849 1848 YUD.replaceClass(menu, 'active', 'hidden');
1850 1849 }
1851 1850 })
1852 1851 };
1853 1852
1854 1853
1855 1854 /**
1856 1855 * TABLE SORTING
1857 1856 */
1858 1857
1859 1858 // returns a node from given html;
1860 1859 var fromHTML = function(html){
1861 1860 var _html = document.createElement('element');
1862 1861 _html.innerHTML = html;
1863 1862 return _html;
1864 1863 }
1865 1864 var get_rev = function(node){
1866 1865 var n = node.firstElementChild.firstElementChild;
1867 1866
1868 1867 if (n===null){
1869 1868 return -1
1870 1869 }
1871 1870 else{
1872 1871 out = n.firstElementChild.innerHTML.split(':')[0].replace('r','');
1873 1872 return parseInt(out);
1874 1873 }
1875 1874 }
1876 1875
1877 1876 var get_name = function(node){
1878 1877 var name = node.firstElementChild.children[2].innerHTML;
1879 1878 return name
1880 1879 }
1881 1880 var get_group_name = function(node){
1882 1881 var name = node.firstElementChild.children[1].innerHTML;
1883 1882 return name
1884 1883 }
1885 1884 var get_date = function(node){
1886 1885 var date_ = YUD.getAttribute(node.firstElementChild,'date');
1887 1886 return date_
1888 1887 }
1889 1888
1890 1889 var get_age = function(node){
1891 1890 return node
1892 1891 }
1893 1892
1894 1893 var get_link = function(node){
1895 1894 return node.firstElementChild.text;
1896 1895 }
1897 1896
1898 1897 var revisionSort = function(a, b, desc, field) {
1899 1898
1900 1899 var a_ = fromHTML(a.getData(field));
1901 1900 var b_ = fromHTML(b.getData(field));
1902 1901
1903 1902 // extract revisions from string nodes
1904 1903 a_ = get_rev(a_)
1905 1904 b_ = get_rev(b_)
1906 1905
1907 1906 var comp = YAHOO.util.Sort.compare;
1908 1907 var compState = comp(a_, b_, desc);
1909 1908 return compState;
1910 1909 };
1911 1910 var ageSort = function(a, b, desc, field) {
1912 1911 var a_ = fromHTML(a.getData(field));
1913 1912 var b_ = fromHTML(b.getData(field));
1914 1913
1915 1914 // extract name from table
1916 1915 a_ = get_date(a_)
1917 1916 b_ = get_date(b_)
1918 1917
1919 1918 var comp = YAHOO.util.Sort.compare;
1920 1919 var compState = comp(a_, b_, desc);
1921 1920 return compState;
1922 1921 };
1923 1922
1924 1923 var lastLoginSort = function(a, b, desc, field) {
1925 1924 var a_ = a.getData('last_login_raw') || 0;
1926 1925 var b_ = b.getData('last_login_raw') || 0;
1927 1926
1928 1927 var comp = YAHOO.util.Sort.compare;
1929 1928 var compState = comp(a_, b_, desc);
1930 1929 return compState;
1931 1930 };
1932 1931
1933 1932 var nameSort = function(a, b, desc, field) {
1934 1933 var a_ = fromHTML(a.getData(field));
1935 1934 var b_ = fromHTML(b.getData(field));
1936 1935
1937 1936 // extract name from table
1938 1937 a_ = get_name(a_)
1939 1938 b_ = get_name(b_)
1940 1939
1941 1940 var comp = YAHOO.util.Sort.compare;
1942 1941 var compState = comp(a_, b_, desc);
1943 1942 return compState;
1944 1943 };
1945 1944
1946 1945 var permNameSort = function(a, b, desc, field) {
1947 1946 var a_ = fromHTML(a.getData(field));
1948 1947 var b_ = fromHTML(b.getData(field));
1949 1948 // extract name from table
1950 1949
1951 1950 a_ = a_.children[0].innerHTML;
1952 1951 b_ = b_.children[0].innerHTML;
1953 1952
1954 1953 var comp = YAHOO.util.Sort.compare;
1955 1954 var compState = comp(a_, b_, desc);
1956 1955 return compState;
1957 1956 };
1958 1957
1959 1958 var groupNameSort = function(a, b, desc, field) {
1960 1959 var a_ = fromHTML(a.getData(field));
1961 1960 var b_ = fromHTML(b.getData(field));
1962 1961
1963 1962 // extract name from table
1964 1963 a_ = get_group_name(a_)
1965 1964 b_ = get_group_name(b_)
1966 1965
1967 1966 var comp = YAHOO.util.Sort.compare;
1968 1967 var compState = comp(a_, b_, desc);
1969 1968 return compState;
1970 1969 };
1971 1970 var dateSort = function(a, b, desc, field) {
1972 1971 var a_ = fromHTML(a.getData(field));
1973 1972 var b_ = fromHTML(b.getData(field));
1974 1973
1975 1974 // extract name from table
1976 1975 a_ = get_date(a_)
1977 1976 b_ = get_date(b_)
1978 1977
1979 1978 var comp = YAHOO.util.Sort.compare;
1980 1979 var compState = comp(a_, b_, desc);
1981 1980 return compState;
1982 1981 };
1983 1982
1984 1983 var linkSort = function(a, b, desc, field) {
1985 1984 var a_ = fromHTML(a.getData(field));
1986 1985 var b_ = fromHTML(a.getData(field));
1987 1986
1988 1987 // extract url text from string nodes
1989 1988 a_ = get_link(a_)
1990 1989 b_ = get_link(b_)
1991 1990
1992 1991 var comp = YAHOO.util.Sort.compare;
1993 1992 var compState = comp(a_, b_, desc);
1994 1993 return compState;
1995 1994 }
1996 1995
1997 1996 var addPermAction = function(_html, users_list, groups_list){
1998 1997 var elmts = YUD.getElementsByClassName('last_new_member');
1999 1998 var last_node = elmts[elmts.length-1];
2000 1999 if (last_node){
2001 2000 var next_id = (YUD.getElementsByClassName('new_members')).length;
2002 2001 _html = _html.format(next_id);
2003 2002 last_node.innerHTML = _html;
2004 2003 YUD.setStyle(last_node, 'display', '');
2005 2004 YUD.removeClass(last_node, 'last_new_member');
2006 2005 MembersAutoComplete("perm_new_member_name_"+next_id,
2007 2006 "perm_container_"+next_id, users_list, groups_list);
2008 2007 //create new last NODE
2009 2008 var el = document.createElement('tr');
2010 2009 el.id = 'add_perm_input';
2011 2010 YUD.addClass(el,'last_new_member');
2012 2011 YUD.addClass(el,'new_members');
2013 2012 YUD.insertAfter(el, last_node);
2014 2013 }
2015 2014 }
2016 2015
2017 2016 /* Multi selectors */
2018 2017
2019 2018 var MultiSelectWidget = function(selected_id, available_id, form_id){
2020 2019
2021 2020
2022 2021 //definition of containers ID's
2023 2022 var selected_container = selected_id;
2024 2023 var available_container = available_id;
2025 2024
2026 2025 //temp container for selected storage.
2027 2026 var cache = new Array();
2028 2027 var av_cache = new Array();
2029 2028 var c = YUD.get(selected_container);
2030 2029 var ac = YUD.get(available_container);
2031 2030
2032 2031 //get only selected options for further fullfilment
2033 2032 for(var i = 0;node =c.options[i];i++){
2034 2033 if(node.selected){
2035 2034 //push selected to my temp storage left overs :)
2036 2035 cache.push(node);
2037 2036 }
2038 2037 }
2039 2038
2040 2039 //get all available options to cache
2041 2040 for(var i = 0;node =ac.options[i];i++){
2042 2041 //push selected to my temp storage left overs :)
2043 2042 av_cache.push(node);
2044 2043 }
2045 2044
2046 2045 //fill available only with those not in choosen
2047 2046 ac.options.length=0;
2048 2047 tmp_cache = new Array();
2049 2048
2050 2049 for(var i = 0;node = av_cache[i];i++){
2051 2050 var add = true;
2052 2051 for(var i2 = 0;node_2 = cache[i2];i2++){
2053 2052 if(node.value == node_2.value){
2054 2053 add=false;
2055 2054 break;
2056 2055 }
2057 2056 }
2058 2057 if(add){
2059 2058 tmp_cache.push(new Option(node.text, node.value, false, false));
2060 2059 }
2061 2060 }
2062 2061
2063 2062 for(var i = 0;node = tmp_cache[i];i++){
2064 2063 ac.options[i] = node;
2065 2064 }
2066 2065
2067 2066 function prompts_action_callback(e){
2068 2067
2069 2068 var choosen = YUD.get(selected_container);
2070 2069 var available = YUD.get(available_container);
2071 2070
2072 2071 //get checked and unchecked options from field
2073 2072 function get_checked(from_field){
2074 2073 //temp container for storage.
2075 2074 var sel_cache = new Array();
2076 2075 var oth_cache = new Array();
2077 2076
2078 2077 for(var i = 0;node = from_field.options[i];i++){
2079 2078 if(node.selected){
2080 2079 //push selected fields :)
2081 2080 sel_cache.push(node);
2082 2081 }
2083 2082 else{
2084 2083 oth_cache.push(node)
2085 2084 }
2086 2085 }
2087 2086
2088 2087 return [sel_cache,oth_cache]
2089 2088 }
2090 2089
2091 2090 //fill the field with given options
2092 2091 function fill_with(field,options){
2093 2092 //clear firtst
2094 2093 field.options.length=0;
2095 2094 for(var i = 0;node = options[i];i++){
2096 2095 field.options[i]=new Option(node.text, node.value,
2097 2096 false, false);
2098 2097 }
2099 2098
2100 2099 }
2101 2100 //adds to current field
2102 2101 function add_to(field,options){
2103 2102 for(var i = 0;node = options[i];i++){
2104 2103 field.appendChild(new Option(node.text, node.value,
2105 2104 false, false));
2106 2105 }
2107 2106 }
2108 2107
2109 2108 // add action
2110 2109 if (this.id=='add_element'){
2111 2110 var c = get_checked(available);
2112 2111 add_to(choosen,c[0]);
2113 2112 fill_with(available,c[1]);
2114 2113 }
2115 2114 // remove action
2116 2115 if (this.id=='remove_element'){
2117 2116 var c = get_checked(choosen);
2118 2117 add_to(available,c[0]);
2119 2118 fill_with(choosen,c[1]);
2120 2119 }
2121 2120 // add all elements
2122 2121 if(this.id=='add_all_elements'){
2123 2122 for(var i=0; node = available.options[i];i++){
2124 2123 choosen.appendChild(new Option(node.text,
2125 2124 node.value, false, false));
2126 2125 }
2127 2126 available.options.length = 0;
2128 2127 }
2129 2128 //remove all elements
2130 2129 if(this.id=='remove_all_elements'){
2131 2130 for(var i=0; node = choosen.options[i];i++){
2132 2131 available.appendChild(new Option(node.text,
2133 2132 node.value, false, false));
2134 2133 }
2135 2134 choosen.options.length = 0;
2136 2135 }
2137 2136
2138 2137 }
2139 2138
2140 2139 YUE.addListener(['add_element','remove_element',
2141 2140 'add_all_elements','remove_all_elements'],'click',
2142 2141 prompts_action_callback)
2143 2142 if (form_id !== undefined) {
2144 2143 YUE.addListener(form_id,'submit',function(){
2145 2144 var choosen = YUD.get(selected_container);
2146 2145 for (var i = 0; i < choosen.options.length; i++) {
2147 2146 choosen.options[i].selected = 'selected';
2148 2147 }
2149 2148 });
2150 2149 }
2151 2150 }
2152 2151
2153 2152
2154 2153 // global hooks after DOM is loaded
2155 2154
2156 2155 YUE.onDOMReady(function(){
2157 2156 YUE.on(YUQ('.diff-collapse-button'), 'click', function(e){
2158 2157 var button = e.currentTarget;
2159 2158 var t = YUD.get(button).getAttribute('target');
2160 2159 console.log(t);
2161 2160 if(YUD.hasClass(t, 'hidden')){
2162 2161 YUD.removeClass(t, 'hidden');
2163 2162 YUD.get(button).innerHTML = "&uarr; {0} &uarr;".format(_TM['Collapse diff']);
2164 2163 }
2165 2164 else if(!YUD.hasClass(t, 'hidden')){
2166 2165 YUD.addClass(t, 'hidden');
2167 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 1 ## -*- coding: utf-8 -*-
2 2 <%inherit file="root.html"/>
3 3
4 4 <!-- HEADER -->
5 5 <div id="header-dd"></div>
6 6 <div id="header">
7 7 <div id="header-inner" class="title">
8 8 <div id="logo">
9 9 <h1><a href="${h.url('home')}">${c.rhodecode_name}</a></h1>
10 10 </div>
11 11 <!-- MENU -->
12 12 ${self.page_nav()}
13 13 <!-- END MENU -->
14 14 ${self.body()}
15 15 </div>
16 16 </div>
17 17 <!-- END HEADER -->
18 18
19 19 <!-- CONTENT -->
20 20 <div id="content">
21 21 <div class="flash_msg">
22 22 <% messages = h.flash.pop_messages() %>
23 23 % if messages:
24 24 <ul id="flash-messages">
25 25 % for message in messages:
26 26 <li class="${message.category}_msg">${message}</li>
27 27 % endfor
28 28 </ul>
29 29 % endif
30 30 </div>
31 31 <div id="main">
32 32 ${next.main()}
33 33 </div>
34 34 </div>
35 35 <!-- END CONTENT -->
36 36
37 37 <!-- FOOTER -->
38 38 <div id="footer">
39 39 <div id="footer-inner" class="title">
40 40 <div>
41 41 <p class="footer-link">
42 42 <a href="${h.url('bugtracker')}">${_('Submit a bug')}</a>
43 43 </p>
44 44 <p class="footer-link-right">
45 45 <a href="${h.url('rhodecode_official')}">RhodeCode${'-%s' % c.rhodecode_instanceid if c.rhodecode_instanceid else ''}</a>
46 46 ${c.rhodecode_version} &copy; 2010-${h.datetime.today().year} by Marcin Kuzminski
47 47 </p>
48 48 </div>
49 49 </div>
50 50 </div>
51 51 <!-- END FOOTER -->
52 52
53 53 ### MAKO DEFS ###
54 54 <%def name="page_nav()">
55 55 ${self.menu()}
56 56 </%def>
57 57
58 58 <%def name="breadcrumbs()">
59 59 <div class="breadcrumbs">
60 60 ${self.breadcrumbs_links()}
61 61 </div>
62 62 </%def>
63 63
64 64 <%def name="context_bar(current=None)">
65 65 %if c.repo_name:
66 66 ${repo_context_bar(current)}
67 67 %endif
68 68 </%def>
69 69
70 70 <%def name="admin_menu()">
71 71 <ul class="admin_menu">
72 72 <li>${h.link_to(_('admin journal'),h.url('admin_home'),class_='journal ')}</li>
73 73 <li>${h.link_to(_('repositories'),h.url('repos'),class_='repos')}</li>
74 74 <li>${h.link_to(_('repository groups'),h.url('repos_groups'),class_='repos_groups')}</li>
75 75 <li>${h.link_to(_('users'),h.url('users'),class_='users')}</li>
76 76 <li>${h.link_to(_('user groups'),h.url('users_groups'),class_='groups')}</li>
77 77 <li>${h.link_to(_('permissions'),h.url('edit_permission',id='default'),class_='permissions')}</li>
78 78 <li>${h.link_to(_('ldap'),h.url('ldap_home'),class_='ldap')}</li>
79 79 <li>${h.link_to(_('defaults'),h.url('defaults'),class_='defaults')}</li>
80 80 <li class="last">${h.link_to(_('settings'),h.url('admin_settings'),class_='settings')}</li>
81 81 </ul>
82 82 </%def>
83 83
84 84 <%def name="admin_menu_simple()">
85 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 87 </ul>
88 88 </%def>
89 89
90 90 <%def name="repo_context_bar(current=None)">
91 91 <%
92 92 def follow_class():
93 93 if c.repository_following:
94 94 return h.literal('following')
95 95 else:
96 96 return h.literal('follow')
97 97 %>
98 98 <%
99 99 def is_current(selected):
100 100 if selected == current:
101 101 return h.literal('class="current"')
102 102 %>
103 103
104 104 <!--- CONTEXT BAR -->
105 105 <div id="context-bar" class="box">
106 106 <div id="context-top">
107 107 <div id="breadcrumbs">
108 108 ${h.link_to(_(u'Repositories'),h.url('home'))}
109 109 Β»
110 110 ${h.repo_link(c.rhodecode_db_repo.groups_and_repo)}
111 111 </div>
112 112 ## TODO: this check feels wrong, it would be better to have a check for permissions
113 113 ## also it feels like a job for the controller
114 114 %if c.rhodecode_user.username != 'default':
115 115 <ul id="context-actions" class="horizontal-list">
116 116 <li>
117 117 <button class="${follow_class()}" onclick="javascript:toggleFollowingRepo(this,${c.rhodecode_db_repo.repo_id},'${str(h.get_token())}');">
118 118 <!--span class="icon show-follow follow"></span>
119 119 <span class="icon show-following following"></span-->
120 120 <span class="show-follow">${_('Follow')}</span>
121 121 <span class="show-following">${_('Unfollow')}</span>
122 122 </button>
123 123 </li>
124 124 <li><a href="${h.url('repo_fork_home',repo_name=c.repo_name)}" class="fork">${_('Fork')}</a></li>
125 125 %if h.is_hg(c.rhodecode_repo):
126 126 <li><a href="${h.url('pullrequest_home',repo_name=c.repo_name)}" class="pull-request">${_('Create Pull Request')}</a></li>
127 127 %endif
128 128 </ul>
129 129 %endif
130 130 </div>
131 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 132 <ul id="context-pages" class="horizontal-list">
137 133 <li ${is_current('summary')}><a href="${h.url('summary_home', repo_name=c.repo_name)}" class="summary">${_('Summary')}</a></li>
138 134 <li ${is_current('changelog')}><a href="${h.url('changelog_home', repo_name=c.repo_name)}" class="changelogs">${_('Changelog')}</a></li>
139 135 <li ${is_current('files')}><a href="${h.url('files_home', repo_name=c.repo_name)}" class="files"></span>${_('Files')}</a></li>
140 136 <li ${is_current('switch-to')}>
141 137 <a href="#" id="branch_tag_switcher_2" class="dropdown switch-to"></span>${_('Switch To')}</a>
142 138 <ul id="switch_to_list_2" class="switch_to submenu">
143 139 <li><a href="#">${_('loading...')}</a></li>
144 140 </ul>
145 141 </li>
146 142 <li ${is_current('options')}>
147 143 <a href="#" class="dropdown options"></span>Options</a>
148 144 <ul>
149 145 %if h.HasRepoPermissionAll('repository.admin')(c.repo_name):
150 146 %if h.HasPermissionAll('hg.admin')('access settings on repository'):
151 147 <li>${h.link_to(_('Settings'),h.url('edit_repo',repo_name=c.repo_name),class_='settings')}</li>
152 148 %else:
153 149 <li>${h.link_to(_('Settings'),h.url('repo_settings_home',repo_name=c.repo_name),class_='settings')}</li>
154 150 %endif
155 151 %endif
156 152 %if c.rhodecode_db_repo.fork:
157 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 154 %endif
159 155 <li>${h.link_to(_('Lightweight changelog'),h.url('shortlog_home',repo_name=c.repo_name),class_='shortlog')}</li>
160 156 <li>${h.link_to(_('Search'),h.url('search_repo',repo_name=c.repo_name),class_='search')}</li>
161 157
162 158 %if h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name) and c.rhodecode_db_repo.enable_locking:
163 159 %if c.rhodecode_db_repo.locked[0]:
164 160 <li>${h.link_to(_('Unlock'), h.url('toggle_locking',repo_name=c.repo_name),class_='locking_del')}</li>
165 161 %else:
166 162 <li>${h.link_to(_('Lock'), h.url('toggle_locking',repo_name=c.repo_name),class_='locking_add')}</li>
167 163 %endif
168 164 %endif
169 165 </ul>
170 166 </li>
171 167 <li ${is_current('showpullrequest')}>
172 168 <a href="${h.url('pullrequest_show_all',repo_name=c.repo_name)}" title="${_('Show Pull Requests')}" class="pull-request">Pull Requests
173 169 %if c.repository_pull_requests:
174 170 <span>${c.repository_pull_requests}</span>
175 171 %endif
176 172 </a>
177 173 </li>
178 174 </ul>
179 175 </div>
180 176 </div>
181 177 <script type="text/javascript">
182 178 YUE.on('branch_tag_switcher_2','mouseover',function(){
183 179 var loaded = YUD.hasClass('branch_tag_switcher_2','loaded');
184 180 if(!loaded){
185 181 YUD.addClass('branch_tag_switcher_2','loaded');
186 182 ypjax("${h.url('branch_tag_switcher',repo_name=c.repo_name)}",'switch_to_list_2',
187 183 function(o){},
188 184 function(o){YUD.removeClass('branch_tag_switcher_2','loaded');}
189 185 ,null);
190 186 }
191 187 return false;
192 188 });
193 189 </script>
194 190 <!--- END CONTEXT BAR -->
195 191 </%def>
196 192
197 193 <%def name="usermenu()">
198 194 ## USER MENU
199 195 <li>
200 196 <a class="menu_link childs" id="quick_login_link">
201 197 <span class="icon">
202 198 <img src="${h.gravatar_url(c.rhodecode_user.email,20)}" alt="avatar">
203 199 </span>
204 200 %if c.rhodecode_user.username != 'default':
205 201 <span class="menu_link_user">${c.rhodecode_user.username}</span>
206 202 %if c.unread_notifications != 0:
207 203 <span class="menu_link_notifications">${c.unread_notifications}</span>
208 204 %endif
209 205 %else:
210 206 <span>${_('Not logged in')}</span>
211 207 %endif
212 208 </a>
213 209
214 210 <div class="user-menu">
215 211 <div id="quick_login">
216 212 %if c.rhodecode_user.username == 'default':
217 213 <h4>${_('Login to your account')}</h4>
218 214 ${h.form(h.url('login_home',came_from=h.url.current()))}
219 215 <div class="form">
220 216 <div class="fields">
221 217 <div class="field">
222 218 <div class="label">
223 219 <label for="username">${_('Username')}:</label>
224 220 </div>
225 221 <div class="input">
226 222 ${h.text('username',class_='focus')}
227 223 </div>
228 224
229 225 </div>
230 226 <div class="field">
231 227 <div class="label">
232 228 <label for="password">${_('Password')}:</label>
233 229 </div>
234 230 <div class="input">
235 231 ${h.password('password',class_='focus')}
236 232 </div>
237 233
238 234 </div>
239 235 <div class="buttons">
240 236 <div class="password_forgoten">${h.link_to(_('Forgot password ?'),h.url('reset_password'))}</div>
241 237 <div class="register">
242 238 %if h.HasPermissionAny('hg.admin', 'hg.register.auto_activate', 'hg.register.manual_activate')():
243 239 ${h.link_to(_("Don't have an account ?"),h.url('register'))}
244 240 %endif
245 241 </div>
246 242 <div class="submit">
247 243 ${h.submit('sign_in',_('Log In'),class_="ui-btn xsmall")}
248 244 </div>
249 245 </div>
250 246 </div>
251 247 </div>
252 248 ${h.end_form()}
253 249 %else:
254 250 <div class="links_left">
255 251 <div class="full_name">${c.rhodecode_user.full_name_or_username}</div>
256 252 <div class="email">${c.rhodecode_user.email}</div>
257 253 <div class="big_gravatar"><img alt="gravatar" src="${h.gravatar_url(c.rhodecode_user.email,48)}" /></div>
258 254 ##<div class="notifications"><a href="${h.url('notifications')}">${_('Notifications')}</a></div>
259 255 <div class="unread"><a href="${h.url('notifications')}">${_('Unread notifications')}: ${c.unread_notifications}</a></div>
260 256 </div>
261 257 <div class="links_right">
262 258 <ol class="links">
263 259 ##<li>${h.link_to(_(u'Home'),h.url('home'))}</li>
264 260 <li>${h.link_to(_(u'Journal'),h.url('journal'))}</li>
265 261 <li>${h.link_to(_(u'My account'),h.url('admin_settings_my_account'))}</li>
266 262 <li class="logout">${h.link_to(_(u'Log Out'),h.url('logout_home'))}</li>
267 263 </ol>
268 264 </div>
269 265 %endif
270 266 </div>
271 267 </div>
272 268
273 269 </li>
274 270 </%def>
275 271
276 272 <%def name="menu(current=None)">
277 273 <%
278 274 def is_current(selected):
279 275 if selected == current:
280 276 return h.literal('class="current"')
281 277 %>
282 278 <ul id="quick" class="horizontal-list">
283 279 <!-- repo switcher -->
284 280 <li ${is_current('home')}>
285 281 <a class="menu_link repo_switcher childs" id="repo_switcher" title="${_('Switch repository')}" href="${h.url('home')}">
286 282 ${_('Repositories')}
287 283 </a>
288 284 <ul id="repo_switcher_list" class="repo_switcher">
289 285 <li>
290 286 <a href="#">${_('loading...')}</a>
291 287 </li>
292 288 </ul>
293 289 </li>
294 290 ##ROOT MENU
295 291 %if c.rhodecode_user.username != 'default':
296 292 <li ${is_current('journal')}>
297 293 <a class="menu_link journal" title="${_('Show recent activity')}" href="${h.url('journal')}">
298 294 ${_('Journal')}
299 295 </a>
300 296 </li>
301 297 %else:
302 298 <li ${is_current('journal')}>
303 299 <a class="menu_link journal" title="${_('Public journal')}" href="${h.url('public_journal')}">
304 300 ${_('Public journal')}
305 301 </a>
306 302 </li>
307 303 %endif
308 304 <li ${is_current('search')}>
309 305 <a class="menu_link search" title="${_('Search in repositories')}" href="${h.url('search')}">
310 306 ${_('Search')}
311 307 </a>
312 308 </li>
313 309 % if h.HasPermissionAll('hg.admin')('access admin main page'):
314 310 <li ${is_current('admin')}>
315 311 <a class="menu_link admin childs" title="${_('Admin')}" href="${h.url('admin_home')}">
316 312 ${_('Admin')}
317 313 </a>
318 314 ${admin_menu()}
319 315 </li>
320 316 % elif c.rhodecode_user.groups_admin:
321 317 <li ${is_current('admin')}>
322 318 <a class="menu_link admin childs" title="${_('Admin')}" href="${h.url('admin_home')}">
323 319 ${_('Admin')}
324 320 </a>
325 321 ${admin_menu_simple()}
326 322 </li>
327 323 % endif
328 324 ${usermenu()}
329 325 <script type="text/javascript">
330 326 YUE.on('repo_switcher','mouseover',function(){
331 327 var target = 'q_filter_rs';
332 328 var qfilter_activate = function(){
333 329 var nodes = YUQ('ul#repo_switcher_list li a.repo_name');
334 330 var func = function(node){
335 331 return node.parentNode;
336 332 }
337 333 q_filter(target,nodes,func);
338 334 }
339 335
340 336 var loaded = YUD.hasClass('repo_switcher','loaded');
341 337 if(!loaded){
342 338 YUD.addClass('repo_switcher','loaded');
343 339 ypjax("${h.url('repo_switcher')}",'repo_switcher_list',
344 340 function(o){qfilter_activate();YUD.get(target).focus()},
345 341 function(o){YUD.removeClass('repo_switcher','loaded');}
346 342 ,null);
347 343 }else{
348 344 YUD.get(target).focus();
349 345 }
350 346 return false;
351 347 });
352 348
353 349 YUE.on('header-dd', 'click',function(e){
354 350 YUD.addClass('header-inner', 'hover');
355 351 YUD.addClass('content', 'hover');
356 352 });
357 353
358 354 </script>
359 355 </%def>
@@ -1,116 +1,115 b''
1 1 ## -*- coding: utf-8 -*-
2 2 <!DOCTYPE html>
3 3 <html xmlns="http://www.w3.org/1999/xhtml">
4 4 <head>
5 5 <title>${self.title()}</title>
6 6 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
7 7 <meta name="robots" content="index, nofollow"/>
8 8 <link rel="icon" href="${h.url('/images/icons/database_gear.png')}" type="image/png" />
9 9
10 10 ## CSS ###
11 11 <%def name="css()">
12 12 <link rel="stylesheet" type="text/css" href="${h.url('/css/style.css', ver=c.rhodecode_version)}" media="screen"/>
13 13 <link rel="stylesheet" type="text/css" href="${h.url('/css/pygments.css', ver=c.rhodecode_version)}"/>
14
15 14 <link rel="stylesheet" type="text/css" href="${h.url('/css/contextbar.css', ver=c.rhodecode_version)}"/>
16 15 ## EXTRA FOR CSS
17 16 ${self.css_extra()}
18 17 </%def>
19 18 <%def name="css_extra()">
20 19 </%def>
21 20
22 21 ${self.css()}
23 22
24 23 %if c.ga_code:
25 24 <!-- Analytics -->
26 25 <script type="text/javascript">
27 26 var _gaq = _gaq || [];
28 27 _gaq.push(['_setAccount', '${c.ga_code}']);
29 28 _gaq.push(['_trackPageview']);
30 29
31 30 (function() {
32 31 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
33 32 ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
34 33 var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
35 34 })();
36 35 </script>
37 36 %endif
38 37
39 38 ## JAVASCRIPT ##
40 39 <%def name="js()">
41 40 <script type="text/javascript">
42 41 //JS translations map
43 42 var TRANSLATION_MAP = {
44 43 'Add another comment':'${_("Add another comment")}',
45 44 'Stop following this repository':"${_('Stop following this repository')}",
46 45 'Start following this repository':"${_('Start following this repository')}",
47 46 'Group':"${_('Group')}",
48 47 'members':"${_('members')}",
49 48 'Loading ...':"${_('Loading ...')}",
50 49 'Search truncated': "${_('Search truncated')}",
51 50 'No matching files': "${_('No matching files')}",
52 51 'Open new pull request': "${_('Open new pull request')}",
53 52 'Open new pull request for selected changesets': "${_('Open new pull request for selected changesets')}",
54 53 'Show selected changes __S -> __E': "${_('Show selected changes __S -> __E')}",
55 54 'Show selected change __S': "${_('Show selected change __S')}",
56 55 'Selection link': "${_('Selection link')}",
57 56 'Collapse diff': "${_('Collapse diff')}",
58 57 'Expand diff': "${_('Expand diff')}"
59 58 };
60 59 var _TM = TRANSLATION_MAP;
61 60
62 61 var TOGGLE_FOLLOW_URL = "${h.url('toggle_following')}";
63 62
64 63 </script>
65 64 <script type="text/javascript" src="${h.url('/js/yui.2.9.js', ver=c.rhodecode_version)}"></script>
66 65 <!--[if lt IE 9]>
67 66 <script language="javascript" type="text/javascript" src="${h.url('/js/excanvas.min.js')}"></script>
68 67 <![endif]-->
69 68 <script type="text/javascript" src="${h.url('/js/yui.flot.js', ver=c.rhodecode_version)}"></script>
70 69 <script type="text/javascript" src="${h.url('/js/native.history.js', ver=c.rhodecode_version)}"></script>
71 70 <script type="text/javascript" src="${h.url('/js/pyroutes_map.js', ver=c.rhodecode_version)}"></script>
72 71 <script type="text/javascript" src="${h.url('/js/rhodecode.js', ver=c.rhodecode_version)}"></script>
73 72 ## EXTRA FOR JS
74 73 ${self.js_extra()}
75 74 <script type="text/javascript">
76 75 (function(window,undefined){
77 76 // Prepare
78 77 var History = window.History; // Note: We are using a capital H instead of a lower h
79 78 if ( !History.enabled ) {
80 79 // History.js is disabled for this browser.
81 80 // This is because we can optionally choose to support HTML4 browsers or not.
82 81 return false;
83 82 }
84 83 })(window);
85 84
86 85 YUE.onDOMReady(function(){
87 86 tooltip_activate();
88 87 show_more_event();
89 88 show_changeset_tooltip();
90 89 // routes registration
91 90 pyroutes.register('toggle_following', "${h.url('toggle_following')}");
92 91 pyroutes.register('changeset_info', "${h.url('changeset_info', repo_name='%(repo_name)s', revision='%(revision)s')}", ['repo_name', 'revision']);
93 92 pyroutes.register('repo_size', "${h.url('repo_size', repo_name='%(repo_name)s')}", ['repo_name']);
94 93 })
95 94 </script>
96 95 </%def>
97 96 <%def name="js_extra()"></%def>
98 97 ${self.js()}
99 98 <%def name="head_extra()"></%def>
100 99 ${self.head_extra()}
101 100 </head>
102 101 <body id="body">
103 102 ## IE hacks
104 103 <!--[if IE 7]>
105 104 <script>YUD.addClass(document.body,'ie7')</script>
106 105 <![endif]-->
107 106 <!--[if IE 8]>
108 107 <script>YUD.addClass(document.body,'ie8')</script>
109 108 <![endif]-->
110 109 <!--[if IE 9]>
111 110 <script>YUD.addClass(document.body,'ie9')</script>
112 111 <![endif]-->
113 112
114 113 ${next.body()}
115 114 </body>
116 115 </html>
@@ -1,266 +1,263 b''
1 1 ## -*- coding: utf-8 -*-
2 2
3 3 <%inherit file="/base/base.html"/>
4 4
5 5 <%def name="title()">
6 6 ${_('%s Changelog') % c.repo_name} - ${c.rhodecode_name}
7 7 </%def>
8 8
9 9 <%def name="breadcrumbs_links()">
10 10 <% size = c.size if c.size <= c.total_cs else c.total_cs %>
11 11 ${_('Changelog')} - ${ungettext('showing %d out of %d revision', 'showing %d out of %d revisions', size) % (size, c.total_cs)}
12 12 </%def>
13 13
14 14 <%def name="page_nav()">
15 15 ${self.menu('changelog')}
16 16 </%def>
17 17
18 18 <%def name="main()">
19 19 ${self.context_bar('changelog')}
20 20 <div class="box">
21 21 <!-- box / title -->
22 22 <div class="title">
23 23 ${self.breadcrumbs()}
24 24 </div>
25 25 <div class="table">
26 26 % if c.pagination:
27 27 <div id="graph">
28 28 <div class="info_box" style="clear: both;padding: 10px 6px;min-height: 12px;text-align: right;">
29 29 <a href="#" class="ui-btn small" id="rev_range_container" style="display:none"></a>
30 30 <a href="#" class="ui-btn small" id="rev_range_clear" style="display:none">${_('Clear selection')}</a>
31 31
32 32 %if c.rhodecode_db_repo.fork:
33 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 34 %endif
35 35 %if h.is_hg(c.rhodecode_repo):
36 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 37 %endif
38 38 </div>
39 39 <div class="container_header">
40 40 ${h.form(h.url.current(),method='get')}
41 41 <div style="float:left">
42 42 ${h.submit('set',_('Show'),class_="ui-btn")}
43 43 ${h.text('size',size=1,value=c.size)}
44 44 ${_('revisions')}
45 45 </div>
46 46 ${h.end_form()}
47 47 <div style="float:right">${h.select('branch_filter',c.branch_name,c.branch_filters)}</div>
48 48 </div>
49 49 <div id="graph_nodes">
50 50 <canvas id="graph_canvas"></canvas>
51 51 </div>
52 52 <div id="graph_content">
53 53
54 54 <table id="changesets">
55 55 <tbody>
56 56 %for cnt,cs in enumerate(c.pagination):
57 57 <tr id="chg_${cnt+1}" class="container ${'tablerow%s' % (cnt%2)}">
58 58 <td class="checkbox">
59 59 ${h.checkbox(cs.raw_id,class_="changeset_range")}
60 60 </td>
61 61 <td class="author">
62 62 <img alt="gravatar" src="${h.gravatar_url(h.email_or_none(cs.author),16)}"/>
63 63 <span title="${cs.author}" class="user">${h.shorter(h.person(cs.author),22)}</span>
64 64 </td>
65 65 <td class="hash">
66 66 <a href="${h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id)}">
67 67 <span class="changeset_id">${cs.revision}:</span>
68 68 <span class="changeset_hash">${h.short_id(cs.raw_id)}</span>
69 69 </a>
70 70 </td>
71 71 <td class="date">
72 72 <div class="date">${h.age(cs.date,True)}</div>
73 73 </td>
74 74 <td class="mid">
75 75 <div class="log-container">
76 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 77 <div class="expand"><span class="expandtext">&darr; ${_('Show more')} &darr;</span></div>
78 78 <div class="extra-container">
79 79 %if c.comments.get(cs.raw_id,[]):
80 80 <div class="comments-container">
81 81 <div class="comments-cnt" title="${('comments')}">
82 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 83 ${len(c.comments[cs.raw_id])}
84 84 </a>
85 85 </div>
86 86 </div>
87 87 %endif
88 88 %if h.is_hg(c.rhodecode_repo):
89 89 %for book in cs.bookmarks:
90 90 <div class="bookbook" title="${'%s %s' % (_('bookmark'),book)}">
91 91 ${h.link_to(h.shorter(book),h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))}
92 92 </div>
93 93 %endfor
94 94 %endif
95 95 %for tag in cs.tags:
96 96 <div class="tagtag" title="${'%s %s' % (_('tag'),tag)}">
97 97 ${h.link_to(h.shorter(tag),h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))}
98 98 </div>
99 99 %endfor
100 100 %if (not c.branch_name) and cs.branch:
101 101 <div class="branchtag" title="${'%s %s' % (_('branch'),cs.branch)}">
102 102 ${h.link_to(h.shorter(cs.branch),h.url('changelog_home',repo_name=c.repo_name,branch=cs.branch))}
103 103 </div>
104 104 %endif
105 105 </div>
106 106 </div>
107 107 </td>
108 108 </tr>
109 109 %endfor
110 110 </tbody>
111 111 </table>
112 112
113
114 113 <div class="pagination-wh pagination-left">
115 114 ${c.pagination.pager('$link_previous ~2~ $link_next')}
116 115 </div>
117 116 </div>
118 117 </div>
119 118
120 119 <script type="text/javascript" src="${h.url('/js/graph.js')}"></script>
121 120 <script type="text/javascript">
122 121 YAHOO.util.Event.onDOMReady(function(){
123 122
124 123 //Monitor range checkboxes and build a link to changesets
125 124 //ranges
126 125 var checkboxes = YUD.getElementsByClassName('changeset_range');
127 126 var url_tmpl = "${h.url('changeset_home',repo_name=c.repo_name,revision='__REVRANGE__')}";
128 127 var pr_tmpl = "${h.url('pullrequest_home',repo_name=c.repo_name)}";
129 128
130 129 var checkbox_checker = function(e){
131 130 var checked_checkboxes = [];
132 131 for (pos in checkboxes){
133 132 if(checkboxes[pos].checked){
134 133 checked_checkboxes.push(checkboxes[pos]);
135 134 }
136 135 }
137 136 if(YUD.get('open_new_pr')){
138 137 if(checked_checkboxes.length>1){
139 138 YUD.setStyle('open_new_pr','display','none');
140 139 } else {
141 140 YUD.setStyle('open_new_pr','display','');
142 141 if(checked_checkboxes.length>0){
143 142 YUD.get('open_new_pr').innerHTML = _TM['Open new pull request for selected changesets'];
144 143 }else{
145 144 YUD.get('open_new_pr').innerHTML = _TM['Open new pull request'];
146 145 }
147 146 }
148 147 }
149 148
150 149 if(checked_checkboxes.length>0){
151 150 var rev_end = checked_checkboxes[0].name;
152 151 var rev_start = checked_checkboxes[checked_checkboxes.length-1].name;
153 152 var url = url_tmpl.replace('__REVRANGE__',
154 153 rev_start+'...'+rev_end);
155 154
156 155 var link = (rev_start == rev_end)
157 156 ? _TM['Show selected change __S']
158 157 : _TM['Show selected changes __S -> __E'];
159 158
160 159 link = link.replace('__S',rev_start.substr(0,6));
161 160 link = link.replace('__E',rev_end.substr(0,6));
162 161 YUD.get('rev_range_container').href = url;
163 162 YUD.get('rev_range_container').innerHTML = link;
164 163 YUD.setStyle('rev_range_container','display','');
165 164 YUD.setStyle('rev_range_clear','display','');
166 165
167 166 YUD.get('open_new_pr').href = pr_tmpl + '?rev_start={0}&rev_end={1}'.format(rev_start,rev_end);
168 167 YUD.setStyle('compare_fork','display','none');
169 168 } else{
170 169 YUD.setStyle('rev_range_container','display','none');
171 170 YUD.setStyle('rev_range_clear','display','none');
172 171 if (checkboxes){
173 172 YUD.get('open_new_pr').href = pr_tmpl + '?rev_end={0}'.format(checkboxes[0].name);
174 173 }
175 174 YUD.setStyle('compare_fork','display','');
176 175 }
177 176 };
178 177 YUE.onDOMReady(checkbox_checker);
179 178 YUE.on(checkboxes,'click', checkbox_checker);
180 179
181 180 YUE.on('rev_range_clear','click',function(e){
182 181 for (var i=0; i<checkboxes.length; i++){
183 182 var cb = checkboxes[i];
184 183 cb.checked = false;
185 184 }
186 185 checkbox_checker();
187 186 YUE.preventDefault(e);
188 187 });
189 188
190 189 var msgs = YUQ('.message');
191 190 // get first element height
192 191 var el = YUQ('#graph_content .container')[0];
193 192 var row_h = el.clientHeight;
194 193 for(var i=0;i<msgs.length;i++){
195 194 var m = msgs[i];
196 195
197 196 var h = m.clientHeight;
198 197 var pad = YUD.getStyle(m,'padding');
199 198 if(h > row_h){
200 199 var offset = row_h - (h+12);
201 200 YUD.setStyle(m.nextElementSibling,'display','block');
202 201 YUD.setStyle(m.nextElementSibling,'margin-top',offset+'px');
203 202 };
204 203 }
205 204 YUE.on(YUQ('.expand'),'click',function(e){
206 205 var elem = e.currentTarget.parentNode.parentNode;
207 206 YUD.setStyle(e.currentTarget,'display','none');
208 207 YUD.setStyle(elem,'height','auto');
209 208
210 209 //redraw the graph, line_count and jsdata are global vars
211 210 set_canvas(100);
212 211
213 212 var r = new BranchRenderer();
214 213 r.render(jsdata,100,line_count);
215 214
216 215 });
217 216
218 217 // change branch filter
219 218 YUE.on(YUD.get('branch_filter'),'change',function(e){
220 219 var selected_branch = e.currentTarget.options[e.currentTarget.selectedIndex].value;
221 220 var url_main = "${h.url('changelog_home',repo_name=c.repo_name)}";
222 221 var url = "${h.url('changelog_home',repo_name=c.repo_name,branch='__BRANCH__')}";
223 222 var url = url.replace('__BRANCH__',selected_branch);
224 223 if(selected_branch != ''){
225 224 window.location = url;
226 225 }else{
227 226 window.location = url_main;
228 227 }
229 228
230 229 });
231 230
232 231 function set_canvas(width) {
233 232 var c = document.getElementById('graph_nodes');
234 233 var t = document.getElementById('graph_content');
235 234 canvas = document.getElementById('graph_canvas');
236 235 var div_h = t.clientHeight;
237 //c.style.height=div_h+'px';
238 236 canvas.setAttribute('height',div_h);
239 //c.style.height=width+'px';
240 237 canvas.setAttribute('width',width);
241 238 };
242 239 var heads = 1;
243 240 var line_count = 0;
244 241 var jsdata = ${c.jsdata|n};
245 242
246 243 for (var i=0;i<jsdata.length;i++) {
247 244 var in_l = jsdata[i][2];
248 245 for (var j in in_l) {
249 246 var m = in_l[j][1];
250 247 if (m > line_count)
251 248 line_count = m;
252 249 }
253 250 }
254 251 set_canvas(100);
255 252
256 253 var r = new BranchRenderer();
257 254 r.render(jsdata,100,line_count);
258 255
259 256 });
260 257 </script>
261 258 %else:
262 259 ${_('There are no changes yet')}
263 260 %endif
264 261 </div>
265 262 </div>
266 263 </%def>
General Comments 0
You need to be logged in to leave comments. Login now