##// END OF EJS Templates
Implements subrepos view inside filebrowser...
marcink -
r2232:49dc09e9 beta
parent child Browse files
Show More
@@ -1,447 +1,454 b''
1 1 import re
2 2 from itertools import chain
3 3 from dulwich import objects
4 4 from subprocess import Popen, PIPE
5 5 from rhodecode.lib.vcs.conf import settings
6 6 from rhodecode.lib.vcs.exceptions import RepositoryError
7 7 from rhodecode.lib.vcs.exceptions import ChangesetError
8 8 from rhodecode.lib.vcs.exceptions import NodeDoesNotExistError
9 9 from rhodecode.lib.vcs.exceptions import VCSError
10 10 from rhodecode.lib.vcs.exceptions import ChangesetDoesNotExistError
11 11 from rhodecode.lib.vcs.exceptions import ImproperArchiveTypeError
12 12 from rhodecode.lib.vcs.backends.base import BaseChangeset
13 from rhodecode.lib.vcs.nodes import FileNode, DirNode, NodeKind, RootNode, RemovedFileNode
13 from rhodecode.lib.vcs.nodes import FileNode, DirNode, NodeKind, RootNode, \
14 RemovedFileNode, SubModuleNode
14 15 from rhodecode.lib.vcs.utils import safe_unicode
15 16 from rhodecode.lib.vcs.utils import date_fromtimestamp
16 17 from rhodecode.lib.vcs.utils.lazy import LazyProperty
17 18
18 19
19 20 class GitChangeset(BaseChangeset):
20 21 """
21 22 Represents state of the repository at single revision.
22 23 """
23 24
24 25 def __init__(self, repository, revision):
25 26 self._stat_modes = {}
26 27 self.repository = repository
27 28 self.raw_id = revision
28 29 self.revision = repository.revisions.index(revision)
29 30
30 31 self.short_id = self.raw_id[:12]
31 32 self.id = self.raw_id
32 33 try:
33 34 commit = self.repository._repo.get_object(self.raw_id)
34 35 except KeyError:
35 36 raise RepositoryError("Cannot get object with id %s" % self.raw_id)
36 37 self._commit = commit
37 38 self._tree_id = commit.tree
38 39
39 40 try:
40 41 self.message = safe_unicode(commit.message[:-1])
41 42 # Always strip last eol
42 43 except UnicodeDecodeError:
43 44 self.message = commit.message[:-1].decode(commit.encoding
44 45 or 'utf-8')
45 46 #self.branch = None
46 47 self.tags = []
47 48 #tree = self.repository.get_object(self._tree_id)
48 49 self.nodes = {}
49 50 self._paths = {}
50 51
51 52 @LazyProperty
52 53 def author(self):
53 54 return safe_unicode(self._commit.committer)
54 55
55 56 @LazyProperty
56 57 def date(self):
57 58 return date_fromtimestamp(self._commit.commit_time,
58 59 self._commit.commit_timezone)
59 60
60 61 @LazyProperty
61 62 def status(self):
62 63 """
63 64 Returns modified, added, removed, deleted files for current changeset
64 65 """
65 66 return self.changed, self.added, self.removed
66 67
67 68 @LazyProperty
68 69 def branch(self):
69 70
70 71 heads = self.repository._heads(reverse=False)
71 72
72 73 ref = heads.get(self.raw_id)
73 74 if ref:
74 75 return safe_unicode(ref)
75 76
76 77 def _fix_path(self, path):
77 78 """
78 79 Paths are stored without trailing slash so we need to get rid off it if
79 80 needed.
80 81 """
81 82 if path.endswith('/'):
82 83 path = path.rstrip('/')
83 84 return path
84 85
85 86 def _get_id_for_path(self, path):
86 87
87 88 # FIXME: Please, spare a couple of minutes and make those codes cleaner;
88 89 if not path in self._paths:
89 90 path = path.strip('/')
90 91 # set root tree
91 92 tree = self.repository._repo[self._commit.tree]
92 93 if path == '':
93 94 self._paths[''] = tree.id
94 95 return tree.id
95 96 splitted = path.split('/')
96 97 dirs, name = splitted[:-1], splitted[-1]
97 98 curdir = ''
98 99
99 100 # initially extract things from root dir
100 101 for item, stat, id in tree.iteritems():
101 102 if curdir:
102 103 name = '/'.join((curdir, item))
103 104 else:
104 105 name = item
105 106 self._paths[name] = id
106 107 self._stat_modes[name] = stat
107 108
108 109 for dir in dirs:
109 110 if curdir:
110 111 curdir = '/'.join((curdir, dir))
111 112 else:
112 113 curdir = dir
113 114 dir_id = None
114 115 for item, stat, id in tree.iteritems():
115 116 if dir == item:
116 117 dir_id = id
117 118 if dir_id:
118 119 # Update tree
119 120 tree = self.repository._repo[dir_id]
120 121 if not isinstance(tree, objects.Tree):
121 122 raise ChangesetError('%s is not a directory' % curdir)
122 123 else:
123 124 raise ChangesetError('%s have not been found' % curdir)
124 125
125 126 # cache all items from the given traversed tree
126 127 for item, stat, id in tree.iteritems():
127 128 if curdir:
128 129 name = '/'.join((curdir, item))
129 130 else:
130 131 name = item
131 132 self._paths[name] = id
132 133 self._stat_modes[name] = stat
133 134 if not path in self._paths:
134 135 raise NodeDoesNotExistError("There is no file nor directory "
135 136 "at the given path %r at revision %r"
136 137 % (path, self.short_id))
137 138 return self._paths[path]
138 139
139 140 def _get_kind(self, path):
140 141 id = self._get_id_for_path(path)
141 142 obj = self.repository._repo[id]
142 143 if isinstance(obj, objects.Blob):
143 144 return NodeKind.FILE
144 145 elif isinstance(obj, objects.Tree):
145 146 return NodeKind.DIR
146 147
147 148 def _get_file_nodes(self):
148 149 return chain(*(t[2] for t in self.walk()))
149 150
150 151 @LazyProperty
151 152 def parents(self):
152 153 """
153 154 Returns list of parents changesets.
154 155 """
155 156 return [self.repository.get_changeset(parent)
156 157 for parent in self._commit.parents]
157 158
158 159 def next(self, branch=None):
159 160
160 161 if branch and self.branch != branch:
161 162 raise VCSError('Branch option used on changeset not belonging '
162 163 'to that branch')
163 164
164 165 def _next(changeset, branch):
165 166 try:
166 167 next_ = changeset.revision + 1
167 168 next_rev = changeset.repository.revisions[next_]
168 169 except IndexError:
169 170 raise ChangesetDoesNotExistError
170 171 cs = changeset.repository.get_changeset(next_rev)
171 172
172 173 if branch and branch != cs.branch:
173 174 return _next(cs, branch)
174 175
175 176 return cs
176 177
177 178 return _next(self, branch)
178 179
179 180 def prev(self, branch=None):
180 181 if branch and self.branch != branch:
181 182 raise VCSError('Branch option used on changeset not belonging '
182 183 'to that branch')
183 184
184 185 def _prev(changeset, branch):
185 186 try:
186 187 prev_ = changeset.revision - 1
187 188 if prev_ < 0:
188 189 raise IndexError
189 190 prev_rev = changeset.repository.revisions[prev_]
190 191 except IndexError:
191 192 raise ChangesetDoesNotExistError
192 193
193 194 cs = changeset.repository.get_changeset(prev_rev)
194 195
195 196 if branch and branch != cs.branch:
196 197 return _prev(cs, branch)
197 198
198 199 return cs
199 200
200 201 return _prev(self, branch)
201 202
202 203 def get_file_mode(self, path):
203 204 """
204 205 Returns stat mode of the file at the given ``path``.
205 206 """
206 207 # ensure path is traversed
207 208 self._get_id_for_path(path)
208 209 return self._stat_modes[path]
209 210
210 211 def get_file_content(self, path):
211 212 """
212 213 Returns content of the file at given ``path``.
213 214 """
214 215 id = self._get_id_for_path(path)
215 216 blob = self.repository._repo[id]
216 217 return blob.as_pretty_string()
217 218
218 219 def get_file_size(self, path):
219 220 """
220 221 Returns size of the file at given ``path``.
221 222 """
222 223 id = self._get_id_for_path(path)
223 224 blob = self.repository._repo[id]
224 225 return blob.raw_length()
225 226
226 227 def get_file_changeset(self, path):
227 228 """
228 229 Returns last commit of the file at the given ``path``.
229 230 """
230 231 node = self.get_node(path)
231 232 return node.history[0]
232 233
233 234 def get_file_history(self, path):
234 235 """
235 236 Returns history of file as reversed list of ``Changeset`` objects for
236 237 which file at given ``path`` has been modified.
237 238
238 239 TODO: This function now uses os underlying 'git' and 'grep' commands
239 240 which is generally not good. Should be replaced with algorithm
240 241 iterating commits.
241 242 """
242 243 cmd = 'log --pretty="format: %%H" --name-status -p %s -- "%s"' % (
243 244 self.id, path
244 245 )
245 246 so, se = self.repository.run_git_command(cmd)
246 247 ids = re.findall(r'\w{40}', so)
247 248 return [self.repository.get_changeset(id) for id in ids]
248 249
249 250 def get_file_annotate(self, path):
250 251 """
251 252 Returns a list of three element tuples with lineno,changeset and line
252 253
253 254 TODO: This function now uses os underlying 'git' command which is
254 255 generally not good. Should be replaced with algorithm iterating
255 256 commits.
256 257 """
257 258 cmd = 'blame -l --root -r %s -- "%s"' % (self.id, path)
258 259 # -l ==> outputs long shas (and we need all 40 characters)
259 260 # --root ==> doesn't put '^' character for bounderies
260 261 # -r sha ==> blames for the given revision
261 262 so, se = self.repository.run_git_command(cmd)
262 263 annotate = []
263 264 for i, blame_line in enumerate(so.split('\n')[:-1]):
264 265 ln_no = i + 1
265 266 id, line = re.split(r' \(.+?\) ', blame_line, 1)
266 267 annotate.append((ln_no, self.repository.get_changeset(id), line))
267 268 return annotate
268 269
269 270 def fill_archive(self, stream=None, kind='tgz', prefix=None,
270 271 subrepos=False):
271 272 """
272 273 Fills up given stream.
273 274
274 275 :param stream: file like object.
275 276 :param kind: one of following: ``zip``, ``tgz`` or ``tbz2``.
276 277 Default: ``tgz``.
277 278 :param prefix: name of root directory in archive.
278 279 Default is repository name and changeset's raw_id joined with dash
279 280 (``repo-tip.<KIND>``).
280 281 :param subrepos: include subrepos in this archive.
281 282
282 283 :raise ImproperArchiveTypeError: If given kind is wrong.
283 284 :raise VcsError: If given stream is None
284 285
285 286 """
286 287 allowed_kinds = settings.ARCHIVE_SPECS.keys()
287 288 if kind not in allowed_kinds:
288 289 raise ImproperArchiveTypeError('Archive kind not supported use one'
289 290 'of %s', allowed_kinds)
290 291
291 292 if prefix is None:
292 293 prefix = '%s-%s' % (self.repository.name, self.short_id)
293 294 elif prefix.startswith('/'):
294 295 raise VCSError("Prefix cannot start with leading slash")
295 296 elif prefix.strip() == '':
296 297 raise VCSError("Prefix cannot be empty")
297 298
298 299 if kind == 'zip':
299 300 frmt = 'zip'
300 301 else:
301 302 frmt = 'tar'
302 303 cmd = 'git archive --format=%s --prefix=%s/ %s' % (frmt, prefix,
303 304 self.raw_id)
304 305 if kind == 'tgz':
305 306 cmd += ' | gzip -9'
306 307 elif kind == 'tbz2':
307 308 cmd += ' | bzip2 -9'
308 309
309 310 if stream is None:
310 311 raise VCSError('You need to pass in a valid stream for filling'
311 312 ' with archival data')
312 313 popen = Popen(cmd, stdout=PIPE, stderr=PIPE, shell=True,
313 314 cwd=self.repository.path)
314 315
315 316 buffer_size = 1024 * 8
316 317 chunk = popen.stdout.read(buffer_size)
317 318 while chunk:
318 319 stream.write(chunk)
319 320 chunk = popen.stdout.read(buffer_size)
320 321 # Make sure all descriptors would be read
321 322 popen.communicate()
322 323
323 324 def get_nodes(self, path):
324 325 if self._get_kind(path) != NodeKind.DIR:
325 326 raise ChangesetError("Directory does not exist for revision %r at "
326 327 " %r" % (self.revision, path))
327 328 path = self._fix_path(path)
328 329 id = self._get_id_for_path(path)
329 330 tree = self.repository._repo[id]
330 331 dirnodes = []
331 332 filenodes = []
333 als = self.repository.alias
332 334 for name, stat, id in tree.iteritems():
335 if objects.S_ISGITLINK(stat):
336 dirnodes.append(SubModuleNode(name, url=None, changeset=id,
337 alias=als))
338 continue
339
333 340 obj = self.repository._repo.get_object(id)
334 341 if path != '':
335 342 obj_path = '/'.join((path, name))
336 343 else:
337 344 obj_path = name
338 345 if obj_path not in self._stat_modes:
339 346 self._stat_modes[obj_path] = stat
340 347 if isinstance(obj, objects.Tree):
341 348 dirnodes.append(DirNode(obj_path, changeset=self))
342 349 elif isinstance(obj, objects.Blob):
343 350 filenodes.append(FileNode(obj_path, changeset=self, mode=stat))
344 351 else:
345 352 raise ChangesetError("Requested object should be Tree "
346 353 "or Blob, is %r" % type(obj))
347 354 nodes = dirnodes + filenodes
348 355 for node in nodes:
349 356 if not node.path in self.nodes:
350 357 self.nodes[node.path] = node
351 358 nodes.sort()
352 359 return nodes
353 360
354 361 def get_node(self, path):
355 362 if isinstance(path, unicode):
356 363 path = path.encode('utf-8')
357 364 path = self._fix_path(path)
358 365 if not path in self.nodes:
359 366 try:
360 367 id = self._get_id_for_path(path)
361 368 except ChangesetError:
362 369 raise NodeDoesNotExistError("Cannot find one of parents' "
363 370 "directories for a given path: %s" % path)
364 371 obj = self.repository._repo.get_object(id)
365 372 if isinstance(obj, objects.Tree):
366 373 if path == '':
367 374 node = RootNode(changeset=self)
368 375 else:
369 376 node = DirNode(path, changeset=self)
370 377 node._tree = obj
371 378 elif isinstance(obj, objects.Blob):
372 379 node = FileNode(path, changeset=self)
373 380 node._blob = obj
374 381 else:
375 382 raise NodeDoesNotExistError("There is no file nor directory "
376 383 "at the given path %r at revision %r"
377 384 % (path, self.short_id))
378 385 # cache node
379 386 self.nodes[path] = node
380 387 return self.nodes[path]
381 388
382 389 @LazyProperty
383 390 def affected_files(self):
384 391 """
385 392 Get's a fast accessible file changes for given changeset
386 393 """
387 394
388 395 return self.added + self.changed
389 396
390 397 @LazyProperty
391 398 def _diff_name_status(self):
392 399 output = []
393 400 for parent in self.parents:
394 401 cmd = 'diff --name-status %s %s --encoding=utf8' % (parent.raw_id, self.raw_id)
395 402 so, se = self.repository.run_git_command(cmd)
396 403 output.append(so.strip())
397 404 return '\n'.join(output)
398 405
399 406 def _get_paths_for_status(self, status):
400 407 """
401 408 Returns sorted list of paths for given ``status``.
402 409
403 410 :param status: one of: *added*, *modified* or *deleted*
404 411 """
405 412 paths = set()
406 413 char = status[0].upper()
407 414 for line in self._diff_name_status.splitlines():
408 415 if not line:
409 416 continue
410 417
411 418 if line.startswith(char):
412 419 splitted = line.split(char, 1)
413 420 if not len(splitted) == 2:
414 421 raise VCSError("Couldn't parse diff result:\n%s\n\n and "
415 422 "particularly that line: %s" % (self._diff_name_status,
416 423 line))
417 424 _path = splitted[1].strip()
418 425 paths.add(_path)
419 426
420 427 return sorted(paths)
421 428
422 429 @LazyProperty
423 430 def added(self):
424 431 """
425 432 Returns list of added ``FileNode`` objects.
426 433 """
427 434 if not self.parents:
428 435 return list(self._get_file_nodes())
429 436 return [self.get_node(path) for path in self._get_paths_for_status('added')]
430 437
431 438 @LazyProperty
432 439 def changed(self):
433 440 """
434 441 Returns list of modified ``FileNode`` objects.
435 442 """
436 443 if not self.parents:
437 444 return []
438 445 return [self.get_node(path) for path in self._get_paths_for_status('modified')]
439 446
440 447 @LazyProperty
441 448 def removed(self):
442 449 """
443 450 Returns list of removed ``FileNode`` objects.
444 451 """
445 452 if not self.parents:
446 453 return []
447 454 return [RemovedFileNode(path) for path in self._get_paths_for_status('deleted')]
@@ -1,337 +1,355 b''
1 1 import os
2 2 import posixpath
3 3
4 4 from rhodecode.lib.vcs.backends.base import BaseChangeset
5 5 from rhodecode.lib.vcs.conf import settings
6 6 from rhodecode.lib.vcs.exceptions import ChangesetDoesNotExistError, \
7 7 ChangesetError, ImproperArchiveTypeError, NodeDoesNotExistError, VCSError
8 from rhodecode.lib.vcs.nodes import AddedFileNodesGenerator, ChangedFileNodesGenerator, \
9 DirNode, FileNode, NodeKind, RemovedFileNodesGenerator, RootNode
8 from rhodecode.lib.vcs.nodes import AddedFileNodesGenerator, \
9 ChangedFileNodesGenerator, DirNode, FileNode, NodeKind, \
10 RemovedFileNodesGenerator, RootNode, SubModuleNode
10 11
11 12 from rhodecode.lib.vcs.utils import safe_str, safe_unicode, date_fromtimestamp
12 13 from rhodecode.lib.vcs.utils.lazy import LazyProperty
13 14 from rhodecode.lib.vcs.utils.paths import get_dirs_for_path
14 15
15 16 from ...utils.hgcompat import archival, hex
16 17
17 18
18 19 class MercurialChangeset(BaseChangeset):
19 20 """
20 21 Represents state of the repository at the single revision.
21 22 """
22 23
23 24 def __init__(self, repository, revision):
24 25 self.repository = repository
25 26 self.raw_id = revision
26 27 self._ctx = repository._repo[revision]
27 28 self.revision = self._ctx._rev
28 29 self.nodes = {}
29 30
30 31 @LazyProperty
31 32 def tags(self):
32 33 return map(safe_unicode, self._ctx.tags())
33 34
34 35 @LazyProperty
35 36 def branch(self):
36 37 return safe_unicode(self._ctx.branch())
37 38
38 39 @LazyProperty
39 40 def message(self):
40 41 return safe_unicode(self._ctx.description())
41 42
42 43 @LazyProperty
43 44 def author(self):
44 45 return safe_unicode(self._ctx.user())
45 46
46 47 @LazyProperty
47 48 def date(self):
48 49 return date_fromtimestamp(*self._ctx.date())
49 50
50 51 @LazyProperty
51 52 def status(self):
52 53 """
53 54 Returns modified, added, removed, deleted files for current changeset
54 55 """
55 56 return self.repository._repo.status(self._ctx.p1().node(),
56 57 self._ctx.node())
57 58
58 59 @LazyProperty
59 60 def _file_paths(self):
60 61 return list(self._ctx)
61 62
62 63 @LazyProperty
63 64 def _dir_paths(self):
64 65 p = list(set(get_dirs_for_path(*self._file_paths)))
65 66 p.insert(0, '')
66 67 return p
67 68
68 69 @LazyProperty
69 70 def _paths(self):
70 71 return self._dir_paths + self._file_paths
71 72
72 73 @LazyProperty
73 74 def id(self):
74 75 if self.last:
75 76 return u'tip'
76 77 return self.short_id
77 78
78 79 @LazyProperty
79 80 def short_id(self):
80 81 return self.raw_id[:12]
81 82
82 83 @LazyProperty
83 84 def parents(self):
84 85 """
85 86 Returns list of parents changesets.
86 87 """
87 88 return [self.repository.get_changeset(parent.rev())
88 89 for parent in self._ctx.parents() if parent.rev() >= 0]
89 90
90 91 def next(self, branch=None):
91 92
92 93 if branch and self.branch != branch:
93 94 raise VCSError('Branch option used on changeset not belonging '
94 95 'to that branch')
95 96
96 97 def _next(changeset, branch):
97 98 try:
98 99 next_ = changeset.revision + 1
99 100 next_rev = changeset.repository.revisions[next_]
100 101 except IndexError:
101 102 raise ChangesetDoesNotExistError
102 103 cs = changeset.repository.get_changeset(next_rev)
103 104
104 105 if branch and branch != cs.branch:
105 106 return _next(cs, branch)
106 107
107 108 return cs
108 109
109 110 return _next(self, branch)
110 111
111 112 def prev(self, branch=None):
112 113 if branch and self.branch != branch:
113 114 raise VCSError('Branch option used on changeset not belonging '
114 115 'to that branch')
115 116
116 117 def _prev(changeset, branch):
117 118 try:
118 119 prev_ = changeset.revision - 1
119 120 if prev_ < 0:
120 121 raise IndexError
121 122 prev_rev = changeset.repository.revisions[prev_]
122 123 except IndexError:
123 124 raise ChangesetDoesNotExistError
124 125
125 126 cs = changeset.repository.get_changeset(prev_rev)
126 127
127 128 if branch and branch != cs.branch:
128 129 return _prev(cs, branch)
129 130
130 131 return cs
131 132
132 133 return _prev(self, branch)
133 134
134 135 def _fix_path(self, path):
135 136 """
136 137 Paths are stored without trailing slash so we need to get rid off it if
137 138 needed. Also mercurial keeps filenodes as str so we need to decode
138 139 from unicode to str
139 140 """
140 141 if path.endswith('/'):
141 142 path = path.rstrip('/')
142 143
143 144 return safe_str(path)
144 145
145 146 def _get_kind(self, path):
146 147 path = self._fix_path(path)
147 148 if path in self._file_paths:
148 149 return NodeKind.FILE
149 150 elif path in self._dir_paths:
150 151 return NodeKind.DIR
151 152 else:
152 153 raise ChangesetError("Node does not exist at the given path %r"
153 154 % (path))
154 155
155 156 def _get_filectx(self, path):
156 157 path = self._fix_path(path)
157 158 if self._get_kind(path) != NodeKind.FILE:
158 159 raise ChangesetError("File does not exist for revision %r at "
159 160 " %r" % (self.revision, path))
160 161 return self._ctx.filectx(path)
161 162
163 def _extract_submodules(self):
164 """
165 returns a dictionary with submodule information from substate file
166 of hg repository
167 """
168 return self._ctx.substate
169
162 170 def get_file_mode(self, path):
163 171 """
164 172 Returns stat mode of the file at the given ``path``.
165 173 """
166 174 fctx = self._get_filectx(path)
167 175 if 'x' in fctx.flags():
168 176 return 0100755
169 177 else:
170 178 return 0100644
171 179
172 180 def get_file_content(self, path):
173 181 """
174 182 Returns content of the file at given ``path``.
175 183 """
176 184 fctx = self._get_filectx(path)
177 185 return fctx.data()
178 186
179 187 def get_file_size(self, path):
180 188 """
181 189 Returns size of the file at given ``path``.
182 190 """
183 191 fctx = self._get_filectx(path)
184 192 return fctx.size()
185 193
186 194 def get_file_changeset(self, path):
187 195 """
188 196 Returns last commit of the file at the given ``path``.
189 197 """
190 198 node = self.get_node(path)
191 199 return node.history[0]
192 200
193 201 def get_file_history(self, path):
194 202 """
195 203 Returns history of file as reversed list of ``Changeset`` objects for
196 204 which file at given ``path`` has been modified.
197 205 """
198 206 fctx = self._get_filectx(path)
199 207 nodes = [fctx.filectx(x).node() for x in fctx.filelog()]
200 208 changesets = [self.repository.get_changeset(hex(node))
201 209 for node in reversed(nodes)]
202 210 return changesets
203 211
204 212 def get_file_annotate(self, path):
205 213 """
206 214 Returns a list of three element tuples with lineno,changeset and line
207 215 """
208 216 fctx = self._get_filectx(path)
209 217 annotate = []
210 218 for i, annotate_data in enumerate(fctx.annotate()):
211 219 ln_no = i + 1
212 220 annotate.append((ln_no, self.repository\
213 221 .get_changeset(hex(annotate_data[0].node())),
214 222 annotate_data[1],))
215 223
216 224 return annotate
217 225
218 226 def fill_archive(self, stream=None, kind='tgz', prefix=None,
219 227 subrepos=False):
220 228 """
221 229 Fills up given stream.
222 230
223 231 :param stream: file like object.
224 232 :param kind: one of following: ``zip``, ``tgz`` or ``tbz2``.
225 233 Default: ``tgz``.
226 234 :param prefix: name of root directory in archive.
227 235 Default is repository name and changeset's raw_id joined with dash
228 236 (``repo-tip.<KIND>``).
229 237 :param subrepos: include subrepos in this archive.
230 238
231 239 :raise ImproperArchiveTypeError: If given kind is wrong.
232 240 :raise VcsError: If given stream is None
233 241 """
234 242
235 243 allowed_kinds = settings.ARCHIVE_SPECS.keys()
236 244 if kind not in allowed_kinds:
237 245 raise ImproperArchiveTypeError('Archive kind not supported use one'
238 246 'of %s', allowed_kinds)
239 247
240 248 if stream is None:
241 249 raise VCSError('You need to pass in a valid stream for filling'
242 250 ' with archival data')
243 251
244 252 if prefix is None:
245 253 prefix = '%s-%s' % (self.repository.name, self.short_id)
246 254 elif prefix.startswith('/'):
247 255 raise VCSError("Prefix cannot start with leading slash")
248 256 elif prefix.strip() == '':
249 257 raise VCSError("Prefix cannot be empty")
250 258
251 259 archival.archive(self.repository._repo, stream, self.raw_id,
252 260 kind, prefix=prefix, subrepos=subrepos)
253 261
254 262 #stream.close()
255 263
256 264 if stream.closed and hasattr(stream, 'name'):
257 265 stream = open(stream.name, 'rb')
258 266 elif hasattr(stream, 'mode') and 'r' not in stream.mode:
259 267 stream = open(stream.name, 'rb')
260 268 else:
261 269 stream.seek(0)
262 270
263 271 def get_nodes(self, path):
264 272 """
265 273 Returns combined ``DirNode`` and ``FileNode`` objects list representing
266 274 state of changeset at the given ``path``. If node at the given ``path``
267 275 is not instance of ``DirNode``, ChangesetError would be raised.
268 276 """
269 277
270 278 if self._get_kind(path) != NodeKind.DIR:
271 279 raise ChangesetError("Directory does not exist for revision %r at "
272 280 " %r" % (self.revision, path))
273 281 path = self._fix_path(path)
282
274 283 filenodes = [FileNode(f, changeset=self) for f in self._file_paths
275 284 if os.path.dirname(f) == path]
276 285 dirs = path == '' and '' or [d for d in self._dir_paths
277 286 if d and posixpath.dirname(d) == path]
278 287 dirnodes = [DirNode(d, changeset=self) for d in dirs
279 288 if os.path.dirname(d) == path]
289
290 als = self.repository.alias
291 for k, vals in self._extract_submodules().iteritems():
292 #vals = url,rev,type
293 loc = vals[0]
294 cs = vals[1]
295 dirnodes.append(SubModuleNode(k, url=loc, changeset=cs,
296 alias=als))
280 297 nodes = dirnodes + filenodes
281 298 # cache nodes
282 299 for node in nodes:
283 300 self.nodes[node.path] = node
284 301 nodes.sort()
302
285 303 return nodes
286 304
287 305 def get_node(self, path):
288 306 """
289 307 Returns ``Node`` object from the given ``path``. If there is no node at
290 308 the given ``path``, ``ChangesetError`` would be raised.
291 309 """
292 310
293 311 path = self._fix_path(path)
294 312
295 313 if not path in self.nodes:
296 314 if path in self._file_paths:
297 315 node = FileNode(path, changeset=self)
298 316 elif path in self._dir_paths or path in self._dir_paths:
299 317 if path == '':
300 318 node = RootNode(changeset=self)
301 319 else:
302 320 node = DirNode(path, changeset=self)
303 321 else:
304 322 raise NodeDoesNotExistError("There is no file nor directory "
305 323 "at the given path: %r at revision %r"
306 324 % (path, self.short_id))
307 325 # cache node
308 326 self.nodes[path] = node
309 327 return self.nodes[path]
310 328
311 329 @LazyProperty
312 330 def affected_files(self):
313 331 """
314 332 Get's a fast accessible file changes for given changeset
315 333 """
316 334 return self._ctx.files()
317 335
318 336 @property
319 337 def added(self):
320 338 """
321 339 Returns list of added ``FileNode`` objects.
322 340 """
323 341 return AddedFileNodesGenerator([n for n in self.status[1]], self)
324 342
325 343 @property
326 344 def changed(self):
327 345 """
328 346 Returns list of modified ``FileNode`` objects.
329 347 """
330 348 return ChangedFileNodesGenerator([n for n in self.status[0]], self)
331 349
332 350 @property
333 351 def removed(self):
334 352 """
335 353 Returns list of removed ``FileNode`` objects.
336 354 """
337 355 return RemovedFileNodesGenerator([n for n in self.status[2]], self)
@@ -1,563 +1,600 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 vcs.nodes
4 4 ~~~~~~~~~
5 5
6 6 Module holding everything related to vcs nodes.
7 7
8 8 :created_on: Apr 8, 2010
9 9 :copyright: (c) 2010-2011 by Marcin Kuzminski, Lukasz Balcerzak.
10 10 """
11 import os
11 12 import stat
12 13 import posixpath
13 14 import mimetypes
14 15
16 from pygments import lexers
17
15 18 from rhodecode.lib.vcs.utils.lazy import LazyProperty
16 from rhodecode.lib.vcs.utils import safe_unicode
19 from rhodecode.lib.vcs.utils import safe_unicode, safe_str
17 20 from rhodecode.lib.vcs.exceptions import NodeError
18 21 from rhodecode.lib.vcs.exceptions import RemovedFileNodeError
19 22
20 from pygments import lexers
21
22 23
23 24 class NodeKind:
25 SUBMODULE = -1
24 26 DIR = 1
25 27 FILE = 2
26 28
27 29
28 30 class NodeState:
29 31 ADDED = u'added'
30 32 CHANGED = u'changed'
31 33 NOT_CHANGED = u'not changed'
32 34 REMOVED = u'removed'
33 35
34 36
35 37 class NodeGeneratorBase(object):
36 38 """
37 39 Base class for removed added and changed filenodes, it's a lazy generator
38 40 class that will create filenodes only on iteration or call
39 41
40 42 The len method doesn't need to create filenodes at all
41 43 """
42 44
43 45 def __init__(self, current_paths, cs):
44 46 self.cs = cs
45 47 self.current_paths = current_paths
46 48
47 49 def __call__(self):
48 50 return [n for n in self]
49 51
50 52 def __getslice__(self, i, j):
51 53 for p in self.current_paths[i:j]:
52 54 yield self.cs.get_node(p)
53 55
54 56 def __len__(self):
55 57 return len(self.current_paths)
56 58
57 59 def __iter__(self):
58 60 for p in self.current_paths:
59 61 yield self.cs.get_node(p)
60 62
61 63
62 64 class AddedFileNodesGenerator(NodeGeneratorBase):
63 65 """
64 66 Class holding Added files for current changeset
65 67 """
66 68 pass
67 69
68 70
69 71 class ChangedFileNodesGenerator(NodeGeneratorBase):
70 72 """
71 73 Class holding Changed files for current changeset
72 74 """
73 75 pass
74 76
75 77
76 78 class RemovedFileNodesGenerator(NodeGeneratorBase):
77 79 """
78 80 Class holding removed files for current changeset
79 81 """
80 82 def __iter__(self):
81 83 for p in self.current_paths:
82 84 yield RemovedFileNode(path=p)
83 85
84 86 def __getslice__(self, i, j):
85 87 for p in self.current_paths[i:j]:
86 88 yield RemovedFileNode(path=p)
87 89
88 90
89 91 class Node(object):
90 92 """
91 93 Simplest class representing file or directory on repository. SCM backends
92 94 should use ``FileNode`` and ``DirNode`` subclasses rather than ``Node``
93 95 directly.
94 96
95 97 Node's ``path`` cannot start with slash as we operate on *relative* paths
96 98 only. Moreover, every single node is identified by the ``path`` attribute,
97 99 so it cannot end with slash, too. Otherwise, path could lead to mistakes.
98 100 """
99 101
100 102 def __init__(self, path, kind):
101 103 if path.startswith('/'):
102 104 raise NodeError("Cannot initialize Node objects with slash at "
103 105 "the beginning as only relative paths are supported")
104 106 self.path = path.rstrip('/')
105 107 if path == '' and kind != NodeKind.DIR:
106 108 raise NodeError("Only DirNode and its subclasses may be "
107 109 "initialized with empty path")
108 110 self.kind = kind
109 111 #self.dirs, self.files = [], []
110 112 if self.is_root() and not self.is_dir():
111 113 raise NodeError("Root node cannot be FILE kind")
112 114
113 115 @LazyProperty
114 116 def parent(self):
115 117 parent_path = self.get_parent_path()
116 118 if parent_path:
117 119 if self.changeset:
118 120 return self.changeset.get_node(parent_path)
119 121 return DirNode(parent_path)
120 122 return None
121 123
122 124 @LazyProperty
123 125 def unicode_path(self):
124 126 return safe_unicode(self.path)
125 127
126 128 @LazyProperty
127 129 def name(self):
128 130 """
129 131 Returns name of the node so if its path
130 132 then only last part is returned.
131 133 """
132 134 return safe_unicode(self.path.rstrip('/').split('/')[-1])
133 135
134 136 def _get_kind(self):
135 137 return self._kind
136 138
137 139 def _set_kind(self, kind):
138 140 if hasattr(self, '_kind'):
139 141 raise NodeError("Cannot change node's kind")
140 142 else:
141 143 self._kind = kind
142 144 # Post setter check (path's trailing slash)
143 145 if self.path.endswith('/'):
144 146 raise NodeError("Node's path cannot end with slash")
145 147
146 148 kind = property(_get_kind, _set_kind)
147 149
148 150 def __cmp__(self, other):
149 151 """
150 152 Comparator using name of the node, needed for quick list sorting.
151 153 """
152 154 kind_cmp = cmp(self.kind, other.kind)
153 155 if kind_cmp:
154 156 return kind_cmp
155 157 return cmp(self.name, other.name)
156 158
157 159 def __eq__(self, other):
158 160 for attr in ['name', 'path', 'kind']:
159 161 if getattr(self, attr) != getattr(other, attr):
160 162 return False
161 163 if self.is_file():
162 164 if self.content != other.content:
163 165 return False
164 166 else:
165 167 # For DirNode's check without entering each dir
166 168 self_nodes_paths = list(sorted(n.path for n in self.nodes))
167 169 other_nodes_paths = list(sorted(n.path for n in self.nodes))
168 170 if self_nodes_paths != other_nodes_paths:
169 171 return False
170 172 return True
171 173
172 174 def __nq__(self, other):
173 175 return not self.__eq__(other)
174 176
175 177 def __repr__(self):
176 178 return '<%s %r>' % (self.__class__.__name__, self.path)
177 179
178 180 def __str__(self):
179 181 return self.__repr__()
180 182
181 183 def __unicode__(self):
182 184 return self.name
183 185
184 186 def get_parent_path(self):
185 187 """
186 188 Returns node's parent path or empty string if node is root.
187 189 """
188 190 if self.is_root():
189 191 return ''
190 192 return posixpath.dirname(self.path.rstrip('/')) + '/'
191 193
192 194 def is_file(self):
193 195 """
194 196 Returns ``True`` if node's kind is ``NodeKind.FILE``, ``False``
195 197 otherwise.
196 198 """
197 199 return self.kind == NodeKind.FILE
198 200
199 201 def is_dir(self):
200 202 """
201 203 Returns ``True`` if node's kind is ``NodeKind.DIR``, ``False``
202 204 otherwise.
203 205 """
204 206 return self.kind == NodeKind.DIR
205 207
206 208 def is_root(self):
207 209 """
208 210 Returns ``True`` if node is a root node and ``False`` otherwise.
209 211 """
210 212 return self.kind == NodeKind.DIR and self.path == ''
211 213
214 def is_submodule(self):
215 """
216 Returns ``True`` if node's kind is ``NodeKind.SUBMODULE``, ``False``
217 otherwise.
218 """
219 return self.kind == NodeKind.SUBMODULE
220
212 221 @LazyProperty
213 222 def added(self):
214 223 return self.state is NodeState.ADDED
215 224
216 225 @LazyProperty
217 226 def changed(self):
218 227 return self.state is NodeState.CHANGED
219 228
220 229 @LazyProperty
221 230 def not_changed(self):
222 231 return self.state is NodeState.NOT_CHANGED
223 232
224 233 @LazyProperty
225 234 def removed(self):
226 235 return self.state is NodeState.REMOVED
227 236
228 237
229 238 class FileNode(Node):
230 239 """
231 240 Class representing file nodes.
232 241
233 242 :attribute: path: path to the node, relative to repostiory's root
234 243 :attribute: content: if given arbitrary sets content of the file
235 244 :attribute: changeset: if given, first time content is accessed, callback
236 245 :attribute: mode: octal stat mode for a node. Default is 0100644.
237 246 """
238 247
239 248 def __init__(self, path, content=None, changeset=None, mode=None):
240 249 """
241 250 Only one of ``content`` and ``changeset`` may be given. Passing both
242 251 would raise ``NodeError`` exception.
243 252
244 253 :param path: relative path to the node
245 254 :param content: content may be passed to constructor
246 255 :param changeset: if given, will use it to lazily fetch content
247 256 :param mode: octal representation of ST_MODE (i.e. 0100644)
248 257 """
249 258
250 259 if content and changeset:
251 260 raise NodeError("Cannot use both content and changeset")
252 261 super(FileNode, self).__init__(path, kind=NodeKind.FILE)
253 262 self.changeset = changeset
254 263 self._content = content
255 264 self._mode = mode or 0100644
256 265
257 266 @LazyProperty
258 267 def mode(self):
259 268 """
260 269 Returns lazily mode of the FileNode. If ``changeset`` is not set, would
261 270 use value given at initialization or 0100644 (default).
262 271 """
263 272 if self.changeset:
264 273 mode = self.changeset.get_file_mode(self.path)
265 274 else:
266 275 mode = self._mode
267 276 return mode
268 277
269 278 @property
270 279 def content(self):
271 280 """
272 281 Returns lazily content of the FileNode. If possible, would try to
273 282 decode content from UTF-8.
274 283 """
275 284 if self.changeset:
276 285 content = self.changeset.get_file_content(self.path)
277 286 else:
278 287 content = self._content
279 288
280 289 if bool(content and '\0' in content):
281 290 return content
282 291 return safe_unicode(content)
283 292
284 293 @LazyProperty
285 294 def size(self):
286 295 if self.changeset:
287 296 return self.changeset.get_file_size(self.path)
288 297 raise NodeError("Cannot retrieve size of the file without related "
289 298 "changeset attribute")
290 299
291 300 @LazyProperty
292 301 def message(self):
293 302 if self.changeset:
294 303 return self.last_changeset.message
295 304 raise NodeError("Cannot retrieve message of the file without related "
296 305 "changeset attribute")
297 306
298 307 @LazyProperty
299 308 def last_changeset(self):
300 309 if self.changeset:
301 310 return self.changeset.get_file_changeset(self.path)
302 311 raise NodeError("Cannot retrieve last changeset of the file without "
303 312 "related changeset attribute")
304 313
305 314 def get_mimetype(self):
306 315 """
307 316 Mimetype is calculated based on the file's content. If ``_mimetype``
308 317 attribute is available, it will be returned (backends which store
309 318 mimetypes or can easily recognize them, should set this private
310 319 attribute to indicate that type should *NOT* be calculated).
311 320 """
312 321 if hasattr(self, '_mimetype'):
313 322 if (isinstance(self._mimetype, (tuple, list,)) and
314 323 len(self._mimetype) == 2):
315 324 return self._mimetype
316 325 else:
317 326 raise NodeError('given _mimetype attribute must be an 2 '
318 327 'element list or tuple')
319 328
320 329 mtype, encoding = mimetypes.guess_type(self.name)
321 330
322 331 if mtype is None:
323 332 if self.is_binary:
324 333 mtype = 'application/octet-stream'
325 334 encoding = None
326 335 else:
327 336 mtype = 'text/plain'
328 337 encoding = None
329 338 return mtype, encoding
330 339
331 340 @LazyProperty
332 341 def mimetype(self):
333 342 """
334 343 Wrapper around full mimetype info. It returns only type of fetched
335 344 mimetype without the encoding part. use get_mimetype function to fetch
336 345 full set of (type,encoding)
337 346 """
338 347 return self.get_mimetype()[0]
339 348
340 349 @LazyProperty
341 350 def mimetype_main(self):
342 351 return self.mimetype.split('/')[0]
343 352
344 353 @LazyProperty
345 354 def lexer(self):
346 355 """
347 356 Returns pygment's lexer class. Would try to guess lexer taking file's
348 357 content, name and mimetype.
349 358 """
350 359 try:
351 360 lexer = lexers.guess_lexer_for_filename(self.name, self.content)
352 361 except lexers.ClassNotFound:
353 362 lexer = lexers.TextLexer()
354 363 # returns first alias
355 364 return lexer
356 365
357 366 @LazyProperty
358 367 def lexer_alias(self):
359 368 """
360 369 Returns first alias of the lexer guessed for this file.
361 370 """
362 371 return self.lexer.aliases[0]
363 372
364 373 @LazyProperty
365 374 def history(self):
366 375 """
367 376 Returns a list of changeset for this file in which the file was changed
368 377 """
369 378 if self.changeset is None:
370 379 raise NodeError('Unable to get changeset for this FileNode')
371 380 return self.changeset.get_file_history(self.path)
372 381
373 382 @LazyProperty
374 383 def annotate(self):
375 384 """
376 385 Returns a list of three element tuples with lineno,changeset and line
377 386 """
378 387 if self.changeset is None:
379 388 raise NodeError('Unable to get changeset for this FileNode')
380 389 return self.changeset.get_file_annotate(self.path)
381 390
382 391 @LazyProperty
383 392 def state(self):
384 393 if not self.changeset:
385 394 raise NodeError("Cannot check state of the node if it's not "
386 395 "linked with changeset")
387 396 elif self.path in (node.path for node in self.changeset.added):
388 397 return NodeState.ADDED
389 398 elif self.path in (node.path for node in self.changeset.changed):
390 399 return NodeState.CHANGED
391 400 else:
392 401 return NodeState.NOT_CHANGED
393 402
394 403 @property
395 404 def is_binary(self):
396 405 """
397 406 Returns True if file has binary content.
398 407 """
399 408 _bin = '\0' in self.content
400 409 return _bin
401 410
402 411 @LazyProperty
403 412 def extension(self):
404 413 """Returns filenode extension"""
405 414 return self.name.split('.')[-1]
406 415
407 416 def is_executable(self):
408 417 """
409 418 Returns ``True`` if file has executable flag turned on.
410 419 """
411 420 return bool(self.mode & stat.S_IXUSR)
412 421
413 422 def __repr__(self):
414 423 return '<%s %r @ %s>' % (self.__class__.__name__, self.path,
415 424 self.changeset.short_id)
416 425
417 426
418 427 class RemovedFileNode(FileNode):
419 428 """
420 429 Dummy FileNode class - trying to access any public attribute except path,
421 430 name, kind or state (or methods/attributes checking those two) would raise
422 431 RemovedFileNodeError.
423 432 """
424 433 ALLOWED_ATTRIBUTES = ['name', 'path', 'state', 'is_root', 'is_file',
425 434 'is_dir', 'kind', 'added', 'changed', 'not_changed', 'removed']
426 435
427 436 def __init__(self, path):
428 437 """
429 438 :param path: relative path to the node
430 439 """
431 440 super(RemovedFileNode, self).__init__(path=path)
432 441
433 442 def __getattribute__(self, attr):
434 443 if attr.startswith('_') or attr in RemovedFileNode.ALLOWED_ATTRIBUTES:
435 444 return super(RemovedFileNode, self).__getattribute__(attr)
436 445 raise RemovedFileNodeError("Cannot access attribute %s on "
437 446 "RemovedFileNode" % attr)
438 447
439 448 @LazyProperty
440 449 def state(self):
441 450 return NodeState.REMOVED
442 451
443 452
444 453 class DirNode(Node):
445 454 """
446 455 DirNode stores list of files and directories within this node.
447 456 Nodes may be used standalone but within repository context they
448 457 lazily fetch data within same repositorty's changeset.
449 458 """
450 459
451 460 def __init__(self, path, nodes=(), changeset=None):
452 461 """
453 462 Only one of ``nodes`` and ``changeset`` may be given. Passing both
454 463 would raise ``NodeError`` exception.
455 464
456 465 :param path: relative path to the node
457 466 :param nodes: content may be passed to constructor
458 467 :param changeset: if given, will use it to lazily fetch content
459 468 :param size: always 0 for ``DirNode``
460 469 """
461 470 if nodes and changeset:
462 471 raise NodeError("Cannot use both nodes and changeset")
463 472 super(DirNode, self).__init__(path, NodeKind.DIR)
464 473 self.changeset = changeset
465 474 self._nodes = nodes
466 475
467 476 @LazyProperty
468 477 def content(self):
469 478 raise NodeError("%s represents a dir and has no ``content`` attribute"
470 479 % self)
471 480
472 481 @LazyProperty
473 482 def nodes(self):
474 483 if self.changeset:
475 484 nodes = self.changeset.get_nodes(self.path)
476 485 else:
477 486 nodes = self._nodes
478 487 self._nodes_dict = dict((node.path, node) for node in nodes)
479 488 return sorted(nodes)
480 489
481 490 @LazyProperty
482 491 def files(self):
483 492 return sorted((node for node in self.nodes if node.is_file()))
484 493
485 494 @LazyProperty
486 495 def dirs(self):
487 496 return sorted((node for node in self.nodes if node.is_dir()))
488 497
489 498 def __iter__(self):
490 499 for node in self.nodes:
491 500 yield node
492 501
493 502 def get_node(self, path):
494 503 """
495 504 Returns node from within this particular ``DirNode``, so it is now
496 505 allowed to fetch, i.e. node located at 'docs/api/index.rst' from node
497 506 'docs'. In order to access deeper nodes one must fetch nodes between
498 507 them first - this would work::
499 508
500 509 docs = root.get_node('docs')
501 510 docs.get_node('api').get_node('index.rst')
502 511
503 512 :param: path - relative to the current node
504 513
505 514 .. note::
506 515 To access lazily (as in example above) node have to be initialized
507 516 with related changeset object - without it node is out of
508 517 context and may know nothing about anything else than nearest
509 518 (located at same level) nodes.
510 519 """
511 520 try:
512 521 path = path.rstrip('/')
513 522 if path == '':
514 523 raise NodeError("Cannot retrieve node without path")
515 524 self.nodes # access nodes first in order to set _nodes_dict
516 525 paths = path.split('/')
517 526 if len(paths) == 1:
518 527 if not self.is_root():
519 528 path = '/'.join((self.path, paths[0]))
520 529 else:
521 530 path = paths[0]
522 531 return self._nodes_dict[path]
523 532 elif len(paths) > 1:
524 533 if self.changeset is None:
525 534 raise NodeError("Cannot access deeper "
526 535 "nodes without changeset")
527 536 else:
528 537 path1, path2 = paths[0], '/'.join(paths[1:])
529 538 return self.get_node(path1).get_node(path2)
530 539 else:
531 540 raise KeyError
532 541 except KeyError:
533 542 raise NodeError("Node does not exist at %s" % path)
534 543
535 544 @LazyProperty
536 545 def state(self):
537 546 raise NodeError("Cannot access state of DirNode")
538 547
539 548 @LazyProperty
540 549 def size(self):
541 550 size = 0
542 551 for root, dirs, files in self.changeset.walk(self.path):
543 552 for f in files:
544 553 size += f.size
545 554
546 555 return size
547 556
548 557 def __repr__(self):
549 558 return '<%s %r @ %s>' % (self.__class__.__name__, self.path,
550 559 self.changeset.short_id)
551 560
552 561
553 562 class RootNode(DirNode):
554 563 """
555 564 DirNode being the root node of the repository.
556 565 """
557 566
558 567 def __init__(self, nodes=(), changeset=None):
559 568 super(RootNode, self).__init__(path='', nodes=nodes,
560 569 changeset=changeset)
561 570
562 571 def __repr__(self):
563 572 return '<%s>' % self.__class__.__name__
573
574
575 class SubModuleNode(Node):
576 """
577 represents a SubModule of Git or SubRepo of Mercurial
578 """
579 def __init__(self, name, url=None, changeset=None, alias=None):
580 self.path = name
581 self.kind = NodeKind.SUBMODULE
582 self.alias = alias
583 # changeset MUST be STR !! since it can point to non-valid SCM
584 self.changeset = str(changeset)
585 self.url = url or self._extract_submodule_url()
586
587 def _extract_submodule_url(self):
588 if self.alias == 'git':
589 return self.path
590 if self.alias == 'hg':
591 return self.path
592
593 @LazyProperty
594 def name(self):
595 """
596 Returns name of the node so if its path
597 then only last part is returned.
598 """
599 org = safe_unicode(self.path.rstrip('/').split('/')[-1])
600 return u'%s @ %s' % (org, self.changeset[:12])
@@ -1,4384 +1,4392 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 {
3 3 border: 0;
4 4 outline: 0;
5 5 font-size: 100%;
6 6 vertical-align: baseline;
7 7 background: transparent;
8 8 margin: 0;
9 9 padding: 0;
10 10 }
11 11
12 12 body {
13 13 line-height: 1;
14 14 height: 100%;
15 15 background: url("../images/background.png") repeat scroll 0 0 #B0B0B0;
16 16 font-family: Lucida Grande, Verdana, Lucida Sans Regular,
17 17 Lucida Sans Unicode, Arial, sans-serif; font-size : 12px;
18 18 color: #000;
19 19 margin: 0;
20 20 padding: 0;
21 21 font-size: 12px;
22 22 }
23 23
24 24 ol,ul {
25 25 list-style: none;
26 26 }
27 27
28 28 blockquote,q {
29 29 quotes: none;
30 30 }
31 31
32 32 blockquote:before,blockquote:after,q:before,q:after {
33 33 content: none;
34 34 }
35 35
36 36 :focus {
37 37 outline: 0;
38 38 }
39 39
40 40 del {
41 41 text-decoration: line-through;
42 42 }
43 43
44 44 table {
45 45 border-collapse: collapse;
46 46 border-spacing: 0;
47 47 }
48 48
49 49 html {
50 50 height: 100%;
51 51 }
52 52
53 53 a {
54 54 color: #003367;
55 55 text-decoration: none;
56 56 cursor: pointer;
57 57 }
58 58
59 59 a:hover {
60 60 color: #316293;
61 61 text-decoration: underline;
62 62 }
63 63
64 64 h1,h2,h3,h4,h5,h6 {
65 65 color: #292929;
66 66 font-weight: 700;
67 67 }
68 68
69 69 h1 {
70 70 font-size: 22px;
71 71 }
72 72
73 73 h2 {
74 74 font-size: 20px;
75 75 }
76 76
77 77 h3 {
78 78 font-size: 18px;
79 79 }
80 80
81 81 h4 {
82 82 font-size: 16px;
83 83 }
84 84
85 85 h5 {
86 86 font-size: 14px;
87 87 }
88 88
89 89 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 -moz-border-radius-topleft: 8px;
164 164 border-top-left-radius: 8px;
165 165 }
166 166
167 167 .top-right-rounded-corner {
168 168 -webkit-border-top-right-radius: 8px;
169 169 -khtml-border-radius-topright: 8px;
170 170 -moz-border-radius-topright: 8px;
171 171 border-top-right-radius: 8px;
172 172 }
173 173
174 174 .bottom-left-rounded-corner {
175 175 -webkit-border-bottom-left-radius: 8px;
176 176 -khtml-border-radius-bottomleft: 8px;
177 177 -moz-border-radius-bottomleft: 8px;
178 178 border-bottom-left-radius: 8px;
179 179 }
180 180
181 181 .bottom-right-rounded-corner {
182 182 -webkit-border-bottom-right-radius: 8px;
183 183 -khtml-border-radius-bottomright: 8px;
184 184 -moz-border-radius-bottomright: 8px;
185 185 border-bottom-right-radius: 8px;
186 186 }
187 187
188 188 .top-left-rounded-corner-mid {
189 189 -webkit-border-top-left-radius: 4px;
190 190 -khtml-border-radius-topleft: 4px;
191 191 -moz-border-radius-topleft: 4px;
192 192 border-top-left-radius: 4px;
193 193 }
194 194
195 195 .top-right-rounded-corner-mid {
196 196 -webkit-border-top-right-radius: 4px;
197 197 -khtml-border-radius-topright: 4px;
198 198 -moz-border-radius-topright: 4px;
199 199 border-top-right-radius: 4px;
200 200 }
201 201
202 202 .bottom-left-rounded-corner-mid {
203 203 -webkit-border-bottom-left-radius: 4px;
204 204 -khtml-border-radius-bottomleft: 4px;
205 205 -moz-border-radius-bottomleft: 4px;
206 206 border-bottom-left-radius: 4px;
207 207 }
208 208
209 209 .bottom-right-rounded-corner-mid {
210 210 -webkit-border-bottom-right-radius: 4px;
211 211 -khtml-border-radius-bottomright: 4px;
212 212 -moz-border-radius-bottomright: 4px;
213 213 border-bottom-right-radius: 4px;
214 214 }
215 215
216 216 .help-block {
217 217 color: #999999;
218 218 display: block;
219 219 margin-bottom: 0;
220 220 margin-top: 5px;
221 221 }
222 222
223 223 #header {
224 224 margin: 0;
225 225 padding: 0 10px;
226 226 }
227 227
228 228 #header ul#logged-user {
229 229 margin-bottom: 5px !important;
230 230 -webkit-border-radius: 0px 0px 8px 8px;
231 231 -khtml-border-radius: 0px 0px 8px 8px;
232 232 -moz-border-radius: 0px 0px 8px 8px;
233 233 border-radius: 0px 0px 8px 8px;
234 234 height: 37px;
235 235 background-color: #003B76;
236 236 background-repeat: repeat-x;
237 237 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
238 238 background-image: -moz-linear-gradient(top, #003b76, #00376e);
239 239 background-image: -ms-linear-gradient(top, #003b76, #00376e);
240 240 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
241 241 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
242 242 background-image: -o-linear-gradient(top, #003b76, #00376e);
243 243 background-image: linear-gradient(top, #003b76, #00376e);
244 244 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
245 245 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
246 246 }
247 247
248 248 #header ul#logged-user li {
249 249 list-style: none;
250 250 float: left;
251 251 margin: 8px 0 0;
252 252 padding: 4px 12px;
253 253 border-left: 1px solid #316293;
254 254 }
255 255
256 256 #header ul#logged-user li.first {
257 257 border-left: none;
258 258 margin: 4px;
259 259 }
260 260
261 261 #header ul#logged-user li.first div.gravatar {
262 262 margin-top: -2px;
263 263 }
264 264
265 265 #header ul#logged-user li.first div.account {
266 266 padding-top: 4px;
267 267 float: left;
268 268 }
269 269
270 270 #header ul#logged-user li.last {
271 271 border-right: none;
272 272 }
273 273
274 274 #header ul#logged-user li a {
275 275 color: #fff;
276 276 font-weight: 700;
277 277 text-decoration: none;
278 278 }
279 279
280 280 #header ul#logged-user li a:hover {
281 281 text-decoration: underline;
282 282 }
283 283
284 284 #header ul#logged-user li.highlight a {
285 285 color: #fff;
286 286 }
287 287
288 288 #header ul#logged-user li.highlight a:hover {
289 289 color: #FFF;
290 290 }
291 291
292 292 #header #header-inner {
293 293 min-height: 44px;
294 294 clear: both;
295 295 position: relative;
296 296 background-color: #003B76;
297 297 background-repeat: repeat-x;
298 298 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
299 299 background-image: -moz-linear-gradient(top, #003b76, #00376e);
300 300 background-image: -ms-linear-gradient(top, #003b76, #00376e);
301 301 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76),color-stop(100%, #00376e) );
302 302 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
303 303 background-image: -o-linear-gradient(top, #003b76, #00376e);
304 304 background-image: linear-gradient(top, #003b76, #00376e);
305 305 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',endColorstr='#00376e', GradientType=0 );
306 306 margin: 0;
307 307 padding: 0;
308 308 display: block;
309 309 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
310 310 -webkit-border-radius: 4px 4px 4px 4px;
311 311 -khtml-border-radius: 4px 4px 4px 4px;
312 312 -moz-border-radius: 4px 4px 4px 4px;
313 313 border-radius: 4px 4px 4px 4px;
314 314 }
315 315 #header #header-inner.hover{
316 316 position: fixed !important;
317 317 width: 100% !important;
318 318 margin-left: -10px !important;
319 319 z-index: 10000;
320 320 -webkit-border-radius: 0px 0px 0px 0px;
321 321 -khtml-border-radius: 0px 0px 0px 0px;
322 322 -moz-border-radius: 0px 0px 0px 0px;
323 323 border-radius: 0px 0px 0px 0px;
324 324 }
325 325
326 326 .ie7 #header #header-inner.hover,
327 327 .ie8 #header #header-inner.hover,
328 328 .ie9 #header #header-inner.hover
329 329 {
330 330 z-index: auto !important;
331 331 }
332 332
333 333 #header #header-inner #home a {
334 334 height: 40px;
335 335 width: 46px;
336 336 display: block;
337 337 background: url("../images/button_home.png");
338 338 background-position: 0 0;
339 339 margin: 0;
340 340 padding: 0;
341 341 }
342 342
343 343 #header #header-inner #home a:hover {
344 344 background-position: 0 -40px;
345 345 }
346 346
347 347 #header #header-inner #logo {
348 348 float: left;
349 349 position: absolute;
350 350 }
351 351
352 352 #header #header-inner #logo h1 {
353 353 color: #FFF;
354 354 font-size: 20px;
355 355 margin: 12px 0 0 13px;
356 356 padding: 0;
357 357 }
358 358
359 359 #header #header-inner #logo a {
360 360 color: #fff;
361 361 text-decoration: none;
362 362 }
363 363
364 364 #header #header-inner #logo a:hover {
365 365 color: #bfe3ff;
366 366 }
367 367
368 368 #header #header-inner #quick,#header #header-inner #quick ul {
369 369 position: relative;
370 370 float: right;
371 371 list-style-type: none;
372 372 list-style-position: outside;
373 373 margin: 8px 8px 0 0;
374 374 padding: 0;
375 375 }
376 376
377 377 #header #header-inner #quick li {
378 378 position: relative;
379 379 float: left;
380 380 margin: 0 5px 0 0;
381 381 padding: 0;
382 382 }
383 383
384 384 #header #header-inner #quick li a.menu_link {
385 385 top: 0;
386 386 left: 0;
387 387 height: 1%;
388 388 display: block;
389 389 clear: both;
390 390 overflow: hidden;
391 391 color: #FFF;
392 392 font-weight: 700;
393 393 text-decoration: none;
394 394 background: #369;
395 395 padding: 0;
396 396 -webkit-border-radius: 4px 4px 4px 4px;
397 397 -khtml-border-radius: 4px 4px 4px 4px;
398 398 -moz-border-radius: 4px 4px 4px 4px;
399 399 border-radius: 4px 4px 4px 4px;
400 400 }
401 401
402 402 #header #header-inner #quick li span.short {
403 403 padding: 9px 6px 8px 6px;
404 404 }
405 405
406 406 #header #header-inner #quick li span {
407 407 top: 0;
408 408 right: 0;
409 409 height: 1%;
410 410 display: block;
411 411 float: left;
412 412 border-left: 1px solid #3f6f9f;
413 413 margin: 0;
414 414 padding: 10px 12px 8px 10px;
415 415 }
416 416
417 417 #header #header-inner #quick li span.normal {
418 418 border: none;
419 419 padding: 10px 12px 8px;
420 420 }
421 421
422 422 #header #header-inner #quick li span.icon {
423 423 top: 0;
424 424 left: 0;
425 425 border-left: none;
426 426 border-right: 1px solid #2e5c89;
427 427 padding: 8px 6px 4px;
428 428 }
429 429
430 430 #header #header-inner #quick li span.icon_short {
431 431 top: 0;
432 432 left: 0;
433 433 border-left: none;
434 434 border-right: 1px solid #2e5c89;
435 435 padding: 8px 6px 4px;
436 436 }
437 437
438 438 #header #header-inner #quick li span.icon img,#header #header-inner #quick li span.icon_short img
439 439 {
440 440 margin: 0px -2px 0px 0px;
441 441 }
442 442
443 443 #header #header-inner #quick li a:hover {
444 444 background: #4e4e4e no-repeat top left;
445 445 }
446 446
447 447 #header #header-inner #quick li a:hover span {
448 448 border-left: 1px solid #545454;
449 449 }
450 450
451 451 #header #header-inner #quick li a:hover span.icon,#header #header-inner #quick li a:hover span.icon_short
452 452 {
453 453 border-left: none;
454 454 border-right: 1px solid #464646;
455 455 }
456 456
457 457 #header #header-inner #quick ul {
458 458 top: 29px;
459 459 right: 0;
460 460 min-width: 200px;
461 461 display: none;
462 462 position: absolute;
463 463 background: #FFF;
464 464 border: 1px solid #666;
465 465 border-top: 1px solid #003367;
466 466 z-index: 100;
467 467 margin: 0px 0px 0px 0px;
468 468 padding: 0;
469 469 }
470 470
471 471 #header #header-inner #quick ul.repo_switcher {
472 472 max-height: 275px;
473 473 overflow-x: hidden;
474 474 overflow-y: auto;
475 475 }
476 476
477 477 #header #header-inner #quick ul.repo_switcher li.qfilter_rs {
478 478 float: none;
479 479 margin: 0;
480 480 border-bottom: 2px solid #003367;
481 481 }
482 482
483 483 #header #header-inner #quick .repo_switcher_type {
484 484 position: absolute;
485 485 left: 0;
486 486 top: 9px;
487 487 }
488 488
489 489 #header #header-inner #quick li ul li {
490 490 border-bottom: 1px solid #ddd;
491 491 }
492 492
493 493 #header #header-inner #quick li ul li a {
494 494 width: 182px;
495 495 height: auto;
496 496 display: block;
497 497 float: left;
498 498 background: #FFF;
499 499 color: #003367;
500 500 font-weight: 400;
501 501 margin: 0;
502 502 padding: 7px 9px;
503 503 }
504 504
505 505 #header #header-inner #quick li ul li a:hover {
506 506 color: #000;
507 507 background: #FFF;
508 508 }
509 509
510 510 #header #header-inner #quick ul ul {
511 511 top: auto;
512 512 }
513 513
514 514 #header #header-inner #quick li ul ul {
515 515 right: 200px;
516 516 max-height: 275px;
517 517 overflow: auto;
518 518 overflow-x: hidden;
519 519 white-space: normal;
520 520 }
521 521
522 522 #header #header-inner #quick li ul li a.journal,#header #header-inner #quick li ul li a.journal:hover
523 523 {
524 524 background: url("../images/icons/book.png") no-repeat scroll 4px 9px
525 525 #FFF;
526 526 width: 167px;
527 527 margin: 0;
528 528 padding: 12px 9px 7px 24px;
529 529 }
530 530
531 531 #header #header-inner #quick li ul li a.private_repo,#header #header-inner #quick li ul li a.private_repo:hover
532 532 {
533 533 background: url("../images/icons/lock.png") no-repeat scroll 4px 9px
534 534 #FFF;
535 535 min-width: 167px;
536 536 margin: 0;
537 537 padding: 12px 9px 7px 24px;
538 538 }
539 539
540 540 #header #header-inner #quick li ul li a.public_repo,#header #header-inner #quick li ul li a.public_repo:hover
541 541 {
542 542 background: url("../images/icons/lock_open.png") no-repeat scroll 4px
543 543 9px #FFF;
544 544 min-width: 167px;
545 545 margin: 0;
546 546 padding: 12px 9px 7px 24px;
547 547 }
548 548
549 549 #header #header-inner #quick li ul li a.hg,#header #header-inner #quick li ul li a.hg:hover
550 550 {
551 551 background: url("../images/icons/hgicon.png") no-repeat scroll 4px 9px
552 552 #FFF;
553 553 min-width: 167px;
554 554 margin: 0 0 0 14px;
555 555 padding: 12px 9px 7px 24px;
556 556 }
557 557
558 558 #header #header-inner #quick li ul li a.git,#header #header-inner #quick li ul li a.git:hover
559 559 {
560 560 background: url("../images/icons/giticon.png") no-repeat scroll 4px 9px
561 561 #FFF;
562 562 min-width: 167px;
563 563 margin: 0 0 0 14px;
564 564 padding: 12px 9px 7px 24px;
565 565 }
566 566
567 567 #header #header-inner #quick li ul li a.repos,#header #header-inner #quick li ul li a.repos:hover
568 568 {
569 569 background: url("../images/icons/database_edit.png") no-repeat scroll
570 570 4px 9px #FFF;
571 571 width: 167px;
572 572 margin: 0;
573 573 padding: 12px 9px 7px 24px;
574 574 }
575 575
576 576 #header #header-inner #quick li ul li a.repos_groups,#header #header-inner #quick li ul li a.repos_groups:hover
577 577 {
578 578 background: url("../images/icons/database_link.png") no-repeat scroll
579 579 4px 9px #FFF;
580 580 width: 167px;
581 581 margin: 0;
582 582 padding: 12px 9px 7px 24px;
583 583 }
584 584
585 585 #header #header-inner #quick li ul li a.users,#header #header-inner #quick li ul li a.users:hover
586 586 {
587 587 background: #FFF url("../images/icons/user_edit.png") no-repeat 4px 9px;
588 588 width: 167px;
589 589 margin: 0;
590 590 padding: 12px 9px 7px 24px;
591 591 }
592 592
593 593 #header #header-inner #quick li ul li a.groups,#header #header-inner #quick li ul li a.groups:hover
594 594 {
595 595 background: #FFF url("../images/icons/group_edit.png") no-repeat 4px 9px;
596 596 width: 167px;
597 597 margin: 0;
598 598 padding: 12px 9px 7px 24px;
599 599 }
600 600
601 601 #header #header-inner #quick li ul li a.settings,#header #header-inner #quick li ul li a.settings:hover
602 602 {
603 603 background: #FFF url("../images/icons/cog.png") no-repeat 4px 9px;
604 604 width: 167px;
605 605 margin: 0;
606 606 padding: 12px 9px 7px 24px;
607 607 }
608 608
609 609 #header #header-inner #quick li ul li a.permissions,#header #header-inner #quick li ul li a.permissions:hover
610 610 {
611 611 background: #FFF url("../images/icons/key.png") no-repeat 4px 9px;
612 612 width: 167px;
613 613 margin: 0;
614 614 padding: 12px 9px 7px 24px;
615 615 }
616 616
617 617 #header #header-inner #quick li ul li a.ldap,#header #header-inner #quick li ul li a.ldap:hover
618 618 {
619 619 background: #FFF url("../images/icons/server_key.png") no-repeat 4px 9px;
620 620 width: 167px;
621 621 margin: 0;
622 622 padding: 12px 9px 7px 24px;
623 623 }
624 624
625 625 #header #header-inner #quick li ul li a.fork,#header #header-inner #quick li ul li a.fork:hover
626 626 {
627 627 background: #FFF url("../images/icons/arrow_divide.png") no-repeat 4px
628 628 9px;
629 629 width: 167px;
630 630 margin: 0;
631 631 padding: 12px 9px 7px 24px;
632 632 }
633 633
634 634 #header #header-inner #quick li ul li a.search,#header #header-inner #quick li ul li a.search:hover
635 635 {
636 636 background: #FFF url("../images/icons/search_16.png") no-repeat 4px 9px;
637 637 width: 167px;
638 638 margin: 0;
639 639 padding: 12px 9px 7px 24px;
640 640 }
641 641
642 642 #header #header-inner #quick li ul li a.delete,#header #header-inner #quick li ul li a.delete:hover
643 643 {
644 644 background: #FFF url("../images/icons/delete.png") no-repeat 4px 9px;
645 645 width: 167px;
646 646 margin: 0;
647 647 padding: 12px 9px 7px 24px;
648 648 }
649 649
650 650 #header #header-inner #quick li ul li a.branches,#header #header-inner #quick li ul li a.branches:hover
651 651 {
652 652 background: #FFF url("../images/icons/arrow_branch.png") no-repeat 4px
653 653 9px;
654 654 width: 167px;
655 655 margin: 0;
656 656 padding: 12px 9px 7px 24px;
657 657 }
658 658
659 659 #header #header-inner #quick li ul li a.tags,
660 660 #header #header-inner #quick li ul li a.tags:hover{
661 661 background: #FFF url("../images/icons/tag_blue.png") no-repeat 4px 9px;
662 662 width: 167px;
663 663 margin: 0;
664 664 padding: 12px 9px 7px 24px;
665 665 }
666 666
667 667 #header #header-inner #quick li ul li a.bookmarks,
668 668 #header #header-inner #quick li ul li a.bookmarks:hover{
669 669 background: #FFF url("../images/icons/tag_green.png") no-repeat 4px 9px;
670 670 width: 167px;
671 671 margin: 0;
672 672 padding: 12px 9px 7px 24px;
673 673 }
674 674
675 675 #header #header-inner #quick li ul li a.admin,
676 676 #header #header-inner #quick li ul li a.admin:hover{
677 677 background: #FFF url("../images/icons/cog_edit.png") no-repeat 4px 9px;
678 678 width: 167px;
679 679 margin: 0;
680 680 padding: 12px 9px 7px 24px;
681 681 }
682 682
683 683 .groups_breadcrumbs a {
684 684 color: #fff;
685 685 }
686 686
687 687 .groups_breadcrumbs a:hover {
688 688 color: #bfe3ff;
689 689 text-decoration: none;
690 690 }
691 691
692 692 td.quick_repo_menu {
693 693 background: #FFF url("../images/vertical-indicator.png") 8px 50% no-repeat !important;
694 694 cursor: pointer;
695 695 width: 8px;
696 696 border: 1px solid transparent;
697 697 }
698 698
699 699 td.quick_repo_menu.active {
700 700 background: url("../images/dt-arrow-dn.png") no-repeat scroll 5px 50% #FFFFFF !important;
701 701 border: 1px solid #003367;
702 702 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
703 703 cursor: pointer;
704 704 }
705 705
706 706 td.quick_repo_menu .menu_items {
707 707 margin-top: 10px;
708 708 margin-left:-6px;
709 709 width: 150px;
710 710 position: absolute;
711 711 background-color: #FFF;
712 712 background: none repeat scroll 0 0 #FFFFFF;
713 713 border-color: #003367 #666666 #666666;
714 714 border-right: 1px solid #666666;
715 715 border-style: solid;
716 716 border-width: 1px;
717 717 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
718 718 border-top-style: none;
719 719 }
720 720
721 721 td.quick_repo_menu .menu_items li {
722 722 padding: 0 !important;
723 723 }
724 724
725 725 td.quick_repo_menu .menu_items a {
726 726 display: block;
727 727 padding: 4px 12px 4px 8px;
728 728 }
729 729
730 730 td.quick_repo_menu .menu_items a:hover {
731 731 background-color: #EEE;
732 732 text-decoration: none;
733 733 }
734 734
735 735 td.quick_repo_menu .menu_items .icon img {
736 736 margin-bottom: -2px;
737 737 }
738 738
739 739 td.quick_repo_menu .menu_items.hidden {
740 740 display: none;
741 741 }
742 742
743 743 .yui-dt-first th {
744 744 text-align: left;
745 745 }
746 746
747 747 /*
748 748 Copyright (c) 2011, Yahoo! Inc. All rights reserved.
749 749 Code licensed under the BSD License:
750 750 http://developer.yahoo.com/yui/license.html
751 751 version: 2.9.0
752 752 */
753 753 .yui-skin-sam .yui-dt-mask {
754 754 position: absolute;
755 755 z-index: 9500;
756 756 }
757 757 .yui-dt-tmp {
758 758 position: absolute;
759 759 left: -9000px;
760 760 }
761 761 .yui-dt-scrollable .yui-dt-bd { overflow: auto }
762 762 .yui-dt-scrollable .yui-dt-hd {
763 763 overflow: hidden;
764 764 position: relative;
765 765 }
766 766 .yui-dt-scrollable .yui-dt-bd thead tr,
767 767 .yui-dt-scrollable .yui-dt-bd thead th {
768 768 position: absolute;
769 769 left: -1500px;
770 770 }
771 771 .yui-dt-scrollable tbody { -moz-outline: 0 }
772 772 .yui-skin-sam thead .yui-dt-sortable { cursor: pointer }
773 773 .yui-skin-sam thead .yui-dt-draggable { cursor: move }
774 774 .yui-dt-coltarget {
775 775 position: absolute;
776 776 z-index: 999;
777 777 }
778 778 .yui-dt-hd { zoom: 1 }
779 779 th.yui-dt-resizeable .yui-dt-resizerliner { position: relative }
780 780 .yui-dt-resizer {
781 781 position: absolute;
782 782 right: 0;
783 783 bottom: 0;
784 784 height: 100%;
785 785 cursor: e-resize;
786 786 cursor: col-resize;
787 787 background-color: #CCC;
788 788 opacity: 0;
789 789 filter: alpha(opacity=0);
790 790 }
791 791 .yui-dt-resizerproxy {
792 792 visibility: hidden;
793 793 position: absolute;
794 794 z-index: 9000;
795 795 background-color: #CCC;
796 796 opacity: 0;
797 797 filter: alpha(opacity=0);
798 798 }
799 799 th.yui-dt-hidden .yui-dt-liner,
800 800 td.yui-dt-hidden .yui-dt-liner,
801 801 th.yui-dt-hidden .yui-dt-resizer { display: none }
802 802 .yui-dt-editor,
803 803 .yui-dt-editor-shim {
804 804 position: absolute;
805 805 z-index: 9000;
806 806 }
807 807 .yui-skin-sam .yui-dt table {
808 808 margin: 0;
809 809 padding: 0;
810 810 font-family: arial;
811 811 font-size: inherit;
812 812 border-collapse: separate;
813 813 *border-collapse: collapse;
814 814 border-spacing: 0;
815 815 border: 1px solid #7f7f7f;
816 816 }
817 817 .yui-skin-sam .yui-dt thead { border-spacing: 0 }
818 818 .yui-skin-sam .yui-dt caption {
819 819 color: #000;
820 820 font-size: 85%;
821 821 font-weight: normal;
822 822 font-style: italic;
823 823 line-height: 1;
824 824 padding: 1em 0;
825 825 text-align: center;
826 826 }
827 827 .yui-skin-sam .yui-dt th { background: #d8d8da url(../images/sprite.png) repeat-x 0 0 }
828 828 .yui-skin-sam .yui-dt th,
829 829 .yui-skin-sam .yui-dt th a {
830 830 font-weight: normal;
831 831 text-decoration: none;
832 832 color: #000;
833 833 vertical-align: bottom;
834 834 }
835 835 .yui-skin-sam .yui-dt th {
836 836 margin: 0;
837 837 padding: 0;
838 838 border: 0;
839 839 border-right: 1px solid #cbcbcb;
840 840 }
841 841 .yui-skin-sam .yui-dt tr.yui-dt-first td { border-top: 1px solid #7f7f7f }
842 842 .yui-skin-sam .yui-dt th .yui-dt-liner { white-space: nowrap }
843 843 .yui-skin-sam .yui-dt-liner {
844 844 margin: 0;
845 845 padding: 0;
846 846 }
847 847 .yui-skin-sam .yui-dt-coltarget {
848 848 width: 5px;
849 849 background-color: red;
850 850 }
851 851 .yui-skin-sam .yui-dt td {
852 852 margin: 0;
853 853 padding: 0;
854 854 border: 0;
855 855 border-right: 1px solid #cbcbcb;
856 856 text-align: left;
857 857 }
858 858 .yui-skin-sam .yui-dt-list td { border-right: 0 }
859 859 .yui-skin-sam .yui-dt-resizer { width: 6px }
860 860 .yui-skin-sam .yui-dt-mask {
861 861 background-color: #000;
862 862 opacity: .25;
863 863 filter: alpha(opacity=25);
864 864 }
865 865 .yui-skin-sam .yui-dt-message { background-color: #FFF }
866 866 .yui-skin-sam .yui-dt-scrollable table { border: 0 }
867 867 .yui-skin-sam .yui-dt-scrollable .yui-dt-hd {
868 868 border-left: 1px solid #7f7f7f;
869 869 border-top: 1px solid #7f7f7f;
870 870 border-right: 1px solid #7f7f7f;
871 871 }
872 872 .yui-skin-sam .yui-dt-scrollable .yui-dt-bd {
873 873 border-left: 1px solid #7f7f7f;
874 874 border-bottom: 1px solid #7f7f7f;
875 875 border-right: 1px solid #7f7f7f;
876 876 background-color: #FFF;
877 877 }
878 878 .yui-skin-sam .yui-dt-scrollable .yui-dt-data tr.yui-dt-last td { border-bottom: 1px solid #7f7f7f }
879 879 .yui-skin-sam th.yui-dt-asc,
880 880 .yui-skin-sam th.yui-dt-desc { background: url(../images/sprite.png) repeat-x 0 -100px }
881 881 .yui-skin-sam th.yui-dt-sortable .yui-dt-label { margin-right: 10px }
882 882 .yui-skin-sam th.yui-dt-asc .yui-dt-liner { background: url(../images/dt-arrow-up.png) no-repeat right }
883 883 .yui-skin-sam th.yui-dt-desc .yui-dt-liner { background: url(../images/dt-arrow-dn.png) no-repeat right }
884 884 tbody .yui-dt-editable { cursor: pointer }
885 885 .yui-dt-editor {
886 886 text-align: left;
887 887 background-color: #f2f2f2;
888 888 border: 1px solid #808080;
889 889 padding: 6px;
890 890 }
891 891 .yui-dt-editor label {
892 892 padding-left: 4px;
893 893 padding-right: 6px;
894 894 }
895 895 .yui-dt-editor .yui-dt-button {
896 896 padding-top: 6px;
897 897 text-align: right;
898 898 }
899 899 .yui-dt-editor .yui-dt-button button {
900 900 background: url(../images/sprite.png) repeat-x 0 0;
901 901 border: 1px solid #999;
902 902 width: 4em;
903 903 height: 1.8em;
904 904 margin-left: 6px;
905 905 }
906 906 .yui-dt-editor .yui-dt-button button.yui-dt-default {
907 907 background: url(../images/sprite.png) repeat-x 0 -1400px;
908 908 background-color: #5584e0;
909 909 border: 1px solid #304369;
910 910 color: #FFF;
911 911 }
912 912 .yui-dt-editor .yui-dt-button button:hover {
913 913 background: url(../images/sprite.png) repeat-x 0 -1300px;
914 914 color: #000;
915 915 }
916 916 .yui-dt-editor .yui-dt-button button:active {
917 917 background: url(../images/sprite.png) repeat-x 0 -1700px;
918 918 color: #000;
919 919 }
920 920 .yui-skin-sam tr.yui-dt-even { background-color: #FFF }
921 921 .yui-skin-sam tr.yui-dt-odd { background-color: #edf5ff }
922 922 .yui-skin-sam tr.yui-dt-even td.yui-dt-asc,
923 923 .yui-skin-sam tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
924 924 .yui-skin-sam tr.yui-dt-odd td.yui-dt-asc,
925 925 .yui-skin-sam tr.yui-dt-odd td.yui-dt-desc { background-color: #dbeaff }
926 926 .yui-skin-sam .yui-dt-list tr.yui-dt-even { background-color: #FFF }
927 927 .yui-skin-sam .yui-dt-list tr.yui-dt-odd { background-color: #FFF }
928 928 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-asc,
929 929 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
930 930 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-asc,
931 931 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-desc { background-color: #edf5ff }
932 932 .yui-skin-sam th.yui-dt-highlighted,
933 933 .yui-skin-sam th.yui-dt-highlighted a { background-color: #b2d2ff }
934 934 .yui-skin-sam tr.yui-dt-highlighted,
935 935 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc,
936 936 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc,
937 937 .yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted,
938 938 .yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted {
939 939 cursor: pointer;
940 940 background-color: #b2d2ff;
941 941 }
942 942 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted,
943 943 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted a { background-color: #b2d2ff }
944 944 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted,
945 945 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-asc,
946 946 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc,
947 947 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-highlighted,
948 948 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-highlighted {
949 949 cursor: pointer;
950 950 background-color: #b2d2ff;
951 951 }
952 952 .yui-skin-sam th.yui-dt-selected,
953 953 .yui-skin-sam th.yui-dt-selected a { background-color: #446cd7 }
954 954 .yui-skin-sam tr.yui-dt-selected td,
955 955 .yui-skin-sam tr.yui-dt-selected td.yui-dt-asc,
956 956 .yui-skin-sam tr.yui-dt-selected td.yui-dt-desc {
957 957 background-color: #426fd9;
958 958 color: #FFF;
959 959 }
960 960 .yui-skin-sam tr.yui-dt-even td.yui-dt-selected,
961 961 .yui-skin-sam tr.yui-dt-odd td.yui-dt-selected {
962 962 background-color: #446cd7;
963 963 color: #FFF;
964 964 }
965 965 .yui-skin-sam .yui-dt-list th.yui-dt-selected,
966 966 .yui-skin-sam .yui-dt-list th.yui-dt-selected a { background-color: #446cd7 }
967 967 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td,
968 968 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-asc,
969 969 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-desc {
970 970 background-color: #426fd9;
971 971 color: #FFF;
972 972 }
973 973 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-selected,
974 974 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-selected {
975 975 background-color: #446cd7;
976 976 color: #FFF;
977 977 }
978 978 .yui-skin-sam .yui-dt-paginator {
979 979 display: block;
980 980 margin: 6px 0;
981 981 white-space: nowrap;
982 982 }
983 983 .yui-skin-sam .yui-dt-paginator .yui-dt-first,
984 984 .yui-skin-sam .yui-dt-paginator .yui-dt-last,
985 985 .yui-skin-sam .yui-dt-paginator .yui-dt-selected { padding: 2px 6px }
986 986 .yui-skin-sam .yui-dt-paginator a.yui-dt-first,
987 987 .yui-skin-sam .yui-dt-paginator a.yui-dt-last { text-decoration: none }
988 988 .yui-skin-sam .yui-dt-paginator .yui-dt-previous,
989 989 .yui-skin-sam .yui-dt-paginator .yui-dt-next { display: none }
990 990 .yui-skin-sam a.yui-dt-page {
991 991 border: 1px solid #cbcbcb;
992 992 padding: 2px 6px;
993 993 text-decoration: none;
994 994 background-color: #fff;
995 995 }
996 996 .yui-skin-sam .yui-dt-selected {
997 997 border: 1px solid #fff;
998 998 background-color: #fff;
999 999 }
1000 1000
1001 1001 #content #left {
1002 1002 left: 0;
1003 1003 width: 280px;
1004 1004 position: absolute;
1005 1005 }
1006 1006
1007 1007 #content #right {
1008 1008 margin: 0 60px 10px 290px;
1009 1009 }
1010 1010
1011 1011 #content div.box {
1012 1012 clear: both;
1013 1013 overflow: hidden;
1014 1014 background: #fff;
1015 1015 margin: 0 0 10px;
1016 1016 padding: 0 0 10px;
1017 1017 -webkit-border-radius: 4px 4px 4px 4px;
1018 1018 -khtml-border-radius: 4px 4px 4px 4px;
1019 1019 -moz-border-radius: 4px 4px 4px 4px;
1020 1020 border-radius: 4px 4px 4px 4px;
1021 1021 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1022 1022 }
1023 1023
1024 1024 #content div.box-left {
1025 1025 width: 49%;
1026 1026 clear: none;
1027 1027 float: left;
1028 1028 margin: 0 0 10px;
1029 1029 }
1030 1030
1031 1031 #content div.box-right {
1032 1032 width: 49%;
1033 1033 clear: none;
1034 1034 float: right;
1035 1035 margin: 0 0 10px;
1036 1036 }
1037 1037
1038 1038 #content div.box div.title {
1039 1039 clear: both;
1040 1040 overflow: hidden;
1041 1041 background-color: #003B76;
1042 1042 background-repeat: repeat-x;
1043 1043 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
1044 1044 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1045 1045 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1046 1046 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1047 1047 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1048 1048 background-image: -o-linear-gradient(top, #003b76, #00376e);
1049 1049 background-image: linear-gradient(top, #003b76, #00376e);
1050 1050 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
1051 1051 margin: 0 0 20px;
1052 1052 padding: 0;
1053 1053 }
1054 1054
1055 1055 #content div.box div.title h5 {
1056 1056 float: left;
1057 1057 border: none;
1058 1058 color: #fff;
1059 1059 text-transform: uppercase;
1060 1060 margin: 0;
1061 1061 padding: 11px 0 11px 10px;
1062 1062 }
1063 1063
1064 1064 #content div.box div.title .link-white{
1065 1065 color: #FFFFFF;
1066 1066 }
1067 1067
1068 1068 #content div.box div.title ul.links li {
1069 1069 list-style: none;
1070 1070 float: left;
1071 1071 margin: 0;
1072 1072 padding: 0;
1073 1073 }
1074 1074
1075 1075 #content div.box div.title ul.links li a {
1076 1076 border-left: 1px solid #316293;
1077 1077 color: #FFFFFF;
1078 1078 display: block;
1079 1079 float: left;
1080 1080 font-size: 13px;
1081 1081 font-weight: 700;
1082 1082 height: 1%;
1083 1083 margin: 0;
1084 1084 padding: 11px 22px 12px;
1085 1085 text-decoration: none;
1086 1086 }
1087 1087
1088 1088 #content div.box h1,#content div.box h2,#content div.box h3,#content div.box h4,#content div.box h5,#content div.box h6
1089 1089 {
1090 1090 clear: both;
1091 1091 overflow: hidden;
1092 1092 border-bottom: 1px solid #DDD;
1093 1093 margin: 10px 20px;
1094 1094 padding: 0 0 15px;
1095 1095 }
1096 1096
1097 1097 #content div.box p {
1098 1098 color: #5f5f5f;
1099 1099 font-size: 12px;
1100 1100 line-height: 150%;
1101 1101 margin: 0 24px 10px;
1102 1102 padding: 0;
1103 1103 }
1104 1104
1105 1105 #content div.box blockquote {
1106 1106 border-left: 4px solid #DDD;
1107 1107 color: #5f5f5f;
1108 1108 font-size: 11px;
1109 1109 line-height: 150%;
1110 1110 margin: 0 34px;
1111 1111 padding: 0 0 0 14px;
1112 1112 }
1113 1113
1114 1114 #content div.box blockquote p {
1115 1115 margin: 10px 0;
1116 1116 padding: 0;
1117 1117 }
1118 1118
1119 1119 #content div.box dl {
1120 1120 margin: 10px 0px;
1121 1121 }
1122 1122
1123 1123 #content div.box dt {
1124 1124 font-size: 12px;
1125 1125 margin: 0;
1126 1126 }
1127 1127
1128 1128 #content div.box dd {
1129 1129 font-size: 12px;
1130 1130 margin: 0;
1131 1131 padding: 8px 0 8px 15px;
1132 1132 }
1133 1133
1134 1134 #content div.box li {
1135 1135 font-size: 12px;
1136 1136 padding: 4px 0;
1137 1137 }
1138 1138
1139 1139 #content div.box ul.disc,#content div.box ul.circle {
1140 1140 margin: 10px 24px 10px 38px;
1141 1141 }
1142 1142
1143 1143 #content div.box ul.square {
1144 1144 margin: 10px 24px 10px 40px;
1145 1145 }
1146 1146
1147 1147 #content div.box img.left {
1148 1148 border: none;
1149 1149 float: left;
1150 1150 margin: 10px 10px 10px 0;
1151 1151 }
1152 1152
1153 1153 #content div.box img.right {
1154 1154 border: none;
1155 1155 float: right;
1156 1156 margin: 10px 0 10px 10px;
1157 1157 }
1158 1158
1159 1159 #content div.box div.messages {
1160 1160 clear: both;
1161 1161 overflow: hidden;
1162 1162 margin: 0 20px;
1163 1163 padding: 0;
1164 1164 }
1165 1165
1166 1166 #content div.box div.message {
1167 1167 clear: both;
1168 1168 overflow: hidden;
1169 1169 margin: 0;
1170 1170 padding: 5px 0;
1171 1171 white-space: pre-wrap;
1172 1172 }
1173 1173 #content div.box div.expand {
1174 1174 width: 110%;
1175 1175 height:14px;
1176 1176 font-size:10px;
1177 1177 text-align:center;
1178 1178 cursor: pointer;
1179 1179 color:#666;
1180 1180
1181 1181 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)));
1182 1182 background:-webkit-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1183 1183 background:-moz-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1184 1184 background:-o-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1185 1185 background:-ms-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1186 1186 background:linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1187 1187
1188 1188 display: none;
1189 1189 }
1190 1190 #content div.box div.expand .expandtext {
1191 1191 background-color: #ffffff;
1192 1192 padding: 2px;
1193 1193 border-radius: 2px;
1194 1194 }
1195 1195
1196 1196 #content div.box div.message a {
1197 1197 font-weight: 400 !important;
1198 1198 }
1199 1199
1200 1200 #content div.box div.message div.image {
1201 1201 float: left;
1202 1202 margin: 9px 0 0 5px;
1203 1203 padding: 6px;
1204 1204 }
1205 1205
1206 1206 #content div.box div.message div.image img {
1207 1207 vertical-align: middle;
1208 1208 margin: 0;
1209 1209 }
1210 1210
1211 1211 #content div.box div.message div.text {
1212 1212 float: left;
1213 1213 margin: 0;
1214 1214 padding: 9px 6px;
1215 1215 }
1216 1216
1217 1217 #content div.box div.message div.dismiss a {
1218 1218 height: 16px;
1219 1219 width: 16px;
1220 1220 display: block;
1221 1221 background: url("../images/icons/cross.png") no-repeat;
1222 1222 margin: 15px 14px 0 0;
1223 1223 padding: 0;
1224 1224 }
1225 1225
1226 1226 #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
1227 1227 {
1228 1228 border: none;
1229 1229 margin: 0;
1230 1230 padding: 0;
1231 1231 }
1232 1232
1233 1233 #content div.box div.message div.text span {
1234 1234 height: 1%;
1235 1235 display: block;
1236 1236 margin: 0;
1237 1237 padding: 5px 0 0;
1238 1238 }
1239 1239
1240 1240 #content div.box div.message-error {
1241 1241 height: 1%;
1242 1242 clear: both;
1243 1243 overflow: hidden;
1244 1244 background: #FBE3E4;
1245 1245 border: 1px solid #FBC2C4;
1246 1246 color: #860006;
1247 1247 }
1248 1248
1249 1249 #content div.box div.message-error h6 {
1250 1250 color: #860006;
1251 1251 }
1252 1252
1253 1253 #content div.box div.message-warning {
1254 1254 height: 1%;
1255 1255 clear: both;
1256 1256 overflow: hidden;
1257 1257 background: #FFF6BF;
1258 1258 border: 1px solid #FFD324;
1259 1259 color: #5f5200;
1260 1260 }
1261 1261
1262 1262 #content div.box div.message-warning h6 {
1263 1263 color: #5f5200;
1264 1264 }
1265 1265
1266 1266 #content div.box div.message-notice {
1267 1267 height: 1%;
1268 1268 clear: both;
1269 1269 overflow: hidden;
1270 1270 background: #8FBDE0;
1271 1271 border: 1px solid #6BACDE;
1272 1272 color: #003863;
1273 1273 }
1274 1274
1275 1275 #content div.box div.message-notice h6 {
1276 1276 color: #003863;
1277 1277 }
1278 1278
1279 1279 #content div.box div.message-success {
1280 1280 height: 1%;
1281 1281 clear: both;
1282 1282 overflow: hidden;
1283 1283 background: #E6EFC2;
1284 1284 border: 1px solid #C6D880;
1285 1285 color: #4e6100;
1286 1286 }
1287 1287
1288 1288 #content div.box div.message-success h6 {
1289 1289 color: #4e6100;
1290 1290 }
1291 1291
1292 1292 #content div.box div.form div.fields div.field {
1293 1293 height: 1%;
1294 1294 border-bottom: 1px solid #DDD;
1295 1295 clear: both;
1296 1296 margin: 0;
1297 1297 padding: 10px 0;
1298 1298 }
1299 1299
1300 1300 #content div.box div.form div.fields div.field-first {
1301 1301 padding: 0 0 10px;
1302 1302 }
1303 1303
1304 1304 #content div.box div.form div.fields div.field-noborder {
1305 1305 border-bottom: 0 !important;
1306 1306 }
1307 1307
1308 1308 #content div.box div.form div.fields div.field span.error-message {
1309 1309 height: 1%;
1310 1310 display: inline-block;
1311 1311 color: red;
1312 1312 margin: 8px 0 0 4px;
1313 1313 padding: 0;
1314 1314 }
1315 1315
1316 1316 #content div.box div.form div.fields div.field span.success {
1317 1317 height: 1%;
1318 1318 display: block;
1319 1319 color: #316309;
1320 1320 margin: 8px 0 0;
1321 1321 padding: 0;
1322 1322 }
1323 1323
1324 1324 #content div.box div.form div.fields div.field div.label {
1325 1325 left: 70px;
1326 1326 width: 155px;
1327 1327 position: absolute;
1328 1328 margin: 0;
1329 1329 padding: 5px 0 0 0px;
1330 1330 }
1331 1331
1332 1332 #content div.box div.form div.fields div.field div.label-summary {
1333 1333 left: 30px;
1334 1334 width: 155px;
1335 1335 position: absolute;
1336 1336 margin: 0;
1337 1337 padding: 0px 0 0 0px;
1338 1338 }
1339 1339
1340 1340 #content div.box-left div.form div.fields div.field div.label,
1341 1341 #content div.box-right div.form div.fields div.field div.label,
1342 1342 #content div.box-left div.form div.fields div.field div.label,
1343 1343 #content div.box-left div.form div.fields div.field div.label-summary,
1344 1344 #content div.box-right div.form div.fields div.field div.label-summary,
1345 1345 #content div.box-left div.form div.fields div.field div.label-summary
1346 1346 {
1347 1347 clear: both;
1348 1348 overflow: hidden;
1349 1349 left: 0;
1350 1350 width: auto;
1351 1351 position: relative;
1352 1352 margin: 0;
1353 1353 padding: 0 0 8px;
1354 1354 }
1355 1355
1356 1356 #content div.box div.form div.fields div.field div.label-select {
1357 1357 padding: 5px 0 0 5px;
1358 1358 }
1359 1359
1360 1360 #content div.box-left div.form div.fields div.field div.label-select,
1361 1361 #content div.box-right div.form div.fields div.field div.label-select
1362 1362 {
1363 1363 padding: 0 0 8px;
1364 1364 }
1365 1365
1366 1366 #content div.box-left div.form div.fields div.field div.label-textarea,
1367 1367 #content div.box-right div.form div.fields div.field div.label-textarea
1368 1368 {
1369 1369 padding: 0 0 8px !important;
1370 1370 }
1371 1371
1372 1372 #content div.box div.form div.fields div.field div.label label,div.label label
1373 1373 {
1374 1374 color: #393939;
1375 1375 font-weight: 700;
1376 1376 }
1377 1377 #content div.box div.form div.fields div.field div.label label,div.label-summary label
1378 1378 {
1379 1379 color: #393939;
1380 1380 font-weight: 700;
1381 1381 }
1382 1382 #content div.box div.form div.fields div.field div.input {
1383 1383 margin: 0 0 0 200px;
1384 1384 }
1385 1385
1386 1386 #content div.box div.form div.fields div.field div.input.summary {
1387 1387 margin: 0 0 0 110px;
1388 1388 }
1389 1389 #content div.box div.form div.fields div.field div.input.summary-short {
1390 1390 margin: 0 0 0 110px;
1391 1391 }
1392 1392 #content div.box div.form div.fields div.field div.file {
1393 1393 margin: 0 0 0 200px;
1394 1394 }
1395 1395
1396 1396 #content div.box-left div.form div.fields div.field div.input,#content div.box-right div.form div.fields div.field div.input
1397 1397 {
1398 1398 margin: 0 0 0 0px;
1399 1399 }
1400 1400
1401 1401 #content div.box div.form div.fields div.field div.input input {
1402 1402 background: #FFF;
1403 1403 border-top: 1px solid #b3b3b3;
1404 1404 border-left: 1px solid #b3b3b3;
1405 1405 border-right: 1px solid #eaeaea;
1406 1406 border-bottom: 1px solid #eaeaea;
1407 1407 color: #000;
1408 1408 font-size: 11px;
1409 1409 margin: 0;
1410 1410 padding: 7px 7px 6px;
1411 1411 }
1412 1412
1413 1413 #content div.box div.form div.fields div.field div.input input#clone_url,
1414 1414 #content div.box div.form div.fields div.field div.input input#clone_url_id
1415 1415 {
1416 1416 font-size: 16px;
1417 1417 padding: 2px;
1418 1418 }
1419 1419
1420 1420 #content div.box div.form div.fields div.field div.file input {
1421 1421 background: none repeat scroll 0 0 #FFFFFF;
1422 1422 border-color: #B3B3B3 #EAEAEA #EAEAEA #B3B3B3;
1423 1423 border-style: solid;
1424 1424 border-width: 1px;
1425 1425 color: #000000;
1426 1426 font-size: 11px;
1427 1427 margin: 0;
1428 1428 padding: 7px 7px 6px;
1429 1429 }
1430 1430
1431 1431 input.disabled {
1432 1432 background-color: #F5F5F5 !important;
1433 1433 }
1434 1434 #content div.box div.form div.fields div.field div.input input.small {
1435 1435 width: 30%;
1436 1436 }
1437 1437
1438 1438 #content div.box div.form div.fields div.field div.input input.medium {
1439 1439 width: 55%;
1440 1440 }
1441 1441
1442 1442 #content div.box div.form div.fields div.field div.input input.large {
1443 1443 width: 85%;
1444 1444 }
1445 1445
1446 1446 #content div.box div.form div.fields div.field div.input input.date {
1447 1447 width: 177px;
1448 1448 }
1449 1449
1450 1450 #content div.box div.form div.fields div.field div.input input.button {
1451 1451 background: #D4D0C8;
1452 1452 border-top: 1px solid #FFF;
1453 1453 border-left: 1px solid #FFF;
1454 1454 border-right: 1px solid #404040;
1455 1455 border-bottom: 1px solid #404040;
1456 1456 color: #000;
1457 1457 margin: 0;
1458 1458 padding: 4px 8px;
1459 1459 }
1460 1460
1461 1461 #content div.box div.form div.fields div.field div.textarea {
1462 1462 border-top: 1px solid #b3b3b3;
1463 1463 border-left: 1px solid #b3b3b3;
1464 1464 border-right: 1px solid #eaeaea;
1465 1465 border-bottom: 1px solid #eaeaea;
1466 1466 margin: 0 0 0 200px;
1467 1467 padding: 10px;
1468 1468 }
1469 1469
1470 1470 #content div.box div.form div.fields div.field div.textarea-editor {
1471 1471 border: 1px solid #ddd;
1472 1472 padding: 0;
1473 1473 }
1474 1474
1475 1475 #content div.box div.form div.fields div.field div.textarea textarea {
1476 1476 width: 100%;
1477 1477 height: 220px;
1478 1478 overflow: hidden;
1479 1479 background: #FFF;
1480 1480 color: #000;
1481 1481 font-size: 11px;
1482 1482 outline: none;
1483 1483 border-width: 0;
1484 1484 margin: 0;
1485 1485 padding: 0;
1486 1486 }
1487 1487
1488 1488 #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
1489 1489 {
1490 1490 width: 100%;
1491 1491 height: 100px;
1492 1492 }
1493 1493
1494 1494 #content div.box div.form div.fields div.field div.textarea table {
1495 1495 width: 100%;
1496 1496 border: none;
1497 1497 margin: 0;
1498 1498 padding: 0;
1499 1499 }
1500 1500
1501 1501 #content div.box div.form div.fields div.field div.textarea table td {
1502 1502 background: #DDD;
1503 1503 border: none;
1504 1504 padding: 0;
1505 1505 }
1506 1506
1507 1507 #content div.box div.form div.fields div.field div.textarea table td table
1508 1508 {
1509 1509 width: auto;
1510 1510 border: none;
1511 1511 margin: 0;
1512 1512 padding: 0;
1513 1513 }
1514 1514
1515 1515 #content div.box div.form div.fields div.field div.textarea table td table td
1516 1516 {
1517 1517 font-size: 11px;
1518 1518 padding: 5px 5px 5px 0;
1519 1519 }
1520 1520
1521 1521 #content div.box div.form div.fields div.field input[type=text]:focus,#content div.box div.form div.fields div.field input[type=password]:focus,#content div.box div.form div.fields div.field input[type=file]:focus,#content div.box div.form div.fields div.field textarea:focus,#content div.box div.form div.fields div.field select:focus
1522 1522 {
1523 1523 background: #f6f6f6;
1524 1524 border-color: #666;
1525 1525 }
1526 1526
1527 1527 div.form div.fields div.field div.button {
1528 1528 margin: 0;
1529 1529 padding: 0 0 0 8px;
1530 1530 }
1531 1531 #content div.box table.noborder {
1532 1532 border: 1px solid transparent;
1533 1533 }
1534 1534
1535 1535 #content div.box table {
1536 1536 width: 100%;
1537 1537 border-collapse: separate;
1538 1538 margin: 0;
1539 1539 padding: 0;
1540 1540 border: 1px solid #eee;
1541 1541 -webkit-border-radius: 4px;
1542 1542 -moz-border-radius: 4px;
1543 1543 border-radius: 4px;
1544 1544 }
1545 1545
1546 1546 #content div.box table th {
1547 1547 background: #eee;
1548 1548 border-bottom: 1px solid #ddd;
1549 1549 padding: 5px 0px 5px 5px;
1550 1550 }
1551 1551
1552 1552 #content div.box table th.left {
1553 1553 text-align: left;
1554 1554 }
1555 1555
1556 1556 #content div.box table th.right {
1557 1557 text-align: right;
1558 1558 }
1559 1559
1560 1560 #content div.box table th.center {
1561 1561 text-align: center;
1562 1562 }
1563 1563
1564 1564 #content div.box table th.selected {
1565 1565 vertical-align: middle;
1566 1566 padding: 0;
1567 1567 }
1568 1568
1569 1569 #content div.box table td {
1570 1570 background: #fff;
1571 1571 border-bottom: 1px solid #cdcdcd;
1572 1572 vertical-align: middle;
1573 1573 padding: 5px;
1574 1574 }
1575 1575
1576 1576 #content div.box table tr.selected td {
1577 1577 background: #FFC;
1578 1578 }
1579 1579
1580 1580 #content div.box table td.selected {
1581 1581 width: 3%;
1582 1582 text-align: center;
1583 1583 vertical-align: middle;
1584 1584 padding: 0;
1585 1585 }
1586 1586
1587 1587 #content div.box table td.action {
1588 1588 width: 45%;
1589 1589 text-align: left;
1590 1590 }
1591 1591
1592 1592 #content div.box table td.date {
1593 1593 width: 33%;
1594 1594 text-align: center;
1595 1595 }
1596 1596
1597 1597 #content div.box div.action {
1598 1598 float: right;
1599 1599 background: #FFF;
1600 1600 text-align: right;
1601 1601 margin: 10px 0 0;
1602 1602 padding: 0;
1603 1603 }
1604 1604
1605 1605 #content div.box div.action select {
1606 1606 font-size: 11px;
1607 1607 margin: 0;
1608 1608 }
1609 1609
1610 1610 #content div.box div.action .ui-selectmenu {
1611 1611 margin: 0;
1612 1612 padding: 0;
1613 1613 }
1614 1614
1615 1615 #content div.box div.pagination {
1616 1616 height: 1%;
1617 1617 clear: both;
1618 1618 overflow: hidden;
1619 1619 margin: 10px 0 0;
1620 1620 padding: 0;
1621 1621 }
1622 1622
1623 1623 #content div.box div.pagination ul.pager {
1624 1624 float: right;
1625 1625 text-align: right;
1626 1626 margin: 0;
1627 1627 padding: 0;
1628 1628 }
1629 1629
1630 1630 #content div.box div.pagination ul.pager li {
1631 1631 height: 1%;
1632 1632 float: left;
1633 1633 list-style: none;
1634 1634 background: #ebebeb url("../images/pager.png") repeat-x;
1635 1635 border-top: 1px solid #dedede;
1636 1636 border-left: 1px solid #cfcfcf;
1637 1637 border-right: 1px solid #c4c4c4;
1638 1638 border-bottom: 1px solid #c4c4c4;
1639 1639 color: #4A4A4A;
1640 1640 font-weight: 700;
1641 1641 margin: 0 0 0 4px;
1642 1642 padding: 0;
1643 1643 }
1644 1644
1645 1645 #content div.box div.pagination ul.pager li.separator {
1646 1646 padding: 6px;
1647 1647 }
1648 1648
1649 1649 #content div.box div.pagination ul.pager li.current {
1650 1650 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1651 1651 border-top: 1px solid #ccc;
1652 1652 border-left: 1px solid #bebebe;
1653 1653 border-right: 1px solid #b1b1b1;
1654 1654 border-bottom: 1px solid #afafaf;
1655 1655 color: #515151;
1656 1656 padding: 6px;
1657 1657 }
1658 1658
1659 1659 #content div.box div.pagination ul.pager li a {
1660 1660 height: 1%;
1661 1661 display: block;
1662 1662 float: left;
1663 1663 color: #515151;
1664 1664 text-decoration: none;
1665 1665 margin: 0;
1666 1666 padding: 6px;
1667 1667 }
1668 1668
1669 1669 #content div.box div.pagination ul.pager li a:hover,#content div.box div.pagination ul.pager li a:active
1670 1670 {
1671 1671 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1672 1672 border-top: 1px solid #ccc;
1673 1673 border-left: 1px solid #bebebe;
1674 1674 border-right: 1px solid #b1b1b1;
1675 1675 border-bottom: 1px solid #afafaf;
1676 1676 margin: -1px;
1677 1677 }
1678 1678
1679 1679 #content div.box div.pagination-wh {
1680 1680 height: 1%;
1681 1681 clear: both;
1682 1682 overflow: hidden;
1683 1683 text-align: right;
1684 1684 margin: 10px 0 0;
1685 1685 padding: 0;
1686 1686 }
1687 1687
1688 1688 #content div.box div.pagination-right {
1689 1689 float: right;
1690 1690 }
1691 1691
1692 1692 #content div.box div.pagination-wh a,#content div.box div.pagination-wh span.pager_dotdot
1693 1693 {
1694 1694 height: 1%;
1695 1695 float: left;
1696 1696 background: #ebebeb url("../images/pager.png") repeat-x;
1697 1697 border-top: 1px solid #dedede;
1698 1698 border-left: 1px solid #cfcfcf;
1699 1699 border-right: 1px solid #c4c4c4;
1700 1700 border-bottom: 1px solid #c4c4c4;
1701 1701 color: #4A4A4A;
1702 1702 font-weight: 700;
1703 1703 margin: 0 0 0 4px;
1704 1704 padding: 6px;
1705 1705 }
1706 1706
1707 1707 #content div.box div.pagination-wh span.pager_curpage {
1708 1708 height: 1%;
1709 1709 float: left;
1710 1710 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1711 1711 border-top: 1px solid #ccc;
1712 1712 border-left: 1px solid #bebebe;
1713 1713 border-right: 1px solid #b1b1b1;
1714 1714 border-bottom: 1px solid #afafaf;
1715 1715 color: #515151;
1716 1716 font-weight: 700;
1717 1717 margin: 0 0 0 4px;
1718 1718 padding: 6px;
1719 1719 }
1720 1720
1721 1721 #content div.box div.pagination-wh a:hover,#content div.box div.pagination-wh a:active
1722 1722 {
1723 1723 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1724 1724 border-top: 1px solid #ccc;
1725 1725 border-left: 1px solid #bebebe;
1726 1726 border-right: 1px solid #b1b1b1;
1727 1727 border-bottom: 1px solid #afafaf;
1728 1728 text-decoration: none;
1729 1729 }
1730 1730
1731 1731 #content div.box div.traffic div.legend {
1732 1732 clear: both;
1733 1733 overflow: hidden;
1734 1734 border-bottom: 1px solid #ddd;
1735 1735 margin: 0 0 10px;
1736 1736 padding: 0 0 10px;
1737 1737 }
1738 1738
1739 1739 #content div.box div.traffic div.legend h6 {
1740 1740 float: left;
1741 1741 border: none;
1742 1742 margin: 0;
1743 1743 padding: 0;
1744 1744 }
1745 1745
1746 1746 #content div.box div.traffic div.legend li {
1747 1747 list-style: none;
1748 1748 float: left;
1749 1749 font-size: 11px;
1750 1750 margin: 0;
1751 1751 padding: 0 8px 0 4px;
1752 1752 }
1753 1753
1754 1754 #content div.box div.traffic div.legend li.visits {
1755 1755 border-left: 12px solid #edc240;
1756 1756 }
1757 1757
1758 1758 #content div.box div.traffic div.legend li.pageviews {
1759 1759 border-left: 12px solid #afd8f8;
1760 1760 }
1761 1761
1762 1762 #content div.box div.traffic table {
1763 1763 width: auto;
1764 1764 }
1765 1765
1766 1766 #content div.box div.traffic table td {
1767 1767 background: transparent;
1768 1768 border: none;
1769 1769 padding: 2px 3px 3px;
1770 1770 }
1771 1771
1772 1772 #content div.box div.traffic table td.legendLabel {
1773 1773 padding: 0 3px 2px;
1774 1774 }
1775 1775
1776 1776 #summary {
1777 1777
1778 1778 }
1779 1779
1780 1780 #summary .desc {
1781 1781 white-space: pre;
1782 1782 width: 100%;
1783 1783 }
1784 1784
1785 1785 #summary .repo_name {
1786 1786 font-size: 1.6em;
1787 1787 font-weight: bold;
1788 1788 vertical-align: baseline;
1789 1789 clear: right
1790 1790 }
1791 1791
1792 1792 #footer {
1793 1793 clear: both;
1794 1794 overflow: hidden;
1795 1795 text-align: right;
1796 1796 margin: 0;
1797 1797 padding: 0 10px 4px;
1798 1798 margin: -10px 0 0;
1799 1799 }
1800 1800
1801 1801 #footer div#footer-inner {
1802 1802 background-color: #003B76;
1803 1803 background-repeat : repeat-x;
1804 1804 background-image : -khtml-gradient( linear, left top, left bottom, from(#003B76), to(#00376E));
1805 1805 background-image : -moz-linear-gradient(top, #003b76, #00376e);
1806 1806 background-image : -ms-linear-gradient( top, #003b76, #00376e);
1807 1807 background-image : -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1808 1808 background-image : -webkit-linear-gradient( top, #003b76, #00376e));
1809 1809 background-image : -o-linear-gradient( top, #003b76, #00376e));
1810 1810 background-image : linear-gradient( top, #003b76, #00376e);
1811 1811 filter :progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#003b76', endColorstr = '#00376e', GradientType = 0);
1812 1812 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1813 1813 -webkit-border-radius: 4px 4px 4px 4px;
1814 1814 -khtml-border-radius: 4px 4px 4px 4px;
1815 1815 -moz-border-radius: 4px 4px 4px 4px;
1816 1816 border-radius: 4px 4px 4px 4px;
1817 1817 }
1818 1818
1819 1819 #footer div#footer-inner p {
1820 1820 padding: 15px 25px 15px 0;
1821 1821 color: #FFF;
1822 1822 font-weight: 700;
1823 1823 }
1824 1824
1825 1825 #footer div#footer-inner .footer-link {
1826 1826 float: left;
1827 1827 padding-left: 10px;
1828 1828 }
1829 1829
1830 1830 #footer div#footer-inner .footer-link a,#footer div#footer-inner .footer-link-right a
1831 1831 {
1832 1832 color: #FFF;
1833 1833 }
1834 1834
1835 1835 #login div.title {
1836 1836 width: 420px;
1837 1837 clear: both;
1838 1838 overflow: hidden;
1839 1839 position: relative;
1840 1840 background-color: #003B76;
1841 1841 background-repeat : repeat-x;
1842 1842 background-image : -khtml-gradient( linear, left top, left bottom, from(#003B76), to(#00376E));
1843 1843 background-image : -moz-linear-gradient( top, #003b76, #00376e);
1844 1844 background-image : -ms-linear-gradient( top, #003b76, #00376e);
1845 1845 background-image : -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #003b76), color-stop( 100%, #00376e));
1846 1846 background-image : -webkit-linear-gradient( top, #003b76, #00376e));
1847 1847 background-image : -o-linear-gradient( top, #003b76, #00376e));
1848 1848 background-image : linear-gradient( top, #003b76, #00376e);
1849 1849 filter : progid : DXImageTransform.Microsoft.gradient ( startColorstr = '#003b76', endColorstr = '#00376e', GradientType = 0);
1850 1850 margin: 0 auto;
1851 1851 padding: 0;
1852 1852 }
1853 1853
1854 1854 #login div.inner {
1855 1855 width: 380px;
1856 1856 background: #FFF url("../images/login.png") no-repeat top left;
1857 1857 border-top: none;
1858 1858 border-bottom: none;
1859 1859 margin: 0 auto;
1860 1860 padding: 20px;
1861 1861 }
1862 1862
1863 1863 #login div.form div.fields div.field div.label {
1864 1864 width: 173px;
1865 1865 float: left;
1866 1866 text-align: right;
1867 1867 margin: 2px 10px 0 0;
1868 1868 padding: 5px 0 0 5px;
1869 1869 }
1870 1870
1871 1871 #login div.form div.fields div.field div.input input {
1872 1872 width: 176px;
1873 1873 background: #FFF;
1874 1874 border-top: 1px solid #b3b3b3;
1875 1875 border-left: 1px solid #b3b3b3;
1876 1876 border-right: 1px solid #eaeaea;
1877 1877 border-bottom: 1px solid #eaeaea;
1878 1878 color: #000;
1879 1879 font-size: 11px;
1880 1880 margin: 0;
1881 1881 padding: 7px 7px 6px;
1882 1882 }
1883 1883
1884 1884 #login div.form div.fields div.buttons {
1885 1885 clear: both;
1886 1886 overflow: hidden;
1887 1887 border-top: 1px solid #DDD;
1888 1888 text-align: right;
1889 1889 margin: 0;
1890 1890 padding: 10px 0 0;
1891 1891 }
1892 1892
1893 1893 #login div.form div.links {
1894 1894 clear: both;
1895 1895 overflow: hidden;
1896 1896 margin: 10px 0 0;
1897 1897 padding: 0 0 2px;
1898 1898 }
1899 1899
1900 1900 .user-menu{
1901 1901 margin: 0px !important;
1902 1902 float: left;
1903 1903 }
1904 1904
1905 1905 .user-menu .container{
1906 1906 padding:0px 4px 0px 4px;
1907 1907 margin: 0px 0px 0px 0px;
1908 1908 }
1909 1909
1910 1910 .user-menu .gravatar{
1911 1911 margin: 0px 0px 0px 0px;
1912 1912 cursor: pointer;
1913 1913 }
1914 1914 .user-menu .gravatar.enabled{
1915 1915 background-color: #FDF784 !important;
1916 1916 }
1917 1917 .user-menu .gravatar:hover{
1918 1918 background-color: #FDF784 !important;
1919 1919 }
1920 1920 #quick_login{
1921 1921 min-height: 80px;
1922 1922 margin: 37px 0 0 -251px;
1923 1923 padding: 4px;
1924 1924 position: absolute;
1925 1925 width: 278px;
1926 1926
1927 1927 background-repeat: repeat-x;
1928 1928 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
1929 1929 background-image: -moz-linear-gradient(top, #003b76, #00376e);
1930 1930 background-image: -ms-linear-gradient(top, #003b76, #00376e);
1931 1931 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
1932 1932 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
1933 1933 background-image: -o-linear-gradient(top, #003b76, #00376e);
1934 1934 background-image: linear-gradient(top, #003b76, #00376e);
1935 1935 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76', endColorstr='#00376e', GradientType=0 );
1936 1936
1937 1937 z-index: 999;
1938 1938 -webkit-border-radius: 0px 0px 4px 4px;
1939 1939 -khtml-border-radius: 0px 0px 4px 4px;
1940 1940 -moz-border-radius: 0px 0px 4px 4px;
1941 1941 border-radius: 0px 0px 4px 4px;
1942 1942 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1943 1943 }
1944 1944 #quick_login h4{
1945 1945 color: #fff;
1946 1946 padding: 5px 0px 5px 14px;
1947 1947 }
1948 1948
1949 1949 #quick_login .password_forgoten {
1950 1950 padding-right: 10px;
1951 1951 padding-top: 0px;
1952 1952 text-align: left;
1953 1953 }
1954 1954
1955 1955 #quick_login .password_forgoten a {
1956 1956 font-size: 10px;
1957 1957 color: #fff;
1958 1958 }
1959 1959
1960 1960 #quick_login .register {
1961 1961 padding-right: 10px;
1962 1962 padding-top: 5px;
1963 1963 text-align: left;
1964 1964 }
1965 1965
1966 1966 #quick_login .register a {
1967 1967 font-size: 10px;
1968 1968 color: #fff;
1969 1969 }
1970 1970
1971 1971 #quick_login .submit {
1972 1972 margin: -20px 0 0 0px;
1973 1973 position: absolute;
1974 1974 right: 15px;
1975 1975 }
1976 1976
1977 1977 #quick_login .links_left{
1978 1978 float: left;
1979 1979 }
1980 1980 #quick_login .links_right{
1981 1981 float: right;
1982 1982 }
1983 1983 #quick_login .full_name{
1984 1984 color: #FFFFFF;
1985 1985 font-weight: bold;
1986 1986 padding: 3px;
1987 1987 }
1988 1988 #quick_login .big_gravatar{
1989 1989 padding:4px 0px 0px 6px;
1990 1990 }
1991 1991 #quick_login .inbox{
1992 1992 padding:4px 0px 0px 6px;
1993 1993 color: #FFFFFF;
1994 1994 font-weight: bold;
1995 1995 }
1996 1996 #quick_login .inbox a{
1997 1997 color: #FFFFFF;
1998 1998 }
1999 1999 #quick_login .email,#quick_login .email a{
2000 2000 color: #FFFFFF;
2001 2001 padding: 3px;
2002 2002
2003 2003 }
2004 2004 #quick_login .links .logout{
2005 2005
2006 2006 }
2007 2007
2008 2008 #quick_login div.form div.fields {
2009 2009 padding-top: 2px;
2010 2010 padding-left: 10px;
2011 2011 }
2012 2012
2013 2013 #quick_login div.form div.fields div.field {
2014 2014 padding: 5px;
2015 2015 }
2016 2016
2017 2017 #quick_login div.form div.fields div.field div.label label {
2018 2018 color: #fff;
2019 2019 padding-bottom: 3px;
2020 2020 }
2021 2021
2022 2022 #quick_login div.form div.fields div.field div.input input {
2023 2023 width: 236px;
2024 2024 background: #FFF;
2025 2025 border-top: 1px solid #b3b3b3;
2026 2026 border-left: 1px solid #b3b3b3;
2027 2027 border-right: 1px solid #eaeaea;
2028 2028 border-bottom: 1px solid #eaeaea;
2029 2029 color: #000;
2030 2030 font-size: 11px;
2031 2031 margin: 0;
2032 2032 padding: 5px 7px 4px;
2033 2033 }
2034 2034
2035 2035 #quick_login div.form div.fields div.buttons {
2036 2036 clear: both;
2037 2037 overflow: hidden;
2038 2038 text-align: right;
2039 2039 margin: 0;
2040 2040 padding: 5px 14px 0px 5px;
2041 2041 }
2042 2042
2043 2043 #quick_login div.form div.links {
2044 2044 clear: both;
2045 2045 overflow: hidden;
2046 2046 margin: 10px 0 0;
2047 2047 padding: 0 0 2px;
2048 2048 }
2049 2049
2050 2050 #quick_login ol.links{
2051 2051 display: block;
2052 2052 font-weight: bold;
2053 2053 list-style: none outside none;
2054 2054 text-align: right;
2055 2055 }
2056 2056 #quick_login ol.links li{
2057 2057 line-height: 27px;
2058 2058 margin: 0;
2059 2059 padding: 0;
2060 2060 color: #fff;
2061 2061 display: block;
2062 2062 float:none !important;
2063 2063 }
2064 2064
2065 2065 #quick_login ol.links li a{
2066 2066 color: #fff;
2067 2067 display: block;
2068 2068 padding: 2px;
2069 2069 }
2070 2070 #quick_login ol.links li a:HOVER{
2071 2071 background-color: inherit !important;
2072 2072 }
2073 2073
2074 2074 #register div.title {
2075 2075 clear: both;
2076 2076 overflow: hidden;
2077 2077 position: relative;
2078 2078 background-color: #003B76;
2079 2079 background-repeat: repeat-x;
2080 2080 background-image: -khtml-gradient(linear, left top, left bottom, from(#003B76), to(#00376E) );
2081 2081 background-image: -moz-linear-gradient(top, #003b76, #00376e);
2082 2082 background-image: -ms-linear-gradient(top, #003b76, #00376e);
2083 2083 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #003b76), color-stop(100%, #00376e) );
2084 2084 background-image: -webkit-linear-gradient(top, #003b76, #00376e);
2085 2085 background-image: -o-linear-gradient(top, #003b76, #00376e);
2086 2086 background-image: linear-gradient(top, #003b76, #00376e);
2087 2087 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#003b76',
2088 2088 endColorstr='#00376e', GradientType=0 );
2089 2089 margin: 0 auto;
2090 2090 padding: 0;
2091 2091 }
2092 2092
2093 2093 #register div.inner {
2094 2094 background: #FFF;
2095 2095 border-top: none;
2096 2096 border-bottom: none;
2097 2097 margin: 0 auto;
2098 2098 padding: 20px;
2099 2099 }
2100 2100
2101 2101 #register div.form div.fields div.field div.label {
2102 2102 width: 135px;
2103 2103 float: left;
2104 2104 text-align: right;
2105 2105 margin: 2px 10px 0 0;
2106 2106 padding: 5px 0 0 5px;
2107 2107 }
2108 2108
2109 2109 #register div.form div.fields div.field div.input input {
2110 2110 width: 300px;
2111 2111 background: #FFF;
2112 2112 border-top: 1px solid #b3b3b3;
2113 2113 border-left: 1px solid #b3b3b3;
2114 2114 border-right: 1px solid #eaeaea;
2115 2115 border-bottom: 1px solid #eaeaea;
2116 2116 color: #000;
2117 2117 font-size: 11px;
2118 2118 margin: 0;
2119 2119 padding: 7px 7px 6px;
2120 2120 }
2121 2121
2122 2122 #register div.form div.fields div.buttons {
2123 2123 clear: both;
2124 2124 overflow: hidden;
2125 2125 border-top: 1px solid #DDD;
2126 2126 text-align: left;
2127 2127 margin: 0;
2128 2128 padding: 10px 0 0 150px;
2129 2129 }
2130 2130
2131 2131 #register div.form div.activation_msg {
2132 2132 padding-top: 4px;
2133 2133 padding-bottom: 4px;
2134 2134 }
2135 2135
2136 2136 #journal .journal_day {
2137 2137 font-size: 20px;
2138 2138 padding: 10px 0px;
2139 2139 border-bottom: 2px solid #DDD;
2140 2140 margin-left: 10px;
2141 2141 margin-right: 10px;
2142 2142 }
2143 2143
2144 2144 #journal .journal_container {
2145 2145 padding: 5px;
2146 2146 clear: both;
2147 2147 margin: 0px 5px 0px 10px;
2148 2148 }
2149 2149
2150 2150 #journal .journal_action_container {
2151 2151 padding-left: 38px;
2152 2152 }
2153 2153
2154 2154 #journal .journal_user {
2155 2155 color: #747474;
2156 2156 font-size: 14px;
2157 2157 font-weight: bold;
2158 2158 height: 30px;
2159 2159 }
2160 2160
2161 2161 #journal .journal_icon {
2162 2162 clear: both;
2163 2163 float: left;
2164 2164 padding-right: 4px;
2165 2165 padding-top: 3px;
2166 2166 }
2167 2167
2168 2168 #journal .journal_action {
2169 2169 padding-top: 4px;
2170 2170 min-height: 2px;
2171 2171 float: left
2172 2172 }
2173 2173
2174 2174 #journal .journal_action_params {
2175 2175 clear: left;
2176 2176 padding-left: 22px;
2177 2177 }
2178 2178
2179 2179 #journal .journal_repo {
2180 2180 float: left;
2181 2181 margin-left: 6px;
2182 2182 padding-top: 3px;
2183 2183 }
2184 2184
2185 2185 #journal .date {
2186 2186 clear: both;
2187 2187 color: #777777;
2188 2188 font-size: 11px;
2189 2189 padding-left: 22px;
2190 2190 }
2191 2191
2192 2192 #journal .journal_repo .journal_repo_name {
2193 2193 font-weight: bold;
2194 2194 font-size: 1.1em;
2195 2195 }
2196 2196
2197 2197 #journal .compare_view {
2198 2198 padding: 5px 0px 5px 0px;
2199 2199 width: 95px;
2200 2200 }
2201 2201
2202 2202 .journal_highlight {
2203 2203 font-weight: bold;
2204 2204 padding: 0 2px;
2205 2205 vertical-align: bottom;
2206 2206 }
2207 2207
2208 2208 .trending_language_tbl,.trending_language_tbl td {
2209 2209 border: 0 !important;
2210 2210 margin: 0 !important;
2211 2211 padding: 0 !important;
2212 2212 }
2213 2213
2214 2214 .trending_language_tbl,.trending_language_tbl tr {
2215 2215 border-spacing: 1px;
2216 2216 }
2217 2217
2218 2218 .trending_language {
2219 2219 background-color: #003367;
2220 2220 color: #FFF;
2221 2221 display: block;
2222 2222 min-width: 20px;
2223 2223 text-decoration: none;
2224 2224 height: 12px;
2225 2225 margin-bottom: 0px;
2226 2226 margin-left: 5px;
2227 2227 white-space: pre;
2228 2228 padding: 3px;
2229 2229 }
2230 2230
2231 2231 h3.files_location {
2232 2232 font-size: 1.8em;
2233 2233 font-weight: 700;
2234 2234 border-bottom: none !important;
2235 2235 margin: 10px 0 !important;
2236 2236 }
2237 2237
2238 2238 #files_data dl dt {
2239 2239 float: left;
2240 2240 width: 60px;
2241 2241 margin: 0 !important;
2242 2242 padding: 5px;
2243 2243 }
2244 2244
2245 2245 #files_data dl dd {
2246 2246 margin: 0 !important;
2247 2247 padding: 5px !important;
2248 2248 }
2249 2249
2250 2250 .tablerow0 {
2251 2251 background-color: #F8F8F8;
2252 2252 }
2253 2253
2254 2254 .tablerow1 {
2255 2255 background-color: #FFFFFF;
2256 2256 }
2257 2257
2258 2258 .changeset_id {
2259 2259 font-family: monospace;
2260 2260 color: #666666;
2261 2261 }
2262 2262
2263 2263 .changeset_hash {
2264 2264 color: #000000;
2265 2265 }
2266 2266
2267 2267 #changeset_content {
2268 2268 border-left: 1px solid #CCC;
2269 2269 border-right: 1px solid #CCC;
2270 2270 border-bottom: 1px solid #CCC;
2271 2271 padding: 5px;
2272 2272 }
2273 2273
2274 2274 #changeset_compare_view_content {
2275 2275 border: 1px solid #CCC;
2276 2276 padding: 5px;
2277 2277 }
2278 2278
2279 2279 #changeset_content .container {
2280 2280 min-height: 100px;
2281 2281 font-size: 1.2em;
2282 2282 overflow: hidden;
2283 2283 }
2284 2284
2285 2285 #changeset_compare_view_content .compare_view_commits {
2286 2286 width: auto !important;
2287 2287 }
2288 2288
2289 2289 #changeset_compare_view_content .compare_view_commits td {
2290 2290 padding: 0px 0px 0px 12px !important;
2291 2291 }
2292 2292
2293 2293 #changeset_content .container .right {
2294 2294 float: right;
2295 2295 width: 20%;
2296 2296 text-align: right;
2297 2297 }
2298 2298
2299 2299 #changeset_content .container .left .message {
2300 2300 white-space: pre-wrap;
2301 2301 }
2302 2302 #changeset_content .container .left .message a:hover {
2303 2303 text-decoration: none;
2304 2304 }
2305 2305 .cs_files .cur_cs {
2306 2306 margin: 10px 2px;
2307 2307 font-weight: bold;
2308 2308 }
2309 2309
2310 2310 .cs_files .node {
2311 2311 float: left;
2312 2312 }
2313 2313
2314 2314 .cs_files .changes {
2315 2315 float: right;
2316 2316 color:#003367;
2317 2317
2318 2318 }
2319 2319
2320 2320 .cs_files .changes .added {
2321 2321 background-color: #BBFFBB;
2322 2322 float: left;
2323 2323 text-align: center;
2324 2324 font-size: 9px;
2325 2325 padding: 2px 0px 2px 0px;
2326 2326 }
2327 2327
2328 2328 .cs_files .changes .deleted {
2329 2329 background-color: #FF8888;
2330 2330 float: left;
2331 2331 text-align: center;
2332 2332 font-size: 9px;
2333 2333 padding: 2px 0px 2px 0px;
2334 2334 }
2335 2335
2336 2336 .cs_files .cs_added {
2337 2337 background: url("../images/icons/page_white_add.png") no-repeat scroll
2338 2338 3px;
2339 2339 height: 16px;
2340 2340 padding-left: 20px;
2341 2341 margin-top: 7px;
2342 2342 text-align: left;
2343 2343 }
2344 2344
2345 2345 .cs_files .cs_changed {
2346 2346 background: url("../images/icons/page_white_edit.png") no-repeat scroll
2347 2347 3px;
2348 2348 height: 16px;
2349 2349 padding-left: 20px;
2350 2350 margin-top: 7px;
2351 2351 text-align: left;
2352 2352 }
2353 2353
2354 2354 .cs_files .cs_removed {
2355 2355 background: url("../images/icons/page_white_delete.png") no-repeat
2356 2356 scroll 3px;
2357 2357 height: 16px;
2358 2358 padding-left: 20px;
2359 2359 margin-top: 7px;
2360 2360 text-align: left;
2361 2361 }
2362 2362
2363 2363 #graph {
2364 2364 overflow: hidden;
2365 2365 }
2366 2366
2367 2367 #graph_nodes {
2368 2368 float: left;
2369 2369 margin-right: -6px;
2370 2370 margin-top: 0px;
2371 2371 }
2372 2372
2373 2373 #graph_content {
2374 2374 width: 80%;
2375 2375 float: left;
2376 2376 }
2377 2377
2378 2378 #graph_content .container_header {
2379 2379 border-bottom: 1px solid #DDD;
2380 2380 padding: 10px;
2381 2381 height: 25px;
2382 2382 }
2383 2383
2384 2384 #graph_content #rev_range_container {
2385 2385 padding: 7px 20px;
2386 2386 float: left;
2387 2387 }
2388 2388
2389 2389 #graph_content .container {
2390 2390 border-bottom: 1px solid #DDD;
2391 2391 height: 56px;
2392 2392 overflow: hidden;
2393 2393 }
2394 2394
2395 2395 #graph_content .container .right {
2396 2396 float: right;
2397 2397 width: 23%;
2398 2398 text-align: right;
2399 2399 }
2400 2400
2401 2401 #graph_content .container .left {
2402 2402 float: left;
2403 2403 width: 25%;
2404 2404 padding-left: 5px;
2405 2405 }
2406 2406
2407 2407 #graph_content .container .mid {
2408 2408 float: left;
2409 2409 width: 49%;
2410 2410 }
2411 2411
2412 2412
2413 2413 #graph_content .container .left .date {
2414 2414 color: #666;
2415 2415 padding-left: 22px;
2416 2416 font-size: 10px;
2417 2417 }
2418 2418
2419 2419 #graph_content .container .left .author {
2420 2420 height: 22px;
2421 2421 }
2422 2422
2423 2423 #graph_content .container .left .author .user {
2424 2424 color: #444444;
2425 2425 float: left;
2426 2426 margin-left: -4px;
2427 2427 margin-top: 4px;
2428 2428 }
2429 2429
2430 2430 #graph_content .container .mid .message {
2431 2431 white-space: pre-wrap;
2432 2432 }
2433 2433
2434 2434 #graph_content .container .mid .message a:hover{
2435 2435 text-decoration: none;
2436 2436 }
2437 2437 #content #graph_content .message .revision-link,
2438 2438 #changeset_content .container .message .revision-link
2439 2439 {
2440 2440 color:#3F6F9F;
2441 2441 font-weight: bold !important;
2442 2442 }
2443 2443
2444 2444 #content #graph_content .message .issue-tracker-link,
2445 2445 #changeset_content .container .message .issue-tracker-link{
2446 2446 color:#3F6F9F;
2447 2447 font-weight: bold !important;
2448 2448 }
2449 2449
2450 2450 .right .comments-container{
2451 2451 padding-right: 5px;
2452 2452 margin-top:1px;
2453 2453 float:right;
2454 2454 height:14px;
2455 2455 }
2456 2456
2457 2457 .right .comments-cnt{
2458 2458 float: left;
2459 2459 color: rgb(136, 136, 136);
2460 2460 padding-right: 2px;
2461 2461 }
2462 2462
2463 2463 .right .changes{
2464 2464 clear: both;
2465 2465 }
2466 2466
2467 2467 .right .changes .changed_total {
2468 2468 display: block;
2469 2469 float: right;
2470 2470 text-align: center;
2471 2471 min-width: 45px;
2472 2472 cursor: pointer;
2473 2473 color: #444444;
2474 2474 background: #FEA;
2475 2475 -webkit-border-radius: 0px 0px 0px 6px;
2476 2476 -moz-border-radius: 0px 0px 0px 6px;
2477 2477 border-radius: 0px 0px 0px 6px;
2478 2478 padding: 1px;
2479 2479 }
2480 2480
2481 2481 .right .changes .added,.changed,.removed {
2482 2482 display: block;
2483 2483 padding: 1px;
2484 2484 color: #444444;
2485 2485 float: right;
2486 2486 text-align: center;
2487 2487 min-width: 15px;
2488 2488 }
2489 2489
2490 2490 .right .changes .added {
2491 2491 background: #CFC;
2492 2492 }
2493 2493
2494 2494 .right .changes .changed {
2495 2495 background: #FEA;
2496 2496 }
2497 2497
2498 2498 .right .changes .removed {
2499 2499 background: #FAA;
2500 2500 }
2501 2501
2502 2502 .right .merge {
2503 2503 padding: 1px 3px 1px 3px;
2504 2504 background-color: #fca062;
2505 2505 font-size: 10px;
2506 2506 font-weight: bold;
2507 2507 color: #ffffff;
2508 2508 text-transform: uppercase;
2509 2509 white-space: nowrap;
2510 2510 -webkit-border-radius: 3px;
2511 2511 -moz-border-radius: 3px;
2512 2512 border-radius: 3px;
2513 2513 margin-right: 2px;
2514 2514 }
2515 2515
2516 2516 .right .parent {
2517 2517 color: #666666;
2518 2518 clear:both;
2519 2519 }
2520 2520 .right .logtags{
2521 2521 padding: 2px 2px 2px 2px;
2522 2522 }
2523 2523 .right .logtags .branchtag,.logtags .branchtag {
2524 2524 padding: 1px 3px 1px 3px;
2525 2525 background-color: #bfbfbf;
2526 2526 font-size: 10px;
2527 2527 font-weight: bold;
2528 2528 color: #ffffff;
2529 2529 text-transform: uppercase;
2530 2530 white-space: nowrap;
2531 2531 -webkit-border-radius: 3px;
2532 2532 -moz-border-radius: 3px;
2533 2533 border-radius: 3px;
2534 2534 }
2535 2535 .right .logtags .branchtag a:hover,.logtags .branchtag a{
2536 2536 color: #ffffff;
2537 2537 }
2538 2538 .right .logtags .branchtag a:hover,.logtags .branchtag a:hover{
2539 2539 text-decoration: none;
2540 2540 color: #ffffff;
2541 2541 }
2542 2542 .right .logtags .tagtag,.logtags .tagtag {
2543 2543 padding: 1px 3px 1px 3px;
2544 2544 background-color: #62cffc;
2545 2545 font-size: 10px;
2546 2546 font-weight: bold;
2547 2547 color: #ffffff;
2548 2548 text-transform: uppercase;
2549 2549 white-space: nowrap;
2550 2550 -webkit-border-radius: 3px;
2551 2551 -moz-border-radius: 3px;
2552 2552 border-radius: 3px;
2553 2553 }
2554 2554 .right .logtags .tagtag a:hover,.logtags .tagtag a{
2555 2555 color: #ffffff;
2556 2556 }
2557 2557 .right .logtags .tagtag a:hover,.logtags .tagtag a:hover{
2558 2558 text-decoration: none;
2559 2559 color: #ffffff;
2560 2560 }
2561 2561 .right .logbooks .bookbook,.logbooks .bookbook {
2562 2562 padding: 1px 3px 2px;
2563 2563 background-color: #46A546;
2564 2564 font-size: 9.75px;
2565 2565 font-weight: bold;
2566 2566 color: #ffffff;
2567 2567 text-transform: uppercase;
2568 2568 white-space: nowrap;
2569 2569 -webkit-border-radius: 3px;
2570 2570 -moz-border-radius: 3px;
2571 2571 border-radius: 3px;
2572 2572 }
2573 2573 .right .logbooks .bookbook,.logbooks .bookbook a{
2574 2574 color: #ffffff;
2575 2575 }
2576 2576 .right .logbooks .bookbook,.logbooks .bookbook a:hover{
2577 2577 text-decoration: none;
2578 2578 color: #ffffff;
2579 2579 }
2580 2580 div.browserblock {
2581 2581 overflow: hidden;
2582 2582 border: 1px solid #ccc;
2583 2583 background: #f8f8f8;
2584 2584 font-size: 100%;
2585 2585 line-height: 125%;
2586 2586 padding: 0;
2587 2587 -webkit-border-radius: 6px 6px 0px 0px;
2588 2588 -moz-border-radius: 6px 6px 0px 0px;
2589 2589 border-radius: 6px 6px 0px 0px;
2590 2590 }
2591 2591
2592 2592 div.browserblock .browser-header {
2593 2593 background: #FFF;
2594 2594 padding: 10px 0px 15px 0px;
2595 2595 width: 100%;
2596 2596 }
2597 2597
2598 2598 div.browserblock .browser-nav {
2599 2599 float: left
2600 2600 }
2601 2601
2602 2602 div.browserblock .browser-branch {
2603 2603 float: left;
2604 2604 }
2605 2605
2606 2606 div.browserblock .browser-branch label {
2607 2607 color: #4A4A4A;
2608 2608 vertical-align: text-top;
2609 2609 }
2610 2610
2611 2611 div.browserblock .browser-header span {
2612 2612 margin-left: 5px;
2613 2613 font-weight: 700;
2614 2614 }
2615 2615
2616 2616 div.browserblock .browser-search {
2617 2617 clear: both;
2618 2618 padding: 8px 8px 0px 5px;
2619 2619 height: 20px;
2620 2620 }
2621 2621
2622 2622 div.browserblock #node_filter_box {
2623 2623
2624 2624 }
2625 2625
2626 2626 div.browserblock .search_activate {
2627 2627 float: left
2628 2628 }
2629 2629
2630 2630 div.browserblock .add_node {
2631 2631 float: left;
2632 2632 padding-left: 5px;
2633 2633 }
2634 2634
2635 2635 div.browserblock .search_activate a:hover,div.browserblock .add_node a:hover
2636 2636 {
2637 2637 text-decoration: none !important;
2638 2638 }
2639 2639
2640 2640 div.browserblock .browser-body {
2641 2641 background: #EEE;
2642 2642 border-top: 1px solid #CCC;
2643 2643 }
2644 2644
2645 2645 table.code-browser {
2646 2646 border-collapse: collapse;
2647 2647 width: 100%;
2648 2648 }
2649 2649
2650 2650 table.code-browser tr {
2651 2651 margin: 3px;
2652 2652 }
2653 2653
2654 2654 table.code-browser thead th {
2655 2655 background-color: #EEE;
2656 2656 height: 20px;
2657 2657 font-size: 1.1em;
2658 2658 font-weight: 700;
2659 2659 text-align: left;
2660 2660 padding-left: 10px;
2661 2661 }
2662 2662
2663 2663 table.code-browser tbody td {
2664 2664 padding-left: 10px;
2665 2665 height: 20px;
2666 2666 }
2667 2667
2668 2668 table.code-browser .browser-file {
2669 2669 background: url("../images/icons/document_16.png") no-repeat scroll 3px;
2670 2670 height: 16px;
2671 2671 padding-left: 20px;
2672 2672 text-align: left;
2673 2673 }
2674 2674 .diffblock .changeset_header {
2675 2675 height: 16px;
2676 2676 }
2677 2677 .diffblock .changeset_file {
2678 2678 background: url("../images/icons/file.png") no-repeat scroll 3px;
2679 2679 text-align: left;
2680 2680 float: left;
2681 2681 padding: 2px 0px 2px 22px;
2682 2682 }
2683 2683 .diffblock .diff-menu-wrapper{
2684 2684 float: left;
2685 2685 }
2686 2686
2687 2687 .diffblock .diff-menu{
2688 2688 position: absolute;
2689 2689 background: none repeat scroll 0 0 #FFFFFF;
2690 2690 border-color: #003367 #666666 #666666;
2691 2691 border-right: 1px solid #666666;
2692 2692 border-style: solid solid solid;
2693 2693 border-width: 1px;
2694 2694 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
2695 2695 margin-top:5px;
2696 2696 margin-left:1px;
2697 2697
2698 2698 }
2699 2699 .diffblock .diff-actions {
2700 2700 padding: 2px 0px 0px 2px;
2701 2701 float: left;
2702 2702 }
2703 2703 .diffblock .diff-menu ul li {
2704 2704 padding: 0px 0px 0px 0px !important;
2705 2705 }
2706 2706 .diffblock .diff-menu ul li a{
2707 2707 display: block;
2708 2708 padding: 3px 8px 3px 8px !important;
2709 2709 }
2710 2710 .diffblock .diff-menu ul li a:hover{
2711 2711 text-decoration: none;
2712 2712 background-color: #EEEEEE;
2713 2713 }
2714 2714 table.code-browser .browser-dir {
2715 2715 background: url("../images/icons/folder_16.png") no-repeat scroll 3px;
2716 2716 height: 16px;
2717 2717 padding-left: 20px;
2718 2718 text-align: left;
2719 2719 }
2720 2720
2721 table.code-browser .submodule-dir {
2722 background: url("../images/icons/disconnect.png") no-repeat scroll 3px;
2723 height: 16px;
2724 padding-left: 20px;
2725 text-align: left;
2726 }
2727
2728
2721 2729 .box .search {
2722 2730 clear: both;
2723 2731 overflow: hidden;
2724 2732 margin: 0;
2725 2733 padding: 0 20px 10px;
2726 2734 }
2727 2735
2728 2736 .box .search div.search_path {
2729 2737 background: none repeat scroll 0 0 #EEE;
2730 2738 border: 1px solid #CCC;
2731 2739 color: blue;
2732 2740 margin-bottom: 10px;
2733 2741 padding: 10px 0;
2734 2742 }
2735 2743
2736 2744 .box .search div.search_path div.link {
2737 2745 font-weight: 700;
2738 2746 margin-left: 25px;
2739 2747 }
2740 2748
2741 2749 .box .search div.search_path div.link a {
2742 2750 color: #003367;
2743 2751 cursor: pointer;
2744 2752 text-decoration: none;
2745 2753 }
2746 2754
2747 2755 #path_unlock {
2748 2756 color: red;
2749 2757 font-size: 1.2em;
2750 2758 padding-left: 4px;
2751 2759 }
2752 2760
2753 2761 .info_box span {
2754 2762 margin-left: 3px;
2755 2763 margin-right: 3px;
2756 2764 }
2757 2765
2758 2766 .info_box .rev {
2759 2767 color: #003367;
2760 2768 font-size: 1.6em;
2761 2769 font-weight: bold;
2762 2770 vertical-align: sub;
2763 2771 }
2764 2772
2765 2773 .info_box input#at_rev,.info_box input#size {
2766 2774 background: #FFF;
2767 2775 border-top: 1px solid #b3b3b3;
2768 2776 border-left: 1px solid #b3b3b3;
2769 2777 border-right: 1px solid #eaeaea;
2770 2778 border-bottom: 1px solid #eaeaea;
2771 2779 color: #000;
2772 2780 font-size: 12px;
2773 2781 margin: 0;
2774 2782 padding: 1px 5px 1px;
2775 2783 }
2776 2784
2777 2785 .info_box input#view {
2778 2786 text-align: center;
2779 2787 padding: 4px 3px 2px 2px;
2780 2788 }
2781 2789
2782 2790 .yui-overlay,.yui-panel-container {
2783 2791 visibility: hidden;
2784 2792 position: absolute;
2785 2793 z-index: 2;
2786 2794 }
2787 2795
2788 2796 .yui-tt {
2789 2797 visibility: hidden;
2790 2798 position: absolute;
2791 2799 color: #666;
2792 2800 background-color: #FFF;
2793 2801 border: 2px solid #003367;
2794 2802 font: 100% sans-serif;
2795 2803 width: auto;
2796 2804 opacity: 1px;
2797 2805 padding: 8px;
2798 2806 white-space: pre-wrap;
2799 2807 -webkit-border-radius: 8px 8px 8px 8px;
2800 2808 -khtml-border-radius: 8px 8px 8px 8px;
2801 2809 -moz-border-radius: 8px 8px 8px 8px;
2802 2810 border-radius: 8px 8px 8px 8px;
2803 2811 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
2804 2812 }
2805 2813
2806 2814 .ac {
2807 2815 vertical-align: top;
2808 2816 }
2809 2817
2810 2818 .ac .yui-ac {
2811 2819 position: inherit;
2812 2820 font-size: 100%;
2813 2821 }
2814 2822
2815 2823 .ac .perm_ac {
2816 2824 width: 20em;
2817 2825 }
2818 2826
2819 2827 .ac .yui-ac-input {
2820 2828 width: 100%;
2821 2829 }
2822 2830
2823 2831 .ac .yui-ac-container {
2824 2832 position: absolute;
2825 2833 top: 1.6em;
2826 2834 width: auto;
2827 2835 }
2828 2836
2829 2837 .ac .yui-ac-content {
2830 2838 position: absolute;
2831 2839 border: 1px solid gray;
2832 2840 background: #fff;
2833 2841 z-index: 9050;
2834 2842
2835 2843 }
2836 2844
2837 2845 .ac .yui-ac-shadow {
2838 2846 position: absolute;
2839 2847 width: 100%;
2840 2848 background: #000;
2841 2849 -moz-opacity: 0.1px;
2842 2850 opacity: .10;
2843 2851 filter: alpha(opacity = 10);
2844 2852 z-index: 9049;
2845 2853 margin: .3em;
2846 2854 }
2847 2855
2848 2856 .ac .yui-ac-content ul {
2849 2857 width: 100%;
2850 2858 margin: 0;
2851 2859 padding: 0;
2852 2860 z-index: 9050;
2853 2861 }
2854 2862
2855 2863 .ac .yui-ac-content li {
2856 2864 cursor: default;
2857 2865 white-space: nowrap;
2858 2866 margin: 0;
2859 2867 padding: 2px 5px;
2860 2868 height: 18px;
2861 2869 z-index: 9050;
2862 2870 display: block;
2863 2871 width: auto !important;
2864 2872 }
2865 2873
2866 2874 .ac .yui-ac-content li .ac-container-wrap{
2867 2875 width: auto;
2868 2876 }
2869 2877
2870 2878 .ac .yui-ac-content li.yui-ac-prehighlight {
2871 2879 background: #B3D4FF;
2872 2880 z-index: 9050;
2873 2881 }
2874 2882
2875 2883 .ac .yui-ac-content li.yui-ac-highlight {
2876 2884 background: #556CB5;
2877 2885 color: #FFF;
2878 2886 z-index: 9050;
2879 2887 }
2880 2888 .ac .yui-ac-bd{
2881 2889 z-index: 9050;
2882 2890 }
2883 2891
2884 2892 .follow {
2885 2893 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
2886 2894 height: 16px;
2887 2895 width: 20px;
2888 2896 cursor: pointer;
2889 2897 display: block;
2890 2898 float: right;
2891 2899 margin-top: 2px;
2892 2900 }
2893 2901
2894 2902 .following {
2895 2903 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
2896 2904 height: 16px;
2897 2905 width: 20px;
2898 2906 cursor: pointer;
2899 2907 display: block;
2900 2908 float: right;
2901 2909 margin-top: 2px;
2902 2910 }
2903 2911
2904 2912 .currently_following {
2905 2913 padding-left: 10px;
2906 2914 padding-bottom: 5px;
2907 2915 }
2908 2916
2909 2917 .add_icon {
2910 2918 background: url("../images/icons/add.png") no-repeat scroll 3px;
2911 2919 padding-left: 20px;
2912 2920 padding-top: 0px;
2913 2921 text-align: left;
2914 2922 }
2915 2923
2916 2924 .edit_icon {
2917 2925 background: url("../images/icons/folder_edit.png") no-repeat scroll 3px;
2918 2926 padding-left: 20px;
2919 2927 padding-top: 0px;
2920 2928 text-align: left;
2921 2929 }
2922 2930
2923 2931 .delete_icon {
2924 2932 background: url("../images/icons/delete.png") no-repeat scroll 3px;
2925 2933 padding-left: 20px;
2926 2934 padding-top: 0px;
2927 2935 text-align: left;
2928 2936 }
2929 2937
2930 2938 .refresh_icon {
2931 2939 background: url("../images/icons/arrow_refresh.png") no-repeat scroll
2932 2940 3px;
2933 2941 padding-left: 20px;
2934 2942 padding-top: 0px;
2935 2943 text-align: left;
2936 2944 }
2937 2945
2938 2946 .pull_icon {
2939 2947 background: url("../images/icons/connect.png") no-repeat scroll 3px;
2940 2948 padding-left: 20px;
2941 2949 padding-top: 0px;
2942 2950 text-align: left;
2943 2951 }
2944 2952
2945 2953 .rss_icon {
2946 2954 background: url("../images/icons/rss_16.png") no-repeat scroll 3px;
2947 2955 padding-left: 20px;
2948 2956 padding-top: 4px;
2949 2957 text-align: left;
2950 2958 font-size: 8px
2951 2959 }
2952 2960
2953 2961 .atom_icon {
2954 2962 background: url("../images/icons/atom.png") no-repeat scroll 3px;
2955 2963 padding-left: 20px;
2956 2964 padding-top: 4px;
2957 2965 text-align: left;
2958 2966 font-size: 8px
2959 2967 }
2960 2968
2961 2969 .archive_icon {
2962 2970 background: url("../images/icons/compress.png") no-repeat scroll 3px;
2963 2971 padding-left: 20px;
2964 2972 text-align: left;
2965 2973 padding-top: 1px;
2966 2974 }
2967 2975
2968 2976 .start_following_icon {
2969 2977 background: url("../images/icons/heart_add.png") no-repeat scroll 3px;
2970 2978 padding-left: 20px;
2971 2979 text-align: left;
2972 2980 padding-top: 0px;
2973 2981 }
2974 2982
2975 2983 .stop_following_icon {
2976 2984 background: url("../images/icons/heart_delete.png") no-repeat scroll 3px;
2977 2985 padding-left: 20px;
2978 2986 text-align: left;
2979 2987 padding-top: 0px;
2980 2988 }
2981 2989
2982 2990 .action_button {
2983 2991 border: 0;
2984 2992 display: inline;
2985 2993 }
2986 2994
2987 2995 .action_button:hover {
2988 2996 border: 0;
2989 2997 text-decoration: underline;
2990 2998 cursor: pointer;
2991 2999 }
2992 3000
2993 3001 #switch_repos {
2994 3002 position: absolute;
2995 3003 height: 25px;
2996 3004 z-index: 1;
2997 3005 }
2998 3006
2999 3007 #switch_repos select {
3000 3008 min-width: 150px;
3001 3009 max-height: 250px;
3002 3010 z-index: 1;
3003 3011 }
3004 3012
3005 3013 .breadcrumbs {
3006 3014 border: medium none;
3007 3015 color: #FFF;
3008 3016 float: left;
3009 3017 text-transform: uppercase;
3010 3018 font-weight: 700;
3011 3019 font-size: 14px;
3012 3020 margin: 0;
3013 3021 padding: 11px 0 11px 10px;
3014 3022 }
3015 3023
3016 3024 .breadcrumbs .hash {
3017 3025 text-transform: none;
3018 3026 color: #fff;
3019 3027 }
3020 3028
3021 3029 .breadcrumbs a {
3022 3030 color: #FFF;
3023 3031 }
3024 3032
3025 3033 .flash_msg {
3026 3034
3027 3035 }
3028 3036
3029 3037 .flash_msg ul {
3030 3038
3031 3039 }
3032 3040
3033 3041 .error_msg {
3034 3042 background-color: #c43c35;
3035 3043 background-repeat: repeat-x;
3036 3044 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35) );
3037 3045 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3038 3046 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3039 3047 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35) );
3040 3048 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3041 3049 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3042 3050 background-image: linear-gradient(top, #ee5f5b, #c43c35);
3043 3051 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b',endColorstr='#c43c35', GradientType=0 );
3044 3052 border-color: #c43c35 #c43c35 #882a25;
3045 3053 }
3046 3054
3047 3055 .warning_msg {
3048 3056 color: #404040 !important;
3049 3057 background-color: #eedc94;
3050 3058 background-repeat: repeat-x;
3051 3059 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94) );
3052 3060 background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
3053 3061 background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
3054 3062 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94) );
3055 3063 background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
3056 3064 background-image: -o-linear-gradient(top, #fceec1, #eedc94);
3057 3065 background-image: linear-gradient(top, #fceec1, #eedc94);
3058 3066 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0 );
3059 3067 border-color: #eedc94 #eedc94 #e4c652;
3060 3068 }
3061 3069
3062 3070 .success_msg {
3063 3071 background-color: #57a957;
3064 3072 background-repeat: repeat-x !important;
3065 3073 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957) );
3066 3074 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3067 3075 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3068 3076 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957) );
3069 3077 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3070 3078 background-image: -o-linear-gradient(top, #62c462, #57a957);
3071 3079 background-image: linear-gradient(top, #62c462, #57a957);
3072 3080 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0 );
3073 3081 border-color: #57a957 #57a957 #3d773d;
3074 3082 }
3075 3083
3076 3084 .notice_msg {
3077 3085 background-color: #339bb9;
3078 3086 background-repeat: repeat-x;
3079 3087 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9) );
3080 3088 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3081 3089 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3082 3090 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9) );
3083 3091 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3084 3092 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3085 3093 background-image: linear-gradient(top, #5bc0de, #339bb9);
3086 3094 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0 );
3087 3095 border-color: #339bb9 #339bb9 #22697d;
3088 3096 }
3089 3097
3090 3098 .success_msg,.error_msg,.notice_msg,.warning_msg {
3091 3099 font-size: 12px;
3092 3100 font-weight: 700;
3093 3101 min-height: 14px;
3094 3102 line-height: 14px;
3095 3103 margin-bottom: 10px;
3096 3104 margin-top: 0;
3097 3105 display: block;
3098 3106 overflow: auto;
3099 3107 padding: 6px 10px 6px 10px;
3100 3108 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3101 3109 position: relative;
3102 3110 color: #FFF;
3103 3111 border-width: 1px;
3104 3112 border-style: solid;
3105 3113 -webkit-border-radius: 4px;
3106 3114 -moz-border-radius: 4px;
3107 3115 border-radius: 4px;
3108 3116 -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3109 3117 -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3110 3118 box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3111 3119 }
3112 3120
3113 3121 #msg_close {
3114 3122 background: transparent url("../icons/cross_grey_small.png") no-repeat scroll 0 0;
3115 3123 cursor: pointer;
3116 3124 height: 16px;
3117 3125 position: absolute;
3118 3126 right: 5px;
3119 3127 top: 5px;
3120 3128 width: 16px;
3121 3129 }
3122 3130 div#legend_data{
3123 3131 padding-left:10px;
3124 3132 }
3125 3133 div#legend_container table{
3126 3134 border: none !important;
3127 3135 }
3128 3136 div#legend_container table,div#legend_choices table {
3129 3137 width: auto !important;
3130 3138 }
3131 3139
3132 3140 table#permissions_manage {
3133 3141 width: 0 !important;
3134 3142 }
3135 3143
3136 3144 table#permissions_manage span.private_repo_msg {
3137 3145 font-size: 0.8em;
3138 3146 opacity: 0.6px;
3139 3147 }
3140 3148
3141 3149 table#permissions_manage td.private_repo_msg {
3142 3150 font-size: 0.8em;
3143 3151 }
3144 3152
3145 3153 table#permissions_manage tr#add_perm_input td {
3146 3154 vertical-align: middle;
3147 3155 }
3148 3156
3149 3157 div.gravatar {
3150 3158 background-color: #FFF;
3151 3159 float: left;
3152 3160 margin-right: 0.7em;
3153 3161 padding: 1px 1px 1px 1px;
3154 3162 line-height:0;
3155 3163 -webkit-border-radius: 3px;
3156 3164 -khtml-border-radius: 3px;
3157 3165 -moz-border-radius: 3px;
3158 3166 border-radius: 3px;
3159 3167 }
3160 3168
3161 3169 div.gravatar img {
3162 3170 -webkit-border-radius: 2px;
3163 3171 -khtml-border-radius: 2px;
3164 3172 -moz-border-radius: 2px;
3165 3173 border-radius: 2px;
3166 3174 }
3167 3175
3168 3176 #header,#content,#footer {
3169 3177 min-width: 978px;
3170 3178 }
3171 3179
3172 3180 #content {
3173 3181 clear: both;
3174 3182 overflow: hidden;
3175 3183 padding: 54px 10px 14px 10px;
3176 3184 }
3177 3185
3178 3186 #content div.box div.title div.search {
3179 3187
3180 3188 border-left: 1px solid #316293;
3181 3189 }
3182 3190
3183 3191 #content div.box div.title div.search div.input input {
3184 3192 border: 1px solid #316293;
3185 3193 }
3186 3194
3187 3195 .ui-btn{
3188 3196 color: #515151;
3189 3197 background-color: #DADADA;
3190 3198 background-repeat: repeat-x;
3191 3199 background-image: -khtml-gradient(linear, left top, left bottom, from(#F4F4F4),to(#DADADA) );
3192 3200 background-image: -moz-linear-gradient(top, #F4F4F4, #DADADA);
3193 3201 background-image: -ms-linear-gradient(top, #F4F4F4, #DADADA);
3194 3202 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #F4F4F4),color-stop(100%, #DADADA) );
3195 3203 background-image: -webkit-linear-gradient(top, #F4F4F4, #DADADA) );
3196 3204 background-image: -o-linear-gradient(top, #F4F4F4, #DADADA) );
3197 3205 background-image: linear-gradient(top, #F4F4F4, #DADADA);
3198 3206 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F4F4F4', endColorstr='#DADADA', GradientType=0);
3199 3207
3200 3208 border-top: 1px solid #DDD;
3201 3209 border-left: 1px solid #c6c6c6;
3202 3210 border-right: 1px solid #DDD;
3203 3211 border-bottom: 1px solid #c6c6c6;
3204 3212 color: #515151;
3205 3213 outline: none;
3206 3214 margin: 0px 3px 3px 0px;
3207 3215 -webkit-border-radius: 4px 4px 4px 4px !important;
3208 3216 -khtml-border-radius: 4px 4px 4px 4px !important;
3209 3217 -moz-border-radius: 4px 4px 4px 4px !important;
3210 3218 border-radius: 4px 4px 4px 4px !important;
3211 3219 cursor: pointer !important;
3212 3220 padding: 3px 3px 3px 3px;
3213 3221 background-position: 0 -15px;
3214 3222
3215 3223 }
3216 3224 .ui-btn.xsmall{
3217 3225 padding: 1px 2px 1px 1px;
3218 3226 }
3219 3227 .ui-btn.clone{
3220 3228 padding: 5px 2px 6px 1px;
3221 3229 margin: 0px -4px 3px 0px;
3222 3230 -webkit-border-radius: 4px 0px 0px 4px !important;
3223 3231 -khtml-border-radius: 4px 0px 0px 4px !important;
3224 3232 -moz-border-radius: 4px 0px 0px 4px !important;
3225 3233 border-radius: 4px 0px 0px 4px !important;
3226 3234 width: 100px;
3227 3235 text-align: center;
3228 3236 float: left;
3229 3237 position: absolute;
3230 3238 }
3231 3239 .ui-btn:focus {
3232 3240 outline: none;
3233 3241 }
3234 3242 .ui-btn:hover{
3235 3243 background-position: 0 0px;
3236 3244 text-decoration: none;
3237 3245 color: #515151;
3238 3246 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 0 3px #FFFFFF !important;
3239 3247 }
3240 3248
3241 3249 .ui-btn.red{
3242 3250 color:#fff;
3243 3251 background-color: #c43c35;
3244 3252 background-repeat: repeat-x;
3245 3253 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
3246 3254 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3247 3255 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3248 3256 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
3249 3257 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3250 3258 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3251 3259 background-image: linear-gradient(top, #ee5f5b, #c43c35);
3252 3260 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
3253 3261 border-color: #c43c35 #c43c35 #882a25;
3254 3262 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3255 3263 }
3256 3264
3257 3265
3258 3266 .ui-btn.blue{
3259 3267 background-color: #339bb9;
3260 3268 background-repeat: repeat-x;
3261 3269 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
3262 3270 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3263 3271 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3264 3272 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
3265 3273 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3266 3274 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3267 3275 background-image: linear-gradient(top, #5bc0de, #339bb9);
3268 3276 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
3269 3277 border-color: #339bb9 #339bb9 #22697d;
3270 3278 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3271 3279 }
3272 3280
3273 3281 .ui-btn.green{
3274 3282 background-color: #57a957;
3275 3283 background-repeat: repeat-x;
3276 3284 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
3277 3285 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3278 3286 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3279 3287 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
3280 3288 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3281 3289 background-image: -o-linear-gradient(top, #62c462, #57a957);
3282 3290 background-image: linear-gradient(top, #62c462, #57a957);
3283 3291 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
3284 3292 border-color: #57a957 #57a957 #3d773d;
3285 3293 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3286 3294 }
3287 3295
3288 3296 ins,div.options a:hover {
3289 3297 text-decoration: none;
3290 3298 }
3291 3299
3292 3300 img,
3293 3301 #header #header-inner #quick li a:hover span.normal,
3294 3302 #header #header-inner #quick li ul li.last,
3295 3303 #content div.box div.form div.fields div.field div.textarea table td table td a,
3296 3304 #clone_url,
3297 3305 #clone_url_id
3298 3306 {
3299 3307 border: none;
3300 3308 }
3301 3309
3302 3310 img.icon,.right .merge img {
3303 3311 vertical-align: bottom;
3304 3312 }
3305 3313
3306 3314 #header ul#logged-user,#content div.box div.title ul.links,
3307 3315 #content div.box div.message div.dismiss,
3308 3316 #content div.box div.traffic div.legend ul
3309 3317 {
3310 3318 float: right;
3311 3319 margin: 0;
3312 3320 padding: 0;
3313 3321 }
3314 3322
3315 3323 #header #header-inner #home,#header #header-inner #logo,
3316 3324 #content div.box ul.left,#content div.box ol.left,
3317 3325 #content div.box div.pagination-left,div#commit_history,
3318 3326 div#legend_data,div#legend_container,div#legend_choices
3319 3327 {
3320 3328 float: left;
3321 3329 }
3322 3330
3323 3331 #header #header-inner #quick li:hover ul ul,
3324 3332 #header #header-inner #quick li:hover ul ul ul,
3325 3333 #header #header-inner #quick li:hover ul ul ul ul,
3326 3334 #content #left #menu ul.closed,#content #left #menu li ul.collapsed,.yui-tt-shadow
3327 3335 {
3328 3336 display: none;
3329 3337 }
3330 3338
3331 3339 #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
3332 3340 {
3333 3341 display: block;
3334 3342 }
3335 3343
3336 3344 #content div.graph {
3337 3345 padding: 0 10px 10px;
3338 3346 }
3339 3347
3340 3348 #content div.box div.title ul.links li a:hover,#content div.box div.title ul.links li.ui-tabs-selected a
3341 3349 {
3342 3350 color: #bfe3ff;
3343 3351 }
3344 3352
3345 3353 #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
3346 3354 {
3347 3355 margin: 10px 24px 10px 44px;
3348 3356 }
3349 3357
3350 3358 #content div.box div.form,#content div.box div.table,#content div.box div.traffic
3351 3359 {
3352 3360 clear: both;
3353 3361 overflow: hidden;
3354 3362 margin: 0;
3355 3363 padding: 0 20px 10px;
3356 3364 }
3357 3365
3358 3366 #content div.box div.form div.fields,#login div.form,#login div.form div.fields,#register div.form,#register div.form div.fields
3359 3367 {
3360 3368 clear: both;
3361 3369 overflow: hidden;
3362 3370 margin: 0;
3363 3371 padding: 0;
3364 3372 }
3365 3373
3366 3374 #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
3367 3375 {
3368 3376 height: 1%;
3369 3377 display: block;
3370 3378 color: #363636;
3371 3379 margin: 0;
3372 3380 padding: 2px 0 0;
3373 3381 }
3374 3382
3375 3383 #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
3376 3384 {
3377 3385 background: #FBE3E4;
3378 3386 border-top: 1px solid #e1b2b3;
3379 3387 border-left: 1px solid #e1b2b3;
3380 3388 border-right: 1px solid #FBC2C4;
3381 3389 border-bottom: 1px solid #FBC2C4;
3382 3390 }
3383 3391
3384 3392 #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
3385 3393 {
3386 3394 background: #E6EFC2;
3387 3395 border-top: 1px solid #cebb98;
3388 3396 border-left: 1px solid #cebb98;
3389 3397 border-right: 1px solid #c6d880;
3390 3398 border-bottom: 1px solid #c6d880;
3391 3399 }
3392 3400
3393 3401 #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
3394 3402 {
3395 3403 margin: 0;
3396 3404 }
3397 3405
3398 3406 #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
3399 3407 {
3400 3408 margin: 0 0 0 0px !important;
3401 3409 padding: 0;
3402 3410 }
3403 3411
3404 3412 #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
3405 3413 {
3406 3414 margin: 0 0 0 200px;
3407 3415 padding: 0;
3408 3416 }
3409 3417
3410 3418 #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
3411 3419 {
3412 3420 color: #000;
3413 3421 text-decoration: none;
3414 3422 }
3415 3423
3416 3424 #content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus,#content div.box div.action a.ui-selectmenu-focus
3417 3425 {
3418 3426 border: 1px solid #666;
3419 3427 }
3420 3428
3421 3429 #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
3422 3430 {
3423 3431 clear: both;
3424 3432 overflow: hidden;
3425 3433 margin: 0;
3426 3434 padding: 8px 0 2px;
3427 3435 }
3428 3436
3429 3437 #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
3430 3438 {
3431 3439 float: left;
3432 3440 margin: 0;
3433 3441 }
3434 3442
3435 3443 #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
3436 3444 {
3437 3445 height: 1%;
3438 3446 display: block;
3439 3447 float: left;
3440 3448 margin: 2px 0 0 4px;
3441 3449 }
3442 3450
3443 3451 div.form div.fields div.field div.button input,#content div.box div.form div.fields div.buttons input,div.form div.fields div.buttons input,#content div.box div.action div.button input
3444 3452 {
3445 3453 color: #000;
3446 3454 font-size: 11px;
3447 3455 font-weight: 700;
3448 3456 margin: 0;
3449 3457 }
3450 3458
3451 3459 input.ui-button {
3452 3460 background: #e5e3e3 url("../images/button.png") repeat-x;
3453 3461 border-top: 1px solid #DDD;
3454 3462 border-left: 1px solid #c6c6c6;
3455 3463 border-right: 1px solid #DDD;
3456 3464 border-bottom: 1px solid #c6c6c6;
3457 3465 color: #515151 !important;
3458 3466 outline: none;
3459 3467 margin: 0;
3460 3468 padding: 6px 12px;
3461 3469 -webkit-border-radius: 4px 4px 4px 4px;
3462 3470 -khtml-border-radius: 4px 4px 4px 4px;
3463 3471 -moz-border-radius: 4px 4px 4px 4px;
3464 3472 border-radius: 4px 4px 4px 4px;
3465 3473 box-shadow: 0 1px 0 #ececec;
3466 3474 cursor: pointer;
3467 3475 }
3468 3476
3469 3477 input.ui-button:hover {
3470 3478 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3471 3479 border-top: 1px solid #ccc;
3472 3480 border-left: 1px solid #bebebe;
3473 3481 border-right: 1px solid #b1b1b1;
3474 3482 border-bottom: 1px solid #afafaf;
3475 3483 }
3476 3484
3477 3485 div.form div.fields div.field div.highlight,#content div.box div.form div.fields div.buttons div.highlight
3478 3486 {
3479 3487 display: inline;
3480 3488 }
3481 3489
3482 3490 #content div.box div.form div.fields div.buttons,div.form div.fields div.buttons
3483 3491 {
3484 3492 margin: 10px 0 0 200px;
3485 3493 padding: 0;
3486 3494 }
3487 3495
3488 3496 #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
3489 3497 {
3490 3498 margin: 10px 0 0;
3491 3499 }
3492 3500
3493 3501 #content div.box table td.user,#content div.box table td.address {
3494 3502 width: 10%;
3495 3503 text-align: center;
3496 3504 }
3497 3505
3498 3506 #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
3499 3507 {
3500 3508 text-align: right;
3501 3509 margin: 6px 0 0;
3502 3510 padding: 0;
3503 3511 }
3504 3512
3505 3513 #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
3506 3514 {
3507 3515 background: #b4b4b4 url("../images/button_selected.png") repeat-x;
3508 3516 border-top: 1px solid #ccc;
3509 3517 border-left: 1px solid #bebebe;
3510 3518 border-right: 1px solid #b1b1b1;
3511 3519 border-bottom: 1px solid #afafaf;
3512 3520 color: #515151;
3513 3521 margin: 0;
3514 3522 padding: 6px 12px;
3515 3523 }
3516 3524
3517 3525 #content div.box div.pagination div.results,#content div.box div.pagination-wh div.results
3518 3526 {
3519 3527 text-align: left;
3520 3528 float: left;
3521 3529 margin: 0;
3522 3530 padding: 0;
3523 3531 }
3524 3532
3525 3533 #content div.box div.pagination div.results span,#content div.box div.pagination-wh div.results span
3526 3534 {
3527 3535 height: 1%;
3528 3536 display: block;
3529 3537 float: left;
3530 3538 background: #ebebeb url("../images/pager.png") repeat-x;
3531 3539 border-top: 1px solid #dedede;
3532 3540 border-left: 1px solid #cfcfcf;
3533 3541 border-right: 1px solid #c4c4c4;
3534 3542 border-bottom: 1px solid #c4c4c4;
3535 3543 color: #4A4A4A;
3536 3544 font-weight: 700;
3537 3545 margin: 0;
3538 3546 padding: 6px 8px;
3539 3547 }
3540 3548
3541 3549 #content div.box div.pagination ul.pager li.disabled,#content div.box div.pagination-wh a.disabled
3542 3550 {
3543 3551 color: #B4B4B4;
3544 3552 padding: 6px;
3545 3553 }
3546 3554
3547 3555 #login,#register {
3548 3556 width: 520px;
3549 3557 margin: 10% auto 0;
3550 3558 padding: 0;
3551 3559 }
3552 3560
3553 3561 #login div.color,#register div.color {
3554 3562 clear: both;
3555 3563 overflow: hidden;
3556 3564 background: #FFF;
3557 3565 margin: 10px auto 0;
3558 3566 padding: 3px 3px 3px 0;
3559 3567 }
3560 3568
3561 3569 #login div.color a,#register div.color a {
3562 3570 width: 20px;
3563 3571 height: 20px;
3564 3572 display: block;
3565 3573 float: left;
3566 3574 margin: 0 0 0 3px;
3567 3575 padding: 0;
3568 3576 }
3569 3577
3570 3578 #login div.title h5,#register div.title h5 {
3571 3579 color: #fff;
3572 3580 margin: 10px;
3573 3581 padding: 0;
3574 3582 }
3575 3583
3576 3584 #login div.form div.fields div.field,#register div.form div.fields div.field
3577 3585 {
3578 3586 clear: both;
3579 3587 overflow: hidden;
3580 3588 margin: 0;
3581 3589 padding: 0 0 10px;
3582 3590 }
3583 3591
3584 3592 #login div.form div.fields div.field span.error-message,#register div.form div.fields div.field span.error-message
3585 3593 {
3586 3594 height: 1%;
3587 3595 display: block;
3588 3596 color: red;
3589 3597 margin: 8px 0 0;
3590 3598 padding: 0;
3591 3599 max-width: 320px;
3592 3600 }
3593 3601
3594 3602 #login div.form div.fields div.field div.label label,#register div.form div.fields div.field div.label label
3595 3603 {
3596 3604 color: #000;
3597 3605 font-weight: 700;
3598 3606 }
3599 3607
3600 3608 #login div.form div.fields div.field div.input,#register div.form div.fields div.field div.input
3601 3609 {
3602 3610 float: left;
3603 3611 margin: 0;
3604 3612 padding: 0;
3605 3613 }
3606 3614
3607 3615 #login div.form div.fields div.field div.checkbox,#register div.form div.fields div.field div.checkbox
3608 3616 {
3609 3617 margin: 0 0 0 184px;
3610 3618 padding: 0;
3611 3619 }
3612 3620
3613 3621 #login div.form div.fields div.field div.checkbox label,#register div.form div.fields div.field div.checkbox label
3614 3622 {
3615 3623 color: #565656;
3616 3624 font-weight: 700;
3617 3625 }
3618 3626
3619 3627 #login div.form div.fields div.buttons input,#register div.form div.fields div.buttons input
3620 3628 {
3621 3629 color: #000;
3622 3630 font-size: 1em;
3623 3631 font-weight: 700;
3624 3632 margin: 0;
3625 3633 }
3626 3634
3627 3635 #changeset_content .container .wrapper,#graph_content .container .wrapper
3628 3636 {
3629 3637 width: 600px;
3630 3638 }
3631 3639
3632 3640 #changeset_content .container .left {
3633 3641 float: left;
3634 3642 width: 75%;
3635 3643 padding-left: 5px;
3636 3644 }
3637 3645
3638 3646 #changeset_content .container .left .date,.ac .match {
3639 3647 font-weight: 700;
3640 3648 padding-top: 5px;
3641 3649 padding-bottom: 5px;
3642 3650 }
3643 3651
3644 3652 div#legend_container table td,div#legend_choices table td {
3645 3653 border: none !important;
3646 3654 height: 20px !important;
3647 3655 padding: 0 !important;
3648 3656 }
3649 3657
3650 3658 .q_filter_box {
3651 3659 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
3652 3660 -webkit-border-radius: 4px;
3653 3661 -moz-border-radius: 4px;
3654 3662 border-radius: 4px;
3655 3663 border: 0 none;
3656 3664 color: #AAAAAA;
3657 3665 margin-bottom: -4px;
3658 3666 margin-top: -4px;
3659 3667 padding-left: 3px;
3660 3668 }
3661 3669
3662 3670 #node_filter {
3663 3671 border: 0px solid #545454;
3664 3672 color: #AAAAAA;
3665 3673 padding-left: 3px;
3666 3674 }
3667 3675
3668 3676
3669 3677 .group_members_wrap{
3670 3678
3671 3679 }
3672 3680
3673 3681 .group_members .group_member{
3674 3682 height: 30px;
3675 3683 padding:0px 0px 0px 10px;
3676 3684 }
3677 3685
3678 3686 /*README STYLE*/
3679 3687
3680 3688 div.readme {
3681 3689 padding:0px;
3682 3690 }
3683 3691
3684 3692 div.readme h2 {
3685 3693 font-weight: normal;
3686 3694 }
3687 3695
3688 3696 div.readme .readme_box {
3689 3697 background-color: #fafafa;
3690 3698 }
3691 3699
3692 3700 div.readme .readme_box {
3693 3701 clear:both;
3694 3702 overflow:hidden;
3695 3703 margin:0;
3696 3704 padding:0 20px 10px;
3697 3705 }
3698 3706
3699 3707 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 {
3700 3708 border-bottom: 0 !important;
3701 3709 margin: 0 !important;
3702 3710 padding: 0 !important;
3703 3711 line-height: 1.5em !important;
3704 3712 }
3705 3713
3706 3714
3707 3715 div.readme .readme_box h1:first-child {
3708 3716 padding-top: .25em !important;
3709 3717 }
3710 3718
3711 3719 div.readme .readme_box h2, div.readme .readme_box h3 {
3712 3720 margin: 1em 0 !important;
3713 3721 }
3714 3722
3715 3723 div.readme .readme_box h2 {
3716 3724 margin-top: 1.5em !important;
3717 3725 border-top: 4px solid #e0e0e0 !important;
3718 3726 padding-top: .5em !important;
3719 3727 }
3720 3728
3721 3729 div.readme .readme_box p {
3722 3730 color: black !important;
3723 3731 margin: 1em 0 !important;
3724 3732 line-height: 1.5em !important;
3725 3733 }
3726 3734
3727 3735 div.readme .readme_box ul {
3728 3736 list-style: disc !important;
3729 3737 margin: 1em 0 1em 2em !important;
3730 3738 }
3731 3739
3732 3740 div.readme .readme_box ol {
3733 3741 list-style: decimal;
3734 3742 margin: 1em 0 1em 2em !important;
3735 3743 }
3736 3744
3737 3745 div.readme .readme_box pre, code {
3738 3746 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
3739 3747 }
3740 3748
3741 3749 div.readme .readme_box code {
3742 3750 font-size: 12px !important;
3743 3751 background-color: ghostWhite !important;
3744 3752 color: #444 !important;
3745 3753 padding: 0 .2em !important;
3746 3754 border: 1px solid #dedede !important;
3747 3755 }
3748 3756
3749 3757 div.readme .readme_box pre code {
3750 3758 padding: 0 !important;
3751 3759 font-size: 12px !important;
3752 3760 background-color: #eee !important;
3753 3761 border: none !important;
3754 3762 }
3755 3763
3756 3764 div.readme .readme_box pre {
3757 3765 margin: 1em 0;
3758 3766 font-size: 12px;
3759 3767 background-color: #eee;
3760 3768 border: 1px solid #ddd;
3761 3769 padding: 5px;
3762 3770 color: #444;
3763 3771 overflow: auto;
3764 3772 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
3765 3773 -webkit-border-radius: 3px;
3766 3774 -moz-border-radius: 3px;
3767 3775 border-radius: 3px;
3768 3776 }
3769 3777
3770 3778
3771 3779 /** RST STYLE **/
3772 3780
3773 3781
3774 3782 div.rst-block {
3775 3783 padding:0px;
3776 3784 }
3777 3785
3778 3786 div.rst-block h2 {
3779 3787 font-weight: normal;
3780 3788 }
3781 3789
3782 3790 div.rst-block {
3783 3791 background-color: #fafafa;
3784 3792 }
3785 3793
3786 3794 div.rst-block {
3787 3795 clear:both;
3788 3796 overflow:hidden;
3789 3797 margin:0;
3790 3798 padding:0 20px 10px;
3791 3799 }
3792 3800
3793 3801 div.rst-block h1, div.rst-block h2, div.rst-block h3, div.rst-block h4, div.rst-block h5, div.rst-block h6 {
3794 3802 border-bottom: 0 !important;
3795 3803 margin: 0 !important;
3796 3804 padding: 0 !important;
3797 3805 line-height: 1.5em !important;
3798 3806 }
3799 3807
3800 3808
3801 3809 div.rst-block h1:first-child {
3802 3810 padding-top: .25em !important;
3803 3811 }
3804 3812
3805 3813 div.rst-block h2, div.rst-block h3 {
3806 3814 margin: 1em 0 !important;
3807 3815 }
3808 3816
3809 3817 div.rst-block h2 {
3810 3818 margin-top: 1.5em !important;
3811 3819 border-top: 4px solid #e0e0e0 !important;
3812 3820 padding-top: .5em !important;
3813 3821 }
3814 3822
3815 3823 div.rst-block p {
3816 3824 color: black !important;
3817 3825 margin: 1em 0 !important;
3818 3826 line-height: 1.5em !important;
3819 3827 }
3820 3828
3821 3829 div.rst-block ul {
3822 3830 list-style: disc !important;
3823 3831 margin: 1em 0 1em 2em !important;
3824 3832 }
3825 3833
3826 3834 div.rst-block ol {
3827 3835 list-style: decimal;
3828 3836 margin: 1em 0 1em 2em !important;
3829 3837 }
3830 3838
3831 3839 div.rst-block pre, code {
3832 3840 font: 12px "Bitstream Vera Sans Mono","Courier",monospace;
3833 3841 }
3834 3842
3835 3843 div.rst-block code {
3836 3844 font-size: 12px !important;
3837 3845 background-color: ghostWhite !important;
3838 3846 color: #444 !important;
3839 3847 padding: 0 .2em !important;
3840 3848 border: 1px solid #dedede !important;
3841 3849 }
3842 3850
3843 3851 div.rst-block pre code {
3844 3852 padding: 0 !important;
3845 3853 font-size: 12px !important;
3846 3854 background-color: #eee !important;
3847 3855 border: none !important;
3848 3856 }
3849 3857
3850 3858 div.rst-block pre {
3851 3859 margin: 1em 0;
3852 3860 font-size: 12px;
3853 3861 background-color: #eee;
3854 3862 border: 1px solid #ddd;
3855 3863 padding: 5px;
3856 3864 color: #444;
3857 3865 overflow: auto;
3858 3866 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
3859 3867 -webkit-border-radius: 3px;
3860 3868 -moz-border-radius: 3px;
3861 3869 border-radius: 3px;
3862 3870 }
3863 3871
3864 3872
3865 3873 /** comment main **/
3866 3874 .comments {
3867 3875 padding:10px 20px;
3868 3876 }
3869 3877
3870 3878 .comments .comment {
3871 3879 border: 1px solid #ddd;
3872 3880 margin-top: 10px;
3873 3881 -webkit-border-radius: 4px;
3874 3882 -moz-border-radius: 4px;
3875 3883 border-radius: 4px;
3876 3884 }
3877 3885
3878 3886 .comments .comment .meta {
3879 3887 background: #f8f8f8;
3880 3888 padding: 4px;
3881 3889 border-bottom: 1px solid #ddd;
3882 3890 }
3883 3891
3884 3892 .comments .comment .meta img {
3885 3893 vertical-align: middle;
3886 3894 }
3887 3895
3888 3896 .comments .comment .meta .user {
3889 3897 font-weight: bold;
3890 3898 }
3891 3899
3892 3900 .comments .comment .meta .date {
3893 3901 }
3894 3902
3895 3903 .comments .comment .text {
3896 3904 background-color: #FAFAFA;
3897 3905 }
3898 3906 .comment .text div.rst-block p {
3899 3907 margin: 0.5em 0px !important;
3900 3908 }
3901 3909
3902 3910 .comments .comments-number{
3903 3911 padding:0px 0px 10px 0px;
3904 3912 font-weight: bold;
3905 3913 color: #666;
3906 3914 font-size: 16px;
3907 3915 }
3908 3916
3909 3917 /** comment form **/
3910 3918
3911 3919 .comment-form .clearfix{
3912 3920 background: #EEE;
3913 3921 -webkit-border-radius: 4px;
3914 3922 -moz-border-radius: 4px;
3915 3923 border-radius: 4px;
3916 3924 padding: 10px;
3917 3925 }
3918 3926
3919 3927 div.comment-form {
3920 3928 margin-top: 20px;
3921 3929 }
3922 3930
3923 3931 .comment-form strong {
3924 3932 display: block;
3925 3933 margin-bottom: 15px;
3926 3934 }
3927 3935
3928 3936 .comment-form textarea {
3929 3937 width: 100%;
3930 3938 height: 100px;
3931 3939 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
3932 3940 }
3933 3941
3934 3942 form.comment-form {
3935 3943 margin-top: 10px;
3936 3944 margin-left: 10px;
3937 3945 }
3938 3946
3939 3947 .comment-form-submit {
3940 3948 margin-top: 5px;
3941 3949 margin-left: 525px;
3942 3950 }
3943 3951
3944 3952 .file-comments {
3945 3953 display: none;
3946 3954 }
3947 3955
3948 3956 .comment-form .comment {
3949 3957 margin-left: 10px;
3950 3958 }
3951 3959
3952 3960 .comment-form .comment-help{
3953 3961 padding: 0px 0px 5px 0px;
3954 3962 color: #666;
3955 3963 }
3956 3964
3957 3965 .comment-form .comment-button{
3958 3966 padding-top:5px;
3959 3967 }
3960 3968
3961 3969 .add-another-button {
3962 3970 margin-left: 10px;
3963 3971 margin-top: 10px;
3964 3972 margin-bottom: 10px;
3965 3973 }
3966 3974
3967 3975 .comment .buttons {
3968 3976 float: right;
3969 3977 padding:2px 2px 0px 0px;
3970 3978 }
3971 3979
3972 3980
3973 3981 .show-inline-comments{
3974 3982 position: relative;
3975 3983 top:1px
3976 3984 }
3977 3985
3978 3986 /** comment inline form **/
3979 3987 .comment-inline-form .overlay{
3980 3988 display: none;
3981 3989 }
3982 3990 .comment-inline-form .overlay.submitting{
3983 3991 display:block;
3984 3992 background: none repeat scroll 0 0 white;
3985 3993 font-size: 16px;
3986 3994 opacity: 0.5;
3987 3995 position: absolute;
3988 3996 text-align: center;
3989 3997 vertical-align: top;
3990 3998
3991 3999 }
3992 4000 .comment-inline-form .overlay.submitting .overlay-text{
3993 4001 width:100%;
3994 4002 margin-top:5%;
3995 4003 }
3996 4004
3997 4005 .comment-inline-form .clearfix{
3998 4006 background: #EEE;
3999 4007 -webkit-border-radius: 4px;
4000 4008 -moz-border-radius: 4px;
4001 4009 border-radius: 4px;
4002 4010 padding: 5px;
4003 4011 }
4004 4012
4005 4013 div.comment-inline-form {
4006 4014 margin-top: 5px;
4007 4015 padding:2px 6px 8px 6px;
4008 4016
4009 4017 }
4010 4018
4011 4019 .comment-inline-form strong {
4012 4020 display: block;
4013 4021 margin-bottom: 15px;
4014 4022 }
4015 4023
4016 4024 .comment-inline-form textarea {
4017 4025 width: 100%;
4018 4026 height: 100px;
4019 4027 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
4020 4028 }
4021 4029
4022 4030 form.comment-inline-form {
4023 4031 margin-top: 10px;
4024 4032 margin-left: 10px;
4025 4033 }
4026 4034
4027 4035 .comment-inline-form-submit {
4028 4036 margin-top: 5px;
4029 4037 margin-left: 525px;
4030 4038 }
4031 4039
4032 4040 .file-comments {
4033 4041 display: none;
4034 4042 }
4035 4043
4036 4044 .comment-inline-form .comment {
4037 4045 margin-left: 10px;
4038 4046 }
4039 4047
4040 4048 .comment-inline-form .comment-help{
4041 4049 padding: 0px 0px 2px 0px;
4042 4050 color: #666666;
4043 4051 font-size: 10px;
4044 4052 }
4045 4053
4046 4054 .comment-inline-form .comment-button{
4047 4055 padding-top:5px;
4048 4056 }
4049 4057
4050 4058 /** comment inline **/
4051 4059 .inline-comments {
4052 4060 padding:10px 20px;
4053 4061 }
4054 4062
4055 4063 .inline-comments div.rst-block {
4056 4064 clear:both;
4057 4065 overflow:hidden;
4058 4066 margin:0;
4059 4067 padding:0 20px 0px;
4060 4068 }
4061 4069 .inline-comments .comment {
4062 4070 border: 1px solid #ddd;
4063 4071 -webkit-border-radius: 4px;
4064 4072 -moz-border-radius: 4px;
4065 4073 border-radius: 4px;
4066 4074 margin: 3px 3px 5px 5px;
4067 4075 background-color: #FAFAFA;
4068 4076 }
4069 4077 .inline-comments .add-comment {
4070 4078 padding: 2px 4px 8px 5px;
4071 4079 }
4072 4080
4073 4081 .inline-comments .comment-wrapp{
4074 4082 padding:1px;
4075 4083 }
4076 4084 .inline-comments .comment .meta {
4077 4085 background: #f8f8f8;
4078 4086 padding: 4px;
4079 4087 border-bottom: 1px solid #ddd;
4080 4088 }
4081 4089
4082 4090 .inline-comments .comment .meta img {
4083 4091 vertical-align: middle;
4084 4092 }
4085 4093
4086 4094 .inline-comments .comment .meta .user {
4087 4095 font-weight: bold;
4088 4096 }
4089 4097
4090 4098 .inline-comments .comment .meta .date {
4091 4099 }
4092 4100
4093 4101 .inline-comments .comment .text {
4094 4102 background-color: #FAFAFA;
4095 4103 }
4096 4104
4097 4105 .inline-comments .comments-number{
4098 4106 padding:0px 0px 10px 0px;
4099 4107 font-weight: bold;
4100 4108 color: #666;
4101 4109 font-size: 16px;
4102 4110 }
4103 4111 .inline-comments-button .add-comment{
4104 4112 margin:2px 0px 8px 5px !important
4105 4113 }
4106 4114
4107 4115
4108 4116 .notification-paginator{
4109 4117 padding: 0px 0px 4px 16px;
4110 4118 float: left;
4111 4119 }
4112 4120
4113 4121 .notifications{
4114 4122 border-radius: 4px 4px 4px 4px;
4115 4123 -webkit-border-radius: 4px;
4116 4124 -moz-border-radius: 4px;
4117 4125 float: right;
4118 4126 margin: 20px 0px 0px 0px;
4119 4127 position: absolute;
4120 4128 text-align: center;
4121 4129 width: 26px;
4122 4130 z-index: 1000;
4123 4131 }
4124 4132 .notifications a{
4125 4133 color:#888 !important;
4126 4134 display: block;
4127 4135 font-size: 10px;
4128 4136 background-color: #DEDEDE !important;
4129 4137 border-radius: 2px !important;
4130 4138 -webkit-border-radius: 2px !important;
4131 4139 -moz-border-radius: 2px !important;
4132 4140 }
4133 4141 .notifications a:hover{
4134 4142 text-decoration: none !important;
4135 4143 background-color: #EEEFFF !important;
4136 4144 }
4137 4145 .notification-header{
4138 4146 padding-top:6px;
4139 4147 }
4140 4148 .notification-header .desc{
4141 4149 font-size: 16px;
4142 4150 height: 24px;
4143 4151 float: left
4144 4152 }
4145 4153 .notification-list .container.unread{
4146 4154 background: none repeat scroll 0 0 rgba(255, 255, 180, 0.6);
4147 4155 }
4148 4156 .notification-header .gravatar{
4149 4157 background: none repeat scroll 0 0 transparent;
4150 4158 padding: 0px 0px 0px 8px;
4151 4159 }
4152 4160 .notification-header .desc.unread{
4153 4161 font-weight: bold;
4154 4162 font-size: 17px;
4155 4163 }
4156 4164 .notification-table{
4157 4165 border: 1px solid #ccc;
4158 4166 -webkit-border-radius: 6px 6px 6px 6px;
4159 4167 -moz-border-radius: 6px 6px 6px 6px;
4160 4168 border-radius: 6px 6px 6px 6px;
4161 4169 clear: both;
4162 4170 margin: 0px 20px 0px 20px;
4163 4171 }
4164 4172 .notification-header .delete-notifications{
4165 4173 float: right;
4166 4174 padding-top: 8px;
4167 4175 cursor: pointer;
4168 4176 }
4169 4177 .notification-subject{
4170 4178 clear:both;
4171 4179 border-bottom: 1px solid #eee;
4172 4180 padding:5px 0px 5px 38px;
4173 4181 }
4174 4182
4175 4183 .notification-body{
4176 4184 clear:both;
4177 4185 margin: 34px 2px 2px 8px
4178 4186 }
4179 4187
4180 4188 /****
4181 4189 PERMS
4182 4190 *****/
4183 4191 #perms .perms_section_head {
4184 4192 padding:10px 10px 10px 0px;
4185 4193 font-size:16px;
4186 4194 font-weight: bold;
4187 4195 }
4188 4196
4189 4197 #perms .perm_tag{
4190 4198 padding: 1px 3px 1px 3px;
4191 4199 font-size: 10px;
4192 4200 font-weight: bold;
4193 4201 text-transform: uppercase;
4194 4202 white-space: nowrap;
4195 4203 -webkit-border-radius: 3px;
4196 4204 -moz-border-radius: 3px;
4197 4205 border-radius: 3px;
4198 4206 }
4199 4207
4200 4208 #perms .perm_tag.admin{
4201 4209 background-color: #B94A48;
4202 4210 color: #ffffff;
4203 4211 }
4204 4212
4205 4213 #perms .perm_tag.write{
4206 4214 background-color: #B94A48;
4207 4215 color: #ffffff;
4208 4216 }
4209 4217
4210 4218 #perms .perm_tag.read{
4211 4219 background-color: #468847;
4212 4220 color: #ffffff;
4213 4221 }
4214 4222
4215 4223 #perms .perm_tag.none{
4216 4224 background-color: #bfbfbf;
4217 4225 color: #ffffff;
4218 4226 }
4219 4227
4220 4228 .perm-gravatar{
4221 4229 vertical-align:middle;
4222 4230 padding:2px;
4223 4231 }
4224 4232 .perm-gravatar-ac{
4225 4233 vertical-align:middle;
4226 4234 padding:2px;
4227 4235 width: 14px;
4228 4236 height: 14px;
4229 4237 }
4230 4238
4231 4239 /*****************************************************************************
4232 4240 DIFFS CSS
4233 4241 ******************************************************************************/
4234 4242
4235 4243 div.diffblock {
4236 4244 overflow: auto;
4237 4245 padding: 0px;
4238 4246 border: 1px solid #ccc;
4239 4247 background: #f8f8f8;
4240 4248 font-size: 100%;
4241 4249 line-height: 100%;
4242 4250 /* new */
4243 4251 line-height: 125%;
4244 4252 -webkit-border-radius: 6px 6px 0px 0px;
4245 4253 -moz-border-radius: 6px 6px 0px 0px;
4246 4254 border-radius: 6px 6px 0px 0px;
4247 4255 }
4248 4256 div.diffblock.margined{
4249 4257 margin: 0px 20px 0px 20px;
4250 4258 }
4251 4259 div.diffblock .code-header{
4252 4260 border-bottom: 1px solid #CCCCCC;
4253 4261 background: #EEEEEE;
4254 4262 padding:10px 0 10px 0;
4255 4263 height: 14px;
4256 4264 }
4257 4265 div.diffblock .code-header.cv{
4258 4266 height: 34px;
4259 4267 }
4260 4268 div.diffblock .code-header-title{
4261 4269 padding: 0px 0px 10px 5px !important;
4262 4270 margin: 0 !important;
4263 4271 }
4264 4272 div.diffblock .code-header .hash{
4265 4273 float: left;
4266 4274 padding: 2px 0 0 2px;
4267 4275 }
4268 4276 div.diffblock .code-header .date{
4269 4277 float:left;
4270 4278 text-transform: uppercase;
4271 4279 padding: 2px 0px 0px 2px;
4272 4280 }
4273 4281 div.diffblock .code-header div{
4274 4282 margin-left:4px;
4275 4283 font-weight: bold;
4276 4284 font-size: 14px;
4277 4285 }
4278 4286 div.diffblock .code-body{
4279 4287 background: #FFFFFF;
4280 4288 }
4281 4289 div.diffblock pre.raw{
4282 4290 background: #FFFFFF;
4283 4291 color:#000000;
4284 4292 }
4285 4293 table.code-difftable{
4286 4294 border-collapse: collapse;
4287 4295 width: 99%;
4288 4296 }
4289 4297 table.code-difftable td {
4290 4298 padding: 0 !important;
4291 4299 background: none !important;
4292 4300 border:0 !important;
4293 4301 vertical-align: none !important;
4294 4302 }
4295 4303 table.code-difftable .context{
4296 4304 background:none repeat scroll 0 0 #DDE7EF;
4297 4305 }
4298 4306 table.code-difftable .add{
4299 4307 background:none repeat scroll 0 0 #DDFFDD;
4300 4308 }
4301 4309 table.code-difftable .add ins{
4302 4310 background:none repeat scroll 0 0 #AAFFAA;
4303 4311 text-decoration:none;
4304 4312 }
4305 4313 table.code-difftable .del{
4306 4314 background:none repeat scroll 0 0 #FFDDDD;
4307 4315 }
4308 4316 table.code-difftable .del del{
4309 4317 background:none repeat scroll 0 0 #FFAAAA;
4310 4318 text-decoration:none;
4311 4319 }
4312 4320
4313 4321 /** LINE NUMBERS **/
4314 4322 table.code-difftable .lineno{
4315 4323
4316 4324 padding-left:2px;
4317 4325 padding-right:2px;
4318 4326 text-align:right;
4319 4327 width:32px;
4320 4328 -moz-user-select:none;
4321 4329 -webkit-user-select: none;
4322 4330 border-right: 1px solid #CCC !important;
4323 4331 border-left: 0px solid #CCC !important;
4324 4332 border-top: 0px solid #CCC !important;
4325 4333 border-bottom: none !important;
4326 4334 vertical-align: middle !important;
4327 4335
4328 4336 }
4329 4337 table.code-difftable .lineno.new {
4330 4338 }
4331 4339 table.code-difftable .lineno.old {
4332 4340 }
4333 4341 table.code-difftable .lineno a{
4334 4342 color:#747474 !important;
4335 4343 font:11px "Bitstream Vera Sans Mono",Monaco,"Courier New",Courier,monospace !important;
4336 4344 letter-spacing:-1px;
4337 4345 text-align:right;
4338 4346 padding-right: 2px;
4339 4347 cursor: pointer;
4340 4348 display: block;
4341 4349 width: 32px;
4342 4350 }
4343 4351
4344 4352 table.code-difftable .lineno-inline{
4345 4353 background:none repeat scroll 0 0 #FFF !important;
4346 4354 padding-left:2px;
4347 4355 padding-right:2px;
4348 4356 text-align:right;
4349 4357 width:30px;
4350 4358 -moz-user-select:none;
4351 4359 -webkit-user-select: none;
4352 4360 }
4353 4361
4354 4362 /** CODE **/
4355 4363 table.code-difftable .code {
4356 4364 display: block;
4357 4365 width: 100%;
4358 4366 }
4359 4367 table.code-difftable .code td{
4360 4368 margin:0;
4361 4369 padding:0;
4362 4370 }
4363 4371 table.code-difftable .code pre{
4364 4372 margin:0;
4365 4373 padding:0;
4366 4374 height: 17px;
4367 4375 line-height: 17px;
4368 4376 }
4369 4377
4370 4378
4371 4379 .diffblock.margined.comm .line .code:hover{
4372 4380 background-color:#FFFFCC !important;
4373 4381 cursor: pointer !important;
4374 4382 background-image:url("../images/icons/comment_add.png") !important;
4375 4383 background-repeat:no-repeat !important;
4376 4384 background-position: right !important;
4377 4385 background-position: 0% 50% !important;
4378 4386 }
4379 4387 .diffblock.margined.comm .line .code.no-comment:hover{
4380 4388 background-image: none !important;
4381 4389 cursor: auto !important;
4382 4390 background-color: inherit !important;
4383 4391
4384 4392 }
@@ -1,112 +1,116 b''
1 1 <%def name="file_class(node)">
2 2 %if node.is_file():
3 3 <%return "browser-file" %>
4 4 %else:
5 5 <%return "browser-dir"%>
6 6 %endif
7 7 </%def>
8 8 <div id="body" class="browserblock">
9 9 <div class="browser-header">
10 10 <div class="browser-nav">
11 11 ${h.form(h.url.current())}
12 12 <div class="info_box">
13 13 <span class="rev">${_('view')}@rev</span>
14 14 <a class="ui-btn" href="${c.url_prev}" title="${_('previous revision')}">&laquo;</a>
15 15 ${h.text('at_rev',value=c.changeset.revision,size=5)}
16 16 <a class="ui-btn" href="${c.url_next}" title="${_('next revision')}">&raquo;</a>
17 17 ## ${h.submit('view',_('view'),class_="ui-btn")}
18 18 </div>
19 19 ${h.end_form()}
20 20 </div>
21 21 <div class="browser-branch">
22 22 ${h.checkbox('stay_at_branch',c.changeset.branch,c.changeset.branch==c.branch)}
23 23 <label>${_('follow current branch')}</label>
24 24 </div>
25 25 <div class="browser-search">
26 26 <div id="search_activate_id" class="search_activate">
27 27 <a class="ui-btn" id="filter_activate" href="#">${_('search file list')}</a>
28 28 </div>
29 29 % if h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name):
30 30 <div id="add_node_id" class="add_node">
31 31 <a class="ui-btn" href="${h.url('files_add_home',repo_name=c.repo_name,revision=c.changeset.raw_id,f_path=c.f_path)}">${_('add new file')}</a>
32 32 </div>
33 33 % endif
34 34 <div>
35 35 <div id="node_filter_box_loading" style="display:none">${_('Loading file list...')}</div>
36 36 <div id="node_filter_box" style="display:none">
37 37 ${h.files_breadcrumbs(c.repo_name,c.changeset.raw_id,c.file.path)}/<input class="init" type="text" value="type to search..." name="filter" size="25" id="node_filter" autocomplete="off">
38 38 </div>
39 39 </div>
40 40 </div>
41 41 </div>
42 42
43 43 <div class="browser-body">
44 44 <table class="code-browser">
45 45 <thead>
46 46 <tr>
47 47 <th>${_('Name')}</th>
48 48 <th>${_('Size')}</th>
49 49 <th>${_('Mimetype')}</th>
50 50 <th>${_('Last Revision')}</th>
51 51 <th>${_('Last modified')}</th>
52 52 <th>${_('Last commiter')}</th>
53 53 </tr>
54 54 </thead>
55 55
56 56 <tbody id="tbody">
57 57 %if c.file.parent:
58 58 <tr class="parity0">
59 59 <td>
60 60 ${h.link_to('..',h.url('files_home',repo_name=c.repo_name,revision=c.changeset.raw_id,f_path=c.file.parent.path),class_="browser-dir ypjax-link")}
61 61 </td>
62 62 <td></td>
63 63 <td></td>
64 64 <td></td>
65 65 <td></td>
66 66 <td></td>
67 67 </tr>
68 68 %endif
69 69
70 70 %for cnt,node in enumerate(c.file):
71 71 <tr class="parity${cnt%2}">
72 72 <td>
73 ${h.link_to(node.name,h.url('files_home',repo_name=c.repo_name,revision=c.changeset.raw_id,f_path=h.safe_unicode(node.path)),class_=file_class(node)+" ypjax-link")}
73 %if node.is_submodule():
74 ${h.link_to(node.name,node.url or '#',class_="submodule-dir ypjax-link")}
75 %else:
76 ${h.link_to(node.name, h.url('files_home',repo_name=c.repo_name,revision=c.changeset.raw_id,f_path=h.safe_unicode(node.path)),class_=file_class(node)+" ypjax-link")}
77 %endif:
74 78 </td>
75 79 <td>
76 80 %if node.is_file():
77 81 ${h.format_byte_size(node.size,binary=True)}
78 82 %endif
79 83 </td>
80 84 <td>
81 85 %if node.is_file():
82 86 ${node.mimetype}
83 87 %endif
84 88 </td>
85 89 <td>
86 90 %if node.is_file():
87 91 <div class="tooltip" title="${node.last_changeset.message}">
88 92 <pre>${'r%s:%s' % (node.last_changeset.revision,node.last_changeset.short_id)}</pre>
89 93 </div>
90 94 %endif
91 95 </td>
92 96 <td>
93 97 %if node.is_file():
94 98 <span class="tooltip" title="${node.last_changeset.date}">
95 99 ${h.age(node.last_changeset.date)}</span>
96 100 %endif
97 101 </td>
98 102 <td>
99 103 %if node.is_file():
100 104 <span title="${node.last_changeset.author}">
101 105 ${h.person(node.last_changeset.author)}
102 106 </span>
103 107 %endif
104 108 </td>
105 109 </tr>
106 110 %endfor
107 111 </tbody>
108 112 <tbody id="tbody_filtered" style="display:none">
109 113 </tbody>
110 114 </table>
111 115 </div>
112 116 </div>
General Comments 0
You need to be logged in to leave comments. Login now