Commit 9991c7d1 by John Hess

added a directory lms/static/video50 to hold static js assets and such for cs50's video player

parent 1f29403a
.DS_Store
*.srt
*.mp4
.video50-available-questions {
display: inline-block;
line-height: 29px;
height: 29px;
vertical-align: middle;
}
.video50-playback-controls li {
float: none;
display: inline-block;
}
.video50-player {
position: relative;
-webkit-perspective: 800px;
-moz-perspective: 800px;
-o-perspective: 800px;
perspective: 800px;
}
.video50-player .player-navbar {
border: 1px solid #ddd;
-webkit-border-top-left-radius: 4px;
-webkit-border-top-right-radius: 4px;
-moz-border-radius-topleft: 4px;
-moz-border-radius-topright: 4px;
border-top-left-radius: 4px;
border-top-right-radius: 4px;
line-height: 36px;
height: 36px;
background-image: -moz-linear-gradient(bottom, #f5f5f5, #ffffff);
background-image: -ms-linear-gradient(bottom, #f5f5f5, #ffffff);
background-image: -webkit-linear-gradient(bottom, #f5f5f5, #ffffff);
background-image: -o-linear-gradient(bottom, #f5f5f5, #ffffff);
background-image: linear-gradient(bottom, #f5f5f5, #ffffff);
}
.video50-player .player-navbar .btn-back {
display: none;
position: absolute;
top: 5px;
left: 5px;
}
.video50-player .player-navbar-title {
font-size: 18px;
font-weight: bold;
margin-left: 10px;
text-align: center;
}
.video50-player .flip-container {
width: 100%;
position: absolute;
-webkit-transition: -webkit-transform 1s;
-moz-transition: -moz-transform 1s;
-o-transition: -o-transform 1s;
transition: transform 1s;
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
-o-transform-style: preserve-3d;
transform-style: preserve-3d;
}
.video50-player .flip-container.flipped {
-webkit-transform: rotateY(180deg);
-moz-transform: rotateY(180deg);
-o-transform: rotateY(180deg);
transform: rotateY(180deg);
}
.video50-player .flip-container .video-container, .video50-player .flip-container .flip-question-container {
position: absolute;
display: block;
height: 100%;
width: 100%;
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-o-backface-visibility: hidden;
backface-visibility: hidden;
}
.video50-notifications {
width: 640px;
}
.video50-noficiations-auto {
}
.video50-notifications tbody td {
-webkit-animation:pop-in 0.3s;
-moz-animation:pop-in 0.3s;
-ms-animation:pop-in 0.3s;
}
.video50-question {
background: #fafafa;
border: 1px solid #ddd;
border-radius: 4px;
min-height: 100%;
position: relative;
}
.flip-question-container {
border-top: none;
-webkit-border-bottom-right-radius: 4px;
-webkit-border-bottom-left-radius: 4px;
-moz-border-radius-bottomright: 4px;
-moz-border-radius-bottomleft: 4px;
border-bottom-right-radius: 4px;
border-bottom-left-radius: 4px;
-webkit-transform: rotateY(180deg);
-moz-transform: rotateY(180deg);
-o-transform: rotateY(180deg);
transform: rotateY(180deg);
}
.video50-question label, .video50-notifications label, .video50-transcript label {
display: inline;
margin-left: 5px;
vertical-align: middle;
}
.video50-question .question-content {
padding: 20px;
}
.video50-question .question-choices {
padding: 10px;
}
.video50-question .question-choices .alert {
margin-top: 13px;
margin-bottom: 4px;
}
.video50-question .btn-show-video {
margin-left: 10px;
}
.video50-question .alert {
margin-top: 10px;
}
.video50-question .panel-close {
position: absolute;
right: 10px;
font-size: 30px;
line-height: 30px;
opacity: .2;
}
.video50-question .btn-submit {
clear: both;
display: block;
}
.video50-transcript-lang {
display: inline-block;
vertical-align: middle;
}
.video50-transcript {
border: 1px solid #ccc;
border-radius: 4px;
}
.video50-transcript-container {
height: 360px;
overflow: auto;
border-top: 1px solid #ccc;
width: 640px;
padding: 30px;
}
.video50-transcript-controls-wrapper {
padding: 5px 10px;
}
.video50-transcript-text {
position: relative;
}
.video50-transcript-text a {
color: black;
}
.video50-transcript-text a.highlight {
color: #08C;
font-weight: bold;
}
@-webkit-keyframes pop-in {
0% {
opacity: 0;
-moz-transform: scale(0.5);
-webkit-transform: scale(0.5);
}
100% {
opacity: 1;
-moz-transform: scale(1);
-webkit-transform: scale(1);
}
}
@-moz-keyframes pop-in {
0% {
opacity: 0;
-moz-transform: scale(0.5);
-webkit-transform: scale(0.5);
}
100% {
opacity: 1;
-moz-transform: scale(1);
-webkit-transform: scale(1);
}
}
@-ms-keyframes pop-in {
0% {
opacity: 0;
-moz-transform: scale(0.5);
-webkit-transform: scale(0.5);
}
100% {
opacity: 1;
-moz-transform: scale(1);
-webkit-transform: scale(1);
}
}
@-webkit-keyframes pop-out {
0% {
opacity: 1;
-moz-transform: scale(1);
-webkit-transform: scale(1);
}
100% {
opacity: 0;
-moz-transform: scale(0.5);
-webkit-transform: scale(0.5);
}
}
@-moz-keyframes pop-out {
0% {
opacity: 1;
-moz-transform: scale(1);
-webkit-transform: scale(1);
}
100% {
opacity: 0;
-moz-transform: scale(0.5);
-webkit-transform: scale(0.5);
}
}
@-ms-keyframes pop-out {
0% {
opacity: 1;
-moz-transform: scale(1);
-webkit-transform: scale(1);
}
100% {
opacity: 0;
-moz-transform: scale(0.5);
-webkit-transform: scale(0.5);
}
}
/* TED player */
.mejs-container.mejs-ted {
}
.mejs-ted .mejs-controls {
background: #eee;
height: 65px;
}
.mejs-ted .mejs-button,
.mejs-ted .mejs-time {
position: absolute;
background: #ddd;
}
.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-total {
background-color: none;
background: url(controls-ted.png) repeat-x 0 -52px;
height: 6px;
}
.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-loaded {
background-color: none;
background: url(controls-ted.png) repeat-x 0 -52px;
width: 0;
height: 6px;
}
.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-current {
width: 0;
height: 6px;
background-color: none;
background: url(controls-ted.png) repeat-x 0 -59px;
}
.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-handle {
display: block;
margin: 0;
width: 14px;
height: 21px;
top: -7px;
border: 0;
background: url(controls-ted.png) no-repeat 0 0;
}
.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-float {
display: none;
}
.mejs-ted .mejs-controls .mejs-playpause-button {
top: 29px;
left: 9px;
width: 49px;
height: 28px;
}
.mejs-ted .mejs-controls .mejs-playpause-button button {
width: 49px;
height: 28px;
background: url(controls-ted.png) no-repeat -50px -23px;
margin: 0;
padding: 0;
}
.mejs-ted .mejs-controls .mejs-pause button {
background-position: 0 -23px;
}
.mejs-ted .mejs-controls .mejs-fullscreen-button {
top: 34px;
right: 9px;
width: 17px;
height: 15px;
background : none;
}
.mejs-ted .mejs-controls .mejs-fullscreen-button button {
width: 19px;
height: 17px;
background: transparent url(controls-ted.png) no-repeat 0 -66px;
margin: 0;
padding: 0;
}
.mejs-ted .mejs-controls .mejs-unfullscreen button {
background: transparent url(controls-ted.png) no-repeat -21px -66px;
margin: 0;
padding: 0;
}
.mejs-ted .mejs-controls .mejs-volume-button {
top: 30px;
right: 35px;
width: 24px;
height: 22px;
}
.mejs-ted .mejs-controls .mejs-mute button {
background: url(controls-ted.png) no-repeat -15px 0;
width: 24px;
height: 22px;
margin: 0;
padding: 0;
}
.mejs-ted .mejs-controls .mejs-unmute button {
background: url(controls-ted.png) no-repeat -40px 0;
width: 24px;
height: 22px;
margin: 0;
padding: 0;
}
.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-slider {
background: #fff;
border: solid 1px #aaa;
border-width: 1px 1px 0 1px;
width: 22px;
height: 65px;
top: -65px;
}
.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-total {
background: url(controls-ted.png) repeat-y -41px -66px;
left: 8px;
width: 6px;
height: 50px;
}
.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-current {
left: 8px;
width: 6px;
background: url(controls-ted.png) repeat-y -48px -66px;
height: 50px;
}
.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-handle {
display: none;
}
.mejs-ted .mejs-controls .mejs-time span {
color: #333;
}
.mejs-ted .mejs-controls .mejs-currenttime-container {
position: absolute;
top: 32px;
right: 100px;
border: solid 1px #999;
background: #fff;
color: #333;
padding-top: 2px;
border-radius: 3px;
color: #333;
}
.mejs-ted .mejs-controls .mejs-duration-container {
position: absolute;
top: 32px;
right: 65px;
border: solid 1px #999;
background: #fff;
color: #333;
padding-top: 2px;
border-radius: 3px;
color: #333;
}
.mejs-ted .mejs-controls .mejs-time button{
color: #333;
}
.mejs-ted .mejs-controls .mejs-captions-button {
display: none;
}
/* END: TED player */
/* WMP player */
.mejs-container.mejs-wmp {
}
.mejs-wmp .mejs-controls {
background: transparent url(controls-wmp-bg.png) center 16px no-repeat;
height: 65px;
}
.mejs-wmp .mejs-button,
.mejs-wmp .mejs-time {
position: absolute;
background: transparent;
}
.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-total {
background-color: transparent;
border: solid 1px #ccc;
height: 3px;
}
.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-loaded {
background-color: rgba(255,255,255,0.3);
width: 0;
height: 3px;
}
.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-current {
width: 0;
height: 1px;
background-color: #014CB6;
border: solid 1px #7FC9FA;
border-width: 1px 0;
border-color: #7FC9FA #fff #619FF2 #fff;
}
.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-handle {
display: block;
margin: 0;
width: 16px;
height: 9px;
top: -3px;
border: 0;
background: url(controls-wmp.png) no-repeat 0 -80px;
}
.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-float {
display: none;
}
.mejs-wmp .mejs-controls .mejs-playpause-button {
top: 10px;
left: 50%;
margin: 10px 0 0 -20px;
width: 40px;
height: 40px;
}
.mejs-wmp .mejs-controls .mejs-playpause-button button {
width: 40px;
height: 40px;
background: url(controls-wmp.png) no-repeat 0 0;
margin: 0;
padding: 0;
}
.mejs-wmp .mejs-controls .mejs-pause button {
background-position: 0 -40px;
}
.mejs-wmp .mejs-controls .mejs-currenttime-container {
position: absolute;
top: 25px;
left: 50%;
margin-left: -93px;
}
.mejs-wmp .mejs-controls .mejs-duration-container {
position: absolute;
top: 25px;
left: 50%;
margin-left: -58px;
}
.mejs-wmp .mejs-controls .mejs-volume-button {
top: 32px;
right: 50%;
margin-right: -55px;
width: 20px;
height: 15px;
}
.mejs-wmp .mejs-controls .mejs-volume-button button {
margin: 0;
padding: 0;
background: url(controls-wmp.png) no-repeat -42px -17px;
width: 20px;
height: 15px;
}
.mejs-wmp .mejs-controls .mejs-unmute button {
margin: 0;
padding: 0;
background: url(controls-wmp.png) no-repeat -42px 0;
width: 20px;
height: 15px;
}
.mejs-wmp .mejs-controls .mejs-volume-button .mejs-volume-slider {
background: rgba(102,102,102,0.6);
}
.mejs-wmp .mejs-controls .mejs-fullscreen-button {
top: 32px;
right: 50%;
margin-right: -82px;
width: 15px;
height: 14px;
}
.mejs-wmp .mejs-controls .mejs-fullscreen-button button {
margin: 0;
padding: 0;
background: url(controls-wmp.png) no-repeat -63px 0;
width: 15px;
height: 14px;
}
.mejs-wmp .mejs-controls .mejs-captions-button {
display: none;
}
/* END: WMP player */
.video50-playback-controls ul {
margin: 0px;
margin-bottom: 1px;
text-align: right;
}
.video50-playback-controls li {
float: none;
display: inline-block;
}
.video50-player {
position: relative;
-webkit-perspective: 800px;
-moz-perspective: 800px;
-o-perspective: 800px;
perspective: 800px;
}
.video50-player .player-navbar {
border: 1px solid #ddd;
-webkit-border-top-left-radius: 4px;
-webkit-border-top-right-radius: 4px;
-moz-border-radius-topleft: 4px;
-moz-border-radius-topright: 4px;
border-top-left-radius: 4px;
border-top-right-radius: 4px;
line-height: 36px;
height: 36px;
background-image: -moz-linear-gradient(bottom, #f5f5f5, #ffffff);
background-image: -ms-linear-gradient(bottom, #f5f5f5, #ffffff);
background-image: -webkit-linear-gradient(bottom, #f5f5f5, #ffffff);
background-image: -o-linear-gradient(bottom, #f5f5f5, #ffffff);
background-image: linear-gradient(bottom, #f5f5f5, #ffffff);
}
.video50-player .player-navbar .btn-back {
display: none;
position: absolute;
top: 5px;
left: 5px;
}
.video50-player .player-navbar-title {
font-size: 18px;
font-weight: bold;
margin-left: 10px;
text-align: center;
}
.video50-player .flip-container {
width: 100%;
position: absolute;
-webkit-transition: -webkit-transform 1s;
-moz-transition: -moz-transform 1s;
-o-transition: -o-transform 1s;
transition: transform 1s;
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
-o-transform-style: preserve-3d;
transform-style: preserve-3d;
}
.video50-player .flip-container.flipped {
-webkit-transform: rotateY(180deg);
-moz-transform: rotateY(180deg);
-o-transform: rotateY(180deg);
transform: rotateY(180deg);
}
.video50-player .flip-container .video-container, .video50-player .flip-container .flip-question-container {
position: absolute;
display: block;
height: 100%;
width: 100%;
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-o-backface-visibility: hidden;
backface-visibility: hidden;
}
.video50-notifications-btn {
float: right;
}
.video50-notifications {
width: 640px;
}
.video50-available-questions {
display: inline-block;
line-height: 29px;
vertical-align: middle;
font-size: 16px;
}
.video50-notifications .video50-available-questions-td {
margin: 0px;
padding: 4px 4px 4px 8px;
}
.video50-notifications tbody td {
-webkit-animation:pop-in 0.3s;
-moz-animation:pop-in 0.3s;
-ms-animation:pop-in 0.3s;
}
.video50-question {
background: #fafafa;
border: 1px solid #ddd;
border-radius: 4px;
min-height: 100%;
position: relative;
}
.flip-question-container {
border-top: none;
-webkit-border-bottom-right-radius: 4px;
-webkit-border-bottom-left-radius: 4px;
-moz-border-radius-bottomright: 4px;
-moz-border-radius-bottomleft: 4px;
border-bottom-right-radius: 4px;
border-bottom-left-radius: 4px;
-webkit-transform: rotateY(180deg);
-moz-transform: rotateY(180deg);
-o-transform: rotateY(180deg);
transform: rotateY(180deg);
}
.video50-question label, .video50-notifications label, .video50-transcript label {
display: inline;
margin-left: 5px;
vertical-align: middle;
}
.video50-question .question-content {
padding: 20px;
}
.video50-question .question-choices {
padding: 10px;
}
.video50-question .question-choices .alert {
margin-top: 13px;
margin-bottom: 4px;
}
.video50-question .btn-show-video {
margin-left: 10px;
}
.video50-question .alert {
margin-top: 10px;
}
.video50-question .panel-close {
position: absolute;
right: 10px;
font-size: 30px;
line-height: 30px;
opacity: .2;
}
.video50-question .btn-submit {
clear: both;
display: block;
}
.video50-transcript-lang {
display: inline-block;
vertical-align: middle;
}
.video50-transcript {
border: 1px solid #ccc;
border-radius: 4px;
}
.video50-transcript-container {
height: 360px;
overflow: auto;
border-top: 1px solid #ccc;
width: 640px;
padding: 30px;
}
.video50-transcript-controls-wrapper {
padding: 5px 10px;
text-align: right;
}
.video50-transcript-text {
position: relative;
}
.video50-transcript-text a {
color: black;
}
.video50-transcript-text a.highlight {
color: #08C;
font-weight: bold;
}
@-webkit-keyframes pop-in {
0% {
opacity: 0;
-moz-transform: scale(0.5);
-webkit-transform: scale(0.5);
}
100% {
opacity: 1;
-moz-transform: scale(1);
-webkit-transform: scale(1);
}
}
@-moz-keyframes pop-in {
0% {
opacity: 0;
-moz-transform: scale(0.5);
-webkit-transform: scale(0.5);
}
100% {
opacity: 1;
-moz-transform: scale(1);
-webkit-transform: scale(1);
}
}
@-ms-keyframes pop-in {
0% {
opacity: 0;
-moz-transform: scale(0.5);
-webkit-transform: scale(0.5);
}
100% {
opacity: 1;
-moz-transform: scale(1);
-webkit-transform: scale(1);
}
}
@-webkit-keyframes pop-out {
0% {
opacity: 1;
-moz-transform: scale(1);
-webkit-transform: scale(1);
}
100% {
opacity: 0;
-moz-transform: scale(0.5);
-webkit-transform: scale(0.5);
}
}
@-moz-keyframes pop-out {
0% {
opacity: 1;
-moz-transform: scale(1);
-webkit-transform: scale(1);
}
100% {
opacity: 0;
-moz-transform: scale(0.5);
-webkit-transform: scale(0.5);
}
}
@-ms-keyframes pop-out {
0% {
opacity: 1;
-moz-transform: scale(1);
-webkit-transform: scale(1);
}
100% {
opacity: 0;
-moz-transform: scale(0.5);
-webkit-transform: scale(0.5);
}
}
/* TED player */
.mejs-container.mejs-ted {
}
.mejs-ted .mejs-controls {
background: #eee;
height: 65px;
}
.mejs-ted .mejs-button,
.mejs-ted .mejs-time {
position: absolute;
background: #ddd;
}
.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-total {
background-color: none;
background: url(controls-ted.png) repeat-x 0 -52px;
height: 6px;
}
.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-loaded {
background-color: none;
background: url(controls-ted.png) repeat-x 0 -52px;
width: 0;
height: 6px;
}
.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-current {
width: 0;
height: 6px;
background-color: none;
background: url(controls-ted.png) repeat-x 0 -59px;
}
.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-handle {
display: block;
margin: 0;
width: 14px;
height: 21px;
top: -7px;
border: 0;
background: url(controls-ted.png) no-repeat 0 0;
}
.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-float {
display: none;
}
.mejs-ted .mejs-controls .mejs-playpause-button {
top: 29px;
left: 9px;
width: 49px;
height: 28px;
}
.mejs-ted .mejs-controls .mejs-playpause-button button {
width: 49px;
height: 28px;
background: url(controls-ted.png) no-repeat -50px -23px;
margin: 0;
padding: 0;
}
.mejs-ted .mejs-controls .mejs-pause button {
background-position: 0 -23px;
}
.mejs-ted .mejs-controls .mejs-fullscreen-button {
top: 34px;
right: 9px;
width: 17px;
height: 15px;
background : none;
}
.mejs-ted .mejs-controls .mejs-fullscreen-button button {
width: 19px;
height: 17px;
background: transparent url(controls-ted.png) no-repeat 0 -66px;
margin: 0;
padding: 0;
}
.mejs-ted .mejs-controls .mejs-unfullscreen button {
background: transparent url(controls-ted.png) no-repeat -21px -66px;
margin: 0;
padding: 0;
}
.mejs-ted .mejs-controls .mejs-volume-button {
top: 30px;
right: 35px;
width: 24px;
height: 22px;
}
.mejs-ted .mejs-controls .mejs-mute button {
background: url(controls-ted.png) no-repeat -15px 0;
width: 24px;
height: 22px;
margin: 0;
padding: 0;
}
.mejs-ted .mejs-controls .mejs-unmute button {
background: url(controls-ted.png) no-repeat -40px 0;
width: 24px;
height: 22px;
margin: 0;
padding: 0;
}
.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-slider {
background: #fff;
border: solid 1px #aaa;
border-width: 1px 1px 0 1px;
width: 22px;
height: 65px;
top: -65px;
}
.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-total {
background: url(controls-ted.png) repeat-y -41px -66px;
left: 8px;
width: 6px;
height: 50px;
}
.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-current {
left: 8px;
width: 6px;
background: url(controls-ted.png) repeat-y -48px -66px;
height: 50px;
}
.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-handle {
display: none;
}
.mejs-ted .mejs-controls .mejs-time span {
color: #333;
}
.mejs-ted .mejs-controls .mejs-currenttime-container {
position: absolute;
top: 32px;
right: 100px;
border: solid 1px #999;
background: #fff;
color: #333;
padding-top: 2px;
border-radius: 3px;
color: #333;
}
.mejs-ted .mejs-controls .mejs-duration-container {
position: absolute;
top: 32px;
right: 65px;
border: solid 1px #999;
background: #fff;
color: #333;
padding-top: 2px;
border-radius: 3px;
color: #333;
}
.mejs-ted .mejs-controls .mejs-time button{
color: #333;
}
.mejs-ted .mejs-controls .mejs-captions-button {
display: none;
}
/* END: TED player */
/* WMP player */
.mejs-container.mejs-wmp {
}
.mejs-wmp .mejs-controls {
background: transparent url(controls-wmp-bg.png) center 16px no-repeat;
height: 65px;
}
.mejs-wmp .mejs-button,
.mejs-wmp .mejs-time {
position: absolute;
background: transparent;
}
.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-total {
background-color: transparent;
border: solid 1px #ccc;
height: 3px;
}
.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-loaded {
background-color: rgba(255,255,255,0.3);
width: 0;
height: 3px;
}
.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-current {
width: 0;
height: 1px;
background-color: #014CB6;
border: solid 1px #7FC9FA;
border-width: 1px 0;
border-color: #7FC9FA #fff #619FF2 #fff;
}
.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-handle {
display: block;
margin: 0;
width: 16px;
height: 9px;
top: -3px;
border: 0;
background: url(controls-wmp.png) no-repeat 0 -80px;
}
.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-float {
display: none;
}
.mejs-wmp .mejs-controls .mejs-playpause-button {
top: 10px;
left: 50%;
margin: 10px 0 0 -20px;
width: 40px;
height: 40px;
}
.mejs-wmp .mejs-controls .mejs-playpause-button button {
width: 40px;
height: 40px;
background: url(controls-wmp.png) no-repeat 0 0;
margin: 0;
padding: 0;
}
.mejs-wmp .mejs-controls .mejs-pause button {
background-position: 0 -40px;
}
.mejs-wmp .mejs-controls .mejs-currenttime-container {
position: absolute;
top: 25px;
left: 50%;
margin-left: -93px;
}
.mejs-wmp .mejs-controls .mejs-duration-container {
position: absolute;
top: 25px;
left: 50%;
margin-left: -58px;
}
.mejs-wmp .mejs-controls .mejs-volume-button {
top: 32px;
right: 50%;
margin-right: -55px;
width: 20px;
height: 15px;
}
.mejs-wmp .mejs-controls .mejs-volume-button button {
margin: 0;
padding: 0;
background: url(controls-wmp.png) no-repeat -42px -17px;
width: 20px;
height: 15px;
}
.mejs-wmp .mejs-controls .mejs-unmute button {
margin: 0;
padding: 0;
background: url(controls-wmp.png) no-repeat -42px 0;
width: 20px;
height: 15px;
}
.mejs-wmp .mejs-controls .mejs-volume-button .mejs-volume-slider {
background: rgba(102,102,102,0.6);
}
.mejs-wmp .mejs-controls .mejs-fullscreen-button {
top: 32px;
right: 50%;
margin-right: -82px;
width: 15px;
height: 14px;
}
.mejs-wmp .mejs-controls .mejs-fullscreen-button button {
margin: 0;
padding: 0;
background: url(controls-wmp.png) no-repeat -63px 0;
width: 15px;
height: 14px;
}
.mejs-wmp .mejs-controls .mejs-captions-button {
display: none;
}
/* END: WMP player */
// maintain compatibility with other CS50 libraries
var CS50 = CS50 || {};
CS50.Video.Render = CS50.Video.Render || {};
// question types
CS50.Video.QuestionMode = CS50.Video.Mode || {};
CS50.Video.QuestionMode.FLIP = 'flip';
CS50.Video.QuestionMode.PANEL = 'panel';
/**
* Renderer for a multiple choice question
*
* @param container Container for question to be rendered within
* @param data Question data
* @param callback Response callback
* @return Input element user types into
*
*/
CS50.Video.Render.FreeResponse = function(container, data, callback) {
// render question and input area placeholder
var $container = $(container);
$container.append('<h2>' + data.question + '</h2>');
var $placeholder = $('<input type="text" class="txt-answer-location" />');
$container.append($placeholder);
// create input area that is absolutely positioned to avoid transform weirdness
var $input = $('<input type="text" class="video50-txt-answer" />');
setTimeout(function() {
var offset = $placeholder.offset();
$input.css({ position: 'absolute', 'top': offset.top + 'px', 'left': offset.left + 'px', 'z-index': 999 });
$('body').append($input);
$placeholder.css({ visibility: 'hidden' });
}, 1000);
// create submit button, hidden by default
var $submit = $('<button class="btn btn-submit">Submit Response</button>').hide();
$container.append($submit);
// when submit button is pressed, check the answer
$container.on('click', '.btn-submit', function(e) {
// remove previous messages from the container
var $container = $(this).parents('.question-content');
$container.find('.alert').remove();
// a correct answer matches the supplied regex
if ($input.val().match(data.answer))
var $message = $('<div class="alert alert-success"><strong>Correct!</strong></div>');
else
var $message = $('<div class="alert alert-error">That\'s not the right answer, <strong>try again!</strong></div>');
// display message
$message.hide().appendTo($container).fadeIn('fast');
e.preventDefault();
return false;
});
// when answer is selected, make sure submit button is shown
$('body').on('keyup', '.video50-txt-answer', function() {
var $submit = $container.find('.btn-submit');
// toggle submit button based on input state
if ($input.val().match(/^\s*$/) && $submit.is(':visible'))
$submit.fadeOut('fast');
else if (!$submit.is(':visible'))
$submit.fadeIn('fast');
});
return $input;
};
/**
* Renderer for a multiple choice question
*
* @param container Container for question to be rendered within
* @param data Question data
* @param callback Response callback
*
*/
CS50.Video.Render.MultipleChoice = function(container, data, callback) {
// render question title
var $container = $(container);
$container.append('<h2>' + data.question + '</h2>');
// display each choice
$choices = $('<div class="question-choices">');
_.each(data.choices, function(e, i) {
$choices.append('<input id="' + i + '" type="radio" name="question" value="' + i + '" />' +
'<label for="' + i + '">' + e + '</label><br />');
});
// create submit button, hidden by default
var $submit = $('<button class="btn btn-submit">Submit Response</button>').hide();
// add display questions
$container.append($choices);
$container.append($submit);
// when submit button is pressed, check the answer
$container.on('click', '.btn-submit', function(e) {
// remove previous messages from the container
var $container = $(this).parents('.question-content');
$container.find('.alert').remove();
// the index of the selected answer must match the correct answer
if (data.answer == $container.find('input[type=radio]:checked').val())
var $message = $('<div class="alert alert-success"><strong>Correct!</strong></div>');
else
var $message = $('<div class="alert alert-error">That\'s not the right answer, <strong>try again!</strong></div>');
// display message
$message.hide().appendTo($container).fadeIn('fast');
e.preventDefault();
return false;
});
// when answer is selected, make sure submit button is show
$container.on('click', '.question-choices input[type=radio]', function() {
$submit = $container.find('.btn-submit');
if (!$submit.is(':visible')) {
$submit.fadeIn('fast');
}
});
};
/**
* Renderer for a question with a numeric answer
*
* @param container Container for question to be rendered within
* @param data Question data
* @param callback Response callback
*
*/
CS50.Video.Render.Numeric = function(container, data, callback) {
// if no tolerance given, then assume exact answer
data.tolerance = (data.tolerance === undefined) ? 1 : data.tolerance;
// render free response
var $input = CS50.Video.Render.FreeResponse(container, data, callback);
// swap out event handler
var $container = $(container);
$container.off('click', '.btn-submit');
// when submit is pressed, check answer
$container.on('click', '.btn-submit', function(e) {
var val = parseFloat($input.val());
// a correct answer is within the bounds established by the tolerance
if (isNaN(val))
var $message = $('<div class="alert alert-error">The answer must be a number, <strong>try again!</strong></div>');
else if (val <= data.answer + data.answer * data.tolerance && val >= data.answer - data.answer * data.tolerance)
var $message = $('<div class="alert alert-success"><strong>Correct!</strong></div>');
else
var $message = $('<div class="alert alert-error">That\'s not the right answer, <strong>try again!</strong></div>');
// display message
$container.find('.alert').remove();
$message.hide().appendTo($container).fadeIn('fast');
e.preventDefault();
return false;
});
};
/**
* Renderer for a true/false question
*
* @param container Container for question to be rendered within
* @param data Question data
* @param callback Response callback
*
*/
CS50.Video.Render.TrueFalse = function(container, data, callback) {
// true/false is really just multiple choice
CS50.Video.Render.MultipleChoice(container, {
answer: !data.answer,
choices: ['True', 'False'],
id: data.id,
mode: data.mode,
question: data.question,
tags: data.tags,
}, callback);
};
// http://james.padolsey.com/javascript/special-scroll-events-for-jquery/
(function(){
var special = jQuery.event.special,
uid1 = 'D' + (+new Date()),
uid2 = 'D' + (+new Date() + 1);
special.scrollstart = {
setup: function() {
var timer,
handler = function(evt) {
var _self = this,
_args = arguments;
if (timer) {
clearTimeout(timer);
} else {
evt.type = 'scrollstart';
jQuery.event.handle.apply(_self, _args);
}
timer = setTimeout( function(){
timer = null;
}, special.scrollstop.latency);
};
jQuery(this).bind('scroll', handler).data(uid1, handler);
},
teardown: function(){
jQuery(this).unbind( 'scroll', jQuery(this).data(uid1) );
}
};
special.scrollstop = {
latency: 300,
setup: function() {
var timer,
handler = function(evt) {
var _self = this,
_args = arguments;
if (timer) {
clearTimeout(timer);
}
timer = setTimeout( function(){
timer = null;
evt.type = 'scrollstop';
jQuery.event.handle.apply(_self, _args);
}, special.scrollstop.latency);
};
jQuery(this).bind('scroll', handler).data(uid2, handler);
},
teardown: function() {
jQuery(this).unbind( 'scroll', jQuery(this).data(uid2) );
}
};
})();
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
/*!
/*!
* jQuery Cookie Plugin
* https://github.com/carhartl/jquery-cookie
*
* Copyright 2011, Klaus Hartl
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://www.opensource.org/licenses/mit-license.php
* http://www.opensource.org/licenses/GPL-2.0
*/
(function($) {
$.cookie = function(key, value, options) {
// key and at least value given, set cookie...
if (arguments.length > 1 && (!/Object/.test(Object.prototype.toString.call(value)) || value === null || value === undefined)) {
options = $.extend({}, options);
if (value === null || value === undefined) {
options.expires = -1;
}
if (typeof options.expires === 'number') {
var days = options.expires, t = options.expires = new Date();
t.setDate(t.getDate() + days);
}
value = String(value);
return (document.cookie = [
encodeURIComponent(key), '=', options.raw ? value : encodeURIComponent(value),
options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
options.path ? '; path=' + options.path : '',
options.domain ? '; domain=' + options.domain : '',
options.secure ? '; secure' : ''
].join(''));
}
// key and possibly options given, get cookie...
options = value || {};
var decode = options.raw ? function(s) { return s; } : decodeURIComponent;
var pairs = document.cookie.split('; ');
for (var i = 0, pair; pair = pairs[i] && pairs[i].split('='); i++) {
if (decode(pair[0]) === key) return decode(pair[1] || ''); // IE saves cookies with empty string as "c; ", e.g. without "=" as opposed to EOMB, thus pair[1] may be undefined
}
return null;
};
})(jQuery);
(function(a){a.fn.extend({leanModal:function(c){function g(d){a("#lean_overlay").fadeOut(200);a(d).css({display:"none"})}var e=a("#lean_overlay");0==e.length&&(e=a("<div id='lean_overlay'></div>"),a("body").append(e));c=a.extend({top:100,overlay:0.5,closeButton:".modal_close"},c);return this.each(function(){var d=c;a(this).click(function(c){var b=a(this).attr("href");a(".leanModal_box").css({display:"none"});a("body").append(e);a(".leanModal_box").append('<a class="modal_close" href="#">&#10006;</a>');
(function(a){a.fn.extend({leanModal:function(c){function g(d){a("#lean_overlay").fadeOut(200);a(d).css({display:"none"})}var e=a("#lean_overlay");0==e.length&&(e=a("<div id='lean_overlay'></div>"),a("body").append(e));c=a.extend({top:100,overlay:0.5,closeButton:".modal_close"},c);return this.each(function(){var d=c;a(this).click(function(c){var b=a(this).attr("href");a(".leanModal_box").css({display:"none"});a("body").append(e);a(".leanModal_box").append('<a class="modal_close" href="#">&#10006;</a>');
a("#lean_overlay").click(function(){g(b)});a(d.closeButton).click(function(){g(b)});a(b).outerHeight();var f=a(b).outerWidth();a("#lean_overlay").css({display:"block",opacity:0});a("#lean_overlay").fadeTo(200,d.overlay);a(b).css({display:"block",position:"fixed",opacity:0,"z-index":11E3,left:"50%","margin-left":-(f/2)+"px",top:d.top+"px"});f=a(b).offset().top+"px";a(b).css({position:"absolute",top:f});a(b).fadeTo(200,1);c.preventDefault()})})}})})(jQuery);
\ No newline at end of file
.treeview, .treeview ul {
.treeview, .treeview ul {
padding: 0;
margin: 0;
list-style: none;
}
.treeview ul {
background-color: white;
margin-top: 4px;
}
.treeview .hitarea {
background: url(images/treeview-default.gif) -64px -25px no-repeat;
height: 16px;
width: 16px;
margin-left: -16px;
float: left;
cursor: pointer;
}
/* fix for IE6 */
* html .hitarea {
display: inline;
float:none;
}
.treeview li {
margin: 0;
padding: 3px 0pt 3px 16px;
}
.treeview a.selected {
background-color: #eee;
}
#treecontrol { margin: 1em 0; display: none; }
.treeview .hover { color: red; cursor: pointer; }
.treeview li { background: url(images/treeview-default-line.gif) 0 0 no-repeat; }
.treeview li.collapsable, .treeview li.expandable { background-position: 0 -176px; }
.treeview .expandable-hitarea { background-position: -80px -3px; }
.treeview li.last { background-position: 0 -1766px }
.treeview li.lastCollapsable, .treeview li.lastExpandable { background-image: url(images/treeview-default.gif); }
.treeview li.lastCollapsable { background-position: 0 -111px }
.treeview li.lastExpandable { background-position: -32px -67px }
.treeview div.lastCollapsable-hitarea, .treeview div.lastExpandable-hitarea { background-position: 0; }
.treeview-red li { background-image: url(images/treeview-red-line.gif); }
.treeview-red .hitarea, .treeview-red li.lastCollapsable, .treeview-red li.lastExpandable { background-image: url(images/treeview-red.gif); }
.treeview-black li { background-image: url(images/treeview-black-line.gif); }
.treeview-black .hitarea, .treeview-black li.lastCollapsable, .treeview-black li.lastExpandable { background-image: url(images/treeview-black.gif); }
.treeview-gray li { background-image: url(images/treeview-gray-line.gif); }
.treeview-gray .hitarea, .treeview-gray li.lastCollapsable, .treeview-gray li.lastExpandable { background-image: url(images/treeview-gray.gif); }
.treeview-famfamfam li { background-image: url(images/treeview-famfamfam-line.gif); }
.treeview-famfamfam .hitarea, .treeview-famfamfam li.lastCollapsable, .treeview-famfamfam li.lastExpandable { background-image: url(images/treeview-famfamfam.gif); }
.treeview .placeholder {
background: url(images/ajax-loader.gif) 0 0 no-repeat;
height: 16px;
width: 16px;
display: block;
}
.filetree li { padding: 3px 0 2px 16px; }
.filetree span.folder, .filetree span.file { padding: 1px 0 1px 16px; display: block; }
.filetree span.folder { background: url(images/folder.gif) 0 0 no-repeat; }
.filetree li.expandable span.folder { background: url(images/folder-closed.gif) 0 0 no-repeat; }
.filetree span.file { background: url(images/file.gif) 0 0 no-repeat; }
/*
/*
* Treeview 1.4.1 - jQuery plugin to hide and show branches of a tree
*
* http://bassistance.de/jquery-plugins/jquery-plugin-treeview/
* http://docs.jquery.com/Plugins/Treeview
*
* Copyright (c) 2007 Jörn Zaefferer
*
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
* Revision: $Id: jquery.treeview.js 5759 2008-07-01 07:50:28Z joern.zaefferer $
*
*/
;(function($) {
// TODO rewrite as a widget, removing all the extra plugins
$.extend($.fn, {
swapClass: function(c1, c2) {
var c1Elements = this.filter('.' + c1);
this.filter('.' + c2).removeClass(c2).addClass(c1);
c1Elements.removeClass(c1).addClass(c2);
return this;
},
replaceClass: function(c1, c2) {
return this.filter('.' + c1).removeClass(c1).addClass(c2).end();
},
hoverClass: function(className) {
className = className || "hover";
return this.hover(function() {
$(this).addClass(className);
}, function() {
$(this).removeClass(className);
});
},
heightToggle: function(animated, callback) {
animated ?
this.animate({ height: "toggle" }, animated, callback) :
this.each(function(){
jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();
if(callback)
callback.apply(this, arguments);
});
},
heightHide: function(animated, callback) {
if (animated) {
this.animate({ height: "hide" }, animated, callback);
} else {
this.hide();
if (callback)
this.each(callback);
}
},
prepareBranches: function(settings) {
if (!settings.prerendered) {
// mark last tree items
this.filter(":last-child:not(ul)").addClass(CLASSES.last);
// collapse whole tree, or only those marked as closed, anyway except those marked as open
this.filter((settings.collapsed ? "" : "." + CLASSES.closed) + ":not(." + CLASSES.open + ")").find(">ul").hide();
}
// return all items with sublists
return this.filter(":has(>ul)");
},
applyClasses: function(settings, toggler) {
// TODO use event delegation
this.filter(":has(>ul):not(:has(>a))").find(">span").unbind("click.treeview").bind("click.treeview", function(event) {
// don't handle click events on children, eg. checkboxes
if ( this == event.target )
toggler.apply($(this).next());
}).add( $("a", this) ).hoverClass();
if (!settings.prerendered) {
// handle closed ones first
this.filter(":has(>ul:hidden)")
.addClass(CLASSES.expandable)
.replaceClass(CLASSES.last, CLASSES.lastExpandable);
// handle open ones
this.not(":has(>ul:hidden)")
.addClass(CLASSES.collapsable)
.replaceClass(CLASSES.last, CLASSES.lastCollapsable);
// create hitarea if not present
var hitarea = this.find("div." + CLASSES.hitarea);
if (!hitarea.length)
hitarea = this.prepend("<div class=\"" + CLASSES.hitarea + "\"/>").find("div." + CLASSES.hitarea);
hitarea.removeClass().addClass(CLASSES.hitarea).each(function() {
var classes = "";
$.each($(this).parent().attr("class").split(" "), function() {
classes += this + "-hitarea ";
});
$(this).addClass( classes );
})
}
// apply event to hitarea
this.find("div." + CLASSES.hitarea).click( toggler );
},
treeview: function(settings) {
settings = $.extend({
cookieId: "treeview"
}, settings);
if ( settings.toggle ) {
var callback = settings.toggle;
settings.toggle = function() {
return callback.apply($(this).parent()[0], arguments);
};
}
// factory for treecontroller
function treeController(tree, control) {
// factory for click handlers
function handler(filter) {
return function() {
// reuse toggle event handler, applying the elements to toggle
// start searching for all hitareas
toggler.apply( $("div." + CLASSES.hitarea, tree).filter(function() {
// for plain toggle, no filter is provided, otherwise we need to check the parent element
return filter ? $(this).parent("." + filter).length : true;
}) );
return false;
};
}
// click on first element to collapse tree
$("a:eq(0)", control).click( handler(CLASSES.collapsable) );
// click on second to expand tree
$("a:eq(1)", control).click( handler(CLASSES.expandable) );
// click on third to toggle tree
$("a:eq(2)", control).click( handler() );
}
// handle toggle event
function toggler() {
$(this)
.parent()
// swap classes for hitarea
.find(">.hitarea")
.swapClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea )
.swapClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea )
.end()
// swap classes for parent li
.swapClass( CLASSES.collapsable, CLASSES.expandable )
.swapClass( CLASSES.lastCollapsable, CLASSES.lastExpandable )
// find child lists
.find( ">ul" )
// toggle them
.heightToggle( settings.animated, settings.toggle );
if ( settings.unique ) {
$(this).parent()
.siblings()
// swap classes for hitarea
.find(">.hitarea")
.replaceClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea )
.replaceClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea )
.end()
.replaceClass( CLASSES.collapsable, CLASSES.expandable )
.replaceClass( CLASSES.lastCollapsable, CLASSES.lastExpandable )
.find( ">ul" )
.heightHide( settings.animated, settings.toggle );
}
}
this.data("toggler", toggler);
function serialize() {
function binary(arg) {
return arg ? 1 : 0;
}
var data = [];
branches.each(function(i, e) {
data[i] = $(e).is(":has(>ul:visible)") ? 1 : 0;
});
$.cookie(settings.cookieId, data.join(""), settings.cookieOptions );
}
function deserialize() {
var stored = $.cookie(settings.cookieId);
if ( stored ) {
var data = stored.split("");
branches.each(function(i, e) {
$(e).find(">ul")[ parseInt(data[i]) ? "show" : "hide" ]();
});
}
}
// add treeview class to activate styles
this.addClass("treeview");
// prepare branches and find all tree items with child lists
var branches = this.find("li").prepareBranches(settings);
switch(settings.persist) {
case "cookie":
var toggleCallback = settings.toggle;
settings.toggle = function() {
serialize();
if (toggleCallback) {
toggleCallback.apply(this, arguments);
}
};
deserialize();
break;
case "location":
var current = this.find("a").filter(function() {
return this.href.toLowerCase() == location.href.toLowerCase();
});
if ( current.length ) {
// TODO update the open/closed classes
var items = current.addClass("selected").parents("ul, li").add( current.next() ).show();
if (settings.prerendered) {
// if prerendered is on, replicate the basic class swapping
items.filter("li")
.swapClass( CLASSES.collapsable, CLASSES.expandable )
.swapClass( CLASSES.lastCollapsable, CLASSES.lastExpandable )
.find(">.hitarea")
.swapClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea )
.swapClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea );
}
}
break;
}
branches.applyClasses(settings, toggler);
// if control option is set, create the treecontroller and show it
if ( settings.control ) {
treeController(this, settings.control);
$(settings.control).show();
}
return this;
}
});
// classes used by the plugin
// need to be styled via external stylesheet, see first example
$.treeview = {};
var CLASSES = ($.treeview.classes = {
open: "open",
closed: "closed",
expandable: "expandable",
expandableHitarea: "expandable-hitarea",
lastExpandableHitarea: "lastExpandable-hitarea",
collapsable: "collapsable",
collapsableHitarea: "collapsable-hitarea",
lastCollapsableHitarea: "lastCollapsable-hitarea",
lastCollapsable: "lastCollapsable",
lastExpandable: "lastExpandable",
last: "last",
hitarea: "hitarea"
});
})(jQuery);
\ No newline at end of file
/*
/*
* jQuery UI Touch Punch 0.2.2
*
* Copyright 2011, Dave Furfero
* Dual licensed under the MIT or GPL Version 2 licenses.
*
* Depends:
* jquery.ui.widget.js
* jquery.ui.mouse.js
*/
(function(b){b.support.touch="ontouchend" in document;if(!b.support.touch){return;}var c=b.ui.mouse.prototype,e=c._mouseInit,a;function d(g,h){if(g.originalEvent.touches.length>1){return;}g.preventDefault();var i=g.originalEvent.changedTouches[0],f=document.createEvent("MouseEvents");f.initMouseEvent(h,true,true,window,1,i.screenX,i.screenY,i.clientX,i.clientY,false,false,false,false,0,null);g.target.dispatchEvent(f);}c._touchStart=function(g){var f=this;if(a||!f._mouseCapture(g.originalEvent.changedTouches[0])){return;}a=true;f._touchMoved=false;d(g,"mouseover");d(g,"mousemove");d(g,"mousedown");};c._touchMove=function(f){if(!a){return;}this._touchMoved=true;d(f,"mousemove");};c._touchEnd=function(f){if(!a){return;}d(f,"mouseup");d(f,"mouseout");if(!this._touchMoved){d(f,"click");}a=false;};c._mouseInit=function(){var f=this;f.element.bind("touchstart",b.proxy(f,"_touchStart")).bind("touchmove",b.proxy(f,"_touchMove")).bind("touchend",b.proxy(f,"_touchEnd"));e.call(f);};})(jQuery);
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
.video50-playback-controls ul {
margin: 0px;
}
.video50-player {
position: relative;
-webkit-perspective: 800px;
-moz-perspective: 800px;
-o-perspective: 800px;
perspective: 800px;
}
.video50-player .player-navbar {
border: 1px solid #ddd;
-webkit-border-top-left-radius: 4px;
-webkit-border-top-right-radius: 4px;
-moz-border-radius-topleft: 4px;
-moz-border-radius-topright: 4px;
border-top-left-radius: 4px;
border-top-right-radius: 4px;
line-height: 36px;
height: 36px;
background-image: -moz-linear-gradient(bottom, #f5f5f5, #ffffff);
background-image: -ms-linear-gradient(bottom, #f5f5f5, #ffffff);
background-image: -webkit-linear-gradient(bottom, #f5f5f5, #ffffff);
background-image: -o-linear-gradient(bottom, #f5f5f5, #ffffff);
background-image: linear-gradient(bottom, #f5f5f5, #ffffff);
}
.video50-player .player-navbar .btn-back {
display: none;
position: absolute;
top: 5px;
left: 5px;
}
.video50-player .player-navbar-title {
font-size: 18px;
font-weight: bold;
margin-left: 10px;
text-align: center;
}
.video50-player .flip-container {
width: 100%;
position: absolute;
-webkit-transition: -webkit-transform 1s;
-moz-transition: -moz-transform 1s;
-o-transition: -o-transform 1s;
transition: transform 1s;
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
-o-transform-style: preserve-3d;
transform-style: preserve-3d;
}
.video50-player .flip-container.flipped {
-webkit-transform: rotateY(180deg);
-moz-transform: rotateY(180deg);
-o-transform: rotateY(180deg);
transform: rotateY(180deg);
}
.video50-player .flip-container .video-container, .video50-player .flip-container .flip-question-container {
position: absolute;
display: block;
height: 100%;
width: 100%;
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-o-backface-visibility: hidden;
backface-visibility: hidden;
}
.video50-notifications tbody td {
-webkit-animation:pop-in 0.3s;
-moz-animation:pop-in 0.3s;
-ms-animation:pop-in 0.3s;
}
.video50-question {
background: #fafafa;
border: 1px solid #ddd;
border-radius: 4px;
min-height: 100%;
position: relative;
}
.flip-question-container {
border-top: none;
-webkit-border-bottom-right-radius: 4px;
-webkit-border-bottom-left-radius: 4px;
-moz-border-radius-bottomright: 4px;
-moz-border-radius-bottomleft: 4px;
border-bottom-right-radius: 4px;
border-bottom-left-radius: 4px;
-webkit-transform: rotateY(180deg);
-moz-transform: rotateY(180deg);
-o-transform: rotateY(180deg);
transform: rotateY(180deg);
}
.video50-question label, .video50-notifications label, .video50-transcript label {
display: inline;
margin-left: 5px;
vertical-align: middle;
}
.video50-question .question-content {
padding: 20px;
}
.video50-question .question-choices {
padding: 10px;
}
.video50-question .question-choices .alert {
margin-top: 13px;
margin-bottom: 4px;
}
.video50-question .btn-show-video {
margin-left: 10px;
}
.video50-question .alert {
margin-top: 10px;
}
.video50-question .panel-close {
position: absolute;
right: 10px;
font-size: 30px;
line-height: 30px;
opacity: .2;
}
.video50-question .btn-submit {
clear: both;
display: block;
}
.video50-transcript-lang {
display: inline-block;
vertical-align: middle;
}
.video50-transcript {
border: 1px solid #ccc;
border-radius: 4px;
}
.video50-transcript-container {
height: 360px;
overflow: auto;
border-top: 1px solid #ccc;
width: 640px;
padding: 30px;
}
.video50-transcript-controls-wrapper {
padding: 5px 10px;
}
.video50-transcript-text {
position: relative;
}
.video50-transcript-text a {
color: black;
}
.video50-transcript-text a.highlight {
color: #08C;
font-weight: bold;
}
@-webkit-keyframes pop-in {
0% {
opacity: 0;
-moz-transform: scale(0.5);
-webkit-transform: scale(0.5);
}
100% {
opacity: 1;
-moz-transform: scale(1);
-webkit-transform: scale(1);
}
}
@-moz-keyframes pop-in {
0% {
opacity: 0;
-moz-transform: scale(0.5);
-webkit-transform: scale(0.5);
}
100% {
opacity: 1;
-moz-transform: scale(1);
-webkit-transform: scale(1);
}
}
@-ms-keyframes pop-in {
0% {
opacity: 0;
-moz-transform: scale(0.5);
-webkit-transform: scale(0.5);
}
100% {
opacity: 1;
-moz-transform: scale(1);
-webkit-transform: scale(1);
}
}
@-webkit-keyframes pop-out {
0% {
opacity: 1;
-moz-transform: scale(1);
-webkit-transform: scale(1);
}
100% {
opacity: 0;
-moz-transform: scale(0.5);
-webkit-transform: scale(0.5);
}
}
@-moz-keyframes pop-out {
0% {
opacity: 1;
-moz-transform: scale(1);
-webkit-transform: scale(1);
}
100% {
opacity: 0;
-moz-transform: scale(0.5);
-webkit-transform: scale(0.5);
}
}
@-ms-keyframes pop-out {
0% {
opacity: 1;
-moz-transform: scale(1);
-webkit-transform: scale(1);
}
100% {
opacity: 0;
-moz-transform: scale(0.5);
-webkit-transform: scale(0.5);
}
}
/* TED player */
.mejs-container.mejs-ted {
}
.mejs-ted .mejs-controls {
background: #eee;
height: 65px;
}
.mejs-ted .mejs-button,
.mejs-ted .mejs-time {
position: absolute;
background: #ddd;
}
.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-total {
background-color: none;
background: url(controls-ted.png) repeat-x 0 -52px;
height: 6px;
}
.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-loaded {
background-color: none;
background: url(controls-ted.png) repeat-x 0 -52px;
width: 0;
height: 6px;
}
.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-current {
width: 0;
height: 6px;
background-color: none;
background: url(controls-ted.png) repeat-x 0 -59px;
}
.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-handle {
display: block;
margin: 0;
width: 14px;
height: 21px;
top: -7px;
border: 0;
background: url(controls-ted.png) no-repeat 0 0;
}
.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-float {
display: none;
}
.mejs-ted .mejs-controls .mejs-playpause-button {
top: 29px;
left: 9px;
width: 49px;
height: 28px;
}
.mejs-ted .mejs-controls .mejs-playpause-button button {
width: 49px;
height: 28px;
background: url(controls-ted.png) no-repeat -50px -23px;
margin: 0;
padding: 0;
}
.mejs-ted .mejs-controls .mejs-pause button {
background-position: 0 -23px;
}
.mejs-ted .mejs-controls .mejs-fullscreen-button {
top: 34px;
right: 9px;
width: 17px;
height: 15px;
background : none;
}
.mejs-ted .mejs-controls .mejs-fullscreen-button button {
width: 19px;
height: 17px;
background: transparent url(controls-ted.png) no-repeat 0 -66px;
margin: 0;
padding: 0;
}
.mejs-ted .mejs-controls .mejs-unfullscreen button {
background: transparent url(controls-ted.png) no-repeat -21px -66px;
margin: 0;
padding: 0;
}
.mejs-ted .mejs-controls .mejs-volume-button {
top: 30px;
right: 35px;
width: 24px;
height: 22px;
}
.mejs-ted .mejs-controls .mejs-mute button {
background: url(controls-ted.png) no-repeat -15px 0;
width: 24px;
height: 22px;
margin: 0;
padding: 0;
}
.mejs-ted .mejs-controls .mejs-unmute button {
background: url(controls-ted.png) no-repeat -40px 0;
width: 24px;
height: 22px;
margin: 0;
padding: 0;
}
.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-slider {
background: #fff;
border: solid 1px #aaa;
border-width: 1px 1px 0 1px;
width: 22px;
height: 65px;
top: -65px;
}
.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-total {
background: url(controls-ted.png) repeat-y -41px -66px;
left: 8px;
width: 6px;
height: 50px;
}
.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-current {
left: 8px;
width: 6px;
background: url(controls-ted.png) repeat-y -48px -66px;
height: 50px;
}
.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-handle {
display: none;
}
.mejs-ted .mejs-controls .mejs-time span {
color: #333;
}
.mejs-ted .mejs-controls .mejs-currenttime-container {
position: absolute;
top: 32px;
right: 100px;
border: solid 1px #999;
background: #fff;
color: #333;
padding-top: 2px;
border-radius: 3px;
color: #333;
}
.mejs-ted .mejs-controls .mejs-duration-container {
position: absolute;
top: 32px;
right: 65px;
border: solid 1px #999;
background: #fff;
color: #333;
padding-top: 2px;
border-radius: 3px;
color: #333;
}
.mejs-ted .mejs-controls .mejs-time button{
color: #333;
}
.mejs-ted .mejs-controls .mejs-captions-button {
display: none;
}
/* END: TED player */
/* WMP player */
.mejs-container.mejs-wmp {
}
.mejs-wmp .mejs-controls {
background: transparent url(controls-wmp-bg.png) center 16px no-repeat;
height: 65px;
}
.mejs-wmp .mejs-button,
.mejs-wmp .mejs-time {
position: absolute;
background: transparent;
}
.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-total {
background-color: transparent;
border: solid 1px #ccc;
height: 3px;
}
.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-loaded {
background-color: rgba(255,255,255,0.3);
width: 0;
height: 3px;
}
.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-current {
width: 0;
height: 1px;
background-color: #014CB6;
border: solid 1px #7FC9FA;
border-width: 1px 0;
border-color: #7FC9FA #fff #619FF2 #fff;
}
.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-handle {
display: block;
margin: 0;
width: 16px;
height: 9px;
top: -3px;
border: 0;
background: url(controls-wmp.png) no-repeat 0 -80px;
}
.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-float {
display: none;
}
.mejs-wmp .mejs-controls .mejs-playpause-button {
top: 10px;
left: 50%;
margin: 10px 0 0 -20px;
width: 40px;
height: 40px;
}
.mejs-wmp .mejs-controls .mejs-playpause-button button {
width: 40px;
height: 40px;
background: url(controls-wmp.png) no-repeat 0 0;
margin: 0;
padding: 0;
}
.mejs-wmp .mejs-controls .mejs-pause button {
background-position: 0 -40px;
}
.mejs-wmp .mejs-controls .mejs-currenttime-container {
position: absolute;
top: 25px;
left: 50%;
margin-left: -93px;
}
.mejs-wmp .mejs-controls .mejs-duration-container {
position: absolute;
top: 25px;
left: 50%;
margin-left: -58px;
}
.mejs-wmp .mejs-controls .mejs-volume-button {
top: 32px;
right: 50%;
margin-right: -55px;
width: 20px;
height: 15px;
}
.mejs-wmp .mejs-controls .mejs-volume-button button {
margin: 0;
padding: 0;
background: url(controls-wmp.png) no-repeat -42px -17px;
width: 20px;
height: 15px;
}
.mejs-wmp .mejs-controls .mejs-unmute button {
margin: 0;
padding: 0;
background: url(controls-wmp.png) no-repeat -42px 0;
width: 20px;
height: 15px;
}
.mejs-wmp .mejs-controls .mejs-volume-button .mejs-volume-slider {
background: rgba(102,102,102,0.6);
}
.mejs-wmp .mejs-controls .mejs-fullscreen-button {
top: 32px;
right: 50%;
margin-right: -82px;
width: 15px;
height: 14px;
}
.mejs-wmp .mejs-controls .mejs-fullscreen-button button {
margin: 0;
padding: 0;
background: url(controls-wmp.png) no-repeat -63px 0;
width: 15px;
height: 14px;
}
.mejs-wmp .mejs-controls .mejs-captions-button {
display: none;
}
/* END: WMP player */
// maintain compatibility with other CS50 libraries
var CS50 = CS50 || {};
CS50.Video.Render = CS50.Video.Render || {};
// question types
CS50.Video.QuestionMode = CS50.Video.Mode || {};
CS50.Video.QuestionMode.FLIP = 'flip';
CS50.Video.QuestionMode.PANEL = 'panel';
/**
* Renderer for a multiple choice question
*
* @param container Container for question to be rendered within
* @param data Question data
* @param callback Response callback
* @return Input element user types into
*
*/
CS50.Video.Render.FreeResponse = function(container, data, callback) {
// render question and input area placeholder
var $container = $(container);
$container.append('<h2>' + data.question + '</h2>');
var $placeholder = $('<input type="text" class="txt-answer-location" />');
$container.append($placeholder);
// create input area that is absolutely positioned to avoid transform weirdness
var $input = $('<input type="text" class="video50-txt-answer" />');
setTimeout(function() {
var offset = $placeholder.offset();
$input.css({ position: 'absolute', 'top': offset.top + 'px', 'left': offset.left + 'px', 'z-index': 999 });
$('body').append($input);
$placeholder.css({ visibility: 'hidden' });
}, 1000);
// create submit button, hidden by default
var $submit = $('<button class="btn btn-submit">Submit Response</button>').hide();
$container.append($submit);
// when submit button is pressed, check the answer
$container.on('click', '.btn-submit', function(e) {
// remove previous messages from the container
var $container = $(this).parents('.question-content');
$container.find('.alert').remove();
// a correct answer matches the supplied regex
if ($input.val().match(data.answer))
var $message = $('<div class="alert alert-success"><strong>Correct!</strong></div>');
else
var $message = $('<div class="alert alert-error">That\'s not the right answer, <strong>try again!</strong></div>');
// display message
$message.hide().appendTo($container).fadeIn('fast');
e.preventDefault();
return false;
});
// when answer is selected, make sure submit button is shown
$('body').on('keyup', '.video50-txt-answer', function() {
var $submit = $container.find('.btn-submit');
// toggle submit button based on input state
if ($input.val().match(/^\s*$/) && $submit.is(':visible'))
$submit.fadeOut('fast');
else if (!$submit.is(':visible'))
$submit.fadeIn('fast');
});
return $input;
};
/**
* Renderer for a multiple choice question
*
* @param container Container for question to be rendered within
* @param data Question data
* @param callback Response callback
*
*/
CS50.Video.Render.MultipleChoice = function(container, data, callback) {
// render question title
var $container = $(container);
$container.append('<h2>' + data.question + '</h2>');
// display each choice
$choices = $('<div class="question-choices">');
_.each(data.choices, function(e, i) {
$choices.append('<input id="' + i + '" type="radio" name="question" value="' + i + '" />' +
'<label for="' + i + '">' + e + '</label><br />');
});
// create submit button, hidden by default
var $submit = $('<button class="btn btn-submit">Submit Response</button>').hide();
// add display questions
$container.append($choices);
$container.append($submit);
// when submit button is pressed, check the answer
$container.on('click', '.btn-submit', function(e) {
// remove previous messages from the container
var $container = $(this).parents('.question-content');
$container.find('.alert').remove();
// the index of the selected answer must match the correct answer
if (data.answer == $container.find('input[type=radio]:checked').val())
var $message = $('<div class="alert alert-success"><strong>Correct!</strong></div>');
else
var $message = $('<div class="alert alert-error">That\'s not the right answer, <strong>try again!</strong></div>');
// display message
$message.hide().appendTo($container).fadeIn('fast');
e.preventDefault();
return false;
});
// when answer is selected, make sure submit button is show
$container.on('click', '.question-choices input[type=radio]', function() {
$submit = $container.find('.btn-submit');
if (!$submit.is(':visible')) {
$submit.fadeIn('fast');
}
});
};
/**
* Renderer for a question with a numeric answer
*
* @param container Container for question to be rendered within
* @param data Question data
* @param callback Response callback
*
*/
CS50.Video.Render.Numeric = function(container, data, callback) {
// if no tolerance given, then assume exact answer
data.tolerance = (data.tolerance === undefined) ? 1 : data.tolerance;
// render free response
var $input = CS50.Video.Render.FreeResponse(container, data, callback);
// swap out event handler
var $container = $(container);
$container.off('click', '.btn-submit');
// when submit is pressed, check answer
$container.on('click', '.btn-submit', function(e) {
var val = parseFloat($input.val());
// a correct answer is within the bounds established by the tolerance
if (isNaN(val))
var $message = $('<div class="alert alert-error">The answer must be a number, <strong>try again!</strong></div>');
else if (val <= data.answer + data.answer * data.tolerance && val >= data.answer - data.answer * data.tolerance)
var $message = $('<div class="alert alert-success"><strong>Correct!</strong></div>');
else
var $message = $('<div class="alert alert-error">That\'s not the right answer, <strong>try again!</strong></div>');
// display message
$container.find('.alert').remove();
$message.hide().appendTo($container).fadeIn('fast');
e.preventDefault();
return false;
});
};
/**
* Renderer for a true/false question
*
* @param container Container for question to be rendered within
* @param data Question data
* @param callback Response callback
*
*/
CS50.Video.Render.TrueFalse = function(container, data, callback) {
// true/false is really just multiple choice
CS50.Video.Render.MultipleChoice(container, {
answer: !data.answer,
choices: ['True', 'False'],
id: data.id,
mode: data.mode,
question: data.question,
tags: data.tags,
}, callback);
};
// http://james.padolsey.com/javascript/special-scroll-events-for-jquery/
(function(){
var special = jQuery.event.special,
uid1 = 'D' + (+new Date()),
uid2 = 'D' + (+new Date() + 1);
special.scrollstart = {
setup: function() {
var timer,
handler = function(evt) {
var _self = this,
_args = arguments;
if (timer) {
clearTimeout(timer);
} else {
evt.type = 'scrollstart';
jQuery.event.handle.apply(_self, _args);
}
timer = setTimeout( function(){
timer = null;
}, special.scrollstop.latency);
};
jQuery(this).bind('scroll', handler).data(uid1, handler);
},
teardown: function(){
jQuery(this).unbind( 'scroll', jQuery(this).data(uid1) );
}
};
special.scrollstop = {
latency: 300,
setup: function() {
var timer,
handler = function(evt) {
var _self = this,
_args = arguments;
if (timer) {
clearTimeout(timer);
}
timer = setTimeout( function(){
timer = null;
evt.type = 'scrollstop';
jQuery.event.handle.apply(_self, _args);
}, special.scrollstop.latency);
};
jQuery(this).bind('scroll', handler).data(uid2, handler);
},
teardown: function() {
jQuery(this).unbind( 'scroll', jQuery(this).data(uid2) );
}
};
})();
// maintain compatibility with other CS50 libraries
var CS50 = CS50 || {};
CS50.Video.Render = CS50.Video.Render || {};
/**
* Renderer for a multiple choice question
*
* @param container Container for question to be rendered within
* @param data Question data
* @param callback Response callback
* @return Input element user types into
*
*/
CS50.Video.Render.FreeResponse = function(container, data, callback) {
// render question and input area placeholder
var $container = $(container);
$container.append('<h2>' + data.question + '</h2>');
var $placeholder = $('<input type="text" class="txt-answer-location" />');
$container.append($placeholder);
// create input area that is absolutely positioned to avoid transform weirdness
var $input = $('<input type="text" class="video50-txt-answer" />');
setTimeout(function() {
var offset = $placeholder.offset();
$input.css({ position: 'absolute', 'top': offset.top + 'px', 'left': offset.left + 'px', 'z-index': 999 });
$('body').append($input);
$placeholder.css({ visibility: 'hidden' });
}, 1000);
// create submit button, hidden by default
var $submit = $('<button class="btn btn-submit">Submit Response</button>').hide();
$container.append($submit);
// when submit button is pressed, check the answer
$container.on('click', '.btn-submit', function(e) {
// remove previous messages from the container
var $container = $(this).parents('.question-content');
$container.find('.alert').remove();
// a correct answer matches the supplied regex
var correct = $input.val().match(data.answer);
if (correct)
var $message = $('<div class="alert alert-success"><strong>Correct!</strong></div>');
else
var $message = $('<div class="alert alert-error">That\'s not the right answer, <strong>try again!</strong></div>');
// display message
$message.hide().appendTo($container).fadeIn('fast');
// log response
callback(data.id, correct, {});
e.preventDefault();
return false;
});
// when answer is selected, make sure submit button is shown
$('body').on('keyup', '.video50-txt-answer', function() {
var $submit = $container.find('.btn-submit');
// toggle submit button based on input state
if ($input.val().match(/^\s*$/) && $submit.is(':visible'))
$submit.fadeOut('fast');
else if (!$submit.is(':visible'))
$submit.fadeIn('fast');
});
return $input;
};
/**
* Renderer for a multiple choice question
*
* @param container Container for question to be rendered within
* @param data Question data
* @param callback Response callback
*
*/
CS50.Video.Render.MultipleChoice = function(container, data, callback) {
// render question title
var $container = $(container);
$container.append('<h2>' + data.question + '</h2>');
// display each choice
$choices = $('<div class="question-choices">');
_.each(data.choices, function(e, i) {
$choices.append('<input id="' + i + '" type="radio" name="question" value="' + i + '" />' +
'<label for="' + i + '">' + e + '</label><br />');
});
// create submit button, hidden by default
var $submit = $('<button class="btn btn-submit">Submit Response</button>').hide();
// add display questions
$container.append($choices);
$container.append($submit);
// when submit button is pressed, check the answer
$container.on('click', '.btn-submit', function(e) {
// remove previous messages from the container
var $container = $(this).parents('.question-content');
$container.find('.alert').remove();
// the index of the selected answer must match the correct answer
var correct = (data.answer == $container.find('input[type=radio]:checked').val());
if (correct)
var $message = $('<div class="alert alert-success"><strong>Correct!</strong></div>');
else
var $message = $('<div class="alert alert-error">That\'s not the right answer, <strong>try again!</strong></div>');
// display message
$message.hide().appendTo($container).fadeIn('fast');
// log response
callback(data.id, correct, {});
e.preventDefault();
return false;
});
// when answer is selected, make sure submit button is show
$container.on('click', '.question-choices input[type=radio]', function() {
$submit = $container.find('.btn-submit');
if (!$submit.is(':visible')) {
$submit.fadeIn('fast');
}
});
};
/**
* Renderer for a question with a numeric answer
*
* @param container Container for question to be rendered within
* @param data Question data
* @param callback Response callback
*
*/
CS50.Video.Render.Numeric = function(container, data, callback) {
// if no tolerance given, then assume exact answer
data.tolerance = (data.tolerance === undefined) ? 1 : data.tolerance;
// render free response
var $input = CS50.Video.Render.FreeResponse(container, data, callback);
// swap out event handler
var $container = $(container);
$container.off('click', '.btn-submit');
// when submit is pressed, check answer
$container.on('click', '.btn-submit', function(e) {
var val = parseFloat($input.val());
// avoid any potential NaN weirdness
var correct = false;
if (isNaN(val))
var $message = $('<div class="alert alert-error">The answer must be a number, <strong>try again!</strong></div>');
// a correct answer is within the bounds established by the tolerance
else {
correct = (val <= data.answer + data.answer * data.tolerance && val >= data.answer - data.answer * data.tolerance);
if (correct)
var $message = $('<div class="alert alert-success"><strong>Correct!</strong></div>');
else
var $message = $('<div class="alert alert-error">That\'s not the right answer, <strong>try again!</strong></div>');
}
// display message
$container.find('.alert').remove();
$message.hide().appendTo($container).fadeIn('fast');
// log response
callback(data.id, correct, {});
e.preventDefault();
return false;
});
};
/**
* Renderer for a true/false question
*
* @param container Container for question to be rendered within
* @param data Question data
* @param callback Response callback
*
*/
CS50.Video.Render.TrueFalse = function(container, data, callback) {
// true/false is really just multiple choice
CS50.Video.Render.MultipleChoice(container, {
answer: !data.answer,
choices: ['True', 'False'],
id: data.id,
mode: data.mode,
question: data.question,
tags: data.tags,
}, callback);
};
// http://james.padolsey.com/javascript/special-scroll-events-for-jquery/
(function(){
var special = jQuery.event.special,
uid1 = 'D' + (+new Date()),
uid2 = 'D' + (+new Date() + 1);
special.scrollstart = {
setup: function() {
var timer,
handler = function(evt) {
var _self = this,
_args = arguments;
if (timer) {
clearTimeout(timer);
} else {
evt.type = 'scrollstart';
jQuery.event.handle.apply(_self, _args);
}
timer = setTimeout( function(){
timer = null;
}, special.scrollstop.latency);
};
jQuery(this).bind('scroll', handler).data(uid1, handler);
},
teardown: function(){
jQuery(this).unbind( 'scroll', jQuery(this).data(uid1) );
}
};
special.scrollstop = {
latency: 300,
setup: function() {
var timer,
handler = function(evt) {
var _self = this,
_args = arguments;
if (timer) {
clearTimeout(timer);
}
timer = setTimeout( function(){
timer = null;
evt.type = 'scrollstop';
jQuery.event.handle.apply(_self, _args);
}, special.scrollstop.latency);
};
jQuery(this).bind('scroll', handler).data(uid2, handler);
},
teardown: function() {
jQuery(this).unbind( 'scroll', jQuery(this).data(uid2) );
}
};
})();
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment