{{
user_navs = True
no_scratch_activecode = True
}}
{{extend 'layout.html'}}
{{block moreincludes}}
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<style type="text/css">
.rscontainer {
padding-left: 20px;
padding-right:20px;
padding-top: 20px;
}
</style>
{{end}}
{{block statusbar}}
{{end}}
<div class="container rscontainer">
{{if (request.args(0) != 'register'):}}
<div class="row">
{{ if settings.academy_mode: }}
- Carousel
<link href="/{{=request.application}}/static/css/carousel.css" rel="stylesheet">
{{ if (not auth.user): }}
<div class="carousel slide col-md-8" data-ride="carousel" id="myCarousel">
{{else: }}
<div class="carousel slide col-md-12" data-ride="carousel" id="myCarousel">
{{ pass }}
Indicators
<ol class="carousel-indicators">
<li data-target="#myCarousel" data-slide-to="0" class="active"></li>
<li data-target="#myCarousel" data-slide-to="1"></li>
<li data-target="#myCarousel" data-slide-to="2"></li>
</ol>
<div class="carousel-inner">
<div class="item active">
<div class="container">
<div class="carousel-caption">
<h3>Welcome to Runestone Academy</h3>
<p>We host a growing number of open source, interactive textbooks, written by award winning authors. Used by thousands of schools</p>
<p><a class="btn btn-lg btn-primary" href="http://runestoneinteractive.org/pages/library.html" role="button">See the List</a> <a class="btn btn-lg btn-primary" href="https://runestone.academy/runestone/books/published/overview/overview.html" role="button">Take a Tour</a></p>
</div>
</div>
</div>
<div class="item">
<div class="container">
<div class="carousel-caption">
<h2>New Instructors</h2>
<p>Here is a Video that will help you get started. Or, take a tour of the unique interactive features of our books!</p>
<p><a class="btn btn-lg btn-primary" href="https://youtu.be/t78ktTWrGkc" role="button">Watch Video</a> <a class="btn btn-lg btn-primary" href="https://runestone.academy/runestone/books/published/instructorguide/index.html" role="button">Instructors Guide</a></p>
</div>
</div>
</div>
<div class="item">
<div class="container">
<div class="carousel-caption">
<h2>August 2021 Runestone Facts</h2>
<p> 12,147 Students registered! 1,100 Courses Created! 30 Titles Available!</p>
<p><a class="btn btn-lg btn-primary" href="https://runestone.academy/runestone/default/donate" role="button">Support Runestone</a> </p>
</div>
</div>
</div>
<div class="item">
<div class="container">
<div class="carousel-caption">
<h2>High School Teachers</h2>
<p>We want you to use Runestone! But before your school district sends us a contract to sign, please read <a href="https://runestoneinteractive.org/2021/05/28/data_privacy_agreements.html">This letter</a></p>
<p><a class="btn btn-lg btn-primary" href="https://runestone.academy/runestone/default/donate" role="button">Support Runestone</a> </p>
</div>
</div>
</div>
</div><a class="left carousel-control" data-slide="prev" href="#myCarousel"><span class="glyphicon glyphicon-chevron-left"></span></a> <a class="right carousel-control" data-slide="next" href="#myCarousel"><span class="glyphicon glyphicon-chevron-right"></span></a>
</div><!-- /.carousel -->
{{ if 'static' in request.env.query_string:}}
<p>It appears you are trying to get to a class for which you must log in. If you have already registered, please login below. Otherwise you can <a href="{{=URL(f='user/register')}}">Register</a> here.</p>
{{pass}}
{{pass}}
LOGIN
{{if not settings.lti_only_mode:}}
{{ if not auth.user or request.args(0) == 'impersonate': }}
<h4 class="col-md-4">{{=T( request.args(0).replace('_',' ').capitalize() )}}</h4>
{{ pass }}
{{ if request.args(0) == 'login' and not auth.user: }}
<div id="web2py_user_form" class="col-md-4">
<form class="form-horizontal" method="post">
{{if not session.auth_two_factor_user:}}
<div class="form-group">
<div class="col-sm-offset-2">
<label for="auth_user_username" class="control-label">Username</label>
<input type="text" class="form-control col-xs-4" id="auth_user_username" name="username"
placeholder="Enter username" autofocus>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2">
<label for="auth_user_password" class="control-label">Password</label>
<div>
<input type="password" class="form-control" id="auth_user_password" name="password"
placeholder="Enter password">
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2">
<div class="checkbox">
<label>
<input id="auth_user_remember_me" name="remember_me" type="checkbox"> Remember me
</label>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-4">
<button type="submit" class="btn btn-default" id="login_button">Login</button>
</div>
</div>
{{else:}}
<div class="form-group">
<div class="col-sm-offset-2">
<label for="authentication_code" class="control-label">Authentication code</label>
<input class="form-control col-xs-4" id="authentication_code" name="authentication_code" type="password"
placeholder="Enter code" autofocus>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-4">
<button type="submit" class="btn btn-default" id="login_button">Login</button>
</div>
</div>
{{pass}}
{{=form.custom.end}}
Must use this to get all the good defaults for the form
<div id='auth-actions' style="margin-left: 20px;">
{{if not 'request_reset_password' in auth.settings.actions_disabled:}}
<a class="btn btn-sm btn-primary" href="{{=URL(args='request_reset_password')}}"
role="button">{{=T('Lost Password')}}</a>
<a class="btn btn-sm btn-primary" href="{{=URL(args='retrieve_username')}}"
role="button">{{=T('Forgot Username')}}</a>
{{pass}}
</div>
</div>
{{pass}}
{{if request.args(0) in ['retrieve_username', 'profile', 'request_reset_password', 'reset_password', 'change_password']: }}
<div class="content row">
<div id="web2py_user_form" class="col-md-6 col-sm-6 col-xs-12">
<p><strong>Important:</strong> Some school email systems block all external emails, filter "password reset" type emails, or use other filters that may prevent you from getting this email! <strong>Your instructor can reset your password.</strong></p>
{{=form}}
{{ if settings.academy_mode and request.args(0) == 'profile':}}
<form action="{{=URL('default','delete')}}" onsubmit="return confirm('Are you sure?')">
<div class="checkbox">
<label>
<input type=checkbox name="deleteaccount" id="delacct">
<span><strong>Delete my account</strong> and all data. Cannot be undone!</span>
</label>
</div>
<input type="submit" value="Delete" class="btn btn-primary">
</form>
{{ pass }}
{{ if request.args(0) not in ['profile', 'reset_password', 'change_password']: }}
<p> You should receive an email from Runestone with your username. If you don't see it right away check your spam folder.</p>
{{pass}}
</div>
<div class="col-md-4 col-sm-6 col-xs-12">
<h4>Course IDs for open courses</h4>
<p>If your instructor gave you the name of a course to register for, type that into the Course Name box. If you are learning on your own you can use one of the courses listed below. All are welcome!</p>
<ul>
<li>apcsareview</li>
<li>authorguide</li>
<li>cpp4python</li>
<li>cppds</li>
<li>csawesome</li>
<li>fopp</li>
<li>httlads</li>
<li>instructorguide</li>
<li>java4python</li>
<li>JS4Python</li>
<li>learnwebgl2</li>
<li>MasteringDatabases</li>
<li>mobilecsp</li>
<li>overview</li>
<li>pythonds</li>
<li>pythoned</li>
<li>StudentCSP</li>
<li>teach-mobilecsp</li>
<li>TeacherCSP</li>
<li>thinkcspy</li>
<li>webfundamentals</li>
</ul>
</div>
</div>
{{pass}}
{{else:}}
Please login via your learning management system (Coursera, Canvas, Blackboard, etc.)
{{if settings.coursera_mode:}}
<p>At the beginning of each study session, you will need to first use one of the links at the top of a lesson that says something like, "Single Sign On: Interactive Textbook and Practice Opportunities." Once you've done that, you'll be able to use the textbook for the duration of your learning sessions, including the links to individual textbook pages in Coursera.</p>
{{pass}}
{{pass}}
</div>
end of always show the carousel EXCEPT for registration
{{if request.args(0) != 'register': }}
<div class="content row">
{{pass}}
REGISTRATION
register page
{{if not settings.lti_only_mode:}}
<div id="registration_div">
<div class="col-md-6 col-sm-12 col-xs-12">
<h2>Runestone Registration</h2>
<div id="web2py_user_form">
<script type="text/javascript">
function checkTcp() {
let cb = document.getElementById("auth_user_accept_tcp");
if (cb.checked) {
return true;
} else {
alert("You must accept our privacy policy to register.");
return false;
}
}
</script>
<p><strong>Important</strong>If you are an instructor please use your institutional email address so we can verify your instructor status. If we cannot verify your status as an instructor your course will be removed.</p>
<form class="form-vertical" enctype="multipart/form-data" method="post" onsubmit="return checkTcp()">
<table>
<tr id="auth_user_username__row">
<td class="w2p_fl"><label class="" for="auth_user_username" id="auth_user_username__label">Username: </label></td>
<td class="w2p_fw"><input class="string" id="auth_user_username" name="username" type="text" value="{{=form.vars.username if form.vars.username else ""}}"/></td>
<td class="w2p_fc"></td>
</tr>
<tr id="auth_user_first_name__row">
<td class="w2p_fl"><label class="" for="auth_user_first_name" id="auth_user_first_name__label">First Name: </label></td>
<td class="w2p_fw"><input class="string" id="auth_user_first_name" name="first_name" type="text" value="{{=form.vars.first_name if form.vars.first_name else ""}}"/></td>
<td class="w2p_fc"></td>
</tr>
<tr id="auth_user_last_name__row">
<td class="w2p_fl"><label class="" for="auth_user_last_name" id="auth_user_last_name__label">Last Name: </label></td>
<td class="w2p_fw"><input class="string" id="auth_user_last_name" name="last_name" type="text" value="{{=form.vars.last_name if form.vars.last_name else ""}}"/></td>
<td class="w2p_fc"></td>
</tr>
<tr id="auth_user_email__row">
<td class="w2p_fl"><label class="" for="auth_user_email" id="auth_user_email__label">Email: </label></td>
<td class="w2p_fw"><input class="string" id="auth_user_email" name="email" type="text" value="{{=form.vars.email if form.vars.email else ""}}"/></td>
<td class="w2p_fc"></td>
</tr>
<tr id="auth_user_password__row">
<td class="w2p_fl"><label class="" for="auth_user_password" id="auth_user_password__label">Password: </label></td>
<td class="w2p_fw"><input class="password" id="auth_user_password" name="password" type="password" value=""></td>
<td class="w2p_fc"></td>
</tr>
<tr id="auth_user_password_two__row">
<td class="w2p_fl"><label class="" for="auth_user_password_two" id="auth_user_password_two__label">Confirm Password: </label></td>
<td class="w2p_fw"><input class="password" id="auth_user_password_two" name="password_two" type="password" value=""></td>
<td class="w2p_fc"></td>
</tr>
<tr id="auth_user_course_id__row">
<td class="w2p_fl"><label class="" for="auth_user_course_id" id="auth_user_course_id__label">Course Name: </label></td>
<td class="w2p_fw ui-widget">
<input class="string" id="auth_user_course_id" name="course_id" type="text"
value="{{=form.vars.course_id if form.vars.course_id else ""}}"/>
</td>
<td class="w2p_fc"></td>
</tr>
<tr id="auth_user_accept_tcp__row">
<td class="w2p_fl">
<label for="auth_user_accept_tcp">I Agree:</label>
</td>
<td class="w2p_fw ui-widget">
<input type="checkbox" id="auth_user_accept_tcp" name="accept_tcp"> <label for="auth_user_accept_tcp" style="font-weight: initial; display: inline;">I have read and accepted your </label><a href="/{{=request.application}}/default/privacy">privacy policy</a>, <a href="/{{=request.application}}/default/terms">terms, and conditions</a>.
</td>
<td class="w2p_fc"></td>
</tr>
<tr id="create_course_row">
<td class="w2p_fl"><label for="ccn_checkbox">Create Course:</label></td>
<td class="w2p_fw ui-widget"><input type="checkbox" id="ccn_checkbox" name="ccn_checkbox"> <label for="ccn_checkbox" style="font-weight: initial; display: inline;">Make course after registering (instructors only)</label></td>
<td class="w2p_fc"></td>
</tr>
{{if settings.enable_captchas: }}
<tr id="captcha__row">
<td class="w2p_fl"><label>Verify:</label></td>
<td class="w2p_fw">
<div id="recaptcha">
<script type="text/css"><!--
var RecaptchaOptions = {theme: 'blackglass'};
//-->
</script>
<script src="http://www.google.com/recaptcha/api/challenge?k=6Lfb_t4SAAAAAB9pG_o1CwrMB40YPsdBsD8GsvlD" type="text/javascript"></script>
<noscript>
<iframe frameborder="0" height="300"
src="http://www.google.com/recaptcha/api/noscript?k=6Lfb_t4SAAAAAB9pG_o1CwrMB40YPsdBsD8GsvlD"
width="500"></iframe>
<br/><input name="recaptcha_response_field" type="hidden" value="manual_challenge"/>
</noscript>
</div>
</td>
<td class="w2p_fc"></td>
</tr>
{{pass}}
<tr id="submit_record__row">
<td class="w2p_fl"></td>
<td class="w2p_fw"><input class="btn btn-default" type="submit" value="Sign Up"/></td>
<td class="w2p_fc"></td>
</tr>
</table>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js" type="text/javascript"></script>
<script type="text/javascript">
$("#auth_user_course_id").autocomplete({
source: ['thinkcspy', 'pythonds']
});
</script>
{{=form.custom.end}}
{{if form.errors: }}
<div class="warning">
<p><b>Please fix the following errors in your registration</b></p>
<ul>
{{ for error in form.errors:}}
<li>{{=error}}: {{=form.errors[error]}}</li>
{{pass}}
</ul>
</div>
{{pass}}
</div> <!-- end form div -->
</div>
</div> <!-- end register div -->
<div class="col-md-6 col-sm-12 col-xs-12">
<h4>Registration Hints</h4>
<p>In the field for the <strong>Course Name</strong> please use the course name your instructor gave you. Or...</p>
<p> If you are an <strong>instructor</strong> registering for the first time OR an <strong>independent learner</strong> use one of the following for our open, public courses.</p>
<p>Runestone uses usernames to keep track of you. Please write it down somewhere if you're likely to forget it. </p>
<h3>Open CS Textbooks</h3>
<ul>
<li><code>thinkcspy</code> for How to Think Like a Computer Scientist</li>
<li><code>fopp</code> for Foundations of Python Programming</li>
<li><code>pythonds</code> for Problem Solving with Algorithms and Data Structures using Python Second Edition</li>
<li><code>pythonds3</code> for Problem Solving With Algorithms and Data Structures using Python Third Edition</li>
<li><code>StudentCSP</code> for the AP CS Principles</li>
<li><code>csawesome</code> AP CS A Java Course - its Awesome</li>
<li><code>httlads</code> for How to Think like a Data Scientist</li>
<li><code>cppds</code> for Problem Solving with Algorithms and Data Structures using C++</li>
<li><code>cpp4python</code>C++ for Python Programmers</li>
<li><code>java4python</code>Java for Python Programmers</li>
<li><code>JS4python</code>Javascript for Python Programmers</li>
<li><code>thinkcpp</code>How To Think Like A Computer Scientist C++ Edition</li>
<li><code>MasteringDatabases</code>Mastering Relational Databases</li>
<li><code>pythoned</code>Spanish Language Edition of <code>pythonds</code></li>
<li><code>webfundamentals</code>Fundamentals of Web Programming</li>
<li><code>learnwebgl2</code>Learn Computer Graphics using WebGL</li>
</ul>
<h3>Open Math Textbooks</h3>
<ul>
<li><code>fcla</code>A First course in Linear Algebra</li>
<li><code>aata</code>Abstract Algebra, Theory and Applications</li>
<li><code>orcca</code>Open Resources for Community College Algebra</li>
</ul>
</div>
lti_only_mode
Registration is disabled. Please login via your learning management system (Coursera, Canvas, Blackboard, etc.)
{{pass}}
end register page
<div class="row">
{{if (request.args(0) != 'register') and settings.academy_mode:}}
<div class='col-md-6 col-sm-12 col-xs-12'>
<h2>About Runestone</h2>
<p>The mission of Runestone Interactive is to democratize textbooks for the 21st century. Textbook prices are too high, and paper textbooks are too old fashioned. We are changing that.</p>
<ul>
<li>Freely available open source books</li>
<li>Easy to use authoring tools to create Runestone books</li>
<li>Hosting services for your course - See our <a href="https://runestone.academy/runestone/books/published/instructorguide/index.html">Instructor Guide</a></li>
</ul>
<p>To learn more about this project, <a href="https://runestone.academy/runestone/books/published/overview/overview.html">see this overview</a>. For more information about the whole <b>Runestone Interactive</b> community and project, including how to contribute, please <a href="http://runestoneinteractive.org">click here</a>!</p>
{{if settings.academy_mode:}}
<h2>Your Privacy</h2>
<p>The books provided on Runestone Academy are free and open source. They are for educational purposes. As part
of our educational mission we do collect usage data to help us better understand how you learn and how you
use our
books. In exchange, we may use this data to make decisions about revisions to the content, and we may use
this data to publish
academic papers. We would never publish anything that revealed your identity. We may share this data with
fellow
educational researchers, but rest assured that all personally identifying information will be anonymized
before we do.
If you have questions about this please feel free to <a
href="mailto:runestoneinteractive@gmail.com">contact</a> us.</p>
{{pass}}
</div>
<div class="col-md-6 col-sm-6 col-xs-6">
<h2>Partners and Supporters</h2>
<p><a href="https://pretextbook.org"><img src="/runestone/static/_images/ptx-logo.png" width=64 alt="PreTeXt Logo"> <span style="font-size: x-large">PreTeXt</span></a></p>
<p><a href="https://www.si.umich.edu"><img src="/runestone/static/_images/U-M-logo-preview.jpg" width=64 alt="UMSI Logo"></a>School of Information</p>
<p><img src="/runestone/static/_images/SIGCSE-logo-large.jpg" width=64 alt="SIGCSE logo"> Special Projects Grant 2013</p>
<p><img src="/runestone/static/_images/nsf-logo.png" width=64 alt="NSF Logo"> REU Support Summers 2014-2017</p>
<p><a href="https://www.luther.edu"><img src="/runestone/static/_images/luther_college_vertical_blue.png" width=64 alt="Luther Logo (Go Norse!)"></a> Summer Student Faculty Research</p>
<h2>How can I help?</h2>
<p>This project is Open Source, but it does take time and resources.
Especially as our popularity has grown we have server costs. We welcome your help with code, editing, bug fixes almost anything you can think of. Join us on <a href="https://github.com/RunestoneInteractive">GitHub</a> </p>
<p>If these books have helped you, if you liked them,
please consider making a small donation.</p>
<a href="https://www.patreon.com/bePatron?u=19581921" data-patreon-widget-type="become-patron-button">Become a Patron!</a><script async src="https://c6.patreon.com/becomePatronButton.bundle.js"></script>
<p style="margin-top: 15px;">Or...</p>
Make a one-time donation <a href="{{=URL("default","donate")}}"><img src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif" alt="PayPal - The safer, easier way to pay online!"></a>
</div>
</div>
{{pass}}
</div>
</div>
<script language="javascript" type="text/javascript">
var cur_course = $('#auth_user_course_id').val();
if (cur_course == '') {
$('#auth_user_course_id').val('thinkcspy, pythonds, ... See Hints!')
}
$("#auth_user_course_id").on("click", function () {
$(this).select();
});
</script>