From e4ea5cf5984652e3966825bc2b68dd1abc3eef1c Mon Sep 17 00:00:00 2001
From: Unknown <joe2010xtmf@163.com>
Date: Sun, 29 Jun 2014 16:30:41 -0400
Subject: [PATCH] Finish Teams page

---
 cmd/serve.go             |   2 +-
 gogs.go                  |   2 +-
 models/org.go            |  52 +++-
 public/css/gogs.css      | 577 +++++++++------------------------------
 routers/org/members.go   |  16 ++
 routers/org/org.go       |   9 +-
 routers/org/teams.go     |  47 +++-
 routers/repo/repo.go     |   2 +-
 routers/repo/setting.go  |   2 +-
 templates/VERSION        |   2 +-
 templates/org/teams.tmpl |  54 ++--
 11 files changed, 247 insertions(+), 518 deletions(-)
 create mode 100644 routers/org/members.go

diff --git a/cmd/serve.go b/cmd/serve.go
index 351553b91e..7644b0cf2b 100644
--- a/cmd/serve.go
+++ b/cmd/serve.go
@@ -13,11 +13,11 @@ import (
 	"strings"
 
 	"github.com/codegangsta/cli"
-	"github.com/satori/go.uuid"
 
 	"github.com/gogits/gogs/models"
 	"github.com/gogits/gogs/modules/log"
 	"github.com/gogits/gogs/modules/setting"
+	"github.com/gogits/gogs/modules/uuid"
 )
 
 var CmdServ = cli.Command{
diff --git a/gogs.go b/gogs.go
index 3ad059bcc1..bef018594c 100644
--- a/gogs.go
+++ b/gogs.go
@@ -17,7 +17,7 @@ import (
 	"github.com/gogits/gogs/modules/setting"
 )
 
-const APP_VER = "0.4.5.0628 Alpha"
+const APP_VER = "0.4.5.0629 Alpha"
 
 func init() {
 	runtime.GOMAXPROCS(runtime.NumCPU())
diff --git a/models/org.go b/models/org.go
index 29a5ac3cab..71b1efe9cf 100644
--- a/models/org.go
+++ b/models/org.go
@@ -10,6 +10,16 @@ import (
 	"github.com/gogits/gogs/modules/base"
 )
 
+// IsOrgOwner returns true if given user is in the owner team.
+func (org *User) IsOrgOwner(uid int64) bool {
+	return IsOrganizationOwner(org.Id, uid)
+}
+
+// IsOrgMember returns true if given user is member of organization.
+func (org *User) IsOrgMember(uid int64) bool {
+	return IsOrganizationMember(org.Id, uid)
+}
+
 // GetOwnerTeam returns owner team of organization.
 func (org *User) GetOwnerTeam() (*Team, error) {
 	t := &Team{
@@ -167,6 +177,18 @@ type Team struct {
 	RepoIds     string `xorm:"TEXT"`
 	NumMembers  int
 	NumRepos    int
+	Members     []*User `xorm:"-"`
+}
+
+// IsTeamMember returns true if given user is a member of team.
+func (t *Team) IsMember(uid int64) bool {
+	return IsTeamMember(t.OrgId, t.Id, uid)
+}
+
+// GetMembers returns all members in given team of organization.
+func (t *Team) GetMembers() (err error) {
+	t.Members, err = GetTeamMembers(t.OrgId, t.Id)
+	return err
 }
 
 // NewTeam creates a record of new team.
@@ -205,6 +227,18 @@ type OrgUser struct {
 	NumTeam  int
 }
 
+// IsOrganizationOwner returns true if given user is in the owner team.
+func IsOrganizationOwner(orgId, uid int64) bool {
+	has, _ := x.Where("is_owner=?", true).And("uid=?", uid).And("org_id=?", orgId).Get(new(OrgUser))
+	return has
+}
+
+// IsOrganizationMember returns true if given user is member of organization.
+func IsOrganizationMember(orgId, uid int64) bool {
+	has, _ := x.Where("uid=?", uid).And("org_id=?", orgId).Get(new(OrgUser))
+	return has
+}
+
 // GetOrgUsersByUserId returns all organization-user relations by user ID.
 func GetOrgUsersByUserId(uid int64) ([]*OrgUser, error) {
 	ous := make([]*OrgUser, 0, 10)
@@ -219,18 +253,6 @@ func GetOrgUsersByOrgId(orgId int64) ([]*OrgUser, error) {
 	return ous, err
 }
 
-// IsOrganizationOwner returns true if given user is in the owner team.
-func IsOrganizationOwner(orgId, uid int64) bool {
-	has, _ := x.Where("is_owner=?", true).Get(&OrgUser{Uid: uid, OrgId: orgId})
-	return has
-}
-
-// IsOrganizationMember returns true if given user is member of organization.
-func IsOrganizationMember(orgId, uid int64) bool {
-	has, _ := x.Get(&OrgUser{Uid: uid, OrgId: orgId})
-	return has
-}
-
 // ___________                    ____ ___
 // \__    ___/___ _____    _____ |    |   \______ ___________
 //   |    |_/ __ \\__  \  /     \|    |   /  ___// __ \_  __ \
@@ -246,6 +268,12 @@ type TeamUser struct {
 	TeamId int64
 }
 
+// IsTeamMember returns true if given user is a member of team.
+func IsTeamMember(orgId, teamId, uid int64) bool {
+	has, _ := x.Where("uid=?", uid).And("org_id=?", orgId).And("team_id=?", teamId).Get(new(TeamUser))
+	return has
+}
+
 // GetTeamMembers returns all members in given team of organization.
 func GetTeamMembers(orgId, teamId int64) ([]*User, error) {
 	tus := make([]*TeamUser, 0, 10)
diff --git a/public/css/gogs.css b/public/css/gogs.css
index 98cb5ee188..690ccdc3f1 100755
--- a/public/css/gogs.css
+++ b/public/css/gogs.css
@@ -1,5 +1,5 @@
 /*!
- * Gogs - Go Git Service (http://gogits.org)
+ * Gogs - Go Git Service (http://gogs.io)
  * Copyright 2014 Gogs.
  * Licensed under MIT (https://github.com/gogits/gogs/blob/master/LICENSE)
  */
@@ -7,12 +7,11 @@
 body {
     background: #F6F6F6;
 }
-
-html, body {
+html,
+body {
     height: 100%;
     font-family: Arial, Helvetica, sans-serif;
 }
-
 /* override bs3 */
 
 .tooltip-inner {
@@ -20,45 +19,38 @@ html, body {
     background: #333;
     border: none;
 }
-
 .tooltip-arrow {
     border-bottom-color: #333 !important;
 }
-
 .tooltip-arrow:before {
     border-bottom-color: transparent !important;
 }
-
 .fa {
     margin: 0 .5em;
 }
-
 .fa-m {
     margin: 0;
 }
-
 .list-group .list-group-item {
     background-color: transparent;
 }
-
 .btn {
     cursor: pointer;
 }
-
 .panel-default .panel-heading {
     background-color: #FAFAFA;
     border-bottom: 1px solid #DDD;
     font-weight: bold;
 }
-
 /* gogits nav header */
+
 .masthead {
     background-color: #428bca;
     box-shadow: inset 0 -2px 5px rgba(0, 0, 0, .1);
     margin: 0;
 }
-
 /* gogits nav item link */
+
 .nav-item {
     position: relative;
     display: inline-block;
@@ -69,60 +61,51 @@ html, body {
     height: 46px;
     margin-top: 3px;
 }
-
 #nav-logo {
     padding-left: 0;
     padding-right: 0;
     margin-right: 10px;
     margin-top: 0;
 }
-
 .nav-item:hover,
 .nav-item:focus {
     color: #fff;
     text-decoration: none;
 }
-
 .nav-item.navbar-btn {
     cursor: pointer;
     margin-top: 8px;
     padding: 5px 15px;
     height: 30px;
 }
-
 .nav-item.navbar-right .fa {
     margin: 0;
 }
-
 #nav-search-form {
     width: 300px;
     margin-top: 0;
 }
-
 #nav-search-form button {
     margin-top: 0;
     background-image: none;
     background-color: #F6F6F6;
 }
-
 #nav-search-form input[type=search] {
     background-color: #F6F6F6;
     border-bottom-right-radius: 3px;
     border-top-right-radius: 3px;
     -webkit-transition: width linear .25s;
 }
-
 #nav-search-form input[type=search]:focus {
     background-color: #FFF;
     border-color: #D9D9D9;
     width: 320px;
 }
-
 /* gogits nav item active status */
+
 #masthead .nav .active {
     color: #fff;
 }
-
 #masthead .nav .active:after {
     position: absolute;
     bottom: -1px;
@@ -136,29 +119,25 @@ html, body {
     border-bottom: 5px solid;
     border-left: 5px solid transparent;
 }
-
 #nav-logo:after {
     bottom: -4px !important;
 }
-
 #nav-avatar:after {
     bottom: -4px !important;
 }
-
 .nav .tooltip {
     border: none;
 }
-
 /* gogits logo */
+
 #nav-avatar {
     margin-top: 0;
 }
-
-#logo, #nav-avatar img {
+#logo,
+#nav-avatar img {
     width: 28px;
     height: 28px;
 }
-
 #nav-out {
     margin-top: 10px;
     padding: 5px 0;
@@ -166,56 +145,49 @@ html, body {
     height: 28px;
     float: right;
 }
-
-#nav-signin, #nav-signup {
+#nav-signin,
+#nav-signup {
     float: right;
     margin-left: 1em;
 }
-
 #nav-out .fa {
     vertical-align: -10%;
     margin: 0 .5em;
 }
-
 /* gogits body */
+
 #body {
     padding-bottom: 60px;
     margin-top: 30px;
 }
-
 #body .btn-default {
     background-color: #FFF;
     background-image: linear-gradient(to bottom, #FFF 0, #FAFAFA 100%);
 }
-
 #body-nav {
     background-color: #FFF;
     border-bottom: 1px solid #DDD;
     height: 66px
 }
-
 #body-nav .nav {
     font-size: 14px;
     margin-top: 12px;
 }
-
 #body-nav .nav-pills li a {
     color: #444;
 }
-
 #body-nav .nav-pills li.active a {
     font-weight: bold;
     border-bottom: 2px solid #d26911;
     background-color: transparent;
     color: #444;
 }
-
 #body-nav .nav-pills li:hover a {
     background-color: transparent;
     text-decoration: underline;
 }
-
 /* gogits login card */
+
 .card {
     margin: auto;
     padding: 30px;
@@ -224,69 +196,56 @@ html, body {
     border-radius: 5px;
     box-sizing: border-box;
 }
-
 .card h3 {
     margin-top: 0;
     margin-bottom: 30px;
     padding-bottom: 20px;
     border-bottom: 1px solid #ccc;
 }
-
 #login-card {
     width: 600px;
 }
-
 #login-card .form-control {
     padding: 6px 12px;
     box-sizing: content-box;
 }
-
 #login-card .control-label {
     height: 44px;
     line-height: 30px;
 }
-
 #install-card {
     width: 800px;
 }
-
 #install-card .form-group {
     margin-left: 0;
     margin-right: 0;
 }
-
 .card .btn {
     cursor: pointer;
 }
-
 .card .btn-primary {
     margin-right: 1.2em;
 }
-
 #social-login {
     margin-top: 40px;
     padding-top: 40px;
     border-top: 1px solid #ccc;
     position: relative;
 }
-
 #social-login .btn {
     float: none;
     margin: auto 4px;
 }
-
 #social-login .btn .fa {
     margin-left: 0;
     margin-right: 4px;
 }
-
 #social-login .btn span {
     display: inline-block;
     vertical-align: top;
     font-size: 16px;
     margin-top: 5px;
 }
-
 #social-login h4 {
     position: absolute;
     top: -20px;
@@ -294,12 +253,10 @@ html, body {
     text-align: center;
     background-color: transparent;
 }
-
 #social-login h4 span {
     background-color: #FFF;
     padding: 0 12px;
 }
-
 /* gogs-user-profile */
 
 #user-avatar {
@@ -307,40 +264,34 @@ html, body {
     height: 200px;
     border-radius: 6px;
 }
-
 #user-avatar-commit {
     width: 16px;
     height: 16px;
     border-radius: 2px;
 }
-
-#user-name, #user-full-name {
+#user-name,
+#user-full-name {
     font-size: 1.6em;
     font-weight: bold;
 }
-
 #user-name {
     margin-bottom: 20px;
     margin-top: 10px;
 }
-
 #user-full-name {
     margin-top: 20px;
 }
-
 #user-profile .profile-info .list-group-item {
     background-color: transparent;
     padding-top: 18px;
     color: #666;
 }
-
 #user-profile .profile-info .list-group-item a {
     margin: 0;
     padding: 0;
     display: inline;
     color: #0093c4;
 }
-
 #user-profile .profile-info .list-group {
     border-top: 1px solid #ccc;
     padding-bottom: 18px;
@@ -348,53 +299,46 @@ html, body {
     padding-left: 18px;
     padding-right: 18px;
 }
-
 #user-profile .profile-rel .col-md-6 {
     text-align: center;
     padding-bottom: 12px;
 }
-
 #user-profile .profile-rel strong {
     font-size: 24px;
     color: #444;
     display: block;
 }
-
 #user-profile .profile-rel p {
     margin-right: 0;
     color: #888;
 }
-
 #user-activity .tab-pane {
     padding: 20px;
 }
-
 #user-act-tabs li.active a {
     border-bottom-color: #ddd;
 }
-
 /* gogits repo create */
 
-#repo-create, #org-create, #org-teams-create, #org-teams-edit {
+#repo-create,
+#org-create,
+#org-teams-create,
+#org-teams-edit {
     width: 800px;
 }
-
 #repo-create textarea[name=desc] {
     height: 8em;
 }
-
 #repo-import-auth {
     width: 100%;
     margin-top: 48px;
     box-sizing: border-box;
 }
-
 #repo-import-auth .form-group {
     box-sizing: border-box;
     margin-left: 0;
     margin-right: 0;
 }
-
 /* gogits user setting */
 
 #user-setting-nav.repo-setting-nav {
@@ -403,31 +347,30 @@ html, body {
     padding: 0;
     padding-top: 10px;
 }
-
-#user-setting-nav > h4, #user-setting-container > h4, #user-setting-container > div > h4,
-#ssh-keys > h4, #user-delete > h4, #repo-setting-container .tab-pane > h4 {
+#user-setting-nav > h4,
+#user-setting-container > h4,
+#user-setting-container > div > h4,
+#ssh-keys > h4,
+#user-delete > h4,
+#repo-setting-container .tab-pane > h4 {
     padding-bottom: 18px;
     margin-bottom: 18px;
     border-bottom: 1px solid #CCC;
 }
-
 #user-setting-nav .list-group .list-group-item a {
     margin-left: 0;
     padding: .6em 1.2em;
     font-size: 14px;
     color: #3B73AF;
 }
-
 #user-setting-nav .list-group .list-group-item {
     background-color: transparent;
     margin-bottom: .6em;
 }
-
 #user-setting-nav .list-group .list-group-item-success a {
     font-weight: bold;
     color: #444;
 }
-
 .admin-nav {
     background-color: #FFF;
     padding-top: 10px;
@@ -435,62 +378,50 @@ html, body {
     padding-right: 0;
     border: 1px solid #D8D8D8;
 }
-
 .admin-nav li {
     margin-bottom: 8px;
     border-left: 4px solid transparent;
 }
-
 .admin-nav li:hover {
     border-left-color: #EEE;
 }
-
 .admin-nav li.active:hover {
     border-left: 4px solid #DD4B39;
 }
-
 #repo-setting-container {
     padding-right: 0;
 }
-
 #repo-setting-container .form-horizontal label {
     line-height: 30px;
 }
-
 #repo-collab-list li.collab {
     margin-bottom: .6em;
 }
-
 #repo-collab-list .avatar {
     margin-right: 1em;
     width: 40px;
 }
-
 #repo-collab-list a.member {
     color: #444;
 }
-
-#repo-collab-list .remove-collab, #repo-hooks-list .remove-hook {
+#repo-collab-list .remove-collab,
+#repo-hooks-list .remove-hook {
     color: #DD4B39;
 }
-
 #repo-collab-form .dropdown-menu {
     margin-left: 15px;
     margin-top: 4px;
     padding: 0;
 }
-
 #repo-collab-form .dropdown-menu li {
     padding: 0 1em;
     line-height: 36px;
     cursor: pointer;
     font-weight: bold;
 }
-
 #repo-collab-form .dropdown-menu li:hover {
     background-color: #e8f0ff;
 }
-
 #repo-collab-form .dropdown-menu img {
     width: 28px;
     height: 28px;
@@ -498,17 +429,14 @@ html, body {
     vertical-align: middle;
     margin-top: -3px;
 }
-
 #repo-collab-form .dropdown-menu ul {
     margin-bottom: 0;
 }
-
 #repo-hooks-list li {
     line-height: 40px;
     border-top: 1px solid #DDD;
     height: 40px;
 }
-
 #repo-hooks-list .link {
     display: inline-block;
     max-width: 360px;
@@ -518,32 +446,26 @@ html, body {
     line-height: 40px;
     white-space: nowrap;
 }
-
 /* gogits user ssh keys */
 
 #ssh-keys .list-group-item {
     padding: 15px 0;
     border-bottom: 1px solid #DDD;
 }
-
 #ssh-keys .list-group-item .delete {
     margin: -5px 50px 0;
 }
-
 #ssh-keys .list-group-item:after {
     clear: both;
 }
-
 #ssh-keys .name {
     font-size: 14px;
     font-weight: bold;
 }
-
 #ssh-keys .print {
     padding-left: 1em;
     color: #888;
 }
-
 #ssh-add {
     display: inline-block;
     color: white;
@@ -551,25 +473,20 @@ html, body {
     margin-left: 0;
     border-radius: 3px;
 }
-
 #ssh-form textarea {
     height: 16em;
 }
-
 /* #feed */
 
 #feed-right .repo-panel .panel-heading .btn {
     margin-top: -4px;
 }
-
 #feed-right .repo-panel .panel-body {
     padding: 0;
 }
-
 #feed-right .repo-panel .list-group {
     margin-bottom: 0;
 }
-
 #feed-right .repo-panel .list-group-item a {
     display: block;
     margin-left: 0;
@@ -577,11 +494,9 @@ html, body {
     padding-left: 0;
     font-weight: bold;
 }
-
 #feed-right .repo-panel .list-group-item .fa {
     color: #666;
 }
-
 #feed-right .repo-panel .list-group-item {
     font-size: 14px;
     line-height: 32px;
@@ -589,107 +504,92 @@ html, body {
     padding-left: 15px;
     clear: both;
 }
-
 #feed-right .repo-panel .list-group-item:last-child {
     border-bottom: none;
 }
-
 #feed-right .repo-panel .list-group-item:hover {
     background-color: #eafffd;
     background-color: rgba(65, 131, 196, 0.1);
 }
-
 #feed-right .repo-panel span.stars {
     color: #666;
     margin-right: 1em;
 }
-
 #user-dashboard-repo-new .btn-sm.dropdown-toggle {
     padding: 3px 8px;
 }
-
-#user-dashboard-repo-new .dropdown-menu, #nav-repo-new .dropdown-menu {
+#user-dashboard-repo-new .dropdown-menu,
+#nav-repo-new .dropdown-menu {
     padding: 0;
     margin: 0;
 }
-
-#user-dashboard-repo-new ul, #nav-repo-new ul {
+#user-dashboard-repo-new ul,
+#nav-repo-new ul {
     margin: 0;
     width: 200px;
 }
-
-#user-dashboard-repo-new li a, #nav-repo-new li a {
+#user-dashboard-repo-new li a,
+#nav-repo-new li a {
     line-height: 36px;
     display: block;
     padding: 0 18px;
     color: #444;
 }
-
-#user-dashboard-repo-new li a:hover, #nav-repo-new li a:hover {
+#user-dashboard-repo-new li a:hover,
+#nav-repo-new li a:hover {
     background: #0093c4;
     color: #FFF;
 }
-
 #nav-repo-new button {
     border: none;
     background: transparent;
     padding: 0;
     width: 15px;
 }
-
 #nav-repo-new li .fa {
     margin: 0 .5em;
 }
-
-#dashboard-switch .btn, #repo-owner-switch .btn {
+#dashboard-switch .btn,
+#repo-owner-switch .btn {
     height: 40px;
 }
-
 #dashboard-switch {
     margin-top: 14px;
     margin-right: 18px;
 }
-
-#dashboard-switch .dropdown-menu,#repo-owner-switch .dropdown-menu {
+#dashboard-switch .dropdown-menu,
+#repo-owner-switch .dropdown-menu {
     padding: 0;
 }
-
 #dashboard-switch-menu {
     width: 180px;
     margin-bottom: 0;
     padding-bottom: 0;
 }
-
 #dashboard-switch-menu > li > a {
     display: block;
     padding: .8em 1.2em;
 }
-
 #dashboard-switch-menu > li > a:hover {
     text-decoration: none;
 }
-
-#dashboard-switch-menu > li > a img, #dashboard-switch button img {
+#dashboard-switch-menu > li > a img,
+#dashboard-switch button img {
     margin-right: 6px;
 }
-
 #dashboard-switch-menu > li {
     border-bottom: 1px solid #eaeaea;
 }
-
 #dashboard-switch-menu > li .fa {
     opacity: 0;
     margin-right: 16px;
 }
-
 #dashboard-switch-menu > li.checked .fa {
     opacity: 1;
 }
-
 #dashboard-switch-menu > li:last-child {
     border-bottom: none;
 }
-
 /* gogits repo single page */
 
 #body-nav.repo-nav {
@@ -697,199 +597,159 @@ html, body {
     padding-bottom: 30px;
     height: auto;
 }
-
 .repo-nav .name {
     margin-top: 15px;
 }
-
 .repo-nav .desc {
     color: #888;
     margin-bottom: 0;
 }
-
 .repo-nav h3 .fa {
     color: #BBB;
     margin-left: 0;
 }
-
 .repo-nav .actions {
     padding-top: 20px;
 }
-
 .repo-nav .btn-default {
     font-family: Tahoma, Arial, sans-serif;
 }
-
 #repo-watching .dropdown-menu {
     width: 280px;
     padding: 0;
 }
-
-#repo-watching .dropdown-menu .dropdown-item:hover .dropdown-header, #repo-watching .dropdown-item .dropdown-header.text-primary {
+#repo-watching .dropdown-menu .dropdown-item:hover .dropdown-header,
+#repo-watching .dropdown-item .dropdown-header.text-primary {
     color: rgb(65, 131, 196);
     cursor: pointer;
 }
-
 #repo-watching .dropdown-menu .description {
     padding: 0 20px;
     color: #888;
 }
-
 #repo-watching .dropdown-menu .dropdown-header {
     color: #444;
     font-weight: bold;
     font-size: 14px;
     margin-bottom: 4px;
 }
-
 #repo-toolbar {
     border-bottom: 1px solid #DDD;
     background-color: #FFF;
     height: 40px;
     font-size: 14px;
 }
-
 #repo-toolbar .navbar-default {
     border: none;
     height: 39px;
 }
-
 #repo-toolbar .nav > li > a {
     height: 39px;
 }
-
 #repo-toolbar .nav .tmp {
     padding: 0 6px;
 }
-
 #repo-toolbar .nav .tmp a {
     display: inline-block;
     padding-left: 6px;
     padding-right: 6px;
 }
-
 #repo-toolbar .nav .tmp a:hover {
     text-decoration: none;
 }
-
 #repo-toolbar .nav .tmp .btn {
     margin-top: -2px;
 }
-
 #repo-toolbar .nav .active {
     color: #F6F6F6;
 }
-
 #repo-toolbar .nav > .active > a:after {
     border-bottom-color: #999;
 }
-
 #repo-toolbar .navbar.nav-toolbar {
     margin-bottom: 0;
 }
-
 #repo-toolbar .navbar-collapse {
     padding: 0;
 }
-
 #repo-toolbar ul.navbar-right {
     margin-right: 0;
 }
-
 .activity-list {
     font-size: 14px;
 }
-
 .activity-list .icon {
     font-size: 20px;
     color: #aaa;
     float: left;
 }
-
 .activity-list .info {
     margin: 0 0 0 40px;
     line-height: 1.7em;
 }
-
 .activity-list .meta {
     color: #aaa;
 }
-
 .activity-list li {
     padding: 15px 0;
     border-top: 1px solid #ddd;
 }
-
 .activity-list li:first-child {
     border-top: none;
 }
-
 .repo-list li {
     padding: 15px 0;
     border-top: 1px solid #ddd;
 }
-
 .repo-list li:first-child {
     border-top: none;
 }
-
 .repo-list h4 {
     font-weight: bold;
     font-size: 24px;
 }
-
 .repo-list .meta {
     margin: 15px 0 0;
     font-size: 14px;
 }
-
 .repo-list .desc {
     font-size: 15px;
 }
-
 .repo-list .meta .fa {
     margin: 0 0 0 20px;
 }
-
 .repo-list .meta,
 .repo-list .info {
     color: #999;
 }
-
 .popover .repo-clone-div {
     min-width: 200px;
 }
-
 #repo-clone .dropdown-menu {
     width: 400px;
     padding: 20px;
 }
-
 #repo-clone .input-group {
     margin-bottom: 15px;
 }
-
 #repo-clone .zclip {
     left: auto !important;
 }
-
 /* #source */
-#source, #commits {
+
+#source,
+#commits {
     margin-top: -20px;
 }
-
 #commits-pager {
     margin-top: 0;
 }
-
 #source .source-toolbar:after {
     clear: both;
 }
-
 #source .source-toolbar .branch-switch {
     display: inline-block;
 }
-
 #source .source-toolbar .breadcrumb {
     margin: 0 .5em;
     padding: 6px 15px;
@@ -898,31 +758,25 @@ html, body {
     display: inline-block;
     background-color: transparent;
 }
-
 #source .source-toolbar,
 #source .info-box,
 #source .file-content {
     margin: 0 0 10px;
 }
-
 .info-box .info-head,
 .info-box .info-content {
     padding: 9px 20px;
 }
-
 .info-box .info-head {
     font-weight: normal;
 }
-
 .info-box .info-content a,
 .info-box .info-head a {
     color: #666;
 }
-
 .file-list {
     background-color: #fafafa;
 }
-
 .file-list .icon {
     font-size: 17px;
     padding: 5px 0 4px 10px;
@@ -930,7 +784,6 @@ html, body {
     color: #999;
     text-align: right;
 }
-
 .file-list .wrap {
     display: inline-block;
     overflow: hidden;
@@ -938,39 +791,31 @@ html, body {
     vertical-align: top;
     white-space: nowrap;
 }
-
 .file-list .name .wrap {
     max-width: 180px;
 }
-
 .file-list .text .wrap {
     max-width: 450px;
 }
-
 .file-list .date .wrap {
     max-width: 120px;
     padding: 0 20px 0 0;
 }
-
 .file-list .date {
     text-align: right;
 }
-
 .file-content .file-head {
     font-size: 18px;
 }
-
 .file-content .file-head .icon {
     color: #666;
     margin: 0 .5em 0 0;
 }
-
 .file-content .file-head .file-size {
     font-size: 13px;
     color: #888;
     margin-left: 1em;
 }
-
 .file-content .file-body {
     padding: 30px 30px 50px;
     border: none;
@@ -979,39 +824,32 @@ html, body {
     overflow-x: auto;
     overflow-y: hidden;
 }
-
 .file-content .file-body.file-code pre {
     background-color: #FFF;
     border: none;
 }
-
 .file-content .file-body.file-code {
     padding: 0;
 }
-
 .file-content .file-body.file-code .lines-code > pre {
     border: none;
     background: none;
     border-left: 1px solid #ddd;
 }
-
 .file-content .file-body.file-code .lines-code ol.linenums > .active {
     background: #ffffdd;
 }
-
 .file-content .file-body.file-code .lines-num {
     text-align: right;
     color: #999;
     background: #fafafa;
     width: 1%;
 }
-
 .file-content .file-body.file-code .lines-ellipsis {
     background-color: #FAFAFA;
     color: #999;
     width: 1%;
 }
-
 .file-content .file-body.file-code .lines-num span {
     font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
     line-height: 1.6;
@@ -1021,158 +859,132 @@ html, body {
     margin-top: 2px;
     font-size: 90%;
 }
-
 .file-content .file-body.file-code .lines-num span:first-child {
     margin-top: 0;
 }
-
 .file-content .file-body.file-code > table {
     width: 100%;
 }
-
 .file-content .file-body.file-code > table > tbody > tr,
 .file-content .file-body.file-code > table > tbody > tr > td,
 .file-content .file-body.file-code > table {
     border: none;
     background: none;
 }
-
-.branch-list th, .commit-list th {
+.branch-list th,
+.commit-list th {
     background-color: #FFF;
     line-height: 28px !important;
 }
-
 .branch-list td {
     line-height: 36px !important;
 }
-
-.branch-box tr:hover td, .commit-box tr:hover td {
+.branch-box tr:hover td,
+.commit-box tr:hover td {
     background-color: rgba(19, 95, 215, 0.06) !important;
 }
-
-.branch-box .name, .commit-box .author {
+.branch-box .name,
+.commit-box .author {
     padding-left: 20px;
 }
-
 .branch-box .name {
     font-size: 15px;
 }
-
 .branch-box .action {
     width: 150px;
 }
-
-.branch-box td.date, .branch-box td.behind, .branch-box td.ahead {
+.branch-box td.date,
+.branch-box td.behind,
+.branch-box td.ahead {
     width: 120px;
     font-family: Verdana, Arial, sans-serif;
 }
-
 .branch-box .graph {
     display: block;
     height: 3px;
 }
-
 .branch-box .behind {
     text-align: right;
     direction: rtl;
 }
-
 .branch-box .behind .graph {
     background-color: #888;
 }
-
 .branch-box .ahead .graph {
     background-color: #0093c4;
 }
-
 .branch-box .branch-main {
     background-color: #444;
     color: #FFF;
     border-color: #444;
 }
-
 .branch-box .branch-main a {
     color: #FFF;
 }
-
 .branch-box .branch-main .name .btn {
     margin-left: .5em;
 }
-
 #commits-search-form {
     margin-top: 4px;
 }
-
-.commit-box .avatar, .diff-head-box .avatar {
+.commit-box .avatar,
+.diff-head-box .avatar {
     width: 20px;
     height: 20px;
     margin-right: 8px;
     vertical-align: top;
 }
-
 .commit-box td {
     background-color: #FFF;
 }
-
 .commit-list .date {
     width: 120px;
 }
-
 .commit-list .author {
     min-width: 180px;
 }
-
 .commit-list .sha a {
     font-family: Consolas, Menlo, Monaco, "Lucida Console", monospace;
     font-size: 14px;
 }
-
-.guide-box pre, .guide-box .input-group {
+.guide-box pre,
+.guide-box .input-group {
     margin-top: 20px;
     margin-bottom: 30px;
     line-height: 24px;
 }
-
 .guide-box input[readonly] {
     background-color: #FFF;
 }
-
-.guide-box, .diff-head-box {
+.guide-box,
+.diff-head-box {
     margin-top: 4px;
 }
-
 .guide-box .zclip {
     left: auto !important;
 }
-
 .diff-head-box h4 {
     margin-top: 0;
     margin-bottom: 0;
     line-height: 26px;
 }
-
 .diff-head-box p {
     margin-bottom: 0;
 }
-
 .diff-head-box .sha {
     margin-left: 8px;
 }
-
 .diff-head-box a.name {
     color: #444;
     margin-right: 8px;
 }
-
 .diff-head-box span.time {
     color: #888;
 }
-
 .diff-detail-box {
     margin-bottom: 16px;
     line-height: 30px;
 }
-
 .diff-detail-box span.status {
     display: inline-block;
     width: 12px;
@@ -1180,12 +992,10 @@ html, body {
     margin-right: 8px;
     vertical-align: middle;
 }
-
 .diff-detail-box ol {
     padding-left: 0;
     margin-bottom: 28px;
 }
-
 .diff-detail-box li {
     list-style: none;
     padding-bottom: 4px;
@@ -1193,121 +1003,103 @@ html, body {
     border-bottom: 1px dashed #DDD;
     padding-left: 6px;
 }
-
 .diff-detail-box span.status.modify {
     background-color: #f0db88;
 }
-
 .diff-detail-box span.status.add {
     background-color: #b4e2b4;
 }
-
 .diff-detail-box span.status.del {
     background-color: #e9aeae;
 }
-
 .diff-detail-box span.status.rename {
     background-color: #dad8ff;
 }
-
 .diff-file-box .panel-heading {
     padding: 10px 20px;
     line-height: 26px;
 }
-
 .diff-box .count {
     margin-right: 12px;
 }
-
 .diff-box .count .bar {
     width: 40px;
     display: inline-block;
     margin: 2px 4px 0 4px;
     vertical-align: text-top;
 }
-
 .diff-box .file {
     color: #888;
 }
-
 #source .file-content.diff-file-box {
     margin-bottom: 20px;
 }
-
 .diff-box .count .bar .add {
     background-color: #77c64a;
     height: 12px;
 }
-
-.diff-box .count .bar .del, .diff-box .count .bar {
+.diff-box .count .bar .del,
+.diff-box .count .bar {
     background-color: #e75316;
     height: 12px;
 }
-
 .diff-file-box .file-body.file-code .lines-code > pre {
     margin: 0;
     padding: 3px;
 }
-
 .diff-file-box .file-body.file-code .lines-num-old {
     border-right: 1px solid #DDD;
 }
-
 .diff-file-box .code-bin td {
     padding: 20px;
 }
-
-.diff-file-box .code-diff tbody tr.tag-code td, .diff-file-box .code-diff tbody tr.tag-code pre {
+.diff-file-box .code-diff tbody tr.tag-code td,
+.diff-file-box .code-diff tbody tr.tag-code pre {
     background-color: #E0E0E0 !important;
     border-color: #ADADAD !important;
 }
-
-.diff-file-box .code-diff tbody tr.add-code td, .diff-file-box .code-diff tbody tr.add-code pre {
+.diff-file-box .code-diff tbody tr.add-code td,
+.diff-file-box .code-diff tbody tr.add-code pre {
     background-color: #d1ffd6 !important;
     border-color: #b4e2b4 !important;
 }
-
-.diff-file-box .code-diff tbody tr.del-code td, .diff-file-box .code-diff tbody tr.del-code pre {
+.diff-file-box .code-diff tbody tr.del-code td,
+.diff-file-box .code-diff tbody tr.del-code pre {
     background-color: #ffe2dd !important;
     border-color: #e9aeae !important;
 }
-
-.diff-file-box .code-diff tbody tr:hover td, .diff-file-box .code-diff tbody tr:hover pre {
+.diff-file-box .code-diff tbody tr:hover td,
+.diff-file-box .code-diff tbody tr:hover pre {
     background-color: #fff8d2 !important;
     border-color: #f0db88 !important;
 }
-
 .diff-file-box .ellipsis-code pre {
     color: #AAA;
 }
-
 /* issue */
 
 #issue-create-form .avatar {
     width: 50px;
     height: 50px;
 }
-
 #issue-create-form .panel-body {
     padding: 15px 0 0 0;
 }
-
-#issue-create-form .panel-body.form-group, #issue-create-form .tab-pane .form-group {
+#issue-create-form .panel-body.form-group,
+#issue-create-form .tab-pane .form-group {
     margin-bottom: 0;
 }
-
-#issue-create-form .nav-tabs, #issue .issue-reply .nav-tabs, #issue .issue-edit-content .nav-tabs {
+#issue-create-form .nav-tabs,
+#issue .issue-reply .nav-tabs,
+#issue .issue-edit-content .nav-tabs {
     margin-bottom: 10px;
 }
-
 #issue .md-help {
     margin-top: 6px;
 }
-
 #issue .filters ul {
     margin-bottom: 0;
 }
-
 #issue .filter-list a {
     padding: 6px 10px;
     font-size: 14px;
@@ -1316,57 +1108,46 @@ html, body {
     border-radius: 3px;
     color: #444;
 }
-
 #issue .filter-list a.sm {
     font-size: 13px;
 }
-
 #issue .filter-list hr {
     border-color: #CCC;
 }
-
 #issue .filter-list li a:hover {
     background-color: #DDD;
     text-decoration: none;
 }
-
 #issue .filter-list li a.active {
     background-color: #4183c4;
     color: #FFF;
 }
-
 #issue .filter-option {
     margin-bottom: 12px;
 }
-
 #issue .filters > div {
     margin-bottom: 16px;
     padding-bottom: 16px;
     border-bottom: 1px solid #CCC;
 }
-
 #issue .label-filter li {
     line-height: 24px;
     margin-top: 4px;
 }
-
 #issue .label-filter a {
     color: #666;
     font-weight: bold;
     padding: 0 4px;
     display: block;
 }
-
 #issue .label-filter li.label-item:hover {
     background-color: #FFF;
 }
-
 #issue .label-filter .count {
     font-size: 12px;
     margin-right: 6px;
     color: #888;
 }
-
 #issue .label-filter .color {
     float: left;
     height: 12px;
@@ -1375,79 +1156,64 @@ html, body {
     margin-right: 12px;
     margin-top: 6px;
 }
-
 #issue .label-filter .del {
     margin-top: -24px;
     color: #888;
     display: none;
 }
-
 #issue .label-filter .label-button {
     margin-top: 16px;
 }
-
 #issue .list-group .list-group-item {
     background-color: #FFF;
 }
-
 #issue .issue-item:hover {
     background-color: rgba(19, 95, 215, 0.03);
 }
-
 #issue .list-group .list-group-item.unread {
     border-left: 2px solid #DD4B39;
 }
-
 #issue .issue-item .title {
     margin-bottom: 16px;
     font-weight: bold;
 }
-
 #issue .issue-item h5.title a {
     color: #444;
 }
-
 #issue .issue-item h5 .labels .label {
     margin-left: 12px;
 }
-
 #issue .issue-item .info span {
     margin-right: 12px;
     color: #888;
     line-height: 20px;
 }
-
-#issue .issue-item .info a, #issue .issue-item .number {
+#issue .issue-item .info a,
+#issue .issue-item .number {
     color: #888;
 }
-
 #issue .issue-item .number {
     margin-top: 8px;
 }
-
 #issue .issue-item .avatar {
     margin-right: 8px;
     width: 20px;
     height: 20px;
     vertical-align: top;
 }
-
 #issue .issue-whole .title {
     margin-top: 0;
     font-size: 28px;
 }
-
 #issue .issue-whole .number {
     font-size: 26px;
     color: #AAA;
 }
-
 #issue .issue-head .author .avatar {
     width: 48px;
     height: 48px;
     margin-right: 16px;
 }
-
 #issue .issue-head .info {
     width: 99%;
     margin-top: 10px;
@@ -1456,227 +1222,199 @@ html, body {
     padding-bottom: 20px;
     border-bottom: 1px solid #CCC;
 }
-
 #issue .issue-head .status {
     font-size: 16px;
     font-weight: bold;
     padding: 6px 18px;
     border-radius: 3px;
 }
-
 #issue .issue-head a.author {
     margin-left: .6em;
     color: #444;
 }
-
 #issue .issue-main {
     padding-left: 0;
 }
-
 #issue .issue-content {
     border-bottom-width: 1px;
 }
-
 #issue .issue-child .user .avatar {
     width: 42px;
     height: 42px;
     margin-right: 12px;
 }
-
 #issue .issue-child .issue-content {
     margin-left: 56px;
 }
-
 #issue .issue-child .panel-heading {
     padding-top: 10px;
     padding-bottom: 10px;
     font-weight: normal;
 }
-
-#issue .issue-child .panel-heading .user, #issue .issue-closed a.user, #issue .issue-opened a.user {
+#issue .issue-child .panel-heading .user,
+#issue .issue-closed a.user,
+#issue .issue-opened a.user {
     font-weight: bold;
 }
-
 #issue .issue-line {
     border-color: #CCC;
 }
-
 #issue .issue-is-closed .issue-line {
     display: none;
 }
-
 #issue .issue-head .info .btn {
     margin-top: -8px;
     margin-left: 8px;
 }
-
 #issue .issue-action {
     padding-left: 8px;
     color: #888;
     width: 24px;
 }
-
 #issue-edit-title {
     width: 60%;
 }
-
-#issue .issue-closed .issue-content, #issue .issue-opened .issue-content {
+#issue .issue-closed .issue-content,
+#issue .issue-opened .issue-content {
     line-height: 42px;
 }
-
-#issue .issue-closed, #issue .issue-opened {
+#issue .issue-closed,
+#issue .issue-opened {
     border-bottom: 2px solid #CCC;
     margin-bottom: 24px;
     padding-bottom: 24px;
 }
-
-#issue .issue-closed .label-danger, #issue .issue-opened .label-success {
+#issue .issue-closed .label-danger,
+#issue .issue-opened .label-success {
     margin: 0 .8em;
 }
-
 #issue .milestone-item .actions {
     margin-top: 10px;
 }
-
 #issue .milestone-item .actions a {
     margin-left: 8px;
 }
-
 #issue .milestone-item hr {
     width: 100%;
     padding-top: 8px;
     margin-top: 48px;
     margin-bottom: 8px;
 }
-
 #issue .milestone-item .label {
     margin-top: 8px;
     float: left;
     padding: .5em;
     margin-left: .8em;
 }
-
-#issue .assignee.dropdown-menu, #issue .assignee ul, #issue .milestone.dropdown-menu, #issue .milestone ul {
+#issue .assignee.dropdown-menu,
+#issue .assignee ul,
+#issue .milestone.dropdown-menu,
+#issue .milestone ul {
     padding: 0;
     margin: 0;
     min-width: 300px;
 }
-
-#issue .issue-bar .assignee, #issue .issue-bar .assignee ul {
+#issue .issue-bar .assignee,
+#issue .issue-bar .assignee ul {
     min-width: 160px;
 }
-
-#issue .issue-bar .assignee .dropdown-menu, #issue .issue-bar .milestone .dropdown-menu, #issue .issue-bar .labels .dropdown-menu {
+#issue .issue-bar .assignee .dropdown-menu,
+#issue .issue-bar .milestone .dropdown-menu,
+#issue .issue-bar .labels .dropdown-menu {
     padding: 0;
     margin: 0;
 }
-
-#issue .assignee li, #issue .milestone li.clear-milestone {
+#issue .assignee li,
+#issue .milestone li.clear-milestone {
     padding: 4px 12px;
     line-height: 30px;
 }
-
 #issue .milestone .milestone-item {
     padding: 8px 12px;
 }
-
 #issue .milestone li.milestone-item {
     border-bottom: 1px solid #CCC;
 }
-
 #issue .milestone li.milestone-item:last-child {
     border-bottom: none;
 }
-
 #issue .milestone .milestone-item p {
     margin-bottom: 0;
 }
-
-#issue .assignee li:hover, #issue .milestone li.clear-milestone:hover, #issue .milestone li.milestone-item:hover {
+#issue .assignee li:hover,
+#issue .milestone li.clear-milestone:hover,
+#issue .milestone li.milestone-item:hover {
     background-color: #e8f0ff;
     cursor: pointer;
 }
-
-#issue .assignee li img, #issue .issue-bar .assignee img {
+#issue .assignee li img,
+#issue .issue-bar .assignee img {
     width: 28px;
     height: 28px;
     margin-right: 12px;
 }
-
 #issue .issue-bar > div {
     padding-bottom: 8px;
     margin-bottom: 40px;
     border-bottom: 1px solid #CCC;
 }
-
 #issue .issue-bar .assignee {
     line-height: 30px;
 }
-
-#issue .issue-bar .assignee .action, #issue .issue-bar .milestone .action, #issue .issue-bar .labels .action {
+#issue .issue-bar .assignee .action,
+#issue .issue-bar .milestone .action,
+#issue .issue-bar .labels .action {
     position: relative;
     margin-top: -6px;
 }
-
 #issue .issue-bar .milestone .completion {
     margin-top: 20px;
     margin-bottom: 12px;
 }
-
 #issue .issue-bar .milestone .completion span {
     display: block;
     height: 12px;
     background-color: #77c64a;
 }
-
 #issue .milestone .nav-tabs a {
     padding: 4px 8px;
     border-top: none;
 }
-
 #milestone {
     margin-left: 24px;
     margin-right: 12px;
 }
-
 #issue .issue-bar .labels .label-item {
     padding: 2px 12px 4px 12px;
     border-radius: 2px;
     text-shadow: 0 0 2px #444;
 }
-
-#issue .label-selected .count, #issue .label-selected a {
+#issue .label-selected .count,
+#issue .label-selected a {
     color: #FAFAFA;
 }
-
 #issue .label-selected a {
     text-shadow: 0 0 2px #444;
 }
-
 #issue .issue-bar .labels .label-white {
     color: #FFF;
 }
-
 #issue .issue-bar .labels .label-black {
     color: #444;
 }
-
 #issue .issue-bar .labels .dropdown-menu ul {
     margin: 0;
     width: 180px;
 }
-
 #issue .issue-bar .labels .dropdown-menu li {
     line-height: 30px;
     padding-left: 12px;
     border-bottom: 1px solid #DDD;
 }
-
 #issue .issue-bar .labels .dropdown-menu li:hover {
     background-color: #e8f0ff;
     cursor: pointer;
 }
-
 #issue .issue-bar .labels .color {
     display: inline-block;
     width: 16px;
@@ -1684,21 +1422,18 @@ html, body {
     vertical-align: text-top;
     margin-right: 6px;
 }
-
 #issue .issue-bar .labels .no-checked .color {
     margin-left: 26px;
 }
-
-#label-color-ipt2, #label-color-change-ipt2 {
+#label-color-ipt2,
+#label-color-change-ipt2 {
     width: 120px;
     display: inline-block;
     vertical-align: top;
 }
-
 #label-color-change-ipt2 {
     margin-top: 1px;
 }
-
 /* wrapper and footer */
 
 #wrapper {
@@ -1708,32 +1443,27 @@ html, body {
     margin: 0 auto -100px;
     padding: 0 0 100px;
 }
-
 #footer {
     background: #fff;
     -webkit-box-shadow: 0 -1px 3px rgba(0, 0, 0, 0.05);
-    box-shadow: 0 -1px 3px rgba(0, 0, 0, 0.05);;
+    box-shadow: 0 -1px 3px rgba(0, 0, 0, 0.05);
+    ;
     height: 100px;
 }
-
 #footer .footer-wrap {
     padding: 20px 15px;
 }
-
 #footer a {
     color: #000;
 }
-
 /* admin dashboard/configuration */
 
 .admin-dl-horizontal > dt {
     width: 220px;
 }
-
 .admin-dl-horizontal > dd {
     margin-left: 240px;
 }
-
 /* release page */
 
 #release-head {
@@ -1742,26 +1472,22 @@ html, body {
     margin-bottom: 0;
     border-bottom: 1px solid #DDD;
 }
-
 #release .release-item .col-md-10 {
     border-left: 1px solid #DDD;
     position: relative;
 }
-
-#release .release-item .commit, #release .release-item .tag {
+#release .release-item .commit,
+#release .release-item .tag {
     display: block;
     margin-top: 12px;
 }
-
 #release .release-item.release-tag .commit {
     margin-top: 6px;
 }
-
 #release .release-item .title {
     line-height: 30px;
     margin-top: 0;
 }
-
 #release .release-item .dot {
     width: 9px;
     height: 9px;
@@ -1774,288 +1500,231 @@ html, body {
     border-radius: 6px;
     border: 1px solid #FFF;
 }
-
 #release .release-item > div {
     padding-top: 20px;
     padding-bottom: 20px;
 }
-
 #release .release-item p.info {
     line-height: 20px;
     color: #666;
     margin-bottom: 18px;
 }
-
 #release .release-item div.desc {
     margin-bottom: 18px;
 }
-
-#release .release-item p.info > *, #release .release-item .download a {
+#release .release-item p.info > *,
+#release .release-item .download a {
     margin-right: 12px;
 }
-
 #release .release-item .info .avatar {
     vertical-align: middle;
 }
-
 #release-new-form {
     margin-top: 24px;
 }
-
 #release-new-form .target-at {
     margin: 0 1em;
 }
-
 #release-new-form .target-text {
     color: #888;
 }
-
 #release-new-target-branch-list {
     padding-top: 0;
     padding-bottom: 0;
     min-width: 200px;
 }
-
 #release-new-target-branch-list ul {
     margin-bottom: 0;
 }
-
 #release-new-target-branch-list li {
     padding: 8px 20px;
 }
-
 #release-new-target-branch-list li a {
     margin-left: 0;
     background-color: transparent;
     padding: 0;
 }
-
 #release-new-target-branch-list li a:hover {
     background-image: none;
 }
-
 #release-new-target-branch-list li:hover {
     background-color: #0093c4;
 }
-
 #release-new-target-branch-list li:hover a {
     color: #FFF;
 }
-
 #release-new-title {
     width: 50%;
 }
-
 #release-new-content-div {
     margin-top: 16px;
     padding-left: 0;
 }
-
 #release-new-content-div .md-help {
     margin-top: 6px;
 }
-
 #release-textarea .form-group {
     display: block;
 }
-
 #release-new-content {
     width: 100%;
     margin: 16px 0;
 }
-
 #release-preview {
     margin: 6px 0;
 }
-
 /*  organization */
 
 #body-nav.org-nav {
     height: 140px;
     padding: 16px 0;
 }
-
 #body-nav.org-nav.org-nav-auto {
     height: auto;
 }
-
 .org-nav > .container {
     padding-left: 0;
     padding-left: 0;
 }
-
 .org-nav .org-logo {
     margin-right: 16px;
     width: 100px;
     height: 100px;
 }
-
 .org-nav .org-small-logo {
     margin-right: 16px;
     width: 50px;
     height: 50px;
 }
-
 .org-nav .org-name {
     margin-top: 0;
 }
-
 .org-nav-auto .org-name {
     font-size: 1.4em;
     line-height: 48px;
 }
-
 #body-nav.org-nav-auto .nav {
     margin-top: 6px;
 }
-
 #body-nav.org-nav-auto .nav a:hover {
     text-decoration: none;
 }
-
 .org-description {
     font-size: 16px;
 }
-
-.org-meta li, .org-meta li a, .org-repo-update, .org-repo-status, .org-team-meta {
+.org-meta li,
+.org-meta li a,
+.org-repo-update,
+.org-repo-status,
+.org-team-meta {
     color: #888;
 }
-
 .org-meta li {
     margin-right: 12px;
 }
-
 .org-meta li a:hover {
     text-decoration: underline;
 }
-
 .org-meta .fa {
     margin-left: 0;
 }
-
 .org-main {
     padding-left: 0;
 }
-
 .org-sidebar {
     margin-top: -100px;
 }
-
 .org-panel .panel-heading {
     font-size: 18px;
 }
-
 .org-repo-status {
     font-family: Verdana, Arial, Helvetica, sans-serif;
 }
-
 .org-repo-item {
     border-bottom: 1px solid #DDD;
     padding-bottom: 18px;
 }
-
 .org-member img {
     width: 60px;
     height: 60px;
     border-radius: 4px;
 }
-
 .org-member {
     display: inline-block;
     padding: 2px;
 }
-
 .org-team-name {
     font-size: 15px;
     margin-bottom: 0;
     color: #444;
 }
-
 .org-team {
     border-bottom: 1px solid #DDD;
     margin-bottom: 12px;
 }
-
 .org-team:last-child {
     border: none;
 }
-
 .org-team a {
     display: block;
 }
-
 .org-team a:hover {
     text-decoration: none;
 }
-
 .org-team a:hover .org-team-name {
     color: #0079bc !important;
 }
-
 #org-members {
     margin-right: 30px;
 }
-
 #org-members .member .avatar img {
     width: 50px;
     height: 50px;
 }
-
 #org-members .member {
     padding-bottom: 20px;
     margin-bottom: 20px;
     border-bottom: 1px solid #DDD;
     height: 70px;
 }
-
 #org-members .member .name {
     padding-top: 4px;
 }
-
 #org-members .member .nick {
     display: block;
     color: #888;
 }
-
 #org-members .member .name a {
     color: #444;
 }
-
 #org-members .member .name strong {
     font-size: 1.2em;
 }
-
-#org-members .status, #org-members .role {
+#org-members .status,
+#org-members .role {
     line-height: 48px;
     text-align: right;
 }
-
 #org-teams .org-team .panel-heading {
     margin-top: 0;
 }
-
 #org-teams .org-team .panel-heading a {
     color: #444;
 }
-
 #org-teams .org-team-members {
     margin-top: 18px;
 }
-
 #org-teams .org-team-members img {
     width: 40px;
     height: 40px;
     margin-right: 12px;
 }
-
 #org-teams .org-team-members a {
     display: inline-block;
 }
-
 #org-teams .org-team .panel-footer {
     height: 60px;
 }
-
 #org-teams .org-team {
     border-bottom: none;
 }
\ No newline at end of file
diff --git a/routers/org/members.go b/routers/org/members.go
new file mode 100644
index 0000000000..c6f49b14bd
--- /dev/null
+++ b/routers/org/members.go
@@ -0,0 +1,16 @@
+// Copyright 2014 The Gogs Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package org
+
+import (
+	"github.com/go-martini/martini"
+
+	"github.com/gogits/gogs/modules/middleware"
+)
+
+func Members(ctx *middleware.Context, params martini.Params) {
+	ctx.Data["Title"] = "Organization " + params["org"] + " Members"
+	ctx.HTML(200, "org/members")
+}
diff --git a/routers/org/org.go b/routers/org/org.go
index ba4adc5b5a..337fe89eb7 100644
--- a/routers/org/org.go
+++ b/routers/org/org.go
@@ -36,7 +36,7 @@ func Home(ctx *middleware.Context, params martini.Params) {
 	ctx.Data["Org"] = org
 
 	ctx.Data["Repos"], err = models.GetRepositories(org.Id,
-		ctx.IsSigned && models.IsOrganizationMember(org.Id, ctx.User.Id))
+		ctx.IsSigned && org.IsOrgMember(ctx.User.Id))
 	if err != nil {
 		ctx.Handle(500, "org.Home(GetRepositories)", err)
 		return
@@ -57,11 +57,6 @@ func Home(ctx *middleware.Context, params martini.Params) {
 	ctx.HTML(200, HOME)
 }
 
-func Members(ctx *middleware.Context, params martini.Params) {
-	ctx.Data["Title"] = "Organization " + params["org"] + " Members"
-	ctx.HTML(200, "org/members")
-}
-
 func New(ctx *middleware.Context) {
 	ctx.Data["Title"] = "Create An Organization"
 	ctx.HTML(200, NEW)
@@ -206,7 +201,7 @@ func DeletePost(ctx *middleware.Context, params martini.Params) {
 	}
 	ctx.Data["Org"] = org
 
-	if !models.IsOrganizationOwner(org.Id, ctx.User.Id) {
+	if !org.IsOrgOwner(ctx.User.Id) {
 		ctx.Error(403)
 		return
 	}
diff --git a/routers/org/teams.go b/routers/org/teams.go
index 9ca5185a94..eef6a63469 100644
--- a/routers/org/teams.go
+++ b/routers/org/teams.go
@@ -1,21 +1,56 @@
+// Copyright 2014 The Gogs Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
 package org
 
 import (
 	"github.com/go-martini/martini"
+
+	"github.com/gogits/gogs/models"
+	"github.com/gogits/gogs/modules/base"
 	"github.com/gogits/gogs/modules/middleware"
 )
 
+const (
+	TEAMS base.TplName = "org/teams"
+)
+
 func Teams(ctx *middleware.Context, params martini.Params) {
-	ctx.Data["Title"] = "Organization "+params["org"]+" Teams"
-	ctx.HTML(200, "org/teams")
+	ctx.Data["Title"] = "Organization " + params["org"] + " Teams"
+
+	org, err := models.GetUserByName(params["org"])
+	if err != nil {
+		if err == models.ErrUserNotExist {
+			ctx.Handle(404, "org.Teams(GetUserByName)", err)
+		} else {
+			ctx.Handle(500, "org.Teams(GetUserByName)", err)
+		}
+		return
+	}
+	ctx.Data["Org"] = org
+
+	if err = org.GetTeams(); err != nil {
+		ctx.Handle(500, "org.Teams(GetTeams)", err)
+		return
+	}
+	for _, t := range org.Teams {
+		if err = t.GetMembers(); err != nil {
+			ctx.Handle(500, "org.Home(GetMembers)", err)
+			return
+		}
+	}
+	ctx.Data["Teams"] = org.Teams
+
+	ctx.HTML(200, TEAMS)
 }
 
 func NewTeam(ctx *middleware.Context, params martini.Params) {
-	ctx.Data["Title"] = "Organization "+params["org"]+" New Team"
+	ctx.Data["Title"] = "Organization " + params["org"] + " New Team"
 	ctx.HTML(200, "org/new_team")
 }
 
-func EditTeam(ctx *middleware.Context, params martini.Params){
-	ctx.Data["Title"] = "Organization "+params["org"]+" Edit Team"
-	ctx.HTML(200,"org/edit_team")
+func EditTeam(ctx *middleware.Context, params martini.Params) {
+	ctx.Data["Title"] = "Organization " + params["org"] + " Edit Team"
+	ctx.HTML(200, "org/edit_team")
 }
diff --git a/routers/repo/repo.go b/routers/repo/repo.go
index 54e5fcfb20..44a2b84f80 100644
--- a/routers/repo/repo.go
+++ b/routers/repo/repo.go
@@ -90,7 +90,7 @@ func CreatePost(ctx *middleware.Context, form auth.CreateRepoForm) {
 		}
 
 		// Check ownership of organization.
-		if !models.IsOrganizationOwner(u.Id, ctx.User.Id) {
+		if !u.IsOrgOwner(ctx.User.Id) {
 			ctx.Error(403)
 			return
 		}
diff --git a/routers/repo/setting.go b/routers/repo/setting.go
index e97eca1239..c3171461aa 100644
--- a/routers/repo/setting.go
+++ b/routers/repo/setting.go
@@ -123,7 +123,7 @@ func SettingPost(ctx *middleware.Context, form auth.RepoSettingForm) {
 		}
 
 		if ctx.Repo.Owner.IsOrganization() &&
-			!models.IsOrganizationOwner(ctx.Repo.Owner.Id, ctx.User.Id) {
+			!ctx.Repo.Owner.IsOrgOwner(ctx.User.Id) {
 			ctx.Error(403)
 			return
 		}
diff --git a/templates/VERSION b/templates/VERSION
index 09c5198045..eccb7a39b7 100644
--- a/templates/VERSION
+++ b/templates/VERSION
@@ -1 +1 @@
-0.4.5.0628 Alpha
\ No newline at end of file
+0.4.5.0629 Alpha
\ No newline at end of file
diff --git a/templates/org/teams.tmpl b/templates/org/teams.tmpl
index 90aab94401..6f00db51c4 100644
--- a/templates/org/teams.tmpl
+++ b/templates/org/teams.tmpl
@@ -4,16 +4,16 @@
     <div class="container clearfix">
         <div id="org-nav-wrapper">
             <ul class="nav nav-pills pull-right">
-                <li><a href="#"><i class="fa fa-users"></i>Members
-                    <span class="label label-default">5</span></a>
+                <li><a href="/org/{{.Org.Name}}/members"><i class="fa fa-users"></i>Members
+                    <span class="label label-default">{{.Org.NumMembers}}</span></a>
                 </li>
-                <li class="active"><a href="#"><i class="fa fa-tags"></i>Teams
-                    <span class="label label-default">2</span></a>
+                <li class="active"><a href="/org/{{.Org.Name}}/teams"><i class="fa fa-tags"></i>Teams
+                    <span class="label label-default">{{.Org.NumTeams}}</span></a>
                 </li>
             </ul>
-            <img class="pull-left org-small-logo" src="https://avatars3.githubusercontent.com/u/6656686?s=140" alt="" width="60"/>
+            <img class="pull-left org-small-logo" src="{{.Org.AvatarLink}}?s=140" alt="" width="60"/>
             <div id="org-nav-info">
-                <h2 class="org-name">Organization Name</h2>
+                <h2 class="org-name">{{.Org.FullName}}</h2>
             </div>
         </div>
     </div>
@@ -23,48 +23,34 @@
         <div id="org-teams">
             <div id="org-teams-action">
                 <div class="col-md-12">
-                    <a href="#"><button class="btn btn-success"><i class="fa fa-plus-square"></i>New Team</button></a>
+                    <a href="/org/{{.Org.Name}}/teams/new"><button class="btn btn-success"><i class="fa fa-plus-square"></i>New Team</button></a>
                     <hr/>
                 </div>
             </div>
+            {{range .Teams}}
             <div class="org-team col-md-6">
                 <div class="panel panel-default">
-                    <h2 class="panel-heading org-team-name"><a href="#"><strong>Team Name</strong></a></h2>
+                    <h2 class="panel-heading org-team-name"><a href="/org/{{$.Org.Name}}/teams/{{.LowerName}}"><strong>{{.Name}}</strong></a></h2>
                     <div class="panel-body">
-                        <p class="org-team-meta">4 members · 10 repositories</p>
+                        <p class="org-team-meta">{{.NumMembers}} members · {{.NumRepos}} repositories</p>
                         <p class="org-team-members">
-                            <a href="#">
-                                <img class="img-thumbnail" src="https://avatars2.githubusercontent.com/u/2946214?s=60" alt=""/>
-                            </a>
-                            <a href="#">
-                                <img class="img-thumbnail" src="https://avatars2.githubusercontent.com/u/2946214?s=60" alt=""/>
+                            {{range .Members}}
+                            <a href="/user/{{.LowerName}}">
+                                <img class="img-thumbnail" src="{{.AvatarLink}}?s=60" alt=""/>
                             </a>
+                            {{end}}
                         </p>
                     </div>
                     <div class="panel-footer">
-                        <button class="pull-right btn btn-default">Join</button>
-                    </div>
-                </div>
-            </div>
-            <div class="org-team col-md-6">
-                <div class="panel panel-default">
-                    <h2 class="panel-heading org-team-name"><a href="#"><strong>Team Name</strong></a></h2>
-                    <div class="panel-body">
-                        <p class="org-team-meta">4 members · 10 repositories</p>
-                        <p class="org-team-members">
-                            <a href="#">
-                                <img class="img-thumbnail" src="https://avatars2.githubusercontent.com/u/2946214?s=60" alt=""/>
-                            </a>
-                            <a href="#">
-                                <img class="img-thumbnail" src="https://avatars2.githubusercontent.com/u/2946214?s=60" alt=""/>
-                            </a>
-                        </p>
-                    </div>
-                    <div class="panel-footer">
-                        <button class="pull-right btn btn-danger">Leave</button>
+                        {{if .IsMember $.SignedUserId}}
+                        <a class="pull-right btn btn-danger" href="/org/{{$.Org.Name}}/teams/{{.LowerName}}?action=leave">Leave</a>
+                        {{else}}
+                        <a class="pull-right btn btn-default" href="/org/{{$.Org.Name}}/teams/{{.LowerName}}?action=join">Join</a>
+                        {{end}}
                     </div>
                 </div>
             </div>
+            {{end}}
         </div>
     </div>
 </div>