# HG changeset patch # User Marcin Kuzminski # Date 1279930668 -7200 # Node ID 558eb7c5028f24a90b5466ed16be13b213ba1fc2 # Parent 3581656180b729f365921345298c7c6766434c84 version bump to 0.8 hg app 0.8 new template. Add yui flot and graph into summary page. + various tweeks and patches into look of application diff -r 3581656180b7 -r 558eb7c5028f pylons_app/__init__.py --- a/pylons_app/__init__.py Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/__init__.py Sat Jul 24 02:17:48 2010 +0200 @@ -24,7 +24,7 @@ @author: marcink """ -VERSION = (0, 7, 9, 'beta') +VERSION = (0, 8, 0, 'beta') __version__ = '.'.join((str(each) for each in VERSION[:4])) diff -r 3581656180b7 -r 558eb7c5028f pylons_app/controllers/summary.py --- a/pylons_app/controllers/summary.py Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/controllers/summary.py Sat Jul 24 02:17:48 2010 +0200 @@ -2,7 +2,7 @@ # encoding: utf-8 # summary controller for pylons # Copyright (C) 2009-2010 Marcin Kuzminski - +# # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; version 2 @@ -22,12 +22,18 @@ summary controller for pylons @author: marcink """ +from datetime import datetime, timedelta from pylons import tmpl_context as c, request from pylons_app.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator from pylons_app.lib.base import BaseController, render +from pylons_app.lib.helpers import person +from pylons_app.lib.utils import OrderedDict from pylons_app.model.hg_model import HgModel +from time import mktime from webhelpers.paginate import Page +import calendar import logging + log = logging.getLogger(__name__) class SummaryController(BaseController): @@ -56,5 +62,77 @@ c.repo_branches = {} for name, hash in c.repo_info.branches.items()[:10]: c.repo_branches[name] = c.repo_info.get_changeset(hash) - + + c.commit_data = self.__get_commit_stats(c.repo_info) + return render('summary/summary.html') + + + + def __get_commit_stats(self, repo): + aggregate = OrderedDict() + + + #graph range + td = datetime.today() + y = td.year + m = td.month + d = td.day + c.ts_min = mktime((y, (td - timedelta(days=calendar.mdays[m] - 1)).month, d, 0, 0, 0, 0, 0, 0,)) + c.ts_max = mktime((y, m, d, 0, 0, 0, 0, 0, 0,)) + + +# #generate this monhts keys +# dates_range = OrderedDict() +# year_range = range(2010, datetime.today().year + 1) +# month_range = range(1, datetime.today().month + 1) +# +# +# +# for y in year_range: +# for m in month_range: +# for d in range(1, calendar.mdays[m] + 1): +# k = '%s-%s-%s' % (y, m, d) +# timetupple = [int(x) for x in k.split('-')] +# timetupple.extend([0 for _ in xrange(6)]) +# k = mktime(timetupple) +# dates_range[k] = 0 + + def author_key_cleaner(k): + k = person(k) + return k + + for cs in repo: + k = '%s-%s-%s' % (cs.date.timetuple()[0], cs.date.timetuple()[1], + cs.date.timetuple()[2]) + timetupple = [int(x) for x in k.split('-')] + timetupple.extend([0 for _ in xrange(6)]) + k = mktime(timetupple) + if aggregate.has_key(author_key_cleaner(cs.author)): + if aggregate[author_key_cleaner(cs.author)].has_key(k): + aggregate[author_key_cleaner(cs.author)][k] += 1 + else: + #aggregate[author_key_cleaner(cs.author)].update(dates_range) + if k >= c.ts_min and k <= c.ts_max: + aggregate[author_key_cleaner(cs.author)][k] = 1 + else: + if k >= c.ts_min and k <= c.ts_max: + aggregate[author_key_cleaner(cs.author)] = OrderedDict() + #aggregate[author_key_cleaner(cs.author)].update(dates_range) + aggregate[author_key_cleaner(cs.author)][k] = 1 + + d = '' + tmpl0 = u""""%s":%s""" + tmpl1 = u"""{label:"%s",data:%s},""" + for author in aggregate: + d += tmpl0 % (author.decode('utf8'), + tmpl1 \ + % (author.decode('utf8'), + [[x, aggregate[author][x]] for x in aggregate[author]])) + if d == '': + d = '"%s":{label:"%s",data:[[0,0],]}' \ + % (author_key_cleaner(repo.contact), + author_key_cleaner(repo.contact)) + return d + + diff -r 3581656180b7 -r 558eb7c5028f pylons_app/lib/base.py --- a/pylons_app/lib/base.py Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/lib/base.py Sat Jul 24 02:17:48 2010 +0200 @@ -15,7 +15,7 @@ def __before__(self): c.hg_app_version = __version__ - c.repos_prefix = config['hg_app_name'] + c.hg_app_name = config['hg_app_name'] c.repo_name = get_repo_slug(request) c.hg_app_user = auth.get_user(session) c.cached_repo_list = _get_repos_cached() diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/css/colors/blue.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pylons_app/public/css/colors/blue.css Sat Jul 24 02:17:48 2010 +0200 @@ -0,0 +1,302 @@ +/* ----------------------------------------------------------- + header +----------------------------------------------------------- */ + +#header #header-inner +{ + background: #b0b0b0 url("../../images/colors/blue/header_inner.png") repeat-x; +} + +/* ----------------------------------------------------------- + header -> home +----------------------------------------------------------- */ + +#header #header-inner #home a +{ + background: url("../../images/colors/blue/button_home.png"); +} + +/* ----------------------------------------------------------- + header -> quick +----------------------------------------------------------- */ + +#header #header-inner #quick li a +{ + background: #336699 url("../../images/colors/blue/quick_l.png") no-repeat top left; +} + +#header #header-inner #quick li span +{ + background: url("../../images/colors/blue/quick_r.png") no-repeat top right; + border-left: 1px solid #3f6f9f; +} + +#header #header-inner #quick li span.icon +{ + background: url("../../images/colors/blue/quick_l.png") no-repeat top left; + border-right: 1px solid #2e5c89; +} + +#header #header-inner #quick li a:hover +{ + background: #4e4e4e url("../../images/colors/blue/quick_l_selected.png") no-repeat top left; +} + +#header #header-inner #quick li a:hover span +{ + background: url("../../images/colors/blue/quick_r_selected.png") no-repeat top right; +} + +#header #header-inner #quick li a:hover span.icon +{ + background: url("../../images/colors/blue/quick_l_selected.png") no-repeat top left; +} + +/* ----------------------------------------------------------- + header corners +----------------------------------------------------------- */ + +#header #header-inner div.corner +{ + background: url("../../images/colors/blue/header_inner_corners.png") no-repeat; +} + +#header #header-inner div.tl +{ + top: 0; + left: 0; + background-position: 0 0; +} + +#header #header-inner div.tr +{ + top: 0; + right: 0; + background-position: -6px 0; +} + +/* ----------------------------------------------------------- + content -> left -> menu +----------------------------------------------------------- */ + +#content #left #menu h6.selected +{ + background: #00376e url("../../images/colors/blue/menu_selected.png") repeat-x; +} + +#content #left #menu h6.selected a +{ + background: url("../../images/colors/blue/menu_l_selected.png") no-repeat top left; +} + +#content #left #menu h6.selected span +{ + background: url("../../images/colors/blue/menu_r_selected.png") no-repeat top right; +} + +#content #left #menu ul +{ + background: #376ea6; +} + +#content #left #menu li +{ + border-top: 1px solid #4377ab; + border-bottom: 1px solid #326395; +} + +#content #left #menu li a +{ + background: url("../../images/colors/blue/menu_arrow.png") no-repeat 0 9px; +} + +#content #left #menu li a:hover +{ + color: #b9dcff; +} + +#content #left #menu li.collapsible +{ + background: url("../../images/colors/blue/menu_border.png") no-repeat top left; +} + +#content #left #menu li.collapsible a.minus +{ + border-bottom: 1px solid #326395; +} + +#content #left #menu li ul +{ + border-left: 18px solid #326395; +} + +#content #left #menu li ul li +{ + background: url("../../images/colors/blue/menu_arrow.png") no-repeat 10px 9px; + border-top: 1px solid #4377ab; + border-bottom: 1px solid #326395; +} + +/* ----------------------------------------------------------- + content -> right -> box / title +----------------------------------------------------------- */ + +#content div.box div.title +{ + background: #336699 url("../../images/colors/blue/title.png") repeat-x; +} + +#content div.box div.title ul.links li a +{ + background: url("../../images/colors/blue/title_link.png") no-repeat top left; + border-left: 1px solid #316293; +} + +#content div.box div.title ul.links li a:hover +{ + background: url("../../images/colors/blue/title_tab_selected.png") no-repeat bottom center; + color: #bfe3ff; +} + +#content div.box div.title ul.links li.ui-tabs-selected a +{ + background: url("../../images/colors/blue/title_tab_selected.png") no-repeat bottom center; + color: #bfe3ff; +} + +/* ----------------------------------------------------------- + content -> right -> box / search +----------------------------------------------------------- */ + +#content div.box div.title div.search +{ + background: url("../../images/colors/blue/title_link.png") no-repeat top left; + border-left: 1px solid #316293; +} + +#content div.box div.title div.search div.input input +{ + border: 1px solid #316293; +} + +#content div.box div.title div.search div.button input.ui-state-default +{ + background: #4e85bb url("../../images/colors/blue/button_highlight.png") repeat-x; + border: 1px solid #316293; + border-left: none; + color: #FFFFFF; +} + +#content div.box div.title div.search div.button input.ui-state-hover +{ + background: #46a0c1 url("../../images/colors/blue/button_highlight_selected.png") repeat-x; + border: 1px solid #316293; + border-left: none; + color: #FFFFFF; +} + +/* ----------------------------------------------------------- + content -> right -> forms -> button +----------------------------------------------------------- */ + +#content div.box div.form div.fields div.field div.highlight .ui-state-default +{ + background: #4e85bb url("../../images/colors/blue/button_highlight.png") repeat-x; + border-top: 1px solid #5c91a4; + border-left: 1px solid #2a6f89; + border-right: 1px solid #2b7089; + border-bottom: 1px solid #1a6480; + color: #ffffff; +} + +#content div.box div.form div.fields div.field div.highlight .ui-state-hover +{ + background: #46a0c1 url("../../images/colors/blue/button_highlight_selected.png") repeat-x; + border-top: 1px solid #78acbf; + border-left: 1px solid #34819e; + border-right: 1px solid #35829f; + border-bottom: 1px solid #257897; + color: #ffffff; +} + +/* ----------------------------------------------------------- + content -> right -> forms -> buttons +----------------------------------------------------------- */ + +#content div.box div.form div.fields div.buttons div.highlight input.ui-state-default +{ + background: #4e85bb url("../../images/colors/blue/button_highlight.png") repeat-x; + border-top: 1px solid #5c91a4; + border-left: 1px solid #2a6f89; + border-right: 1px solid #2b7089; + border-bottom: 1px solid #1a6480; + color: #ffffff; +} + +#content div.box div.form div.fields div.buttons div.highlight input.ui-state-hover +{ + background: #46a0c1 url("../../images/colors/blue/button_highlight_selected.png") repeat-x; + border-top: 1px solid #78acbf; + border-left: 1px solid #34819e; + border-right: 1px solid #35829f; + border-bottom: 1px solid #257897; + color: #ffffff; +} + +/* ----------------------------------------------------------- + login -> title +----------------------------------------------------------- */ + +#login div.title +{ + background: #003367 url("../../images/colors/blue/header_inner.png") repeat-x; +} + +/* ----------------------------------------------------------- + login -> title / corners +----------------------------------------------------------- */ + +#login div.title div.corner +{ + background: url("../../images/colors/blue/login_corners.png") no-repeat; +} + +#login div.title div.tl +{ + top: 0; + left: 0; + background-position: 0 0; +} + +#login div.title div.tr +{ + top: 0; + right: 0; + background-position: -6px 0; +} + +/* ----------------------------------------------------------- + jquery ui -> select styling +----------------------------------------------------------- */ + +.ui-selectmenu-open li.ui-selectmenu-item-focus { background: #376ea6; } +.ui-selectmenu-open li.ui-selectmenu-item-focus a { color: #ffffff; } + +/* ----------------------------------------------------------- + jquery ui -> datepicker +----------------------------------------------------------- */ +.ui-datepicker td span, .ui-datepicker td a:hover { background: #376ea6; color: #ffffff; } +.ui-datepicker td span, .ui-datepicker td.ui-datepicker-current-day a { background: #376ea6; color: #ffffff; } + +/* ----------------------------------------------------------- + jquery ui -> autocomplete +----------------------------------------------------------- */ + +.ui-autocomplete .ui-menu-item a:hover { background: #376ea6; color: #ffffff; } + +/* ----------------------------------------------------------- + jquery ui -> dialog +----------------------------------------------------------- */ + +.ui-dialog { border: 1px solid #336699; } +.ui-dialog .ui-dialog-titlebar { background: #336699 url("../../images/colors/blue/title.png") repeat-x; } \ No newline at end of file diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/css/diff.css --- a/pylons_app/public/css/diff.css Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/public/css/diff.css Sat Jul 24 02:17:48 2010 +0200 @@ -26,14 +26,22 @@ color:#000000; } -.code-difftable{ +table.code-difftable{ border-collapse: collapse; width: 99%; } -.code-difftable td:target *{ +table.code-difftable td:target *{ background: repeat scroll 0 0 #FFFFBE !important; text-decoration: underline; } + +table.code-difftable td { + padding: 0 !important; + background: none !important; + border:0 !important; +} + + .code-difftable .context{ background:none repeat scroll 0 0 #DDE7EF; } @@ -82,7 +90,6 @@ padding:0; } - .code { display: block; width: 100%; diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/css/monoblue_custom.css --- a/pylons_app/public/css/monoblue_custom.css Sat Jul 24 00:53:43 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,952 +0,0 @@ -/*** Initial Settings ***/ -#mainhtml { - margin: 15px 50px; - background: #DBD4C6; - font-family: sans-serif; -} - -#mainhtml .breadcrumbs a:HOVER { - text-decoration: underline; -} - -a { - color: #556CB5; - text-decoration: none; -} - -a:HOVER { - text-decoration: underline; -} - -/*** end of Initial Settings ***/ - -/*** ***/ -.table_disp { - border-left: 0px solid #666666; - border-bottom: 1px solid #666666; - border-right: 1px solid #666666; - padding: 0px; - margin: 0px; - border-spacing: 0px; -} - -.table_disp .header { - border-top: 1px solid #666666; - background-color: #556CB5; - font-weight: bold; - color: white; - vertical-align: middle; - padding: 3px 5px; - text-align: left; - font-size: 0.9em; -} - -.table_disp .header td { - padding: 4px; - vertical-align: middle; - border-top: 1px solid #AAAAAA; - border-bottom: 2px solid #666666; -} - -.table_disp td { - border-left: 1px solid #AAAAAA; - padding-left: 4px; - padding-right: 4px; -} - -table tr.parity0:hover,table tr.parity1:hover { - background: #D5E1E6; -} - -table tr.parity0 { - background: #EAEAE9; -} - -table tr.parity1 { - background: #FFFFFF; -} - -/*** ***/ - -/** COMMON SETTINGS **/ -.add_icon { - background: url("/images/icons/add.png") no-repeat scroll 3px; - height: 16px; - padding-left: 20px; - padding-top: 0px; - text-align: left; -} - -.edit_icon { - background: url("/images/icons/folder_edit.png") no-repeat scroll 3px; - height: 16px; - padding-left: 20px; - padding-top: 0px; - text-align: left; -} - -.delete_icon { - background: url("/images/icons/delete.png") no-repeat scroll 3px; - height: 16px; - padding-left: 20px; - padding-top: 0px; - text-align: left; -} - -.action_button { - border: 0px; - display: block; -} - -.action_button:hover { - border: 0px; - font-style: italic; - cursor: pointer; -} - -.flash_msg ul { - margin: 0; - padding: 25px 0px 0px 0px; -} - -.error_msg { - background-color: #FFCFCF; - background-image: url("/images/icons/error_msg.png"); - border: 1px solid #FF9595; - color: #CC3300; -} - -.warning_msg { - background-color: #FFFBCC; - background-image: url("/images/icons/warning_msg.png"); - border: 1px solid #FFF35E; - color: #C69E00; -} - -.success_msg { - background-color: #D5FFCF; - background-image: url("/images/icons/success_msg.png"); - border: 1px solid #97FF88; - color: #009900; -} - -.notice_msg { - background-color: #DCE3FF; - background-image: url("/images/icons/notice_msg.png"); - border: 1px solid #93A8FF; - color: #556CB5; -} - -.success_msg,.error_msg,.notice_msg,.warning_msg { - background-position: 10px center; - background-repeat: no-repeat; - font-size: 12px; - font-weight: bold; - min-height: 14px; - line-height: 14px; - margin-bottom: 0px; - margin-top: 0px; - padding: 3px 10px 3px 40px; - display: block; - overflow: auto; -} - -#msg_close { - background: transparent url("icons/cross_grey_small.png") no-repeat - scroll 0 0; - cursor: pointer; - height: 16px; - position: absolute; - right: 5px; - top: 5px; - width: 16px; -} - -.error-message { - color: #CC3300; -} - -/**** TOOLTIP ****/ -.yui-overlay,.yui-panel-container { - visibility: hidden; - position: absolute; - z-index: 2; -} - -.yui-tt { - visibility: hidden; - position: absolute; - color: #666666; - background-color: #FFFFFF; - font-family: arial, helvetica, verdana, sans-serif; - padding: 8px; - border: 2px solid #556CB5; - font: 100% sans-serif; - width: auto; - opacity: 1.0; -} - -.yui-tt-shadow { - display: none; -} - -/** END TOOLTIP **/ - -/** AUTOCOMPLETE **/ - -.ac{ - vertical-align: top; - -} -.ac .match { - font-weight:bold; -} - -.ac .yui-ac { - position: relative; - font-family: arial; - font-size: 100%; -} - -.ac .perm_ac{ - width:15em; -} -/* styles for input field */ -.ac .yui-ac-input { - position: absolute; - width: 100%; -} - -/* styles for results container */ -.ac .yui-ac-container { - position: absolute; - top: 1.6em; - width: 100%; -} - -/* styles for header/body/footer wrapper within container */ -.ac .yui-ac-content { - position: absolute; - width: 100%; - border: 1px solid #808080; - background: #fff; - overflow: hidden; - z-index: 9050; -} - -/* styles for container shadow */ -.ac .yui-ac-shadow { - position: absolute; - margin: .3em; - width: 100%; - background: #000; - -moz-opacity: 0.10; - opacity: .10; - filter: alpha(opacity = 10); - z-index: 9049; -} - -/* styles for results list */ -.ac .yui-ac-content ul { - margin: 0; - padding: 0; - width: 100%; -} - -/* styles for result item */ -.ac .yui-ac-content li { - margin: 0; - padding: 2px 5px; - cursor: default; - white-space: nowrap; -} - -/* styles for prehighlighted result item */ -.ac .yui-ac-content li.yui-ac-prehighlight { - background: #B3D4FF; -} - -/* styles for highlighted result item */ -.ac .yui-ac-content li.yui-ac-highlight { - background: #556CB5; - color: #FFF; -} - -/** END AUTOCOMPLETE **/ -div#main { - padding: 5px; -} - -div#container { - background: #FFFFFF; - position: relative; - color: #666; -} - -div.page-header { - padding: 50px 20px 0; - background: #556cb5 top left repeat-x; - position: relative; -} - -div.page-header h1 { - margin: 10px 0 30px; - font-size: 1.8em; - font-weight: bold; - font-family: sans-serif; - letter-spacing: 1px; - color: #FFFFFF; -} - -div.page-header h1 a { - font-weight: bold; - color: #FFFFFF; -} - -div.page-header a { - text-decoration: none; -} - -div.page-header form { - position: absolute; - margin-bottom: 2px; - bottom: 0; - right: 20px; -} - -div.page-header form label { - color: #DDD; -} - -div.page-header form input { - padding: 2px; - border: solid 1px #DDD; -} - -div.page-header form dl { - overflow: hidden; -} - -div.page-header form dl dt { - font-size: 1.2em; -} - -div.page-header form dl dt,div.page-header form dl dd { - margin: 0 0 0 5px; - float: left; - height: 24px; - line-height: 20px; -} - -ul.page-nav { - margin: 10px 0 0 0; - list-style-type: none; - overflow: hidden; - width: 800px; - padding: 0; -} - -ul.page-nav li { - margin: 0 4px 0 0; - float: left; - height: 24px; - font-size: 1.1em; - line-height: 24px; - text-align: center; - background: #556CB5; -} - -ul.page-nav li.current { - background: #FFF; - padding-right: 5px; - padding-left: 5px; -} - -ul.page-nav li.current a { - color: #556CB5; -} - -ul.page-nav li a { - height: 24px; - color: #FFF; - padding-right: 5px; - padding-left: 5px; - display: block; - text-decoration: none; - font-weight: bold; -} - -ul.page-nav li.logout a { - color: #FDAC9D; -} - -ul.page-nav li a:hover { - background: #FFF; - color: #556CB5; -} - -ul.submenu { - margin: 5px 0px -20px 0px; - list-style-type: none; -} - -ul.submenu li { - margin: 0 10px 0 0; - font-size: 0.9em; - font-weight: bold; - display: inline; -} - -ul.submenu .repos { - background: url("/images/icons/folder_edit.png") no-repeat scroll 3px; - height: 16px; - padding-left: 20px; - padding-top: 0px; - text-align: left; -} - -ul.submenu .users { - background: url("/images/icons/user_edit.png") no-repeat scroll 3px; - height: 16px; - padding-left: 20px; - padding-top: 0px; - text-align: left; -} - -ul.submenu .permissions { - background: url("/images/icons/folder_key.png") no-repeat scroll 3px; - height: 16px; - padding-left: 20px; - padding-top: 0px; - text-align: left; -} -ul.submenu .settings { - background: url("/images/icons/cog.png") no-repeat scroll 3px; - height: 16px; - padding-left: 20px; - padding-top: 0px; - text-align: left; -} - -ul.submenu .current_submenu { - border-bottom: 2px solid #556CB5; -} - -h2 { - margin: 20px 0 10px; - height: 30px; - line-height: 30px; - text-indent: 20px; - background: #FFF; - font-size: 1.2em; - border-top: dotted 1px #D5E1E6; - font-weight: bold; - color: #556CB5; -} - -h2.no-link { - color: #006699; -} - -h2.no-border { - color: #FFF; - background: #556CB5; - border: 0; -} - -h2 a { - font-weight: bold; - color: #006699; -} - -div.page-path { - text-align: right; - padding: 20px 30px 10px 0; - border: solid #d9d8d1; - border-width: 0px 0px 1px; - font-size: 1.2em; -} - -div.page-footer { - margin: 50px 0 0; - position: relative; - text-align: center; - font-weight: bold; - font-size: 90%; -} - -div.page-footer p { - position: relative; - left: 20px; - bottom: 5px; - font-size: 1.2em; -} - -ul.rss-logo { - position: absolute; - top: -10px; - right: 20px; - height: 20px; - list-style-type: none; -} - -ul.rss-logo li { - display: inline; -} - -ul.rss-logo li a { - padding: 3px 6px; - line-height: 10px; - border: 1px solid; - border-color: #fcc7a5 #7d3302 #3e1a01 #ff954e; - color: #ffffff; - background-color: #ff6600; - font-weight: bold; - font-family: sans-serif; - font-size: 10px; - text-align: center; - text-decoration: none; -} - -div.rss-logo li a:hover { - background-color: #ee5500; -} - -p.normal { - margin: 20px 0 20px 30px; - font-size: 1.2em; -} - -span.logtags span { - background-repeat: no-repeat; - height: 16px; - padding-left: 20px; - padding-top: 0px; - text-align: left; - font-weight: bold; -} - -span.logtags span.tagtag { - background-image: url("/images/icons/tag_green.png"); -} - -span.logtags span.branchtag { - background-image: url("/images/icons/arrow_branch.png"); - color: #628F53; -} - -span.logtags span.inbranchtag { - background-image: url("/images/icons/arrow_branch.png"); -} - -div.diff pre { - margin: 10px 0 0 0; -} - -div.diff pre span { - font-family: monospace; - white-space: pre; - font-size: 1.2em; - padding: 3px 0; -} - -td.source { - white-space: pre; - font-family: monospace; - margin: 10px 30px 0; - font-size: 1.2em; - font-family: monospace; -} - -div.source div.parity0,div.source div.parity1 { - padding: 1px; - font-size: 1.2em; -} - -div.source div.parity0 { - background: #F1F6F7; -} - -div.source div.parity1 { - background: #FFFFFF; -} - -div.parity0:hover,div.parity1:hover { - background: #D5E1E6; -} - -.linenr { - color: #999; - text-align: right; -} - -.lineno { - text-align: right; -} - -.lineno a { - color: #999; -} - -td.linenr { - width: 60px; -} - -div#powered-by { - position: absolute; - width: 75px; - top: 15px; - right: 20px; - font-size: 1.2em; -} - -div#powered-by a { - color: #EEE; - text-decoration: none; -} - -div#powered-by a:hover { - text-decoration: underline; -} - -dl.overview { - margin: 0 0 0 30px; - font-size: 1.1em; - overflow: hidden; -} - -dl.overview dt,dl.overview dd { - margin: 5px 0; - float: left; -} - -dl.overview dt { - clear: left; - font-weight: bold; - width: 150px; -} - -#clone_url { - border: 0px; -} - -/** end of summary **/ /** chagelog **/ -h3.changelog { - margin: 20px 0 5px 30px; - padding: 0 0 2px; - font-size: 1.4em; - border-bottom: dotted 1px #D5E1E6; -} - -ul.changelog-entry { - margin: 0 0 10px 30px; - list-style-type: none; - position: relative; -} - -ul.changelog-entry li span.revdate { - font-size: 1.1em; -} - -ul.changelog-entry li.age { - position: absolute; - top: -25px; - right: 10px; - font-size: 1.4em; - color: #CCC; - font-weight: bold; - font-style: italic; -} - -ul.changelog-entry li span.name { - font-size: 1.2em; - font-weight: bold; -} - -ul.changelog-entry li.description { - margin: 10px 0 0; - font-size: 1.1em; -} - -/** end of changelog **/ /** file **/ -p.files { - margin: 0 0 0 20px; - font-size: 2.0em; - font-weight: bold; -} - -/** end of file **/ /** changeset **/ -#changeset_content { - border:1px solid #CCCCCC; - padding:5px; -} - -#changeset_content .container .wrapper { - width: 600px; -} - -#changeset_content .container { - height: 120px; -} - -#changeset_content .container .left { - float: left; - width: 70%; - padding-left: 5px; -} - -#changeset_content .container .right { - float: right; - width: 25%; - text-align: right; -} - -#changeset_content .container .left .date { - font-weight: bold; -} - -#changeset_content .container .left .author { - -} - -#changeset_content .container .left .message { - font-style: italic; - color: #556CB5; -} - -.cs_files { - -} - -.cs_files .cs_added { - background: url("/images/icons/page_white_add.png") no-repeat scroll 3px; - /*background-color:#BBFFBB;*/ - height: 16px; - padding-left: 20px; - margin-top: 7px; - text-align: left; -} - -.cs_files .cs_changed { - background: url("/images/icons/page_white_edit.png") no-repeat scroll - 3px; - /*background-color: #FFDD88;*/ - height: 16px; - padding-left: 20px; - margin-top: 7px; - text-align: left; -} - -.cs_files .cs_removed { - background: url("/images/icons/page_white_delete.png") no-repeat scroll - 3px; - /*background-color: #FF8888;*/ - height: 16px; - padding-left: 20px; - margin-top: 7px; - text-align: left; -} - -/** end of changeset **/ /** canvas **/ - -#graph { - overflow: hidden; -} - -#graph_nodes { - width: 160px; - float: left; - margin-left:-50px; - margin-top: 5px; -} - -#graph_content { - width: 800px; - float: left; -} - -#graph_content .container_header { - border: 1px solid #CCCCCC; - height: 30px; - background: #EEEEEE; -} - -#graph_content .container .wrapper { - width: 600px; -} - -#graph_content .container { - border-bottom: 1px solid #CCCCCC; - border-left: 1px solid #CCCCCC; - border-right: 1px solid #CCCCCC; - min-height: 80px; - overflow: hidden; -} - -#graph_content .container .left { - float: left; - width: 70%; - padding-left: 5px; -} - -#graph_content .container .right { - float: right; - width: 25%; - text-align: right; -} - -#graph_content .container .left .date { - font-weight: bold; -} - -#graph_content .container .left .author { - -} - -#graph_content .container .left .message { - font-size: 80%; -} - -.right div { - clear: both; -} - -.right .changes .added,.changed,.removed { - border: 1px solid #DDDDDD; - display: block; - float: right; - font-size: 0.75em; - text-align: center; - min-width: 15px; -} - -.right .changes .added { - background: #BBFFBB; -} - -.right .changes .changed { - background: #FFDD88; -} - -.right .changes .removed { - background: #FF8888; -} - -.right .merge { - vertical-align: top; - font-size: 60%; - font-weight: bold; -} - -.right .merge img { - vertical-align: bottom; -} - -.right .parent { - font-size: 90%; - font-family: monospace; -} - -/** end of canvas **/ /* FILE BROWSER */ -div.browserblock { - overflow: hidden; - padding: 0px; - border: 1px solid #ccc; - background: #f8f8f8; - font-size: 100%; - line-height: 100%; - /* new */ - line-height: 125%; -} - -div.browserblock .browser-header { - border-bottom: 1px solid #CCCCCC; - background: #EEEEEE; - color: blue; - padding: 10px 0 10px 0; -} - -div.browserblock .browser-header span { - margin-left: 25px; - font-weight: bold; -} - -div.browserblock .browser-body { - background: #EEEEEE; -} - -table.code-browser { - border-collapse: collapse; - width: 100%; -} - -table.code-browser tr { - margin: 3px; -} - -table.code-browser thead th { - background-color: #EEEEEE; - height: 20px; - font-size: 1.1em; - font-weight: bold; - text-align: center; - text-align: left; - padding-left: 10px; -} - -table.code-browser tbody tr { - -} - -table.code-browser tbody td { - padding-left: 10px; - height: 20px; -} - -.info-table { - background: none repeat scroll 0 0 #FAFAFA; - border-bottom: 1px solid #DDDDDD; - width: 100%; -} - -.rss_logo { - background: url("/images/icons/rss_16.png") no-repeat scroll 3px; - height: 16px; - padding-left: 20px; - padding-top: 0px; - text-align: left; -} - -.atom_logo { - background: url("/images/icons/atom.png") no-repeat scroll 3px; - height: 16px; - padding-left: 20px; - padding-top: 0px; - text-align: left; -} - -.archive_logo { - background: url("/images/icons/compress.png") no-repeat scroll 3px; - height: 16px; - padding-left: 20px; - text-align: left; -} - -.browser-file { - background: url("/images/icons/document_16.png") no-repeat scroll 3px; - height: 16px; - padding-left: 20px; - text-align: left; -} - -.browser-dir { - background: url("/images/icons/folder_16.png") no-repeat scroll 3px; - height: 16px; - padding-left: 20px; - text-align: left; -} - -#repos_list { - border: 1px solid #556CB5; - background: #FFFFFF; -} \ No newline at end of file diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/css/pygments.css --- a/pylons_app/public/css/pygments.css Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/public/css/pygments.css Sat Jul 24 02:17:48 2010 +0200 @@ -22,6 +22,15 @@ margin-left:25px; font-weight: normal; } +div.codeblock .code-body table{ + width: 0 !important; +} + +div.annotatediv{ + margin-left:2px; + margin-right:4px; +} + .code-highlight { padding: 0px; diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/css/reset.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pylons_app/public/css/reset.css Sat Jul 24 02:17:48 2010 +0200 @@ -0,0 +1,53 @@ +/* http://meyerweb.com/eric/tools/css/reset/ */ +/* v1.0 | 20080212 */ + +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 { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-size: 100%; + vertical-align: baseline; + background: transparent; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} + +/* remember to define focus styles! */ +:focus { + outline: 0; +} + +/* remember to highlight inserts somehow! */ +ins { + text-decoration: none; +} +del { + text-decoration: line-through; +} + +/* tables still need 'cellspacing="0"' in the markup */ +table { + border-collapse: collapse; + border-spacing: 0; +} \ No newline at end of file diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/css/style.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pylons_app/public/css/style.css Sat Jul 24 02:17:48 2010 +0200 @@ -0,0 +1,3624 @@ +/* ----------------------------------------------------------- + main stylesheet +----------------------------------------------------------- */ + +html +{ + height: 100%; +} + +body +{ + margin: 0; + padding: 0; + height: 100%; + background: #d1d1d1 url("../images/background.png") repeat; + font-family: Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif; + font-size: 11px; +} + +/* ----------------------------------------------------------- + images +----------------------------------------------------------- */ + +img +{ + border: none; +} + +/* ----------------------------------------------------------- + anchors +----------------------------------------------------------- */ + +a +{ + color: #0066CC; + text-decoration: none; + cursor: pointer; +} + +a:hover +{ + color: #000000; + text-decoration: underline; +} + +/* ----------------------------------------------------------- + headings +----------------------------------------------------------- */ + +h1, h2, h3, h4, h5, h6 +{ + color: #292929; + font-weight: bold; +} + +h1 +{ + font-size: 22px; +} + +h2 +{ + font-size: 20px; +} + +h3 +{ + font-size: 18px; +} + +h4 +{ + font-size: 16px; +} + +h5 +{ + font-size: 14px; +} + +h6 +{ + font-size: 11px; +} + +/* ----------------------------------------------------------- + lists +----------------------------------------------------------- */ + +ul.circle { list-style-type: circle; } +ul.disc { list-style-type: disc; } +ul.square { list-style-type: square; } +ol.lower-roman { list-style-type: lower-roman; } +ol.upper-roman { list-style-type: upper-roman; } +ol.lower-alpha { list-style-type: lower-alpha; } +ol.upper-alpha { list-style-type: upper-alpha; } +ol.decimal { list-style-type: decimal; } + +/* ----------------------------------------------------------- + colors +----------------------------------------------------------- */ + +div.color +{ + margin: 7px 0 0 60px; + padding: 1px 1px 1px 0px; + clear: both; + overflow: hidden; + position: absolute; + background: #FFFFFF; +} + +div.color a +{ + margin: 0 0 0 1px; + padding: 0; + width: 15px; + height: 15px; + display: block; + float: left; +} + +div.color a.blue +{ + background: #376ea6; +} + +div.color a.green +{ + background: #85924b; +} + +div.color a.brown +{ + background: #9b6e42; +} + +div.color a.purple +{ + background: #88528b; +} + +div.color a.red +{ + background: #bd3220; +} + +div.color a.greyblue +{ + background: #566e86; +} + +/* ----------------------------------------------------------- + options +----------------------------------------------------------- */ + +div.options +{ + margin: 7px 0 0 162px; + padding: 0; + clear: both; + overflow: hidden; + position: absolute; + background: #FFFFFF; +} + +div.options a +{ + margin: 0; + padding: 3px 8px 3px 8px; + height: 1%; + display: block; + text-decoration: none; +} + +div.options a:hover +{ + text-decoration: none; +} + +/* ----------------------------------------------------------- + header +----------------------------------------------------------- */ + +#header +{ + margin: 0; + padding: 0 60px 0 60px; + background: #b0b0b0 url("../images/header_background.png") repeat; +} + + +/* ----------------------------------------------------------- + header -> user +----------------------------------------------------------- */ + +#header ul#logged-user +{ + margin: 0; + padding: 0; + float: right; +} + +#header ul#logged-user li +{ + margin: 0; + padding: 10px 12px 10px 12px; + list-style: none; + float: left; + border-left: 1px solid #bbbbbb; + border-right: 1px solid #a5a5a5; +} + +#header ul#logged-user li.first +{ + border-left: none; +} + +#header ul#logged-user li.last +{ + border-right: none; +} + +#header ul#logged-user li a +{ + color: #4e4e4e; + font-weight: bold; + text-decoration: none; +} + +#header ul#logged-user li a:hover +{ + color: #376ea6; + text-decoration: underline; +} + +#header ul#logged-user li.highlight a +{ + color: #ffffff; +} + +#header ul#logged-user li.highlight a:hover +{ + color: #376ea6; +} + +#header #header-inner +{ + margin: 0; + padding: 0; + height: 40px; + clear: both; + position: relative; + background: #003367 url("../images/colors/blue/header_inner.png") repeat-x; + border-bottom: 6px solid #ffffff; +} + +/* ----------------------------------------------------------- + header -> home +----------------------------------------------------------- */ + +#header #header-inner #home +{ + float: left; +} + +#header #header-inner #home a +{ + margin: 0; + padding: 0; + height: 40px; + width: 46px; + display: block; + background: url("../images/colors/blue/button_home.png"); + background-position: 0 0; +} + +#header #header-inner #home a:hover +{ + background-position: 0 -40px; +} + +/* ----------------------------------------------------------- + header -> logo +----------------------------------------------------------- */ + +#header #header-inner #logo +{ + float: left; +} + +#header #header-inner #logo h1 +{ + margin: 13px 0 0 13px; + padding: 0; + color: #FFFFFF; + font-size: 14px; + text-transform: uppercase; +} + +#header #header-inner #logo a +{ + color: #ffffff; + text-decoration: none; +} + +#header #header-inner #logo a:hover +{ + color: #dabf29; +} + +/* ----------------------------------------------------------- + header -> quick +----------------------------------------------------------- */ + +#header #header-inner #quick, +#header #header-inner #quick ul +{ + margin: 10px 5px 0 0; + padding: 0; + position: relative; + float: right; + list-style-type: none; + list-style-position: outside; +} + +#header #header-inner #quick li +{ + margin: 0 4px 0 0; + padding: 0; + position: relative; + float: left; +} + +#header #header-inner #quick li a +{ + top: 0; + left: 0; + padding: 0; + height: 1%; + display: block; + clear: both; + overflow: hidden; + background: #336699 url("../images/colors/blue/quick_l.png") no-repeat top left; + color: #FFFFFF; + font-weight: bold; + text-decoration: none; +} + +#header #header-inner #quick li span +{ + top: 0; + right: 0; + margin: 0; + padding: 10px 12px 8px 10px; + height: 1%; + display: block; + float: left; + background: url("../images/colors/blue/quick_r.png") no-repeat top right; + border-left: 1px solid #3f6f9f; +} + +#header #header-inner #quick li span.icon +{ + top: 0; + left: 0; + padding: 8px 8px 4px 8px; + background: url("../images/colors/blue/quick_l.png") no-repeat top left; + border-left: none; + border-right: 1px solid #2e5c89; +} + +#header #header-inner #quick li a:hover +{ + background: #4e4e4e; +} + +#header #header-inner #quick li a:hover span +{ + background: url("../images/colors/blue/quick_r_selected.png") no-repeat top right; + border-left: 1px solid #545454; +} + +#header #header-inner #quick li a:hover span.icon +{ + background: url("../images/colors/blue/quick_l_selected.png") no-repeat top left; + border-left: none; + border-right: 1px solid #464646; +} + +#header #header-inner #quick ul +{ + top: 29px; + right: 0; + margin: 0; + padding: 0; + width: 200px; + display: none; + position: absolute; + background: #FFFFFF; + border: 1px solid #666; + border-top: 1px solid #003367; +} + +#header #header-inner #quick li ul li +{ + border-bottom: 1px solid #dddddd; +} + +#header #header-inner #quick li ul li.last +{ + border: none; +} + +#header #header-inner #quick li ul li a.repos,#header #header-inner #quick li ul li a.repos:hover +{ + margin: 0; + padding: 12px 9px 7px 28px; + width: 167px; + background: #FFFFFF url("../images/icons/folder_edit.png") no-repeat 8px 9px; +} +#header #header-inner #quick li ul li a.users,#header #header-inner #quick li ul li a.users:hover +{ + margin: 0; + padding: 12px 9px 7px 28px; + width: 167px; + background: #FFFFFF url("../images/icons/user_edit.png") no-repeat 8px 9px; +} +#header #header-inner #quick li ul li a.settings,#header #header-inner #quick li ul li a.settings:hover +{ + margin: 0; + padding: 12px 9px 7px 28px; + width: 167px; + background: #FFFFFF url("../images/icons/cog.png") no-repeat 8px 9px; +} + +#header #header-inner #quick li ul li a.permissions,#header #header-inner #quick li ul li a.permissions:hover +{ + margin: 0; + padding: 12px 9px 7px 28px; + width: 167px; + background: #FFFFFF url("../images/icons/key.png") no-repeat 8px 9px; +} + +#header #header-inner #quick li ul li a +{ + margin: 0; + padding: 7px 9px 7px 9px; + height: 1%; + width: 182px; + height: auto; + display: block; + float: left; + background: #FFFFFF; + color: #0066CC; + font-weight: normal; +} + +#header #header-inner #quick li ul li a:hover +{ + color: #000000; + background: #FFFFFF; +} + +#header #header-inner #quick ul ul +{ + top: auto; +} + +#header #header-inner #quick li ul ul +{ + right: 200px; +} + +#header #header-inner #quick li:hover ul ul, +#header #header-inner #quick li:hover ul ul ul, +#header #header-inner #quick li:hover ul ul ul ul +{ + display: none; +} + +#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 +{ + display: block; +} + +/* ----------------------------------------------------------- + header corners +----------------------------------------------------------- */ + +#header #header-inner div.corner +{ + height: 6px; + width: 6px; + position: absolute; + background: url("../images/colors/blue/header_inner_corners.png") no-repeat; +} + +#header #header-inner div.tl +{ + top: 0; + left: 0; + background-position: 0 0; +} + +#header #header-inner div.tr +{ + top: 0; + right: 0; + background-position: -6px 0; +} + +/* ----------------------------------------------------------- + content +----------------------------------------------------------- */ + +#content +{ + margin: 10px 0 0 0; + padding: 0; + min-height: 100%; + clear: both; + overflow: hidden; + background: url("../images/content.png") repeat-y top left; +} + +/* ----------------------------------------------------------- + content -> left +----------------------------------------------------------- */ + +#content #left +{ + left: 0; + width: 280px; + position: absolute; +} + +/* ----------------------------------------------------------- + content -> left -> menu +----------------------------------------------------------- */ + +#content #left #menu +{ + margin: 5px 10px 0 60px; + padding: 0; + clear: both; + overflow: hidden; +} + +/* ----------------------------------------------------------- + content -> left -> menu / heading +----------------------------------------------------------- */ + +#content #left #menu h6 +{ + margin: 5px 0 0 0; + padding: 0; + clear: both; + overflow: hidden; + background: #dfdfdf url("../images/menu.png") repeat-x; + color: #6e6e6e; +} + +#content #left #menu h6 a +{ + margin: 0; + padding: 0; + height: 1%; + display: block; + clear: both; + overflow: hidden; + background: url("../images/menu_l.png") no-repeat top left; + color: #6e6e6e; + text-decoration: none; +} + +#content #left #menu h6 span +{ + margin: 0; + padding: 9px 10px 10px 10px; + height: 1%; + display: block; + background: url("../images/menu_r.png") no-repeat top right; +} + +#content #left #menu h6.selected +{ + background: #00376e url("../images/colors/blue/menu_selected.png") repeat-x; + color: #FFFFFF; +} + +#content #left #menu h6.selected a +{ + background: url("../images/colors/blue/menu_l_selected.png") no-repeat top left; + color: #ffffff; +} + +#content #left #menu h6.selected span +{ + background: url("../images/colors/blue/menu_r_selected.png") no-repeat top right; +} + +/* ----------------------------------------------------------- + content -> left -> menu / links +----------------------------------------------------------- */ + +#content #left #menu ul +{ + margin: 0; + padding: 0; + background: #376ea6; +} + +#content #left #menu ul.opened +{ + display: block; +} + +#content #left #menu ul.closed +{ + display: none; +} + +#content #left #menu li +{ + margin: 0; + padding: 0; + clear: both; + overflow: hidden; + list-style: none; + border-bottom: 1px solid #5f8bb7; + color: #ffffff; +} + +#content #left #menu li a +{ + margin: 0 0 0 6px; + padding: 8px 0 8px 18px; + height: 1%; + display: block; + float: left; + background: url("../images/colors/colors/blue/menu_arrow.png") no-repeat 0 9px; + color: #ffffff; + text-decoration: none; +} + +#content #left #menu li a:hover +{ + color: #b9dcff; +} + +/* ----------------------------------------------------------- + content -> left -> menu / collapsible +----------------------------------------------------------- */ + +#content #left #menu li.collapsible +{ + background: url("../images/colors/blue/menu_border.png") no-repeat top left; +} + +#content #left #menu li.collapsible a +{ + margin: 0 0 0 6px; + padding: 8px 0 8px 0; + height: 1%; + display: block; + background: transparent; + float: left; + font-weight: bold; +} + +#content #left #menu li.collapsible a.plus +{ + margin: 0; + padding: 8px 0 9px 24px; + height: 10px; + width: 10px; + display: block; + float: left; + background: url("../images/menu_plus.png") no-repeat 5px 10px; + border: none; +} + +#content #left #menu li.collapsible a.minus +{ + margin: 0; + padding: 8px 0 9px 24px; + height: 10px; + width: 10px; + display: block; + float: left; + background: url("../images/menu_minus.png") no-repeat 5px 10px; + border: none; +} + +#content #left #menu li ul +{ + margin: 0; + padding: 0; + border-left: 18px solid #285889; +} + +#content #left #menu li ul.expanded +{ + display: block; +} + +#content #left #menu li ul.collapsed +{ + display: none; +} + +#content #left #menu li ul li +{ + margin: 0; + padding: 0; + clear: both; + overflow: hidden; + list-style: none; + border-bottom: 1px solid #5f8bb7; + color: #ffffff; +} + +#content #left #menu li.collapsible ul li a +{ + font-weight: normal; +} + +#content #left #menu li.last +{ + border-bottom: none; +} + +/* ----------------------------------------------------------- + content -> left -> date picker +----------------------------------------------------------- */ + +#content #left #date-picker +{ + margin: 10px 10px 0 60px; + padding: 0; + clear: both; + overflow: hidden; +} + +#content #left #date-picker .ui-datepicker +{ + width: auto; + padding: 0; + clear: both; + overflow: hidden; + background: #FFFFFF; + border: 1px solid #d1d1d1; +} + +#content #left #date-picker .ui-datepicker .ui-datepicker-header +{ + padding: 5px 0; +} + +#content #left #date-picker .ui-datepicker .ui-datepicker-prev +{ + top: 5px; + left: 4px; +} + +#content #left #date-picker .ui-datepicker .ui-datepicker-next +{ + top: 5px; + right: 4px; +} + +#content #left #date-picker .ui-datepicker .ui-datepicker-prev-hover +{ + top: 5px; + left: 4px; +} + +#content #left #date-picker .ui-datepicker .ui-datepicker-next-hover +{ + top: 5px; + right: 4px; +} + +/* ----------------------------------------------------------- + content -> right +----------------------------------------------------------- */ + +#content #right +{ + margin: 0 60px 10px 290px; +} + +/* ----------------------------------------------------------- + content -> right -> box +----------------------------------------------------------- */ + +#content div.box +{ + margin: 0 0 10px 0; + padding: 0 0 10px 0; + clear: both; + overflow: hidden; + background: #ffffff; +} + +#content div.box-left +{ + margin: 0 0 10px; + width: 49%; + clear: none; + float: left; +} + +#content div.box-right +{ + margin: 0 0 10px; + width: 49%; + clear: none; + float: right; +} + +/* ----------------------------------------------------------- + content -> right -> box / title +----------------------------------------------------------- */ + +#content div.box div.title +{ + margin: 0 0 20px 0; + padding: 0; + clear: both; + overflow: hidden; + background: #336699 url("../images/colors/blue/title.png") repeat-x; +} + +#content div.box div.title h5 +{ + margin: 0; + padding: 11px 0 11px 10px; + float: left; + border: none; + color: #ffffff; + text-transform: uppercase; +} + +#content div.box div.title ul.links +{ + margin: 0; + padding: 0; + float: right; +} + +#content div.box div.title ul.links li +{ + margin: 0; + padding: 0; + list-style: none; + float: left; +} + +#content div.box div.title ul.links li a +{ + margin: 0; + padding: 13px 16px 12px 16px; + height: 1%; + display: block; + float: left; + background: url("../images/colors/blue/title_link.png") no-repeat top left; + border-left: 1px solid #316293; + color: #ffffff; + font-size: 11px; + font-weight: bold; + text-decoration: none; +} + +#content div.box div.title ul.links li a:hover +{ + color: #bfe3ff; +} + +#content div.box div.title ul.links li.ui-tabs-selected a +{ + background: url("../../../resources/images/colors/blue/title_tab_selected.png") no-repeat bottom center; + color: #bfe3ff; +} + +/* ----------------------------------------------------------- + content -> right -> box / headings +----------------------------------------------------------- */ + +#content div.box h1, +#content div.box h2, +#content div.box h3, +#content div.box h4, +#content div.box h5, +#content div.box h6 +{ + margin: 10px 20px 10px 20px; + padding: 0 0 15px 0; + clear: both; + overflow: hidden; + border-bottom: 1px solid #DDDDDD; +} + +/* ----------------------------------------------------------- + content -> right -> box / paragraphs +----------------------------------------------------------- */ + +#content div.box p +{ + margin: 0 24px 10px 24px; + padding: 0; + color: #5f5f5f; + font-size: 12px; + line-height: 150%; +} + +#content div.box blockquote +{ + margin: 0 34px 0 34px; + padding: 0 0 0 14px; + border-left: 4px solid #DDDDDD; + color: #5f5f5f; + font-size: 11px; + line-height: 150%; +} + +#content div.box blockquote p +{ + margin: 10px 0 10px 0; + padding: 0; +} + +/* ----------------------------------------------------------- + content -> right -> box / lists +----------------------------------------------------------- */ + +#content div.box dl +{ + margin: 10px 24px 10px 24px; +} + +#content div.box dt +{ + margin: 0; + font-size: 12px; +} + +#content div.box dd +{ + margin: 0; + padding: 8px 0 8px 15px; + font-size: 12px; +} + +#content div.box ul.left +{ + float: left; +} + +#content div.box ol.left +{ + float: left; +} + +#content div.box li +{ + padding: 4px 0 4px 0; + font-size: 12px; +} + +#content div.box ol.lower-roman, +#content div.box ol.upper-roman +{ + margin: 10px 24px 10px 44px; +} + +#content div.box ol.lower-alpha, +#content div.box ol.upper-alpha +{ + margin: 10px 24px 10px 44px; +} + +#content div.box ol.decimal +{ + margin: 10px 24px 10px 44px; +} + +#content div.box ul.disc, +#content div.box ul.circle +{ + margin: 10px 24px 10px 38px; +} + +#content div.box ul.square +{ + margin: 10px 24px 10px 40px; +} + +/* ----------------------------------------------------------- + content -> right -> box / images +----------------------------------------------------------- */ + +#content div.box img.left +{ + margin: 10px 10px 10px 0; + border: none; + float: left; +} + +#content div.box img.right +{ + margin: 10px 0 10px 10px; + border: none; + float: right; +} + +/* ----------------------------------------------------------- + content -> right -> box / messages +----------------------------------------------------------- */ + +#content div.box div.messages +{ + margin: 0 20px 0 20px; + padding: 0; + clear: both; + overflow: hidden; +} + +#content div.box div.message +{ + margin: 0 0 10px 0; + padding: 0; + clear: both; + overflow: hidden; +} + +#content div.box div.message div.image +{ + margin: 9px 0 0 5px; + padding: 6px; + float: left; +} + +#content div.box div.message div.image img +{ + margin: 0; + vertical-align: middle; +} + +#content div.box div.message div.text +{ + margin: 0; + padding: 9px 6px 9px 6px; + float: left; +} + +#content div.box div.message div.dismiss +{ + margin: 0; + padding: 0; + float: right; +} + +#content div.box div.message div.dismiss a +{ + margin: 15px 14px 0 0; + padding: 0; + height: 16px; + width: 16px; + display: block; + background: url("../images/icons/cross.png") no-repeat; +} + +#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 +{ + margin: 0; + padding: 0px; + border: none; +} + +#content div.box div.message div.text span +{ + margin: 0; + padding: 5px 0 0 0; + height: 1%; + display: block; +} + +#content div.box div.message-error +{ + height: 1%; + clear: both; + overflow: hidden; + background: #FBE3E4; + border: 1px solid #FBC2C4; + color: #860006; +} + +#content div.box div.message-error h6 +{ + color: #860006; +} + +#content div.box div.message-warning +{ + height: 1%; + clear: both; + overflow: hidden; + background: #FFF6BF; + border: 1px solid #FFD324; + color: #5f5200; +} + +#content div.box div.message-warning h6 +{ + color: #5f5200; +} + +#content div.box div.message-notice +{ + height: 1%; + clear: both; + overflow: hidden; + background: #8FBDE0; + border: 1px solid #6BACDE; + color: #003863; +} + +#content div.box div.message-notice h6 +{ + color: #003863; +} + +#content div.box div.message-success +{ + height: 1%; + clear: both; + overflow: hidden; + background: #E6EFC2; + border: 1px solid #C6D880; + color: #4e6100; +} + +#content div.box div.message-success h6 +{ + color: #4e6100; +} + +/* ----------------------------------------------------------- + content -> right -> box / forms +----------------------------------------------------------- */ + +#content div.box div.form +{ + margin: 0; + padding: 0 20px 10px 20px; + clear: both; + overflow: hidden; +} + +#content div.box div.form div.fields +{ + margin: 0; + padding: 0; + clear: both; + overflow: hidden; +} + +#content div.box div.form div.fields div.field +{ + margin: 0; + padding: 10px 0 10px 0; + height: 1%; + border-bottom: 1px solid #DDDDDD; + clear: both; + overflow: hidden; +} + +#content div.box div.form div.fields div.field-first +{ + padding: 0 0 10px 0; +} + +#content div.box div.form div.fields div.field span.error-message +{ + margin: 8px 0 0 0; + padding: 0; + height: 1%; + display: block; + color: #FF0000; +} + +#content div.box div.form div.fields div.field span.success +{ + margin: 8px 0 0 0; + padding: 0; + height: 1%; + display: block; + color: #316309; +} + +/* ----------------------------------------------------------- + content -> right -> forms -> labels +----------------------------------------------------------- */ + +#content div.box div.form div.fields div.field div.label +{ + left: 310px; + margin: 0; + padding: 8px 0 0 5px; + width: auto; + position: absolute; +} + +#content div.box-left div.form div.fields div.field div.label, +#content div.box-right div.form div.fields div.field div.label +{ + left: 0; + margin: 0; + padding: 0 0 8px 0; + width: auto; + position: relative; +} + +/* ----------------------------------------------------------- + content -> right -> forms -> label (select) +----------------------------------------------------------- */ + +#content div.box div.form div.fields div.field div.label-select +{ + padding: 2px 0 0 5px; +} + +#content div.box-left div.form div.fields div.field div.label-select, +#content div.box-right div.form div.fields div.field div.label-select +{ + padding: 0 0 8px 0; +} + +/* ----------------------------------------------------------- + content -> right -> forms -> label (checkbox) +----------------------------------------------------------- */ + +#content div.box div.form div.fields div.field div.label-checkbox +{ + padding: 0 0 0 5px; +} + +/* ----------------------------------------------------------- + content -> right -> forms -> label (radio) +----------------------------------------------------------- */ + +#content div.box div.form div.fields div.field div.label-radio +{ + padding: 0 0 0 5px; +} + +/* ----------------------------------------------------------- + content -> right -> forms -> label (textarea) +----------------------------------------------------------- */ + +#content div.box div.form div.fields div.field div.label-textarea +{ + padding: 0 0 0 5px; +} + +#content div.box-left div.form div.fields div.field div.label-textarea, +#content div.box-right div.form div.fields div.field div.label-textarea +{ + padding: 0 0 8px 0; +} + +/* ----------------------------------------------------------- + content -> right -> forms -> labels (label) +----------------------------------------------------------- */ + +#content div.box div.form div.fields div.field div.label label +{ + color: #393939; + font-weight: bold; +} + +#content div.box div.form div.fields div.field div.label span +{ + margin: 0; + padding: 2px 0 0 0; + height: 1%; + display: block; + color: #363636; +} + +/* ----------------------------------------------------------- + content -> right -> forms -> input +----------------------------------------------------------- */ + +#content div.box div.form div.fields div.field div.input +{ + margin: 0 0 0 200px; + padding: 0; +} + +#content div.box-left div.form div.fields div.field div.input, +#content div.box-right div.form div.fields div.field div.input +{ + margin: 0; + padding: 7px 7px 6px 7px; + border-top: 1px solid #b3b3b3; + border-left: 1px solid #b3b3b3; + border-right: 1px solid #eaeaea; + border-bottom: 1px solid #eaeaea; +} + +#content div.box div.form div.fields div.field div.input input +{ + margin: 0; + padding: 7px 7px 6px 7px; + background: #FFFFFF; + border-top: 1px solid #b3b3b3; + border-left: 1px solid #b3b3b3; + border-right: 1px solid #eaeaea; + border-bottom: 1px solid #eaeaea; + color: #000000; + font-family: Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif; + font-size: 11px; +} + +#content div.box-left div.form div.fields div.field div.input input, +#content div.box-right div.form div.fields div.field div.input input +{ + width: 100%; + padding: 0; + border: none; +} + +#content div.box div.form div.fields div.field div.input input.small +{ + width: 30%; +} + +#content div.box div.form div.fields div.field div.input input.medium +{ + width: 55%; +} + +#content div.box div.form div.fields div.field div.input input.large +{ + width: 85%; +} + +#content div.box div.form div.fields div.field div.input input.date +{ + width: 177px; +} + +#content div.box div.form div.fields div.field div.input input.button +{ + margin: 0; + padding: 4px 8px 4px 8px; + background: #D4D0C8; + border-top: 1px solid #FFFFFF; + border-left: 1px solid #FFFFFF; + border-right: 1px solid #404040; + border-bottom: 1px solid #404040; + color: #000000; +} + +#content div.box div.form div.fields div.field div.input input.error +{ + background: #FBE3E4; + border-top: 1px solid #e1b2b3; + border-left: 1px solid #e1b2b3; + border-right: 1px solid #FBC2C4; + border-bottom: 1px solid #FBC2C4; +} + +#content div.box div.form div.fields div.field div.input input.success +{ + background: #E6EFC2; + border-top: 1px solid #cebb98; + border-left: 1px solid #cebb98; + border-right: 1px solid #c6d880; + border-bottom: 1px solid #c6d880; +} + +#content div.box div.form div.fields div.field div.input img.ui-datepicker-trigger +{ + margin: 0 0 0 6px; +} + +/* ----------------------------------------------------------- + content -> right -> forms -> input (file styling) +----------------------------------------------------------- */ + +#content div.box div.form div.fields div.field div.input a.ui-input-file +{ + margin: 0 0 0 6px; + padding: 0; + width: 28px; + height: 28px; + display: inline; + position: absolute; + overflow: hidden; + cursor: pointer; + background: #e5e3e3 url("../images/button_browse.png") no-repeat; + border: none; + text-decoration: none; +} + +#content div.box div.form div.fields div.field div.input a:hover.ui-input-file +{ + background: #e5e3e3 url("../images/button_browse_selected.png") no-repeat; +} + +/* ----------------------------------------------------------- + content -> right -> forms -> textarea +----------------------------------------------------------- */ + +#content div.box div.form div.fields div.field div.textarea +{ + margin: 0 0 0 200px; + padding: 10px; + border-top: 1px solid #b3b3b3; + border-left: 1px solid #b3b3b3; + border-right: 1px solid #eaeaea; + border-bottom: 1px solid #eaeaea; +} + +#content div.box div.form div.fields div.field div.textarea-editor +{ + padding: 0; + border: 1px solid #dddddd; +} + +#content div.box-left div.form div.fields div.field div.textarea, +#content div.box-right div.form div.fields div.field div.textarea +{ + margin: 0; +} + +#content div.box div.form div.fields div.field div.textarea textarea +{ + margin: 0; + padding: 0; + width: 100%; + height: 220px; + overflow: hidden; + background: #FFFFFF; + border-width: 0; + color: #000000; + font-family: Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif; + font-size: 11px; + outline: none; +} + +#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 +{ + width: 100%; + height: 100px; +} + +#content div.box div.form div.fields div.field div.textarea textarea.error +{ + padding: 3px 10px 10px 23px; + background-color: #FBE3E4; + background-image: url("../../../resources/images/icons/exclamation.png"); + background-repeat: no-repeat; + background-position: 3px 3px; + border: 1px solid #FBC2C4; +} + +#content div.box div.form div.fields div.field div.textarea textarea.success +{ + padding: 3px 10px 10px 23px; + background-color: #E6EFC2; + background-image: url("../../../resources/images/icons/accept.png"); + background-repeat: no-repeat; + background-position: 3px 3px; + border: 1px solid #C6D880; +} + +/* ----------------------------------------------------------- + content -> right -> forms -> textarea (tinymce editor) +----------------------------------------------------------- */ + +#content div.box div.form div.fields div.field div.textarea table +{ + margin: 0; + padding: 0; + width: 100%; + border: none; +} + +#content div.box div.form div.fields div.field div.textarea table td +{ + padding: 0; + background: #DDDDDD; + border: none; +} + +#content div.box div.form div.fields div.field div.textarea table td table +{ + margin: 0; + padding: 0; + width: auto; + border: none; +} + +#content div.box div.form div.fields div.field div.textarea table td table td +{ + padding: 5px 5px 5px 0; + font-family: Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif; + font-size: 11px; +} + +#content div.box div.form div.fields div.field div.textarea table td table td a +{ + border: none; +} + +#content div.box div.form div.fields div.field div.textarea table td table td a.mceButtonActive +{ + background: #b1b1b1; +} + +/* ----------------------------------------------------------- + content -> right -> forms -> select +----------------------------------------------------------- */ + +#content div.box div.form div.fields div.field div.select +{ + margin: 0 0 0 200px; + padding: 0; +} + +#content div.box div.form div.fields div.field div.select a:hover +{ + color: #000000; + text-decoration: none; +} + +#content div.box div.form div.fields div.field div.select select +{ + margin: 0; +} + +/* ----------------------------------------------------------- + content -> right -> forms -> select (jquery styling) +----------------------------------------------------------- */ + +#content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus +{ + border: 1px solid #666666; +} + +#content div.box div.form div.fields div.field div.select a.ui-selectmenu +{ + color: #565656; + text-decoration: none; +} + +#content div.box div.form div.fields div.field div.select a.ui-selectmenu:hover +{ + color: #000000; + text-decoration: none; +} + +#content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus span.ui-icon +{ + background-image: url(../images/ui/ui-icons_222222_256x240.png); +} + +/* ----------------------------------------------------------- + content -> right -> forms -> element focus +----------------------------------------------------------- */ + +#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 +{ + background: #f6f6f6; + border-color: #666; +} + +/* ----------------------------------------------------------- + content -> right -> forms -> checkboxes +----------------------------------------------------------- */ + +#content div.box div.form div.fields div.field div.checkboxes +{ + margin: 0 0 0 200px; + padding: 0; +} + +#content div.box div.form div.fields div.field div.checkboxes div.checkbox +{ + margin: 0; + padding: 2px 0 2px 0; + clear: both; + overflow: hidden; +} + +#content div.box div.form div.fields div.field div.checkboxes div.checkbox input +{ + margin: 0; + float: left; +} + +#content div.box div.form div.fields div.field div.checkboxes div.checkbox label +{ + margin: 3px 0 0 4px; + height: 1%; + display: block; + float: left; +} + +/* ----------------------------------------------------------- + content -> right -> forms -> radios +----------------------------------------------------------- */ + +#content div.box div.form div.fields div.field div.radios +{ + margin: 0 0 0 200px; + padding: 0; +} + +#content div.box div.form div.fields div.field div.radios div.radio +{ + margin: 0; + padding: 2px 0 2px 0; + clear: both; + overflow: hidden; +} + +#content div.box div.form div.fields div.field div.radios div.radio input +{ + margin: 0; + float: left; +} + +#content div.box div.form div.fields div.field div.radios div.radio label +{ + margin: 3px 0 0 4px; + height: 1%; + display: block; + float: left; +} + +/* ----------------------------------------------------------- + content -> right -> forms -> buttons +----------------------------------------------------------- */ + +#content div.box div.form div.fields div.buttons +{ + margin: 10px 0 0 200px; + padding: 0; +} + +#content div.box-left div.form div.fields div.buttons, +#content div.box-right div.form div.fields div.buttons +{ + margin: 10px 0 0 0; +} + +#content div.box div.form div.fields div.buttons input +{ + margin: 0; + color: #000000; + font-family: Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif; + font-size: 11px; + font-weight: bold; +} + +/* ----------------------------------------------------------- + content -> right -> forms -> buttons (jquery styling) +----------------------------------------------------------- */ + +#content div.box div.form div.fields div.buttons input.ui-state-default +{ + margin: 0; + padding: 6px 12px 6px 12px; + background: #e5e3e3 url("../images/button.png") repeat-x; + border-top: 1px solid #DDDDDD; + border-left: 1px solid #c6c6c6; + border-right: 1px solid #DDDDDD; + border-bottom: 1px solid #c6c6c6; + color: #515151; + outline: none; +} + +#content div.box div.form div.fields div.buttons input.ui-state-hover +{ + margin: 0; + padding: 6px 12px 6px 12px; + background: #b4b4b4 url("../images/button_selected.png") repeat-x; + border-top: 1px solid #cccccc; + border-left: 1px solid #bebebe; + border-right: 1px solid #b1b1b1; + border-bottom: 1px solid #afafaf; + color: #515151; + outline: none; +} + +#content div.box div.form div.fields div.buttons div.highlight +{ + display: inline; +} + +#content div.box div.form div.fields div.buttons div.highlight input.ui-state-default +{ + margin: 0; + padding: 6px 12px 6px 12px; + background: #4e85bb url("../images/colors/blue/button_highlight.png") repeat-x; + border-top: 1px solid #5c91a4; + border-left: 1px solid #2a6f89; + border-right: 1px solid #2b7089; + border-bottom: 1px solid #1a6480; + color: #FFFFFF; +} + +#content div.box div.form div.fields div.buttons div.highlight input.ui-state-hover +{ + margin: 0; + padding: 6px 12px 6px 12px; + background: #46a0c1 url("../images/colors/blue/button_highlight_selected.png") repeat-x; + border-top: 1px solid #78acbf; + border-left: 1px solid #34819e; + border-right: 1px solid #35829f; + border-bottom: 1px solid #257897; + color: #FFFFFF; +} + +/* ----------------------------------------------------------- + content -> right -> box / tables +----------------------------------------------------------- */ + +#content div.box div.table +{ + margin: 0; + padding: 0 20px 10px 20px; + clear: both; + overflow: hidden; +} + +#content div.box table +{ + margin: 0; + padding: 0; + width: 100%; + border-collapse: collapse; +} + +#content div.box table th +{ + padding: 10px; + background: #eeeeee; + border-bottom: 1px solid #dddddd; +} + +#content div.box table th.left +{ + text-align: left; +} + +#content div.box table th.right +{ + text-align: right; +} + +#content div.box table th.center +{ + text-align: center; +} + +#content div.box table th.selected +{ + padding: 0; + vertical-align: middle; +} + +#content div.box table th.selected input +{ + margin: 0; +} + +#content div.box table td +{ + padding: 5px; + background: #ffffff; + border-bottom: 1px solid #cdcdcd; +} + +#content div.box table tr.selected td +{ + background: #FFFFCC; +} + +#content div.box table td.selected +{ + padding: 0; + width: 3%; + text-align: center; + vertical-align: middle; +} + +#content div.box table td.selected input +{ + margin: 0; +} + +#content div.box table td.action +{ + width: 45%; + text-align: left; +} + +#content div.box table td.user +{ + width: 10%; + text-align: center; +} + +#content div.box table td.date +{ + width: 33%; + text-align: center; +} + +#content div.box table td.address +{ + width: 10%; + text-align: center; +} + +/* ----------------------------------------------------------- + content -> right -> box / table action +----------------------------------------------------------- */ + +#content div.box div.action +{ + margin: 10px 0 0 0; + padding: 0; + float: right; + background: #FFFFFF; + text-align: right; +} + +#content div.box div.action a:hover +{ + color: #000000; + text-decoration: none; +} + +#content div.box div.action select +{ + margin: 0; + font-family: Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif; + font-size: 11px; +} + +#content div.box div.action div.button +{ + margin: 6px 0 0 0; + padding: 0; + text-align: right; +} + +#content div.box div.action div.button input +{ + margin: 0; + color: #000000; + font-family: Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif; + font-size: 11px; + font-weight: bold; +} + +#content div.box div.action div.button input.ui-state-default +{ + margin: 0; + padding: 6px 12px 6px 12px; + background: #e5e3e3 url("../images/button.png") repeat-x; + border-top: 1px solid #DDDDDD; + border-left: 1px solid #c6c6c6; + border-right: 1px solid #DDDDDD; + border-bottom: 1px solid #c6c6c6; + color: #515151; +} + +#content div.box div.action div.button input.ui-state-hover +{ + margin: 0; + padding: 6px 12px 6px 12px; + background: #b4b4b4 url("../images/button_selected.png") repeat-x; + border-top: 1px solid #cccccc; + border-left: 1px solid #bebebe; + border-right: 1px solid #b1b1b1; + border-bottom: 1px solid #afafaf; + color: #515151; +} + +#content div.box div.action .ui-selectmenu +{ + margin: 0; + padding: 0; +} + +#content div.box div.action a.ui-selectmenu-focus +{ + border: 1px solid #666666; +} + +#content div.box div.action a.ui-selectmenu-focus span.ui-icon +{ + background-image: url(../images/ui/ui-icons_222222_256x240.png); +} + +/* ----------------------------------------------------------- + content -> right -> pagination +----------------------------------------------------------- */ + +#content div.box div.pagination +{ + margin: 10px 0 0 0; + padding: 0; + height: 1%; + clear: both; + overflow: hidden; +} + +#content div.box div.pagination div.results +{ + margin: 0; + padding: 0; + text-align: left; + float: left +} + +#content div.box div.pagination div.results span +{ + margin: 0; + padding: 6px 8px 6px 8px; + height: 1%; + display: block; + float: left; + background: #ebebeb url("../images/pager.png") repeat-x; + border-top: 1px solid #dedede; + border-left: 1px solid #cfcfcf; + border-right: 1px solid #c4c4c4; + border-bottom: 1px solid #c4c4c4; + color: #4A4A4A; + font-weight: bold; +} + +#content div.box div.pagination ul.pager +{ + margin: 0; + padding: 0; + float: right; + text-align: right; +} + +#content div.box div.pagination ul.pager li +{ + margin: 0 0 0 4px; + padding: 0; + height: 1%; + float: left; + list-style: none; + background: #ebebeb url("../images/pager.png") repeat-x; + border-top: 1px solid #dedede; + border-left: 1px solid #cfcfcf; + border-right: 1px solid #c4c4c4; + border-bottom: 1px solid #c4c4c4; + color: #4A4A4A; + font-weight: bold; +} + +#content div.box div.pagination ul.pager li.separator +{ + padding: 6px; +} + +#content div.box div.pagination ul.pager li.current +{ + padding: 6px; + background: #b4b4b4 url("../images/pager_selected.png") repeat-x; + border-top: 1px solid #cccccc; + border-left: 1px solid #bebebe; + border-right: 1px solid #b1b1b1; + border-bottom: 1px solid #afafaf; + color: #515151; +} + +#content div.box div.pagination ul.pager li.disabled +{ + padding: 6px; + color: #B4B4B4; +} + +#content div.box div.pagination ul.pager li a +{ + margin: 0; + padding: 6px; + height: 1%; + display: block; + float: left; + color: #515151; + text-decoration: none; +} + +#content div.box div.pagination ul.pager li a:hover, +#content div.box div.pagination ul.pager li a:active +{ + margin: -1px; + background: #b4b4b4 url("../images/pager_selected.png") repeat-x; + border-top: 1px solid #cccccc; + border-left: 1px solid #bebebe; + border-right: 1px solid #b1b1b1; + border-bottom: 1px solid #afafaf; +} + +/* ----------------------------------------------------------- + content -> webhelpers pagination +----------------------------------------------------------- */ + +#content div.box div.pagination-wh +{ + margin: 10px 0 0 0; + padding: 0; + height: 1%; + clear: both; + overflow: hidden; + text-align: right; +} + +#content div.box div.pagination-wh div.results +{ + margin: 0; + padding: 0; + text-align: left; + float: left +} + +#content div.box div.pagination-wh div.results span +{ + margin: 0; + padding: 6px 8px 6px 8px; + height: 1%; + display: block; + float: left; + background: #ebebeb url("../images/pager.png") repeat-x; + border-top: 1px solid #dedede; + border-left: 1px solid #cfcfcf; + border-right: 1px solid #c4c4c4; + border-bottom: 1px solid #c4c4c4; + color: #4A4A4A; + font-weight: bold; +} + +#content div.box div.pagination-left{ + float:left; +} +#content div.box div.pagination-right{ + float:right; +} + +#content div.box div.pagination-wh a, +#content div.box div.pagination-wh span.pager_dotdot +{ + margin: 0 0 0 4px; + padding: 6px; + height: 1%; + float: left; + background: #ebebeb url("../images/pager.png") repeat-x; + border-top: 1px solid #dedede; + border-left: 1px solid #cfcfcf; + border-right: 1px solid #c4c4c4; + border-bottom: 1px solid #c4c4c4; + color: #4A4A4A; + font-weight: bold; +} +#content div.box div.pagination-wh span.pager_curpage +{ + margin: 0 0 0 4px; + padding: 6px; + height: 1%; + float: left; + background: #b4b4b4 url("../images/pager_selected.png") repeat-x; + border-top: 1px solid #cccccc; + border-left: 1px solid #bebebe; + border-right: 1px solid #b1b1b1; + border-bottom: 1px solid #afafaf; + color: #515151; + font-weight: bold; +} + +#content div.box div.pagination-wh a.disabled +{ + padding: 6px; + color: #B4B4B4; +} + + +#content div.box div.pagination-wh a:hover, +#content div.box div.pagination-wh a:active +{ + background: #b4b4b4 url("../images/pager_selected.png") repeat-x; + border-top: 1px solid #cccccc; + border-left: 1px solid #bebebe; + border-right: 1px solid #b1b1b1; + border-bottom: 1px solid #afafaf; + text-decoration: none; +} + + +/* ----------------------------------------------------------- + content -> right -> traffic chart +----------------------------------------------------------- */ + +#content div.box div.traffic +{ + margin: 0; + padding: 0 20px 10px 20px; + clear: both; + overflow: hidden; +} + +#content div.box div.traffic div.legend +{ + margin: 0 0 10px 0; + padding: 0 0 10px 0; + clear: both; + overflow: hidden; + border-bottom: 1px solid #dddddd; +} + +#content div.box div.traffic div.legend h6 +{ + margin: 0; + padding: 0; + float: left; + border: none; +} + +#content div.box div.traffic div.legend ul +{ + margin: 0; + padding: 0; + float: right; +} + +#content div.box div.traffic div.legend li +{ + margin: 0; + padding: 0 8px 0 4px; + list-style: none; + float: left; + font-size: 11px; +} + +#content div.box div.traffic div.legend li.visits +{ + border-left: 12px solid #edc240; +} + +#content div.box div.traffic div.legend li.pageviews +{ + border-left: 12px solid #afd8f8; +} + +#content div.box div.traffic table +{ + width: auto; +} + +#content div.box div.traffic table td +{ + padding: 2px 3px 3px 3px; + background: transparent; + border: none; +} + +#content div.box div.traffic table td.legendLabel +{ + padding: 0 3px 2px 3px; +} + +/* ----------------------------------------------------------- + footer +----------------------------------------------------------- */ + +#footer +{ + margin: 0; + padding: 5px 0 5px 0; + clear: both; + overflow: hidden; + background: #2a2a2a; + text-align: right; +} + +#footer p +{ + margin: 0 80px 0 80px; + padding: 10px 0 10px 0; + color: #ffffff; +} + +/* ----------------------------------------------------------- + login +----------------------------------------------------------- */ + +#login +{ + margin: 10% auto 0 auto; + padding: 0; + width: 420px; +} + +/* ----------------------------------------------------------- + login -> colors +----------------------------------------------------------- */ + +#login div.color +{ + margin: 10px auto 0 auto; + padding: 3px 3px 3px 0; + clear: both; + overflow: hidden; + background: #FFFFFF; +} + +#login div.color a +{ + margin: 0 0 0 3px; + padding: 0; + width: 20px; + height: 20px; + display: block; + float: left; +} + +/* ----------------------------------------------------------- + login -> title +----------------------------------------------------------- */ + +#login div.title +{ + margin: 0 auto; + padding: 0; + width: 420px; + clear: both; + overflow: hidden; + position: relative; + background: #003367 url("../images/colors/blue/header_inner.png") repeat-x; +} + +#login div.title h5 +{ + margin: 10px; + padding: 0; + color: #ffffff; +} + +/* ----------------------------------------------------------- + login -> title / corners +----------------------------------------------------------- */ + +#login div.title div.corner +{ + height: 6px; + width: 6px; + position: absolute; + background: url("../images/colors/blue/login_corners.png") no-repeat; +} + +#login div.title div.tl +{ + top: 0; + left: 0; + background-position: 0 0; +} + +#login div.title div.tr +{ + top: 0; + right: 0; + background-position: -6px 0; +} + +#login div.inner +{ + margin: 0 auto; + padding: 20px; + width: 380px; + background: #FFFFFF url("../images/login.png") no-repeat top left; + border-top: none; + border-bottom: none; +} + +/* ----------------------------------------------------------- + login -> form +----------------------------------------------------------- */ + +#login div.form +{ + margin: 0; + padding: 0; + clear: both; + overflow: hidden; +} + +#login div.form div.fields +{ + margin: 0; + padding: 0; + clear: both; + overflow: hidden; +} + +#login div.form div.fields div.field +{ + margin: 0; + padding: 0 0 10px 0; + clear: both; + overflow: hidden; +} + +#login div.form div.fields div.field span.error-message +{ + margin: 8px 0 0 0; + padding: 0; + height: 1%; + display: block; + color: #FF0000; +} + +#login div.form div.fields div.field div.label +{ + margin: 2px 10px 0 0; + padding: 5px 0 0 5px; + width: 173px; + float: left; + text-align: right; +} + +#login div.form div.fields div.field div.label label +{ + color: #000000; + font-weight: bold; +} + +#login div.form div.fields div.field div.label span +{ + margin: 0; + padding: 2px 0 0 0; + height: 1%; + display: block; + color: #363636; +} + +#login div.form div.fields div.field div.input +{ + margin: 0; + padding: 0; + float: left; +} + +#login div.form div.fields div.field div.input input +{ + margin: 0; + padding: 7px 7px 6px 7px; + width: 176px; + background: #FFFFFF; + border-top: 1px solid #b3b3b3; + border-left: 1px solid #b3b3b3; + border-right: 1px solid #eaeaea; + border-bottom: 1px solid #eaeaea; + color: #000000; + font-family: Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif; + font-size: 11px; +} + +#login div.form div.fields div.field div.input input.error +{ + background: #FBE3E4; + border-top: 1px solid #e1b2b3; + border-left: 1px solid #e1b2b3; + border-right: 1px solid #FBC2C4; + border-bottom: 1px solid #FBC2C4; +} + +#login div.form div.fields div.field div.input input.success +{ + background: #E6EFC2; + border-top: 1px solid #cebb98; + border-left: 1px solid #cebb98; + border-right: 1px solid #c6d880; + border-bottom: 1px solid #c6d880; +} + +#login div.form div.fields div.field div.input div.link +{ + margin: 6px 0 0 0; + padding: 0; + text-align: right; +} + +#login div.form div.fields div.field div.checkbox +{ + margin: 0 0 0 184px; + padding: 0; +} + +#login div.form div.fields div.field div.checkbox label +{ + color: #565656; + font-weight: bold; +} + +#login div.form div.fields div.buttons +{ + margin: 0; + padding: 10px 0 0 0; + clear: both; + overflow: hidden; + border-top: 1px solid #DDDDDD; + text-align: right; +} + +#login div.form div.fields div.buttons input +{ + margin: 0; + color: #000000; + font-size: 1.0em; + font-weight: bold; + font-family: Verdana, Helvetica, Sans-Serif; +} + +#login div.form div.fields div.buttons input.ui-state-default +{ + margin: 0; + padding: 6px 12px 6px 12px; + background: #e5e3e3 url("../images/button.png") repeat-x; + border-top: 1px solid #DDDDDD; + border-left: 1px solid #c6c6c6; + border-right: 1px solid #DDDDDD; + border-bottom: 1px solid #c6c6c6; + color: #515151; +} + +#login div.form div.fields div.buttons input.ui-state-hover +{ + margin: 0; + padding: 6px 12px 6px 12px; + background: #b4b4b4 url("../images/button_selected.png") repeat-x; + border-top: 1px solid #cccccc; + border-left: 1px solid #bebebe; + border-right: 1px solid #b1b1b1; + border-bottom: 1px solid #afafaf; + color: #515151; +} + +/* ----------------------------------------------------------- + login -> links +----------------------------------------------------------- */ + +#login div.form div.links +{ + margin: 10px 0 0 0; + padding: 0 0 2px 0; + clear: both; + overflow: hidden; +} + +/* ----------------------------------------------------------- + register +----------------------------------------------------------- */ + +#register +{ + margin: 10% auto 0 auto; + padding: 0; + width: 420px; +} + +/* ----------------------------------------------------------- + register -> colors +----------------------------------------------------------- */ + +#register div.color +{ + margin: 10px auto 0 auto; + padding: 3px 3px 3px 0; + clear: both; + overflow: hidden; + background: #FFFFFF; +} + +#register div.color a +{ + margin: 0 0 0 3px; + padding: 0; + width: 20px; + height: 20px; + display: block; + float: left; +} + +/* ----------------------------------------------------------- + register -> title +----------------------------------------------------------- */ + +#register div.title +{ + margin: 0 auto; + padding: 0; + width: 420px; + clear: both; + overflow: hidden; + position: relative; + background: #003367 url("../images/colors/blue/header_inner.png") repeat-x; +} + +#register div.title h5 +{ + margin: 10px; + padding: 0; + color: #ffffff; +} + +/* ----------------------------------------------------------- + register -> inner +----------------------------------------------------------- */ +#register div.title div.corner +{ + height: 6px; + width: 6px; + position: absolute; + background: url("../images/colors/blue/login_corners.png") no-repeat; +} + +#register div.title div.tl +{ + top: 0; + left: 0; + background-position: 0 0; +} + +#register div.title div.tr +{ + top: 0; + right: 0; + background-position: -6px 0; + +} +#register div.inner +{ + margin: 0 auto; + padding: 20px; + width: 380px; + background: #FFFFFF; + border-top: none; + border-bottom: none; +} + +/* ----------------------------------------------------------- + register -> form +----------------------------------------------------------- */ + +#register div.form +{ + margin: 0; + padding: 0; + clear: both; + overflow: hidden; +} + +#register div.form div.fields +{ + margin: 0; + padding: 0; + clear: both; + overflow: hidden; +} + +#register div.form div.fields div.field +{ + margin: 0; + padding: 0 0 10px 0; + clear: both; + overflow: hidden; +} + +#register div.form div.fields div.field span.error-message +{ + margin: 8px 0 0 0; + padding: 0; + height: 1%; + display: block; + color: #FF0000; +} + +#register div.form div.fields div.field div.label +{ + margin: 2px 10px 0 0; + padding: 5px 0 0 5px; + width: 82px; + float: left; + text-align: right; +} + +#register div.form div.fields div.field div.label label +{ + color: #000000; + font-weight: bold; +} + +#register div.form div.fields div.field div.label span +{ + margin: 0; + padding: 2px 0 0 0; + height: 1%; + display: block; + color: #363636; +} + +#register div.form div.fields div.field div.input +{ + margin: 0; + padding: 0; + float: left; +} + +#register div.form div.fields div.field div.input input +{ + margin: 0; + padding: 7px 7px 6px 7px; + width: 266px; + background: #FFFFFF; + border-top: 1px solid #b3b3b3; + border-left: 1px solid #b3b3b3; + border-right: 1px solid #eaeaea; + border-bottom: 1px solid #eaeaea; + color: #000000; + font-family: Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif; + font-size: 11px; +} + +#register div.form div.fields div.field div.input input.error +{ + background: #FBE3E4; + border-top: 1px solid #e1b2b3; + border-left: 1px solid #e1b2b3; + border-right: 1px solid #FBC2C4; + border-bottom: 1px solid #FBC2C4; +} + +#register div.form div.fields div.field div.input input.success +{ + background: #E6EFC2; + border-top: 1px solid #cebb98; + border-left: 1px solid #cebb98; + border-right: 1px solid #c6d880; + border-bottom: 1px solid #c6d880; +} + +#register div.form div.fields div.field div.input div.link +{ + margin: 6px 0 0 0; + padding: 0; + text-align: right; +} + +#register div.form div.fields div.field div.checkbox +{ + margin: 0 0 0 184px; + padding: 0; +} + +#register div.form div.fields div.field div.checkbox label +{ + color: #565656; + font-weight: bold; +} + +#register div.form div.fields div.buttons +{ + margin: 0; + padding: 10px 0 0 97px; + clear: both; + overflow: hidden; + border-top: 1px solid #DDDDDD; + text-align: left; +} + +#register div.form div.fields div.buttons input +{ + margin: 0; + color: #000000; + font-size: 1.0em; + font-weight: bold; + font-family: Verdana, Helvetica, Sans-Serif; +} + +#register div.form div.fields div.buttons input.ui-state-default +{ + margin: 0; + padding: 6px 12px 6px 12px; + background: #e5e3e3 url("../images/button.png") repeat-x; + border-top: 1px solid #DDDDDD; + border-left: 1px solid #c6c6c6; + border-right: 1px solid #DDDDDD; + border-bottom: 1px solid #c6c6c6; + color: #515151; +} +#register div.form div.fields div.buttons div.highlight input.ui-state-default +{ + background:url("../images/colors/blue/button_highlight.png") repeat-x scroll 0 0 #4E85BB; + border-color:#5C91A4 #2B7089 #1A6480 #2A6F89; + border-style:solid; + border-width:1px; + color:#FFFFFF; +} + + + +#register div.form div.fields div.buttons input.ui-state-hover +{ + margin: 0; + padding: 6px 12px 6px 12px; + background: #b4b4b4 url("../images/button_selected.png") repeat-x; + border-top: 1px solid #cccccc; + border-left: 1px solid #bebebe; + border-right: 1px solid #b1b1b1; + border-bottom: 1px solid #afafaf; + color: #515151; +} + + +/* ----------------------------------------------------------- + CHANGESETS +----------------------------------------------------------- */ +#changeset_content { + border:1px solid #CCCCCC; + padding:5px; +} + +#changeset_content .container .wrapper { + width: 600px; +} + +#changeset_content .container { + height: 120px; +} + +#changeset_content .container .left { + float: left; + width: 70%; + padding-left: 5px; +} + +#changeset_content .container .right { + float: right; + width: 25%; + text-align: right; +} + +#changeset_content .container .left .date { + font-weight: bold; +} + +#changeset_content .container .left .author { + +} + +#changeset_content .container .left .message { + font-style: italic; + color: #556CB5; +} + +.cs_files { + +} + +.cs_files .cs_added { + background: url("/images/icons/page_white_add.png") no-repeat scroll 3px; + /*background-color:#BBFFBB;*/ + height: 16px; + padding-left: 20px; + margin-top: 7px; + text-align: left; +} + +.cs_files .cs_changed { + background: url("/images/icons/page_white_edit.png") no-repeat scroll + 3px; + /*background-color: #FFDD88;*/ + height: 16px; + padding-left: 20px; + margin-top: 7px; + text-align: left; +} + +.cs_files .cs_removed { + background: url("/images/icons/page_white_delete.png") no-repeat scroll + 3px; + /*background-color: #FF8888;*/ + height: 16px; + padding-left: 20px; + margin-top: 7px; + text-align: left; +} + + + +/* ----------------------------------------------------------- + CHANGESETS - CANVAS +----------------------------------------------------------- */ + +#graph { + overflow: hidden; +} + +#graph_nodes { + width: 160px; + float: left; + margin-left:-50px; + margin-top: 5px; +} + +#graph_content { + width: 800px; + float: left; +} + +#graph_content .container_header { + border: 1px solid #CCCCCC; + padding:10px; +} + +#graph_content .container .wrapper { + width: 600px; +} + +#graph_content .container { + border-bottom: 1px solid #CCCCCC; + border-left: 1px solid #CCCCCC; + border-right: 1px solid #CCCCCC; + min-height: 80px; + overflow: hidden; +} + +#graph_content .container .left { + float: left; + width: 70%; + padding-left: 5px; +} + +#graph_content .container .right { + float: right; + width: 25%; + text-align: right; +} + +#graph_content .container .left .date { + font-weight: bold; +} + +#graph_content .container .left .author { + +} + +#graph_content .container .left .message { + font-size: 80%; +} + +.right div { + clear: both; +} + +.right .changes .added,.changed,.removed { + border: 1px solid #DDDDDD; + display: block; + float: right; + font-size: 0.75em; + text-align: center; + min-width: 15px; +} + +.right .changes .added { + background: #BBFFBB; +} + +.right .changes .changed { + background: #FFDD88; +} + +.right .changes .removed { + background: #FF8888; +} + +.right .merge { + vertical-align: top; + font-size: 60%; + font-weight: bold; +} + +.right .merge img { + vertical-align: bottom; +} + +.right .parent { + font-size: 90%; + font-family: monospace; +} + + + +/* ----------------------------------------------------------- + FILE BROWSER +----------------------------------------------------------- */ +div.browserblock { + overflow: hidden; + padding: 0px; + border: 1px solid #ccc; + background: #f8f8f8; + font-size: 100%; + line-height: 100%; + /* new */ + line-height: 125%; +} + +div.browserblock .browser-header { + border-bottom: 1px solid #CCCCCC; + background: #FFFFFF; + color: blue; + padding: 10px 0 10px 0; +} + +div.browserblock .browser-header span { + margin-left: 25px; + font-weight: bold; +} + +div.browserblock .browser-body { + background: #EEEEEE; +} + +table.code-browser { + border-collapse: collapse; + width: 100%; +} + +table.code-browser tr { + margin: 3px; +} + +table.code-browser thead th { + background-color: #EEEEEE; + height: 20px; + font-size: 1.1em; + font-weight: bold; + text-align: center; + text-align: left; + padding-left: 10px; +} + +table.code-browser tbody tr { + +} + +table.code-browser tbody td { + padding-left: 10px; + height: 20px; +} +table.code-browser .browser-file { + background: url("/images/icons/document_16.png") no-repeat scroll 3px; + height: 16px; + padding-left: 20px; + text-align: left; +} + +table.code-browser .browser-dir { + background: url("/images/icons/folder_16.png") no-repeat scroll 3px; + height: 16px; + padding-left: 20px; + text-align: left; +} + + +/* ----------------------------------------------------------- + INFOBOX +----------------------------------------------------------- */ +.info_box *{ + background:url("../../images/pager.png") repeat-x scroll 0 0 #EBEBEB; + border-color:#DEDEDE #C4C4C4 #C4C4C4 #CFCFCF; + border-style:solid; + border-width:1px; + color:#4A4A4A; + display:block; + font-weight:bold; + height:1%; + padding:4px 6px; + display: inline; +} +.info_box span{ + margin-left:3px; + margin-righ:3px; +} +.info_box input { + padding:3px 6px; +} + +/* ----------------------------------------------------------- + TOOLTIP +----------------------------------------------------------- */ +.yui-overlay,.yui-panel-container { + visibility: hidden; + position: absolute; + z-index: 2; +} + +.yui-tt { + visibility: hidden; + position: absolute; + color: #666666; + background-color: #FFFFFF; + font-family: arial, helvetica, verdana, sans-serif; + padding: 8px; + border: 2px solid #556CB5; + font: 100% sans-serif; + width: auto; + opacity: 1.0; +} + +.yui-tt-shadow { + display: none; +} + +/* ----------------------------------------------------------- + AUTOCOMPLETE +----------------------------------------------------------- */ + +.ac{ + vertical-align: top; + +} +.ac .match { + font-weight:bold; +} + +.ac .yui-ac { + position: relative; + font-family: arial; + font-size: 100%; +} + +.ac .perm_ac{ + width:15em; +} +/* styles for input field */ +.ac .yui-ac-input { + width: 100%; +} + +/* styles for results container */ +.ac .yui-ac-container { + position: absolute; + top: 1.6em; + width: 100%; +} + +/* styles for header/body/footer wrapper within container */ +.ac .yui-ac-content { + position: absolute; + width: 100%; + border: 1px solid #808080; + background: #fff; + overflow: hidden; + z-index: 9050; +} + +/* styles for container shadow */ +.ac .yui-ac-shadow { + position: absolute; + margin: .3em; + width: 100%; + background: #000; + -moz-opacity: 0.10; + opacity: .10; + filter: alpha(opacity = 10); + z-index: 9049; +} + +/* styles for results list */ +.ac .yui-ac-content ul { + margin: 0; + padding: 0; + width: 100%; +} + +/* styles for result item */ +.ac .yui-ac-content li { + margin: 0; + padding: 2px 5px; + cursor: default; + white-space: nowrap; +} + +/* styles for prehighlighted result item */ +.ac .yui-ac-content li.yui-ac-prehighlight { + background: #B3D4FF; +} + +/* styles for highlighted result item */ +.ac .yui-ac-content li.yui-ac-highlight { + background: #556CB5; + color: #FFF; +} + + +/* ----------------------------------------------------------- + ACTION ICONS +----------------------------------------------------------- */ +.add_icon { + background: url("/images/icons/add.png") no-repeat scroll 3px ; + height: 16px; + padding-left: 20px; + padding-top: 1px; + text-align: left; +} + +.edit_icon { + background: url("/images/icons/folder_edit.png") no-repeat scroll 3px; + height: 16px; + padding-left: 20px; + padding-top: 1px; + text-align: left; +} + +.delete_icon { + background: url("/images/icons/delete.png") no-repeat scroll 3px; + height: 16px; + padding-left: 20px; + padding-top: 1px; + text-align: left; +} + +.rss_icon { + background: url("/images/icons/rss_16.png") no-repeat scroll 3px; + height: 16px; + padding-left: 20px; + padding-top: 1px; + text-align: left; +} + +.atom_icon { + background: url("/images/icons/atom.png") no-repeat scroll 3px; + height: 16px; + padding-left: 20px; + padding-top: 1px; + text-align: left; +} + +.archive_icon { + background: url("/images/icons/compress.png") no-repeat scroll 3px; + height: 16px; + padding-left: 20px; + text-align: left; + padding-top: 1px; +} + + + + +.action_button { + border: 0px; + display: block; +} + +.action_button:hover { + border: 0px; + font-style: italic; + cursor: pointer; +} + +/* ----------------------------------------------------------- + BREADCRUMBS +----------------------------------------------------------- */ + +.breadcrumbs{ + border:medium none; + color:#FFFFFF; + float:left; + margin:0; + padding:11px 0 11px 10px; + text-transform:uppercase; + font-weight: bold; + font-size: 14px; +} +.breadcrumbs a{ + color: #FFFFFF; +} + + +/* ----------------------------------------------------------- + FLASH MSG +----------------------------------------------------------- */ +.flash_msg ul { + margin: 0; + padding: 0px 0px 10px 0px; +} + +.error_msg { + background-color: #FFCFCF; + background-image: url("/images/icons/error_msg.png"); + border: 1px solid #FF9595; + color: #CC3300; +} + +.warning_msg { + background-color: #FFFBCC; + background-image: url("/images/icons/warning_msg.png"); + border: 1px solid #FFF35E; + color: #C69E00; +} + +.success_msg { + background-color: #D5FFCF; + background-image: url("/images/icons/success_msg.png"); + border: 1px solid #97FF88; + color: #009900; +} + +.notice_msg { + background-color: #DCE3FF; + background-image: url("/images/icons/notice_msg.png"); + border: 1px solid #93A8FF; + color: #556CB5; +} + +.success_msg,.error_msg,.notice_msg,.warning_msg { + background-position: 10px center; + background-repeat: no-repeat; + font-size: 12px; + font-weight: bold; + min-height: 14px; + line-height: 14px; + margin-bottom: 0px; + margin-top: 0px; + padding: 6px 10px 6px 40px; + display: block; + overflow: auto; +} + +#msg_close { + background: transparent url("icons/cross_grey_small.png") no-repeat + scroll 0 0; + cursor: pointer; + height: 16px; + position: absolute; + right: 5px; + top: 5px; + width: 16px; +} +/* ----------------------------------------------------------- + YUI FLOT +----------------------------------------------------------- */ + +div#commit_history{ + float: left; +} +div#legend_data{ + float:left; + +} +div#legend_container { + float: left; +} + +div#legend_container table,div#legend_choices table{ + width:auto !important; +} + +div#legend_container table td{ + border: none !important; + padding: 2px !important; +} + +div#legend_choices table td{ + border: none !important; + padding: 0px !important; +} + +div#legend_choices{ + float:left; +} + +/* ----------------------------------------------------------- + PERMISSIONS TABLE +----------------------------------------------------------- */ +table#permissions_manage{ + width: 0 !important; + +} +table#permissions_manage span.private_repo_msg{ + style="font-size: 0.8em" +} +table#permissions_manage tr#add_perm_input td{ + vertical-align:middle; + +} + + +/* ----------------------------------------------------------- + jquery ui +----------------------------------------------------------- */ + +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute; left: -99999999px; } +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + +/* ----------------------------------------------------------- + jquery ui -> icons +----------------------------------------------------------- */ + +.ui-icon { width: 16px; height: 16px; background-image: url(../images/ui/ui-icons_222222_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(../images/ui/ui-icons_222222_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(../images/ui/ui-icons_222222_256x240.png); } +.ui-state-default .ui-icon { background-image: url(../images/ui/ui-icons_ef8c08_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon { background-image: url(../images/ui/ui-icons_ef8c08_256x240.png); } +.ui-state-active .ui-icon {background-image: url(../images/ui/ui-icons_ef8c08_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(../images/ui/ui-icons_228ef1_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(../images/ui/ui-icons_ffd27a_256x240.png); } + +/* ----------------------------------------------------------- + jquery ui -> icon positioning +----------------------------------------------------------- */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + +/* ----------------------------------------------------------- + jquery ui -> tabs +----------------------------------------------------------- */ +.ui-tabs .ui-tabs-hide { display: none; } + +/* ----------------------------------------------------------- + jquery ui -> datepicker +----------------------------------------------------------- */ +.ui-datepicker { width: 17em; padding: .2em .2em 0; background: #FFFFFF; border: 1px solid #000000; border-top: none; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; background: #F6F6F6; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 1px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left: 0; } +.ui-datepicker .ui-datepicker-next { right: 0; } +.ui-datepicker .ui-datepicker-prev-hover { left: 0; } +.ui-datepicker .ui-datepicker-next-hover { right: 0; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker table {width: 100%; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: 3px; text-align: center; text-decoration: none; } +.ui-datepicker td span, .ui-datepicker td a:hover { background: #376ea6; color: #ffffff; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } +.ui-datepicker td span, .ui-datepicker td.ui-datepicker-today a { background: #DDDDDD; color: #585858; } +.ui-datepicker td span, .ui-datepicker td.ui-datepicker-current-day a { background: #376ea6; color: #ffffff; } + +/* ----------------------------------------------------------- + jquery ui -> datepicker / multiple calenders +----------------------------------------------------------- */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; } + +/* ----------------------------------------------------------- + jquery ui -> datepicker / rtl support +----------------------------------------------------------- */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* ----------------------------------------------------------- + jquery ui -> select styling +----------------------------------------------------------- */ + +.ui-selectmenu +{ + display: block; + position: relative; + overflow: hidden; + background: #ffffff; + border-top: 1px solid #b3b3b3; + border-left: 1px solid #b3b3b3; + border-right: 1px solid #eaeaea; + border-bottom: 1px solid #eaeaea; + text-align: left; + text-decoration: none; +} + +.ui-selectmenu-icon { position:absolute; right:6px; margin-top:-8px; top: 50%; } +.ui-selectmenu-menu { padding:0; margin:0; list-style:none; position:absolute; top: 0; visibility: hidden; overflow: auto; } +.ui-selectmenu-open { background: #ffffff; border: 1px solid #666666; border-top: none; visibility: visible; } +.ui-selectmenu-menu-popup { margin-top: -1px; } +.ui-selectmenu-menu-dropdown { } +.ui-selectmenu-menu li { padding:0; margin:0; display: block; border-top: 1px dotted transparent; border-bottom: 1px dotted transparent; border-right-width: 0 !important; border-left-width: 0 !important; } +.ui-selectmenu-menu li a,.ui-selectmenu-status {line-height: 1.4em; display:block; padding: 5px 0 5px 8px; outline:none; text-decoration:none; color: #000000; } +.ui-selectmenu-menu li.ui-selectmenu-hasIcon a, +.ui-selectmenu-hasIcon .ui-selectmenu-status { margin-left: 5px; padding-left: 20px; position: relative; } +.ui-selectmenu-menu li .ui-icon, .ui-selectmenu-status .ui-icon { position: absolute; top: 1em; margin-top: -8px; left: 0; } +.ui-selectmenu-status { line-height: 1.4em; } +.ui-selectmenu-open li.ui-selectmenu-item-focus { background: #376ea6; } +.ui-selectmenu-open li.ui-selectmenu-item-focus a { color: #ffffff; } +.ui-selectmenu-open li.ui-selectmenu-item-selected { background: #dfdfdf; } +.ui-selectmenu-open li.ui-selectmenu-item-selected a { color: #000000; } +.ui-selectmenu-menu li span,.ui-selectmenu-status span { display:block; margin-bottom: .2em; } +.ui-selectmenu-menu .ui-selectmenu-group .ui-selectmenu-group-label { line-height: 1.4em; display:block; padding:.6em .5em 0; } +.ui-selectmenu-menu .ui-selectmenu-group ul { margin: 0; padding: 0; } \ No newline at end of file diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/css/style_full.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pylons_app/public/css/style_full.css Sat Jul 24 02:17:48 2010 +0200 @@ -0,0 +1,36 @@ +/* ----------------------------------------------------------- + content +----------------------------------------------------------- */ + +#content +{ + margin: 10px 60px 0 60px; + padding: 0; + min-height: 100%; + clear: both; + overflow: hidden; + background: transparent; +} + +/* ----------------------------------------------------------- + content -> right -> forms -> labels +----------------------------------------------------------- */ + +#content div.box div.form div.fields div.field div.label +{ + left: 80px; + margin: 0; + padding: 8px 0 0 5px; + width: auto; + position: absolute; +} + +#content div.box-left div.form div.fields div.field div.label, +#content div.box-right div.form div.fields div.field div.label +{ + left: 0; + margin: 0; + padding: 0 0 8px 0; + width: auto; + position: relative; +} \ No newline at end of file diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/background.png Binary file pylons_app/public/images/background.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/button.png Binary file pylons_app/public/images/button.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/button_browse.png Binary file pylons_app/public/images/button_browse.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/button_browse_selected.png Binary file pylons_app/public/images/button_browse_selected.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/button_selected.png Binary file pylons_app/public/images/button_selected.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/colors/blue/button_highlight.png Binary file pylons_app/public/images/colors/blue/button_highlight.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/colors/blue/button_highlight_selected.png Binary file pylons_app/public/images/colors/blue/button_highlight_selected.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/colors/blue/button_home.png Binary file pylons_app/public/images/colors/blue/button_home.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/colors/blue/header_inner.png Binary file pylons_app/public/images/colors/blue/header_inner.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/colors/blue/header_inner_corners.png Binary file pylons_app/public/images/colors/blue/header_inner_corners.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/colors/blue/index.sof Binary file pylons_app/public/images/colors/blue/index.sof has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/colors/blue/login_corners.png Binary file pylons_app/public/images/colors/blue/login_corners.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/colors/blue/menu_arrow.png Binary file pylons_app/public/images/colors/blue/menu_arrow.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/colors/blue/menu_border.png Binary file pylons_app/public/images/colors/blue/menu_border.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/colors/blue/menu_l_selected.png Binary file pylons_app/public/images/colors/blue/menu_l_selected.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/colors/blue/menu_r_selected.png Binary file pylons_app/public/images/colors/blue/menu_r_selected.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/colors/blue/menu_selected.png Binary file pylons_app/public/images/colors/blue/menu_selected.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/colors/blue/quick_l.png Binary file pylons_app/public/images/colors/blue/quick_l.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/colors/blue/quick_l_selected.png Binary file pylons_app/public/images/colors/blue/quick_l_selected.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/colors/blue/quick_r.png Binary file pylons_app/public/images/colors/blue/quick_r.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/colors/blue/quick_r_selected.png Binary file pylons_app/public/images/colors/blue/quick_r_selected.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/colors/blue/title.png Binary file pylons_app/public/images/colors/blue/title.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/colors/blue/title_link.png Binary file pylons_app/public/images/colors/blue/title_link.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/colors/blue/title_tab_selected.png Binary file pylons_app/public/images/colors/blue/title_tab_selected.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/content.png Binary file pylons_app/public/images/content.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/header_background.png Binary file pylons_app/public/images/header_background.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/icons/cross.png Binary file pylons_app/public/images/icons/cross.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/icons/index.sof Binary file pylons_app/public/images/icons/index.sof has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/icons/success.png Binary file pylons_app/public/images/icons/success.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/icons/warning.png Binary file pylons_app/public/images/icons/warning.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/login.png Binary file pylons_app/public/images/login.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/menu.png Binary file pylons_app/public/images/menu.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/menu_l.png Binary file pylons_app/public/images/menu_l.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/menu_minus.png Binary file pylons_app/public/images/menu_minus.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/menu_plus.png Binary file pylons_app/public/images/menu_plus.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/menu_r.png Binary file pylons_app/public/images/menu_r.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/pager.png Binary file pylons_app/public/images/pager.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/images/pager_selected.png Binary file pylons_app/public/images/pager_selected.png has changed diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/js/excanvas.min.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pylons_app/public/js/excanvas.min.js Sat Jul 24 02:17:48 2010 +0200 @@ -0,0 +1,1 @@ +if(!document.createElement("canvas").getContext){(function(){var R=Math;var S=R.round;var O=R.sin;var a=R.cos;var J=R.abs;var Y=R.sqrt;var A=10;var K=A/2;function G(){return this.context_||(this.context_=new M(this))}var Q=Array.prototype.slice;function b(c,d,e){var Z=Q.call(arguments,2);return function(){return c.apply(d,Z.concat(Q.call(arguments)))}}var H={init:function(Z){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var c=Z||document;c.createElement("canvas");c.attachEvent("onreadystatechange",b(this.init_,this,c))}},init_:function(e){if(!e.namespaces.g_vml_){e.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML")}if(!e.namespaces.g_o_){e.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML")}if(!e.styleSheets.ex_canvas_){var d=e.createStyleSheet();d.owningElement.id="ex_canvas_";d.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}g_o_\\:*{behavior:url(#default#VML)}"}var c=e.getElementsByTagName("canvas");for(var Z=0;Z','","");this.element_.insertAdjacentHTML("BeforeEnd",z.join(""))};I.stroke=function(AE){var j=[];var k=false;var AP=C(AE?this.fillStyle:this.strokeStyle);var AA=AP.color;var AK=AP.alpha*this.globalAlpha;var f=10;var m=10;j.push("w.x){w.x=AI.x}if(AO.y==null||AI.yw.y){w.y=AI.y}}}j.push(' ">');if(!AE){var v=this.lineScale_*this.lineWidth;if(v<1){AK*=v}j.push("')}else{if(typeof this.fillStyle=="object"){var n=this.fillStyle;var t=0;var AH={x:0,y:0};var AB=0;var r=1;if(n.type_=="gradient"){var q=n.x0_/this.arcScaleX_;var d=n.y0_/this.arcScaleY_;var o=n.x1_/this.arcScaleX_;var AQ=n.y1_/this.arcScaleY_;var AM=this.getCoords_(q,d);var AL=this.getCoords_(o,AQ);var h=AL.x-AM.x;var g=AL.y-AM.y;t=Math.atan2(h,g)*180/Math.PI;if(t<0){t+=360}if(t<0.000001){t=0}}else{var AM=this.getCoords_(n.x0_,n.y0_);var Z=w.x-AO.x;var e=w.y-AO.y;AH={x:(AM.x-AO.x)/Z,y:(AM.y-AO.y)/e};Z/=this.arcScaleX_*A;e/=this.arcScaleY_*A;var AG=R.max(Z,e);AB=2*n.r0_/AG;r=2*n.r1_/AG-AB}var z=n.colors_;z.sort(function(i,c){return i.offset-c.offset});var u=z.length;var y=z[0].color;var x=z[u-1].color;var AD=z[0].alpha*this.globalAlpha;var AC=z[u-1].alpha*this.globalAlpha;var AF=[];for(var AJ=0;AJ')}else{j.push('')}}j.push("");this.element_.insertAdjacentHTML("beforeEnd",j.join(""))};I.fill=function(){this.stroke(true)};I.closePath=function(){this.currentPath_.push({type:"close"})};I.getCoords_=function(d,c){var Z=this.m_;return{x:A*(d*Z[0][0]+c*Z[1][0]+Z[2][0])-K,y:A*(d*Z[0][1]+c*Z[1][1]+Z[2][1])-K}};I.save=function(){var Z={};T(this,Z);this.aStack_.push(Z);this.mStack_.push(this.m_);this.m_=D(N(),this.m_)};I.restore=function(){T(this.aStack_.pop(),this);this.m_=this.mStack_.pop()};I.translate=function(d,c){var Z=[[1,0,0],[0,1,0],[d,c,1]];this.m_=D(Z,this.m_)};I.rotate=function(d){var f=a(d);var e=O(d);var Z=[[f,e,0],[-e,f,0],[0,0,1]];this.m_=D(Z,this.m_)};I.scale=function(f,e){this.arcScaleX_*=f;this.arcScaleY_*=e;var c=[[f,0,0],[0,e,0],[0,0,1]];var Z=this.m_=D(c,this.m_);var d=Z[0][0]*Z[1][1]-Z[0][1]*Z[1][0];this.lineScale_=Y(J(d))};I.clip=function(){};I.arcTo=function(){};I.createPattern=function(){return new F};function W(Z){this.type_=Z;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}W.prototype.addColorStop=function(c,Z){Z=C(Z);this.colors_.push({offset:c,color:Z.color,alpha:Z.alpha})};function F(){}G_vmlCanvasManager=H;CanvasRenderingContext2D=M;CanvasGradient=W;CanvasPattern=F})()}; \ No newline at end of file diff -r 3581656180b7 -r 558eb7c5028f pylons_app/public/js/yui.flot.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pylons_app/public/js/yui.flot.js Sat Jul 24 02:17:48 2010 +0200 @@ -0,0 +1,2483 @@ +/** +\file yui.flot.js +\brief Javascript plotting library for YUI based on Flot v. 0.5. +\details +This file contains a port of Flot for YUI + +Copyright (c) 2009 Yahoo! Inc. All rights reserved. The copyrights embodied +in the content of this file are licenced by Yahoo! Inc. under the BSD (revised) +open source license. + +Requires yahoo-dom-event and datasource which you can get here: + + +Datasource is optional, you only need it if one of your axes has its mode set to "time" +*/ + +(function() { + var L = YAHOO.lang; + var UA = YAHOO.env.ua; + var DOM = YAHOO.util.Dom; + var E = YAHOO.util.Event; + + if(!DOM.createElementFromMarkup) { + DOM.createElementFromMarkup = function(markup) { + var p=document.createElement('div'); + p.innerHTML = markup; + var e = p.firstChild; + return p.removeChild(e); + }; + } + + if(!DOM.removeElement) { + DOM.removeElement = function(el) { + return el.parentNode.removeChild(el); + }; + } + + function Plot(target_, data_, options_) { + // data is on the form: + // [ series1, series2 ... ] + // where series is either just the data as [ [x1, y1], [x2, y2], ... ] + // or { data: [ [x1, y1], [x2, y2], ... ], label: "some label" } + + var series = [], + options = { + // the color theme used for graphs + colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"], + locale: "en", + legend: { + show: true, + noColumns: 1, // number of colums in legend table + labelFormatter: null, // fn: string -> string + labelBoxBorderColor: "#ccc", // border color for the little label boxes + container: null, // container (as jQuery object) to put legend in, null means default on top of graph + position: "ne", // position of default legend container within plot + margin: 5, // distance from grid edge to default legend container within plot + backgroundColor: null, // null means auto-detect + backgroundOpacity: 0.85 // set to 0 to avoid background + }, + xaxis: { + mode: null, // null or "time" + min: null, // min. value to show, null means set automatically + max: null, // max. value to show, null means set automatically + autoscaleMargin: null, // margin in % to add if auto-setting min/max + ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks + tickFormatter: null, // fn: number -> string + label: null, + labelWidth: null, // size of tick labels in pixels + labelHeight: null, + + scaleType: 'linear', // may be 'linear' or 'log' + + // mode specific options + tickDecimals: null, // no. of decimals, null means auto + tickSize: null, // number or [number, "unit"] + minTickSize: null, // number or [number, "unit"] + timeformat: null // format string to use + }, + yaxis: { + label: null, + autoscaleMargin: 0.02 + }, + x2axis: { + label: null, + autoscaleMargin: null + }, + y2axis: { + label: null, + autoscaleMargin: 0.02 + }, + points: { + show: false, + radius: 3, + lineWidth: 2, // in pixels + fill: true, + fillColor: "#ffffff" + }, + lines: { + // we don't put in show: false so we can see + // whether lines were actively disabled + lineWidth: 2, // in pixels + fill: false, + fillColor: null + }, + bars: { + show: false, + lineWidth: 2, // in pixels + barWidth: 1, // in units of the x axis + fill: true, + fillColor: null, + align: "left" // or "center" + }, + grid: { + show: true, + showLines: true, + color: "#545454", // primary color used for outline and labels + backgroundColor: null, // null for transparent, else color + tickColor: "#dddddd", // color used for the ticks + labelMargin: 5, // in pixels + labelFontSize: 16, + borderWidth: 2, // in pixels + borderColor: null, // set if different from the grid color + markings: null, // array of ranges or fn: axes -> array of ranges + markingsColor: "#f4f4f4", + markingsLineWidth: 2, + // interactive stuff + clickable: false, + hoverable: false, + autoHighlight: true, // highlight in case mouse is near + mouseActiveRadius: 10 // how far the mouse can be away to activate an item + }, + selection: { + mode: null, // one of null, "x", "y" or "xy" + color: "#e8cfac" + }, + crosshair: { + mode: null, // one of null, "x", "y" or "xy", + color: "#aa0000" + }, + shadowSize: 3 + }, + canvas = null, // the canvas for the plot itself + overlay = null, // canvas for interactive stuff on top of plot + eventHolder = null, // jQuery object that events should be bound to + ctx = null, octx = null, + target = DOM.get(target_), + axes = { xaxis: {}, yaxis: {}, x2axis: {}, y2axis: {} }, + plotOffset = { left: 0, right: 0, top: 0, bottom: 0}, + canvasWidth = 0, canvasHeight = 0, + plotWidth = 0, plotHeight = 0, + // dedicated to storing data for buggy standard compliance cases + workarounds = {}; + + this.setData = setData; + this.setupGrid = setupGrid; + this.draw = draw; + this.clearSelection = clearSelection; + this.setSelection = setSelection; + this.getCanvas = function() { return canvas; }; + this.getPlotOffset = function() { return plotOffset; }; + this.getData = function() { return series; }; + this.getAxes = function() { return axes; }; + this.setCrosshair = setCrosshair; + this.clearCrosshair = function () { setCrosshair(null); }; + this.highlight = highlight; + this.unhighlight = unhighlight; + + // initialize + parseOptions(options_); + setData(data_); + constructCanvas(); + setupGrid(); + draw(); + + var plot = this; + + plot.createEvent('plotclick'); + plot.createEvent('plothover'); + plot.createEvent('plotselected'); + plot.createEvent('plotunselected'); + + + + function setData(d) { + series = parseData(d); + + fillInSeriesOptions(); + processData(); + } + + function normalizeData(d) { + var possible_controls = ['x', 'time', 'date']; + + if (L.isArray(d)) { + d = { data: d }; + } else { + d = L.merge(d); + } + + if(d.disabled) { + return undefined; + } + + if (d.data.length === 0) { + return undefined; + } + + var j, k; + + // Make a copy so we don't obliterate the caller's data + var _data = []; + + if (L.isArray(d.data[0])) { + for(j=0; j 1); + if(s.dropped[j]) { + drops-=1; + } + + if(!isNaN(x) && !isNaN(x)) + drops+=dropperiod; + else { + drops=0; // bonus for a null point + points--; + dropperiod=1-canvasWidth/10/points; + } + } + + return s; + } + + function splitSeries(s) { + var res = []; + + for(var k=0; k= options.colors.length) { + i = 0; + ++variation; + } + } + + // fill in the options + var colori = 0, s; + for (i = 0; i < series.length; ++i) { + s = series[i]; + + // assign colors + if (s.color == null) { + s.color = colors[colori].toString(); + ++colori; + } + else if (typeof s.color == "number") + s.color = colors[s.color].toString(); + + // copy the rest + s.lines = L.merge(options.lines, s.lines || {}); + s.points = L.merge(options.points, s.points || {}); + s.bars = L.merge(options.bars, s.bars || {}); + + // turn on lines automatically in case nothing is set + if (s.lines.show == null && !s.bars.show && !s.points.show) + s.lines.show = true; + + if (s.shadowSize == null) + s.shadowSize = options.shadowSize; + + if (s.xaxis && s.xaxis == 2) + s.xaxis = axes.x2axis; + else + s.xaxis = axes.xaxis; + if (s.yaxis && s.yaxis >= 2) { + if(!axes['y' + s.yaxis + 'axis']) + axes['y' + s.yaxis + 'axis'] = {}; + if(!options['y' + s.yaxis + 'axis']) + options['y' + s.yaxis + 'axis'] = { autoscaleMargin: 0.02 }; + s.yaxis = axes['y' + s.yaxis + 'axis']; + } + else + s.yaxis = axes.yaxis; + } + } + + function processData() { + var topSentry = Number.POSITIVE_INFINITY, + bottomSentry = Number.NEGATIVE_INFINITY, + axis; + + for (axis in axes) { + axes[axis].datamin = topSentry; + axes[axis].datamax = bottomSentry; + axes[axis].min = options[axis].min; + axes[axis].max = options[axis].max; + axes[axis].used = false; + } + + for (var i = 0; i < series.length; ++i) { + var s = series[i]; + var data = s.data, + axisx = s.xaxis, axisy = s.yaxis, + xmin = topSentry, xmax = bottomSentry, + ymin = topSentry, ymax = bottomSentry, + x, y, p; + + axisx.used = axisy.used = true; + + if (s.bars.show) { + // make sure we got room for the bar + var delta = s.bars.align == "left" ? 0 : -s.bars.barWidth/2; + xmin += delta; + xmax += delta + s.bars.barWidth; + } + + for (var j = 0; j < data.length; ++j) { + p = data[j]; + + if(data[j] === null) + continue; + + x = p.x; + y = p.y; + + if(L.isObject(x) && x.getTime) { // this is a Date object + x = x.getTime()/1000; + } + + if(L.isObject(y) && y.getTime) { // this is a Date object + y = y.getTime()/1000; + } + + // convert to number + if (x != null && !isNaN(x = +x)) { + if (x < xmin) + xmin = x; + if (x > xmax) + xmax = x; + } + else + x = null; + + if (y != null && !isNaN(y = +y)) { + if (y < ymin) + ymin = y; + if (y > ymax) + ymax = y; + } + else + y = null; + + if (x == null || y == null) + data[j] = x = y = null; // mark this point invalid + } + + axisx.datamin = Math.min(axisx.datamin, xmin); + axisx.datamax = Math.max(axisx.datamax, xmax); + axisy.datamin = Math.min(axisy.datamin, ymin); + axisy.datamax = Math.max(axisy.datamax, ymax); + } + } + + function constructCanvas() { + function makeCanvas(width, height, container, style) { + var c = document.createElement('canvas'); + c.width = width; + c.height = height; + if (typeof G_vmlCanvasManager !== 'undefined') // excanvas hack + c = G_vmlCanvasManager.initElement(c); + + if(style) { + for(var k in style) { + c.style[k] = style[k]; + } + } + container.appendChild(c); + + return c; + } + + canvasWidth = parseInt(DOM.getStyle(target, 'width'), 10); + canvasHeight = parseInt(DOM.getStyle(target, 'height'), 10); + target.innerHTML = ""; // clear target + target.style.position = "relative"; // for positioning labels and overlay + + if (canvasWidth <= 0 || canvasHeight <= 0) + throw "Invalid dimensions for plot, width = " + canvasWidth + ", height = " + canvasHeight; + + if (YAHOO.env.ua.ie) { + G_vmlCanvasManager.init_(document); + } + + // the canvas + canvas = makeCanvas(canvasWidth, canvasHeight, target); + ctx = canvas.getContext("2d"); + + // overlay canvas for interactive features + overlay = makeCanvas(canvasWidth, canvasHeight, target, { position: 'absolute', left: '0px', top: '0px' }); + octx = overlay.getContext("2d"); + + // we include the canvas in the event holder too, because IE 7 + // sometimes has trouble with the stacking order + eventHolder = [overlay, canvas]; + + // bind events + if (options.selection.mode != null || options.crosshair.mode != null || options.grid.hoverable) { + E.on(eventHolder, 'mousemove', onMouseMove); + + if (options.selection.mode != null) + E.on(eventHolder, "mousedown", onMouseDown); + } + + if (options.crosshair.mode != null) + E.on(eventHolder, "mouseout", onMouseOut); + + if (options.grid.clickable) + E.on(eventHolder, "click", onClick); + } + + function setupGrid() { + function setupAxis(axis, options, type) { + setRange(axis, options); + prepareTickGeneration(axis, options); + setTicks(axis, options); + // add transformation helpers + if (type == 'x') { + // data point to canvas coordinate + axis.p2c = function (p) { return (p - axis.min) * axis.scale; }; + // canvas coordinate to data point + axis.c2p = function (c) { return axis.min + c / axis.scale; }; + } + else { + axis.p2c = function (p) { return (axis.max - p) * axis.scale; }; + axis.c2p = function (c) { return axis.max - c / axis.scale; }; + } + } + + for (var axis in axes) + setupAxis(axes[axis], options[axis], axis.charAt(0)); + + setSpacing(); + if(options.grid.show) + insertLabels(); + insertLegend(); + insertAxisLabels(); + } + + function setRange(axis, axisOptions) { + var min = axisOptions.min != null ? (axisOptions.scaleType == 'log' ? Math.log(axisOptions.min<=0?1:axisOptions.min) * Math.LOG10E : axisOptions.min) : axis.datamin; + var max = axisOptions.max != null ? (axisOptions.scaleType == 'log' ? Math.log(axisOptions.max) * Math.LOG10E : axisOptions.max) : axis.datamax; + + if(axisOptions.mode === 'time') { + if(L.isObject(min) && min.getTime) min = min.getTime()/1000; + if(L.isObject(max) && max.getTime) max = max.getTime()/1000; + } + + // degenerate case + if (min == Number.POSITIVE_INFINITY) + min = 0; + if (max == Number.NEGATIVE_INFINITY) + max = 1; + + if (max - min == 0.0) { + // degenerate case + var widen = max == 0 ? 1 : 0.01; + + if (axisOptions.min == null) + min -= widen; + // alway widen max if we couldn't widen min to ensure we + // don't fall into min == max which doesn't work + if (axisOptions.max == null || axisOptions.min != null) + max += widen; + } + else { + // consider autoscaling + var margin = axisOptions.autoscaleMargin; + if (margin != null) { + if (axisOptions.min == null) { + min -= (max - min) * margin; + // make sure we don't go below zero if all values + // are positive + if (min < 0 && axis.datamin >= 0) + min = 0; + } + if (axisOptions.max == null) { + max += (max - min) * margin; + if (max > 0 && axis.datamax <= 0) + max = 0; + } + } + } + axis.min = min; + axis.max = max; + } + + function prepareTickGeneration(axis, axisOptions) { + // estimate number of ticks + var noTicks; + if (typeof axisOptions.ticks == "number" && axisOptions.ticks > 0) + noTicks = axisOptions.ticks; + else if (axis == axes.xaxis || axis == axes.x2axis) + noTicks = canvasWidth / 100; + else + noTicks = canvasHeight / 60; + + var delta = (axis.max - axis.min) / noTicks; + var size, generator, unit, formatter, magn, norm; + + if (axisOptions.mode == "time") { + // pretty handling of time + + delta*=1000; + + // map of app. size of time units in milliseconds + var timeUnitSize = { + "second": 1000, + "minute": 60 * 1000, + "hour": 60 * 60 * 1000, + "day": 24 * 60 * 60 * 1000, + "month": 30 * 24 * 60 * 60 * 1000, + "year": 365.2425 * 24 * 60 * 60 * 1000 + }; + + + // the allowed tick sizes, after 1 year we use + // an integer algorithm + var spec = [ + [1, "second"], [2, "second"], [5, "second"], [10, "second"], + [30, "second"], + [1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"], + [30, "minute"], + [1, "hour"], [2, "hour"], [4, "hour"], + [8, "hour"], [12, "hour"], + [1, "day"], [2, "day"], [3, "day"], + [0.25, "month"], [0.5, "month"], [1, "month"], + [2, "month"], [3, "month"], [6, "month"], + [1, "year"] + ]; + + var minSize = 0; + if (axisOptions.minTickSize != null) { + if (typeof axisOptions.tickSize == "number") + minSize = axisOptions.tickSize; + else + minSize = axisOptions.minTickSize[0] * timeUnitSize[axisOptions.minTickSize[1]]; + } + + for (var i = 0; i < spec.length - 1; ++i) + if (delta < (spec[i][0] * timeUnitSize[spec[i][1]] + + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2 + && spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) + break; + size = spec[i][0]; + unit = spec[i][1]; + + // special-case the possibility of several years + if (unit == "year") { + magn = Math.pow(10, Math.floor(Math.log(delta / timeUnitSize.year) / Math.LN10)); + norm = (delta / timeUnitSize.year) / magn; + if (norm < 1.5) + size = 1; + else if (norm < 3) + size = 2; + else if (norm < 7.5) + size = 5; + else + size = 10; + + size *= magn; + } + + if (axisOptions.tickSize) { + size = axisOptions.tickSize[0]; + unit = axisOptions.tickSize[1]; + } + + generator = function(axis) { + var ticks = [], + tickSize = axis.tickSize[0], unit = axis.tickSize[1], + d = new Date(axis.min*1000); + + var step = tickSize * timeUnitSize[unit]; + + if (unit == "second") + d.setUTCSeconds(floorInBase(d.getUTCSeconds(), tickSize)); + if (unit == "minute") + d.setUTCMinutes(floorInBase(d.getUTCMinutes(), tickSize)); + if (unit == "hour") + d.setUTCHours(floorInBase(d.getUTCHours(), tickSize)); + if (unit == "month") + d.setUTCMonth(floorInBase(d.getUTCMonth(), tickSize)); + if (unit == "year") + d.setUTCFullYear(floorInBase(d.getUTCFullYear(), tickSize)); + + // reset smaller components + d.setUTCMilliseconds(0); + if (step >= timeUnitSize.minute) + d.setUTCSeconds(0); + if (step >= timeUnitSize.hour) + d.setUTCMinutes(0); + if (step >= timeUnitSize.day) + d.setUTCHours(0); + if (step >= timeUnitSize.day * 4) + d.setUTCDate(1); + if (step >= timeUnitSize.year) + d.setUTCMonth(0); + + + var carry = 0, v = Number.NaN, prev; + do { + prev = v; + v = d.getTime(); + ticks.push({ v: v/1000, label: axis.tickFormatter(v, axis) }); + if (unit == "month") { + if (tickSize < 1) { + // a bit complicated - we'll divide the month + // up but we need to take care of fractions + // so we don't end up in the middle of a day + d.setUTCDate(1); + var start = d.getTime(); + d.setUTCMonth(d.getUTCMonth() + 1); + var end = d.getTime(); + d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize); + carry = d.getUTCHours(); + d.setUTCHours(0); + } + else + d.setUTCMonth(d.getUTCMonth() + tickSize); + } + else if (unit == "year") { + d.setUTCFullYear(d.getUTCFullYear() + tickSize); + } + else + d.setTime(v + step); + } while (v < axis.max*1000 && v != prev); + + return ticks; + }; + + formatter = function (v, axis) { + var d = new Date(v); + + // first check global format + if (axisOptions.timeformat != null) + return YAHOO.util.Date.format(d, {format: axisOptions.timeformat}, options.locale); + + var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]]; + var span = axis.max - axis.min; + span*=1000; + + if (t < timeUnitSize.minute) + var fmt = "%k:%M:%S"; + else if (t < timeUnitSize.day) { + if (span < 2 * timeUnitSize.day) + fmt = "%k:%M"; + else + fmt = "%b %d %k:%M"; + } + else if (t < timeUnitSize.month) + fmt = "%b %d"; + else if (t < timeUnitSize.year) { + if (span < timeUnitSize.year/2) + fmt = "%b"; + else + fmt = "%b %Y"; + } + else + fmt = "%Y"; + + return YAHOO.util.Date.format(d, {format: fmt}, axisOptions.timelang); + }; + } + else { + // pretty rounding of base-10 numbers + var maxDec = axisOptions.tickDecimals; + var dec = -Math.floor(Math.log(delta) / Math.LN10); + if (maxDec != null && dec > maxDec) + dec = maxDec; + + magn = Math.pow(10, -dec); + norm = delta / magn; // norm is between 1.0 and 10.0 + + if (norm < 1.5) + size = 1; + else if (norm < 3) { + size = 2; + // special case for 2.5, requires an extra decimal + if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) { + size = 2.5; + ++dec; + } + } + else if (norm < 7.5) + size = 5; + else + size = 10; + + size *= magn; + + if (axisOptions.minTickSize != null && size < axisOptions.minTickSize) + size = axisOptions.minTickSize; + + if (axisOptions.tickSize != null) + size = axisOptions.tickSize; + + axis.tickDecimals = Math.max(0, (maxDec != null) ? maxDec : dec); + + generator = function (axis) { + var ticks = []; + + // spew out all possible ticks + var start = floorInBase(axis.min, axis.tickSize), + i = 0, v = Number.NaN, prev; + do { + prev = v; + v = start + i * axis.tickSize; + var t=v; + if(axis.scaleType == 'log') { + t = Math.exp(t / Math.LOG10E); + } + ticks.push({ v: v, label: axis.tickFormatter(t, axis) }); + ++i; + } while (v < axis.max && v != prev); + return ticks; + }; + + formatter = function (v, axis) { + return v.toFixed(axis.tickDecimals); + }; + } + + axis.scaleType = axisOptions.scaleType; + axis.tickSize = unit ? [size, unit] : size; + axis.tickGenerator = generator; + if (L.isFunction(axisOptions.tickFormatter)) + axis.tickFormatter = function (v, axis) { return "" + axisOptions.tickFormatter(v, axis); }; + else + axis.tickFormatter = formatter; + if (axisOptions.labelWidth != null) + axis.labelWidth = axisOptions.labelWidth; + if (axisOptions.labelHeight != null) + axis.labelHeight = axisOptions.labelHeight; + } + + function setTicks(axis, axisOptions) { + axis.ticks = []; + + if (!axis.used) + return; + + if (axisOptions.ticks == null) + axis.ticks = axis.tickGenerator(axis); + else if (typeof axisOptions.ticks == "number") { + if (axisOptions.ticks > 0) + axis.ticks = axis.tickGenerator(axis); + } + else if (axisOptions.ticks) { + var ticks = axisOptions.ticks; + + if (L.isFunction(ticks)) + // generate the ticks + ticks = ticks({ min: axis.min, max: axis.max }); + + // clean up the user-supplied ticks, copy them over + var v; + for (var i = 0; i < ticks.length; ++i) { + var label = null; + var t = ticks[i]; + if (typeof t == "object") { + v = t[0]; + if (t.length > 1) + label = t[1]; + } + else + v = t; + if (axisOptions.scaleType == 'log') { + if (label == null) + label = v; + v = Math.log(v) * Math.LOG10E; + } + + if (label == null) + label = axis.tickFormatter(v, axis); + axis.ticks[i] = { v: v, label: label }; + } + } + + if (axisOptions.autoscaleMargin != null && axis.ticks.length > 0) { + // snap to ticks + if (axisOptions.min == null) + axis.min = Math.min(axis.min, axis.ticks[0].v); + if (axisOptions.max == null && axis.ticks.length > 1) + axis.max = Math.min(axis.max, axis.ticks[axis.ticks.length - 1].v); + } + } + + function setSpacing() { + function measureXLabels(axis) { + if(options.grid.show){ + // to avoid measuring the widths of the labels, we + // construct fixed-size boxes and put the labels inside + // them, we don't need the exact figures and the + // fixed-size box content is easy to center + if (axis.labelWidth == null) + axis.labelWidth = canvasWidth / 6; + + // measure x label heights + if (axis.labelHeight == null) { + var labels = []; + for (var i = 0; i < axis.ticks.length; ++i) { + var l = axis.ticks[i].label; + if (l) + labels.push('
' + l + '
'); + } + + axis.labelHeight = 0; + if (labels.length > 0) { + var dummyDiv = target.appendChild(DOM.createElementFromMarkup('
' + + labels.join("") + '
')); + axis.labelHeight = dummyDiv.offsetHeight; + target.removeChild(dummyDiv); + } + } + } + else{ + axis.labelHeight = 0; + axis.labelWidth = 0; + } + } + + function measureYLabels(axis) { + if(options.grid.show){ + if (axis.labelWidth == null || axis.labelHeight == null) { + var labels = [], l; + // calculate y label dimensions + for (var i = 0; i < axis.ticks.length; ++i) { + l = axis.ticks[i].label; + if (l) + labels.push('
' + l + '
'); + } + + if (labels.length > 0) { + var dummyDiv = target.appendChild(DOM.createElementFromMarkup('
' + + labels.join("") + '
')); + if (axis.labelWidth == null) + axis.labelWidth = dummyDiv.offsetWidth; + if (axis.labelHeight == null) + axis.labelHeight = dummyDiv.firstChild.offsetHeight; + target.removeChild(dummyDiv); + } + + if (axis.labelWidth == null) + axis.labelWidth = 0; + if (axis.labelHeight == null) + axis.labelHeight = 0; + } + } + else{ + axis.labelHeight = 0; + axis.labelWidth = 0; + } + } + + measureXLabels(axes.xaxis); + measureYLabels(axes.yaxis); + measureXLabels(axes.x2axis); + measureYLabels(axes.y2axis); + // get the most space needed around the grid for things + // that may stick out + var maxOutset = (options.grid.show) ? options.grid.borderWidth : 0; + for (var i = 0; i < series.length; ++i) + maxOutset = (Math.max(maxOutset, 2 * (((series[i].points.show) ? series[i].points.radius : 0 ) + series[i].points.lineWidth/2))); + + plotOffset.left = plotOffset.right = plotOffset.top = plotOffset.bottom = maxOutset; + + var margin = options.grid.labelMargin + options.grid.borderWidth; + + if (axes.xaxis.labelHeight > 0) + plotOffset.bottom = Math.max(maxOutset, axes.xaxis.labelHeight + margin); + if (axes.yaxis.labelWidth > 0) + plotOffset.left = Math.max(maxOutset, axes.yaxis.labelWidth + margin); + + if (axes.x2axis.labelHeight > 0) + plotOffset.top = Math.max(maxOutset, axes.x2axis.labelHeight + margin); + + if (axes.y2axis.labelWidth > 0) + plotOffset.right = Math.max(maxOutset, axes.y2axis.labelWidth + margin); + + plotWidth = canvasWidth - plotOffset.left - plotOffset.right; + plotHeight = canvasHeight - plotOffset.bottom - plotOffset.top; + + // precompute how much the axis is scaling a point in canvas space + for(var axis in axes) { + axes[axis].scale = (axis.charAt(0) == 'x' ? plotWidth : plotHeight) / (axes[axis].max - axes[axis].min); + } + } + + function draw() { + drawGrid(); + for (var i = 0; i < series.length; i++) { + drawSeries(series[i]); + } + } + + function extractRange(ranges, coord) { + var firstAxis = coord + "axis", + secondaryAxis = coord + "2axis", + axis, from, to, reverse; + + if (ranges[firstAxis]) { + axis = firstAxis; + } + else if (ranges[secondaryAxis]) { + axis = secondaryAxis; + } + else { + return { from: null, to: null, axis: axes[firstAxis] }; + } + + from = ranges[axis].from; + to = ranges[axis].to; + + if (options[axis].scaleType == 'log') { + if (from != null) + from = Math.log(from) * Math.LOG10E; + if (to != null) + to = Math.log(to) * Math.LOG10E; + } + + axis = axes[axis]; + + // auto-reverse as an added bonus + if (from != null && to != null && from > to) + return { from: to, to: from, axis: axis }; + + return { from: from, to: to, axis: axis }; + } + + function drawGrid() { + var i; + + ctx.save(); + ctx.clearRect(0, 0, canvasWidth, canvasHeight); + ctx.translate(plotOffset.left, plotOffset.top); + + // draw background, if any + if (options.grid.backgroundColor) { + ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)"); + ctx.fillRect(0, 0, plotWidth, plotHeight); + } + + // draw markings + var markings = options.grid.markings; + if (markings) { + if (L.isFunction(markings)) + markings = markings({ xaxis: axes.xaxis, yaxis: axes.yaxis, x2axis: axes.x2axis, y2axis: axes.y2axis }); + + for (i = 0; i < markings.length; ++i) { + var m = markings[i], + xrange = extractRange(m, "x"), + yrange = extractRange(m, "y"); + + // fill in missing + if (xrange.from == null) + xrange.from = xrange.axis.min; + if (xrange.to == null) + xrange.to = xrange.axis.max; + if (yrange.from == null) + yrange.from = yrange.axis.min; + if (yrange.to == null) + yrange.to = yrange.axis.max; + + // clip + if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max || + yrange.to < yrange.axis.min || yrange.from > yrange.axis.max) + continue; + + xrange.from = Math.max(xrange.from, xrange.axis.min); + xrange.to = Math.min(xrange.to, xrange.axis.max); + yrange.from = Math.max(yrange.from, yrange.axis.min); + yrange.to = Math.min(yrange.to, yrange.axis.max); + + if (xrange.from == xrange.to && yrange.from == yrange.to) + continue; + + // then draw + xrange.from = xrange.axis.p2c(xrange.from); + xrange.to = xrange.axis.p2c(xrange.to); + yrange.from = yrange.axis.p2c(yrange.from); + yrange.to = yrange.axis.p2c(yrange.to); + + if (xrange.from == xrange.to || yrange.from == yrange.to) { + // draw line + ctx.strokeStyle = m.color || options.grid.markingsColor; + ctx.beginPath(); + ctx.lineWidth = m.lineWidth || options.grid.markingsLineWidth; + ctx.moveTo(xrange.from, yrange.from); + ctx.lineTo(xrange.to, yrange.to); + ctx.stroke(); + } + else { + // fill area + ctx.fillStyle = m.color || options.grid.markingsColor; + ctx.fillRect(xrange.from, yrange.to, + xrange.to - xrange.from, + yrange.from - yrange.to); + } + } + } + + if(options.grid.show && options.grid.showLines) { + // draw the inner grid + ctx.lineWidth = 1; + ctx.strokeStyle = options.grid.tickColor; + ctx.beginPath(); + var v, axis = axes.xaxis; + for (i = 0; i < axis.ticks.length; ++i) { + v = axis.ticks[i].v; + if (v <= axis.min || v >= axes.xaxis.max) + continue; // skip those lying on the axes + + ctx.moveTo(Math.floor(axis.p2c(v)) + ctx.lineWidth/2, 0); + ctx.lineTo(Math.floor(axis.p2c(v)) + ctx.lineWidth/2, plotHeight); + } + + axis = axes.yaxis; + for (i = 0; i < axis.ticks.length; ++i) { + v = axis.ticks[i].v; + if (v <= axis.min || v >= axis.max) + continue; + + ctx.moveTo(0, Math.floor(axis.p2c(v)) + ctx.lineWidth/2); + ctx.lineTo(plotWidth, Math.floor(axis.p2c(v)) + ctx.lineWidth/2); + } + + axis = axes.x2axis; + for (i = 0; i < axis.ticks.length; ++i) { + v = axis.ticks[i].v; + if (v <= axis.min || v >= axis.max) + continue; + + ctx.moveTo(Math.floor(axis.p2c(v)) + ctx.lineWidth/2, -5); + ctx.lineTo(Math.floor(axis.p2c(v)) + ctx.lineWidth/2, 5); + } + + axis = axes.y2axis; + for (i = 0; i < axis.ticks.length; ++i) { + v = axis.ticks[i].v; + if (v <= axis.min || v >= axis.max) + continue; + + ctx.moveTo(plotWidth-5, Math.floor(axis.p2c(v)) + ctx.lineWidth/2); + ctx.lineTo(plotWidth+5, Math.floor(axis.p2c(v)) + ctx.lineWidth/2); + } + + ctx.stroke(); + } + + if (options.grid.show && options.grid.borderWidth) { + // draw border + var bw = options.grid.borderWidth; + ctx.lineWidth = bw; + ctx.strokeStyle = options.grid.borderColor; + ctx.lineJoin = "round"; + ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw); + } + + ctx.restore(); + } + + function insertLabels() { + DOM.getElementsByClassName("tickLabels", "div", target, DOM.removeElement); + + var html = ['
']; + + function addLabels(axis, labelGenerator) { + for (var i = 0; i < axis.ticks.length; ++i) { + var tick = axis.ticks[i]; + if (!tick.label || tick.v < axis.min || tick.v > axis.max) + continue; + html.push(labelGenerator(tick, axis)); + } + } + + var margin = options.grid.labelMargin + options.grid.borderWidth; + + addLabels(axes.xaxis, function (tick, axis) { + return '
' + tick.label + "
"; + }); + + + addLabels(axes.yaxis, function (tick, axis) { + return '
' + tick.label + "
"; + }); + + addLabels(axes.x2axis, function (tick, axis) { + return '
' + tick.label + "
"; + }); + + addLabels(axes.y2axis, function (tick, axis) { + return '
' + tick.label + "
"; + }); + + html.push('
'); + + target.appendChild(DOM.createElementFromMarkup(html.join(""))); + } + + function insertAxisLabels() { + var xLocation, yLocation; + if( options.xaxis.label ) { + yLocation = plotOffset.top + plotHeight + ( axes.xaxis.labelHeight * 1.5 ); + xLocation = plotOffset.left; + DOM.getElementsByClassName("xaxislabel", "div", target, DOM.removeElement); + target.appendChild( + DOM.createElementFromMarkup( + "
" + + options.xaxis.label + "
" + ) + ); + } + if( options.yaxis.label ) { + xLocation = plotOffset.left - ( axes.yaxis.labelWidth * 2 ) - options.grid.labelFontSize; + yLocation = plotOffset.top + plotHeight/2; + DOM.getElementsByClassName("yaxislabel", "div", target, DOM.removeElement); + + target.appendChild( + DOM.createElementFromMarkup( + "
" + + options.yaxis.label + "
") + ); + } + } + + function drawSeries(series) { + if (series.lines.show) + drawSeriesLines(series); + if (series.bars.show) + drawSeriesBars(series); + if (series.points.show) + drawSeriesPoints(series); + } + + function drawSeriesLines(series) { + function plotLine(data, xoffset, yoffset, axisx, axisy) { + var prev = null, cur=null, drawx = null, drawy = null; + + ctx.beginPath(); + for (var i = 0; i < data.length; i++) { + prev = cur; + cur = data[i]; + + if(prev == null || cur == null) + continue; + + var x1 = prev.x, y1 = prev.y, + x2 = cur.x, y2 = cur.y; + + // clip with ymin + if (y1 <= y2 && y1 < axisy.min) { + if (y2 < axisy.min) + continue; // line segment is outside + // compute new intersection point + x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.min; + } + else if (y2 <= y1 && y2 < axisy.min) { + if (y1 < axisy.min) + continue; + x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.min; + } + + // clip with ymax + if (y1 >= y2 && y1 > axisy.max) { + if (y2 > axisy.max) + continue; + x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.max; + } + else if (y2 >= y1 && y2 > axisy.max) { + if (y1 > axisy.max) + continue; + x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.max; + } + + // clip with xmin + if (x1 <= x2 && x1 < axisx.min) { + if (x2 < axisx.min) + continue; + y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.min; + } + else if (x2 <= x1 && x2 < axisx.min) { + if (x1 < axisx.min) + continue; + y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.min; + } + + // clip with xmax + if (x1 >= x2 && x1 > axisx.max) { + if (x2 > axisx.max) + continue; + y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.max; + } + else if (x2 >= x1 && x2 > axisx.max) { + if (x1 > axisx.max) + continue; + y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.max; + } + + if (drawx != axisx.p2c(x1) + xoffset || drawy != axisy.p2c(y1) + yoffset) + ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset); + + drawx = axisx.p2c(x2) + xoffset; + drawy = axisy.p2c(y2) + yoffset; + ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset); + } + ctx.stroke(); + } + + function plotLineArea(data, axisx, axisy) { + var prev, cur = null, + bottom = Math.min(Math.max(0, axisy.min), axisy.max), + top, lastX = 0, areaOpen = false; + + for (var i = 0; i < data.length; i++) { + prev = cur; + cur = data[i]; + + if (areaOpen && x1 != null && x2 == null) { + // close area + ctx.lineTo(axisx.p2c(lastX), axisy.p2c(bottom)); + ctx.fill(); + areaOpen = false; + continue; + } + + if (prev == null || cur == null) { + if(areaOpen) { + ctx.lineTo(axisx.p2c(lastX), axisy.p2c(bottom)); + ctx.fill(); + } + areaOpen = false; + continue; + } + + var x1 = prev.x, y1 = prev.y, + x2 = cur.x, y2 = cur.y; + + // clip x values + + // clip with xmin + if (x1 <= x2 && x1 < axisx.min) { + if (x2 < axisx.min) + continue; + y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.min; + } + else if (x2 <= x1 && x2 < axisx.min) { + if (x1 < axisx.min) + continue; + y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.min; + } + + // clip with xmax + if (x1 >= x2 && x1 > axisx.max) { + if (x2 > axisx.max) + continue; + y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.max; + } + else if (x2 >= x1 && x2 > axisx.max) { + if (x1 > axisx.max) + continue; + y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.max; + } + + if (!areaOpen) { + // open area + ctx.beginPath(); + ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom)); + areaOpen = true; + } + + // now first check the case where both is outside + if (y1 >= axisy.max && y2 >= axisy.max) { + ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max)); + lastX = x2; + continue; + } + else if (y1 <= axisy.min && y2 <= axisy.min) { + ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min)); + lastX = x2; + continue; + } + + // else it's a bit more complicated, there might + // be two rectangles and two triangles we need to fill + // in; to find these keep track of the current x values + var x1old = x1, x2old = x2; + + // and clip the y values, without shortcutting + + // clip with ymin + if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) { + x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.min; + } + else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) { + x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.min; + } + + // clip with ymax + if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) { + x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.max; + } + else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) { + x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.max; + } + + + // if the x value was changed we got a rectangle + // to fill + if (x1 != x1old) { + if (y1 <= axisy.min) + top = axisy.min; + else + top = axisy.max; + + ctx.lineTo(axisx.p2c(x1old), axisy.p2c(top)); + ctx.lineTo(axisx.p2c(x1), axisy.p2c(top)); + } + + // fill the triangles + ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); + + // fill the other rectangle if it's there + if (x2 != x2old) { + if (y2 <= axisy.min) + top = axisy.min; + else + top = axisy.max; + + ctx.lineTo(axisx.p2c(x2), axisy.p2c(top)); + ctx.lineTo(axisx.p2c(x2old), axisy.p2c(top)); + } + + lastX = Math.max(x2, x2old); + } + + if (areaOpen) { + ctx.lineTo(axisx.p2c(lastX), axisy.p2c(bottom)); + ctx.fill(); + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + ctx.lineJoin = "round"; + + var lw = series.lines.lineWidth, + sw = series.shadowSize; + // FIXME: consider another form of shadow when filling is turned on + if (lw > 0 && sw > 0) { + // draw shadow as a thick and thin line with transparency + ctx.lineWidth = sw; + ctx.strokeStyle = "rgba(0,0,0,0.1)"; + var xoffset = 1; + plotLine(series.data, xoffset, Math.sqrt((lw/2 + sw/2)*(lw/2 + sw/2) - xoffset*xoffset), series.xaxis, series.yaxis); + ctx.lineWidth = sw/2; + plotLine(series.data, xoffset, Math.sqrt((lw/2 + sw/4)*(lw/2 + sw/4) - xoffset*xoffset), series.xaxis, series.yaxis); + } + + ctx.lineWidth = lw; + ctx.strokeStyle = series.color; + var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight); + if (fillStyle) { + ctx.fillStyle = fillStyle; + plotLineArea(series.data, series.xaxis, series.yaxis); + } + + if (lw > 0) + plotLine(series.data, 0, 0, series.xaxis, series.yaxis); + ctx.restore(); + } + + function drawSeriesPoints(series) { + function plotPoints(data, radius, fillStyle, offset, circumference, axisx, axisy) { + for (var i = 0; i < data.length; i++) { + if (data[i] == null || series.dropped[i]) + continue; + + var x = data[i].x, y = data[i].y; + if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) + continue; + + ctx.beginPath(); + ctx.arc(axisx.p2c(x), axisy.p2c(y) + offset, radius, 0, circumference, true); + if (fillStyle) { + ctx.fillStyle = fillStyle; + ctx.fill(); + } + ctx.stroke(); + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + var lw = series.lines.lineWidth, + sw = series.shadowSize, + radius = series.points.radius; + if (lw > 0 && sw > 0) { + // draw shadow in two steps + var w = sw / 2; + ctx.lineWidth = w; + ctx.strokeStyle = "rgba(0,0,0,0.1)"; + plotPoints(series.data, radius, null, w + w/2, 2 * Math.PI, + series.xaxis, series.yaxis); + + ctx.strokeStyle = "rgba(0,0,0,0.2)"; + plotPoints(series.data, radius, null, w/2, 2 * Math.PI, + series.xaxis, series.yaxis); + } + + ctx.lineWidth = lw; + ctx.strokeStyle = series.color; + plotPoints(series.data, radius, + getFillStyle(series.points, series.color), 0, 2 * Math.PI, + series.xaxis, series.yaxis); + ctx.restore(); + } + + function drawBar(x, y, barLeft, barRight, offset, fill, axisx, axisy, c) { + var drawLeft = true, drawRight = true, + drawTop = true, drawBottom = false, + left = x + barLeft, right = x + barRight, + bottom = 0, top = y; + + // account for negative bars + if (top < bottom) { + top = 0; + bottom = y; + drawBottom = true; + drawTop = false; + } + + // clip + if (right < axisx.min || left > axisx.max || + top < axisy.min || bottom > axisy.max) + return; + + if (left < axisx.min) { + left = axisx.min; + drawLeft = false; + } + + if (right > axisx.max) { + right = axisx.max; + drawRight = false; + } + + if (bottom < axisy.min) { + bottom = axisy.min; + drawBottom = false; + } + + if (top > axisy.max) { + top = axisy.max; + drawTop = false; + } + + left = axisx.p2c(left); + bottom = axisy.p2c(bottom); + right = axisx.p2c(right); + top = axisy.p2c(top); + + // fill the bar + if (fill) { + c.beginPath(); + c.moveTo(left, bottom); + c.lineTo(left, top); + c.lineTo(right, top); + c.lineTo(right, bottom); + if(typeof fill === 'function') { + c.fillStyle = fill(bottom, top); + } else if(typeof fill === 'string') { + c.fillStyle = fill; + } + c.fill(); + } + + // draw outline + if (drawLeft || drawRight || drawTop || drawBottom) { + c.beginPath(); + + // FIXME: inline moveTo is buggy with excanvas + c.moveTo(left, bottom + offset); + if (drawLeft) + c.lineTo(left, top + offset); + else + c.moveTo(left, top + offset); + if (drawTop) + c.lineTo(right, top + offset); + else + c.moveTo(right, top + offset); + if (drawRight) + c.lineTo(right, bottom + offset); + else + c.moveTo(right, bottom + offset); + if (drawBottom) + c.lineTo(left, bottom + offset); + else + c.moveTo(left, bottom + offset); + c.stroke(); + } + } + + function drawSeriesBars(series) { + function plotBars(data, barLeft, barRight, offset, fill, axisx, axisy) { + + for (var i = 0; i < data.length; i++) { + if (data[i] == null) + continue; + drawBar(data[i].x, data[i].y, barLeft, barRight, offset, fill, axisx, axisy, ctx); + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + // FIXME: figure out a way to add shadows (for instance along the right edge) + ctx.lineWidth = series.bars.lineWidth; + ctx.strokeStyle = series.color; + var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2; + var fill = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null; + plotBars(series.data, barLeft, barLeft + series.bars.barWidth, 0, fill, series.xaxis, series.yaxis); + ctx.restore(); + } + + function getFillStyle(filloptions, seriesColor, bottom, top) { + var fill = filloptions.fill; + if (!fill) + return null; + + if (filloptions.fillColor) + return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor); + + var c = parseColor(seriesColor); + c.a = typeof fill == "number" ? fill : 0.4; + c.normalize(); + return c.toString(); + } + + function insertLegend() { + DOM.getElementsByClassName("legend", "div", target, DOM.removeElement); + + if (!options.legend.show) + return; + + var fragments = [], rowStarted = false, + lf = options.legend.labelFormatter, s, label; + for (var i = 0; i < series.length; ++i) { + s = series[i]; + label = s.label; + if (!label) + continue; + + if (i % options.legend.noColumns == 0) { + if (rowStarted) + fragments.push(''); + fragments.push(''); + rowStarted = true; + } + + if (lf) + label = lf(label, s); + + fragments.push( + '
' + + '' + label + ''); + } + if (rowStarted) + fragments.push(''); + + if (fragments.length == 0) + return; + + var table = '' + fragments.join("") + '
'; + if (options.legend.container != null) + DOM.get(options.legend.container).innerHTML = table; + else { + var pos = "", + p = options.legend.position, + m = options.legend.margin; + if (m[0] == null) + m = [m, m]; + if (p.charAt(0) == "n") + pos += 'top:' + (m[1] + plotOffset.top) + 'px;'; + else if (p.charAt(0) == "s") + pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;'; + if (p.charAt(1) == "e") + pos += 'right:' + (m[0] + plotOffset.right) + 'px;'; + else if (p.charAt(1) == "w") + pos += 'left:' + (m[0] + plotOffset.left) + 'px;'; + var legend = target.appendChild(DOM.createElementFromMarkup('
' + table.replace('style="', 'style="position:absolute;' + pos +';') + '
')); + if (options.legend.backgroundOpacity != 0.0) { + // put in the transparent background + // separately to avoid blended labels and + // label boxes + var c = options.legend.backgroundColor; + if (c == null) { + var tmp; + if (options.grid.backgroundColor && typeof options.grid.backgroundColor == "string") + tmp = options.grid.backgroundColor; + else + tmp = extractColor(legend); + c = parseColor(tmp).adjust(null, null, null, 1).toString(); + } + var div = legend.firstChild; + var _el = DOM.insertBefore( + DOM.createElementFromMarkup('
'), + legend + ); + DOM.setStyle(_el, 'opacity', options.legend.backgroundOpacity); + } + } + } + + + // interactive features + + var lastMousePos = { pageX: null, pageY: null }, + selection = { + first: { x: -1, y: -1}, second: { x: -1, y: -1}, + show: false, active: false }, + crosshair = { pos: { x: -1, y: -1 } }, + highlights = [], + clickIsMouseUp = false, + redrawTimeout = null, + hoverTimeout = null; + + // Returns the data item the mouse is over, or null if none is found + function findNearbyItem(mouseX, mouseY) { + var maxDistance = options.grid.mouseActiveRadius, + lowestDistance = maxDistance * maxDistance + 1, + item = null, foundPoint = false, j, x, y; + + function result(i, j) { + return { + datapoint: series[i].data[j], + dataIndex: j, + series: series[i], + seriesIndex: i + }; + } + + for (var i = 0; i < series.length; ++i) { + var s = series[i], + axisx = s.xaxis, + axisy = s.yaxis, + mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster + my = axisy.c2p(mouseY), + maxx = maxDistance / axisx.scale, + maxy = maxDistance / axisy.scale; + + var data = s.data; + + if (s.lines.show || s.points.show) { + for (j = 0; j < data.length; j++ ) { + if (data[j] == null) + continue; + + x = data[j].x; + y = data[j].y; + + // For points and lines, the cursor must be within a + // certain distance to the data point + if (x - mx > maxx || x - mx < -maxx || + y - my > maxy || y - my < -maxy) + continue; + + // We have to calculate distances in pixels, not in + // data units, because the scales of the axes may be different + var dx = Math.abs(axisx.p2c(x) - mouseX), + dy = Math.abs(axisy.p2c(y) - mouseY), + dist = dx * dx + dy * dy; // no idea in taking sqrt + if (dist < lowestDistance) { + lowestDistance = dist; + item = result(i, j); + } + } + } + + if (s.bars.show && !item) { // no other point can be nearby + var barLeft = s.bars.align == "left" ? 0 : -s.bars.barWidth/2, + barRight = barLeft + s.bars.barWidth; + + for (j = 0; j < data.length; j++) { + x = data[j].x; + y = data[j].y; + if (x == null) + continue; + + // for a bar graph, the cursor must be inside the bar + if ((mx >= x + barLeft && mx <= x + barRight && + my >= Math.min(0, y) && my <= Math.max(0, y))) + item = result(i, j); + } + } + } + + return item; + } + + function onMouseMove(e) { + lastMousePos.pageX = E.getPageX(e); + lastMousePos.pageY = E.getPageY(e); + + if (options.grid.hoverable) + triggerClickHoverEvent("plothover", lastMousePos); + + if (options.crosshair.mode != null) { + if (!selection.active) { + setPositionFromEvent(crosshair.pos, lastMousePos); + triggerRedrawOverlay(); + } + else + crosshair.pos.x = -1; // hide the crosshair while selecting + } + + if (selection.active) { + updateSelection(lastMousePos); + } + } + + function onMouseDown(e) { + var button = e.which || e.button; + if (button != 1) // only accept left-click + return; + + // cancel out any text selections + document.body.focus(); + + // prevent text selection and drag in old-school browsers + if (document.onselectstart !== undefined && workarounds.onselectstart == null) { + workarounds.onselectstart = document.onselectstart; + document.onselectstart = function () { return false; }; + } + if (document.ondrag !== undefined && workarounds.ondrag == null) { + workarounds.ondrag = document.ondrag; + document.ondrag = function () { return false; }; + } + + var mousePos = {pageX: E.getPageX(e), pageY: E.getPageY(e)}; + setSelectionPos(selection.first, mousePos); + + lastMousePos.pageX = null; + selection.active = true; + E.on(document, "mouseup", onSelectionMouseUp); + } + + function onMouseOut(e) { + if (options.crosshair.mode != null && crosshair.pos.x != -1) { + crosshair.pos.x = -1; + triggerRedrawOverlay(); + } + } + + function onClick(e) { + if (clickIsMouseUp) { + clickIsMouseUp = false; + return; + } + + var mousePos = {pageX: E.getPageX(e), pageY: E.getPageY(e)}; + triggerClickHoverEvent("plotclick", mousePos); + } + + // trigger click or hover event (they send the same parameters + // so we share their code) + function triggerClickHoverEvent(eventname, event) { + var offset = DOM.getXY(eventHolder[0]), + pos = { pageX: event.pageX, pageY: event.pageY }, + canvasX = event.pageX - offset[0] - plotOffset.left, + canvasY = event.pageY - offset[1] - plotOffset.top; + + for(var axis in axes) + if(axes[axis].used) + pos[axis.replace(/axis$/, '')] = axes[axis].c2p(axis.charAt(0) == 'x' ? canvasX : canvasY); + + var item = findNearbyItem(canvasX, canvasY); + + if (item) { + // fill in mouse pos for any listeners out there + item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint.x) + offset[0] + plotOffset.left, 10); + item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint.y) + offset[1] + plotOffset.top, 10); + } + + if (options.grid.autoHighlight) { + // clear auto-highlights + for (var i = 0; i < highlights.length; ++i) { + var h = highlights[i]; + if (h.auto == eventname && + !(item && h.series == item.series && h.point == item.datapoint)) + unhighlight(h.series, h.point); + } + + if (item) + highlight(item.series, item.datapoint, eventname); + } + + plot.fireEvent(eventname, {pos: pos, item: item }); + } + + function triggerRedrawOverlay() { + if (!redrawTimeout) + redrawTimeout = setTimeout(redrawOverlay, 30); + } + + function redrawOverlay() { + redrawTimeout = null; + + // redraw highlights + octx.save(); + octx.clearRect(0, 0, canvasWidth, canvasHeight); + octx.translate(plotOffset.left, plotOffset.top); + + var hi; + for (var i = 0; i < highlights.length; ++i) { + hi = highlights[i]; + + if (hi.series.bars.show) + drawBarHighlight(hi.series, hi.point); + else + drawPointHighlight(hi.series, hi.point); + } + + // redraw selection + if (selection.show && selectionIsSane()) { + octx.strokeStyle = parseColor(options.selection.color).scale(null, null, null, 0.8).toString(); + octx.lineWidth = 1; + ctx.lineJoin = "round"; + octx.fillStyle = parseColor(options.selection.color).scale(null, null, null, 0.4).toString(); + + var x = Math.min(selection.first.x, selection.second.x), + y = Math.min(selection.first.y, selection.second.y), + w = Math.abs(selection.second.x - selection.first.x), + h = Math.abs(selection.second.y - selection.first.y); + + octx.fillRect(x, y, w, h); + octx.strokeRect(x, y, w, h); + } + + // redraw crosshair + var pos = crosshair.pos, mode = options.crosshair.mode; + if (mode != null && pos.x != -1) { + octx.strokeStyle = parseColor(options.crosshair.color).scale(null, null, null, 0.8).toString(); + octx.lineWidth = 1; + ctx.lineJoin = "round"; + + octx.beginPath(); + if (mode.indexOf("x") != -1) { + octx.moveTo(pos.x, 0); + octx.lineTo(pos.x, plotHeight); + } + if (mode.indexOf("y") != -1) { + octx.moveTo(0, pos.y); + octx.lineTo(plotWidth, pos.y); + } + octx.stroke(); + + } + octx.restore(); + } + + function highlight(s, point, auto) { + if (typeof s == "number") + s = series[s]; + + if (typeof point == "number") + point = s.data[point]; + + var i = indexOfHighlight(s, point); + if (i == -1) { + highlights.push({ series: s, point: point, auto: auto }); + + triggerRedrawOverlay(); + } + else if (!auto) + highlights[i].auto = false; + } + + function unhighlight(s, point) { + if (typeof s == "number") + s = series[s]; + + if (typeof point == "number") + point = s.data[point]; + + var i = indexOfHighlight(s, point); + if (i != -1) { + highlights.splice(i, 1); + + triggerRedrawOverlay(); + } + } + + function indexOfHighlight(s, p) { + for (var i = 0; i < highlights.length; ++i) { + var h = highlights[i]; + if (h.series == s && h.point[0] == p[0] + && h.point[1] == p[1]) + return i; + } + return -1; + } + + function drawPointHighlight(series, point) { + var x = point.x, y = point.y, + axisx = series.xaxis, axisy = series.yaxis; + + if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) + return; + + var pointRadius = series.points.radius + series.points.lineWidth / 2; + octx.lineWidth = pointRadius; + octx.strokeStyle = parseColor(series.color).scale(1, 1, 1, 0.5).toString(); + var radius = 1.5 * pointRadius; + octx.beginPath(); + octx.arc(axisx.p2c(x), axisy.p2c(y), radius, 0, 2 * Math.PI, true); + octx.stroke(); + } + + function drawBarHighlight(series, point) { + octx.lineJoin = "round"; + octx.lineWidth = series.bars.lineWidth; + octx.strokeStyle = parseColor(series.color).scale(1, 1, 1, 0.5).toString(); + var fillStyle = parseColor(series.color).scale(1, 1, 1, 0.5).toString(); + var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2; + drawBar(point.x, point.y, barLeft, barLeft + series.bars.barWidth, + 0, function () { return fillStyle; }, series.xaxis, series.yaxis, octx); + } + + function setPositionFromEvent(pos, e) { + var offset = DOM.getXY(eventHolder[0]); + pos.x = clamp(0, e.pageX - offset[0] - plotOffset.left, plotWidth); + pos.y = clamp(0, e.pageY - offset[1] - plotOffset.top, plotHeight); + } + + function setCrosshair(pos) { + if (pos == null) + crosshair.pos.x = -1; + else { + crosshair.pos.x = clamp(0, pos.x != null ? axes.xaxis.p2c(pos.x) : axes.x2axis.p2c(pos.x2), plotWidth); + crosshair.pos.y = clamp(0, pos.y != null ? axes.yaxis.p2c(pos.y) : axes.y2axis.p2c(pos.y2), plotHeight); + } + triggerRedrawOverlay(); + } + + function getSelectionForEvent() { + var x1 = Math.min(selection.first.x, selection.second.x), + x2 = Math.max(selection.first.x, selection.second.x), + y1 = Math.max(selection.first.y, selection.second.y), + y2 = Math.min(selection.first.y, selection.second.y); + + var r = {}; + if (axes.xaxis.used) + r.xaxis = { from: axes.xaxis.c2p(x1), to: axes.xaxis.c2p(x2) }; + if (axes.x2axis.used) + r.x2axis = { from: axes.x2axis.c2p(x1), to: axes.x2axis.c2p(x2) }; + if (axes.yaxis.used) + r.yaxis = { from: axes.yaxis.c2p(y1), to: axes.yaxis.c2p(y2) }; + if (axes.y2axis.used) + r.y2axis = { from: axes.y2axis.c2p(y1), to: axes.y2axis.c2p(y2) }; + return r; + } + + function triggerSelectedEvent() { + var r = getSelectionForEvent(); + + plot.fireEvent("plotselected", r); + } + + function onSelectionMouseUp(e) { + // revert drag stuff for old-school browsers + if (document.onselectstart !== undefined) + document.onselectstart = workarounds.onselectstart; + if (document.ondrag !== undefined) + document.ondrag = workarounds.ondrag; + + // no more draggy-dee-drag + selection.active = false; + var mousePos = {pageX: E.getPageX(e), pageY: E.getPageY(e)}; + updateSelection(mousePos); + + if (selectionIsSane()) { + triggerSelectedEvent(); + clickIsMouseUp = true; + } + else { + // this counts as a clear + plot.fireEvent("plotunselected", {}); + } + + E.removeListener(document, "mouseup", onSelectionMouseUp); + return false; + } + + function setSelectionPos(pos, e) { + setPositionFromEvent(pos, e); + + if (options.selection.mode == "y") { + if (pos == selection.first) + pos.x = 0; + else + pos.x = plotWidth; + } + + if (options.selection.mode == "x") { + if (pos == selection.first) + pos.y = 0; + else + pos.y = plotHeight; + } + } + + function updateSelection(pos) { + if (pos.pageX == null) + return; + + setSelectionPos(selection.second, pos); + if (selectionIsSane()) { + selection.show = true; + triggerRedrawOverlay(); + } + else + clearSelection(true); + } + + function clearSelection(preventEvent) { + if (selection.show) { + selection.show = false; + triggerRedrawOverlay(); + if (!preventEvent) + plot.fireEvent("plotunselected", {}); + } + } + + function setSelection(ranges, preventEvent) { + var range; + + if (options.selection.mode == "y") { + selection.first.x = 0; + selection.second.x = plotWidth; + } + else { + range = extractRange(ranges, "x"); + + selection.first.x = range.axis.p2c(range.from); + selection.second.x = range.axis.p2c(range.to); + } + + if (options.selection.mode == "x") { + selection.first.y = 0; + selection.second.y = plotHeight; + } + else { + range = extractRange(ranges, "y"); + + selection.first.y = range.axis.p2c(range.from); + selection.second.y = range.axis.p2c(range.to); + } + + selection.show = true; + triggerRedrawOverlay(); + if (!preventEvent) + triggerSelectedEvent(); + } + + function selectionIsSane() { + var minSize = 5; + return Math.abs(selection.second.x - selection.first.x) >= minSize && + Math.abs(selection.second.y - selection.first.y) >= minSize; + } + + function getColorOrGradient(spec, bottom, top, defaultColor) { + if (typeof spec == "string") + return spec; + else { + // assume this is a gradient spec; IE currently only + // supports a simple vertical gradient properly, so that's + // what we support too + var gradient = ctx.createLinearGradient(0, top, 0, bottom); + + for (var i = 0, l = spec.colors.length; i < l; ++i) { + var c = spec.colors[i]; + gradient.addColorStop(i / (l - 1), typeof c == "string" ? c : parseColor(defaultColor).scale(c.brightness, c.brightness, c.brightness, c.opacity)); + } + + return gradient; + } + } + } + + L.augment(Plot, YAHOO.util.EventProvider); + + YAHOO.widget.Flot = function(target, data, options) { + return new Plot(target, data, options); + }; + + // round to nearby lower multiple of base + function floorInBase(n, base) { + return base * Math.floor(n / base); + } + + function clamp(min, value, max) { + if (value < min) + return min; + else if (value > max) + return max; + else + return value; + } + + // color helpers, inspiration from the jquery color animation + // plugin by John Resig + function Color (r, g, b, a) { + + var rgba = ['r','g','b','a']; + var x = 4; //rgba.length + + while (-1<--x) { + this[rgba[x]] = arguments[x] || ((x==3) ? 1.0 : 0); + } + + this.toString = function() { + if (this.a >= 1.0) { + return "rgb("+[this.r,this.g,this.b].join(",")+")"; + } else { + return "rgba("+[this.r,this.g,this.b,this.a].join(",")+")"; + } + }; + + this.scale = function(rf, gf, bf, af) { + x = 4; //rgba.length + while (-1<--x) { + if (arguments[x] != null) + this[rgba[x]] *= arguments[x]; + } + return this.normalize(); + }; + + this.adjust = function(rd, gd, bd, ad) { + x = 4; //rgba.length + while (-1<--x) { + if (arguments[x] != null) + this[rgba[x]] += arguments[x]; + } + return this.normalize(); + }; + + this.clone = function() { + return new Color(this.r, this.b, this.g, this.a); + }; + + var limit = function(val,minVal,maxVal) { + return Math.max(Math.min(val, maxVal), minVal); + }; + + this.normalize = function() { + this.r = clamp(0, parseInt(this.r, 10), 255); + this.g = clamp(0, parseInt(this.g, 10), 255); + this.b = clamp(0, parseInt(this.b, 10), 255); + this.a = clamp(0, this.a, 1); + return this; + }; + + this.normalize(); + } + + var lookupColors = { + aqua:[0,255,255], + azure:[240,255,255], + beige:[245,245,220], + black:[0,0,0], + blue:[0,0,255], + brown:[165,42,42], + cyan:[0,255,255], + darkblue:[0,0,139], + darkcyan:[0,139,139], + darkgrey:[169,169,169], + darkgreen:[0,100,0], + darkkhaki:[189,183,107], + darkmagenta:[139,0,139], + darkolivegreen:[85,107,47], + darkorange:[255,140,0], + darkorchid:[153,50,204], + darkred:[139,0,0], + darksalmon:[233,150,122], + darkviolet:[148,0,211], + fuchsia:[255,0,255], + gold:[255,215,0], + green:[0,128,0], + indigo:[75,0,130], + khaki:[240,230,140], + lightblue:[173,216,230], + lightcyan:[224,255,255], + lightgreen:[144,238,144], + lightgrey:[211,211,211], + lightpink:[255,182,193], + lightyellow:[255,255,224], + lime:[0,255,0], + magenta:[255,0,255], + maroon:[128,0,0], + navy:[0,0,128], + olive:[128,128,0], + orange:[255,165,0], + pink:[255,192,203], + purple:[128,0,128], + violet:[128,0,128], + red:[255,0,0], + silver:[192,192,192], + white:[255,255,255], + yellow:[255,255,0] + }; + + function extractColor(element) { + var color, elem = element; + do { + color = DOM.getStyle(elem, 'backgroundColor').toLowerCase(); + // keep going until we find an element that has color, or + // we hit the body + if (color != '' && color != 'transparent') + break; + elem = elem.parentNode; + } while (!elem.nodeName == "body"); + + // catch Safari's way of signalling transparent + if (color == "rgba(0, 0, 0, 0)") + return "transparent"; + + return color; + } + + // parse string, returns Color + function parseColor(str) { + var result; + + // Look for rgb(num,num,num) + if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str)) + return new Color(parseInt(result[1], 10), parseInt(result[2], 10), parseInt(result[3], 10)); + + // Look for rgba(num,num,num,num) + if (result = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str)) + return new Color(parseInt(result[1], 10), parseInt(result[2], 10), parseInt(result[3], 10), parseFloat(result[4])); + + // Look for rgb(num%,num%,num%) + if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str)) + return new Color(parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55); + + // Look for rgba(num%,num%,num%,num) + if (result = /rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str)) + return new Color(parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55, parseFloat(result[4])); + + // Look for #a0b1c2 + if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str)) + return new Color(parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)); + + // Look for #fff + if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str)) + return new Color(parseInt(result[1]+result[1], 16), parseInt(result[2]+result[2], 16), parseInt(result[3]+result[3], 16)); + + // Otherwise, we're most likely dealing with a named color + var name = L.trim(str).toLowerCase(); + if (name == "transparent") + return new Color(255, 255, 255, 0); + else { + result = lookupColors[name]; + return new Color(result[0], result[1], result[2]); + } + } + +})(); diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/admin/admin.html --- a/pylons_app/templates/admin/admin.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/admin/admin.html Sat Jul 24 02:17:48 2010 +0200 @@ -4,18 +4,25 @@ <%def name="title()"> ${_('Administration')} -<%def name="breadcrumbs()"> - ${h.link_to(u'Admin',h.url('admin_home'))} + +<%def name="breadcrumbs_links()"> + ${_('Admin dashboard - journal')} + <%def name="page_nav()"> ${self.menu('admin')} - ${self.submenu('')} <%def name="main()"> -
-

Welcome ${c.hg_app_user.username}

-
- ${c.log_data} -
-
+
+ +
+ ${self.breadcrumbs()} +
+ +
+
+ ${c.log_data} +
+
+
\ No newline at end of file diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/admin/admin_log.html --- a/pylons_app/templates/admin/admin_log.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/admin/admin_log.html Sat Jul 24 02:17:48 2010 +0200 @@ -1,12 +1,12 @@ ## -*- coding: utf-8 -*- %if c.users_log: - - - - - - - +
${_('Username')}${_('Repository')}${_('Action')}${_('Date')}${_('From IP')}
+ + + + + + %for cnt,l in enumerate(c.users_log): @@ -18,22 +18,23 @@ %endfor +
${_('Username')}${_('Repository')}${_('Action')}${_('Date')}${_('From IP')}
${l.user_ip}
- -
- -

${c.users_log.pager('$link_previous ~2~ $link_next', - onclick="""YAHOO.util.Connect.asyncRequest('GET','$partial_url',{ - success:function(o){YAHOO.util.Dom.get(data_div).innerHTML=o.responseText; - YAHOO.util.Event.addListener(YAHOO.util.Dom.getElementsByClassName('pager_link'),"click",function(){ - YAHOO.util.Dom.setStyle(data_div,'opacity','0.3');}); - YAHOO.util.Dom.setStyle(data_div,'opacity','1');}},null); return false;""")} -

+ + + +
+${c.users_log.pager('$link_previous ~2~ $link_next', +onclick="""YAHOO.util.Connect.asyncRequest('GET','$partial_url',{ +success:function(o){YAHOO.util.Dom.get(data_div).innerHTML=o.responseText; +YAHOO.util.Event.addListener(YAHOO.util.Dom.getElementsByClassName('pager_link'),"click",function(){ + YAHOO.util.Dom.setStyle(data_div,'opacity','0.3');}); +YAHOO.util.Dom.setStyle(data_div,'opacity','1');}},null); return false;""")}
%else: ${_('No actions yet')} diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/admin/permissions/permissions.html --- a/pylons_app/templates/admin/permissions/permissions.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/admin/permissions/permissions.html Sat Jul 24 02:17:48 2010 +0200 @@ -4,18 +4,25 @@ <%def name="title()"> ${_('Permissions administration')} -<%def name="breadcrumbs()"> - ${h.link_to(u'Admin',h.url('admin_home'))} - / - ${_('Permissions')} + +<%def name="breadcrumbs_links()"> + ${h.link_to(_('Admin'),h.url('admin_home'))} + » + ${_('Permissions')} + <%def name="page_nav()"> ${self.menu('admin')} - ${self.submenu('permissions')} <%def name="main()"> -
-

${_('Permissions')}

- +
+ +
+ ${self.breadcrumbs()}
+ +
+ To implement +
+
diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/admin/repos/repo_add.html --- a/pylons_app/templates/admin/repos/repo_add.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/admin/repos/repo_add.html Sat Jul 24 02:17:48 2010 +0200 @@ -4,41 +4,57 @@ <%def name="title()"> ${_('Repositories administration')} -<%def name="breadcrumbs()"> - ${h.link_to(u'Admin',h.url('admin_home'))} - / - ${_('Repos')} + +<%def name="breadcrumbs_links()"> + ${h.link_to(_('Admin'),h.url('admin_home'))} + » + ${h.link_to(_('Repositories'),h.url('repos'))} + » + ${_('add new')} + <%def name="page_nav()"> ${self.menu('admin')} - ${self.submenu('repos')} <%def name="main()"> -
-

${_('Repositories')} - ${_('add new')}

- ${h.form(url('repos'))} - - - - - - - - - - - - - - - - - - - - - -
${_('Name')}${h.text('repo_name',c.new_repo)}${self.get_form_error('repo_name')}
${_('Description')}${h.textarea('description',cols=23,rows=5)}${self.get_form_error('description')}
${_('Private')}${h.checkbox('private',value="True")}${self.get_form_error('private')}
${h.submit('add','add')}
- ${h.end_form()} +
+ +
+ ${self.breadcrumbs()}
+ ${h.form(url('repos'))} +
+ +
+
+
+ +
+
+ ${h.text('repo_name',c.new_repo)} +
+
+
+
+ +
+
+ ${h.textarea('description',cols=23,rows=5)} +
+
+
+
+ +
+
+ ${h.checkbox('private',value="True")} +
+
+
+ ${h.submit('add','add',class_="ui-button ui-widget ui-state-default ui-corner-all")} +
+
+
+ ${h.end_form()} +
diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/admin/repos/repo_edit.html --- a/pylons_app/templates/admin/repos/repo_edit.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/admin/repos/repo_edit.html Sat Jul 24 02:17:48 2010 +0200 @@ -4,245 +4,271 @@ <%def name="title()"> ${_('Repositories administration')} -<%def name="breadcrumbs()"> - ${h.link_to(u'Admin',h.url('admin_home'))} - / - ${_('Repos')} + +<%def name="breadcrumbs_links()"> + ${h.link_to(_('Admin'),h.url('admin_home'))} + » + ${h.link_to(_('Repositories'),h.url('repos'))} + » + ${_('edit')} "${c.repo_name}" + <%def name="page_nav()"> ${self.menu('admin')} - ${self.submenu('repos')} + <%def name="main()"> -
-

${_('Repositories')} - ${_('edit')} "${c.repo_name}"

- ${h.form(url('repo', repo_name=c.repo_info.repo_name),method='put')} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
${_('Name')}${h.text('repo_name',size="28")}${self.get_form_error('repo_name')}
${_('Description')}${h.textarea('description',cols=32,rows=5)}${self.get_form_error('description')}
${_('Private')}${h.checkbox('private',value="True")}${self.get_form_error('private')}
${_('Owner')} -
- ${h.text('user',class_='yui-ac-input')} -
-
-
${self.get_form_error('user')}
${_('Permissions')} - - - - - - - - - - %for r2p in c.repo_info.repo2perm: - %if r2p.user.username =='default' and c.repo_info.private: - - - - - %else: - - - - - - - - - %endif - %endfor - <% - if not hasattr(c,'form_errors'): - d = 'display:none;' - else: - d='' - %> +
+ +
+ ${self.breadcrumbs()} +
+ ${h.form(url('repo', repo_name=c.repo_info.repo_name),method='put')} +
+ +
+
+
+ +
+
+ ${h.text('repo_name')} +
+
+ +
+
+ +
+
+ ${h.textarea('description',cols=23,rows=5)} +
+
+ +
+
+ +
+
+ ${h.checkbox('private',value="True")} +
+
+ +
+
+ +
+
+
+ ${h.text('user',class_='yui-ac-input')} +
+
+
+
+ +
+
+ +
+
+
${_('none')}${_('read')}${_('write')}${_('admin')}${_('user')}
- ${_('disabled for private repository')}${r2p.user.username}
${h.radio('perm_%s' % r2p.user.username,'repository.none')}${h.radio('perm_%s' % r2p.user.username,'repository.read')}${h.radio('perm_%s' % r2p.user.username,'repository.write')}${h.radio('perm_%s' % r2p.user.username,'repository.admin')}${r2p.user.username} - %if r2p.user.username !='default': - - - - %endif -
+ + + + + + + + + + %for r2p in c.repo_info.repo2perm: + %if r2p.user.username =='default' and c.repo_info.private: + + + + + %else: + + + + + + + + + %endif + %endfor - - - - - - - - - - - -
${_('none')}${_('read')}${_('write')}${_('admin')}${_('user')}
+ + ${_('disabled for private repository')} + + ${r2p.user.username}
${h.radio('perm_%s' % r2p.user.username,'repository.none')}${h.radio('perm_%s' % r2p.user.username,'repository.read')}${h.radio('perm_%s' % r2p.user.username,'repository.write')}${h.radio('perm_%s' % r2p.user.username,'repository.admin')}${r2p.user.username} + %if r2p.user.username !='default': + + + + %endif +
${h.radio('perm_new_user','repository.none')}${h.radio('perm_new_user','repository.read')}${h.radio('perm_new_user','repository.write')}${h.radio('perm_new_user','repository.admin')} -
- ${h.text('perm_new_user_name',class_='yui-ac-input')} -
-
-
${self.get_form_error('perm_new_user_name')}
- - ${_('Add another user')} - -
-
${h.submit('update','update')}
- ${h.end_form()} + + ${h.radio('perm_new_user','repository.none')} + ${h.radio('perm_new_user','repository.read')} + ${h.radio('perm_new_user','repository.write')} + ${h.radio('perm_new_user','repository.admin')} + +
+ ${h.text('perm_new_user_name',class_='yui-ac-input')} +
+
+ + + + + + + ${_('Add another user')} + + + + +
+ +
+ ${h.submit('save','save',class_="ui-button ui-widget ui-state-default ui-corner-all")} +
+
+
+
+ ${h.end_form()} - - - + oAC_perms.itemSelectEvent.subscribe(myHandler); + oAC_owner.itemSelectEvent.subscribe(myHandler); + + return { + oDS: oDS, + oAC_perms: oAC_perms, + oAC_owner: oAC_owner, + }; + }(); + + + + + \ No newline at end of file diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/admin/repos/repos.html --- a/pylons_app/templates/admin/repos/repos.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/admin/repos/repos.html Sat Jul 24 02:17:48 2010 +0200 @@ -4,42 +4,52 @@ <%def name="title()"> ${_('Repositories administration')} -<%def name="breadcrumbs()"> - ${h.link_to(u'Admin',h.url('admin_home'))} - / - ${_('Repos')} + + +<%def name="breadcrumbs_links()"> + ${h.link_to(_('Admin'),h.url('admin_home'))} » ${_('Repositories')} <%def name="page_nav()"> ${self.menu('admin')} - ${self.submenu('repos')} <%def name="main()"> -
-

${_('Repositories administration')}

+
+ +
+ ${self.breadcrumbs()} + +
+ +
- - - + + + - %for cnt,repo in enumerate(c.repos_list): - - - + %for cnt,repo in enumerate(c.repos_list): + + + - - %endfor -
${_('name')}${_('last revision')}${_('action')}${_('name')}${_('last revision')}${_('action')}
- %if repo['repo'].dbrepo.private: - ${_('private')} - %else: - ${_('public')} - %endif - ${h.link_to(repo['name'],h.url('edit_repo',repo_name=repo['name']))}r${repo['rev']}:${repo['tip']}
+ %if repo['repo'].dbrepo.private: + ${_('private')} + %else: + ${_('public')} + %endif + ${h.link_to(repo['name'],h.url('edit_repo',repo_name=repo['name']))}r${repo['rev']}:${repo['tip']} ${h.form(url('repo', repo_name=repo['name']),method='delete')} - ${h.submit('remove','delete',class_="delete_icon action_button",onclick="return confirm('Confirm to delete this repository');")} + ${h.submit('remove','delete',class_="delete_icon action_button",onclick="return confirm('Confirm to delete this repository');")} ${h.end_form()} -
- ${h.link_to(u'add repo',h.url('new_repo'))} + + + %endfor +
+
+ diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/admin/settings/settings.html --- a/pylons_app/templates/admin/settings/settings.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/admin/settings/settings.html Sat Jul 24 02:17:48 2010 +0200 @@ -4,50 +4,81 @@ <%def name="title()"> ${_('Settings administration')} -<%def name="breadcrumbs()"> - ${h.link_to(u'Admin',h.url('admin_home'))} - / - ${_('Settings')} + + + +<%def name="breadcrumbs_links()"> + ${h.link_to(_('Admin'),h.url('admin_home'))} » ${_('Settings')} + <%def name="page_nav()"> ${self.menu('admin')} - ${self.submenu('settings')} -<%def name="main()"> -
-

${_('Settings administration')}

- ${h.form(url('admin_setting', id='mapping'),method='put')} - - - - - - - -
${_('Remap and rescan repositories')}
- ${_('destroy old data')} ${h.checkbox('destroy',True)}${h.submit('rescan','rescan repositories')}
- ${h.end_form()} -
- ${h.form(url('admin_setting', id='global'),method='put')} - - - - - - - - - - - - - - - - -
${_('Global application settings')}
${_('Application name')}${h.text('app_title',size=30)}${self.get_form_error('app_title')}
${_('Realm text')}${h.text('app_auth_realm',size=30)}${self.get_form_error('app_auth_realm')}
${h.submit('save','save settings')}
- ${h.end_form()} +<%def name="main()"> +
+ +
+ ${self.breadcrumbs()} +
+ -
+ ${h.form(url('admin_setting', id='mapping'),method='put')} +
+ +

${_('Remap and rescan repositories')}

+
+
+
+ +
+
+
+ ${h.checkbox('destroy',True)} + +
+
+
+ +
+ ${h.submit('rescan','rescan repositories',class_="ui-button ui-widget ui-state-default ui-corner-all")} +
+
+
+ ${h.end_form()} + + ${h.form(url('admin_setting', id='global'),method='put')} +
+ +

${_('Global application settings')}

+
+ +
+
+ +
+
+ ${h.text('app_title',size=30)} +
+
+ +
+
+ +
+
+ ${h.text('app_auth_realm',size=30)} +
+
+ +
+ ${h.submit('save','save settings',class_="ui-button ui-widget ui-state-default ui-corner-all")} +
+
+
+ ${h.end_form()} + +
diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/admin/users/user_add.html --- a/pylons_app/templates/admin/users/user_add.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/admin/users/user_add.html Sat Jul 24 02:17:48 2010 +0200 @@ -4,55 +4,88 @@ <%def name="title()"> ${_('User administration')} -<%def name="breadcrumbs()"> - ${h.link_to(u'Admin',h.url('admin_home'))} - / - ${_('Users')} +<%def name="breadcrumbs_links()"> + ${h.link_to(_('Admin'),h.url('admin_home'))} + » + ${h.link_to(_('Users'),h.url('users'))} + » + ${_('add new user')} + <%def name="page_nav()"> ${self.menu('admin')} - ${self.submenu('users')} + <%def name="main()"> -
-

${_('User')} - ${_('add new')}

- ${h.form(url('users'))} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
${_('Username')}${h.text('username')}${self.get_form_error('username')}
${_('Password')}${h.password('password')}${self.get_form_error('password')}
${_('Name')}${h.text('name')}${self.get_form_error('name')}
${_('Lastname')}${h.text('lastname')}${self.get_form_error('lastname')}
${_('Email')}${h.text('email')}${self.get_form_error('email')}
${_('Active')}${h.checkbox('active',value=True)}${self.get_form_error('active')}
${h.submit('save','save')}
- ${h.end_form()} +
+ +
+ ${self.breadcrumbs()}
+ + ${h.form(url('users'))} +
+ +
+
+
+ +
+
+ ${h.text('username')} +
+
+ +
+
+ +
+
+ ${h.password('password')} +
+
+ +
+
+ +
+
+ ${h.text('name')} +
+
+ +
+
+ +
+
+ ${h.text('lastname')} +
+
+ +
+
+ +
+
+ ${h.text('email')} +
+
+ +
+
+ +
+
+ ${h.checkbox('active',value=True)} +
+
+ +
+ ${h.submit('save','save',class_="ui-button ui-widget ui-state-default ui-corner-all")} +
+
+
+ ${h.end_form()} +
\ No newline at end of file diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/admin/users/user_edit.html --- a/pylons_app/templates/admin/users/user_edit.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/admin/users/user_edit.html Sat Jul 24 02:17:48 2010 +0200 @@ -4,61 +4,98 @@ <%def name="title()"> ${_('User administration')} -<%def name="breadcrumbs()"> - ${h.link_to(u'Admin',h.url('admin_home'))} - / - ${_('Users')} + +<%def name="breadcrumbs_links()"> + ${h.link_to(_('Admin'),h.url('admin_home'))} + » + ${h.link_to(_('Users'),h.url('users'))} + » + ${_('edit')} "${c.user.username}" + <%def name="page_nav()"> ${self.menu('admin')} - ${self.submenu('users')} + <%def name="main()"> -
-

${_('User')} - ${c.user.username}

- ${h.form(url('user', id=c.user.user_id),method='put')} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
${_('Username')}${h.text('username')}${self.get_form_error('username')}
${_('New password')}${h.text('new_password')}${self.get_form_error('new_password')}
${_('Name')}${h.text('name')}${self.get_form_error('name')}
${_('Lastname')}${h.text('lastname')}${self.get_form_error('lastname')}
${_('Email')}${h.text('email')}${self.get_form_error('email')}
${_('Active')}${h.checkbox('active',value=True)}${self.get_form_error('active')}
${_('Admin')}${h.checkbox('admin',value=True)}${self.get_form_error('admin')}
${h.submit('save','save')}
- ${h.end_form()} +
+ +
+ ${self.breadcrumbs()}
+ + ${h.form(url('user', id=c.user.user_id),method='put')} +
+ +
+
+
+ +
+
+ ${h.text('username')} +
+
+ +
+
+ +
+
+ ${h.text('new_password')} +
+
+ +
+
+ +
+
+ ${h.text('name')} +
+
+ +
+
+ +
+
+ ${h.password('lastname')} +
+
+ +
+
+ +
+
+ ${h.text('email')} +
+
+ +
+
+ +
+
+ ${h.checkbox('active',value=True)} +
+
+ +
+
+ +
+
+ ${h.checkbox('admin',value=True)} +
+
+ +
+ ${h.submit('save','save',class_="ui-button ui-widget ui-state-default ui-corner-all")} +
+
+
+ ${h.end_form()} +
\ No newline at end of file diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/admin/users/users.html --- a/pylons_app/templates/admin/users/users.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/admin/users/users.html Sat Jul 24 02:17:48 2010 +0200 @@ -4,42 +4,55 @@ <%def name="title()"> ${_('Users administration')} -<%def name="breadcrumbs()"> - ${h.link_to(u'Admin',h.url('admin_home'))} - / - ${_('Users')} + +<%def name="breadcrumbs_links()"> + ${h.link_to(_('Admin'),h.url('admin_home'))} » ${_('Users')} + <%def name="page_nav()"> ${self.menu('admin')} - ${self.submenu('users')} + <%def name="main()"> -
-

${_('Users administration')}

+
+ +
+ ${self.breadcrumbs()} + +
+ +
- - - - - - - - - %for user in c.users_list: - + + + + + + + + + %for cnt,user in enumerate(c.users_list): + %if user.name !='default': + + ${h.form(url('user', id=user.user_id),method='delete')} + ${h.submit('remove','delete',class_="delete_icon action_button")} + ${h.end_form()} + + %endif %endfor
${_('username')}${_('name')}${_('lastname')}${_('active')}${_('admin')}${_('action')}
${_('username')}${_('name')}${_('lastname')}${_('active')}${_('admin')}${_('action')}
${h.link_to(user.username,h.url('edit_user', id=user.user_id))} ${user.name} ${user.lastname} ${user.active} ${user.admin} - ${h.form(url('user', id=user.user_id),method='delete')} - ${h.submit('remove','delete',class_="delete_icon action_button")} - ${h.end_form()} -
- ${h.link_to(u'add user',h.url('new_user'))}
+
diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/base/base.html --- a/pylons_app/templates/base/base.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/base/base.html Sat Jul 24 02:17:48 2010 +0200 @@ -2,97 +2,120 @@ + ${next.title()} + - ${next.title()} - ##For future use yui reset for cross browser compatability. - ## + ${self.css()} + ${self.js()} + + + + + + +
+
+ <% messages = h.flash.pop_messages() %> + % if messages: +
    + % for message in messages: +
  • ${message}
  • + % endfor +
+ % endif +
+
+ ${next.main()} +
+
+ - -
- - ### MAKO DEFS ### - <%def name="page_nav()"> ${self.menu()} - ${self.submenu()} -<%def name="menu(current)"> -<% -def is_current(selected): - if selected == current: - return "class='current'" -%> +<%def name="menu(current=None)"> + <% + def is_current(selected): + if selected == current: + return "class='current'" + %> %if current not in ['home','admin']: - ##regular menu - -
- -<%def name="submenu(current=None)"> - <% - def is_current(selected): - if selected == current: - return "class='current_submenu'" - %> - %if current != None: -
- -
- %endif <%def name="css()"> - + + + + + + <%def name="js()"> + + - -<%def name="get_form_error(element)"> - %if hasattr(c,'form_errors') and type(c.form_errors) == dict: - %if c.form_errors.get(element,False): - - ${c.form_errors.get(element,'')} - - %endif - %endif +<%def name="breadcrumbs()"> + \ No newline at end of file diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/branches/branches.html --- a/pylons_app/templates/branches/branches.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/branches/branches.html Sat Jul 24 02:17:48 2010 +0200 @@ -1,18 +1,31 @@ +## -*- coding: utf-8 -*- <%inherit file="/base/base.html"/> + <%def name="title()"> - ${_('Branches')} + ${_('Administration')} -<%def name="breadcrumbs()"> + +<%def name="breadcrumbs_links()"> ${h.link_to(u'Home',h.url('/'))} - / + » ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))} - / + » ${_('branches')} + <%def name="page_nav()"> - ${self.menu('branches')} + ${self.menu('branches')} + <%def name="main()"> - - <%include file='branches_data.html'/> - \ No newline at end of file +
+ +
+ ${self.breadcrumbs()} +
+ +
+ <%include file='branches_data.html'/> +
+
+ \ No newline at end of file diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/branches/branches_data.html --- a/pylons_app/templates/branches/branches_data.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/branches/branches_data.html Sat Jul 24 02:17:48 2010 +0200 @@ -1,11 +1,11 @@ % if c.repo_branches: - - - - - - + + + + + + %for cnt,branch in enumerate(c.repo_branches.items()): diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/changelog/changelog.html --- a/pylons_app/templates/changelog/changelog.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/changelog/changelog.html Sat Jul 24 02:17:48 2010 +0200 @@ -3,106 +3,107 @@ <%def name="title()"> ${_('Changelog - %s') % c.repo_name} -<%def name="breadcrumbs()"> + +<%def name="breadcrumbs_links()"> ${h.link_to(u'Home',h.url('/'))} - / - ${h.link_to(c.repo_name,h.url('changelog_home',repo_name=c.repo_name))} - / - ${_('changelog')} + » + ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))} + » + ${_('Changelog')} - ${_('showing ')} ${c.size if c.size <= c.total_cs else c.total_cs} ${_('out of')} ${c.total_cs} ${_('revisions')} + <%def name="page_nav()"> ${self.menu('changelog')} <%def name="main()"> - - - -% if c.pagination: - -
-
- -
-
-
- ${h.form(h.url.current(),method='get')} -
- ${_('Show')}: - ${h.text('size',size=2,value=c.size)} - ${_('revisions')} - ${h.submit('set',_('set'))} -
- ${h.end_form()} -
- %for cnt,cs in enumerate(c.pagination): -
-
-
${_('commit')} ${cs.revision}: ${cs.raw_id}@${cs.date}
- - ${cs.branch} - %for tag in cs.tags: - ${tag} - %endfor - -
${cs.author}
-
- ${h.link_to(h.wrap_paragraphs(cs.message), - h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))} +
+ +
+ ${self.breadcrumbs()} +
+
+ % if c.pagination: +
+
+
-
-
-
- ${len(cs.removed)} - ${len(cs.changed)} - ${len(cs.added)} -
- %if len(cs.parents)>1: -
- ${_('merge')}merge -
- %endif - %for p_cs in reversed(cs.parents): -
${_('Parent')} ${p_cs.revision}: ${h.link_to(p_cs.raw_id, - h.url('changeset_home',repo_name=c.repo_name,revision=p_cs.raw_id),title=p_cs.message)} +
+
+ + ${h.form(h.url.current(),method='get')} +
+ ${_('Show')}: + ${h.text('size',size=1,value=c.size)} + ${_('revisions')} + ${h.submit('set',_('set'))} +
+ ${h.end_form()} + +
+ %for cnt,cs in enumerate(c.pagination): +
+
+
${_('commit')} ${cs.revision}: ${cs.raw_id}@${cs.date}
+ + ${cs.branch} + %for tag in cs.tags: + ${tag} + %endfor + +
${cs.author}
+
+ ${h.link_to(h.wrap_paragraphs(cs.message), + h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}
- %endfor -
-
- - %endfor -
-
- - - - -
-

${c.pagination.pager('$link_previous ~2~ $link_next')}

-
-%else: - ${_('There are no changes yet')} -%endif - \ No newline at end of file +
+
+
+ ${len(cs.removed)} + ${len(cs.changed)} + ${len(cs.added)} +
+ %if len(cs.parents)>1: +
+ ${_('merge')}merge +
+ %endif + %for p_cs in reversed(cs.parents): +
${_('Parent')} ${p_cs.revision}: ${h.link_to(p_cs.raw_id, + h.url('changeset_home',repo_name=c.repo_name,revision=p_cs.raw_id),title=p_cs.message)} +
+ %endfor +
+
+ + %endfor +
+ ${c.pagination.pager('$link_previous ~2~ $link_next')} +
+
+
+ + + + %else: + ${_('There are no changes yet')} + %endif +
+
+ \ No newline at end of file diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/changeset/changeset.html --- a/pylons_app/templates/changeset/changeset.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/changeset/changeset.html Sat Jul 24 02:17:48 2010 +0200 @@ -3,23 +3,26 @@ <%def name="title()"> ${_('Changeset')} -<%def name="breadcrumbs()"> + +<%def name="breadcrumbs_links()"> ${h.link_to(u'Home',h.url('/'))} - / - ${h.link_to(c.repo_name,h.url('changeset_home',repo_name=c.repo_name))} - / - ${_('changeset')} + » + ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))} + » + ${_('Changeset')} - r${c.changeset.revision}:${c.changeset.raw_id} + <%def name="page_nav()"> ${self.menu('changelog')} -<%def name="css()"> - - - + <%def name="main()"> - - +
+ +
+ ${self.breadcrumbs()} +
+
@@ -84,6 +87,8 @@
%endif - %endfor - - \ No newline at end of file + %endfor +
+
+ + \ No newline at end of file diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/errors/error_document.html --- a/pylons_app/templates/errors/error_document.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/errors/error_document.html Sat Jul 24 02:17:48 2010 +0200 @@ -1,46 +1,53 @@ ## -*- coding: utf-8 -*- - - - Error - ${c.error_message} - - - %if c.redirect_time: - - %endif - + + Error - ${c.error_message} + + %if c.redirect_time: + + %endif + + + + + + + + - - - - -
-

${c.error_message}

- -

${c.error_explanation}

- %if c.redirect_time: -

${_('You will be redirected to %s in %s seconds') % (c.redirect_module,c.redirect_time)}

- %endif - -
- + + + +
+
+
+

${c.error_message}

+ +

${c.error_explanation}

+ %if c.redirect_time: +

${_('You will be redirected to %s in %s seconds') % (c.redirect_module,c.redirect_time)}

+ %endif + +
+
+ +
+ + - diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/files/file_diff.html --- a/pylons_app/templates/files/file_diff.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/files/file_diff.html Sat Jul 24 02:17:48 2010 +0200 @@ -3,41 +3,47 @@ <%def name="title()"> ${_('Repository managment')} -<%def name="breadcrumbs()"> +<%def name="breadcrumbs_links()"> ${h.link_to(u'Home',h.url('/'))} - / - ${h.link_to(c.repo_name,h.url('files_home',repo_name=c.repo_name))} - / - ${_('files')} + » + ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))} + » + ${'%s: %s %s %s' % (_('File diff'),c.diff2,'→',c.diff1)|n} + <%def name="page_nav()"> ${self.menu('files')} -<%def name="css()"> - - - <%def name="main()"> - -
-
-
- ${h.link_to(c.f_path,h.url('files_home',repo_name=c.repo_name, - revision=c.diff2.split(':')[1],f_path=c.f_path))} - » ${h.link_to(_('diff'), - h.url.current(diff2=c.diff2.split(':')[-1],diff1=c.diff1.split(':')[-1],diff='diff'))} - » ${h.link_to(_('raw diff'), - h.url.current(diff2=c.diff2.split(':')[-1],diff1=c.diff1.split(':')[-1],diff='raw'))} - » ${h.link_to(_('download diff'), - h.url.current(diff2=c.diff2.split(':')[-1],diff1=c.diff1.split(':')[-1],diff='download'))} -
-
-
- %if c.no_changes: - ${_('No changes')} - %else: - ${c.cur_diff|n} - %endif -
-
- \ No newline at end of file +
+ +
+ ${self.breadcrumbs()} +
+
+
+
+
+ ${h.link_to(c.f_path,h.url('files_home',repo_name=c.repo_name, + revision=c.diff2.split(':')[1],f_path=c.f_path))} + » ${h.link_to(_('diff'), + h.url.current(diff2=c.diff2.split(':')[-1],diff1=c.diff1.split(':')[-1],diff='diff'))} + » ${h.link_to(_('raw diff'), + h.url.current(diff2=c.diff2.split(':')[-1],diff1=c.diff1.split(':')[-1],diff='raw'))} + » ${h.link_to(_('download diff'), + h.url.current(diff2=c.diff2.split(':')[-1],diff1=c.diff1.split(':')[-1],diff='download'))} +
+
+
+ %if c.no_changes: + ${_('No changes')} + %else: + ${c.cur_diff|n} + %endif +
+
+
+
+ + + \ No newline at end of file diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/files/files.html --- a/pylons_app/templates/files/files.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/files/files.html Sat Jul 24 02:17:48 2010 +0200 @@ -1,38 +1,48 @@ <%inherit file="/base/base.html"/> <%def name="title()"> - ${_('Repository managment')} - -<%def name="breadcrumbs()"> - ${h.link_to(u'Home',h.url('/'))} - / - ${h.link_to(c.repo_name,h.url('files_home',repo_name=c.repo_name))} - / ${_('files')} + +<%def name="breadcrumbs_links()"> + ${h.link_to(u'Home',h.url('/'))} + » + ${h.link_to(c.repo_name,h.url('files_home',repo_name=c.repo_name))} + » + ${_('files')} + %if c.files_list: + @ R${c.rev_nr}:${c.cur_rev} + %endif + + <%def name="page_nav()"> ${self.menu('files')} -<%def name="css()"> - - - + <%def name="main()"> - -
- %if c.files_list: -

${_('Location')}: ${h.files_breadcrumbs(c.repo_name,c.cur_rev,c.files_list.path)}

- %if c.files_list.is_dir(): - <%include file='files_browser.html'/> +
+ +
+ ${self.breadcrumbs()} +
+
+
+ %if c.files_list: +

${_('Location')}: ${h.files_breadcrumbs(c.repo_name,c.cur_rev,c.files_list.path)}

+ %if c.files_list.is_dir(): + <%include file='files_browser.html'/> + %else: + <%include file='files_source.html'/> + %endif %else: - <%include file='files_source.html'/> - %endif - %else: -

- ${_('Go back')} - ${_('No files at given path')}: "${c.f_path or "/"}" -

- %endif - -
+

+ ${_('Go back')} + ${_('No files at given path')}: "${c.f_path or "/"}" +

+ %endif + +
+
+
+ \ No newline at end of file diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/files/files_annotate.html --- a/pylons_app/templates/files/files_annotate.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/files/files_annotate.html Sat Jul 24 02:17:48 2010 +0200 @@ -3,44 +3,49 @@ <%def name="title()"> ${_('File annotate')} -<%def name="breadcrumbs()"> + +<%def name="breadcrumbs_links()"> ${h.link_to(u'Home',h.url('/'))} - / - ${h.link_to(c.repo_name,h.url('files_home',repo_name=c.repo_name))} - / - ${_('files')} + » + ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))} + » + ${_('annotate')} + <%def name="page_nav()"> ${self.menu('files')} -<%def name="css()"> - - - <%def name="main()"> - -
-

${_('Location')}: ${h.files_breadcrumbs(c.repo_name,c.cur_rev,c.file.path)}

-
-
${_('Revision')}
-
r${c.file.last_changeset.revision}:${c.file.last_changeset._short}
-
${_('Size')}
-
${h.format_byte_size(c.file.size,binary=True)}
-
${_('Options')}
-
${h.link_to(_('show source'), - h.url('files_home',repo_name=c.repo_name,revision=c.cur_rev,f_path=c.f_path))} - / ${h.link_to(_('download as raw'), - h.url('files_raw_home',repo_name=c.repo_name,revision=c.cur_rev,f_path=c.f_path))} -
-
-
-
-
${c.file.name}@r${c.file.last_changeset.revision}:${c.file.last_changeset._short}
-
"${c.file_msg}"
+
+ +
+ ${self.breadcrumbs()} +
+
+
+

${_('Location')}: ${h.files_breadcrumbs(c.repo_name,c.cur_rev,c.file.path)}

+
+
${_('Revision')}
+
r${c.file.last_changeset.revision}:${c.file.last_changeset._short}
+
${_('Size')}
+
${h.format_byte_size(c.file.size,binary=True)}
+
${_('Options')}
+
${h.link_to(_('show source'), + h.url('files_home',repo_name=c.repo_name,revision=c.cur_rev,f_path=c.f_path))} + / ${h.link_to(_('download as raw'), + h.url('files_raw_home',repo_name=c.repo_name,revision=c.cur_rev,f_path=c.f_path))} +
+
+
+
+
${c.file.name}@r${c.file.last_changeset.revision}:${c.file.last_changeset._short}
+
"${c.file_msg}"
+
+
+ ${h.pygmentize_annotation(c.file,linenos=True,anchorlinenos=True,lineanchors='S',cssclass="code-highlight")} +
-
- ${h.pygmentize_annotation(c.file,linenos=True,anchorlinenos=True,lineanchors='S',cssclass="code-highlight")} -
-
-
- \ No newline at end of file +
+
+
+ \ No newline at end of file diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/files/files_browser.html --- a/pylons_app/templates/files/files_browser.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/files/files_browser.html Sat Jul 24 02:17:48 2010 +0200 @@ -8,9 +8,13 @@
${h.form(h.url.current())} - ${_('view')}@rev «${h.text('at_rev',value=c.rev_nr,size='5')}» - ${c.cur_rev} - ${h.submit('view','view')} +
+ ${_('view')}@rev + « + ${h.text('at_rev',value=c.rev_nr,size=3)} + » + ${h.submit('view','view')} +
${h.end_form()}
diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/files/files_source.html --- a/pylons_app/templates/files/files_source.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/files/files_source.html Sat Jul 24 02:17:48 2010 +0200 @@ -1,5 +1,5 @@ -
-
${_('Revision')}
+
+
${_('Last revision')}
r${c.files_list.last_changeset.revision}:${c.files_list.last_changeset._short}
${_('Size')}
${h.format_byte_size(c.files_list.size,binary=True)}
@@ -14,11 +14,12 @@ ${h.form(h.url('files_diff_home',repo_name=c.repo_name,f_path=c.f_path),method='GET')} ${h.hidden('diff2',c.files_list.last_changeset._short)} ${h.select('diff1','',c.file_history)} - ${h.submit('diff','diff')} + ${h.submit('diff','diff',class_="ui-button ui-widget ui-state-default ui-corner-all")} ${h.end_form()} - -
+
+ +
${c.files_list.name}@r${c.files_list.last_changeset.revision}:${c.files_list.last_changeset._short}
diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/index.html --- a/pylons_app/templates/index.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/index.html Sat Jul 24 02:17:48 2010 +0200 @@ -1,10 +1,10 @@ ## -*- coding: utf-8 -*- <%inherit file="base/base.html"/> <%def name="title()"> - ${c.repos_prefix} + ${c.hg_app_name} <%def name="breadcrumbs()"> - ${c.repos_prefix} + ${c.hg_app_name} <%def name="page_nav()"> ${self.menu('home')} @@ -17,46 +17,61 @@ %else: ${name} %endif - - + + -
${_('date')}${_('revision')}${_('name')}${_('links')}
${_('date')}${_('revision')}${_('name')}${_('links')}
${h.age(branch[1]._ctx.date())}
- - - - - - - - - - %for cnt,repo in enumerate(c.repos_list): - %if h.HasRepoPermissionAny('repository.write','repository.read','repository.admin')(repo['name'],'main page check'): - - - - - - - - - - - %endif - %endfor -
${get_sort(_('Name'))}${get_sort(_('Description'))}${get_sort(_('Last change'))}${get_sort(_('Tip'))}${get_sort(_('Contact'))}${_('RSS')}${_('Atom')}
- %if repo['repo'].dbrepo.private: - ${_('private')} - %else: - ${_('public')} - %endif - ${h.link_to(repo['name'], - h.url('summary_home',repo_name=repo['name']))}${h.truncate(repo['description'],60)}${h.age(repo['last_change'])}${h.link_to_if(repo['rev']>=0,'r%s:%s' % (repo['rev'],repo['tip']), - h.url('changeset_home',repo_name=repo['name'],revision=repo['tip']), - class_="tooltip", - tooltip_title=h.tooltip(repo['last_msg']))}${h.person(repo['contact'])} - - - -
+ + + +
+ +
+
${_('Dashboard')}
+
+ +
+ + + + + + + + + + + + + + %for cnt,repo in enumerate(c.repos_list): + %if h.HasRepoPermissionAny('repository.write','repository.read','repository.admin')(repo['name'],'main page check'): + + + + + + + + + + %endif + %endfor + +
${get_sort(_('Name'))}${get_sort(_('Description'))}${get_sort(_('Last change'))}${get_sort(_('Tip'))}${get_sort(_('Contact'))}${_('RSS')}${_('Atom')}
+ %if repo['repo'].dbrepo.private: + ${_('private')} + %else: + ${_('public')} + %endif + ${h.link_to(repo['name'], + h.url('summary_home',repo_name=repo['name']))}${h.truncate(repo['description'],60)}${h.age(repo['last_change'])}${h.link_to_if(repo['rev']>=0,'r%s:%s' % (repo['rev'],repo['tip']), + h.url('changeset_home',repo_name=repo['name'],revision=repo['tip']), + class_="tooltip", + tooltip_title=h.tooltip(repo['last_msg']))}${h.person(repo['contact'])} + + + +
+
+
diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/login.html --- a/pylons_app/templates/login.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/login.html Sat Jul 24 02:17:48 2010 +0200 @@ -1,38 +1,76 @@ ## -*- coding: utf-8 -*- -<%inherit file="base/base.html"/> -<%def name="title()"> - ${c.repos_prefix} - -<%def name="breadcrumbs()"> - ${c.repos_prefix} - -<%def name="page_nav()"> -   -
- -<%def name="main()"> -
-
-

${_('Login to hg app')}

- ${h.form(h.url.current())} - - - - - - - - - - - - - - - -
${_('Username')}${h.text('username')}${self.get_form_error('username')}
${_('Password')}${h.password('password')}${self.get_form_error('password')}
${h.submit('login','login')}
- ${h.end_form()} + + + + ${_('Sign In to hg-app')} + + + + + + + + + + + + + +
+ +
+
${_('Sign In to hg-app')}
+
+
+
+
+ ${h.form(h.url.current())} +
+ + +
+
+
+ +
+
+ ${h.text('username',class_='focus',size=40)} +
+ +
+
+
+ +
+
+ ${h.password('password',class_='focus',size=40)} +
+ +
+ ##
+ ##
+ ## + ## + ##
+ ##
+
+ ${h.submit('sign_in','Sign In',class_="ui-button ui-widget ui-state-default ui-corner-all")} +
+
+ + + + + +
+ ${h.end_form()} +
+
- + + - diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/register.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pylons_app/templates/register.html Sat Jul 24 02:17:48 2010 +0200 @@ -0,0 +1,88 @@ +## -*- coding: utf-8 -*- + + + + ${_('Sign Up to hg-app')} + + + + + + + + + + + + + +
+ +
+
${_('Sign Up to hg-app')}
+
+
+
+
+ ${h.form(url('register'))} +
+ +
+
+
+ +
+
+ ${h.text('username')} +
+
+ +
+
+ +
+
+ ${h.password('password')} +
+
+ +
+
+ +
+
+ ${h.text('name')} +
+
+ +
+
+ +
+
+ ${h.text('lastname')} +
+
+ +
+
+ +
+
+ ${h.text('email')} +
+
+ +
+
+ ${h.submit('sign_up','Sign Up',class_="ui-button ui-widget ui-state-default ui-corner-all")} +
+
+
+
+ ${h.end_form()} +
+
+ + + diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/settings/repo_settings.html --- a/pylons_app/templates/settings/repo_settings.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/settings/repo_settings.html Sat Jul 24 02:17:48 2010 +0200 @@ -2,239 +2,256 @@ <%inherit file="/base/base.html"/> <%def name="title()"> - ${_('Repository settings')} + ${_('Repositories administration')} -<%def name="breadcrumbs()"> - ${h.link_to(u'Home',h.url('/'))} - / - ${h.link_to(c.repo_name,h.url('shortlog_home',repo_name=c.repo_name))} - / - ${_('settings')} + +<%def name="breadcrumbs_links()"> + ${h.link_to(c.repo_info.repo_name,h.url('summary_home',repo_name=c.repo_info.repo_name))} + » + ${_('Settings')} + <%def name="page_nav()"> - ${self.menu('settings')} + ${self.menu('settings')} <%def name="main()"> - -
- ${h.form(url('repo_settings_update', repo_name=c.repo_info.repo_name),method='put')} - - - - - - - - - - - - - - - - - - - - - - - - - - -
${_('Name')}${h.text('repo_name',size="28")}${self.get_form_error('repo_name')}
${_('Description')}${h.textarea('description',cols=32,rows=5)}${self.get_form_error('description')}
${_('Private')}${h.checkbox('private',value="True")}${self.get_form_error('private')}
${_('Permissions')} - - - - - - - - - - %for r2p in c.repo_info.repo2perm: - %if r2p.user.username =='default' and c.repo_info.private: - - - - - %else: - - - - - - - - - %endif - %endfor - <% - if not hasattr(c,'form_errors'): - d = 'display:none;' - else: - d='' - %> +
+ +
+ ${self.breadcrumbs()} +
+ ${h.form(url('repo_settings_update', repo_name=c.repo_info.repo_name),method='put')} +
+ +
+
+
+ +
+
+ ${h.text('repo_name')} +
+
+ +
+
+ +
+
+ ${h.textarea('description',cols=23,rows=5)} +
+
+ +
+
+ +
+
+ ${h.checkbox('private',value="True")} +
+
+ +
+
+ +
+
+
${_('none')}${_('read')}${_('write')}${_('admin')}${_('user')}
- ${_('disabled for private repository')}${r2p.user.username}
${h.radio('perm_%s' % r2p.user.username,'repository.none')}${h.radio('perm_%s' % r2p.user.username,'repository.read')}${h.radio('perm_%s' % r2p.user.username,'repository.write')}${h.radio('perm_%s' % r2p.user.username,'repository.admin')}${r2p.user.username} - %if r2p.user.username !='default': - - - - %endif -
+ + + + + + + + + + %for r2p in c.repo_info.repo2perm: + %if r2p.user.username =='default' and c.repo_info.private: + + + + + %else: + + + + + + + + + %endif + %endfor - - - - - - - - - - - -
${_('none')}${_('read')}${_('write')}${_('admin')}${_('user')}
+ + ${_('disabled for private repository')} + + ${r2p.user.username}
${h.radio('perm_%s' % r2p.user.username,'repository.none')}${h.radio('perm_%s' % r2p.user.username,'repository.read')}${h.radio('perm_%s' % r2p.user.username,'repository.write')}${h.radio('perm_%s' % r2p.user.username,'repository.admin')}${r2p.user.username} + %if r2p.user.username !='default': + + + + %endif +
${h.radio('perm_new_user','repository.none')}${h.radio('perm_new_user','repository.read')}${h.radio('perm_new_user','repository.write')}${h.radio('perm_new_user','repository.admin')} -
- ${h.text('perm_new_user_name',class_='yui-ac-input')} -
-
-
${self.get_form_error('perm_new_user_name')}
- - ${_('Add another user')} - -
-
${h.submit('update','update')}
- ${h.end_form()} + + + ${h.radio('perm_new_user','repository.none')} + ${h.radio('perm_new_user','repository.read')} + ${h.radio('perm_new_user','repository.write')} + ${h.radio('perm_new_user','repository.admin')} + +
+ ${h.text('perm_new_user_name',class_='yui-ac-input')} +
+
+ + + + + + + ${_('Add another user')} + + + + +
+ +
+ ${h.submit('update','update',class_="ui-button ui-widget ui-state-default ui-corner-all")} +
+
+
+ ${h.end_form()} - -
- + oAC_perms.itemSelectEvent.subscribe(myHandler); + //oAC_owner.itemSelectEvent.subscribe(myHandler); + + return { + oDS: oDS, + oAC_perms: oAC_perms, + oAC_owner: oAC_owner, + }; + }(); + + +
+ + + diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/shortlog/shortlog.html --- a/pylons_app/templates/shortlog/shortlog.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/shortlog/shortlog.html Sat Jul 24 02:17:48 2010 +0200 @@ -2,23 +2,32 @@ <%inherit file="/base/base.html"/> <%def name="title()"> - ${_('Repository managment')} + ${_('Shortlog')} -<%def name="breadcrumbs()"> + + +<%def name="breadcrumbs_links()"> ${h.link_to(u'Home',h.url('/'))} - / - ${h.link_to(c.repo_name,h.url('shortlog_home',repo_name=c.repo_name))} - / + » + ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))} + » ${_('shortlog')} + <%def name="page_nav()"> - ${self.menu('shortlog')} + ${self.menu('shortlog')} <%def name="main()"> - - - -
- ${c.shortlog_data} -
- \ No newline at end of file +
+ +
+ ${self.breadcrumbs()} +
+ +
+
+ ${c.shortlog_data} +
+
+
+ \ No newline at end of file diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/shortlog/shortlog_data.html --- a/pylons_app/templates/shortlog/shortlog_data.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/shortlog/shortlog_data.html Sat Jul 24 02:17:48 2010 +0200 @@ -1,15 +1,14 @@ ## -*- coding: utf-8 -*- % if c.repo_changesets: - - - - - - - - - - +
${_('date')}${_('author')}${_('revision')}${_('commit message')}${_('branch')}${_('tags')}${_('links')}
+ + + + + + + + %for cnt,cs in enumerate(c.repo_changesets): @@ -43,22 +42,22 @@ %endfor
${_('date')}${_('author')}${_('revision')}${_('commit message')}${_('branch')}${_('tags')}${_('links')}
-
- -

- ${c.repo_changesets.pager('$link_previous ~2~ $link_next', - onclick="""YAHOO.util.Connect.asyncRequest('GET','$partial_url',{ - success:function(o){YAHOO.util.Dom.get(data_div).innerHTML=o.responseText; - YAHOO.util.Event.addListener(YAHOO.util.Dom.getElementsByClassName('pager_link'),"click",function(){ - YAHOO.util.Dom.setStyle(data_div,'opacity','0.3');}); - YAHOO.util.Dom.setStyle(data_div,'opacity','1');}},null); return false;""")} -

-
+ + + +
+${c.repo_changesets.pager('$link_previous ~2~ $link_next', +onclick="""YAHOO.util.Connect.asyncRequest('GET','$partial_url',{ +success:function(o){YAHOO.util.Dom.get(data_div).innerHTML=o.responseText; +YAHOO.util.Event.addListener(YAHOO.util.Dom.getElementsByClassName('pager_link'),"click",function(){ + YAHOO.util.Dom.setStyle(data_div,'opacity','0.3');}); +YAHOO.util.Dom.setStyle(data_div,'opacity','1');}},null); return false;""")} +
%else: - ${_('There are no commits yet')} -%endif \ No newline at end of file + ${_('There are no commits yet')} +%endif diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/summary/summary.html --- a/pylons_app/templates/summary/summary.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/summary/summary.html Sat Jul 24 02:17:48 2010 +0200 @@ -1,71 +1,270 @@ <%inherit file="/base/base.html"/> + <%def name="title()"> - ${_('Repository managment')} + ${_('Mercurial Repository Overview')} -<%def name="breadcrumbs()"> + + + +<%def name="breadcrumbs_links()"> ${h.link_to(u'Home',h.url('/'))} - / + » ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))} - / + » ${_('summary')} + <%def name="page_nav()"> ${self.menu('summary')} -<%def name="js()"> - +<%def name="main()"> - +
+ +
+ ${self.breadcrumbs()} +
+ +
+
+ +
+
+ +
+
+ ${c.repo_info.name} +
+
+ + +
+
+ +
+
+ ${c.repo_info.description} +
+
+ + +
+
+ +
+
+ ${c.repo_info.contact} +
+
+ +
+
+ +
+
+ ${h.age(c.repo_info.last_change)} - ${h.rfc822date(c.repo_info.last_change)} +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ %for cnt,archive in enumerate(c.repo_info._get_archives()): + %if cnt >=1: + | + %endif + ${h.link_to(c.repo_info.name+'.'+archive['type'], + h.url('files_archive_home',repo_name=c.repo_info.name, + revision='tip',fileformat=archive['extension']),class_="archive_icon")} + %endfor +
+
+ +
+
+ +
+
+ ${h.link_to(_('RSS'),h.url('rss_feed_home',repo_name=c.repo_info.name),class_='rss_icon')} + ${h.link_to(_('Atom'),h.url('atom_feed_home',repo_name=c.repo_info.name),class_='atom_icon')} +
+
+
+
+
+ +
+ +
+
${_('Last month commit activity')}
+
+ +
+
+
+
+
+ + +
+
+
+ + +
+
+ +
+
+ +
+
+ <%include file='../shortlog/shortlog_data.html'/> +
+
+
+
+ +
+
+ <%include file='../tags/tags_data.html'/> +
+
+
+
+ +
+
+ <%include file='../branches/branches_data.html'/> +
+
\ No newline at end of file diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/tags/tags.html --- a/pylons_app/templates/tags/tags.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/tags/tags.html Sat Jul 24 02:17:48 2010 +0200 @@ -1,20 +1,31 @@ +## -*- coding: utf-8 -*- <%inherit file="/base/base.html"/> + <%def name="title()"> - ${_('Tags')} + ${_('Administration')} -<%def name="breadcrumbs()"> + + +<%def name="breadcrumbs_links()"> ${h.link_to(u'Home',h.url('/'))} - / + » ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))} - / + » ${_('tags')} + <%def name="page_nav()"> - ${self.menu('tags')} + ${self.menu('tags')} <%def name="main()"> - - - <%include file='tags_data.html'/> - - \ No newline at end of file +
+ +
+ ${self.breadcrumbs()} +
+ +
+ <%include file='tags_data.html'/> +
+
+ \ No newline at end of file diff -r 3581656180b7 -r 558eb7c5028f pylons_app/templates/tags/tags_data.html --- a/pylons_app/templates/tags/tags_data.html Sat Jul 24 00:53:43 2010 +0200 +++ b/pylons_app/templates/tags/tags_data.html Sat Jul 24 02:17:48 2010 +0200 @@ -1,10 +1,10 @@ %if c.repo_tags: - - - - - - +
${_('date')}${_('revision')}${_('name')}${_('links')}
+ + + + + %for cnt,tag in enumerate(c.repo_tags.items()):
${_('date')}${_('revision')}${_('name')}${_('links')}