Skip to content

Instantly share code, notes, and snippets.

@saraquigley
Last active February 15, 2017 12:41
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save saraquigley/81807cb241cb4bbbaa6b to your computer and use it in GitHub Desktop.
Save saraquigley/81807cb241cb4bbbaa6b to your computer and use it in GitHub Desktop.
Student Census (work in progress)
/*!
* Bootstrap v3.0.0
*
* Copyright 2013 Twitter, Inc
* Licensed under the Apache License v2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Designed and built with all the love in the world by @mdo and @fat.
*/
/*! Sara Quigley modifiecd the bgenerart3eed bootstrap file an renamed it with a Q at the end */
/*! normalize.css v2.1.0 | MIT License | git.io/normalize */
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
nav,
section,
summary {
display: block;
}
audio,
canvas,
video {
display: inline-block;
}
audio:not([controls]) {
display: none;
height: 0;
}
[hidden] {
display: none;
}
html {
font-family: sans-serif;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
}
body {
margin: 0;
}
a:focus {
outline: thin dotted;
}
a:active,
a:hover {
outline: 0;
}
h1 {
margin: 0.67em 0;
font-size: 2em;
}
abbr[title] {
border-bottom: 1px dotted;
}
b,
strong {
font-weight: bold;
}
dfn {
font-style: italic;
}
hr {
height: 0;
-moz-box-sizing: content-box;
box-sizing: content-box;
}
mark {
color: #000;
background: #ff0;
}
code,
kbd,
pre,
samp {
font-family: monospace, serif;
font-size: 1em;
}
pre {
white-space: pre-wrap;
}
q {
quotes: "\201C" "\201D" "\2018" "\2019";
}
small {
font-size: 80%;
}
sub,
sup {
position: relative;
font-size: 75%;
line-height: 0;
vertical-align: baseline;
}
sup {
top: -0.5em;
}
sub {
bottom: -0.25em;
}
img {
border: 0;
}
svg:not(:root) {
overflow: hidden;
}
figure {
margin: 0;
}
fieldset {
padding: 0.35em 0.625em 0.75em;
margin: 0 2px;
border: 1px solid #c0c0c0;
}
legend {
padding: 0;
border: 0;
}
button,
input,
select,
textarea {
margin: 0;
font-family: inherit;
font-size: 100%;
}
button,
input {
line-height: normal;
}
button,
select {
text-transform: none;
}
button,
html input[type="button"],
input[type="reset"],
input[type="submit"] {
cursor: pointer;
-webkit-appearance: button;
}
button[disabled],
html input[disabled] {
cursor: default;
}
input[type="checkbox"],
input[type="radio"] {
padding: 0;
box-sizing: border-box;
}
input[type="search"] {
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
-webkit-appearance: textfield;
}
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
button::-moz-focus-inner,
input::-moz-focus-inner {
padding: 0;
border: 0;
}
textarea {
overflow: auto;
vertical-align: top;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
@media print {
* {
color: #000 !important;
text-shadow: none !important;
background: transparent !important;
box-shadow: none !important;
}
a,
a:visited {
text-decoration: underline;
}
a[href]:after {
content: " (" attr(href) ")";
}
abbr[title]:after {
content: " (" attr(title) ")";
}
.ir a:after,
a[href^="javascript:"]:after,
a[href^="#"]:after {
content: "";
}
pre,
blockquote {
border: 1px solid #999;
page-break-inside: avoid;
}
thead {
display: table-header-group;
}
tr,
img {
page-break-inside: avoid;
}
img {
max-width: 100% !important;
}
@page {
margin: 2cm .5cm;
}
p,
h2,
h3 {
orphans: 3;
widows: 3;
}
h2,
h3 {
page-break-after: avoid;
}
.navbar {
display: none;
}
.table td,
.table th {
background-color: #fff !important;
}
.btn > .caret,
.dropup > .btn > .caret {
border-top-color: #000 !important;
}
.label {
border: 1px solid #000;
}
.table {
border-collapse: collapse !important;
}
.table-bordered th,
.table-bordered td {
border: 1px solid #ddd !important;
}
}
*,
*:before,
*:after {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
html {
font-size: 62.5%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
body {
font-family: 'Lato', "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
line-height: 1.428571429;
color: #333333;
background-color: #ffffff;
}
input,
button,
select,
textarea {
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
input,
select[multiple],
textarea {
background-image: none;
}
a {
color: #428bca;
text-decoration: none;
}
a:hover,
a:focus {
color: #2a6496;
text-decoration: underline;
}
a:focus {
outline: thin dotted #333;
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px;
}
img {
vertical-align: middle;
}
.img-responsive {
display: block;
height: auto;
max-width: 100%;
}
.img-rounded {
border-radius: 6px;
}
.img-thumbnail {
display: inline-block;
height: auto;
max-width: 100%;
padding: 4px;
line-height: 1.428571429;
background-color: #ffffff;
border: 1px solid #dddddd;
border-radius: 4px;
-webkit-transition: all 0.2s ease-in-out;
transition: all 0.2s ease-in-out;
}
.img-circle {
border-radius: 50%;
}
hr {
margin-top: 20px;
margin-bottom: 20px;
border: 0;
border-top: 1px solid #eeeeee;
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0 0 0 0);
border: 0;
}
p {
margin: 0 0 10px;
}
.lead {
margin-bottom: 20px;
font-size: 16.099999999999998px;
font-weight: 200;
line-height: 1.4;
}
@media (min-width: 768px) {
.lead {
font-size: 21px;
}
}
small {
font-size: 85%;
}
cite {
font-style: normal;
}
.text-muted {
color: #999999;
}
.text-primary {
color: #428bca;
}
.text-warning {
color: #c09853;
}
.text-danger {
color: #b94a48;
}
.text-success {
color: #468847;
}
.text-info {
color: #3a87ad;
}
.text-left {
text-align: left;
}
.text-right {
text-align: right;
}
.text-center {
text-align: center;
}
h1,
h2,
h3,
h4,
h5,
h6,
.h1,
.h2,
.h3,
.h4,
.h5,
.h6 {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-weight: 500;
line-height: 1.1;
}
h1 small,
h2 small,
h3 small,
h4 small,
h5 small,
h6 small,
.h1 small,
.h2 small,
.h3 small,
.h4 small,
.h5 small,
.h6 small {
font-weight: normal;
line-height: 1;
color: #999999;
}
h1,
h2,
h3 {
margin-top: 20px;
margin-bottom: 10px;
}
h4,
h5,
h6 {
margin-top: 10px;
margin-bottom: 10px;
}
h1,
.h1 {
font-size: 36px;
}
h2,
.h2 {
font-size: 30px;
}
h3,
.h3 {
font-size: 24px;
}
h4,
.h4 {
font-size: 18px;
}
h5,
.h5 {
font-size: 14px;
}
h6,
.h6 {
font-size: 12px;
}
h1 small,
.h1 small {
font-size: 24px;
}
h2 small,
.h2 small {
font-size: 18px;
}
h3 small,
.h3 small,
h4 small,
.h4 small {
font-size: 14px;
}
.page-header {
padding-bottom: 9px;
margin: 40px 0 20px;
border-bottom: 1px solid #eeeeee;
}
ul,
ol {
margin-top: 0;
margin-bottom: 10px;
}
ul ul,
ol ul,
ul ol,
ol ol {
margin-bottom: 0;
}
.list-unstyled {
padding-left: 0;
list-style: none;
}
.list-inline {
padding-left: 0;
list-style: none;
}
.list-inline > li {
display: inline-block;
padding-right: 5px;
padding-left: 5px;
}
dl {
margin-bottom: 20px;
}
dt,
dd {
line-height: 1.428571429;
}
dt {
font-weight: bold;
}
dd {
margin-left: 0;
}
@media (min-width: 768px) {
.dl-horizontal dt {
float: left;
width: 160px;
overflow: hidden;
clear: left;
text-align: right;
text-overflow: ellipsis;
white-space: nowrap;
}
.dl-horizontal dd {
margin-left: 180px;
}
.dl-horizontal dd:before,
.dl-horizontal dd:after {
display: table;
content: " ";
}
.dl-horizontal dd:after {
clear: both;
}
.dl-horizontal dd:before,
.dl-horizontal dd:after {
display: table;
content: " ";
}
.dl-horizontal dd:after {
clear: both;
}
}
abbr[title],
abbr[data-original-title] {
cursor: help;
border-bottom: 1px dotted #999999;
}
abbr.initialism {
font-size: 90%;
text-transform: uppercase;
}
blockquote {
padding: 10px 20px;
margin: 0 0 20px;
border-left: 5px solid #eeeeee;
}
blockquote p {
font-size: 17.5px;
font-weight: 300;
line-height: 1.25;
}
blockquote p:last-child {
margin-bottom: 0;
}
blockquote small {
display: block;
line-height: 1.428571429;
color: #999999;
}
blockquote small:before {
content: '\2014 \00A0';
}
blockquote.pull-right {
padding-right: 15px;
padding-left: 0;
border-right: 5px solid #eeeeee;
border-left: 0;
}
blockquote.pull-right p,
blockquote.pull-right small {
text-align: right;
}
blockquote.pull-right small:before {
content: '';
}
blockquote.pull-right small:after {
content: '\00A0 \2014';
}
q:before,
q:after,
blockquote:before,
blockquote:after {
content: "";
}
address {
display: block;
margin-bottom: 20px;
font-style: normal;
line-height: 1.428571429;
}
code,
pre {
font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
}
code {
padding: 2px 4px;
font-size: 90%;
color: #c7254e;
white-space: nowrap;
background-color: #f9f2f4;
border-radius: 4px;
}
pre {
display: block;
padding: 9.5px;
margin: 0 0 10px;
font-size: 13px;
line-height: 1.428571429;
color: #333333;
word-break: break-all;
word-wrap: break-word;
background-color: #f5f5f5;
border: 1px solid #cccccc;
border-radius: 4px;
}
pre.prettyprint {
margin-bottom: 20px;
}
pre code {
padding: 0;
font-size: inherit;
color: inherit;
white-space: pre-wrap;
background-color: transparent;
border: 0;
}
.pre-scrollable {
max-height: 340px;
overflow-y: scroll;
}
.container {
padding-right: 15px;
padding-left: 15px;
margin-right: auto;
margin-left: auto;
padding-bottom: 6px;
}
.container:before,
.container:after {
display: table;
content: " ";
}
.container:after {
clear: both;
}
.container:before,
.container:after {
display: table;
content: " ";
}
.container:after {
clear: both;
}
.row {
margin-right: -5px;
margin-left: -5px;
}
.row:before,
.row:after {
display: table;
content: " ";
}
.row:after {
clear: both;
}
.row:before,
.row:after {
display: table;
content: " ";
}
.row:after {
clear: both;
}
.col-xs-1,
.col-xs-2,
.col-xs-3,
.col-xs-4,
.col-xs-5,
.col-xs-6,
.col-xs-7,
.col-xs-8,
.col-xs-9,
.col-xs-10,
.col-xs-11,
.col-xs-12,
.col-sm-1,
.col-sm-2,
.col-sm-3,
.col-sm-4,
.col-sm-5,
.col-sm-6,
.col-sm-7,
.col-sm-8,
.col-sm-9,
.col-sm-10,
.col-sm-11,
.col-sm-12,
.col-md-1,
.col-md-2,
.col-md-3,
.col-md-4,
.col-md-5,
.col-md-6,
.col-md-7,
.col-md-8,
.col-md-9,
.col-md-10,
.col-md-11,
.col-md-12,
.col-lg-1,
.col-lg-2,
.col-lg-3,
.col-lg-4,
.col-lg-5,
.col-lg-6,
.col-lg-7,
.col-lg-8,
.col-lg-9,
.col-lg-10,
.col-lg-11,
.col-lg-12 {
position: relative;
min-height: 1px;
padding-right: 15px;
padding-left: 15px;
}
.col-xs-1,
.col-xs-2,
.col-xs-3,
.col-xs-4,
.col-xs-5,
.col-xs-6,
.col-xs-7,
.col-xs-8,
.col-xs-9,
.col-xs-10,
.col-xs-11 {
float: left;
}
.col-xs-1 {
width: 8.333333333333332%;
}
.col-xs-2 {
width: 16.666666666666664%;
}
.col-xs-3 {
width: 25%;
}
.col-xs-4 {
width: 33.33333333333333%;
}
.col-xs-5 {
width: 41.66666666666667%;
}
.col-xs-6 {
width: 50%;
}
.col-xs-7 {
width: 58.333333333333336%;
}
.col-xs-8 {
width: 66.66666666666666%;
}
.col-xs-9 {
width: 75%;
}
.col-xs-10 {
width: 83.33333333333334%;
}
.col-xs-11 {
width: 91.66666666666666%;
}
.col-xs-12 {
width: 100%;
}
@media (min-width: 768px) {
.container {
max-width: 750px;
}
.col-sm-1,
.col-sm-2,
.col-sm-3,
.col-sm-4,
.col-sm-5,
.col-sm-6,
.col-sm-7,
.col-sm-8,
.col-sm-9,
.col-sm-10,
.col-sm-11 {
float: left;
}
.col-sm-1 {
width: 8.333333333333332%;
}
.col-sm-2 {
width: 16.666666666666664%;
}
.col-sm-3 {
width: 25%;
}
.col-sm-4 {
width: 33.33333333333333%;
}
.col-sm-5 {
width: 41.66666666666667%;
}
.col-sm-6 {
width: 50%;
}
.col-sm-7 {
width: 58.333333333333336%;
}
.col-sm-8 {
width: 66.66666666666666%;
}
.col-sm-9 {
width: 75%;
}
.col-sm-10 {
width: 83.33333333333334%;
}
.col-sm-11 {
width: 91.66666666666666%;
}
.col-sm-12 {
width: 100%;
}
.col-sm-push-1 {
left: 8.333333333333332%;
}
.col-sm-push-2 {
left: 16.666666666666664%;
}
.col-sm-push-3 {
left: 25%;
}
.col-sm-push-4 {
left: 33.33333333333333%;
}
.col-sm-push-5 {
left: 41.66666666666667%;
}
.col-sm-push-6 {
left: 50%;
}
.col-sm-push-7 {
left: 58.333333333333336%;
}
.col-sm-push-8 {
left: 66.66666666666666%;
}
.col-sm-push-9 {
left: 75%;
}
.col-sm-push-10 {
left: 83.33333333333334%;
}
.col-sm-push-11 {
left: 91.66666666666666%;
}
.col-sm-pull-1 {
right: 8.333333333333332%;
}
.col-sm-pull-2 {
right: 16.666666666666664%;
}
.col-sm-pull-3 {
right: 25%;
}
.col-sm-pull-4 {
right: 33.33333333333333%;
}
.col-sm-pull-5 {
right: 41.66666666666667%;
}
.col-sm-pull-6 {
right: 50%;
}
.col-sm-pull-7 {
right: 58.333333333333336%;
}
.col-sm-pull-8 {
right: 66.66666666666666%;
}
.col-sm-pull-9 {
right: 75%;
}
.col-sm-pull-10 {
right: 83.33333333333334%;
}
.col-sm-pull-11 {
right: 91.66666666666666%;
}
.col-sm-offset-1 {
margin-left: 8.333333333333332%;
}
.col-sm-offset-2 {
margin-left: 16.666666666666664%;
}
.col-sm-offset-3 {
margin-left: 25%;
}
.col-sm-offset-4 {
margin-left: 33.33333333333333%;
}
.col-sm-offset-5 {
margin-left: 41.66666666666667%;
}
.col-sm-offset-6 {
margin-left: 50%;
}
.col-sm-offset-7 {
margin-left: 58.333333333333336%;
}
.col-sm-offset-8 {
margin-left: 66.66666666666666%;
}
.col-sm-offset-9 {
margin-left: 75%;
}
.col-sm-offset-10 {
margin-left: 83.33333333333334%;
}
.col-sm-offset-11 {
margin-left: 91.66666666666666%;
}
}
@media (min-width: 992px) {
.container {
max-width: 970px;
}
.col-md-1,
.col-md-2,
.col-md-3,
.col-md-4,
.col-md-5,
.col-md-6,
.col-md-7,
.col-md-8,
.col-md-9,
.col-md-10,
.col-md-11 {
float: left;
}
.col-md-1 {
width: 8.333333333333332%;
}
.col-md-2 {
width: 16.666666666666664%;
}
.col-md-3 {
width: 25%;
}
.col-md-4 {
width: 33.33333333333333%;
}
.col-md-5 {
width: 41.66666666666667%;
}
.col-md-6 {
width: 50%;
}
.col-md-7 {
width: 58.333333333333336%;
}
.col-md-8 {
width: 66.66666666666666%;
}
.col-md-9 {
width: 75%;
}
.col-md-10 {
width: 83.33333333333334%;
}
.col-md-11 {
width: 91.66666666666666%;
}
.col-md-12 {
width: 100%;
}
.col-md-push-0 {
left: auto;
}
.col-md-push-1 {
left: 8.333333333333332%;
}
.col-md-push-2 {
left: 16.666666666666664%;
}
.col-md-push-3 {
left: 25%;
}
.col-md-push-4 {
left: 33.33333333333333%;
}
.col-md-push-5 {
left: 41.66666666666667%;
}
.col-md-push-6 {
left: 50%;
}
.col-md-push-7 {
left: 58.333333333333336%;
}
.col-md-push-8 {
left: 66.66666666666666%;
}
.col-md-push-9 {
left: 75%;
}
.col-md-push-10 {
left: 83.33333333333334%;
}
.col-md-push-11 {
left: 91.66666666666666%;
}
.col-md-pull-0 {
right: auto;
}
.col-md-pull-1 {
right: 8.333333333333332%;
}
.col-md-pull-2 {
right: 16.666666666666664%;
}
.col-md-pull-3 {
right: 25%;
}
.col-md-pull-4 {
right: 33.33333333333333%;
}
.col-md-pull-5 {
right: 41.66666666666667%;
}
.col-md-pull-6 {
right: 50%;
}
.col-md-pull-7 {
right: 58.333333333333336%;
}
.col-md-pull-8 {
right: 66.66666666666666%;
}
.col-md-pull-9 {
right: 75%;
}
.col-md-pull-10 {
right: 83.33333333333334%;
}
.col-md-pull-11 {
right: 91.66666666666666%;
}
.col-md-offset-0 {
margin-left: 0;
}
.col-md-offset-1 {
margin-left: 8.333333333333332%;
}
.col-md-offset-2 {
margin-left: 16.666666666666664%;
}
.col-md-offset-3 {
margin-left: 25%;
}
.col-md-offset-4 {
margin-left: 33.33333333333333%;
}
.col-md-offset-5 {
margin-left: 41.66666666666667%;
}
.col-md-offset-6 {
margin-left: 50%;
}
.col-md-offset-7 {
margin-left: 58.333333333333336%;
}
.col-md-offset-8 {
margin-left: 66.66666666666666%;
}
.col-md-offset-9 {
margin-left: 75%;
}
.col-md-offset-10 {
margin-left: 83.33333333333334%;
}
.col-md-offset-11 {
margin-left: 91.66666666666666%;
}
}
@media (min-width: 1200px) {
.container {
max-width: 1200px;
}
.col-lg-1,
.col-lg-2,
.col-lg-3,
.col-lg-4,
.col-lg-5,
.col-lg-6,
.col-lg-7,
.col-lg-8,
.col-lg-9,
.col-lg-10,
.col-lg-11 {
float: left;
}
.col-lg-1 {
width: 8.333333333333332%;
}
.col-lg-2 {
width: 16.666666666666664%;
}
.col-lg-3 {
width: 25%;
}
.col-lg-4 {
width: 33.33333333333333%;
}
.col-lg-5 {
width: 41.66666666666667%;
}
.col-lg-6 {
width: 50%;
}
.col-lg-7 {
width: 58.333333333333336%;
}
.col-lg-8 {
width: 66.66666666666666%;
}
.col-lg-9 {
width: 75%;
}
.col-lg-10 {
width: 83.33333333333334%;
}
.col-lg-11 {
width: 91.66666666666666%;
}
.col-lg-12 {
width: 100%;
}
.col-lg-push-0 {
left: auto;
}
.col-lg-push-1 {
left: 8.333333333333332%;
}
.col-lg-push-2 {
left: 16.666666666666664%;
}
.col-lg-push-3 {
left: 25%;
}
.col-lg-push-4 {
left: 33.33333333333333%;
}
.col-lg-push-5 {
left: 41.66666666666667%;
}
.col-lg-push-6 {
left: 50%;
}
.col-lg-push-7 {
left: 58.333333333333336%;
}
.col-lg-push-8 {
left: 66.66666666666666%;
}
.col-lg-push-9 {
left: 75%;
}
.col-lg-push-10 {
left: 83.33333333333334%;
}
.col-lg-push-11 {
left: 91.66666666666666%;
}
.col-lg-pull-0 {
right: auto;
}
.col-lg-pull-1 {
right: 8.333333333333332%;
}
.col-lg-pull-2 {
right: 16.666666666666664%;
}
.col-lg-pull-3 {
right: 25%;
}
.col-lg-pull-4 {
right: 33.33333333333333%;
}
.col-lg-pull-5 {
right: 41.66666666666667%;
}
.col-lg-pull-6 {
right: 50%;
}
.col-lg-pull-7 {
right: 58.333333333333336%;
}
.col-lg-pull-8 {
right: 66.66666666666666%;
}
.col-lg-pull-9 {
right: 75%;
}
.col-lg-pull-10 {
right: 83.33333333333334%;
}
.col-lg-pull-11 {
right: 91.66666666666666%;
}
.col-lg-offset-0 {
margin-left: 0;
}
.col-lg-offset-1 {
margin-left: 8.333333333333332%;
}
.col-lg-offset-2 {
margin-left: 16.666666666666664%;
}
.col-lg-offset-3 {
margin-left: 25%;
}
.col-lg-offset-4 {
margin-left: 33.33333333333333%;
}
.col-lg-offset-5 {
margin-left: 41.66666666666667%;
}
.col-lg-offset-6 {
margin-left: 50%;
}
.col-lg-offset-7 {
margin-left: 58.333333333333336%;
}
.col-lg-offset-8 {
margin-left: 66.66666666666666%;
}
.col-lg-offset-9 {
margin-left: 75%;
}
.col-lg-offset-10 {
margin-left: 83.33333333333334%;
}
.col-lg-offset-11 {
margin-left: 91.66666666666666%;
}
}
table {
max-width: 100%;
background-color: transparent;
}
th {
text-align: left;
}
.table {
width: 100%;
margin-bottom: 20px;
}
.table thead > tr > th,
.table tbody > tr > th,
.table tfoot > tr > th,
.table thead > tr > td,
.table tbody > tr > td,
.table tfoot > tr > td {
padding: 8px;
line-height: 1.428571429;
vertical-align: top;
border-top: 1px solid #dddddd;
}
.table thead > tr > th {
vertical-align: bottom;
border-bottom: 2px solid #dddddd;
}
.table caption + thead tr:first-child th,
.table colgroup + thead tr:first-child th,
.table thead:first-child tr:first-child th,
.table caption + thead tr:first-child td,
.table colgroup + thead tr:first-child td,
.table thead:first-child tr:first-child td {
border-top: 0;
}
.table tbody + tbody {
border-top: 3px solid #dddddd;
}
.table .table {
background-color: #ffffff;
}
.table-condensed thead > tr > th,
.table-condensed tbody > tr > th,
.table-condensed tfoot > tr > th,
.table-condensed thead > tr > td,
.table-condensed tbody > tr > td,
.table-condensed tfoot > tr > td {
padding: 5px;
}
.table-bordered {
border: 1px solid #dddddd;
}
.table-bordered > thead > tr > th,
.table-bordered > tbody > tr > th,
.table-bordered > tfoot > tr > th,
.table-bordered > thead > tr > td,
.table-bordered > tbody > tr > td,
.table-bordered > tfoot > tr > td {
border: 1px solid #dddddd;
}
.table-bordered > thead > tr > th,
.table-bordered > thead > tr > td {
border-bottom-width: 2px;
}
.table-striped > tbody > tr:nth-child(odd) > td,
.table-striped > tbody > tr:nth-child(odd) > th {
background-color: #f9f9f9;
}
.table-hover > tbody > tr:hover > td,
.table-hover > tbody > tr:hover > th {
background-color: #f5f5f5;
}
table col[class*="col-"] {
display: table-column;
float: none;
}
table td[class*="col-"],
table th[class*="col-"] {
display: table-cell;
float: none;
}
.table > thead > tr > td.active,
.table > tbody > tr > td.active,
.table > tfoot > tr > td.active,
.table > thead > tr > th.active,
.table > tbody > tr > th.active,
.table > tfoot > tr > th.active,
.table > thead > tr.active > td,
.table > tbody > tr.active > td,
.table > tfoot > tr.active > td,
.table > thead > tr.active > th,
.table > tbody > tr.active > th,
.table > tfoot > tr.active > th {
background-color: #f5f5f5;
}
.table > thead > tr > td.success,
.table > tbody > tr > td.success,
.table > tfoot > tr > td.success,
.table > thead > tr > th.success,
.table > tbody > tr > th.success,
.table > tfoot > tr > th.success,
.table > thead > tr.success > td,
.table > tbody > tr.success > td,
.table > tfoot > tr.success > td,
.table > thead > tr.success > th,
.table > tbody > tr.success > th,
.table > tfoot > tr.success > th {
background-color: #dff0d8;
border-color: #d6e9c6;
}
.table-hover > tbody > tr > td.success:hover,
.table-hover > tbody > tr > th.success:hover,
.table-hover > tbody > tr.success:hover > td {
background-color: #d0e9c6;
border-color: #c9e2b3;
}
.table > thead > tr > td.danger,
.table > tbody > tr > td.danger,
.table > tfoot > tr > td.danger,
.table > thead > tr > th.danger,
.table > tbody > tr > th.danger,
.table > tfoot > tr > th.danger,
.table > thead > tr.danger > td,
.table > tbody > tr.danger > td,
.table > tfoot > tr.danger > td,
.table > thead > tr.danger > th,
.table > tbody > tr.danger > th,
.table > tfoot > tr.danger > th {
background-color: #f2dede;
border-color: #eed3d7;
}
.table-hover > tbody > tr > td.danger:hover,
.table-hover > tbody > tr > th.danger:hover,
.table-hover > tbody > tr.danger:hover > td {
background-color: #ebcccc;
border-color: #e6c1c7;
}
.table > thead > tr > td.warning,
.table > tbody > tr > td.warning,
.table > tfoot > tr > td.warning,
.table > thead > tr > th.warning,
.table > tbody > tr > th.warning,
.table > tfoot > tr > th.warning,
.table > thead > tr.warning > td,
.table > tbody > tr.warning > td,
.table > tfoot > tr.warning > td,
.table > thead > tr.warning > th,
.table > tbody > tr.warning > th,
.table > tfoot > tr.warning > th {
background-color: #fcf8e3;
border-color: #fbeed5;
}
.table-hover > tbody > tr > td.warning:hover,
.table-hover > tbody > tr > th.warning:hover,
.table-hover > tbody > tr.warning:hover > td {
background-color: #faf2cc;
border-color: #f8e5be;
}
@media (max-width: 768px) {
.table-responsive {
width: 100%;
margin-bottom: 15px;
overflow-x: scroll;
overflow-y: hidden;
border: 1px solid #dddddd;
}
.table-responsive > .table {
margin-bottom: 0;
background-color: #fff;
}
.table-responsive > .table > thead > tr > th,
.table-responsive > .table > tbody > tr > th,
.table-responsive > .table > tfoot > tr > th,
.table-responsive > .table > thead > tr > td,
.table-responsive > .table > tbody > tr > td,
.table-responsive > .table > tfoot > tr > td {
white-space: nowrap;
}
.table-responsive > .table-bordered {
border: 0;
}
.table-responsive > .table-bordered > thead > tr > th:first-child,
.table-responsive > .table-bordered > tbody > tr > th:first-child,
.table-responsive > .table-bordered > tfoot > tr > th:first-child,
.table-responsive > .table-bordered > thead > tr > td:first-child,
.table-responsive > .table-bordered > tbody > tr > td:first-child,
.table-responsive > .table-bordered > tfoot > tr > td:first-child {
border-left: 0;
}
.table-responsive > .table-bordered > thead > tr > th:last-child,
.table-responsive > .table-bordered > tbody > tr > th:last-child,
.table-responsive > .table-bordered > tfoot > tr > th:last-child,
.table-responsive > .table-bordered > thead > tr > td:last-child,
.table-responsive > .table-bordered > tbody > tr > td:last-child,
.table-responsive > .table-bordered > tfoot > tr > td:last-child {
border-right: 0;
}
.table-responsive > .table-bordered > thead > tr:last-child > th,
.table-responsive > .table-bordered > tbody > tr:last-child > th,
.table-responsive > .table-bordered > tfoot > tr:last-child > th,
.table-responsive > .table-bordered > thead > tr:last-child > td,
.table-responsive > .table-bordered > tbody > tr:last-child > td,
.table-responsive > .table-bordered > tfoot > tr:last-child > td {
border-bottom: 0;
}
}
fieldset {
padding: 0;
margin: 0;
border: 0;
}
legend {
display: block;
width: 100%;
padding: 0;
margin-bottom: 20px;
font-size: 21px;
line-height: inherit;
color: #333333;
border: 0;
border-bottom: 1px solid #e5e5e5;
}
label {
display: inline-block;
margin-bottom: 5px;
font-weight: bold;
}
input[type="search"] {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
input[type="radio"],
input[type="checkbox"] {
margin: 4px 0 0;
margin-top: 1px \9;
/* IE8-9 */
line-height: normal;
}
input[type="file"] {
display: block;
}
select[multiple],
select[size] {
height: auto;
}
select optgroup {
font-family: inherit;
font-size: inherit;
font-style: inherit;
}
input[type="file"]:focus,
input[type="radio"]:focus,
input[type="checkbox"]:focus {
outline: thin dotted #333;
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px;
}
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button {
height: auto;
}
.form-control:-moz-placeholder {
color: #999999;
}
.form-control::-moz-placeholder {
color: #999999;
}
.form-control:-ms-input-placeholder {
color: #999999;
}
.form-control::-webkit-input-placeholder {
color: #999999;
}
.form-control {
display: block;
width: 100%;
height: 34px;
padding: 6px 12px;
font-size: 14px;
line-height: 1.428571429;
color: #555555;
vertical-align: middle;
background-color: #ffffff;
border: 1px solid #cccccc;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
}
.form-control:focus {
border-color: #66afe9;
outline: 0;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
}
.form-control[disabled],
.form-control[readonly],
fieldset[disabled] .form-control {
cursor: not-allowed;
background-color: #eeeeee;
}
textarea.form-control {
height: auto;
}
.form-group {
margin-bottom: 15px;
}
.radio,
.checkbox {
display: block;
min-height: 20px;
padding-left: 20px;
margin-top: 10px;
margin-bottom: 10px;
vertical-align: middle;
}
.radio label,
.checkbox label {
display: inline;
margin-bottom: 0;
font-weight: normal;
cursor: pointer;
}
.radio input[type="radio"],
.radio-inline input[type="radio"],
.checkbox input[type="checkbox"],
.checkbox-inline input[type="checkbox"] {
float: left;
margin-left: -20px;
}
.radio + .radio,
.checkbox + .checkbox {
margin-top: -5px;
}
.radio-inline,
.checkbox-inline {
display: inline-block;
padding-left: 20px;
margin-bottom: 0;
font-weight: normal;
vertical-align: middle;
cursor: pointer;
}
.radio-inline + .radio-inline,
.checkbox-inline + .checkbox-inline {
margin-top: 0;
margin-left: 10px;
}
input[type="radio"][disabled],
input[type="checkbox"][disabled],
.radio[disabled],
.radio-inline[disabled],
.checkbox[disabled],
.checkbox-inline[disabled],
fieldset[disabled] input[type="radio"],
fieldset[disabled] input[type="checkbox"],
fieldset[disabled] .radio,
fieldset[disabled] .radio-inline,
fieldset[disabled] .checkbox,
fieldset[disabled] .checkbox-inline {
cursor: not-allowed;
}
.input-sm {
height: 30px;
padding: 5px 10px;
font-size: 12px;
line-height: 1.5;
border-radius: 3px;
}
select.input-sm {
height: 30px;
line-height: 30px;
}
textarea.input-sm {
height: auto;
}
.input-lg {
height: 45px;
padding: 10px 16px;
font-size: 18px;
line-height: 1.33;
border-radius: 6px;
}
select.input-lg {
height: 45px;
line-height: 45px;
}
textarea.input-lg {
height: auto;
}
.has-warning .help-block,
.has-warning .control-label {
color: #c09853;
}
.has-warning .form-control {
border-color: #c09853;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}
.has-warning .form-control:focus {
border-color: #a47e3c;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
}
.has-warning .input-group-addon {
color: #c09853;
background-color: #fcf8e3;
border-color: #c09853;
}
.has-error .help-block,
.has-error .control-label {
color: #b94a48;
}
.has-error .form-control {
border-color: #b94a48;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}
.has-error .form-control:focus {
border-color: #953b39;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
}
.has-error .input-group-addon {
color: #b94a48;
background-color: #f2dede;
border-color: #b94a48;
}
.has-success .help-block,
.has-success .control-label {
color: #468847;
}
.has-success .form-control {
border-color: #468847;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}
.has-success .form-control:focus {
border-color: #356635;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
}
.has-success .input-group-addon {
color: #468847;
background-color: #dff0d8;
border-color: #468847;
}
.form-control-static {
padding-top: 7px;
margin-bottom: 0;
}
.help-block {
display: block;
margin-top: 5px;
margin-bottom: 10px;
color: #737373;
}
@media (min-width: 768px) {
.form-inline .form-group {
display: inline-block;
margin-bottom: 0;
vertical-align: middle;
}
.form-inline .form-control {
display: inline-block;
}
.form-inline .radio,
.form-inline .checkbox {
display: inline-block;
padding-left: 0;
margin-top: 0;
margin-bottom: 0;
}
.form-inline .radio input[type="radio"],
.form-inline .checkbox input[type="checkbox"] {
float: none;
margin-left: 0;
}
}
.form-horizontal .control-label,
.form-horizontal .radio,
.form-horizontal .checkbox,
.form-horizontal .radio-inline,
.form-horizontal .checkbox-inline {
padding-top: 7px;
margin-top: 0;
margin-bottom: 0;
}
.form-horizontal .form-group {
margin-right: -15px;
margin-left: -15px;
}
.form-horizontal .form-group:before,
.form-horizontal .form-group:after {
display: table;
content: " ";
}
.form-horizontal .form-group:after {
clear: both;
}
.form-horizontal .form-group:before,
.form-horizontal .form-group:after {
display: table;
content: " ";
}
.form-horizontal .form-group:after {
clear: both;
}
@media (min-width: 768px) {
.form-horizontal .control-label {
text-align: right;
}
}
.btn {
display: inline-block;
padding: 6px 12px;
margin-bottom: 0;
font-size: 14px;
font-weight: normal;
line-height: 1.428571429;
text-align: center;
white-space: nowrap;
vertical-align: middle;
cursor: pointer;
border: 1px solid transparent;
border-radius: 4px;
margin-top: 2px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;
}
.btn:focus {
outline: thin dotted #333;
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px;
}
.btn:hover,
.btn:focus {
color: #333333;
text-decoration: none;
}
.btn:active,
.btn.active {
background-image: none;
outline: 0;
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
}
.btn.disabled,
.btn[disabled],
fieldset[disabled] .btn {
pointer-events: none;
cursor: not-allowed;
opacity: 0.65;
filter: alpha(opacity=65);
-webkit-box-shadow: none;
box-shadow: none;
}
.btn-default {
color: #969696;
background-color: #ffffff;
border-color: #cccccc;
}
.btn-default:active,
.btn-default.active,
.open .dropdown-toggle.btn-default
.btn-default:focus {
color: #ffffff;
background-color: #428bca;
border-color: #357ebd;
}
.btn-default:hover {
background-color: #ddd;
border-color: #cccccc;
color: #969696;
}
.btn-default:active,
.btn-default.active,
.open .dropdown-toggle.btn-default {
background-image: none;
}
.btn-default.disabled,
.btn-default[disabled],
fieldset[disabled] .btn-default,
.btn-default.disabled:hover,
.btn-default[disabled]:hover,
fieldset[disabled] .btn-default:hover,
.btn-default.disabled:focus,
.btn-default[disabled]:focus,
fieldset[disabled] .btn-default:focus,
.btn-default.disabled:active,
.btn-default[disabled]:active,
fieldset[disabled] .btn-default:active,
.btn-default.disabled.active,
.btn-default[disabled].active,
fieldset[disabled] .btn-default.active {
background-color: #ffffff;
border-color: #cccccc;
}
.btn-primary {
/* color: #ffffff;
background-color: #428bca;
border-color: #357ebd;*/
color: #ffffff;
background-color: #428bca;
border-color: #357ebd;
}
.btn-primary:active,
.btn-primary.active,
.open .dropdown-toggle.btn-primary {
color: #ffffff;
background-color: #428bca;
border-color: #357ebd;
}
.btn-primary:hover,
.btn-primary:focus {
/* color: #ffffff;
background-color: #3276b1;
border-color: #285e8e;*/
color:#fff;
text-shadow:0 -1px 0 rgba(0,0,0,0.25);
background-color:#006dcc;
/**background-color:#04c;*/
background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));
background-image:-webkit-linear-gradient(top,#08c,#04c);
background-image:-o-linear-gradient(top,#08c,#04c);
background-image:linear-gradient(to bottom,#08c,#04c);
background-image:-moz-linear-gradient(top,#08c,#04c);
background-repeat:repeat-x;
border-color:#04c #04c #002a80;
border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);
/*.btn{border-color:#c5c5c5;
border-color:rgba(0,0,0,0.15) rgba(0,0,0,0.15) rgba(0,0,0,0.25)}
.btn-primary{color:#fff;
text-shadow:0 -1px 0 rgba(0,0,0,0.25);
background-color:#006dcc;
*background-color:#04c;
background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));
background-image:-webkit-linear-gradient(top,#08c,#04c);
background-image:-o-linear-gradient(top,#08c,#04c);
background-image:linear-gradient(to bottom,#08c,#04c);
background-image:-moz-linear-gradient(top,#08c,#04c);
background-repeat:repeat-x;
border-color:#04c #04c #002a80;
border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*/
}
.btn-primary:active,
.btn-primary.active,
.open .dropdown-toggle.btn-primary {
background-image: none;
}
.btn-primary.disabled,
.btn-primary[disabled],
fieldset[disabled] .btn-primary,
.btn-primary.disabled:hover,
.btn-primary[disabled]:hover,
fieldset[disabled] .btn-primary:hover,
.btn-primary.disabled:focus,
.btn-primary[disabled]:focus,
fieldset[disabled] .btn-primary:focus,
.btn-primary.disabled:active,
.btn-primary[disabled]:active,
fieldset[disabled] .btn-primary:active,
.btn-primary.disabled.active,
.btn-primary[disabled].active,
fieldset[disabled] .btn-primary.active {
background-color: #428bca;
border-color: #357ebd;
}
.btn-warning {
color: #ffffff;
background-color: #f0ad4e;
border-color: #eea236;
}
.btn-warning:hover,
.btn-warning:focus,
.btn-warning:active,
.btn-warning.active,
.open .dropdown-toggle.btn-warning {
color: #ffffff;
background-color: #ed9c28;
border-color: #d58512;
}
.btn-warning:active,
.btn-warning.active,
.open .dropdown-toggle.btn-warning {
background-image: none;
}
.btn-warning.disabled,
.btn-warning[disabled],
fieldset[disabled] .btn-warning,
.btn-warning.disabled:hover,
.btn-warning[disabled]:hover,
fieldset[disabled] .btn-warning:hover,
.btn-warning.disabled:focus,
.btn-warning[disabled]:focus,
fieldset[disabled] .btn-warning:focus,
.btn-warning.disabled:active,
.btn-warning[disabled]:active,
fieldset[disabled] .btn-warning:active,
.btn-warning.disabled.active,
.btn-warning[disabled].active,
fieldset[disabled] .btn-warning.active {
background-color: #f0ad4e;
border-color: #eea236;
}
.btn-danger {
color: #ffffff;
background-color: #d9534f;
border-color: #d43f3a;
}
.btn-danger:hover,
.btn-danger:focus,
.btn-danger:active,
.btn-danger.active,
.open .dropdown-toggle.btn-danger {
color: #ffffff;
background-color: #d2322d;
border-color: #ac2925;
}
.btn-danger:active,
.btn-danger.active,
.open .dropdown-toggle.btn-danger {
background-image: none;
}
.btn-danger.disabled,
.btn-danger[disabled],
fieldset[disabled] .btn-danger,
.btn-danger.disabled:hover,
.btn-danger[disabled]:hover,
fieldset[disabled] .btn-danger:hover,
.btn-danger.disabled:focus,
.btn-danger[disabled]:focus,
fieldset[disabled] .btn-danger:focus,
.btn-danger.disabled:active,
.btn-danger[disabled]:active,
fieldset[disabled] .btn-danger:active,
.btn-danger.disabled.active,
.btn-danger[disabled].active,
fieldset[disabled] .btn-danger.active {
background-color: #d9534f;
border-color: #d43f3a;
}
.btn-success {
color: #ffffff;
background-color: #5cb85c;
border-color: #4cae4c;
}
.btn-success:hover,
.btn-success:focus,
.btn-success:active,
.btn-success.active,
.open .dropdown-toggle.btn-success {
color: #ffffff;
background-color: #47a447;
border-color: #398439;
}
.btn-success:active,
.btn-success.active,
.open .dropdown-toggle.btn-success {
background-image: none;
}
.btn-success.disabled,
.btn-success[disabled],
fieldset[disabled] .btn-success,
.btn-success.disabled:hover,
.btn-success[disabled]:hover,
fieldset[disabled] .btn-success:hover,
.btn-success.disabled:focus,
.btn-success[disabled]:focus,
fieldset[disabled] .btn-success:focus,
.btn-success.disabled:active,
.btn-success[disabled]:active,
fieldset[disabled] .btn-success:active,
.btn-success.disabled.active,
.btn-success[disabled].active,
fieldset[disabled] .btn-success.active {
background-color: #5cb85c;
border-color: #4cae4c;
}
.btn-info {
color: #ffffff;
background-color: #5bc0de;
border-color: #46b8da;
}
.btn-info:hover,
.btn-info:focus,
.btn-info:active,
.btn-info.active,
.open .dropdown-toggle.btn-info {
color: #ffffff;
background-color: #39b3d7;
border-color: #269abc;
}
.btn-info:active,
.btn-info.active,
.open .dropdown-toggle.btn-info {
background-image: none;
}
.btn-info.disabled,
.btn-info[disabled],
fieldset[disabled] .btn-info,
.btn-info.disabled:hover,
.btn-info[disabled]:hover,
fieldset[disabled] .btn-info:hover,
.btn-info.disabled:focus,
.btn-info[disabled]:focus,
fieldset[disabled] .btn-info:focus,
.btn-info.disabled:active,
.btn-info[disabled]:active,
fieldset[disabled] .btn-info:active,
.btn-info.disabled.active,
.btn-info[disabled].active,
fieldset[disabled] .btn-info.active {
background-color: #5bc0de;
border-color: #46b8da;
}
.btn-link {
font-weight: normal;
color: #428bca;
cursor: pointer;
border-radius: 0;
}
.btn-link,
.btn-link:active,
.btn-link[disabled],
fieldset[disabled] .btn-link {
background-color: transparent;
-webkit-box-shadow: none;
box-shadow: none;
}
.btn-link,
.btn-link:hover,
.btn-link:focus,
.btn-link:active {
border-color: transparent;
}
.btn-link:hover,
.btn-link:focus {
color: #2a6496;
text-decoration: underline;
background-color: transparent;
}
.btn-link[disabled]:hover,
fieldset[disabled] .btn-link:hover,
.btn-link[disabled]:focus,
fieldset[disabled] .btn-link:focus {
color: #999999;
text-decoration: none;
}
.btn-lg {
padding: 10px 16px;
font-size: 18px;
line-height: 1.33;
border-radius: 6px;
}
.btn-sm,
.btn-xs {
padding: 5px 10px;
font-size: 12px;
line-height: 1.5;
border-radius: 3px;
}
.btn-xs {
padding: 1px 5px;
}
.btn-block {
display: block;
width: 100%;
padding-right: 0;
padding-left: 0;
}
.btn-block + .btn-block {
margin-top: 5px;
}
input[type="submit"].btn-block,
input[type="reset"].btn-block,
input[type="button"].btn-block {
width: 100%;
}
.fade {
opacity: 0;
-webkit-transition: opacity 0.15s linear;
transition: opacity 0.15s linear;
}
.fade.in {
opacity: 1;
}
.collapse {
display: none;
}
.collapse.in {
display: block;
}
.collapsing {
position: relative;
height: 0;
overflow: hidden;
-webkit-transition: height 0.35s ease;
transition: height 0.35s ease;
}
@font-face {
font-family: 'Glyphicons Halflings';
src: url('../fonts/glyphicons-halflings-regular.eot');
src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg');
}
.glyphicon {
position: relative;
top: 1px;
display: inline-block;
font-family: 'Glyphicons Halflings';
-webkit-font-smoothing: antialiased;
font-style: normal;
font-weight: normal;
line-height: 1;
}
.glyphicon-asterisk:before {
content: "\2a";
}
.glyphicon-plus:before {
content: "\2b";
}
.glyphicon-euro:before {
content: "\20ac";
}
.glyphicon-minus:before {
content: "\2212";
}
.glyphicon-cloud:before {
content: "\2601";
}
.glyphicon-envelope:before {
content: "\2709";
}
.glyphicon-pencil:before {
content: "\270f";
}
.glyphicon-glass:before {
content: "\e001";
}
.glyphicon-music:before {
content: "\e002";
}
.glyphicon-search:before {
content: "\e003";
}
.glyphicon-heart:before {
content: "\e005";
}
.glyphicon-star:before {
content: "\e006";
}
.glyphicon-star-empty:before {
content: "\e007";
}
.glyphicon-user:before {
content: "\e008";
}
.glyphicon-film:before {
content: "\e009";
}
.glyphicon-th-large:before {
content: "\e010";
}
.glyphicon-th:before {
content: "\e011";
}
.glyphicon-th-list:before {
content: "\e012";
}
.glyphicon-ok:before {
content: "\e013";
}
.glyphicon-remove:before {
content: "\e014";
}
.glyphicon-zoom-in:before {
content: "\e015";
}
.glyphicon-zoom-out:before {
content: "\e016";
}
.glyphicon-off:before {
content: "\e017";
}
.glyphicon-signal:before {
content: "\e018";
}
.glyphicon-cog:before {
content: "\e019";
}
.glyphicon-trash:before {
content: "\e020";
}
.glyphicon-home:before {
content: "\e021";
}
.glyphicon-file:before {
content: "\e022";
}
.glyphicon-time:before {
content: "\e023";
}
.glyphicon-road:before {
content: "\e024";
}
.glyphicon-download-alt:before {
content: "\e025";
}
.glyphicon-download:before {
content: "\e026";
}
.glyphicon-upload:before {
content: "\e027";
}
.glyphicon-inbox:before {
content: "\e028";
}
.glyphicon-play-circle:before {
content: "\e029";
}
.glyphicon-repeat:before {
content: "\e030";
}
.glyphicon-refresh:before {
content: "\e031";
}
.glyphicon-list-alt:before {
content: "\e032";
}
.glyphicon-flag:before {
content: "\e034";
}
.glyphicon-headphones:before {
content: "\e035";
}
.glyphicon-volume-off:before {
content: "\e036";
}
.glyphicon-volume-down:before {
content: "\e037";
}
.glyphicon-volume-up:before {
content: "\e038";
}
.glyphicon-qrcode:before {
content: "\e039";
}
.glyphicon-barcode:before {
content: "\e040";
}
.glyphicon-tag:before {
content: "\e041";
}
.glyphicon-tags:before {
content: "\e042";
}
.glyphicon-book:before {
content: "\e043";
}
.glyphicon-print:before {
content: "\e045";
}
.glyphicon-font:before {
content: "\e047";
}
.glyphicon-bold:before {
content: "\e048";
}
.glyphicon-italic:before {
content: "\e049";
}
.glyphicon-text-height:before {
content: "\e050";
}
.glyphicon-text-width:before {
content: "\e051";
}
.glyphicon-align-left:before {
content: "\e052";
}
.glyphicon-align-center:before {
content: "\e053";
}
.glyphicon-align-right:before {
content: "\e054";
}
.glyphicon-align-justify:before {
content: "\e055";
}
.glyphicon-list:before {
content: "\e056";
}
.glyphicon-indent-left:before {
content: "\e057";
}
.glyphicon-indent-right:before {
content: "\e058";
}
.glyphicon-facetime-video:before {
content: "\e059";
}
.glyphicon-picture:before {
content: "\e060";
}
.glyphicon-map-marker:before {
content: "\e062";
}
.glyphicon-adjust:before {
content: "\e063";
}
.glyphicon-tint:before {
content: "\e064";
}
.glyphicon-edit:before {
content: "\e065";
}
.glyphicon-share:before {
content: "\e066";
}
.glyphicon-check:before {
content: "\e067";
}
.glyphicon-move:before {
content: "\e068";
}
.glyphicon-step-backward:before {
content: "\e069";
}
.glyphicon-fast-backward:before {
content: "\e070";
}
.glyphicon-backward:before {
content: "\e071";
}
.glyphicon-play:before {
content: "\e072";
}
.glyphicon-pause:before {
content: "\e073";
}
.glyphicon-stop:before {
content: "\e074";
}
.glyphicon-forward:before {
content: "\e075";
}
.glyphicon-fast-forward:before {
content: "\e076";
}
.glyphicon-step-forward:before {
content: "\e077";
}
.glyphicon-eject:before {
content: "\e078";
}
.glyphicon-chevron-left:before {
content: "\e079";
}
.glyphicon-chevron-right:before {
content: "\e080";
}
.glyphicon-plus-sign:before {
content: "\e081";
}
.glyphicon-minus-sign:before {
content: "\e082";
}
.glyphicon-remove-sign:before {
content: "\e083";
}
.glyphicon-ok-sign:before {
content: "\e084";
}
.glyphicon-question-sign:before {
content: "\e085";
}
.glyphicon-info-sign:before {
content: "\e086";
}
.glyphicon-screenshot:before {
content: "\e087";
}
.glyphicon-remove-circle:before {
content: "\e088";
}
.glyphicon-ok-circle:before {
content: "\e089";
}
.glyphicon-ban-circle:before {
content: "\e090";
}
.glyphicon-arrow-left:before {
content: "\e091";
}
.glyphicon-arrow-right:before {
content: "\e092";
}
.glyphicon-arrow-up:before {
content: "\e093";
}
.glyphicon-arrow-down:before {
content: "\e094";
}
.glyphicon-share-alt:before {
content: "\e095";
}
.glyphicon-resize-full:before {
content: "\e096";
}
.glyphicon-resize-small:before {
content: "\e097";
}
.glyphicon-exclamation-sign:before {
content: "\e101";
}
.glyphicon-gift:before {
content: "\e102";
}
.glyphicon-leaf:before {
content: "\e103";
}
.glyphicon-eye-open:before {
content: "\e105";
}
.glyphicon-eye-close:before {
content: "\e106";
}
.glyphicon-warning-sign:before {
content: "\e107";
}
.glyphicon-plane:before {
content: "\e108";
}
.glyphicon-random:before {
content: "\e110";
}
.glyphicon-comment:before {
content: "\e111";
}
.glyphicon-magnet:before {
content: "\e112";
}
.glyphicon-chevron-up:before {
content: "\e113";
}
.glyphicon-chevron-down:before {
content: "\e114";
}
.glyphicon-retweet:before {
content: "\e115";
}
.glyphicon-shopping-cart:before {
content: "\e116";
}
.glyphicon-folder-close:before {
content: "\e117";
}
.glyphicon-folder-open:before {
content: "\e118";
}
.glyphicon-resize-vertical:before {
content: "\e119";
}
.glyphicon-resize-horizontal:before {
content: "\e120";
}
.glyphicon-hdd:before {
content: "\e121";
}
.glyphicon-bullhorn:before {
content: "\e122";
}
.glyphicon-certificate:before {
content: "\e124";
}
.glyphicon-thumbs-up:before {
content: "\e125";
}
.glyphicon-thumbs-down:before {
content: "\e126";
}
.glyphicon-hand-right:before {
content: "\e127";
}
.glyphicon-hand-left:before {
content: "\e128";
}
.glyphicon-hand-up:before {
content: "\e129";
}
.glyphicon-hand-down:before {
content: "\e130";
}
.glyphicon-circle-arrow-right:before {
content: "\e131";
}
.glyphicon-circle-arrow-left:before {
content: "\e132";
}
.glyphicon-circle-arrow-up:before {
content: "\e133";
}
.glyphicon-circle-arrow-down:before {
content: "\e134";
}
.glyphicon-globe:before {
content: "\e135";
}
.glyphicon-tasks:before {
content: "\e137";
}
.glyphicon-filter:before {
content: "\e138";
}
.glyphicon-fullscreen:before {
content: "\e140";
}
.glyphicon-dashboard:before {
content: "\e141";
}
.glyphicon-heart-empty:before {
content: "\e143";
}
.glyphicon-link:before {
content: "\e144";
}
.glyphicon-phone:before {
content: "\e145";
}
.glyphicon-usd:before {
content: "\e148";
}
.glyphicon-gbp:before {
content: "\e149";
}
.glyphicon-sort:before {
content: "\e150";
}
.glyphicon-sort-by-alphabet:before {
content: "\e151";
}
.glyphicon-sort-by-alphabet-alt:before {
content: "\e152";
}
.glyphicon-sort-by-order:before {
content: "\e153";
}
.glyphicon-sort-by-order-alt:before {
content: "\e154";
}
.glyphicon-sort-by-attributes:before {
content: "\e155";
}
.glyphicon-sort-by-attributes-alt:before {
content: "\e156";
}
.glyphicon-unchecked:before {
content: "\e157";
}
.glyphicon-expand:before {
content: "\e158";
}
.glyphicon-collapse-down:before {
content: "\e159";
}
.glyphicon-collapse-up:before {
content: "\e160";
}
.glyphicon-log-in:before {
content: "\e161";
}
.glyphicon-flash:before {
content: "\e162";
}
.glyphicon-log-out:before {
content: "\e163";
}
.glyphicon-new-window:before {
content: "\e164";
}
.glyphicon-record:before {
content: "\e165";
}
.glyphicon-save:before {
content: "\e166";
}
.glyphicon-open:before {
content: "\e167";
}
.glyphicon-saved:before {
content: "\e168";
}
.glyphicon-import:before {
content: "\e169";
}
.glyphicon-export:before {
content: "\e170";
}
.glyphicon-send:before {
content: "\e171";
}
.glyphicon-floppy-disk:before {
content: "\e172";
}
.glyphicon-floppy-saved:before {
content: "\e173";
}
.glyphicon-floppy-remove:before {
content: "\e174";
}
.glyphicon-floppy-save:before {
content: "\e175";
}
.glyphicon-floppy-open:before {
content: "\e176";
}
.glyphicon-credit-card:before {
content: "\e177";
}
.glyphicon-transfer:before {
content: "\e178";
}
.glyphicon-cutlery:before {
content: "\e179";
}
.glyphicon-header:before {
content: "\e180";
}
.glyphicon-compressed:before {
content: "\e181";
}
.glyphicon-earphone:before {
content: "\e182";
}
.glyphicon-phone-alt:before {
content: "\e183";
}
.glyphicon-tower:before {
content: "\e184";
}
.glyphicon-stats:before {
content: "\e185";
}
.glyphicon-sd-video:before {
content: "\e186";
}
.glyphicon-hd-video:before {
content: "\e187";
}
.glyphicon-subtitles:before {
content: "\e188";
}
.glyphicon-sound-stereo:before {
content: "\e189";
}
.glyphicon-sound-dolby:before {
content: "\e190";
}
.glyphicon-sound-5-1:before {
content: "\e191";
}
.glyphicon-sound-6-1:before {
content: "\e192";
}
.glyphicon-sound-7-1:before {
content: "\e193";
}
.glyphicon-copyright-mark:before {
content: "\e194";
}
.glyphicon-registration-mark:before {
content: "\e195";
}
.glyphicon-cloud-download:before {
content: "\e197";
}
.glyphicon-cloud-upload:before {
content: "\e198";
}
.glyphicon-tree-conifer:before {
content: "\e199";
}
.glyphicon-tree-deciduous:before {
content: "\e200";
}
.glyphicon-briefcase:before {
content: "\1f4bc";
}
.glyphicon-calendar:before {
content: "\1f4c5";
}
.glyphicon-pushpin:before {
content: "\1f4cc";
}
.glyphicon-paperclip:before {
content: "\1f4ce";
}
.glyphicon-camera:before {
content: "\1f4f7";
}
.glyphicon-lock:before {
content: "\1f512";
}
.glyphicon-bell:before {
content: "\1f514";
}
.glyphicon-bookmark:before {
content: "\1f516";
}
.glyphicon-fire:before {
content: "\1f525";
}
.glyphicon-wrench:before {
content: "\1f527";
}
.caret {
display: inline-block;
width: 0;
height: 0;
margin-left: 2px;
vertical-align: middle;
border-top: 4px solid #000000;
border-right: 4px solid transparent;
border-bottom: 0 dotted;
border-left: 4px solid transparent;
content: "";
}
.dropdown {
position: relative;
}
.dropdown-toggle:focus {
outline: 0;
}
.dropdown-menu {
position: absolute;
top: 100%;
left: 0;
z-index: 1000;
display: none;
float: left;
min-width: 160px;
padding: 5px 0;
margin: 2px 0 0;
font-size: 14px;
list-style: none;
background-color: #ffffff;
border: 1px solid #cccccc;
border: 1px solid rgba(0, 0, 0, 0.15);
border-radius: 4px;
-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
background-clip: padding-box;
}
.dropdown-menu.pull-right {
right: 0;
left: auto;
}
.dropdown-menu .divider {
height: 1px;
margin: 9px 0;
overflow: hidden;
background-color: #e5e5e5;
}
.dropdown-menu > li > a {
display: block;
padding: 3px 20px;
clear: both;
font-weight: normal;
line-height: 1.428571429;
color: #333333;
white-space: nowrap;
}
.dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus {
color: #ffffff;
text-decoration: none;
background-color: #428bca;
}
.dropdown-menu > .active > a,
.dropdown-menu > .active > a:hover,
.dropdown-menu > .active > a:focus {
color: #ffffff;
text-decoration: none;
background-color: #428bca;
outline: 0;
}
.dropdown-menu > .disabled > a,
.dropdown-menu > .disabled > a:hover,
.dropdown-menu > .disabled > a:focus {
color: #999999;
}
.dropdown-menu > .disabled > a:hover,
.dropdown-menu > .disabled > a:focus {
text-decoration: none;
cursor: not-allowed;
background-color: transparent;
background-image: none;
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
}
.open > .dropdown-menu {
display: block;
}
.open > a {
outline: 0;
}
.dropdown-header {
display: block;
padding: 3px 20px;
font-size: 12px;
line-height: 1.428571429;
color: #999999;
}
.dropdown-backdrop {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 990;
}
.pull-right > .dropdown-menu {
right: 0;
left: auto;
}
.dropup .caret,
.navbar-fixed-bottom .dropdown .caret {
border-top: 0 dotted;
border-bottom: 4px solid #000000;
content: "";
}
.dropup .dropdown-menu,
.navbar-fixed-bottom .dropdown .dropdown-menu {
top: auto;
bottom: 100%;
}
@media (min-width: 768px) {
.navbar-right .dropdown-menu {
right: 0;
left: auto;
}
}
.btn-default .caret {
border-top-color: #333333;
}
.btn-primary .caret,
.btn-success .caret,
.btn-warning .caret,
.btn-danger .caret,
.btn-info .caret {
border-top-color: #fff;
}
.dropup .btn-default .caret {
border-bottom-color: #333333;
}
.dropup .btn-primary .caret,
.dropup .btn-success .caret,
.dropup .btn-warning .caret,
.dropup .btn-danger .caret,
.dropup .btn-info .caret {
border-bottom-color: #fff;
}
.btn-group,
.btn-group-vertical {
position: relative;
display: inline-block;
vertical-align: middle;
}
.btn-group > .btn,
.btn-group-vertical > .btn {
position: relative;
float: left;
}
.btn-group > .btn:hover,
.btn-group-vertical > .btn:hover,
.btn-group > .btn:focus,
.btn-group-vertical > .btn:focus,
.btn-group > .btn:active,
.btn-group-vertical > .btn:active,
.btn-group > .btn.active,
.btn-group-vertical > .btn.active {
z-index: 2;
}
.btn-group > .btn:focus,
.btn-group-vertical > .btn:focus {
outline: none;
}
.btn-group .btn + .btn,
.btn-group .btn + .btn-group,
.btn-group .btn-group + .btn,
.btn-group .btn-group + .btn-group {
margin-left: -1px;
}
.btn-toolbar:before,
.btn-toolbar:after {
display: table;
content: " ";
}
.btn-toolbar:after {
clear: both;
}
.btn-toolbar:before,
.btn-toolbar:after {
display: table;
content: " ";
}
.btn-toolbar:after {
clear: both;
}
.btn-toolbar .btn-group {
float: left;
}
.btn-toolbar > .btn + .btn,
.btn-toolbar > .btn-group + .btn,
.btn-toolbar > .btn + .btn-group,
.btn-toolbar > .btn-group + .btn-group {
margin-left: 5px;
}
.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
border-radius: 0;
}
.btn-group > .btn:first-child {
margin-left: 0;
}
.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.btn-group > .btn:last-child:not(:first-child),
.btn-group > .dropdown-toggle:not(:first-child) {
border-bottom-left-radius: 0;
border-top-left-radius: 0;
}
.btn-group > .btn-group {
float: left;
}
.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
border-radius: 0;
}
.btn-group > .btn-group:first-child > .btn:last-child,
.btn-group > .btn-group:first-child > .dropdown-toggle {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.btn-group > .btn-group:last-child > .btn:first-child {
border-bottom-left-radius: 0;
border-top-left-radius: 0;
}
.btn-group .dropdown-toggle:active,
.btn-group.open .dropdown-toggle {
outline: 0;
}
.btn-group-xs > .btn {
padding: 5px 10px;
padding: 1px 5px;
font-size: 12px;
line-height: 1.5;
border-radius: 3px;
}
.btn-group-sm > .btn {
padding: 5px 10px;
font-size: 12px;
line-height: 1.5;
border-radius: 3px;
}
.btn-group-lg > .btn {
padding: 10px 16px;
font-size: 18px;
line-height: 1.33;
border-radius: 6px;
}
.btn-group > .btn + .dropdown-toggle {
padding-right: 8px;
padding-left: 8px;
}
.btn-group > .btn-lg + .dropdown-toggle {
padding-right: 12px;
padding-left: 12px;
}
.btn-group.open .dropdown-toggle {
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
}
.btn .caret {
margin-left: 0;
}
.btn-lg .caret {
border-width: 5px 5px 0;
border-bottom-width: 0;
}
.dropup .btn-lg .caret {
border-width: 0 5px 5px;
}
.btn-group-vertical > .btn,
.btn-group-vertical > .btn-group {
display: block;
float: none;
width: 100%;
max-width: 100%;
}
.btn-group-vertical > .btn-group:before,
.btn-group-vertical > .btn-group:after {
display: table;
content: " ";
}
.btn-group-vertical > .btn-group:after {
clear: both;
}
.btn-group-vertical > .btn-group:before,
.btn-group-vertical > .btn-group:after {
display: table;
content: " ";
}
.btn-group-vertical > .btn-group:after {
clear: both;
}
.btn-group-vertical > .btn-group > .btn {
float: none;
}
.btn-group-vertical > .btn + .btn,
.btn-group-vertical > .btn + .btn-group,
.btn-group-vertical > .btn-group + .btn,
.btn-group-vertical > .btn-group + .btn-group {
margin-top: -1px;
margin-left: 0;
}
.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
border-radius: 0;
}
.btn-group-vertical > .btn:first-child:not(:last-child) {
border-top-right-radius: 4px;
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
.btn-group-vertical > .btn:last-child:not(:first-child) {
border-top-right-radius: 0;
border-bottom-left-radius: 4px;
border-top-left-radius: 0;
}
.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
border-radius: 0;
}
.btn-group-vertical > .btn-group:first-child > .btn:last-child,
.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
.btn-group-vertical > .btn-group:last-child > .btn:first-child {
border-top-right-radius: 0;
border-top-left-radius: 0;
}
.btn-group-justified {
display: table;
width: 100%;
border-collapse: separate;
table-layout: fixed;
}
.btn-group-justified .btn {
display: table-cell;
float: none;
width: 1%;
}
[data-toggle="buttons"] > .btn > input[type="radio"],
[data-toggle="buttons"] > .btn > input[type="checkbox"] {
display: none;
}
.input-group {
position: relative;
display: table;
border-collapse: separate;
}
.input-group.col {
float: none;
padding-right: 0;
padding-left: 0;
}
.input-group .form-control {
width: 100%;
margin-bottom: 0;
}
.input-group-lg > .form-control,
.input-group-lg > .input-group-addon,
.input-group-lg > .input-group-btn > .btn {
height: 45px;
padding: 10px 16px;
font-size: 18px;
line-height: 1.33;
border-radius: 6px;
}
select.input-group-lg > .form-control,
select.input-group-lg > .input-group-addon,
select.input-group-lg > .input-group-btn > .btn {
height: 45px;
line-height: 45px;
}
textarea.input-group-lg > .form-control,
textarea.input-group-lg > .input-group-addon,
textarea.input-group-lg > .input-group-btn > .btn {
height: auto;
}
.input-group-sm > .form-control,
.input-group-sm > .input-group-addon,
.input-group-sm > .input-group-btn > .btn {
height: 30px;
padding: 5px 10px;
font-size: 12px;
line-height: 1.5;
border-radius: 3px;
}
select.input-group-sm > .form-control,
select.input-group-sm > .input-group-addon,
select.input-group-sm > .input-group-btn > .btn {
height: 30px;
line-height: 30px;
}
textarea.input-group-sm > .form-control,
textarea.input-group-sm > .input-group-addon,
textarea.input-group-sm > .input-group-btn > .btn {
height: auto;
}
.input-group-addon,
.input-group-btn,
.input-group .form-control {
display: table-cell;
}
.input-group-addon:not(:first-child):not(:last-child),
.input-group-btn:not(:first-child):not(:last-child),
.input-group .form-control:not(:first-child):not(:last-child) {
border-radius: 0;
}
.input-group-addon,
.input-group-btn {
width: 1%;
white-space: nowrap;
vertical-align: middle;
}
.input-group-addon {
padding: 6px 12px;
font-size: 14px;
font-weight: normal;
line-height: 1;
text-align: center;
background-color: #eeeeee;
border: 1px solid #cccccc;
border-radius: 4px;
}
.input-group-addon.input-sm {
padding: 5px 10px;
font-size: 12px;
border-radius: 3px;
}
.input-group-addon.input-lg {
padding: 10px 16px;
font-size: 18px;
border-radius: 6px;
}
.input-group-addon input[type="radio"],
.input-group-addon input[type="checkbox"] {
margin-top: 0;
}
.input-group .form-control:first-child,
.input-group-addon:first-child,
.input-group-btn:first-child > .btn,
.input-group-btn:first-child > .dropdown-toggle,
.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.input-group-addon:first-child {
border-right: 0;
}
.input-group .form-control:last-child,
.input-group-addon:last-child,
.input-group-btn:last-child > .btn,
.input-group-btn:last-child > .dropdown-toggle,
.input-group-btn:first-child > .btn:not(:first-child) {
border-bottom-left-radius: 0;
border-top-left-radius: 0;
}
.input-group-addon:last-child {
border-left: 0;
}
.input-group-btn {
position: relative;
white-space: nowrap;
}
.input-group-btn > .btn {
position: relative;
}
.input-group-btn > .btn + .btn {
margin-left: -4px;
}
.input-group-btn > .btn:hover,
.input-group-btn > .btn:active {
z-index: 2;
}
.nav {
padding-left: 0;
margin-bottom: 0;
list-style: none;
}
.nav:before,
.nav:after {
display: table;
content: " ";
}
.nav:after {
clear: both;
}
.nav:before,
.nav:after {
display: table;
content: " ";
}
.nav:after {
clear: both;
}
.nav > li {
position: relative;
display: block;
}
.nav > li > a {
position: relative;
display: block;
padding: 10px 15px;
}
.nav > li > a:hover,
.nav > li > a:focus {
text-decoration: none;
background-color: #eeeeee;
}
.nav > li.disabled > a {
color: #999999;
}
.nav > li.disabled > a:hover,
.nav > li.disabled > a:focus {
color: #999999;
text-decoration: none;
cursor: not-allowed;
background-color: transparent;
}
.nav .open > a,
.nav .open > a:hover,
.nav .open > a:focus {
background-color: #eeeeee;
border-color: #428bca;
}
.nav .nav-divider {
height: 1px;
margin: 9px 0;
overflow: hidden;
background-color: #e5e5e5;
}
.nav > li > a > img {
max-width: none;
}
.nav-tabs {
border-bottom: 1px solid #dddddd;
}
.nav-tabs > li {
float: left;
margin-bottom: -1px;
}
.nav-tabs > li > a {
margin-right: 2px;
line-height: 1.428571429;
border: 1px solid transparent;
border-radius: 4px 4px 0 0;
}
.nav-tabs > li > a:hover {
border-color: #eeeeee #eeeeee #dddddd;
}
.nav-tabs > li.active > a,
.nav-tabs > li.active > a:hover,
.nav-tabs > li.active > a:focus {
color: steelblue;
cursor: default;
background-color: #ffffff;
border: 1px solid #dddddd;
border-bottom-color: transparent;
}
.nav-tabs.nav-justified {
width: 100%;
border-bottom: 0;
}
.nav-tabs.nav-justified > li {
float: none;
}
.nav-tabs.nav-justified > li > a {
text-align: center;
}
@media (min-width: 768px) {
.nav-tabs.nav-justified > li {
display: table-cell;
width: 1%;
}
}
.nav-tabs.nav-justified > li > a {
margin-right: 0;
border-bottom: 1px solid #dddddd;
}
.nav-tabs.nav-justified > .active > a {
border-bottom-color: #ffffff;
}
.nav-pills > li {
float: left;
}
.nav-pills > li > a {
border-radius: 5px;
}
.nav-pills > li + li {
margin-left: 2px;
}
.nav-pills > li.active > a,
.nav-pills > li.active > a:hover,
.nav-pills > li.active > a:focus {
color: #ffffff;
background-color: #428bca;
}
.nav-stacked > li {
float: none;
}
.nav-stacked > li + li {
margin-top: 2px;
margin-left: 0;
}
.nav-justified {
width: 100%;
}
.nav-justified > li {
float: none;
}
.nav-justified > li > a {
text-align: center;
}
@media (min-width: 768px) {
.nav-justified > li {
display: table-cell;
width: 1%;
}
}
.nav-tabs-justified {
border-bottom: 0;
}
.nav-tabs-justified > li > a {
margin-right: 0;
border-bottom: 1px solid #dddddd;
}
.nav-tabs-justified > .active > a {
border-bottom-color: #ffffff;
}
.tabbable:before,
.tabbable:after {
display: table;
content: " ";
}
.tabbable:after {
clear: both;
}
.tabbable:before,
.tabbable:after {
display: table;
content: " ";
}
.tabbable:after {
clear: both;
}
.tab-content > .tab-pane,
.pill-content > .pill-pane {
display: none;
}
.tab-content > .active,
.pill-content > .active {
display: block;
}
.nav .caret {
border-top-color: #428bca;
border-bottom-color: #428bca;
}
.nav a:hover .caret {
border-top-color: #2a6496;
border-bottom-color: #2a6496;
}
.nav-tabs .dropdown-menu {
margin-top: -1px;
border-top-right-radius: 0;
border-top-left-radius: 0;
}
.navbar {
position: relative;
z-index: 1000;
min-height: 30px;
margin-bottom: 20px;
border: 1px solid transparent;
}
.navbar:before,
.navbar:after {
display: table;
content: " ";
}
.navbar:after {
clear: both;
}
.navbar:before,
.navbar:after {
display: table;
content: " ";
}
.navbar:after {
clear: both;
}
@media (min-width: 768px) {
.navbar {
border-radius: 4px;
}
}
.navbar-header:before,
.navbar-header:after {
display: table;
content: " ";
}
.navbar-header:after {
clear: both;
}
.navbar-header:before,
.navbar-header:after {
display: table;
content: " ";
}
.navbar-header:after {
clear: both;
}
@media (min-width: 768px) {
.navbar-header {
float: left;
}
}
.navbar-collapse {
max-height: 340px;
padding-right: 15px;
padding-left: 15px;
overflow-x: visible;
border-top: 1px solid transparent;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.navbar-collapse:before,
.navbar-collapse:after {
display: table;
content: " ";
}
.navbar-collapse:after {
clear: both;
}
.navbar-collapse:before,
.navbar-collapse:after {
display: table;
content: " ";
}
.navbar-collapse:after {
clear: both;
}
.navbar-collapse.in {
overflow-y: auto;
}
@media (min-width: 768px) {
.navbar-collapse {
width: auto;
border-top: 0;
box-shadow: none;
}
.navbar-collapse.collapse {
display: block !important;
height: auto !important;
padding-bottom: 0;
overflow: visible !important;
}
.navbar-collapse.in {
overflow-y: visible;
}
.navbar-collapse .navbar-nav.navbar-left:first-child {
margin-left: -15px;
}
.navbar-collapse .navbar-nav.navbar-right:last-child {
margin-right: -15px;
}
.navbar-collapse .navbar-text:last-child {
margin-right: 0;
}
}
.container > .navbar-header,
.container > .navbar-collapse {
margin-right: -15px;
margin-left: -15px;
}
@media (min-width: 768px) {
.container > .navbar-header,
.container > .navbar-collapse {
margin-right: 0;
margin-left: 0;
}
}
.navbar-static-top {
border-width: 0 0 1px;
}
@media (min-width: 768px) {
.navbar-static-top {
border-radius: 0;
}
}
.navbar-fixed-top,
.navbar-fixed-bottom {
position: fixed;
right: 0;
left: 0;
border-width: 0 0 1px;
}
@media (min-width: 768px) {
.navbar-fixed-top,
.navbar-fixed-bottom {
border-radius: 0;
}
}
.navbar-fixed-top {
top: 0;
z-index: 1030;
}
.navbar-fixed-bottom {
bottom: 0;
margin-bottom: 0;
}
.navbar-brand {
float: left;
padding: 15px 15px;
font-size: 18px;
line-height: 20px;
}
.navbar-brand:hover,
.navbar-brand:focus {
text-decoration: none;
}
@media (min-width: 768px) {
.navbar > .container .navbar-brand {
margin-left: -15px;
}
}
.navbar-toggle {
position: relative;
float: right;
padding: 9px 10px;
margin-top: 8px;
margin-right: 15px;
margin-bottom: 8px;
background-color: transparent;
border: 1px solid transparent;
border-radius: 4px;
}
.navbar-toggle .icon-bar {
display: block;
width: 22px;
height: 2px;
border-radius: 1px;
}
.navbar-toggle .icon-bar + .icon-bar {
margin-top: 4px;
}
@media (min-width: 768px) {
.navbar-toggle {
display: none;
}
}
.navbar-nav {
margin: 7.5px -15px;
}
.navbar-nav > li > a {
padding-top: 10px;
padding-bottom: 10px;
line-height: 20px;
}
@media (max-width: 767px) {
.navbar-nav .open .dropdown-menu {
position: static;
float: none;
width: auto;
margin-top: 0;
background-color: transparent;
border: 0;
box-shadow: none;
}
.navbar-nav .open .dropdown-menu > li > a,
.navbar-nav .open .dropdown-menu .dropdown-header {
padding: 5px 15px 5px 25px;
}
.navbar-nav .open .dropdown-menu > li > a {
line-height: 20px;
}
.navbar-nav .open .dropdown-menu > li > a:hover,
.navbar-nav .open .dropdown-menu > li > a:focus {
background-image: none;
}
}
@media (min-width: 768px) {
.navbar-nav {
float: left;
margin: 0;
}
.navbar-nav > li {
float: left;
}
.navbar-nav > li > a {
padding-top: 15px;
padding-bottom: 15px;
}
}
@media (min-width: 768px) {
.navbar-left {
float: left !important;
}
.navbar-right {
float: right !important;
}
}
.navbar-form {
padding: 10px 15px;
margin-top: 8px;
margin-right: -15px;
margin-bottom: 8px;
margin-left: -15px;
border-top: 1px solid transparent;
border-bottom: 1px solid transparent;
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
}
@media (min-width: 768px) {
.navbar-form .form-group {
display: inline-block;
margin-bottom: 0;
vertical-align: middle;
}
.navbar-form .form-control {
display: inline-block;
}
.navbar-form .radio,
.navbar-form .checkbox {
display: inline-block;
padding-left: 0;
margin-top: 0;
margin-bottom: 0;
}
.navbar-form .radio input[type="radio"],
.navbar-form .checkbox input[type="checkbox"] {
float: none;
margin-left: 0;
}
}
@media (max-width: 767px) {
.navbar-form .form-group {
margin-bottom: 5px;
}
}
@media (min-width: 768px) {
.navbar-form {
width: auto;
padding-top: 0;
padding-bottom: 0;
margin-right: 0;
margin-left: 0;
border: 0;
-webkit-box-shadow: none;
box-shadow: none;
}
}
.navbar-nav > li > .dropdown-menu {
margin-top: 0;
border-top-right-radius: 0;
border-top-left-radius: 0;
}
.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
.navbar-nav.pull-right > li > .dropdown-menu,
.navbar-nav > li > .dropdown-menu.pull-right {
right: 0;
left: auto;
}
.navbar-btn {
margin-top: 8px;
margin-bottom: 8px;
}
.navbar-text {
float: left;
margin-top: 15px;
margin-bottom: 15px;
}
@media (min-width: 768px) {
.navbar-text {
margin-right: 15px;
margin-left: 15px;
}
}
.navbar-default {
background-color: #f8f8f8;
border-color: #e7e7e7;
}
.navbar-default .navbar-brand {
color: #777777;
}
.navbar-default .navbar-brand:hover,
.navbar-default .navbar-brand:focus {
color: #5e5e5e;
background-color: transparent;
}
.navbar-default .navbar-text {
color: #777777;
}
.navbar-default .navbar-nav > li > a {
color: #777777;
}
.navbar-default .navbar-nav > li > a:hover,
.navbar-default .navbar-nav > li > a:focus {
color: #333333;
background-color: transparent;
}
.navbar-default .navbar-nav > .active > a,
.navbar-default .navbar-nav > .active > a:hover,
.navbar-default .navbar-nav > .active > a:focus {
color: #555555;
background-color: #e7e7e7;
}
.navbar-default .navbar-nav > .disabled > a,
.navbar-default .navbar-nav > .disabled > a:hover,
.navbar-default .navbar-nav > .disabled > a:focus {
color: #cccccc;
background-color: transparent;
}
.navbar-default .navbar-toggle {
border-color: #dddddd;
}
.navbar-default .navbar-toggle:hover,
.navbar-default .navbar-toggle:focus {
background-color: #dddddd;
}
.navbar-default .navbar-toggle .icon-bar {
background-color: #cccccc;
}
.navbar-default .navbar-collapse,
.navbar-default .navbar-form {
border-color: #e6e6e6;
}
.navbar-default .navbar-nav > .dropdown > a:hover .caret,
.navbar-default .navbar-nav > .dropdown > a:focus .caret {
border-top-color: #333333;
border-bottom-color: #333333;
}
.navbar-default .navbar-nav > .open > a,
.navbar-default .navbar-nav > .open > a:hover,
.navbar-default .navbar-nav > .open > a:focus {
color: #555555;
background-color: #e7e7e7;
}
.navbar-default .navbar-nav > .open > a .caret,
.navbar-default .navbar-nav > .open > a:hover .caret,
.navbar-default .navbar-nav > .open > a:focus .caret {
border-top-color: #555555;
border-bottom-color: #555555;
}
.navbar-default .navbar-nav > .dropdown > a .caret {
border-top-color: #777777;
border-bottom-color: #777777;
}
@media (max-width: 767px) {
.navbar-default .navbar-nav .open .dropdown-menu > li > a {
color: #777777;
}
.navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
.navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
color: #333333;
background-color: transparent;
}
.navbar-default .navbar-nav .open .dropdown-menu > .active > a,
.navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
.navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
color: #555555;
background-color: #e7e7e7;
}
.navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
.navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
.navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
color: #cccccc;
background-color: transparent;
}
}
.navbar-default .navbar-link {
color: #777777;
}
.navbar-default .navbar-link:hover {
color: #333333;
}
.navbar-inverse {
background-color: #222222;
border-color: #080808;
}
.navbar-inverse .navbar-brand {
color: #999999;
}
.navbar-inverse .navbar-brand:hover,
.navbar-inverse .navbar-brand:focus {
color: #ffffff;
background-color: transparent;
}
.navbar-inverse .navbar-text {
color: #999999;
}
.navbar-inverse .navbar-nav > li > a {
color: #999999;
}
.navbar-inverse .navbar-nav > li > a:hover,
.navbar-inverse .navbar-nav > li > a:focus {
color: #ffffff;
background-color: transparent;
}
.navbar-inverse .navbar-nav > .active > a,
.navbar-inverse .navbar-nav > .active > a:hover,
.navbar-inverse .navbar-nav > .active > a:focus {
color: #ffffff;
background-color: #080808;
}
.navbar-inverse .navbar-nav > .disabled > a,
.navbar-inverse .navbar-nav > .disabled > a:hover,
.navbar-inverse .navbar-nav > .disabled > a:focus {
color: #444444;
background-color: transparent;
}
.navbar-inverse .navbar-toggle {
border-color: #333333;
}
.navbar-inverse .navbar-toggle:hover,
.navbar-inverse .navbar-toggle:focus {
background-color: #333333;
}
.navbar-inverse .navbar-toggle .icon-bar {
background-color: #ffffff;
}
.navbar-inverse .navbar-collapse,
.navbar-inverse .navbar-form {
border-color: #101010;
}
.navbar-inverse .navbar-nav > .open > a,
.navbar-inverse .navbar-nav > .open > a:hover,
.navbar-inverse .navbar-nav > .open > a:focus {
color: #ffffff;
background-color: #080808;
}
.navbar-inverse .navbar-nav > .dropdown > a:hover .caret {
border-top-color: #ffffff;
border-bottom-color: #ffffff;
}
.navbar-inverse .navbar-nav > .dropdown > a .caret {
border-top-color: #999999;
border-bottom-color: #999999;
}
.navbar-inverse .navbar-nav > .open > a .caret,
.navbar-inverse .navbar-nav > .open > a:hover .caret,
.navbar-inverse .navbar-nav > .open > a:focus .caret {
border-top-color: #ffffff;
border-bottom-color: #ffffff;
}
@media (max-width: 767px) {
.navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
border-color: #080808;
}
.navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
color: #999999;
}
.navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
.navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
color: #ffffff;
background-color: transparent;
}
.navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
.navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
.navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
color: #ffffff;
background-color: #080808;
}
.navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
.navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
.navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
color: #444444;
background-color: transparent;
}
}
.navbar-inverse .navbar-link {
color: #999999;
}
.navbar-inverse .navbar-link:hover {
color: #ffffff;
}
.breadcrumb {
padding: 8px 15px;
margin-bottom: 20px;
list-style: none;
background-color: #f5f5f5;
border-radius: 4px;
}
.breadcrumb > li {
display: inline-block;
}
.breadcrumb > li + li:before {
padding: 0 5px;
color: #cccccc;
content: "/\00a0";
}
.breadcrumb > .active {
color: #999999;
}
.pagination {
display: inline-block;
padding-left: 0;
margin: 20px 0;
border-radius: 4px;
}
.pagination > li {
display: inline;
}
.pagination > li > a,
.pagination > li > span {
position: relative;
float: left;
padding: 6px 12px;
margin-left: -1px;
line-height: 1.428571429;
text-decoration: none;
background-color: #ffffff;
border: 1px solid #dddddd;
}
.pagination > li:first-child > a,
.pagination > li:first-child > span {
margin-left: 0;
border-bottom-left-radius: 4px;
border-top-left-radius: 4px;
}
.pagination > li:last-child > a,
.pagination > li:last-child > span {
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
}
.pagination > li > a:hover,
.pagination > li > span:hover,
.pagination > li > a:focus,
.pagination > li > span:focus {
background-color: #eeeeee;
}
.pagination > .active > a,
.pagination > .active > span,
.pagination > .active > a:hover,
.pagination > .active > span:hover,
.pagination > .active > a:focus,
.pagination > .active > span:focus {
z-index: 2;
color: #ffffff;
cursor: default;
background-color: #428bca;
border-color: #428bca;
}
.pagination > .disabled > span,
.pagination > .disabled > a,
.pagination > .disabled > a:hover,
.pagination > .disabled > a:focus {
color: #999999;
cursor: not-allowed;
background-color: #ffffff;
border-color: #dddddd;
}
.pagination-lg > li > a,
.pagination-lg > li > span {
padding: 10px 16px;
font-size: 18px;
}
.pagination-lg > li:first-child > a,
.pagination-lg > li:first-child > span {
border-bottom-left-radius: 6px;
border-top-left-radius: 6px;
}
.pagination-lg > li:last-child > a,
.pagination-lg > li:last-child > span {
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
}
.pagination-sm > li > a,
.pagination-sm > li > span {
padding: 5px 10px;
font-size: 12px;
}
.pagination-sm > li:first-child > a,
.pagination-sm > li:first-child > span {
border-bottom-left-radius: 3px;
border-top-left-radius: 3px;
}
.pagination-sm > li:last-child > a,
.pagination-sm > li:last-child > span {
border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
}
.pager {
padding-left: 0;
margin: 20px 0;
text-align: center;
list-style: none;
}
.pager:before,
.pager:after {
display: table;
content: " ";
}
.pager:after {
clear: both;
}
.pager:before,
.pager:after {
display: table;
content: " ";
}
.pager:after {
clear: both;
}
.pager li {
display: inline;
}
.pager li > a,
.pager li > span {
display: inline-block;
padding: 5px 14px;
background-color: #ffffff;
border: 1px solid #dddddd;
border-radius: 15px;
}
.pager li > a:hover,
.pager li > a:focus {
text-decoration: none;
background-color: #eeeeee;
}
.pager .next > a,
.pager .next > span {
float: right;
}
.pager .previous > a,
.pager .previous > span {
float: left;
}
.pager .disabled > a,
.pager .disabled > a:hover,
.pager .disabled > a:focus,
.pager .disabled > span {
color: #999999;
cursor: not-allowed;
background-color: #ffffff;
}
.label {
display: inline;
padding: .2em .6em .3em;
font-size: 75%;
font-weight: bold;
line-height: 1;
color: #ffffff;
text-align: center;
white-space: nowrap;
vertical-align: baseline;
border-radius: .25em;
}
.label[href]:hover,
.label[href]:focus {
color: #ffffff;
text-decoration: none;
cursor: pointer;
}
.label:empty {
display: none;
}
.label-default {
background-color: #999999;
}
.label-default[href]:hover,
.label-default[href]:focus {
background-color: #808080;
}
.label-primary {
background-color: #428bca;
}
.label-primary[href]:hover,
.label-primary[href]:focus {
background-color: #3071a9;
}
.label-success {
background-color: #5cb85c;
}
.label-success[href]:hover,
.label-success[href]:focus {
background-color: #449d44;
}
.label-info {
background-color: #5bc0de;
}
.label-info[href]:hover,
.label-info[href]:focus {
background-color: #31b0d5;
}
.label-warning {
background-color: #f0ad4e;
}
.label-warning[href]:hover,
.label-warning[href]:focus {
background-color: #ec971f;
}
.label-danger {
background-color: #d9534f;
}
.label-danger[href]:hover,
.label-danger[href]:focus {
background-color: #c9302c;
}
.badge {
display: inline-block;
min-width: 10px;
padding: 3px 7px;
font-size: 12px;
font-weight: bold;
line-height: 1;
color: #ffffff;
text-align: center;
white-space: nowrap;
vertical-align: baseline;
background-color: #999999;
border-radius: 10px;
}
.badge:empty {
display: none;
}
a.badge:hover,
a.badge:focus {
color: #ffffff;
text-decoration: none;
cursor: pointer;
}
.btn .badge {
position: relative;
top: -1px;
}
a.list-group-item.active > .badge,
.nav-pills > .active > a > .badge {
color: #428bca;
background-color: #ffffff;
}
.nav-pills > li > a > .badge {
margin-left: 3px;
}
.jumbotron {
padding: 30px;
margin-bottom: 30px;
font-size: 21px;
font-weight: 200;
line-height: 2.1428571435;
color: inherit;
background-color: #eeeeee;
}
.jumbotron h1 {
line-height: 1;
color: inherit;
}
.jumbotron p {
line-height: 1.4;
}
.container .jumbotron {
border-radius: 6px;
}
@media screen and (min-width: 768px) {
.jumbotron {
padding-top: 48px;
padding-bottom: 48px;
}
.container .jumbotron {
padding-right: 60px;
padding-left: 60px;
}
.jumbotron h1 {
font-size: 63px;
}
}
.thumbnail {
display: inline-block;
display: block;
height: auto;
max-width: 100%;
padding: 4px;
line-height: 1.428571429;
background-color: #ffffff;
border: 1px solid #dddddd;
border-radius: 4px;
-webkit-transition: all 0.2s ease-in-out;
transition: all 0.2s ease-in-out;
}
.thumbnail > img {
display: block;
height: auto;
max-width: 100%;
}
a.thumbnail:hover,
a.thumbnail:focus {
border-color: #428bca;
}
.thumbnail > img {
margin-right: auto;
margin-left: auto;
}
.thumbnail .caption {
padding: 9px;
color: #333333;
}
.alert {
padding: 15px;
margin-bottom: 20px;
border: 1px solid transparent;
border-radius: 4px;
}
.alert h4 {
margin-top: 0;
color: inherit;
}
.alert .alert-link {
font-weight: bold;
}
.alert > p,
.alert > ul {
margin-bottom: 0;
}
.alert > p + p {
margin-top: 5px;
}
.alert-dismissable {
padding-right: 35px;
}
.alert-dismissable .close {
position: relative;
top: -2px;
right: -21px;
color: inherit;
}
.alert-success {
color: #468847;
background-color: #dff0d8;
border-color: #d6e9c6;
}
.alert-success hr {
border-top-color: #c9e2b3;
}
.alert-success .alert-link {
color: #356635;
}
.alert-info {
color: #3a87ad;
background-color: #d9edf7;
border-color: #bce8f1;
}
.alert-info hr {
border-top-color: #a6e1ec;
}
.alert-info .alert-link {
color: #2d6987;
}
.alert-warning {
color: #c09853;
background-color: #fcf8e3;
border-color: #fbeed5;
}
.alert-warning hr {
border-top-color: #f8e5be;
}
.alert-warning .alert-link {
color: #a47e3c;
}
.alert-danger {
color: #b94a48;
background-color: #f2dede;
border-color: #eed3d7;
}
.alert-danger hr {
border-top-color: #e6c1c7;
}
.alert-danger .alert-link {
color: #953b39;
}
@-webkit-keyframes progress-bar-stripes {
from {
background-position: 40px 0;
}
to {
background-position: 0 0;
}
}
@-moz-keyframes progress-bar-stripes {
from {
background-position: 40px 0;
}
to {
background-position: 0 0;
}
}
@-o-keyframes progress-bar-stripes {
from {
background-position: 0 0;
}
to {
background-position: 40px 0;
}
}
@keyframes progress-bar-stripes {
from {
background-position: 40px 0;
}
to {
background-position: 0 0;
}
}
.progress {
height: 20px;
margin-bottom: 20px;
overflow: hidden;
background-color: #f5f5f5;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
}
.progress-bar {
float: left;
width: 0;
height: 100%;
font-size: 12px;
color: #ffffff;
text-align: center;
background-color: #428bca;
-webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-webkit-transition: width 0.6s ease;
transition: width 0.6s ease;
}
.progress-striped .progress-bar {
background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-size: 40px 40px;
}
.progress.active .progress-bar {
-webkit-animation: progress-bar-stripes 2s linear infinite;
-moz-animation: progress-bar-stripes 2s linear infinite;
-ms-animation: progress-bar-stripes 2s linear infinite;
-o-animation: progress-bar-stripes 2s linear infinite;
animation: progress-bar-stripes 2s linear infinite;
}
.progress-bar-success {
background-color: #5cb85c;
}
.progress-striped .progress-bar-success {
background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
}
.progress-bar-info {
background-color: #5bc0de;
}
.progress-striped .progress-bar-info {
background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
}
.progress-bar-warning {
background-color: #f0ad4e;
}
.progress-striped .progress-bar-warning {
background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
}
.progress-bar-danger {
background-color: #d9534f;
}
.progress-striped .progress-bar-danger {
background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
}
.media,
.media-body {
overflow: hidden;
zoom: 1;
}
.media,
.media .media {
margin-top: 15px;
}
.media:first-child {
margin-top: 0;
}
.media-object {
display: block;
}
.media-heading {
margin: 0 0 5px;
}
.media > .pull-left {
margin-right: 10px;
}
.media > .pull-right {
margin-left: 10px;
}
.media-list {
padding-left: 0;
list-style: none;
}
.list-group {
padding-left: 0;
margin-bottom: 20px;
}
.list-group-item {
position: relative;
display: block;
padding: 10px 15px;
margin-bottom: -1px;
background-color: #ffffff;
border: 1px solid #dddddd;
}
.list-group-item:first-child {
border-top-right-radius: 4px;
border-top-left-radius: 4px;
}
.list-group-item:last-child {
margin-bottom: 0;
border-bottom-right-radius: 4px;
border-bottom-left-radius: 4px;
}
.list-group-item > .badge {
float: right;
}
.list-group-item > .badge + .badge {
margin-right: 5px;
}
a.list-group-item {
color: #555555;
}
a.list-group-item .list-group-item-heading {
color: #333333;
}
a.list-group-item:hover,
a.list-group-item:focus {
text-decoration: none;
background-color: #f5f5f5;
}
.list-group-item.active,
.list-group-item.active:hover,
.list-group-item.active:focus {
z-index: 2;
color: #ffffff;
background-color: #428bca;
border-color: #428bca;
}
.list-group-item.active .list-group-item-heading,
.list-group-item.active:hover .list-group-item-heading,
.list-group-item.active:focus .list-group-item-heading {
color: inherit;
}
.list-group-item.active .list-group-item-text,
.list-group-item.active:hover .list-group-item-text,
.list-group-item.active:focus .list-group-item-text {
color: #e1edf7;
}
.list-group-item-heading {
margin-top: 0;
margin-bottom: 5px;
}
.list-group-item-text {
margin-bottom: 0;
line-height: 1.3;
}
.panel {
margin-bottom: 20px;
background-color: #ffffff;
border: 1px solid transparent;
border-radius: 4px;
-webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
}
.panel-body {
padding: 15px;
}
.panel-body:before,
.panel-body:after {
display: table;
content: " ";
}
.panel-body:after {
clear: both;
}
.panel-body:before,
.panel-body:after {
display: table;
content: " ";
}
.panel-body:after {
clear: both;
}
.panel > .list-group {
margin-bottom: 0;
}
.panel > .list-group .list-group-item {
border-width: 1px 0;
}
.panel > .list-group .list-group-item:first-child {
border-top-right-radius: 0;
border-top-left-radius: 0;
}
.panel > .list-group .list-group-item:last-child {
border-bottom: 0;
}
.panel-heading + .list-group .list-group-item:first-child {
border-top-width: 0;
}
.panel > .table {
margin-bottom: 0;
}
.panel > .panel-body + .table {
border-top: 1px solid #dddddd;
}
.panel-heading {
padding: 10px 15px;
border-bottom: 1px solid transparent;
border-top-right-radius: 3px;
border-top-left-radius: 3px;
}
.panel-title {
margin-top: 0;
margin-bottom: 0;
font-size: 16px;
}
.panel-title > a {
color: inherit;
}
.panel-footer {
padding: 10px 15px;
background-color: #f5f5f5;
border-top: 1px solid #dddddd;
border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;
}
.panel-group .panel {
margin-bottom: 0;
overflow: hidden;
border-radius: 4px;
}
.panel-group .panel + .panel {
margin-top: 5px;
}
.panel-group .panel-heading {
border-bottom: 0;
}
.panel-group .panel-heading + .panel-collapse .panel-body {
border-top: 1px solid #dddddd;
}
.panel-group .panel-footer {
border-top: 0;
}
.panel-group .panel-footer + .panel-collapse .panel-body {
border-bottom: 1px solid #dddddd;
}
.panel-default {
border-color: #dddddd;
}
.panel-default > .panel-heading {
color: #333333;
background-color: #f5f5f5;
border-color: #dddddd;
}
.panel-default > .panel-heading + .panel-collapse .panel-body {
border-top-color: #dddddd;
}
.panel-default > .panel-footer + .panel-collapse .panel-body {
border-bottom-color: #dddddd;
}
.panel-primary {
border-color: #428bca;
}
.panel-primary > .panel-heading {
color: #ffffff;
background-color: #428bca;
border-color: #428bca;
}
.panel-primary > .panel-heading + .panel-collapse .panel-body {
border-top-color: #428bca;
}
.panel-primary > .panel-footer + .panel-collapse .panel-body {
border-bottom-color: #428bca;
}
.panel-success {
border-color: #d6e9c6;
}
.panel-success > .panel-heading {
color: #468847;
background-color: #dff0d8;
border-color: #d6e9c6;
}
.panel-success > .panel-heading + .panel-collapse .panel-body {
border-top-color: #d6e9c6;
}
.panel-success > .panel-footer + .panel-collapse .panel-body {
border-bottom-color: #d6e9c6;
}
.panel-warning {
border-color: #fbeed5;
}
.panel-warning > .panel-heading {
color: #c09853;
background-color: #fcf8e3;
border-color: #fbeed5;
}
.panel-warning > .panel-heading + .panel-collapse .panel-body {
border-top-color: #fbeed5;
}
.panel-warning > .panel-footer + .panel-collapse .panel-body {
border-bottom-color: #fbeed5;
}
.panel-danger {
border-color: #eed3d7;
}
.panel-danger > .panel-heading {
color: #b94a48;
background-color: #f2dede;
border-color: #eed3d7;
}
.panel-danger > .panel-heading + .panel-collapse .panel-body {
border-top-color: #eed3d7;
}
.panel-danger > .panel-footer + .panel-collapse .panel-body {
border-bottom-color: #eed3d7;
}
.panel-info {
border-color: #bce8f1;
}
.panel-info > .panel-heading {
color: #3a87ad;
background-color: #d9edf7;
border-color: #bce8f1;
}
.panel-info > .panel-heading + .panel-collapse .panel-body {
border-top-color: #bce8f1;
}
.panel-info > .panel-footer + .panel-collapse .panel-body {
border-bottom-color: #bce8f1;
}
.well {
min-height: 20px;
padding: 19px;
margin-bottom: 20px;
background-color: #f5f5f5;
border: 1px solid #e3e3e3;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
}
.well blockquote {
border-color: #ddd;
border-color: rgba(0, 0, 0, 0.15);
}
.well-lg {
padding: 24px;
border-radius: 6px;
}
.well-sm {
padding: 9px;
border-radius: 3px;
}
.close {
float: right;
font-size: 21px;
font-weight: bold;
line-height: 1;
color: #000000;
text-shadow: 0 1px 0 #ffffff;
opacity: 0.2;
filter: alpha(opacity=20);
}
.close:hover,
.close:focus {
color: #000000;
text-decoration: none;
cursor: pointer;
opacity: 0.5;
filter: alpha(opacity=50);
}
button.close {
padding: 0;
cursor: pointer;
background: transparent;
border: 0;
-webkit-appearance: none;
}
.modal-open {
overflow: hidden;
}
body.modal-open,
.modal-open .navbar-fixed-top,
.modal-open .navbar-fixed-bottom {
margin-right: 15px;
}
.modal {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 1040;
display: none;
overflow: auto;
overflow-y: scroll;
}
.modal.fade .modal-dialog {
-webkit-transform: translate(0, -25%);
-ms-transform: translate(0, -25%);
transform: translate(0, -25%);
-webkit-transition: -webkit-transform 0.3s ease-out;
-moz-transition: -moz-transform 0.3s ease-out;
-o-transition: -o-transform 0.3s ease-out;
}
.modal.in .modal-dialog {
-webkit-transform: translate(0, 0);
-ms-transform: translate(0, 0);
transform: translate(0, 0);
}
.modal-dialog {
z-index: 1050;
width: auto;
padding: 10px;
margin-right: auto;
margin-left: auto;
}
.modal-content {
position: relative;
background-color: #ffffff;
border: 1px solid #999999;
border: 1px solid rgba(0, 0, 0, 0.2);
border-radius: 6px;
outline: none;
-webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
background-clip: padding-box;
}
.modal-backdrop {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 1030;
background-color: #000000;
}
.modal-backdrop.fade {
opacity: 0;
filter: alpha(opacity=0);
}
.modal-backdrop.in {
opacity: 0.5;
filter: alpha(opacity=50);
}
.modal-header {
min-height: 16.428571429px;
padding: 15px;
border-bottom: 1px solid #e5e5e5;
}
.modal-header .close {
margin-top: -2px;
}
.modal-title {
margin: 0;
line-height: 1.428571429;
}
.modal-body {
position: relative;
padding: 20px;
}
.modal-footer {
padding: 19px 20px 20px;
margin-top: 15px;
text-align: right;
border-top: 1px solid #e5e5e5;
}
.modal-footer:before,
.modal-footer:after {
display: table;
content: " ";
}
.modal-footer:after {
clear: both;
}
.modal-footer:before,
.modal-footer:after {
display: table;
content: " ";
}
.modal-footer:after {
clear: both;
}
.modal-footer .btn + .btn {
margin-bottom: 0;
margin-left: 5px;
}
.modal-footer .btn-group .btn + .btn {
margin-left: -1px;
}
.modal-footer .btn-block + .btn-block {
margin-left: 0;
}
@media screen and (min-width: 768px) {
.modal-dialog {
right: auto;
left: 50%;
width: 600px;
padding-top: 30px;
padding-bottom: 30px;
}
.modal-content {
-webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
}
}
.tooltip {
position: absolute;
z-index: 1030;
display: block;
font-size: 12px;
line-height: 1.4;
opacity: 0;
filter: alpha(opacity=0);
visibility: visible;
}
.tooltip.in {
opacity: 0.9;
filter: alpha(opacity=90);
}
.tooltip.top {
padding: 5px 0;
margin-top: -3px;
}
.tooltip.right {
padding: 0 5px;
margin-left: 3px;
}
.tooltip.bottom {
padding: 5px 0;
margin-top: 3px;
}
.tooltip.left {
padding: 0 5px;
margin-left: -3px;
}
.tooltip-inner {
max-width: 200px;
padding: 3px 8px;
color: #ffffff;
text-align: center;
text-decoration: none;
background-color: #000000;
border-radius: 4px;
}
.tooltip-arrow {
position: absolute;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
}
.tooltip.top .tooltip-arrow {
bottom: 0;
left: 50%;
margin-left: -5px;
border-top-color: #000000;
border-width: 5px 5px 0;
}
.tooltip.top-left .tooltip-arrow {
bottom: 0;
left: 5px;
border-top-color: #000000;
border-width: 5px 5px 0;
}
.tooltip.top-right .tooltip-arrow {
right: 5px;
bottom: 0;
border-top-color: #000000;
border-width: 5px 5px 0;
}
.tooltip.right .tooltip-arrow {
top: 50%;
left: 0;
margin-top: -5px;
border-right-color: #000000;
border-width: 5px 5px 5px 0;
}
.tooltip.left .tooltip-arrow {
top: 50%;
right: 0;
margin-top: -5px;
border-left-color: #000000;
border-width: 5px 0 5px 5px;
}
.tooltip.bottom .tooltip-arrow {
top: 0;
left: 50%;
margin-left: -5px;
border-bottom-color: #000000;
border-width: 0 5px 5px;
}
.tooltip.bottom-left .tooltip-arrow {
top: 0;
left: 5px;
border-bottom-color: #000000;
border-width: 0 5px 5px;
}
.tooltip.bottom-right .tooltip-arrow {
top: 0;
right: 5px;
border-bottom-color: #000000;
border-width: 0 5px 5px;
}
.popover {
position: absolute;
top: 0;
left: 0;
z-index: 1010;
display: none;
max-width: 276px;
padding: 1px;
text-align: left;
white-space: normal;
background-color: #ffffff;
border: 1px solid #cccccc;
border: 1px solid rgba(0, 0, 0, 0.2);
border-radius: 6px;
-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
background-clip: padding-box;
}
.popover.top {
margin-top: -10px;
}
.popover.right {
margin-left: 10px;
}
.popover.bottom {
margin-top: 10px;
}
.popover.left {
margin-left: -10px;
}
.popover-title {
padding: 8px 14px;
margin: 0;
font-size: 14px;
font-weight: normal;
line-height: 18px;
background-color: #f7f7f7;
border-bottom: 1px solid #ebebeb;
border-radius: 5px 5px 0 0;
}
.popover-content {
padding: 9px 14px;
}
.popover .arrow,
.popover .arrow:after {
position: absolute;
display: block;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
}
.popover .arrow {
border-width: 11px;
}
.popover .arrow:after {
border-width: 10px;
content: "";
}
.popover.top .arrow {
bottom: -11px;
left: 50%;
margin-left: -11px;
border-top-color: #999999;
border-top-color: rgba(0, 0, 0, 0.25);
border-bottom-width: 0;
}
.popover.top .arrow:after {
bottom: 1px;
margin-left: -10px;
border-top-color: #ffffff;
border-bottom-width: 0;
content: " ";
}
.popover.right .arrow {
top: 50%;
left: -11px;
margin-top: -11px;
border-right-color: #999999;
border-right-color: rgba(0, 0, 0, 0.25);
border-left-width: 0;
}
.popover.right .arrow:after {
bottom: -10px;
left: 1px;
border-right-color: #ffffff;
border-left-width: 0;
content: " ";
}
.popover.bottom .arrow {
top: -11px;
left: 50%;
margin-left: -11px;
border-bottom-color: #999999;
border-bottom-color: rgba(0, 0, 0, 0.25);
border-top-width: 0;
}
.popover.bottom .arrow:after {
top: 1px;
margin-left: -10px;
border-bottom-color: #ffffff;
border-top-width: 0;
content: " ";
}
.popover.left .arrow {
top: 50%;
right: -11px;
margin-top: -11px;
border-left-color: #999999;
border-left-color: rgba(0, 0, 0, 0.25);
border-right-width: 0;
}
.popover.left .arrow:after {
right: 1px;
bottom: -10px;
border-left-color: #ffffff;
border-right-width: 0;
content: " ";
}
.carousel {
position: relative;
}
.carousel-inner {
position: relative;
width: 100%;
overflow: hidden;
}
.carousel-inner > .item {
position: relative;
display: none;
-webkit-transition: 0.6s ease-in-out left;
transition: 0.6s ease-in-out left;
}
.carousel-inner > .item > img,
.carousel-inner > .item > a > img {
display: block;
height: auto;
max-width: 100%;
line-height: 1;
}
.carousel-inner > .active,
.carousel-inner > .next,
.carousel-inner > .prev {
display: block;
}
.carousel-inner > .active {
left: 0;
}
.carousel-inner > .next,
.carousel-inner > .prev {
position: absolute;
top: 0;
width: 100%;
}
.carousel-inner > .next {
left: 100%;
}
.carousel-inner > .prev {
left: -100%;
}
.carousel-inner > .next.left,
.carousel-inner > .prev.right {
left: 0;
}
.carousel-inner > .active.left {
left: -100%;
}
.carousel-inner > .active.right {
left: 100%;
}
.carousel-control {
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 15%;
font-size: 20px;
color: #ffffff;
text-align: center;
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
opacity: 0.5;
filter: alpha(opacity=50);
}
.carousel-control.left {
background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001)));
background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);
background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
}
.carousel-control.right {
right: 0;
left: auto;
background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5)));
background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);
background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
}
.carousel-control:hover,
.carousel-control:focus {
color: #ffffff;
text-decoration: none;
opacity: 0.9;
filter: alpha(opacity=90);
}
.carousel-control .icon-prev,
.carousel-control .icon-next,
.carousel-control .glyphicon-chevron-left,
.carousel-control .glyphicon-chevron-right {
position: absolute;
top: 50%;
left: 50%;
z-index: 5;
display: inline-block;
}
.carousel-control .icon-prev,
.carousel-control .icon-next {
width: 20px;
height: 20px;
margin-top: -10px;
margin-left: -10px;
font-family: serif;
}
.carousel-control .icon-prev:before {
content: '\2039';
}
.carousel-control .icon-next:before {
content: '\203a';
}
.carousel-indicators {
position: absolute;
bottom: 10px;
left: 50%;
z-index: 15;
width: 60%;
padding-left: 0;
margin-left: -30%;
text-align: center;
list-style: none;
}
.carousel-indicators li {
display: inline-block;
width: 10px;
height: 10px;
margin: 1px;
text-indent: -999px;
cursor: pointer;
border: 1px solid #ffffff;
border-radius: 10px;
}
.carousel-indicators .active {
width: 12px;
height: 12px;
margin: 0;
background-color: #ffffff;
}
.carousel-caption {
position: absolute;
right: 15%;
bottom: 20px;
left: 15%;
z-index: 10;
padding-top: 20px;
padding-bottom: 20px;
color: #ffffff;
text-align: center;
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
}
.carousel-caption .btn {
text-shadow: none;
}
@media screen and (min-width: 768px) {
.carousel-control .icon-prev,
.carousel-control .icon-next {
width: 30px;
height: 30px;
margin-top: -15px;
margin-left: -15px;
font-size: 30px;
}
.carousel-caption {
right: 20%;
left: 20%;
padding-bottom: 30px;
}
.carousel-indicators {
bottom: 20px;
}
}
.clearfix:before,
.clearfix:after {
display: table;
content: " ";
}
.clearfix:after {
clear: both;
}
.pull-right {
float: right !important;
}
.pull-left {
float: left !important;
}
.hide {
display: none !important;
}
.show {
display: block !important;
}
.invisible {
visibility: hidden;
}
.text-hide {
font: 0/0 a;
color: transparent;
text-shadow: none;
background-color: transparent;
border: 0;
}
.affix {
position: fixed;
}
@-ms-viewport {
width: device-width;
}
@media screen and (max-width: 400px) {
@-ms-viewport {
width: 320px;
}
}
.hidden {
display: none !important;
visibility: hidden !important;
}
.visible-xs {
display: none !important;
}
tr.visible-xs {
display: none !important;
}
th.visible-xs,
td.visible-xs {
display: none !important;
}
@media (max-width: 767px) {
.visible-xs {
display: block !important;
}
tr.visible-xs {
display: table-row !important;
}
th.visible-xs,
td.visible-xs {
display: table-cell !important;
}
}
@media (min-width: 768px) and (max-width: 991px) {
.visible-xs.visible-sm {
display: block !important;
}
tr.visible-xs.visible-sm {
display: table-row !important;
}
th.visible-xs.visible-sm,
td.visible-xs.visible-sm {
display: table-cell !important;
}
}
@media (min-width: 992px) and (max-width: 1199px) {
.visible-xs.visible-md {
display: block !important;
}
tr.visible-xs.visible-md {
display: table-row !important;
}
th.visible-xs.visible-md,
td.visible-xs.visible-md {
display: table-cell !important;
}
}
@media (min-width: 1200px) {
.visible-xs.visible-lg {
display: block !important;
}
tr.visible-xs.visible-lg {
display: table-row !important;
}
th.visible-xs.visible-lg,
td.visible-xs.visible-lg {
display: table-cell !important;
}
}
.visible-sm {
display: none !important;
}
tr.visible-sm {
display: none !important;
}
th.visible-sm,
td.visible-sm {
display: none !important;
}
@media (max-width: 767px) {
.visible-sm.visible-xs {
display: block !important;
}
tr.visible-sm.visible-xs {
display: table-row !important;
}
th.visible-sm.visible-xs,
td.visible-sm.visible-xs {
display: table-cell !important;
}
}
@media (min-width: 768px) and (max-width: 991px) {
.visible-sm {
display: block !important;
}
tr.visible-sm {
display: table-row !important;
}
th.visible-sm,
td.visible-sm {
display: table-cell !important;
}
}
@media (min-width: 992px) and (max-width: 1199px) {
.visible-sm.visible-md {
display: block !important;
}
tr.visible-sm.visible-md {
display: table-row !important;
}
th.visible-sm.visible-md,
td.visible-sm.visible-md {
display: table-cell !important;
}
}
@media (min-width: 1200px) {
.visible-sm.visible-lg {
display: block !important;
}
tr.visible-sm.visible-lg {
display: table-row !important;
}
th.visible-sm.visible-lg,
td.visible-sm.visible-lg {
display: table-cell !important;
}
}
.visible-md {
display: none !important;
}
tr.visible-md {
display: none !important;
}
th.visible-md,
td.visible-md {
display: none !important;
}
@media (max-width: 767px) {
.visible-md.visible-xs {
display: block !important;
}
tr.visible-md.visible-xs {
display: table-row !important;
}
th.visible-md.visible-xs,
td.visible-md.visible-xs {
display: table-cell !important;
}
}
@media (min-width: 768px) and (max-width: 991px) {
.visible-md.visible-sm {
display: block !important;
}
tr.visible-md.visible-sm {
display: table-row !important;
}
th.visible-md.visible-sm,
td.visible-md.visible-sm {
display: table-cell !important;
}
}
@media (min-width: 992px) and (max-width: 1199px) {
.visible-md {
display: block !important;
}
tr.visible-md {
display: table-row !important;
}
th.visible-md,
td.visible-md {
display: table-cell !important;
}
}
@media (min-width: 1200px) {
.visible-md.visible-lg {
display: block !important;
}
tr.visible-md.visible-lg {
display: table-row !important;
}
th.visible-md.visible-lg,
td.visible-md.visible-lg {
display: table-cell !important;
}
}
.visible-lg {
display: none !important;
}
tr.visible-lg {
display: none !important;
}
th.visible-lg,
td.visible-lg {
display: none !important;
}
@media (max-width: 767px) {
.visible-lg.visible-xs {
display: block !important;
}
tr.visible-lg.visible-xs {
display: table-row !important;
}
th.visible-lg.visible-xs,
td.visible-lg.visible-xs {
display: table-cell !important;
}
}
@media (min-width: 768px) and (max-width: 991px) {
.visible-lg.visible-sm {
display: block !important;
}
tr.visible-lg.visible-sm {
display: table-row !important;
}
th.visible-lg.visible-sm,
td.visible-lg.visible-sm {
display: table-cell !important;
}
}
@media (min-width: 992px) and (max-width: 1199px) {
.visible-lg.visible-md {
display: block !important;
}
tr.visible-lg.visible-md {
display: table-row !important;
}
th.visible-lg.visible-md,
td.visible-lg.visible-md {
display: table-cell !important;
}
}
@media (min-width: 1200px) {
.visible-lg {
display: block !important;
}
tr.visible-lg {
display: table-row !important;
}
th.visible-lg,
td.visible-lg {
display: table-cell !important;
}
}
.hidden-xs {
display: block !important;
}
tr.hidden-xs {
display: table-row !important;
}
th.hidden-xs,
td.hidden-xs {
display: table-cell !important;
}
@media (max-width: 767px) {
.hidden-xs {
display: none !important;
}
tr.hidden-xs {
display: none !important;
}
th.hidden-xs,
td.hidden-xs {
display: none !important;
}
}
@media (min-width: 768px) and (max-width: 991px) {
.hidden-xs.hidden-sm {
display: none !important;
}
tr.hidden-xs.hidden-sm {
display: none !important;
}
th.hidden-xs.hidden-sm,
td.hidden-xs.hidden-sm {
display: none !important;
}
}
@media (min-width: 992px) and (max-width: 1199px) {
.hidden-xs.hidden-md {
display: none !important;
}
tr.hidden-xs.hidden-md {
display: none !important;
}
th.hidden-xs.hidden-md,
td.hidden-xs.hidden-md {
display: none !important;
}
}
@media (min-width: 1200px) {
.hidden-xs.hidden-lg {
display: none !important;
}
tr.hidden-xs.hidden-lg {
display: none !important;
}
th.hidden-xs.hidden-lg,
td.hidden-xs.hidden-lg {
display: none !important;
}
}
.hidden-sm {
display: block !important;
}
tr.hidden-sm {
display: table-row !important;
}
th.hidden-sm,
td.hidden-sm {
display: table-cell !important;
}
@media (max-width: 767px) {
.hidden-sm.hidden-xs {
display: none !important;
}
tr.hidden-sm.hidden-xs {
display: none !important;
}
th.hidden-sm.hidden-xs,
td.hidden-sm.hidden-xs {
display: none !important;
}
}
@media (min-width: 768px) and (max-width: 991px) {
.hidden-sm {
display: none !important;
}
tr.hidden-sm {
display: none !important;
}
th.hidden-sm,
td.hidden-sm {
display: none !important;
}
}
@media (min-width: 992px) and (max-width: 1199px) {
.hidden-sm.hidden-md {
display: none !important;
}
tr.hidden-sm.hidden-md {
display: none !important;
}
th.hidden-sm.hidden-md,
td.hidden-sm.hidden-md {
display: none !important;
}
}
@media (min-width: 1200px) {
.hidden-sm.hidden-lg {
display: none !important;
}
tr.hidden-sm.hidden-lg {
display: none !important;
}
th.hidden-sm.hidden-lg,
td.hidden-sm.hidden-lg {
display: none !important;
}
}
.hidden-md {
display: block !important;
}
tr.hidden-md {
display: table-row !important;
}
th.hidden-md,
td.hidden-md {
display: table-cell !important;
}
@media (max-width: 767px) {
.hidden-md.hidden-xs {
display: none !important;
}
tr.hidden-md.hidden-xs {
display: none !important;
}
th.hidden-md.hidden-xs,
td.hidden-md.hidden-xs {
display: none !important;
}
}
@media (min-width: 768px) and (max-width: 991px) {
.hidden-md.hidden-sm {
display: none !important;
}
tr.hidden-md.hidden-sm {
display: none !important;
}
th.hidden-md.hidden-sm,
td.hidden-md.hidden-sm {
display: none !important;
}
}
@media (min-width: 992px) and (max-width: 1199px) {
.hidden-md {
display: none !important;
}
tr.hidden-md {
display: none !important;
}
th.hidden-md,
td.hidden-md {
display: none !important;
}
}
@media (min-width: 1200px) {
.hidden-md.hidden-lg {
display: none !important;
}
tr.hidden-md.hidden-lg {
display: none !important;
}
th.hidden-md.hidden-lg,
td.hidden-md.hidden-lg {
display: none !important;
}
}
.hidden-lg {
display: block !important;
}
tr.hidden-lg {
display: table-row !important;
}
th.hidden-lg,
td.hidden-lg {
display: table-cell !important;
}
@media (max-width: 767px) {
.hidden-lg.hidden-xs {
display: none !important;
}
tr.hidden-lg.hidden-xs {
display: none !important;
}
th.hidden-lg.hidden-xs,
td.hidden-lg.hidden-xs {
display: none !important;
}
}
@media (min-width: 768px) and (max-width: 991px) {
.hidden-lg.hidden-sm {
display: none !important;
}
tr.hidden-lg.hidden-sm {
display: none !important;
}
th.hidden-lg.hidden-sm,
td.hidden-lg.hidden-sm {
display: none !important;
}
}
@media (min-width: 992px) and (max-width: 1199px) {
.hidden-lg.hidden-md {
display: none !important;
}
tr.hidden-lg.hidden-md {
display: none !important;
}
th.hidden-lg.hidden-md,
td.hidden-lg.hidden-md {
display: none !important;
}
}
@media (min-width: 1200px) {
.hidden-lg {
display: none !important;
}
tr.hidden-lg {
display: none !important;
}
th.hidden-lg,
td.hidden-lg {
display: none !important;
}
}
.visible-print {
display: none !important;
}
tr.visible-print {
display: none !important;
}
th.visible-print,
td.visible-print {
display: none !important;
}
@media print {
.visible-print {
display: block !important;
}
tr.visible-print {
display: table-row !important;
}
th.visible-print,
td.visible-print {
display: table-cell !important;
}
.hidden-print {
display: none !important;
}
tr.hidden-print {
display: none !important;
}
th.hidden-print,
td.hidden-print {
display: none !important;
}
}
d3.tip=function(){function t(t){v=d(t),w=v.createSVGPoint(),document.body.appendChild(g)}function e(){return"n"}function n(){return[0,0]}function r(){return" "}function o(){var t=y();return{top:t.n.y-g.offsetHeight,left:t.n.x-g.offsetWidth/2}}function s(){var t=y();return{top:t.s.y,left:t.s.x-g.offsetWidth/2}}function u(){var t=y();return{top:t.e.y-g.offsetHeight/2,left:t.e.x}}function f(){var t=y();return{top:t.w.y-g.offsetHeight/2,left:t.w.x-g.offsetWidth}}function l(){var t=y();return{top:t.nw.y-g.offsetHeight,left:t.nw.x-g.offsetWidth}}function i(){var t=y();return{top:t.ne.y-g.offsetHeight,left:t.ne.x}}function a(){var t=y();return{top:t.sw.y,left:t.sw.x-g.offsetWidth}}function c(){var t=y();return{top:t.se.y,left:t.e.x}}function m(){var t=document.createElement("div");return t.style.position="absolute",t.style.display="none",t.style.boxSizing="border-box",t}function d(t){return t=t.node(),"svg"==t.tagName.toLowerCase()?t:t.ownerSVGElement}function y(){var t=d3.event.target,e={},n=t.getScreenCTM(),r=t.getBBox(),o=r.width,s=r.height,u=r.x,f=r.y,l=document.body.scrollTop,i=document.body.scrollLeft;return document.documentElement&&document.documentElement.scrollTop&&(l=document.documentElement.scrollTop,i=document.documentElement.scrollLeft),w.x=u+i,w.y=f+l,e.nw=w.matrixTransform(n),w.x+=o,e.ne=w.matrixTransform(n),w.y+=s,e.se=w.matrixTransform(n),w.x-=o,e.sw=w.matrixTransform(n),w.y-=s/2,e.w=w.matrixTransform(n),w.x+=o,e.e=w.matrixTransform(n),w.x-=o/2,w.y-=s/2,e.n=w.matrixTransform(n),w.y+=s,e.s=w.matrixTransform(n),e}var p=e,h=n,x=r,g=m(),v=null,w=null;t.show=function(){var e,n=x.apply(this,arguments),r=h.apply(this,arguments),o=p.apply(this,arguments),s=d3.select(g),u=0;for(s.html(n).style("display","block");u--;)s.classed(b[u],!1);return e=T.get(o).apply(this),s.classed(o,!0).style({top:e.top+r[0]+"px",left:e.left+r[1]+"px"}),t},t.hide=function(){return g.style.display="none",g.innerHTML="",t},t.attr=function(e,n){return arguments.length<2?d3.select(g).attr(e):(d3.select(g).attr(e,n),t)},t.style=function(e,n){return arguments.length<2?d3.select(g).style(e):(d3.select(g).style(e,n),t)},t.direction=function(e){return arguments.length?(p=null==e?e:d3.functor(e),t):p},t.offset=function(e){return arguments.length?(h=null==e?e:d3.functor(e),t):h},t.html=function(e){return arguments.length?(x=null==e?e:d3.functor(e),t):x};var T=d3.map({n:o,s:s,e:u,w:f,nw:l,ne:i,sw:a,se:c}),b=T.keys();return t};
div.dc-chart {
float: left;
}
.dc-chart rect.bar {
stroke: none;
cursor: pointer;
}
.dc-chart rect.bar:hover {
fill-opacity: .5;
}
.dc-chart rect.stack1 {
stroke: none;
fill: red;
}
.dc-chart rect.stack2 {
stroke: none;
fill: green;
}
.dc-chart rect.deselected {
stroke: none;
fill: #ccc;
}
.dc-chart .pie-slice {
fill: #eee;
font-size: 16px;
cursor: pointer;
}
.dc-chart .pie-slice.external{
fill: black;
}
.dc-chart .pie-slice :hover {
fill-opacity: .8;
}
.dc-chart .pie-slice.highlight {
fill-opacity: .8;
}
.dc-chart .selected path {
stroke-width: 3;
stroke: #ccc;
fill-opacity: 1;
}
.dc-chart .deselected path {
stroke: none;
fill-opacity: .5;
fill: #ccc;
}
.dc-chart .axis path, .axis line {
fill: none;
stroke: #ddd;
shape-rendering: crispEdges;
}
.dc-chart .axis text {
font: 12px sans-serif;
fill: #525252;
}
.dc-chart .grid-line {
fill: none;
stroke: #ccc;
opacity: .5;
shape-rendering: crispEdges;
}
.dc-chart .grid-line line {
fill: none;
stroke: #ccc;
opacity: .5;
shape-rendering: crispEdges;
}
.dc-chart .brush rect.background {
z-index: -999;
}
.dc-chart .brush rect.extent {
fill: steelblue;
fill-opacity: .125;
}
.dc-chart .brush .resize path {
fill: #eee;
stroke: #666;
}
.dc-chart path.line {
fill: none;
stroke-width: 4px;
stroke-opacity: .8
}
.dc-chart circle.dot {
stroke: none;
}
.dc-chart g.dc-tooltip path {
fill: none;
stroke: grey;
stroke-opacity: .6;
}
.dc-chart path.area {
fill-opacity: .3;
stroke: none;
}
.dc-chart .node {
font-size: 0.7em;
cursor: pointer;
}
.dc-chart .node :hover {
fill-opacity: .8;
}
.dc-chart .selected circle {
stroke-width: 3;
stroke: #ccc;
fill-opacity: 1;
}
.dc-chart .deselected circle {
stroke: none;
fill-opacity: .5;
fill: #ccc;
}
.dc-chart .bubble {
stroke: none;
fill-opacity: 0.6;
}
.dc-data-count {
float: right;
margin-top: 15px;
margin-right: 15px;
}
.dc-data-count .filter-count {
color: #cc4c02;
font-weight: bold;
}
.dc-data-count .total-count {
color: #3182bd;
font-weight: bold;
}
.dc-data-table {
}
.dc-chart g.state {
cursor: pointer;
}
.dc-chart g.state :hover {
fill-opacity: .8;
}
.dc-chart g.state path {
stroke: white;
}
.dc-chart g.selected path {
}
.dc-chart g.deselected path {
fill: grey;
}
.dc-chart g.selected text {
}
.dc-chart g.deselected text {
display: none;
}
.dc-chart g.county path {
stroke: white;
}
.dc-chart g.debug rect {
fill: blue;
fill-opacity: .2;
}
.dc-chart g.row rect {
fill-opacity: 0.8;
cursor: pointer;
}
.dc-chart g.row rect:hover {
fill-opacity: 0.6;
}
.dc-chart g.row text {
fill: #525252;
font-size: 12px;
cursor: pointer;
text-anchor: end;
}
.dc-legend {
font-size: 11px;
}
.dc-legend-item {
cursor: pointer;
}
.dc-chart g.axis text {
/* Makes it so the user can't accidentally click and select text that is meant as a label only */
-webkit-user-select: none; /* Chrome/Safari */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* IE10 */
-o-user-select: none;
user-select: none;
pointer-events: none;
}
.dc-chart path.highlight {
stroke-width: 3;
fill-opacity: 1;
stroke-opacity: 1;
}
.dc-chart .highlight {
fill-opacity: 1;
stroke-opacity: 1;
}
.dc-chart .fadeout {
fill-opacity: 0.2;
stroke-opacity: 0.2;
}
.dc-chart path.dc-symbol, g.dc-legend-item.fadeout {
fill-opacity: 0.5;
stroke-opacity: 0.5;
}
.dc-hard .number-display {
float: none;
}
.dc-chart .box text {
font: 10px sans-serif;
-webkit-user-select: none; /* Chrome/Safari */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* IE10 */
-o-user-select: none;
user-select: none;
pointer-events: none;
}
.dc-chart .box line,
.dc-chart .box circle {
fill: #fff;
stroke: #000;
stroke-width: 1.5px;
}
.dc-chart .box rect {
stroke: #000;
stroke-width: 1.5px;
}
.dc-chart .box .center {
stroke-dasharray: 3,3;
}
.dc-chart .box .outlier {
fill: none;
stroke: #ccc;
}
.dc-chart .box.deselected .box {
fill: #ccc;
}
.dc-chart .box.deselected {
opacity: .5;
}
.dc-chart .symbol{
stroke: none;
}
.dc-chart .heatmap .box-group.deselected rect {
stroke: none;
fill-opacity: .5;
fill: #ccc;
}
.dc-chart .heatmap g.axis text {
pointer-events: all;
cursor: pointer;
}
.dc-table-label {
font-weight: bold;
color: steelblue;
border-top-width: 3px;
font-size: 20px;
}
.dc-table-column._1 {
text-align: left;
}
/*!
* dc 2.0.0-dev
* http://dc-js.github.io/dc.js/
* Copyright 2012 Nick Zhu and other contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
dc = (function(){
'use strict';
/**
#### Version 2.0.0-dev
The entire dc.js library is scoped under **dc** name space. It does not introduce anything else into the global
name space.
#### Function Chain
Majority of dc functions are designed to allow function chaining, meaning it will return the current chart instance
whenever it is appropriate. Therefore configuration of a chart can be written in the following style.
```js
chart.width(300)
.height(300)
.filter("sunday")
```
The API references will highlight the fact if a particular function is not chainable.
**/
var dc = {
version: "2.0.0-dev",
constants: {
CHART_CLASS: "dc-chart",
DEBUG_GROUP_CLASS: "debug",
STACK_CLASS: "stack",
DESELECTED_CLASS: "deselected",
SELECTED_CLASS: "selected",
NODE_INDEX_NAME: "__index__",
GROUP_INDEX_NAME: "__group_index__",
DEFAULT_CHART_GROUP: "__default_chart_group__",
EVENT_DELAY: 40,
NEGLIGIBLE_NUMBER: 1e-10
},
_renderlet: null
};
dc.chartRegistry = function() {
// chartGroup:string => charts:array
var _chartMap = {};
function initializeChartGroup(group) {
if (!group)
group = dc.constants.DEFAULT_CHART_GROUP;
if (!_chartMap[group])
_chartMap[group] = [];
return group;
}
return {
has: function(chart) {
for (var e in _chartMap) {
if (_chartMap[e].indexOf(chart) >= 0)
return true;
}
return false;
},
register: function(chart, group) {
group = initializeChartGroup(group);
_chartMap[group].push(chart);
},
deregister: function (chart, group) {
group = initializeChartGroup(group);
for (var i = 0; i < _chartMap[group].length; i++) {
if (_chartMap[group][i].anchorName() === chart.anchorName()) {
_chartMap[group].splice(i, 1);
break;
}
}
},
clear: function(group) {
if (group) {
delete _chartMap[group];
} else {
_chartMap = {};
}
},
list: function(group) {
group = initializeChartGroup(group);
return _chartMap[group];
}
};
}();
dc.registerChart = function(chart, group) {
dc.chartRegistry.register(chart, group);
};
dc.deregisterChart = function (chart, group) {
dc.chartRegistry.deregister(chart, group);
};
dc.hasChart = function(chart) {
return dc.chartRegistry.has(chart);
};
dc.deregisterAllCharts = function(group) {
dc.chartRegistry.clear(group);
};
/**
## Utilities
**/
/**
#### dc.filterAll([chartGroup])
Clear all filters on every chart within the given chart group. If the chart group is not given then only charts that
belong to the default chart group will be reset.
**/
dc.filterAll = function(group) {
var charts = dc.chartRegistry.list(group);
for (var i = 0; i < charts.length; ++i) {
charts[i].filterAll();
}
};
/**
#### dc.refocusAll([chartGroup])
Reset zoom level / focus on all charts that belong to the given chart group. If the chart group is not given then only charts that belong to
the default chart group will be reset.
**/
dc.refocusAll = function(group) {
var charts = dc.chartRegistry.list(group);
for (var i = 0; i < charts.length; ++i) {
if (charts[i].focus) charts[i].focus();
}
};
/**
#### dc.renderAll([chartGroup])
Re-render all charts belong to the given chart group. If the chart group is not given then only charts that belong to
the default chart group will be re-rendered.
**/
dc.renderAll = function(group) {
var charts = dc.chartRegistry.list(group);
for (var i = 0; i < charts.length; ++i) {
charts[i].render();
}
if(dc._renderlet !== null)
dc._renderlet(group);
};
/**
#### dc.redrawAll([chartGroup])
Redraw all charts belong to the given chart group. If the chart group is not given then only charts that belong to the
default chart group will be re-drawn. Redraw is different from re-render since when redrawing dc charts try to update
the graphic incrementally instead of starting from scratch.
**/
dc.redrawAll = function(group) {
var charts = dc.chartRegistry.list(group);
for (var i = 0; i < charts.length; ++i) {
charts[i].redraw();
}
if(dc._renderlet !== null)
dc._renderlet(group);
};
dc.disableTransitions = false;
dc.transition = function(selections, duration, callback) {
if (duration <= 0 || duration === undefined || dc.disableTransitions)
return selections;
var s = selections
.transition()
.duration(duration);
if (typeof(callback) === 'function') {
callback(s);
}
return s;
};
dc.units = {};
/**
#### dc.units.integers
This function can be used to in [Coordinate Grid Chart](#coordinate-grid-chart) to define units on x axis.
dc.units.integers is the default x unit scale used by [Coordinate Grid Chart](#coordinate-grid-chart) and should be
used when x range is a sequential of integers.
**/
dc.units.integers = function(s, e) {
return Math.abs(e - s);
};
/**
#### dc.units.ordinal
This function can be used to in [Coordinate Grid Chart](#coordinate-grid-chart) to define ordinal units on x axis.
Usually this function is used in combination with d3.scale.ordinal() on x axis.
**/
dc.units.ordinal = function(s, e, domain){
return domain;
};
/**
#### dc.units.fp.precision(precision)
This function generates xunit function in floating-point numbers with the given precision. For example if the function
is invoked with 0.001 precision then the function created will divide a range [0.5, 1.0] with 500 units.
**/
dc.units.fp = {};
dc.units.fp.precision = function(precision){
var _f = function(s, e){
var d = Math.abs((e-s)/_f.resolution);
if(dc.utils.isNegligible(d - Math.floor(d)))
return Math.floor(d);
else
return Math.ceil(d);
};
_f.resolution = precision;
return _f;
};
dc.round = {};
dc.round.floor = function(n) {
return Math.floor(n);
};
dc.round.ceil = function(n) {
return Math.ceil(n);
};
dc.round.round = function(n) {
return Math.round(n);
};
dc.override = function(obj, functionName, newFunction) {
var existingFunction = obj[functionName];
obj["_" + functionName] = existingFunction;
obj[functionName] = newFunction;
};
dc.renderlet = function(_){
if(!arguments.length) return dc._renderlet;
dc._renderlet = _;
return dc;
};
dc.instanceOfChart = function (o) {
return o instanceof Object && o.__dc_flag__ && true;
};
dc.errors = {};
dc.errors.Exception = function(msg) {
var _msg = msg || "Unexpected internal error";
this.message = _msg;
this.toString = function(){
return _msg;
};
};
dc.errors.InvalidStateException = function() {
dc.errors.Exception.apply(this, arguments);
};
dc.dateFormat = d3.time.format("%m/%d/%Y");
dc.printers = {};
dc.printers.filters = function (filters) {
var s = "";
for (var i = 0; i < filters.length; ++i) {
if (i > 0) s += ", ";
s += dc.printers.filter(filters[i]);
}
return s;
};
dc.printers.filter = function (filter) {
var s = "";
if (filter) {
if (filter instanceof Array) {
if (filter.length >= 2)
s = "[" + dc.utils.printSingleValue(filter[0]) + " -> " + dc.utils.printSingleValue(filter[1]) + "]";
else if (filter.length >= 1)
s = dc.utils.printSingleValue(filter[0]);
} else {
s = dc.utils.printSingleValue(filter);
}
}
return s;
};
dc.pluck = function(n,f) {
if (!f) return function(d) { return d[n]; };
return function(d,i) { return f.call(d,d[n],i); };
};
dc.utils = {};
dc.utils.printSingleValue = function (filter) {
var s = "" + filter;
if (filter instanceof Date)
s = dc.dateFormat(filter);
else if (typeof(filter) == "string")
s = filter;
else if (dc.utils.isFloat(filter))
s = dc.utils.printSingleValue.fformat(filter);
else if (dc.utils.isInteger(filter))
s = Math.round(filter);
return s;
};
dc.utils.printSingleValue.fformat = d3.format(".2f");
dc.utils.add = function (l, r) {
if (typeof r === "string")
r = r.replace("%", "");
if (l instanceof Date) {
if (typeof r === "string") r = +r;
var d = new Date();
d.setTime(l.getTime());
d.setDate(l.getDate() + r);
return d;
} else if (typeof r === "string") {
var percentage = (+r / 100);
return l > 0 ? l * (1 + percentage) : l * (1 - percentage);
} else {
return l + r;
}
};
dc.utils.subtract = function (l, r) {
if (typeof r === "string")
r = r.replace("%", "");
if (l instanceof Date) {
if (typeof r === "string") r = +r;
var d = new Date();
d.setTime(l.getTime());
d.setDate(l.getDate() - r);
return d;
} else if (typeof r === "string") {
var percentage = (+r / 100);
return l < 0 ? l * (1 + percentage) : l * (1 - percentage);
} else {
return l - r;
}
};
dc.utils.isNumber = function(n) {
return n===+n;
};
dc.utils.isFloat = function (n) {
return n===+n && n!==(n|0);
};
dc.utils.isInteger = function (n) {
return n===+n && n===(n|0);
};
dc.utils.isNegligible = function (n) {
return !dc.utils.isNumber(n) || (n < dc.constants.NEGLIGIBLE_NUMBER && n > -dc.constants.NEGLIGIBLE_NUMBER);
};
dc.utils.clamp = function (val, min, max) {
return val < min ? min : (val > max ? max : val);
};
var _idCounter = 0;
dc.utils.uniqueId = function () {
return ++_idCounter;
};
dc.utils.nameToId = function (name) {
return name.toLowerCase().replace(/[\s]/g, "_").replace(/[\.']/g, "");
};
dc.utils.appendOrSelect = function (parent, name) {
var element = parent.select(name);
if (element.empty()) element = parent.append(name);
return element;
};
dc.utils.safeNumber = function(n){return dc.utils.isNumber(+n)?+n:0;};
dc.logger = {};
dc.logger.enableDebugLog = false;
dc.logger.warn = function (msg) {
if (console) {
if (console.warn) {
console.warn(msg);
} else if (console.log) {
console.log(msg);
}
}
return dc.logger;
};
dc.logger.debug = function (msg) {
if (dc.logger.enableDebugLog && console) {
if (console.debug) {
console.debug(msg);
} else if (console.log) {
console.log(msg);
}
}
return dc.logger;
};
dc.events = {
current: null
};
/**
#### dc.events.trigger(function[, delay])
This function is design to trigger throttled event function optionally with certain amount of delay(in milli-seconds).
Events that are triggered repetitively due to user interaction such as the dragging of the brush might over flood
library and cause too much rendering being scheduled. In this case, using this function to wrap your event function
allows the library to smooth out the rendering by throttling event flood and only respond to the most recent event.
```js
chart.renderlet(function(chart){
// smooth the rendering through event throttling
dc.events.trigger(function(){
// focus some other chart to the range selected by user on this chart
someOtherChart.focus(chart.filter());
});
})
```
**/
dc.events.trigger = function(closure, delay) {
if (!delay){
closure();
return;
}
dc.events.current = closure;
setTimeout(function() {
if (closure == dc.events.current)
closure();
}, delay);
};
dc.filters = {};
dc.filters.RangedFilter = function(low, high) {
var range = Array(low, high);
range.isFiltered = function(value) {
return value >= this[0] && value < this[1];
};
return range;
};
dc.filters.TwoDimensionalFilter = function(array) {
if (array === null) { return null; }
var filter = array;
filter.isFiltered = function(value) {
return value.length && value.length == filter.length &&
value[0] == filter[0] && value[1] == filter[1];
};
return filter;
};
/**
* @param array in the form [[x1,y1],[x2,y2]]
*/
dc.filters.RangedTwoDimensionalFilter = function(array){
if (array === null) { return null; }
var filter = array;
var fromBottomLeft;
if (filter[0] instanceof Array) {
fromBottomLeft = [[Math.min(array[0][0], array[1][0]),
Math.min(array[0][1], array[1][1])],
[Math.max(array[0][0], array[1][0]),
Math.max(array[0][1], array[1][1])]];
} else {
fromBottomLeft = [[array[0], -Infinity],
[array[1], Infinity]];
}
filter.isFiltered = function(value) {
var x, y;
if (value instanceof Array) {
if (value.length != 2) return false;
x = value[0];
y = value[1];
} else {
x = value;
y = fromBottomLeft[0][1];
}
return x >= fromBottomLeft[0][0] && x < fromBottomLeft[1][0] &&
y >= fromBottomLeft[0][1] && y < fromBottomLeft[1][1];
};
return filter;
};
/**
## Base Mixin
Base Mixin is an abstract functional object representing a basic dc chart object
for all chart and widget implementations. Methods from the Base Mixin are inherited
and available on all chart implementation in the DC library.
**/
dc.baseMixin = function (_chart) {
_chart.__dc_flag__ = dc.utils.uniqueId();
var _dimension;
var _group;
var _anchor;
var _root;
var _svg;
var _minWidth = 200;
var _default_width = function (element) {
var width = element && element.getBoundingClientRect && element.getBoundingClientRect().width;
return (width && width > _minWidth) ? width : _minWidth;
};
var _width = _default_width;
var _minHeight = 200;
var _default_height = function (element) {
var height = element && element.getBoundingClientRect && element.getBoundingClientRect().height;
return (height && height > _minHeight) ? height : _minHeight;
};
var _height = _default_height;
var _keyAccessor = dc.pluck('key');
var _valueAccessor = dc.pluck('value');
var _label = dc.pluck('key');
var _ordering = dc.pluck('key');
var _orderSort;
var _renderLabel = false;
var _title = function (d) {
return _chart.keyAccessor()(d) + ": " + _chart.valueAccessor()(d);
};
var _renderTitle = false;
var _transitionDuration = 750;
var _filterPrinter = dc.printers.filters;
var _renderlets = [];
var _mandatoryAttributes = ['dimension', 'group'];
var _chartGroup = dc.constants.DEFAULT_CHART_GROUP;
var NULL_LISTENER = function () {};
var _listeners = {
preRender: NULL_LISTENER,
postRender: NULL_LISTENER,
preRedraw: NULL_LISTENER,
postRedraw: NULL_LISTENER,
filtered: NULL_LISTENER,
zoomed: NULL_LISTENER
};
var _legend;
var _filters = [];
var _filterHandler = function (dimension, filters) {
dimension.filter(null);
if (filters.length === 0)
dimension.filter(null);
else
dimension.filterFunction(function (d) {
for(var i = 0; i < filters.length; i++) {
var filter = filters[i];
if (filter.isFiltered && filter.isFiltered(d)) {
return true;
} else if (filter == d) {
return true;
}
}
return false;
});
return filters;
};
var _data = function (group) {
return group.all();
};
/**
#### .width([value])
Set or get width attribute of a chart. See `.height` below for further description of the behavior.
**/
_chart.width = function (w) {
if (!arguments.length) return _width(_root.node());
_width = d3.functor(w || _default_width);
return _chart;
};
/**
#### .height([value])
Set or get height attribute of a chart. The height is applied to the SVG element
generated by the chart when rendered (or rerendered). If a value is given, then it
will be used to calculate the new height and the chart returned for method chaining.
The value can either be a numeric, a function, or falsy. If no value specified then
value of the current height attribute will be returned.
By default, without an explicit height being given, the chart will select the width
of its anchor element. If that isn't possible it defaults to 200;
Examples:
```js
chart.height(250); // Set the chart's height to 250px;
chart.height(function(anchor) { return doSomethingWith(anchor); }); // set the chart's height with a function
chart.height(null); // reset the height to the default auto calculation
```
**/
_chart.height = function (h) {
if (!arguments.length) return _height(_root.node());
_height = d3.functor(h || _default_height);
return _chart;
};
/**
#### .minWidth([value])
Set or get minimum width attribute of a chart. This only applicable if the width is calculated by DC.
**/
_chart.minWidth = function (w) {
if (!arguments.length) return _minWidth;
_minWidth = w;
return _chart;
};
/**
#### .minHeight([value])
Set or get minimum height attribute of a chart. This only applicable if the height is calculated by DC.
**/
_chart.minHeight = function (w) {
if (!arguments.length) return _minHeight;
_minHeight = w;
return _chart;
};
/**
#### .dimension([value]) - **mandatory**
Set or get dimension attribute of a chart. In dc a dimension can be any valid
[crossfilter dimension](https://github.com/square/crossfilter/wiki/API-Reference#wiki-dimension). If the value is given,
then it will be used as the new dimension.
If no value specified then the current dimension will be returned.
**/
_chart.dimension = function (d) {
if (!arguments.length) return _dimension;
_dimension = d;
_chart.expireCache();
return _chart;
};
/**
#### .data([callback])
Get the data callback or retreive the charts data set. The data callback is passed the chart's group and by default
will return `group.all()`. This behavior may be modified to, for instance, return only the top 5 groups:
```
chart.data(function(group) {
return group.top(5);
});
```
**/
_chart.data = function(d) {
if (!arguments.length) return _data.call(_chart,_group);
_data = d3.functor(d);
_chart.expireCache();
return _chart;
};
/**
#### .group([value, [name]]) - **mandatory**
Set or get group attribute of a chart. In dc a group is a
[crossfilter group](https://github.com/square/crossfilter/wiki/API-Reference#wiki-group). Usually the group should be
created from the particular dimension associated with the same chart. If the value is given, then it will be used as
the new group.
If no value specified then the current group will be returned.
If name is specified then it will be used to generate legend label.
**/
_chart.group = function (g, name) {
if (!arguments.length) return _group;
_group = g;
_chart._groupName = name;
_chart.expireCache();
return _chart;
};
/**
#### .ordering([orderFunction])
Get or set an accessor to order ordinal charts
**/
_chart.ordering = function(o) {
if (!arguments.length) return _ordering;
_ordering = o;
_orderSort = crossfilter.quicksort.by(_ordering);
_chart.expireCache();
return _chart;
};
_chart._computeOrderedGroups = function(data) {
if (data.length <= 1)
return data;
if (!_orderSort) _orderSort = crossfilter.quicksort.by(_ordering);
return _orderSort(data,0,data.length);
};
/**
#### .filterAll()
Clear all filters associated with this chart.
**/
_chart.filterAll = function () {
return _chart.filter(null);
};
/**
#### .select(selector)
Execute in scope d3 single selection using the given selector and return d3 selection result. Roughly the same as:
```js
d3.select("#chart-id").select(selector);
```
This function is **not chainable** since it does not return a chart instance; however the d3 selection result is chainable
from d3's perspective.
**/
_chart.select = function (s) {
return _root.select(s);
};
/**
#### .selectAll(selector)
Execute in scope d3 selectAll using the given selector and return d3 selection result. Roughly the same as:
```js
d3.select("#chart-id").selectAll(selector);
```
This function is **not chainable** since it does not return a chart instance; however the d3 selection result is
chainable from d3's perspective.
**/
_chart.selectAll = function (s) {
return _root ? _root.selectAll(s) : null;
};
/**
#### .anchor([anchorChart/anchorSelector], [chartGroup])
Set the svg root to either be an existing chart's root or the first element returned from a d3 css string selector. Optionally registers the chart within the chartGroup. This class is called internally on chart initialization, but be called again to relocate the chart. However, it will orphan any previously created SVG elements.
**/
_chart.anchor = function (a, chartGroup) {
if (!arguments.length) return _anchor;
if (dc.instanceOfChart(a)) {
_anchor = a.anchor();
_root = a.root();
} else {
_anchor = a;
_root = d3.select(_anchor);
_root.classed(dc.constants.CHART_CLASS, true);
dc.registerChart(_chart, chartGroup);
}
_chartGroup = chartGroup;
return _chart;
};
/**
#### .anchorName()
Return the dom ID for chart's anchored location
**/
_chart.anchorName = function () {
var a = _chart.anchor();
if (a && a.id) return a.id;
if (a && a.replace) return a.replace('#','');
return "" + _chart.chartID();
};
/**
#### .root([rootElement])
Returns the root element where a chart resides. Usually it will be the parent div element where svg was created. You
can also pass in a new root element however this is usually handled as part of the dc internal. Resetting root element
on a chart outside of dc internal might have unexpected consequences.
**/
_chart.root = function (r) {
if (!arguments.length) return _root;
_root = r;
return _chart;
};
/**
#### .svg([svgElement])
Returns the top svg element for this specific chart. You can also pass in a new svg element however this is usually
handled as part of the dc internal. Resetting svg element on a chart outside of dc internal might have unexpected
consequences.
**/
_chart.svg = function (_) {
if (!arguments.length) return _svg;
_svg = _;
return _chart;
};
/**
#### .resetSvg()
Remove the chart's SVG elements from the dom and recreate the container SVG element.
**/
_chart.resetSvg = function () {
_chart.select("svg").remove();
return generateSvg();
};
function generateSvg() {
_svg = _chart.root().append("svg")
.attr("width", _chart.width())
.attr("height", _chart.height());
return _svg;
}
/**
#### .filterPrinter([filterPrinterFunction])
Set or get filter printer function. Filter printer function is used to generate human friendly text for filter value(s)
associated with the chart instance. By default dc charts shipped with a default filter printer implementation dc.printers.filter
that provides simple printing support for both single value and ranged filters.
**/
_chart.filterPrinter = function (_) {
if (!arguments.length) return _filterPrinter;
_filterPrinter = _;
return _chart;
};
/**
#### .turnOnControls() & .turnOffControls()
Turn on/off optional control elements within the root element. dc.js currently support the following html control elements.
* root.selectAll(".reset") elements are turned on if the chart has an active filter. This type of control elements are usually used to store reset link to allow user to reset filter on a certain chart. This element will be turned off automatically if the filter is cleared.
* root.selectAll(".filter") elements are turned on if the chart has an active filter. The text content of this element is then replaced with the current filter value using the filter printer function. This type of element will be turned off automatically if the filter is cleared.
**/
_chart.turnOnControls = function () {
if (_root) {
_chart.selectAll(".reset").style("display", null);
_chart.selectAll(".filter").text(_filterPrinter(_chart.filters())).style("display", null);
}
return _chart;
};
_chart.turnOffControls = function () {
if (_root) {
_chart.selectAll(".reset").style("display", "none");
_chart.selectAll(".filter").style("display", "none").text(_chart.filter());
}
return _chart;
};
/**
#### .transitionDuration([duration])
Set or get animation transition duration(in milliseconds) for specific chart instance. Default duration is 750ms.
**/
_chart.transitionDuration = function (d) {
if (!arguments.length) return _transitionDuration;
_transitionDuration = d;
return _chart;
};
_chart._mandatoryAttributes = function (_) {
if (!arguments.length) return _mandatoryAttributes;
_mandatoryAttributes = _;
return _chart;
};
function checkForMandatoryAttributes(a) {
if (!_chart[a] || !_chart[a]())
throw new dc.errors.InvalidStateException("Mandatory attribute chart." + a +
" is missing on chart[#" + _chart.anchorName() + "]");
}
/**
#### .render()
Invoke this method will force the chart to re-render everything from scratch. Generally it should be only used to
render the chart for the first time on the page or if you want to make sure everything is redrawn from scratch instead
of relying on the default incremental redrawing behaviour.
**/
_chart.render = function () {
_listeners.preRender(_chart);
if (_mandatoryAttributes)
_mandatoryAttributes.forEach(checkForMandatoryAttributes);
var result = _chart._doRender();
if (_legend) _legend.render();
_chart._activateRenderlets("postRender");
return result;
};
_chart._activateRenderlets = function (event) {
if (_chart.transitionDuration() > 0 && _svg) {
_svg.transition().duration(_chart.transitionDuration())
.each("end", function () {
runAllRenderlets();
if (event) _listeners[event](_chart);
});
} else {
runAllRenderlets();
if (event) _listeners[event](_chart);
}
};
/**
#### .redraw()
Calling redraw will cause the chart to re-render delta in data change incrementally. If there is no change in the
underlying data dimension then calling this method will have no effect on the chart. Most of the chart interaction in
dc library will automatically trigger this method through its internal event engine, therefore you only need to manually
invoke this function if data is manipulated outside of dc's control; for example if data is loaded on a periodic basis
in the background using crossfilter.add().
**/
_chart.redraw = function () {
_listeners.preRedraw(_chart);
var result = _chart._doRedraw();
if (_legend) _legend.render();
_chart._activateRenderlets("postRedraw");
return result;
};
_chart.redrawGroup = function () {
dc.redrawAll(_chart.chartGroup());
};
_chart._invokeFilteredListener = function (f) {
if (f !== undefined) _listeners.filtered(_chart, f);
};
_chart._invokeZoomedListener = function () {
_listeners.zoomed(_chart);
};
/**
#### .hasFilter([filter])
Check whether is any active filter or a specific filter is associated with particular chart instance.
This function is **not chainable**.
**/
_chart.hasFilter = function (filter) {
if (!arguments.length) return _filters.length > 0;
return _filters.indexOf(filter) >= 0;
};
function removeFilter(_) {
_filters.splice(_filters.indexOf(_), 1);
applyFilters();
_chart._invokeFilteredListener(_);
}
function addFilter(_) {
_filters.push(_);
applyFilters();
_chart._invokeFilteredListener(_);
}
function resetFilters() {
_filters = [];
applyFilters();
_chart._invokeFilteredListener(null);
}
function applyFilters() {
if (_chart.dimension() && _chart.dimension().filter) {
var fs = _filterHandler(_chart.dimension(), _filters);
_filters = fs ? fs : _filters;
}
}
_chart.replaceFilter = function (_) {
_filters = [];
_chart.filter(_);
};
/**
#### .filter([filterValue])
Filter the chart by the given value or return the current filter if the input parameter is missing.
```js
// filter by a single string
chart.filter("Sunday");
// filter by a single age
chart.filter(18);
```
**/
_chart.filter = function (_) {
if (!arguments.length) return _filters.length > 0 ? _filters[0] : null;
if (_ instanceof Array && _[0] instanceof Array && !_.isFiltered) {
_[0].forEach(function(d){
if (_chart.hasFilter(d)) {
_filters.splice(_filters.indexOf(d), 1);
} else {
_filters.push(d);
}
});
applyFilters();
_chart._invokeFilteredListener(_);
} else if (_ === null) {
resetFilters();
} else {
if (_chart.hasFilter(_))
removeFilter(_);
else
addFilter(_);
}
if (_root !== null && _chart.hasFilter()) {
_chart.turnOnControls();
} else {
_chart.turnOffControls();
}
return _chart;
};
/**
#### .filters()
Return all current filters. This method does not perform defensive cloning of the internal filter array before returning
therefore any modification of returned array will affact chart's internal filter storage.
**/
_chart.filters = function () {
return _filters;
};
_chart.highlightSelected = function (e) {
d3.select(e).classed(dc.constants.SELECTED_CLASS, true);
d3.select(e).classed(dc.constants.DESELECTED_CLASS, false);
};
_chart.fadeDeselected = function (e) {
d3.select(e).classed(dc.constants.SELECTED_CLASS, false);
d3.select(e).classed(dc.constants.DESELECTED_CLASS, true);
};
_chart.resetHighlight = function (e) {
d3.select(e).classed(dc.constants.SELECTED_CLASS, false);
d3.select(e).classed(dc.constants.DESELECTED_CLASS, false);
};
/**
#### .onClick(datum)
This function is passed to d3 as the onClick handler for each chart. By default it will filter the on the clicked datum
(as passed back to the callback) and redraw the chart group.
**/
_chart.onClick = function (d) {
var filter = _chart.keyAccessor()(d);
dc.events.trigger(function () {
_chart.filter(filter);
_chart.redrawGroup();
});
};
/**
#### .filterHandler([function])
Set or get filter handler. Filter handler is a function that performs the filter action on a specific dimension. Using
custom filter handler give you the flexibility to perform additional logic before or after filtering.
```js
// default filter handler
function(dimension, filter){
dimension.filter(filter); // perform filtering
return filter; // return the actual filter value
}
// custom filter handler
chart.filterHandler(function(dimension, filter){
var newFilter = filter + 10;
dimension.filter(newFilter);
return newFilter; // set the actual filter value to the new value
});
```
**/
_chart.filterHandler = function (_) {
if (!arguments.length) return _filterHandler;
_filterHandler = _;
return _chart;
};
// abstract function stub
_chart._doRender = function () {
// do nothing in base, should be overridden by sub-function
return _chart;
};
_chart._doRedraw = function () {
// do nothing in base, should be overridden by sub-function
return _chart;
};
_chart.legendables = function () {
// do nothing in base, should be overridden by sub-function
return [];
};
_chart.legendHighlight = function (d) {
// do nothing in base, should be overridden by sub-function
};
_chart.legendReset = function (d) {
// do nothing in base, should be overridden by sub-function
};
_chart.legendToggle = function (d) {
// do nothing in base, should be overriden by sub-function
};
_chart.isLegendableHidden = function (d) {
// do nothing in base, should be overridden by sub-function
return false;
};
/**
#### .keyAccessor([keyAccessorFunction])
Set or get the key accessor function. Key accessor function is used to retrieve key value in crossfilter group. Key
values are used differently in different charts, for example keys correspond to slices in pie chart and x axis position
in grid coordinate chart.
```js
// default key accessor
chart.keyAccessor(function(d) { return d.key; });
// custom key accessor for a multi-value crossfilter reduction
chart.keyAccessor(function(p) { return p.value.absGain; });
```
**/
_chart.keyAccessor = function (_) {
if (!arguments.length) return _keyAccessor;
_keyAccessor = _;
return _chart;
};
/**
#### .valueAccessor([valueAccessorFunction])
Set or get the value accessor function. Value accessor function is used to retrieve value in crossfilter group. Group
values are used differently in different charts, for example group values correspond to slices size in pie chart and y
axis position in grid coordinate chart.
```js
// default value accessor
chart.valueAccessor(function(d) { return d.value; });
// custom value accessor for a multi-value crossfilter reduction
chart.valueAccessor(function(p) { return p.value.percentageGain; });
```
**/
_chart.valueAccessor = function (_) {
if (!arguments.length) return _valueAccessor;
_valueAccessor = _;
return _chart;
};
/**
#### .label([labelFunction])
Set or get the label function. Chart class will use this function to render label for each child element in the chart,
i.e. a slice in a pie chart or a bubble in a bubble chart. Not every chart supports label function for example bar chart
and line chart do not use this function at all.
```js
// default label function just return the key
chart.label(function(d) { return d.key; });
// label function has access to the standard d3 data binding and can get quite complicated
chart.label(function(d) { return d.data.key + "(" + Math.floor(d.data.value / all.value() * 100) + "%)"; });
```
**/
_chart.label = function (_) {
if (!arguments.length) return _label;
_label = _;
_renderLabel = true;
return _chart;
};
/**
#### .renderLabel(boolean)
Turn on/off label rendering
**/
_chart.renderLabel = function (_) {
if (!arguments.length) return _renderLabel;
_renderLabel = _;
return _chart;
};
/**
#### .title([titleFunction])
Set or get the title function. Chart class will use this function to render svg title(usually interpreted by browser
as tooltips) for each child element in the chart, i.e. a slice in a pie chart or a bubble in a bubble chart. Almost
every chart supports title function however in grid coordinate chart you need to turn off brush in order to use title
otherwise the brush layer will block tooltip trigger.
```js
// default title function just return the key
chart.title(function(d) { return d.key + ": " + d.value; });
// title function has access to the standard d3 data binding and can get quite complicated
chart.title(function(p) {
return p.key.getFullYear()
+ "\n"
+ "Index Gain: " + numberFormat(p.value.absGain) + "\n"
+ "Index Gain in Percentage: " + numberFormat(p.value.percentageGain) + "%\n"
+ "Fluctuation / Index Ratio: " + numberFormat(p.value.fluctuationPercentage) + "%";
});
```
**/
_chart.title = function (_) {
if (!arguments.length) return _title;
_title = _;
_renderTitle = true;
return _chart;
};
/**
#### .renderTitle(boolean)
Turn on/off title rendering
**/
_chart.renderTitle = function (_) {
if (!arguments.length) return _renderTitle;
_renderTitle = _;
return _chart;
};
/**
#### .renderlet(renderletFunction)
Renderlet is similar to an event listener on rendering event. Multiple renderlets can be added to an individual chart.
Every time when chart is rerendered or redrawn renderlet then will be invoked right after the chart finishes its own
drawing routine hence given you a way to override or modify certain behaviour. Renderlet function accepts the chart
instance as the only input parameter and you can either rely on dc API or use raw d3 to achieve pretty much any effect.
```js
// renderlet function
chart.renderlet(function(chart){
// mix of dc API and d3 manipulation
chart.select("g.y").style("display", "none");
// its a closure so you can also access other chart variable available in the closure scope
moveChart.filter(chart.filter());
});
```
**/
_chart.renderlet = function (_) {
_renderlets.push(_);
return _chart;
};
function runAllRenderlets() {
for (var i = 0; i < _renderlets.length; ++i) {
_renderlets[i](_chart);
}
}
/**
#### .chartGroup([group])
Get or set the chart group with which this chart belongs. Chart groups share common rendering events since it is
expected they share the same underlying crossfilter data set.
**/
_chart.chartGroup = function (_) {
if (!arguments.length) return _chartGroup;
_chartGroup = _;
return _chart;
};
/**
#### .expireCache()
Expire internal chart cache. dc.js chart cache some data internally on a per chart basis so it can speed up rendering
and avoid unnecessary calculation however under certain circumstances it might be useful to clear the cache e.g. after
you invoke crossfilter.add function or if you reset group or dimension post render it is always a good idea to clear
the cache to make sure charts are rendered properly.
**/
_chart.expireCache = function () {
// do nothing in base, should be overridden by sub-function
return _chart;
};
/**
#### .legend([dc.legend])
Attach dc.legend widget to this chart. Legend widget will automatically draw legend labels based on the color setting
and names associated with each group.
```js
chart.legend(dc.legend().x(400).y(10).itemHeight(13).gap(5))
```
**/
_chart.legend = function (l) {
if (!arguments.length) return _legend;
_legend = l;
_legend.parent(_chart);
return _chart;
};
/**
#### .chartID()
Return the internal numeric ID of the chart.
**/
_chart.chartID = function () {
return _chart.__dc_flag__;
};
/**
#### .options(optionsObject)
Set chart options using a configuration object. Each object key will be call the fluent method of the same name to set that attribute for the chart.
Example:
```
chart.options({dimension: myDimension, group: myGroup});
```
**/
_chart.options = function(opts) {
for (var o in opts) {
if (typeof(_chart[o]) === 'function') {
_chart[o].call(_chart,opts[o]);
} else {
dc.logger.debug("Not a valid option setter name: " + o);
}
}
return _chart;
};
/**
## Listeners
All dc chart instance supports the following listeners.
#### .on("preRender", function(chart){...})
This listener function will be invoked before chart rendering.
#### .on("postRender", function(chart){...})
This listener function will be invoked after chart finish rendering including all renderlets' logic.
#### .on("preRedraw", function(chart){...})
This listener function will be invoked before chart redrawing.
#### .on("postRedraw", function(chart){...})
This listener function will be invoked after chart finish redrawing including all renderlets' logic.
#### .on("filtered", function(chart, filter){...})
This listener function will be invoked after a filter is applied, added or removed.
#### .on("zoomed", function(chart, filter){...})
This listener function will be invoked after a zoom is triggered.
**/
_chart.on = function (event, listener) {
_listeners[event] = listener;
return _chart;
};
return _chart;
};
/**
## Margin Mixin
Margin is a mixin that provides margin utility functions for both the Row Chart and Coordinate Grid Charts.
**/
dc.marginMixin = function (_chart) {
var _margin = {top: 10, right: 50, bottom: 30, left: 30};
/**
#### .margins([margins])
Get or set the margins for a particular coordinate grid chart instance. The margins is stored as an associative Javascript
array. Default margins: {top: 10, right: 50, bottom: 30, left: 30}.
The margins can be accessed directly from the getter.
```js
var leftMargin = chart.margins().left; // 30 by default
chart.margins().left = 50;
leftMargin = chart.margins().left; // now 50
```
**/
_chart.margins = function (m) {
if (!arguments.length) return _margin;
_margin = m;
return _chart;
};
_chart.effectiveWidth = function () {
return _chart.width() - _chart.margins().left - _chart.margins().right;
};
_chart.effectiveHeight = function () {
return _chart.height() - _chart.margins().top - _chart.margins().bottom;
};
return _chart;
};
/**
## Color Mixin
Color Mixin is an abstract chart functional class created to provide universal coloring support as a mix-in for any concrete
chart implementation.
**/
dc.colorMixin = function(_chart) {
var _colors = d3.scale.category20c();
var _defaultAccessor = true;
var _colorAccessor = function(d) { return _chart.keyAccessor()(d); };
/**
#### .colors([colorScale])
Retrieve current color scale or set a new color scale. This methods accepts any
function the operate like a d3 scale. If not set the default is
`d3.scale.category20c()`.
```js
// alternate categorical scale
chart.colors(d3.scale.category20b());
// ordinal scale
chart.colors(d3.scale.ordinal().range(['red','green','blue']);
// convience method, the same as above
chart.ordinalColors(['red','green','blue']);
// set a linear scale
chart.linearColors(["#4575b4", "#ffffbf", "#a50026"]);
```
**/
_chart.colors = function(_) {
if (!arguments.length) return _colors;
if (_ instanceof Array) _colors = d3.scale.quantize().range(_); // depricated legacy support, note: this fails for ordinal domains
else _colors = d3.functor(_);
return _chart;
};
/**
#### .ordinalColors(r)
Convenience method to set the color scale to d3.scale.ordinal with range `r`.
**/
_chart.ordinalColors = function(r) {
return _chart.colors(d3.scale.ordinal().range(r));
};
/**
#### .linearColors(r)
Convenience method to set the color scale to an Hcl interpolated linear scale with range `r`.
**/
_chart.linearColors = function(r) {
return _chart.colors(d3.scale.linear()
.range(r)
.interpolate(d3.interpolateHcl));
};
/**
#### .colorAccessor([colorAccessorFunction])
Set or get color accessor function. This function will be used to map a data point on crossfilter group to a specific
color value on the color scale. Default implementation of this function simply returns the next color on the scale using
the index of a group.
```js
// default index based color accessor
.colorAccessor(function(d, i){return i;})
// color accessor for a multi-value crossfilter reduction
.colorAccessor(function(d){return d.value.absGain;})
```
**/
_chart.colorAccessor = function(_){
if(!arguments.length) return _colorAccessor;
_colorAccessor = _;
_defaultAccessor = false;
return _chart;
};
_chart.defaultColorAccessor = function() {
return _defaultAccessor;
};
/**
#### .colorDomain([domain])
Set or get the current domain for the color mapping function. The domain must be supplied as an array.
Note: previously this method accepted a callback function. Instead you may use a custom scale set by `.colors`.
**/
_chart.colorDomain = function(_){
if(!arguments.length) return _colors.domain();
_colors.domain(_);
return _chart;
};
/**
#### .calculateColorDomain()
Set the domain by determining the min and max values as retrived by `.colorAccessor` over the chart's dataset.
**/
_chart.calculateColorDomain = function () {
var newDomain = [d3.min(_chart.data(), _chart.colorAccessor()),
d3.max(_chart.data(), _chart.colorAccessor())];
_colors.domain(newDomain);
};
/**
#### .getColor(d [, i])
Get the color for the datum d and counter i. This is used internaly by charts to retrieve a color.
**/
_chart.getColor = function(d, i){
return _colors(_colorAccessor.call(this,d, i));
};
_chart.colorCalculator = function(_){
if(!arguments.length) return _chart.getColor;
_chart.getColor = _;
return _chart;
};
return _chart;
};
/**
## Coordinate Grid Mixin
Includes: [Color Mixin](#color-mixin), [Margin Mixin](#margin-mixin), [Base Mixin](#base-mixin)
Coordinate Grid is an abstract base chart designed to support a number of coordinate grid based concrete chart types,
i.e. bar chart, line chart, and bubble chart.
**/
dc.coordinateGridMixin = function (_chart) {
var GRID_LINE_CLASS = "grid-line";
var HORIZONTAL_CLASS = "horizontal";
var VERTICAL_CLASS = "vertical";
var Y_AXIS_LABEL_CLASS = 'y-axis-label';
var X_AXIS_LABEL_CLASS = 'x-axis-label';
var DEFAULT_AXIS_LABEL_PADDING = 12;
_chart = dc.colorMixin(dc.marginMixin(dc.baseMixin(_chart)));
_chart.colors(d3.scale.category10());
_chart._mandatoryAttributes().push('x');
var _parent;
var _g;
var _chartBodyG;
var _x;
var _xOriginalDomain;
var _xAxis = d3.svg.axis().orient("bottom");
var _xUnits = dc.units.integers;
var _xAxisPadding = 0;
var _xElasticity = false;
var _xAxisLabel;
var _xAxisLabelPadding = 0;
var _y;
var _yAxis = d3.svg.axis().orient("left");
var _yAxisPadding = 0;
var _yElasticity = false;
var _yAxisLabel;
var _yAxisLabelPadding = 0;
var _brush = d3.svg.brush();
var _brushOn = true;
var _round;
var _renderHorizontalGridLine = false;
var _renderVerticalGridLine = false;
var _refocused = false;
var _unitCount;
var _zoomScale = [1, Infinity];
var _zoomOutRestrict = true;
var _zoom = d3.behavior.zoom().on("zoom", zoomHandler);
var _nullZoom = d3.behavior.zoom().on("zoom", null);
var _hasBeenMouseZoomable = false;
var _rangeChart;
var _focusChart;
var _mouseZoomable = false;
var _clipPadding = 0;
var _outerRangeBandPadding = 0.5;
var _rangeBandPadding = 0;
var _useRightYAxis = false;
_chart.rescale = function () {
_unitCount = undefined;
};
/**
#### .rangeChart([chart])
Get or set the range selection chart associated with this instance. Setting the range selection chart using this function
will automatically update its selection brush when the current chart zooms in. In return the given range chart will also
automatically attach this chart as its focus chart hence zoom in when range brush updates. See the
[Nasdaq 100 Index](http://dc-js.github.com/dc.js/) example for this effect in action.
**/
_chart.rangeChart = function (_) {
if (!arguments.length) return _rangeChart;
_rangeChart = _;
_rangeChart.focusChart(_chart);
return _chart;
};
/**
#### .zoomScale([extent])
Get or set the scale extent for mouse zooms.
**/
_chart.zoomScale = function (_) {
if (!arguments.length) return _zoomScale;
_zoomScale = _;
return _chart;
};
/**
#### .zoomOutRestrict([true/false])
Get or set the zoom restriction for the chart. If true limits the zoom to origional domain of the chart.
**/
_chart.zoomOutRestrict = function (r) {
if (!arguments.length) return _zoomOutRestrict;
_zoomScale[0] = r ? 1 : 0;
_zoomOutRestrict = r;
return _chart;
};
_chart._generateG = function (parent) {
if (parent === undefined)
_parent = _chart.svg();
else
_parent = parent;
_g = _parent.append("g");
_chartBodyG = _g.append("g").attr("class", "chart-body")
.attr("transform", "translate(" + _chart.margins().left + ", " + _chart.margins().top + ")")
.attr("clip-path", "url(#" + getClipPathId() + ")");
return _g;
};
/**
#### .g([gElement])
Get or set the root g element. This method is usually used to retrieve the g element in order to overlay custom svg drawing
programatically. **Caution**: The root g element is usually generated by dc.js internals, and resetting it might produce unpredictable result.
**/
_chart.g = function (_) {
if (!arguments.length) return _g;
_g = _;
return _chart;
};
/**
#### .mouseZoomable([boolean])
Set or get mouse zoom capability flag (default: false). When turned on the chart will be zoomable through mouse wheel
. If range selector chart is also attached zooming will also update the range selection brush on associated range
selector chart.
**/
_chart.mouseZoomable = function (z) {
if (!arguments.length) return _mouseZoomable;
_mouseZoomable = z;
return _chart;
};
/**
#### .chartBodyG()
Retreive the svg group for the chart body.
**/
_chart.chartBodyG = function (_) {
if (!arguments.length) return _chartBodyG;
_chartBodyG = _;
return _chart;
};
/**
#### .x([xScale]) - **mandatory**
Get or set the x scale. x scale could be any [d3 quatitive scales](https://github.com/mbostock/d3/wiki/Quantitative-Scales).
For example a time scale for histogram or a linear/ordinal scale for visualizing data distribution.
```js
// set x to a linear scale
chart.x(d3.scale.linear().domain([-2500, 2500]))
// set x to a time scale to generate histogram
chart.x(d3.time.scale().domain([new Date(1985, 0, 1), new Date(2012, 11, 31)]))
```
**/
_chart.x = function (_) {
if (!arguments.length) return _x;
_x = _;
_xOriginalDomain = _x.domain();
return _chart;
};
_chart.xOriginalDomain = function () {
return _xOriginalDomain;
};
/**
#### .xUnits([xUnits function])
Set or get the xUnits function. xUnits function is the coordinate grid chart uses to calculate number of data
projections on x axis such as number bars for a bar chart and number of dots for a line chart. This function is
expected to return an Javascript array of all data points on x axis. d3 time range functions d3.time.days, d3.time.months,
and d3.time.years are all valid xUnits function. dc.js also provides a few units function, see [Utilities](#util)
section for a list of built-in units functions. Default xUnits function is dc.units.integers.
```js
// set x units to day for a histogram
chart.xUnits(d3.time.days);
// set x units to month for a histogram
chart.xUnits(d3.time.months);
```
Custom xUnits function can be easily created using as long as it follows the following inteface:
```js
// units in integer
function(start, end, xDomain) {
// simply calculates how many integers in the domain
return Math.abs(end - start);
};
// fixed units
function(start, end, xDomain) {
// be aware using fixed units will disable the focus/zoom ability on the chart
return 1000;
};
```
**/
_chart.xUnits = function (_) {
if (!arguments.length) return _xUnits;
_xUnits = _;
return _chart;
};
/**
#### .xAxis([xAxis])
Set or get the x axis used by a particular coordinate grid chart instance. This function is most useful when certain x
axis customization is required. x axis in dc.js is simply an instance of
[d3 axis object](https://github.com/mbostock/d3/wiki/SVG-Axes#wiki-_axis) therefore it supports any valid d3 axis
manipulation. **Caution**: The x axis is typically generated by dc chart internal, resetting it might cause unexpected
outcome.
```js
// customize x axis tick format
chart.xAxis().tickFormat(function(v) {return v + "%";});
// customize x axis tick values
chart.xAxis().tickValues([0, 100, 200, 300]);
```
**/
_chart.xAxis = function (_) {
if (!arguments.length) return _xAxis;
_xAxis = _;
return _chart;
};
/**
#### .elasticX([boolean])
Turn on/off elastic x axis. If x axis elasticity is turned on, then the grid chart will attempt to generate and
recalculate x axis range whenever redraw event is triggered.
**/
_chart.elasticX = function (_) {
if (!arguments.length) return _xElasticity;
_xElasticity = _;
return _chart;
};
/**
#### .xAxisPadding([padding])
Set or get x axis padding when elastic x axis is turned on. The padding will be added to both end of the x axis if and
only if elasticX is turned on otherwise it will be simply ignored.
* padding - could be integer or percentage in string (e.g. "10%"). Padding can be applied to number or date.
When padding with date, integer represents number of days being padded while percentage string will be treated
as number.
**/
_chart.xAxisPadding = function (_) {
if (!arguments.length) return _xAxisPadding;
_xAxisPadding = _;
return _chart;
};
/**
#### .xUnitCount()
Returns the number of units displayed on the x axis using the unit measure configured by .xUnits.
**/
_chart.xUnitCount = function () {
if (_unitCount === undefined) {
var units = _chart.xUnits()(_chart.x().domain()[0], _chart.x().domain()[1], _chart.x().domain());
if (units instanceof Array)
_unitCount = units.length;
else
_unitCount = units;
}
return _unitCount;
};
_chart.useRightYAxis = function (_) {
if (!arguments.length) return _useRightYAxis;
_useRightYAxis = _;
return _chart;
};
/**
#### isOrdinal()
Returns true if the chart is using ordinal xUnits, false otherwise. Most charts must behave somewhat
differently when with ordinal data and use the result of this method to trigger those special case.
**/
_chart.isOrdinal = function () {
return _chart.xUnits() === dc.units.ordinal;
};
_chart._ordinalXDomain = function() {
var groups = _chart._computeOrderedGroups(_chart.data());
return groups.map(_chart.keyAccessor());
};
function prepareXAxis(g) {
if (_chart.elasticX() && !_chart.isOrdinal()) {
_x.domain([_chart.xAxisMin(), _chart.xAxisMax()]);
}
else if (_chart.isOrdinal() && _x.domain().length===0) {
_x.domain(_chart._ordinalXDomain());
}
if (_chart.isOrdinal()) {
_x.rangeBands([0,_chart.xAxisLength()],_rangeBandPadding,_outerRangeBandPadding);
} else {
_x.range([0, _chart.xAxisLength()]);
}
_xAxis = _xAxis.scale(_chart.x());
renderVerticalGridLines(g);
}
_chart.renderXAxis = function (g) {
var axisXG = g.selectAll("g.x");
if (axisXG.empty())
axisXG = g.append("g")
.attr("class", "axis x")
.attr("transform", "translate(" + _chart.margins().left + "," + _chart._xAxisY() + ")");
var axisXLab = g.selectAll("text."+X_AXIS_LABEL_CLASS);
if (axisXLab.empty() && _chart.xAxisLabel())
axisXLab = g.append('text')
.attr("transform", "translate(" + (_chart.margins().left + _chart.xAxisLength() / 2) + "," + (_chart.height() - _xAxisLabelPadding) + ")")
.attr('class', X_AXIS_LABEL_CLASS)
.attr('text-anchor', 'middle')
.text(_chart.xAxisLabel());
if (_chart.xAxisLabel() && axisXLab.text() != _chart.xAxisLabel())
axisXLab.text(_chart.xAxisLabel());
dc.transition(axisXG, _chart.transitionDuration())
.call(_xAxis);
};
function renderVerticalGridLines(g) {
var gridLineG = g.selectAll("g." + VERTICAL_CLASS);
if (_renderVerticalGridLine) {
if (gridLineG.empty())
gridLineG = g.insert("g", ":first-child")
.attr("class", GRID_LINE_CLASS + " " + VERTICAL_CLASS)
.attr("transform", "translate(" + _chart.margins().left + "," + _chart.margins().top + ")");
var ticks = _xAxis.tickValues() ? _xAxis.tickValues() : _x.ticks(_xAxis.ticks()[0]);
var lines = gridLineG.selectAll("line")
.data(ticks);
// enter
var linesGEnter = lines.enter()
.append("line")
.attr("x1", function (d) {
return _x(d);
})
.attr("y1", _chart._xAxisY() - _chart.margins().top)
.attr("x2", function (d) {
return _x(d);
})
.attr("y2", 0)
.attr("opacity", 0);
dc.transition(linesGEnter, _chart.transitionDuration())
.attr("opacity", 1);
// update
dc.transition(lines, _chart.transitionDuration())
.attr("x1", function (d) {
return _x(d);
})
.attr("y1", _chart._xAxisY() - _chart.margins().top)
.attr("x2", function (d) {
return _x(d);
})
.attr("y2", 0);
// exit
lines.exit().remove();
}
else {
gridLineG.selectAll("line").remove();
}
}
_chart._xAxisY = function () {
return (_chart.height() - _chart.margins().bottom);
};
_chart.xAxisLength = function () {
return _chart.effectiveWidth();
};
/**
#### .xAxisLabel([labelText, [, padding]])
Set or get the x axis label. If setting the label, you may optionally include additional padding to
the margin to make room for the label. By default the padded is set to 12 to accomodate the text height.
**/
_chart.xAxisLabel = function (_, padding) {
if (!arguments.length) return _xAxisLabel;
_xAxisLabel = _;
_chart.margins().bottom -= _xAxisLabelPadding;
_xAxisLabelPadding = (padding === undefined) ? DEFAULT_AXIS_LABEL_PADDING : padding;
_chart.margins().bottom += _xAxisLabelPadding;
return _chart;
};
_chart._prepareYAxis = function(g) {
if (_y === undefined || _chart.elasticY()) {
_y = d3.scale.linear();
_y.domain([_chart.yAxisMin(), _chart.yAxisMax()]).rangeRound([_chart.yAxisHeight(), 0]);
}
_y.range([_chart.yAxisHeight(), 0]);
_yAxis = _yAxis.scale(_y);
if (_useRightYAxis)
_yAxis.orient("right");
_chart._renderHorizontalGridLinesForAxis(g, _y, _yAxis);
};
_chart.renderYAxisLabel = function(axisClass, text, rotation, labelXPosition) {
labelXPosition = labelXPosition || _yAxisLabelPadding;
var axisYLab = _chart.g().selectAll("text." + Y_AXIS_LABEL_CLASS + "." + axisClass + "-label");
if (axisYLab.empty() && text) {
var labelYPosition = (_chart.margins().top + _chart.yAxisHeight() / 2);
axisYLab = _chart.g().append('text')
.attr("transform", "translate(" + labelXPosition + "," + labelYPosition + "),rotate(" + rotation + ")")
.attr('class', Y_AXIS_LABEL_CLASS + " " + axisClass + "-label")
.attr('text-anchor', 'middle')
.text(text);
}
if (text && axisYLab.text() != text) {
axisYLab.text(text);
}
};
_chart.renderYAxisAt = function (axisClass, axis, position){
var axisYG = _chart.g().selectAll("g." + axisClass);
if (axisYG.empty()) {
axisYG = _chart.g().append("g")
.attr("class", "axis " + axisClass)
.attr("transform", "translate(" + position + "," + _chart.margins().top + ")");
}
dc.transition(axisYG, _chart.transitionDuration()).call(axis);
};
_chart.renderYAxis = function () {
var axisPosition = _useRightYAxis ? (_chart.width() - _chart.margins().right) : _chart._yAxisX();
_chart.renderYAxisAt("y", _yAxis, axisPosition);
var labelPosition = _useRightYAxis ? (_chart.width() - _yAxisLabelPadding) : _yAxisLabelPadding;
var rotation = _useRightYAxis ? 90 : -90;
_chart.renderYAxisLabel("y", _chart.yAxisLabel(), rotation, labelPosition);
};
_chart._renderHorizontalGridLinesForAxis = function (g, scale, axis) {
var gridLineG = g.selectAll("g." + HORIZONTAL_CLASS);
if (_renderHorizontalGridLine) {
var ticks = axis.tickValues() ? axis.tickValues() : scale.ticks(axis.ticks()[0]);
if (gridLineG.empty()) {
gridLineG = g.insert("g", ":first-child")
.attr("class", GRID_LINE_CLASS + " " + HORIZONTAL_CLASS)
.attr("transform", "translate(" + _chart.margins().left + "," + _chart.margins().top + ")");
}
var lines = gridLineG.selectAll("line")
.data(ticks);
// enter
var linesGEnter = lines.enter()
.append("line")
.attr("x1", 1)
.attr("y1", function (d) {
return scale(d);
})
.attr("x2", _chart.xAxisLength())
.attr("y2", function (d) {
return scale(d);
})
.attr("opacity", 0);
dc.transition(linesGEnter, _chart.transitionDuration())
.attr("opacity", 1);
// update
dc.transition(lines, _chart.transitionDuration())
.attr("x1", 1)
.attr("y1", function (d) {
return scale(d);
})
.attr("x2", _chart.xAxisLength())
.attr("y2", function (d) {
return scale(d);
});
// exit
lines.exit().remove();
}
else {
gridLineG.selectAll("line").remove();
}
};
_chart._yAxisX = function () {
return _chart.useRightYAxis() ? _chart.width() - _chart.margins().right : _chart.margins().left;
};
/**
#### .yAxisLabel([labelText, [, padding]])
Set or get the y axis label. If setting the label, you may optionally include additional padding to
the margin to make room for the label. By default the padded is set to 12 to accomodate the text height.
**/
_chart.yAxisLabel = function (_, padding) {
if (!arguments.length) return _yAxisLabel;
_yAxisLabel = _;
_chart.margins().left -= _yAxisLabelPadding;
_yAxisLabelPadding = (padding === undefined) ? DEFAULT_AXIS_LABEL_PADDING : padding;
_chart.margins().left += _yAxisLabelPadding;
return _chart;
};
/**
#### .y([yScale])
Get or set the y scale. y scale is typically automatically generated by the chart implementation.
**/
_chart.y = function (_) {
if (!arguments.length) return _y;
_y = _;
return _chart;
};
/**
#### .yAxis([yAxis])
Set or get the y axis used by a particular coordinate grid chart instance. This function is most useful when certain y
axis customization is required. y axis in dc.js is simply an instance
of [d3 axis object](https://github.com/mbostock/d3/wiki/SVG-Axes#wiki-_axis) therefore it supports any valid d3 axis
manipulation. **Caution**: The y axis is typically generated by dc chart internal, resetting it might cause unexpected
outcome.
```js
// customize y axis tick format
chart.yAxis().tickFormat(function(v) {return v + "%";});
// customize y axis tick values
chart.yAxis().tickValues([0, 100, 200, 300]);
```
**/
_chart.yAxis = function (y) {
if (!arguments.length) return _yAxis;
_yAxis = y;
return _chart;
};
/**
#### .elasticY([boolean])
Turn on/off elastic y axis. If y axis elasticity is turned on, then the grid chart will attempt to generate and recalculate
y axis range whenever redraw event is triggered.
**/
_chart.elasticY = function (_) {
if (!arguments.length) return _yElasticity;
_yElasticity = _;
return _chart;
};
/**
#### .renderHorizontalGridLines([boolean])
Turn on/off horizontal grid lines.
**/
_chart.renderHorizontalGridLines = function (_) {
if (!arguments.length) return _renderHorizontalGridLine;
_renderHorizontalGridLine = _;
return _chart;
};
/**
#### .renderVerticalGridLines([boolean])
Turn on/off vertical grid lines.
**/
_chart.renderVerticalGridLines = function (_) {
if (!arguments.length) return _renderVerticalGridLine;
_renderVerticalGridLine = _;
return _chart;
};
/**
#### .xAxisMin()
Return the minimum x value to diplay in the chart. Includes xAxisPadding if set.
**/
_chart.xAxisMin = function () {
var min = d3.min(_chart.data(), function (e) {
return _chart.keyAccessor()(e);
});
return dc.utils.subtract(min, _xAxisPadding);
};
/**
#### .xAxisMax()
Return the maximum x value to diplay in the chart. Includes xAxisPadding if set.
**/
_chart.xAxisMax = function () {
var max = d3.max(_chart.data(), function (e) {
return _chart.keyAccessor()(e);
});
return dc.utils.add(max, _xAxisPadding);
};
/**
#### .yAxisMin()
Return the minimum y value to diplay in the chart. Includes yAxisPadding if set.
**/
_chart.yAxisMin = function () {
var min = d3.min(_chart.data(), function (e) {
return _chart.valueAccessor()(e);
});
return dc.utils.subtract(min, _yAxisPadding);
};
/**
#### .yAxisMax()
Return the maximum y value to diplay in the chart. Includes yAxisPadding if set.
**/
_chart.yAxisMax = function () {
var max = d3.max(_chart.data(), function (e) {
return _chart.valueAccessor()(e);
});
return dc.utils.add(max, _yAxisPadding);
};
/**
#### .yAxisPadding([padding])
if elasticY is turned on otherwise it will be simply ignored.
Set or get y axis padding when elastic y axis is turned on. The padding will be added to the top of the y axis if and only
* padding - could be integer or percentage in string (e.g. "10%"). Padding can be applied to number or date.
When padding with date, integer represents number of days being padded while percentage string will be treated
as number.
**/
_chart.yAxisPadding = function (_) {
if (!arguments.length) return _yAxisPadding;
_yAxisPadding = _;
return _chart;
};
_chart.yAxisHeight = function () {
return _chart.effectiveHeight();
};
/**
#### .round([rounding function])
Set or get the rounding function for x axis. Rounding is mainly used to provide stepping capability when in place
selection based filter is enable.
```js
// set x unit round to by month, this will make sure range selection brash will
// extend on a month-by-month basis
chart.round(d3.time.month.round);
```
**/
_chart.round = function (_) {
if (!arguments.length) return _round;
_round = _;
return _chart;
};
_chart._rangeBandPadding = function (_) {
if (!arguments.length) return _rangeBandPadding;
_rangeBandPadding = _;
return _chart;
};
_chart._outerRangeBandPadding = function (_) {
if (!arguments.length) return _outerRangeBandPadding;
_outerRangeBandPadding = _;
return _chart;
};
dc.override(_chart, "filter", function (_) {
if (!arguments.length) return _chart._filter();
_chart._filter(_);
if (_) {
_chart.brush().extent(_);
} else {
_chart.brush().clear();
}
return _chart;
});
_chart.brush = function (_) {
if (!arguments.length) return _brush;
_brush = _;
return _chart;
};
function brushHeight() {
return _chart._xAxisY() - _chart.margins().top;
}
_chart.renderBrush = function (g) {
if (_brushOn) {
_brush.on("brush", _chart._brushing);
_brush.on("brushstart", _chart._disableMouseZoom);
_brush.on("brushend", configureMouseZoom);
var gBrush = g.append("g")
.attr("class", "brush")
.attr("transform", "translate(" + _chart.margins().left + "," + _chart.margins().top + ")")
.call(_brush.x(_chart.x()));
_chart.setBrushY(gBrush);
_chart.setHandlePaths(gBrush);
if (_chart.hasFilter()) {
_chart.redrawBrush(g);
}
}
};
_chart.setHandlePaths = function (gBrush) {
gBrush.selectAll(".resize").append("path").attr("d", _chart.resizeHandlePath);
};
_chart.setBrushY = function(gBrush){
gBrush.selectAll("rect").attr("height", brushHeight());
};
_chart.extendBrush = function () {
var extent = _brush.extent();
if (_chart.round()) {
extent[0] = extent.map(_chart.round())[0];
extent[1] = extent.map(_chart.round())[1];
_g.select(".brush")
.call(_brush.extent(extent));
}
return extent;
};
_chart.brushIsEmpty = function (extent) {
return _brush.empty() || !extent || extent[1] <= extent[0];
};
_chart._brushing = function() {
var extent = _chart.extendBrush();
_chart.redrawBrush(_g);
if (_chart.brushIsEmpty(extent)) {
dc.events.trigger(function () {
_chart.filter(null);
_chart.redrawGroup();
}, dc.constants.EVENT_DELAY);
} else {
var rangedFilter = dc.filters.RangedFilter(extent[0], extent[1]);
dc.events.trigger(function () {
_chart.replaceFilter(rangedFilter);
_chart.redrawGroup();
}, dc.constants.EVENT_DELAY);
}
};
_chart.redrawBrush = function (g) {
if (_brushOn) {
if (_chart.filter() && _chart.brush().empty())
_chart.brush().extent(_chart.filter());
var gBrush = g.select("g.brush");
gBrush.call(_chart.brush().x(_chart.x()));
_chart.setBrushY(gBrush);
}
_chart.fadeDeselectedArea();
};
_chart.fadeDeselectedArea = function () {
// do nothing, sub-chart should override this function
};
// borrowed from Crossfilter example
_chart.resizeHandlePath = function (d) {
var e = +(d == "e"), x = e ? 1 : -1, y = brushHeight() / 3;
/*jshint -W014 */
return "M" + (0.5 * x) + "," + y
+ "A6,6 0 0 " + e + " " + (6.5 * x) + "," + (y + 6)
+ "V" + (2 * y - 6)
+ "A6,6 0 0 " + e + " " + (0.5 * x) + "," + (2 * y)
+ "Z"
+ "M" + (2.5 * x) + "," + (y + 8)
+ "V" + (2 * y - 8)
+ "M" + (4.5 * x) + "," + (y + 8)
+ "V" + (2 * y - 8);
/*jshint +W014 */
};
function getClipPathId() {
return _chart.anchorName() + "-clip";
}
/**
#### .clipPadding([padding])
Get or set padding in pixel for clip path. Once set padding will be applied evenly to top, left, right, and bottom padding
when clip path is generated. If set to zero, then the clip area will be exactly the chart body area minus the margins.
Default: 5
**/
_chart.clipPadding = function (p) {
if (!arguments.length) return _clipPadding;
_clipPadding = p;
return _chart;
};
function generateClipPath() {
var defs = dc.utils.appendOrSelect(_parent, "defs");
var chartBodyClip = dc.utils.appendOrSelect(defs, "clipPath").attr("id", getClipPathId());
var padding = _clipPadding * 2;
dc.utils.appendOrSelect(chartBodyClip, "rect")
.attr("width", _chart.xAxisLength() + padding)
.attr("height", _chart.yAxisHeight() + padding);
}
_chart._preprocessData = function() {};
_chart._doRender = function () {
_chart.resetSvg();
_chart._preprocessData();
_chart._generateG();
generateClipPath();
drawChart(true);
configureMouseZoom();
return _chart;
};
_chart._doRedraw = function () {
_chart._preprocessData();
drawChart(false);
return _chart;
};
function drawChart (render) {
if (_chart.isOrdinal())
_brushOn = false;
prepareXAxis(_chart.g());
_chart._prepareYAxis(_chart.g());
_chart.plotData();
if (_chart.elasticX() || _refocused || render)
_chart.renderXAxis(_chart.g());
if (_chart.elasticY() || render)
_chart.renderYAxis(_chart.g());
if (render)
_chart.renderBrush(_chart.g());
else
_chart.redrawBrush(_chart.g());
}
function configureMouseZoom () {
if (_mouseZoomable) {
_chart._enableMouseZoom();
}
else if (_hasBeenMouseZoomable) {
_chart._disableMouseZoom();
}
}
_chart._enableMouseZoom = function () {
_hasBeenMouseZoomable = true;
_zoom.x(_chart.x())
.scaleExtent(_zoomScale)
.size([_chart.width(),_chart.height()]);
_chart.root().call(_zoom);
};
_chart._disableMouseZoom = function () {
_chart.root().call(_nullZoom);
};
function zoomHandler() {
_refocused = true;
if (_zoomOutRestrict) {
_chart.x().domain(constrainRange(_chart.x().domain(), _xOriginalDomain));
if (_rangeChart) {
_chart.x().domain(constrainRange(_chart.x().domain(), _rangeChart.x().domain()));
}
}
var domain = _chart.x().domain();
var domFilter = dc.filters.RangedFilter(domain[0], domain[1]);
_chart.replaceFilter(domFilter);
_chart.rescale();
_chart.redraw();
if (_rangeChart && !rangesEqual(_chart.filter(), _rangeChart.filter())) {
dc.events.trigger( function () {
_rangeChart.replaceFilter(domFilter);
_rangeChart.redraw();
});
}
_chart._invokeZoomedListener();
dc.events.trigger(function () {
_chart.redrawGroup();
}, dc.constants.EVENT_DELAY);
_refocused = !rangesEqual(domain, _xOriginalDomain);
}
function constrainRange(range, constraint) {
var constrainedRange = [];
constrainedRange[0] = d3.max([range[0], constraint[0]]);
constrainedRange[1] = d3.min([range[1], constraint[1]]);
return constrainedRange;
}
/**
#### .focus([range])
Zoom this chart to focus on the given range. The given range should be an array containing only 2 element([start, end]) defining an range in x domain. If the range is not given or set to null, then the zoom will be reset. _For focus to work elasticX has to be turned off otherwise focus will be ignored._
```js
chart.renderlet(function(chart){
// smooth the rendering through event throttling
dc.events.trigger(function(){
// focus some other chart to the range selected by user on this chart
someOtherChart.focus(chart.filter());
});
})
```
**/
_chart.focus = function (range) {
if (hasRangeSelected(range))
_chart.x().domain(range);
else
_chart.x().domain(_xOriginalDomain);
_zoom.x(_chart.x());
zoomHandler();
};
_chart.refocused = function () {
return _refocused;
};
_chart.focusChart = function (c) {
if (!arguments.length) return _focusChart;
_focusChart = c;
_chart.on("filtered", function (chart) {
if (!chart.filter()) {
dc.events.trigger(function() {
_focusChart.x().domain(_focusChart.xOriginalDomain());
});
} else if (!rangesEqual(chart.filter(), _focusChart.filter())) {
dc.events.trigger(function () {
_focusChart.focus(chart.filter());
});
}
});
return _chart;
};
function rangesEqual(range1, range2) {
if (!range1 && !range2) {
return true;
}
else if (!range1 || !range2) {
return false;
}
else if (range1.length === 0 && range2.length === 0) {
return true;
}
else if (range1[0].valueOf() === range2[0].valueOf() &&
range1[1].valueOf() === range2[1].valueOf()) {
return true;
}
else return false;
}
/**
#### .brushOn([boolean])
Turn on/off the brush based in-place range filter. When the brush is on then user will be able to simply drag the mouse
across the chart to perform range filtering based on the extend of the brush. However turning on brush filter will essentially
disable other interactive elements on the chart such as the highlighting, tool-tip, and reference lines on a chart. Zooming will still
be possible if enabled, but only via scrolling (panning will be disabled.) Default value is "true".
**/
_chart.brushOn = function (_) {
if (!arguments.length) return _brushOn;
_brushOn = _;
return _chart;
};
function hasRangeSelected(range) {
return range instanceof Array && range.length > 1;
}
return _chart;
};
/**
## Stack Mixin
Stack Mixin is an mixin that provides cross-chart support of stackability using d3.layout.stack.
**/
dc.stackMixin = function (_chart) {
var _stackLayout = d3.layout.stack()
.values(prepareValues);
var _stack = [];
var _titles = {};
var _hidableStacks = false;
function prepareValues(layer, layerIdx) {
var valAccessor = layer.accessor || _chart.valueAccessor();
layer.name = String(layer.name || layerIdx);
layer.values = layer.group.all().map(function(d,i) {
return {x: _chart.keyAccessor()(d,i),
y: layer.hidden ? null : valAccessor(d,i),
data: d,
layer: layer.name,
hidden: layer.hidden};
});
layer.values = layer.values.filter(domainFilter());
return layer.values;
}
function domainFilter() {
if (!_chart.x()) return d3.functor(true);
var xDomain = _chart.x().domain();
if (_chart.isOrdinal()) {
// TODO #416
//var domainSet = d3.set(xDomain);
return function(p) {
return true; //domainSet.has(p.x);
};
}
return function(p) {
//return true;
return p.x >= xDomain[0] && p.x <= xDomain[xDomain.length-1];
};
}
/**
#### .stack(group[, name, accessor])
Stack a new crossfilter group into this chart with optionally a custom value accessor. All stacks in the same chart will
share the same key accessor therefore share the same set of keys. In more concrete words, imagine in a stacked bar chart
all bars will be positioned using the same set of keys on the x axis while stacked vertically. If name is specified then
it will be used to generate legend label.
```js
// stack group using default accessor
chart.stack(valueSumGroup)
// stack group using custom accessor
.stack(avgByDayGroup, function(d){return d.value.avgByDay;});
```
**/
_chart.stack = function (group, name, accessor) {
if (!arguments.length) return _stack;
if (arguments.length <= 2)
accessor = name;
var layer = {group:group};
if (typeof name === 'string') layer.name = name;
if (typeof accessor === 'function') layer.accessor = accessor;
_stack.push(layer);
return _chart;
};
dc.override(_chart,'group', function (g,n,f) {
if (!arguments.length) return _chart._group();
_stack = [];
_titles = {};
_chart.stack(g,n);
if (f) _chart.valueAccessor(f);
return _chart._group(g,n);
});
/**
#### .hidableStacks([boolean])
Allow named stacks to be hidden or shown by clicking on legend items.
This does not affect the behavior of hideStack or showStack.
**/
_chart.hidableStacks = function(_) {
if (!arguments.length) return _hidableStacks;
_hidableStacks = _;
return _chart;
};
function findLayerByName(n) {
var i = _stack.map(dc.pluck('name')).indexOf(n);
return _stack[i];
}
/**
#### .hideStack(name)
Hide all stacks on the chart with the given name.
The chart must be re-rendered for this change to appear.
**/
_chart.hideStack = function (stackName) {
var layer = findLayerByName(stackName);
if (layer) layer.hidden = true;
return _chart;
};
/**
#### .showStack(name)
Show all stacks on the chart with the given name.
The chart must be re-rendered for this change to appear.
**/
_chart.showStack = function (stackName) {
var layer = findLayerByName(stackName);
if (layer) layer.hidden = false;
return _chart;
};
_chart.getValueAccessorByIndex = function (index) {
return _stack[index].accessor || _chart.valueAccessor();
};
_chart.yAxisMin = function () {
var min = d3.min(flattenStack(), function (p) {
return (p.y + p.y0 < p.y0) ? (p.y + p.y0) : p.y0;
});
return dc.utils.subtract(min, _chart.yAxisPadding());
};
_chart.yAxisMax = function () {
var max = d3.max(flattenStack(), function (p) {
return p.y + p.y0;
});
return dc.utils.add(max, _chart.yAxisPadding());
};
function flattenStack() {
return _chart.data().reduce(function(all,layer) {
return all.concat(layer.values);
},[]);
}
_chart.xAxisMin = function () {
var min = d3.min(flattenStack(), dc.pluck('x'));
return dc.utils.subtract(min, _chart.xAxisPadding());
};
_chart.xAxisMax = function () {
var max = d3.max(flattenStack(), dc.pluck('x'));
return dc.utils.add(max, _chart.xAxisPadding());
};
/**
#### .title([stackName], [titleFunction])
Set or get the title function. Chart class will use this function to render svg title (usually interpreted by browser
as tooltips) for each child element in the chart, i.e. a slice in a pie chart or a bubble in a bubble chart. Almost
every chart supports title function however in grid coordinate chart you need to turn off brush in order to use title
otherwise the brush layer will block tooltip trigger.
If the first argument is a stack name, the title function will get or set the title for that stack. If stackName
is not provided, the first stack is implied.
```js
// set a title function on "first stack"
chart.title("first stack", function(d) { return d.key + ": " + d.value; });
// get a title function from "second stack"
var secondTitleFunction = chart.title("second stack");
);
```
**/
dc.override(_chart, "title", function (stackName, titleAccessor) {
if (!stackName) return _chart._title();
if (typeof stackName === 'function') return _chart._title(stackName);
if (stackName == _chart._groupName && typeof titleAccessor === 'function')
return _chart._title(titleAccessor);
if (typeof titleAccessor !== 'function') return _titles[stackName] || _chart._title();
_titles[stackName] = titleAccessor;
return _chart;
});
_chart.stackLayout = function (stack) {
if (!arguments.length) return _stackLayout;
_stackLayout = stack;
return _chart;
};
function visability(l) {
return !l.hidden;
}
_chart.data(function() {
// return _stackLayout(_stack);
var layers = _stack.filter(visability);
return layers.length ? _chart.stackLayout()(layers) : [];
});
_chart._ordinalXDomain = function () {
return flattenStack().map(dc.pluck('x'));
};
_chart.colorAccessor(function (d) {
var layer = this.layer || this.name || d.name || d.layer;
return layer;
});
_chart.legendables = function () {
return _stack.map(function (layer, i) {
return {chart:_chart, name:layer.name, hidden: layer.hidden || false, color:_chart.getColor.call(layer,layer.values,i)};
});
};
_chart.isLegendableHidden = function (d) {
var layer = findLayerByName(d.name);
return layer ? layer.hidden : false;
};
_chart.legendToggle = function (d) {
if(_hidableStacks) {
if (_chart.isLegendableHidden(d)) _chart.showStack(d.name);
else _chart.hideStack(d.name);
//_chart.redraw();
dc.renderAll(_chart.chartGroup());
}
};
return _chart;
};
/**
## Cap Mixin
Cap is a mixin that groups small data elements below a _cap_ into an *others* grouping for both the Row and Pie Charts.
The top ordered elements in the group up to the cap amount will be kept in the chart and
the sum of those below will be added to the *others* element. The keys of the elements below the cap limit are recorded
in order to repsond to onClick events and trigger filtering of all the within that grouping.
**/
dc.capMixin = function (_chart) {
var _cap = Infinity;
var _othersLabel = "Others";
var _othersGrouper = function (topRows) {
var topRowsSum = d3.sum(topRows, _chart.valueAccessor()),
allRows = _chart.group().all(),
allRowsSum = d3.sum(allRows, _chart.valueAccessor()),
topKeys = topRows.map(_chart.keyAccessor()),
allKeys = allRows.map(_chart.keyAccessor()),
topSet = d3.set(topKeys),
others = allKeys.filter(function(d){return !topSet.has(d);});
if (allRowsSum > topRowsSum)
return topRows.concat([{"others": others, "key": _othersLabel, "value": allRowsSum - topRowsSum}]);
return topRows;
};
_chart.cappedKeyAccessor = function(d,i) {
if (d.others)
return d.key;
return _chart.keyAccessor()(d,i);
};
_chart.cappedValueAccessor = function(d,i) {
if (d.others)
return d.value;
return _chart.valueAccessor()(d,i);
};
_chart.data(function(group) {
if (_cap == Infinity) {
return _chart._computeOrderedGroups(group.all());
} else {
var topRows = group.top(_cap); // ordered by crossfilter group order (default value)
topRows = _chart._computeOrderedGroups(topRows); // re-order using ordering (default key)
if (_othersGrouper) return _othersGrouper(topRows);
return topRows;
}
});
/**
#### .cap([count])
Get or set the count of elements to that will be included in the cap.
**/
_chart.cap = function (_) {
if (!arguments.length) return _cap;
_cap = _;
return _chart;
};
/**
#### .othersLabel([label])
Get or set the label for *Others* slice when slices cap is specified. Default label is **Others**.
**/
_chart.othersLabel = function (_) {
if (!arguments.length) return _othersLabel;
_othersLabel = _;
return _chart;
};
/**
#### .othersGrouper([grouperFunction])
Get or set the grouper function that will perform the insertion of data for the *Others* slice if the slices cap is
specified. If set to a falsy value, no others will be added. By default the grouper function computes the sum of all
values below the cap.
```js
chart.othersGrouper(function (data) {
// compute the value for others, presumably the sum of all values below the cap
var othersSum = yourComputeOthersValueLogic(data)
// the keys are needed to properly filter when the others element is clicked
var othersKeys = yourComputeOthersKeysArrayLogic(data);
// add the others row to the dataset
data.push({"key": "Others", "value": othersSum, "others": othersKeys });
return data;
});
```
**/
_chart.othersGrouper = function (_) {
if (!arguments.length) return _othersGrouper;
_othersGrouper = _;
return _chart;
};
dc.override(_chart, "onClick", function (d) {
if (d.others)
_chart.filter([d.others]);
_chart._onClick(d);
});
return _chart;
};
/**
## Bubble Mixin
Includes: [Color Mixin](#color-mixin)
This Mixin provides reusable functionalities for any chart that needs to visualize data using bubbles.
**/
dc.bubbleMixin = function (_chart) {
var _maxBubbleRelativeSize = 0.3;
var _minRadiusWithLabel = 10;
_chart.BUBBLE_NODE_CLASS = "node";
_chart.BUBBLE_CLASS = "bubble";
_chart.MIN_RADIUS = 10;
_chart = dc.colorMixin(_chart);
_chart.renderLabel(true);
_chart.renderTitle(false);
_chart.data(function(group) {
return group.top(Infinity);
});
var _r = d3.scale.linear().domain([0, 100]);
var _rValueAccessor = function (d) {
return d.r;
};
/**
#### .r([bubbleRadiusScale])
Get or set bubble radius scale. By default bubble chart uses ```d3.scale.linear().domain([0, 100])``` as it's r scale .
**/
_chart.r = function (_) {
if (!arguments.length) return _r;
_r = _;
return _chart;
};
/**
#### .radiusValueAccessor([radiusValueAccessor])
Get or set the radius value accessor function. The radius value accessor function if set will be used to retrieve data value
for each and every bubble rendered. The data retrieved then will be mapped using r scale to be used as the actual bubble
radius. In other words, this allows you to encode a data dimension using bubble size.
**/
_chart.radiusValueAccessor = function (_) {
if (!arguments.length) return _rValueAccessor;
_rValueAccessor = _;
return _chart;
};
_chart.rMin = function () {
var min = d3.min(_chart.data(), function (e) {
return _chart.radiusValueAccessor()(e);
});
return min;
};
_chart.rMax = function () {
var max = d3.max(_chart.data(), function (e) {
return _chart.radiusValueAccessor()(e);
});
return max;
};
_chart.bubbleR = function (d) {
var value = _chart.radiusValueAccessor()(d);
var r = _chart.r()(value);
if (isNaN(r) || value <= 0)
r = 0;
return r;
};
var labelFunction = function (d) {
return _chart.label()(d);
};
var labelOpacity = function (d) {
return (_chart.bubbleR(d) > _minRadiusWithLabel) ? 1 : 0;
};
_chart._doRenderLabel = function (bubbleGEnter) {
if (_chart.renderLabel()) {
var label = bubbleGEnter.select("text");
if (label.empty()) {
label = bubbleGEnter.append("text")
.attr("text-anchor", "middle")
.attr("dy", ".3em")
.on("click", _chart.onClick);
}
label
.attr("opacity", 0)
.text(labelFunction);
dc.transition(label, _chart.transitionDuration())
.attr("opacity", labelOpacity);
}
};
_chart.doUpdateLabels = function (bubbleGEnter) {
if (_chart.renderLabel()) {
var labels = bubbleGEnter.selectAll("text")
.text(labelFunction);
dc.transition(labels, _chart.transitionDuration())
.attr("opacity", labelOpacity);
}
};
var titleFunction = function (d) {
return _chart.title()(d);
};
_chart._doRenderTitles = function (g) {
if (_chart.renderTitle()) {
var title = g.select("title");
if (title.empty())
g.append("title").text(titleFunction);
}
};
_chart.doUpdateTitles = function (g) {
if (_chart.renderTitle()) {
g.selectAll("title").text(titleFunction);
}
};
/**
#### .minRadiusWithLabel([radius])
Get or set the minimum radius for label rendering. If a bubble's radius is less than this value then no label will be rendered.
Default value: 10.
**/
_chart.minRadiusWithLabel = function (_) {
if (!arguments.length) return _minRadiusWithLabel;
_minRadiusWithLabel = _;
return _chart;
};
/**
#### .maxBubbleRelativeSize([relativeSize])
Get or set the maximum relative size of a bubble to the length of x axis. This value is useful when the radius differences among
different bubbles are too great. Default value: 0.3
**/
_chart.maxBubbleRelativeSize = function (_) {
if (!arguments.length) return _maxBubbleRelativeSize;
_maxBubbleRelativeSize = _;
return _chart;
};
_chart.fadeDeselectedArea = function () {
if (_chart.hasFilter()) {
_chart.selectAll("g." + _chart.BUBBLE_NODE_CLASS).each(function (d) {
if (_chart.isSelectedNode(d)) {
_chart.highlightSelected(this);
} else {
_chart.fadeDeselected(this);
}
});
} else {
_chart.selectAll("g." + _chart.BUBBLE_NODE_CLASS).each(function (d) {
_chart.resetHighlight(this);
});
}
};
_chart.isSelectedNode = function (d) {
return _chart.hasFilter(d.key);
};
_chart.onClick = function (d) {
var filter = d.key;
dc.events.trigger(function () {
_chart.filter(filter);
dc.redrawAll(_chart.chartGroup());
});
};
return _chart;
};
/**
## Pie Chart
Includes: [Cap Mixin](#cap-mixin), [Color Mixin](#color-mixin), [Base Mixin](#base-mixin)
The pie chart implementation is usually used to visualize small number of categorical distributions.
Pie chart uses keyAccessor to generate slices, and valueAccessor to calculate the size of each slice(key)
relatively to the total sum of all values. Slices are ordered by `.ordering` which defaults to sorting by key.
Examples:
* [Nasdaq 100 Index](http://dc-js.github.com/dc.js/)
#### dc.pieChart(parent[, chartGroup])
Create a pie chart instance and attach it to the given parent element.
Parameters:
* parent : string - any valid d3 single selector representing typically a dom block element such
as a div.
* chartGroup : string (optional) - name of the chart group this chart instance should be placed in. Once a chart is placed
in a certain chart group then any interaction with such instance will only trigger events and redraw within the same
chart group.
Return:
A newly created pie chart instance
```js
// create a pie chart under #chart-container1 element using the default global chart group
var chart1 = dc.pieChart("#chart-container1");
// create a pie chart under #chart-container2 element using chart group A
var chart2 = dc.pieChart("#chart-container2", "chartGroupA");
```
**/
dc.pieChart = function (parent, chartGroup) {
var DEFAULT_MIN_ANGLE_FOR_LABEL = 0.5;
var _sliceCssClass = "pie-slice";
var _radius,
_innerRadius = 0;
var _g;
var _minAngleForLabel = DEFAULT_MIN_ANGLE_FOR_LABEL;
var _externalLabelRadius;
var _chart = dc.capMixin(dc.colorMixin(dc.baseMixin({})));
_chart.colorAccessor(_chart.cappedKeyAccessor);
_chart.title(function (d) {
return _chart.cappedKeyAccessor(d) + ": " + _chart.cappedValueAccessor(d);
});
/**
#### .slicesCap([cap])
Get or set the maximum number of slices the pie chart will generate. The top slices are determined by
value from high to low. Other slices exeeding the cap will be rolled up into one single *Others* slice.
The resulting data will still be sorted by .ordering (default by key).
**/
_chart.slicesCap = _chart.cap;
_chart.label(_chart.cappedKeyAccessor);
_chart.renderLabel(true);
_chart.transitionDuration(350);
_chart._doRender = function () {
_chart.resetSvg();
_g = _chart.svg()
.append("g")
.attr("transform", "translate(" + _chart.cx() + "," + _chart.cy() + ")");
drawChart();
return _chart;
};
function drawChart() {
// set radius on basis of chart dimension if missing
_radius = _radius ? _radius : d3.min([_chart.width(), _chart.height()]) /2;
var arc = buildArcs();
var pie = pieLayout();
var pieData = pie(_chart.data());
if (_g) {
var slices = _g.selectAll("g." + _sliceCssClass)
.data(pieData);
createElements(slices, arc, pieData);
updateElements(pieData, arc);
removeElements(slices);
highlightFilter();
}
}
function createElements(slices, arc, pieData) {
var slicesEnter = createSliceNodes(slices);
createSlicePath(slicesEnter, arc);
createTitles(slicesEnter);
createLabels(pieData, arc);
}
function createSliceNodes(slices) {
var slicesEnter = slices
.enter()
.append("g")
.attr("class", function (d, i) {
return _sliceCssClass + " _" + i;
});
return slicesEnter;
}
function createSlicePath(slicesEnter, arc) {
var slicePath = slicesEnter.append("path")
.attr("fill", fill)
.on("click", onClick)
.attr("d", function (d, i) {
return safeArc(d, i, arc);
});
slicePath.transition()
.duration(_chart.transitionDuration())
.attrTween("d", tweenPie);
}
function createTitles(slicesEnter) {
if (_chart.renderTitle()) {
slicesEnter.append("title").text(function (d) {
return _chart.title()(d);
});
}
}
function positionLabels(labelsEnter, arc) {
dc.transition(labelsEnter, _chart.transitionDuration())
.attr("transform", function (d) {
return labelPosition(d, arc);
})
.attr("text-anchor", "middle")
.text(function (d) {
var data = d.data;
if (sliceHasNoData(data) || sliceTooSmall(d))
return "";
return _chart.label()(d.data);
});
}
function createLabels(pieData, arc) {
if (_chart.renderLabel()) {
var labels = _g.selectAll("text." + _sliceCssClass)
.data(pieData);
labels.exit().remove();
var labelsEnter = labels
.enter()
.append("text")
.attr("class", function (d, i) {
var classes = _sliceCssClass + " _" + i;
if(_externalLabelRadius)
classes += " external";
return classes;
})
.on("click", onClick);
positionLabels(labelsEnter, arc);
}
}
function updateElements(pieData, arc) {
updateSlicePaths(pieData, arc);
updateLabels(pieData, arc);
updateTitles(pieData);
}
function updateSlicePaths(pieData, arc) {
var slicePaths = _g.selectAll("g." + _sliceCssClass)
.data(pieData)
.select("path")
.attr("d", function (d, i) {
return safeArc(d, i, arc);
});
dc.transition(slicePaths, _chart.transitionDuration(),
function (s) {
s.attrTween("d", tweenPie);
}).attr("fill", fill);
}
function updateLabels(pieData, arc) {
if (_chart.renderLabel()) {
var labels = _g.selectAll("text." + _sliceCssClass)
.data(pieData);
positionLabels(labels, arc);
}
}
function updateTitles(pieData) {
if (_chart.renderTitle()) {
_g.selectAll("g." + _sliceCssClass)
.data(pieData)
.select("title")
.text(function (d) {
return _chart.title()(d.data);
});
}
}
function removeElements(slices) {
slices.exit().remove();
}
function highlightFilter() {
if (_chart.hasFilter()) {
_chart.selectAll("g." + _sliceCssClass).each(function (d) {
if (isSelectedSlice(d)) {
_chart.highlightSelected(this);
} else {
_chart.fadeDeselected(this);
}
});
} else {
_chart.selectAll("g." + _sliceCssClass).each(function (d) {
_chart.resetHighlight(this);
});
}
}
/**
#### .innerRadius([innerRadius])
Get or set the inner radius on a particular pie chart instance. If inner radius is greater than 0px then the pie chart
will be essentially rendered as a doughnut chart. Default inner radius is 0px.
**/
_chart.innerRadius = function (r) {
if (!arguments.length) return _innerRadius;
_innerRadius = r;
return _chart;
};
/**
#### .radius([radius])
Get or set the radius on a particular pie chart instance. Default radius is 90px.
**/
_chart.radius = function (r) {
if (!arguments.length) return _radius;
_radius = r;
return _chart;
};
/**
#### .cx()
Get center x coordinate position. This function is **not chainable**.
**/
_chart.cx = function () {
return _chart.width() / 2;
};
/**
#### .cy()
Get center y coordinate position. This function is **not chainable**.
**/
_chart.cy = function () {
return _chart.height() / 2;
};
function buildArcs() {
return d3.svg.arc().outerRadius(_radius).innerRadius(_innerRadius);
}
function isSelectedSlice(d) {
return _chart.hasFilter(_chart.cappedKeyAccessor(d.data));
}
_chart._doRedraw = function () {
drawChart();
return _chart;
};
/**
#### .minAngleForLabel([minAngle])
Get or set the minimal slice angle for label rendering. Any slice with a smaller angle will not render slice label.
Default min angle is 0.5.
**/
_chart.minAngleForLabel = function (_) {
if (!arguments.length) return _minAngleForLabel;
_minAngleForLabel = _;
return _chart;
};
function pieLayout() {
return d3.layout.pie().sort(null).value(_chart.cappedValueAccessor);
}
function sliceTooSmall(d) {
var angle = (d.endAngle - d.startAngle);
return isNaN(angle) || angle < _minAngleForLabel;
}
function sliceHasNoData(d) {
return _chart.cappedValueAccessor(d) === 0;
}
function tweenPie(b) {
b.innerRadius = _innerRadius;
var current = this._current;
if (isOffCanvas(current))
current = {startAngle: 0, endAngle: 0};
var i = d3.interpolate(current, b);
this._current = i(0);
return function (t) {
return safeArc(i(t), 0, buildArcs());
};
}
function isOffCanvas(current) {
return !current || isNaN(current.startAngle) || isNaN(current.endAngle);
}
function fill(d, i) {
return _chart.getColor(d.data, i);
}
function onClick(d, i) {
_chart.onClick(d.data, i);
}
function safeArc(d, i, arc) {
var path = arc(d, i);
if (path.indexOf("NaN") >= 0)
path = "M0,0";
return path;
}
/**
#### .externalLabels([radius])
Position slice labels offset from the outer edge of the chart
The given argument sets the radial offset.
*/
_chart.externalLabels = function(radius) {
if (arguments.length === 0) {
return _externalLabelRadius;
} else if(radius) {
_externalLabelRadius = radius;
} else {
_externalLabelRadius = undefined;
}
return _chart;
};
function labelPosition(d, arc) {
var centroid;
if( _externalLabelRadius ) {
centroid = d3.svg.arc()
.outerRadius(_radius+_externalLabelRadius)
.innerRadius(_radius+_externalLabelRadius)
.centroid(d);
} else {
centroid = arc.centroid(d);
}
if (isNaN(centroid[0]) || isNaN(centroid[1])) {
return "translate(0,0)";
} else {
return "translate(" + centroid + ")";
}
}
_chart.legendables = function() {
return _chart.data().map(function (d, i) {
var legendable = { name: d.key, data: d.value, others: d.others, chart:_chart };
legendable.color = _chart.getColor(d,i);
return legendable;
});
};
_chart.legendHighlight = function(d) {
highlightSliceFromLegendable(d, true);
};
_chart.legendReset = function(d) {
highlightSliceFromLegendable(d, false);
};
_chart.legendToggle = function(d) {
_chart.onClick({ key: d.name, others: d.others });
};
function highlightSliceFromLegendable(legendable, highlighted) {
_chart.selectAll('g.pie-slice').each(function (d) {
if (legendable.name == d.data.key) {
d3.select(this).classed("highlight", highlighted);
}
});
}
return _chart.anchor(parent, chartGroup);
};
/**
## Bar Chart
Includes: [Stack Mixin](#stack Mixin), [Coordinate Grid Mixin](#coordinate-grid-mixin)
Concrete bar chart/histogram implementation.
Examples:
* [Nasdaq 100 Index](http://dc-js.github.com/dc.js/)
* [Canadian City Crime Stats](http://dc-js.github.com/dc.js/crime/index.html)
#### dc.barChart(parent[, chartGroup])
Create a bar chart instance and attach it to the given parent element.
Parameters:
* parent : string|compositeChart - any valid d3 single selector representing typically a dom block element such
as a div, or if this bar chart is a sub-chart in a [Composite Chart](#composite-chart) then pass in the parent composite chart instance.
* chartGroup : string (optional) - name of the chart group this chart instance should be placed in. Once a chart is placed
in a certain chart group then any interaction with such instance will only trigger events and redraw within the same
chart group.
Return:
A newly created bar chart instance
```js
// create a bar chart under #chart-container1 element using the default global chart group
var chart1 = dc.barChart("#chart-container1");
// create a bar chart under #chart-container2 element using chart group A
var chart2 = dc.barChart("#chart-container2", "chartGroupA");
// create a sub-chart under a composite parent chart
var chart3 = dc.barChart(compositeChart);
```
**/
dc.barChart = function (parent, chartGroup) {
var MIN_BAR_WIDTH = 1;
var DEFAULT_GAP_BETWEEN_BARS = 2;
var _chart = dc.stackMixin(dc.coordinateGridMixin({}));
var _gap = DEFAULT_GAP_BETWEEN_BARS;
var _centerBar = false;
var _alwaysUseRounding = false;
var _barWidth;
dc.override(_chart, 'rescale', function () {
_chart._rescale();
_barWidth = undefined;
});
dc.override(_chart, 'render', function () {
if (_chart.round() && _centerBar && !_alwaysUseRounding) {
dc.logger.warn("By default, brush rounding is disabled if bars are centered. " +
"See dc.js bar chart API documentation for details.");
}
_chart._render();
});
_chart.plotData = function () {
var layers = _chart.chartBodyG().selectAll("g.stack")
.data(_chart.data());
calculateBarWidth();
layers
.enter()
.append("g")
.attr("class", function (d, i) {
return "stack " + "_" + i;
});
layers.each(function (d, i) {
var layer = d3.select(this);
renderBars(layer, i, d);
});
};
function barHeight(d) {
return dc.utils.safeNumber(Math.abs(_chart.y()(d.y + d.y0) - _chart.y()(d.y0)));
}
function renderBars(layer, layerIndex, d) {
var bars = layer.selectAll("rect.bar")
.data(d.values, dc.pluck('x'));
bars.enter()
.append("rect")
.attr("class", "bar")
.attr("fill", dc.pluck('data',_chart.getColor));
if (_chart.renderTitle())
bars.append("title").text(dc.pluck('data',_chart.title(d.name)));
if (_chart.isOrdinal())
bars.on("click", onClick);
dc.transition(bars, _chart.transitionDuration())
.attr("x", function (d) {
var x = _chart.x()(d.x);
if (_centerBar) x -= _barWidth / 2;
if (_chart.isOrdinal()) x += _gap/2;
return dc.utils.safeNumber(x);
})
.attr("y", function (d) {
var y = _chart.y()(d.y + d.y0);
if (d.y < 0)
y -= barHeight(d);
return dc.utils.safeNumber(y);
})
.attr("width", _barWidth)
.attr("height", function (d) {
return barHeight(d);
})
.attr("fill", dc.pluck('data',_chart.getColor))
.select("title").text(dc.pluck('data',_chart.title(d.name)));
dc.transition(bars.exit(), _chart.transitionDuration())
.attr("height", 0)
.remove();
}
function calculateBarWidth() {
if (_barWidth === undefined) {
var numberOfBars = _chart.xUnitCount();
if (_chart.isOrdinal() && !_gap)
_barWidth = Math.floor(_chart.x().rangeBand());
else if (_gap)
_barWidth = Math.floor((_chart.xAxisLength() - (numberOfBars - 1) * _gap) / numberOfBars);
else
_barWidth = Math.floor(_chart.xAxisLength() / (1 + _chart.barPadding()) / numberOfBars);
if (_barWidth == Infinity || isNaN(_barWidth) || _barWidth < MIN_BAR_WIDTH)
_barWidth = MIN_BAR_WIDTH;
}
}
_chart.fadeDeselectedArea = function () {
var bars = _chart.chartBodyG().selectAll("rect.bar");
var extent = _chart.brush().extent();
if (_chart.isOrdinal()) {
if (_chart.hasFilter()) {
bars.classed(dc.constants.SELECTED_CLASS, function (d) {
return _chart.hasFilter(d.x);
});
bars.classed(dc.constants.DESELECTED_CLASS, function (d) {
return !_chart.hasFilter(d.x);
});
} else {
bars.classed(dc.constants.SELECTED_CLASS, false);
bars.classed(dc.constants.DESELECTED_CLASS, false);
}
} else {
if (!_chart.brushIsEmpty(extent)) {
var start = extent[0];
var end = extent[1];
bars.classed(dc.constants.DESELECTED_CLASS, function (d) {
return d.x < start || d.x >= end;
});
} else {
bars.classed(dc.constants.DESELECTED_CLASS, false);
}
}
};
/**
#### .centerBar(boolean)
Whether the bar chart will render each bar centered around the data position on x axis. Default to false.
**/
_chart.centerBar = function (_) {
if (!arguments.length) return _centerBar;
_centerBar = _;
return _chart;
};
function onClick(d) {
_chart.onClick(d.data);
}
/**
#### .barPadding([padding])
Get or set the spacing between bars as a fraction of bar size. Valid values are within 0-1.
Setting this value will also remove any previously set `gap`. See the
[d3 docs](https://github.com/mbostock/d3/wiki/Ordinal-Scales#wiki-ordinal_rangeBands)
for a visual description of how the padding is applied.
**/
_chart.barPadding = function (_) {
if (!arguments.length) return _chart._rangeBandPadding();
_chart._rangeBandPadding(_);
_gap = 0;
return _chart;
};
/**
#### .outerPadding([padding])
Get or set the outer padding on an ordinal bar chart. This setting has no effect on non-ordinal charts.
Padding equivlent in width to `padding * barWidth` will be added on each side of the chart.
Default: 0.5
**/
_chart.outerPadding = _chart._outerRangeBandPadding;
/**
#### .gap(gapBetweenBars)
Manually set fixed gap (in px) between bars instead of relying on the default auto-generated gap. By default bar chart
implementation will calculate and set the gap automatically based on the number of data points and the length of the x axis.
**/
_chart.gap = function (_) {
if (!arguments.length) return _gap;
_gap = _;
return _chart;
};
_chart.extendBrush = function () {
var extent = _chart.brush().extent();
if (_chart.round() && (!_centerBar || _alwaysUseRounding)) {
extent[0] = extent.map(_chart.round())[0];
extent[1] = extent.map(_chart.round())[1];
_chart.chartBodyG().select(".brush")
.call(_chart.brush().extent(extent));
}
return extent;
};
/**
#### .alwaysUseRounding([boolean])
Set or get the flag which determines whether rounding is enabled when bars are centered (default: false).
If false, using rounding with centered bars will result in a warning and rounding will be ignored.
This flag has no effect if bars are not centered.
When using standard d3.js rounding methods, the brush often doesn't align correctly with centered bars since the bars are offset.
The rounding function must add an offset to compensate, such as in the following example.
```js
chart.round(function(n) {return Math.floor(n)+0.5});
```
**/
_chart.alwaysUseRounding = function (_) {
if (!arguments.length) return _alwaysUseRounding;
_alwaysUseRounding = _;
return _chart;
};
function colorFilter(color,inv) {
return function() {
var item = d3.select(this);
var match = item.attr('fill') == color;
return inv ? !match : match;
};
}
_chart.legendHighlight = function (d) {
if(!_chart.isLegendableHidden(d)) {
_chart.g().selectAll('rect.bar')
.classed('highlight', colorFilter(d.color))
.classed('fadeout', colorFilter(d.color,true));
}
};
_chart.legendReset = function () {
_chart.g().selectAll('rect.bar')
.classed('highlight', false)
.classed('fadeout', false);
};
dc.override(_chart, "xAxisMax", function() {
var max = this._xAxisMax();
if('resolution' in _chart.xUnits()) {
var res = _chart.xUnits().resolution;
max += res;
}
return max;
});
return _chart.anchor(parent, chartGroup);
};
/**
## Line Chart
Includes [Stack Mixin](#stack-mixin), [Coordinate Grid Mixin](#coordinate-grid-mixin)
Concrete line/area chart implementation.
Examples:
* [Nasdaq 100 Index](http://dc-js.github.com/dc.js/)
* [Canadian City Crime Stats](http://dc-js.github.com/dc.js/crime/index.html)
#### dc.lineChart(parent[, chartGroup])
Create a line chart instance and attach it to the given parent element.
Parameters:
* parent : string|compositeChart - any valid d3 single selector representing typically a dom block element such
as a div, or if this line chart is a sub-chart in a [Composite Chart](#composite-chart) then pass in the parent composite chart instance.
* chartGroup : string (optional) - name of the chart group this chart instance should be placed in. Once a chart is placed
in a certain chart group then any interaction with such instance will only trigger events and redraw within the same
chart group.
Return:
A newly created line chart instance
```js
// create a line chart under #chart-container1 element using the default global chart group
var chart1 = dc.lineChart("#chart-container1");
// create a line chart under #chart-container2 element using chart group A
var chart2 = dc.lineChart("#chart-container2", "chartGroupA");
// create a sub-chart under a composite parent chart
var chart3 = dc.lineChart(compositeChart);
```
**/
dc.lineChart = function (parent, chartGroup) {
var DEFAULT_DOT_RADIUS = 5;
var TOOLTIP_G_CLASS = "dc-tooltip";
var DOT_CIRCLE_CLASS = "dot";
var Y_AXIS_REF_LINE_CLASS = "yRef";
var X_AXIS_REF_LINE_CLASS = "xRef";
var DEFAULT_DOT_OPACITY = 1e-6;
var _chart = dc.stackMixin(dc.coordinateGridMixin({}));
var _renderArea = false;
var _dotRadius = DEFAULT_DOT_RADIUS;
var _dataPointRadius = null;
var _dataPointFillOpacity = DEFAULT_DOT_OPACITY;
var _dataPointStrokeOpacity = DEFAULT_DOT_OPACITY;
var _interpolate = 'linear';
var _tension = 0.7;
var _defined;
var _dashStyle;
_chart.transitionDuration(500);
_chart._rangeBandPadding(1);
_chart.plotData = function () {
var chartBody = _chart.chartBodyG();
var layersList = chartBody.selectAll("g.stack-list");
if (layersList.empty()) layersList = chartBody.append("g").attr("class", "stack-list");
var layers = layersList.selectAll("g.stack").data(_chart.data());
var layersEnter = layers
.enter()
.append("g")
.attr("class", function (d, i) {
return "stack " + "_" + i;
});
drawLine(layersEnter, layers);
drawArea(layersEnter, layers);
drawDots(chartBody, layers);
};
_chart.interpolate = function(_){
if (!arguments.length) return _interpolate;
_interpolate = _;
return _chart;
};
_chart.tension = function(_){
if (!arguments.length) return _tension;
_tension = _;
return _chart;
};
_chart.defined = function(_){
if (!arguments.length) return _defined;
_defined = _;
return _chart;
};
/**
#### .dashStyle([array])
Set the line's d3 dashstyle. This value becomes "stroke-dasharray" of line. Defaults to empty array (solid line).
```js
// create a Dash Dot Dot Dot
chart.dashStyle([3,1,1,1]);
```
**/
_chart.dashStyle = function (_) {
if (!arguments.length) return _dashStyle;
_dashStyle = _;
return _chart;
};
/**
#### .renderArea([boolean])
Get or set render area flag. If the flag is set to true then the chart will render the area beneath each line and effectively
becomes an area chart.
**/
_chart.renderArea = function (_) {
if (!arguments.length) return _renderArea;
_renderArea = _;
return _chart;
};
function colors(d, i) {
return _chart.getColor.call(d,d.values,i);
}
function drawLine(layersEnter, layers) {
var line = d3.svg.line()
.x(function (d) {
return _chart.x()(d.x);
})
.y(function (d) {
return _chart.y()(d.y + d.y0);
})
.interpolate(_interpolate)
.tension(_tension);
if (_defined)
line.defined(_defined);
var path = layersEnter.append("path")
.attr("class", "line")
.attr("stroke", colors);
if (_dashStyle)
path.attr("stroke-dasharray", _dashStyle);
dc.transition(layers.select("path.line"), _chart.transitionDuration())
//.ease("linear")
.attr("stroke", colors)
.attr("d", function (d) {
return safeD(line(d.values));
});
}
function drawArea(layersEnter, layers) {
if (_renderArea) {
var area = d3.svg.area()
.x(function (d) {
return _chart.x()(d.x);
})
.y(function (d) {
return _chart.y()(d.y + d.y0);
})
.y0(function (d) {
return _chart.y()(d.y0);
})
.interpolate(_interpolate)
.tension(_tension);
if (_defined)
area.defined(_defined);
layersEnter.append("path")
.attr("class", "area")
.attr("fill", colors)
.attr("d", function (d) {
return safeD(area(d.values));
});
dc.transition(layers.select("path.area"), _chart.transitionDuration())
//.ease("linear")
.attr("fill", colors)
.attr("d", function (d) {
return safeD(area(d.values));
});
}
}
function safeD(d){
return (!d || d.indexOf("NaN") >= 0) ? "M0,0" : d;
}
function drawDots(chartBody, layers) {
if (!_chart.brushOn()) {
var tooltipListClass = TOOLTIP_G_CLASS + "-list";
var tooltips = chartBody.select("g." + tooltipListClass);
if (tooltips.empty()) tooltips = chartBody.append("g").attr("class", tooltipListClass);
layers.each(function (d, layerIndex) {
var points = d.values;
if (_defined) points = points.filter(_defined);
var g = tooltips.select("g." + TOOLTIP_G_CLASS + "._" + layerIndex);
if (g.empty()) g = tooltips.append("g").attr("class", TOOLTIP_G_CLASS + " _" + layerIndex);
createRefLines(g);
var dots = g.selectAll("circle." + DOT_CIRCLE_CLASS)
.data(points,dc.pluck('x'));
dots.enter()
.append("circle")
.attr("class", DOT_CIRCLE_CLASS)
.attr("r", getDotRadius())
.attr("fill", _chart.getColor)
.style("fill-opacity", _dataPointFillOpacity)
.style("stroke-opacity", _dataPointStrokeOpacity)
.on("mousemove", function (d) {
var dot = d3.select(this);
showDot(dot);
showRefLines(dot, g);
})
.on("mouseout", function (d) {
var dot = d3.select(this);
hideDot(dot);
hideRefLines(g);
})
.append("title").text(dc.pluck('data', _chart.title(d.name)));
dots.attr("cx", function (d) {
return dc.utils.safeNumber(_chart.x()(d.x));
})
.attr("cy", function (d) {
return dc.utils.safeNumber(_chart.y()(d.y + d.y0));
})
.attr("fill", _chart.getColor)
.select("title").text(dc.pluck('data', _chart.title(d.name)));
dots.exit().remove();
});
}
}
function createRefLines(g) {
var yRefLine = g.select("path." + Y_AXIS_REF_LINE_CLASS).empty() ? g.append("path").attr("class", Y_AXIS_REF_LINE_CLASS) : g.select("path." + Y_AXIS_REF_LINE_CLASS);
yRefLine.style("display", "none").attr("stroke-dasharray", "5,5");
var xRefLine = g.select("path." + X_AXIS_REF_LINE_CLASS).empty() ? g.append("path").attr("class", X_AXIS_REF_LINE_CLASS) : g.select("path." + X_AXIS_REF_LINE_CLASS);
xRefLine.style("display", "none").attr("stroke-dasharray", "5,5");
}
function showDot(dot) {
dot.style("fill-opacity", 0.8);
dot.style("stroke-opacity", 0.8);
dot.attr("r", _dotRadius);
return dot;
}
function showRefLines(dot, g) {
var x = dot.attr("cx");
var y = dot.attr("cy");
var yAxisX = (_chart._yAxisX() - _chart.margins().left);
var yAxisRefPathD = "M" + yAxisX + " " + y + "L" + (x) + " " + (y);
var xAxisRefPathD = "M" + x + " " + _chart.yAxisHeight() + "L" + x + " " + y;
g.select("path." + Y_AXIS_REF_LINE_CLASS).style("display", "").attr("d", yAxisRefPathD);
g.select("path." + X_AXIS_REF_LINE_CLASS).style("display", "").attr("d", xAxisRefPathD);
}
function getDotRadius() {
return _dataPointRadius || _dotRadius;
}
function hideDot(dot) {
dot.style("fill-opacity", _dataPointFillOpacity)
.style("stroke-opacity", _dataPointStrokeOpacity)
.attr("r", getDotRadius());
}
function hideRefLines(g) {
g.select("path." + Y_AXIS_REF_LINE_CLASS).style("display", "none");
g.select("path." + X_AXIS_REF_LINE_CLASS).style("display", "none");
}
/**
#### .dotRadius([dotRadius])
Get or set the radius (in px) for data points. Default dot radius is 5.
**/
_chart.dotRadius = function (_) {
if (!arguments.length) return _dotRadius;
_dotRadius = _;
return _chart;
};
/**
#### .renderDataPoints([options])
Always show individual dots for each datapoint.
Options, if given, is an object that can contain the following:
* fillOpacity (default 0.8)
* strokeOpacity (default 0.8)
* radius (default 2)
If `options` is falsy, it disables data point rendering.
If no `options` are provided, the current `options` values are instead returned.
Example:
```
chart.renderDataPoints({radius: 2, fillOpacity: 0.8, strokeOpacity: 0.8})
```
**/
_chart.renderDataPoints = function (options) {
if (!arguments.length) {
return {
fillOpacity: _dataPointFillOpacity,
strokeOpacity: _dataPointStrokeOpacity,
radius: _dataPointRadius
};
} else if (!options) {
_dataPointFillOpacity = DEFAULT_DOT_OPACITY;
_dataPointStrokeOpacity = DEFAULT_DOT_OPACITY;
_dataPointRadius = null;
} else {
_dataPointFillOpacity = options.fillOpacity || 0.8;
_dataPointStrokeOpacity = options.strokeOpacity || 0.8;
_dataPointRadius = options.radius || 2;
}
return _chart;
};
function colorFilter(color, dashstyle, inv) {
return function() {
var item = d3.select(this);
var match = (item.attr('stroke') == color && item.attr("stroke-dasharray") == ((dashstyle instanceof Array) ? dashstyle.join(",") : null) )|| item.attr('fill') == color;
return inv ? !match : match;
};
}
_chart.legendHighlight = function (d) {
if(!_chart.isLegendableHidden(d)) {
_chart.g().selectAll('path.line, path.area')
.classed('highlight', colorFilter(d.color, d.dashstyle))
.classed('fadeout', colorFilter(d.color, d.dashstyle, true));
}
};
_chart.legendReset = function () {
_chart.g().selectAll('path.line, path.area')
.classed('highlight', false)
.classed('fadeout', false);
};
dc.override(_chart,'legendables', function() {
var legendables = _chart._legendables();
if (!_dashStyle) return legendables;
return legendables.map(function(l) {
l.dashstyle = _dashStyle;
return l;
});
});
return _chart.anchor(parent, chartGroup);
};
/**
## Data Count Widget
Includes: [Base Mixin](#base-mixin)
Data count is a simple widget designed to display total number records in the data set vs. the number records selected
by the current filters. Once created data count widget will automatically update the text content of the following elements
under the parent element.
* ".total-count" - total number of records
* ".filter-count" - number of records matched by the current filters
Examples:
* [Nasdaq 100 Index](http://dc-js.github.com/dc.js/)
#### dc.dataCount(parent[, chartGroup])
Create a data count widget instance and attach it to the given parent element.
Parameters:
* parent : string - any valid d3 single selector representing typically a dom block element such as a div.
* chartGroup : string (optional) - name of the chart group this chart instance should be placed in. Once a chart is placed
in a certain chart group then any interaction with such instance will only trigger events and redraw within the same
chart group.
Return:
A newly created data count widget instance
#### .dimension(allData) - **mandatory**
For data count widget the only valid dimension is the entire data set.
#### .group(groupAll) - **mandatory**
For data count widget the only valid group is the all group.
```js
var ndx = crossfilter(data);
var all = ndx.groupAll();
dc.dataCount(".dc-data-count")
.dimension(ndx)
.group(all);
```
**/
dc.dataCount = function(parent, chartGroup) {
var _formatNumber = d3.format(",d");
var _chart = dc.baseMixin({});
_chart._doRender = function() {
_chart.selectAll(".total-count").text(_formatNumber(_chart.dimension().size()));
_chart.selectAll(".filter-count").text(_formatNumber(_chart.group().value()));
return _chart;
};
_chart._doRedraw = function(){
return _chart._doRender();
};
return _chart.anchor(parent, chartGroup);
};
/**
## Data Table Widget
Includes: [Base Mixin](#base-mixin)
Data table is a simple widget designed to list crossfilter focused data set (rows being filtered) in a good old tabular
fashion.
Examples:
* [Nasdaq 100 Index](http://dc-js.github.com/dc.js/)
#### dc.dataTable(parent[, chartGroup])
Create a data table widget instance and attach it to the given parent element.
Parameters:
* parent : string - any valid d3 single selector representing typically a dom block element such as a div.
* chartGroup : string (optional) - name of the chart group this chart instance should be placed in. Once a chart is placed
in a certain chart group then any interaction with such instance will only trigger events and redraw within the same
chart group.
Return:
A newly created data table widget instance
**/
dc.dataTable = function(parent, chartGroup) {
var LABEL_CSS_CLASS = "dc-table-label";
var ROW_CSS_CLASS = "dc-table-row";
var COLUMN_CSS_CLASS = "dc-table-column";
var GROUP_CSS_CLASS = "dc-table-group";
var _chart = dc.baseMixin({});
var _size = 25;
var _columns = [];
var _sortBy = function(d) {
return d;
};
var _order = d3.ascending;
_chart._doRender = function() {
_chart.selectAll("tbody").remove();
renderRows(renderGroups());
return _chart;
};
function renderGroups() {
var groups = _chart.root().selectAll("tbody")
.data(nestEntries(), function(d) {
return _chart.keyAccessor()(d);
});
var rowGroup = groups
.enter()
.append("tbody");
rowGroup
.append("tr")
.attr("class", GROUP_CSS_CLASS)
.append("td")
.attr("class", LABEL_CSS_CLASS)
.attr("colspan", _columns.length)
.html(function(d) {
return _chart.keyAccessor()(d);
});
groups.exit().remove();
return rowGroup;
}
function nestEntries() {
var entries = _chart.dimension().top(_size);
return d3.nest()
.key(_chart.group())
.sortKeys(_order)
.entries(entries.sort(function(a, b){
return _order(_sortBy(a), _sortBy(b));
}));
}
function renderRows(groups) {
var rows = groups.order()
.selectAll("tr." + ROW_CSS_CLASS)
.data(function(d) {
return d.values;
});
var rowEnter = rows.enter()
.append("tr")
.attr("class", ROW_CSS_CLASS);
_columns.forEach(function(f,i) {
rowEnter.append("td")
.attr("class", COLUMN_CSS_CLASS + " _" + i)
.html(f);
});
rows.exit().remove();
return rows;
}
_chart._doRedraw = function() {
return _chart._doRender();
};
/**
#### .size([size])
Get or set the table size which determines the number of rows displayed by the widget.
**/
_chart.size = function(s) {
if (!arguments.length) return _size;
_size = s;
return _chart;
};
/**
#### .columns([columnFunctionArray])
Get or set column functions. Data table widget uses an array of functions to generate dynamic columns. Column functions are
simple javascript function with only one input argument d which represents a row in the data set, and the return value of
these functions will be used directly to generate table content for each cell.
```js
chart.columns([
function(d) {
return d.date;
},
function(d) {
return d.open;
},
function(d) {
return d.close;
},
function(d) {
return numberFormat(d.close - d.open);
},
function(d) {
return d.volume;
}
]);
```
**/
_chart.columns = function(_) {
if (!arguments.length) return _columns;
_columns = _;
return _chart;
};
/**
#### .sortBy([sortByFunction])
Get or set sort-by function. This function works as a value accessor at row level and returns a particular field to be sorted
by. Default value: ``` function(d) {return d;}; ```
```js
chart.sortBy(function(d) {
return d.date;
});
```
**/
_chart.sortBy = function(_) {
if (!arguments.length) return _sortBy;
_sortBy = _;
return _chart;
};
/**
#### .order([order])
Get or set sort order. Default value: ``` d3.ascending ```
```js
chart.order(d3.descending);
```
**/
_chart.order = function(_) {
if (!arguments.length) return _order;
_order = _;
return _chart;
};
return _chart.anchor(parent, chartGroup);
};
/**
## Bubble Chart
Includes: [Bubble Mixin](#bubble-mixin), [Coordinate Grid Mixin](#coordinate-grid-mixin)
A concrete implementation of a general purpose bubble chart that allows data visualization using the following dimensions:
* x axis position
* y axis position
* bubble radius
* color
Examples:
* [Nasdaq 100 Index](http://dc-js.github.com/dc.js/)
* [US Venture Capital Landscape 2011](http://dc-js.github.com/dc.js/vc/index.html)
#### dc.bubbleChart(parent[, chartGroup])
Create a bubble chart instance and attach it to the given parent element.
Parameters:
* parent : string - any valid d3 single selector representing typically a dom block element such as a div.
* chartGroup : string (optional) - name of the chart group this chart instance should be placed in. Once a chart is placed
in a certain chart group then any interaction with such instance will only trigger events and redraw within the same
chart group.
Return:
A newly created bubble chart instance
```js
// create a bubble chart under #chart-container1 element using the default global chart group
var bubbleChart1 = dc.bubbleChart("#chart-container1");
// create a bubble chart under #chart-container2 element using chart group A
var bubbleChart2 = dc.bubbleChart("#chart-container2", "chartGroupA");
```
**/
dc.bubbleChart = function(parent, chartGroup) {
var _chart = dc.bubbleMixin(dc.coordinateGridMixin({}));
var _elasticRadius = false;
_chart.transitionDuration(750);
var bubbleLocator = function(d) {
return "translate(" + (bubbleX(d)) + "," + (bubbleY(d)) + ")";
};
/**
#### .elasticRadius([boolean])
Turn on or off elastic bubble radius feature. If this feature is turned on, then bubble radiuses will be automatically rescaled
to fit the chart better.
**/
_chart.elasticRadius = function(_) {
if (!arguments.length) return _elasticRadius;
_elasticRadius = _;
return _chart;
};
_chart.plotData = function() {
if (_elasticRadius)
_chart.r().domain([_chart.rMin(), _chart.rMax()]);
_chart.r().range([_chart.MIN_RADIUS, _chart.xAxisLength() * _chart.maxBubbleRelativeSize()]);
var bubbleG = _chart.chartBodyG().selectAll("g." + _chart.BUBBLE_NODE_CLASS)
.data(_chart.data(), function (d) { return d.key; });
renderNodes(bubbleG);
updateNodes(bubbleG);
removeNodes(bubbleG);
_chart.fadeDeselectedArea();
};
function renderNodes(bubbleG) {
var bubbleGEnter = bubbleG.enter().append("g");
bubbleGEnter
.attr("class", _chart.BUBBLE_NODE_CLASS)
.attr("transform", bubbleLocator)
.append("circle").attr("class", function(d, i) {
return _chart.BUBBLE_CLASS + " _" + i;
})
.on("click", _chart.onClick)
.attr("fill", _chart.getColor)
.attr("r", 0);
dc.transition(bubbleG, _chart.transitionDuration())
.selectAll("circle." + _chart.BUBBLE_CLASS)
.attr("r", function(d) {
return _chart.bubbleR(d);
})
.attr("opacity", function(d) {
return (_chart.bubbleR(d) > 0) ? 1 : 0;
});
_chart._doRenderLabel(bubbleGEnter);
_chart._doRenderTitles(bubbleGEnter);
}
function updateNodes(bubbleG) {
dc.transition(bubbleG, _chart.transitionDuration())
.attr("transform", bubbleLocator)
.selectAll("circle." + _chart.BUBBLE_CLASS)
.attr("fill", _chart.getColor)
.attr("r", function(d) {
return _chart.bubbleR(d);
})
.attr("opacity", function(d) {
return (_chart.bubbleR(d) > 0) ? 1 : 0;
});
_chart.doUpdateLabels(bubbleG);
_chart.doUpdateTitles(bubbleG);
}
function removeNodes(bubbleG) {
bubbleG.exit().remove();
}
function bubbleX(d) {
var x = _chart.x()(_chart.keyAccessor()(d));
if (isNaN(x))
x = 0;
return x;
}
function bubbleY(d) {
var y = _chart.y()(_chart.valueAccessor()(d));
if (isNaN(y))
y = 0;
return y;
}
_chart.renderBrush = function(g) {
// override default x axis brush from parent chart
};
_chart.redrawBrush = function(g) {
// override default x axis brush from parent chart
_chart.fadeDeselectedArea();
};
return _chart.anchor(parent, chartGroup);
};
/**
## Composite Chart
Includes: [Coordinate Grid Mixin](#coordinate-grid-mixin)
Composite charts are a special kind of chart that allow you to render multiple
charts on the same Coordinate Grid. You can overlay(compose) different
bar/line/area charts in a single composite chart to achieve some quite flexible
charting effects.
#### dc.compositeChart(parent[, chartGroup])
Create a composite chart instance and attach it to the given parent element.
Parameters:
* parent : string - any valid d3 single selector representing typically a dom block element such as a div.
* chartGroup : string (optional) - name of the chart group this chart instance should be placed in. Once a chart is placed
in a certain chart group then any interaction with such instance will only trigger events and redraw within the same
chart group.
Return:
A newly created composite chart instance
```js
// create a composite chart under #chart-container1 element using the default global chart group
var compositeChart1 = dc.compositeChart("#chart-container1");
// create a composite chart under #chart-container2 element using chart group A
var compositeChart2 = dc.compositeChart("#chart-container2", "chartGroupA");
```
**/
dc.compositeChart = function (parent, chartGroup) {
var SUB_CHART_CLASS = "sub";
var DEFAULT_RIGHT_Y_AXIS_LABEL_PADDING = 12;
var _chart = dc.coordinateGridMixin({});
var _children = [];
var _childOptions = {};
var _shareColors = false,
_shareTitle = true;
var _rightYAxis = d3.svg.axis(),
_rightYAxisLabel = 0,
_rightYAxisLabelPadding = DEFAULT_RIGHT_Y_AXIS_LABEL_PADDING,
_rightY,
_rightAxisGridLines = false;
_chart._mandatoryAttributes([]);
_chart.transitionDuration(500);
dc.override(_chart, "_generateG", function () {
var g = this.__generateG();
for (var i = 0; i < _children.length; ++i) {
var child = _children[i];
generateChildG(child, i);
if (!child.dimension()) child.dimension(_chart.dimension());
if (!child.group()) child.group(_chart.group());
child.chartGroup(_chart.chartGroup());
child.svg(_chart.svg());
child.xUnits(_chart.xUnits());
child.transitionDuration(_chart.transitionDuration());
child.brushOn(_chart.brushOn());
}
return g;
});
_chart._brushing = function () {
var extent = _chart.extendBrush();
var brushIsEmpty = _chart.brushIsEmpty(extent);
for (var i = 0; i < _children.length; ++i) {
_children[i].filter(null);
if (!brushIsEmpty) _children[i].filter(extent);
}
};
_chart._prepareYAxis = function () {
if (leftYAxisChildren().length !== 0) { prepareLeftYAxis(); }
if (rightYAxisChildren().length !== 0) { prepareRightYAxis(); }
if (leftYAxisChildren().length > 0 && !_rightAxisGridLines) {
_chart._renderHorizontalGridLinesForAxis(_chart.g(), _chart.y(), _chart.yAxis());
}
else if (rightYAxisChildren().length > 0) {
_chart._renderHorizontalGridLinesForAxis(_chart.g(), _rightY, _rightYAxis);
}
};
_chart.renderYAxis = function () {
if (leftYAxisChildren().length !== 0) {
_chart.renderYAxisAt("y", _chart.yAxis(), _chart.margins().left);
_chart.renderYAxisLabel("y", _chart.yAxisLabel(), -90);
}
if (rightYAxisChildren().length !== 0) {
_chart.renderYAxisAt("yr", _chart.rightYAxis(), _chart.width() - _chart.margins().right);
_chart.renderYAxisLabel("yr", _chart.rightYAxisLabel(), 90, _chart.width() - _rightYAxisLabelPadding);
}
};
function prepareRightYAxis() {
if (_chart.rightY() === undefined || _chart.elasticY()) {
_chart.rightY(d3.scale.linear());
_chart.rightY().domain([rightYAxisMin(), rightYAxisMax()]).rangeRound([_chart.yAxisHeight(), 0]);
}
_chart.rightY().range([_chart.yAxisHeight(), 0]);
_chart.rightYAxis(_chart.rightYAxis().scale(_chart.rightY()));
_chart.rightYAxis().orient("right");
}
function prepareLeftYAxis() {
if (_chart.y() === undefined || _chart.elasticY()) {
_chart.y(d3.scale.linear());
_chart.y().domain([yAxisMin(), yAxisMax()]).rangeRound([_chart.yAxisHeight(), 0]);
}
_chart.y().range([_chart.yAxisHeight(), 0]);
_chart.yAxis(_chart.yAxis().scale(_chart.y()));
_chart.yAxis().orient("left");
}
function generateChildG(child, i) {
child._generateG(_chart.g());
child.g().attr("class", SUB_CHART_CLASS + " _" + i);
}
_chart.plotData = function () {
for (var i = 0; i < _children.length; ++i) {
var child = _children[i];
if (!child.g()) {
generateChildG(child, i);
}
if (_shareColors) {
child.colors(_chart.colors());
}
child.x(_chart.x());
child.xAxis(_chart.xAxis());
if (child.useRightYAxis()) {
child.y(_chart.rightY());
child.yAxis(_chart.rightYAxis());
}
else {
child.y(_chart.y());
child.yAxis(_chart.yAxis());
}
child.plotData();
child._activateRenderlets();
}
};
/**
#### .useRightAxisGridLines(bool)
Get or set whether to draw gridlines from the right y axis.
Drawing from the left y axis is the default behavior. This option is only respected when
subcharts with both left and right y-axes are present.
**/
_chart.useRightAxisGridLines = function(_) {
if (!arguments) return _rightAxisGridLines;
_rightAxisGridLines = _;
return _chart;
};
/**
#### .childOptions({object})
Get or set chart-specific options for all child charts. This is equivalent to calling `.options` on each child chart.
**/
_chart.childOptions = function (_) {
if(!arguments.length) return _childOptions;
_childOptions = _;
_children.forEach(function(child){
child.options(_childOptions);
});
return _chart;
};
_chart.fadeDeselectedArea = function () {
for (var i = 0; i < _children.length; ++i) {
var child = _children[i];
child.brush(_chart.brush());
child.fadeDeselectedArea();
}
};
/**
#### .rightYAxisLabel([labelText])
Set or get the right y axis label.
**/
_chart.rightYAxisLabel = function (_, padding) {
if (!arguments.length) return _rightYAxisLabel;
_rightYAxisLabel = _;
_chart.margins().right -= _rightYAxisLabelPadding;
_rightYAxisLabelPadding = (padding === undefined) ? DEFAULT_RIGHT_Y_AXIS_LABEL_PADDING : padding;
_chart.margins().right += _rightYAxisLabelPadding;
return _chart;
};
/**
#### .compose(subChartArray)
Combine the given charts into one single composite coordinate grid chart.
```js
// compose the given charts in the array into one single composite chart
moveChart.compose([
// when creating sub-chart you need to pass in the parent chart
dc.lineChart(moveChart)
.group(indexAvgByMonthGroup) // if group is missing then parent's group will be used
.valueAccessor(function(d){return d.value.avg;})
// most of the normal functions will continue to work in a composed chart
.renderArea(true)
.stack(monthlyMoveGroup, function(d){return d.value;})
.title(function(d){
var value = d.value.avg?d.value.avg:d.value;
if(isNaN(value)) value = 0;
return dateFormat(d.key) + "\n" + numberFormat(value);
}),
dc.barChart(moveChart)
.group(volumeByMonthGroup)
.centerBar(true)
]);
```
**/
_chart.compose = function (charts) {
_children = charts;
_children.forEach(function(child) {
child.height(_chart.height());
child.width(_chart.width());
child.margins(_chart.margins());
if (_shareTitle) child.title(_chart.title());
child.options(_childOptions);
});
return _chart;
};
_chart.children = function () {
return _children;
};
/**
#### .shareColors([boolean])
Get or set color sharing for the chart. If set, the `.colors()` value from this chart
will be shared with composed children. Additionally if the child chart implements
Stackable and has not set a custom .colorAccessor, then it will generate a color
specific to its order in the composition.
**/
_chart.shareColors = function (_) {
if (!arguments.length) return _shareColors;
_shareColors = _;
return _chart;
};
/**
#### .shareTitle([[boolean])
Get or set title sharing for the chart. If set, the `.title()` value from this chart
will be shared with composed children. Default value is true.
**/
_chart.shareTitle = function (_) {
if (!arguments.length) return _shareTitle;
_shareTitle = _;
return _chart;
};
/**
#### .rightY([yScale])
Get or set the y scale for the right axis. Right y scale is typically automatically generated by the chart implementation.
**/
_chart.rightY = function (_) {
if (!arguments.length) return _rightY;
_rightY = _;
return _chart;
};
function leftYAxisChildren() {
return _children.filter(function (child) {
return !child.useRightYAxis();
});
}
function rightYAxisChildren() {
return _children.filter(function (child) {
return child.useRightYAxis();
});
}
function getYAxisMin(charts) {
return charts.map(function(c) {
return c.yAxisMin();
});
}
delete _chart.yAxisMin;
function yAxisMin() {
return d3.min(getYAxisMin(leftYAxisChildren()));
}
function rightYAxisMin() {
return d3.min(getYAxisMin(rightYAxisChildren()));
}
function getYAxisMax(charts) {
return charts.map(function(c) {
return c.yAxisMax();
});
}
delete _chart.yAxisMax;
function yAxisMax() {
return dc.utils.add(d3.max(getYAxisMax(leftYAxisChildren())), _chart.yAxisPadding());
}
function rightYAxisMax() {
return dc.utils.add(d3.max(getYAxisMax(rightYAxisChildren())), _chart.yAxisPadding());
}
function getAllXAxisMinFromChildCharts() {
return _children.map(function(c) {
return c.xAxisMin();
});
}
dc.override(_chart, 'xAxisMin',function () {
return dc.utils.subtract(d3.min(getAllXAxisMinFromChildCharts()), _chart.xAxisPadding());
});
function getAllXAxisMaxFromChildCharts() {
return _children.map(function(c) {
return c.xAxisMax();
});
}
dc.override(_chart, 'xAxisMax',function () {
return dc.utils.add(d3.max(getAllXAxisMaxFromChildCharts()), _chart.xAxisPadding());
});
_chart.legendables = function () {
return _children.reduce(function(items,child) {
if (_shareColors) child.colors(_chart.colors());
items.push.apply(items, child.legendables());
return items;
},[]);
};
_chart.legendHighlight = function (d) {
for (var j = 0; j < _children.length; ++j) {
var child = _children[j];
child.legendHighlight(d);
}
};
_chart.legendReset = function (d) {
for (var j = 0; j < _children.length; ++j) {
var child = _children[j];
child.legendReset(d);
}
};
_chart.legendToggle = function (d) {
for (var j = 0; j < _children.length; ++j) {
var child = _children[j];
if (d.name == child._groupName) child.legendToggle(d);
}
};
/**
#### .rightYAxis([yAxis])
Set or get the right y axis used by the composite chart. This function is most useful when certain y
axis customization is required. y axis in dc.js is simply an instance
of [d3 axis object](https://github.com/mbostock/d3/wiki/SVG-Axes#wiki-_axis) therefore it supports any valid d3 axis
manipulation. **Caution**: The y axis is typically generated by dc chart internal, resetting it might cause unexpected
outcome.
```js
// customize y axis tick format
chart.rightYAxis().tickFormat(function(v) {return v + "%";});
// customize y axis tick values
chart.rightYAxis().tickValues([0, 100, 200, 300]);
```
**/
_chart.rightYAxis = function (rightYAxis) {
if (!arguments.length) return _rightYAxis;
_rightYAxis = rightYAxis;
return _chart;
};
return _chart.anchor(parent, chartGroup);
};
/**
## Series Chart
Includes: [Composite Chart](#composite chart)
A series chart is a chart that shows multiple series of data as lines, where the series
is specified in the data. It is a special implementation Composite Chart and inherits
all composite features other than recomposing the chart.
#### dc.seriesChart(parent[, chartGroup])
Create a series chart instance and attach it to the given parent element.
Parameters:
* parent : string - any valid d3 single selector representing typically a dom block element such as a div.
* chartGroup : string (optional) - name of the chart group this chart instance should be placed in. Once a chart is placed
in a certain chart group then any interaction with such instance will only trigger events and redraw within the same
chart group.
Return:
A newly created series chart instance
```js
// create a series chart under #chart-container1 element using the default global chart group
var seriesChart1 = dc.seriesChart("#chart-container1");
// create a series chart under #chart-container2 element using chart group A
var seriesChart2 = dc.seriesChart("#chart-container2", "chartGroupA");
```
**/
dc.seriesChart = function (parent, chartGroup) {
var _chart = dc.compositeChart(parent, chartGroup);
var _charts = {};
var _chartFunction = dc.lineChart;
var _seriesAccessor;
var _seriesSort = d3.ascending;
var _valueSort = keySort;
_chart._mandatoryAttributes().push('seriesAccessor','chart');
_chart.shareColors(true);
function keySort(a,b) {
return d3.ascending(_chart.keyAccessor()(a), _chart.keyAccessor()(b));
}
_chart._preprocessData = function () {
var keep = [];
var children_changed;
var nester = d3.nest().key(_seriesAccessor);
if(_seriesSort)
nester.sortKeys(_seriesSort);
if(_valueSort)
nester.sortValues(_valueSort);
var nesting = nester.entries(_chart.data());
var children =
nesting.map(function(sub,i) {
var subChart = _charts[sub.key] || _chartFunction.call(_chart,_chart,chartGroup,sub.key,i);
if(!_charts[sub.key])
children_changed = true;
_charts[sub.key] = subChart;
keep.push(sub.key);
return subChart
.dimension(_chart.dimension())
.group({all:d3.functor(sub.values)}, sub.key)
.keyAccessor(_chart.keyAccessor())
.valueAccessor(_chart.valueAccessor());
});
// this works around the fact compositeChart doesn't really
// have a removal interface
Object.keys(_charts)
.filter(function(c) {return keep.indexOf(c) === -1;})
.forEach(function(c) {
clearChart(c);
children_changed = true;
});
_chart._compose(children);
if(children_changed && _chart.legend())
_chart.legend().render();
};
function clearChart(c) {
if(_charts[c].g())
_charts[c].g().remove();
delete _charts[c];
}
function resetChildren() {
Object.keys(_charts).map(clearChart);
_charts = {};
}
_chart.chart = function(_) {
if (!arguments.length) return _chartFunction;
_chartFunction = _;
resetChildren();
return _chart;
};
/**
#### .seriesAccessor([accessor])
Get or set accessor function for the displayed series. Given a datum, this function
should return the series that datum belongs to.
**/
_chart.seriesAccessor = function(_) {
if (!arguments.length) return _seriesAccessor;
_seriesAccessor = _;
resetChildren();
return _chart;
};
/**
#### .seriesSort([sortFunction])
Get or set a function to sort the list of series by, given series values.
Example:
```
chart.seriesSort(d3.descending);
```
**/
_chart.seriesSort = function(_) {
if (!arguments.length) return _seriesSort;
_seriesSort = _;
resetChildren();
return _chart;
};
/**
#### .valueSort([sortFunction])
Get or set a function to the sort each series values by. By default this is
the key accessor which, for example, a will ensure lineChart a series connects
its points in increasing key/x order, rather than haphazardly.
**/
_chart.valueSort = function(_) {
if (!arguments.length) return _valueSort;
_valueSort = _;
resetChildren();
return _chart;
};
// make compose private
_chart._compose = _chart.compose;
delete _chart.compose;
return _chart;
};
/**
## Geo Choropleth Chart
Includes: [Color Mixin](#color-mixin), [Base Mixin](#base-mixin)
Geo choropleth chart is designed to make creating crossfilter driven choropleth
map from GeoJson data an easy process. This chart implementation was inspired by
[the great d3 choropleth example](http://bl.ocks.org/4060606).
Examples:
* [US Venture Capital Landscape 2011](http://dc-js.github.com/dc.js/vc/index.html)
#### dc.geoChoroplethChart(parent[, chartGroup])
Create a choropleth chart instance and attach it to the given parent element.
Parameters:
* parent : string - any valid d3 single selector representing typically a dom block element such as a div.
* chartGroup : string (optional) - name of the chart group this chart instance should be placed in. Once a chart is placed
in a certain chart group then any interaction with such instance will only trigger events and redraw within the same
chart group.
Return:
A newly created choropleth chart instance
```js
// create a choropleth chart under "#us-chart" element using the default global chart group
var chart1 = dc.geoChoroplethChart("#us-chart");
// create a choropleth chart under "#us-chart2" element using chart group A
var chart2 = dc.compositeChart("#us-chart2", "chartGroupA");
```
**/
dc.geoChoroplethChart = function (parent, chartGroup) {
var _chart = dc.colorMixin(dc.baseMixin({}));
_chart.colorAccessor(function (d) {
return d || 0;
});
var _geoPath = d3.geo.path();
var _projectionFlag;
var _geoJsons = [];
_chart._doRender = function () {
_chart.resetSvg();
for (var layerIndex = 0; layerIndex < _geoJsons.length; ++layerIndex) {
var states = _chart.svg().append("g")
.attr("class", "layer" + layerIndex);
var regionG = states.selectAll("g." + geoJson(layerIndex).name)
.data(geoJson(layerIndex).data)
.enter()
.append("g")
.attr("class", geoJson(layerIndex).name);
regionG
.append("path")
.attr("fill", "white")
.attr("d", _geoPath);
regionG.append("title");
plotData(layerIndex);
}
_projectionFlag = false;
};
function plotData(layerIndex) {
var data = generateLayeredData();
if (isDataLayer(layerIndex)) {
var regionG = renderRegionG(layerIndex);
renderPaths(regionG, layerIndex, data);
renderTitle(regionG, layerIndex, data);
}
}
function generateLayeredData() {
var data = {};
var groupAll = _chart.data();
for (var i = 0; i < groupAll.length; ++i) {
data[_chart.keyAccessor()(groupAll[i])] = _chart.valueAccessor()(groupAll[i]);
}
return data;
}
function isDataLayer(layerIndex) {
return geoJson(layerIndex).keyAccessor;
}
function renderRegionG(layerIndex) {
var regionG = _chart.svg()
.selectAll(layerSelector(layerIndex))
.classed("selected", function (d) {
return isSelected(layerIndex, d);
})
.classed("deselected", function (d) {
return isDeselected(layerIndex, d);
})
.attr("class", function (d) {
var layerNameClass = geoJson(layerIndex).name;
var regionClass = dc.utils.nameToId(geoJson(layerIndex).keyAccessor(d));
var baseClasses = layerNameClass + " " + regionClass;
if (isSelected(layerIndex, d)) baseClasses += " selected";
if (isDeselected(layerIndex, d)) baseClasses += " deselected";
return baseClasses;
});
return regionG;
}
function layerSelector(layerIndex) {
return "g.layer" + layerIndex + " g." + geoJson(layerIndex).name;
}
function isSelected(layerIndex, d) {
return _chart.hasFilter() && _chart.hasFilter(getKey(layerIndex, d));
}
function isDeselected(layerIndex, d) {
return _chart.hasFilter() && !_chart.hasFilter(getKey(layerIndex, d));
}
function getKey(layerIndex, d) {
return geoJson(layerIndex).keyAccessor(d);
}
function geoJson(index) {
return _geoJsons[index];
}
function renderPaths(regionG, layerIndex, data) {
var paths = regionG
.select("path")
.attr("fill", function () {
var currentFill = d3.select(this).attr("fill");
if (currentFill)
return currentFill;
return "none";
})
.on("click", function (d) {
return _chart.onClick(d, layerIndex);
});
dc.transition(paths, _chart.transitionDuration()).attr("fill", function (d, i) {
return _chart.getColor(data[geoJson(layerIndex).keyAccessor(d)], i);
});
}
_chart.onClick = function (d, layerIndex) {
var selectedRegion = geoJson(layerIndex).keyAccessor(d);
dc.events.trigger(function () {
_chart.filter(selectedRegion);
_chart.redrawGroup();
});
};
function renderTitle(regionG, layerIndex, data) {
if (_chart.renderTitle()) {
regionG.selectAll("title").text(function (d) {
var key = getKey(layerIndex, d);
var value = data[key];
return _chart.title()({key: key, value: value});
});
}
}
_chart._doRedraw = function () {
for (var layerIndex = 0; layerIndex < _geoJsons.length; ++layerIndex) {
plotData(layerIndex);
if(_projectionFlag) {
_chart.svg().selectAll("g." + geoJson(layerIndex).name + " path").attr("d", _geoPath);
}
}
_projectionFlag = false;
};
/**
#### .overlayGeoJson(json, name, keyAccessor) - **mandatory**
Use this function to insert a new GeoJson map layer. This function can be invoked multiple times if you have multiple GeoJson
data layer to render on top of each other. If you overlay mutiple layers with the same name the new overlay will simply
override the existing one.
Parameters:
* json - GeoJson feed
* name - name of the layer
* keyAccessor - accessor function used to extract "key" from the GeoJson data. Key extracted by this function should match
the keys generated in crossfilter groups.
```js
// insert a layer for rendering US states
chart.overlayGeoJson(statesJson.features, "state", function(d) {
return d.properties.name;
});
```
**/
_chart.overlayGeoJson = function (json, name, keyAccessor) {
for (var i = 0; i < _geoJsons.length; ++i) {
if (_geoJsons[i].name == name) {
_geoJsons[i].data = json;
_geoJsons[i].keyAccessor = keyAccessor;
return _chart;
}
}
_geoJsons.push({name: name, data: json, keyAccessor: keyAccessor});
return _chart;
};
/**
#### .projection(projection)
Set custom geo projection function. Available [d3 geo projection functions](https://github.com/mbostock/d3/wiki/Geo-Projections).
Default value: albersUsa.
**/
_chart.projection = function (projection) {
_geoPath.projection(projection);
_projectionFlag = true;
return _chart;
};
/**
#### .geoJsons()
Return all GeoJson layers currently registered with thit chart. The returned array is a reference to this chart's internal
registration data structure without copying thus any modification to this array will also modify this chart's internal
registration.
Return:
An array of objects containing fields {name, data, accessor}
**/
_chart.geoJsons = function () {
return _geoJsons;
};
/**
#### .removeGeoJson(name)
Remove a GeoJson layer from this chart by name
Return: chart instance
**/
_chart.removeGeoJson = function (name) {
var geoJsons = [];
for (var i = 0; i < _geoJsons.length; ++i) {
var layer = _geoJsons[i];
if (layer.name != name) {
geoJsons.push(layer);
}
}
_geoJsons = geoJsons;
return _chart;
};
return _chart.anchor(parent, chartGroup);
};
/**
## Bubble Overlay Chart
Includes: [Bubble Mixin](#bubble-mixin), [Base Mixin](#base-mixin)
Bubble overlay chart is quite different from the typical bubble chart. With bubble overlay chart you can arbitrarily place
a finite number of bubbles on an existing svg or bitmap image (overlay on top of it), thus losing the typical x and y
positioning that we are used to whiling retaining the capability to visualize data using it's bubble radius and
coloring.
Examples:
* [Canadian City Crime Stats](http://dc-js.github.com/dc.js/crime/index.html)
#### dc.bubbleOverlay(parent[, chartGroup])
Create a bubble overlay chart instance and attach it to the given parent element.
Parameters:
* parent : string - any valid d3 single selector representing typically a dom block element such as a div. Typically
this element should also be the parent of the underlying image.
* chartGroup : string (optional) - name of the chart group this chart instance should be placed in. Once a chart is placed
in a certain chart group then any interaction with such instance will only trigger events and redraw within the same
chart group.
Return:
A newly created bubble overlay chart instance
```js
// create a bubble overlay chart on top of "#chart-container1 svg" element using the default global chart group
var bubbleChart1 = dc.bubbleOverlayChart("#chart-container1").svg(d3.select("#chart-container1 svg"));
// create a bubble overlay chart on top of "#chart-container2 svg" element using chart group A
var bubbleChart2 = dc.compositeChart("#chart-container2", "chartGroupA").svg(d3.select("#chart-container2 svg"));
```
#### .svg(imageElement) - **mandatory**
Set the underlying svg image element. Unlike other dc charts this chart will not generate svg element therefore bubble overlay
chart will not work if this function is not properly invoked. If the underlying image is a bitmap, then an empty svg will need
to be manually created on top of the image.
```js
// set up underlying svg element
chart.svg(d3.select("#chart svg"));
```
**/
dc.bubbleOverlay = function(root, chartGroup) {
var BUBBLE_OVERLAY_CLASS = "bubble-overlay";
var BUBBLE_NODE_CLASS = "node";
var BUBBLE_CLASS = "bubble";
var _chart = dc.bubbleMixin(dc.baseMixin({}));
var _g;
var _points = [];
_chart.transitionDuration(750);
_chart.radiusValueAccessor(function(d) {
return d.value;
});
/**
#### .point(name, x, y) - **mandatory**
Set up a data point on the overlay. The name of a data point should match a specific "key" among data groups generated using keyAccessor.
If a match is found (point name <-> data group key) then a bubble will be automatically generated at the position specified by the
function. x and y value specified here are relative to the underlying svg.
**/
_chart.point = function(name, x, y) {
_points.push({name: name, x: x, y: y});
return _chart;
};
_chart._doRender = function() {
_g = initOverlayG();
_chart.r().range([_chart.MIN_RADIUS, _chart.width() * _chart.maxBubbleRelativeSize()]);
initializeBubbles();
_chart.fadeDeselectedArea();
return _chart;
};
function initOverlayG() {
_g = _chart.select("g." + BUBBLE_OVERLAY_CLASS);
if (_g.empty())
_g = _chart.svg().append("g").attr("class", BUBBLE_OVERLAY_CLASS);
return _g;
}
function initializeBubbles() {
var data = mapData();
_points.forEach(function(point) {
var nodeG = getNodeG(point, data);
var circle = nodeG.select("circle." + BUBBLE_CLASS);
if (circle.empty())
circle = nodeG.append("circle")
.attr("class", BUBBLE_CLASS)
.attr("r", 0)
.attr("fill", _chart.getColor)
.on("click", _chart.onClick);
dc.transition(circle, _chart.transitionDuration())
.attr("r", function(d) {
return _chart.bubbleR(d);
});
_chart._doRenderLabel(nodeG);
_chart._doRenderTitles(nodeG);
});
}
function mapData() {
var data = {};
_chart.data().forEach(function(datum) {
data[_chart.keyAccessor()(datum)] = datum;
});
return data;
}
function getNodeG(point, data) {
var bubbleNodeClass = BUBBLE_NODE_CLASS + " " + dc.utils.nameToId(point.name);
var nodeG = _g.select("g." + dc.utils.nameToId(point.name));
if (nodeG.empty()) {
nodeG = _g.append("g")
.attr("class", bubbleNodeClass)
.attr("transform", "translate(" + point.x + "," + point.y + ")");
}
nodeG.datum(data[point.name]);
return nodeG;
}
_chart._doRedraw = function() {
updateBubbles();
_chart.fadeDeselectedArea();
return _chart;
};
function updateBubbles() {
var data = mapData();
_points.forEach(function(point) {
var nodeG = getNodeG(point, data);
var circle = nodeG.select("circle." + BUBBLE_CLASS);
dc.transition(circle, _chart.transitionDuration())
.attr("r", function(d) {
return _chart.bubbleR(d);
})
.attr("fill", _chart.getColor);
_chart.doUpdateLabels(nodeG);
_chart.doUpdateTitles(nodeG);
});
}
_chart.debug = function(flag) {
if(flag){
var debugG = _chart.select("g." + dc.constants.DEBUG_GROUP_CLASS);
if(debugG.empty())
debugG = _chart.svg()
.append("g")
.attr("class", dc.constants.DEBUG_GROUP_CLASS);
var debugText = debugG.append("text")
.attr("x", 10)
.attr("y", 20);
debugG
.append("rect")
.attr("width", _chart.width())
.attr("height", _chart.height())
.on("mousemove", function() {
var position = d3.mouse(debugG.node());
var msg = position[0] + ", " + position[1];
debugText.text(msg);
});
}else{
_chart.selectAll(".debug").remove();
}
return _chart;
};
_chart.anchor(root, chartGroup);
return _chart;
};
/**
## Row Chart
Includes: [Cap Mixin](#cap-mixin), [Margin Mixin](#margin-mixin), [Color Mixin](#color-mixin), [Base Mixin](#base-mixin)
Concrete row chart implementation.
#### dc.rowChart(parent[, chartGroup])
Create a row chart instance and attach it to the given parent element.
Parameters:
* parent : string - any valid d3 single selector representing typically a dom block element such as a div.
* chartGroup : string (optional) - name of the chart group this chart instance should be placed in. Once a chart is placed in a certain chart group then any interaction with such instance will only trigger events and redraw within the same chart group.
Return a newly created row chart instance
```js
// create a row chart under #chart-container1 element using the default global chart group
var chart1 = dc.rowChart("#chart-container1");
// create a row chart under #chart-container2 element using chart group A
var chart2 = dc.rowChart("#chart-container2", "chartGroupA");
```
**/
dc.rowChart = function (parent, chartGroup) {
var _g;
var _labelOffsetX = 10;
var _labelOffsetY = 15;
var _titleLabelOffsetX = 2;
var _gap = 5;
var _rowCssClass = "row";
var _titleRowCssClass = "titlerow";
var _renderTitleLabel = false;
var _chart = dc.capMixin(dc.marginMixin(dc.colorMixin(dc.baseMixin({}))));
var _x;
var _elasticX;
var _xAxis = d3.svg.axis().orient("bottom");
var _rowData;
_chart.rowsCap = _chart.cap;
function calculateAxisScale() {
if (!_x || _elasticX) {
var extent = d3.extent(_rowData, _chart.cappedValueAccessor);
if (extent[0] > 0) extent[0] = 0;
_x = d3.scale.linear().domain(extent)
.range([0, _chart.effectiveWidth()]);
}
_xAxis.scale(_x);
}
function drawAxis() {
var axisG = _g.select("g.axis");
calculateAxisScale();
if (axisG.empty())
axisG = _g.append("g").attr("class", "axis")
.attr("transform", "translate(0, " + _chart.effectiveHeight() + ")");
dc.transition(axisG, _chart.transitionDuration())
.call(_xAxis);
}
_chart._doRender = function () {
_chart.resetSvg();
_g = _chart.svg()
.append("g")
.attr("transform", "translate(" + _chart.margins().left + "," + _chart.margins().top + ")");
drawChart();
return _chart;
};
_chart.title(function (d) {
return _chart.cappedKeyAccessor(d) + ": " + _chart.cappedValueAccessor(d);
});
_chart.label(_chart.cappedKeyAccessor);
_chart.x = function(x){
if(!arguments.length) return _x;
_x = x;
return _chart;
};
function drawGridLines() {
_g.selectAll("g.tick")
.select("line.grid-line")
.remove();
_g.selectAll("g.tick")
.append("line")
.attr("class", "grid-line")
.attr("x1", 0)
.attr("y1", 0)
.attr("x2", 0)
.attr("y2", function () {
return -_chart.effectiveHeight();
});
}
function drawChart() {
_rowData = _chart.data();
drawAxis();
drawGridLines();
var rows = _g.selectAll("g." + _rowCssClass)
.data(_rowData);
createElements(rows);
removeElements(rows);
updateElements(rows);
}
function createElements(rows) {
var rowEnter = rows.enter()
.append("g")
.attr("class", function (d, i) {
return _rowCssClass + " _" + i;
});
rowEnter.append("rect").attr("width", 0);
createLabels(rowEnter);
updateLabels(rows);
}
function removeElements(rows) {
rows.exit().remove();
}
function updateElements(rows) {
var n = _rowData.length;
var height = (_chart.effectiveHeight() - (n + 1) * _gap) / n;
var rect = rows.attr("transform",function (d, i) {
return "translate(0," + ((i + 1) * _gap + i * height) + ")";
}).select("rect")
.attr("height", height)
.attr("fill", _chart.getColor)
.on("click", onClick)
.classed("deselected", function (d) {
return (_chart.hasFilter()) ? !isSelectedRow(d) : false;
})
.classed("selected", function (d) {
return (_chart.hasFilter()) ? isSelectedRow(d) : false;
});
dc.transition(rect, _chart.transitionDuration())
.attr("width", function (d) {
var start = _x(0) == -Infinity ? _x(1) : _x(0);
return Math.abs(start - _x(_chart.valueAccessor()(d)));
})
.attr("transform", translateX);
createTitles(rows);
updateLabels(rows);
}
function createTitles(rows) {
if (_chart.renderTitle()) {
rows.selectAll("title").remove();
rows.append("title").text(_chart.title());
}
}
function createLabels(rowEnter) {
if (_chart.renderLabel()) {
rowEnter.append("text")
.on("click", onClick);
}
if (_chart.renderTitleLabel()) {
rowEnter.append("text")
.attr("class", _titleRowCssClass)
.on("click", onClick);
}
}
function updateLabels(rows) {
if (_chart.renderLabel()) {
var lab = rows.select("text")
.attr("x", _labelOffsetX)
.attr("y", _labelOffsetY)
.on("click", onClick)
.attr("class", function (d, i) {
return _rowCssClass + " _" + i;
})
.text(function (d) {
return _chart.label()(d);
});
dc.transition(lab, _chart.transitionDuration())
.attr("transform", translateX);
}
if (_chart.renderTitleLabel()) {
var titlelab = rows.select("." + _titleRowCssClass)
.attr("x", _chart.effectiveWidth() - _titleLabelOffsetX)
.attr("y", _labelOffsetY)
.attr("text-anchor", "end")
.on("click", onClick)
.attr("class", function (d, i) {
return _titleRowCssClass + " _" + i ;
})
.text(function (d) {
return _chart.title()(d);
});
dc.transition(titlelab, _chart.transitionDuration())
.attr("transform", translateX);
}
}
/**
#### .renderTitleLabel(boolean)
Turn on/off Title label rendering (values) using SVG style of text-anchor 'end'
**/
_chart.renderTitleLabel = function (_) {
if (!arguments.length) return _renderTitleLabel;
_renderTitleLabel = _;
return _chart;
};
function onClick(d) {
_chart.onClick(d);
}
function translateX(d) {
var x = _x(_chart.cappedValueAccessor(d)),
x0 = _x(0),
s = x > x0 ? x0 : x;
return "translate("+s+",0)";
}
_chart._doRedraw = function () {
drawChart();
return _chart;
};
_chart.xAxis = function () {
return _xAxis;
};
/**
#### .gap([gap])
Get or set the vertical gap space between rows on a particular row chart instance. Default gap is 5px;
**/
_chart.gap = function (g) {
if (!arguments.length) return _gap;
_gap = g;
return _chart;
};
/**
#### .elasticX([boolean])
Get or set the elasticity on x axis. If this attribute is set to true, then the x axis will rescle to auto-fit the data
range when filtered.
**/
_chart.elasticX = function (_) {
if (!arguments.length) return _elasticX;
_elasticX = _;
return _chart;
};
/**
#### .labelOffsetX([x])
Get or set the x offset (horizontal space to the top left corner of a row) for labels on a particular row chart. Default x offset is 10px;
**/
_chart.labelOffsetX = function (o) {
if (!arguments.length) return _labelOffsetX;
_labelOffsetX = o;
return _chart;
};
/**
#### .labelOffsetY([y])
Get or set the y offset (vertical space to the top left corner of a row) for labels on a particular row chart. Default y offset is 15px;
**/
_chart.labelOffsetY = function (o) {
if (!arguments.length) return _labelOffsetY;
_labelOffsetY = o;
return _chart;
};
/**
#### .titleLabelOffsetx([x])
Get of set the x offset (horizontal space between right edge of row and right edge or text. Default x offset is 2px;
**/
_chart.titleLabelOffsetX = function (o) {
if (!arguments.length) return _titleLabelOffsetX;
_titleLabelOffsetX = o;
return _chart;
};
function isSelectedRow (d) {
return _chart.hasFilter(_chart.cappedKeyAccessor(d));
}
return _chart.anchor(parent, chartGroup);
};
/**
## Legend
Legend is a attachable widget that can be added to other dc charts to render horizontal legend labels.
```js
chart.legend(dc.legend().x(400).y(10).itemHeight(13).gap(5))
```
Examples:
* [Nasdaq 100 Index](http://dc-js.github.com/dc.js/)
* [Canadian City Crime Stats](http://dc-js.github.com/dc.js/crime/index.html)
**/
dc.legend = function () {
var LABEL_GAP = 2;
var _legend = {},
_parent,
_x = 0,
_y = 0,
_itemHeight = 12,
_gap = 5,
_horizontal = false,
_legendWidth = 560,
_itemWidth = 70;
var _g;
_legend.parent = function (p) {
if (!arguments.length) return _parent;
_parent = p;
return _legend;
};
_legend.render = function () {
_parent.svg().select("g.dc-legend").remove();
_g = _parent.svg().append("g")
.attr("class", "dc-legend")
.attr("transform", "translate(" + _x + "," + _y + ")");
var legendables = _parent.legendables();
var itemEnter = _g.selectAll('g.dc-legend-item')
.data(legendables)
.enter()
.append("g")
.attr("class", "dc-legend-item")
.on("mouseover", function(d) {
_parent.legendHighlight(d);
})
.on("mouseout", function (d) {
_parent.legendReset(d);
})
.on("click", function (d) {
_parent.legendToggle(d);
});
_g.selectAll('g.dc-legend-item')
.classed("fadeout", function(d) {
return d.chart.isLegendableHidden(d);
});
if (legendables.some(dc.pluck('dashstyle'))) {
itemEnter
.append("line")
.attr("x1", 0)
.attr("y1", _itemHeight / 2)
.attr("x2", _itemHeight)
.attr("y2", _itemHeight / 2)
.attr("stroke-width", 2)
.attr("stroke-dasharray", dc.pluck('dashstyle'))
.attr("stroke", dc.pluck('color'));
} else {
itemEnter
.append("rect")
.attr("width", _itemHeight)
.attr("height", _itemHeight)
.attr("fill", function(d){return d?d.color:"blue";});
}
itemEnter.append("text")
.text(dc.pluck('name'))
.attr("x", _itemHeight + LABEL_GAP)
.attr("y", function(){return _itemHeight / 2 + (this.clientHeight?this.clientHeight:13) / 2 - 2;});
var _cumulativeLegendTextWidth = 0;
var row = 0;
itemEnter.attr("transform", function(d, i) {
if(_horizontal) {
var translateBy = "translate(" + _cumulativeLegendTextWidth + "," + row * legendItemHeight() + ")";
if ((_cumulativeLegendTextWidth + _itemWidth) >= _legendWidth) {
++row ;
_cumulativeLegendTextWidth = 0 ;
} else {
_cumulativeLegendTextWidth += _itemWidth;
}
return translateBy;
}
else {
return "translate(0," + i * legendItemHeight() + ")";
}
});
};
function legendItemHeight() {
return _gap + _itemHeight;
}
/**
#### .x([value])
Set or get x coordinate for legend widget. Default value: 0.
**/
_legend.x = function (x) {
if (!arguments.length) return _x;
_x = x;
return _legend;
};
/**
#### .y([value])
Set or get y coordinate for legend widget. Default value: 0.
**/
_legend.y = function (y) {
if (!arguments.length) return _y;
_y = y;
return _legend;
};
/**
#### .gap([value])
Set or get gap between legend items. Default value: 5.
**/
_legend.gap = function (gap) {
if (!arguments.length) return _gap;
_gap = gap;
return _legend;
};
/**
#### .itemHeight([value])
Set or get legend item height. Default value: 12.
**/
_legend.itemHeight = function (h) {
if (!arguments.length) return _itemHeight;
_itemHeight = h;
return _legend;
};
/**
#### .horizontal([boolean])
Position legend horizontally instead of vertically
**/
_legend.horizontal = function(_) {
if (!arguments.length) return _horizontal;
_horizontal = _;
return _legend;
};
/**
#### .legendWidth([value])
Maximum width for horizontal legend. Default value: 560.
**/
_legend.legendWidth = function(_) {
if (!arguments.length) return _legendWidth;
_legendWidth = _;
return _legend;
};
/**
#### .itemWidth([value])
legendItem width for horizontal legend. Default value: 70.
**/
_legend.itemWidth = function(_) {
if (!arguments.length) return _itemWidth;
_itemWidth = _;
return _legend;
};
return _legend;
};
/**
## Scatter Plot
Includes: [Coordinate Grid Mixin](#coordinate-grid-mixin)
A scatter plot chart
#### dc.scatterPlot(parent[, chartGroup])
Create a scatter plot instance and attach it to the given parent element.
Parameters:
* parent : string|compositeChart - any valid d3 single selector representing typically a dom block element such
as a div, or if this scatter plot is a sub-chart in a [Composite Chart](#composite-chart) then pass in the parent composite chart instance.
* chartGroup : string (optional) - name of the chart group this chart instance should be placed in. Once a chart is placed
in a certain chart group then any interaction with such instance will only trigger events and redraw within the same
chart group.
Return:
A newly created scatter plot instance
```js
// create a scatter plot under #chart-container1 element using the default global chart group
var chart1 = dc.scatterPlot("#chart-container1");
// create a scatter plot under #chart-container2 element using chart group A
var chart2 = dc.scatterPlot("#chart-container2", "chartGroupA");
// create a sub-chart under a composite parent chart
var chart3 = dc.scatterPlot(compositeChart);
```
**/
dc.scatterPlot = function (parent, chartGroup) {
var _chart = dc.coordinateGridMixin({});
var _symbol = d3.svg.symbol();
var originalKeyAccessor = _chart.keyAccessor();
_chart.keyAccessor(function (d) { return originalKeyAccessor(d)[0]; });
_chart.valueAccessor(function (d) { return originalKeyAccessor(d)[1]; });
_chart.colorAccessor(function (d) { return _chart._groupName; });
var _locator = function (d) {
return "translate(" + _chart.x()(_chart.keyAccessor()(d)) + "," +
_chart.y()(_chart.valueAccessor()(d)) + ")";
};
var _symbolSize = 3;
var _highlightedSize = 5;
_symbol.size(function(d) {
return this.filtered ? Math.pow(_highlightedSize, 2) : Math.pow(_symbolSize, 2);
});
dc.override(_chart, "_filter", function(filter) {
if (!arguments.length) return _chart.__filter();
return _chart.__filter(dc.filters.RangedTwoDimensionalFilter(filter));
});
_chart.plotData = function () {
var symbols = _chart.chartBodyG().selectAll("path.symbol")
.data(_chart.data());
symbols
.enter()
.append("path")
.attr("class", "symbol")
.attr("opacity", 0)
.attr("fill", _chart.getColor)
.attr("transform", _locator);
dc.transition(symbols, _chart.transitionDuration())
.attr("opacity", 1)
.attr("fill", _chart.getColor)
.attr("transform", _locator)
.attr("d", _symbol);
dc.transition(symbols.exit(), _chart.transitionDuration())
.attr("opacity", 0).remove();
};
/**
#### .symbol([type])
Get or set the symbol type used for each point. By default a circle. See the D3
[docs](https://github.com/mbostock/d3/wiki/SVG-Shapes#wiki-symbol_type) for acceptable types;
Type can be a constant or an accessor.
**/
_chart.symbol = function(type) {
if(!arguments.length) return _symbol.type();
_symbol.type(type);
return _chart;
};
/**
#### .symbolSize([radius])
Set or get radius for symbols, default: 3.
**/
_chart.symbolSize = function(s){
if(!arguments.length) return _symbolSize;
_symbolSize = s;
return _chart;
};
/**
#### .highlightedSize([radius])
Set or get radius for highlighted symbols, default: 4.
**/
_chart.highlightedSize = function(s){
if(!arguments.length) return _highlightedSize;
_highlightedSize = s;
return _chart;
};
_chart.legendables = function () {
return [{chart: _chart, name: _chart._groupName, color: _chart.getColor()}];
};
_chart.legendHighlight = function (d) {
resizeSymbolsWhere(function (symbol) {
return symbol.attr('fill') == d.color;
}, _highlightedSize);
_chart.selectAll('.chart-body path.symbol').filter(function () {
return d3.select(this).attr('fill') != d.color;
}).classed('fadeout', true);
};
_chart.legendReset = function (d) {
resizeSymbolsWhere(function (symbol) {
return symbol.attr('fill') == d.color;
}, _symbolSize);
_chart.selectAll('.chart-body path.symbol').filter(function () {
return d3.select(this).attr('fill') != d.color;
}).classed('fadeout', false);
};
function resizeSymbolsWhere(condition, size) {
var symbols = _chart.selectAll('.chart-body path.symbol').filter(function (d) {
return condition(d3.select(this));
});
var oldSize = _symbol.size();
_symbol.size(Math.pow(size, 2));
dc.transition(symbols, _chart.transitionDuration()).attr("d", _symbol);
_symbol.size(oldSize);
}
_chart.setHandlePaths = function () {
// no handle paths for poly-brushes
};
_chart.extendBrush = function () {
var extent = _chart.brush().extent();
if (_chart.round()) {
extent[0] = extent[0].map(_chart.round());
extent[1] = extent[1].map(_chart.round());
_chart.g().select(".brush")
.call(_chart.brush().extent(extent));
}
return extent;
};
_chart.brushIsEmpty = function (extent) {
return _chart.brush().empty() || !extent || extent[0][0] >= extent[1][0] || extent[0][1] >= extent[1][1];
};
function resizeFiltered(filter) {
var symbols = _chart.selectAll('.chart-body path.symbol').each(function (d) {
this.filtered = filter && filter.isFiltered(d.key);
});
dc.transition(symbols, _chart.transitionDuration()).attr("d", _symbol);
}
_chart._brushing = function () {
var extent = _chart.extendBrush();
_chart.redrawBrush(_chart.g());
if (_chart.brushIsEmpty(extent)) {
dc.events.trigger(function () {
_chart.filter(null);
dc.redrawAll(_chart.chartGroup());
});
resizeFiltered(false);
} else {
var ranged2DFilter = dc.filters.RangedTwoDimensionalFilter(extent);
dc.events.trigger(function () {
_chart.filter(null);
_chart.filter(ranged2DFilter);
dc.redrawAll(_chart.chartGroup());
}, dc.constants.EVENT_DELAY);
resizeFiltered(ranged2DFilter);
}
};
_chart.setBrushY = function (gBrush) {
gBrush.call(_chart.brush().y(_chart.y()));
};
return _chart.anchor(parent, chartGroup);
};
/**
## Number Display Widget
Includes: [Base Mixin](#base-mixin)
A display of a single numeric value.
Examples:
* [Test Example](http://dc-js.github.io/dc.js/examples/number.html)
#### dc.numberDisplay(parent[, chartGroup])
Create a Number Display instance and attach it to the given parent element.
Unlike other charts, you do not need to set a dimension. Instead a valid group object must be provided and valueAccessor that is expected to return a single value.
Parameters:
* parent : string - any valid d3 single selector representing typically a dom block element such as a div or span
* chartGroup : string (optional) - name of the chart group this chart instance should be placed in. Once a chart is placed
in a certain chart group then any interaction with such instance will only trigger events and redraw within the same
chart group.
Return:
A newly created number display instance
```js
// create a number display under #chart-container1 element using the default global chart group
var display1 = dc.numberDisplay("#chart-container1");
```
**/
dc.numberDisplay = function (parent, chartGroup) {
var SPAN_CLASS = 'number-display';
var _formatNumber = d3.format(".2s");
var _chart = dc.baseMixin({});
// dimension not required
_chart._mandatoryAttributes(['group']);
/**
#### .value()
Calculate and return the underlying value of the display
**/
_chart.value = function () {
return _chart.data();
};
_chart.data(function (group) {
var valObj = group.value ? group.value() : group.top(1)[0];
return _chart.valueAccessor()(valObj);
});
_chart.transitionDuration(250); // good default
_chart._doRender = function () {
var newValue = _chart.value(),
span = _chart.selectAll("."+SPAN_CLASS);
if(span.empty())
span = span.data([0])
.enter()
.append("span")
.attr("class", SPAN_CLASS);
span.transition()
.duration(_chart.transitionDuration())
.ease('quad-out-in')
.tween("text", function () {
var interp = d3.interpolateNumber(this.lastValue || 0, newValue);
this.lastValue = newValue;
return function (t) {
this.textContent = _chart.formatNumber()(interp(t));
};
});
};
_chart._doRedraw = function(){
return _chart._doRender();
};
/**
#### .formatNumber([formatter])
Get or set a function to format the value for the display. By default `d3.format(".2s");` is used.
**/
_chart.formatNumber = function (_) {
if (!arguments.length) return _formatNumber;
_formatNumber = _;
return _chart;
};
return _chart.anchor(parent, chartGroup);
};
/**
## Heat Map
Includes: [Color Mixin](#color-mixin), [Margin Mixin](#margin-mixin), [Base Mixin](#base-mixin)
A heat map is matrix that represents the values of two dimensions of data using colors.
#### dc.heatMap(parent[, chartGroup])
Create a heat map instance and attach it to the given parent element.
Parameters:
* parent : string - any valid d3 single selector representing typically a dom block element such as a div.
* chartGroup : string (optional) - name of the chart group this chart instance should be placed in. Once a chart is placed
in a certain chart group then any interaction with such instance will only trigger events and redraw within the same
chart group.
Return:
A newly created heat map instance
```js
// create a heat map under #chart-container1 element using the default global chart group
var heatMap1 = dc.heatMap("#chart-container1");
// create a heat map under #chart-container2 element using chart group A
var heatMap2 = dc.heatMap("#chart-container2", "chartGroupA");
```
**/
dc.heatMap = function (parent, chartGroup) {
var DEFAULT_BORDER_RADIUS = 6.75;
var _chartBody;
var _cols;
var _rows;
var _xBorderRadius = DEFAULT_BORDER_RADIUS;
var _yBorderRadius = DEFAULT_BORDER_RADIUS;
var _chart = dc.colorMixin(dc.marginMixin(dc.baseMixin({})));
_chart._mandatoryAttributes(['group']);
_chart.title(_chart.colorAccessor());
var _xAxisOnClick = function (d) { filterAxis(0, d); };
var _yAxisOnClick = function (d) { filterAxis(1, d); };
var _boxOnClick = function (d) {
var filter = d.key;
dc.events.trigger(function() {
_chart.filter(filter);
_chart.redrawGroup();
});
};
function filterAxis(axis, value) {
var cellsOnAxis = _chart.selectAll(".box-group").filter( function (d) {
return d.key[axis] == value;
});
var unfilteredCellsOnAxis = cellsOnAxis.filter( function (d) {
return !_chart.hasFilter(d.key);
});
dc.events.trigger(function() {
if(unfilteredCellsOnAxis.empty()) {
cellsOnAxis.each( function (d) {
_chart.filter(d.key);
});
} else {
unfilteredCellsOnAxis.each( function (d) {
_chart.filter(d.key);
});
}
_chart.redrawGroup();
});
}
dc.override(_chart, "filter", function(filter) {
if (!arguments.length) return _chart._filter();
return _chart._filter(dc.filters.TwoDimensionalFilter(filter));
});
function uniq(d,i,a) {
return !i || a[i-1] != d;
}
_chart.rows = function (_) {
if (arguments.length) {
_rows = _;
return _chart;
}
if (_rows) return _rows;
var rowValues = _chart.data().map(_chart.valueAccessor());
rowValues.sort(d3.ascending);
return d3.scale.ordinal().domain(rowValues.filter(uniq));
};
_chart.cols = function (_) {
if (arguments.length) {
_cols = _;
return _chart;
}
if (_cols) return _cols;
var colValues = _chart.data().map(_chart.keyAccessor());
colValues.sort(d3.ascending);
return d3.scale.ordinal().domain(colValues.filter(uniq));
};
_chart._doRender = function () {
_chart.resetSvg();
_chartBody = _chart.svg()
.append("g")
.attr("class", "heatmap")
.attr("transform", "translate(" + _chart.margins().left + "," + _chart.margins().top + ")");
return _chart._doRedraw();
};
_chart._doRedraw = function () {
var rows = _chart.rows(),
cols = _chart.cols(),
rowCount = rows.domain().length,
colCount = cols.domain().length,
boxWidth = Math.floor(_chart.effectiveWidth() / colCount),
boxHeight = Math.floor(_chart.effectiveHeight() / rowCount);
cols.rangeRoundBands([0, _chart.effectiveWidth()]);
rows.rangeRoundBands([_chart.effectiveHeight(), 0]);
var boxes = _chartBody.selectAll("g.box-group").data(_chart.data(), function(d,i) {
return _chart.keyAccessor()(d,i) + '\0' + _chart.valueAccessor()(d,i);
});
var gEnter = boxes.enter().append("g")
.attr("class", "box-group");
gEnter.append("rect")
.attr("class","heat-box")
.attr("fill", "white")
.on("click", _chart.boxOnClick());
gEnter.append("title")
.text(_chart.title());
dc.transition(boxes.selectAll("rect"), _chart.transitionDuration())
.attr("x", function(d,i) { return cols(_chart.keyAccessor()(d,i)); })
.attr("y", function(d,i) { return rows(_chart.valueAccessor()(d,i)); })
.attr("rx", _xBorderRadius)
.attr("ry", _yBorderRadius)
.attr("fill", _chart.getColor)
.attr("width", boxWidth)
.attr("height", boxHeight);
boxes.exit().remove();
var gCols = _chartBody.selectAll("g.cols");
if (gCols.empty())
gCols = _chartBody.append("g").attr("class", "cols axis");
gCols.selectAll('text').data(cols.domain())
.enter().append("text")
.attr("x", function(d) { return cols(d) + boxWidth/2; })
.style("text-anchor", "middle")
.attr("y", _chart.effectiveHeight())
.attr("dy", 12)
.on("click", _chart.xAxisOnClick())
.text(function(d) { return d; });
var gRows = _chartBody.selectAll("g.rows");
if (gRows.empty())
gRows = _chartBody.append("g").attr("class", "rows axis");
gRows.selectAll('text').data(rows.domain())
.enter().append("text")
.attr("dy", 6)
.style("text-anchor", "end")
.attr("x", 0)
.attr("dx", -2)
.on("click", _chart.yAxisOnClick())
.text(function(d) { return d; });
dc.transition(gRows.selectAll('text'), _chart.transitionDuration())
.text(function(d) { return d; })
.attr("y", function(d) { return rows(d) + boxHeight/2; });
if (_chart.hasFilter()) {
_chart.selectAll("g.box-group").each(function (d) {
if (_chart.isSelectedNode(d)) {
_chart.highlightSelected(this);
} else {
_chart.fadeDeselected(this);
}
});
} else {
_chart.selectAll("g.box-group").each(function () {
_chart.resetHighlight(this);
});
}
return _chart;
};
_chart.boxOnClick = function (f) {
if (!arguments.length) return _boxOnClick;
_boxOnClick = f;
return _chart;
};
_chart.xAxisOnClick = function (f) {
if (!arguments.length) return _xAxisOnClick;
_xAxisOnClick = f;
return _chart;
};
_chart.yAxisOnClick = function (f) {
if (!arguments.length) return _yAxisOnClick;
_yAxisOnClick = f;
return _chart;
};
_chart.xBorderRadius = function (d) {
if (arguments.length) {
_xBorderRadius = d;
}
return _xBorderRadius;
};
_chart.yBorderRadius = function (d) {
if (arguments.length) {
_yBorderRadius = d;
}
return _yBorderRadius;
};
_chart.isSelectedNode = function (d) {
return _chart.hasFilter(d.key);
};
return _chart.anchor(parent, chartGroup);
};
// https://raw.github.com/d3/d3-plugins/56f25a3b54446c921e23a7360f1a0dea2508870f/box/box.js
(function() {
// Inspired by http://informationandvisualization.de/blog/box-plot
d3.box = function() {
var width = 1,
height = 1,
duration = 0,
domain = null,
value = Number,
whiskers = boxWhiskers,
quartiles = boxQuartiles,
tickFormat = null;
// For each small multiple…
function box(g) {
g.each(function(d, i) {
d = d.map(value).sort(d3.ascending);
var g = d3.select(this),
n = d.length,
min = d[0],
max = d[n - 1];
// Compute quartiles. Must return exactly 3 elements.
var quartileData = d.quartiles = quartiles(d);
// Compute whiskers. Must return exactly 2 elements, or null.
var whiskerIndices = whiskers && whiskers.call(this, d, i),
whiskerData = whiskerIndices && whiskerIndices.map(function(i) { return d[i]; });
// Compute outliers. If no whiskers are specified, all data are "outliers".
// We compute the outliers as indices, so that we can join across transitions!
var outlierIndices = whiskerIndices
? d3.range(0, whiskerIndices[0]).concat(d3.range(whiskerIndices[1] + 1, n))
: d3.range(n);
// Compute the new x-scale.
var x1 = d3.scale.linear()
.domain(domain && domain.call(this, d, i) || [min, max])
.range([height, 0]);
// Retrieve the old x-scale, if this is an update.
var x0 = this.__chart__ || d3.scale.linear()
.domain([0, Infinity])
.range(x1.range());
// Stash the new scale.
this.__chart__ = x1;
// Note: the box, median, and box tick elements are fixed in number,
// so we only have to handle enter and update. In contrast, the outliers
// and other elements are variable, so we need to exit them! Variable
// elements also fade in and out.
// Update center line: the vertical line spanning the whiskers.
var center = g.selectAll("line.center")
.data(whiskerData ? [whiskerData] : []);
center.enter().insert("line", "rect")
.attr("class", "center")
.attr("x1", width / 2)
.attr("y1", function(d) { return x0(d[0]); })
.attr("x2", width / 2)
.attr("y2", function(d) { return x0(d[1]); })
.style("opacity", 1e-6)
.transition()
.duration(duration)
.style("opacity", 1)
.attr("y1", function(d) { return x1(d[0]); })
.attr("y2", function(d) { return x1(d[1]); });
center.transition()
.duration(duration)
.style("opacity", 1)
.attr("y1", function(d) { return x1(d[0]); })
.attr("y2", function(d) { return x1(d[1]); });
center.exit().transition()
.duration(duration)
.style("opacity", 1e-6)
.attr("y1", function(d) { return x1(d[0]); })
.attr("y2", function(d) { return x1(d[1]); })
.remove();
// Update innerquartile box.
var box = g.selectAll("rect.box")
.data([quartileData]);
box.enter().append("rect")
.attr("class", "box")
.attr("x", 0)
.attr("y", function(d) { return x0(d[2]); })
.attr("width", width)
.attr("height", function(d) { return x0(d[0]) - x0(d[2]); })
.transition()
.duration(duration)
.attr("y", function(d) { return x1(d[2]); })
.attr("height", function(d) { return x1(d[0]) - x1(d[2]); });
box.transition()
.duration(duration)
.attr("y", function(d) { return x1(d[2]); })
.attr("height", function(d) { return x1(d[0]) - x1(d[2]); });
// Update median line.
var medianLine = g.selectAll("line.median")
.data([quartileData[1]]);
medianLine.enter().append("line")
.attr("class", "median")
.attr("x1", 0)
.attr("y1", x0)
.attr("x2", width)
.attr("y2", x0)
.transition()
.duration(duration)
.attr("y1", x1)
.attr("y2", x1);
medianLine.transition()
.duration(duration)
.attr("y1", x1)
.attr("y2", x1);
// Update whiskers.
var whisker = g.selectAll("line.whisker")
.data(whiskerData || []);
whisker.enter().insert("line", "circle, text")
.attr("class", "whisker")
.attr("x1", 0)
.attr("y1", x0)
.attr("x2", width)
.attr("y2", x0)
.style("opacity", 1e-6)
.transition()
.duration(duration)
.attr("y1", x1)
.attr("y2", x1)
.style("opacity", 1);
whisker.transition()
.duration(duration)
.attr("y1", x1)
.attr("y2", x1)
.style("opacity", 1);
whisker.exit().transition()
.duration(duration)
.attr("y1", x1)
.attr("y2", x1)
.style("opacity", 1e-6)
.remove();
// Update outliers.
var outlier = g.selectAll("circle.outlier")
.data(outlierIndices, Number);
outlier.enter().insert("circle", "text")
.attr("class", "outlier")
.attr("r", 5)
.attr("cx", width / 2)
.attr("cy", function(i) { return x0(d[i]); })
.style("opacity", 1e-6)
.transition()
.duration(duration)
.attr("cy", function(i) { return x1(d[i]); })
.style("opacity", 1);
outlier.transition()
.duration(duration)
.attr("cy", function(i) { return x1(d[i]); })
.style("opacity", 1);
outlier.exit().transition()
.duration(duration)
.attr("cy", function(i) { return x1(d[i]); })
.style("opacity", 1e-6)
.remove();
// Compute the tick format.
var format = tickFormat || x1.tickFormat(8);
// Update box ticks.
var boxTick = g.selectAll("text.box")
.data(quartileData);
boxTick.enter().append("text")
.attr("class", "box")
.attr("dy", ".3em")
.attr("dx", function(d, i) { return i & 1 ? 6 : -6; })
.attr("x", function(d, i) { return i & 1 ? width : 0; })
.attr("y", x0)
.attr("text-anchor", function(d, i) { return i & 1 ? "start" : "end"; })
.text(format)
.transition()
.duration(duration)
.attr("y", x1);
boxTick.transition()
.duration(duration)
.text(format)
.attr("y", x1);
// Update whisker ticks. These are handled separately from the box
// ticks because they may or may not exist, and we want don't want
// to join box ticks pre-transition with whisker ticks post-.
var whiskerTick = g.selectAll("text.whisker")
.data(whiskerData || []);
whiskerTick.enter().append("text")
.attr("class", "whisker")
.attr("dy", ".3em")
.attr("dx", 6)
.attr("x", width)
.attr("y", x0)
.text(format)
.style("opacity", 1e-6)
.transition()
.duration(duration)
.attr("y", x1)
.style("opacity", 1);
whiskerTick.transition()
.duration(duration)
.text(format)
.attr("y", x1)
.style("opacity", 1);
whiskerTick.exit().transition()
.duration(duration)
.attr("y", x1)
.style("opacity", 1e-6)
.remove();
});
d3.timer.flush();
}
box.width = function(x) {
if (!arguments.length) return width;
width = x;
return box;
};
box.height = function(x) {
if (!arguments.length) return height;
height = x;
return box;
};
box.tickFormat = function(x) {
if (!arguments.length) return tickFormat;
tickFormat = x;
return box;
};
box.duration = function(x) {
if (!arguments.length) return duration;
duration = x;
return box;
};
box.domain = function(x) {
if (!arguments.length) return domain;
domain = x == null ? x : d3.functor(x);
return box;
};
box.value = function(x) {
if (!arguments.length) return value;
value = x;
return box;
};
box.whiskers = function(x) {
if (!arguments.length) return whiskers;
whiskers = x;
return box;
};
box.quartiles = function(x) {
if (!arguments.length) return quartiles;
quartiles = x;
return box;
};
return box;
};
function boxWhiskers(d) {
return [0, d.length - 1];
}
function boxQuartiles(d) {
return [
d3.quantile(d, .25),
d3.quantile(d, .5),
d3.quantile(d, .75)
];
}
})();
/**
## Box Plot
Includes: [Coordinate Grid Mixin](#coordinate-grid-mixin)
A box plot is a chart that depicts numerical data via their quartile ranges.
#### dc.boxPlot(parent[, chartGroup])
Create a box plot instance and attach it to the given parent element.
Parameters:
* parent : string - any valid d3 single selector representing typically a dom block element such as a div.
* chartGroup : string (optional) - name of the chart group this chart instance should be placed in. Once a chart is placed
in a certain chart group then any interaction with such instance will only trigger events and redraw within the same
chart group.
Return:
A newly created box plot instance
```js
// create a box plot under #chart-container1 element using the default global chart group
var boxPlot1 = dc.boxPlot("#chart-container1");
// create a box plot under #chart-container2 element using chart group A
var boxPlot2 = dc.boxPlot("#chart-container2", "chartGroupA");
```
**/
dc.boxPlot = function (parent, chartGroup) {
var _chart = dc.coordinateGridMixin({});
var _whisker_iqr_factor = 1.5;
var _whiskers_iqr = default_whiskers_iqr;
var _whiskers = _whiskers_iqr(_whisker_iqr_factor);
var _box = d3.box();
var _tickFormat = null;
var _boxWidth = function (innerChartWidth, xUnits) {
if (_chart.isOrdinal())
return _chart.x().rangeBand();
else
return innerChartWidth / (1 + _chart.boxPadding()) / xUnits;
};
// default padding to handle min/max whisker text
_chart.yAxisPadding(12);
// default to ordinal
_chart.x(d3.scale.ordinal());
_chart.xUnits(dc.units.ordinal);
// valueAccessor should return an array of values that can be coerced into numbers
// or if data is overloaded for a static array of arrays, it should be `Number`.
// Empty arrays are not included.
_chart.data(function(group) {
return group.all().map(function (d) {
d.map = function(accessor) { return accessor.call(d,d); };
return d;
}).filter(function (d) {
var values = _chart.valueAccessor()(d);
return values.length !== 0;
});
});
/**
#### .boxPadding([padding])
Get or set the spacing between boxes as a fraction of bar size. Valid values are within 0-1.
See the [d3 docs](https://github.com/mbostock/d3/wiki/Ordinal-Scales#wiki-ordinal_rangeBands)
for a visual description of how the padding is applied.
Default: 0.8
**/
_chart.boxPadding = _chart._rangeBandPadding;
_chart.boxPadding(0.8);
/**
#### .outerPadding([padding])
Get or set the outer padding on an ordinal box chart. This setting has no effect on non-ordinal charts
or on charts with a custom `.boxWidth`. Padding equivlent in width to `padding * barWidth` will be
added on each side of the chart.
Default: 0.5
**/
_chart.outerPadding = _chart._outerRangeBandPadding;
_chart.outerPadding(0.5);
/**
#### .boxWidth(width || function(innerChartWidth, xUnits) { ... })
Get or set the numerical width of the boxplot box. Provided width may also be a function.
This function takes as parameters the chart width without the right and left margins
as well as the number of x units.
**/
_chart.boxWidth = function(_) {
if (!arguments.length) return _boxWidth;
_boxWidth = d3.functor(_);
return _chart;
};
var boxTransform = function (d, i) {
var xOffset = _chart.x()(_chart.keyAccessor()(d,i));
return "translate(" + xOffset + ",0)";
};
_chart._preprocessData = function () {
if (_chart.elasticX()) {
_chart.x().domain([]);
}
};
_chart.plotData = function () {
var _calculatedBoxWidth = _boxWidth(_chart.effectiveWidth(), _chart.xUnitCount());
_box.whiskers(_whiskers)
.width(_calculatedBoxWidth)
.height(_chart.effectiveHeight())
.value(_chart.valueAccessor())
.domain(_chart.y().domain())
.duration(_chart.transitionDuration())
.tickFormat(_tickFormat);
var boxesG = _chart.chartBodyG().selectAll('g.box').data(_chart.data());
renderBoxes(boxesG);
updateBoxes(boxesG);
removeBoxes(boxesG);
_chart.fadeDeselectedArea();
};
function renderBoxes(boxesG) {
var boxesGEnter = boxesG.enter().append("g");
boxesGEnter
.attr("class", "box")
.attr("transform", boxTransform)
.call(_box)
.on("click", function(d) {
_chart.filter(d.key);
_chart.redrawGroup();
});
}
function updateBoxes(boxesG) {
dc.transition(boxesG, _chart.transitionDuration())
.attr("transform", boxTransform)
.call(_box)
.each(function() {
d3.select(this).select('rect.box').attr("fill", _chart.getColor);
});
}
function removeBoxes(boxesG) {
boxesG.exit().remove().call(_box);
}
_chart.fadeDeselectedArea = function () {
if (_chart.hasFilter()) {
_chart.g().selectAll("g.box").each(function (d) {
if (_chart.isSelectedNode(d)) {
_chart.highlightSelected(this);
} else {
_chart.fadeDeselected(this);
}
});
} else {
_chart.g().selectAll("g.box").each(function () {
_chart.resetHighlight(this);
});
}
};
_chart.isSelectedNode = function (d) {
return _chart.hasFilter(d.key);
};
_chart.yAxisMin = function () {
var min = d3.min(_chart.data(), function (e) {
return d3.min(_chart.valueAccessor()(e));
});
return dc.utils.subtract(min, _chart.yAxisPadding());
};
_chart.yAxisMax = function () {
var max = d3.max(_chart.data(), function (e) {
return d3.max(_chart.valueAccessor()(e));
});
return dc.utils.add(max, _chart.yAxisPadding());
};
/**
#### .tickFormat()
Set the numerical format of the boxplot median, whiskers and quartile labels. Defaults to integer.
```js
// format ticks to 2 decimal places
chart.tickFormat(d3.format(".2f"));
```
**/
_chart.tickFormat = function(x) {
if (!arguments.length) return _tickFormat;
_tickFormat = x;
return _chart;
};
// Returns a function to compute the interquartile range.
function default_whiskers_iqr(k) {
return function (d) {
var q1 = d.quartiles[0],
q3 = d.quartiles[2],
iqr = (q3 - q1) * k,
i = -1,
j = d.length;
while (d[++i] < q1 - iqr);
while (d[--j] > q3 + iqr);
return [i, j];
};
}
return _chart.anchor(parent, chartGroup);
};
// Renamed functions
dc.abstractBubbleChart = dc.bubbleMixin;
dc.baseChart = dc.baseMixin;
dc.capped = dc.capMixin;
dc.colorChart = dc.colorMixin;
dc.coordinateGridChart = dc.coordinateGridMixin;
dc.marginable = dc.marginMixin;
dc.stackableChart = dc.stackMixin;
return dc;})();
<!DOCTYPE html>
<html lang="en">
<head>
<title>Student Census</title>
<meta charset="UTF-8">
<link href="bootstrapQ.css" rel="stylesheet">
<link href='http://fonts.googleapis.com/css?family=Lato:200,400' rel='stylesheet' type='text/css'>
<link rel="stylesheet" type="text/css" href="dc.css"/>
</head>
<style>
/* testing out d3 tooltip */
.d3-tip {
line-height: 1;
font-weight: bold;
padding: 12px;
background: rgba(0, 0, 0, 0.8);
color: #fff;
border-radius: 8px;
}
/* Creates a small triangle extender for the tooltip */
.d3-tip:after {
box-sizing: border-box;
display: inline;
font-size: 10px;
width: 100%;
line-height: 1;
color: rgba(0, 0, 0, 0.8);
content: "\25BC";
position: absolute;
text-align: center;
}
/* Style northward tooltips differently */
.d3-tip.n:after {
margin: -1px 0 0 0;
top: 100%;
left: 0;
}
body {
font-size: 16px;
line-height: 20px;
color: #525252;
}
h3 {
font-family: "Helvetica Neue";
}
#count-reset-row {
width: 100%;
}
#ethnicity-chart {
font-family: 'Lato', futura, georgia;
}
#entry-status-chart {
font-family: 'Lato', futura, georgia;
}
#grad-status-chart {
width: 250px;
font-family: 'Lato', futura, georgia;
}
#gender-chart {
width: 250px;
font-family: 'Lato', futura, georgia;
}
#year-chart {
width: 500px;
font-family: 'Lato', futura, georgia;
}
#series-chart {
width: 500px;
font-family: 'Lato', futura, georgia;
}
#data-count-top {
width: 100%;
}
.navbar-text-q {
font: 400 24px "Helvetica Neue";
vertical-align: middle;
}
#data-table {
padding-top: 100px;
}
#data-count-bottom {
padding-top: 30px;
}
#census-container {
margin-top: 46px;
max-width: 1100px;
}
span.filter {
font-size: 14px;
color: #cc4c02;
font-weight: 500;
}
span.filter-count {
color: #428BCA;
font-weight: bold;
width: 20px;
font-size: 18px;
}
span.total-count {
color: #525252;
font-weight: bold;
width: 20px;
}
span.reset {
font-size: 12px;
color: #cc4c02;
}
span.company-desc {
color: #525252;
font-size: 16px;
font-weight: normal;
}
span.chart-footnotes {
font: 200 14px "Helvetica Neue";
stroke: #969696;
}
span.exit-desc {
background-color: yellow;
}
#reset-all {
color: #CC4C02;
}
tr.header {
color: #696969;
}
tr {
font: 100 14px 'Lato';
color: #969696;
}
</style>
<body>
<!-- Fixed navbar at the top-->
<div class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
Current Census (Work in Progress)
<span class="navbar-text-q">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#969696"> </span><span style="color:#969696"></span><span style="color:#969696"></span></span>
<span class="btn-group">
<button type="button" class="btn btn-default" data-toggle="modal" href="#myModal">
About</span>
</button>
</span>
</div>
</div>
</div>
<!-- Modal Box-->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">About this graph</h4>
</div>
<div class="modal-body">
<h4 class="modal-title">The technology</h4>
<p>These interactive graphs were made using an excellent javascript charting library called <a target="_blank" href="http://nickqizhu.github.io/dc.js/">dc.js</a>, which was built to work natively with <a target="_blank" href="http://square.github.com/crossfilter/">crossfilter</a> and leverages the super awesome <a target="_blank" href="http://d3js.org">d3.js</a>.
<p>Another dc.js resource is this <a target="_blank" href="http://dc-js.github.io/dc.js/docs/stock.html">annotated source</a> which steps through the dc.js Nasdaq 100 Index.
<hr>
<p>- Sara
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<div class="container" id="census-container">
<div id="data-count-top" class="row">
<span class="filter-count"></span> selected out of <span class="total-count"></span> records |&nbsp;
<span id="reset-all">
<a href="javascript:dc.filterAll();dc.redrawAll();">Reset ALL Filters</a>
</span>
<p>
</div>
<div class="row">
<div id="ethnicity-chart">
<strong>Ethnicity</strong>
<a class="reset" href="javascript:ethnicityChart.filterAll();dc.redrawAll();" style="display: none;"> | reset</a><br>
<div class="clearfix"></div>
</div>
<div id="series-chart">
<strong>Headcount by Ethnicity</strong><span class="chart-footnotes"></span>
<a class="reset" href="javascript:seriesChart.filterAll();dc.redrawAll();" style="display: none;">reset</a>
<span class="reset" style="display: none;"> | <span class="filter"></span></span>
<div class="clearfix"></div>
</div>
</div>
<div class="row">
<div id="entry-status-chart">
<strong>Entry Status</strong>
<a class="reset" href="javascript:entryStatusChart.filterAll();dc.redrawAll();" style="display: none;">reset</a>
<span class="reset" style="display: none;"> | <span class="filter"></span></span>
<div class="clearfix"></div>
</div>
<div id="year-chart">
<strong>Total Headcount</strong><span class="chart-footnotes"></span>
<a class="reset" href="javascript:yearChart.filterAll();dc.redrawAll();" style="display: none;">reset</a>
<span class="reset" style="display: none;"> | <span class="filter"></span></span>
<div class="clearfix"></div>
</div>
<div id="grad-status-chart">
<strong>Level</strong>
<a class="reset" href="javascript:gradStatusChart.filterAll();dc.redrawAll();" style="display: none;">reset</a>
<div class="clearfix"></div>
</div>
<div id="gender-chart">
<strong>Gender</strong>
<a class="reset" href="javascript:undergradChart.filterAll();dc.redrawAll();" style="display: none;">reset</a>
<div class="clearfix"></div>
</div>
</div>
<div id="data-count-bottom" class="row">
<span class="filter-count"></span> selected out of <span class="total-count"></span> records |&nbsp;
<span id="reset-all">
<a href="javascript:dc.filterAll();dc.redrawAll();">Reset ALL Filters</a>
</span>
</div>
<div id="data-table">
<table class="table table-hover dc-data-table">
<thead>
<tr class="header">
<th>Level</th>
<th>Entry Status</th>
<th>Gender</th>
<th>Race Ethnicity</th>
<th>Year</th>
<th>Count</th>
</tr>
</thead>
</table>
</div>
</div>
<script type="text/javascript" src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
<script type="text/javascript" src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/crossfilter/1.3.7/crossfilter.min.js"></script>
<script type="text/javascript" src="dc.js"></script>
<script type="text/javascript" src="d3.tip.min.js"></script>
<script type="text/javascript" src="studentCensus.js"></script>
</body>
</html>
undergradStatus entryStatus gender raceEthnicity year count
G Advanced Standing Female African American 1985 1
G Advanced Standing Female African American 1986 1
G Advanced Standing Female African American 1987 2
G Advanced Standing Female African American 1988 3
G Advanced Standing Female African American 1989 2
G Advanced Standing Female African American 1990 3
G Advanced Standing Female African American 1991 5
G Advanced Standing Female African American 1992 5
G Advanced Standing Female African American 1993 12
G Advanced Standing Female African American 1994 10
G Advanced Standing Female African American 1995 5
G Advanced Standing Female African American 1996 10
G Advanced Standing Female African American 1997 7
G Advanced Standing Female African American 1998 6
G Advanced Standing Female African American 1999 6
G Advanced Standing Female African American 2000 9
G Advanced Standing Female African American 2001 7
G Advanced Standing Female African American 2002 7
G Advanced Standing Female African American 2003 5
G Advanced Standing Female African American 2004 8
G Advanced Standing Female African American 2005 9
G Advanced Standing Female African American 2006 7
G Advanced Standing Female African American 2007 6
G Advanced Standing Female African American 2008 3
G Advanced Standing Female Asian 1985 8
G Advanced Standing Female Asian 1986 13
G Advanced Standing Female Asian 1987 18
G Advanced Standing Female Asian 1988 27
G Advanced Standing Female Asian 1989 24
G Advanced Standing Female Asian 1990 26
G Advanced Standing Female Asian 1991 22
G Advanced Standing Female Asian 1992 26
G Advanced Standing Female Asian 1993 42
G Advanced Standing Female Asian 1994 42
G Advanced Standing Female Asian 1995 37
G Advanced Standing Female Asian 1996 34
G Advanced Standing Female Asian 1997 36
G Advanced Standing Female Asian 1998 38
G Advanced Standing Female Asian 1999 35
G Advanced Standing Female Asian 2000 27
G Advanced Standing Female Asian 2001 21
G Advanced Standing Female Asian 2002 22
G Advanced Standing Female Asian 2003 27
G Advanced Standing Female Asian 2004 20
G Advanced Standing Female Asian 2005 34
G Advanced Standing Female Asian 2006 30
G Advanced Standing Female Asian 2007 34
G Advanced Standing Female Asian 2008 29
G Advanced Standing Female Chicano/Latino 1984 1
G Advanced Standing Female Chicano/Latino 1985 2
G Advanced Standing Female Chicano/Latino 1986 4
G Advanced Standing Female Chicano/Latino 1987 10
G Advanced Standing Female Chicano/Latino 1988 12
G Advanced Standing Female Chicano/Latino 1989 12
G Advanced Standing Female Chicano/Latino 1990 12
G Advanced Standing Female Chicano/Latino 1991 17
G Advanced Standing Female Chicano/Latino 1992 21
G Advanced Standing Female Chicano/Latino 1993 24
G Advanced Standing Female Chicano/Latino 1994 24
G Advanced Standing Female Chicano/Latino 1995 23
G Advanced Standing Female Chicano/Latino 1996 23
G Advanced Standing Female Chicano/Latino 1997 19
G Advanced Standing Female Chicano/Latino 1998 19
G Advanced Standing Female Chicano/Latino 1999 16
G Advanced Standing Female Chicano/Latino 2000 16
G Advanced Standing Female Chicano/Latino 2001 14
G Advanced Standing Female Chicano/Latino 2002 15
G Advanced Standing Female Chicano/Latino 2003 18
G Advanced Standing Female Chicano/Latino 2004 21
G Advanced Standing Female Chicano/Latino 2005 18
G Advanced Standing Female Chicano/Latino 2006 19
G Advanced Standing Female Chicano/Latino 2007 22
G Advanced Standing Female Chicano/Latino 2008 21
G Advanced Standing Female Decline to State 1986 3
G Advanced Standing Female Decline to State 1987 1
G Advanced Standing Female Decline to State 1990 1
G Advanced Standing Female Decline to State 1991 5
G Advanced Standing Female Decline to State 1992 6
G Advanced Standing Female Decline to State 1993 5
G Advanced Standing Female Decline to State 1994 7
G Advanced Standing Female Decline to State 1995 9
G Advanced Standing Female Decline to State 1996 9
G Advanced Standing Female Decline to State 1997 4
G Advanced Standing Female Decline to State 1998 2
G Advanced Standing Female Decline to State 1999 3
G Advanced Standing Female Decline to State 2000 9
G Advanced Standing Female Decline to State 2001 9
G Advanced Standing Female Decline to State 2002 8
G Advanced Standing Female Decline to State 2003 8
G Advanced Standing Female Decline to State 2004 11
G Advanced Standing Female Decline to State 2005 18
G Advanced Standing Female Decline to State 2006 15
G Advanced Standing Female Decline to State 2007 17
G Advanced Standing Female Decline to State 2008 20
G Advanced Standing Female International 1985 2
G Advanced Standing Female International 1986 3
G Advanced Standing Female International 1987 2
G Advanced Standing Female International 1988 2
G Advanced Standing Female International 1989 2
G Advanced Standing Female International 1990 5
G Advanced Standing Female International 1991 5
G Advanced Standing Female International 1992 4
G Advanced Standing Female International 1993 5
G Advanced Standing Female International 1994 3
G Advanced Standing Female International 1995 6
G Advanced Standing Female International 1996 8
G Advanced Standing Female International 1997 4
G Advanced Standing Female International 1998 3
G Advanced Standing Female International 1999 5
G Advanced Standing Female International 2000 6
G Advanced Standing Female International 2001 2
G Advanced Standing Female International 2002 4
G Advanced Standing Female International 2003 5
G Advanced Standing Female International 2004 4
G Advanced Standing Female International 2005 4
G Advanced Standing Female International 2006 3
G Advanced Standing Female International 2007 5
G Advanced Standing Female International 2008 3
G Advanced Standing Female Native American 1988 1
G Advanced Standing Female Native American 1989 1
G Advanced Standing Female Native American 1990 2
G Advanced Standing Female Native American 1991 1
G Advanced Standing Female Native American 1992 1
G Advanced Standing Female Native American 1993 4
G Advanced Standing Female Native American 1994 4
G Advanced Standing Female Native American 1995 1
G Advanced Standing Female Native American 1996 1
G Advanced Standing Female Native American 1997 1
G Advanced Standing Female Native American 1998 4
G Advanced Standing Female Native American 1999 5
G Advanced Standing Female Native American 2000 6
G Advanced Standing Female Native American 2001 7
G Advanced Standing Female Native American 2002 10
G Advanced Standing Female Native American 2003 6
G Advanced Standing Female Native American 2004 2
G Advanced Standing Female Native American 2005 1
G Advanced Standing Female Native American 2007 1
G Advanced Standing Female Native American 2008 1
G Advanced Standing Female Other 1989 3
G Advanced Standing Female Other 1990 6
G Advanced Standing Female Other 1991 3
G Advanced Standing Female Other 1992 6
G Advanced Standing Female Other 1993 6
G Advanced Standing Female Other 1994 11
G Advanced Standing Female Other 1995 12
G Advanced Standing Female Other 1996 4
G Advanced Standing Female Other 1997 6
G Advanced Standing Female Other 1998 6
G Advanced Standing Female Other 1999 6
G Advanced Standing Female Other 2000 2
G Advanced Standing Female Other 2001 4
G Advanced Standing Female Other 2002 5
G Advanced Standing Female Other 2003 10
G Advanced Standing Female Other 2004 11
G Advanced Standing Female Other 2005 7
G Advanced Standing Female Other 2006 12
G Advanced Standing Female Other 2007 17
G Advanced Standing Female Other 2008 12
G Advanced Standing Female Pacific Islander 1992 1
G Advanced Standing Female Pacific Islander 1993 1
G Advanced Standing Female Pacific Islander 1998 1
G Advanced Standing Female Pacific Islander 1999 1
G Advanced Standing Female Pacific Islander 2001 1
G Advanced Standing Female White 1984 4
G Advanced Standing Female White 1985 33
G Advanced Standing Female White 1986 69
G Advanced Standing Female White 1987 86
G Advanced Standing Female White 1988 96
G Advanced Standing Female White 1989 103
G Advanced Standing Female White 1990 103
G Advanced Standing Female White 1991 120
G Advanced Standing Female White 1992 113
G Advanced Standing Female White 1993 120
G Advanced Standing Female White 1994 121
G Advanced Standing Female White 1995 105
G Advanced Standing Female White 1996 105
G Advanced Standing Female White 1997 114
G Advanced Standing Female White 1998 102
G Advanced Standing Female White 1999 98
G Advanced Standing Female White 2000 97
G Advanced Standing Female White 2001 88
G Advanced Standing Female White 2002 87
G Advanced Standing Female White 2003 86
G Advanced Standing Female White 2004 85
G Advanced Standing Female White 2005 80
G Advanced Standing Female White 2006 64
G Advanced Standing Female White 2007 57
G Advanced Standing Female White 2008 54
G Advanced Standing Male African American 1984 1
G Advanced Standing Male African American 1985 2
G Advanced Standing Male African American 1986 3
G Advanced Standing Male African American 1987 2
G Advanced Standing Male African American 1988 2
G Advanced Standing Male African American 1989 2
G Advanced Standing Male African American 1990 5
G Advanced Standing Male African American 1991 6
G Advanced Standing Male African American 1992 9
G Advanced Standing Male African American 1993 4
G Advanced Standing Male African American 1994 5
G Advanced Standing Male African American 1995 5
G Advanced Standing Male African American 1996 6
G Advanced Standing Male African American 1997 7
G Advanced Standing Male African American 1998 8
G Advanced Standing Male African American 1999 5
G Advanced Standing Male African American 2000 5
G Advanced Standing Male African American 2001 5
G Advanced Standing Male African American 2002 7
G Advanced Standing Male African American 2003 6
G Advanced Standing Male African American 2004 6
G Advanced Standing Male African American 2005 7
G Advanced Standing Male African American 2006 7
G Advanced Standing Male African American 2007 5
G Advanced Standing Male African American 2008 5
G Advanced Standing Male Asian 1984 1
G Advanced Standing Male Asian 1985 9
G Advanced Standing Male Asian 1986 33
G Advanced Standing Male Asian 1987 49
G Advanced Standing Male Asian 1988 42
G Advanced Standing Male Asian 1989 38
G Advanced Standing Male Asian 1990 39
G Advanced Standing Male Asian 1991 45
G Advanced Standing Male Asian 1992 47
G Advanced Standing Male Asian 1993 45
G Advanced Standing Male Asian 1994 49
G Advanced Standing Male Asian 1995 41
G Advanced Standing Male Asian 1996 39
G Advanced Standing Male Asian 1997 36
G Advanced Standing Male Asian 1998 40
G Advanced Standing Male Asian 1999 42
G Advanced Standing Male Asian 2000 33
G Advanced Standing Male Asian 2001 36
G Advanced Standing Male Asian 2002 37
G Advanced Standing Male Asian 2003 35
G Advanced Standing Male Asian 2004 28
G Advanced Standing Male Asian 2005 17
G Advanced Standing Male Asian 2006 19
G Advanced Standing Male Asian 2007 29
G Advanced Standing Male Asian 2008 38
G Advanced Standing Male Chicano/Latino 1985 1
G Advanced Standing Male Chicano/Latino 1986 5
G Advanced Standing Male Chicano/Latino 1987 11
G Advanced Standing Male Chicano/Latino 1988 13
G Advanced Standing Male Chicano/Latino 1989 16
G Advanced Standing Male Chicano/Latino 1990 11
G Advanced Standing Male Chicano/Latino 1991 13
G Advanced Standing Male Chicano/Latino 1992 17
G Advanced Standing Male Chicano/Latino 1993 22
G Advanced Standing Male Chicano/Latino 1994 22
G Advanced Standing Male Chicano/Latino 1995 24
G Advanced Standing Male Chicano/Latino 1996 24
G Advanced Standing Male Chicano/Latino 1997 28
G Advanced Standing Male Chicano/Latino 1998 22
G Advanced Standing Male Chicano/Latino 1999 19
G Advanced Standing Male Chicano/Latino 2000 14
G Advanced Standing Male Chicano/Latino 2001 12
G Advanced Standing Male Chicano/Latino 2002 13
G Advanced Standing Male Chicano/Latino 2003 18
G Advanced Standing Male Chicano/Latino 2004 23
G Advanced Standing Male Chicano/Latino 2005 19
G Advanced Standing Male Chicano/Latino 2006 20
G Advanced Standing Male Chicano/Latino 2007 24
G Advanced Standing Male Chicano/Latino 2008 22
G Advanced Standing Male Decline to State 1985 2
G Advanced Standing Male Decline to State 1986 5
G Advanced Standing Male Decline to State 1987 4
G Advanced Standing Male Decline to State 1988 4
G Advanced Standing Male Decline to State 1989 2
G Advanced Standing Male Decline to State 1990 5
G Advanced Standing Male Decline to State 1991 4
G Advanced Standing Male Decline to State 1992 10
G Advanced Standing Male Decline to State 1993 8
G Advanced Standing Male Decline to State 1994 11
G Advanced Standing Male Decline to State 1995 5
G Advanced Standing Male Decline to State 1996 6
G Advanced Standing Male Decline to State 1997 4
G Advanced Standing Male Decline to State 1998 5
G Advanced Standing Male Decline to State 1999 7
G Advanced Standing Male Decline to State 2000 10
G Advanced Standing Male Decline to State 2001 6
G Advanced Standing Male Decline to State 2002 7
G Advanced Standing Male Decline to State 2003 12
G Advanced Standing Male Decline to State 2004 11
G Advanced Standing Male Decline to State 2005 14
G Advanced Standing Male Decline to State 2006 11
G Advanced Standing Male Decline to State 2007 13
G Advanced Standing Male Decline to State 2008 24
G Advanced Standing Male International 1986 4
G Advanced Standing Male International 1987 4
G Advanced Standing Male International 1988 5
G Advanced Standing Male International 1989 5
G Advanced Standing Male International 1990 4
G Advanced Standing Male International 1991 7
G Advanced Standing Male International 1992 12
G Advanced Standing Male International 1993 8
G Advanced Standing Male International 1994 6
G Advanced Standing Male International 1995 10
G Advanced Standing Male International 1996 4
G Advanced Standing Male International 1997 6
G Advanced Standing Male International 1998 5
G Advanced Standing Male International 1999 9
G Advanced Standing Male International 2000 10
G Advanced Standing Male International 2001 5
G Advanced Standing Male International 2002 4
G Advanced Standing Male International 2003 9
G Advanced Standing Male International 2004 8
G Advanced Standing Male International 2005 9
G Advanced Standing Male International 2006 11
G Advanced Standing Male International 2007 15
G Advanced Standing Male International 2008 12
G Advanced Standing Male Native American 1985 1
G Advanced Standing Male Native American 1986 1
G Advanced Standing Male Native American 1987 1
G Advanced Standing Male Native American 1992 1
G Advanced Standing Male Native American 1993 1
G Advanced Standing Male Native American 1995 1
G Advanced Standing Male Native American 1996 1
G Advanced Standing Male Native American 1997 1
G Advanced Standing Male Native American 2002 4
G Advanced Standing Male Native American 2003 6
G Advanced Standing Male Native American 2004 4
G Advanced Standing Male Native American 2006 2
G Advanced Standing Male Native American 2007 2
G Advanced Standing Male Native American 2008 3
G Advanced Standing Male Other 1988 3
G Advanced Standing Male Other 1989 3
G Advanced Standing Male Other 1990 5
G Advanced Standing Male Other 1991 5
G Advanced Standing Male Other 1992 4
G Advanced Standing Male Other 1993 4
G Advanced Standing Male Other 1994 8
G Advanced Standing Male Other 1995 9
G Advanced Standing Male Other 1996 8
G Advanced Standing Male Other 1997 9
G Advanced Standing Male Other 1998 5
G Advanced Standing Male Other 1999 5
G Advanced Standing Male Other 2000 5
G Advanced Standing Male Other 2001 7
G Advanced Standing Male Other 2002 7
G Advanced Standing Male Other 2003 7
G Advanced Standing Male Other 2004 7
G Advanced Standing Male Other 2005 9
G Advanced Standing Male Other 2006 12
G Advanced Standing Male Other 2007 12
G Advanced Standing Male Other 2008 15
G Advanced Standing Male Pacific Islander 1988 1
G Advanced Standing Male Pacific Islander 1989 1
G Advanced Standing Male Pacific Islander 1990 1
G Advanced Standing Male Pacific Islander 1991 1
G Advanced Standing Male Pacific Islander 1992 1
G Advanced Standing Male Pacific Islander 1993 1
G Advanced Standing Male Pacific Islander 1994 1
G Advanced Standing Male Pacific Islander 1995 1
G Advanced Standing Male Pacific Islander 1996 1
G Advanced Standing Male Pacific Islander 1997 1
G Advanced Standing Male Pacific Islander 1998 1
G Advanced Standing Male Pacific Islander 1999 1
G Advanced Standing Male White 1984 1
G Advanced Standing Male White 1985 35
G Advanced Standing Male White 1986 85
G Advanced Standing Male White 1987 110
G Advanced Standing Male White 1988 114
G Advanced Standing Male White 1989 127
G Advanced Standing Male White 1990 125
G Advanced Standing Male White 1991 140
G Advanced Standing Male White 1992 162
G Advanced Standing Male White 1993 152
G Advanced Standing Male White 1994 156
G Advanced Standing Male White 1995 145
G Advanced Standing Male White 1996 130
G Advanced Standing Male White 1997 124
G Advanced Standing Male White 1998 122
G Advanced Standing Male White 1999 120
G Advanced Standing Male White 2000 99
G Advanced Standing Male White 2001 81
G Advanced Standing Male White 2002 68
G Advanced Standing Male White 2003 65
G Advanced Standing Male White 2004 59
G Advanced Standing Male White 2005 65
G Advanced Standing Male White 2006 67
G Advanced Standing Male White 2007 69
G Advanced Standing Male White 2008 71
G Doctoral Female African American 2013 119
G Doctoral Female Asian 2013 376
G Doctoral Female Chicano/Latino 2013 187
G Doctoral Female Decline to State 2013 289
G Doctoral Female International 2013 391
G Doctoral Female Native American 2013 30
G Doctoral Female Pacific Islander 2013 5
G Doctoral Female White 2013 1041
G Doctoral Male African American 2013 82
G Doctoral Male Asian 2013 353
G Doctoral Male Chicano/Latino 2013 198
G Doctoral Male Decline to State 2013 420
G Doctoral Male International 2013 856
G Doctoral Male Native American 2013 35
G Doctoral Male Pacific Islander 2013 4
G Doctoral Male White 2013 1311
G High School Honors Female African American 1994 1
G High School Honors Female African American 1995 1
G High School Honors Female African American 1996 1
G High School Honors Female African American 1997 1
G High School Honors Female African American 1998 1
G High School Honors Female African American 1999 2
G High School Honors Female African American 2000 2
G High School Honors Female African American 2001 2
G High School Honors Female African American 2002 2
G High School Honors Female African American 2003 2
G High School Honors Female African American 2004 1
G High School Honors Female African American 2005 1
G High School Honors Female African American 2006 1
G High School Honors Female African American 2007 1
G High School Honors Female African American 2008 1
G High School Honors Female Asian 1991 1
G High School Honors Female Asian 1992 1
G High School Honors Female Asian 1993 2
G High School Honors Female Asian 1994 4
G High School Honors Female Asian 1995 5
G High School Honors Female Asian 1996 7
G High School Honors Female Asian 1997 4
G High School Honors Female Asian 1998 5
G High School Honors Female Asian 1999 4
G High School Honors Female Asian 2000 6
G High School Honors Female Asian 2001 11
G High School Honors Female Asian 2002 11
G High School Honors Female Asian 2003 11
G High School Honors Female Asian 2004 10
G High School Honors Female Asian 2005 6
G High School Honors Female Asian 2006 6
G High School Honors Female Asian 2007 6
G High School Honors Female Asian 2008 4
G High School Honors Female Chicano/Latino 1996 1
G High School Honors Female Chicano/Latino 1997 1
G High School Honors Female Chicano/Latino 1998 1
G High School Honors Female Chicano/Latino 1999 1
G High School Honors Female Chicano/Latino 2000 1
G High School Honors Female Chicano/Latino 2001 1
G High School Honors Female Other 2001 1
G High School Honors Female Other 2004 2
G High School Honors Female Other 2005 1
G High School Honors Female Other 2006 2
G High School Honors Female Other 2007 1
G High School Honors Female Other 2008 1
G High School Honors Female White 1991 1
G High School Honors Female White 1992 2
G High School Honors Female White 1993 2
G High School Honors Female White 1994 1
G High School Honors Female White 1996 4
G High School Honors Female White 1997 4
G High School Honors Female White 1998 5
G High School Honors Female White 1999 6
G High School Honors Female White 2000 7
G High School Honors Female White 2001 6
G High School Honors Female White 2002 7
G High School Honors Female White 2003 9
G High School Honors Female White 2004 4
G High School Honors Female White 2005 6
G High School Honors Female White 2006 5
G High School Honors Female White 2007 6
G High School Honors Female White 2008 6
G High School Honors Male African American 1994 1
G High School Honors Male African American 1995 1
G High School Honors Male African American 1996 1
G High School Honors Male African American 1997 1
G High School Honors Male African American 1998 1
G High School Honors Male African American 1999 1
G High School Honors Male African American 2000 1
G High School Honors Male African American 2001 1
G High School Honors Male African American 2007 1
G High School Honors Male African American 2008 1
G High School Honors Male Asian 1992 2
G High School Honors Male Asian 1993 2
G High School Honors Male Asian 1994 2
G High School Honors Male Asian 1995 3
G High School Honors Male Asian 1996 3
G High School Honors Male Asian 1997 8
G High School Honors Male Asian 1998 9
G High School Honors Male Asian 1999 7
G High School Honors Male Asian 2000 6
G High School Honors Male Asian 2001 5
G High School Honors Male Asian 2002 4
G High School Honors Male Asian 2003 3
G High School Honors Male Asian 2004 3
G High School Honors Male Asian 2005 2
G High School Honors Male Asian 2006 6
G High School Honors Male Asian 2007 5
G High School Honors Male Asian 2008 6
G High School Honors Male Chicano/Latino 1996 1
G High School Honors Male Chicano/Latino 1997 1
G High School Honors Male Chicano/Latino 1998 1
G High School Honors Male Chicano/Latino 2008 1
G High School Honors Male Decline to State 1994 1
G High School Honors Male Decline to State 1995 1
G High School Honors Male Decline to State 1996 1
G High School Honors Male Decline to State 2001 1
G High School Honors Male Decline to State 2002 1
G High School Honors Male Decline to State 2004 3
G High School Honors Male Decline to State 2005 5
G High School Honors Male Decline to State 2006 5
G High School Honors Male Decline to State 2007 2
G High School Honors Male Decline to State 2008 1
G High School Honors Male Other 1996 1
G High School Honors Male Other 1997 1
G High School Honors Male Other 1998 1
G High School Honors Male Other 2002 1
G High School Honors Male Other 2003 1
G High School Honors Male Other 2004 1
G High School Honors Male Other 2005 1
G High School Honors Male Other 2006 1
G High School Honors Male Other 2008 1
G High School Honors Male White 1989 1
G High School Honors Male White 1990 2
G High School Honors Male White 1991 2
G High School Honors Male White 1992 5
G High School Honors Male White 1993 1
G High School Honors Male White 1994 2
G High School Honors Male White 1995 4
G High School Honors Male White 1996 4
G High School Honors Male White 1997 4
G High School Honors Male White 1998 6
G High School Honors Male White 1999 8
G High School Honors Male White 2000 9
G High School Honors Male White 2001 13
G High School Honors Male White 2002 14
G High School Honors Male White 2003 11
G High School Honors Male White 2004 9
G High School Honors Male White 2005 9
G High School Honors Male White 2006 10
G High School Honors Male White 2007 8
G High School Honors Male White 2008 8
G Masters Female African American 2013 75
G Masters Female Asian 2013 310
G Masters Female Chicano/Latino 2013 122
G Masters Female Decline to State 2013 189
G Masters Female International 2013 313
G Masters Female Native American 2013 15
G Masters Female Pacific Islander 2013 1
G Masters Female White 2013 494
G Masters Male African American 2013 50
G Masters Male Asian 2013 406
G Masters Male Chicano/Latino 2013 82
G Masters Male Decline to State 2013 168
G Masters Male International 2013 557
G Masters Male Native American 2013 9
G Masters Male Pacific Islander 2013 2
G Masters Male White 2013 620
G New Freshmen Female African American 1987 1
G New Freshmen Female African American 1988 2
G New Freshmen Female African American 1989 4
G New Freshmen Female African American 1990 2
G New Freshmen Female African American 1991 3
G New Freshmen Female African American 1992 7
G New Freshmen Female African American 1993 17
G New Freshmen Female African American 1994 23
G New Freshmen Female African American 1995 18
G New Freshmen Female African American 1996 13
G New Freshmen Female African American 1997 17
G New Freshmen Female African American 1998 18
G New Freshmen Female African American 1999 12
G New Freshmen Female African American 2000 13
G New Freshmen Female African American 2001 11
G New Freshmen Female African American 2002 12
G New Freshmen Female African American 2003 19
G New Freshmen Female African American 2004 21
G New Freshmen Female African American 2005 20
G New Freshmen Female African American 2006 17
G New Freshmen Female African American 2007 13
G New Freshmen Female African American 2008 14
G New Freshmen Female Asian 1987 3
G New Freshmen Female Asian 1988 9
G New Freshmen Female Asian 1989 27
G New Freshmen Female Asian 1990 56
G New Freshmen Female Asian 1991 60
G New Freshmen Female Asian 1992 62
G New Freshmen Female Asian 1993 69
G New Freshmen Female Asian 1994 96
G New Freshmen Female Asian 1995 107
G New Freshmen Female Asian 1996 106
G New Freshmen Female Asian 1997 113
G New Freshmen Female Asian 1998 122
G New Freshmen Female Asian 1999 124
G New Freshmen Female Asian 2000 122
G New Freshmen Female Asian 2001 137
G New Freshmen Female Asian 2002 146
G New Freshmen Female Asian 2003 177
G New Freshmen Female Asian 2004 186
G New Freshmen Female Asian 2005 178
G New Freshmen Female Asian 2006 175
G New Freshmen Female Asian 2007 187
G New Freshmen Female Asian 2008 175
G New Freshmen Female Chicano/Latino 1987 3
G New Freshmen Female Chicano/Latino 1988 2
G New Freshmen Female Chicano/Latino 1989 10
G New Freshmen Female Chicano/Latino 1990 11
G New Freshmen Female Chicano/Latino 1991 16
G New Freshmen Female Chicano/Latino 1992 15
G New Freshmen Female Chicano/Latino 1993 20
G New Freshmen Female Chicano/Latino 1994 23
G New Freshmen Female Chicano/Latino 1995 25
G New Freshmen Female Chicano/Latino 1996 23
G New Freshmen Female Chicano/Latino 1997 19
G New Freshmen Female Chicano/Latino 1998 24
G New Freshmen Female Chicano/Latino 1999 27
G New Freshmen Female Chicano/Latino 2000 30
G New Freshmen Female Chicano/Latino 2001 31
G New Freshmen Female Chicano/Latino 2002 45
G New Freshmen Female Chicano/Latino 2003 45
G New Freshmen Female Chicano/Latino 2004 37
G New Freshmen Female Chicano/Latino 2005 35
G New Freshmen Female Chicano/Latino 2006 32
G New Freshmen Female Chicano/Latino 2007 26
G New Freshmen Female Chicano/Latino 2008 33
G New Freshmen Female Decline to State 1989 1
G New Freshmen Female Decline to State 1990 4
G New Freshmen Female Decline to State 1991 4
G New Freshmen Female Decline to State 1992 3
G New Freshmen Female Decline to State 1993 7
G New Freshmen Female Decline to State 1994 8
G New Freshmen Female Decline to State 1995 7
G New Freshmen Female Decline to State 1996 7
G New Freshmen Female Decline to State 1997 6
G New Freshmen Female Decline to State 1998 9
G New Freshmen Female Decline to State 1999 14
G New Freshmen Female Decline to State 2000 18
G New Freshmen Female Decline to State 2001 21
G New Freshmen Female Decline to State 2002 18
G New Freshmen Female Decline to State 2003 14
G New Freshmen Female Decline to State 2004 17
G New Freshmen Female Decline to State 2005 19
G New Freshmen Female Decline to State 2006 21
G New Freshmen Female Decline to State 2007 26
G New Freshmen Female Decline to State 2008 39
G New Freshmen Female International 1986 1
G New Freshmen Female International 1987 1
G New Freshmen Female International 1988 3
G New Freshmen Female International 1989 3
G New Freshmen Female International 1990 4
G New Freshmen Female International 1991 2
G New Freshmen Female International 1992 1
G New Freshmen Female International 1993 1
G New Freshmen Female International 1994 3
G New Freshmen Female International 1995 3
G New Freshmen Female International 1996 4
G New Freshmen Female International 1997 5
G New Freshmen Female International 1998 5
G New Freshmen Female International 1999 5
G New Freshmen Female International 2000 4
G New Freshmen Female International 2001 7
G New Freshmen Female International 2002 11
G New Freshmen Female International 2003 8
G New Freshmen Female International 2004 8
G New Freshmen Female International 2005 7
G New Freshmen Female International 2006 5
G New Freshmen Female International 2007 5
G New Freshmen Female International 2008 4
G New Freshmen Female Native American 1991 1
G New Freshmen Female Native American 1992 3
G New Freshmen Female Native American 1993 3
G New Freshmen Female Native American 1994 3
G New Freshmen Female Native American 1995 5
G New Freshmen Female Native American 1996 4
G New Freshmen Female Native American 1997 4
G New Freshmen Female Native American 1998 1
G New Freshmen Female Native American 2002 3
G New Freshmen Female Native American 2003 4
G New Freshmen Female Native American 2004 4
G New Freshmen Female Native American 2005 5
G New Freshmen Female Native American 2006 1
G New Freshmen Female Native American 2007 1
G New Freshmen Female Native American 2008 2
G New Freshmen Female Other 1989 1
G New Freshmen Female Other 1990 2
G New Freshmen Female Other 1991 3
G New Freshmen Female Other 1992 4
G New Freshmen Female Other 1993 3
G New Freshmen Female Other 1994 2
G New Freshmen Female Other 1995 2
G New Freshmen Female Other 1996 3
G New Freshmen Female Other 1997 2
G New Freshmen Female Other 1998 7
G New Freshmen Female Other 1999 11
G New Freshmen Female Other 2000 12
G New Freshmen Female Other 2001 10
G New Freshmen Female Other 2002 11
G New Freshmen Female Other 2003 21
G New Freshmen Female Other 2004 26
G New Freshmen Female Other 2005 24
G New Freshmen Female Other 2006 29
G New Freshmen Female Other 2007 31
G New Freshmen Female Other 2008 34
G New Freshmen Female Pacific Islander 1996 1
G New Freshmen Female Pacific Islander 1997 1
G New Freshmen Female Pacific Islander 1998 1
G New Freshmen Female Pacific Islander 2000 1
G New Freshmen Female Pacific Islander 2001 2
G New Freshmen Female Pacific Islander 2002 2
G New Freshmen Female Pacific Islander 2003 2
G New Freshmen Female Pacific Islander 2004 3
G New Freshmen Female Pacific Islander 2006 2
G New Freshmen Female Pacific Islander 2007 4
G New Freshmen Female Pacific Islander 2008 3
G New Freshmen Female White 1986 2
G New Freshmen Female White 1987 16
G New Freshmen Female White 1988 30
G New Freshmen Female White 1989 51
G New Freshmen Female White 1990 69
G New Freshmen Female White 1991 68
G New Freshmen Female White 1992 76
G New Freshmen Female White 1993 77
G New Freshmen Female White 1994 88
G New Freshmen Female White 1995 96
G New Freshmen Female White 1996 107
G New Freshmen Female White 1997 106
G New Freshmen Female White 1998 108
G New Freshmen Female White 1999 102
G New Freshmen Female White 2000 96
G New Freshmen Female White 2001 95
G New Freshmen Female White 2002 112
G New Freshmen Female White 2003 116
G New Freshmen Female White 2004 118
G New Freshmen Female White 2005 104
G New Freshmen Female White 2006 105
G New Freshmen Female White 2007 103
G New Freshmen Female White 2008 97
G New Freshmen Male African American 1988 3
G New Freshmen Male African American 1989 4
G New Freshmen Male African American 1990 5
G New Freshmen Male African American 1991 7
G New Freshmen Male African American 1992 11
G New Freshmen Male African American 1993 12
G New Freshmen Male African American 1994 14
G New Freshmen Male African American 1995 14
G New Freshmen Male African American 1996 9
G New Freshmen Male African American 1997 8
G New Freshmen Male African American 1998 13
G New Freshmen Male African American 1999 13
G New Freshmen Male African American 2000 12
G New Freshmen Male African American 2001 14
G New Freshmen Male African American 2002 10
G New Freshmen Male African American 2003 11
G New Freshmen Male African American 2004 7
G New Freshmen Male African American 2005 12
G New Freshmen Male African American 2006 15
G New Freshmen Male African American 2007 12
G New Freshmen Male African American 2008 13
G New Freshmen Male Asian 1985 1
G New Freshmen Male Asian 1986 1
G New Freshmen Male Asian 1987 16
G New Freshmen Male Asian 1988 31
G New Freshmen Male Asian 1989 41
G New Freshmen Male Asian 1990 68
G New Freshmen Male Asian 1991 71
G New Freshmen Male Asian 1992 83
G New Freshmen Male Asian 1993 105
G New Freshmen Male Asian 1994 110
G New Freshmen Male Asian 1995 130
G New Freshmen Male Asian 1996 121
G New Freshmen Male Asian 1997 116
G New Freshmen Male Asian 1998 106
G New Freshmen Male Asian 1999 102
G New Freshmen Male Asian 2000 91
G New Freshmen Male Asian 2001 96
G New Freshmen Male Asian 2002 118
G New Freshmen Male Asian 2003 152
G New Freshmen Male Asian 2004 166
G New Freshmen Male Asian 2005 161
G New Freshmen Male Asian 2006 158
G New Freshmen Male Asian 2007 181
G New Freshmen Male Asian 2008 164
G New Freshmen Male Chicano/Latino 1987 2
G New Freshmen Male Chicano/Latino 1988 5
G New Freshmen Male Chicano/Latino 1989 9
G New Freshmen Male Chicano/Latino 1990 12
G New Freshmen Male Chicano/Latino 1991 15
G New Freshmen Male Chicano/Latino 1992 18
G New Freshmen Male Chicano/Latino 1993 23
G New Freshmen Male Chicano/Latino 1994 34
G New Freshmen Male Chicano/Latino 1995 30
G New Freshmen Male Chicano/Latino 1996 31
G New Freshmen Male Chicano/Latino 1997 28
G New Freshmen Male Chicano/Latino 1998 24
G New Freshmen Male Chicano/Latino 1999 27
G New Freshmen Male Chicano/Latino 2000 22
G New Freshmen Male Chicano/Latino 2001 26
G New Freshmen Male Chicano/Latino 2002 29
G New Freshmen Male Chicano/Latino 2003 28
G New Freshmen Male Chicano/Latino 2004 25
G New Freshmen Male Chicano/Latino 2005 26
G New Freshmen Male Chicano/Latino 2006 24
G New Freshmen Male Chicano/Latino 2007 29
G New Freshmen Male Chicano/Latino 2008 27
G New Freshmen Male Decline to State 1987 1
G New Freshmen Male Decline to State 1991 2
G New Freshmen Male Decline to State 1992 7
G New Freshmen Male Decline to State 1993 8
G New Freshmen Male Decline to State 1994 16
G New Freshmen Male Decline to State 1995 18
G New Freshmen Male Decline to State 1996 10
G New Freshmen Male Decline to State 1997 11
G New Freshmen Male Decline to State 1998 13
G New Freshmen Male Decline to State 1999 15
G New Freshmen Male Decline to State 2000 18
G New Freshmen Male Decline to State 2001 19
G New Freshmen Male Decline to State 2002 25
G New Freshmen Male Decline to State 2003 30
G New Freshmen Male Decline to State 2004 25
G New Freshmen Male Decline to State 2005 31
G New Freshmen Male Decline to State 2006 28
G New Freshmen Male Decline to State 2007 30
G New Freshmen Male Decline to State 2008 37
G New Freshmen Male International 1985 1
G New Freshmen Male International 1986 6
G New Freshmen Male International 1987 5
G New Freshmen Male International 1988 6
G New Freshmen Male International 1989 8
G New Freshmen Male International 1990 7
G New Freshmen Male International 1991 10
G New Freshmen Male International 1992 9
G New Freshmen Male International 1993 10
G New Freshmen Male International 1994 7
G New Freshmen Male International 1995 9
G New Freshmen Male International 1996 4
G New Freshmen Male International 1997 7
G New Freshmen Male International 1998 9
G New Freshmen Male International 1999 10
G New Freshmen Male International 2000 13
G New Freshmen Male International 2001 17
G New Freshmen Male International 2002 16
G New Freshmen Male International 2003 20
G New Freshmen Male International 2004 16
G New Freshmen Male International 2005 14
G New Freshmen Male International 2006 11
G New Freshmen Male International 2007 10
G New Freshmen Male International 2008 7
G New Freshmen Male Native American 1989 1
G New Freshmen Male Native American 1990 1
G New Freshmen Male Native American 1991 1
G New Freshmen Male Native American 1992 1
G New Freshmen Male Native American 1993 3
G New Freshmen Male Native American 1994 3
G New Freshmen Male Native American 1995 1
G New Freshmen Male Native American 1996 2
G New Freshmen Male Native American 1997 2
G New Freshmen Male Native American 1998 3
G New Freshmen Male Native American 1999 1
G New Freshmen Male Native American 2001 1
G New Freshmen Male Native American 2002 1
G New Freshmen Male Native American 2003 1
G New Freshmen Male Native American 2004 1
G New Freshmen Male Native American 2005 3
G New Freshmen Male Native American 2006 5
G New Freshmen Male Native American 2007 4
G New Freshmen Male Native American 2008 4
G New Freshmen Male Other 1990 2
G New Freshmen Male Other 1991 2
G New Freshmen Male Other 1992 2
G New Freshmen Male Other 1993 4
G New Freshmen Male Other 1994 4
G New Freshmen Male Other 1995 3
G New Freshmen Male Other 1996 2
G New Freshmen Male Other 1997 4
G New Freshmen Male Other 1998 9
G New Freshmen Male Other 1999 8
G New Freshmen Male Other 2000 4
G New Freshmen Male Other 2001 4
G New Freshmen Male Other 2002 9
G New Freshmen Male Other 2003 11
G New Freshmen Male Other 2004 16
G New Freshmen Male Other 2005 22
G New Freshmen Male Other 2006 17
G New Freshmen Male Other 2007 18
G New Freshmen Male Other 2008 22
G New Freshmen Male Pacific Islander 1992 1
G New Freshmen Male Pacific Islander 1993 1
G New Freshmen Male Pacific Islander 1994 1
G New Freshmen Male Pacific Islander 1995 2
G New Freshmen Male Pacific Islander 1996 2
G New Freshmen Male Pacific Islander 1997 2
G New Freshmen Male Pacific Islander 1998 1
G New Freshmen Male Pacific Islander 2003 1
G New Freshmen Male Pacific Islander 2004 1
G New Freshmen Male Pacific Islander 2005 1
G New Freshmen Male Pacific Islander 2006 1
G New Freshmen Male Pacific Islander 2007 3
G New Freshmen Male Pacific Islander 2008 3
G New Freshmen Male White 1986 3
G New Freshmen Male White 1987 30
G New Freshmen Male White 1988 62
G New Freshmen Male White 1989 90
G New Freshmen Male White 1990 106
G New Freshmen Male White 1991 107
G New Freshmen Male White 1992 146
G New Freshmen Male White 1993 161
G New Freshmen Male White 1994 164
G New Freshmen Male White 1995 164
G New Freshmen Male White 1996 156
G New Freshmen Male White 1997 160
G New Freshmen Male White 1998 155
G New Freshmen Male White 1999 162
G New Freshmen Male White 2000 155
G New Freshmen Male White 2001 134
G New Freshmen Male White 2002 135
G New Freshmen Male White 2003 143
G New Freshmen Male White 2004 160
G New Freshmen Male White 2005 155
G New Freshmen Male White 2006 172
G New Freshmen Male White 2007 168
G New Freshmen Male White 2008 161
G Professional Female African American 2013 26
G Professional Female Asian 2013 242
G Professional Female Chicano/Latino 2013 76
G Professional Female Decline to State 2013 43
G Professional Female International 2013 26
G Professional Female Native American 2013 9
G Professional Female Pacific Islander 2013 1
G Professional Female White 2013 263
G Professional Male African American 2013 27
G Professional Male Asian 2013 90
G Professional Male Chicano/Latino 2013 48
G Professional Male Decline to State 2013 44
G Professional Male International 2013 15
G Professional Male Native American 2013 6
G Professional Male White 2013 224
G Second Bachelor Female African American 1988 1
G Second Bachelor Female African American 1989 2
G Second Bachelor Female African American 1990 1
G Second Bachelor Female African American 1991 1
G Second Bachelor Female African American 1992 1
G Second Bachelor Female African American 1993 1
G Second Bachelor Female African American 1994 1
G Second Bachelor Female African American 1995 2
G Second Bachelor Female African American 1996 2
G Second Bachelor Female African American 1997 1
G Second Bachelor Female African American 1999 1
G Second Bachelor Female African American 2000 1
G Second Bachelor Female African American 2003 1
G Second Bachelor Female African American 2004 1
G Second Bachelor Female African American 2005 1
G Second Bachelor Female African American 2006 1
G Second Bachelor Female African American 2007 1
G Second Bachelor Female Asian 1984 1
G Second Bachelor Female Asian 1985 7
G Second Bachelor Female Asian 1986 7
G Second Bachelor Female Asian 1987 4
G Second Bachelor Female Asian 1988 4
G Second Bachelor Female Asian 1989 11
G Second Bachelor Female Asian 1990 17
G Second Bachelor Female Asian 1991 18
G Second Bachelor Female Asian 1992 14
G Second Bachelor Female Asian 1993 21
G Second Bachelor Female Asian 1994 28
G Second Bachelor Female Asian 1995 24
G Second Bachelor Female Asian 1996 26
G Second Bachelor Female Asian 1997 34
G Second Bachelor Female Asian 1998 32
G Second Bachelor Female Asian 1999 30
G Second Bachelor Female Asian 2000 28
G Second Bachelor Female Asian 2001 27
G Second Bachelor Female Asian 2002 22
G Second Bachelor Female Asian 2003 56
G Second Bachelor Female Asian 2004 50
G Second Bachelor Female Asian 2005 36
G Second Bachelor Female Asian 2006 18
G Second Bachelor Female Asian 2007 2
G Second Bachelor Female Asian 2008 1
G Second Bachelor Female Chicano/Latino 1986 1
G Second Bachelor Female Chicano/Latino 1987 5
G Second Bachelor Female Chicano/Latino 1988 6
G Second Bachelor Female Chicano/Latino 1989 3
G Second Bachelor Female Chicano/Latino 1990 4
G Second Bachelor Female Chicano/Latino 1991 4
G Second Bachelor Female Chicano/Latino 1992 5
G Second Bachelor Female Chicano/Latino 1993 4
G Second Bachelor Female Chicano/Latino 1994 3
G Second Bachelor Female Chicano/Latino 1995 1
G Second Bachelor Female Chicano/Latino 1996 1
G Second Bachelor Female Chicano/Latino 1997 2
G Second Bachelor Female Chicano/Latino 1998 1
G Second Bachelor Female Chicano/Latino 1999 1
G Second Bachelor Female Chicano/Latino 2000 2
G Second Bachelor Female Chicano/Latino 2001 3
G Second Bachelor Female Chicano/Latino 2002 3
G Second Bachelor Female Chicano/Latino 2003 6
G Second Bachelor Female Chicano/Latino 2004 5
G Second Bachelor Female Chicano/Latino 2005 4
G Second Bachelor Female Chicano/Latino 2006 2
G Second Bachelor Female Decline to State 1985 1
G Second Bachelor Female Decline to State 1986 4
G Second Bachelor Female Decline to State 1987 6
G Second Bachelor Female Decline to State 1988 10
G Second Bachelor Female Decline to State 1989 6
G Second Bachelor Female Decline to State 1990 2
G Second Bachelor Female Decline to State 1991 6
G Second Bachelor Female Decline to State 1992 13
G Second Bachelor Female Decline to State 1993 14
G Second Bachelor Female Decline to State 1994 9
G Second Bachelor Female Decline to State 1995 3
G Second Bachelor Female Decline to State 1997 3
G Second Bachelor Female Decline to State 1998 5
G Second Bachelor Female Decline to State 1999 4
G Second Bachelor Female Decline to State 2000 5
G Second Bachelor Female Decline to State 2001 3
G Second Bachelor Female Decline to State 2002 4
G Second Bachelor Female Decline to State 2003 5
G Second Bachelor Female Decline to State 2004 4
G Second Bachelor Female Decline to State 2005 2
G Second Bachelor Female Decline to State 2006 1
G Second Bachelor Female International 1986 4
G Second Bachelor Female International 1987 3
G Second Bachelor Female International 1988 3
G Second Bachelor Female International 1989 5
G Second Bachelor Female International 1990 4
G Second Bachelor Female International 1991 3
G Second Bachelor Female International 1992 2
G Second Bachelor Female International 1993 4
G Second Bachelor Female International 1994 5
G Second Bachelor Female International 1995 5
G Second Bachelor Female International 1996 2
G Second Bachelor Female International 1997 5
G Second Bachelor Female International 1998 7
G Second Bachelor Female International 1999 8
G Second Bachelor Female International 2000 3
G Second Bachelor Female International 2001 6
G Second Bachelor Female International 2002 6
G Second Bachelor Female International 2003 6
G Second Bachelor Female International 2004 8
G Second Bachelor Female International 2005 6
G Second Bachelor Female International 2006 3
G Second Bachelor Female International 2007 4
G Second Bachelor Female International 2008 4
G Second Bachelor Female Native American 1993 1
G Second Bachelor Female Native American 1994 1
G Second Bachelor Female Other 1987 1
G Second Bachelor Female Other 1988 1
G Second Bachelor Female Other 1991 1
G Second Bachelor Female Other 1992 1
G Second Bachelor Female Other 2003 3
G Second Bachelor Female Other 2004 3
G Second Bachelor Female Other 2005 3
G Second Bachelor Female Other 2006 2
G Second Bachelor Female Other 2007 1
G Second Bachelor Female Pacific Islander 1992 1
G Second Bachelor Female Pacific Islander 1993 1
G Second Bachelor Female White 1984 3
G Second Bachelor Female White 1985 19
G Second Bachelor Female White 1986 38
G Second Bachelor Female White 1987 32
G Second Bachelor Female White 1988 32
G Second Bachelor Female White 1989 22
G Second Bachelor Female White 1990 22
G Second Bachelor Female White 1991 19
G Second Bachelor Female White 1992 24
G Second Bachelor Female White 1993 27
G Second Bachelor Female White 1994 24
G Second Bachelor Female White 1995 27
G Second Bachelor Female White 1996 37
G Second Bachelor Female White 1997 27
G Second Bachelor Female White 1998 23
G Second Bachelor Female White 1999 23
G Second Bachelor Female White 2000 23
G Second Bachelor Female White 2001 22
G Second Bachelor Female White 2002 29
G Second Bachelor Female White 2003 40
G Second Bachelor Female White 2004 20
G Second Bachelor Female White 2005 14
G Second Bachelor Female White 2006 9
G Second Bachelor Female White 2007 5
G Second Bachelor Female White 2008 3
G Second Bachelor Male African American 1987 1
G Second Bachelor Male African American 1988 1
G Second Bachelor Male African American 2002 1
G Second Bachelor Male African American 2003 1
G Second Bachelor Male Asian 1984 1
G Second Bachelor Male Asian 1985 6
G Second Bachelor Male Asian 1986 8
G Second Bachelor Male Asian 1987 9
G Second Bachelor Male Asian 1988 11
G Second Bachelor Male Asian 1989 14
G Second Bachelor Male Asian 1990 10
G Second Bachelor Male Asian 1991 5
G Second Bachelor Male Asian 1992 4
G Second Bachelor Male Asian 1993 7
G Second Bachelor Male Asian 1994 11
G Second Bachelor Male Asian 1995 13
G Second Bachelor Male Asian 1996 16
G Second Bachelor Male Asian 1997 17
G Second Bachelor Male Asian 1998 13
G Second Bachelor Male Asian 1999 13
G Second Bachelor Male Asian 2000 12
G Second Bachelor Male Asian 2001 15
G Second Bachelor Male Asian 2002 10
G Second Bachelor Male Asian 2003 22
G Second Bachelor Male Asian 2004 18
G Second Bachelor Male Asian 2005 13
G Second Bachelor Male Asian 2006 5
G Second Bachelor Male Chicano/Latino 1985 2
G Second Bachelor Male Chicano/Latino 1986 4
G Second Bachelor Male Chicano/Latino 1987 3
G Second Bachelor Male Chicano/Latino 1988 2
G Second Bachelor Male Chicano/Latino 1989 4
G Second Bachelor Male Chicano/Latino 1990 3
G Second Bachelor Male Chicano/Latino 1991 1
G Second Bachelor Male Chicano/Latino 1992 4
G Second Bachelor Male Chicano/Latino 1993 4
G Second Bachelor Male Chicano/Latino 1994 2
G Second Bachelor Male Chicano/Latino 1995 4
G Second Bachelor Male Chicano/Latino 1996 4
G Second Bachelor Male Chicano/Latino 1997 5
G Second Bachelor Male Chicano/Latino 1998 4
G Second Bachelor Male Chicano/Latino 1999 2
G Second Bachelor Male Chicano/Latino 2000 1
G Second Bachelor Male Chicano/Latino 2001 2
G Second Bachelor Male Chicano/Latino 2002 1
G Second Bachelor Male Chicano/Latino 2003 4
G Second Bachelor Male Chicano/Latino 2004 4
G Second Bachelor Male Chicano/Latino 2005 3
G Second Bachelor Male Chicano/Latino 2006 4
G Second Bachelor Male Chicano/Latino 2007 1
G Second Bachelor Male Chicano/Latino 2008 1
G Second Bachelor Male Decline to State 1986 8
G Second Bachelor Male Decline to State 1987 15
G Second Bachelor Male Decline to State 1988 12
G Second Bachelor Male Decline to State 1989 4
G Second Bachelor Male Decline to State 1990 8
G Second Bachelor Male Decline to State 1991 7
G Second Bachelor Male Decline to State 1992 8
G Second Bachelor Male Decline to State 1993 8
G Second Bachelor Male Decline to State 1994 2
G Second Bachelor Male Decline to State 1995 2
G Second Bachelor Male Decline to State 1998 1
G Second Bachelor Male Decline to State 1999 3
G Second Bachelor Male Decline to State 2000 6
G Second Bachelor Male Decline to State 2001 4
G Second Bachelor Male Decline to State 2002 2
G Second Bachelor Male Decline to State 2003 6
G Second Bachelor Male Decline to State 2004 5
G Second Bachelor Male Decline to State 2005 5
G Second Bachelor Male Decline to State 2006 5
G Second Bachelor Male Decline to State 2007 1
G Second Bachelor Male Decline to State 2008 1
G Second Bachelor Male International 1985 2
G Second Bachelor Male International 1986 2
G Second Bachelor Male International 1987 2
G Second Bachelor Male International 1988 2
G Second Bachelor Male International 1989 1
G Second Bachelor Male International 1990 1
G Second Bachelor Male International 1991 2
G Second Bachelor Male International 1992 4
G Second Bachelor Male International 1993 2
G Second Bachelor Male International 1994 4
G Second Bachelor Male International 1995 9
G Second Bachelor Male International 1996 11
G Second Bachelor Male International 1997 11
G Second Bachelor Male International 1998 9
G Second Bachelor Male International 1999 13
G Second Bachelor Male International 2000 13
G Second Bachelor Male International 2001 14
G Second Bachelor Male International 2002 15
G Second Bachelor Male International 2003 14
G Second Bachelor Male International 2004 12
G Second Bachelor Male International 2005 10
G Second Bachelor Male International 2006 12
G Second Bachelor Male International 2007 9
G Second Bachelor Male International 2008 14
G Second Bachelor Male Native American 1997 2
G Second Bachelor Male Native American 1998 2
G Second Bachelor Male Other 1986 1
G Second Bachelor Male Other 1987 3
G Second Bachelor Male Other 1988 2
G Second Bachelor Male Other 1989 1
G Second Bachelor Male Other 1990 1
G Second Bachelor Male Other 1993 1
G Second Bachelor Male Other 1994 1
G Second Bachelor Male Other 1998 1
G Second Bachelor Male Other 2003 2
G Second Bachelor Male Other 2004 2
G Second Bachelor Male Other 2005 1
G Second Bachelor Male White 1984 3
G Second Bachelor Male White 1985 17
G Second Bachelor Male White 1986 30
G Second Bachelor Male White 1987 24
G Second Bachelor Male White 1988 16
G Second Bachelor Male White 1989 28
G Second Bachelor Male White 1990 33
G Second Bachelor Male White 1991 25
G Second Bachelor Male White 1992 22
G Second Bachelor Male White 1993 19
G Second Bachelor Male White 1994 22
G Second Bachelor Male White 1995 26
G Second Bachelor Male White 1996 23
G Second Bachelor Male White 1997 17
G Second Bachelor Male White 1998 17
G Second Bachelor Male White 1999 20
G Second Bachelor Male White 2000 16
G Second Bachelor Male White 2001 15
G Second Bachelor Male White 2002 12
G Second Bachelor Male White 2003 20
G Second Bachelor Male White 2004 18
G Second Bachelor Male White 2005 13
G Second Bachelor Male White 2006 6
G Second Bachelor Male White 2007 3
G Second Bachelor Male White 2008 2
G (unknown) Female African American 1983 126
G (unknown) Female African American 1984 124
G (unknown) Female African American 1985 133
G (unknown) Female African American 1986 145
G (unknown) Female African American 1987 142
G (unknown) Female African American 1988 155
G (unknown) Female African American 1989 167
G (unknown) Female African American 1990 176
G (unknown) Female African American 1991 169
G (unknown) Female African American 1992 159
G (unknown) Female African American 1993 158
G (unknown) Female African American 1994 159
G (unknown) Female African American 1995 174
G (unknown) Female African American 1996 169
G (unknown) Female African American 1997 147
G (unknown) Female African American 1998 136
G (unknown) Female African American 1999 124
G (unknown) Female African American 2000 133
G (unknown) Female African American 2001 137
G (unknown) Female African American 2002 138
G (unknown) Female African American 2003 165
G (unknown) Female African American 2004 163
G (unknown) Female African American 2005 164
G (unknown) Female African American 2006 184
G (unknown) Female African American 2007 186
G (unknown) Female African American 2008 183
G (unknown) Female African American 2009 203
G (unknown) Female African American 2010 197
G (unknown) Female African American 2011 200
G (unknown) Female African American 2012 215
G (unknown) Female Asian 1983 230
G (unknown) Female Asian 1984 233
G (unknown) Female Asian 1985 249
G (unknown) Female Asian 1986 282
G (unknown) Female Asian 1987 299
G (unknown) Female Asian 1988 260
G (unknown) Female Asian 1989 264
G (unknown) Female Asian 1990 323
G (unknown) Female Asian 1991 340
G (unknown) Female Asian 1992 343
G (unknown) Female Asian 1993 377
G (unknown) Female Asian 1994 408
G (unknown) Female Asian 1995 445
G (unknown) Female Asian 1996 457
G (unknown) Female Asian 1997 466
G (unknown) Female Asian 1998 490
G (unknown) Female Asian 1999 470
G (unknown) Female Asian 2000 485
G (unknown) Female Asian 2001 501
G (unknown) Female Asian 2002 558
G (unknown) Female Asian 2003 595
G (unknown) Female Asian 2004 604
G (unknown) Female Asian 2005 641
G (unknown) Female Asian 2006 666
G (unknown) Female Asian 2007 687
G (unknown) Female Asian 2008 681
G (unknown) Female Asian 2009 879
G (unknown) Female Asian 2010 920
G (unknown) Female Asian 2011 931
G (unknown) Female Asian 2012 916
G (unknown) Female Chicano/Latino 1983 148
G (unknown) Female Chicano/Latino 1984 152
G (unknown) Female Chicano/Latino 1985 153
G (unknown) Female Chicano/Latino 1986 138
G (unknown) Female Chicano/Latino 1987 160
G (unknown) Female Chicano/Latino 1988 146
G (unknown) Female Chicano/Latino 1989 163
G (unknown) Female Chicano/Latino 1990 200
G (unknown) Female Chicano/Latino 1991 197
G (unknown) Female Chicano/Latino 1992 184
G (unknown) Female Chicano/Latino 1993 197
G (unknown) Female Chicano/Latino 1994 210
G (unknown) Female Chicano/Latino 1995 195
G (unknown) Female Chicano/Latino 1996 201
G (unknown) Female Chicano/Latino 1997 215
G (unknown) Female Chicano/Latino 1998 214
G (unknown) Female Chicano/Latino 1999 195
G (unknown) Female Chicano/Latino 2000 196
G (unknown) Female Chicano/Latino 2001 208
G (unknown) Female Chicano/Latino 2002 219
G (unknown) Female Chicano/Latino 2003 241
G (unknown) Female Chicano/Latino 2004 259
G (unknown) Female Chicano/Latino 2005 265
G (unknown) Female Chicano/Latino 2006 259
G (unknown) Female Chicano/Latino 2007 262
G (unknown) Female Chicano/Latino 2008 265
G (unknown) Female Chicano/Latino 2009 369
G (unknown) Female Chicano/Latino 2010 380
G (unknown) Female Chicano/Latino 2011 357
G (unknown) Female Chicano/Latino 2012 367
G (unknown) Female Chicano/Latino 2013 1
G (unknown) Female Decline to State 1983 43
G (unknown) Female Decline to State 1984 51
G (unknown) Female Decline to State 1985 57
G (unknown) Female Decline to State 1986 115
G (unknown) Female Decline to State 1987 80
G (unknown) Female Decline to State 1988 62
G (unknown) Female Decline to State 1989 32
G (unknown) Female Decline to State 1990 42
G (unknown) Female Decline to State 1991 46
G (unknown) Female Decline to State 1992 70
G (unknown) Female Decline to State 1993 58
G (unknown) Female Decline to State 1994 61
G (unknown) Female Decline to State 1995 73
G (unknown) Female Decline to State 1996 79
G (unknown) Female Decline to State 1997 97
G (unknown) Female Decline to State 1998 99
G (unknown) Female Decline to State 1999 116
G (unknown) Female Decline to State 2000 131
G (unknown) Female Decline to State 2001 138
G (unknown) Female Decline to State 2002 183
G (unknown) Female Decline to State 2003 213
G (unknown) Female Decline to State 2004 203
G (unknown) Female Decline to State 2005 255
G (unknown) Female Decline to State 2006 241
G (unknown) Female Decline to State 2007 247
G (unknown) Female Decline to State 2008 330
G (unknown) Female Decline to State 2009 419
G (unknown) Female Decline to State 2010 419
G (unknown) Female Decline to State 2011 505
G (unknown) Female Decline to State 2012 566
G (unknown) Female International 1983 225
G (unknown) Female International 1984 285
G (unknown) Female International 1985 292
G (unknown) Female International 1986 301
G (unknown) Female International 1987 295
G (unknown) Female International 1988 319
G (unknown) Female International 1989 313
G (unknown) Female International 1990 307
G (unknown) Female International 1991 288
G (unknown) Female International 1992 279
G (unknown) Female International 1993 301
G (unknown) Female International 1994 297
G (unknown) Female International 1995 295
G (unknown) Female International 1996 341
G (unknown) Female International 1997 388
G (unknown) Female International 1998 402
G (unknown) Female International 1999 461
G (unknown) Female International 2000 512
G (unknown) Female International 2001 589
G (unknown) Female International 2002 596
G (unknown) Female International 2003 586
G (unknown) Female International 2004 574
G (unknown) Female International 2005 555
G (unknown) Female International 2006 541
G (unknown) Female International 2007 555
G (unknown) Female International 2008 562
G (unknown) Female International 2009 571
G (unknown) Female International 2010 551
G (unknown) Female International 2011 615
G (unknown) Female International 2012 674
G (unknown) Female Native American 1983 26
G (unknown) Female Native American 1984 27
G (unknown) Female Native American 1985 26
G (unknown) Female Native American 1986 23
G (unknown) Female Native American 1987 29
G (unknown) Female Native American 1988 29
G (unknown) Female Native American 1989 27
G (unknown) Female Native American 1990 30
G (unknown) Female Native American 1991 26
G (unknown) Female Native American 1992 28
G (unknown) Female Native American 1993 26
G (unknown) Female Native American 1994 24
G (unknown) Female Native American 1995 24
G (unknown) Female Native American 1996 27
G (unknown) Female Native American 1997 35
G (unknown) Female Native American 1998 27
G (unknown) Female Native American 1999 24
G (unknown) Female Native American 2000 25
G (unknown) Female Native American 2001 22
G (unknown) Female Native American 2002 29
G (unknown) Female Native American 2003 40
G (unknown) Female Native American 2004 42
G (unknown) Female Native American 2005 43
G (unknown) Female Native American 2006 46
G (unknown) Female Native American 2007 50
G (unknown) Female Native American 2008 49
G (unknown) Female Native American 2009 51
G (unknown) Female Native American 2010 50
G (unknown) Female Native American 2011 56
G (unknown) Female Native American 2012 63
G (unknown) Female Other 1983 47
G (unknown) Female Other 1984 40
G (unknown) Female Other 1985 23
G (unknown) Female Other 1986 17
G (unknown) Female Other 1987 20
G (unknown) Female Other 1988 25
G (unknown) Female Other 1989 32
G (unknown) Female Other 1990 39
G (unknown) Female Other 1991 28
G (unknown) Female Other 1992 31
G (unknown) Female Other 1993 24
G (unknown) Female Other 1994 43
G (unknown) Female Other 1995 41
G (unknown) Female Other 1996 39
G (unknown) Female Other 1997 44
G (unknown) Female Other 1998 52
G (unknown) Female Other 1999 62
G (unknown) Female Other 2000 47
G (unknown) Female Other 2001 55
G (unknown) Female Other 2002 92
G (unknown) Female Other 2003 110
G (unknown) Female Other 2004 131
G (unknown) Female Other 2005 142
G (unknown) Female Other 2006 147
G (unknown) Female Other 2007 157
G (unknown) Female Other 2008 162
G (unknown) Female Other 2009 214
G (unknown) Female Other 2010 160
G (unknown) Female Pacific Islander 1983 2
G (unknown) Female Pacific Islander 1985 1
G (unknown) Female Pacific Islander 1986 2
G (unknown) Female Pacific Islander 1987 1
G (unknown) Female Pacific Islander 1988 1
G (unknown) Female Pacific Islander 1989 3
G (unknown) Female Pacific Islander 1990 3
G (unknown) Female Pacific Islander 1991 2
G (unknown) Female Pacific Islander 1992 1
G (unknown) Female Pacific Islander 1993 3
G (unknown) Female Pacific Islander 1994 6
G (unknown) Female Pacific Islander 1995 5
G (unknown) Female Pacific Islander 1996 4
G (unknown) Female Pacific Islander 1997 3
G (unknown) Female Pacific Islander 1998 6
G (unknown) Female Pacific Islander 1999 12
G (unknown) Female Pacific Islander 2000 9
G (unknown) Female Pacific Islander 2001 10
G (unknown) Female Pacific Islander 2002 14
G (unknown) Female Pacific Islander 2003 12
G (unknown) Female Pacific Islander 2004 7
G (unknown) Female Pacific Islander 2005 6
G (unknown) Female Pacific Islander 2006 6
G (unknown) Female Pacific Islander 2007 8
G (unknown) Female Pacific Islander 2008 9
G (unknown) Female Pacific Islander 2009 13
G (unknown) Female Pacific Islander 2010 14
G (unknown) Female Pacific Islander 2011 14
G (unknown) Female Pacific Islander 2012 8
G (unknown) Female White 1983 2452
G (unknown) Female White 1984 2546
G (unknown) Female White 1985 2503
G (unknown) Female White 1986 2434
G (unknown) Female White 1987 2423
G (unknown) Female White 1988 2368
G (unknown) Female White 1989 2305
G (unknown) Female White 1990 2237
G (unknown) Female White 1991 2102
G (unknown) Female White 1992 2104
G (unknown) Female White 1993 2017
G (unknown) Female White 1994 1852
G (unknown) Female White 1995 1803
G (unknown) Female White 1996 1801
G (unknown) Female White 1997 1826
G (unknown) Female White 1998 1898
G (unknown) Female White 1999 1865
G (unknown) Female White 2000 1900
G (unknown) Female White 2001 1892
G (unknown) Female White 2002 1898
G (unknown) Female White 2003 1907
G (unknown) Female White 2004 1875
G (unknown) Female White 2005 1928
G (unknown) Female White 2006 1927
G (unknown) Female White 2007 1908
G (unknown) Female White 2008 1799
G (unknown) Female White 2009 1924
G (unknown) Female White 2010 1923
G (unknown) Female White 2011 1907
G (unknown) Female White 2012 1796
G (unknown) Female White 2013 1
G (unknown) Male African American 1983 120
G (unknown) Male African American 1984 124
G (unknown) Male African American 1985 138
G (unknown) Male African American 1986 135
G (unknown) Male African American 1987 135
G (unknown) Male African American 1988 136
G (unknown) Male African American 1989 141
G (unknown) Male African American 1990 147
G (unknown) Male African American 1991 153
G (unknown) Male African American 1992 130
G (unknown) Male African American 1993 122
G (unknown) Male African American 1994 130
G (unknown) Male African American 1995 125
G (unknown) Male African American 1996 134
G (unknown) Male African American 1997 125
G (unknown) Male African American 1998 98
G (unknown) Male African American 1999 98
G (unknown) Male African American 2000 85
G (unknown) Male African American 2001 83
G (unknown) Male African American 2002 98
G (unknown) Male African American 2003 100
G (unknown) Male African American 2004 109
G (unknown) Male African American 2005 110
G (unknown) Male African American 2006 107
G (unknown) Male African American 2007 97
G (unknown) Male African American 2008 108
G (unknown) Male African American 2009 127
G (unknown) Male African American 2010 132
G (unknown) Male African American 2011 143
G (unknown) Male African American 2012 138
G (unknown) Male Asian 1983 398
G (unknown) Male Asian 1984 409
G (unknown) Male Asian 1985 384
G (unknown) Male Asian 1986 374
G (unknown) Male Asian 1987 378
G (unknown) Male Asian 1988 351
G (unknown) Male Asian 1989 354
G (unknown) Male Asian 1990 366
G (unknown) Male Asian 1991 392
G (unknown) Male Asian 1992 405
G (unknown) Male Asian 1993 438
G (unknown) Male Asian 1994 467
G (unknown) Male Asian 1995 470
G (unknown) Male Asian 1996 477
G (unknown) Male Asian 1997 468
G (unknown) Male Asian 1998 501
G (unknown) Male Asian 1999 469
G (unknown) Male Asian 2000 451
G (unknown) Male Asian 2001 470
G (unknown) Male Asian 2002 492
G (unknown) Male Asian 2003 556
G (unknown) Male Asian 2004 615
G (unknown) Male Asian 2005 630
G (unknown) Male Asian 2006 659
G (unknown) Male Asian 2007 663
G (unknown) Male Asian 2008 656
G (unknown) Male Asian 2009 867
G (unknown) Male Asian 2010 900
G (unknown) Male Asian 2011 896
G (unknown) Male Asian 2012 873
G (unknown) Male Chicano/Latino 1983 200
G (unknown) Male Chicano/Latino 1984 208
G (unknown) Male Chicano/Latino 1985 216
G (unknown) Male Chicano/Latino 1986 207
G (unknown) Male Chicano/Latino 1987 213
G (unknown) Male Chicano/Latino 1988 212
G (unknown) Male Chicano/Latino 1989 212
G (unknown) Male Chicano/Latino 1990 216
G (unknown) Male Chicano/Latino 1991 233
G (unknown) Male Chicano/Latino 1992 249
G (unknown) Male Chicano/Latino 1993 232
G (unknown) Male Chicano/Latino 1994 224
G (unknown) Male Chicano/Latino 1995 235
G (unknown) Male Chicano/Latino 1996 220
G (unknown) Male Chicano/Latino 1997 194
G (unknown) Male Chicano/Latino 1998 189
G (unknown) Male Chicano/Latino 1999 172
G (unknown) Male Chicano/Latino 2000 174
G (unknown) Male Chicano/Latino 2001 194
G (unknown) Male Chicano/Latino 2002 195
G (unknown) Male Chicano/Latino 2003 217
G (unknown) Male Chicano/Latino 2004 225
G (unknown) Male Chicano/Latino 2005 238
G (unknown) Male Chicano/Latino 2006 248
G (unknown) Male Chicano/Latino 2007 257
G (unknown) Male Chicano/Latino 2008 270
G (unknown) Male Chicano/Latino 2009 334
G (unknown) Male Chicano/Latino 2010 355
G (unknown) Male Chicano/Latino 2011 356
G (unknown) Male Chicano/Latino 2012 360
G (unknown) Male Decline to State 1983 88
G (unknown) Male Decline to State 1984 87
G (unknown) Male Decline to State 1985 166
G (unknown) Male Decline to State 1986 183
G (unknown) Male Decline to State 1987 138
G (unknown) Male Decline to State 1988 98
G (unknown) Male Decline to State 1989 35
G (unknown) Male Decline to State 1990 78
G (unknown) Male Decline to State 1991 95
G (unknown) Male Decline to State 1992 127
G (unknown) Male Decline to State 1993 86
G (unknown) Male Decline to State 1994 122
G (unknown) Male Decline to State 1995 127
G (unknown) Male Decline to State 1996 127
G (unknown) Male Decline to State 1997 133
G (unknown) Male Decline to State 1998 145
G (unknown) Male Decline to State 1999 152
G (unknown) Male Decline to State 2000 169
G (unknown) Male Decline to State 2001 171
G (unknown) Male Decline to State 2002 199
G (unknown) Male Decline to State 2003 238
G (unknown) Male Decline to State 2004 271
G (unknown) Male Decline to State 2005 308
G (unknown) Male Decline to State 2006 336
G (unknown) Male Decline to State 2007 382
G (unknown) Male Decline to State 2008 416
G (unknown) Male Decline to State 2009 526
G (unknown) Male Decline to State 2010 506
G (unknown) Male Decline to State 2011 611
G (unknown) Male Decline to State 2012 646
G (unknown) Male International 1983 1051
G (unknown) Male International 1984 1134
G (unknown) Male International 1985 1146
G (unknown) Male International 1986 1156
G (unknown) Male International 1987 1116
G (unknown) Male International 1988 1058
G (unknown) Male International 1989 1063
G (unknown) Male International 1990 1133
G (unknown) Male International 1991 993
G (unknown) Male International 1992 944
G (unknown) Male International 1993 863
G (unknown) Male International 1994 787
G (unknown) Male International 1995 777
G (unknown) Male International 1996 822
G (unknown) Male International 1997 891
G (unknown) Male International 1998 941
G (unknown) Male International 1999 1038
G (unknown) Male International 2000 1095
G (unknown) Male International 2001 1214
G (unknown) Male International 2002 1286
G (unknown) Male International 2003 1208
G (unknown) Male International 2004 1145
G (unknown) Male International 2005 1140
G (unknown) Male International 2006 1144
G (unknown) Male International 2007 1221
G (unknown) Male International 2008 1268
G (unknown) Male International 2009 1281
G (unknown) Male International 2010 1348
G (unknown) Male International 2011 1395
G (unknown) Male International 2012 1383
G (unknown) Male International 2013 1
G (unknown) Male Native American 1983 23
G (unknown) Male Native American 1984 28
G (unknown) Male Native American 1985 25
G (unknown) Male Native American 1986 23
G (unknown) Male Native American 1987 31
G (unknown) Male Native American 1988 25
G (unknown) Male Native American 1989 28
G (unknown) Male Native American 1990 23
G (unknown) Male Native American 1991 16
G (unknown) Male Native American 1992 22
G (unknown) Male Native American 1993 20
G (unknown) Male Native American 1994 24
G (unknown) Male Native American 1995 27
G (unknown) Male Native American 1996 26
G (unknown) Male Native American 1997 26
G (unknown) Male Native American 1998 19
G (unknown) Male Native American 1999 12
G (unknown) Male Native American 2000 15
G (unknown) Male Native American 2001 17
G (unknown) Male Native American 2002 22
G (unknown) Male Native American 2003 34
G (unknown) Male Native American 2004 35
G (unknown) Male Native American 2005 42
G (unknown) Male Native American 2006 57
G (unknown) Male Native American 2007 63
G (unknown) Male Native American 2008 56
G (unknown) Male Native American 2009 61
G (unknown) Male Native American 2010 54
G (unknown) Male Native American 2011 57
G (unknown) Male Native American 2012 53
G (unknown) Male Other 1983 80
G (unknown) Male Other 1984 68
G (unknown) Male Other 1985 40
G (unknown) Male Other 1986 31
G (unknown) Male Other 1987 35
G (unknown) Male Other 1988 23
G (unknown) Male Other 1989 23
G (unknown) Male Other 1990 28
G (unknown) Male Other 1991 22
G (unknown) Male Other 1992 22
G (unknown) Male Other 1993 30
G (unknown) Male Other 1994 40
G (unknown) Male Other 1995 35
G (unknown) Male Other 1996 36
G (unknown) Male Other 1997 40
G (unknown) Male Other 1998 44
G (unknown) Male Other 1999 67
G (unknown) Male Other 2000 43
G (unknown) Male Other 2001 66
G (unknown) Male Other 2002 87
G (unknown) Male Other 2003 114
G (unknown) Male Other 2004 113
G (unknown) Male Other 2005 135
G (unknown) Male Other 2006 146
G (unknown) Male Other 2007 150
G (unknown) Male Other 2008 149
G (unknown) Male Other 2009 188
G (unknown) Male Other 2010 139
G (unknown) Male Pacific Islander 1983 5
G (unknown) Male Pacific Islander 1984 3
G (unknown) Male Pacific Islander 1985 2
G (unknown) Male Pacific Islander 1986 3
G (unknown) Male Pacific Islander 1987 1
G (unknown) Male Pacific Islander 1988 1
G (unknown) Male Pacific Islander 1989 2
G (unknown) Male Pacific Islander 1990 4
G (unknown) Male Pacific Islander 1991 4
G (unknown) Male Pacific Islander 1992 5
G (unknown) Male Pacific Islander 1993 4
G (unknown) Male Pacific Islander 1994 2
G (unknown) Male Pacific Islander 1995 3
G (unknown) Male Pacific Islander 1996 4
G (unknown) Male Pacific Islander 1997 3
G (unknown) Male Pacific Islander 1998 4
G (unknown) Male Pacific Islander 1999 1
G (unknown) Male Pacific Islander 2000 5
G (unknown) Male Pacific Islander 2001 4
G (unknown) Male Pacific Islander 2002 6
G (unknown) Male Pacific Islander 2003 9
G (unknown) Male Pacific Islander 2004 11
G (unknown) Male Pacific Islander 2005 8
G (unknown) Male Pacific Islander 2006 6
G (unknown) Male Pacific Islander 2007 9
G (unknown) Male Pacific Islander 2008 11
G (unknown) Male Pacific Islander 2009 14
G (unknown) Male Pacific Islander 2010 12
G (unknown) Male Pacific Islander 2011 10
G (unknown) Male Pacific Islander 2012 8
G (unknown) Male White 1983 3474
G (unknown) Male White 1984 3552
G (unknown) Male White 1985 3449
G (unknown) Male White 1986 3411
G (unknown) Male White 1987 3297
G (unknown) Male White 1988 3089
G (unknown) Male White 1989 3004
G (unknown) Male White 1990 2886
G (unknown) Male White 1991 2739
G (unknown) Male White 1992 2670
G (unknown) Male White 1993 2563
G (unknown) Male White 1994 2436
G (unknown) Male White 1995 2396
G (unknown) Male White 1996 2311
G (unknown) Male White 1997 2284
G (unknown) Male White 1998 2198
G (unknown) Male White 1999 2141
G (unknown) Male White 2000 2023
G (unknown) Male White 2001 2006
G (unknown) Male White 2002 2045
G (unknown) Male White 2003 2176
G (unknown) Male White 2004 2224
G (unknown) Male White 2005 2196
G (unknown) Male White 2006 2129
G (unknown) Male White 2007 2179
G (unknown) Male White 2008 2056
G (unknown) Male White 2009 2272
G (unknown) Male White 2010 2238
G (unknown) Male White 2011 2204
G (unknown) Male White 2012 2059
U Advanced Standing Female African American 1983 52
U Advanced Standing Female African American 1984 100
U Advanced Standing Female African American 1985 142
U Advanced Standing Female African American 1986 152
U Advanced Standing Female African American 1987 206
U Advanced Standing Female African American 1988 200
U Advanced Standing Female African American 1989 235
U Advanced Standing Female African American 1990 217
U Advanced Standing Female African American 1991 178
U Advanced Standing Female African American 1992 144
U Advanced Standing Female African American 1993 124
U Advanced Standing Female African American 1994 129
U Advanced Standing Female African American 1995 142
U Advanced Standing Female African American 1996 138
U Advanced Standing Female African American 1997 136
U Advanced Standing Female African American 1998 131
U Advanced Standing Female African American 1999 121
U Advanced Standing Female African American 2000 104
U Advanced Standing Female African American 2001 104
U Advanced Standing Female African American 2002 105
U Advanced Standing Female African American 2003 136
U Advanced Standing Female African American 2004 106
U Advanced Standing Female African American 2005 107
U Advanced Standing Female African American 2006 104
U Advanced Standing Female African American 2007 108
U Advanced Standing Female African American 2008 107
U Advanced Standing Female African American 2009 123
U Advanced Standing Female African American 2010 123
U Advanced Standing Female African American 2011 131
U Advanced Standing Female African American 2012 118
U Advanced Standing Female African American 2013 124
U Advanced Standing Female Asian 1983 178
U Advanced Standing Female Asian 1984 420
U Advanced Standing Female Asian 1985 501
U Advanced Standing Female Asian 1986 523
U Advanced Standing Female Asian 1987 622
U Advanced Standing Female Asian 1988 634
U Advanced Standing Female Asian 1989 593
U Advanced Standing Female Asian 1990 582
U Advanced Standing Female Asian 1991 567
U Advanced Standing Female Asian 1992 539
U Advanced Standing Female Asian 1993 558
U Advanced Standing Female Asian 1994 568
U Advanced Standing Female Asian 1995 582
U Advanced Standing Female Asian 1996 567
U Advanced Standing Female Asian 1997 594
U Advanced Standing Female Asian 1998 610
U Advanced Standing Female Asian 1999 632
U Advanced Standing Female Asian 2000 648
U Advanced Standing Female Asian 2001 654
U Advanced Standing Female Asian 2002 724
U Advanced Standing Female Asian 2003 704
U Advanced Standing Female Asian 2004 667
U Advanced Standing Female Asian 2005 716
U Advanced Standing Female Asian 2006 694
U Advanced Standing Female Asian 2007 724
U Advanced Standing Female Asian 2008 717
U Advanced Standing Female Asian 2009 656
U Advanced Standing Female Asian 2010 643
U Advanced Standing Female Asian 2011 647
U Advanced Standing Female Asian 2012 669
U Advanced Standing Female Asian 2013 670
U Advanced Standing Female Chicano/Latino 1983 69
U Advanced Standing Female Chicano/Latino 1984 150
U Advanced Standing Female Chicano/Latino 1985 221
U Advanced Standing Female Chicano/Latino 1986 224
U Advanced Standing Female Chicano/Latino 1987 252
U Advanced Standing Female Chicano/Latino 1988 307
U Advanced Standing Female Chicano/Latino 1989 363
U Advanced Standing Female Chicano/Latino 1990 388
U Advanced Standing Female Chicano/Latino 1991 371
U Advanced Standing Female Chicano/Latino 1992 300
U Advanced Standing Female Chicano/Latino 1993 285
U Advanced Standing Female Chicano/Latino 1994 283
U Advanced Standing Female Chicano/Latino 1995 293
U Advanced Standing Female Chicano/Latino 1996 288
U Advanced Standing Female Chicano/Latino 1997 288
U Advanced Standing Female Chicano/Latino 1998 250
U Advanced Standing Female Chicano/Latino 1999 218
U Advanced Standing Female Chicano/Latino 2000 225
U Advanced Standing Female Chicano/Latino 2001 249
U Advanced Standing Female Chicano/Latino 2002 311
U Advanced Standing Female Chicano/Latino 2003 330
U Advanced Standing Female Chicano/Latino 2004 297
U Advanced Standing Female Chicano/Latino 2005 302
U Advanced Standing Female Chicano/Latino 2006 330
U Advanced Standing Female Chicano/Latino 2007 385
U Advanced Standing Female Chicano/Latino 2008 379
U Advanced Standing Female Chicano/Latino 2009 356
U Advanced Standing Female Chicano/Latino 2010 363
U Advanced Standing Female Chicano/Latino 2011 429
U Advanced Standing Female Chicano/Latino 2012 457
U Advanced Standing Female Chicano/Latino 2013 453
U Advanced Standing Female Decline to State 1983 40
U Advanced Standing Female Decline to State 1984 56
U Advanced Standing Female Decline to State 1985 93
U Advanced Standing Female Decline to State 1986 123
U Advanced Standing Female Decline to State 1987 160
U Advanced Standing Female Decline to State 1988 159
U Advanced Standing Female Decline to State 1989 165
U Advanced Standing Female Decline to State 1990 193
U Advanced Standing Female Decline to State 1991 203
U Advanced Standing Female Decline to State 1992 217
U Advanced Standing Female Decline to State 1993 190
U Advanced Standing Female Decline to State 1994 157
U Advanced Standing Female Decline to State 1995 109
U Advanced Standing Female Decline to State 1996 104
U Advanced Standing Female Decline to State 1997 123
U Advanced Standing Female Decline to State 1998 206
U Advanced Standing Female Decline to State 1999 256
U Advanced Standing Female Decline to State 2000 218
U Advanced Standing Female Decline to State 2001 241
U Advanced Standing Female Decline to State 2002 249
U Advanced Standing Female Decline to State 2003 242
U Advanced Standing Female Decline to State 2004 214
U Advanced Standing Female Decline to State 2005 210
U Advanced Standing Female Decline to State 2006 191
U Advanced Standing Female Decline to State 2007 181
U Advanced Standing Female Decline to State 2008 192
U Advanced Standing Female Decline to State 2009 195
U Advanced Standing Female Decline to State 2010 186
U Advanced Standing Female Decline to State 2011 176
U Advanced Standing Female Decline to State 2012 116
U Advanced Standing Female Decline to State 2013 93
U Advanced Standing Female International 1983 43
U Advanced Standing Female International 1984 71
U Advanced Standing Female International 1985 71
U Advanced Standing Female International 1986 58
U Advanced Standing Female International 1987 81
U Advanced Standing Female International 1988 100
U Advanced Standing Female International 1989 106
U Advanced Standing Female International 1990 106
U Advanced Standing Female International 1991 112
U Advanced Standing Female International 1992 122
U Advanced Standing Female International 1993 135
U Advanced Standing Female International 1994 146
U Advanced Standing Female International 1995 153
U Advanced Standing Female International 1996 141
U Advanced Standing Female International 1997 162
U Advanced Standing Female International 1998 179
U Advanced Standing Female International 1999 203
U Advanced Standing Female International 2000 214
U Advanced Standing Female International 2001 216
U Advanced Standing Female International 2002 198
U Advanced Standing Female International 2003 187
U Advanced Standing Female International 2004 171
U Advanced Standing Female International 2005 171
U Advanced Standing Female International 2006 166
U Advanced Standing Female International 2007 151
U Advanced Standing Female International 2008 159
U Advanced Standing Female International 2009 206
U Advanced Standing Female International 2010 262
U Advanced Standing Female International 2011 349
U Advanced Standing Female International 2012 389
U Advanced Standing Female International 2013 504
U Advanced Standing Female Native American 1983 5
U Advanced Standing Female Native American 1984 13
U Advanced Standing Female Native American 1985 21
U Advanced Standing Female Native American 1986 23
U Advanced Standing Female Native American 1987 24
U Advanced Standing Female Native American 1988 31
U Advanced Standing Female Native American 1989 39
U Advanced Standing Female Native American 1990 49
U Advanced Standing Female Native American 1991 52
U Advanced Standing Female Native American 1992 38
U Advanced Standing Female Native American 1993 43
U Advanced Standing Female Native American 1994 45
U Advanced Standing Female Native American 1995 43
U Advanced Standing Female Native American 1996 27
U Advanced Standing Female Native American 1997 33
U Advanced Standing Female Native American 1998 27
U Advanced Standing Female Native American 1999 23
U Advanced Standing Female Native American 2000 18
U Advanced Standing Female Native American 2001 19
U Advanced Standing Female Native American 2002 25
U Advanced Standing Female Native American 2003 25
U Advanced Standing Female Native American 2004 29
U Advanced Standing Female Native American 2005 21
U Advanced Standing Female Native American 2006 21
U Advanced Standing Female Native American 2007 23
U Advanced Standing Female Native American 2008 17
U Advanced Standing Female Native American 2009 21
U Advanced Standing Female Native American 2010 29
U Advanced Standing Female Native American 2011 26
U Advanced Standing Female Native American 2012 31
U Advanced Standing Female Native American 2013 29
U Advanced Standing Female Other 1983 34
U Advanced Standing Female Other 1984 73
U Advanced Standing Female Other 1985 97
U Advanced Standing Female Other 1986 82
U Advanced Standing Female Other 1987 71
U Advanced Standing Female Other 1988 60
U Advanced Standing Female Other 1989 65
U Advanced Standing Female Other 1990 49
U Advanced Standing Female Other 1991 47
U Advanced Standing Female Other 1992 52
U Advanced Standing Female Other 1993 51
U Advanced Standing Female Other 1994 56
U Advanced Standing Female Other 1995 50
U Advanced Standing Female Other 1996 49
U Advanced Standing Female Other 1997 46
U Advanced Standing Female Other 1998 54
U Advanced Standing Female Other 1999 53
U Advanced Standing Female Other 2000 56
U Advanced Standing Female Other 2001 60
U Advanced Standing Female Other 2002 76
U Advanced Standing Female Other 2003 81
U Advanced Standing Female Other 2004 77
U Advanced Standing Female Other 2005 67
U Advanced Standing Female Other 2006 68
U Advanced Standing Female Other 2007 63
U Advanced Standing Female Other 2008 52
U Advanced Standing Female Other 2009 65
U Advanced Standing Female Other 2010 42
U Advanced Standing Female Pacific Islander 1983 3
U Advanced Standing Female Pacific Islander 1984 4
U Advanced Standing Female Pacific Islander 1985 2
U Advanced Standing Female Pacific Islander 1986 3
U Advanced Standing Female Pacific Islander 1988 1
U Advanced Standing Female Pacific Islander 1989 2
U Advanced Standing Female Pacific Islander 1990 4
U Advanced Standing Female Pacific Islander 1991 4
U Advanced Standing Female Pacific Islander 1992 5
U Advanced Standing Female Pacific Islander 1993 8
U Advanced Standing Female Pacific Islander 1994 9
U Advanced Standing Female Pacific Islander 1995 10
U Advanced Standing Female Pacific Islander 1996 5
U Advanced Standing Female Pacific Islander 1998 4
U Advanced Standing Female Pacific Islander 1999 6
U Advanced Standing Female Pacific Islander 2000 7
U Advanced Standing Female Pacific Islander 2001 12
U Advanced Standing Female Pacific Islander 2002 12
U Advanced Standing Female Pacific Islander 2003 11
U Advanced Standing Female Pacific Islander 2004 7
U Advanced Standing Female Pacific Islander 2005 10
U Advanced Standing Female Pacific Islander 2006 9
U Advanced Standing Female Pacific Islander 2007 12
U Advanced Standing Female Pacific Islander 2008 12
U Advanced Standing Female Pacific Islander 2009 10
U Advanced Standing Female Pacific Islander 2010 5
U Advanced Standing Female Pacific Islander 2011 10
U Advanced Standing Female Pacific Islander 2012 11
U Advanced Standing Female Pacific Islander 2013 9
U Advanced Standing Female White 1983 955
U Advanced Standing Female White 1984 1888
U Advanced Standing Female White 1985 2121
U Advanced Standing Female White 1986 1854
U Advanced Standing Female White 1987 1996
U Advanced Standing Female White 1988 1948
U Advanced Standing Female White 1989 1766
U Advanced Standing Female White 1990 1588
U Advanced Standing Female White 1991 1401
U Advanced Standing Female White 1992 1239
U Advanced Standing Female White 1993 1073
U Advanced Standing Female White 1994 882
U Advanced Standing Female White 1995 802
U Advanced Standing Female White 1996 775
U Advanced Standing Female White 1997 796
U Advanced Standing Female White 1998 835
U Advanced Standing Female White 1999 828
U Advanced Standing Female White 2000 830
U Advanced Standing Female White 2001 858
U Advanced Standing Female White 2002 840
U Advanced Standing Female White 2003 798
U Advanced Standing Female White 2004 837
U Advanced Standing Female White 2005 912
U Advanced Standing Female White 2006 977
U Advanced Standing Female White 2007 974
U Advanced Standing Female White 2008 907
U Advanced Standing Female White 2009 888
U Advanced Standing Female White 2010 856
U Advanced Standing Female White 2011 917
U Advanced Standing Female White 2012 891
U Advanced Standing Female White 2013 793
U Advanced Standing Male African American 1983 62
U Advanced Standing Male African American 1984 107
U Advanced Standing Male African American 1985 134
U Advanced Standing Male African American 1986 129
U Advanced Standing Male African American 1987 153
U Advanced Standing Male African American 1988 162
U Advanced Standing Male African American 1989 171
U Advanced Standing Male African American 1990 185
U Advanced Standing Male African American 1991 147
U Advanced Standing Male African American 1992 148
U Advanced Standing Male African American 1993 150
U Advanced Standing Male African American 1994 128
U Advanced Standing Male African American 1995 136
U Advanced Standing Male African American 1996 139
U Advanced Standing Male African American 1997 154
U Advanced Standing Male African American 1998 132
U Advanced Standing Male African American 1999 109
U Advanced Standing Male African American 2000 93
U Advanced Standing Male African American 2001 87
U Advanced Standing Male African American 2002 91
U Advanced Standing Male African American 2003 92
U Advanced Standing Male African American 2004 71
U Advanced Standing Male African American 2005 73
U Advanced Standing Male African American 2006 93
U Advanced Standing Male African American 2007 104
U Advanced Standing Male African American 2008 115
U Advanced Standing Male African American 2009 114
U Advanced Standing Male African American 2010 109
U Advanced Standing Male African American 2011 126
U Advanced Standing Male African American 2012 131
U Advanced Standing Male African American 2013 114
U Advanced Standing Male Asian 1983 279
U Advanced Standing Male Asian 1984 588
U Advanced Standing Male Asian 1985 736
U Advanced Standing Male Asian 1986 691
U Advanced Standing Male Asian 1987 721
U Advanced Standing Male Asian 1988 731
U Advanced Standing Male Asian 1989 705
U Advanced Standing Male Asian 1990 724
U Advanced Standing Male Asian 1991 707
U Advanced Standing Male Asian 1992 665
U Advanced Standing Male Asian 1993 635
U Advanced Standing Male Asian 1994 624
U Advanced Standing Male Asian 1995 612
U Advanced Standing Male Asian 1996 663
U Advanced Standing Male Asian 1997 631
U Advanced Standing Male Asian 1998 602
U Advanced Standing Male Asian 1999 585
U Advanced Standing Male Asian 2000 487
U Advanced Standing Male Asian 2001 525
U Advanced Standing Male Asian 2002 578
U Advanced Standing Male Asian 2003 589
U Advanced Standing Male Asian 2004 595
U Advanced Standing Male Asian 2005 644
U Advanced Standing Male Asian 2006 669
U Advanced Standing Male Asian 2007 692
U Advanced Standing Male Asian 2008 723
U Advanced Standing Male Asian 2009 750
U Advanced Standing Male Asian 2010 764
U Advanced Standing Male Asian 2011 758
U Advanced Standing Male Asian 2012 695
U Advanced Standing Male Asian 2013 682
U Advanced Standing Male Chicano/Latino 1983 86
U Advanced Standing Male Chicano/Latino 1984 171
U Advanced Standing Male Chicano/Latino 1985 224
U Advanced Standing Male Chicano/Latino 1986 231
U Advanced Standing Male Chicano/Latino 1987 278
U Advanced Standing Male Chicano/Latino 1988 309
U Advanced Standing Male Chicano/Latino 1989 352
U Advanced Standing Male Chicano/Latino 1990 370
U Advanced Standing Male Chicano/Latino 1991 371
U Advanced Standing Male Chicano/Latino 1992 352
U Advanced Standing Male Chicano/Latino 1993 323
U Advanced Standing Male Chicano/Latino 1994 300
U Advanced Standing Male Chicano/Latino 1995 301
U Advanced Standing Male Chicano/Latino 1996 289
U Advanced Standing Male Chicano/Latino 1997 262
U Advanced Standing Male Chicano/Latino 1998 251
U Advanced Standing Male Chicano/Latino 1999 225
U Advanced Standing Male Chicano/Latino 2000 198
U Advanced Standing Male Chicano/Latino 2001 197
U Advanced Standing Male Chicano/Latino 2002 227
U Advanced Standing Male Chicano/Latino 2003 256
U Advanced Standing Male Chicano/Latino 2004 274
U Advanced Standing Male Chicano/Latino 2005 270
U Advanced Standing Male Chicano/Latino 2006 316
U Advanced Standing Male Chicano/Latino 2007 356
U Advanced Standing Male Chicano/Latino 2008 375
U Advanced Standing Male Chicano/Latino 2009 410
U Advanced Standing Male Chicano/Latino 2010 425
U Advanced Standing Male Chicano/Latino 2011 448
U Advanced Standing Male Chicano/Latino 2012 480
U Advanced Standing Male Chicano/Latino 2013 492
U Advanced Standing Male Decline to State 1983 44
U Advanced Standing Male Decline to State 1984 51
U Advanced Standing Male Decline to State 1985 114
U Advanced Standing Male Decline to State 1986 128
U Advanced Standing Male Decline to State 1987 183
U Advanced Standing Male Decline to State 1988 192
U Advanced Standing Male Decline to State 1989 195
U Advanced Standing Male Decline to State 1990 219
U Advanced Standing Male Decline to State 1991 240
U Advanced Standing Male Decline to State 1992 248
U Advanced Standing Male Decline to State 1993 220
U Advanced Standing Male Decline to State 1994 194
U Advanced Standing Male Decline to State 1995 170
U Advanced Standing Male Decline to State 1996 128
U Advanced Standing Male Decline to State 1997 129
U Advanced Standing Male Decline to State 1998 207
U Advanced Standing Male Decline to State 1999 263
U Advanced Standing Male Decline to State 2000 245
U Advanced Standing Male Decline to State 2001 241
U Advanced Standing Male Decline to State 2002 260
U Advanced Standing Male Decline to State 2003 255
U Advanced Standing Male Decline to State 2004 250
U Advanced Standing Male Decline to State 2005 239
U Advanced Standing Male Decline to State 2006 224
U Advanced Standing Male Decline to State 2007 231
U Advanced Standing Male Decline to State 2008 212
U Advanced Standing Male Decline to State 2009 202
U Advanced Standing Male Decline to State 2010 209
U Advanced Standing Male Decline to State 2011 179
U Advanced Standing Male Decline to State 2012 128
U Advanced Standing Male Decline to State 2013 118
U Advanced Standing Male International 1983 38
U Advanced Standing Male International 1984 111
U Advanced Standing Male International 1985 121
U Advanced Standing Male International 1986 118
U Advanced Standing Male International 1987 143
U Advanced Standing Male International 1988 143
U Advanced Standing Male International 1989 124
U Advanced Standing Male International 1990 127
U Advanced Standing Male International 1991 143
U Advanced Standing Male International 1992 178
U Advanced Standing Male International 1993 187
U Advanced Standing Male International 1994 206
U Advanced Standing Male International 1995 190
U Advanced Standing Male International 1996 190
U Advanced Standing Male International 1997 206
U Advanced Standing Male International 1998 221
U Advanced Standing Male International 1999 228
U Advanced Standing Male International 2000 224
U Advanced Standing Male International 2001 199
U Advanced Standing Male International 2002 163
U Advanced Standing Male International 2003 169
U Advanced Standing Male International 2004 201
U Advanced Standing Male International 2005 208
U Advanced Standing Male International 2006 200
U Advanced Standing Male International 2007 213
U Advanced Standing Male International 2008 224
U Advanced Standing Male International 2009 307
U Advanced Standing Male International 2010 372
U Advanced Standing Male International 2011 463
U Advanced Standing Male International 2012 529
U Advanced Standing Male International 2013 586
U Advanced Standing Male Native American 1983 7
U Advanced Standing Male Native American 1984 15
U Advanced Standing Male Native American 1985 19
U Advanced Standing Male Native American 1986 22
U Advanced Standing Male Native American 1987 28
U Advanced Standing Male Native American 1988 43
U Advanced Standing Male Native American 1989 50
U Advanced Standing Male Native American 1990 37
U Advanced Standing Male Native American 1991 44
U Advanced Standing Male Native American 1992 42
U Advanced Standing Male Native American 1993 39
U Advanced Standing Male Native American 1994 27
U Advanced Standing Male Native American 1995 29
U Advanced Standing Male Native American 1996 29
U Advanced Standing Male Native American 1997 32
U Advanced Standing Male Native American 1998 20
U Advanced Standing Male Native American 1999 17
U Advanced Standing Male Native American 2000 15
U Advanced Standing Male Native American 2001 14
U Advanced Standing Male Native American 2002 14
U Advanced Standing Male Native American 2003 16
U Advanced Standing Male Native American 2004 13
U Advanced Standing Male Native American 2005 18
U Advanced Standing Male Native American 2006 20
U Advanced Standing Male Native American 2007 21
U Advanced Standing Male Native American 2008 25
U Advanced Standing Male Native American 2009 22
U Advanced Standing Male Native American 2010 19
U Advanced Standing Male Native American 2011 27
U Advanced Standing Male Native American 2012 29
U Advanced Standing Male Native American 2013 22
U Advanced Standing Male Other 1983 38
U Advanced Standing Male Other 1984 102
U Advanced Standing Male Other 1985 121
U Advanced Standing Male Other 1986 113
U Advanced Standing Male Other 1987 93
U Advanced Standing Male Other 1988 64
U Advanced Standing Male Other 1989 54
U Advanced Standing Male Other 1990 35
U Advanced Standing Male Other 1991 36
U Advanced Standing Male Other 1992 44
U Advanced Standing Male Other 1993 43
U Advanced Standing Male Other 1994 45
U Advanced Standing Male Other 1995 41
U Advanced Standing Male Other 1996 47
U Advanced Standing Male Other 1997 54
U Advanced Standing Male Other 1998 57
U Advanced Standing Male Other 1999 52
U Advanced Standing Male Other 2000 55
U Advanced Standing Male Other 2001 64
U Advanced Standing Male Other 2002 68
U Advanced Standing Male Other 2003 52
U Advanced Standing Male Other 2004 46
U Advanced Standing Male Other 2005 47
U Advanced Standing Male Other 2006 47
U Advanced Standing Male Other 2007 43
U Advanced Standing Male Other 2008 45
U Advanced Standing Male Other 2009 44
U Advanced Standing Male Other 2010 26
U Advanced Standing Male Pacific Islander 1983 1
U Advanced Standing Male Pacific Islander 1985 1
U Advanced Standing Male Pacific Islander 1986 3
U Advanced Standing Male Pacific Islander 1987 2
U Advanced Standing Male Pacific Islander 1988 4
U Advanced Standing Male Pacific Islander 1989 2
U Advanced Standing Male Pacific Islander 1990 2
U Advanced Standing Male Pacific Islander 1991 7
U Advanced Standing Male Pacific Islander 1992 6
U Advanced Standing Male Pacific Islander 1993 5
U Advanced Standing Male Pacific Islander 1994 10
U Advanced Standing Male Pacific Islander 1995 9
U Advanced Standing Male Pacific Islander 1996 6
U Advanced Standing Male Pacific Islander 1997 8
U Advanced Standing Male Pacific Islander 1998 6
U Advanced Standing Male Pacific Islander 1999 8
U Advanced Standing Male Pacific Islander 2000 9
U Advanced Standing Male Pacific Islander 2001 9
U Advanced Standing Male Pacific Islander 2002 8
U Advanced Standing Male Pacific Islander 2003 8
U Advanced Standing Male Pacific Islander 2004 6
U Advanced Standing Male Pacific Islander 2005 7
U Advanced Standing Male Pacific Islander 2006 5
U Advanced Standing Male Pacific Islander 2007 8
U Advanced Standing Male Pacific Islander 2008 8
U Advanced Standing Male Pacific Islander 2009 10
U Advanced Standing Male Pacific Islander 2010 10
U Advanced Standing Male Pacific Islander 2011 11
U Advanced Standing Male Pacific Islander 2012 11
U Advanced Standing Male Pacific Islander 2013 9
U Advanced Standing Male White 1983 966
U Advanced Standing Male White 1984 1914
U Advanced Standing Male White 1985 2336
U Advanced Standing Male White 1986 2006
U Advanced Standing Male White 1987 2111
U Advanced Standing Male White 1988 2066
U Advanced Standing Male White 1989 1911
U Advanced Standing Male White 1990 1711
U Advanced Standing Male White 1991 1500
U Advanced Standing Male White 1992 1276
U Advanced Standing Male White 1993 1122
U Advanced Standing Male White 1994 904
U Advanced Standing Male White 1995 771
U Advanced Standing Male White 1996 809
U Advanced Standing Male White 1997 831
U Advanced Standing Male White 1998 748
U Advanced Standing Male White 1999 728
U Advanced Standing Male White 2000 744
U Advanced Standing Male White 2001 763
U Advanced Standing Male White 2002 774
U Advanced Standing Male White 2003 773
U Advanced Standing Male White 2004 810
U Advanced Standing Male White 2005 904
U Advanced Standing Male White 2006 984
U Advanced Standing Male White 2007 989
U Advanced Standing Male White 2008 985
U Advanced Standing Male White 2009 1027
U Advanced Standing Male White 2010 1023
U Advanced Standing Male White 2011 988
U Advanced Standing Male White 2012 953
U Advanced Standing Male White 2013 899
U EAP Reciprocity Female International 2009 1
U EAP Reciprocity Male Decline to State 2006 1
U EAP Reciprocity Male International 2006 1
U High School Honors Female African American 1985 2
U High School Honors Female African American 1986 2
U High School Honors Female African American 1987 3
U High School Honors Female African American 1988 2
U High School Honors Female African American 1989 3
U High School Honors Female African American 1990 3
U High School Honors Female African American 1991 3
U High School Honors Female African American 1992 2
U High School Honors Female African American 1993 3
U High School Honors Female African American 1994 2
U High School Honors Female African American 1995 3
U High School Honors Female African American 1996 4
U High School Honors Female African American 1997 4
U High School Honors Female African American 1998 3
U High School Honors Female African American 1999 3
U High School Honors Female African American 2000 2
U High School Honors Female African American 2001 4
U High School Honors Female African American 2002 3
U High School Honors Female African American 2003 3
U High School Honors Female African American 2004 2
U High School Honors Female African American 2005 2
U High School Honors Female Asian 1985 3
U High School Honors Female Asian 1986 9
U High School Honors Female Asian 1987 24
U High School Honors Female Asian 1988 32
U High School Honors Female Asian 1989 44
U High School Honors Female Asian 1990 47
U High School Honors Female Asian 1991 41
U High School Honors Female Asian 1992 42
U High School Honors Female Asian 1993 44
U High School Honors Female Asian 1994 43
U High School Honors Female Asian 1995 50
U High School Honors Female Asian 1996 48
U High School Honors Female Asian 1997 45
U High School Honors Female Asian 1998 45
U High School Honors Female Asian 1999 38
U High School Honors Female Asian 2000 36
U High School Honors Female Asian 2001 31
U High School Honors Female Asian 2002 32
U High School Honors Female Asian 2003 24
U High School Honors Female Asian 2004 18
U High School Honors Female Asian 2005 10
U High School Honors Female Chicano/Latino 1986 1
U High School Honors Female Chicano/Latino 1987 1
U High School Honors Female Chicano/Latino 1988 1
U High School Honors Female Chicano/Latino 1989 2
U High School Honors Female Chicano/Latino 1990 1
U High School Honors Female Chicano/Latino 1991 2
U High School Honors Female Chicano/Latino 1992 2
U High School Honors Female Chicano/Latino 1993 4
U High School Honors Female Chicano/Latino 1994 5
U High School Honors Female Chicano/Latino 1995 5
U High School Honors Female Chicano/Latino 1996 5
U High School Honors Female Chicano/Latino 1997 2
U High School Honors Female Chicano/Latino 1999 1
U High School Honors Female Chicano/Latino 2000 1
U High School Honors Female Chicano/Latino 2001 1
U High School Honors Female Chicano/Latino 2003 2
U High School Honors Female Chicano/Latino 2004 1
U High School Honors Female Decline to State 1987 1
U High School Honors Female Decline to State 1988 5
U High School Honors Female Decline to State 1989 6
U High School Honors Female Decline to State 1990 5
U High School Honors Female Decline to State 1991 4
U High School Honors Female Decline to State 1992 3
U High School Honors Female Decline to State 1993 3
U High School Honors Female Decline to State 1994 3
U High School Honors Female Decline to State 1995 3
U High School Honors Female Decline to State 1996 5
U High School Honors Female Decline to State 1997 6
U High School Honors Female Decline to State 1998 4
U High School Honors Female Decline to State 1999 6
U High School Honors Female Decline to State 2000 6
U High School Honors Female Decline to State 2001 9
U High School Honors Female Decline to State 2002 11
U High School Honors Female Decline to State 2003 8
U High School Honors Female Decline to State 2004 7
U High School Honors Female Decline to State 2005 8
U High School Honors Female Decline to State 2006 4
U High School Honors Female Decline to State 2007 1
U High School Honors Female International 2000 1
U High School Honors Female International 2002 1
U High School Honors Female International 2003 1
U High School Honors Female International 2004 1
U High School Honors Female International 2005 1
U High School Honors Female Native American 1985 1
U High School Honors Female Native American 1986 1
U High School Honors Female Native American 1987 1
U High School Honors Female Native American 1988 1
U High School Honors Female Native American 1993 1
U High School Honors Female Native American 2002 1
U High School Honors Female Native American 2003 1
U High School Honors Female Native American 2004 1
U High School Honors Female Native American 2005 1
U High School Honors Female Other 1986 1
U High School Honors Female Other 1987 1
U High School Honors Female Other 1988 1
U High School Honors Female Other 1990 1
U High School Honors Female Other 1994 2
U High School Honors Female Other 1995 2
U High School Honors Female Other 1996 1
U High School Honors Female Other 1997 1
U High School Honors Female Other 1998 1
U High School Honors Female White 1986 8
U High School Honors Female White 1987 13
U High School Honors Female White 1988 22
U High School Honors Female White 1989 30
U High School Honors Female White 1990 25
U High School Honors Female White 1991 23
U High School Honors Female White 1992 23
U High School Honors Female White 1993 24
U High School Honors Female White 1994 30
U High School Honors Female White 1995 30
U High School Honors Female White 1996 25
U High School Honors Female White 1997 22
U High School Honors Female White 1998 18
U High School Honors Female White 1999 11
U High School Honors Female White 2000 9
U High School Honors Female White 2001 14
U High School Honors Female White 2002 21
U High School Honors Female White 2003 16
U High School Honors Female White 2004 14
U High School Honors Female White 2005 4
U High School Honors Female White 2006 1
U High School Honors Male African American 1985 2
U High School Honors Male African American 1986 3
U High School Honors Male African American 1987 3
U High School Honors Male African American 1988 3
U High School Honors Male African American 1989 4
U High School Honors Male African American 1990 4
U High School Honors Male African American 1991 3
U High School Honors Male African American 1992 2
U High School Honors Male African American 1994 1
U High School Honors Male African American 1995 1
U High School Honors Male African American 1996 1
U High School Honors Male African American 2002 1
U High School Honors Male African American 2003 1
U High School Honors Male African American 2004 1
U High School Honors Male African American 2005 1
U High School Honors Male Asian 1985 4
U High School Honors Male Asian 1986 14
U High School Honors Male Asian 1987 22
U High School Honors Male Asian 1988 36
U High School Honors Male Asian 1989 54
U High School Honors Male Asian 1990 66
U High School Honors Male Asian 1991 67
U High School Honors Male Asian 1992 77
U High School Honors Male Asian 1993 69
U High School Honors Male Asian 1994 64
U High School Honors Male Asian 1995 69
U High School Honors Male Asian 1996 63
U High School Honors Male Asian 1997 63
U High School Honors Male Asian 1998 53
U High School Honors Male Asian 1999 41
U High School Honors Male Asian 2000 36
U High School Honors Male Asian 2001 37
U High School Honors Male Asian 2002 39
U High School Honors Male Asian 2003 30
U High School Honors Male Asian 2004 21
U High School Honors Male Asian 2005 11
U High School Honors Male Asian 2006 2
U High School Honors Male Asian 2009 1
U High School Honors Male Asian 2010 1
U High School Honors Male Chicano/Latino 1985 3
U High School Honors Male Chicano/Latino 1986 4
U High School Honors Male Chicano/Latino 1987 5
U High School Honors Male Chicano/Latino 1988 4
U High School Honors Male Chicano/Latino 1989 6
U High School Honors Male Chicano/Latino 1990 4
U High School Honors Male Chicano/Latino 1991 5
U High School Honors Male Chicano/Latino 1992 6
U High School Honors Male Chicano/Latino 1993 6
U High School Honors Male Chicano/Latino 1994 6
U High School Honors Male Chicano/Latino 1995 6
U High School Honors Male Chicano/Latino 1996 4
U High School Honors Male Chicano/Latino 1997 3
U High School Honors Male Chicano/Latino 1998 3
U High School Honors Male Chicano/Latino 1999 2
U High School Honors Male Chicano/Latino 2000 2
U High School Honors Male Chicano/Latino 2001 2
U High School Honors Male Chicano/Latino 2002 1
U High School Honors Male Decline to State 1987 1
U High School Honors Male Decline to State 1988 3
U High School Honors Male Decline to State 1989 3
U High School Honors Male Decline to State 1990 4
U High School Honors Male Decline to State 1991 6
U High School Honors Male Decline to State 1992 9
U High School Honors Male Decline to State 1993 9
U High School Honors Male Decline to State 1994 12
U High School Honors Male Decline to State 1995 10
U High School Honors Male Decline to State 1996 9
U High School Honors Male Decline to State 1997 10
U High School Honors Male Decline to State 1998 11
U High School Honors Male Decline to State 1999 18
U High School Honors Male Decline to State 2000 19
U High School Honors Male Decline to State 2001 25
U High School Honors Male Decline to State 2002 23
U High School Honors Male Decline to State 2003 17
U High School Honors Male Decline to State 2004 10
U High School Honors Male Decline to State 2005 4
U High School Honors Male Decline to State 2006 1
U High School Honors Male International 1986 1
U High School Honors Male Native American 1997 1
U High School Honors Male Native American 1998 1
U High School Honors Male Native American 1999 1
U High School Honors Male Native American 2000 2
U High School Honors Male Native American 2001 1
U High School Honors Male Other 1987 1
U High School Honors Male Other 1988 1
U High School Honors Male Other 1989 1
U High School Honors Male Other 1990 2
U High School Honors Male Other 1991 3
U High School Honors Male Other 1992 3
U High School Honors Male Other 1993 3
U High School Honors Male Other 1994 1
U High School Honors Male Other 1995 2
U High School Honors Male Other 1996 2
U High School Honors Male Other 1997 2
U High School Honors Male Other 1998 2
U High School Honors Male Other 1999 1
U High School Honors Male Other 2000 2
U High School Honors Male Other 2001 2
U High School Honors Male Other 2002 2
U High School Honors Male Other 2003 1
U High School Honors Male Other 2004 1
U High School Honors Male Other 2005 1
U High School Honors Male White 1986 21
U High School Honors Male White 1987 29
U High School Honors Male White 1988 39
U High School Honors Male White 1989 51
U High School Honors Male White 1990 45
U High School Honors Male White 1991 41
U High School Honors Male White 1992 51
U High School Honors Male White 1993 47
U High School Honors Male White 1994 38
U High School Honors Male White 1995 35
U High School Honors Male White 1996 35
U High School Honors Male White 1997 28
U High School Honors Male White 1998 33
U High School Honors Male White 1999 32
U High School Honors Male White 2000 33
U High School Honors Male White 2001 36
U High School Honors Male White 2002 27
U High School Honors Male White 2003 20
U High School Honors Male White 2004 11
U High School Honors Male White 2005 5
U High School Honors Male White 2006 3
U High School Honors Male White 2007 1
U Limited Male Asian 2003 1
U Limited Male Asian 2004 1
U Limited Male International 2003 1
U New Freshmen Female African American 1983 132
U New Freshmen Female African American 1984 268
U New Freshmen Female African American 1985 357
U New Freshmen Female African American 1986 451
U New Freshmen Female African American 1987 591
U New Freshmen Female African American 1988 684
U New Freshmen Female African American 1989 744
U New Freshmen Female African American 1990 667
U New Freshmen Female African American 1991 662
U New Freshmen Female African American 1992 607
U New Freshmen Female African American 1993 538
U New Freshmen Female African American 1994 516
U New Freshmen Female African American 1995 554
U New Freshmen Female African American 1996 538
U New Freshmen Female African American 1997 609
U New Freshmen Female African American 1998 546
U New Freshmen Female African American 1999 517
U New Freshmen Female African American 2000 502
U New Freshmen Female African American 2001 425
U New Freshmen Female African American 2002 427
U New Freshmen Female African American 2003 439
U New Freshmen Female African American 2004 419
U New Freshmen Female African American 2005 427
U New Freshmen Female African American 2006 423
U New Freshmen Female African American 2007 420
U New Freshmen Female African American 2008 440
U New Freshmen Female African American 2009 446
U New Freshmen Female African American 2010 407
U New Freshmen Female African American 2011 400
U New Freshmen Female African American 2012 388
U New Freshmen Female African American 2013 393
U New Freshmen Female Asian 1983 605
U New Freshmen Female Asian 1984 1062
U New Freshmen Female Asian 1985 1530
U New Freshmen Female Asian 1986 1897
U New Freshmen Female Asian 1987 2074
U New Freshmen Female Asian 1988 2177
U New Freshmen Female Asian 1989 2156
U New Freshmen Female Asian 1990 2109
U New Freshmen Female Asian 1991 2349
U New Freshmen Female Asian 1992 2683
U New Freshmen Female Asian 1993 2985
U New Freshmen Female Asian 1994 3166
U New Freshmen Female Asian 1995 3312
U New Freshmen Female Asian 1996 3471
U New Freshmen Female Asian 1997 3572
U New Freshmen Female Asian 1998 3800
U New Freshmen Female Asian 1999 3948
U New Freshmen Female Asian 2000 4192
U New Freshmen Female Asian 2001 4498
U New Freshmen Female Asian 2002 4734
U New Freshmen Female Asian 2003 4601
U New Freshmen Female Asian 2004 4492
U New Freshmen Female Asian 2005 4550
U New Freshmen Female Asian 2006 4660
U New Freshmen Female Asian 2007 4805
U New Freshmen Female Asian 2008 4903
U New Freshmen Female Asian 2009 4843
U New Freshmen Female Asian 2010 4789
U New Freshmen Female Asian 2011 4683
U New Freshmen Female Asian 2012 4592
U New Freshmen Female Asian 2013 4515
U New Freshmen Female Chicano/Latino 1983 130
U New Freshmen Female Chicano/Latino 1984 288
U New Freshmen Female Chicano/Latino 1985 408
U New Freshmen Female Chicano/Latino 1986 562
U New Freshmen Female Chicano/Latino 1987 764
U New Freshmen Female Chicano/Latino 1988 933
U New Freshmen Female Chicano/Latino 1989 1089
U New Freshmen Female Chicano/Latino 1990 1220
U New Freshmen Female Chicano/Latino 1991 1298
U New Freshmen Female Chicano/Latino 1992 1301
U New Freshmen Female Chicano/Latino 1993 1269
U New Freshmen Female Chicano/Latino 1994 1205
U New Freshmen Female Chicano/Latino 1995 1238
U New Freshmen Female Chicano/Latino 1996 1264
U New Freshmen Female Chicano/Latino 1997 1270
U New Freshmen Female Chicano/Latino 1998 1132
U New Freshmen Female Chicano/Latino 1999 1059
U New Freshmen Female Chicano/Latino 2000 988
U New Freshmen Female Chicano/Latino 2001 956
U New Freshmen Female Chicano/Latino 2002 1025
U New Freshmen Female Chicano/Latino 2003 1065
U New Freshmen Female Chicano/Latino 2004 1056
U New Freshmen Female Chicano/Latino 2005 1123
U New Freshmen Female Chicano/Latino 2006 1172
U New Freshmen Female Chicano/Latino 2007 1238
U New Freshmen Female Chicano/Latino 2008 1307
U New Freshmen Female Chicano/Latino 2009 1374
U New Freshmen Female Chicano/Latino 2010 1347
U New Freshmen Female Chicano/Latino 2011 1368
U New Freshmen Female Chicano/Latino 2012 1427
U New Freshmen Female Chicano/Latino 2013 1462
U New Freshmen Female Decline to State 1983 18
U New Freshmen Female Decline to State 1984 27
U New Freshmen Female Decline to State 1985 94
U New Freshmen Female Decline to State 1986 140
U New Freshmen Female Decline to State 1987 175
U New Freshmen Female Decline to State 1988 231
U New Freshmen Female Decline to State 1989 253
U New Freshmen Female Decline to State 1990 270
U New Freshmen Female Decline to State 1991 332
U New Freshmen Female Decline to State 1992 381
U New Freshmen Female Decline to State 1993 402
U New Freshmen Female Decline to State 1994 396
U New Freshmen Female Decline to State 1995 389
U New Freshmen Female Decline to State 1996 407
U New Freshmen Female Decline to State 1997 409
U New Freshmen Female Decline to State 1998 622
U New Freshmen Female Decline to State 1999 723
U New Freshmen Female Decline to State 2000 801
U New Freshmen Female Decline to State 2001 903
U New Freshmen Female Decline to State 2002 863
U New Freshmen Female Decline to State 2003 833
U New Freshmen Female Decline to State 2004 815
U New Freshmen Female Decline to State 2005 758
U New Freshmen Female Decline to State 2006 727
U New Freshmen Female Decline to State 2007 674
U New Freshmen Female Decline to State 2008 627
U New Freshmen Female Decline to State 2009 633
U New Freshmen Female Decline to State 2010 619
U New Freshmen Female Decline to State 2011 619
U New Freshmen Female Decline to State 2012 511
U New Freshmen Female Decline to State 2013 433
U New Freshmen Female International 1983 34
U New Freshmen Female International 1984 69
U New Freshmen Female International 1985 90
U New Freshmen Female International 1986 108
U New Freshmen Female International 1987 125
U New Freshmen Female International 1988 127
U New Freshmen Female International 1989 120
U New Freshmen Female International 1990 114
U New Freshmen Female International 1991 114
U New Freshmen Female International 1992 129
U New Freshmen Female International 1993 125
U New Freshmen Female International 1994 120
U New Freshmen Female International 1995 123
U New Freshmen Female International 1996 137
U New Freshmen Female International 1997 133
U New Freshmen Female International 1998 134
U New Freshmen Female International 1999 133
U New Freshmen Female International 2000 143
U New Freshmen Female International 2001 131
U New Freshmen Female International 2002 122
U New Freshmen Female International 2003 118
U New Freshmen Female International 2004 125
U New Freshmen Female International 2005 129
U New Freshmen Female International 2006 133
U New Freshmen Female International 2007 158
U New Freshmen Female International 2008 269
U New Freshmen Female International 2009 380
U New Freshmen Female International 2010 545
U New Freshmen Female International 2011 731
U New Freshmen Female International 2012 868
U New Freshmen Female International 2013 1116
U New Freshmen Female Native American 1983 5
U New Freshmen Female Native American 1984 16
U New Freshmen Female Native American 1985 23
U New Freshmen Female Native American 1986 38
U New Freshmen Female Native American 1987 79
U New Freshmen Female Native American 1988 96
U New Freshmen Female Native American 1989 102
U New Freshmen Female Native American 1990 105
U New Freshmen Female Native American 1991 109
U New Freshmen Female Native American 1992 88
U New Freshmen Female Native American 1993 77
U New Freshmen Female Native American 1994 75
U New Freshmen Female Native American 1995 85
U New Freshmen Female Native American 1996 92
U New Freshmen Female Native American 1997 98
U New Freshmen Female Native American 1998 91
U New Freshmen Female Native American 1999 89
U New Freshmen Female Native American 2000 59
U New Freshmen Female Native American 2001 64
U New Freshmen Female Native American 2002 64
U New Freshmen Female Native American 2003 53
U New Freshmen Female Native American 2004 59
U New Freshmen Female Native American 2005 51
U New Freshmen Female Native American 2006 44
U New Freshmen Female Native American 2007 49
U New Freshmen Female Native American 2008 46
U New Freshmen Female Native American 2009 47
U New Freshmen Female Native American 2010 54
U New Freshmen Female Native American 2011 66
U New Freshmen Female Native American 2012 77
U New Freshmen Female Native American 2013 71
U New Freshmen Female Other 1983 39
U New Freshmen Female Other 1984 60
U New Freshmen Female Other 1985 96
U New Freshmen Female Other 1986 124
U New Freshmen Female Other 1987 105
U New Freshmen Female Other 1988 89
U New Freshmen Female Other 1989 68
U New Freshmen Female Other 1990 49
U New Freshmen Female Other 1991 55
U New Freshmen Female Other 1992 79
U New Freshmen Female Other 1993 88
U New Freshmen Female Other 1994 93
U New Freshmen Female Other 1995 108
U New Freshmen Female Other 1996 105
U New Freshmen Female Other 1997 132
U New Freshmen Female Other 1998 134
U New Freshmen Female Other 1999 146
U New Freshmen Female Other 2000 154
U New Freshmen Female Other 2001 139
U New Freshmen Female Other 2002 144
U New Freshmen Female Other 2003 134
U New Freshmen Female Other 2004 162
U New Freshmen Female Other 2005 153
U New Freshmen Female Other 2006 151
U New Freshmen Female Other 2007 158
U New Freshmen Female Other 2008 153
U New Freshmen Female Other 2009 152
U New Freshmen Female Other 2010 114
U New Freshmen Female Pacific Islander 1983 5
U New Freshmen Female Pacific Islander 1984 3
U New Freshmen Female Pacific Islander 1985 4
U New Freshmen Female Pacific Islander 1986 5
U New Freshmen Female Pacific Islander 1987 7
U New Freshmen Female Pacific Islander 1988 5
U New Freshmen Female Pacific Islander 1989 5
U New Freshmen Female Pacific Islander 1990 9
U New Freshmen Female Pacific Islander 1991 9
U New Freshmen Female Pacific Islander 1992 19
U New Freshmen Female Pacific Islander 1993 27
U New Freshmen Female Pacific Islander 1994 31
U New Freshmen Female Pacific Islander 1995 30
U New Freshmen Female Pacific Islander 1996 25
U New Freshmen Female Pacific Islander 1997 25
U New Freshmen Female Pacific Islander 1998 19
U New Freshmen Female Pacific Islander 1999 25
U New Freshmen Female Pacific Islander 2000 33
U New Freshmen Female Pacific Islander 2001 35
U New Freshmen Female Pacific Islander 2002 25
U New Freshmen Female Pacific Islander 2003 31
U New Freshmen Female Pacific Islander 2004 30
U New Freshmen Female Pacific Islander 2005 31
U New Freshmen Female Pacific Islander 2006 31
U New Freshmen Female Pacific Islander 2007 33
U New Freshmen Female Pacific Islander 2008 27
U New Freshmen Female Pacific Islander 2009 25
U New Freshmen Female Pacific Islander 2010 25
U New Freshmen Female Pacific Islander 2011 17
U New Freshmen Female Pacific Islander 2012 14
U New Freshmen Female Pacific Islander 2013 17
U New Freshmen Female White 1983 1024
U New Freshmen Female White 1984 1949
U New Freshmen Female White 1985 2557
U New Freshmen Female White 1986 2967
U New Freshmen Female White 1987 2932
U New Freshmen Female White 1988 2678
U New Freshmen Female White 1989 2408
U New Freshmen Female White 1990 2159
U New Freshmen Female White 1991 2068
U New Freshmen Female White 1992 2034
U New Freshmen Female White 1993 2021
U New Freshmen Female White 1994 1990
U New Freshmen Female White 1995 2008
U New Freshmen Female White 1996 2060
U New Freshmen Female White 1997 2171
U New Freshmen Female White 1998 2313
U New Freshmen Female White 1999 2458
U New Freshmen Female White 2000 2486
U New Freshmen Female White 2001 2621
U New Freshmen Female White 2002 2745
U New Freshmen Female White 2003 2678
U New Freshmen Female White 2004 2714
U New Freshmen Female White 2005 2841
U New Freshmen Female White 2006 2956
U New Freshmen Female White 2007 3070
U New Freshmen Female White 2008 3059
U New Freshmen Female White 2009 3040
U New Freshmen Female White 2010 3055
U New Freshmen Female White 2011 3043
U New Freshmen Female White 2012 2893
U New Freshmen Female White 2013 2751
U New Freshmen Male African American 1983 108
U New Freshmen Male African American 1984 220
U New Freshmen Male African American 1985 297
U New Freshmen Male African American 1986 331
U New Freshmen Male African American 1987 461
U New Freshmen Male African American 1988 478
U New Freshmen Male African American 1989 482
U New Freshmen Male African American 1990 412
U New Freshmen Male African American 1991 418
U New Freshmen Male African American 1992 378
U New Freshmen Male African American 1993 361
U New Freshmen Male African American 1994 341
U New Freshmen Male African American 1995 357
U New Freshmen Male African American 1996 349
U New Freshmen Male African American 1997 357
U New Freshmen Male African American 1998 343
U New Freshmen Male African American 1999 310
U New Freshmen Male African American 2000 275
U New Freshmen Male African American 2001 249
U New Freshmen Male African American 2002 250
U New Freshmen Male African American 2003 251
U New Freshmen Male African American 2004 232
U New Freshmen Male African American 2005 219
U New Freshmen Male African American 2006 215
U New Freshmen Male African American 2007 209
U New Freshmen Male African American 2008 227
U New Freshmen Male African American 2009 226
U New Freshmen Male African American 2010 222
U New Freshmen Male African American 2011 222
U New Freshmen Male African American 2012 232
U New Freshmen Male African American 2013 234
U New Freshmen Male Asian 1983 599
U New Freshmen Male Asian 1984 1055
U New Freshmen Male Asian 1985 1470
U New Freshmen Male Asian 1986 1820
U New Freshmen Male Asian 1987 2043
U New Freshmen Male Asian 1988 2165
U New Freshmen Male Asian 1989 2316
U New Freshmen Male Asian 1990 2440
U New Freshmen Male Asian 1991 2732
U New Freshmen Male Asian 1992 3042
U New Freshmen Male Asian 1993 3325
U New Freshmen Male Asian 1994 3491
U New Freshmen Male Asian 1995 3538
U New Freshmen Male Asian 1996 3556
U New Freshmen Male Asian 1997 3614
U New Freshmen Male Asian 1998 3655
U New Freshmen Male Asian 1999 3675
U New Freshmen Male Asian 2000 3637
U New Freshmen Male Asian 2001 3606
U New Freshmen Male Asian 2002 3714
U New Freshmen Male Asian 2003 3561
U New Freshmen Male Asian 2004 3561
U New Freshmen Male Asian 2005 3755
U New Freshmen Male Asian 2006 3839
U New Freshmen Male Asian 2007 4035
U New Freshmen Male Asian 2008 4136
U New Freshmen Male Asian 2009 4074
U New Freshmen Male Asian 2010 3945
U New Freshmen Male Asian 2011 3970
U New Freshmen Male Asian 2012 4076
U New Freshmen Male Asian 2013 4104
U New Freshmen Male Chicano/Latino 1983 137
U New Freshmen Male Chicano/Latino 1984 300
U New Freshmen Male Chicano/Latino 1985 451
U New Freshmen Male Chicano/Latino 1986 540
U New Freshmen Male Chicano/Latino 1987 753
U New Freshmen Male Chicano/Latino 1988 889
U New Freshmen Male Chicano/Latino 1989 995
U New Freshmen Male Chicano/Latino 1990 1070
U New Freshmen Male Chicano/Latino 1991 1127
U New Freshmen Male Chicano/Latino 1992 1126
U New Freshmen Male Chicano/Latino 1993 1071
U New Freshmen Male Chicano/Latino 1994 992
U New Freshmen Male Chicano/Latino 1995 1012
U New Freshmen Male Chicano/Latino 1996 959
U New Freshmen Male Chicano/Latino 1997 929
U New Freshmen Male Chicano/Latino 1998 873
U New Freshmen Male Chicano/Latino 1999 833
U New Freshmen Male Chicano/Latino 2000 768
U New Freshmen Male Chicano/Latino 2001 767
U New Freshmen Male Chicano/Latino 2002 784
U New Freshmen Male Chicano/Latino 2003 804
U New Freshmen Male Chicano/Latino 2004 788
U New Freshmen Male Chicano/Latino 2005 795
U New Freshmen Male Chicano/Latino 2006 794
U New Freshmen Male Chicano/Latino 2007 862
U New Freshmen Male Chicano/Latino 2008 867
U New Freshmen Male Chicano/Latino 2009 896
U New Freshmen Male Chicano/Latino 2010 867
U New Freshmen Male Chicano/Latino 2011 876
U New Freshmen Male Chicano/Latino 2012 882
U New Freshmen Male Chicano/Latino 2013 921
U New Freshmen Male Decline to State 1983 20
U New Freshmen Male Decline to State 1984 49
U New Freshmen Male Decline to State 1985 132
U New Freshmen Male Decline to State 1986 220
U New Freshmen Male Decline to State 1987 263
U New Freshmen Male Decline to State 1988 339
U New Freshmen Male Decline to State 1989 385
U New Freshmen Male Decline to State 1990 422
U New Freshmen Male Decline to State 1991 461
U New Freshmen Male Decline to State 1992 514
U New Freshmen Male Decline to State 1993 527
U New Freshmen Male Decline to State 1994 488
U New Freshmen Male Decline to State 1995 453
U New Freshmen Male Decline to State 1996 444
U New Freshmen Male Decline to State 1997 437
U New Freshmen Male Decline to State 1998 624
U New Freshmen Male Decline to State 1999 715
U New Freshmen Male Decline to State 2000 780
U New Freshmen Male Decline to State 2001 877
U New Freshmen Male Decline to State 2002 814
U New Freshmen Male Decline to State 2003 742
U New Freshmen Male Decline to State 2004 703
U New Freshmen Male Decline to State 2005 630
U New Freshmen Male Decline to State 2006 588
U New Freshmen Male Decline to State 2007 551
U New Freshmen Male Decline to State 2008 535
U New Freshmen Male Decline to State 2009 510
U New Freshmen Male Decline to State 2010 504
U New Freshmen Male Decline to State 2011 499
U New Freshmen Male Decline to State 2012 427
U New Freshmen Male Decline to State 2013 369
U New Freshmen Male International 1983 45
U New Freshmen Male International 1984 100
U New Freshmen Male International 1985 131
U New Freshmen Male International 1986 167
U New Freshmen Male International 1987 195
U New Freshmen Male International 1988 189
U New Freshmen Male International 1989 186
U New Freshmen Male International 1990 202
U New Freshmen Male International 1991 213
U New Freshmen Male International 1992 222
U New Freshmen Male International 1993 224
U New Freshmen Male International 1994 221
U New Freshmen Male International 1995 210
U New Freshmen Male International 1996 215
U New Freshmen Male International 1997 209
U New Freshmen Male International 1998 204
U New Freshmen Male International 1999 195
U New Freshmen Male International 2000 188
U New Freshmen Male International 2001 176
U New Freshmen Male International 2002 177
U New Freshmen Male International 2003 178
U New Freshmen Male International 2004 181
U New Freshmen Male International 2005 198
U New Freshmen Male International 2006 183
U New Freshmen Male International 2007 184
U New Freshmen Male International 2008 314
U New Freshmen Male International 2009 387
U New Freshmen Male International 2010 533
U New Freshmen Male International 2011 751
U New Freshmen Male International 2012 881
U New Freshmen Male International 2013 1127
U New Freshmen Male Native American 1983 14
U New Freshmen Male Native American 1984 24
U New Freshmen Male Native American 1985 33
U New Freshmen Male Native American 1986 40
U New Freshmen Male Native American 1987 63
U New Freshmen Male Native American 1988 69
U New Freshmen Male Native American 1989 79
U New Freshmen Male Native American 1990 71
U New Freshmen Male Native American 1991 70
U New Freshmen Male Native American 1992 76
U New Freshmen Male Native American 1993 77
U New Freshmen Male Native American 1994 78
U New Freshmen Male Native American 1995 95
U New Freshmen Male Native American 1996 99
U New Freshmen Male Native American 1997 78
U New Freshmen Male Native American 1998 67
U New Freshmen Male Native American 1999 54
U New Freshmen Male Native American 2000 39
U New Freshmen Male Native American 2001 33
U New Freshmen Male Native American 2002 40
U New Freshmen Male Native American 2003 35
U New Freshmen Male Native American 2004 29
U New Freshmen Male Native American 2005 36
U New Freshmen Male Native American 2006 33
U New Freshmen Male Native American 2007 33
U New Freshmen Male Native American 2008 33
U New Freshmen Male Native American 2009 38
U New Freshmen Male Native American 2010 44
U New Freshmen Male Native American 2011 49
U New Freshmen Male Native American 2012 59
U New Freshmen Male Native American 2013 46
U New Freshmen Male Other 1983 60
U New Freshmen Male Other 1984 90
U New Freshmen Male Other 1985 120
U New Freshmen Male Other 1986 141
U New Freshmen Male Other 1987 118
U New Freshmen Male Other 1988 93
U New Freshmen Male Other 1989 85
U New Freshmen Male Other 1990 71
U New Freshmen Male Other 1991 63
U New Freshmen Male Other 1992 84
U New Freshmen Male Other 1993 80
U New Freshmen Male Other 1994 84
U New Freshmen Male Other 1995 102
U New Freshmen Male Other 1996 118
U New Freshmen Male Other 1997 137
U New Freshmen Male Other 1998 147
U New Freshmen Male Other 1999 147
U New Freshmen Male Other 2000 144
U New Freshmen Male Other 2001 143
U New Freshmen Male Other 2002 119
U New Freshmen Male Other 2003 106
U New Freshmen Male Other 2004 89
U New Freshmen Male Other 2005 95
U New Freshmen Male Other 2006 96
U New Freshmen Male Other 2007 108
U New Freshmen Male Other 2008 120
U New Freshmen Male Other 2009 114
U New Freshmen Male Other 2010 89
U New Freshmen Male Pacific Islander 1983 4
U New Freshmen Male Pacific Islander 1984 5
U New Freshmen Male Pacific Islander 1985 5
U New Freshmen Male Pacific Islander 1986 5
U New Freshmen Male Pacific Islander 1987 3
U New Freshmen Male Pacific Islander 1988 4
U New Freshmen Male Pacific Islander 1989 5
U New Freshmen Male Pacific Islander 1990 6
U New Freshmen Male Pacific Islander 1991 12
U New Freshmen Male Pacific Islander 1992 13
U New Freshmen Male Pacific Islander 1993 15
U New Freshmen Male Pacific Islander 1994 19
U New Freshmen Male Pacific Islander 1995 20
U New Freshmen Male Pacific Islander 1996 27
U New Freshmen Male Pacific Islander 1997 24
U New Freshmen Male Pacific Islander 1998 30
U New Freshmen Male Pacific Islander 1999 28
U New Freshmen Male Pacific Islander 2000 28
U New Freshmen Male Pacific Islander 2001 24
U New Freshmen Male Pacific Islander 2002 22
U New Freshmen Male Pacific Islander 2003 15
U New Freshmen Male Pacific Islander 2004 20
U New Freshmen Male Pacific Islander 2005 21
U New Freshmen Male Pacific Islander 2006 22
U New Freshmen Male Pacific Islander 2007 20
U New Freshmen Male Pacific Islander 2008 21
U New Freshmen Male Pacific Islander 2009 20
U New Freshmen Male Pacific Islander 2010 20
U New Freshmen Male Pacific Islander 2011 24
U New Freshmen Male Pacific Islander 2012 25
U New Freshmen Male Pacific Islander 2013 24
U New Freshmen Male White 1983 1414
U New Freshmen Male White 1984 2588
U New Freshmen Male White 1985 3343
U New Freshmen Male White 1986 3868
U New Freshmen Male White 1987 3988
U New Freshmen Male White 1988 3752
U New Freshmen Male White 1989 3440
U New Freshmen Male White 1990 3207
U New Freshmen Male White 1991 3009
U New Freshmen Male White 1992 2977
U New Freshmen Male White 1993 2840
U New Freshmen Male White 1994 2671
U New Freshmen Male White 1995 2667
U New Freshmen Male White 1996 2688
U New Freshmen Male White 1997 2675
U New Freshmen Male White 1998 2752
U New Freshmen Male White 1999 2785
U New Freshmen Male White 2000 2753
U New Freshmen Male White 2001 2802
U New Freshmen Male White 2002 2733
U New Freshmen Male White 2003 2661
U New Freshmen Male White 2004 2600
U New Freshmen Male White 2005 2631
U New Freshmen Male White 2006 2622
U New Freshmen Male White 2007 2714
U New Freshmen Male White 2008 2787
U New Freshmen Male White 2009 2802
U New Freshmen Male White 2010 2772
U New Freshmen Male White 2011 2773
U New Freshmen Male White 2012 2710
U New Freshmen Male White 2013 2710
U Second Bachelor Female African American 1985 1
U Second Bachelor Female African American 1986 2
U Second Bachelor Female African American 1987 3
U Second Bachelor Female African American 1988 3
U Second Bachelor Female African American 1989 2
U Second Bachelor Female African American 1990 2
U Second Bachelor Female African American 1991 2
U Second Bachelor Female African American 1992 2
U Second Bachelor Female African American 1993 2
U Second Bachelor Female African American 1994 3
U Second Bachelor Female African American 1995 1
U Second Bachelor Female African American 1996 1
U Second Bachelor Female African American 1997 1
U Second Bachelor Female African American 1998 1
U Second Bachelor Female Asian 1983 3
U Second Bachelor Female Asian 1984 10
U Second Bachelor Female Asian 1985 4
U Second Bachelor Female Asian 1986 5
U Second Bachelor Female Asian 1987 9
U Second Bachelor Female Asian 1988 14
U Second Bachelor Female Asian 1989 14
U Second Bachelor Female Asian 1990 16
U Second Bachelor Female Asian 1991 21
U Second Bachelor Female Asian 1992 25
U Second Bachelor Female Asian 1993 25
U Second Bachelor Female Asian 1994 27
U Second Bachelor Female Asian 1995 31
U Second Bachelor Female Asian 1996 33
U Second Bachelor Female Asian 1997 29
U Second Bachelor Female Asian 1998 31
U Second Bachelor Female Asian 1999 26
U Second Bachelor Female Asian 2000 23
U Second Bachelor Female Asian 2001 28
U Second Bachelor Female Asian 2002 34
U Second Bachelor Female Asian 2003 2
U Second Bachelor Female Asian 2004 3
U Second Bachelor Female Asian 2005 3
U Second Bachelor Female Asian 2006 3
U Second Bachelor Female Asian 2007 3
U Second Bachelor Female Asian 2009 1
U Second Bachelor Female Asian 2010 2
U Second Bachelor Female Asian 2011 2
U Second Bachelor Female Asian 2012 2
U Second Bachelor Female Asian 2013 1
U Second Bachelor Female Chicano/Latino 1984 2
U Second Bachelor Female Chicano/Latino 1985 6
U Second Bachelor Female Chicano/Latino 1986 6
U Second Bachelor Female Chicano/Latino 1987 5
U Second Bachelor Female Chicano/Latino 1988 6
U Second Bachelor Female Chicano/Latino 1989 6
U Second Bachelor Female Chicano/Latino 1990 4
U Second Bachelor Female Chicano/Latino 1991 4
U Second Bachelor Female Chicano/Latino 1992 3
U Second Bachelor Female Chicano/Latino 1993 1
U Second Bachelor Female Chicano/Latino 1994 1
U Second Bachelor Female Chicano/Latino 1995 2
U Second Bachelor Female Chicano/Latino 1996 1
U Second Bachelor Female Chicano/Latino 1997 1
U Second Bachelor Female Chicano/Latino 1998 2
U Second Bachelor Female Chicano/Latino 1999 4
U Second Bachelor Female Chicano/Latino 2000 3
U Second Bachelor Female Chicano/Latino 2001 2
U Second Bachelor Female Chicano/Latino 2002 4
U Second Bachelor Female Decline to State 1983 10
U Second Bachelor Female Decline to State 1984 9
U Second Bachelor Female Decline to State 1985 15
U Second Bachelor Female Decline to State 1986 16
U Second Bachelor Female Decline to State 1987 16
U Second Bachelor Female Decline to State 1988 12
U Second Bachelor Female Decline to State 1989 13
U Second Bachelor Female Decline to State 1990 21
U Second Bachelor Female Decline to State 1991 21
U Second Bachelor Female Decline to State 1992 13
U Second Bachelor Female Decline to State 1993 7
U Second Bachelor Female Decline to State 1995 4
U Second Bachelor Female Decline to State 1996 7
U Second Bachelor Female Decline to State 1997 5
U Second Bachelor Female Decline to State 1998 5
U Second Bachelor Female Decline to State 1999 6
U Second Bachelor Female Decline to State 2000 5
U Second Bachelor Female Decline to State 2001 7
U Second Bachelor Female Decline to State 2002 7
U Second Bachelor Female Decline to State 2003 2
U Second Bachelor Female Decline to State 2004 1
U Second Bachelor Female Decline to State 2007 1
U Second Bachelor Female Decline to State 2008 1
U Second Bachelor Female Decline to State 2009 1
U Second Bachelor Female International 1983 1
U Second Bachelor Female International 1984 1
U Second Bachelor Female International 1985 1
U Second Bachelor Female International 1986 7
U Second Bachelor Female International 1987 2
U Second Bachelor Female International 1988 3
U Second Bachelor Female International 1989 1
U Second Bachelor Female International 1990 1
U Second Bachelor Female International 1991 2
U Second Bachelor Female International 1992 4
U Second Bachelor Female International 1993 2
U Second Bachelor Female International 1994 2
U Second Bachelor Female International 1996 2
U Second Bachelor Female International 1997 3
U Second Bachelor Female International 1998 2
U Second Bachelor Female International 1999 1
U Second Bachelor Female International 2000 2
U Second Bachelor Female International 2001 3
U Second Bachelor Female International 2002 3
U Second Bachelor Female International 2003 1
U Second Bachelor Female International 2004 2
U Second Bachelor Female International 2005 1
U Second Bachelor Female International 2012 1
U Second Bachelor Female International 2013 2
U Second Bachelor Female Native American 1991 1
U Second Bachelor Female Native American 1992 1
U Second Bachelor Female Other 1985 2
U Second Bachelor Female Other 1986 1
U Second Bachelor Female Other 1989 1
U Second Bachelor Female Other 1990 1
U Second Bachelor Female Other 2002 1
U Second Bachelor Female Pacific Islander 1991 1
U Second Bachelor Female White 1983 21
U Second Bachelor Female White 1984 29
U Second Bachelor Female White 1985 32
U Second Bachelor Female White 1986 23
U Second Bachelor Female White 1987 23
U Second Bachelor Female White 1988 24
U Second Bachelor Female White 1989 17
U Second Bachelor Female White 1990 16
U Second Bachelor Female White 1991 22
U Second Bachelor Female White 1992 23
U Second Bachelor Female White 1993 24
U Second Bachelor Female White 1994 25
U Second Bachelor Female White 1995 21
U Second Bachelor Female White 1996 18
U Second Bachelor Female White 1997 17
U Second Bachelor Female White 1998 18
U Second Bachelor Female White 1999 17
U Second Bachelor Female White 2000 29
U Second Bachelor Female White 2001 24
U Second Bachelor Female White 2002 14
U Second Bachelor Female White 2003 1
U Second Bachelor Female White 2004 1
U Second Bachelor Male African American 1983 3
U Second Bachelor Male African American 1984 1
U Second Bachelor Male African American 1985 2
U Second Bachelor Male African American 1986 2
U Second Bachelor Male African American 1989 1
U Second Bachelor Male African American 1994 1
U Second Bachelor Male African American 2000 1
U Second Bachelor Male African American 2001 1
U Second Bachelor Male Asian 1983 4
U Second Bachelor Male Asian 1984 9
U Second Bachelor Male Asian 1985 10
U Second Bachelor Male Asian 1986 10
U Second Bachelor Male Asian 1987 7
U Second Bachelor Male Asian 1988 6
U Second Bachelor Male Asian 1989 4
U Second Bachelor Male Asian 1990 6
U Second Bachelor Male Asian 1991 9
U Second Bachelor Male Asian 1992 12
U Second Bachelor Male Asian 1993 15
U Second Bachelor Male Asian 1994 12
U Second Bachelor Male Asian 1995 14
U Second Bachelor Male Asian 1996 17
U Second Bachelor Male Asian 1997 13
U Second Bachelor Male Asian 1998 16
U Second Bachelor Male Asian 1999 16
U Second Bachelor Male Asian 2000 11
U Second Bachelor Male Asian 2001 12
U Second Bachelor Male Asian 2002 17
U Second Bachelor Male Asian 2003 2
U Second Bachelor Male Asian 2004 1
U Second Bachelor Male Asian 2005 1
U Second Bachelor Male Asian 2006 1
U Second Bachelor Male Asian 2009 1
U Second Bachelor Male Asian 2013 1
U Second Bachelor Male Chicano/Latino 1983 3
U Second Bachelor Male Chicano/Latino 1984 4
U Second Bachelor Male Chicano/Latino 1985 2
U Second Bachelor Male Chicano/Latino 1986 3
U Second Bachelor Male Chicano/Latino 1987 2
U Second Bachelor Male Chicano/Latino 1988 2
U Second Bachelor Male Chicano/Latino 1990 3
U Second Bachelor Male Chicano/Latino 1991 5
U Second Bachelor Male Chicano/Latino 1992 4
U Second Bachelor Male Chicano/Latino 1993 6
U Second Bachelor Male Chicano/Latino 1994 6
U Second Bachelor Male Chicano/Latino 1995 5
U Second Bachelor Male Chicano/Latino 1996 6
U Second Bachelor Male Chicano/Latino 1997 2
U Second Bachelor Male Chicano/Latino 1998 1
U Second Bachelor Male Chicano/Latino 1999 2
U Second Bachelor Male Chicano/Latino 2000 1
U Second Bachelor Male Chicano/Latino 2001 3
U Second Bachelor Male Chicano/Latino 2002 3
U Second Bachelor Male Chicano/Latino 2006 2
U Second Bachelor Male Chicano/Latino 2007 2
U Second Bachelor Male Decline to State 1983 8
U Second Bachelor Male Decline to State 1984 10
U Second Bachelor Male Decline to State 1985 19
U Second Bachelor Male Decline to State 1986 15
U Second Bachelor Male Decline to State 1987 16
U Second Bachelor Male Decline to State 1988 17
U Second Bachelor Male Decline to State 1989 13
U Second Bachelor Male Decline to State 1990 11
U Second Bachelor Male Decline to State 1991 14
U Second Bachelor Male Decline to State 1992 11
U Second Bachelor Male Decline to State 1993 5
U Second Bachelor Male Decline to State 1994 4
U Second Bachelor Male Decline to State 1995 3
U Second Bachelor Male Decline to State 1997 1
U Second Bachelor Male Decline to State 1998 4
U Second Bachelor Male Decline to State 1999 5
U Second Bachelor Male Decline to State 2000 3
U Second Bachelor Male Decline to State 2001 2
U Second Bachelor Male Decline to State 2002 3
U Second Bachelor Male Decline to State 2003 2
U Second Bachelor Male Decline to State 2004 1
U Second Bachelor Male Decline to State 2005 2
U Second Bachelor Male Decline to State 2006 1
U Second Bachelor Male Decline to State 2008 1
U Second Bachelor Male Decline to State 2009 2
U Second Bachelor Male Decline to State 2010 2
U Second Bachelor Male Decline to State 2011 2
U Second Bachelor Male International 1983 2
U Second Bachelor Male International 1985 1
U Second Bachelor Male International 1986 11
U Second Bachelor Male International 1987 2
U Second Bachelor Male International 1990 3
U Second Bachelor Male International 1991 3
U Second Bachelor Male International 1992 5
U Second Bachelor Male International 1993 8
U Second Bachelor Male International 1994 7
U Second Bachelor Male International 1995 6
U Second Bachelor Male International 1996 3
U Second Bachelor Male International 1997 3
U Second Bachelor Male International 1998 3
U Second Bachelor Male International 1999 1
U Second Bachelor Male International 2000 5
U Second Bachelor Male International 2001 4
U Second Bachelor Male International 2002 1
U Second Bachelor Male Native American 1986 1
U Second Bachelor Male Native American 1994 1
U Second Bachelor Male Native American 1995 2
U Second Bachelor Male Native American 1996 2
U Second Bachelor Male Other 1984 1
U Second Bachelor Male Other 1985 3
U Second Bachelor Male Other 1986 1
U Second Bachelor Male Other 2001 1
U Second Bachelor Male Other 2002 2
U Second Bachelor Male White 1983 22
U Second Bachelor Male White 1984 35
U Second Bachelor Male White 1985 27
U Second Bachelor Male White 1986 16
U Second Bachelor Male White 1987 25
U Second Bachelor Male White 1988 30
U Second Bachelor Male White 1989 26
U Second Bachelor Male White 1990 20
U Second Bachelor Male White 1991 26
U Second Bachelor Male White 1992 25
U Second Bachelor Male White 1993 26
U Second Bachelor Male White 1994 27
U Second Bachelor Male White 1995 12
U Second Bachelor Male White 1996 12
U Second Bachelor Male White 1997 15
U Second Bachelor Male White 1998 14
U Second Bachelor Male White 1999 13
U Second Bachelor Male White 2000 11
U Second Bachelor Male White 2001 10
U Second Bachelor Male White 2002 13
U Second Bachelor Male White 2003 4
U Second Bachelor Male White 2004 1
U Second Bachelor Male White 2005 1
U Second Bachelor Male White 2006 3
U Second Bachelor Male White 2007 7
U Second Bachelor Male White 2008 6
U Second Bachelor Male White 2009 6
U Second Bachelor Male White 2010 1
U Second Bachelor Male White 2011 2
U Second Bachelor Male White 2012 3
U Second Bachelor Male White 2013 2
U (unknown) Female African American 1983 333
U (unknown) Female African American 1984 200
U (unknown) Female African American 1985 97
U (unknown) Female African American 1986 63
U (unknown) Female African American 1987 19
U (unknown) Female African American 1988 6
U (unknown) Female African American 1989 5
U (unknown) Female African American 1990 1
U (unknown) Female African American 1992 4
U (unknown) Female African American 1993 3
U (unknown) Female African American 1994 4
U (unknown) Female African American 1995 3
U (unknown) Female African American 1996 9
U (unknown) Female African American 1997 7
U (unknown) Female African American 1998 5
U (unknown) Female African American 1999 2
U (unknown) Female African American 2000 1
U (unknown) Female African American 2001 1
U (unknown) Female African American 2002 1
U (unknown) Female African American 2003 1
U (unknown) Female African American 2004 1
U (unknown) Female African American 2009 8
U (unknown) Female African American 2010 9
U (unknown) Female African American 2011 11
U (unknown) Female African American 2012 5
U (unknown) Female African American 2013 3
U (unknown) Female Asian 1983 1496
U (unknown) Female Asian 1984 947
U (unknown) Female Asian 1985 566
U (unknown) Female Asian 1986 260
U (unknown) Female Asian 1987 75
U (unknown) Female Asian 1988 34
U (unknown) Female Asian 1989 28
U (unknown) Female Asian 1990 16
U (unknown) Female Asian 1991 12
U (unknown) Female Asian 1992 9
U (unknown) Female Asian 1993 9
U (unknown) Female Asian 1994 11
U (unknown) Female Asian 1995 9
U (unknown) Female Asian 1996 6
U (unknown) Female Asian 1997 5
U (unknown) Female Asian 1998 4
U (unknown) Female Asian 1999 2
U (unknown) Female Asian 2000 6
U (unknown) Female Asian 2001 3
U (unknown) Female Asian 2002 4
U (unknown) Female Asian 2004 1
U (unknown) Female Asian 2005 1
U (unknown) Female Asian 2009 5
U (unknown) Female Asian 2010 6
U (unknown) Female Asian 2011 9
U (unknown) Female Asian 2012 8
U (unknown) Female Asian 2013 4
U (unknown) Female Chicano/Latino 1983 287
U (unknown) Female Chicano/Latino 1984 183
U (unknown) Female Chicano/Latino 1985 110
U (unknown) Female Chicano/Latino 1986 69
U (unknown) Female Chicano/Latino 1987 25
U (unknown) Female Chicano/Latino 1988 10
U (unknown) Female Chicano/Latino 1989 6
U (unknown) Female Chicano/Latino 1990 3
U (unknown) Female Chicano/Latino 1992 4
U (unknown) Female Chicano/Latino 1993 3
U (unknown) Female Chicano/Latino 1994 6
U (unknown) Female Chicano/Latino 1995 8
U (unknown) Female Chicano/Latino 1996 12
U (unknown) Female Chicano/Latino 1997 13
U (unknown) Female Chicano/Latino 1998 9
U (unknown) Female Chicano/Latino 1999 7
U (unknown) Female Chicano/Latino 2000 5
U (unknown) Female Chicano/Latino 2001 1
U (unknown) Female Chicano/Latino 2002 1
U (unknown) Female Chicano/Latino 2006 1
U (unknown) Female Chicano/Latino 2007 1
U (unknown) Female Chicano/Latino 2008 2
U (unknown) Female Chicano/Latino 2009 7
U (unknown) Female Chicano/Latino 2010 9
U (unknown) Female Chicano/Latino 2011 7
U (unknown) Female Chicano/Latino 2012 7
U (unknown) Female Chicano/Latino 2013 7
U (unknown) Female Decline to State 1983 46
U (unknown) Female Decline to State 1984 19
U (unknown) Female Decline to State 1985 10
U (unknown) Female Decline to State 1986 33
U (unknown) Female Decline to State 1987 25
U (unknown) Female Decline to State 1988 14
U (unknown) Female Decline to State 1989 10
U (unknown) Female Decline to State 1990 8
U (unknown) Female Decline to State 1991 11
U (unknown) Female Decline to State 1992 22
U (unknown) Female Decline to State 1993 26
U (unknown) Female Decline to State 1994 26
U (unknown) Female Decline to State 1995 20
U (unknown) Female Decline to State 1996 17
U (unknown) Female Decline to State 1997 15
U (unknown) Female Decline to State 1998 15
U (unknown) Female Decline to State 1999 21
U (unknown) Female Decline to State 2000 29
U (unknown) Female Decline to State 2001 13
U (unknown) Female Decline to State 2002 14
U (unknown) Female Decline to State 2003 10
U (unknown) Female Decline to State 2004 15
U (unknown) Female Decline to State 2005 29
U (unknown) Female Decline to State 2006 15
U (unknown) Female Decline to State 2007 6
U (unknown) Female Decline to State 2008 6
U (unknown) Female Decline to State 2009 8
U (unknown) Female Decline to State 2010 5
U (unknown) Female Decline to State 2011 9
U (unknown) Female Decline to State 2012 11
U (unknown) Female Decline to State 2013 7
U (unknown) Female International 1983 103
U (unknown) Female International 1984 46
U (unknown) Female International 1985 21
U (unknown) Female International 1986 14
U (unknown) Female International 1987 5
U (unknown) Female International 1988 2
U (unknown) Female International 1989 3
U (unknown) Female International 1990 1
U (unknown) Female International 1992 1
U (unknown) Female International 1993 2
U (unknown) Female International 1994 2
U (unknown) Female International 1998 2
U (unknown) Female International 1999 2
U (unknown) Female International 2000 2
U (unknown) Female International 2001 1
U (unknown) Female International 2002 1
U (unknown) Female International 2009 1
U (unknown) Female International 2013 1
U (unknown) Female Native American 1983 26
U (unknown) Female Native American 1984 12
U (unknown) Female Native American 1985 6
U (unknown) Female Native American 1986 3
U (unknown) Female Native American 1987 1
U (unknown) Female Native American 1993 1
U (unknown) Female Native American 1994 1
U (unknown) Female Native American 1996 2
U (unknown) Female Native American 1997 1
U (unknown) Female Native American 1998 1
U (unknown) Female Native American 1999 1
U (unknown) Female Native American 2002 1
U (unknown) Female Native American 2009 1
U (unknown) Female Native American 2011 1
U (unknown) Female Other 1983 179
U (unknown) Female Other 1984 99
U (unknown) Female Other 1985 42
U (unknown) Female Other 1986 27
U (unknown) Female Other 1987 8
U (unknown) Female Other 1992 5
U (unknown) Female Other 1993 4
U (unknown) Female Other 1994 4
U (unknown) Female Other 1995 2
U (unknown) Female Other 1996 1
U (unknown) Female Other 1997 1
U (unknown) Female Other 1999 1
U (unknown) Female Other 2000 1
U (unknown) Female Other 2001 1
U (unknown) Female Other 2002 1
U (unknown) Female Other 2009 2
U (unknown) Female Other 2010 4
U (unknown) Female Pacific Islander 1983 6
U (unknown) Female Pacific Islander 1984 3
U (unknown) Female Pacific Islander 1985 2
U (unknown) Female Pacific Islander 1986 1
U (unknown) Female Pacific Islander 1987 1
U (unknown) Female Pacific Islander 1991 1
U (unknown) Female Pacific Islander 2013 1
U (unknown) Female White 1983 3739
U (unknown) Female White 1984 1978
U (unknown) Female White 1985 906
U (unknown) Female White 1986 476
U (unknown) Female White 1987 181
U (unknown) Female White 1988 43
U (unknown) Female White 1989 15
U (unknown) Female White 1990 12
U (unknown) Female White 1991 24
U (unknown) Female White 1992 16
U (unknown) Female White 1993 14
U (unknown) Female White 1994 7
U (unknown) Female White 1995 11
U (unknown) Female White 1996 16
U (unknown) Female White 1997 15
U (unknown) Female White 1998 20
U (unknown) Female White 1999 9
U (unknown) Female White 2000 10
U (unknown) Female White 2001 9
U (unknown) Female White 2002 7
U (unknown) Female White 2003 2
U (unknown) Female White 2004 1
U (unknown) Female White 2006 2
U (unknown) Female White 2007 4
U (unknown) Female White 2008 3
U (unknown) Female White 2009 14
U (unknown) Female White 2010 15
U (unknown) Female White 2011 9
U (unknown) Female White 2012 6
U (unknown) Female White 2013 2
U (unknown) Male African American 1983 256
U (unknown) Male African American 1984 147
U (unknown) Male African American 1985 83
U (unknown) Male African American 1986 51
U (unknown) Male African American 1987 14
U (unknown) Male African American 1988 9
U (unknown) Male African American 1989 4
U (unknown) Male African American 1990 3
U (unknown) Male African American 1991 4
U (unknown) Male African American 1992 5
U (unknown) Male African American 1993 4
U (unknown) Male African American 1994 3
U (unknown) Male African American 1995 5
U (unknown) Male African American 1996 4
U (unknown) Male African American 1997 4
U (unknown) Male African American 1999 4
U (unknown) Male African American 2000 3
U (unknown) Male African American 2001 1
U (unknown) Male African American 2002 1
U (unknown) Male African American 2003 1
U (unknown) Male African American 2004 1
U (unknown) Male African American 2005 1
U (unknown) Male African American 2009 6
U (unknown) Male African American 2010 5
U (unknown) Male African American 2011 2
U (unknown) Male African American 2013 3
U (unknown) Male Asian 1983 1720
U (unknown) Male Asian 1984 1047
U (unknown) Male Asian 1985 555
U (unknown) Male Asian 1986 283
U (unknown) Male Asian 1987 92
U (unknown) Male Asian 1988 44
U (unknown) Male Asian 1989 32
U (unknown) Male Asian 1990 17
U (unknown) Male Asian 1991 13
U (unknown) Male Asian 1992 9
U (unknown) Male Asian 1993 9
U (unknown) Male Asian 1994 8
U (unknown) Male Asian 1995 11
U (unknown) Male Asian 1996 9
U (unknown) Male Asian 1997 5
U (unknown) Male Asian 1998 4
U (unknown) Male Asian 1999 2
U (unknown) Male Asian 2000 2
U (unknown) Male Asian 2001 3
U (unknown) Male Asian 2002 4
U (unknown) Male Asian 2008 1
U (unknown) Male Asian 2009 17
U (unknown) Male Asian 2010 18
U (unknown) Male Asian 2011 14
U (unknown) Male Asian 2012 5
U (unknown) Male Asian 2013 7
U (unknown) Male Chicano/Latino 1983 407
U (unknown) Male Chicano/Latino 1984 239
U (unknown) Male Chicano/Latino 1985 134
U (unknown) Male Chicano/Latino 1986 64
U (unknown) Male Chicano/Latino 1987 17
U (unknown) Male Chicano/Latino 1988 12
U (unknown) Male Chicano/Latino 1989 7
U (unknown) Male Chicano/Latino 1990 5
U (unknown) Male Chicano/Latino 1991 4
U (unknown) Male Chicano/Latino 1992 5
U (unknown) Male Chicano/Latino 1993 7
U (unknown) Male Chicano/Latino 1994 7
U (unknown) Male Chicano/Latino 1995 8
U (unknown) Male Chicano/Latino 1996 12
U (unknown) Male Chicano/Latino 1997 10
U (unknown) Male Chicano/Latino 1998 7
U (unknown) Male Chicano/Latino 1999 2
U (unknown) Male Chicano/Latino 2000 1
U (unknown) Male Chicano/Latino 2003 1
U (unknown) Male Chicano/Latino 2006 2
U (unknown) Male Chicano/Latino 2007 1
U (unknown) Male Chicano/Latino 2009 7
U (unknown) Male Chicano/Latino 2010 5
U (unknown) Male Chicano/Latino 2011 8
U (unknown) Male Chicano/Latino 2012 6
U (unknown) Male Chicano/Latino 2013 6
U (unknown) Male Decline to State 1983 68
U (unknown) Male Decline to State 1984 38
U (unknown) Male Decline to State 1985 16
U (unknown) Male Decline to State 1986 15
U (unknown) Male Decline to State 1987 14
U (unknown) Male Decline to State 1988 2
U (unknown) Male Decline to State 1989 2
U (unknown) Male Decline to State 1990 6
U (unknown) Male Decline to State 1991 9
U (unknown) Male Decline to State 1992 17
U (unknown) Male Decline to State 1993 17
U (unknown) Male Decline to State 1994 17
U (unknown) Male Decline to State 1995 15
U (unknown) Male Decline to State 1996 7
U (unknown) Male Decline to State 1997 6
U (unknown) Male Decline to State 1998 10
U (unknown) Male Decline to State 1999 4
U (unknown) Male Decline to State 2000 5
U (unknown) Male Decline to State 2001 9
U (unknown) Male Decline to State 2002 4
U (unknown) Male Decline to State 2003 18
U (unknown) Male Decline to State 2004 12
U (unknown) Male Decline to State 2005 25
U (unknown) Male Decline to State 2006 10
U (unknown) Male Decline to State 2007 6
U (unknown) Male Decline to State 2008 4
U (unknown) Male Decline to State 2009 12
U (unknown) Male Decline to State 2010 13
U (unknown) Male Decline to State 2011 18
U (unknown) Male Decline to State 2012 11
U (unknown) Male Decline to State 2013 9
U (unknown) Male International 1983 181
U (unknown) Male International 1984 91
U (unknown) Male International 1985 36
U (unknown) Male International 1986 27
U (unknown) Male International 1987 14
U (unknown) Male International 1988 5
U (unknown) Male International 1989 4
U (unknown) Male International 1990 3
U (unknown) Male International 1991 1
U (unknown) Male International 1992 2
U (unknown) Male International 1993 3
U (unknown) Male International 1994 2
U (unknown) Male International 1995 2
U (unknown) Male International 2010 3
U (unknown) Male International 2011 1
U (unknown) Male International 2012 1
U (unknown) Male Native American 1983 32
U (unknown) Male Native American 1984 13
U (unknown) Male Native American 1985 5
U (unknown) Male Native American 1986 3
U (unknown) Male Native American 1988 2
U (unknown) Male Native American 1992 1
U (unknown) Male Native American 1993 1
U (unknown) Male Native American 1995 1
U (unknown) Male Other 1983 256
U (unknown) Male Other 1984 138
U (unknown) Male Other 1985 62
U (unknown) Male Other 1986 25
U (unknown) Male Other 1987 7
U (unknown) Male Other 1988 3
U (unknown) Male Other 1989 3
U (unknown) Male Other 1990 2
U (unknown) Male Other 1991 1
U (unknown) Male Other 1992 1
U (unknown) Male Other 1993 1
U (unknown) Male Other 1994 1
U (unknown) Male Other 2001 1
U (unknown) Male Other 2002 1
U (unknown) Male Other 2003 1
U (unknown) Male Other 2009 1
U (unknown) Male Pacific Islander 1983 6
U (unknown) Male Pacific Islander 1984 5
U (unknown) Male Pacific Islander 1985 4
U (unknown) Male Pacific Islander 1986 3
U (unknown) Male Pacific Islander 2010 1
U (unknown) Male White 1983 4753
U (unknown) Male White 1984 2577
U (unknown) Male White 1985 1301
U (unknown) Male White 1986 621
U (unknown) Male White 1987 191
U (unknown) Male White 1988 60
U (unknown) Male White 1989 25
U (unknown) Male White 1990 13
U (unknown) Male White 1991 20
U (unknown) Male White 1992 24
U (unknown) Male White 1993 32
U (unknown) Male White 1994 26
U (unknown) Male White 1995 20
U (unknown) Male White 1996 11
U (unknown) Male White 1997 15
U (unknown) Male White 1998 12
U (unknown) Male White 1999 8
U (unknown) Male White 2000 10
U (unknown) Male White 2001 6
U (unknown) Male White 2002 6
U (unknown) Male White 2003 3
U (unknown) Male White 2004 4
U (unknown) Male White 2005 1
U (unknown) Male White 2006 3
U (unknown) Male White 2007 4
U (unknown) Male White 2008 2
U (unknown) Male White 2009 15
U (unknown) Male White 2010 24
U (unknown) Male White 2011 14
U (unknown) Male White 2012 8
U (unknown) Male White 2013 5
var ethnicityChart = dc.rowChart("#ethnicity-chart");
var entryStatusChart = dc.rowChart("#entry-status-chart"); //entryStatus
var gradStatusChart = dc.pieChart("#grad-status-chart"); //gradStatus
var genderChart = dc.pieChart("#gender-chart");//gender
var yearChart = dc.lineChart("#year-chart"); //year
var seriesChart = dc.seriesChart("#series-chart");
d3.csv("studentCensus.csv", function (error, csv) {
var data = crossfilter(csv);
var all = data.groupAll();
// Formatting helpers
var parseDate = d3.time.format('%Y');
var numFormat = d3.format(",");
// format the data
csv.forEach(function (d){
d.censusYear = parseDate.parse(d.year);
});
// define the dimensions and groups to be used by the charts
var ethnicities = data.dimension(function (d) { return d.raceEthnicity; });
var ethnicityCount = ethnicities.group().reduceSum(function(d) { return d.count; });
var entryStatuses = data.dimension(function (d) { return d.entryStatus; });
var entryStatusCount = entryStatuses.group().reduceSum(function(d) { return d.count; });
var gradStatuses = data.dimension(function (d) { return d.undergradStatus; });
var gradStatusCount = gradStatuses.group().reduceSum(function(d) { return d.count; });
var genders = data.dimension(function (d) { return d.gender; });
var genderCount = genders.group().reduceSum(function(d) { return d.count; });
var censusYears = data.dimension(function (d) { return d.censusYear; });
var censusYearCount = censusYears.group().reduceSum(function(d) { return d.count; });
var ethnicitiesByYear = data.dimension(function (d) { return [d.raceEthnicity,d.censusYear]; });
var ethnicitiesByYearCount = ethnicitiesByYear.group().reduceSum(function(d) { return d.count; });
// tooltips
var pieTip = d3.tip()
.attr('class', 'd3-tip')
.offset([-10, 0])
.html(function (d) { return "<span style='color: #f0027f'>" + d.data.key + "</span> : " + numFormat(d.value); });
var barTip = d3.tip()
.attr('class', 'd3-tip')
.offset([-10, 0])
.html(function (d) { return "<span style='color: #c6dbef'>" + d.key + "</span> : " + numFormat(d.value);});
var seriesTip = d3.tip()
.attr('class', 'd3-tip')
.offset([-10, 0])
.html(function (d) { return "<span style='color: #c6dbef'>" + d.data.key[0] + " ("+ parseDate(d.data.key[1]) + ")" + "</span> : " + numFormat(d.data.value);});
var areaTip = d3.tip()
.attr('class', 'd3-tip')
.offset([-10, 0])
.html(function (d) { return "<span style='color: #c6dbef'>" + parseDate(d.data.key) + "</span> : " + numFormat(d.data.value);});
// the records count
dc.dataCount("#data-count-top")
.dimension(data)
.group(all);
// the ethnicity chart
ethnicityChart.width(440)
.height(260)
.margins({top: 10, right: 100, bottom: 30, left: 120})
.transitionDuration(1000)
.dimension(ethnicities)
.group(ethnicityCount)
.ordinalColors(["#1b9e77","#d95f02","#7570b3","#e7298a","#66a61e","#e6ab02","#a6761d","#666666","#49006a"])
// ["#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628","#f781bf","#999999"])
.labelOffsetX([-8])
.labelOffsetY([12])
.title(function () { return ""; })
.elasticX(true)
.xAxis().ticks(4);
// the entry status chart
entryStatusChart.width(440)
.height(260)
.margins({top: 10, right: 40, bottom: 30, left: 120})
.transitionDuration(1000)
.dimension(entryStatuses)
.group(entryStatusCount)
.ordinalColors(['rgb(34, 94, 168)'])
// ['rgb(127,205,187)','rgb(65,182,196)','rgb(29,145,192)','rgb(34,94,168)','rgb(37,52,148)','rgb(8,29,88)'])
.labelOffsetX([-8])
.labelOffsetY([12])
.title(function () { return ""; })
.elasticX(true)
.xAxis().ticks(4);
// the grad status chart
gradStatusChart.width(250)
.height(100)
.transitionDuration(1000)
.radius(40)
.innerRadius(20)
.dimension(gradStatuses)
.group(gradStatusCount)
.ordinalColors(["#92c5de","#2166ac"])
.title(function () { return ""; })
.legend(dc.legend().x(50).y(0));
// the gender chart
genderChart.width(250)
.height(100)
.transitionDuration(1000)
.radius(40)
.innerRadius(20)
.dimension(genders)
.group(genderCount)
.title(function () { return ""; })
.ordinalColors(["#9ecae1","#2171b5"])
//.ordinalColors(["#5254a3","#6b6ecf","#9c9ede","#637939","#e7cb94","#843c39", "#bfd3e6","#ad494a","#d6616b","#e7969c","#7b4173","#a55194","#ce6dbd","#de9ed6"])
// .colors(["#e7298a","#ce1256", "#f768a1","#dd3497","#e78ac3","#f1b6da","#c51b7d"])
// .colorDomain([1,29])
// .colorAccessor(function (d) {return d.ugArea;})
.legend(dc.legend().x(50).y(0))
.renderLabel(false);
// the area time series
yearChart.width(600)
.height(140)
.margins({top: 10, right: 150, bottom: 30, left: 50})
.transitionDuration(1000)
.dimension(censusYears)
.group(censusYearCount)
.elasticY(false)
.brushOn(false)
.ordinalColors(["steelblue"])
.x(d3.time.scale().domain([new Date(1983, 01, 01), new Date(2013, 12, 31)]))
.xUnits(d3.time.years)
.renderHorizontalGridLines(true)
.renderArea(true)
// .title(function (d) { return d.key[0] + " ("+ parseDate(d.key[1]) + ") " + numFormat(d.value); })
.title(function () { return ""; })
.filterPrinter(function (filters) {
var filter = filters[0], s = "";
var dateObj = new Date(filter[0]);
s += (dateObj.getFullYear() + 1) + " - " + parseDate(filter[1]);
return s;
})
.yAxis().ticks(5);
// the series chart
seriesChart.width(600)
.height(260)
.margins({top: 10, right: 150, bottom: 30, left: 50})
.transitionDuration(1000)
.dimension(ethnicitiesByYear)
.group(ethnicitiesByYearCount)
.elasticY(true)
.brushOn(false)
.ordinalColors(["#1b9e77","#d95f02","#7570b3","#e7298a","#66a61e","#e6ab02","#a6761d","#666666","#49006a"])
.x(d3.time.scale().domain([new Date(1983, 01, 01), new Date(2013, 12, 31)]))
.chart(function(c) { return dc.lineChart(c).interpolate('basis'); })
.seriesAccessor(function(d) {return d.key[0];})
.keyAccessor(function(d) {return +d.key[1];})
.valueAccessor(function(d) {return +d.value;})
.xUnits(d3.time.years)
.renderHorizontalGridLines(true)
.filterPrinter(function (filters) {
var filter = filters[0], s = "";
var dateObj = new Date(filter[0]);
s += (dateObj.getFullYear() + 1) + " - " + parseDate(filter[1]);
return s;
})
.title(function () { return ""; })
.legend(dc.legend().x(450).y(40).itemHeight(13).gap(5).horizontal(1).legendWidth(150).itemWidth(150))
.yAxis().ticks(5);
// the second record count
dc.dataCount("#data-count-bottom")
.dimension(data)
.group(all);
// the data table
dc.dataTable(".dc-data-table")
.dimension(entryStatuses)
.group(function (d) {
return d.entryStatus;
})
.size(170)
.columns([
function (d) { return d.undergradStatus; },
function (d) { return d.entryStatus; },
function (d) { return d.raceEthnicity; },
function (d) { return d.gender; },
function (d) { return d.year; },
function (d) { return d.count; }
])
.sortBy(function (d) {
return d.raceEthnicity;
})
.order(d3.ascending)
.renderlet(function (table) {
table.selectAll(".dc-table-group").classed("info", true);
});
dc.renderAll();
// set up the tool tips
d3.selectAll(".pie-slice").call(pieTip);
d3.selectAll(".pie-slice").on('mouseover', pieTip.show)
.on('mouseout', pieTip.hide);
d3.selectAll("g.row").call(barTip);
d3.selectAll("g.row").on('mouseover', barTip.show)
.on('mouseout', barTip.hide);
d3.selectAll("#series-chart circle.dot").call(seriesTip);
d3.selectAll("#series-chart circle.dot")
.on('mouseover.foo', seriesTip.show)
.on('mouseout.foo', seriesTip.hide);
d3.selectAll("#year-chart circle.dot").call(areaTip);
d3.selectAll("#year-chart circle.dot")
.on('mouseover.bar', areaTip.show)
.on('mouseout.bar', areaTip.hide);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment