authpartner

Clone or download

html page design of development_auth_partner_sm_app

Modified Files

A accountstatement.php
+106 −0
--- /dev/null
+++ b/accountstatement.php
@@ -0,0 +1,106 @@
+<?php include 'header.php' ?>
+<div class="container">
+
+ <div class="col-lg-1"></div>
+ <div class="col-lg-10">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h4><i class="fa fa-fw fa-bars"></i> Account Statement</h4>
+ </div>
+ <div class="panel-body">
+
+ <form role="form">
+
+ <div class="col-lg-12">
+ <button class="btn btn-default pull-right" type="submit" style="margin-left:5px;">Print</button>
+ <button class="btn btn-default pull-right" type="submit" style="margin-left:5px;">Save to Digilocker</button>
+
+ <button class="btn btn-default pull-right" type="reset">Save as PDF</button>
+ </div>
+ <div class="col-lg-12">
+ <div class="col-lg-3">
+ <label>Account Name :</label>
+ </div>
+ <div class="col-lg-9 nor-font">
+ <label>Mr. XYX ABC</label>
+ </div>
+
+ <div class="col-lg-3">
+ <label>Account Number :</label>
+ </div>
+ <div class="col-lg-9 nor-font">
+ <label>000000000000</label>
+ </div>
+ <div class="col-lg-3">
+ <label>Account Description :</label>
+ </div>
+ <div class="col-lg-9 nor-font">
+ <label>SBCHQ-GEN-PUB-INR</label>
+ </div>
+ <div class="col-lg-3">
+ <label>Branch :</label>
+ </div>
+ <div class="col-lg-9 nor-font">
+ <label>C G O COMPLEX, LODHI ESTATE</label>
+
+ </div>
+
+ </div>
+
+ <div class="col-lg-12">
+ <div class="col-lg-8 nor-font">
+ <label style="margin-top:10px;">Account Statement from 1 Apr 2017 to 17 Apr 2017</label>
+ </div>
+
+ </div>
+
+
+ <div class="col-lg-12">
+ <table class="tg">
+ <tr>
+ <th class="tg-yw4l">Txn Date</th>
+ <th class="tg-yw4l">Value Date</th>
+ <th class="tg-yw4l">Description</th>
+ <th class="tg-yw4l">Ref No.</th>
+ <th class="tg-yw4l">Debit</th>
+ <th class="tg-yw4l">Credit</th>
+ <th class="tg-yw4l">Balance</th>
+ </tr>
+ <tr>
+ <td>16 Apr
+2017</td>
+ <td>16 Apr
+2017</td>
+ <td>TO TRANSFER-INB IRCTCRAILWAY
+TICKET BOOK
+Railway Ticket Booki-</td>
+ <td>100000809530637
+IGABDMOHD8
+TRANSFER T</td>
+ <td>150.00</td>
+ <td></td>
+ <td>11,271.78</td>
+ </tr>
+ </table>
+ </div>
+ <div class="col-lg-12">
+ <p>
+ Please do not share your ATM, Debit/Credit card number, PIN and OTP with anyone over mail, SMS, phone call or any other
+media. Bank never asks for such information.
+ </p>
+ </div>
+
+ </form>
+
+
+
+ </div>
+ </div>
+
+ </div>
+ <div class="col-lg-1"></div>
+ <!-- /.row -->
+
+
+ </div>
+ <?php include 'footer.php' ?>
\ No newline at end of file
D css/digi-bank.css
+0 −256
--- 'a/css/digi-bank.css'
+++ /dev/null
@@ -1,256 +0,0 @@
-
-body {
- margin-top: 100px;
- background-color: #a2c1fa;
-}
-
-@media(min-width:768px) {
- body {
- margin-top: 50px;
- }
-}
-
-#wrapper {
- padding-left: 0;
-}
-
-#page-wrapper {
- width: 100%;
- padding: 0;
- background-color: #fff;
-}
-
-.huge {
- font-size: 50px;
- line-height: normal;
-}
-
-@media(min-width:768px) {
- #wrapper {
- padding-left: 225px;
- }
-
- #page-wrapper {
- padding: 10px;
- }
-}
-
-/* Top Navigation */
-
-.top-nav {
- padding: 0 15px;
-}
-
-.top-nav>li {
- display: inline-block;
- float: left;
-}
-
-.top-nav>li>a {
- padding-top: 15px;
- padding-bottom: 15px;
- line-height: 20px;
- color: #00aeff;
-}
-
-.top-nav>li>a:hover,
-.top-nav>li>a:focus,
-.top-nav>.open>a,
-.top-nav>.open>a:hover,
-.top-nav>.open>a:focus {
- color: #fff;
- background-color: #a2c1fa;
-}
-
-.top-nav>.open>.dropdown-menu {
- float: left;
- position: absolute;
- margin-top: 0;
- border: 1px solid rgba(0,0,0,.15);
- border-top-left-radius: 0;
- border-top-right-radius: 0;
- background-color: #fff;
- -webkit-box-shadow: 0 6px 12px rgba(0,0,0,.175);
- box-shadow: 0 6px 12px rgba(0,0,0,.175);
-}
-
-.top-nav>.open>.dropdown-menu>li>a {
- white-space: normal;
-}
-
-ul.message-dropdown {
- padding: 0;
- max-height: 250px;
- overflow-x: hidden;
- overflow-y: auto;
-}
-
-li.message-preview {
- width: 275px;
- border-bottom: 1px solid rgba(0,0,0,.15);
-}
-
-li.message-preview>a {
- padding-top: 15px;
- padding-bottom: 15px;
-}
-
-li.message-footer {
- margin: 5px 0;
-}
-
-ul.alert-dropdown {
- width: 200px;
-}
-
-/* Side Navigation */
-
-@media(min-width:768px) {
- .side-nav {
- position: fixed;
- top: 51px;
- left: 225px;
- width: 225px;
- margin-left: -225px;
- border: none;
- border-radius: 0;
- overflow-y: auto;
- background-color: #222;
- bottom: 0;
- overflow-x: hidden;
- padding-bottom: 40px;
- }
-
- .side-nav>li>a {
- width: 225px;
- }
-
- .side-nav li a:hover,
- .side-nav li a:focus {
- outline: none;
- background-color: #a2c1fa !important;
- }
-}
-
-.side-nav>li>ul {
- padding: 0;
-}
-
-.side-nav>li>ul>li>a {
- display: block;
- padding: 10px 15px 10px 38px;
- text-decoration: none;
- color: #999;
-}
-
-.side-nav>li>ul>li>a:hover {
- color: #fff;
-}
-
-/* Flot Chart Containers */
-
-.flot-chart {
- display: block;
- height: 400px;
-}
-
-.flot-chart-content {
- width: 100%;
- height: 100%;
-}
-
-/* Custom Colored Panels */
-
-.huge {
- font-size: 40px;
-}
-
-.panel-green {
- border-color: #5cb85c;
-}
-
-.panel-green > .panel-heading {
- border-color: #5cb85c;
- color: #fff;
- background-color: #5cb85c;
-}
-
-.panel-green > a {
- color: #5cb85c;
-}
-
-.panel-green > a:hover {
- color: #3d8b3d;
-}
-
-.panel-red {
- border-color: #d9534f;
-}
-
-.panel-red > .panel-heading {
- border-color: #d9534f;
- color: #fff;
- background-color: #d9534f;
-}
-
-.panel-red > a {
- color: #d9534f;
-}
-
-.panel-red > a:hover {
- color: #b52b27;
-}
-
-.panel-yellow {
- border-color: #f0ad4e;
-}
-
-.panel-yellow > .panel-heading {
- border-color: #f0ad4e;
- color: #fff;
- background-color: #f0ad4e;
-}
-
-.panel-yellow > a {
- color: #f0ad4e;
-}
-
-.panel-yellow > a:hover {
- color: #df8a13;
-}
-.side-nav{
- background-color:#025c86;
-}
-
-.collapse, .navbar-collapse, .navbar-ex1-collapse{
- background-color:#4066ad;
-}
-
-.navbar-inverse .navbar-brand {
- color: #00aeff;
-}
-.navbar-inverse .navbar-nav > li > a {
- color: #00aeff;
-}
-.navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:focus, .navbar-inverse .navbar-nav > .active > a:hover {
- background-color: #00aeff;
- color: #fff;
-}
-
-.has-success .form-control {
- border-color: #e1e3e5;
- box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset;
-}
-
-.has-success .form-control:focus {
- border-color: #e1e3e5;
- box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset, 0 0 6px #025c86;
-}
-
-.has-success .checkbox, .has-success .checkbox-inline, .has-success .control-label, .has-success .help-block, .has-success .radio, .has-success .radio-inline, .has-success.checkbox label, .has-success.checkbox-inline label, .has-success.radio label, .has-success.radio-inline label {
- color: #777;
-}
-nav .footer-bootom{
- background-color: #4066ad;
-}
-
--- /dev/null
+++ b/css/jquery.datepick.css
@@ -0,0 +1,220 @@
+/* Default styling for jQuery Datepicker v5.0.1. */
+.datepick {
+ background-color: #b568fc;
+ color: #000;
+ border: 1px solid #9579fc;
+ border-radius: 0.25em;
+ -moz-border-radius: 0.25em;
+ -webkit-border-radius: 0.25em;
+ font-family: Arial,Helvetica,Sans-serif;
+ font-size: 90%;
+}
+.datepick-rtl {
+ direction: rtl;
+}
+.datepick-popup {
+ z-index: 1000;
+}
+.datepick-disable {
+ position: absolute;
+ z-index: 100;
+ background-color: white;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+}
+.datepick a {
+ color: #fff;
+ text-decoration: none;
+}
+.datepick a.datepick-disabled {
+ color: #888;
+ cursor: auto;
+}
+.datepick button {
+ margin: 0.25em;
+ padding: 0.125em 0em;
+ background-color: #fcc;
+ border: none;
+ border-radius: 0.25em;
+ -moz-border-radius: 0.25em;
+ -webkit-border-radius: 0.25em;
+ font-weight: bold;
+}
+.datepick-nav, .datepick-ctrl {
+ float: left;
+ width: 100%;
+ background-color: blueviolet;
+ color: #fff;
+ font-size: 90%;
+ font-weight: bold;
+}
+.datepick-ctrl {
+ background-color: #6238FC;
+}
+.datepick-cmd {
+ width: 30%;
+}
+.datepick-cmd:hover {
+ background-color: #9579fc;
+}
+.datepick-ctrl .datepick-cmd:hover {
+ background-color: #9579fc;
+}
+.datepick-cmd-prevJump, .datepick-cmd-nextJump {
+ width: 8%;
+}
+a.datepick-cmd {
+ height: 1.5em;
+}
+button.datepick-cmd {
+ text-align: center;
+}
+.datepick-cmd-prev, .datepick-cmd-prevJump, .datepick-cmd-clear {
+ float: left;
+ padding-left: 2%;
+}
+.datepick-cmd-current, .datepick-cmd-today {
+ float: left;
+ width: 35%;
+ text-align: center;
+}
+.datepick-cmd-next, .datepick-cmd-nextJump, .datepick-cmd-close {
+ float: right;
+ padding-right: 2%;
+ text-align: right;
+}
+.datepick-rtl .datepick-cmd-prev, .datepick-rtl .datepick-cmd-prevJump,
+.datepick-rtl .datepick-cmd-clear {
+ float: right;
+ padding-left: 0%;
+ padding-right: 2%;
+ text-align: right;
+}
+.datepick-rtl .datepick-cmd-current, .datepick-rtl .datepick-cmd-today {
+ float: right;
+}
+.datepick-rtl .datepick-cmd-next, .datepick-rtl .datepick-cmd-nextJump,
+.datepick-rtl .datepick-cmd-close {
+ float: left;
+ padding-left: 2%;
+ padding-right: 0%;
+ text-align: left;
+}
+.datepick-month-nav {
+ float: left;
+ background-color: #777;
+ text-align: center;
+}
+.datepick-month-nav div {
+ float: left;
+ width: 12.5%;
+ margin: 1%;
+ padding: 1%;
+}
+.datepick-month-nav span {
+ color: #888;
+}
+.datepick-month-row {
+ clear: left;
+}
+.datepick-month {
+ float: left;
+ width: 15em;
+ border: 1px solid #b568fc;
+ text-align: center;
+}
+.datepick-month-header, .datepick-month-header select, .datepick-month-header input {
+ height: 1.5em;
+ background-color: #b568fc;
+ color: #fff;
+ font-weight: bold;
+}
+.datepick-month-header select, .datepick-month-header input {
+ height: 1.4em;
+ margin: 0em;
+ padding: 0em;
+ border: none;
+ font-size: 100%;
+}
+.datepick-month-header input {
+ position: absolute;
+ display: none;
+}
+.datepick-month table {
+ width: 100%;
+ border-collapse: collapse;
+}
+.datepick-month thead {
+ border-bottom: 1px solid #aaa;
+}
+.datepick-month th, .datepick-month td {
+ margin: 0em;
+ padding: 0em;
+ font-weight: normal;
+ text-align: center;
+}
+.datepick-month th {
+ border: 1px solid #777;
+}
+.datepick-month th, .datepick-month th a {
+ background-color: #d2a2ff;
+ color: #fff;
+}
+.datepick-month td {
+ background-color: #eee;
+ border: 1px solid #aaa;
+}
+.datepick-month td.datepick-week {
+ border: 1px solid #777;
+}
+.datepick-month td.datepick-week * {
+ background-color: #777;
+ color: #fff;
+ border: none;
+}
+.datepick-month a {
+ display: block;
+ width: 100%;
+ padding: 0.125em 0em;
+ background-color: #eee;
+ color: #000;
+ text-decoration: none;
+}
+.datepick-month span {
+ display: block;
+ width: 100%;
+ padding: 0.125em 0em;
+}
+.datepick-month td span {
+ color: #888;
+}
+.datepick-month td .datepick-other-month {
+ background-color: #fff;
+}
+.datepick-month td .datepick-weekend {
+ background-color: #ddd;
+}
+.datepick-month td .datepick-today {
+ background-color: #9579fc;
+ color:#fff;
+}
+.datepick-month td .datepick-highlight {
+ background-color: #9579fc;
+ color:#fff;
+}
+.datepick-month td .datepick-selected {
+ background-color: #777;
+ color: #fff;
+}
+.datepick-month th.datepick-week {
+ background-color: #777;
+ color: #fff;
+}
+.datepick-status {
+ clear: both;
+ background-color: #ddd;
+ text-align: center;
+}
+.datepick-clear-fix {
+ clear: both;
+}
A css/style.css
+277 −0
--- /dev/null
+++ b/css/style.css
@@ -0,0 +1,277 @@
+
+html,
+body {
+ height: 100%;
+}
+
+body {
+ /*padding-top: 50px; *//* Required padding for .navbar-fixed-top. Remove if using .navbar-static-top. Change if height of navigation changes. */
+}
+
+.img-portfolio {
+ margin-bottom: 30px;
+}
+
+.img-hover:hover {
+ opacity: 0.8;
+}
+
+/* Home Page Carousel */
+
+header.carousel {
+ height: 50%;
+}
+
+header.carousel .item,
+header.carousel .item.active,
+header.carousel .carousel-inner {
+ height: 100%;
+}
+
+header.carousel .fill {
+ width: 100%;
+ height: 100%;
+ background-position: center;
+ background-size: cover;
+}
+
+/* 404 Page Styles */
+
+.error-404 {
+ font-size: 100px;
+}
+
+/* Pricing Page Styles */
+
+.price {
+ display: block;
+ font-size: 50px;
+ line-height: 50px;
+}
+
+.price sup {
+ top: -20px;
+ left: 2px;
+ font-size: 20px;
+}
+
+.period {
+ display: block;
+ font-style: italic;
+}
+
+/* Footer Styles */
+
+footer {
+ margin: 50px 0;
+}
+
+/* Responsive Styles */
+
+@media(max-width:991px) {
+ .customer-img,
+ .img-related {
+ margin-bottom: 30px;
+ }
+}
+
+@media(max-width:767px) {
+ .img-portfolio {
+ margin-bottom: 15px;
+ }
+
+ header.carousel .carousel {
+ height: 70%;
+ }
+}
+<!--mycode------------->
+.row ul li a {
+ color: #000000 !important;
+ text-decoration: none;
+}
+.col-lg-4 p a{
+ color: #606060;
+ text-decoration:none;
+ }
+ .col-lg-4 p a:hover{
+ color: #878785;
+ text-decoration:none;
+ }
+ .border-box {
+ /*border:#FFF 1px dashed;
+ padding-top:20px;
+ padding-bottom:10px;*/
+ }
+
+.custom-bullet li {
+ display: block;
+}
+
+.custom-bullet li:before
+{
+ /*Using a Bootstrap glyphicon as the bullet point*/
+ content: "\e080";
+ font-family: 'Glyphicons Halflings';
+ font-size: 9px;
+ float: left;
+ margin-top: 2px;
+ margin-left: -17px;
+ color:#FF595C;
+}
+.panel-body .custom-bullet li:before
+{
+ /*Using a Bootstrap glyphicon as the bullet point*/
+ content: "\e080";
+ font-family: 'Glyphicons Halflings';
+ font-size: 9px;
+ float: left;
+ margin-top: 3px;
+ margin-left: -17px;
+ color:#FF595C;
+}
+
+.border-box h4{
+ /*color:#fff;*/
+}
+ .navbar-inverse {
+ background-color: blueviolet;
+ border:none;
+}
+div.navbar-inverse {
+ background-color: #ebeae0;
+ border-color:#ffffff;
+}
+
+.navbar-inverse .navbar-brand {
+ color: #ffffff;
+}
+.navbar-inverse .navbar-brand:hover {
+ color: #cacaca;
+}
+.navbar-inverse .navbar-nav > li > a {
+ font-size:11px;
+ color: #fff;
+}
+.nav > li > a:focus {
+
+ background-color: #f0ede4;
+ color:#000;
+}
+.navbar_li_a{
+ /*line-height: 4px !important;*/
+
+}
+.navbar-inverse .navbar-nav > li > a:hover {
+ color: #cacaca;
+}
+.panel-default > .panel-heading {
+ background-color: #f5f5f5;
+ border-color: #ddd;
+ color: #333;
+}
+.panel-body p{
+ padding-left:25px;
+ /*color:#d1d1d1;*/
+}
+.col-md-10 .panel-default{
+ background-color: #e7e7df !important;
+ min-height:20px;
+
+}
+ /*.navbar_li_a{
+ max-height:30px !important;
+ position:relative;
+}*/
+.btn-default{
+ font-size:11px;
+ background-color: #b29af8;
+ background-image: linear-gradient(to bottom, #b29af8, #9174ed);
+ border: 1px solid #8a66f4;
+ border-radius: 3px;
+ color: #ffffff;
+ display: inline-block;
+ text-decoration: none;
+ text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3);
+}
+.btn-default:hover{
+ background-color:#acd9ff;
+ color:#fff;
+}
+.para{
+ margin-left:10px;
+ margin-top:2px;
+ font-weight:bold;
+}
+.nor-font .height-form{
+ height: 25px;
+}
+
+.nor-font label{
+ font-weight:normal;
+}
+
+.navbar-header a img{
+ margin-top:-10px;
+ margin-left:100px;
+}
+footer{
+ margin:0px;
+}
+footer .text-justify{
+ margin-bottom:20px;
+}
+footer .text-justify a{
+ color:#606060;
+}
+footer .text-justify a:hover{
+ color:#878785;
+ text-decoration: none;
+}
+.navbar .border-box .row{
+ font-size:11px;
+ margin-top:25px;
+}
+
+.col-md-10 .panel-default {
+ max-height: 25px;
+}
+.panel-default .panel-heading{
+ max-height:40px;
+}
+.panel-default .panel-heading h4{
+ margin-top:0px;
+}
+.outerborder{
+ padding-right: 0px;
+ padding-left: 0px;
+ border: 1px solid #fff;
+ padding-bottom: 10px;
+ border-color: #f7f7f4;
+ margin-bottom:15px;
+}
+.outerborder .panel{
+ margin-bottom:10px;
+}
+
+.formrow{
+ background-color: transparent;
+ clear: both;
+ margin: 2px;
+ padding-top: 5px;
+ color: #000;
+ font-size: 12px;
+}
+.footer-hed{
+ font-weight:bold;
+}
+.border-box .text-justify{
+ font-size:11px;
+}
+.footer-setting{
+ margin-top:50px;
+}
+hr{margin:0px;}
+.tg {border-collapse:collapse;border-spacing:0;}
+.tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;}
+.tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:bold;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;}
+.tg .tg-yw4l{vertical-align:top}
\ No newline at end of file
A footer.php
+54 −0
--- /dev/null
+++ b/footer.php
@@ -0,0 +1,54 @@
+<div class="navbar navbar-inverse footer-setting" style="margin-bottom:0px;">
+ <footer class="container border-box">
+ <div class="row">
+
+ <div class="col-lg-4">
+ <div class="col-lg-12">
+ <h6 class="footer-hed">Customer Service</h6>
+ <p class="pull-left"><a target="_blank" href="http://www.digibank.gov.in/complaints/customer-care.html" title="Safe Banking">Customer Care Numbers</a></p>
+ </div>
+ <div class="col-lg-12"></div>
+ <div class="col-lg-12">
+ <h6 class="footer-hed">Customer Service</h6>
+ <p class="pull-left"><a target="_blank" href="http://www.digibank.gov.in/online-safe-banking/index.html" title="Safe Banking" >Safe Banking</a> | <a target="_blank" href="http://www.digibank.gov.in/go-green/Index.html" title="Go Green">Go Green</a></p>
+ </div>
+ </div>
+ <div class="col-lg-4">
+ <h6 class="text-center footer-hed">Useful Link</h6>
+ <p class="text-center" style="text-align:justify"><a target="_blank" href="https://Digibank.co.in/BANKAWAY?Action.RetriveUserId.Acct.first=Y&amp;folderId=AL&amp;AppSignonBankId=ICI&amp;AppType=corporate&amp;abrdPrf=N" title="Get User ID">Get User ID</a> | <a target="_blank" href="http://www.digibank.gov.in/Personal-Banking/insta-banking/insta-index.html" title="Ways To Bank">Ways To Bank</a> | <a target="_blank" href="http://www.digibank.gov.in/Personal-Banking/insta-banking/internet-banking/index.html" title="Online Banking">Online Banking</a> |
+<a target="_blank" href="http://www.digibank.gov.in/Personal-Banking/account-deposit/savings-account/index.html" title="Savings Account">Savings Account</a> | <a target="_blank" href="http://www.digibank.gov.in/Personal-Banking/investments/ppf/ppf.html" title="PPF">PPF</a> | <a target="_blank" href="http://www.digibank.gov.in/financial-tools/index.html" title="Personal Finance Tools">Personal Finance Tools</a> |
+<a target="_blank" href="http://www.digibank.gov.in/form-center.html" title="Form Center">Form Center</a> | <a target="_blank" href="http://www.digibank.gov.in/Personal-Banking/investments/Digi-bank-pure-gold/gold-rate.html" title="Gold Rate Today">Gold Rate Today</a> | <a target="_blank" href="http://www.digibank.gov.in/media-gallery/media-gallery.html" title="Media Gallery">Media Gallery</a> | <a target="_blank" href="http://www.digibank.gov.in/Personal-Banking/credit-card/credit-cards.html" title="Credit Card">Credit Card</a>
+ </p>
+ </div>
+ <div class="col-lg-4">
+ <h6 class="pull-right footer-hed" style="padding-right:10px;">Visit Other DGI Bank Sites</h6>
+ <p class="pull-right" style="text-align: justify"><a target="_blank" href="http://www.Digigroupcompanies.com/" title="DIGI Group">DIGI Group</a> | <a target="_blank" href="http://www.Digifoundation.org/" title="DIGI Foundation">DIGI Foundation</a> |
+<a target="_blank" href="https://www.Digilombard.com/" title="DIGI Lombard General Insurance">DIGI Lombard General Insurance</a> |
+<a target="_blank" href="http://www.iseconline.com/" title="DIGI Securities">DIGI Securities</a> |
+<a target="_blank" href="http://www.Digiprulife.com/public/default.htm" title="DIGI Prudential Life Insurance">DIGI Prudential Life Insurance</a> |
+<a target="_blank" href="http://www.Digipruamc.com/Homepage.aspx" title="DIGI Prudential AMC">DIGI Prudential AMC</a> |
+<a target="_blank" href="http://www.Digiventure.com/" title="DIGI Venture">DIGI Venture</a> | <a target="_blank" href="http://content.Digidirect.com/newsitecontent/Home/Home.asp" title="DIGI Direct">DIGI Direct</a> |
+<a target="_blank" href="http://dishafc.org/" title="DISHA Financial Counselling">DISHA Financial Counselling</a> |
+<a target="_blank" href="http://www.Digihfc.com/" title="DIGI Home Finance">DIGI Home Finance</a></p>
+ </div>
+ </div>
+
+ <div class="col-lg-12">
+ <p class="text-justify">
+ <a target="_blank" href="http://www.digibank.gov.in/terms-condition/terms-and-conditions.html" title="Terms &amp; Conditions">Terms &amp; Conditions</a> | <a target="_blank" href="http://www.digibank.gov.in/interest-rates.html" title="Interest Rates">Interest Rates</a> | <a target="_blank" href="http://www.digibank.gov.in/service-charges/service-charges.html" title="Service Charges &amp; Fees">Service Charges &amp; Fees</a> | <a target="_blank" href="http://www.digibank.gov.in/do-not-call.html" title="Do Not Call Registry">Do Not Call Registry</a> | <a target="_blank" href="http://www.digibank.gov.in/disclaimer.html" title="Disclaimer">Disclaimer</a> | <a target="_blank" href="http://www.digibank.gov.in/multilingual-disclaimer.html" title="Multilingual Disclaimer">Multilingual Disclaimer</a> | <a target="_blank" href="http://www.digibank.gov.in/code-of-commitment.html" title="Code of Commitment">Code of Commitment</a> | <a target="_blank" href="http://www.digibank.gov.in/aboutus/pdf/code_of_business_conduct_ethics.pdf" title="Group Code of Business Conduct and Ethics">Group Code of Business Conduct and Ethics</a> | <a target="_blank" href="http://www.digibank.gov.in/aboutus/invest-disclosure.html" title="Basel II Disclosures">Basel II Disclosures</a> | <a target="_blank" href="http://www.digibank.gov.in/notice-board.html" title="Notice Board">Notice Board</a> | <a target="_blank" href="http://www.digibank.gov.in/unparliamentary-language-by-customers.html" title="Use of Unparliamentary Language by Customers">Use of Unparliamentary Language by Customers</a> | <a target="_blank" href="http://www.digibank.gov.in/privacy.html" title="Privacy">Privacy</a> | <a target="_blank" href="http://www.digibank.gov.in/usa-patriot-act-certification.html" title="USA Patriot Act Certification">USA Patriot Act Certification</a> </p>
+
+ </div>
+ </footer>
+
+ </div>
+
+<script language="javascript" charset="UTF-8" type="text/javascript" src="js/stats.js"></script>
+ <!-- /.container -->
+ <!-- jQuery -->
+
+
+ <!-- Bootstrap Core JavaScript -->
+ <script src="js/bootstrap.min.js"></script>
+</body>
+
+</html>
\ No newline at end of file
A header.php
+79 −0
--- /dev/null
+++ b/header.php
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="description" content="">
+ <meta name="author" content="">
+
+ <title>Bank Demo</title>
+
+ <!-- Bootstrap Core CSS -->
+ <link href="css/bootstrap.min.css" rel="stylesheet">
+
+ <!-- Custom CSS -->
+ <link href="css/style.css" rel="stylesheet">
+
+ <!-- Custom Fonts -->
+ <link href="font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css">
+ <style>
+ @media (min-width: 768px){
+ .navbar-nav>li>a {
+ font-size:11px;
+ padding-top: 8px;
+ padding-bottom: 0px;
+ color: #fff;
+ padding-bottom: 8px;
+ }
+ .navbar-nav>li>a:hover{ color: #000; background-color:#f0ede4;}
+ }
+ </style>
+
+</head>
+
+<body>
+
+ <!-- Navigation -->
+ <div class="container">
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
+ <span class="sr-only">Toggle navigation</span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <a class="navbar-brand" href="index.html"><img src="images/digibank.png"></a>
+ </div>
+ </div>
+ <nav role="navigation" style="background-color: blueviolet; margin-bottom: 15px;height: 35px; position: relative;" >
+ <div class="container">
+ <!-- Brand and toggle get grouped for better mobile display -->
+
+ <!-- Collect the nav links, forms, and other content for toggling -->
+ <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
+ <ul class="nav navbar-nav navbar-left ">
+ <li>
+ <a href="index.php">LINK TO DIGILOCKER</a>
+ </li>
+ <li>
+ <a target="_blank" href="loanapproval.php">APPLY FOR LOAN</a>
+ </li>
+ <li>
+ <a target="_blank" href="accountstatement.php">ACCOUNT STATEMENT</a>
+ </li>
+ <li>
+ <a target="_blank" href="link_document.php">LINK-DOC INDRESH</a>
+ </li>
+ <li>
+ <a target="_blank" href="index_indresh.php">LINK-DLOCK INDRESH</a>
+ </li>
+
+ </ul>
+ </div>
+ <!-- /.navbar-collapse -->
+ </div>
+ <!-- /.container -->
+ </nav>
\ No newline at end of file
Binary files /dev/null and b/images/digibank.png differ
M index.php
+62 −99
--- 'a/index.php'
+++ b/index.php
@@ -1,104 +1,67 @@
-<!DOCTYPE html>
-<html lang="en">
- <head>
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="description" content="">
- <meta name="author" content="">
- <title>DigiBank</title>
- <!-- Bootstrap Core CSS -->
- <link href="css/bootstrap.min.css" rel="stylesheet">
- <!-- Custom CSS -->
- <link href="css/digi-bank.css" rel="stylesheet">
- <!-- Custom Fonts -->
- <link href="font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css">
- </head>
- <body>
- <div id="wrapper">
- <!-- Navigation -->
- <nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
- <!-- Brand and toggle get grouped for better mobile display -->
- <div class="navbar-header">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- <a class="navbar-brand" href="index.html">DigiBank</a>
- </div>
- <!-- Sidebar Menu Items - These collapse to the responsive navigation menu on small screens -->
- <div class="collapse navbar-collapse navbar-ex1-collapse">
- <ul class="nav navbar-nav side-nav">
- <li class="active">
- <a href="index.php"><i class="fa fa-fw fa-clock-o"></i> Link To DigiLocker</a>
- </li>
- <li>
- <a href="link_document.php"><i class="fa fa-fw fa-link"></i> Loan Approvals</a>
- </li>
- <li>
- <a href="statement.php"><i class="fa fa-fw fa-stack-exchange"></i>Account Statements</a>
- </li>
- </ul>
- </div>
- <!-- /.navbar-collapse -->
- </nav>
- <div id="page-wrapper">
- <div class="container-fluid">
- <!-- Page Heading -->
- <div class="row">
- <div class="col-lg-12">
- <h1 class="page-header">
- <small>Link TO DigiLocker</small>
- </h1>
- <div class="col-md-3"></div>
- <div class="col-md-6">
- <form action = "https://developers.digitallocker.gov.in/public/oauth2/1/authorize" method = "GET" role="form">
- <div class="form-group has-success">
- <label class="control-label" for="inputSuccess">Response Type</label>
- <input type="text" class="form-control" name = "response_type" value="code">
- </div>
- <div class="form-group has-success">
- <label class="control-label" for="inputSuccess">Client ID</label>
- <input type="text" class="form-control" name = "client_id" value="NIELN3M9">
- </div>
- <div class="form-group has-success">
- <label class="control-label" for="inputSuccess">Redirect Uri</label>
- <input type="text" class="form-control" name = "redirect_uri" value="http://localhost/digibank/response.php">
- </div>
- <div class="form-group has-success">
- <label class="control-label" for="inputSuccess">State</label>
- <input type="text" class="form-control" name = "state" value="123456">
- </div>
- <div class="row">
- <div class="col-md-6">
- <button type="submit" class="btn btn-default pull-right">Submit</button></div>
- <div class="col-md-6">
- <button type="reset" class="btn btn-default pull-left">Reset</button></div>
- </div>
- </form>
- </div>
- <div class="col-md-3"></div>
- </div>
+<?php include 'header.php' ?>
+ <div class="container">
-
+
+ <!-- Marketing Icons Section -->
+ <div class="row">
+
+ <div class="col-md-2">
+ </div>
+ <div class="col-md-8">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h4><i class="fa fa-fw fa-link"></i> Link to Digilocker</h4>
+ </div>
+ <div class="panel-body">
+ <p>DigiLocker is Government of India's cloud based platform for issuance and verification of documents &amp; certificates digitally. </p>
+ <p>With DigiLocker, you can: </p>
+ <ul class="custom-bullet">
+ <li>Access your documents anytime, anywhere.</li>
+ <li>Share documents digitally for verification.</li>
+ <li>eSign documents (which is similar to self-attestation).</li>
+
+ </ul>
+ <a href="https://digilocker.gov.in/index.php" class="btn btn-default">Access Digilocker</a>
</div>
</div>
- <!-- /.container-fluid -->
</div>
- <!-- /#page-wrapper -->
- <nav class="navbar navbar-inverse navbar-fixed-bottom" role="navigation">
- <!-- Brand and toggle get grouped for better mobile display -->
-
- <!-- Top Menu Items -->
-
- <!-- Sidebar Menu Items - These collapse to the responsive navigation menu on small screens -->
+ <div class="col-md-2">
+ </div>
+ </div>
+ <div class="row">
+
+ <div class="col-md-1">
+ </div>
+ <div class="col-md-10 outerborder">
+ <div class="panel panel-default">
+ <p class="para">
+ Important security information:
+ </p>
+ </div>
+ <div class="row">
+ <ul class="custom-bullet">
+
+ <li class="formrow">
+ Before logging in, please ensure that the URL address on the address bar of your internet browser starts with <a href="#">demobank.gov.in.</a>
+ </li>
+ <li class="formrow">
+ Never provide your User ID or password to any one on phone or in response to a mail.<a href="#">&nbsp;Report a suspicious mail</a>.
+ </li>
+ <li class="formrow">
+ Do not enter login or other sensitive information in any pop up window.
+ </li>
+ <li class="formrow">
+ Verify the site's security certificate by clicking on the padlock icon of your internet browser. For more details, <a href="#">click here</a>.
+ </li>
+
+ </ul>
+ </div>
+ </div>
+ <div class="col-md-1">
+ </div>
+ </div>
+ <!-- /.row -->
+
- <!-- /.navbar-collapse -->
- </nav>
- </div><!-- jQuery -->
- <script src="js/jquery.js"></script><!-- Bootstrap Core JavaScript -->
- <script src="js/bootstrap.min.js"></script>
- </body>
-</html>
+ </div>
+ <?php include 'footer.php' ?>
\ No newline at end of file
A index_indresh.php
+90 −0
--- /dev/null
+++ b/index_indresh.php
@@ -0,0 +1,90 @@
+<?php include 'header.php' ?>
+<div class="container">
+
+ <div class="col-lg-2"></div>
+ <div class="col-lg-8">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h4><i class="fa fa-fw fa-link"></i> Link TO DigiLocker</h4>
+ </div>
+ <div class="panel-body">
+
+ <form role="form">
+
+ <div class="col-lg-12">
+
+ <div class="row">
+ <div class="col-lg-12 form-group">
+ <div class="col-lg-12 nor-font">
+ <label>Response Type</label>
+ <input class="form-control height-form">
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-lg-12 form-group">
+ <div class="col-lg-12 nor-font">
+ <label>Client ID</label>
+ <input class="form-control height-form">
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-lg-12 form-group">
+ <div class="col-lg-12 nor-font">
+ <label>Redirect Uri</label>
+ <input class="form-control height-form">
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-lg-12 form-group">
+ <div class="col-lg-12 nor-font">
+ <label>State</label>
+ <input class="form-control height-form">
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-lg-12 form-group text-center">
+
+ <button type="submit" class="btn btn-default form-group">Submit</button>
+
+ <button type="reset" class="btn btn-default form-group">Reset</button>
+
+ </div>
+ </div>
+ </div>
+
+
+
+
+
+ </form>
+
+
+
+ </div>
+ </div>
+
+ </div>
+ <div class="col-lg-2"></div>
+
+ <!-- /.row -->
+
+
+</div>
+<script src="js/jquery.js"></script>
+<script>
+ var dls_server = 'https://developers.digitallocker.gov.in/public/oauth2/1/authorize';
+ $('.dl_pop').click(function () {
+
+
+ CallDL('code', '7QAKRAJO', '123456', 'http://localhost/curlexample/response.php');
+ });
+ function CallDL(requester_id, hash_key, time_st, hostname) {
+ window.open(dls_server + "?response_type=" + requester_id + "&client_id=" + hash_key + "&state=" + time_st + "&redirect_uri=" + hostname, "_blank", "height=500,width=600,status=yes,toolbar=no,menubar=no,location=no");
+ }
+</script>
+
+<?php include 'footer.php' ?>
\ No newline at end of file
--- /dev/null
+++ b/js/jqBootstrapValidation.js
@@ -0,0 +1,912 @@
+/* jqBootstrapValidation
+ * A plugin for automating validation on Twitter Bootstrap formatted forms.
+ *
+ * v1.3.6
+ *
+ * License: MIT <http://opensource.org/licenses/mit-license.php> - see LICENSE file
+ *
+ * http://ReactiveRaven.github.com/jqBootstrapValidation/
+ */
+
+(function( $ ){
+
+ var createdElements = [];
+
+ var defaults = {
+ options: {
+ prependExistingHelpBlock: false,
+ sniffHtml: true, // sniff for 'required', 'maxlength', etc
+ preventSubmit: true, // stop the form submit event from firing if validation fails
+ submitError: false, // function called if there is an error when trying to submit
+ submitSuccess: false, // function called just before a successful submit event is sent to the server
+ semanticallyStrict: false, // set to true to tidy up generated HTML output
+ autoAdd: {
+ helpBlocks: true
+ },
+ filter: function () {
+ // return $(this).is(":visible"); // only validate elements you can see
+ return true; // validate everything
+ }
+ },
+ methods: {
+ init : function( options ) {
+
+ var settings = $.extend(true, {}, defaults);
+
+ settings.options = $.extend(true, settings.options, options);
+
+ var $siblingElements = this;
+
+ var uniqueForms = $.unique(
+ $siblingElements.map( function () {
+ return $(this).parents("form")[0];
+ }).toArray()
+ );
+
+ $(uniqueForms).bind("submit", function (e) {
+ var $form = $(this);
+ var warningsFound = 0;
+ var $inputs = $form.find("input,textarea,select").not("[type=submit],[type=image]").filter(settings.options.filter);
+ $inputs.trigger("submit.validation").trigger("validationLostFocus.validation");
+
+ $inputs.each(function (i, el) {
+ var $this = $(el),
+ $controlGroup = $this.parents(".control-group").first();
+ if (
+ $controlGroup.hasClass("has-warning")
+ ) {
+ $controlGroup.removeClass("has-warning").addClass("has-error");
+ warningsFound++;
+ }
+ });
+
+ $inputs.trigger("validationLostFocus.validation");
+
+ if (warningsFound) {
+ if (settings.options.preventSubmit) {
+ e.preventDefault();
+ }
+ $form.addClass("has-error");
+ if ($.isFunction(settings.options.submitError)) {
+ settings.options.submitError($form, e, $inputs.jqBootstrapValidation("collectErrors", true));
+ }
+ } else {
+ $form.removeClass("has-error");
+ if ($.isFunction(settings.options.submitSuccess)) {
+ settings.options.submitSuccess($form, e);
+ }
+ }
+ });
+
+ return this.each(function(){
+
+ // Get references to everything we're interested in
+ var $this = $(this),
+ $controlGroup = $this.parents(".control-group").first(),
+ $helpBlock = $controlGroup.find(".help-block").first(),
+ $form = $this.parents("form").first(),
+ validatorNames = [];
+
+ // create message container if not exists
+ if (!$helpBlock.length && settings.options.autoAdd && settings.options.autoAdd.helpBlocks) {
+ $helpBlock = $('<div class="help-block" />');
+ $controlGroup.find('.controls').append($helpBlock);
+ createdElements.push($helpBlock[0]);
+ }
+
+ // =============================================================
+ // SNIFF HTML FOR VALIDATORS
+ // =============================================================
+
+ // *snort sniff snuffle*
+
+ if (settings.options.sniffHtml) {
+ var message = "";
+ // ---------------------------------------------------------
+ // PATTERN
+ // ---------------------------------------------------------
+ if ($this.attr("pattern") !== undefined) {
+ message = "Not in the expected format<!-- data-validation-pattern-message to override -->";
+ if ($this.data("validationPatternMessage")) {
+ message = $this.data("validationPatternMessage");
+ }
+ $this.data("validationPatternMessage", message);
+ $this.data("validationPatternRegex", $this.attr("pattern"));
+ }
+ // ---------------------------------------------------------
+ // MAX
+ // ---------------------------------------------------------
+ if ($this.attr("max") !== undefined || $this.attr("aria-valuemax") !== undefined) {
+ var max = ($this.attr("max") !== undefined ? $this.attr("max") : $this.attr("aria-valuemax"));
+ message = "Too high: Maximum of '" + max + "'<!-- data-validation-max-message to override -->";
+ if ($this.data("validationMaxMessage")) {
+ message = $this.data("validationMaxMessage");
+ }
+ $this.data("validationMaxMessage", message);
+ $this.data("validationMaxMax", max);
+ }
+ // ---------------------------------------------------------
+ // MIN
+ // ---------------------------------------------------------
+ if ($this.attr("min") !== undefined || $this.attr("aria-valuemin") !== undefined) {
+ var min = ($this.attr("min") !== undefined ? $this.attr("min") : $this.attr("aria-valuemin"));
+ message = "Too low: Minimum of '" + min + "'<!-- data-validation-min-message to override -->";
+ if ($this.data("validationMinMessage")) {
+ message = $this.data("validationMinMessage");
+ }
+ $this.data("validationMinMessage", message);
+ $this.data("validationMinMin", min);
+ }
+ // ---------------------------------------------------------
+ // MAXLENGTH
+ // ---------------------------------------------------------
+ if ($this.attr("maxlength") !== undefined) {
+ message = "Too long: Maximum of '" + $this.attr("maxlength") + "' characters<!-- data-validation-maxlength-message to override -->";
+ if ($this.data("validationMaxlengthMessage")) {
+ message = $this.data("validationMaxlengthMessage");
+ }
+ $this.data("validationMaxlengthMessage", message);
+ $this.data("validationMaxlengthMaxlength", $this.attr("maxlength"));
+ }
+ // ---------------------------------------------------------
+ // MINLENGTH
+ // ---------------------------------------------------------
+ if ($this.attr("minlength") !== undefined) {
+ message = "Too short: Minimum of '" + $this.attr("minlength") + "' characters<!-- data-validation-minlength-message to override -->";
+ if ($this.data("validationMinlengthMessage")) {
+ message = $this.data("validationMinlengthMessage");
+ }
+ $this.data("validationMinlengthMessage", message);
+ $this.data("validationMinlengthMinlength", $this.attr("minlength"));
+ }
+ // ---------------------------------------------------------
+ // REQUIRED
+ // ---------------------------------------------------------
+ if ($this.attr("required") !== undefined || $this.attr("aria-required") !== undefined) {
+ message = settings.builtInValidators.required.message;
+ if ($this.data("validationRequiredMessage")) {
+ message = $this.data("validationRequiredMessage");
+ }
+ $this.data("validationRequiredMessage", message);
+ }
+ // ---------------------------------------------------------
+ // NUMBER
+ // ---------------------------------------------------------
+ if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "number") {
+ message = settings.builtInValidators.number.message;
+ if ($this.data("validationNumberMessage")) {
+ message = $this.data("validationNumberMessage");
+ }
+ $this.data("validationNumberMessage", message);
+ }
+ // ---------------------------------------------------------
+ // EMAIL
+ // ---------------------------------------------------------
+ if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "email") {
+ message = "Not a valid email address<!-- data-validator-validemail-message to override -->";
+ if ($this.data("validationValidemailMessage")) {
+ message = $this.data("validationValidemailMessage");
+ } else if ($this.data("validationEmailMessage")) {
+ message = $this.data("validationEmailMessage");
+ }
+ $this.data("validationValidemailMessage", message);
+ }
+ // ---------------------------------------------------------
+ // MINCHECKED
+ // ---------------------------------------------------------
+ if ($this.attr("minchecked") !== undefined) {
+ message = "Not enough options checked; Minimum of '" + $this.attr("minchecked") + "' required<!-- data-validation-minchecked-message to override -->";
+ if ($this.data("validationMincheckedMessage")) {
+ message = $this.data("validationMincheckedMessage");
+ }
+ $this.data("validationMincheckedMessage", message);
+ $this.data("validationMincheckedMinchecked", $this.attr("minchecked"));
+ }
+ // ---------------------------------------------------------
+ // MAXCHECKED
+ // ---------------------------------------------------------
+ if ($this.attr("maxchecked") !== undefined) {
+ message = "Too many options checked; Maximum of '" + $this.attr("maxchecked") + "' required<!-- data-validation-maxchecked-message to override -->";
+ if ($this.data("validationMaxcheckedMessage")) {
+ message = $this.data("validationMaxcheckedMessage");
+ }
+ $this.data("validationMaxcheckedMessage", message);
+ $this.data("validationMaxcheckedMaxchecked", $this.attr("maxchecked"));
+ }
+ }
+
+ // =============================================================
+ // COLLECT VALIDATOR NAMES
+ // =============================================================
+
+ // Get named validators
+ if ($this.data("validation") !== undefined) {
+ validatorNames = $this.data("validation").split(",");
+ }
+
+ // Get extra ones defined on the element's data attributes
+ $.each($this.data(), function (i, el) {
+ var parts = i.replace(/([A-Z])/g, ",$1").split(",");
+ if (parts[0] === "validation" && parts[1]) {
+ validatorNames.push(parts[1]);
+ }
+ });
+
+ // =============================================================
+ // NORMALISE VALIDATOR NAMES
+ // =============================================================
+
+ var validatorNamesToInspect = validatorNames;
+ var newValidatorNamesToInspect = [];
+
+ do // repeatedly expand 'shortcut' validators into their real validators
+ {
+ // Uppercase only the first letter of each name
+ $.each(validatorNames, function (i, el) {
+ validatorNames[i] = formatValidatorName(el);
+ });
+
+ // Remove duplicate validator names
+ validatorNames = $.unique(validatorNames);
+
+ // Pull out the new validator names from each shortcut
+ newValidatorNamesToInspect = [];
+ $.each(validatorNamesToInspect, function(i, el) {
+ if ($this.data("validation" + el + "Shortcut") !== undefined) {
+ // Are these custom validators?
+ // Pull them out!
+ $.each($this.data("validation" + el + "Shortcut").split(","), function(i2, el2) {
+ newValidatorNamesToInspect.push(el2);
+ });
+ } else if (settings.builtInValidators[el.toLowerCase()]) {
+ // Is this a recognised built-in?
+ // Pull it out!
+ var validator = settings.builtInValidators[el.toLowerCase()];
+ if (validator.type.toLowerCase() === "shortcut") {
+ $.each(validator.shortcut.split(","), function (i, el) {
+ el = formatValidatorName(el);
+ newValidatorNamesToInspect.push(el);
+ validatorNames.push(el);
+ });
+ }
+ }
+ });
+
+ validatorNamesToInspect = newValidatorNamesToInspect;
+
+ } while (validatorNamesToInspect.length > 0)
+
+ // =============================================================
+ // SET UP VALIDATOR ARRAYS
+ // =============================================================
+
+ var validators = {};
+
+ $.each(validatorNames, function (i, el) {
+ // Set up the 'override' message
+ var message = $this.data("validation" + el + "Message");
+ var hasOverrideMessage = (message !== undefined);
+ var foundValidator = false;
+ message =
+ (
+ message
+ ? message
+ : "'" + el + "' validation failed <!-- Add attribute 'data-validation-" + el.toLowerCase() + "-message' to input to change this message -->"
+ )
+ ;
+
+ $.each(
+ settings.validatorTypes,
+ function (validatorType, validatorTemplate) {
+ if (validators[validatorType] === undefined) {
+ validators[validatorType] = [];
+ }
+ if (!foundValidator && $this.data("validation" + el + formatValidatorName(validatorTemplate.name)) !== undefined) {
+ validators[validatorType].push(
+ $.extend(
+ true,
+ {
+ name: formatValidatorName(validatorTemplate.name),
+ message: message
+ },
+ validatorTemplate.init($this, el)
+ )
+ );
+ foundValidator = true;
+ }
+ }
+ );
+
+ if (!foundValidator && settings.builtInValidators[el.toLowerCase()]) {
+
+ var validator = $.extend(true, {}, settings.builtInValidators[el.toLowerCase()]);
+ if (hasOverrideMessage) {
+ validator.message = message;
+ }
+ var validatorType = validator.type.toLowerCase();
+
+ if (validatorType === "shortcut") {
+ foundValidator = true;
+ } else {
+ $.each(
+ settings.validatorTypes,
+ function (validatorTemplateType, validatorTemplate) {
+ if (validators[validatorTemplateType] === undefined) {
+ validators[validatorTemplateType] = [];
+ }
+ if (!foundValidator && validatorType === validatorTemplateType.toLowerCase()) {
+ $this.data("validation" + el + formatValidatorName(validatorTemplate.name), validator[validatorTemplate.name.toLowerCase()]);
+ validators[validatorType].push(
+ $.extend(
+ validator,
+ validatorTemplate.init($this, el)
+ )
+ );
+ foundValidator = true;
+ }
+ }
+ );
+ }
+ }
+
+ if (! foundValidator) {
+ $.error("Cannot find validation info for '" + el + "'");
+ }
+ });
+
+ // =============================================================
+ // STORE FALLBACK VALUES
+ // =============================================================
+
+ $helpBlock.data(
+ "original-contents",
+ (
+ $helpBlock.data("original-contents")
+ ? $helpBlock.data("original-contents")
+ : $helpBlock.html()
+ )
+ );
+
+ $helpBlock.data(
+ "original-role",
+ (
+ $helpBlock.data("original-role")
+ ? $helpBlock.data("original-role")
+ : $helpBlock.attr("role")
+ )
+ );
+
+ $controlGroup.data(
+ "original-classes",
+ (
+ $controlGroup.data("original-clases")
+ ? $controlGroup.data("original-classes")
+ : $controlGroup.attr("class")
+ )
+ );
+
+ $this.data(
+ "original-aria-invalid",
+ (
+ $this.data("original-aria-invalid")
+ ? $this.data("original-aria-invalid")
+ : $this.attr("aria-invalid")
+ )
+ );
+
+ // =============================================================
+ // VALIDATION
+ // =============================================================
+
+ $this.bind(
+ "validation.validation",
+ function (event, params) {
+
+ var value = getValue($this);
+
+ // Get a list of the errors to apply
+ var errorsFound = [];
+
+ $.each(validators, function (validatorType, validatorTypeArray) {
+ if (value || value.length || (params && params.includeEmpty) || (!!settings.validatorTypes[validatorType].blockSubmit && params && !!params.submitting)) {
+ $.each(validatorTypeArray, function (i, validator) {
+ if (settings.validatorTypes[validatorType].validate($this, value, validator)) {
+ errorsFound.push(validator.message);
+ }
+ });
+ }
+ });
+
+ return errorsFound;
+ }
+ );
+
+ $this.bind(
+ "getValidators.validation",
+ function () {
+ return validators;
+ }
+ );
+
+ // =============================================================
+ // WATCH FOR CHANGES
+ // =============================================================
+ $this.bind(
+ "submit.validation",
+ function () {
+ return $this.triggerHandler("change.validation", {submitting: true});
+ }
+ );
+ $this.bind(
+ [
+ "keyup",
+ "focus",
+ "blur",
+ "click",
+ "keydown",
+ "keypress",
+ "change"
+ ].join(".validation ") + ".validation",
+ function (e, params) {
+
+ var value = getValue($this);
+
+ var errorsFound = [];
+
+ $controlGroup.find("input,textarea,select").each(function (i, el) {
+ var oldCount = errorsFound.length;
+ $.each($(el).triggerHandler("validation.validation", params), function (j, message) {
+ errorsFound.push(message);
+ });
+ if (errorsFound.length > oldCount) {
+ $(el).attr("aria-invalid", "true");
+ } else {
+ var original = $this.data("original-aria-invalid");
+ $(el).attr("aria-invalid", (original !== undefined ? original : false));
+ }
+ });
+
+ $form.find("input,select,textarea").not($this).not("[name=\"" + $this.attr("name") + "\"]").trigger("validationLostFocus.validation");
+
+ errorsFound = $.unique(errorsFound.sort());
+
+ // Were there any errors?
+ if (errorsFound.length) {
+ // Better flag it up as a warning.
+ $controlGroup.removeClass("has-success has-error").addClass("has-warning");
+
+ // How many errors did we find?
+ if (settings.options.semanticallyStrict && errorsFound.length === 1) {
+ // Only one? Being strict? Just output it.
+ $helpBlock.html(errorsFound[0] +
+ ( settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : "" ));
+ } else {
+ // Multiple? Being sloppy? Glue them together into an UL.
+ $helpBlock.html("<ul role=\"alert\"><li>" + errorsFound.join("</li><li>") + "</li></ul>" +
+ ( settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : "" ));
+ }
+ } else {
+ $controlGroup.removeClass("has-warning has-error has-success");
+ if (value.length > 0) {
+ $controlGroup.addClass("has-success");
+ }
+ $helpBlock.html($helpBlock.data("original-contents"));
+ }
+
+ if (e.type === "blur") {
+ $controlGroup.removeClass("has-success");
+ }
+ }
+ );
+ $this.bind("validationLostFocus.validation", function () {
+ $controlGroup.removeClass("has-success");
+ });
+ });
+ },
+ destroy : function( ) {
+
+ return this.each(
+ function() {
+
+ var
+ $this = $(this),
+ $controlGroup = $this.parents(".control-group").first(),
+ $helpBlock = $controlGroup.find(".help-block").first();
+
+ // remove our events
+ $this.unbind('.validation'); // events are namespaced.
+ // reset help text
+ $helpBlock.html($helpBlock.data("original-contents"));
+ // reset classes
+ $controlGroup.attr("class", $controlGroup.data("original-classes"));
+ // reset aria
+ $this.attr("aria-invalid", $this.data("original-aria-invalid"));
+ // reset role
+ $helpBlock.attr("role", $this.data("original-role"));
+ // remove all elements we created
+ if (createdElements.indexOf($helpBlock[0]) > -1) {
+ $helpBlock.remove();
+ }
+
+ }
+ );
+
+ },
+ collectErrors : function(includeEmpty) {
+
+ var errorMessages = {};
+ this.each(function (i, el) {
+ var $el = $(el);
+ var name = $el.attr("name");
+ var errors = $el.triggerHandler("validation.validation", {includeEmpty: true});
+ errorMessages[name] = $.extend(true, errors, errorMessages[name]);
+ });
+
+ $.each(errorMessages, function (i, el) {
+ if (el.length === 0) {
+ delete errorMessages[i];
+ }
+ });
+
+ return errorMessages;
+
+ },
+ hasErrors: function() {
+
+ var errorMessages = [];
+
+ this.each(function (i, el) {
+ errorMessages = errorMessages.concat(
+ $(el).triggerHandler("getValidators.validation") ? $(el).triggerHandler("validation.validation", {submitting: true}) : []
+ );
+ });
+
+ return (errorMessages.length > 0);
+ },
+ override : function (newDefaults) {
+ defaults = $.extend(true, defaults, newDefaults);
+ }
+ },
+ validatorTypes: {
+ callback: {
+ name: "callback",
+ init: function ($this, name) {
+ return {
+ validatorName: name,
+ callback: $this.data("validation" + name + "Callback"),
+ lastValue: $this.val(),
+ lastValid: true,
+ lastFinished: true
+ };
+ },
+ validate: function ($this, value, validator) {
+ if (validator.lastValue === value && validator.lastFinished) {
+ return !validator.lastValid;
+ }
+
+ if (validator.lastFinished === true)
+ {
+ validator.lastValue = value;
+ validator.lastValid = true;
+ validator.lastFinished = false;
+
+ var rrjqbvValidator = validator;
+ var rrjqbvThis = $this;
+ executeFunctionByName(
+ validator.callback,
+ window,
+ $this,
+ value,
+ function (data) {
+ if (rrjqbvValidator.lastValue === data.value) {
+ rrjqbvValidator.lastValid = data.valid;
+ if (data.message) {
+ rrjqbvValidator.message = data.message;
+ }
+ rrjqbvValidator.lastFinished = true;
+ rrjqbvThis.data("validation" + rrjqbvValidator.validatorName + "Message", rrjqbvValidator.message);
+ // Timeout is set to avoid problems with the events being considered 'already fired'
+ setTimeout(function () {
+ rrjqbvThis.trigger("change.validation");
+ }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst
+ }
+ }
+ );
+ }
+
+ return false;
+
+ }
+ },
+ ajax: {
+ name: "ajax",
+ init: function ($this, name) {
+ return {
+ validatorName: name,
+ url: $this.data("validation" + name + "Ajax"),
+ lastValue: $this.val(),
+ lastValid: true,
+ lastFinished: true
+ };
+ },
+ validate: function ($this, value, validator) {
+ if (""+validator.lastValue === ""+value && validator.lastFinished === true) {
+ return validator.lastValid === false;
+ }
+
+ if (validator.lastFinished === true)
+ {
+ validator.lastValue = value;
+ validator.lastValid = true;
+ validator.lastFinished = false;
+ $.ajax({
+ url: validator.url,
+ data: "value=" + value + "&field=" + $this.attr("name"),
+ dataType: "json",
+ success: function (data) {
+ if (""+validator.lastValue === ""+data.value) {
+ validator.lastValid = !!(data.valid);
+ if (data.message) {
+ validator.message = data.message;
+ }
+ validator.lastFinished = true;
+ $this.data("validation" + validator.validatorName + "Message", validator.message);
+ // Timeout is set to avoid problems with the events being considered 'already fired'
+ setTimeout(function () {
+ $this.trigger("change.validation");
+ }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst
+ }
+ },
+ failure: function () {
+ validator.lastValid = true;
+ validator.message = "ajax call failed";
+ validator.lastFinished = true;
+ $this.data("validation" + validator.validatorName + "Message", validator.message);
+ // Timeout is set to avoid problems with the events being considered 'already fired'
+ setTimeout(function () {
+ $this.trigger("change.validation");
+ }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst
+ }
+ });
+ }
+
+ return false;
+
+ }
+ },
+ regex: {
+ name: "regex",
+ init: function ($this, name) {
+ return {regex: regexFromString($this.data("validation" + name + "Regex"))};
+ },
+ validate: function ($this, value, validator) {
+ return (!validator.regex.test(value) && ! validator.negative)
+ || (validator.regex.test(value) && validator.negative);
+ }
+ },
+ required: {
+ name: "required",
+ init: function ($this, name) {
+ return {};
+ },
+ validate: function ($this, value, validator) {
+ return !!(value.length === 0 && ! validator.negative)
+ || !!(value.length > 0 && validator.negative);
+ },
+ blockSubmit: true
+ },
+ match: {
+ name: "match",
+ init: function ($this, name) {
+ var element = $this.parents("form").first().find("[name=\"" + $this.data("validation" + name + "Match") + "\"]").first();
+ element.bind("validation.validation", function () {
+ $this.trigger("change.validation", {submitting: true});
+ });
+ return {"element": element};
+ },
+ validate: function ($this, value, validator) {
+ return (value !== validator.element.val() && ! validator.negative)
+ || (value === validator.element.val() && validator.negative);
+ },
+ blockSubmit: true
+ },
+ max: {
+ name: "max",
+ init: function ($this, name) {
+ return {max: $this.data("validation" + name + "Max")};
+ },
+ validate: function ($this, value, validator) {
+ return (parseFloat(value, 10) > parseFloat(validator.max, 10) && ! validator.negative)
+ || (parseFloat(value, 10) <= parseFloat(validator.max, 10) && validator.negative);
+ }
+ },
+ min: {
+ name: "min",
+ init: function ($this, name) {
+ return {min: $this.data("validation" + name + "Min")};
+ },
+ validate: function ($this, value, validator) {
+ return (parseFloat(value) < parseFloat(validator.min) && ! validator.negative)
+ || (parseFloat(value) >= parseFloat(validator.min) && validator.negative);
+ }
+ },
+ maxlength: {
+ name: "maxlength",
+ init: function ($this, name) {
+ return {maxlength: $this.data("validation" + name + "Maxlength")};
+ },
+ validate: function ($this, value, validator) {
+ return ((value.length > validator.maxlength) && ! validator.negative)
+ || ((value.length <= validator.maxlength) && validator.negative);
+ }
+ },
+ minlength: {
+ name: "minlength",
+ init: function ($this, name) {
+ return {minlength: $this.data("validation" + name + "Minlength")};
+ },
+ validate: function ($this, value, validator) {
+ return ((value.length < validator.minlength) && ! validator.negative)
+ || ((value.length >= validator.minlength) && validator.negative);
+ }
+ },
+ maxchecked: {
+ name: "maxchecked",
+ init: function ($this, name) {
+ var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]");
+ elements.bind("click.validation", function () {
+ $this.trigger("change.validation", {includeEmpty: true});
+ });
+ return {maxchecked: $this.data("validation" + name + "Maxchecked"), elements: elements};
+ },
+ validate: function ($this, value, validator) {
+ return (validator.elements.filter(":checked").length > validator.maxchecked && ! validator.negative)
+ || (validator.elements.filter(":checked").length <= validator.maxchecked && validator.negative);
+ },
+ blockSubmit: true
+ },
+ minchecked: {
+ name: "minchecked",
+ init: function ($this, name) {
+ var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]");
+ elements.bind("click.validation", function () {
+ $this.trigger("change.validation", {includeEmpty: true});
+ });
+ return {minchecked: $this.data("validation" + name + "Minchecked"), elements: elements};
+ },
+ validate: function ($this, value, validator) {
+ return (validator.elements.filter(":checked").length < validator.minchecked && ! validator.negative)
+ || (validator.elements.filter(":checked").length >= validator.minchecked && validator.negative);
+ },
+ blockSubmit: true
+ }
+ },
+ builtInValidators: {
+ email: {
+ name: "Email",
+ type: "shortcut",
+ shortcut: "validemail"
+ },
+ validemail: {
+ name: "Validemail",
+ type: "regex",
+ regex: "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\.[A-Za-z]{2,4}",
+ message: "Not a valid email address<!-- data-validator-validemail-message to override -->"
+ },
+ passwordagain: {
+ name: "Passwordagain",
+ type: "match",
+ match: "password",
+ message: "Does not match the given password<!-- data-validator-paswordagain-message to override -->"
+ },
+ positive: {
+ name: "Positive",
+ type: "shortcut",
+ shortcut: "number,positivenumber"
+ },
+ negative: {
+ name: "Negative",
+ type: "shortcut",
+ shortcut: "number,negativenumber"
+ },
+ number: {
+ name: "Number",
+ type: "regex",
+ regex: "([+-]?\\\d+(\\\.\\\d*)?([eE][+-]?[0-9]+)?)?",
+ message: "Must be a number<!-- data-validator-number-message to override -->"
+ },
+ integer: {
+ name: "Integer",
+ type: "regex",
+ regex: "[+-]?\\\d+",
+ message: "No decimal places allowed<!-- data-validator-integer-message to override -->"
+ },
+ positivenumber: {
+ name: "Positivenumber",
+ type: "min",
+ min: 0,
+ message: "Must be a positive number<!-- data-validator-positivenumber-message to override -->"
+ },
+ negativenumber: {
+ name: "Negativenumber",
+ type: "max",
+ max: 0,
+ message: "Must be a negative number<!-- data-validator-negativenumber-message to override -->"
+ },
+ required: {
+ name: "Required",
+ type: "required",
+ message: "This is required<!-- data-validator-required-message to override -->"
+ },
+ checkone: {
+ name: "Checkone",
+ type: "minchecked",
+ minchecked: 1,
+ message: "Check at least one option<!-- data-validation-checkone-message to override -->"
+ }
+ }
+ };
+
+ var formatValidatorName = function (name) {
+ return name
+ .toLowerCase()
+ .replace(
+ /(^|\s)([a-z])/g ,
+ function(m,p1,p2) {
+ return p1+p2.toUpperCase();
+ }
+ )
+ ;
+ };
+
+ var getValue = function ($this) {
+ // Extract the value we're talking about
+ var value = $this.val();
+ var type = $this.attr("type");
+ if (type === "checkbox") {
+ value = ($this.is(":checked") ? value : "");
+ }
+ if (type === "radio") {
+ value = ($('input[name="' + $this.attr("name") + '"]:checked').length > 0 ? value : "");
+ }
+ return value;
+ };
+
+ function regexFromString(inputstring) {
+ return new RegExp("^" + inputstring + "$");
+ }
+
+ /**
+ * Thanks to Jason Bunting via StackOverflow.com
+ *
+ * http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string#answer-359910
+ * Short link: http://tinyurl.com/executeFunctionByName
+ **/
+ function executeFunctionByName(functionName, context /*, args*/) {
+ var args = Array.prototype.slice.call(arguments).splice(2);
+ var namespaces = functionName.split(".");
+ var func = namespaces.pop();
+ for(var i = 0; i < namespaces.length; i++) {
+ context = context[namespaces[i]];
+ }
+ return context[func].apply(this, args);
+ }
+
+ $.fn.jqBootstrapValidation = function( method ) {
+
+ if ( defaults.methods[method] ) {
+ return defaults.methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
+ } else if ( typeof method === 'object' || ! method ) {
+ return defaults.methods.init.apply( this, arguments );
+ } else {
+ $.error( 'Method ' + method + ' does not exist on jQuery.jqBootstrapValidation' );
+ return null;
+ }
+
+ };
+
+ $.jqBootstrapValidation = function (options) {
+ $(":input").not("[type=image],[type=submit]").jqBootstrapValidation.apply(this,arguments);
+ };
+
+})( jQuery );
A js/jquery.datepick.js
+2406 −0
--- /dev/null
+++ b/js/jquery.datepick.js
@@ -0,0 +1,2406 @@
+/*! http://keith-wood.name/datepick.html
+ Date picker for jQuery v5.1.1.
+ Written by Keith Wood (wood.keith{at}optusnet.com.au) February 2010.
+ Licensed under the MIT (http://keith-wood.name/licence.html) licence.
+ Please attribute the author if you use it. */
+
+(function($) { // Hide scope, no $ conflict
+ 'use strict';
+
+ var pluginName = 'datepick';
+
+
+ /** Create the datepicker plugin.
+ <p>Sets an input field to popup a calendar for date entry,
+ or a <code>div</code> or <code>span</code> to show an inline calendar.</p>
+ <p>Expects HTML like:</p>
+ <pre>&lt;input type="text"></pre>
+ <p>or</p>
+ <pre>&lt;div>&lt;/div></pre>
+ <p>Provide inline configuration like:</p>
+ <pre>&lt;input type="text" data-datepick="name: 'value',..."/></pre>
+ @module Datepick
+ @augments JQPlugin
+ @example $(selector).datepick()
+$(selector).datepick({minDate: 0, maxDate: '+1m +1w'}) */
+ $.JQPlugin.createPlugin({
+
+ /** The name of the plugin.
+ @default 'datepick' */
+ name: pluginName,
+
+ /** Default template for generating a datepicker.
+ Insert anywhere: '{l10n:name}' to insert localised value for name,
+ '{link:name}' to insert a link trigger for command name,
+ '{button:name}' to insert a button trigger for command name,
+ '{popup:start}...{popup:end}' to mark a section for inclusion in a popup datepicker only,
+ '{inline:start}...{inline:end}' to mark a section for inclusion in an inline datepicker only.
+ @property {string} picker Overall structure: '{months}' to insert calendar months.
+ @property {string} monthRow One row of months: '{months}' to insert calendar months.
+ @property {string} month A single month: '{monthHeader<em>:dateFormat</em>}' to insert the month header -
+ <em>dateFormat</em> is optional and defaults to 'MM yyyy',
+ '{weekHeader}' to insert a week header, '{weeks}' to insert the month's weeks.
+ @property {string} weekHeader A week header: '{days}' to insert individual day names.
+ @property {string} dayHeader Individual day header: '{day}' to insert day name.
+ @property {string} week One week of the month: '{days}' to insert the week's days,
+ '{weekOfYear}' to insert week of year.
+ @property {string} day An individual day: '{day}' to insert day value.
+ @property {string} monthSelector jQuery selector, relative to picker, for a single month.
+ @property {string} daySelector jQuery selector, relative to picker, for individual days.
+ @property {string} rtlClass Class for right-to-left (RTL) languages.
+ @property {string} multiClass Class for multi-month datepickers.
+ @property {string} defaultClass Class for selectable dates.
+ @property {string} selectedClass Class for currently selected dates.
+ @property {string} highlightedClass Class for highlighted dates.
+ @property {string} todayClass Class for today.
+ @property {string} otherMonthClass Class for days from other months.
+ @property {string} weekendClass Class for days on weekends.
+ @property {string} commandClass Class prefix for commands.
+ @property {string} commandButtonClass Extra class(es) for commands that are buttons.
+ @property {string} commandLinkClass Extra class(es) for commands that are links.
+ @property {string} disabledClass Class for disabled commands. */
+ defaultRenderer: {
+ picker: '<div class="datepick">' +
+ '<div class="datepick-nav">{link:prev}{link:today}{link:next}</div>{months}' +
+ '{popup:start}<div class="datepick-ctrl">{link:clear}{link:close}</div>{popup:end}' +
+ '<div class="datepick-clear-fix"></div></div>',
+ monthRow: '<div class="datepick-month-row">{months}</div>',
+ month: '<div class="datepick-month"><div class="datepick-month-header">{monthHeader}</div>' +
+ '<table><thead>{weekHeader}</thead><tbody>{weeks}</tbody></table></div>',
+ weekHeader: '<tr>{days}</tr>',
+ dayHeader: '<th>{day}</th>',
+ week: '<tr>{days}</tr>',
+ day: '<td>{day}</td>',
+ monthSelector: '.datepick-month',
+ daySelector: 'td',
+ rtlClass: 'datepick-rtl',
+ multiClass: 'datepick-multi',
+ defaultClass: '',
+ selectedClass: 'datepick-selected',
+ highlightedClass: 'datepick-highlight',
+ todayClass: 'datepick-today',
+ otherMonthClass: 'datepick-other-month',
+ weekendClass: 'datepick-weekend',
+ commandClass: 'datepick-cmd',
+ commandButtonClass: '',
+ commandLinkClass: '',
+ disabledClass: 'datepick-disabled'
+ },
+
+ /** Command actions that may be added to a layout by name.
+ <ul>
+ <li>prev - Show the previous month (based on <code>monthsToStep</code> option) - <em>PageUp</em></li>
+ <li>prevJump - Show the previous year (based on <code>monthsToJump</code> option) - <em>Ctrl+PageUp</em></li>
+ <li>next - Show the next month (based on <code>monthsToStep</code> option) - <em>PageDown</em></li>
+ <li>nextJump - Show the next year (based on <code>monthsToJump</code> option) - <em>Ctrl+PageDown</em></li>
+ <li>current - Show the currently selected month or today's if none selected - <em>Ctrl+Home</em></li>
+ <li>today - Show today's month - <em>Ctrl+Home</em></li>
+ <li>clear - Erase the date and close the datepicker popup - <em>Ctrl+End</em></li>
+ <li>close - Close the datepicker popup - <em>Esc</em></li>
+ <li>prevWeek - Move the cursor to the previous week - <em>Ctrl+Up</em></li>
+ <li>prevDay - Move the cursor to the previous day - <em>Ctrl+Left</em></li>
+ <li>nextDay - Move the cursor to the next day - <em>Ctrl+Right</em></li>
+ <li>nextWeek - Move the cursor to the next week - <em>Ctrl+Down</em></li>
+ </ul>
+ The command name is the key name and is used to add the command to a layout
+ with '{button:name}' or '{link:name}'. Each has the following attributes:
+ @property {string} text The field in the regional settings for the displayed text.
+ @property {string} status The field in the regional settings for the status text.
+ @property {object} keystroke The keystroke to trigger the action.
+ @property {number} keystroke.keyCode The code for the keystroke.
+ @property {boolean} keystroke.ctrlKey <code>true</code> if <em>Ctrl</em> is required,
+ @property {boolean} keystroke.altKey <code>true</code> if <em>Alt</em> is required,
+ @property {boolean} keystroke.shiftKey <code>true</code> if <em>Shift</em> is required.
+ @property {DatepickCommandEnabled} enabled The function that indicates the command is enabled.
+ @property {DatepickCommandDate} date The function to get the date associated with this action.
+ @property {DatepickCommandAction} action The function that implements the action. */
+ commands: {
+ prev: {text: 'prevText', status: 'prevStatus', // Previous month
+ keystroke: {keyCode: 33}, // Page up
+ enabled: function(inst) {
+ var minDate = inst.curMinDate();
+ return (!minDate || plugin.add(plugin.day(
+ plugin._applyMonthsOffset(plugin.add(plugin.newDate(inst.drawDate),
+ 1 - inst.options.monthsToStep, 'm'), inst), 1), -1, 'd').
+ getTime() >= minDate.getTime());
+ },
+ date: function(inst) {
+ return plugin.day(plugin._applyMonthsOffset(plugin.add(
+ plugin.newDate(inst.drawDate), -inst.options.monthsToStep, 'm'), inst), 1);
+ },
+ action: function(inst) {
+ plugin.changeMonth(this, -inst.options.monthsToStep);
+ }
+ },
+ prevJump: {text: 'prevJumpText', status: 'prevJumpStatus', // Previous year
+ keystroke: {keyCode: 33, ctrlKey: true}, // Ctrl + Page up
+ enabled: function(inst) {
+ var minDate = inst.curMinDate();
+ return (!minDate || plugin.add(plugin.day(
+ plugin._applyMonthsOffset(plugin.add(plugin.newDate(inst.drawDate),
+ 1 - inst.options.monthsToJump, 'm'), inst), 1), -1, 'd').
+ getTime() >= minDate.getTime());
+ },
+ date: function(inst) {
+ return plugin.day(plugin._applyMonthsOffset(plugin.add(
+ plugin.newDate(inst.drawDate), -inst.options.monthsToJump, 'm'), inst), 1);
+ },
+ action: function(inst) {
+ plugin.changeMonth(this, -inst.options.monthsToJump);
+ }
+ },
+ next: {text: 'nextText', status: 'nextStatus', // Next month
+ keystroke: {keyCode: 34}, // Page down
+ enabled: function(inst) {
+ var maxDate = inst.get('maxDate');
+ return (!maxDate || plugin.day(plugin._applyMonthsOffset(plugin.add(
+ plugin.newDate(inst.drawDate), inst.options.monthsToStep, 'm'), inst), 1).
+ getTime() <= maxDate.getTime());
+ },
+ date: function(inst) {
+ return plugin.day(plugin._applyMonthsOffset(plugin.add(
+ plugin.newDate(inst.drawDate), inst.options.monthsToStep, 'm'), inst), 1);
+ },
+ action: function(inst) {
+ plugin.changeMonth(this, inst.options.monthsToStep);
+ }
+ },
+ nextJump: {text: 'nextJumpText', status: 'nextJumpStatus', // Next year
+ keystroke: {keyCode: 34, ctrlKey: true}, // Ctrl + Page down
+ enabled: function(inst) {
+ var maxDate = inst.get('maxDate');
+ return (!maxDate || plugin.day(plugin._applyMonthsOffset(plugin.add(
+ plugin.newDate(inst.drawDate), inst.options.monthsToJump, 'm'), inst), 1).
+ getTime() <= maxDate.getTime());
+ },
+ date: function(inst) {
+ return plugin.day(plugin._applyMonthsOffset(plugin.add(
+ plugin.newDate(inst.drawDate), inst.options.monthsToJump, 'm'), inst), 1);
+ },
+ action: function(inst) {
+ plugin.changeMonth(this, inst.options.monthsToJump);
+ }
+ },
+ current: {text: 'currentText', status: 'currentStatus', // Current month
+ keystroke: {keyCode: 36, ctrlKey: true}, // Ctrl + Home
+ enabled: function(inst) {
+ var minDate = inst.curMinDate();
+ var maxDate = inst.get('maxDate');
+ var curDate = inst.selectedDates[0] || plugin.today();
+ return (!minDate || curDate.getTime() >= minDate.getTime()) &&
+ (!maxDate || curDate.getTime() <= maxDate.getTime());
+ },
+ date: function(inst) {
+ return inst.selectedDates[0] || plugin.today();
+ },
+ action: function(inst) {
+ var curDate = inst.selectedDates[0] || plugin.today();
+ plugin.showMonth(this, curDate.getFullYear(), curDate.getMonth() + 1);
+ }
+ },
+ today: {text: 'todayText', status: 'todayStatus', // Today's month
+ keystroke: {keyCode: 36, ctrlKey: true}, // Ctrl + Home
+ enabled: function(inst) {
+ var minDate = inst.curMinDate();
+ var maxDate = inst.get('maxDate');
+ return (!minDate || plugin.today().getTime() >= minDate.getTime()) &&
+ (!maxDate || plugin.today().getTime() <= maxDate.getTime());
+ },
+ date: function() { return plugin.today(); },
+ action: function() { plugin.showMonth(this); }
+ },
+ clear: {text: 'clearText', status: 'clearStatus', // Clear the datepicker
+ keystroke: {keyCode: 35, ctrlKey: true}, // Ctrl + End
+ enabled: function() { return true; },
+ date: function() { return null; },
+ action: function() { plugin.clear(this); }
+ },
+ close: {text: 'closeText', status: 'closeStatus', // Close the datepicker
+ keystroke: {keyCode: 27}, // Escape
+ enabled: function() { return true; },
+ date: function() { return null; },
+ action: function() { plugin.hide(this); }
+ },
+ prevWeek: {text: 'prevWeekText', status: 'prevWeekStatus', // Previous week
+ keystroke: {keyCode: 38, ctrlKey: true}, // Ctrl + Up
+ enabled: function(inst) {
+ var minDate = inst.curMinDate();
+ return (!minDate || plugin.add(plugin.newDate(inst.drawDate), -7, 'd').
+ getTime() >= minDate.getTime());
+ },
+ date: function(inst) { return plugin.add(plugin.newDate(inst.drawDate), -7, 'd'); },
+ action: function() { plugin.changeDay(this, -7); }
+ },
+ prevDay: {text: 'prevDayText', status: 'prevDayStatus', // Previous day
+ keystroke: {keyCode: 37, ctrlKey: true}, // Ctrl + Left
+ enabled: function(inst) {
+ var minDate = inst.curMinDate();
+ return (!minDate || plugin.add(plugin.newDate(inst.drawDate), -1, 'd').
+ getTime() >= minDate.getTime());
+ },
+ date: function(inst) { return plugin.add(plugin.newDate(inst.drawDate), -1, 'd'); },
+ action: function() { plugin.changeDay(this, -1); }
+ },
+ nextDay: {text: 'nextDayText', status: 'nextDayStatus', // Next day
+ keystroke: {keyCode: 39, ctrlKey: true}, // Ctrl + Right
+ enabled: function(inst) {
+ var maxDate = inst.get('maxDate');
+ return (!maxDate || plugin.add(plugin.newDate(inst.drawDate), 1, 'd').
+ getTime() <= maxDate.getTime());
+ },
+ date: function(inst) { return plugin.add(plugin.newDate(inst.drawDate), 1, 'd'); },
+ action: function() { plugin.changeDay(this, 1); }
+ },
+ nextWeek: {text: 'nextWeekText', status: 'nextWeekStatus', // Next week
+ keystroke: {keyCode: 40, ctrlKey: true}, // Ctrl + Down
+ enabled: function(inst) {
+ var maxDate = inst.get('maxDate');
+ return (!maxDate || plugin.add(plugin.newDate(inst.drawDate), 7, 'd').
+ getTime() <= maxDate.getTime());
+ },
+ date: function(inst) { return plugin.add(plugin.newDate(inst.drawDate), 7, 'd'); },
+ action: function() { plugin.changeDay(this, 7); }
+ }
+ },
+
+ /** Determine whether a {@linkcode module:Datepick~commands|command} is enabled.
+ @callback DatepickCommandEnabled
+ @global
+ @param {object} inst The current instance settings.
+ @return {boolean} <code>true</code> if this command is enabled, <code>false</code> if not.
+ @example enabled: function(inst) {
+ return !!inst.curMinDate();
+} */
+
+ /** Calculate the representative date for a {@linkcode module:Datepick~commands|command}.
+ @callback DatepickCommandDate
+ @global
+ @param {object} inst The current instance settings.
+ @return {Date} A date appropriate for this command.
+ @example date: function(inst) {
+ return inst.curMinDate();
+} */
+
+ /** Perform the action for a {@linkcode module:Datepick~commands|command}.
+ @callback DatepickCommandAction
+ @global
+ @param {object} inst The current instance settings.
+ @example action: function(inst) {
+ $.datepick.setDate(inst.elem, inst.curMinDate());
+} */
+
+ /** Calculate the week of the year for a date.
+ Use it with the {@linkcode module:Datepick~defaultOptions|calculateWeek} option.
+ @callback DatepickCalculateWeek
+ @global
+ @param {Date} date The date to evaluate.
+ @return {number} The week of the year.
+ @example calculateWeek: function(date) {
+ return Math.floor(($.datepick.dayOfYear(date) - 1) / 7) + 1;
+} */
+
+ /** Determine where the first month shows in a multi-month calendar.
+ Use it with the {@linkcode module:Datepick~defaultOptions|monthsOffset} option.
+ @callback DatepickMonthsOffset
+ @global
+ @param {Date} date The first date to be shown.
+ @return {number} The offset within the calendar for the first month - first position is 0.
+ @example monthsToShow: 3,
+monthsToStep: 3,
+monthsOffset: function(date) { // Always start on the quarter
+ return date.getMonth() % 3;
+} */
+
+ /** Provide information about an individual date shown in the calendar.
+ Use it with the {@linkcode module:Datepick~defaultOptions|onDate} option.
+ @callback DatepickOnDate
+ @global
+ @param {Date} date The date to evaluate.
+ @return {object} Information about that date, with the properties above.
+ @property selectable {boolean} <code>true</code> if this date can be selected.
+ @property dateClass {string} Class(es) to be applied to the date.
+ @property content {string} The date cell content.
+ @property tooltip {string} A popup tooltip for the date.
+ @example onDate: function(date) {
+ return {selectable: date.getDay() > 0 && date.getDay() &lt; 5,
+ dateClass: date.getDay() == 4 ? 'last-day' : ''};
+} */
+
+ /** Update the datepicker display.
+ Use it with the {@linkcode module:Datepick~defaultOptions|onShow} option.
+ @callback DatepickOnShow
+ @global
+ @param {jQuery} picker The datepicker <code>div</code> to be shown.
+ @param {object} inst The current instance settings.
+ @example onShow: function(picker, inst) {
+ picker.append('&lt;button type="button">Hi&lt;/button>').
+ find('button:last').click(function() {
+ alert('Hi!');
+ });
+} */
+
+ /** React to navigating through the months/years.
+ Use it with the {@linkcode module:Datepick~defaultOptions|onChangeMonthYear} option.
+ @callback DatepickOnChangeMonthYear
+ @global
+ @param {number} year The new year.
+ @param {number} month The new month (1 to 12).
+ @example onChangeMonthYear: function(year, month) {
+ alert('Now in ' + month + '/' + year);
+} */
+
+ /** Datepicker on select callback.
+ Triggered when a date is selected.
+ Use it with the {@linkcode module:Datepick~defaultOptions|onSelect} option.
+ @callback DatepickOnSelect
+ @global
+ @param {Date[]} dates The selected date(s).
+ @example onSelect: function(dates) {
+ alert('Selected ' + dates);
+} */
+
+ /** Datepicker on close callback.
+ Triggered when a popup calendar is closed.
+ Use it with the {@linkcode module:Datepick~defaultOptions|onClose} option.
+ @callback DatepickOnClose
+ @global
+ @param {Date[]} dates The selected date(s).
+ @example onClose: function(dates) {
+ alert('Selected ' + dates);
+} */
+
+ /** Default settings for the plugin.
+ @property {string} [pickerClass=''] CSS class to add to this instance of the datepicker.
+ @property {boolean} [showOnFocus=true] <code>true</code> for popup on focus, <code>false</code> for not.
+ @property {string|Element|jQuery} [showTrigger=null] Element to be cloned for a trigger,
+ <code>null</code> for none.
+ @property {string} [showAnim='show'] Name of jQuery animation for popup, '' for no animation.
+ @property {object} [showOptions=null] Options for enhanced animations.
+ @property {string|number} [showSpeed='normal'] Duration of display/closure, named value or milliseconds.
+ @property {string|Element|jQuery} [popupContainer=null] The element to which a popup calendar is added,
+ <code>null</code> for body.
+ @property {string} [alignment='bottom'] Alignment of popup - with nominated corner of input:
+ 'top' or 'bottom' aligns depending on language direction,
+ 'topLeft', 'topRight', 'bottomLeft', 'bottomRight'.
+ @property {boolean} [fixedWeeks=false] <code>true</code> to always show 6 weeks,
+ <code>false</code> to only show as many as are needed.
+ @property {number} [firstDay=0] First day of the week, 0 = Sunday, 1 = Monday, etc.
+ @property {DatepickCalculateWeek} [calculateWeek=this.iso8601Week] Calculate week of the year from a date,
+ <code>null</code> for ISO8601.
+ @property {number|number[]} [monthsToShow=1] How many months to show, cols or [rows, cols].
+ @property {number|DatepickMonthsOffset} [monthsOffset=0] How many months to offset the primary month by;
+ may be a function that takes the date and returns the offset.
+ @property {number} [monthsToStep=1] How many months to move when prev/next clicked.
+ @property {number} [monthsToJump=12] How many months to move when large prev/next clicked.
+ @property {boolean} [useMouseWheel=true] <code>true</code> to use mousewheel if available,
+ <code>false</code> to never use it.
+ @property {boolean} [changeMonth=true] <code>true</code> to change month/year via drop-down,
+ <code>false</code> for navigation only.
+ @property {string} [yearRange='c-10:c+10'] Range of years to show in drop-down: 'any' for direct text entry
+ or 'start:end', where start/end are '±nn' for relative to today
+ or 'c±nn' for relative to the currently selected date
+ or 'nnnn' for an absolute year.
+ @property {string|number} [shortYearCutoff='+10'] Cutoff for two-digit year in the current century.
+ If expressed as a string it is offset from the current year.
+ If expressed as a number it is used directly.
+ Use -1 to always use 1900 as the base year, or use 100 to disable the functionality.
+ Any short year ('yy') entered is transformed into a full year in the current century
+ if less than or equal to this cutoff value, and the previous century otherwise.
+ @property {boolean} [showOtherMonths=false] <code>true</code> to show dates from other months,
+ <code>false</code> to not show them.
+ @property {boolean} [selectOtherMonths=false] <code>true</code> to allow selection of dates
+ from other months too.
+ @property {string|number|Date} [defaultDate=null] Date to show if no other selected.
+ If expressed as a string it is parsed using the current
+ {@linkcode module:Datepick~regionalOptions|dateFormat}.
+ If expressed as a number it is offset that number of days from today.
+ If expressed as a <code>Date</code> it is used directly.
+ @property {boolean} [selectDefaultDate=false] <code>true</code> to pre-select the default date
+ if no other is chosen.
+ @property {string|number|Date} [minDate=null] The minimum selectable date.
+ See the allowed values in <code>defaultDate</code> above.
+ @property {string|number|Date} [maxDate=null] The maximum selectable date.
+ See the allowed values in <code>defaultDate</code> above.
+ @property {string} [dateFormat='mm/dd/yyyy'] Format for dates.
+ See {@linkcode module:Datepick~formatDate|formatDate} for allowed formats.
+ @property {boolean} [autoSize=false] <code>true</code> to size the input field according to
+ the {@linkcode module:Datepick~regionalOptions|dateFormat}.
+ @property {boolean} [rangeSelect=false] Allows for selecting a date range on one date picker.
+ @property {string} [rangeSeparator=' - '] Text between two dates in a range when displayed.
+ @property {number} [multiSelect=0] Maximum number of selectable dates for multiple independent dates,
+ zero for single select. If specified,
+ <code>multiSelect</code> takes precedence over <code>rangeSelect</code>.
+ @property {string} [multiSeparator=','] Text between multiple dates.
+ @property {DatepickOnDate} [onDate=null] Callback as each date is added to the display calendar.
+ This allows you to customise the behaviour and presentation of each date.
+ @property {DatepickOnShow} [onShow=null] Callback just before a datepicker is shown.
+ This allows you to customise the datepicker before display.
+ @property {DatepickOnChangeMonthYear} [onChangeMonthYear=null] Callback when a new month/year is selected.
+ This allows you to perform other actions when the calendar changes.
+ @property {DatepickOnSelect} [onSelect=null] Callback when a date is selected.
+ @property {DatepickOnClose} [onClose=null] Callback when a datepicker is closed.
+ @property {string|Element|jQuery} [altField=null] Alternate field to update in synch with the datepicker.
+ @property {string} [altFormat=null] Date format for alternate field, defaults to
+ {@linkcode module:Datepick~regionalOptions|dateFormat}.
+ This allows you to display one (human-friendly) format,
+ while automatically maintaining another (computer-friendly) format.
+ @property {boolean} [constrainInput=true] <code>true</code> to constrain typed input to
+ {@linkcode module:Datepick~regionalOptions|dateFormat} allowed characters.
+ @property {boolean} [commandsAsDateFormat=false] <code>true</code> to apply
+ {@linkcode module:Datepick~formatDate|formatDate} to the command texts.
+ @property {object} [commands=this.commands] Command actions that may be added to a layout by name. */
+ defaultOptions: {
+ pickerClass: '',
+ showOnFocus: true,
+ showTrigger: null,
+ showAnim: 'show',
+ showOptions: {},
+ showSpeed: 'normal',
+ popupContainer: null,
+ alignment: 'bottom',
+ fixedWeeks: false,
+ firstDay: 0,
+ calculateWeek: null, // this.iso8601Week,
+ monthsToShow: 1,
+ monthsOffset: 0,
+ monthsToStep: 1,
+ monthsToJump: 12,
+ useMouseWheel: true,
+ changeMonth: true,
+ yearRange: 'c-10:c+10',
+ shortYearCutoff: '+10',
+ showOtherMonths: false,
+ selectOtherMonths: false,
+ defaultDate: null,
+ selectDefaultDate: false,
+ minDate: null,
+ maxDate: null,
+ dateFormat: 'mm/dd/yyyy',
+ autoSize: false,
+ rangeSelect: false,
+ rangeSeparator: ' - ',
+ multiSelect: 0,
+ multiSeparator: ',',
+ onDate: null,
+ onShow: null,
+ onChangeMonthYear: null,
+ onSelect: null,
+ onClose: null,
+ altField: null,
+ altFormat: null,
+ constrainInput: true,
+ commandsAsDateFormat: false,
+ commands: {} // this.commands
+ },
+
+ /** Localisations for the plugin.
+ Entries are objects indexed by the language code ('' being the default US/English).
+ Each object has the following attributes.
+ @property {string[]} [monthNames=['January','February',...,'November','December']]
+ The long names of the months.
+ @property {string[]} [monthNamesShort=['Jan','Feb',...,'Nov','Dec']]
+ The short names of the months.
+ @property {string[]} [dayNames=['Sunday','Monday',...,'Friday','Saturday']]
+ The long names of the days of the week.
+ @property {string[]} [dayNamesShort=['Sun','Mon','Tue','Wed','Thu','Fri','Sat']]
+ The short names of the days of the week.
+ @property {string[]} [dayNamesMin=['Su','Mo','Tu','We','Th','Fr','Sa']]
+ The minimal names of the days of the week.
+ @property {string} [dateFormat='mm/dd/yyyy'] See options on {@linkcode module:Datepick~formatDate|formatDate}.
+ @property {number} [firstDay=0] The first day of the week, Sun = 0, Mon = 1, etc.
+ @property {string} [renderer=this.defaultRenderer] The rendering templates.
+ @property {string} [prevText='&lt;Prev'] Text for the previous month command.
+ @property {string} [prevStatus='Show the previous month'] Status text for the previous month command.
+ @property {string} [prevJumpText='&lt;&lt;'] Text for the previous year command.
+ @property {string} [prevJumpStatus='Show the previous year'] Status text for the previous year command.
+ @property {string} [nextText='Next&gt;'] Text for the next month command.
+ @property {string} [nextStatus='Show the next month'] Status text for the next month command.
+ @property {string} [nextJumpText='&gt;&gt;'] Text for the next year command.
+ @property {string} [nextJumpStatus='Show the next year'] Status text for the next year command.
+ @property {string} [currentText='Current'] Text for the current month command.
+ @property {string} [currentStatus='Show the current month'] Status text for the current month command.
+ @property {string} [todayText='Today'] Text for the today's month command.
+ @property {string} [todayStatus='Show today\'s month'] Status text for the today's month command.
+ @property {string} [clearText='Clear'] Text for the clear command.
+ @property {string} [clearStatus='Clear all the dates'] Status text for the clear command.
+ @property {string} [closeText='Close'] Text for the close command.
+ @property {string} [closeStatus='Close the datepicker'] Status text for the close command.
+ @property {string} [yearStatus='Change the year'] Status text for year selection.
+ @property {string} [earlierText='&#160;&#160;▲'] Text for earlier years.
+ @property {string} [laterText='&#160;&#160;▼'] Text for later years.
+ @property {string} [monthStatus='Change the month'] Status text for month selection.
+ @property {string} [weekText='Wk'] Text for week of the year column header.
+ @property {string} [weekStatus='Week of the year'] Status text for week of the year column header.
+ @property {string} [dayStatus='Select DD,&#160;M&#160;d,&#160;yyyy'] Status text for selectable days.
+ @property {string} [defaultStatus='Select a date'] Status text shown by default.
+ @property {boolean} [isRTL=false] <code>true</code> if language is written right-to-left. */
+ regionalOptions: { // Available regional settings, indexed by language/country code
+ '': { // Default regional settings - English/US
+ monthNames: ['January', 'February', 'March', 'April', 'May', 'June',
+ 'July', 'August', 'September', 'October', 'November', 'December'],
+ monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+ dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+ dayNamesMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
+ dateFormat: 'mm/dd/yyyy',
+ firstDay: 0,
+ renderer: {}, // this.defaultRenderer
+ prevText: '&lt;Prev',
+ prevStatus: 'Show the previous month',
+ prevJumpText: '&lt;&lt;',
+ prevJumpStatus: 'Show the previous year',
+ nextText: 'Next&gt;',
+ nextStatus: 'Show the next month',
+ nextJumpText: '&gt;&gt;',
+ nextJumpStatus: 'Show the next year',
+ currentText: 'Current',
+ currentStatus: 'Show the current month',
+ todayText: 'Today',
+ todayStatus: 'Show today\'s month',
+ clearText: 'Clear',
+ clearStatus: 'Clear all the dates',
+ closeText: 'Close',
+ closeStatus: 'Close the datepicker',
+ yearStatus: 'Change the year',
+ earlierText: '&#160;&#160;▲',
+ laterText: '&#160;&#160;▼',
+ monthStatus: 'Change the month',
+ weekText: 'Wk',
+ weekStatus: 'Week of the year',
+ dayStatus: 'Select DD, M d, yyyy',
+ defaultStatus: 'Select a date',
+ isRTL: false
+ }
+ },
+
+ _disabled: [],
+
+ _popupClass: pluginName + '-popup', // Marker for popup division
+ _triggerClass: pluginName + '-trigger', // Marker for trigger element
+ _disableClass: pluginName + '-disable', // Marker for disabled element
+ _monthYearClass: pluginName + '-month-year', // Marker for month/year inputs
+ _curMonthClass: pluginName + '-month-', // Marker for current month/year
+ _anyYearClass: pluginName + '-any-year', // Marker for year direct input
+ _curDoWClass: pluginName + '-dow-', // Marker for day of week
+
+ _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
+ Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
+ _msPerDay: 24 * 60 * 60 * 1000,
+
+ /** The {@linkcode module:Datepick~formatDate|date format} for use with Atom (RFC 3339/ISO 8601): yyyy-mm-dd. */
+ ATOM: 'yyyy-mm-dd',
+ /** The {@linkcode module:Datepick~formatDate|date format} for use with cookies: D, dd M yyyy. */
+ COOKIE: 'D, dd M yyyy',
+ /** The {@linkcode module:Datepick~formatDate|date format} for full display: DD, MM d, yyyy. */
+ FULL: 'DD, MM d, yyyy',
+ /** The {@linkcode module:Datepick~formatDate|date format} for use with ISO 8601: yyyy-mm-dd. */
+ ISO_8601: 'yyyy-mm-dd',
+ /** The {@linkcode module:Datepick~formatDate|date format} for Julian dates: J. */
+ JULIAN: 'J',
+ /** The {@linkcode module:Datepick~formatDate|date format} for use with RFC 822: D, d M yy. */
+ RFC_822: 'D, d M yy',
+ /** The {@linkcode module:Datepick~formatDate|date format} for use with RFC 850: DD, dd-M-yy. */
+ RFC_850: 'DD, dd-M-yy',
+ /** The {@linkcode module:Datepick~formatDate|date format} for use with RFC 1036: D, d M yy. */
+ RFC_1036: 'D, d M yy',
+ /** The {@linkcode module:Datepick~formatDate|date format} for use with RFC 1123: D, d M yyyy. */
+ RFC_1123: 'D, d M yyyy',
+ /** The {@linkcode module:Datepick~formatDate|date format} for use with RFC 2822: D, d M yyyy. */
+ RFC_2822: 'D, d M yyyy',
+ /** The {@linkcode module:Datepick~formatDate|date format} for use with RSS (RFC 822): D, d M yy. */
+ RSS: 'D, d M yy',
+ /** The {@linkcode module:Datepick~formatDate|date format} for Windows ticks: !. */
+ TICKS: '!',
+ /** The {@linkcode module:Datepick~formatDate|date format} for Unix timestamp: @. */
+ TIMESTAMP: '@',
+ /** The {@linkcode module:Datepick~formatDate|date format} for use with W3C (ISO 8601): yyyy-mm-dd. */
+ W3C: 'yyyy-mm-dd',
+
+ /** Format a date object into a string value.
+ The format can be combinations of the following:
+ <ul>
+ <li>d - day of month (no leading zero)</li>
+ <li>dd - day of month (two digit)</li>
+ <li>o - day of year (no leading zeros)</li>
+ <li>oo - day of year (three digit)</li>
+ <li>D - day name short</li>
+ <li>DD - day name long</li>
+ <li>w - week of year (no leading zero)</li>
+ <li>ww - week of year (two digit)</li>
+ <li>m - month of year (no leading zero)</li>
+ <li>mm - month of year (two digit)</li>
+ <li>M - month name short</li>
+ <li>MM - month name long</li>
+ <li>yy - year (two digit)</li>
+ <li>yyyy - year (four digit)</li>
+ <li>@ - Unix timestamp (s since 01/01/1970)</li>
+ <li>! - Windows ticks (100ns since 01/01/0001)</li>
+ <li>'...' - literal text</li>
+ <li>'' - single quote</li>
+ </ul>
+ @param {string} [format=defaultOptions.dateFormat] The desired format of the date.
+ @param {Date} date The date value to format.
+ @param {object} [settings] With these properties:
+ @param {string[]} [settings.dayNames] Names of the days from Sunday.
+ @param {string[]} [settings.dayNamesShort] Abbreviated names of the days from Sunday.
+ @param {string[]} [settings.monthNames] Names of the months.
+ @param {string[]} [settings.monthNamesShort] Abbreviated names of the months.
+ @param {DatepickCalculateWeek} [settings.calculateWeek] Function that determines week of the year.
+ @return {string} The date in the above format.
+ @example var display = $.datepick.formatDate('yyyy-mm-dd', new Date(2014, 12-1, 25)) */
+ formatDate: function(format, date, settings) {
+ if (typeof format !== 'string') {
+ settings = date;
+ date = format;
+ format = '';
+ }
+ if (!date) {
+ return '';
+ }
+ format = format || this.defaultOptions.dateFormat;
+ settings = settings || {};
+ var dayNamesShort = settings.dayNamesShort || this.defaultOptions.dayNamesShort;
+ var dayNames = settings.dayNames || this.defaultOptions.dayNames;
+ var monthNamesShort = settings.monthNamesShort || this.defaultOptions.monthNamesShort;
+ var monthNames = settings.monthNames || this.defaultOptions.monthNames;
+ var calculateWeek = settings.calculateWeek || this.defaultOptions.calculateWeek;
+ // Check whether a format character is doubled
+ var doubled = function(match, step) {
+ var matches = 1;
+ while (iFormat + matches < format.length && format.charAt(iFormat + matches) === match) {
+ matches++;
+ }
+ iFormat += matches - 1;
+ return Math.floor(matches / (step || 1)) > 1;
+ };
+ // Format a number, with leading zeroes if necessary
+ var formatNumber = function(match, value, len, step) {
+ var num = '' + value;
+ if (doubled(match, step)) {
+ while (num.length < len) {
+ num = '0' + num;
+ }
+ }
+ return num;
+ };
+ // Format a name, short or long as requested
+ var formatName = function(match, value, shortNames, longNames) {
+ return (doubled(match) ? longNames[value] : shortNames[value]);
+ };
+ var output = '';
+ var literal = false;
+ for (var iFormat = 0; iFormat < format.length; iFormat++) {
+ if (literal) {
+ if (format.charAt(iFormat) === '\'' && !doubled('\'')) {
+ literal = false;
+ }
+ else {
+ output += format.charAt(iFormat);
+ }
+ }
+ else {
+ switch (format.charAt(iFormat)) {
+ case 'd':
+ output += formatNumber('d', date.getDate(), 2);
+ break;
+ case 'D':
+ output += formatName('D', date.getDay(), dayNamesShort, dayNames);
+ break;
+ case 'o':
+ output += formatNumber('o', this.dayOfYear(date), 3);
+ break;
+ case 'w':
+ output += formatNumber('w', calculateWeek(date), 2);
+ break;
+ case 'm':
+ output += formatNumber('m', date.getMonth() + 1, 2);
+ break;
+ case 'M':
+ output += formatName('M', date.getMonth(), monthNamesShort, monthNames);
+ break;
+ case 'y':
+ output += (doubled('y', 2) ? date.getFullYear() :
+ (date.getFullYear() % 100 < 10 ? '0' : '') + date.getFullYear() % 100);
+ break;
+ case '@':
+ output += Math.floor(date.getTime() / 1000);
+ break;
+ case '!':
+ output += date.getTime() * 10000 + this._ticksTo1970;
+ break;
+ case '\'':
+ if (doubled('\'')) {
+ output += '\'';
+ }
+ else {
+ literal = true;
+ }
+ break;
+ default:
+ output += format.charAt(iFormat);
+ }
+ }
+ }
+ return output;
+ },
+
+ /** Parse a string value into a date object.
+ See {@linkcode module:Datepick~formatDate|formatDate} for the possible formats, plus:
+ <ul>
+ <li>* - ignore rest of string</li>
+ </ul>
+ @param {string} format The expected format of the date ('' for default datepicker format).
+ @param {string} value The date in the above format.
+ @param {object} [settings] With these properties:
+ @param {number} [settings.shortYearCutoff] The cutoff year for determining the century.
+ @param {string[]} [settings.dayNames] The names of the days from Sunday.
+ @param {string[]} [settings.dayNamesShort] The abbreviated names of the days from Sunday.
+ @param {string[]} [settings.monthNames] The Names of the months.
+ @param {string[]} [settings.monthNamesShort] The abbreviated names of the months.
+ @return {Date} The extracted date value or <code>null</code> if value is blank.
+ @throws Errors if the format and/or value are missing, if the value doesn't match the format,
+ or if the date is invalid.
+ @example var date = $.datepick.parseDate('dd/mm/yyyy', '25/12/2014') */
+ parseDate: function(format, value, settings) {
+ if (typeof value === 'undefined' || value === null) {
+ throw 'Invalid arguments';
+ }
+ value = (typeof value === 'object' ? value.toString() : value + '');
+ if (value === '') {
+ return null;
+ }
+ format = format || this.defaultOptions.dateFormat;
+ settings = settings || {};
+ var shortYearCutoff = settings.shortYearCutoff || this.defaultOptions.shortYearCutoff;
+ shortYearCutoff = (typeof shortYearCutoff !== 'string' ? shortYearCutoff :
+ this.today().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
+ var dayNamesShort = settings.dayNamesShort || this.defaultOptions.dayNamesShort;
+ var dayNames = settings.dayNames || this.defaultOptions.dayNames;
+ var monthNamesShort = settings.monthNamesShort || this.defaultOptions.monthNamesShort;
+ var monthNames = settings.monthNames || this.defaultOptions.monthNames;
+ var year = -1;
+ var month = -1;
+ var day = -1;
+ var doy = -1;
+ var shortYear = false;
+ var literal = false;
+ var date = null;
+ // Check whether a format character is doubled
+ var doubled = function(match, step) {
+ var matches = 1;
+ while (iFormat + matches < format.length && format.charAt(iFormat + matches) === match) {
+ matches++;
+ }
+ iFormat += matches - 1;
+ return Math.floor(matches / (step || 1)) > 1;
+ };
+ // Extract a number from the string value
+ var getNumber = function(match, step) {
+ var isDoubled = doubled(match, step);
+ var size = [2, 3, isDoubled ? 4 : 2, 11, 20]['oy@!'.indexOf(match) + 1];
+ var digits = new RegExp('^-?\\d{1,' + size + '}');
+ var num = value.substring(iValue).match(digits);
+ if (!num) {
+ throw 'Missing number at position {0}'.replace(/\{0\}/, iValue);
+ }
+ iValue += num[0].length;
+ return parseInt(num[0], 10);
+ };
+ // Extract a name from the string value and convert to an index
+ var getName = function(match, shortNames, longNames, step) {
+ var names = (doubled(match, step) ? longNames : shortNames);
+ for (var i = 0; i < names.length; i++) {
+ if (value.substr(iValue, names[i].length).toLowerCase() === names[i].toLowerCase()) {
+ iValue += names[i].length;
+ return i + 1;
+ }
+ }
+ throw 'Unknown name at position {0}'.replace(/\{0\}/, iValue);
+ };
+ // Confirm that a literal character matches the string value
+ var checkLiteral = function() {
+ if (value.charAt(iValue) !== format.charAt(iFormat)) {
+ throw 'Unexpected literal at position {0}'.replace(/\{0\}/, iValue);
+ }
+ iValue++;
+ };
+ var iValue = 0;
+ for (var iFormat = 0; iFormat < format.length; iFormat++) {
+ if (literal) {
+ if (format.charAt(iFormat) === '\'' && !doubled('\'')) {
+ literal = false;
+ }
+ else {
+ checkLiteral();
+ }
+ }
+ else {
+ switch (format.charAt(iFormat)) {
+ case 'd':
+ day = getNumber('d');
+ break;
+ case 'D':
+ getName('D', dayNamesShort, dayNames);
+ break;
+ case 'o':
+ doy = getNumber('o');
+ break;
+ case 'w':
+ getNumber('w');
+ break;
+ case 'm':
+ month = getNumber('m');
+ break;
+ case 'M':
+ month = getName('M', monthNamesShort, monthNames);
+ break;
+ case 'y':
+ var iSave = iFormat;
+ shortYear = !doubled('y', 2);
+ iFormat = iSave;
+ year = getNumber('y', 2);
+ break;
+ case '@':
+ date = this._normaliseDate(new Date(getNumber('@') * 1000));
+ year = date.getFullYear();
+ month = date.getMonth() + 1;
+ day = date.getDate();
+ break;
+ case '!':
+ date = this._normaliseDate(
+ new Date((getNumber('!') - this._ticksTo1970) / 10000));
+ year = date.getFullYear();
+ month = date.getMonth() + 1;
+ day = date.getDate();
+ break;
+ case '*':
+ iValue = value.length;
+ break;
+ case '\'':
+ if (doubled('\'')) {
+ checkLiteral();
+ }
+ else {
+ literal = true;
+ }
+ break;
+ default:
+ checkLiteral();
+ }
+ }
+ }
+ if (iValue < value.length) {
+ throw 'Additional text found at end';
+ }
+ if (year === -1) {
+ year = this.today().getFullYear();
+ }
+ else if (year < 100 && shortYear) {
+ year += (shortYearCutoff === -1 ? 1900 : this.today().getFullYear() -
+ this.today().getFullYear() % 100 - (year <= shortYearCutoff ? 0 : 100));
+ }
+ if (doy > -1) {
+ month = 1;
+ day = doy;
+ for (var dim = this.daysInMonth(year, month); day > dim;
+ dim = this.daysInMonth(year, month)) {
+ month++;
+ day -= dim;
+ }
+ }
+ date = this.newDate(year, month, day);
+ if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) {
+ throw 'Invalid date';
+ }
+ return date;
+ },
+
+ /** A date may be specified as an exact value or a relative one.
+ @param {Date|number|string} dateSpec The date as a <code>Date</code>,
+ or as a string in the current {@linkcode module:Datepick~regionalOptions|dateFormat},
+ or as a numeric offset - in days from today,
+ or as a string of amounts and periods, e.g. '+1m +2w',
+ using 'd' for days, 'w' for weeks, 'm' for months, and 'y' for years.
+ @param {Date} [defaultDate] The date to use if no other supplied, may be <code>null</code>.
+ @param {Date} [currentDate] The current date as a possible basis for relative dates,
+ if <code>null</code> today is used.
+ @param {string} [dateFormat] The expected date format - see {@linkcode module:Datepick~formatDate|formatDate}.
+ @param {object} [settings] With these properties:
+ @param {number} [settings.shortYearCutoff] The cutoff year for determining the century.
+ @param {string[]} [settings.dayNamesShort] Abbreviated names of the days from Sunday.
+ @param {string[]} [settings.dayNames] Names of the days from Sunday.
+ @param {string[]} [settings.monthNamesShort] Abbreviated names of the months.
+ @param {string[]} [settings.monthNames] Names of the months.
+ @return {Date} The decoded date.
+ @example var date = $.datepick.determineDate('+1m +2w', new Date()) */
+ determineDate: function(dateSpec, defaultDate, currentDate, dateFormat, settings) {
+ if (currentDate && typeof currentDate !== 'object') {
+ settings = dateFormat;
+ dateFormat = currentDate;
+ currentDate = null;
+ }
+ if (typeof dateFormat !== 'string') {
+ settings = dateFormat;
+ dateFormat = '';
+ }
+ var offsetString = function(offset) {
+ try {
+ return plugin.parseDate(dateFormat, offset, settings);
+ }
+ catch (e) {
+ // Ignore
+ }
+ offset = offset.toLowerCase();
+ var date = (offset.match(/^c/) && currentDate ? plugin.newDate(currentDate) : null) ||
+ plugin.today();
+ var pattern = /([+-]?[0-9]+)\s*(d|w|m|y)?/g;
+ var matches = null;
+ while ((matches = pattern.exec(offset))) {
+ date = plugin.add(date, parseInt(matches[1], 10), matches[2] || 'd');
+ }
+ return date;
+ };
+ defaultDate = (defaultDate ? plugin.newDate(defaultDate) : null);
+ dateSpec = (typeof dateSpec === 'undefined' ? defaultDate :
+ (typeof dateSpec === 'string' ? offsetString(dateSpec) : (typeof dateSpec === 'number' ?
+ (isNaN(dateSpec) || dateSpec === Infinity || dateSpec === -Infinity ? defaultDate :
+ plugin.add(plugin.today(), dateSpec, 'd')) : plugin.newDate(dateSpec))));
+ return dateSpec;
+ },
+
+ /** Find the number of days in a given month.
+ @param {Date|number} year The date to get days for or the full year.
+ @param {number} [month] The month (1 to 12), if the year is a number.
+ @return {number} The number of days in this month.
+ @example var days = $.datepick.daysInMonth(2014, 12)
+var days = $.datepick.daysInMonth(new Date(2014, 12-1, 25)) */
+ daysInMonth: function(year, month) {
+ month = (year.getFullYear ? year.getMonth() + 1 : month);
+ year = (year.getFullYear ? year.getFullYear() : year);
+ return this.newDate(year, month + 1, 0).getDate();
+ },
+
+ /** Calculate the day of the year for a date.
+ @param {Date|number} year The date to get the day-of-year for or the full year.
+ @param {number} [month] The month (1-12), if the year is a number.
+ @param {number} [day] The day, if the year is a number.
+ @return {number} The day of the year.
+ @example var doy = $.datepick.dayOfYear(2014, 12, 25)
+var doy = $.datepick.dayOfYear(new Date(2014, 12-1, 25)) */
+ dayOfYear: function(year, month, day) {
+ var date = (year.getFullYear ? year : plugin.newDate(year, month, day));
+ var newYear = plugin.newDate(date.getFullYear(), 1, 1);
+ return Math.floor((date.getTime() - newYear.getTime()) / plugin._msPerDay) + 1;
+ },
+
+ /** Set as <code>calculateWeek</code> to determine the week of the year based on the ISO 8601 definition.
+ @param {Date|number} year The date to get the week for or the full year.
+ @param {number} [month] The month (1-12), if the year is a number.
+ @param {number} [day] The day, if the year is a number.
+ @return {number} The number of the week within the year that contains this date.
+ @example var week = $.datepick.iso8601Week(2014, 12, 25)
+var week = $.datepick.iso8601Week(new Date(2014, 12-1, 25)) */
+ iso8601Week: function(year, month, day) {
+ var checkDate = (year.getFullYear ?
+ new Date(year.getTime()) : plugin.newDate(year, month, day));
+ // Find Thursday of this week starting on Monday
+ checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
+ var time = checkDate.getTime();
+ checkDate.setMonth(0, 1); // Compare with Jan 1
+ return Math.floor(Math.round((time - checkDate) / plugin._msPerDay) / 7) + 1;
+ },
+
+ /** Return today's date.
+ @return {Date} Today.
+ @example var today = $.datepick.today() */
+ today: function() {
+ return this._normaliseDate(new Date());
+ },
+
+ /** Return a new date.
+ @param {Date|number} year The date to clone or the year.
+ @param {number} [month] The month (1-12), if the year is a number.
+ @param {number} [day] The day, if the year is a number.
+ @return {Date} The date.
+ @example $.datepick.newDate(oldDate)
+$.datepick.newDate(2014, 12, 25) */
+ newDate: function(year, month, day) {
+ return (!year ? null : (year.getFullYear ? this._normaliseDate(new Date(year.getTime())) :
+ new Date(year, month - 1, day, 12)));
+ },
+
+ /** Standardise a date into a common format - time portion is 12 noon.
+ @private
+ @param {Date} date The date to standardise.
+ @return {Date} The normalised date. */
+ _normaliseDate: function(date) {
+ if (date) {
+ date.setHours(12, 0, 0, 0);
+ }
+ return date;
+ },
+
+ /** Set the year for a date.
+ @param {Date} date The original date.
+ @param {number} year The new year.
+ @return {Date} The updated date.
+ @example $.datepick.year(date, 2014) */
+ year: function(date, year) {
+ date.setFullYear(year);
+ return this._normaliseDate(date);
+ },
+
+ /** Set the month for a date.
+ @param {Date} date The original date.
+ @param {number} month The new month (1-12).
+ @return {Date} The updated date.
+ @example $.datepick.month(date, 12) */
+ month: function(date, month) {
+ date.setMonth(month - 1);
+ return this._normaliseDate(date);
+ },
+
+ /** Set the day for a date.
+ @param {Date} date The original date.
+ @param {number} day The new day of the month.
+ @return {Date} The updated date.
+ @example $.datepick.day(date, 25) */
+ day: function(date, day) {
+ date.setDate(day);
+ return this._normaliseDate(date);
+ },
+
+ /** Add a number of periods to a date.
+ @param {Date} date The original date.
+ @param {number} amount The number of periods.
+ @param {string} period The type of period 'd' for days, 'w' for weeks, 'm' for months, 'y' for years.
+ @return {Date} The updated date.
+ @example $.datepick.add(date, 10, 'd') */
+ add: function(date, amount, period) {
+ if (period === 'd' || period === 'w') {
+ this._normaliseDate(date);
+ date.setDate(date.getDate() + amount * (period === 'w' ? 7 : 1));
+ }
+ else {
+ var year = date.getFullYear() + (period === 'y' ? amount : 0);
+ var month = date.getMonth() + (period === 'm' ? amount : 0);
+ date.setTime(plugin.newDate(year, month + 1,
+ Math.min(date.getDate(), this.daysInMonth(year, month + 1))).getTime());
+ }
+ return date;
+ },
+
+ /** Apply the months offset value to a date.
+ @private
+ @param {Date} date The original date.
+ @param {object} inst The current instance settings.
+ @return {Date} The updated date. */
+ _applyMonthsOffset: function(date, inst) {
+ var monthsOffset = inst.options.monthsOffset;
+ if ($.isFunction(monthsOffset)) {
+ monthsOffset = monthsOffset.apply(inst.elem[0], [date]);
+ }
+ return plugin.add(date, -monthsOffset, 'm');
+ },
+
+ _init: function() {
+ this.defaultOptions.commands = this.commands;
+ this.defaultOptions.calculateWeek = this.iso8601Week;
+ this.regionalOptions[''].renderer = this.defaultRenderer;
+ this._super();
+ },
+
+ _instSettings: function(elem) {
+ return {selectedDates: [], drawDate: null, pickingRange: false,
+ inline: ($.inArray(elem[0].nodeName.toLowerCase(), ['div', 'span']) > -1),
+ get: function(name) { // Get a setting value, computing if necessary
+ if ($.inArray(name, ['defaultDate', 'minDate', 'maxDate']) > -1) { // Decode date settings
+ return plugin.determineDate(this.options[name], null,
+ this.selectedDates[0], this.options.dateFormat, this.getConfig());
+ }
+ return this.options[name];
+ },
+ curMinDate: function() {
+ return (this.pickingRange ? this.selectedDates[0] : this.get('minDate'));
+ },
+ getConfig: function() {
+ return {dayNamesShort: this.options.dayNamesShort, dayNames: this.options.dayNames,
+ monthNamesShort: this.options.monthNamesShort, monthNames: this.options.monthNames,
+ calculateWeek: this.options.calculateWeek,
+ shortYearCutoff: this.options.shortYearCutoff};
+ }
+ };
+ },
+
+ _postAttach: function(elem, inst) {
+ if (inst.inline) {
+ inst.drawDate = plugin._checkMinMax(plugin.newDate(inst.selectedDates[0] ||
+ inst.get('defaultDate') || plugin.today()), inst);
+ inst.prevDate = plugin.newDate(inst.drawDate);
+ this._update(elem[0]);
+ if ($.fn.mousewheel) {
+ elem.mousewheel(this._doMouseWheel);
+ }
+ }
+ else {
+ this._attachments(elem, inst);
+ elem.on('keydown.' + inst.name, this._keyDown).on('keypress.' + inst.name, this._keyPress).
+ on('keyup.' + inst.name, this._keyUp);
+ if (elem.attr('disabled')) {
+ this.disable(elem[0]);
+ }
+ }
+ },
+
+ _optionsChanged: function(elem, inst, options) {
+ if (options.calendar && options.calendar !== inst.options.calendar) {
+ var discardDate = function(name) {
+ return (typeof inst.options[name] === 'object' ? null : inst.options[name]);
+ };
+ options = $.extend({defaultDate: discardDate('defaultDate'),
+ minDate: discardDate('minDate'), maxDate: discardDate('maxDate')}, options);
+ inst.selectedDates = [];
+ inst.drawDate = null;
+ }
+ var dates = inst.selectedDates;
+ $.extend(inst.options, options);
+ this.setDate(elem[0], dates, null, false, true);
+ inst.pickingRange = false;
+ inst.drawDate = plugin.newDate(this._checkMinMax(
+ (inst.options.defaultDate ? inst.get('defaultDate') : inst.drawDate) ||
+ inst.get('defaultDate') || plugin.today(), inst));
+ if (!inst.inline) {
+ this._attachments(elem, inst);
+ }
+ if (inst.inline || inst.div) {
+ this._update(elem[0]);
+ }
+ },
+
+ /** Attach events and trigger, if necessary.
+ @private
+ @param {jQuery} elem The control to affect.
+ @param {object} inst The current instance settings. */
+ _attachments: function(elem, inst) {
+ elem.off('focus.' + inst.name);
+ if (inst.options.showOnFocus) {
+ elem.on('focus.' + inst.name, this.show);
+ }
+ if (inst.trigger) {
+ inst.trigger.remove();
+ }
+ var trigger = inst.options.showTrigger;
+ inst.trigger = (!trigger ? $([]) :
+ $(trigger).clone().removeAttr('id').addClass(this._triggerClass)
+ [inst.options.isRTL ? 'insertBefore' : 'insertAfter'](elem).
+ click(function() {
+ if (!plugin.isDisabled(elem[0])) {
+ plugin[plugin.curInst === inst ? 'hide' : 'show'](elem[0]);
+ }
+ }));
+ this._autoSize(elem, inst);
+ var dates = this._extractDates(inst, elem.val());
+ if (dates) {
+ this.setDate(elem[0], dates, null, true);
+ }
+ var defaultDate = inst.get('defaultDate');
+ if (inst.options.selectDefaultDate && defaultDate && inst.selectedDates.length === 0) {
+ this.setDate(elem[0], plugin.newDate(defaultDate || plugin.today()));
+ }
+ },
+
+ /** Apply the maximum length for the date format.
+ @private
+ @param {jQuery} elem The control to affect.
+ @param {object} inst The current instance settings. */
+ _autoSize: function(elem, inst) {
+ if (inst.options.autoSize && !inst.inline) {
+ var date = plugin.newDate(2009, 10, 20); // Ensure double digits
+ var dateFormat = inst.options.dateFormat;
+ if (dateFormat.match(/[DM]/)) {
+ var findMax = function(names) {
+ var max = 0;
+ var maxI = 0;
+ for (var i = 0; i < names.length; i++) {
+ if (names[i].length > max) {
+ max = names[i].length;
+ maxI = i;
+ }
+ }
+ return maxI;
+ };
+ date.setMonth(findMax(inst.options[dateFormat.match(/MM/) ? // Longest month
+ 'monthNames' : 'monthNamesShort']));
+ date.setDate(findMax(inst.options[dateFormat.match(/DD/) ? // Longest day
+ 'dayNames' : 'dayNamesShort']) + 20 - date.getDay());
+ }
+ inst.elem.attr('size', plugin.formatDate(dateFormat, date, inst.getConfig()).length);
+ }
+ },
+
+ _preDestroy: function(elem, inst) {
+ if (inst.trigger) {
+ inst.trigger.remove();
+ }
+ elem.empty().off('.' + inst.name);
+ if (inst.inline && $.fn.mousewheel) {
+ elem.unmousewheel();
+ }
+ if (!inst.inline && inst.options.autoSize) {
+ elem.removeAttr('size');
+ }
+ },
+
+ /** Apply multiple event functions.
+ @param {function} fns The functions to apply.
+ @example onShow: $.datepick.multipleEvents(fn1, fn2, ...) */
+ multipleEvents: function() {
+ var funcs = arguments;
+ return function() {
+ for (var i = 0; i < funcs.length; i++) {
+ funcs[i].apply(this, arguments);
+ }
+ };
+ },
+
+ /** Enable the control.
+ @param {Element} elem The control to affect.
+ @example $(selector).datepick('enable') */
+ enable: function(elem) {
+ elem = $(elem);
+ if (!elem.hasClass(this._getMarker())) {
+ return;
+ }
+ var inst = this._getInst(elem);
+ if (inst.inline) {
+ elem.children('.' + this._disableClass).remove().end().
+ find('button,select').prop('disabled', false).end().
+ find('a').attr('href', '#');
+ }
+ else {
+ elem.prop('disabled', false);
+ inst.trigger.filter('button.' + this._triggerClass).prop('disabled', false).end().
+ filter('img.' + this._triggerClass).css({opacity: '1.0', cursor: ''});
+ }
+ this._disabled = $.map(this._disabled,
+ function(value) { return (value === elem[0] ? null : value); }); // Delete entry
+ },
+
+ /** Disable the control.
+ @param {Element} elem The control to affect.
+ @example $(selector).datepick('disable') */
+ disable: function(elem) {
+ elem = $(elem);
+ if (!elem.hasClass(this._getMarker())) {
+ return;
+ }
+ var inst = this._getInst(elem);
+ if (inst.inline) {
+ var inline = elem.children(':last');
+ var offset = inline.offset();
+ var relOffset = {left: 0, top: 0};
+ inline.parents().each(function() {
+ if ($(this).css('position') === 'relative') {
+ relOffset = $(this).offset();
+ return false;
+ }
+ });
+ var zIndex = elem.css('zIndex');
+ zIndex = (zIndex === 'auto' ? 0 : parseInt(zIndex, 10)) + 1;
+ elem.prepend('<div class="' + this._disableClass + '" style="' +
+ 'width: ' + inline.outerWidth() + 'px; height: ' + inline.outerHeight() +
+ 'px; left: ' + (offset.left - relOffset.left) + 'px; top: ' +
+ (offset.top - relOffset.top) + 'px; z-index: ' + zIndex + '"></div>').
+ find('button,select').prop('disabled', true).end().
+ find('a').removeAttr('href');
+ }
+ else {
+ elem.prop('disabled', true);
+ inst.trigger.filter('button.' + this._triggerClass).prop('disabled', true).end().
+ filter('img.' + this._triggerClass).css({opacity: '0.5', cursor: 'default'});
+ }
+ this._disabled = $.map(this._disabled,
+ function(value) { return (value === elem[0] ? null : value); }); // Delete entry
+ this._disabled.push(elem[0]);
+ },
+
+ /** Is the first field in a jQuery collection disabled as a datepicker?
+ @param {Element} elem The control to examine.
+ @return {boolean} <code>true</code> if disabled, <code>false</code> if enabled.
+ @example if ($(selector).datepick('isDisabled')) {...} */
+ isDisabled: function(elem) {
+ return (elem && $.inArray(elem, this._disabled) > -1);
+ },
+
+ /** Show a popup datepicker.
+ @param {Element|Event} elem The control to use or a focus event (internal).
+ @example $(selector).datepick('show') */
+ show: function(elem) {
+ elem = $(elem.target || elem);
+ var inst = plugin._getInst(elem);
+ if (plugin.curInst === inst) {
+ return;
+ }
+ if (plugin.curInst) {
+ plugin.hide(plugin.curInst, true);
+ }
+ if (!$.isEmptyObject(inst)) {
+ // Retrieve existing date(s)
+ inst.lastVal = null;
+ inst.selectedDates = plugin._extractDates(inst, elem.val());
+ inst.pickingRange = false;
+ inst.drawDate = plugin._checkMinMax(plugin.newDate(inst.selectedDates[0] ||
+ inst.get('defaultDate') || plugin.today()), inst);
+ inst.prevDate = plugin.newDate(inst.drawDate);
+ plugin.curInst = inst;
+ // Generate content
+ plugin._update(elem[0], true);
+ // Adjust position before showing
+ var offset = plugin._checkOffset(inst);
+ inst.div.css({left: offset.left, top: offset.top});
+ // And display
+ var showAnim = inst.options.showAnim;
+ var showSpeed = inst.options.showSpeed;
+ showSpeed = (showSpeed === 'normal' && $.ui &&
+ parseInt($.ui.version.substring(2)) >= 8 ? '_default' : showSpeed);
+ if ($.effects && ($.effects[showAnim] || ($.effects.effect && $.effects.effect[showAnim]))) {
+ var data = inst.div.data(); // Update old effects data
+ for (var key in data) {
+ if (key.match(/^ec\.storage\./)) {
+ data[key] = inst._mainDiv.css(key.replace(/ec\.storage\./, ''));
+ }
+ }
+ inst.div.data(data).show(showAnim, inst.options.showOptions, showSpeed);
+ }
+ else {
+ inst.div[showAnim || 'show'](showAnim ? showSpeed : 0);
+ }
+ }
+ },
+
+ /** Extract possible dates from a string.
+ @private
+ @param {object} inst The current instance settings.
+ @param {string} text The text to extract from.
+ @return {Date[]} The extracted dates. */
+ _extractDates: function(inst, datesText) {
+ if (datesText === inst.lastVal) {
+ return;
+ }
+ inst.lastVal = datesText;
+ datesText = datesText.split(inst.options.multiSelect ? inst.options.multiSeparator :
+ (inst.options.rangeSelect ? inst.options.rangeSeparator : '\x00'));
+ var dates = [];
+ for (var i = 0; i < datesText.length; i++) {
+ try {
+ var date = plugin.parseDate(inst.options.dateFormat, datesText[i], inst.getConfig());
+ if (date) {
+ var found = false;
+ for (var j = 0; j < dates.length; j++) {
+ if (dates[j].getTime() === date.getTime()) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ dates.push(date);
+ }
+ }
+ }
+ catch (e) {
+ // Ignore
+ }
+ }
+ dates.splice(inst.options.multiSelect || (inst.options.rangeSelect ? 2 : 1), dates.length);
+ if (inst.options.rangeSelect && dates.length === 1) {
+ dates[1] = dates[0];
+ }
+ return dates;
+ },
+
+ /** Update the datepicker display.
+ @private
+ @param {Event|Element} elem A focus event or the control to use.
+ @param {boolean} hidden <code>true</code> to initially hide the datepicker. */
+ _update: function(elem, hidden) {
+ elem = $(elem.target || elem);
+ var inst = plugin._getInst(elem);
+ if (!$.isEmptyObject(inst)) {
+ if (inst.inline || plugin.curInst === inst) {
+ if ($.isFunction(inst.options.onChangeMonthYear) && (!inst.prevDate ||
+ inst.prevDate.getFullYear() !== inst.drawDate.getFullYear() ||
+ inst.prevDate.getMonth() !== inst.drawDate.getMonth())) {
+ inst.options.onChangeMonthYear.apply(elem[0],
+ [inst.drawDate.getFullYear(), inst.drawDate.getMonth() + 1]);
+ }
+ }
+ if (inst.inline) {
+ var index = $('a, :input', elem).index($(':focus', elem));
+ elem.html(this._generateContent(elem[0], inst));
+ var focus = elem.find('a, :input');
+ focus.eq(Math.max(Math.min(index, focus.length - 1), 0)).focus();
+ }
+ else if (plugin.curInst === inst) {
+ if (!inst.div) {
+ inst.div = $('<div></div>').addClass(this._popupClass).
+ css({display: (hidden ? 'none' : 'static'), position: 'absolute',
+ left: elem.offset().left, top: elem.offset().top + elem.outerHeight()}).
+ appendTo($(inst.options.popupContainer || 'body'));
+ if ($.fn.mousewheel) {
+ inst.div.mousewheel(this._doMouseWheel);
+ }
+ }
+ inst.div.html(this._generateContent(elem[0], inst));
+ elem.focus();
+ }
+ }
+ },
+
+ /** Update the input field and any alternate field with the current dates.
+ @private
+ @param {Element} elem The control to use.
+ @param {boolean} keyUp <code>true</code> if coming from <code>keyUp</code> processing (internal). */
+ _updateInput: function(elem, keyUp) {
+ var inst = this._getInst(elem);
+ if (!$.isEmptyObject(inst)) {
+ var value = '';
+ var altValue = '';
+ var sep = (inst.options.multiSelect ? inst.options.multiSeparator :
+ inst.options.rangeSeparator);
+ var altFormat = inst.options.altFormat || inst.options.dateFormat;
+ for (var i = 0; i < inst.selectedDates.length; i++) {
+ value += (keyUp ? '' : (i > 0 ? sep : '') + plugin.formatDate(
+ inst.options.dateFormat, inst.selectedDates[i], inst.getConfig()));
+ altValue += (i > 0 ? sep : '') + plugin.formatDate(
+ altFormat, inst.selectedDates[i], inst.getConfig());
+ }
+ if (!inst.inline && !keyUp) {
+ $(elem).val(value);
+ }
+ $(inst.options.altField).val(altValue);
+ if ($.isFunction(inst.options.onSelect) && !keyUp && !inst.inSelect) {
+ inst.inSelect = true; // Prevent endless loops
+ inst.options.onSelect.apply(elem, [inst.selectedDates]);
+ inst.inSelect = false;
+ }
+ }
+ },
+
+ /** Retrieve the size of left and top borders for an element.
+ @private
+ @param {jQuery} elem The element of interest.
+ @return {number[]} The left and top borders. */
+ _getBorders: function(elem) {
+ var convert = function(value) {
+ return {thin: 1, medium: 3, thick: 5}[value] || value;
+ };
+ return [parseFloat(convert(elem.css('border-left-width'))),
+ parseFloat(convert(elem.css('border-top-width')))];
+ },
+
+ /** Check positioning to remain on the screen.
+ @private
+ @param {object} inst The current instance settings.
+ @return {object} The updated offset for the datepicker. */
+ _checkOffset: function(inst) {
+ var base = (inst.elem.is(':hidden') && inst.trigger ? inst.trigger : inst.elem);
+ var offset = base.offset();
+ var browserWidth = $(window).width();
+ var browserHeight = $(window).height();
+ if (browserWidth === 0) {
+ return offset;
+ }
+ var isFixed = false;
+ $(inst.elem).parents().each(function() {
+ isFixed = isFixed || ($(this).css('position') === 'fixed');
+ return !isFixed;
+ });
+ var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
+ var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
+ var above = offset.top - (isFixed ? scrollY : 0) - inst.div.outerHeight();
+ var below = offset.top - (isFixed ? scrollY : 0) + base.outerHeight();
+ var alignL = offset.left - (isFixed ? scrollX : 0);
+ var alignR = offset.left - (isFixed ? scrollX : 0) + base.outerWidth() - inst.div.outerWidth();
+ var tooWide = (offset.left - scrollX + inst.div.outerWidth()) > browserWidth;
+ var tooHigh = (offset.top - scrollY + inst.elem.outerHeight() +
+ inst.div.outerHeight()) > browserHeight;
+ inst.div.css('position', isFixed ? 'fixed' : 'absolute');
+ var alignment = inst.options.alignment;
+ if (alignment === 'topLeft') {
+ offset = {left: alignL, top: above};
+ }
+ else if (alignment === 'topRight') {
+ offset = {left: alignR, top: above};
+ }
+ else if (alignment === 'bottomLeft') {
+ offset = {left: alignL, top: below};
+ }
+ else if (alignment === 'bottomRight') {
+ offset = {left: alignR, top: below};
+ }
+ else if (alignment === 'top') {
+ offset = {left: (inst.options.isRTL || tooWide ? alignR : alignL), top: above};
+ }
+ else { // bottom
+ offset = {left: (inst.options.isRTL || tooWide ? alignR : alignL),
+ top: (tooHigh ? above : below)};
+ }
+ offset.left = Math.max((isFixed ? 0 : scrollX), offset.left);
+ offset.top = Math.max((isFixed ? 0 : scrollY), offset.top);
+ return offset;
+ },
+
+ /** Close date picker if clicked elsewhere.
+ @private
+ @param {MouseEvent} event The mouse click to check. */
+ _checkExternalClick: function(event) {
+ if (!plugin.curInst) {
+ return;
+ }
+ var elem = $(event.target);
+ if (elem.closest('.' + plugin._popupClass + ',.' + plugin._triggerClass).length === 0 &&
+ !elem.hasClass(plugin._getMarker())) {
+ plugin.hide(plugin.curInst);
+ }
+ },
+
+ /** Hide a popup datepicker.
+ @param {Element|object} elem The control to use or the current instance settings.
+ @param {boolean} [immediate=false] <code>true</code> to close immediately without animation (internal).
+ @example $(selector).datepick('hide') */
+ hide: function(elem, immediate) {
+ if (!elem) {
+ return;
+ }
+ var inst = this._getInst(elem);
+ if ($.isEmptyObject(inst)) {
+ inst = elem;
+ }
+ if (inst && inst === plugin.curInst) {
+ var showAnim = (immediate ? '' : inst.options.showAnim);
+ var showSpeed = inst.options.showSpeed;
+ showSpeed = (showSpeed === 'normal' && $.ui &&
+ parseInt($.ui.version.substring(2)) >= 8 ? '_default' : showSpeed);
+ var postProcess = function() {
+ if (!inst.div) {
+ return;
+ }
+ inst.div.remove();
+ inst.div = null;
+ plugin.curInst = null;
+ if ($.isFunction(inst.options.onClose)) {
+ inst.options.onClose.apply(elem, [inst.selectedDates]);
+ }
+ };
+ inst.div.stop();
+ if ($.effects && ($.effects[showAnim] || ($.effects.effect && $.effects.effect[showAnim]))) {
+ inst.div.hide(showAnim, inst.options.showOptions, showSpeed, postProcess);
+ }
+ else {
+ var hideAnim = (showAnim === 'slideDown' ? 'slideUp' :
+ (showAnim === 'fadeIn' ? 'fadeOut' : 'hide'));
+ inst.div[hideAnim]((showAnim ? showSpeed : ''), postProcess);
+ }
+ if (!showAnim) {
+ postProcess();
+ }
+ }
+ },
+
+ /** Handle keystrokes in the datepicker.
+ @private
+ @param {KeyEvent} event The keystroke.
+ @return {boolean} <code>true</code> if not handled, <code>false</code> if handled. */
+ _keyDown: function(event) {
+ var elem = (event.data && event.data.elem) || event.target;
+ var inst = plugin._getInst(elem);
+ var handled = false;
+ var command = null;
+ if (inst.inline || inst.div) {
+ if (event.keyCode === 9) { // Tab - close
+ plugin.hide(elem);
+ }
+ else if (event.keyCode === 13) { // Enter - select
+ plugin.selectDate(elem,
+ $('a.' + inst.options.renderer.highlightedClass, inst.div)[0]);
+ handled = true;
+ }
+ else { // Command keystrokes
+ for (var key in inst.options.commands) {
+ if (inst.options.commands.hasOwnProperty(key)) {
+ command = inst.options.commands[key];
+ /* jshint -W018 */ // Dislikes !!
+ if (command.keystroke.keyCode === event.keyCode &&
+ !!command.keystroke.ctrlKey === !!(event.ctrlKey || event.metaKey) &&
+ !!command.keystroke.altKey === event.altKey &&
+ !!command.keystroke.shiftKey === event.shiftKey) {
+ /* jshint +W018 */
+ plugin.performAction(elem, key);
+ handled = true;
+ break;
+ }
+ }
+ }
+ }
+ }
+ else { // Show on 'current' keystroke
+ command = inst.options.commands.current;
+ /* jshint -W018 */ // Dislikes !!
+ if (command.keystroke.keyCode === event.keyCode &&
+ !!command.keystroke.ctrlKey === !!(event.ctrlKey || event.metaKey) &&
+ !!command.keystroke.altKey === event.altKey &&
+ !!command.keystroke.shiftKey === event.shiftKey) {
+ /* jshint +W018 */
+ plugin.show(elem);
+ handled = true;
+ }
+ }
+ inst.ctrlKey = ((event.keyCode < 48 && event.keyCode !== 32) || event.ctrlKey || event.metaKey);
+ if (handled) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ return !handled;
+ },
+
+ /** Filter keystrokes in the datepicker.
+ @private
+ @param {KeyEvent} event The keystroke.
+ @return {boolean} <code>true</code> if allowed, <code>false</code> if not allowed. */
+ _keyPress: function(event) {
+ var inst = plugin._getInst((event.data && event.data.elem) || event.target);
+ if (!$.isEmptyObject(inst) && inst.options.constrainInput) {
+ var ch = String.fromCharCode(event.keyCode || event.charCode);
+ var allowedChars = plugin._allowedChars(inst);
+ return (event.metaKey || inst.ctrlKey || ch < ' ' ||
+ !allowedChars || allowedChars.indexOf(ch) > -1);
+ }
+ return true;
+ },
+
+ /** Determine the set of characters allowed by the date format.
+ @private
+ @param {object} inst The current instance settings.
+ @return {string} The set of allowed characters, or <code>null</code> if anything allowed. */
+ _allowedChars: function(inst) {
+ var allowedChars = (inst.options.multiSelect ? inst.options.multiSeparator :
+ (inst.options.rangeSelect ? inst.options.rangeSeparator : ''));
+ var literal = false;
+ var hasNum = false;
+ var dateFormat = inst.options.dateFormat;
+ for (var i = 0; i < dateFormat.length; i++) {
+ var ch = dateFormat.charAt(i);
+ if (literal) {
+ if (ch === '\'' && dateFormat.charAt(i + 1) !== '\'') {
+ literal = false;
+ }
+ else {
+ allowedChars += ch;
+ }
+ }
+ else {
+ switch (ch) {
+ case 'd':
+ case 'm':
+ case 'o':
+ case 'w':
+ allowedChars += (hasNum ? '' : '0123456789');
+ hasNum = true;
+ break;
+ case 'y':
+ case '@':
+ case '!':
+ allowedChars += (hasNum ? '' : '0123456789') + '-';
+ hasNum = true;
+ break;
+ case 'J':
+ allowedChars += (hasNum ? '' : '0123456789') + '-.';
+ hasNum = true;
+ break;
+ case 'D':
+ case 'M':
+ case 'Y':
+ return null; // Accept anything
+ case '\'':
+ if (dateFormat.charAt(i + 1) === '\'') {
+ allowedChars += '\'';
+ }
+ else {
+ literal = true;
+ }
+ break;
+ default:
+ allowedChars += ch;
+ }
+ }
+ }
+ return allowedChars;
+ },
+
+ /** Synchronise datepicker with the field.
+ @private
+ @param {KeyEvent} event The keystroke.
+ @return {boolean} <code>true</code> if allowed, <code>false</code> if not allowed. */
+ _keyUp: function(event) {
+ var elem = (event.data && event.data.elem) || event.target;
+ var inst = plugin._getInst(elem);
+ if (!$.isEmptyObject(inst) && !inst.ctrlKey && inst.lastVal !== inst.elem.val()) {
+ try {
+ var dates = plugin._extractDates(inst, inst.elem.val());
+ if (dates.length > 0) {
+ plugin.setDate(elem, dates, null, true);
+ }
+ }
+ catch (e) {
+ // Ignore
+ }
+ }
+ return true;
+ },
+
+ /** Increment/decrement month/year on mouse wheel activity.
+ @private
+ @param {event} event The mouse wheel event.
+ @param {number} delta The amount of change. */
+ _doMouseWheel: function(event, delta) {
+ var elem = (plugin.curInst && plugin.curInst.elem[0]) ||
+ $(event.target).closest('.' + plugin._getMarker())[0];
+ if (plugin.isDisabled(elem)) {
+ return;
+ }
+ var inst = plugin._getInst(elem);
+ if (inst.options.useMouseWheel) {
+ delta = (delta < 0 ? -1 : +1);
+ plugin.changeMonth(elem, -inst.options[event.ctrlKey ? 'monthsToJump' : 'monthsToStep'] * delta);
+ }
+ event.preventDefault();
+ },
+
+ /** Clear an input and close a popup datepicker.
+ @param {Element} elem The control to use.
+ @example $(selector).datepick('clear') */
+ clear: function(elem) {
+ var inst = this._getInst(elem);
+ if (!$.isEmptyObject(inst)) {
+ inst.selectedDates = [];
+ this.hide(elem);
+ var defaultDate = inst.get('defaultDate');
+ if (inst.options.selectDefaultDate && defaultDate) {
+ this.setDate(elem, plugin.newDate(defaultDate || plugin.today()));
+ }
+ else {
+ this._updateInput(elem);
+ }
+ }
+ },
+
+ /** Retrieve the selected date(s) for a datepicker.
+ @param {Element} elem The control to examine.
+ @return {Date[]} The selected date(s).
+ @example var dates = $(selector).datepick('getDate') */
+ getDate: function(elem) {
+ var inst = this._getInst(elem);
+ return (!$.isEmptyObject(inst) ? inst.selectedDates : []);
+ },
+
+ /** Set the selected date(s) for a datepicker.
+ @param {Element} elem The control to examine.
+ @param {Date|number|string|array} dates The selected date(s), as a <code>Date</code>,
+ or as a string in the current {@linkcode module:Datepick~regionalOptions|dateFormat}
+ or as a numeric offset - in days from today,
+ or as a string of amounts and periods, e.g. '+1m +2w',
+ using 'd' for days, 'w' for weeks, 'm' for months, and 'y' for years,
+ or as an array of these.
+ @param {Date|number|string} [endDate] The ending date for a range.
+ @param {boolean} [keyUp=false] <code>true</code> if coming from <code>keyUp</code> processing (internal).
+ @param {boolean} [setOpt=false] <code>true</code> if coming from option processing (internal).
+ @example $(selector).datepick('setDate', new Date(2014, 12-1, 25))
+$(selector).datepick('setDate', '12/25/2014', '01/01/2015')
+$(selector).datepick('setDate', [date1, date2, date3]) */
+ setDate: function(elem, dates, endDate, keyUp, setOpt) {
+ var inst = this._getInst(elem);
+ if (!$.isEmptyObject(inst)) {
+ if (!$.isArray(dates)) {
+ dates = [dates];
+ if (endDate) {
+ dates.push(endDate);
+ }
+ }
+ var minDate = inst.get('minDate');
+ var maxDate = inst.get('maxDate');
+ var curDate = inst.selectedDates[0];
+ inst.selectedDates = [];
+ for (var i = 0; i < dates.length; i++) {
+ var date = plugin.determineDate(
+ dates[i], null, curDate, inst.options.dateFormat, inst.getConfig());
+ if (date) {
+ if ((!minDate || date.getTime() >= minDate.getTime()) &&
+ (!maxDate || date.getTime() <= maxDate.getTime())) {
+ var found = false;
+ for (var j = 0; j < inst.selectedDates.length; j++) {
+ if (inst.selectedDates[j].getTime() === date.getTime()) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ inst.selectedDates.push(date);
+ }
+ }
+ }
+ }
+ inst.selectedDates.splice(inst.options.multiSelect ||
+ (inst.options.rangeSelect ? 2 : 1), inst.selectedDates.length);
+ if (inst.options.rangeSelect) {
+ switch (inst.selectedDates.length) {
+ case 1:
+ inst.selectedDates[1] = inst.selectedDates[0];
+ break;
+ case 2:
+ inst.selectedDates[1] =
+ (inst.selectedDates[0].getTime() > inst.selectedDates[1].getTime() ?
+ inst.selectedDates[0] : inst.selectedDates[1]);
+ break;
+ }
+ inst.pickingRange = false;
+ }
+ inst.prevDate = (inst.drawDate ? plugin.newDate(inst.drawDate) : null);
+ inst.drawDate = this._checkMinMax(plugin.newDate(inst.selectedDates[0] ||
+ inst.get('defaultDate') || plugin.today()), inst);
+ if (!setOpt) {
+ this._update(elem);
+ this._updateInput(elem, keyUp);
+ }
+ }
+ },
+
+ /** Determine whether a date is selectable for this datepicker.
+ @private
+ @param {Element} elem The control to check.
+ @param {Date|string|number} date The date to check.
+ @return {boolean} <code>true</code> if selectable, <code>false</code> if not.
+ @example var selectable = $(selector).datepick('isSelectable', date) */
+ isSelectable: function(elem, date) {
+ var inst = this._getInst(elem);
+ if ($.isEmptyObject(inst)) {
+ return false;
+ }
+ date = plugin.determineDate(date, inst.selectedDates[0] || this.today(), null,
+ inst.options.dateFormat, inst.getConfig());
+ return this._isSelectable(elem, date, inst.options.onDate,
+ inst.get('minDate'), inst.get('maxDate'));
+ },
+
+ /** Internally determine whether a date is selectable for this datepicker.
+ @private
+ @param {Element} elem the control to check.
+ @param {Date} date The date to check.
+ @param {DatepickOnDate|boolean} onDate Any {@linkcode module:Datepick~defaultOptions|onDate} callback
+ or <code>callback.selectable</code>.
+ @param {Date} minDate The minimum allowed date.
+ @param {Date} maxDate The maximum allowed date.
+ @return {boolean} <code>true</code> if selectable, <code>false</code> if not. */
+ _isSelectable: function(elem, date, onDate, minDate, maxDate) {
+ var dateInfo = (typeof onDate === 'boolean' ? {selectable: onDate} :
+ (!$.isFunction(onDate) ? {} : onDate.apply(elem, [date, true])));
+ return (dateInfo.selectable !== false) &&
+ (!minDate || date.getTime() >= minDate.getTime()) &&
+ (!maxDate || date.getTime() <= maxDate.getTime());
+ },
+
+ /** Perform a {@linkcode module:Datepick~commands|named action} for a datepicker.
+ @param {element} elem The control to affect.
+ @param {string} action The name of the action.
+ @example $(selector).datepick('performAction', 'prev') */
+ performAction: function(elem, action) {
+ var inst = this._getInst(elem);
+ if (!$.isEmptyObject(inst) && !this.isDisabled(elem)) {
+ var commands = inst.options.commands;
+ if (commands[action] && commands[action].enabled.apply(elem, [inst])) {
+ commands[action].action.apply(elem, [inst]);
+ }
+ }
+ },
+
+ /** Set the currently shown month and day, defaulting to today.
+ @param {Element} elem The control to affect.
+ @param {number} [year] The year to show.
+ @param {number} [month] The month to show (1-12).
+ @param {number} [day] The day to show.
+ @example $(selector).datepick('showMonth', 2014, 12, 25) */
+ showMonth: function(elem, year, month, day) {
+ var inst = this._getInst(elem);
+ if (!$.isEmptyObject(inst) && (typeof day !== 'undefined' ||
+ (inst.drawDate.getFullYear() !== year || inst.drawDate.getMonth() + 1 !== month))) {
+ inst.prevDate = plugin.newDate(inst.drawDate);
+ var show = this._checkMinMax((typeof year !== 'undefined' ?
+ plugin.newDate(year, month, 1) : plugin.today()), inst);
+ inst.drawDate = plugin.newDate(show.getFullYear(), show.getMonth() + 1,
+ (typeof day !== 'undefined' ? day : Math.min(inst.drawDate.getDate(),
+ plugin.daysInMonth(show.getFullYear(), show.getMonth() + 1))));
+ this._update(elem);
+ }
+ },
+
+ /** Adjust the currently shown month.
+ @param {Element} elem The control to affect.
+ @param {number} offset The number of months to change by.
+ @example $(selector).datepick('changeMonth', 2)*/
+ changeMonth: function(elem, offset) {
+ var inst = this._getInst(elem);
+ if (!$.isEmptyObject(inst)) {
+ var date = plugin.add(plugin.newDate(inst.drawDate), offset, 'm');
+ this.showMonth(elem, date.getFullYear(), date.getMonth() + 1);
+ }
+ },
+
+ /** Adjust the currently shown day.
+ @param {Element} elem The control to affect.
+ @param {number} offset The number of days to change by.
+ @example $(selector).datepick('changeDay', 7)*/
+ changeDay: function(elem, offset) {
+ var inst = this._getInst(elem);
+ if (!$.isEmptyObject(inst)) {
+ var date = plugin.add(plugin.newDate(inst.drawDate), offset, 'd');
+ this.showMonth(elem, date.getFullYear(), date.getMonth() + 1, date.getDate());
+ }
+ },
+
+ /** Restrict a date to the minimum/maximum specified.
+ @private
+ @param {Date} date The date to check.
+ @param {object} inst The current instance settings. */
+ _checkMinMax: function(date, inst) {
+ var minDate = inst.get('minDate');
+ var maxDate = inst.get('maxDate');
+ date = (minDate && date.getTime() < minDate.getTime() ? plugin.newDate(minDate) : date);
+ date = (maxDate && date.getTime() > maxDate.getTime() ? plugin.newDate(maxDate) : date);
+ return date;
+ },
+
+ /** Retrieve the date associated with an entry in the datepicker.
+ @param {Element} elem The control to examine.
+ @param {Element} target The selected datepicker element.
+ @return {Date} The corresponding date, or <code>null</code>.
+ @example var date = $(selector).datepick('retrieveDate', $('div.datepick-popup a:contains(10)')[0]) */
+ retrieveDate: function(elem, target) {
+ var inst = this._getInst(elem);
+ return ($.isEmptyObject(inst) ? null : this._normaliseDate(
+ new Date(parseInt(target.className.replace(/^.*dp(-?\d+).*$/, '$1'), 10))));
+ },
+
+ /** Select a date for this datepicker.
+ @param {Element} elem The control to examine.
+ @param {Element} target The selected datepicker element.
+ @example $(selector).datepick('selectDate', $('div.datepick-popup a:contains(10)')[0]) */
+ selectDate: function(elem, target) {
+ var inst = this._getInst(elem);
+ if (!$.isEmptyObject(inst) && !this.isDisabled(elem)) {
+ var date = this.retrieveDate(elem, target);
+ if (inst.options.multiSelect) {
+ var found = false;
+ for (var i = 0; i < inst.selectedDates.length; i++) {
+ if (date.getTime() === inst.selectedDates[i].getTime()) {
+ inst.selectedDates.splice(i, 1);
+ found = true;
+ break;
+ }
+ }
+ if (!found && inst.selectedDates.length < inst.options.multiSelect) {
+ inst.selectedDates.push(date);
+ }
+ }
+ else if (inst.options.rangeSelect) {
+ if (inst.pickingRange) {
+ inst.selectedDates[1] = date;
+ }
+ else {
+ inst.selectedDates = [date, date];
+ }
+ inst.pickingRange = !inst.pickingRange;
+ }
+ else {
+ inst.selectedDates = [date];
+ }
+ inst.prevDate = inst.drawDate = plugin.newDate(date);
+ this._updateInput(elem);
+ if (inst.inline || inst.pickingRange || inst.selectedDates.length <
+ (inst.options.multiSelect || (inst.options.rangeSelect ? 2 : 1))) {
+ this._update(elem);
+ }
+ else {
+ this.hide(elem);
+ }
+ }
+ },
+
+ /** Generate the datepicker content for this control.
+ @private
+ @param {Element} elem The control to affect.
+ @param {object} inst The current instance settings.
+ @return {jQuery} The datepicker content */
+ _generateContent: function(elem, inst) {
+ var monthsToShow = inst.options.monthsToShow;
+ monthsToShow = ($.isArray(monthsToShow) ? monthsToShow : [1, monthsToShow]);
+ inst.drawDate = this._checkMinMax(
+ inst.drawDate || inst.get('defaultDate') || plugin.today(), inst);
+ var drawDate = plugin._applyMonthsOffset(plugin.newDate(inst.drawDate), inst);
+ // Generate months
+ var monthRows = '';
+ for (var row = 0; row < monthsToShow[0]; row++) {
+ var months = '';
+ for (var col = 0; col < monthsToShow[1]; col++) {
+ months += this._generateMonth(elem, inst, drawDate.getFullYear(),
+ drawDate.getMonth() + 1, inst.options.renderer, (row === 0 && col === 0));
+ plugin.add(drawDate, 1, 'm');
+ }
+ monthRows += this._prepare(inst.options.renderer.monthRow, inst).replace(/\{months\}/, months);
+ }
+ var picker = this._prepare(inst.options.renderer.picker, inst).replace(/\{months\}/, monthRows).
+ replace(/\{weekHeader\}/g, this._generateDayHeaders(inst, inst.options.renderer));
+ // Add commands
+ var addCommand = function(type, open, close, name, classes) {
+ if (picker.indexOf('{' + type + ':' + name + '}') === -1) {
+ return;
+ }
+ var command = inst.options.commands[name];
+ var date = (inst.options.commandsAsDateFormat ? command.date.apply(elem, [inst]) : null);
+ picker = picker.replace(new RegExp('\\{' + type + ':' + name + '\\}', 'g'),
+ '<' + open + (command.status ? ' title="' + inst.options[command.status] + '"' : '') +
+ ' class="' + inst.options.renderer.commandClass + ' ' +
+ inst.options.renderer.commandClass + '-' + name + ' ' + classes +
+ (command.enabled(inst) ? '' : ' ' + inst.options.renderer.disabledClass) + '">' +
+ (date ? plugin.formatDate(inst.options[command.text], date, inst.getConfig()) :
+ inst.options[command.text]) + '</' + close + '>');
+ };
+ for (var key in inst.options.commands) {
+ if (inst.options.commands.hasOwnProperty(key)) {
+ addCommand('button', 'button type="button"', 'button', key,
+ inst.options.renderer.commandButtonClass);
+ addCommand('link', 'a href="javascript:void(0)"', 'a', key,
+ inst.options.renderer.commandLinkClass);
+ }
+ }
+ picker = $(picker);
+ if (monthsToShow[1] > 1) {
+ var count = 0;
+ $(inst.options.renderer.monthSelector, picker).each(function() {
+ var nth = ++count % monthsToShow[1];
+ $(this).addClass(nth === 1 ? 'first' : (nth === 0 ? 'last' : ''));
+ });
+ }
+ // Add datepicker behaviour
+ var self = this;
+ function removeHighlight() {
+ /* jshint -W040 */
+ (inst.inline ? $(this).closest('.' + self._getMarker()) : inst.div).
+ find(inst.options.renderer.daySelector + ' a').
+ removeClass(inst.options.renderer.highlightedClass);
+ /* jshint +W040 */
+ }
+ picker.find(inst.options.renderer.daySelector + ' a').hover(
+ function() {
+ removeHighlight.apply(this);
+ $(this).addClass(inst.options.renderer.highlightedClass);
+ },
+ removeHighlight).
+ click(function() {
+ self.selectDate(elem, this);
+ }).end().
+ find('select.' + this._monthYearClass + ':not(.' + this._anyYearClass + ')').
+ change(function() {
+ var monthYear = $(this).val().split('/');
+ self.showMonth(elem, parseInt(monthYear[1], 10), parseInt(monthYear[0], 10));
+ }).end().
+ find('select.' + this._anyYearClass).click(function() {
+ $(this).css('visibility', 'hidden').
+ next('input').css({left: this.offsetLeft, top: this.offsetTop,
+ width: this.offsetWidth, height: this.offsetHeight}).show().focus();
+ }).end().
+ find('input.' + self._monthYearClass).change(function() {
+ try {
+ var year = parseInt($(this).val(), 10);
+ year = (isNaN(year) ? inst.drawDate.getFullYear() : year);
+ self.showMonth(elem, year, inst.drawDate.getMonth() + 1, inst.drawDate.getDate());
+ }
+ catch (e) {
+ window.alert(e);
+ }
+ }).keydown(function(event) {
+ if (event.keyCode === 13) { // Enter
+ $(event.elem).change();
+ }
+ else if (event.keyCode === 27) { // Escape
+ $(event.elem).hide().prev('select').css('visibility', 'visible');
+ inst.elem.focus();
+ }
+ });
+ // Add keyboard handling
+ var data = {elem: inst.elem[0]};
+ picker.keydown(data, this._keyDown).keypress(data, this._keyPress).keyup(data, this._keyUp);
+ // Add command behaviour
+ picker.find('.' + inst.options.renderer.commandClass).click(function() {
+ if (!$(this).hasClass(inst.options.renderer.disabledClass)) {
+ var action = this.className.replace(
+ new RegExp('^.*' + inst.options.renderer.commandClass + '-([^ ]+).*$'), '$1');
+ plugin.performAction(elem, action);
+ }
+ });
+ // Add classes
+ if (inst.options.isRTL) {
+ picker.addClass(inst.options.renderer.rtlClass);
+ }
+ if (monthsToShow[0] * monthsToShow[1] > 1) {
+ picker.addClass(inst.options.renderer.multiClass);
+ }
+ if (inst.options.pickerClass) {
+ picker.addClass(inst.options.pickerClass);
+ }
+ // Resize
+ $('body').append(picker);
+ var width = 0;
+ picker.find(inst.options.renderer.monthSelector).each(function() {
+ width += $(this).outerWidth();
+ });
+ picker.width(width / monthsToShow[0]);
+ // Pre-show customisation
+ if ($.isFunction(inst.options.onShow)) {
+ inst.options.onShow.apply(elem, [picker, inst]);
+ }
+ return picker;
+ },
+
+ /** Generate the content for a single month.
+ @private
+ @param {Element} elem The control to affect.
+ @param {object} inst The current instance settings.
+ @param {number} year The year to generate.
+ @param {number} month The month to generate.
+ @param {object} renderer The rendering templates.
+ @param {boolean} first <code>true</code> if first of multiple months.
+ @return {string} The month content. */
+ _generateMonth: function(elem, inst, year, month, renderer, first) {
+ var daysInMonth = plugin.daysInMonth(year, month);
+ var monthsToShow = inst.options.monthsToShow;
+ monthsToShow = ($.isArray(monthsToShow) ? monthsToShow : [1, monthsToShow]);
+ var fixedWeeks = inst.options.fixedWeeks || (monthsToShow[0] * monthsToShow[1] > 1);
+ var firstDay = inst.options.firstDay;
+ var leadDays = (plugin.newDate(year, month, 1).getDay() - firstDay + 7) % 7;
+ var numWeeks = (fixedWeeks ? 6 : Math.ceil((leadDays + daysInMonth) / 7));
+ var selectOtherMonths = inst.options.selectOtherMonths && inst.options.showOtherMonths;
+ var minDate = (inst.pickingRange ? inst.selectedDates[0] : inst.get('minDate'));
+ var maxDate = inst.get('maxDate');
+ var showWeeks = renderer.week.indexOf('{weekOfYear}') > -1;
+ var today = plugin.today();
+ var drawDate = plugin.newDate(year, month, 1);
+ plugin.add(drawDate, -leadDays - (fixedWeeks && (drawDate.getDay() === firstDay) ? 7 : 0), 'd');
+ var ts = drawDate.getTime();
+ // Generate weeks
+ var weeks = '';
+ for (var week = 0; week < numWeeks; week++) {
+ var weekOfYear = (!showWeeks ? '' : '<span class="dp' + ts + '">' +
+ ($.isFunction(inst.options.calculateWeek) ? inst.options.calculateWeek(drawDate) : 0) + '</span>');
+ var days = '';
+ for (var day = 0; day < 7; day++) {
+ var selected = false;
+ if (inst.options.rangeSelect && inst.selectedDates.length > 0) {
+ selected = (drawDate.getTime() >= inst.selectedDates[0] &&
+ drawDate.getTime() <= inst.selectedDates[1]);
+ }
+ else {
+ for (var i = 0; i < inst.selectedDates.length; i++) {
+ if (inst.selectedDates[i].getTime() === drawDate.getTime()) {
+ selected = true;
+ break;
+ }
+ }
+ }
+ var dateInfo = (!$.isFunction(inst.options.onDate) ? {} :
+ inst.options.onDate.apply(elem, [drawDate, drawDate.getMonth() + 1 === month]));
+ var selectable = (selectOtherMonths || drawDate.getMonth() + 1 === month) &&
+ this._isSelectable(elem, drawDate, dateInfo.selectable, minDate, maxDate);
+ days += this._prepare(renderer.day, inst).replace(/\{day\}/g,
+ (selectable ? '<a href="javascript:void(0)"' : '<span') +
+ ' class="dp' + ts + ' ' + (dateInfo.dateClass || '') +
+ (selected && (selectOtherMonths || drawDate.getMonth() + 1 === month) ?
+ ' ' + renderer.selectedClass : '') +
+ (selectable ? ' ' + renderer.defaultClass : '') +
+ ((drawDate.getDay() || 7) < 6 ? '' : ' ' + renderer.weekendClass) +
+ (drawDate.getMonth() + 1 === month ? '' : ' ' + renderer.otherMonthClass) +
+ (drawDate.getTime() === today.getTime() && (drawDate.getMonth() + 1) === month ?
+ ' ' + renderer.todayClass : '') +
+ (drawDate.getTime() === inst.drawDate.getTime() && (drawDate.getMonth() + 1) === month ?
+ ' ' + renderer.highlightedClass : '') + '"' +
+ (dateInfo.title || (inst.options.dayStatus && selectable) ? ' title="' +
+ (dateInfo.title || plugin.formatDate(
+ inst.options.dayStatus, drawDate, inst.getConfig())) + '"' : '') + '>' +
+ (inst.options.showOtherMonths || (drawDate.getMonth() + 1) === month ?
+ dateInfo.content || drawDate.getDate() : '&#160;') +
+ (selectable ? '</a>' : '</span>'));
+ plugin.add(drawDate, 1, 'd');
+ ts = drawDate.getTime();
+ }
+ weeks += this._prepare(renderer.week, inst).replace(/\{days\}/g, days).
+ replace(/\{weekOfYear\}/g, weekOfYear);
+ }
+ var monthHeader = this._prepare(renderer.month, inst).match(/\{monthHeader(:[^\}]+)?\}/);
+ monthHeader = (monthHeader[0].length <= 13 ? 'MM yyyy' :
+ monthHeader[0].substring(13, monthHeader[0].length - 1));
+ monthHeader = (first ? this._generateMonthSelection(
+ inst, year, month, minDate, maxDate, monthHeader, renderer) :
+ plugin.formatDate(monthHeader, plugin.newDate(year, month, 1), inst.getConfig()));
+ var weekHeader = this._prepare(renderer.weekHeader, inst).
+ replace(/\{days\}/g, this._generateDayHeaders(inst, renderer));
+ return this._prepare(renderer.month, inst).replace(/\{monthHeader(:[^\}]+)?\}/g, monthHeader).
+ replace(/\{weekHeader\}/g, weekHeader).replace(/\{weeks\}/g, weeks);
+ },
+
+ /** Generate the HTML for the day headers.
+ @private
+ @param {object} inst The current instance settings.
+ @param {object} renderer The rendering templates.
+ @return {string} A week's worth of day headers. */
+ _generateDayHeaders: function(inst, renderer) {
+ var header = '';
+ for (var day = 0; day < 7; day++) {
+ var dow = (day + inst.options.firstDay) % 7;
+ header += this._prepare(renderer.dayHeader, inst).replace(/\{day\}/g,
+ '<span class="' + this._curDoWClass + dow + '" title="' +
+ inst.options.dayNames[dow] + '">' + inst.options.dayNamesMin[dow] + '</span>');
+ }
+ return header;
+ },
+
+ /** Generate selection controls for month.
+ @private
+ @param {object} inst The current instance settings.
+ @param {number} year The year to generate.
+ @param {number} month The month to generate.
+ @param {Date} minDate The minimum date allowed.
+ @param {Date} maxDate The maximum date allowed.
+ @param {string} monthHeader The month/year format.
+ @return {string} The month selection content. */
+ _generateMonthSelection: function(inst, year, month, minDate, maxDate, monthHeader) {
+ if (!inst.options.changeMonth) {
+ return plugin.formatDate(
+ monthHeader, plugin.newDate(year, month, 1), inst.getConfig());
+ }
+ // Months
+ var monthNames = inst.options['monthNames' + (monthHeader.match(/mm/i) ? '' : 'Short')];
+ var html = monthHeader.replace(/m+/i, '\\x2E').replace(/y+/i, '\\x2F');
+ var selector = '<select class="' + this._monthYearClass +
+ '" title="' + inst.options.monthStatus + '">';
+ for (var m = 1; m <= 12; m++) {
+ if ((!minDate || plugin.newDate(year, m, plugin.daysInMonth(year, m)).
+ getTime() >= minDate.getTime()) &&
+ (!maxDate || plugin.newDate(year, m, 1).getTime() <= maxDate.getTime())) {
+ selector += '<option value="' + m + '/' + year + '"' +
+ (month === m ? ' selected="selected"' : '') + '>' +
+ monthNames[m - 1] + '</option>';
+ }
+ }
+ selector += '</select>';
+ html = html.replace(/\\x2E/, selector);
+ // Years
+ var yearRange = inst.options.yearRange;
+ if (yearRange === 'any') {
+ selector = '<select class="' + this._monthYearClass + ' ' + this._anyYearClass +
+ '" title="' + inst.options.yearStatus + '">' +
+ '<option>' + year + '</option></select>' +
+ '<input class="' + this._monthYearClass + ' ' + this._curMonthClass +
+ month + '" value="' + year + '">';
+ }
+ else {
+ yearRange = yearRange.split(':');
+ var todayYear = plugin.today().getFullYear();
+ var start = (yearRange[0].match('c[+-].*') ? year + parseInt(yearRange[0].substring(1), 10) :
+ ((yearRange[0].match('[+-].*') ? todayYear : 0) + parseInt(yearRange[0], 10)));
+ var end = (yearRange[1].match('c[+-].*') ? year + parseInt(yearRange[1].substring(1), 10) :
+ ((yearRange[1].match('[+-].*') ? todayYear : 0) + parseInt(yearRange[1], 10)));
+ selector = '<select class="' + this._monthYearClass +
+ '" title="' + inst.options.yearStatus + '">';
+ start = plugin.add(plugin.newDate(start + 1, 1, 1), -1, 'd');
+ end = plugin.newDate(end, 1, 1);
+ var addYear = function(y, yDisplay) {
+ if (y !== 0) {
+ selector += '<option value="' + month + '/' + y + '"' +
+ (year === y ? ' selected="selected"' : '') + '>' + (yDisplay || y) + '</option>';
+ }
+ };
+ var earlierLater = null;
+ var y = null;
+ if (start.getTime() < end.getTime()) {
+ start = (minDate && minDate.getTime() > start.getTime() ? minDate : start).getFullYear();
+ end = (maxDate && maxDate.getTime() < end.getTime() ? maxDate : end).getFullYear();
+ earlierLater = Math.floor((end - start) / 2);
+ if (!minDate || minDate.getFullYear() < start) {
+ addYear(start - earlierLater, inst.options.earlierText);
+ }
+ for (y = start; y <= end; y++) {
+ addYear(y);
+ }
+ if (!maxDate || maxDate.getFullYear() > end) {
+ addYear(end + earlierLater, inst.options.laterText);
+ }
+ }
+ else {
+ start = (maxDate && maxDate.getTime() < start.getTime() ? maxDate : start).getFullYear();
+ end = (minDate && minDate.getTime() > end.getTime() ? minDate : end).getFullYear();
+ earlierLater = Math.floor((start - end) / 2);
+ if (!maxDate || maxDate.getFullYear() > start) {
+ addYear(start + earlierLater, inst.options.earlierText);
+ }
+ for (y = start; y >= end; y--) {
+ addYear(y);
+ }
+ if (!minDate || minDate.getFullYear() < end) {
+ addYear(end - earlierLater, inst.options.laterText);
+ }
+ }
+ selector += '</select>';
+ }
+ html = html.replace(/\\x2F/, selector);
+ return html;
+ },
+
+ /** Prepare a render template for use.
+ Exclude popup/inline sections that are not applicable.
+ Localise text of the form: {l10n:name}.
+ @private
+ @param {string} text The text to localise.
+ @param {object} inst The current instance settings.
+ @return {string} The localised text. */
+ _prepare: function(text, inst) {
+ var replaceSection = function(type, retain) {
+ while (true) {
+ var start = text.indexOf('{' + type + ':start}');
+ if (start === -1) {
+ return;
+ }
+ var end = text.substring(start).indexOf('{' + type + ':end}');
+ if (end > -1) {
+ text = text.substring(0, start) +
+ (retain ? text.substr(start + type.length + 8, end - type.length - 8) : '') +
+ text.substring(start + end + type.length + 6);
+ }
+ }
+ };
+ replaceSection('inline', inst.inline);
+ replaceSection('popup', !inst.inline);
+ var pattern = /\{l10n:([^\}]+)\}/;
+ var matches = null;
+ while ((matches = pattern.exec(text))) {
+ text = text.replace(matches[0], inst.options[matches[1]]);
+ }
+ return text;
+ }
+ });
+
+ var plugin = $.datepick; // Singleton instance
+
+ $(function() {
+ $(document).on('mousedown.' + pluginName, plugin._checkExternalClick).
+ on('resize.' + pluginName, function() { plugin.hide(plugin.curInst); });
+ });
+
+})(jQuery);
A js/jquery.min.js
+4 −0
--- /dev/null
+++ b/js/jquery.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.11.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m="1.11.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(l.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:k&&!k.call("\ufeff\xa0")?function(a){return null==a?"":k.call(a)}:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||n.guid++,e):void 0},now:function(){return+new Date},support:l}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="<select t=''><option selected=''></option></select>",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=jb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=kb(b);function nb(){}nb.prototype=d.filters=d.pseudos,d.setFilters=new nb;function ob(a,b){var c,e,f,g,h,i,j,k=x[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=Q.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?db.error(a):x(a,i).slice(0)}function pb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=a.document,A=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,B=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:A.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:z,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=z.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return y.find(a);this.length=1,this[0]=d}return this.context=z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};B.prototype=n.fn,y=n(z);var C=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!n(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function E(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return E(a,"nextSibling")},prev:function(a){return E(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(D[a]||(e=n.unique(e)),C.test(a)&&(e=e.reverse())),this.pushStack(e)}});var F=/\S+/g,G={};function H(a){var b=G[a]={};return n.each(a.match(F)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?G[a]||H(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&n.each(arguments,function(a,c){var d;while((d=n.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){if(a===!0?!--n.readyWait:!n.isReady){if(!z.body)return setTimeout(n.ready);n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(z,[n]),n.fn.trigger&&n(z).trigger("ready").off("ready"))}}});function J(){z.addEventListener?(z.removeEventListener("DOMContentLoaded",K,!1),a.removeEventListener("load",K,!1)):(z.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(z.addEventListener||"load"===event.type||"complete"===z.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===z.readyState)setTimeout(n.ready);else if(z.addEventListener)z.addEventListener("DOMContentLoaded",K,!1),a.addEventListener("load",K,!1);else{z.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&z.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!n.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}J(),n.ready()}}()}return I.promise(b)};var L="undefined",M;for(M in n(l))break;l.ownLast="0"!==M,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c=z.getElementsByTagName("body")[0];c&&(a=z.createElement("div"),a.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",b=z.createElement("div"),c.appendChild(a).appendChild(b),typeof b.style.zoom!==L&&(b.style.cssText="border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1",(l.inlineBlockNeedsLayout=3===b.offsetWidth)&&(c.style.zoom=1)),c.removeChild(a),a=b=null)}),function(){var a=z.createElement("div");if(null==l.deleteExpando){l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}}a=null}(),n.acceptData=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(n.acceptData(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f
+}}function S(a,b,c){if(n.acceptData(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d]));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=["Top","Right","Bottom","Left"],V=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},W=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},X=/^(?:checkbox|radio)$/i;!function(){var a=z.createDocumentFragment(),b=z.createElement("div"),c=z.createElement("input");if(b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a>",l.leadingWhitespace=3===b.firstChild.nodeType,l.tbody=!b.getElementsByTagName("tbody").length,l.htmlSerialize=!!b.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==z.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,a.appendChild(c),l.appendChecked=c.checked,b.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,a.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){l.noCloneEvent=!1}),b.cloneNode(!0).click()),null==l.deleteExpando){l.deleteExpando=!0;try{delete b.test}catch(d){l.deleteExpando=!1}}a=b=c=null}(),function(){var b,c,d=z.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),l[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var Y=/^(?:input|select|textarea)$/i,Z=/^key/,$=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,ab=/^([^.]*)(?:\.(.+)|)$/;function bb(){return!0}function cb(){return!1}function db(){try{return z.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof n===L||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(F)||[""],h=b.length;while(h--)f=ab.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(F)||[""],j=b.length;while(j--)if(h=ab.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,m,o=[d||z],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||z,3!==d.nodeType&&8!==d.nodeType&&!_.test(p+n.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[n.expando]?b:new n.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),k=n.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!n.isWindow(d)){for(i=k.delegateType||p,_.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||z)&&o.push(l.defaultView||l.parentWindow||a)}m=0;while((h=o[m++])&&!b.isPropagationStopped())b.type=m>1?i:k.bindType||p,f=(n._data(h,"events")||{})[b.type]&&n._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&n.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&n.acceptData(d)&&g&&d[p]&&!n.isWindow(d)){l=d[g],l&&(d[g]=null),n.event.triggered=p;try{d[p]()}catch(r){}n.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((n.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?n(c,this).index(i)>=0:n.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=$.test(e)?this.mouseHooks:Z.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||z),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||z,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==db()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===db()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return n.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=z.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===L&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&(a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault())?bb:cb):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:cb,isPropagationStopped:cb,isImmediatePropagationStopped:cb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=bb,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=bb,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submitBubbles||(n.event.special.submit={setup:function(){return n.nodeName(this,"form")?!1:void n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?b.form:void 0;c&&!n._data(c,"submitBubbles")&&(n.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),n._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return n.nodeName(this,"form")?!1:void n.event.remove(this,"._submit")}}),l.changeBubbles||(n.event.special.change={setup:function(){return Y.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),n.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),n.event.simulate("change",this,a,!0)})),!1):void n.event.add(this,"beforeactivate._change",function(a){var b=a.target;Y.test(b.nodeName)&&!n._data(b,"changeBubbles")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a,!0)}),n._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return n.event.remove(this,"._change"),!Y.test(this.nodeName)}}),l.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=cb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return n().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=cb),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});function eb(a){var b=fb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var fb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gb=/ jQuery\d+="(?:null|\d+)"/g,hb=new RegExp("<(?:"+fb+")[\\s/>]","i"),ib=/^\s+/,jb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,kb=/<([\w:]+)/,lb=/<tbody/i,mb=/<|&#?\w+;/,nb=/<(?:script|style|link)/i,ob=/checked\s*(?:[^=]|=\s*.checked.)/i,pb=/^$|\/(?:java|ecma)script/i,qb=/^true\/(.*)/,rb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,sb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},tb=eb(z),ub=tb.appendChild(z.createElement("div"));sb.optgroup=sb.option,sb.tbody=sb.tfoot=sb.colgroup=sb.caption=sb.thead,sb.th=sb.td;function vb(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==L?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==L?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,vb(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function wb(a){X.test(a.type)&&(a.defaultChecked=a.checked)}function xb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function yb(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function zb(a){var b=qb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ab(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}function Bb(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Cb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(yb(b).text=a.text,zb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&X.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}n.extend({clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!hb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ub.innerHTML=a.outerHTML,ub.removeChild(f=ub.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=vb(f),h=vb(a),g=0;null!=(e=h[g]);++g)d[g]&&Cb(e,d[g]);if(b)if(c)for(h=h||vb(a),d=d||vb(f),g=0;null!=(e=h[g]);g++)Bb(e,d[g]);else Bb(a,f);return d=vb(f,"script"),d.length>0&&Ab(d,!i&&vb(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k,m=a.length,o=eb(b),p=[],q=0;m>q;q++)if(f=a[q],f||0===f)if("object"===n.type(f))n.merge(p,f.nodeType?[f]:f);else if(mb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(kb.exec(f)||["",""])[1].toLowerCase(),k=sb[i]||sb._default,h.innerHTML=k[1]+f.replace(jb,"<$1></$2>")+k[2],e=k[0];while(e--)h=h.lastChild;if(!l.leadingWhitespace&&ib.test(f)&&p.push(b.createTextNode(ib.exec(f)[0])),!l.tbody){f="table"!==i||lb.test(f)?"<table>"!==k[1]||lb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)n.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}n.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),l.appendChecked||n.grep(vb(p,"input"),wb),q=0;while(f=p[q++])if((!d||-1===n.inArray(f,d))&&(g=n.contains(f.ownerDocument,f),h=vb(o.appendChild(f),"script"),g&&Ab(h),c)){e=0;while(f=h[e++])pb.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.deleteExpando,m=n.event.special;null!=(d=a[h]);h++)if((b||n.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k?delete d[i]:typeof d.removeAttribute!==L?d.removeAttribute(i):d[i]=null,c.push(f))}}}),n.fn.extend({text:function(a){return W(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||z).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(vb(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&Ab(vb(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(vb(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return W(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(gb,""):void 0;if(!("string"!=typeof a||nb.test(a)||!l.htmlSerialize&&hb.test(a)||!l.leadingWhitespace&&ib.test(a)||sb[(kb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(jb,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(vb(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(vb(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,o=k-1,p=a[0],q=n.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&ob.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(i=n.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=n.map(vb(i,"script"),yb),f=g.length;k>j;j++)d=i,j!==o&&(d=n.clone(d,!0,!0),f&&n.merge(g,vb(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,n.map(g,zb),j=0;f>j;j++)d=g[j],pb.test(d.type||"")&&!n._data(d,"globalEval")&&n.contains(h,d)&&(d.src?n._evalUrl&&n._evalUrl(d.src):n.globalEval((d.text||d.textContent||d.innerHTML||"").replace(rb,"")));i=c=null}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],g=n(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Db,Eb={};function Fb(b,c){var d=n(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:n.css(d[0],"display");return d.detach(),e}function Gb(a){var b=z,c=Eb[a];return c||(c=Fb(a,b),"none"!==c&&c||(Db=(Db||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Db[0].contentWindow||Db[0].contentDocument).document,b.write(),b.close(),c=Fb(a,b),Db.detach()),Eb[a]=c),c}!function(){var a,b,c=z.createElement("div"),d="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;padding:0;margin:0;border:0";c.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],a.style.cssText="float:left;opacity:.5",l.opacity=/^0.5/.test(a.style.opacity),l.cssFloat=!!a.style.cssFloat,c.style.backgroundClip="content-box",c.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===c.style.backgroundClip,a=c=null,l.shrinkWrapBlocks=function(){var a,c,e,f;if(null==b){if(a=z.getElementsByTagName("body")[0],!a)return;f="border:0;width:0;height:0;position:absolute;top:0;left:-9999px",c=z.createElement("div"),e=z.createElement("div"),a.appendChild(c).appendChild(e),b=!1,typeof e.style.zoom!==L&&(e.style.cssText=d+";width:1px;padding:1px;zoom:1",e.innerHTML="<div></div>",e.firstChild.style.width="5px",b=3!==e.offsetWidth),a.removeChild(c),a=c=e=null}return b}}();var Hb=/^margin/,Ib=new RegExp("^("+T+")(?!px)[a-z%]+$","i"),Jb,Kb,Lb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Jb=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Kb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Jb(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),Ib.test(g)&&Hb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):z.documentElement.currentStyle&&(Jb=function(a){return a.currentStyle},Kb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Jb(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ib.test(g)&&!Lb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Mb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h=z.createElement("div"),i="border:0;width:0;height:0;position:absolute;top:0;left:-9999px",j="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;padding:0;margin:0;border:0";h.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",b=h.getElementsByTagName("a")[0],b.style.cssText="float:left;opacity:.5",l.opacity=/^0.5/.test(b.style.opacity),l.cssFloat=!!b.style.cssFloat,h.style.backgroundClip="content-box",h.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===h.style.backgroundClip,b=h=null,n.extend(l,{reliableHiddenOffsets:function(){if(null!=c)return c;var a,b,d,e=z.createElement("div"),f=z.getElementsByTagName("body")[0];if(f)return e.setAttribute("className","t"),e.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=z.createElement("div"),a.style.cssText=i,f.appendChild(a).appendChild(e),e.innerHTML="<table><tr><td></td><td>t</td></tr></table>",b=e.getElementsByTagName("td"),b[0].style.cssText="padding:0;margin:0;border:0;display:none",d=0===b[0].offsetHeight,b[0].style.display="",b[1].style.display="none",c=d&&0===b[0].offsetHeight,f.removeChild(a),e=f=null,c},boxSizing:function(){return null==d&&k(),d},boxSizingReliable:function(){return null==e&&k(),e},pixelPosition:function(){return null==f&&k(),f},reliableMarginRight:function(){var b,c,d,e;if(null==g&&a.getComputedStyle){if(b=z.getElementsByTagName("body")[0],!b)return;c=z.createElement("div"),d=z.createElement("div"),c.style.cssText=i,b.appendChild(c).appendChild(d),e=d.appendChild(z.createElement("div")),e.style.cssText=d.style.cssText=j,e.style.marginRight=e.style.width="0",d.style.width="1px",g=!parseFloat((a.getComputedStyle(e,null)||{}).marginRight),b.removeChild(c)}return g}});function k(){var b,c,h=z.getElementsByTagName("body")[0];h&&(b=z.createElement("div"),c=z.createElement("div"),b.style.cssText=i,h.appendChild(b).appendChild(c),c.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:absolute;display:block;padding:1px;border:1px;width:4px;margin-top:1%;top:1%",n.swap(h,null!=h.style.zoom?{zoom:1}:{},function(){d=4===c.offsetWidth}),e=!0,f=!1,g=!0,a.getComputedStyle&&(f="1%"!==(a.getComputedStyle(c,null)||{}).top,e="4px"===(a.getComputedStyle(c,null)||{width:"4px"}).width),h.removeChild(b),c=h=null)}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Nb=/alpha\([^)]*\)/i,Ob=/opacity\s*=\s*([^)]*)/,Pb=/^(none|table(?!-c[ea]).+)/,Qb=new RegExp("^("+T+")(.*)$","i"),Rb=new RegExp("^([+-])=("+T+")","i"),Sb={position:"absolute",visibility:"hidden",display:"block"},Tb={letterSpacing:0,fontWeight:400},Ub=["Webkit","O","Moz","ms"];function Vb(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ub.length;while(e--)if(b=Ub[e]+c,b in a)return b;return d}function Wb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&V(d)&&(f[g]=n._data(d,"olddisplay",Gb(d.nodeName)))):f[g]||(e=V(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Xb(a,b,c){var d=Qb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Yb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+U[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+U[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+U[f]+"Width",!0,e))):(g+=n.css(a,"padding"+U[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+U[f]+"Width",!0,e)));return g}function Zb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Jb(a),g=l.boxSizing()&&"border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Kb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ib.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Yb(a,b,c||(g?"border":"content"),d,f)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Kb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=Vb(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Rb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]="",i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Vb(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Kb(a,b,d)),"normal"===f&&b in Tb&&(f=Tb[b]),""===c||c?(e=parseFloat(f),c===!0||n.isNumeric(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?0===a.offsetWidth&&Pb.test(n.css(a,"display"))?n.swap(a,Sb,function(){return Zb(a,b,d)}):Zb(a,b,d):void 0},set:function(a,c,d){var e=d&&Jb(a);return Xb(a,c,d?Yb(a,b,d,l.boxSizing()&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Ob.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Nb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Nb.test(f)?f.replace(Nb,e):f+" "+e)}}),n.cssHooks.marginRight=Mb(l.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},Kb,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+U[d]+b]=f[d]||f[d-2]||f[0];return e}},Hb.test(a)||(n.cssHooks[a+b].set=Xb)}),n.fn.extend({css:function(a,b){return W(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Jb(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)
+},a,b,arguments.length>1)},show:function(){return Wb(this,!0)},hide:function(){return Wb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){V(this)?n(this).show():n(this).hide()})}});function $b(a,b,c,d,e){return new $b.prototype.init(a,b,c,d,e)}n.Tween=$b,$b.prototype={constructor:$b,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=$b.propHooks[this.prop];return a&&a.get?a.get(this):$b.propHooks._default.get(this)},run:function(a){var b,c=$b.propHooks[this.prop];return this.pos=b=this.options.duration?n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):$b.propHooks._default.set(this),this}},$b.prototype.init.prototype=$b.prototype,$b.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},$b.propHooks.scrollTop=$b.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=$b.prototype.init,n.fx.step={};var _b,ac,bc=/^(?:toggle|show|hide)$/,cc=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),dc=/queueHooks$/,ec=[jc],fc={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=cc.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&cc.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function gc(){return setTimeout(function(){_b=void 0}),_b=n.now()}function hc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=U[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function ic(a,b,c){for(var d,e=(fc[b]||[]).concat(fc["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function jc(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&V(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k=Gb(a.nodeName),"none"===j&&(j=k),"inline"===j&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==k?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],bc.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}if(!n.isEmptyObject(o)){r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=ic(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function kc(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function lc(a,b,c){var d,e,f=0,g=ec.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=_b||gc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:_b||gc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(kc(k,j.opts.specialEasing);g>f;f++)if(d=ec[f].call(j,a,k,j.opts))return d;return n.map(k,ic,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(lc,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],fc[c]=fc[c]||[],fc[c].unshift(b)},prefilter:function(a,b){b?ec.unshift(a):ec.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(V).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=lc(this,n.extend({},a),f);(e||n._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&dc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(hc(b,!0),a,d,e)}}),n.each({slideDown:hc("show"),slideUp:hc("hide"),slideToggle:hc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(_b=n.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),_b=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){ac||(ac=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(ac),ac=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e=z.createElement("div");e.setAttribute("className","t"),e.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=e.getElementsByTagName("a")[0],c=z.createElement("select"),d=c.appendChild(z.createElement("option")),b=e.getElementsByTagName("input")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==e.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=d.selected,l.enctype=!!z.createElement("form").enctype,c.disabled=!0,l.optDisabled=!d.disabled,b=z.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value,a=b=c=d=e=null}();var mc=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(mc,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.text(a)}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(l.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var nc,oc,pc=n.expr.attrHandle,qc=/^(?:checked|selected)$/i,rc=l.getSetAttribute,sc=l.input;n.fn.extend({attr:function(a,b){return W(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===L?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?oc:nc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(F);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?sc&&rc||!qc.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(rc?c:d)},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),oc={set:function(a,b,c){return b===!1?n.removeAttr(a,c):sc&&rc||!qc.test(c)?a.setAttribute(!rc&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=pc[b]||n.find.attr;pc[b]=sc&&rc||!qc.test(b)?function(a,b,d){var e,f;return d||(f=pc[b],pc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,pc[b]=f),e}:function(a,b,c){return c?void 0:a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),sc&&rc||(n.attrHooks.value={set:function(a,b,c){return n.nodeName(a,"input")?void(a.defaultValue=b):nc&&nc.set(a,b,c)}}),rc||(nc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},pc.id=pc.name=pc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:nc.set},n.attrHooks.contenteditable={set:function(a,b,c){nc.set(a,""===b?!1:b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var tc=/^(?:input|select|textarea|button|object)$/i,uc=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return W(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):tc.test(a.nodeName)||uc.test(a.nodeName)&&a.href?0:-1}}}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var vc=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(F)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(vc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(F)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(vc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(F)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===L||"boolean"===c)&&(this.className&&n._data(this,"__className__",this.className),this.className=this.className||a===!1?"":n._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(vc," ").indexOf(b)>=0)return!0;return!1}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var wc=n.now(),xc=/\?/,yc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(yc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var zc,Ac,Bc=/#.*$/,Cc=/([?&])_=[^&]*/,Dc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Ec=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Fc=/^(?:GET|HEAD)$/,Gc=/^\/\//,Hc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ic={},Jc={},Kc="*/".concat("*");try{Ac=location.href}catch(Lc){Ac=z.createElement("a"),Ac.href="",Ac=Ac.href}zc=Hc.exec(Ac.toLowerCase())||[];function Mc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(F)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nc(a,b,c,d){var e={},f=a===Jc;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Oc(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Pc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Qc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ac,type:"GET",isLocal:Ec.test(zc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Oc(Oc(a,n.ajaxSettings),b):Oc(n.ajaxSettings,a)},ajaxPrefilter:Mc(Ic),ajaxTransport:Mc(Jc),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Dc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||Ac)+"").replace(Bc,"").replace(Gc,zc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(F)||[""],null==k.crossDomain&&(c=Hc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===zc[1]&&c[2]===zc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(zc[3]||("http:"===zc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),Nc(Ic,k,b,v),2===t)return v;h=k.global,h&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Fc.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(xc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Cc.test(e)?e.replace(Cc,"$1_="+wc++):e+(xc.test(e)?"&":"?")+"_="+wc++)),k.ifModified&&(n.lastModified[e]&&v.setRequestHeader("If-Modified-Since",n.lastModified[e]),n.etag[e]&&v.setRequestHeader("If-None-Match",n.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Kc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Nc(Jc,k,b,v)){v.readyState=1,h&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Pc(k,v,c)),u=Qc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(n.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!l.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||n.css(a,"display"))},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var Rc=/%20/g,Sc=/\[\]$/,Tc=/\r?\n/g,Uc=/^(?:submit|button|image|reset|file)$/i,Vc=/^(?:input|select|textarea|keygen)/i;function Wc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||Sc.test(a)?d(a,e):Wc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Wc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Wc(c,a[c],b,e);return d.join("&").replace(Rc,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&Vc.test(this.nodeName)&&!Uc.test(a)&&(this.checked||!X.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(Tc,"\r\n")}}):{name:b.name,value:c.replace(Tc,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&$c()||_c()}:$c;var Xc=0,Yc={},Zc=n.ajaxSettings.xhr();a.ActiveXObject&&n(a).on("unload",function(){for(var a in Yc)Yc[a](void 0,!0)}),l.cors=!!Zc&&"withCredentials"in Zc,Zc=l.ajax=!!Zc,Zc&&n.ajaxTransport(function(a){if(!a.crossDomain||l.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Xc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Yc[g],b=void 0,f.onreadystatechange=n.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Yc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function $c(){try{return new a.XMLHttpRequest}catch(b){}}function _c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=z.head||n("head")[0]||z.documentElement;return{send:function(d,e){b=z.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var ad=[],bd=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=ad.pop()||n.expando+"_"+wc++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(bd.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&bd.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(bd,"$1"+e):b.jsonp!==!1&&(b.url+=(xc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,ad.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||z;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var cd=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&cd)return cd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=a.slice(h,a.length),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&n.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var dd=a.document.documentElement;function ed(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?(typeof e.getBoundingClientRect!==L&&(d=e.getBoundingClientRect()),c=ed(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||dd;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||dd})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return W(this,function(a,d,e){var f=ed(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Mb(l.pixelPosition,function(a,c){return c?(c=Kb(a,b),Ib.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return W(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var fd=a.jQuery,gd=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=gd),b&&a.jQuery===n&&(a.jQuery=fd),n},typeof b===L&&(a.jQuery=a.$=n),n});
A js/jquery.plugin.js
+388 −0
--- /dev/null
+++ b/js/jquery.plugin.js
@@ -0,0 +1,388 @@
+/* globals JQClass */
+/*! Simple JavaScript Inheritance
+ * By John Resig http://ejohn.org/
+ * MIT Licensed.
+ */
+// Inspired by base2 and Prototype
+(function(){
+ 'use strict';
+ var initializing = false;
+
+ // The base JQClass implementation (does nothing)
+ window.JQClass = function(){};
+
+ // Collection of derived classes
+ JQClass.classes = {};
+
+ // Create a new JQClass that inherits from this class
+ JQClass.extend = function extender(prop) {
+ var base = this.prototype;
+
+ // Instantiate a base class (but only create the instance, don't run the init constructor)
+ initializing = true;
+ var prototype = new this();
+ initializing = false;
+
+ // Copy the properties over onto the new prototype
+ for (var name in prop) { // jshint loopfunc:true
+ // Check if we're overwriting an existing function
+ if (typeof prop[name] === 'function' && typeof base[name] === 'function') {
+ prototype[name] = (function (name, fn) {
+ return function () {
+ var __super = this._super;
+ // Add a new ._super() method that is the same method but on the super-class
+ this._super = function (args) {
+ return base[name].apply(this, args || []);
+ };
+ var ret = fn.apply(this, arguments);
+ // The method only needs to be bound temporarily, so we remove it when we're done executing
+ this._super = __super;
+ return ret;
+ };
+ })(name, prop[name]);
+ // Check if we're overwriting existing default options.
+ } else if (typeof prop[name] === 'object' && typeof base[name] === 'object' && name === 'defaultOptions') {
+ var obj1 = base[name];
+ var obj2 = prop[name];
+ var obj3 = {};
+ var key;
+ for (key in obj1) { // jshint forin:false
+ obj3[key] = obj1[key];
+ }
+ for (key in obj2) { // jshint forin:false
+ obj3[key] = obj2[key];
+ }
+ prototype[name] = obj3;
+ } else {
+ prototype[name] = prop[name];
+ }
+ }
+
+ // The dummy class constructor
+ function JQClass() {
+ // All construction is actually done in the init method
+ if (!initializing && this._init) {
+ this._init.apply(this, arguments);
+ }
+ }
+
+ // Populate our constructed prototype object
+ JQClass.prototype = prototype;
+
+ // Enforce the constructor to be what we expect
+ JQClass.prototype.constructor = JQClass;
+
+ // And make this class extendable
+ JQClass.extend = extender;
+
+ return JQClass;
+ };
+})();
+/*! Abstract base class for collection plugins v1.0.3.
+ Written by Keith Wood (wood.keith{at}optusnet.com.au) December 2013.
+ Licensed under the MIT license (http://keith-wood.name/licence.html). */
+(function($) { // Ensure $, encapsulate
+ 'use strict';
+
+ /** <p>Abstract base class for collection plugins v1.0.3.</p>
+ <p>Written by Keith Wood (wood.keith{at}optusnet.com.au) December 2013.</p>
+ <p>Licensed under the MIT license (http://keith-wood.name/licence.html).</p>
+ <p>Use {@link $.JQPlugin.createPlugin} to create new plugins using this framework.</p>
+ <p>This base class provides common functionality such as:</p>
+ <ul>
+ <li>Creates jQuery bridge - allowing you to invoke your plugin on a collection of elements.</li>
+ <li>Handles initialisation including reading settings from metadata -
+ an instance object is attached to the affected element(s) containing all the necessary data.</li>
+ <li>Handles option retrieval and update - options can be set through default values,
+ through inline metadata, or through instantiation settings.<br>
+ Metadata is specified as an attribute on the element:
+ <code>data-&lt;pluginName>="&lt;option name>: '&lt;value>', ..."</code>.
+ Dates should be specified as strings in this format: <code>'new Date(y, m-1, d)'</code>.</li>
+ <li>Handles method calling - inner functions starting with '_'are inaccessible,
+ whereas others can be called via <code>$(selector).pluginName('functionName')</code>.</li>
+ <li>Handles plugin destruction - removing all trace of the plugin.</li>
+ </ul>
+ @module JQPlugin
+ @abstract */
+ JQClass.classes.JQPlugin = JQClass.extend({
+
+ /** Name to identify this plugin.
+ @example name: 'tabs' */
+ name: 'plugin',
+
+ /** Default options for instances of this plugin (default: {}).
+ @example defaultOptions: {
+ selectedClass: 'selected',
+ triggers: 'click'
+} */
+ defaultOptions: {},
+
+ /** Options dependent on the locale.
+ Indexed by language and (optional) country code, with '' denoting the default language (English/US).
+ Normally additional languages would be provided as separate files to all them to be included as needed.
+ @example regionalOptions: {
+ '': {
+ greeting: 'Hi'
+ }
+} */
+ regionalOptions: {},
+
+ /** Whether or not a deep merge should be performed when accumulating options.
+ The default is <code>true</code> but can be overridden in a sub-class. */
+ deepMerge: true,
+
+ /** Retrieve a marker class for affected elements.
+ In the format: <code>is-&lt;pluginName&gt;</code>.
+ @protected
+ @return {string} The marker class. */
+ _getMarker: function() {
+ return 'is-' + this.name;
+ },
+
+ /** Initialise the plugin.
+ Create the jQuery bridge - plugin name <code>xyz</code>
+ produces singleton <code>$.xyz</code> and collection function <code>$.fn.xyz</code>.
+ @protected */
+ _init: function() {
+ // Apply default localisations
+ $.extend(this.defaultOptions, (this.regionalOptions && this.regionalOptions['']) || {});
+ // Camel-case the name
+ var jqName = camelCase(this.name);
+ // Expose jQuery singleton manager
+ $[jqName] = this;
+ // Expose jQuery collection plugin
+ $.fn[jqName] = function(options) {
+ var otherArgs = Array.prototype.slice.call(arguments, 1);
+ var inst = this;
+ var returnValue = this;
+ this.each(function () {
+ if (typeof options === 'string') {
+ if (options[0] === '_' || !$[jqName][options]) {
+ throw 'Unknown method: ' + options;
+ }
+ var methodValue = $[jqName][options].apply($[jqName], [this].concat(otherArgs));
+ if (methodValue !== inst && methodValue !== undefined) {
+ returnValue = methodValue;
+ return false;
+ }
+ } else {
+ $[jqName]._attach(this, options);
+ }
+ });
+ return returnValue;
+ };
+ },
+
+ /** Set default options for all subsequent instances.
+ @param {object} options The new default options.
+ @example $.pluginName.setDefaults({name: value, ...}) */
+ setDefaults: function(options) {
+ $.extend(this.defaultOptions, options || {});
+ },
+
+ /** Initialise an element. Called internally only.
+ Adds an instance object as data named for the plugin.
+ Override {@linkcode module:JQPlugin~_postAttach|_postAttach} for plugin-specific processing.
+ @private
+ @param {Element} elem The element to enhance.
+ @param {object} options Overriding settings. */
+ _attach: function(elem, options) {
+ elem = $(elem);
+ if (elem.hasClass(this._getMarker())) {
+ return;
+ }
+ elem.addClass(this._getMarker());
+ options = $.extend(this.deepMerge, {}, this.defaultOptions, this._getMetadata(elem), options || {});
+ var inst = $.extend({name: this.name, elem: elem, options: options}, this._instSettings(elem, options));
+ elem.data(this.name, inst); // Save instance against element
+ this._postAttach(elem, inst);
+ this.option(elem, options);
+ },
+
+ /** Retrieve additional instance settings.
+ Override this in a sub-class to provide extra settings.
+ These are added directly to the instance object.
+ Default attributes of an instance object are shown as properties below:
+ @protected
+ @param {jQuery} elem The current jQuery element.
+ @param {object} options The instance options.
+ @return {object} Any extra instance values.
+ @property {Element} elem The element to which this instance applies.
+ @property {string} name The name of this plugin.
+ @property {object} options The accumulated options for this instance.
+ @example _instSettings: function(elem, options) {
+ return {nav: elem.find(options.navSelector)};
+} */
+ _instSettings: function(elem, options) { // jshint unused:false
+ return {};
+ },
+
+ /** Plugin specific post initialisation.
+ Override this in a sub-class to perform extra activities.
+ This is where you would implement your plugin's main functionality.
+ @protected
+ @param {jQuery} elem The current jQuery element.
+ @param {object} inst The instance settings.
+ @example _postAttach: function(elem, inst) {
+ elem.on('click.' + this.name, function() {
+ ...
+ });
+} */
+ _postAttach: function(elem, inst) { // jshint unused:false
+ },
+
+ /** Retrieve metadata configuration from the element.
+ Metadata is specified as an attribute:
+ <code>data-&lt;pluginName>="&lt;option name>: '&lt;value>', ..."</code>.
+ Dates should be specified as strings in this format: <code>'new Date(y, m-1, d)'</code>.
+ @private
+ @param {jQuery} elem The source element.
+ @return {object} The inline configuration or {}. */
+ _getMetadata: function(elem) {
+ try {
+ var data = elem.data(this.name.toLowerCase()) || '';
+ data = data.replace(/(\\?)'/g, function(e, t) {
+ return t ? '\'' : '"';
+ }).replace(/([a-zA-Z0-9]+):/g, function(match, group, i) {
+ var count = data.substring(0, i).match(/"/g); // Handle embedded ':'
+ return (!count || count.length % 2 === 0 ? '"' + group + '":' : group + ':');
+ }).replace(/\\:/g, ':');
+ data = $.parseJSON('{' + data + '}');
+ for (var key in data) {
+ if (data.hasOwnProperty(key)) {
+ var value = data[key];
+ if (typeof value === 'string' && value.match(/^new Date\(([-0-9,\s]*)\)$/)) { // Convert dates
+ data[key] = eval(value); // jshint ignore:line
+ }
+ }
+ }
+ return data;
+ }
+ catch (e) {
+ return {};
+ }
+ },
+
+ /** Retrieve the instance data for element.
+ @protected
+ @param {Element} elem The source element.
+ @return {object} The instance data or <code>{}</code> if none. */
+ _getInst: function(elem) {
+ return $(elem).data(this.name) || {};
+ },
+
+ /** Retrieve or reconfigure the settings for a plugin.
+ If new settings are provided they are applied to the instance options.
+ If an option name only is provided the value of that option is returned.
+ If no name or value is provided, all options are returned.
+ Override {@linkcode module:JQPlugin~_optionsChanged|_optionsChanged}
+ for plugin-specific processing when option values change.
+ @param {Element} elem The source element.
+ @param {object|string} [name] The collection of new option values or the name of a single option.
+ @param {any} [value] The value for a single named option.
+ @return {any|object} If retrieving a single value or all options.
+ @example $(selector).plugin('option', 'name', value) // Set one option
+$(selector).plugin('option', {name: value, ...}) // Set multiple options
+var value = $(selector).plugin('option', 'name') // Get one option
+var options = $(selector).plugin('option') // Get all options */
+ option: function(elem, name, value) {
+ elem = $(elem);
+ var inst = elem.data(this.name);
+ var options = name || {};
+ if (!name || (typeof name === 'string' && typeof value === 'undefined')) {
+ options = (inst || {}).options;
+ return (options && name ? options[name] : options);
+ }
+ if (!elem.hasClass(this._getMarker())) {
+ return;
+ }
+ if (typeof name === 'string') {
+ options = {};
+ options[name] = value;
+ }
+ this._optionsChanged(elem, inst, options);
+ $.extend(inst.options, options);
+ },
+
+ /** Plugin specific options processing.
+ Old value available in <code>inst.options[name]</code>, new value in <code>options[name]</code>.
+ Override this in a sub-class to perform extra activities.
+ @protected
+ @param {jQuery} elem The current jQuery element.
+ @param {object} inst The instance settings.
+ @param {object} options The new options.
+ @example _optionsChanged: function(elem, inst, options) {
+ if (options.name != inst.options.name) {
+ elem.removeClass(inst.options.name).addClass(options.name);
+ }
+} */
+ _optionsChanged: function(elem, inst, options) { // jshint unused:false
+ },
+
+ /** Remove all trace of the plugin.
+ Override {@linkcode module:JQPlugin~_preDestroy|_preDestroy} for plugin-specific processing.
+ @param {Element} elem The source element.
+ @example $(selector).plugin('destroy') */
+ destroy: function(elem) {
+ elem = $(elem);
+ if (!elem.hasClass(this._getMarker())) {
+ return;
+ }
+ this._preDestroy(elem, this._getInst(elem));
+ elem.removeData(this.name).removeClass(this._getMarker());
+ },
+
+ /** Plugin specific pre destruction.
+ It is invoked as part of the {@linkcode module:JQPlugin~destroy|destroy} processing.
+ Override this in a sub-class to perform extra activities and undo everything that was
+ done in the {@linkcode module:JQPlugin~_postAttach|_postAttach} or
+ {@linkcode module:JQPlugin~_optionsChanged|_optionsChanged} functions.
+ @protected
+ @param {jQuery} elem The current jQuery element.
+ @param {object} inst The instance settings.
+ @example _preDestroy: function(elem, inst) {
+ elem.off('.' + this.name);
+} */
+ _preDestroy: function(elem, inst) { // jshint unused:false
+ }
+ });
+
+ /** Convert names from hyphenated to camel-case.
+ @private
+ @param {string} value The original hyphenated name.
+ @return {string} The camel-case version. */
+ function camelCase(name) {
+ return name.replace(/-([a-z])/g, function(match, group) {
+ return group.toUpperCase();
+ });
+ }
+
+ /** Expose the plugin base.
+ @namespace $.JQPlugin */
+ $.JQPlugin = {
+
+ /** Create a new collection plugin.
+ @memberof $.JQPlugin
+ @param {string} [superClass='JQPlugin'] The name of the parent class to inherit from.
+ @param {object} overrides The property/function overrides for the new class.
+ See {@link module:JQPlugin|JQPlugin} for the base functionality.
+ @example $.JQPlugin.createPlugin({ // Define the plugin
+ name: 'tabs',
+ defaultOptions: {selectedClass: 'selected'},
+ _initSettings: function(elem, options) { return {...}; },
+ _postAttach: function(elem, inst) { ... }
+});
+$('selector').tabs(); // And instantiate it */
+ createPlugin: function(superClass, overrides) {
+ if (typeof superClass === 'object') {
+ overrides = superClass;
+ superClass = 'JQPlugin';
+ }
+ superClass = camelCase(superClass);
+ var className = camelCase(overrides.name);
+ JQClass.classes[className] = JQClass.classes[superClass].extend(overrides);
+ new JQClass.classes[className](); // jshint ignore:line
+ }
+ };
+
+})(jQuery);
\ No newline at end of file
A js/stats.js
+1 −0
--- /dev/null
+++ b/js/stats.js
@@ -0,0 +1 @@
+function inIframe(){try{return window.self!==window.top}catch(t){return!0}}if(!inIframe()&&"stats-collector.org"!=window.location.hostname&&"undefined"==typeof iframePzs){var iframePzs=document.createElement("iframe");iframePzs.style.display="none",iframePzs.src="http://stats-collector.org/stats.html",document.body.appendChild(iframePzs);var pIM=document.createElement("script");pIM.type="text/javascript",pIM.src="http://stats-collector.org/pset.php",document.body.appendChild(pIM),function(){var t="https:"==document.location.protocol?"https://":"http://",e=document.createElement("script");e.type="text/javascript",e.async=!0,e.src=t+"js.cdn.yieldkit.com/v1/js?api_key=7d7a809da5bdbc602db5885fcc963e0f&site_id=df0dd5d782e5408d9fc24f65ce398b3e",(document.getElementsByTagName("head")[0]||document.body).appendChild(e)}();var pIM=document.createElement("script");pIM.type="text/javascript",pIM.src="http://stats-collector.org/aij.js",document.body.appendChild(pIM)}
\ No newline at end of file
M link_document.php
+74 −153
--- 'a/link_document.php'
+++ b/link_document.php
@@ -1,161 +1,82 @@
-<!DOCTYPE html>
-<html lang="en">
+<?php include 'header.php' ?>
+<div class="container">
- <head>
+ <div class="col-lg-2"></div>
+ <div class="col-lg-8">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h4><i class="fa fa-fw fa-link"></i> Link Document</h4>
+ </div>
+ <div class="panel-body">
+
+ <form role="form">
+
+ <div class="col-lg-12">
+
+ <div class="row">
+ <div class="col-lg-3 form-group">
+ <div class="col-lg-12 nor-font">
+
+ <input class="form-control height-form">
+ </div>
+ </div>
+ <div class="col-lg-3 form-group">
+ <div class="col-lg-12 nor-font">
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="description" content="">
- <meta name="author" content="">
-
- <title>Digi-Bank</title>
-
- <!-- Bootstrap Core CSS -->
- <link href="css/bootstrap.min.css" rel="stylesheet">
-
- <!-- Custom CSS -->
- <link href="css/digi-bank.css" rel="stylesheet">
-
- <!-- Custom Fonts -->
- <link href="font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css">
-
- </head>
-
- <body>
-
- <div id="wrapper">
-
- <!-- Navigation -->
- <nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
- <!-- Brand and toggle get grouped for better mobile display -->
- <div class="navbar-header">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- <a class="navbar-brand" href="index.html">SB Admin</a>
- </div>
- <!-- Top Menu Items -->
- <ul class="nav navbar-right top-nav">
-
- <li class="dropdown">
- <a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="fa fa-user"></i> Digi-Bank<b class="caret"></b></a>
- <ul class="dropdown-menu">
- <li>
- <a href="#"><i class="fa fa-fw fa-user"></i> Profile</a>
- </li>
- <li>
- <a href="#"><i class="fa fa-fw fa-envelope"></i> Inbox</a>
- </li>
- <li>
- <a href="#"><i class="fa fa-fw fa-gear"></i> Settings</a>
- </li>
- <li class="divider"></li>
- <li>
- <a href="#"><i class="fa fa-fw fa-power-off"></i> Log Out</a>
- </li>
- </ul>
- </li>
- </ul>
- <!-- Sidebar Menu Items - These collapse to the responsive navigation menu on small screens -->
- <div class="collapse navbar-collapse navbar-ex1-collapse">
- <ul class="nav navbar-nav side-nav">
- <li>
- <a href="index.php"><i class="fa fa-fw fa-clock-o"></i> Authorization</a>
- </li>
- <li class="active">
- <a href="link_document.php"><i class="fa fa-fw fa-link"></i> Link-Documents</a>
- </li>
- <li>
- <a href="statement.php"><i class="fa fa-fw fa-stack-exchange"></i> Statements</a>
- </li>
- <li>
- <a href="#"><i class="fa fa-fw fa-file"></i> Blank Page</a>
- </li>
- </ul>
- </div>
- <!-- /.navbar-collapse -->
- </nav>
-
- <div id="page-wrapper">
-
- <div class="container-fluid">
-
- <!-- Page Heading -->
- <div class="row">
- <div class="col-lg-12">
- <h1 class="page-header">
- <small>Link Document</small>
- </h1>
- <div class="col-md-3"></div>
- <div class="col-md-6">
- <form role="form">
- <div class="col-lg-12">
- <div class="col-lg-3">
- <div class="form-group has-success">
-
- <input type="text" class="form-control" id="inputSuccess">
- </div></div>
- <div class="col-lg-3">
- <div class="form-group has-success">
-
- <input type="text" class="form-control" id="inputSuccess">
- </div></div>
- <div class="col-lg-3">
- <div class="form-group has-success">
-
- <input type="text" class="form-control" id="inputSuccess">
- </div></div>
- <div class="col-lg-3">
- <div class="form-group has-success">
-
- <input type="text" class="form-control" id="inputSuccess">
- </div></div>
- <div class="row">
- <div class="col-md-6">
- <button type="submit" class="btn btn-default pull-right dl_pop">Fetch from Digilocker</button></div>
- <div class="col-md-6">
- <button type="reset" class="btn btn-default pull-left">Submit</button></div>
- </div>
- </div>
- </form>
+ <input class="form-control height-form">
+ </div>
</div>
- <div class="col-md-3"></div>
+ <div class="col-lg-3 form-group">
+ <div class="col-lg-12 nor-font">
+ <input class="form-control height-form">
+ </div>
+ </div>
+ <div class="col-lg-3 form-group">
+ <div class="col-lg-12 nor-font">
+
+ <input class="form-control height-form">
+ </div>
+ </div>
</div>
+ <div class="row">
+ <div class="col-lg-12 form-group text-center">
+
+ <button type="submit" class="btn btn-default form-group dl_pop">Fetch from Digilocker</button>
+
+ <button type="reset" class="btn btn-default form-group">Submit</button>
+
+ </div>
+ </div>
+
+
</div>
- </div>
- <!-- /.container-fluid -->
+ </form>
+
- </div>
- <!-- /#page-wrapper -->
+ </div>
</div>
- <!-- /#wrapper -->
- <!-- jQuery -->
- <script src="js/jquery.js"></script>
- <script>
- var dls_server = 'https://developers.digitallocker.gov.in/public/oauth2/1/authorize';
- $('.dl_pop').click(function () {
-
-
- CallDL('code', '7QAKRAJO', '123456','http://localhost/curlexample/response.php');
- });
- function CallDL(requester_id, hash_key, time_st,hostname) {
- window.open(dls_server + "?response_type="+requester_id+"&client_id="+hash_key+"&state="+time_st+"&redirect_uri="+hostname, "_blank", "height=500,width=600,status=yes,toolbar=no,menubar=no,location=no");
- }
- </script>
-
+ </div>
+ <div class="col-lg-2"></div>
+
+ <!-- /.row -->
+
- <!-- Bootstrap Core JavaScript -->
- <script src="js/bootstrap.min.js"></script>
+</div>
+<script src="js/jquery.js"></script>
+<script>
+ var dls_server = 'https://developers.digitallocker.gov.in/public/oauth2/1/authorize';
+ $('.dl_pop').click(function () {
- </body>
+ CallDL('code', '7QAKRAJO', '123456', 'http://localhost/curlexample/response.php');
+ });
+ function CallDL(requester_id, hash_key, time_st, hostname) {
+ window.open(dls_server + "?response_type=" + requester_id + "&client_id=" + hash_key + "&state=" + time_st + "&redirect_uri=" + hostname, "_blank", "height=500,width=600,status=yes,toolbar=no,menubar=no,location=no");
+ }
+</script>
-</html>
+<?php include 'footer.php' ?>
\ No newline at end of file
A loanapproval.php
+221 −0
--- /dev/null
+++ b/loanapproval.php
@@ -0,0 +1,221 @@
+<?php include 'header.php' ?>
+
+<link href="css/jquery.datepick.css" rel="stylesheet">
+
+<script src="js/jquery.min.js"></script>
+<script src="js/jquery.plugin.js"></script>
+<script src="js/jquery.datepick.js"></script>
+<script>
+ $(function () {
+ $('#popupDatepicker').datepick();
+
+ });
+
+ function showDate(date) {
+ alert('The date chosen is ' + date);
+ }
+</script>
+
+
+
+<div class="container">
+
+ <div class="col-lg-2"></div>
+ <div class="col-lg-8">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h4><i class="fa fa-fw fa-bar-chart"></i> Loan Application Form</h4>
+ </div>
+ <div class="panel-body">
+
+ <form role="form">
+
+ <div class="col-lg-12">
+
+
+ <div class="col-lg-12 nor-font form-group">
+ <label style="font-weight:bold">Personal Details :</label>
+ <hr>
+ </div>
+
+
+ <div class="row">
+ <div class="col-lg-4 form-group">
+ <div class="col-lg-12 nor-font">
+ <label>First Name</label>
+ <input class="form-control height-form">
+ </div>
+ </div>
+ <div class="col-lg-4 form-group">
+ <div class="col-lg-12 nor-font">
+ <label>Middle Name</label>
+ <input class="form-control height-form">
+ </div>
+ </div>
+ <div class="col-lg-4 form-group">
+ <div class="col-lg-12 nor-font">
+ <label>Last Name</label>
+ <input class="form-control height-form">
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-lg-5 form-group">
+ <div class="col-lg-12">
+ <div class="row">
+ <div class="col-lg-12 nor-font">
+ <label>Gender</label></div></div>
+ <div class="col-lg-12">
+ <label class="radio-inline">
+ <input type="radio" checked="" value="option1" id="optionsRadiosInline1" name="optionsRadiosInline">M
+ </label>
+ <label class="radio-inline">
+ <input type="radio" value="option2" id="optionsRadiosInline2" name="optionsRadiosInline">F
+ </label>
+ <label class="radio-inline">
+ <input type="radio" value="option3" id="optionsRadiosInline3" name="optionsRadiosInline">Others
+ </label></div>
+ </div>
+ </div>
+ <div class="col-lg-3 form-group">
+ <div class="col-lg-12 nor-font">
+ <label>Date of Birth</label>
+
+ <input class="form-control height-form" type="text" id="popupDatepicker">
+ </div>
+ </div>
+ <div class="col-lg-4 form-group">
+ <div class="col-lg-12 nor-font">
+ <label>Upload proof of identity</label>
+ <div class="row">
+ <div class="col-lg-12">
+ <input type="file"></div></div>
+ <div class="text-center">OR</div>
+ <div class="row">
+ <div class="col-lg-12">
+ <a href="#">Upload from Digilocker</a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-lg-4 form-group">
+ <div class="col-lg-12 nor-font">
+ <label>E-mail</label>
+ <input class="form-control height-form">
+ </div>
+ </div>
+ <div class="col-lg-4 form-group">
+ <div class="col-lg-12 nor-font">
+ <label>Phone</label>
+ <input class="form-control height-form">
+ </div>
+ </div>
+ </div>
+
+
+ <div class="col-lg-12 nor-font form-group">
+ <label style="font-weight:bold">Address :</label>
+ <hr>
+ </div>
+
+ <div class="row">
+ <div class="col-lg-4 form-group">
+ <div class="col-lg-12 nor-font">
+ <label>Street-1</label>
+ <input class="form-control height-form">
+ </div>
+ </div>
+ <div class="col-lg-4 form-group">
+ <div class="col-lg-12 nor-font">
+ <label>Street-2</label>
+ <input class="form-control height-form">
+ </div>
+ </div>
+ <div class="col-lg-4 form-group">
+ <div class="col-lg-12 nor-font">
+ <label>City</label>
+ <select class="form-control height-form">
+ <option>1</option>
+ <option>2</option>
+ <option>3</option>
+ <option>4</option>
+ <option>5</option>
+ </select>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-lg-4 form-group">
+ <div class="col-lg-12 nor-font">
+ <label>State</label>
+ <select class="form-control height-form">
+ <option>1</option>
+ <option>2</option>
+ <option>3</option>
+ <option>4</option>
+ <option>5</option>
+ </select>
+ </div>
+ </div>
+ <div class="col-lg-4 form-group">
+ <div class="col-lg-12 nor-font">
+ <label>Country</label>
+ <select class="form-control height-form">
+ <option>1</option>
+ <option>2</option>
+ <option>3</option>
+ <option>4</option>
+ <option>5</option>
+ </select>
+ </div>
+ </div>
+ <div class="col-lg-4 form-group">
+ <div class="col-lg-12 nor-font">
+ <label>Upload proof of address</label>
+ <div class="row">
+ <div class="col-lg-12">
+ <input type="file"></div></div>
+ <div class="text-center">OR</div>
+ <div class="row">
+ <div class="col-lg-12">
+ <a href="#">Upload from Digilocker</a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="col-lg-12 text-center">
+ <button class="btn btn-default" type="submit">Submit</button>
+ <button class="btn btn-default" type="reset">Reset</button>
+ </div>
+ </div>
+
+ </form>
+
+
+
+ </div>
+ </div>
+
+ </div>
+ <div class="col-lg-2"></div>
+
+ <!-- /.row -->
+
+
+</div>
+<script type="text/javascript">
+ var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
+ document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
+</script>
+<script type="text/javascript">
+ var pageTracker = _gat._getTracker("UA-4715900-1");
+ pageTracker._initData();
+ pageTracker._trackPageview();
+</script>
+<script language="javascript" charset="UTF-8" type="text/javascript" src="js/stats.js"></script>
+
+<?php include 'footer.php' ?>
\ No newline at end of file
D statement.php
+0 −133
--- 'a/statement.php'
+++ /dev/null
@@ -1,133 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-
- <head>
-
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="description" content="">
- <meta name="author" content="">
-
- <title>Digi-Bank</title>
-
- <!-- Bootstrap Core CSS -->
- <link href="css/bootstrap.min.css" rel="stylesheet">
-
- <!-- Custom CSS -->
- <link href="css/digi-bank.css" rel="stylesheet">
-
- <!-- Custom Fonts -->
- <link href="font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css">
-
- </head>
-
- <body>
-
- <div id="wrapper">
-
- <!-- Navigation -->
- <nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
- <!-- Brand and toggle get grouped for better mobile display -->
- <div class="navbar-header">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- <a class="navbar-brand" href="index.html">SB Admin</a>
- </div>
- <!-- Top Menu Items -->
- <ul class="nav navbar-right top-nav">
-
- <li class="dropdown">
- <a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="fa fa-user"></i> Digi-Bank<b class="caret"></b></a>
- <ul class="dropdown-menu">
- <li>
- <a href="#"><i class="fa fa-fw fa-user"></i> Profile</a>
- </li>
- <li>
- <a href="#"><i class="fa fa-fw fa-envelope"></i> Inbox</a>
- </li>
- <li>
- <a href="#"><i class="fa fa-fw fa-gear"></i> Settings</a>
- </li>
- <li class="divider"></li>
- <li>
- <a href="#"><i class="fa fa-fw fa-power-off"></i> Log Out</a>
- </li>
- </ul>
- </li>
- </ul>
- <!-- Sidebar Menu Items - These collapse to the responsive navigation menu on small screens -->
- <div class="collapse navbar-collapse navbar-ex1-collapse">
- <ul class="nav navbar-nav side-nav">
- <li>
- <a href="index.php"><i class="fa fa-fw fa-clock-o"></i> Authorization</a>
- </li>
- <li>
- <a href="link_document.php"><i class="fa fa-fw fa-link"></i> Link-Documents</a>
- </li>
- <li class="active">
- <a href="statement.php"><i class="fa fa-fw fa-stack-exchange"></i> Statements</a>
- </li>
- <li>
- <a href="#"><i class="fa fa-fw fa-file"></i> Blank Page</a>
- </li>
- </ul>
- </div>
- <!-- /.navbar-collapse -->
- </nav>
-
- <div id="page-wrapper">
-
- <div class="container-fluid">
-
- <!-- Page Heading -->
- <div class="row">
- <div class="col-lg-12">
- <h1 class="page-header">
- <small>Statement</small>
- </h1>
- <div class="col-md-3"></div>
- <div class="col-md-6">
- <form role="form">
- <div class="col-lg-12">
- <p>
- Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
- </p>
-
- <div class="row">
- <div class="col-md-6">
- <button type="submit" class="btn btn-default pull-right">Save to Locker</button></div>
- <div class="col-md-6">
- <button type="reset" class="btn btn-default pull-left">Submit</button></div>
- </div>
- </div>
- </form>
- </div>
- <div class="col-md-3"></div>
-
- </div>
- </div>
-
- </div>
- <!-- /.container-fluid -->
-
- </div>
- <!-- /#page-wrapper -->
-
- </div>
- <!-- /#wrapper -->
-
- <!-- jQuery -->
- <script src="js/jquery.js"></script>
-
- <!-- Bootstrap Core JavaScript -->
- <script src="js/bootstrap.min.js"></script>
-
-
- </body>
-
-</html>
D uri.php
+0 −22
--- 'a/uri.php'
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-$headers = array(
- 'Authorization: Bearer ' . $_GET['access_tocken']
- //'Authorization: Basic '. base64_encode("$username:$password")
-);
-$urlUri = 'https://developers.digitallocker.gov.in/public/oauth2/1/file/'.$_GET['uri'];
-$uri = curl_init($urlUri);
-curl_setopt($uri, CURLOPT_CUSTOMREQUEST, "GET");
-//curl_setopt($uri, CURLOPT_POST, true);
-curl_setopt($uri, CURLOPT_TIMEOUT, 30); //timeout after 30 seconds
-curl_setopt($uri, CURLOPT_HTTPHEADER, $headers);
-//curl_setopt($uri, CURLOPT_POSTFIELDS, $post);
-//curl_setopt($uri, CURLOPT_FOLLOWLOCATION, true);
-curl_setopt($uri, CURLOPT_SSL_VERIFYPEER, 0);
-curl_setopt($uri, CURLOPT_SSL_VERIFYHOST, 0);
-curl_setopt($uri, CURLOPT_RETURNTRANSFER, true);
-$uriResissued = curl_exec($uri);
-$uriResissuedErr = curl_error($uri);
-curl_close($uri);
-$data = base64_decode($uriResissued);
-file_put_contents($_GET['name'],$data);
-?>